我有一个带有除法表达式的 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)))
因此,我用当年的美元减去上一年的美元,然后将总额除以上一年的美元以获得百分比变化。这有什么我没有掌握的技巧吗?!
您可以在报告代码中添加一个函数来处理除以零的情况,这使得在多个单元格中实现更容易,例如
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)
我怀疑您遇到了 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
- 分母需要在这里进行零检查。
为了避免维护代码的开销,下面的解决方案对我来说感觉最简洁。它通过添加尽可能小的
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)
为什么不直接将值表示为 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))))
而不是
=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) )