SSRS 2008 - 处理零情景划分

时间:2011-03-29 11:32:18

标签: ssrs-2008

我们的某个报告遇到了问题。在我们的一个Tablix中,文本框具有以下表达式:

=Iif(Fields!SomeField.Value = 0, 0, Fields!SomeOtherField.Value / Fields!SomeField.Value)

哪个应该是不言自明的。如果“SomeField”为零,则将文本框值设置为零,否则将其设置为“SomeOtherValue / SomeValue”。

我们感到困惑的是,报告仍会抛出一个运行时异常“试图除以零”,即使上面的表达式可以防止这种情况发生。

为了确保零检查正常,我们在表达式上摆弄了一下,并且

=Iif(Fields!SomeField.Value = 0, "Yes", "No")

工作得很漂亮。数据实际上为零的情况导致文本框显示“是”,反之亦然。所以检查工作正常。

我的直觉是报表呈现引擎在运行时抛出异常,因为它“看起来”好像我们要除以零,但事实上,我们不是。

之前有没有人遇到过同样的问题?如果是这样,你做了什么才能让它发挥作用?

4 个答案:

答案 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将解决问题。