• ベストアンサー

Access 2003 iif [日付フィールド] is null のあとで<>がうまく働かない

Access 2003です。 [Start Date], [End Date]を入力するフォームで日付が入力されていなければ、 iif([Start Date] is null,<[End Date],>[Start Date]) のようにクエリ条件を設定したいのですが、 iif [Start Date] is null を使うと、続く条件の中で<>がうまく働かないという現象が起きます。 (クエリでなにも抽出されない) iif([Start Date] is nullの条件を入れなければ(つまり[Start Date],[End Date]はブランクにならないという前提ならば) 1. >[Start Date] 2. <[End Date] 3. Between [Start Date] And [End Date] などどれも問題なく動きますし、 iif([Start Date] is null~の条件を入れても続く条件の中で<>を使わなければ iif([Start Date] is null,[End Date],[Start Date]) はちゃんと動きます。 どうしてこのような現象が起こるのか、また回避する方法をご存知のかたがいらっしゃいましたら、どうぞご教示ください。 よろしくお願いします。

  • Dai95
  • お礼率100% (7/7)

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

  • ベストアンサー
  • venzou
  • ベストアンサー率71% (311/435)
回答No.2

回避方法については回答出てますので、どうしてこのような現象が起こるのか、について。 クエリのデザインビューの抽出条件では、式の左辺を省略しますが、実際のSQL文に直した場合、自動的に左辺が追加されます。 例えば、あるフィールド([A]とします)の条件が下記だった場合、 >[Start Date] 実際のSQL文での条件は、左辺が追加され、下記の様になります。 WHERE [A] > [Start Date] 抽出条件が質問の式だった場合、 iif([Start Date] is null,<[End Date],>[Start Date]) 実際の条件式は下記の様になります。 WHERE [A]=iif([Start Date] is null,[A]<[End Date],[A]>[Start Date]) [Start Date]がnullだった場合、 WHERE [A]=([A]<[End Date]) と評価され、期待通りの結果とはなりません。 クエリのデザインビューは便利ですが、万能ではありません。 (全てのSQL文を表現できる訳ではない) クエリの実体はSQL文です。複雑なクエリの場合、SQL文についての知識が必要になってきます。 興味があれば、SQL文について勉強してみて下さい。

Dai95
質問者

お礼

はー、なるほど。 確かにSQLでみるとおっしゃるようなクエリになってます。 デザインビューは万能ではないんですね。 とても参考になりましたし、これから自分でも調べてみようと思います。 たいへん分かりやすい解説どうもありがとうございました!

その他の回答 (1)

  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.1

これでは駄目でしょうか Between Nz([Start Date],#1900/1/1#) And Nz([End Date],#2087/12/31#) Nz関数は変数がNullの時の代替値を設定します。

Dai95
質問者

お礼

あ、すごい!できました! Nzっていう関数があるんですね、知りませんでした。 これからもっと勉強して知識を増やしていこうと思います。 どうもありがとうございました!!

関連するQ&A

  • Access 今日の日付の入力を省略するには?

    Between~Andを使って、[受付日]の期間を指定してデータを抽出しています。 1.フォーム[F_メインメニュー]で非連結のテキストボックス[from]、[to]を作り2つの日付を入力します。 2.クエリで、[受付日]の抽出条件に以下を設定して、データを抽出します。 Between [Forms]![F_メインメニュー]![from] And [forms]![F_メインメニュー]![to] ここまでは問題ないのですが、[to]の入力を省略したら[今日の日付]が[to]の日付になるようにできないでしょうか? IIFを使って、クエリの[受付日]の抽出条件に以下のように書いてみました。(toがNullならfromから今日まで、入力されてたらfromからtoまで、と考えました。)→失敗しました。間違った式のようです。 IIF([forms]![F_メインメニュー]![to] = Null,Between [Forms]![F_メインメニュー]![from] And Date(), Between [Forms]![F_メインメニュー]![from] And [forms]![F_メインメニュー]![to]) ご存じの方、アドバイスをくださる方がいらっしゃいましたらどうぞよろしくお願いします。

  • access2000でのiifを使う条件で

    削除クエリを実施する際にフォームでテキスト16からテキスト18って感じで日付を入力して削除しています。テキスト16に何も入力しない時は2000/01/01からテキスト18までとなるようにしたくてクエリの抽出条件に IIf([Forms]![F_A]![テキスト16]="", Between #2000/01/01# And [Forms]![F_A]![テキスト18],Between [Forms]![F_A]![テキスト16] And [Forms]![F_A]![テキスト18]) って入れたのですが上手く動きません。 何か根本的に間違ってたりした。よろしくお願いします。

  • Access2000 null処理

    Accessのデータベースで商品管理のシステムを作っています。 フォーム上で検索条件を入力し、商品管理のテーブルから商品データを検索するというフォーム、クエリを作ります。 商品管理テーブルの中に 「売上日」という項目があります。 検索項目の1つに売上日があるのですが、以下の状況下でレコードを抽出します。 (1)フォーム上には [売上日S]と[売上日F]があり、[売上日S]以上[売上日F]以下でレコードを抽出。 (2)[売上日S]と[売上日F]がともにnullの場合は全件を表示。 (3)テーブルでは、売上日がnullのことがある。nullは最小値とする。 例えば、フォーム上で [売上日S]がnull [売上日F]が07/01/01ならば、 07/01/01、またはそれ以前に売り上げた商品と、売上日がnullのレコードを抽出。(つまり、 <= 07/01/01 or null になる) よく >= iif(IsNull([forms]![form名]![売上日S]),#1950/01/01#,[forms]![form名]![売上日S]) And <= iif(IsNull([forms]![form名]![売上日F]),#2050/12/31#,[forms]![form名]![売上日F]) を抽出条件にしてnull対応するのですが、これでは、売上日Sがnullのときにnullが含まれず、nullが最小値になりません。 なので クエリ上でもう1つ項目を作り iif(IsNull([売上日]),#1950/01/01#,[売上日]) とし、 この項目を上の抽出条件で抽出するようにしました。 これでうまくいくと思ったのですが、だめでした。 [売上日S]と[売上日F]がともにnullのときはすべて項目が表示されます。 しかし、[売上日S]=null,[売上日F]=07/01/01 のような場合、売上日がnullのものが表示されません。 直接、抽出条件に  >= #1950/01/01# And <= #07/01/01# と打てば、ちゃんと動くし、 売上日S = 07/01/01 売上日F = 07/01/10 のようなときは、ちゃんと抽出されます。 売上日S がnull、売上日Fが非ヌルのときにもちゃんと抽出されるようにするにはどうすればよいのでしょうか? ところで、この不具合は私の記述ミスではないと思うのですがコレはAccess2000の不備でしょうか? どなたかアドバイスをお願いします。

  • Access クエリ上でIIFにて作ったフィールドに対する抽出

    最近Access2007を分かるシリーズで勉強しだしたほぼ素人です DATESERIAl構文のところにさしかかったのですが =dateserial([年],[月]+2,1)-1 =dateserial([年],[月]+2,0) が同じ結果になることを検証したくなりましたので Excelのシートを用意し A1=ID B1=年 C1=月 A2=row()-1 B2=int((row()-2)/12)+1900 C2=mod(row()-2,12)+1 と入力 A2:C2を下方に適当量コピーして元データを作り Excelからテーブルとして取り込みました 更に このテーブルをを元に 左端のフィールドから順に年と月をドロップしてクエリを作って このクエリの空いたフィールドに これまた左から順に date1: DateSerial([年],[月]+2,1)-1 date2: DateSerial([年],[月]+2,0) 検証: IIf([date1]=[date2],Yes,No) と入力しました ここからが本題なのですが 質問 検証と名付けたフィールドの抽出部位に0及びYes及びFalse その色々記載して見たのですが 実行させてみたところ全て date1というパラメーターを求めるウインドウが開きました 検証のフィールドの式を 検証: IIf([date1]=[date2],"合","否") と書き換えても変化はありません 今一度検証のフィールドの式を 検証: IIf(date1=date2,"合","否")と書き換え確定すると ちゃんと検証: IIf([date1]=[date2],"合","否")に変わるので [date1]及び[date2]がフィールドの名前と認識されていないことはないと思います どうしてこうなるのか どうやったら不成立をヒットさせられるのか 御教示を願います

  • Accessでのiif関数について

    はじめまして。 Microsoft Accessの関数についての質問です。 例えばクエリの「商品名」の値AをBに置き換えたい場合、 =iif([商品名]=A,B)とします。 また、商品番号1000~9999まであるとして、1000~1999を抽出したい場合は、Like "1*" もしくは、Between 1000 And 1999 とします。 この時に 商品番号1000~1999を一律1000と置き換えたい場合、クエリでやるとしたらどのようにすれば良いのでしょうか。 イメージ的には =iif([商品番号]="1*",1000)なのですが、「"1*"」の部分をどうやってもうまくいきません。 どなたか詳しい方いらっしゃいましたらお教え頂けないでしょうか。 お忙しいところ申し訳ございませんが、宜しくお願い致します。

  • クエリの抽出条件でiif関数

    こんにちわ。 いまaccess2000でクエリを作成し, その抽出条件において,iif関数を使って, フォームのあるフィールドに値があるときはその値, ないときはワイルドカードで検索しようと思い, 下記のコーディングを入れました。 iif([Forms]![F_フォーム1].[テキスト1] Is Null, "*", [Forms]![F_フォーム1].[テキスト1]) ところがワイルドカードの"*"がうまく効いてくれないようで 正しく検索されません。 どうすれば正しく検索できるでしょうか? 教えてください。お願いします。

  • ACC クエリ 条件にIIf

    宜しくお願いします。 ACCESSのクエリで、抽出条件に画面からの値を使用したいのですが、 その値がNULL(未入力)時には全件抽出としたいのですが、 うまく行きません。下記の「""」には何をセットすれば よいのでしょうか? IIf (NOT ISNULL( [Forms]![F_伝票照会]![伝票NO]), [Forms]![照会]![伝票NO], "")

  • AccessのIIFの引数の条件について教えてください。

    こんにちは。 初心者すぎて申し訳ございませんが、ご教授お願いいたします。 クエリを作成し、そこにiifで条件を入れたいと思います。 そのフィールドには、”承認済”・”未承認”・”申請前”と、3種類があります。 また、フォームのオプションボタンは”1”・”2”があります。 (1)オプションボタンが”1”ならば”承認済” (2)でなければ、”未承認”と”申請前”となっている結果を表示させたく思います。 クエリの抽出条件に以下の条件を書いてみたところ、 「式が正しく入力されていないか、複雑すぎるために評価できませんでした。~」 となってしまいます。 IIf([Forms]![フォーム1]![フレーム8]=1,"承認済","未承認" Or "申請前") 条件を1つ削り以下の式は、正しく表示されるのですが・・・。 IIf([Forms]![フォーム1]![フレーム8]=1,"承認済","未承認") いろいろやってみたのですがわかりませんでした。 お手数ですが、以上よろしくお願いいたします。

  • Access フォームコンボボックス空白をクエリで抽出したい

    現在access2000を使って、 フォーム1内にコンボボックスを作って コンボボックス内に1,2,3 と項目を入れています。 一方、クエリを使って、上記フォーム内のコンボボックスをつなげて1,2,3をそれぞれ抽出することはできるのですが、 1から3まで全てをiif関数などで 抽出したいと考えてします。 僕が考えた関数は iif(isnull([フォーム1][コンボ1]),is not null ,[フォーム1][コンボ1]) とクエリ抽出条件内に入力すると、結果は、 1、2、3をそれぞれフォームコンボボックスで選択すれば、クエリに反映されるのですが、コンボボックス内を「空白」の状態にすると、1,2,3すべてがクエリで抽出されるのではなく、何も抽出されないという結果になってしまいます。 どうすれば、クエリで1から3すべてを抽出することができるのでしょうか?多分、iif関数内の「空白」は空白として処理されないような気がします。 よろしくお願いします。

  • ACCESEのビルドの使い方について

    フォームでテキストボックスを2つ作成して、 そのテキストに入力した条件を抽出させるようなことを やりたいのですが、クエリの抽出条件を入れられるところに ビルドで作成すると思いますが.. (テキストボックスごとにフィールドは違うのを見るようにしてます) データ抽出するクエリの作成方法(ビルド)で、 テキストボックスに入力されていない場合、 下記のような構文になると思います。 iif(isnull(forms!フォーム1!date1),,) iif(isnull(forms!フォーム1!date2),,) 上記の処理で、NULL(または入力なし)だった場合、 テキストボックスのクエリの該当フィールドに 作成した抽出条件を無視をするような処理をいれたいのですが、 テキストに入力して抽出してみると 何も抽出できなくて困ってます。 参考になるURLがあったら教えてください

専門家に質問してみよう