クエリに記述するIIFが上手く出来ません。多分()の位置、数と思うのですが色々しても駄目で困っています。
下記の条件である日付を生成したいのです。
★選択1のIDが9の時[A]=0 And [B]>0の日付、[A]>0 And [B]=0の日付、それ以外の選択1のIDが9の時の日付
★選択2のID=1の時の日付、選択2のID=5の日付、選択2が1、5以外の日付
これを下記で記述しましたが駄目なのです。間違いを指摘して頂けますでしょうか。宜しくお願いします。
IIf([選択1のID]=9,IIf([A]=0 And [B]>0,DateSerial([年],[月]-[減算値]+1,[実日]),IIf([A]>0 And [B]=0,DateSerial([年],[月]-[減算値]-1,[実日]),DateSerial([年],[月]-[減算値],[実日])),IIf([X]>[Y],DateSerial([年],[月]+1,[実日]),IIf([選択2のID]=1,DateSerial([年],[月]+1,[実日]),IIf([選択2のID]=5,DateSerial([年],[月]+1,[実日]),DateSerial([年],[月],[実日])))))))
ネストが深くなり過ぎですね。
可読性やメンテナンス性の面でかなり難ありのコードになっています。
階層毎に、意図する処理が行われているかテストしながら記述しましょう。
アドバイスありがとうございました。選択1のIDが9の時、[A]=0の真、偽+選択2のID以降の条件式を記述した時は生成できてたのです。選択1のIDが9の時に更に分岐(A]=0 And [B]>0、[A]>0 And [B]=0、それ以外)を付け加えようと思い質問のコードにすると生成できないのです。
IIf([選択1のID]=9,IIf([A]=0 And [B]>0,DateSerial([年],[月]-[減算値]+1,[実日]),IIf([A]>0 And [B]=0,DateSerial([年],[月]-[減算値]-1,[実日]),DateSerial([年],[月]-[減算値],[実日]))),IIf([X]>[Y],DateSerial([年],[月]+1,[実日]),IIf([選択2のID]=1,DateSerial([年],[月]+1,[実日]),IIf([選択2のID]=5,DateSerial([年],[月]+1,[実日]),DateSerial([年],[月],[実日])))))
こちらでどうでしょうか。構文エラーは出ないと思います。
アドバイスありがとうございました!そのコードで上手くいきました!途中の ) が不足で最後の )が多かったのですね。分岐が多く混乱してました。IIFの )はコツがあるのでしょうか? Switch関数の方がすっきりするのですが、この関数はIIFの様に偽の場合はないのですよね? 初心者で見よう見まねでしているもので。
最終的にすべて
DateSerial(y, m, d)
の計算をしているので、DateSerial
を主に置くとすっきりすると思います必要な要素をまとめて式にすると、次のように表現できそうです
「減算補正」はマイナス計算しかないので式自体マイナスにしていますが、「月補正」はプラスマイナスあるのでプラスで作成しておきます
それぞれの補正の計算は
のような形で作れます
これを上の式に当てはめてもいいですし、そのまま別フィールドにしてもいいでしょう
「減算補正」は簡単ですが、「月補正」は複雑ですね。求め方はこれに限りません
例えば、最終結果(1,-1,0)のグループを作る形で
のようにしてもいいと思います
関数のネストが減るメリットはあるものの、やりたいことを直感的に表現できているか?とはちょっと離れているかな?という印象です
Switch関数は条件が真(
True
)になったときの値を返す関数なので、条件にTrue
を指定すれば、そこで必ず値を返すことになります。「それ以前の条件で真が無ければこの値を返す」という、IIf関数における「偽のとき」の値を設定できます条件式では様々な比較演算子を使うことができます
このようないずれかに当てはまれば真というのは
Or
で表現できますOr
比較はAnd
比較と同じくらい使うので覚えましょう蛇足
こう複雑な計算が必要になると、なんかこう、元のテーブル構造が怪しそうですね
hiroton様 回答ありがとうございました。なるほどです! 一旦条件分岐での補正フィールドを作りそれを参照させると大分すっきりしますね。IIFとSwitchを組み合わせることもできるのですね。論理的なアイデアは素晴らしいです。
同じ結果になるものは一つにまとめるといいですね。短時間でこんなすごいアイデアがでてくるのは、本当にすごいです。
ありがとうございました。