2017-07-19 84 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的回答是讓我的方案有效的解決方案。如果我能將兩者都標記爲答案,我會。 –