2011-03-29 72 views
37

我們的某個報告遇到了問題。在我們tablixes的一個文本框具有下列表達式:SSRS 2008 - 按零場景處理除法

=Iif(Fields!SomeField.Value = 0, 0, Fields!SomeOtherField.Value/Fields!SomeField.Value) 

這應該是不言自明。如果「SomeField」爲零,請將文本框的值設置爲零,否則將其設置爲「SomeOtherValue/SomeValue」。

我們難以理解的是,即使上面的表達式應該阻止這種情況發生,報告仍然會拋出運行時異常「試圖除以零」。

我們擺弄表達一點只是爲了確保零檢查工作,並

=Iif(Fields!SomeField.Value = 0, "Yes", "No") 

精美的作品。數據實際上爲零的情況導致文本框顯示「是」,反之亦然。所以檢查工作正常。

我的直覺是,報告渲染引擎在運行時拋出異常,因爲它「看起來」好像我們要除以零,但實際上,我們不是。

有沒有人遇到過同樣的問題?如果是這樣,你做了什麼來讓它工作?

+0

太棒了!我用這個建議來回答我的問題:http:// stackoverflow。com/questions/43662727/ssrs-expression-error-calculate-variable-shows-error-when-divide-by-zero/43666171#43666171 – Aline 2017-04-27 19:17:52

回答

58

在決定哪一個實際返回之前,IIf將始終評估兩個結果。

嘗試

=IIf(Fields!SomeField.Value = 0, 0, Fields!SomeOtherField.Value/IIf(Fields!SomeField.Value = 0, 1, Fields!SomeField.Value)) 

這將使用1作爲除數如果SomeOtherField.Value = 0,它不產生錯誤。父母IIf將爲整體表達返回正確的0。

+2

太棒了,這確實有竅門。謝謝! – tobias86 2011-03-29 11:49:05

+3

太狡猾了! – GONeale 2013-06-17 23:09:59

+0

喜歡這個!特別是「如果SomeOtherField.Value = 0,這將使用1作爲除數,這不會產生錯誤,而父級IIf將爲整體表達式返回正確的0。 hehehe,偷偷摸摸,確實 – 2013-10-14 13:51:45

14

經過思考,我覺得最好的辦法是通過值乘以供電-1,這是一個除法:

=IIf 
    (
     Fields!SomeField.Value = 0 
    , 0 
    , Fields!SomeOtherField.Value * Fields!SomeField.Value^-1 
) 

這不火預渲染支票VAL * 0^-1結果在無窮遠處,不是錯誤

18

一個簡單幹淨的方法來防止除零錯誤是使用報告代碼區。

在菜單中,轉到報告>報告屬性>代碼和粘貼如下

Public Function Quotient(ByVal numerator As Decimal, denominator As Decimal) As Decimal 
     If denominator = 0 Then 
      Return 0 
     Else 
      Return numerator/denominator 
     End If 
    End Function 

代碼調用函數去到文本框的表達和類型:

=Code.Quotient(SUM(fields!FieldName.Value),SUM(Fields!FieldName2.Value)) 

在這如果我在公司層面上使用公式,那麼我正在使用總和。否則,這將是:

=Code.Quotient(fields!FieldName.Value,Fields!FieldName2.Value) 

從:http://williameduardo.com/development/ssrs/ssrs-divide-by-zero-error/

+4

我喜歡它。清潔和可重複使用。 如果你在這裏粘貼這個解決方案,更多的人會看到它有多好:-) – Mariusz 2016-12-01 10:15:02

1

IIF評估兩種表達甚至想到領域SomeField.Value的價值反而IIF 0使用如果將解決這個問題。