1

我正在寫一個報告,針對某些列中有空值的數據存儲庫。問題在於建立表情與荷爾蒙老太太一樣具有氣質,並且不喜歡我混合的功能。如何在複雜的SSRS表達式中混合使用函數?

下面是我寫的,如果在字段中的數據爲空/什麼不工作的表達式:

=IIF(
    IsNumeric(Fields!ADataField.Value), 
    RunningValue(
     IIF(
      DatePart("q", Fields!CreatedOn.Value) = "2", 
      Fields!ADataField.Value, 
      0 
     ), 
    Sum, 
    Nothing 
    ), 
    Sum(0) 
) 

(僞) 「如果數據是有效的,如果數據是在創建在今年第二季度,把它加到整體總和中,否則加上零和「。

看起來很直截了當。表達的各個部分獨立工作。 IE:IsNumeric(),DatePart()等,但是當我把它們放在一起時,表達式會拋出一個錯誤。

我已經試過了上面顯示的每一個排列,都沒有用。 Fields!ADataField.Value中的空值會導致錯誤。產生

特定的錯誤:

「爲textrun‘的值表達’在不是數字數據使用 數字聚集函數數值 聚集函數(求和,平均,STDEV,VAR,。 StDevP和VarP)只能有 聚合數字數據。「

想法?

+0

我敢打賭,即使對於CreatedOn在季度2中的某些情況,您也可以在「AdataField」中獲得非數字數據。 –

+0

您能否給我們提供一些我們可以嘗試的樣本數據?確保樣本數據也給你提供了錯誤。 – Neil

+0

示例數據只不過是一個整數字段,其中有空值與零有效的整數與零相混合。 – Boydski

回答

0

好大家。我想出瞭解決方案。非常感謝所有偉大的建議。我決定在這裏發帖之前,他們中的大多數已經嘗試過。所以理智的檢查是非常有價值的!

無論出於什麼不合邏輯的原因,修正了這個問題的原因是CInt()甚至在之後這個字段被確認已經是數字。它不會允許Sum()在沒有它的情況下針對該字段運行。下面是終於把代碼:

=Sum(
    IIF(
     IsNumeric(Fields!ADataField.Value) And 
     DatePart("q", Fields!createdon.Value) = "1", 
     CInt(Fields!ADataField.Value), 
     0 
    ) 
) 

任何和所有其他的排列,我們已經都在這裏嘗試過,包括那些RunningValue()已經包裹IIF(的「真」部分之後,所有的工作)與CINT( )。

只是請不要斧頭我爲什麼這個工程,但它並沒有它。除了最基本的表達方式之外,任何東西總是顯得變幻莫測。

再次感謝大家。回答問題時,GShenanigan在聊天時多加了一分鐘。希望我可以把它交給每個人。你們真棒。

1

嘗試使用這樣的:

=SUM(IIF(ISNothing(Fields!ADataField.Value), 0, 
(IIF(IsNumeric(Fields!ADataField.Value), IIF(DatePart("q", Fields!CreatedOn.Value) = "2", Fields!ADataField.Value, 0), 0) 
))) 
+0

查看以前的回答評論:我試過很多版本的IsNothing( )在表達式中的各個地方,謝謝!如果你想出任何有用的東西,請告訴我。 – Boydski

1

您可以處理使用中出現的NULL值:

Iif(Fields!ADataField.Value Is Nothing, 0, Fields!ADataField.Value) 

這樣,你可以(在我上面的例子0)替換成別的任何Null值。把它放到你的表達中,應該看起來像這樣:

=Iif(Fields!ADataField.Value Is Nothing,0, 
    RunningValue(
     IIF(
      DatePart("q", Fields!CreatedOn.Value) = "2", 
      Fields!ADataField.Value, 
      0 
     ), 
    Sum, 
    Nothing 
    ) 
) 
+0

嘗試過了,試過每次使用IsNothing()和「x Is Nothing」都可以。 。:( – Boydski

+0

)你確實知道它是引起它的NULL值,還是它可能是別的?我認爲它的錯誤信息只是說它不能評估表達式? – GShenanigan

+0

我確實確認它是null – Boydski

1

SSRS表達式中的VB不會做短路評估。也就是說,所有參數的IIF聲明進行評估,如果其中任何一個拋出異常(#Error),那麼整個表達式引發錯誤。)

所以不管什麼ADataField值,這部分將被評估:

RunningValue(
     IIF(
      DatePart("q", Fields!CreatedOn.Value) = "2", 
      Fields!ADataField.Value, 
      0 
     ), 
    Sum, 
    Nothing 
    ), 

這會發生即使代碼沒有結果返回比如當IsNumeric(Fields!ADataField.Value)是假的方式。

因此,您總是要執行RunningValue函數,如果在第二季度CreatedOn字段中的CreatedOn字段中存在ADataField中的非數字數據,那麼這將爲每次調用都生成一個錯誤。

試試這個作爲一種替代方案:

=IIF(
    IsNumeric(Fields!ADataField.Value), 
    RunningValue(
     IIF(
      DatePart("q", Fields!CreatedOn.Value) = "2" 
       AND IsNumeric(Fields!ADataField.Value), 
      Fields!ADataField.Value, 
      0 
     ), 
    Sum, 
    Nothing 
    ), 
    Sum(0) 
) 
+0

對。我在提出各種表達方式的時候一直牢記這一點。我上面展示的只是我嘗試過的許多版本。仍然在工作... – Boydski

+0

我已經添加了一個建議的解決方案。它在內部IIF中有一個似乎是冗餘的條款,應該清理乾淨。 –