- ベストアンサー
Access条件抽出クエリの使い方と注意点
- Accessの条件抽出クエリでは、パラメータ入力フォームを使用して抽出結果をフォームに出力することができます。ただし、OKボタンをクリックした際に指定する方法はありません。
- Accessの条件抽出クエリでは、複数の条件を指定する場合にはAND演算子を使用します。例えば、「取引先」と「期間」を両方指定した場合は、その両方を満たすレコードが抽出されます。片方のみを指定して、もう片方は全てを対象としたい場合は、指定する条件に「*」を記述することで全てを対象とすることができます。
- Accessの条件抽出クエリを使う際には、パラメータ入力フォームの作成や条件の指定方法に注意が必要です。また、抽出結果をフォームに出力する際にはOKボタンをクリックした際に指定する方法はありませんので、注意が必要です。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
2)の方法ということですね。 検索をかけるフォームに「開始日」「終了日」という名のテキストボックスがあったとします。 クエリからその「開始日」「終了日」を参照するには、 [Forms]![検索フォーム名]![開始日] [Forms]![検索フォーム名]![終了日] で、参照します。 ここに、「受注元」が加わった状況ですね。 [Forms]![検索フォーム名]![受注元] その、検索フォームには「受注元」「開始日」「終了日」があるとします。 それぞれテキストボックスとした時、 「開始日」「終了日」は書式で「日付(S)」とかで日付であるものとします。 まず、文字列のフィールドに対して、Like '*' と抽出条件を書くと、 そのフィールドが、NULL だった場合、抽出条件から外れることはご存知ですか? Like '*' は、何らかの文字が入っていたら という指定になります。 テーブルの設定で、テキスト型の「値要求」が「いいえ」で、他の項目設定によりレコードが登録された時、そのテキスト型のフィールドは、NULL となります。 NULL と 空文字列("")の違いはわかりますか? Like '*' で記述すると、NULL は対象外、"" は、もろ対象になります。 FAQとかで、全部抽出する時には Like '*' を書けば・・・・とか見ることがありますが、 NULL のものは抽出されません。 全てを抽出する時には、条件を記述しないことです。 以下書き方になりますが、 クエリのフィールド欄に、「受注元」があって、抽出条件に Like '*' & [Forms]![検索フォーム名]![受注元] & '*' or [Forms]![検索フォーム名]![受注元] Is Null と書くことがあると思います。 これは、「受注元」が"あいうえお" で、[Forms]![検索フォーム名]![受注元] が "いう" なら抽出する または、[Forms]![検索フォーム名]![受注元] に何も入力されなかったら全部、という意味になります。 Like '*' & [Forms]![検索フォーム名]![受注元] & '*' or [Forms]![検索フォーム名]![受注元] Is Null の記述は SQLビューでみると (((テーブル名.受注元) Like '*' & [forms]![検索フォーム名]![受注元] & '*' Or [forms]!検索フォーム名]![受注元] Is Null)) になります。 これは、Or の左右どちらかが TRUE になれば、抽出されることになります。 ここの書き方を、 IIF(IsNull([forms]![検索フォーム名]![受注元]),TRUE,テーブル名.受注元 Like '*' & [forms]![検索フォーム名]![受注元] & '*') と書いても同じことになります。 チョット書いていてわからなくなってきましたが、 期間を指定する時に Between に固執する人がいますが、 >= AND <= でも同じことで、 IIF(IsNull([forms]![検索フォーム名]![開始日]),TRUE,テーブル名.期間 >= [forms]![検索フォーム名]![開始日]) と IIF(IsNull([forms]![検索フォーム名]![終了日]),TRUE,テーブル名.期間 <= [forms]![検索フォーム名]![終了日]) を AND でつなげれば、期間の抽出になります。 [forms]![検索フォーム名]![開始日] [forms]![検索フォーム名]![終了日] 両方とも入力しないと、IIF により どちらも TRUE になるので、全件表示されることになります。 で、クエリの種類によっては、追加設定が必要になります。 クロス集計クエリの場合とかですが、 [forms]![検索フォーム名]![開始日] が何者かわからない時があります。 その時には、クエリのパラメータ設定で、 パラメータに [forms]![検索フォーム名]![開始日] データ型に 日付/時刻型 とか設定します。 [forms]![検索フォーム名]![終了日]も同様に。 私の中では完結しているのですが、伝えることができていたでしょうか。 わからなかったら、補足でお願いします。
その他の回答 (3)
- 30246kiku
- ベストアンサー率73% (370/504)
#3です > それで、条件入力フォームの「受注元」部分(コンボボックスで取引先リストを参照して、これを選ばせていた)を、ただのテキストボックスにかえたら。。 > 出るようになりました。(><) コンボボックスということなので、後は、連結列を確かめてみてください。 例えば、「値集合ソース」が、 SELECT 受注元ID, 受注元 FROM テーブル名; の様に2列以上抽出していたとして(上記では2列)、 連結列:1 列幅: 0cm;2cm としていると、表示上は「受注元」のみが表示されますが、 このコンボボックスの値は連結された1列目「受注元ID」となります。
お礼
>30246kikuさま いつもお世話になっております。 ありがとうございました。。!! こちらも出るようになりました! 本当に、助かりました!
- 30246kiku
- ベストアンサー率73% (370/504)
#2です > おかげ様でクエリの単体試験は正常に動くようになりました! > が、フォームの方から動かすと、何を入れても入れなくても0件抽出になってしまっています。 クエリ単体では動くけど、フォームを起動してやると動かない。ということですよね。 ごめんなさい。私では解決できないと思います。 (実際にモノを触れれば少しはできたかなと思います) 1つだけ、フォームを起動して何らかを入力後、直接クエリを起動したらどうなりますか。 (ボタンでの起動ではなく)
お礼
>30246kikuさま アドバイスに沿い、フォームを起動して直接クエリを起動した際、受注元を入れたときのみ、0件抽出になるということがわかりました。 それで、条件入力フォームの「受注元」部分(コンボボックスで取引先リストを参照して、これを選ばせていた)を、ただのテキストボックスにかえたら。。 出るようになりました。(><) 暫定的に今回はこれでいって、 あとから改修という形で、コンボボックスに変えていけるようにしようと思います。 これから、この抽出結果をExcelに出力する方に取り掛かります。 (だいぶ前に 質問した内容で、30246kikuさまにもアドバイスを戴いておきながらなにも返事もしていない、あのSQLの部分です) 本当にありがとうございました。
- 30246kiku
- ベストアンサー率73% (370/504)
実現する方法はいくつかありますが、 1)フォーム上で絞込み表示する 2)クエリに絞込みを指定し、その結果をフォームに表示する 2)について必要なら、 テーブル名、項目(フィールド)名、フォーム名、フォーム上のコントロール名 を追記してください。 > どちらも指定したい場合は簡単にできる この時の指定(記述)もあれば、具体的な回答を得られると思います。
お礼
>30246kikuさま いつもありがとうございます。 取り急ぎ、お礼と追記を。 2.ですが、 「受注マスタ」(受注を登録していくDB)の、商品コードをキーに、総受注数を集計する「受注集計クエリ」においての話です。 「受注マスタ」には、「商品番号」「受注日」「受注元」「受注数」のデータがあります。 集計クエリでは、「受注元」(取引先)と「受注日」(期間)の抽出条件の部分にパラメタ指定をしてやっているのですが 「取引先は決まってるけど期間は指定しない」ということができないので困っている次第です。 この説明ではわかりにくい。。ですかね(><)
補足
>30246kikuさま いつもありがとうございます。 おかげ様でクエリの単体試験は正常に動くようになりました! が、フォームの方から動かすと、何を入れても入れなくても0件抽出になってしまっています。 フォームのクラスオブジェクトは、普通にコマンドボタンウィザードで「クエリを開く」で上記クエリを設定するだけでいいのでしょうか。 それとも、受け渡し用にクラスオブジェクト内に何か記述する必要があるでしょうか。 一応、フォーム名やコントロール名がクエリと合ってないのかと思ったのですが、それについては問題なさそうでした。 宜しくおねがいします。(><)