Access複数のフィールドからクエリで抽出

このQ&Aのポイント
  • Accessのクエリを使用して複数のフィールドからデータを抽出する方法について質問します。
  • テキストボックスに入力したキーワードで、テーブルから該当するIDを検索するフォームを作成したいです。
  • リストボックスを使用して、大分類から細かい分類へ選択していくフォームを作りたいです。
回答を見る
  • ベストアンサー

Access 複数のフィールドからクエリで抽出

お世話になっております。 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

質問者が選んだベストアンサー

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答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 のようになっています。 なお、いったんリレーションは解除 しておいてください。 あるいは、あえて言うならばリレーションは 必要はありません。

voivoivoi
質問者

お礼

返事が遅くなり申し訳ございません。 ありがとうございます。 無事解決することができました。 値集合ソースのクエリの条件が間違っていたようです。

その他の回答 (3)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

No2です。続きですが、リストの値を参照する場合、 リスト2を例にすると、 >[Forms]![フォーム]![lstSub] リスト1のsub_idの列を参照することになります。 したがって、 [Forms]![フォーム]![lstSub].Column(1) のようになるのでは、と思います。ただし、 質問のSQL文が正しいとすればですが。 なお、リストの幅をたとえば、 0cm,0cm,2cm にして、一番目と二番目の列を非表示にしても、 一番目の列を参照する場合は、 Column(0)として参照します。三番目だと Column(2)となります。

  • piroin654
  • ベストアンサー率75% (692/917)
回答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) で、これはリストから選択するというよりも、再び テキストボックスに入力するという意味ですか。

voivoivoi
質問者

補足

回答ありがとうございます。 >>回答を進める上での質問の場合の疑問点 どれか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)
回答No.1

コンボボックスで 住所を選ぶときの、 都道府県>市区>町村と選んでいく概念と同じ感じかと思います。 サンプルはないか探してみる。 都道府県が選ばれてこそ、市区の絞り込み、さらに それまでが選ばれたら町村・・・。 リストボックス1が更新されたときのアクション、 リストボックス2が更新されたときのアクション、 そういうのはどうなっているのでしょうか?。 再クエリとかしていますか?。 一度に求めたい表示にはならない、 順番に表示を変えていかなくてはならない仕組みかと思います。

voivoivoi
質問者

お礼

返事が遅くなり、申し訳ございません。 回答ありがとうございます、無事解決しました。

voivoivoi
質問者

補足

回答ありがとうございます。 >>リストボックス1が更新されたときのアクション、   リストボックス2が更新されたときのアクション、   そういうのはどうなっているのでしょうか?。   再クエリとかしていますか?。 VBAのことでしょうか? piroin654さんの補足返信にVBAを載せましたので、よろしければそちらを見ていただけるとありがたいです。 テキストボックスやリストボックスがそれぞれ何か変更があったときは それぞれのリストボックスの値集合ソースにいれているクエリを再クエリしています。 テキストボックスに変更があったとき リストボックス1~3のクエリを再クエリ リストボックス1に変更があったとき リストボックス2~3のクエリを再クエリ リストボックス2に変更があったとき リストボックス3のクエリを再クエリ という風にしています。

