• ベストアンサー

クエリからの別名フィールド(条件付き)の作成に関し

access初心者です。 以下のテーブルがあります。 ---------- 受付日 見積日 契約日 支払日 ---------- クエリでStatusという別名フィールドを作成して、 現在の進捗を表示させたいと思います。 受付日に日付が入力され、見積日がNullの場合:1 見積日に日付が入力され、契約日がNullの場合:2 契約日に日付が入力され、支払日がNullの場合:3 支払日に日付が入力された場合:4 あてずっぽで作成した式が以下になります。 Status: IIf([受付日]<>"" And [見積日]="",1,IIf([見積日]<>"" And [契約日]="",2,IIf([契約日]<>"" And [完了日]="",3,IIf([完了日]="",4,"")))) 複数条件で入れ子にしたいのですが・・・・ 当然のように #エラー となりました。 初歩的な問題で申し訳ありませんが、教示願います。

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.1

以下でどうなりますか Status: Switch(IsNull(受付日),0,IsNull(見積日),1,IsNull(契約日),2,IsNull(支払日),3,True,4) 受付日が Null の時には、Status を 0 にしています。 Null の時がなければ、0 になることはありません。 Status を作る時には、上の方から解釈するんですよね。 サンプルを作ってやってみた結果は以下 (表示が崩れるので、NULL 部分を ----/--/-- で置換えています) 受付日    見積日    契約日    支払日   Status ----/--/--  2011/08/01  ----/--/--  ----/--/--  0 2011/08/02  ----/--/--  2011/09/03  ----/--/--  1 2011/09/03  2011/09/04  ----/--/--  2011/10/04  2 2011/10/04  2011/10/05  2011/10/06  ----/--/--  3 2011/11/05  2011/11/06  2011/11/07  2011/11/08  4 サンプル上では良さそうですが、 参考にする/しない等、自己責任でお願いします。

j-foreman
質問者

お礼

kikuさん 仕事で徹夜続きだったっもので、回答遅れました。 ありがとうございます。できました!! いつも的確なご回答で、尊敬です。 また、最近気づいたのですが、 以前私の質問を、ご自身のブログに取り上げていただいたようで ありがとうございます。

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

その他の回答 (4)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.5

#4です #4の > 「受付日」をどう扱うかが明確になれば、ほぼ記述は一緒になると思います。 から始まる段は、私が勝手に解釈していたものを記述していました。 申し訳ございません。 そのテーブルの各「日付」は、進捗のように必ず前から埋まるものと思い込んでいました。 そうではない場合、IIF の判別は、後ろの方から行うべきだと思います。 いまさらですが、このテーブルの使い方について、補足をお願いいたします。

j-foreman
質問者

お礼

kikuさんわかりにくい質問で申し訳ありません。 日付は必ず前から埋まります。 本当にありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.4

#1です 提示された条件部分の解釈がポイントになると思います。 条件を解釈していく中でクリアされて行くものは次の条件になっていく・・・・ と、私は解釈しました。 例えば、 「契約日」を確認する時には、1番目の「受付日」は埋まっている、と 「支払日」の時も同様に・・・・ なので、提示はなかったものの「受付日」の判別を先頭で行っていました。 (あえて IIF を使わない記述にしてました) どうなんでしょう #1のサンプルデータでの1行目では 2 になるようですが・・・ 「受付日」をどう扱うかが明確になれば、ほぼ記述は一緒になると思います。 1つ目の判別以降は「受付日」は埋まっているなら、 IIF でやっている Not IsNull(○○) の確認はいらなくなると思うので・・・ (前の IIF での条件外が次の IIF に回ってくるので) Switch でも IIF でも記述できるので、どちらでも良いと思います。 データ量によっては、どちらが良い・・・に?(私にはわかりません)

j-foreman
質問者

お礼

お二人のようなパワフルにアドバイスされている方々のおかげで われわれお金のないユーザは本当に助かっております。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

