Microsoft Access 掲示板

IIF複数が上手く記述できない / 5

6 コメント
views
4 フォロー
5
hiroton 2023/11/15 (水) 17:06:40 e2c8b@f966d

最終的にすべてDateSerial(y, m, d)の計算をしているので、DateSerialを主に置くとすっきりすると思います

必要な要素をまとめて式にすると、次のように表現できそうです

DateSerial([年],[月]-[減算補正]+[月補正],[実日])

「減算補正」はマイナス計算しかないので式自体マイナスにしていますが、「月補正」はプラスマイナスあるのでプラスで作成しておきます

それぞれの補正の計算は

減算補正:IIf([選択1のID]=9,[減算値],0)

月補正:IIf([選択1のID]=9, Switch([A]=0 And [B]>0, 1, [A]>0 And [B]=0, -1, True, 0), IIf([X]>[Y] Or [選択2のID]=1 Or [選択2のID]=5, 1, 0))

のような形で作れます
これを上の式に当てはめてもいいですし、そのまま別フィールドにしてもいいでしょう


「減算補正」は簡単ですが、「月補正」は複雑ですね。求め方はこれに限りません
例えば、最終結果(1,-1,0)のグループを作る形で

//Switch([1になる条件], 1, [-1になる条件], -1, True, 0)の形にする

月補正:Switch([選択1のID]=9 And [A]=0 And [B]>0 Or [選択1のID]<>9 And ([X]>[Y] Or [選択2のID]=1 Or [選択2のID]=5), 1, [選択1のID]=9 And [A]>0 And [B]=0, -1, True, 0)

のようにしてもいいと思います
関数のネストが減るメリットはあるものの、やりたいことを直感的に表現できているか?とはちょっと離れているかな?という印象です

Switch関数は条件が真(True)になったときの値を返す関数なので、条件にTrueを指定すれば、そこで必ず値を返すことになります。「それ以前の条件で真が無ければこの値を返す」という、IIf関数における「偽のとき」の値を設定できます


条件式では様々な比較演算子を使うことができます

//↓の部分について
IIf([X]>[Y],DateSerial([年],[月]+1,[実日]),IIf([選択2のID]=1,DateSerial([年],[月]+1,[実日]),IIf([選択2のID]=5,DateSerial([年],[月]+1,[実日]),DateSerial([年],[月],[実日]))))

IIf(
  [X]>[Y]
 ,DateSerial([年],[月]+1,[実日])      // ←同じ結果を求めている
 ,IIf(
    [選択2のID]=1
   ,DateSerial([年],[月]+1,[実日])    // ←同じ結果を求めている
   ,IIf(
      [選択2のID]=5
     ,DateSerial([年],[月]+1,[実日])  // ←同じ結果を求めている
     ,DateSerial([年],[月],[実日])
    )
  )
)

このようないずれかに当てはまれば真というのはOrで表現できます

IIf([X]>[Y] Or [選択2のID]=1 Or [選択2のID]=5,DateSerial([年],[月]+1,[実日]),DateSerial([年],[月],[実日]))

Or比較はAnd比較と同じくらい使うので覚えましょう


蛇足
こう複雑な計算が必要になると、なんかこう、元のテーブル構造が怪しそうですね

通報 ...