●案件テーブル
案件番号 主キー
顧客番号
担当者
●顧客テーブル
顧客番号 主キー
●担当テーブル
担当番号 主キー
担当者
顧客番号
3つのテーブルがあります。
案件テーブルの担当者をコンボボックスにして、選択肢はそれぞれ担当テーブルの該当する顧客のものだけにしたいのですが、どうしたらよいのでしょうか。
また、案件テーブルから案件フォームを作成しており、入力はフォームからするようにしていますが、コンボボックスの設定はテーブルで作っておくのと、フォームで作るの、どちらが良いものなのでしょうか。
(今は全部テーブルで作っています)
よろしくお願いします
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
案件テーブル の 担当者 と 担当テーブル の 担当番号 がリンクしているとことでよろしいですか。
入力フォームは単票フォームでしょうか、帳票フォームでしょうか。
一応、単票フォームという前提が回答します。帳票フォームの場合はもう少し工夫が必要です。
顧客番号を表するテキストボックスの設定
コントロールソース 顧客番号
名前 txt顧客番号
担当者コンボボックスの設定
名前 cb担当者
コントロールソース 担当者
値集合ソース SELECT 担当番号, 担当者 FROM 担当テーブル WHERE 顧客番号 = txt顧客番号;
連結列 1
列数 2
列幅 0cm
コンボボックスのフォーカス取得時のイベントプロシージャ
vba
1Private Sub cb担当者_Enter() 2 Me.cb担当者.Requery 3End Sub
フォームのレコード移動時のイベントプロシージャ
vba
1Private Sub Form_Current() 2 Me.cb担当者.Requery 3End Sub
帳票フォームの場合
単票フォームは上記の設定でOKですが、帳票フォームだとリストを制限したときに、他のレコードのデータが表示されない場合があります。その場合は下記のようにしてください。
現状のコンボボックスの上にテキストボックスを配置して、下記のように設定します。
名前 cb2担当者
コントロールソース 担当者
値集合ソース SELECT 担当番号, 担当者 FROM 担当テーブル;
連結列 1
列数 2
列幅 0cm
タブストップ いいえ
このコンボボックスのフォーカス取得時のイベントプロシージャ
vba
1Private Sub cb2担当者_Enter() 2 Me.cb担当者.SetFocus 3End Sub
以上です。
やっていることは、コンボボックスのリストを制限すると、他のレコードで除外された顧客名が非表示になります。そのため、コンボボックスの上にさらにコンボボックスを重ねて、そのコンボボックスはリストを制限しないようにします。この上のコンボボックスにはフォーカスが来た時には、下のコンボボックスにフォーカスを移動させます。アクティブになったコントロールは前面に浮き上がってきます。
文章では伝わりづらいところがありますので、下記にサンプルファイルを置いておきます。参考にしてください。
帳票フォームでコンボボックスのリストを制限する方法 Microsoft Access 掲示板 - zawazawa
追記
別のスレッドで質問が出ていたので、
顧客番号のテキストボックスの名前とコントロールソースの設定を変える理由を追加しておきます。
コントロールソース 顧客番号
名前 txt顧客番号
コントロールソースには連結テーブルのフィールド名を設定します。
デフォルトではフィールド名と同じ名前になっているので、上記のように名前を変更しておきます。
コンボボックスの値集合ソースで、フォーム上の顧客番号でリストデータを制限(抽出)するときに、下記のようなクエリ(SQL)を設定したとします。
SELECT 担当番号, 担当者 FROM 担当テーブル WHERE 顧客番号 = 顧客番号;
こうすると、この顧客番号はどちらもSQL内の担当テーブルの「顧客番号」ということになるので常にTureになり制限できないことになります。
SELECT 担当番号, 担当者 FROM 担当テーブル WHERE 顧客番号 = txt顧客番号;
とすると、前の「顧客番号」は担当テーブルのフィールド名になり、txt顧客番号 は担当テーブルにはないので、フォームから探すことになり、フォーム上のコントロールの txt顧客番号 を参照することになります。
これでフォーム上の顧客番号の値で、コンボボックスのリストが制限されることになります。
もし、
コントロールソース 顧客番号
名前 顧客番号
というようにコントロールソースと名前が同じときは、下記のようなSQLにすることになります。
SELECT 担当番号, 担当者 FROM 担当テーブル WHERE 顧客番号 = Forms!フォーム名!顧客番号;
これでフィールド名とフォーム上のコントロールとの区別がつきます。
投稿2020/06/14 10:16
編集2020/06/16 12:48総合スコア34064
0
以下参考
コンボボックスにフィールドの値と対応付けられた別の値を表示する - Accessの使い方・操作方法
案件テーブルを担当者ではなく、担当者番号にする本来のリレーションに変更しても、連結列と列幅によって対応(コードは表示せず名称だけをコンボに表示)する事が可能です。
投稿2020/06/14 10:10
編集2020/06/14 10:10総合スコア25300
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/14 23:01 編集
2020/06/15 00:09
2020/06/16 01:58
2020/06/16 02:30
2020/06/16 04:26
2020/06/16 05:29
2020/06/16 08:22
2020/06/16 08:38 編集
2020/06/16 09:07
2020/06/16 09:09
2020/06/16 11:19 編集
2020/06/16 11:33
2020/06/16 11:43
2020/06/16 11:49
2020/06/16 12:49 編集
2020/06/16 13:27