Подтвердить что ты не робот

Выражение 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)))

Итак, я беру доллары в текущем году, вычитая доллары за предыдущий год и деля их на доллары за предыдущий год, чтобы получить процентное изменение. Есть ли трюк, который я не получаю?!

4b9b3361

Ответ 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)