• ベストアンサー

AccessのSQL文 検索

お世話になります AND検索でBetween検索とテキストでAND検索をさせているのですが ■不具合 下記のSQLのままだとすべての場所を満たさないと検索できません たとえば開始日~終了日だけなら絞込できません テキストを入力すると初めて絞込みをします ■たぶん たぶん下記SQL文にどちらかNULL値の場合をスルーさせる文章を追加させなければならないと思います WHERE (((B.番号)=[Forms]![Search]![テキスト]) AND ((B.D日付) Between [Forms]![Search]![txtDTPicker0] And [Forms]![Search]![txtDTPicker1])) ORDER BY B.D日付; わかる方よろしくお願いします

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

  • ベストアンサー
  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.4

WHERE (((B.番号)=[Forms]![Search]![テキスト] or [Forms]![Search]![テキスト] is null) AND ((B.D日付) Between Nz([Forms]![Search]![txtDTPicker0],#1900/1/1#) And Nz([Forms]![Search]![txtDTPicker1],#2900/12/31#))) ORDER BY B.D日付; でいけるはずですよ

すると、全ての回答が全文表示されます。

その他の回答 (3)

回答No.3

>少し疑問に思ったのですが、この方法は日付検索、テキストの 2個が限度みたいですね。 いくつでもできますよ。 上の場合は、iif(isnull(フォームのパラメータ),nullの場合の値,フォームのパラメタの値) で、みんな定義できます。 下の場合は、テーブルのフィールド(selectで*)でに加えて、フォームのパラメータをすべて パラメータ名:iif(isnull(フォームのパラメータ),nullの場合の値,フォームのパラメタの値) を定義しておけば、テーブルのフィールドと、フォームのパラメータが一緒になったクエリ(あたかもテーブル)ができるので、そのクエリを基にクエリを作れば、その後はいちいち[forms]![search]...としなくて済みます。 >極端なお話ですが検索を柔軟に増やしていける方法ってありますか? 下の2段構えの方法なら、元のテーブル(やクエリ)を基に、フォームのパラメータを加えたクエリを作ることができるので、それをもとにクエリを作るのは楽だと思いますが・・・ もしも、テーブル1にA,B,Cというフィールドがあって、フォーム1のテキスト0,テキスト1,テキスト2があったとすると、今回のiifを考えなければ select *,[forms]![フォーム1].[テキスト0] as テキスト0,[forms]![フォーム1].[テキスト1] as テキスト1,[forms]![フォーム1].[テキスト2] as テキスト2 from テーブル1 というクエリを作れば、A,B,C,テキスト0,テキスト1,テキスト2というフィールドを持ったテーブルとして扱えるので、このクエリを基にクエリを作れば、結構柔軟に増やせると思います。

すると、全ての回答が全文表示されます。
回答No.2

とりあえず、こんなのではどうでしょうか? iifを使って、フォームのパラメータがnullの場合に対応させています。 SELECT * FROM B WHERE ([B].[番号]=IIf(IsNull([Forms]![Search]![テキスト]),[B].[番号],[Forms]![Search]![テキスト])) AND (B.D日付 Between IIf(IsNull([Forms]![Search]![txtDTPicker0]),DMin("D日付","B"),[Forms]![Search]![txtDTPicker0]) And IIf(IsNull([Forms]![Search]![txtDTPicker1]),DMax("D日付","B"),[Forms]![Search]![txtDTPicker1])) ORDER BY B.D日付; わかりにくいですけど。 1段クエリを挟む方法もあります。 フォームのパラメータがNullの場合を考慮したクエリ(QB)を作って、 SELECT B.*, IIf(IsNull([Forms]![Search]!テキスト),[B].[番号],[Forms]![Search]!テキスト) AS テキスト, IIf(IsNull([Forms]![Search]!txtDTPicker0),DMin("D日付","B"),[Forms]![Search]!txtDTPicker0) AS txtDTPicker0, IIf(IsNull([Forms]![Search]!txtDTPicker1),DMax("D日付","B"),[Forms]![Search]!txtDTPicker1) AS txtDTPicker1 FROM B; とすれば、 WHERE (((QB.D日付) Between [QB].[txtDTPicker0] And [QB].[txtDTPicker1]) AND ((QB.番号)=[QB].[テキスト])) ORDER BY QB.D日付; でできると思います。

BSR123
質問者

お礼

お返事ありがとうございました

BSR123
質問者

補足

お返事ありがとうございます 上記実行確認取れましたありがとうございます 少し疑問に思ったのですが、この方法は日付検索、テキストの 2個が限度みたいですね。 極端なお話ですが検索を柔軟に増やしていける方法ってありますか? これで最後にしますのでなにとぞご教授お願い申し上げます

すると、全ての回答が全文表示されます。
noname#79209
noname#79209
回答No.1

多分、予め作成済みのクエリを使っているのだと思います。 その場合は無理です。 フォーム上で選択した検索項目数によって、その組み合わせ分のクエリを作っておく。 検索項目が2つの場合、検索項目1のみ、検索項目2のみ、両方の場合の3通り作っておき、切り替える方法があります。 簡単ではありますが、あまりスマートではないし実用的ではありません。 (私は時間がない時は使いますが...) VBAでクエリを作り出すか、レコードセットを作ってVBAで回すか... これは、質問者さんのDBと、運用方法でかなり異なってきます。

BSR123
質問者

お礼

お返事ありがとうございました

BSR123
質問者

補足

お返事ありがとうございます やはりそうですか;; やはりVBAで検索させなければならないですね 現在帳票フォームにヘッダを作成しテキストボックスを複数設置 実行ボタンで検索ヒットしたものを詳細へ反映させたいのですがわかりますか? テキストボックスやドロップダウン 日付け絞込みのためBetween間で使っています 質問内容が成り行き上変わってきてますがご教授よろしくお願い申し上げます

すると、全ての回答が全文表示されます。

専門家に質問してみよう