電子書籍の厳選無料作品が豊富!

初めて質問します。
アクセスでデータベースを作成しようと悪戦苦闘中です。
<質問>
元データとなる住所録テーブルAがあります。
テーブルBにテーブルAの情報+αのデータをフォームを使って入力したいのです。
(1)テーブルAにはコードがあり、テーブルBに入力する際に、そのコードを入力するとテーブルAからデータを取得でき、テーブルBにコピーとして取得したいです。
(2)また同じコードが複数ある場合は、別ウィンドウを
開きそこから選択してテーブルBにコピーしたいです。
(1)と(2)では方法が違うと思うのですが、どちらの場合も教えて頂けないでしょうか?
DLookup関数を使うのでしょうか・・・?
よろしくお願いします。

A 回答 (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)と設定してみてください。
    • good
    • 0

補足無視で回答します。



テーブル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
    • good
    • 0
この回答へのお礼

お礼が遅くなって申し訳ございません。
頑張って色々試してたんですが、やっぱり難しいです(^_^;)

でも諦めずにボチボチ頑張ります。
有り難うございました<(_ _)>

お礼日時:2006/09/24 12:34

少し、考え方を整理する必要があるのでは・・・。



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 の列にも自動的に数値が入るようにしたいのですが出来ません。

どうすればいいでしょうか?

折角丁寧にご説明いただいたのに申し訳ございませんが、もう少し私にお知恵を貸してください。
よろしくお願い申し上げます。

補足日時:2006/09/20 12:21
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!