SSRS中嵌入的IIF国家

时间:2017-07-19 16:04:18

标签: vba reporting-services ssrs-2008 iif

感谢您今天花时间帮助我。我试图使用多个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)))

2 个答案:

答案 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,也不会产生错误。