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

SSRS 2008 - Работа с делением на нулевые сценарии

Мы сталкиваемся с проблемой с одним из наших отчетов. В одном из наших таблиц текстовое поле имеет следующее выражение:

=Iif(Fields!SomeField.Value = 0, 0, Fields!SomeOtherField.Value / Fields!SomeField.Value)

Что должно быть довольно понятно. Если "SomeField" равен нулю, установите значение текстового поля в ноль, иначе установите его в "SomeOtherValue/SomeValue".

Что нас настораживает, так это то, что в отчете по-прежнему появляется исключение во время выполнения, "пытающееся делить на ноль", даже если вышеприведенное выражение должно помешать этому.

Мы немного поиграли с этим выражением, чтобы убедиться, что проверка нуля работает, и

=Iif(Fields!SomeField.Value = 0, "Yes", "No")

работает красиво. Случаи, когда данные фактически равны нулю, привели к тому, что текстовое поле отображало "Да" и наоборот. Таким образом, проверка работает нормально.

Я чувствую, что механизм рендеринга отчетов генерирует исключение во время выполнения, потому что он "выглядит" так, как будто мы собираемся делить на ноль, но на самом деле мы этого не делаем.

Кто-нибудь сталкивался с тем же вопросом раньше? Если да, то что вы сделали, чтобы заставить его работать?

4b9b3361

Ответ 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 для общего выражения.

Ответ 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 устранит проблему.