Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


181 / 2272 ツリー ←次へ | 前へ→

【12647】2つのテーブルに同じデータを入力したい kok 14/11/25(火) 15:44 質問[未読]
【12648】Re:2つのテーブルに同じデータを入力したい かるびの 14/11/25(火) 23:18 回答[未読]
【12651】Re:2つのテーブルに同じデータを入力したい kok 14/11/27(木) 11:37 お礼[未読]
【12652】Re:2つのテーブルに同じデータを入力したい かるびの 14/11/28(金) 0:24 発言[未読]
【12653】Re:2つのテーブルに同じデータを入力したい kok 14/11/28(金) 17:31 お礼[未読]

【12647】2つのテーブルに同じデータを入力したい
質問  kok  - 14/11/25(火) 15:44 -

引用なし
パスワード
   T顧客名とT発送テーブルの両方に顧客番号フィールドがあり、T顧客名テーブル内の顧客番号フィールドに主キーで設定し、リーレーションシップで1対1で結合しています。

両方のテーブルを基にF顧客名とF発送フォームを作成し、同時に両方のフォームを開いてF顧客名フォーム内にある顧客番号テキストに値を代入すると、F発送フォーム内の顧客番号テキストボックスに同じ値を代入したいのですがうまくいきません。
どのようにしたらよろしいでしょうか?

以前はマクロで値の代入があったと思うのですが、Access2010では無くなってしまったのでしょうか?

よろしくお願いします。

【12648】Re:2つのテーブルに同じデータを入力し...
回答  かるびの  - 14/11/25(火) 23:18 -

引用なし
パスワード
   >以前はマクロで値の代入があったと思うのですが、Access2010では無くなってしまったのでしょう
>か?
 2010は持っていませんし、マクロは全くわからないのですが、こんなページがありました。
ht tp://answers.microsoft.com/ja-jp/office/forum/office_2010-access
/%E3%83%9E%E3%82%AF%E3%83%AD%E5%80%A4%E3%81%AE
/170e06e9-aacd-40bd-bb5d-36e741ca9459?auth=1


>1対1で結合しています。
 余計なお世話ですが、本当に一対一結合でいいんでしょうか。
 一対一結合だと、1人の顧客について1回の発送しかデータを格納できない
ことになってしまいます。
 テーブル名から見ると、T顧客名とT発送テーブルとは一対多ではないかと
思うんですが。


>両方のテーブルを基にF顧客名とF発送フォームを作成し、同時に両方のフォームを開いてF顧客
>名フォーム内にある顧客番号テキストに値を代入すると、F発送フォーム内の顧客番号テキストボ
>ックスに同じ値を代入したいのですがうまくいきません。
 第一の方法です。
 フォームを1つだけにしてしまう方法です。2つのフォームを同時に
開くよりも、フォームは1つだけにした方が入力しやすいと思います。

 まず、T顧客名とT発送テーブルとを、顧客番号フィールドで結合するクエリを作ります。
 次に、フォームのレコードソースに、上記のクエリを設定します。
 次に、このフォームに各種コントロールを配置していきますが、
顧客番号のテキストボックスは1個だけ設けます。
 そして、顧客番号テキストボックスのコントロールソースに、
T発送テーブルの顧客番号フィールドを設定します。

 こうしておけば、「顧客番号」テキストボックスに入力すると、
両テーブルの顧客番号フィールドに入力されます。


 第二の方法です。
 F顧客名とF発送フォームと同時に開いて入力する場合です。
 F顧客名の顧客番号テキストボックスのAfterUpdateイベントで、
F発送フォームの顧客番号テキストボックスに
F顧客名の顧客番号テキストボックスの値を代入します。

Private Sub 顧客番号_AfterUpdate()
  If SysCmd(acSysCmdGetObjectState, acForm, "F発送フォーム") <> 0 Then
    Forms!F発送フォーム!顧客番号.Value = Me!顧客番号.Value
  End If
End Sub

 なお、上記のSysCmdメソッドですが、
