SSRS 表达式除以零误差

问题描述 投票:0回答:5

我有一个带有除法表达式的 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)))

因此,我用当年的美元减去上一年的美元,然后将总额除以上一年的美元以获得百分比变化。这有什么我没有掌握的技巧吗?!

reporting-services ssrs-tablix ssrs-expression
5个回答
60
投票

您可以在报告代码中添加一个函数来处理除以零的情况,这使得在多个单元格中实现更容易,例如

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)

15
投票

我怀疑您遇到了 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))

使用两个

IIf
语句意味着您可以在
0/1
= 0 时使用方程
Sum(Fields!PY_Dollars.Value)
来避免错误,从而仅返回 0

另请注意,上面的表达式正在检查

Sum(Fields!PY_Dollars.Value) = 0
,但你的表达式正在检查
Sum(Fields!CY_Dollars.Value) = 0
- 分母需要在这里进行零检查。


12
投票

为了避免维护代码的开销,下面的解决方案对我来说感觉最简洁。它通过添加尽可能小的

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)

0
投票

为什么不直接将值表示为 DOUBLE?这避免了多个 IIF 函数?它应该也有更好的性能。

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

0
投票

而不是

=IIF(Sum(Fields!Denominator.Value) > 0, 总和(字段!分子.值)/(总和(字段!分母.值),99.9)

我用过

=切换( Sum(字段!分母.值) = 0, 99.9, Sum(Fields!Denominator.Value) <> 0, Sum(Fields!Numerator.Value)/(Sum(Fields!Denominator.Value) )

© www.soinside.com 2019 - 2024. All rights reserved.