SSRS 2008 - Работа с делением на нулевые сценарии
Мы сталкиваемся с проблемой с одним из наших отчетов. В одном из наших таблиц текстовое поле имеет следующее выражение:
=Iif(Fields!SomeField.Value = 0, 0, Fields!SomeOtherField.Value / Fields!SomeField.Value)
Что должно быть довольно понятно. Если "SomeField" равен нулю, установите значение текстового поля в ноль, иначе установите его в "SomeOtherValue/SomeValue".
Что нас настораживает, так это то, что в отчете по-прежнему появляется исключение во время выполнения, "пытающееся делить на ноль", даже если вышеприведенное выражение должно помешать этому.
Мы немного поиграли с этим выражением, чтобы убедиться, что проверка нуля работает, и
=Iif(Fields!SomeField.Value = 0, "Yes", "No")
работает красиво. Случаи, когда данные фактически равны нулю, привели к тому, что текстовое поле отображало "Да" и наоборот. Таким образом, проверка работает нормально.
Я чувствую, что механизм рендеринга отчетов генерирует исключение во время выполнения, потому что он "выглядит" так, как будто мы собираемся делить на ноль, но на самом деле мы этого не делаем.
Кто-нибудь сталкивался с тем же вопросом раньше? Если да, то что вы сделали, чтобы заставить его работать?
Ответы
Ответ 1
IIf всегда будет оценивать оба результата перед тем, как решить, какой из них действительно вернуть.
Try
=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
Я использовал другой подход;
Свойства отчетa > Код и код решения
http://williameduardo.com/development/ssrs/ssrs-divide-by-zero-error/
Ответ 3
При отражении я считаю, что лучшая идея состоит в умножении на значение на мощность -1, что является делением:
=IIf
(
Fields!SomeField.Value = 0
, 0
, Fields!SomeOtherField.Value * Fields!SomeField.Value ^ -1
)
Это не срабатывает при предварительном рендеринге, так как val * 0 ^ -1 приводит к бесконечности, а не к ошибке
Ответ 4
IIF оценивает оба выражения, даже считая значение Fields! SomeField.Value равно 0. Использование IF вместо IIF устранит проблему.