Отчет RDLC неправильно определяет значения NULL

У меня проблема с генерацией отчета.rdlc. Один из столбцов имеет это выражение:

IIF(CInt(Fields!MyColumn.Value) = 0 or Fields!MyColumn.Value is nothing,"Unknown",Fields!MyColumn.Value)

Я также пытался использовать это поле как строку:

=IIF(IsNothing(Fields!MyColumn.Value) or Fields!MyColumn.Value is nothing,"Unknown",Fields!MyColumn.Value.ToString())

Когда значение MyColumn не NULL, отчет отображает значение правильно, но когда оно NULL (или 0 при преобразовании в тип int) отчет возвращает #Error, Странно то, что когда я удаляю функцию if и отображаю только значение этого поля, отчет отображает 0 или пусто (ошибка не возвращается). Как я могу это исправить?

4 ответа

Решение

Вы можете попробовать проверить без сравнения:

=IIf(Fields!YourColumn.Value
    , Fields!YourColumn.Value
    , "Unknown")

Или отменить проверку (проверить, если она существует, вместо проверки, если она не существует):

=IIf(Fields!YourColumn.Value > 0
    , Fields!YourColumn.Value
    , "Unknown")

Кроме того, я не уверен, но это может быть связано с использованием разных типов значений в одном столбце. Попробуйте использовать один и тот же тип значения для всего столбца. Например, только выходные строки или только выходные целые.

Если ничего не работает, вы также можете проверить значения NULL в своем коде, а затем установить значение 0 или -1 (или около того). Затем в своем отчете RDLC вы можете проверить это.

Я думаю, что вы должны проверить ДО, если ваше поле является нулевым или нет, в противном случае вы получите ошибку в сравнении (NULL больше 0? -> ошибка!)

Итак, ваша формула должна быть:

=IIF(IsNothing(Fields!MyColumn.Value) or CInt(Fields!MyColumn.Value) = 0,"Unknown",Fields!MyColumn.Value)

Я бы попробовал также функцию Switch:

=Switch(
    IsNothing(Fields!MyColumn.Value), "Unknown", 
    Fields!MyColumn.Value = 0, "Unknown", 
    Fields!MyColumn.Value > 0, Fields!MyColumn.Value, 
    )

Кроме того, если ваше поле уже является числом, вам не нужно использовать CInt(""), в противном случае формула будет иметь вид:

=Switch(
    IsNothing(Fields!MyColumn.Value), "Unknown", 
    CInt(Fields!MyColumn.Value) = 0, "Unknown", 
    CInt(Fields!MyColumn.Value) > 0, Fields!MyColumn.Value, 
    )

Согласно комментариям под ответом @Deruijter, если выражение if (dr.ItemArray.GetValue(15).ToString() == "") работает у вас без ошибок, тогда ваши строки НЕ NULL; у вас просто есть пустые (т.е. нулевой длины) строки в вашем наборе данных. В этом случае в выражении RDLC вы бы использовали Len вместо IsNothing, Is Nothing, или CInt трюк.

Если бы значения были реальными NULL, один IsNothing проверки было достаточно.

Также помните, Or в выражениях RDLC, использующих VB .NET , НЕ происходит короткое замыкание; эквивалентное короткое замыкание or оператор в VB .NET, который работает как C# или C является OrElse оператор. (Это, кажется, не влияет на вас здесь, хотя).

Вы можете просто пойти к дизайнеру и установить:

      this.column.AllowDBNull = true;
Другие вопросы по тегам