SSRS 2008 - 处理零情景划分

tob*_*s86 44 ssrs-2008

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

=Iif(Fields!SomeField.Value = 0, 0, Fields!SomeOtherField.Value / Fields!SomeField.Value)
Run Code Online (Sandbox Code Playgroud)

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

我们难以理解的是,报告仍然会抛出一个运行时异常"试图除以零",即使上面的表达式可以防止这种情况发生.

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

=Iif(Fields!SomeField.Value = 0, "Yes", "No")
Run Code Online (Sandbox Code Playgroud)

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

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

有没有人遇到过同样的问题?如果是这样,你做了什么让它工作?

Mar*_*rtW 66

IIf将始终在确定哪一个实际返回之前评估两个结果.

尝试

=IIf(Fields!SomeField.Value = 0, 0, Fields!SomeOtherField.Value / IIf(Fields!SomeField.Value = 0, 1, Fields!SomeField.Value))
Run Code Online (Sandbox Code Playgroud)

如果SomeOtherField.Value = 0,则将使用1作为除数,这不会产生错误.父IIf将为整个表达式返回正确的0.

  • 那太傻了! (3认同)

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

要调用该函数,请转到Textbox表达式并键入:

 =Code.Quotient(SUM(fields!FieldName.Value),SUM(Fields!FieldName2.Value))
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我将公式放在组级别,所以我使用sum.否则它将是:

 =Code.Quotient(fields!FieldName.Value,Fields!FieldName2.Value)
Run Code Online (Sandbox Code Playgroud)

来自:http://williameduardo.com/development/ssrs/ssrs-divide-by-zero-error/

  • 我喜欢它.清洁和可重复使用.如果你在这里粘贴这个解决方案,更多人会看到它有多好:-) (4认同)

小智 16

经过反思,我觉得最好的想法是将乘以值乘以-1,这是一个分界:

=IIf
  (
      Fields!SomeField.Value = 0
    , 0
    , Fields!SomeOtherField.Value * Fields!SomeField.Value ^ -1
  )
Run Code Online (Sandbox Code Playgroud)

这不会触发预呈现检查,因为val*0 ^ -1会导致Infinity,而不是错误