関連するQ&A

  • ACCESSクエリ抽出条件について

    フォーム画面のリストボックスで複数選択が出来るよう設定し、その結果をクエリの抽出条件で forms![フォーム名].[リストボックス名] としたのですが全く反映されません。 複数選択が出来ないようにしたら問題なく表示されるのですが、上記の記述以外に入力しないといけないのでしょうか?

  • ACCESS2000の複数検索条件からのデータ抽出

    こんにちわ。前回質問内容自体どう説明してよいかわからず、途中で終わってしまったので、再度、詳しく質問してみました。 今、Accessで受注管理を作成しているんですが、複数の検索について教えて下さい。 ■テーブル テーブル名:受注管理 フィールド名:受注ID・日付・商品種別・顧客名・仕入種別・状況種別 ■クエリ クエリ名:受注クエリ(フィルタ) フィールド名:受注ID(表示チェックあり)・日付・商品種別・顧客名・仕入種別・状況種別 と式1[Forms]![検索フォーム名]![日付text]・式2[Forms]![検索フォーム名]![商品種別combo]・式3[Forms]![検索フォーム名]![顧客名text]・式4[Forms]![検索フォーム名]![仕入種別list]・式5 [Forms]![検索フォーム名]![状況種別combo]の計11列です。 抽出条件:検索名フィールド: 受注IDを除く各フィールド名の下に Like "*" & [Forms]![検索フォーム]![日付text] & "*" Like [Forms]![ 検索フォーム名]![商品種別combo] Like "*" & [Forms]![ 検索フォーム名]![顧客名text] & "*" Like [Forms]![ 検索フォーム名]![仕入種別list] Like [Forms]![ 検索フォーム名]![状況種別combo] 各式の下に Like "" Like "(なし)"      Like "" Like "(なし)" Like "(なし)" を検索パターンに応じて入力しました。 マクロにより、フィルタの実行をしていますが、この方法だと4つまでなら、検索可能なのですが、5つ以上になると、「フィルタが長すぎます」というダイアログボックスがでて検索ができません。VBAやSQLはいまいちわからないので、何か簡単に、5つ以上の検索条件で検索できないでしょうか。お願いします。

  • アクセス2000 複数の条件でクエリ作成

    アクセス2000を使用しています フォームを作成して テキストボックスを3つ、ボタンを1つ配置しています テキストボックスには番号、名前、名前ヨミをそれぞれ入力します 名前とヨミはあいまい検索をしたいのですが クエリの条件をどのように書けばいいでしょうか? 番号の条件 Forms!MAIN!番号 名前の条件 like "*" & Forms!MAIN!名前 & "*" ヨミの条件 like "*" & Forms!MAIN!名前ヨミ & "*" をそれぞれ または で記入したのですがうまく抽出されません たとえば、番号のところに何か入力しても残りの2つが空白であるためにあいまい検索なので全てという認識で抽出をかけているのだと思います どのように条件を書けばうまく抽出されるでしょうか

  • 【Access】複数フィールドを対象とする検索

    Access上で「検索ボタン」をクリックすると、 「データ」フォームのフィールド1、フィールド2、フィールド3のいずれかに「検索条件1」の語を含み、かつ、フィールド4、フィールド5、フィールド6のいずれかに「検索条件2」の語を含むレコードを抽出できるようにしたいと思います。 検索条件はテキストボックスに入力するようにしており、テキストボックス名は「検索条件1」、「検索条件2」となっています。 以下のコードでやってみたのですが、「実行時エラー13、型が一致しません」というエラーが出てうまく抽出できません。 Private Sub 検索ボタン_Click() Dim filter1 As String filter1 = "フィールド1 like '*" & Me!検索条件1 & "*' or フィールド2 like '*" & Me!検索条件1 & "*' orフィールド3 like '*" & Me!検索条件1 & "*'" And " フィールド4 like '*" & Me!検索条件2 & "*' or フィールド5 like '*" & Me!検索条件2 & "*' orフィールド6 like '*" & Me!検索条件2 & "*'" DoCmd.OpenForm "データ", acNormal Forms!データ!.filter = filter1 Forms!データ!.FilterOn = True End Sub 「検索条件1,2」のテキストボックスがあるフォーム上の「検索ボタン」をクリックすると、 「データ」フォームが開き、検索をかけるという流れをイメージして作成 しています。 どなたか正しい記述を教えていただけませんでしょうか。 よろしくお願いいたします。

  • クエリの抽出条件

    クエリの抽出条件を手入力では無く、コンボボックス方式で プルダウンでリストを選びたいと思い下記の抽出条件を入力 [Forms]![フォーム名]![コンボ名] しかし、パラメータ入力時の名前が、Forms!フォーム名!コンボ名と変わるのみで プルダウンになりません クエリを過去のデータ検索のみで使用したいと思ってます。 ネットをくぐると、メインフォームを開いてとありますが、それでも駄目です。 また、クエリー検索だけで、メインフォームを開かないでプルダウン方式には 出来ないものでしょうか よろしくお願い致します

  • Accessクエリの抽出条件にフォームから挿入する方法

    Accessフォームのテキストボックスに入力されたデータを、クエリの抽出条件に挿入したいのですが、その際部分一致で検索したいため、抽出条件にLike "*[Forms]![フォーム名]![テキストボックス名]*"と記述したのですがうまく行きません。 どのように記述すれば部分一致で検索できるのかお教えください。

  • ACCESSでのクエリ抽出条件について

    ACCESS超初心者です。 自分なりに調べたのですが、知識不足によりお手上げ状態です。 クエリの抽出条件について、どなたかご教授いただけますでしょうか? OS:XP ACCESS:2000 ・フォーム上に自由に入力できるテキストを3つ用意します。 ・入力された3つのテキストが1つのフィールドに含まれるものをクエリで抽出したい。 ・3つのテキストが空欄の場合は全てのデータを抽出したい。 ■フォーム上のテキスト  テキスト1:テキスト10  テキスト2:テスト11  テキスト3:テスト12 ■テーブル  フィールド1:問合せ内容(1) ■クエリ内の抽出条件 Like "*" & [Forms]![F_検索テスト]![テキスト10] & "*" And Like "*" & [Forms]![F_検索テスト]![テスト11] & "*" And Like "*" & [Forms]![F_検索テスト]![テスト12] & "*" テキスト名がおかしいのですが、ご了承下さい。

  • Access2007 サブフォームの新規レコードをすぐにフォームに表示させる方法

    サブフォーム上で適当なレコード(IDと商品名)を選択して、そのレコードにある入力ボタンを押すと、フォームのコンボボックス上にその商品名が出るようなフォームがあります。 すでに入力済みのIDと商品名は表示されます。 ところが、サブフォーム上でIDと商品名を新規入力して入力ボタンを押すと、フォームのコンボボックスは空白となり、商品データが表示されません。 しかし、一旦フォームを閉じて開くと、データは表示されています。 IDと商品名を新規入力して、そのままフォームのコンボボックスに反映させたいと思います。 入力ボタンはこのようにやってみました。 Private Sub 入力_Click() DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70 Forms!フォーム!ID = Me.ID End Sub または、 Private Sub 入力_Click() DoCmd.RunCommand acCmdSaveRecord Forms!フォーム!ID = Me.ID End Sub ご教授いただければ幸いです。よろしくお願いいたします。

  • フォームのテキストボックスを抽出条件とするクエリー

    Access2003を使って、「フォームのテキストボックスを抽出条件とするクエリー」 を作成していて困っています。 まず Like [Forms]![顧客氏名検索]![テキスト2] とすると、完全一致したものだけが抽出できています。そこで 【値の一部が一致】 Like "文字列*"   ※文字列にある文字列を直接入力するとちゃんと抽出できる。 これを参考に Like "[Forms]![顧客氏名検索]![テキスト2]*" とすると、値の一部が一致するものが抽出されません。(何を入力しても該当0件) 抽出条件が正しく設定されてないように思います。 フォームのテキストボックスの値を利用する場合、""や*の使い方がおかしいのでしょうか?

  • Accessのクエリ

    初めまして。Accessのクエリについての質問です。 Access2003を使っています。 検索フォームを作り、その検索フォームにテキストボックスを2つ作り、そのテキストボックスに検索したい言葉を入力し、コマンドボタンで作った検索ボタンを押すとマクロでフィルタの実行がされデータを抽出できるというものを作りました。フィルタには選択クエリを使用しています。抽出したい2つのフィールドの抽出条件にあいまい条件のLike "*" & [Forms]![フォーム名]![テキストボックス名] & "*"を入れています。 今はテキストボックスが2つですが、もっと増やしていろんな条件で検索出来るようにしたいので、3つ目のテキストボックスを作り、抽出条件も同じように入れました。ですが、そうすると今までちゃんとできていた最初の2つのテキストボックスによる抽出が違った結果となりでてきました。このとき、新しく作った3つ目のテキストボックスは空欄なので最初と同じ結果が出ると思ったのですが、これは抽出条件が3つはできないということでしょうか?どなたか教えてください。