長期讀者,第一次海報。SSRS表達評估問題嵌套IIF /開關
我有一個SSRS表達式的棘手情況,我想獲得幫助。
我有,除其他外,2列的命名錶內:
ForecastMovementCurrentPeriod ActualMovementCurrentPeriod
我有5個條件的需要在表達式將被施加到第三列。
它們分別是:
如果ForecastMovementCurrentPeriod = 0 AND 'ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod'> 0,返回 「-100%」
如果ForecastMovementCurrentPeriod = 0 AND 「ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod '< 0,return 「+ 100%」
如果ForecastMovementCurrentPeriod <> 0且如果 'ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod' 不是 錯誤,並且 ABS((ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod)/ ForecastMovementCurrentPeriod)> 100%,則返回 「大」
如果ForecastMovementCurrentPeriod <> 0且如果 'ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod' 不是 錯誤,並且 ABS((ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod)/ ForecastMovementCurrentPeriod)< 20%,則返回 「次要」
如果ForecastMovementCurrentPeriod <> 0且如果 'ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod' 不是 錯誤和 ABS((ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod)/ ForecastMovementCurrentPeriod) < 100%和> 20%,則返回 (ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod)/ ForecastMovementCurrentPeriod)
這些是表達式需要返回的標準。我已經嘗試了SWITCH語句和IIF語句的組合,但是我無法使其工作。
下面是我的代碼:
=SWITCH
(
SUM(Fields!ForecastMovementCurrentPeriod.Value) = 0.00 AND SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) > 0.00, "-100%",
SUM(Fields!ForecastMovementCurrentPeriod.Value) = 0.00 AND SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) < 0.00, "+100%",
SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0 AND (SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0.99123131414) AND (ABS(SUM(Fields!ActualMovementCurrentPeriod.Value)) - ABS(SUM(Fields!ForecastMovementCurrentPeriod.Value)))/ABS(SUM(Fields!ForecastMovementCurrentPeriod.Value)) > 1.00, "Large",
SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0 AND (SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0.9912313141) AND (ABS(SUM(Fields!ActualMovementCurrentPeriod.Value)) - ABS(SUM(Fields!ForecastMovementCurrentPeriod.Value)))/ABS(SUM(Fields!ForecastMovementCurrentPeriod.Value)) < 0.20, "Minor",
SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0 AND (SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0.9912313141) AND ((ABS(SUM(Fields!ActualMovementCurrentPeriod.Value)) - ABS(SUM(Fields!ForecastMovementCurrentPeriod.Value)))/ABS(SUM(Fields!ForecastMovementCurrentPeriod.Value)) > 0.20 AND (ABS(SUM(Fields!ActualMovementCurrentPeriod.Value)) - ABS(SUM(Fields!ForecastMovementCurrentPeriod.Value)))/ABS(SUM(Fields!ForecastMovementCurrentPeriod.Value))) < 1.00, (SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value))/SUM(Fields!ForecastMovementCurrentPeriod.Value)
)
這正確返回「大」,「小」的,這將是2列的百分比值的最終標準。我遇到的問題是,當滿足前兩個條件時它會返回一個錯誤,例如ForecastMovementCurrentPeriod = 0並且ActualMovementCurrentPeriod-ForecastMovementCurrentPeriod的結果爲「5」 - 它應該返回「-100%」,但會返回一個#Error 。
有趣的是,如果我刪除我switch語句中的最後3行,所以我只有,說:
=SWITCH
(
SUM(Fields!ForecastMovementCurrentPeriod.Value) = 0.00 AND SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) > 0.00, "-100%",
SUM(Fields!ForecastMovementCurrentPeriod.Value) = 0.00 AND SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) < 0.00, "+100%"
)
它返回正確的值,它會返回一個#錯誤時相同的行其他3條線在那裏!我不能爲我的生活弄清楚這一點。我試過嵌套的IIF語句無濟於事。
任何人都可以告訴我我可能做錯了什麼?據我所知,SWITCH語句將根據語句的順序返回第一個值爲TRUE的值。當滿足條件並且我的SWITCH語句的最後3行也在那裏時,爲什麼它不會返回「-100%」或「+ 100%」?
任何幫助將會很棒!
編輯:
我已經找到了問題。
我終於弄明白了。儘管SWITCH語句會爲第一個表達式返回一個真值,但它看起來像SWITCH語句直到在語句中對EVERY表達式求值之後纔會真正返回該值。當它試圖評估最後3個語句時,出現了零除以,這就是爲什麼即使第一個表達式評估爲true,它也會返回#ERROR。
奇怪的行爲,因爲我會認爲一旦SWITCH語句找到了真正的值,就不會費心去評估其他的。
我的解決方案是圍繞最終3個表達式包裝IIF語句以避免被零除。
代碼如下:
=SWITCH
(
SUM(Fields!ForecastMovementCurrentPeriod.Value) = 0.00 AND SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) > 0.00, "-100%",
SUM(Fields!ForecastMovementCurrentPeriod.Value) = 0.00 AND SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) < 0.00, "+100%",
SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0 AND (SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0.99123131414) AND IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 0, ABS(Sum(Fields!ActualMovementCurrentPeriod.Value)) - ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)))/IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 1, ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value))) > 1.00, "Large",
SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0 AND (SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0.9912313141) AND IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 0, ABS(Sum(Fields!ActualMovementCurrentPeriod.Value)) - ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)))/IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 1, ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value))) < 0.20, "Minor",
SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0 AND (SUM(Fields!ActualMovementCurrentPeriod.Value) - SUM(Fields!ForecastMovementCurrentPeriod.Value) <> 0.9912313141) AND (IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 0, ABS(Sum(Fields!ActualMovementCurrentPeriod.Value)) - ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)))/IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 1, ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value))) > 0.20 AND IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 0, ABS(Sum(Fields!ActualMovementCurrentPeriod.Value)) - ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)))/IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 1, ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)))) < 1.00, IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 0, ABS(Sum(Fields!ActualMovementCurrentPeriod.Value)) - ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)))/IIf(ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value)) = 0, 1, ABS(Sum(Fields!ForecastMovementCurrentPeriod.Value))),
TRUE, "Error"
)
我仍然覺得奇怪的是,一旦它找到的第一個真值切換不會終止整個區塊的評價 - 好像計算給我一種浪費。
無論如何謝謝你們!
聽起來像一個數據類型的問題。你得到的錯誤是什麼? – APH
嘗試在表達式中轉換所有字段,並確保不會發生被0除的情況。 –
謝謝你們 - 我終於搞清楚了。儘管SWITCH語句會爲第一個表達式返回一個真值,但它看起來像SWITCH語句直到在語句中對EVERY表達式求值之後纔會真正返回該值。 當它試圖評估最後3個語句時,發生了零除,這就是爲什麼它會返回#ERROR,即使第一個表達式評估爲true。 奇怪的行爲,因爲我會認爲一旦SWITCH語句找到了真正的值,就不會費心去評估其他的。 – Michael