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,也不会产生错误。
感谢您今天抽出时间来帮助我。我正在尝试使用多个 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,也不会产生错误。