- ベストアンサー
Accsess テーブルを参照して別のテーブルにデータを取得する方法を教えてください
初めて質問します。 アクセスでデータベースを作成しようと悪戦苦闘中です。 <質問> 元データとなる住所録テーブルAがあります。 テーブルBにテーブルAの情報+αのデータをフォームを使って入力したいのです。 (1)テーブルAにはコードがあり、テーブルBに入力する際に、そのコードを入力するとテーブルAからデータを取得でき、テーブルBにコピーとして取得したいです。 (2)また同じコードが複数ある場合は、別ウィンドウを 開きそこから選択してテーブルBにコピーしたいです。 (1)と(2)では方法が違うと思うのですが、どちらの場合も教えて頂けないでしょうか? DLookup関数を使うのでしょうか・・・? よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
補足 No1の補足に <A>テーブル ID Data1 Data2 1 abc *** <B>テーブル ID A_ID A_Data1 A_Data2 Data3 1 1 abc *** ××× とありますが、テーブルAと同一の内容をテーブルBに持たす必要性は? ま、私の書いた例でも都道府県名がダブってますが^^; No2の回答は、(2)の要望を実現する為に記載しました。 都道府県名も住所に連結すればいいのですが、複数の値を取得する例の為に書き直してあります。 住所には番地を付加する必要があるので、テーブルB上に別フィールドで持たせてあります。 テーブルAから取得した値を編集する必要が無いのなら、No1の例のようにして、補足の様にわざわざテーブルBに持たさない方がいいですよ。 モジュールを使用せず、フォーム上で選択したテーブルAの値に応じてテーブルAの内容を表示する例です。 テーブルAのレコードが少ない時は、この方法で大丈夫かと思います。 入力フォームのレコードソースをBとし、そのフォーム上でコンボボックスを作成し、コンボボックスのコントロールソースをA_ID、集合値ソースは、SELECT [A].[ID], [A].[Data1], [A].[Data2] FROM A; とします。 AテーブルのData1を表示したいテキストボックスのコントロールソースに、=[コンボ名].column(1)、Data2を表示したいテキストボックスのコントロールソースに、=[コンボ名].column(2)と設定してみてください。
その他の回答 (2)
- Nii
- ベストアンサー率48% (79/162)
補足無視で回答します。 テーブルAに郵便番号と都道府県、及び、市町村のデータが格納されている。 入力フォーム上で、郵便番号を入力すると、テーブルAから、該当する郵便番号の一覧が表示されたフォームが開き、選択にてフォーム上に該当住所をセット出来る。 該当の郵便番号が1件のみの場合は、無条件に住所をセットする。 呼び出しもとのフォームには、郵便番号・都道府県名・住所のテキストボックス 呼び出されるフォーム(例の場合は住所入力支援)には、呼び出しForm名・郵便番号・都道府県名・市区町村名漢字・町域名漢字が表示されるテキストボックス、SETというコマンドボタンがある。 入力フォーム Private Sub 郵便番号_AfterUpdate() If Not IsNull(Me.住所) Then If MsgBox("住所を置き返しますか?", vbYesNo, "上書き確認") = 7 Then Exit Sub End If End If DoCmd.OpenForm "住所入力支援", acNormal, , "郵便番号 like '" & Me.郵便番号 & "*'" Forms.住所入力支援.呼び出しForm名 = Me.Name If Forms.住所入力支援.Recordset.RecordCount = 1 Then Me.郵便番号 = Forms.住所入力支援.郵便番号 Me.都道府県名 = Forms.住所入力支援.都道府県名漢字 Me.住所 = Forms.住所入力支援.市区町村名漢字 & " " & Forms.住所入力支援.町域名漢字 & " " DoCmd.Close acForm, "住所入力支援" ElseIf Forms.住所入力支援.Recordset.RecordCount = 0 Then MsgBox "該当なし" Me.都道府県名 = Null Me.住所 = Null DoCmd.Close acForm, "住所入力支援" End If End Sub 呼び出されたフォームでは Private Sub SET_Click() r = dataset() End Sub Private Sub 町域名漢字_DblClick(Cancel As Integer) r = dataset() End Sub Public Function dataset() If Len(Me.呼び出しForm名) Then If IsLoaded(Me.呼び出しForm名) Then Forms(Me.呼び出しForm名).郵便番号 = Me.郵便番号 Forms(Me.呼び出しForm名).都道府県名 = Me.都道府県名漢字 Forms(Me.呼び出しForm名).住所 = Me.市区町村名漢字 & " " & Me.町域名漢字 End If End If DoCmd.Close acForm, Me.Name End Function
少し、考え方を整理する必要があるのでは・・・。 1、テーブル設計とデータ参照。 <A> ID Data1 Data2 1 A xxxx1 2 A xxxx2 3 B yyyyyy テーブル<B>は、次のようにしたいとします。 ID A_Data2 Data3 1 XXXX1 abc 2 XXXX2 efg この場合、テーブル<B>は次のように設計します。 <B> ID A_ID Data3 1 1 abc 2 2 efg この設計で、目的を達成するには、 (1)テーブルデザインで、列[A_ID]を選びます。 (2)下段の[フィールプロパティ]の[ルックアップ]をクリックします。 (3)表示コントロールを[コンボボックス]にします。 (4)[値集合ソース]をクリックして、{SELECT A.ID, A.Data1, A.Data2, * FROM A;}となるように<A>の列を選びます。 (5)[列数]を{3}にします。 (6)[列幅]を{0cm;0cm;3cm} これで、目的は達成されます。 2、テーブル<B>の入力フォーム。 ただ単に、<B>を選んで入力フォームを生成すれば、質問者が望むようなフォームが自動生成されます。 参照する<A>のデータが一つであれ複数であれ自動的に参照される形のフォームが出来上がります。 *つまり、悪戦苦闘中する必要は全くないということです。
補足
早速のご回答有り難うございました。 上記の作業をやってみました。 コンポボックスはうまく表示できました。 でも私の説明不足だったのですが、 <A>テーブル ID Data1 Data2 1 abc *** <B>テーブル ID A_ID A_Data1 A_Data2 Data3 1 1 abc *** ××× としたいのです。 上記のやり方ですと、A_IDの列にコンポボックスが 表示され選択できるようにはなるのですが、 次のカーソルにとんだ時、 A_Data1 A_Data2 の列にも自動的に数値が入るようにしたいのですが出来ません。 どうすればいいでしょうか? 折角丁寧にご説明いただいたのに申し訳ございませんが、もう少し私にお知恵を貸してください。 よろしくお願い申し上げます。
お礼
お礼が遅くなって申し訳ございません。 頑張って色々試してたんですが、やっぱり難しいです(^_^;) でも諦めずにボチボチ頑張ります。 有り難うございました<(_ _)>