レポートの1つで問題が発生しています。 Tablixの1つでは、テキストボックスに次の式があります。
=Iif(Fields!SomeField.Value = 0, 0, Fields!SomeOtherField.Value / Fields!SomeField.Value)
これは一目瞭然です。 「SomeField」がゼロの場合、テキストボックスの値をゼロに設定し、そうでない場合は「SomeOtherValue/SomeValue」に設定します。
私たちが困惑しているのは、上記の式がそれを防ぐべきであるにもかかわらず、レポートが「ゼロで除算しようとする」ランタイム例外を依然としてスローすることです。
ゼロチェックが機能することを確認するために、式を少しいじりました。
=Iif(Fields!SomeField.Value = 0, "Yes", "No")
美しく機能します。データが実際にゼロである場合、テキストボックスに「はい」が表示され、その逆も同様です。したがって、チェックは正常に機能します。
私の直感では、レポートレンダリングエンジンは実行時に例外をスローします。ゼロで除算するように見えるため、実際にはそうではないためです。
以前に同じ問題に遭遇した人はいますか?もしそうなら、それを機能させるために何をしましたか?
IIfは、どちらを実際に返すかを決定する前に、常に両方の結果を評価します。
試してみる
=IIf(Fields!SomeField.Value = 0, 0, Fields!SomeOtherField.Value / IIf(Fields!SomeField.Value = 0, 1, Fields!SomeField.Value))
SomeOtherField.Value = 0の場合、これは除数として1を使用し、エラーを生成しません。親IIfは、式全体に対して正しい0を返します。
ゼロ除算エラーを防ぐ簡単でクリーンな方法は、レポートコード領域を使用することです。
メニューで、[レポート]> [レポートプロパティ]> [コード]に移動し、以下のコードを貼り付けます
Public Function Quotient(ByVal numerator As Decimal, denominator As Decimal) As Decimal
If denominator = 0 Then
Return 0
Else
Return numerator / denominator
End If
End Function
関数を呼び出すには、Textbox式に移動して次を入力します。
=Code.Quotient(SUM(fields!FieldName.Value),SUM(Fields!FieldName2.Value))
この場合、グループレベルで数式を入力するため、合計を使用します。それ以外の場合:
=Code.Quotient(fields!FieldName.Value,Fields!FieldName2.Value)
From: http://williameduardo.com/development/ssrs/ssrs-divide-by-zero-error/
振り返ってみると、私は最良のアイデアは、値に累乗-1を掛けることであると感じています:これは除算です:
=IIf
(
Fields!SomeField.Value = 0
, 0
, Fields!SomeOtherField.Value * Fields!SomeField.Value ^ -1
)
Val * 0 ^ -1はエラーではなくInfinityになるため、これは事前レンダリングチェックを実行しません。
IIFは、Fields!SomeField.Valueの値が0であっても、両方の式を評価します。IIFの代わりにIFを使用すると、問題が修正されます。