お世話になっております。
Accessのクエリについてお聞きしたいのですが、
テーブルに
mas_id---mas_nm---mas_nm2
1----ABC------DEF
2----GHI------JKL
としたとき、フォームのテキストボックスに1、2列のどれかをあいまい検索したときに
結果(ID)が取り出せるようにしたいです。
例:
「ABC」と入力→「1」
「DE」と入力→「1」
「GH」と入力→「2」
結果的にテキストボックスから3つのリストボックスを経て
大分類から細かい分類へ選択していくフォームを作ろうと思います。
テキストボックス(txtMaster)からキーワード1を入力(例:a1)
↓
リストボックス1(lstSub)に「11、12、13」が表示される。
どれか1つを入力する(例:11)
↓
リストボックス2(lstDet)に「111、112、113」が表示される。
どれか1つを入力する(例:111)
↓
リストボックス3(lstsai)に「1111、1112、1113」が表示される。
リスト1(値集合ソースに記述)
SELECT sub.sub_nm, sub.mas_id, sub.sub_id, master.mas_nm, master.mas_nm_2 FROM master INNER JOIN sub ON master.mas_id=sub.mas_id WHERE (((master.mas_nm) Like "*" & forms!フォーム!lblMaster.Caption & "*")) Or (((master.mas_nm_2) Like "*" & Forms!フォーム!lblMaster2.Caption & "*")) ORDER BY sub.sub_nm;
リスト2
SELECT detail.det_nm, detail.mas_id, detail.sub_id, detail.det_id, master.mas_nm, master.mas_nm_2 FROM master INNER JOIN (sub INNER JOIN detail ON (sub.sub_id = detail.sub_id) AND (sub.mas_id = detail.mas_id)) ON master.mas_id = sub.mas_id WHERE (((detail.sub_id)=[Forms]![フォーム]![lstSub]) AND ((master.mas_nm) Like "*" & [Forms]![フォーム]![lblMaster].[Caption] & "*")) OR (((master.mas_nm_2) Like "*" & [Forms]![フォーム]![lblMaster2].[Caption] & "*")) ORDER BY detail.det_nm;
リスト3も、リスト1・2同様にmas_nmとmas_nm2をORで記載していますが
フォームを使用したとき正確に結果が表示されるのはリスト1のみで、リスト2・3は全てのフィールドが表示されてしまいます。
またテーブルは4つありmaster、sub、detail、saiで
master(テキストボックス):
mas_id---mas_nm---mas_nm2
1--AAAA---BBB
2--CCCC---DDD
sub(リスト1):
mas_id---sub_id---sub_nm
1---1---11
1---2---12
2---1---21
2---2---22
detail(リスト2):
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
sai(リスト3):
mas_id---sub_id---det_id---sai_id---sai_nm
1---1---1---1---1111
1---1---1---2---1112
1---1---1---3---1113
1---1---2---1---1121
---以下省略---
としています。同じ名前のものは一対多のリレーションをそれぞれつけています
例:
master sub deta
mas_id---mas_id---mas_id
mas_nm sub_id----sub_id
No.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
のようになっています。
なお、いったんリレーションは解除
しておいてください。
あるいは、あえて言うならばリレーションは
必要はありません。
返事が遅くなり申し訳ございません。
ありがとうございます。
無事解決することができました。
値集合ソースのクエリの条件が間違っていたようです。
No.3
- 回答日時:
No2です。
続きですが、リストの値を参照する場合、リスト2を例にすると、
>[Forms]![フォーム]![lstSub]
リスト1のsub_idの列を参照することになります。
したがって、
[Forms]![フォーム]![lstSub].Column(1)
のようになるのでは、と思います。ただし、
質問のSQL文が正しいとすればですが。
なお、リストの幅をたとえば、
0cm,0cm,2cm
にして、一番目と二番目の列を非表示にしても、
一番目の列を参照する場合は、
Column(0)として参照します。三番目だと
Column(2)となります。
No.2
- 回答日時:
いくつかのサイトで同じ質問をされていますが、なかなか
具体的な回答がつかないようですが。
中身が分かりづらいので以下のようにして回答します。
たとえば、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
としています、長々としてわかりづらいですが
よろしくお願いします。
No.1
- 回答日時:
コンボボックスで
住所を選ぶときの、
都道府県>市区>町村と選んでいく概念と同じ感じかと思います。
サンプルはないか探してみる。
都道府県が選ばれてこそ、市区の絞り込み、さらに
それまでが選ばれたら町村・・・。
リストボックス1が更新されたときのアクション、
リストボックス2が更新されたときのアクション、
そういうのはどうなっているのでしょうか?。
再クエリとかしていますか?。
一度に求めたい表示にはならない、
順番に表示を変えていかなくてはならない仕組みかと思います。
この回答への補足
回答ありがとうございます。
>>リストボックス1が更新されたときのアクション、
リストボックス2が更新されたときのアクション、
そういうのはどうなっているのでしょうか?。
再クエリとかしていますか?。
VBAのことでしょうか?
piroin654さんの補足返信にVBAを載せましたので、よろしければそちらを見ていただけるとありがたいです。
テキストボックスやリストボックスがそれぞれ何か変更があったときは
それぞれのリストボックスの値集合ソースにいれているクエリを再クエリしています。
テキストボックスに変更があったとき
リストボックス1~3のクエリを再クエリ
リストボックス1に変更があったとき
リストボックス2~3のクエリを再クエリ
リストボックス2に変更があったとき
リストボックス3のクエリを再クエリ
という風にしています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Access(アクセス) Dlookupにエラーがでてしまう 1 2022/10/31 14:35
- Access(アクセス) アクセス レポートを開いたときにパラメーターの自動入力がしたい 4 2022/11/30 11:21
- Visual Basic(VBA) Excel VBAのリストボックスの値を他のフォームに反映させる方法を教えてください。 2 2023/07/14 14:06
- Visual Basic(VBA) ユーザーフォームの表示を追加したい 2 2023/03/26 23:18
- Access(アクセス) Accessの参照フィールドの列がずれてしまいます 1 2023/07/19 15:00
- Visual Basic(VBA) ActiveReportのdetailをデータセットの自動バインドを使って帳票を出力しています。 1 2023/08/16 07:16
- IT・エンジニアリング ActiveReportのdetailをデータセットの自動バインドを使って帳票を出力しています。 1 2023/08/16 07:17
- Visual Basic(VBA) 検索のユーザーフォームの表示について 1 2023/03/27 23:31
- Access(アクセス) アクセス テーブルの空白を変数に置換するボタンが作りたい 4 2022/07/08 11:19
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
VIEWの元のテーブルのindexって...
-
insertを高速化させたい
-
SQL Left Join で重複を排除す...
-
select文のwhere句に配列を入れ...
-
一つ前のレコードの値と減算し...
-
SQLサーバから、項目の属性(型...
-
複数テーブルのGROUP BY の使い...
-
PL/SQLの変数について
-
期間の重複を調べるSQL文につい...
-
テーブル名を省略して「h.id」...
-
SELECT~LIKE~の結果が変
-
[MySQL] UNIQUE制約の値を更新...
-
1テーブル&複数レコードの更新...
-
マイクラPC版のコマンドで効率...
-
URL と行番号の指定
-
副問合せの書き方について
-
上位3位を求めるSQL文は?
-
SQLにて特定の文字を除いた検索...
-
mysqlのload data infileで連番...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQL Left Join で重複を排除す...
-
VIEWの元のテーブルのindexって...
-
SQLサーバから、項目の属性(型...
-
select文のwhere句に配列を入れ...
-
副問合せの書き方について
-
マイクラPC版のコマンドで効率...
-
Unionした最後にGROUP BYを追加...
-
selectした大量データをinsert...
-
SQLにて特定の文字を除いた検索...
-
[SQLServer] テーブル名からカ...
-
1テーブル&複数レコードの更新...
-
inner joinをすると数がおかし...
-
クエリ表示と、ADOで抽出したレ...
-
ある条件の最大値+1を初番する...
-
sqlで、600行あるテーブルを100...
-
複数テーブルのGROUP BY の使い...
-
insertを高速化させたい
-
PL/SQLの変数について
-
キー毎の、ある列のmaxのレコー...
おすすめ情報