2011-03-29 70 views
37

我们的某个报告遇到了问题。在我们tablixes的一个文本框具有下列表达式:SSRS 2008 - 按零场景处理除法

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

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

我们难以理解的是,即使上面的表达式应该阻止这种情况发生,报告仍然会抛出运行时异常“试图除以零”。

我们摆弄表达一点只是为了确保零检查工作,并

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

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

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

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

+0

太棒了!我用这个建议来回答我的问题:http:// stackoverflow。com/questions/43662727/ssrs-expression-error-calculate-variable-shows-error-when-divide-by-zero/43666171#43666171 – Aline 2017-04-27 19:17:52

回答

58

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

尝试

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

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

+2

太棒了,这确实有窍门。谢谢! – tobias86 2011-03-29 11:49:05

+3

太狡猾了! – GONeale 2013-06-17 23:09:59

+0

喜欢这个!特别是“如果SomeOtherField.Value = 0,这将使用1作为除数,这不会产生错误,而父级IIf将为整体表达式返回正确的0。 hehehe,偷偷摸摸,确实 – 2013-10-14 13:51:45

14

经过思考,我觉得最好的办法是通过值乘以供电-1,这是一个除法:

=IIf 
    (
     Fields!SomeField.Value = 0 
    , 0 
    , Fields!SomeOtherField.Value * Fields!SomeField.Value^-1 
) 

这不火预渲染支票VAL * 0^-1结果在无穷远处,不是错误

18

一个简单干净的方法来防止除零错误是使用报告代码区。

在菜单中,转到报告>报告属性>代码和粘贴如下

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 

代码调用函数去到文本框的表达和类型:

=Code.Quotient(SUM(fields!FieldName.Value),SUM(Fields!FieldName2.Value)) 

在这如果我在公司层面上使用公式,那么我正在使用总和。否则,这将是:

=Code.Quotient(fields!FieldName.Value,Fields!FieldName2.Value) 

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

+4

我喜欢它。清洁和可重复使用。 如果你在这里粘贴这个解决方案,更多的人会看到它有多好:-) – Mariusz 2016-12-01 10:15:02

1

IIF评估两种表达甚至想到领域SomeField.Value的价值反而IIF 0使用如果将解决这个问题。