如何处理IIF或Switch除以零给#ERROR?

时间:2013-04-01 20:04:17

标签: reporting-services ssrs-2008 ssrs-2008-r2

我尝试使用IIFSwitch案例,但是当出现零除错误时,我无法处理N / A案例。例如:

=switch(
    ReportItems!Textbox54.Value = 0, "N/A",
    ReportItems!Textbox54.Value <> 0, ((ReportItems!Textbox56.Value) / (ReportItems!Textbox54.Value)))

我得到的是N / A:

ReportItems!Textbox54.Value <> 0, ((ReportItems!Textbox56.Value) / (ReportItems!Textbox54.Value)

但是如果添加这个条件我会收到错误吗?

我正在使用SSRS 2008 R2。

输出:

  

19.47%
    13.85%
    #错误

2 个答案:

答案 0 :(得分:8)

IIF函数的问题在于它是函数而不是语言构造。这意味着在将参数传递给函数之前评估两个参数。因此,如果你有一个除以零的错误,那么这将被评估并导致#ERROR条件,即使看起来由于IIF语句的布尔条件而不应该执行该代码。 / p>

此问题有两种解决方法:

IIF绕过

基本上做两个IIF函数调用,你不会将零除错:

=IIF(ReportItems!Textbox54.Value <> 0, 
    ReportItems!Textbox56.Value / IIF(ReportItems!Textbox54.Value = 0, 1, ReportItems!Textbox54.Value),
    "N/A")

所以,在ReportItems!Textbox54.Value为零的情况下,除以1,将结果抛出并使用N / A.

自定义代码

在自定义代码中创建一个安全除零函数,您可以使用真实语言结构。

Public Function SafeDivide(ByVal Numerator As Decimal, ByVal Denominator As Decimal) As Decimal
    If Denominator = 0 Then
       Return 0
    End If
    Return (Numerator / Denominator)
End Function

然后在报表中将其用于Value表达式而不是IIF或SWITCH:

=Code.SafeDivide(ReportItems!Textbox56.Value, ReportItems!Textbox54.Value)

并使用Format字符串将零显示为“N / A”:

#,##0.00;-#,##0.00;N/A

答案 1 :(得分:0)

尝试以下代码

  =IIF(ReportItems!Textbox54.Value = 0,nothing, IIF(ReportItems!Textbox54.Value = 0,1,ReportItems!Textbox56.Value) / IIF(ReportItems!Textbox54.Value = 0,1,ReportItems!Textbox54.Value) )

从不零条件