5

В SSRS 2005 У меня есть таблица с привязанным к ней набором данных. Я хочу проверить, является ли значение поля нулевым, и если оно не равно нулю, тогда отформатируйте данные, чтобы убедиться, что они имеют одно десятичное место и добавляют знак% и т.д.Службы Reporting Services SQL 2005, если вы указали нулевое значение

Это мое выражение на поле/колонка:

=iif(IsNothing(Fields!COL01.Value), "" ,Format(CDbl(Trim(Replace(Fields!COL01.Value, "%", ""))), "N1") + "%") 

Это не работает, хотя когда данные являются нулевыми (он отлично работает, если есть данные). Отображается отчет, но поле отображается как #ERROR.

Я думаю, что он проверяет, действительны ли оба случая, даже если его значение равно null. Я пытаюсь использовать оператор if, чтобы избежать формирования нулевого значения.

ответ

3

Я попытался использовать ISNULL (имя поля, 0) при запросе вашего набора данных.

Если вы подключаетесь к источнику данных без оператора ISNULL (то есть Oracle), попробуйте использовать COALESCE (имя_файла, 0), которые поддерживают iSeries, oracle и sql.

+0

Спасибо, я искал, что будет работать в Oracle, но не смог найти его. – MaxGeek

+1

Oracle имеет NVL (имя столбца, 0), который работает как ISNULL(). – criticalfix

2

Попробуйте использовать IsDBNull

+0

К сожалению, это, по-видимому, не имеет значения. Даже если я это сделаю: = iif (True, «Hello World», Format (CDbl (Trim (Заменить (поля! COL01.Value, «%», «»))), «N1») + «% ") Кажется, что независимо от того, что он все еще проверяет ложный случай. Если есть данные, это показывает Hello World, но если это не показывает #ERROR. – MaxGeek

1

Вы можете проверить нуль в запросе SQL, а не на уровне отчета. Как IsNull (имя поля, 0), то просто форматируйте для%. Разумеется, ваши данные взяты из SQL Server.

+0

Спасибо, я думаю, что это правильная идея, но я фактически не использую SQL Server в качестве источника данных. Я бы упомянул об этом, но я не думал об исправлении его в моем SQL-запросе. – MaxGeek

4

Выражения SSRS оцениваются с использованием Visual Basic, который обычно выполняет полную (то есть не короткую цепь) оценку всех операндов в выражении, например. в IIf (cond, truexp, falsexp), кроме cond, оцениваются как truexp, так и falsexp и могут бросать независимо от значения cond.

Поскольку в VB.NET 2.0 не существует функции коалесцирования, вы можете добавить ее в раздел кода отчета, например. for Decimal as from Oracle

Function Coalesce(fieldValue As Object, defaultValue As Decimal) As Decimal 
    If IsDBNull(fieldValue) OrElse IsNothing(fieldValue) Then 
    Coalesce = defaultValue 
    Else 
    Coalesce = CDec(fieldValue) 
    End If 
End Function 

Можно было бы также определить общую функцию, например. Coalesce (Of TResult).

+0

Это хорошая идея. – MaxGeek

0

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

Ian

+0

Неплохо, в ssrs Я только что провел некоторое тестирование, кажется, что все утверждения также оцениваются и, следовательно, дают ошибку –