今学習しているSSRS(SQL Server Reporting Services)で、割り算をする項目があり、データによっては0で割るものもあり、エラーとなります。
なので、IIF関数を使用して
= IIF(項目2 = 0,””,項目1 / 項目2)
という風に計算式を入れていたのですが、0除算のエラーが発生して、ハマっていました。
条件式で、割る数が0だったら、割り算を行わない処理のハズなのに。
もやもやというより。
「なぜだ!!なぜこれでエラーが出るのだ!!」
って感じでした。
今日、「IIF」を「IF」に変えて、レポートのプレビューを見たら、ちゃんと0除算を回避してくれました。
でも、なぜ「IF」と同じ条件分岐の関数である「IIF」では意図した通りに処理されなかったのか。
ネットでググったら、こういうことらしいです。
実はIIF関数は条件式の結果が真の場合であっても、偽の式も評価されるのです。
例えば、
Dim a As New TextBox
Dim b As TextBox = NothingDebug.Print(IIf(IsNothing(b) = True, a.Name, b.Name))
※IsNothing関数=引数のオブジェクトがNullかどうか判定し、NullならTrueを返す。
こんなIIF関数の文法があったとします。
文法の突っ込みはこの際おいておいて・・・
この場合、bのテキストボックスはNull(Nothing)なんでIsNothing関数はTrueを返します。
Trueが返されるので第一引数のa.Nameがコンソールに表示されます。
通常であればここで終わりますが、続いて偽の処理も行います。
ですが、bのオブジェクトは現在Nothing状態です。
では、どうなるのか?と申しますと・・・・
エラーで落ちます。
インスタンスが参照できませんエラーが起こります。
では、偽の処理を行わないようにするにはどうしたらいいのか?と言うと・・・
If関数を使います。
※Visual Studio 2008以降
使い方はIIf関数と同じですが、この関数は条件式で真だった場合、偽の処理は評価しません。
引用元: へたりんずのブログ
とのこと。
知らなかったよ。
私もIIF関数があるから、IF関数はないだろうと思ってたのですが、なんともね。
これで納得。
同じくハマっていましたので大変参考になりました。感謝いたします
私の場合はMicrosoft Report (VS2022)ですが2日間悩みました
visualstudioに限っては、0除算の回避にIIF関数は使えませんね
コメントありがとうございます。
同じところでハマっちゃったのですね。
お役に立ててうれしいです