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

1 reporting-services ssrs-2008 ssrs-2008-r2

我尝试使用IIFSwitchcase,但是当出现零除错误时我无法处理N/A情况.例如:

=switch(
    ReportItems!Textbox54.Value = 0, "N/A",
    ReportItems!Textbox54.Value <> 0, ((ReportItems!Textbox56.Value) / (ReportItems!Textbox54.Value)))
Run Code Online (Sandbox Code Playgroud)

我得到的是N/A:

ReportItems!Textbox54.Value <> 0, ((ReportItems!Textbox56.Value) / (ReportItems!Textbox54.Value)
Run Code Online (Sandbox Code Playgroud)

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

我正在使用SSRS 2008 R2.

输出:

19.47%
13.85%
#Error

Chr*_*tta 8

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

这个问题有两种解决方法:

IIF旁路

基本上做两个IIF函数调用,你不会得到零错误:

=IIF(ReportItems!Textbox54.Value <> 0, 
    ReportItems!Textbox56.Value / IIF(ReportItems!Textbox54.Value = 0, 1, ReportItems!Textbox54.Value),
    "N/A")
Run Code Online (Sandbox Code Playgroud)

因此,在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
Run Code Online (Sandbox Code Playgroud)

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

=Code.SafeDivide(ReportItems!Textbox56.Value, ReportItems!Textbox54.Value)
Run Code Online (Sandbox Code Playgroud)

并使用格式字符串将零显示为"N/A":

#,##0.00;-#,##0.00;N/A
Run Code Online (Sandbox Code Playgroud)