Отчет 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;