今学習している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 = Nothing

Debug.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関数はないだろうと思ってたのですが、なんともね。

これで納得。