SSRS隐藏单元格中显示的#Error

时间:2012-02-04 20:36:06

标签: reporting-services

我正在对那些有时会导致#Error的数据进行计算。根本原因是除以零。我可以跳过必要的工作以避免除以零,但掩盖#Error文本并显示空白单元格可能更简单。是否可以隐藏#Error并且只显示任何内容?

修改

文本的表达式可能会显示#Error就是这些行:

Fields!Field1.Value / Fields!ValueThatMightBeZero.Value

我可以通过一些丑陋的检查解决这个问题,但是可能更容易捕获#Error。 (快递周围的直接iif检查不起作用,因为SSRS首先评估true和false子句;如果它在任一子句上得到零除,它将返回#Error,即使该子句不会'已被使用过。)

11 个答案:

答案 0 :(得分:20)

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

答案 1 :(得分:12)

有一个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

答案 2 :(得分:10)

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

你必须检查分母并用那里的非零除数代替,以便除以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))

答案 3 :(得分:5)

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

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

那将会返回0。

答案 4 :(得分:4)

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

答案 5 :(得分:0)

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

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

例如:

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

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

答案 6 :(得分:0)

使用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

答案 7 :(得分:0)

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

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

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

答案 8 :(得分:0)

在SSRS自定义代码中使用“尝试并捕获”

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 

答案 9 :(得分:0)

这可能并非在所有情况下都有效,但对我而言却成功了。

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

答案 10 :(得分:0)

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