SSRS 中的嵌入式 IIF 状态

embedded IIF States in SSRS

感谢您今天抽出时间来帮助我。我正在尝试使用多个 if 语句来根据每个语句是否为真来控制显示的值。所以现在我在下面有这个基本上是:

IIF(expression = NULL
, CompanyAddress
, IIF(Expression='TX'
    , IIF(BOOL=TRUE
        ,CompanyAddress
        , SWITCH(DEALER ADDRESSES))
    ,CompanyAddress)
)

我已经分别测试了每个单独的 IIF 语句,并且得到了我期望的结果。当前在第一个 IIF 语句中,Expression = NULL 为 TRUE,它只输出 #Error 而不是 "Nothin" OR 在我的真实案例公司地址中。但是,如果 Expression = NULL 为 FAlSE,我会得到 companyAddress 或 Dealer 的正确输出。

=IIF(IsNothing(Fields!CoOppId.Value)
,("nothin")
, (IIF(Fields!Addr1.Value.Contains("TX")
    , IIF(Fields!UDFCustProv.Value = 1
        , Fields!Addr0.Value
        , Switch(
            Fields!UDFMake.Value.Contains("Chevy")
            , "Knapp Chevrolet" + chr(10) + "PO box " + chr(10) + "Houston TX 77210"
            , Fields!UDFMake.Value.contains("Ford") 
            , "Sterling McCall Ford" + chr(10) + "6445 Southwest Freeway" + chr(10) + "Houston TX 77074"
            , Fields!UDFMake.Value.contains("International")
            , "Pliler International" + chr(10) + "2016 S. Eastman Rd" + chr(10) + "Longview TX 75602"
            , Fields!UDFMake.Value.contains("Freightliner")
            , "Houston Freightliner, Inc" + chr(10) +"9550 North Loop East" + chr(10) + "Houston TX 77029"
            , Fields!UDFMake.Value.contains("RAM")
            , "Max Haik Dodge Chrysler Jeep" +chr(10)+ "11000 I-45 North Freeway" + chr(10) + "Houston TX 77037")),Fields!Addr0.Value)))

我猜测当您的 CoOppId 值为 NULL 时,您在该行中的其他字段也为 NULL。因为 IIF 不使用短路逻辑(它总是评估 IIF 的两侧),所以您试图评估表达式 "NULL.Contains("TX")" 并且这将生成 #ERROR,因为 NULL 不是字符串并且不能使用 CONTAINS 函数进行操作。

对于这种情况有两种解决方法,但我认为它们都不是特别好,但是:

1) 使用嵌套 IIF 来确保没有任何内容是无效的。

IIF(expression is NULL 
, CompanyAddress
, IIF(**IIF(expression is NULL, "", expression)** ='TX'
    , IIF(BOOL=TRUE
        ,CompanyAddress
        , SWITCH(DEALER ADDRESSES))
    ,CompanyAddress)
)

查看上面的伪代码并注意围绕使用 CONTAINS 功能的表达式的附加嵌套 IIF。如果 CoOppId 不存在,它会用一个空字符串代替 CONTAINS 检查。尽管此分支从未显示它对 null 场景的价值,但它至少现在是有效的。

2) 创建一个真正为您执行短路逻辑的代码隐藏函数:

Public Function CheckForNull(ByVal CoOppId As String, ByVal Addr1 as String, ByVal UDFMake As String, ... all fields)
If String.IsNullOrEmpty(CoOppId) 
  Return "Nothing"
Else
  Return *** do your calculation with your fields here
End If
End Function 

您在报告中使用的是:

=Code.CheckForNull(values....)

我只是粗略地阐述了这种函数背后的代码是如何工作的,它显然不完整,但应该足以为您指明正确的方向。

我同意@Daniel 的观点,当值为 null 时,错误很可能是由 Fields!UDFMake.Value.Contains 产生的,因为 IIF 不会短路。 除了@Daniel 提到的好的选项之外,您还可以将 contains 方法替换为函数 InStr as:

... , Switch(
            InStr(Fields!UDFMake.Value,"Chevy") > 0
            , "Knapp Chevrolet" + chr(10) + "PO box " + chr(10) + "Houston TX 77210" ...

即使字段的值为 Null,也不会产生错误。