- ベストアンサー
Access複数のフィールドからクエリで抽出
- Accessのクエリを使用して複数のフィールドからデータを抽出する方法について質問します。
- テキストボックスに入力したキーワードで、テーブルから該当するIDを検索するフォームを作成したいです。
- リストボックスを使用して、大分類から細かい分類へ選択していくフォームを作りたいです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
テーブルの作り方を変更する必要があるのでは。 各テーブルのフィールドで必要ないもの、 あるいは、master以外の各テーブルには主キーとなる フィールドがないので、たぶん分類はできない と思いますが。 各テーブルについて確認しますと、 (1) mastereは、 mas_id---mas_nm---mas_nm2 1--AAAA---BBB 2--CCCC---DDD ですから、msa_idを主キーに設定します。 構造はこのままでいいと思います。 (2) subは、 mas_id---sub_id---sub_nm 1---1---11 1---2---12 2---1---21 2---2---22 となっていますが、本来はこうではなく、 mas_id---sub_id---sub_nm 1---1---11 1---2---12 2---3---21 2---4---22 のように、sub_idを一意に設定しなければ sub_idを設定する意味がありません。 つまり、sub_idをsubの主キーに設定します。 (3) detailは、 mas_id---sub_id---det_id---det_nm 1---1---1---111 1---1---2---112 1---1---3---113 1---2---1---121 1---2---2---122 1---3---1---131 のように、なっていますが、 mas_idはsubでデータを持っていますから detailで持つ必要はなく、subと同様に、 sub_id---det_id---det_nm 1---1---111 1---2---112 1---3---113 2---4---121 2---5---122 3---6---131 とすれば、subとdetailの間のデータの 関連性は保たれ、かつdetailの各レコードの 一意性が保たれます。ここでも det_idを主キーに設定します。 (4) 同様に、saiについても、 det_id---sai_id---sai_nm 1---1---1111 1---2---1112 1---3---1113 2---4---1121 のようにします。sai_idは重複のない数字に 設定します。 まずは、このことについて確認してみてください。 No2で示している、T大分類、T中分類、 T小分類の各テーブルのフィールドの 設定をよく見ればわかると思いますが。 一応、説明しますと、 T大分類 : 大分類ID(主キー) 大分類名 T中分類 : 中分類ID(主キー) 中分類名 大分類ID T小分類 : 小分類ID(主キー) 小分類名 中分類ID のようになっています。 なお、いったんリレーションは解除 しておいてください。 あるいは、あえて言うならばリレーションは 必要はありません。
その他の回答 (3)
- piroin654
- ベストアンサー率75% (692/917)
No2です。続きですが、リストの値を参照する場合、 リスト2を例にすると、 >[Forms]![フォーム]![lstSub] リスト1のsub_idの列を参照することになります。 したがって、 [Forms]![フォーム]![lstSub].Column(1) のようになるのでは、と思います。ただし、 質問のSQL文が正しいとすればですが。 なお、リストの幅をたとえば、 0cm,0cm,2cm にして、一番目と二番目の列を非表示にしても、 一番目の列を参照する場合は、 Column(0)として参照します。三番目だと Column(2)となります。
- piroin654
- ベストアンサー率75% (692/917)
いくつかのサイトで同じ質問をされていますが、なかなか 具体的な回答がつかないようですが。 中身が分かりづらいので以下のようにして回答します。 たとえば、3つのテーブルとそれぞれのフィールドが 以下のようだとします。 T大分類 : 大分類ID 大分類名 T中分類 : 中分類ID 中分類名 大分類ID T小分類 : 小分類ID 小分類名 中分類ID テキストボックスを tx検索 とします。 フォームに三つのリストを設定します。 それぞれ、リスト1、リスト2、リスト3とします。 テーブルのフィールドをすべて表示するとして、 それぞれのリストの列数をそれぞれ2、3、3、リスト幅を2cm,2cm 2cm,2cm,2cm 2cm,2cm,2cm とします(幅の数値は適当です). 値集合ソースは空のままにしておきます。 テキストボックス、各リストのイベントに以下を 設定します。 Private Sub tx検索_AfterUpdate() Dim strSQL As String strSQL = "SELECT * FROM T大分類 WHERE T大分類.大分類名 LIKE ""*" & Me![tx検索] & "*""" Me!リスト1.RowSource = strSQL '他のリストの初期化 Me!リスト2.RowSource = "" Me!リスト3.RowSource = "" End Sub Private Sub リスト1_Click() Dim strSQL As String strSQL = "SELECT * FROM T中分類 WHERE T中分類.大分類ID = " & Me!リスト1.Column(0) & "" Me!リスト2.RowSource = strSQL End Sub Private Sub リスト2_Click() Dim strSQL As String strSQL = "SELECT * FROM T小分類 WHERE T小分類.中分類ID = " & Me!リスト2.Column(0) & "" Me!リスト3.RowSource = strSQL End Sub このように設定すると各リストには段階的に分類された データが表示されます。 ここで、たとえば、Me!リスト1.Column(0) はリスト1最初の列に 表示されるデータ、すなわちT大分類の大分類IDを示しています。 このように、リストのデータから値を参照する場合はColumnプロパティ を使います。リストの二番目の列はColumn(1)のようにして参照します。 必要に応じて、Column()の括弧の中の数値を変更して参照する 列を変更します。上記の例の場合は参照するデータがすべて最初の 列にあるので、すべてColumn(0)となっています。 回答を進める上での質問の場合の疑問点は、 >テキストボックス(txtMaster)からキーワード1を入力(例:a1) >↓ >リストボックス1(lstSub)に「11、12、13」が表示される。 >どれか1つを入力する(例:11) の部分の >どれか1つを入力する(例:11) で、これはリストから選択するというよりも、再び テキストボックスに入力するという意味ですか。
補足
回答ありがとうございます。 >>回答を進める上での質問の場合の疑問点 どれか1つを入力するというのは リストボックスに表示された結果をクリックするということです。 テキストボックスに「AB」または「DE」とうったとき、 リストボックス1に、「11、12、13」と表示させて そのうちどれか1つをクリックして(例:11) リストボックス2に「111、112、113」としたいです。 今の段階では、テキストボックス→リストボックス1までは 例: 「AB」または「DE」とテキストボックスに入力 ↓ リストボックス1に「11、12、13」と表示 されるのですが、リストボックス2から3までは すべてのフィールドが表示されてしまいます。 あいまいな記述ですみませんでした。 また、VBAは Option Compare Database Private Sub txtMaster_LostFocus() lblMaster.Caption = txtMaster.Text lstSub.Requery lstDet.Requery lstsai.Requery End Sub Private Sub lstSub_AfterUpdate() lstDet.Requery lstsai.Requery End Sub Private Sub lstDet_AfterUpdate() lstsai.Requery End Sub Private Sub lstsai_AfterUpdate() txtICD.Value = lstsai txtICD.SetFocus End Sub としています、長々としてわかりづらいですが よろしくお願いします。
- layy
- ベストアンサー率23% (292/1222)
コンボボックスで 住所を選ぶときの、 都道府県>市区>町村と選んでいく概念と同じ感じかと思います。 サンプルはないか探してみる。 都道府県が選ばれてこそ、市区の絞り込み、さらに それまでが選ばれたら町村・・・。 リストボックス1が更新されたときのアクション、 リストボックス2が更新されたときのアクション、 そういうのはどうなっているのでしょうか?。 再クエリとかしていますか?。 一度に求めたい表示にはならない、 順番に表示を変えていかなくてはならない仕組みかと思います。
お礼
返事が遅くなり、申し訳ございません。 回答ありがとうございます、無事解決しました。
補足
回答ありがとうございます。 >>リストボックス1が更新されたときのアクション、 リストボックス2が更新されたときのアクション、 そういうのはどうなっているのでしょうか?。 再クエリとかしていますか?。 VBAのことでしょうか? piroin654さんの補足返信にVBAを載せましたので、よろしければそちらを見ていただけるとありがたいです。 テキストボックスやリストボックスがそれぞれ何か変更があったときは それぞれのリストボックスの値集合ソースにいれているクエリを再クエリしています。 テキストボックスに変更があったとき リストボックス1~3のクエリを再クエリ リストボックス1に変更があったとき リストボックス2~3のクエリを再クエリ リストボックス2に変更があったとき リストボックス3のクエリを再クエリ という風にしています。
お礼
返事が遅くなり申し訳ございません。 ありがとうございます。 無事解決することができました。 値集合ソースのクエリの条件が間違っていたようです。