2017-07-19 126 views
1

感谢您抽出宝贵时间帮助我。我试图使用多个if语句来控制显示哪个值,具体取决于每个语句是否为true。所以现在我有这个下面基本上是:SSRS中嵌入的IIF状态

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

我已分别测试了每个人IIF语句,我得到我所期望的结果。目前在第一个IIF语句中,Expression = NULL是TRUE,它只输出#Error,而不是在我的真实公司地址中输出“Nothin”。但是如果表达式= 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

给这个答案一个尝试:[StackOverflow](https://stackoverflow.com/questions/17511151/isnothing-not-working-on-empty-value-in-report-builder) – Lucky

+0

没有运气在该线程 –

+1

你说主IIF上的ELSE条件可以正常工作,所以你可以将它分解成单个顶层IIF并告诉我们是否仍然会产生错误?实际上我现在看到你说你确实已经证实了这一点。下一个问题,在CoOppId为NULL的情况下,该行中的其他字段是否为NULL? – Daniel

回答

2

我同意@Daniel的错误很可能是Fields!UDFMake.Value.Contains产生的值为空时,因为IIF不会短路。 或者到@Daniel提到您可以替换包含函数InStr函数法作为不错的选择:

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

即使字段的值是零,这将不会产生错误。

+0

这似乎已经成功了。非常感谢 –

2

我打算猜测,当您的CoOppId值为NULL时,该行中的其他字段也是NULL。因为IIF不使用短路逻辑(它总是评估IIF的两端),所以你试图评估表达式“NULL.Contains(”TX“)”,并且这将产生一个#ERROR,因为NULL不是一个字符串,不能用CONTAINS功能操作。

有两种解决方法对于这种情况,他们都没有特别好的在我看来,不过:

1)使用嵌套的综合投资框架,以确保没有事情是无效的。

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....) 

我只是粗略地制定了如何这样的代码背后的代码工作,它显然不完整,但应该足以指出你在正确的方向。

+0

这似乎是我进一步研究的正确方向。我会尝试这一点,并与我的研究结果回来 –

+0

自定义代码将是一个很好的解决方法,以避免错误,也使您的表达式更容易阅读 – niktrs

+0

谢谢丹尼尔您的伟大回应。看来你有正确的想法,但是Jayvee的回答是让我的方案有效的解决方案。如果我能将两者都标记为答案,我会。 –