SSRS 2008 - работа с делением по нулевым сценариям - PullRequest
44 голосов
/ 29 марта 2011

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

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

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

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

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

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

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

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

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

Ответы [ 4 ]

66 голосов
/ 29 марта 2011

IIf всегда будет оценивать оба результата, прежде чем решить, какой из них на самом деле вернуть.

Попробуйте

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

При этом SomeOtherField.Value = 0 будет использовать 1 в качестве делителя, что несгенерировать ошибку.Родительский IIf вернет правильный 0 для общего выражения.

22 голосов
/ 01 августа 2013

Простой способ предотвратить ошибку деления на ноль - использовать область кода отчета.

В меню выберите «Отчет»> «Свойства отчета»> «Код» и вставьте код ниже

Public Function Quotient(ByVal numerator As Decimal, denominator As Decimal) As Decimal
        If denominator = 0 Then
            Return 0
        Else
            Return numerator / denominator
        End If
    End Function

Для вызова функции перейдите к выражению Textbox и введите:

 =Code.Quotient(SUM(fields!FieldName.Value),SUM(Fields!FieldName2.Value))

В этом случае я размещаю формулу на уровне группы, поэтому использую сумму. В противном случае это будет:

 =Code.Quotient(fields!FieldName.Value,Fields!FieldName2.Value)

От: http://williameduardo.com/development/ssrs/ssrs-divide-by-zero-error/

16 голосов
/ 28 декабря 2011

Если подумать, я считаю, что лучше всего умножить на значение до степени -1, что является делением:

=IIf
  (
      Fields!SomeField.Value = 0
    , 0
    , Fields!SomeOtherField.Value * Fields!SomeField.Value ^ -1
  )

Это не запускает проверки перед рендерингом, так как val * 0 ^ -1 приводит к бесконечности, а не к ошибке

1 голос
/ 13 января 2016

IIF оценивает оба выражения, даже если значение Fields! SomeField.Value равно 0. Использование IF вместо IIF решит проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...