Разделение выражения SSRS на нулевую ошибку

У меня есть табликс с выражением деления. При делении на ноль или нули в моем отчете отображается #Error. Я попытался создать оператор IIF и протестировал его со статическими значениями. Это подтвердило, что мой синтаксис был правильным, но я все еще вижу ошибку в своих отчетах.

Предварительный просмотр отчета

=IIF(Sum(Fields!CY_Dollars.Value)=0, 0, (Sum(Fields!CY_Dollars.Value) - Sum(Fields!PY_Dollars.Value))/(Sum(Fields!PY_Dollars.Value)))

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


person d90    schedule 04.10.2013    source источник
comment
Вы упомянули, что в ваших данных есть нули? Попробуйте вложить каждый вызов поля в функцию замены NULL. Например, я бы использовал формат IIF (Fields! PY_Dollars.Value = Nothing, 0, Fields! PY_Dollars.Value = Nothing) для каждого поля! PY_Dollars.Value в текущей формуле. А еще лучше обработать нули в исходном запросе.   -  person Eric Hauenstein    schedule 04.10.2013
comment
Условие в вашем операторе IIF не проверяет нулевой знаменатель (вы проверяете ноль в значении CY, а не в значении PY). Вместо этого попробуйте: =IIF(Sum(Fields!PY_Dollars.Value)=0, 0, (Sum(Fields!CY_Dollars.Value) - Sum(Fields!PY_Dollars.Value))/(Sum(Fields!PY_Dollars.Value)))   -  person rpyzh    schedule 14.02.2014


Ответы (3)


Вы можете добавить в свой код отчета функцию, которая обрабатывает условие деления на ноль, это немного упрощает реализацию в нескольких ячейках, например

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)
person Nathan Griffiths    schedule 07.10.2013
comment
можем ли мы использовать пользовательскую функцию Code.Divider () в SQL или MDX в наборе данных? Глупо, но я хочу что-то вроде этого, чтобы избежать многострочных выражений IIF в моем огромном MDX :( - person Aditya; 29.05.2014
comment
Эту функцию можно использовать только в области конструктора отчетов, но не в запросах SQL или многомерных выражений. Существует несколько подходов к обработке вычислений деления на ноль в многомерных выражениях, например bidn.com/ blogs / dustinryan / ssis / 465 /, но если у вас SQL Server 2012 или новее, вы можете использовать новую функцию Divide (), которая выполняет ту же работу, что и приведенный выше код. - person Nathan Griffiths; 03.06.2014
comment
Функция разделения работает так, как я хочу. Большое спасибо @Nathan. +1 к комментарию :) - person Aditya; 04.06.2014
comment
разве вам не нужно определять возвращаемый тип? Разве в этом нет необходимости? - person Emil; 14.01.2015
comment
Хотел бы я проголосовать за это 1000 раз. Спасибо, прекрасное решение. - person LittleTreeX; 11.03.2015
comment
Mi Hero !! Получилось отлично! Я действительно не знал, как добавить функцию к отчету раньше ... поэтому я пошел, но это ооочень просто! 1. В представлении «Дизайн» щелкните правой кнопкой мыши область конструктора за пределами границы отчета и выберите «Свойства отчета». 2. Щелкните Код. 3. В поле «Пользовательский код» введите код msdn.microsoft.com/en-us /library/ms156028.aspx - person Gus; 27.03.2015
comment
«Помогите мне в моей проблеме = Поля! Saldo.Value * 100 / Fields! CostoNeto.Value» - person rodrigo.rodriguez; 29.11.2017
comment
Большой. Но вы также хотите получить дивиденды с помощью чеков. то есть: либо Dividend, либо Divisor равны нулю или нулю, затем возвращают ноль - person Gary Thomann; 20.09.2018
comment
Почему в ssrs нет типа Float? Получение Ошибка в строке n пользовательского кода: [BC30002] Тип "Float" не определен. - person Gary Thomann; 20.09.2018
comment
@GaryThomann обрабатывать делимое необязательно, так как ноль или ноль, деленное на что-либо, просто возвращает ноль, а не ошибку. - person Nathan Griffiths; 21.09.2018
comment
Привет из будущего! Это 2021 год, и публикация отчетов SSRS в PowerBI через API вызывает ошибку, если у вас есть общий код. Я сейчас раскручиваю кучу DivideBy вызовов, чтобы заставить это работать. - person Nick.McDermaid; 07.05.2021
comment
Привет, Ник, это намеренно или из-за ошибки в API? - person Nathan Griffiths; 07.05.2021
comment
Это похоже на ошибку, потому что эти отчеты можно публиковать вручную из редактора SSRS и нормально запускать внутри Power BI. - person Nick.McDermaid; 08.05.2021
comment
Итак ... если кому-то нужно реорганизовать свой общий код разделения, это встроенный метод, который действительно работает sqldusty.com/2011/08/01/. В основном IIF(denominator=0,0,Numerator) / IIF(Denominator=0,1,Denominator) - person Nick.McDermaid; 12.05.2021

Я подозреваю, что вы столкнулись с проблемой, когда 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 - знаменателю здесь нужна проверка нуля.

person Ian Preston    schedule 04.10.2013
comment
Я понимаю логику, и она должна работать, но SSRS не вычисляет ее правильно. Я все еще получаю сообщение об ошибке. - person d90; 08.10.2013
comment
+1. Вот сообщение об использовании двойных операторов iif ntsblog.homedev.com.au/index.php/2010/03/12/ - person Bobby; 08.10.2014

Чтобы избежать накладных расходов на поддержку кода, я считаю решение ниже. Он избегает деления на ноль в знаменателе, добавляя к нему наименьшее возможное значение 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)
person ambrosen    schedule 29.11.2017