- ベストアンサー
クエリからの別名フィールド(条件付き)の作成に関し
access初心者です。 以下のテーブルがあります。 ---------- 受付日 見積日 契約日 支払日 ---------- クエリでStatusという別名フィールドを作成して、 現在の進捗を表示させたいと思います。 受付日に日付が入力され、見積日がNullの場合:1 見積日に日付が入力され、契約日がNullの場合:2 契約日に日付が入力され、支払日がNullの場合:3 支払日に日付が入力された場合:4 あてずっぽで作成した式が以下になります。 Status: IIf([受付日]<>"" And [見積日]="",1,IIf([見積日]<>"" And [契約日]="",2,IIf([契約日]<>"" And [完了日]="",3,IIf([完了日]="",4,"")))) 複数条件で入れ子にしたいのですが・・・・ 当然のように #エラー となりました。 初歩的な問題で申し訳ありませんが、教示願います。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
以下でどうなりますか 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 サンプル上では良さそうですが、 参考にする/しない等、自己責任でお願いします。
その他の回答 (4)
- 30246kiku
- ベストアンサー率73% (370/504)
#4です #4の > 「受付日」をどう扱うかが明確になれば、ほぼ記述は一緒になると思います。 から始まる段は、私が勝手に解釈していたものを記述していました。 申し訳ございません。 そのテーブルの各「日付」は、進捗のように必ず前から埋まるものと思い込んでいました。 そうではない場合、IIF の判別は、後ろの方から行うべきだと思います。 いまさらですが、このテーブルの使い方について、補足をお願いいたします。
お礼
kikuさんわかりにくい質問で申し訳ありません。 日付は必ず前から埋まります。 本当にありがとうございます。
- 30246kiku
- ベストアンサー率73% (370/504)
#1です 提示された条件部分の解釈がポイントになると思います。 条件を解釈していく中でクリアされて行くものは次の条件になっていく・・・・ と、私は解釈しました。 例えば、 「契約日」を確認する時には、1番目の「受付日」は埋まっている、と 「支払日」の時も同様に・・・・ なので、提示はなかったものの「受付日」の判別を先頭で行っていました。 (あえて IIF を使わない記述にしてました) どうなんでしょう #1のサンプルデータでの1行目では 2 になるようですが・・・ 「受付日」をどう扱うかが明確になれば、ほぼ記述は一緒になると思います。 1つ目の判別以降は「受付日」は埋まっているなら、 IIF でやっている Not IsNull(○○) の確認はいらなくなると思うので・・・ (前の IIF での条件外が次の IIF に回ってくるので) Switch でも IIF でも記述できるので、どちらでも良いと思います。 データ量によっては、どちらが良い・・・に?(私にはわかりません)
お礼
お二人のようなパワフルにアドバイスされている方々のおかげで われわれお金のないユーザは本当に助かっております。 ありがとうございます。
- piroin654
- ベストアンサー率75% (692/917)
訂正を先に。なお、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,"" のつもりだったのだろうということです。 それと、再確認ですが、「完了日」は「支払日」のことでしょう?
お礼
すみません 質問がめちゃくちゃでした。 このような基本的な質問に何度も回答ありがとうございます。
- piroin654
- ベストアンサー率75% (692/917)
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))))
お礼
ご回答ありがとうございます。 iifはこんな風に使うのですね。 まったくまったく勉強不足でした。ありがとうございます。
お礼
kikuさん 仕事で徹夜続きだったっもので、回答遅れました。 ありがとうございます。できました!! いつも的確なご回答で、尊敬です。 また、最近気づいたのですが、 以前私の質問を、ご自身のブログに取り上げていただいたようで ありがとうございます。