web-dev-qa-db-ja.com

SSRS 2008-ゼロ除算シナリオの取り扱い

レポートの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")

美しく機能します。データが実際にゼロである場合、テキストボックスに「はい」が表示され、その逆も同様です。したがって、チェックは正常に機能します。

私の直感では、レポートレンダリングエンジンは実行時に例外をスローします。ゼロで除算するように見えるため、実際にはそうではないためです。

以前に同じ問題に遭遇した人はいますか?もしそうなら、それを機能させるために何をしましたか?

44
tobias86

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を返します。

66
MartW

ゼロ除算エラーを防ぐ簡単でクリーンな方法は、レポートコード領域を使用することです。

メニューで、[レポート]> [レポートプロパティ]> [コード]に移動し、以下のコードを貼り付けます

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/

22
william mendoza

振り返ってみると、私は最良のアイデアは、値に累乗-1を掛けることであると感じています:これは除算です:

=IIf
  (
      Fields!SomeField.Value = 0
    , 0
    , Fields!SomeOtherField.Value * Fields!SomeField.Value ^ -1
  )

Val * 0 ^ -1はエラーではなくInfinityになるため、これは事前レンダリングチェックを実行しません。

16
SkyDkn

IIFは、Fields!SomeField.Valueの値が0であっても、両方の式を評価します。IIFの代わりにIFを使用すると、問題が修正されます。

1
user1689669