【问题标题】:divide by zero/null workaround in SSRS 2008 reportSSRS 2008 报告中除以零/空解决方法
【发布时间】:2012-05-03 13:45:10
【问题描述】:

我有一个字段的值是表达式的报告:

Fields!TotalPrice.Value/Fields!TotalSlots.Value

虽然有时 TotalSlots 是空白的,因此我得到了除以零的运行时错误。所以我把表达式改成了这样:

=IIF(Fields!TotalSlots.Value > 0, Fields!TotalPrice.Value/Fields!TotalSlots.Value,"unknown")

但我仍然遇到除以零错误。我该如何解决这个零除数问题。

【问题讨论】:

    标签: sql reporting-services ssrs-2008


    【解决方案1】:

    Jamie F 的回答是正确的。作为提示,您可以在报告代码中添加一个函数,以使在多个单元格中更容易实现除法,例如

    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)
    

    【讨论】:

    • 我收到错误“本机编译器返回值函数“Divider”未在所有代码路径上返回值,使用结果时可能在运行时发生空引用异常”任何感谢您的帮助。我想通了,在将代码复制并粘贴到 SSRS 后,我必须输入自己的返回字符。如果有人遇到同样的问题,请确保您的代码在表达式窗口中看起来与上面完全相同。
    【解决方案2】:

    VB IIF evaluates all arguments,所以如果任何参数抛出错误都会抛出错误:

    你的公式可以写成:

    =IIF(Fields!TotalSlots.Value > 0,
       Fields!TotalPrice.Value /
       IIF(Fields!TotalSlots.Value > 0,
           Fields!TotalSlots.Value,
           1 ),
       "unknown")
    

    那么即使 TotalSlots 为零,公式仍然不会遇到除法问题。

    【讨论】:

    • 这里可能不适用,但是除数可以为负的情况呢?
    • <> 0 替换出现的> 0,你应该可以接受负除数。
    【解决方案3】:

    我认为您的错误与计算无关。首先,SSRS 会自动处理这种情况。请参阅我的第三个专栏。第四个显示你的表情:

    你的问题可能出在其他地方

    【讨论】:

      【解决方案4】:

      这似乎只发生在除法是 IIF 的结果之一时,而不是如果您只是编写一个公式将一个除以另一个,例如

      =IIF(thing=1,10/0,0)
      

      在评估事物之前,它已经尝试计算两个结果,导致错误。你不能用这种方式使用IIF来保护从零,你必须把IIF放在除法的底线,例如

      =IIF(thing=1, 10/IIF(divisor=0,-99999999999,divisor),0)
      

      这并不令人满意,因为我们引入了一个奇怪的小非零数字作为结果,但如果你只想要一个非错误可能没问题。

      从技术上讲,#error 是正确的答案。

      【讨论】:

      • 我只是将它设为 1 if 0 然后让主 IIF 用 0 替换整个事物,但这让我走上了正轨。虽然它会在引擎盖下发生这样的事情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      相关资源
      最近更新 更多