Выражение SSRS разделяется нулевой ошибкой
У меня есть поле tablix с выражением деления. При делении на нуль или нулевое значение я получаю #Error
в моем отчете. Я попытался создать оператор IIF
и протестирован со статическими значениями. Это подтвердило мой синтаксис, но я все еще вижу ошибку в своих отчетах.
![Report Preview]()
=IIF(Sum(Fields!CY_Dollars.Value)=0, 0, (Sum(Fields!CY_Dollars.Value) - Sum(Fields!PY_Dollars.Value))/(Sum(Fields!PY_Dollars.Value)))
Итак, я беру доллары в текущем году, вычитая доллары за предыдущий год и деля их на доллары за предыдущий год, чтобы получить процентное изменение. Есть ли трюк, который я не получаю?!
Ответы
Ответ 1
Вы можете добавить функцию к вашему отчетному коду, который обрабатывает условие деления на ноль, это делает его немного проще реализовать в нескольких ячейках, например.
Public Function Divider (ByVal Dividend As Double, ByVal Divisor As Double)
If IsNothing(Divisor) Or Divisor = 0
Return 0
Else
Return Dividend/Divisor
End If
End Function
Затем вы можете вызвать это в ячейке следующим образом:
=Code.Divider(Fields!FieldA.Value, Fields!FieldB.Value)
Ответ 2
Я подозреваю, что вы столкнулись с проблемой, когда SSRS фактически не замыкает оператор IIF
; даже если вы проверяете значение 0, вы все равно столкнетесь с делением на нулевую ошибку.
Попробуйте что-то вроде:
=IIf(Sum(Fields!PY_Dollars.Value) = 0, 0, Sum(Fields!CY_Dollars.Value) - Sum(Fields!PY_Dollars.Value))
/ IIf(Sum(Fields!PY_Dollars.Value) = 0, 1, Sum(Fields!PY_Dollars.Value))
Использование двух операторов IIF
означает, что вы избегаете ошибки, используя уравнение 0/1
, когда Sum(Fields!PY_Dollars.Value)
= 0, таким образом просто возвращая 0.
Также обратите внимание, что указанное выше выражение проверяет Sum(Fields!PY_Dollars.Value) = 0
, но ваш проверяет Sum(Fields!CY_Dollars.Value) = 0
- знаменатель нуждается в нулевой проверке здесь.
Ответ 3
Чтобы избежать накладных расходов на поддержание кода, нижеприведенное ниже решение кажется мне самым чистым. Он избегает деления на ноль в знаменателе, добавляя к нему наименьшее возможное значение Double
(Double.Epsilon
, которое равно 4.94e-324
). Этот способ слишком мал, чтобы повлиять на значение фракции для чего-либо, для чего люди будут использовать SSRS. Он также позволяет избежать вложенности функций IIF.
=IIF(Sum(Fields!Denominator.Value)>0,
Sum(Fields!Numerator.Value)/(Sum(Fields!Denominator.Value)+Double.Epsilon),
nothing)