SSRS表达式除以零误差

d90*_*d90 17 reporting-services ssrs-tablix ssrs-expression

我有一个tablix框,有一个除法表达式.当除以零或空值时,我#Error会在报告中显示.我尝试创建一个IIF语句并使用静态值进行测试.这验证了我的语法是正确的,但我仍然在报告中看到错误.

报告预览

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

因此,我采用当年的美元,扣除上一年的美元,并将该总额除以上一年的美元,以获得百分比变化.有没有一个技巧,我没有得到?!

Nat*_*ths 47

您可以在报表代码中添加一个处理除零条件的函数,这样可以更容易在多个单元格中实现,例如

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 
Run Code Online (Sandbox Code Playgroud)

然后你可以在这样的单元格中调用它:

=Code.Divider(Fields!FieldA.Value, Fields!FieldB.Value)
Run Code Online (Sandbox Code Playgroud)

  • 我希望我可以像1000次一样投票.谢谢你,完美的解决方案. (3认同)

Ian*_*ton 10

我怀疑你遇到的问题是SSRS实际上并没有将IIF声明短路; 即使你正在检查0,你仍然会达到零除错误.

尝试类似的东西:

=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))
Run Code Online (Sandbox Code Playgroud)

使用两个IIf语句意味着您可以0/1Sum(Fields!PY_Dollars.Value)= 0 时使用公式来避免错误,因此只返回0.

另请注意,上面的表达式是检查Sum(Fields!PY_Dollars.Value) = 0,但是你的检查Sum(Fields!CY_Dollars.Value) = 0- 分母需要在这里进行零检查.

  • +1.这是一篇关于使用双iif语句的文章http://ntsblog.homedev.com.au/index.php/2010/03/12/sql-server-reporting-services-ssrs-iif-statement-divide-by-zero -错误/ (2认同)

小智 5

为了避免维护代码的开销,下面的解决方案对我来说感觉最整洁。通过在分母中添加最小的可能Double值(Double.Epsilon4.94e-324)来避免分母被零除。对于使用SSRS的任何人来说,该值太小而不会影响分数的值。它还避免了嵌套IIF函数。

=IIF(Sum(Fields!Denominator.Value)>0, 
     Sum(Fields!Numerator.Value)/(Sum(Fields!Denominator.Value)+Double.Epsilon),
     nothing)
Run Code Online (Sandbox Code Playgroud)