訂正を先に。なお、No2には書いていませんが、 IIf文中の「完了日」は「支払日」としています。 Status2: IIf(Not IsNull([受付日]) And IsNull([見積日]),1,IIf(Not IsNull([見積日]) And IsNull([契約日]),2,IIf(Not IsNull([契約日]) And IsNull([支払日]),3,IIf(Not IsNull([支払日]),4,Null)))) なお、最後のNullは何もしないということでも いいです。つまり、 Status2: IIf(Not IsNull([受付日]) And IsNull([見積日]),1,IIf(Not IsNull([見積日]) And IsNull([契約日]),2,IIf(Not IsNull([契約日]) And IsNull([支払日]),3,IIf(Not IsNull([支払日]),4)))) のように、Nullを入れずにNot IsNull([支払日])ならば4 だけを記述します。 それと、最後の、ところの IsNull([支払日]) は、訂正に示したように Not IsNull([支払日]) にします。質問の通りに書いていたらどうも違うな、と 思えたので、サンプルで確認しました。 というのも、質問の 受付日に日付が入力され、見積日がNullの場合:1 見積日に日付が入力され、契約日がNullの場合:2 契約日に日付が入力され、支払日がNullの場合:3 支払日に日付が入力された場合:4 と Status: IIf([受付日]<>"" And [見積日]="",1,IIf([見積日]<>"" And [契約日]="",2,IIf([契約日]<>"" And [完了日]="",3,IIf([完了日]="",4,"")))) の構文が合っていない、つまり >支払日に日付が入力された場合:4 >IIf([完了日]="",4,"" のところは、 IIf([完了日]<>"",4,"" のつもりだったのだろうということです。 それと、再確認ですが、「完了日」は「支払日」のことでしょう?

j-foreman
質問者

お礼

すみません 質問がめちゃくちゃでした。 このような基本的な質問に何度も回答ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

IIfの入れ子で。 質問の <>"" は Not IsNull に置き換えます。 ="" は IsNull に置き換えます。 最後の "" は Null に置き換えます。 したがって、 Status: IIf(Not IsNull([受付日]) And IsNull([見積日]),1,IIf(Not IsNull([見積日]) And IsNull([契約日]),2,IIf(Not IsNull([契約日]) And IsNull([支払日]),3,IIf(IsNull([支払日]),4,Null))))

j-foreman
質問者

お礼

ご回答ありがとうございます。 iifはこんな風に使うのですね。 まったくまったく勉強不足でした。ありがとうございます。

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

関連するQ&A

  • テーブル作成クエリ

    指定の日付が来たらテーブル作成クエリを使い過去のデータ全て、自動で新しいテーブルを作成し過去のデータだけ移動したい。 SQL SELECT data.受付日, data.受付日, Year(DateAdd("m",-3,[受付日])) & "年度" AS 年度, Month([受付日]) AS 月, Int((Day([受付日])+Weekday(DateSerial(Year([受付日]),Month([受付日]),1))-2)/7)+1 AS 週日, IIf(Val(Right(Month([受付日]),1))>3,"上期","下期") AS 期, data.客先, data.発生部署, data.責任部署, data.客先クレーム対象, * FROM data WHERE (((data.受付日) Between Nz([受付開始日?],0) And Nz([受付終了日?],99999)) AND ((data.客先)=Nz([客先?],[客先])) AND ((data.責任部署)=Nz([責任部署?],[責任部署]))) ORDER BY data.受付日, data.客先;

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

    「作表条件」というフォームにテキストボックスとして「日付1」、「日付2」を設置しています。 元のテーブルには「日付」という項目があり、「日付1」から「日付2」までのデータを抽出するため、 クエリの条件式に Between Nz([Forms]![作表条件]![日付1],#1800/01/01#) And Nz([Forms]![作表条件]![日付2],#9999/12/31#) と記述しています。 ただ、元のテーブルの日付がNULL値の場合があり、その場合「日付1」および「日付2」が空欄だとNULL値のレコードが抽出されません。 「日付」がNULLの場合でも抽出できるようにするには、どのようにすればよいでしょうか? どなたか教えてください。

  • 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]) ご存じの方、アドバイスをくださる方がいらっしゃいましたらどうぞよろしくお願いします。

  • 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]) はちゃんと動きます。 どうしてこのような現象が起こるのか、また回避する方法をご存知のかたがいらっしゃいましたら、どうぞご教示ください。 よろしくお願いします。

  • Access抽出クエリの基本的なこと

    お世話になります。 初心者で苦労しながらもAccess2000でデータベースを作成しています。 非常に基本的な質問だと思うのですが、どなたかご教授願います。 日付を含むフィールドがあるテーブルがあり、クエリにてその日付から 年と月を拾っています。 ID   入力日   年:Year([入力日])   月:Month([入力日]) 1   2001/07/06    2001          6 2   2002/06/07    2002          6 3   2002/07/19    2002          7 別に作成したフォームに年と月を絞り込むためのコンボボックスをそれぞれ配置し、 入力された値によって上記クエリの抽出条件に反映させたいのですが、コンボに何も 入力されていないときは全てのデータを表示したいんです。 「コンボ月=2002」&「コンボ月=6」でID=2のデータのみを、 「コンボ月=(Null)」&「コンボ月=6」でID=1と2のデータを表示したいんです。 (判りにくくてすみません。。) このような場合、抽出条件に記述する式はどのように設定したら良いのでしょうか? IIfでIsNullの条件式を組んだのですが、Nullの時に返す値が判りません。 どうかよろしくお願いします。

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

    クエリでの抽出条件について クエリで納品がまだ済んでいない物件について、抽出期間を設定して抽出したいのですが、うまくいかず教えてください。 抽出したいフィールドは、[納品日]、[部署]、[変更]の三つです。 フィールド[変更]は、[納品日]が変更になることがあるので、[納品日変更]というフィールドに日付が入っていたら、[変更]に[納品日変更]の日付が入るように、[納品日変更]に何も入っていなかったら、[変更]に[納品日]の日付が入るように、判定式を入れています。 [変更]の動作は、目的通りになっており問題無いのですが、いざ[納品日]、[部署]、[変更]で抽出条件を入れるとうまくいきません。 抽出条件の所に [納品日]には、Is Null [部署]には、抽出したい部署名 [変更]には、Between #2010/04/01# And #2010/05/31# それぞれAndで組んで入れていますが、何も抽出されません。 [納品日]の、Is Null と [部署]の、抽出したい部署名 のふたつだけでやると、[納品日][部署]での抽出は動作します。 しかし、この二つに[変更]をプラスし、期間を追加するとダメなようです。 [変更]のように、判定式で作ったフィールドは、抽出条件に使ってはいけないのでしょうか? それとも抽出条件のAndは二つまでとか制限があるのでしょうか? 全く別の基本的な問題が原因だと思うのですが、教えて頂きたく。

  • フォームからクエリの抽出期間を指定するにあたって

    フォームのテキストボックス(開始日付,終了日付)に入力された期間内の レコードをクエリで抽出するために、以下のような抽出条件を設定しています。 Between [Forms]![フォーム1]![from date] And [Forms]![フォーム1]![終了日付] ここまでは問題なく出来ています。 ですが、例えばテキストボックスに何も入力していないときに、 全ての期間から全件表示させるような方法はありませんでしょうか? IIf(IsNull([Forms]![フォーム1]![開始日付]),True,~ というような形で、IIfとIsNullの組み合わせも考えたのですが、 日付は直接フィールドでは無く抽出条件のため、 Trueより後が設定できずに悩んでおります。 出来ればVBAは使いたくないのですが、 何か良い方法はありませんでしょうか?

  • クエリで日付型のIIF関数の使用

    テーブル1にフィールド名→日付、データ型→日付/時刻型(主キーなし) を作成し、 クエリ1を作成し、フィールド1にテーブル1の日付フィールドをドラッグし、 フィールド2には「有無: IIf([日付]="","未",[日付])」 を入力しました。 「日付フィールドが空白なら有無フィールドは「未」、入力されているならその日付を表示する」 としたいです。 しかし画像のように 日付フィールドが空白→有無フィールドも空白 日付フィールドに日付が入っているなら→有無フィールドは#エラー になってしまいます。 何がだめなんでしょうか? よろしくお願い致します。

  • 集計クエリでの抽出条件

    アクセスのクロス集計で質問なのですが・・・ 日付ごとの集計を行いたいのですが日付が21日締めで行いたいのです。 フォームで年と月を入れるとその月の集計を行いたいのです。 (例:フォームの日付入力2008/01と入力→集計クエリで2007/12/21~2008/01/20までの集計) この場合、抽出条件はどのように行えばよいのでしょうか

  • 条件式について

    access2007です。売上管理のDB作ろうとしています。顧客の〆日が末日でない場合、締切日を超えた時、翌月の請求分として集計・認識させるためにクエリのフィールドに入れる条件式の間違っている部分、または考え方を指摘していただきたいと思います。 伝票に[日付]"yyyy/mm/dd"を入力→[締切日]"dd"は顧客マスタを参照し、クエリーの[締切日]に"dd"を代入。[締切月]には[日付]("dd"のみ)<[締切日]の場合は入力した[日付]のmmをそのまま、[日付]>[締切日]の場合には翌月分という意味でmmに1を加えたものを返す・・というものです。 締切月: IIf(Format([日付],"dd")>[締切日],Format(DateAdd("m",1,[日付]),"mm"),Format([日付],"mm")) これだと、エラーが出てしまいます。 どこがおかしいのでしょうか?

専門家に質問してみよう