【问题标题】:SSRS hide #Error displayed in cellSSRS 隐藏单元格中显示的#Error
【发布时间】:2012-02-04 20:36:05
【问题描述】:

我正在对有时会导致#Error 的数据进行计算。根本原因是除以零。我可以跳过必要的变通方法来避免除以零,但屏蔽#Error 文本并显示空白单元格可能更简单。是否可以隐藏#Error 而什么都不显示?

编辑

文本的表达式可能会显示 #Error 大致如下:

Fields!Field1.Value / Fields!ValueThatMightBeZero.Value

我可以通过一些丑陋的检查来解决这个问题,但捕获#Error 可能更容易。 (直接 iif 检查 express 不起作用,因为 SSRS 首先评估真假子句;如果它在任一子句上被零除,它将返回 #Error,即使该子句没有已使用)。

【问题讨论】:

    标签: reporting-services


    【解决方案1】:

    如果Fields!Value_Denominator.Value=0,则将字体更改为背景颜色,您将不会看到错误消息。

    【讨论】:

    • +1 - 这是一个奇怪的解决方案,但 +1 用于开箱即用 :)。
    【解决方案2】:

    有一个 IsError 函数,但它不会减少处理此问题所需的代码。如果您不喜欢通常的iif 解决方法,那么我认为您需要在报告中使用自己的嵌入式代码。在该代码中,您可以有一个 try catch 处理程序。创建一个可以使用=Code.MyDivider(Fields!Field1.Value , Fields!ValueThatMightBeZero.Value)调用的函数

    Public Function MyDivider(top As Double, bottom As Double) As Double
        If top = 0 Then Return 0
        If bottom = 0 Then Return 0
        Return top / bottom
    End Function
    

    【讨论】:

    • +1 用于自定义代码 - IMO 比每个单元格上的复杂表达式更容易。
    【解决方案3】:

    这很丑陋,但我发现这是一种让它在表达式中工作而无需自定义函数的方法。

    您也必须检查分母并在那里替换一个非零除数,这样除以 0 就不会发生(即使我们希望 IIF 的前半部分将其短路而不到达那里) : 我用 1.
    当然,这会给出一个不正确的值,但是当分母为 0 时,我会保留外部 IIF 以显示我想要的任何内容(在我的示例中显示 0)。

    =IIF(Fields!Value_Denominator.Value=0, 0, Fields!Value_Numerator.Value/IIF(Fields!Value_Denominator.Value=0,1,Fields!Value_Denominator.Value))
    

    【讨论】:

      【解决方案4】:

      为第二个表达式添加一个小值 -

      Fields!Field1.Value / (Fields!ValueThatMightBeZero.Value+.00001)

      这将返回 0。

      【讨论】:

        【解决方案5】:

        这是一个很好的解决方案。 但是我认为甚至可以改进它。我建议不要将条件格式设置为“白色”,而是将条件隐藏表达式设置为 True。 在这种情况下,当导出到 excel 时,单元格将不包含任何内容,这与更改字体前景色的情况不同。 在可见性下 --> 隐藏 =Iif(Fields!denominator.Value=0,True,False)

        【讨论】:

          【解决方案6】:

          在 SSRS 自定义代码中使用 TRY 和 CATCH

          Public Function My_Function(ByVal My_Divisor As int) As int  
            Dim My_Result as integer
            TRY
          My_Result = 100/My_Divisor
            CATCH
           My_Result = -1
            END TRY
            Return My_Result
          End Function 
          

          【讨论】:

            【解决方案7】:

            您可以使用 IsNumeric 来检查每个表达式并显示 0 或更好,但不要显示任何内容,因为 0 可能有一些含义。

            IsNumeric - 返回一个布尔值,指示表达式是否可以计算为数字。

            例如:

            =Iif(IsNumeric(Fields!YourValue.Value), Fields!YourValue.Value, Nothing)
            

            =Iif(IsNumeric(Fields!YourValue.Value), Fields!YourValue.Value, 0)
            

            【讨论】:

            • 我现在不在 SSRS 面前,但我用更多信息更新了我的问题。 IsNumeric "Catch" #Error 如果它由我的表达式返回。换句话说,我可以将 IsNumeric 包裹在我的整个表达式周围并用它来确定我是否有 #Error 吗?
            • @poke:我认为你是对的,即使 IIF 包含在 IsNumeric 中,也会引发 #Error。
            • @JamieF:你说得对,这不起作用。尽管在 SQL 2008R2 上直接使用Iif 检查分母值对我有用(如果只是为了捕捉除以 0)。 =Iif(Fields!Value_Denominator.Value=0, "", (Fields!Value_Numerator.Value/Fields!Value_Denominator.Value)) 不过有趣的是,错误不是很一致,例如无穷大,-无穷大,NaN...
            【解决方案8】:

            使用NULLIF函数:

            DECLARE @a int
            DECLARE @b int
            
            SET @a = 1
            SET @b = 0
            
            SELECT @a/@b --this returns an error
            
            SELECT @a/NULLIF(@b,0) -- this returns NULL
            

            【讨论】:

              【解决方案9】:

              到目前为止,建议的另一种替代方法是添加可能导致错误的公式部分。

              示例:a/b,如果 b = 0,则等式给出错误。

              {=IIF(b=0, TRUE, FALSE)}

              【讨论】:

                【解决方案10】:

                这可能并非在所有情况下都有效,但对我来说它成功了。

                我添加了另一列,该列引用了带有错误的文本框 (ReportItems!XYZ.Value),SSRS 使用这种类型的引用将 #Error 显示为空白。然后我隐藏了包含实际公式的列,瞧,解决了。尽管可能是最骇人听闻的方式。

                【讨论】:

                  【解决方案11】:

                  类似于上面根据字段值更改字体颜色的答案 - 向字段添加一个表达式,检查字段是否包含“#Error”,因此:=IIF(Fields!xxxx.Value="#Error" ,"",Fields!xxxx.Value)。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2011-03-18
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2023-04-03
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多