Вопрос:

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

ssrs-2008

40131 просмотра

4 ответа

4249 Репутация автора

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

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

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

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

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

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

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

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

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

Автор: tobias86 Источник Размещён: 29.03.2011 11:32

Ответы (4)


66 плюса

11153 Репутация автора

Решение

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

Пытаться

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

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

Автор: MartW Размещён: 29.03.2011 11:44

16 плюса

161 Репутация автора

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

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

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

Автор: SkyDkn Размещён: 28.12.2011 03:32

22 плюса

246 Репутация автора

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

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

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/

Автор: william mendoza Размещён: 01.08.2013 04:11

2 плюса

21 Репутация автора

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

Автор: user1689669 Размещён: 12.01.2016 09:16
Вопросы из категории :
32x32