上記コード実行時にF発送フォームが開いていないと、エラーになるため、
F発送フォームが開いているかをチェックします。

【12651】Re:2つのテーブルに同じデータを入力し...
お礼  kok  - 14/11/27(木) 11:37 -

引用なし
パスワード
   ありがとうございます。

第一の方法でできました。
いろいろ調べたのですが、こんな簡単は方法があるとは知りませんでした。


1対1結合なんですが、T発送テーブルに○年お歳暮、○年年賀状・・・とフィールドを追加していくので、顧客フィールドのインデックスは重複なしにして結合しましたので1対1となっております。
念のためリレーションシップを確認したら、リレーションシップの種類は一対一になっているのですが、結合線は1―∞になっています。何かおかしいです・・・
とりあえずエラーも出ず動くので様子をみてみます。


また何かありましたらよろしくお願いします。

【12652】Re:2つのテーブルに同じデータを入力し...
発言  かるびの  - 14/11/28(金) 0:24 -

引用なし
パスワード
    気になった点があります。

>1対1結合なんですが、T発送テーブルに○年お歳暮、○年年賀状・・・とフィールドを追加していく>ので、顧客フィールドのインデックスは重複なしにして結合しましたので1対1となっております。
 データベースは、データは縦へ延ばしていくものです。
横へ延ばしていくようなテーブル構成にしてはいけません。

 その理由ですが、第一に、各オブジェクトのプロパティには、
フィールド名を使うものがたくさんあります。
 フィールドを新設すると、それらのプロパティを再設定しなければならなくなります。
ただ、そういうプロパティはいろいろあり過ぎるので、どのプロパティを再設定すべきかは
直ちにはわかりません。
 いろいろと動かしてみて、不具合が出たら直すということにならざるを得ません。
 もっとも、そんな悠長なことはしていられません。
結局、クエリ、フォーム、レポートなどを一から作り直すのが最も手っ取り早いということになります。
 しかし、フィールドを新設する都度、クエリ等を一から作り直すというのは面倒です。
 だから、フィールドをあとで追加するようなテーブルにしてはいけないのです。

 第二に、アクセスは、
縦に並んだものの中からある行、つまりレコードを抽出することは得意ですが、
横に並んだものの中からある列、つまりフィールドを抽出することはできません。
 上例で、ある顧客について、発送したのはいつだったかなと調べようと思っても、
該当するフィールドを抽出することはできません。
 
 第三に、横へ延ばしていくようなテーブル構成は、データベースとしてルール違反であり、
このデータベースにさらにいろいろな機能を盛り込みたいと思った場合、このルール違反のため、
機能拡大ができなくなる、あるいは無駄に手数を要することになってしまいます。


 では、テーブル構成をどうすべきかですが、T発送テーブルは、
    発送ID   オートナンバー又は長整数型 (主キー)
    顧客番号  長整数型
    発送年   整数型  「○年お歳暮」における「○年」を格納する
    発送事由ID 長整数型  
とし、さらにT発送事由を設け
    発送事由ID オートナンバー又は長整数型 (主キー)
    発送事由  テキスト型 「○年お歳暮」における「お歳暮」を格納する。
とするのがいいと思います。  

 T発送事由を設けるのは、
テーブル設計では、あるフィールドにおいて同じ値となるレコードが存在する場合は、
そのフィールドを別テーブルにするというルールがあるからです(テーブルの正規化)。

【12653】Re:2つのテーブルに同じデータを入力し...
お礼  kok  - 14/11/28(金) 17:31 -

引用なし
パスワード
   返信ありがとうございます。

アクセスはレコード抽出するのが得意なのはわかっていたのですが、数百件の顧客に項目が増える毎に一つずつ入力することが困難だと思い、横に広げる方法を選んでました。

先程このデータベースを使う担当者と話をし、前年のをコピーして使えば入力作業が少なくできるのではないかという事が持ち上がりました。

まだ構想段階ですので、どうのようにしたら使いやすいか考え中ですので、また行き詰ったらよろしくお願いします。

181 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078188
(SS)C-BOARD v3.8 is Free