感谢您今天花时间帮助我。我试图使用多个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)))
答案 0 :(得分:2)
我猜想当你的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....)
我只是粗略地阐述了函数背后的代码如何工作,它显然不完整,但应该足以指出你正确的方向。
答案 1 :(得分:2)
我同意@Daniel,当值为空时,错误最有可能由Fields!UDFMake.Value.Contains
产生,因为IIF不会短路。
除了@Daniel提到的好选项,你可以用函数InStr替换contains方法:
... , Switch(
InStr(Fields!UDFMake.Value,"Chevy") > 0
, "Knapp Chevrolet" + chr(10) + "PO box " + chr(10) + "Houston TX 77210" ...
即使字段的值为Null,也不会产生错误。