web-dev-qa-db-ja.com

ゼロエラーによるSSRS式除算

除算式を持つTablixボックスがあります。ゼロまたはヌルで除算すると、レポートに_#Error_が表示されます。 IIFステートメントを作成して、静的な値でテストしました。これにより、構文が正しいことが確認されましたが、レポートにエラーが表示されます。

Report Preview

=IIF(Sum(Fields!CY_Dollars.Value)=0, 0, (Sum(Fields!CY_Dollars.Value) - Sum(Fields!PY_Dollars.Value))/(Sum(Fields!PY_Dollars.Value)))

そこで、今年のドルを取り、前年のドルを引いて、その合計を前年のドルで割って、変化率を求めています。これに私が得ていないトリックがありますか?!

15
d90

ゼロ除算条件を処理する関数をレポートコードに追加できます。これにより、複数のセルでの実装が少し簡単になります。

Public Function Divider (ByVal Dividend As Double, ByVal Divisor As Double)
If IsNothing(Divisor) Or Divisor = 0
  Return 0
Else
  Return Dividend/Divisor
End If
End Function 

その後、次のようなセルでこれを呼び出すことができます。

=Code.Divider(Fields!FieldA.Value, Fields!FieldB.Value)
46

SSRSがIIFステートメントを実際に短絡させないという問題に直面していると思われます。 をチェックしている場合でも、ゼロ除算エラーが発生します。

次のようなものを試してください:

_=IIf(Sum(Fields!PY_Dollars.Value) = 0, 0, Sum(Fields!CY_Dollars.Value) - Sum(Fields!PY_Dollars.Value))
  / IIf(Sum(Fields!PY_Dollars.Value) = 0, 1, Sum(Fields!PY_Dollars.Value))
_

2つのIIfステートメントを使用すると、Sum(Fields!PY_Dollars.Value) = 0のときに式_0/1_を使用してエラーを回避できます。したがって、単にを返します。

上記の式はSum(Fields!PY_Dollars.Value) = 0をチェックしていますが、あなたのものはSum(Fields!CY_Dollars.Value) = 0をチェックしていることに注意してください-分母はここでゼロチェックを必要とします。

10
Ian Preston

コードを維持するオーバーヘッドを回避するために、以下のソリューションは私にとって最もきちんとしたものです。可能な最小のDouble値を追加することにより、分母のゼロによる除算を回避します(Double.Epsilon、これは4.94e-324)。この値は小さすぎて、人々がSSRSを使用するものの端数の値に影響を与えません。また、IIF関数のネストも回避します。

=IIF(Sum(Fields!Denominator.Value)>0, 
     Sum(Fields!Numerator.Value)/(Sum(Fields!Denominator.Value)+Double.Epsilon),
     nothing)
3
ambrosen