我们的某个报告遇到了问题。在我们的一个Tablix中,文本框具有以下表达式:
=Iif(Fields!SomeField.Value = 0, 0, Fields!SomeOtherField.Value / Fields!SomeField.Value)
哪个应该是不言自明的。如果“SomeField”为零,则将文本框值设置为零,否则将其设置为“SomeOtherValue / SomeValue”。
我们感到困惑的是,报告仍会抛出一个运行时异常“试图除以零”,即使上面的表达式可以防止这种情况发生。
为了确保零检查正常,我们在表达式上摆弄了一下,并且
=Iif(Fields!SomeField.Value = 0, "Yes", "No")
工作得很漂亮。数据实际上为零的情况导致文本框显示“是”,反之亦然。所以检查工作正常。
我的直觉是报表呈现引擎在运行时抛出异常,因为它“看起来”好像我们要除以零,但事实上,我们不是。
之前有没有人遇到过同样的问题?如果是这样,你做了什么才能让它发挥作用?
答案 0 :(得分:65)
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。
答案 1 :(得分:22)
使用报告代码区域的一种简单干净的方法来防止除以零错误。
在菜单中,转到报告>报告属性>编码并粘贴以下代码
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))
在这种情况下,我将公式放在Group级别,所以我使用sum。否则它将是:
=Code.Quotient(fields!FieldName.Value,Fields!FieldName2.Value)
来自:http://williameduardo.com/development/ssrs/ssrs-divide-by-zero-error/
答案 2 :(得分:16)
经过反思,我觉得最好的想法是将乘以值乘以-1,这是一个分界:
=IIf
(
Fields!SomeField.Value = 0
, 0
, Fields!SomeOtherField.Value * Fields!SomeField.Value ^ -1
)
这不会触发预渲染检查,因为val * 0 ^ -1导致无穷大,而不是错误
答案 3 :(得分:1)
IIF评估两个表达式甚至认为Fields!SomeField.Value的值为0.使用IF代替IIF将解决问题。