Report Services и деление на ноль

Недавно столкнулся с проблемой деления на ноль  при использовании выражений в RS. Проблема очень старая и я думал, что уже давно ее пофиксили, но как  оказалось нет и  в SSRS 2016 она также существует.

Суть проблемы состоит в следующем:

iif(Fields!Columns_1.Value=0,NOTHING,

Fields!Columns_2.Value/Fields!Columns_1.Value)

Результатом данного выражения в большинстве случаев будет ошибка деления на ноль.

Существует  три варианта решения данной проблемы:

1  Двойная проверка

iif(Fields!Columns_1.Value=0,NOTHING, Fields!Columns_2.Value/

IIF(Fields!Columns_1.Value=0,1,Fields!Columns_1.Value))

Данная проверка работает, но в случае если значение Fields!Columns_1.Value=0,  а Fields!Columns_2.Value значение не равно 0, то мы получаем не корректный результат

2 Возведение в степень делителя

iif(Fields!Columns_1.Value=0,NOTHING, Fields!Columns_2.Value*Fields!Columns_1.Valueˆ-1)

Элегантное решение, но не понятное. Если вы запустите  это выражение  в T-SQL, то компилятор выдаст сообщение об ошибке, а для RS нет, потому что система не обращает внимания на типы данных

3. Пользовательская функция

Третий подход, мне кажется, является самым правильным. Создаем пользовательскую функцию на VBA. Для этого в меню VS или Report Builder  выбираем пункт Report->Report Properties

reportmenu

Переходим в Code  и пишем функцию

code

Текст функции:

Public Shared Function NothingDivision(ByVal FirstValue as Decimal, ByVal TwoValue As Decimal) As Decimal
If TwoValue = 0 Then
NothingDivision= NOTHING
Else
NothingDivision= FirstValue / TwoValue
End If
End Function

После чего делаем вызов процедуры в выражении:

code.NothingDivision( Fields!Columns_2.Value,Fields!Columns_1.Value)

Для меня предпочтительней 3 вариант, он более понятен и более логичен, но данный вариант увеличивает время построения отчета. Странно другое, почему до сих пор   не исправили данный баг? Он тянется с 2008 версии RS.

Кстати, в данной статье я привел три варианта решения,  которые используются, хотя есть и другие варианты, например делать деление в коде T-SQL. Да, это правильный вариант решения, я его тоже часто применяю, но все таки давайте  дадим хоть немного поработать и RS.

Реклама

Автор

Eugene Polonychko

DWH/BI architect, speaker at SQL Saturday conference, member of Ukranian Data Community Kyiv, owner of Donetsk SQL User Group

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s