2014-11-10 2 views
0

У меня есть отчет, выводящий в файл Excel, причем некоторые поля в базе данных пусты.SSRS Iif всегда верно, когда ложная часть содержит выражение

Я пытаюсь фильтровать эти нулевые значения, используя следующее выражение IIF в клетке:

=Iif(
    IsNothing(Fields!START_DATETIME.Value), 
    0, 
    Fields!START_DATETIME.Value 
) 

Это не работает, я получаю «#VALUE» в клетках, где данные нулевой, и значение времени ячейки, где были данные.

Если я использую такое же выражение без выражения в качестве третьего параметра:

=Iif(
    IsNothing(Fields!START_DATETIME.Value), 
    0, 
    1 
) 

Я получаю 1 где S Eсть дата в таблице и 0 с, где нет ничего.

Я сожалею, если это дубликат, я не мог найти ничего, что работал для меня ...

Edit: Я использую VisualStudio Professional 2013

Update

Что у меня есть для каждой записи в базе данных: datetime для время авторизации, другое для время начала и другое для остановлено время. Всегда есть запись для время авторизации, но не всегда для начало и остановлено.

Я расколоть дату и время из различных DateTimes в столбцы так:

  • Авторизованный Дата
  • Авторизованный время
  • Время начала
  • Время остановки

Идея состоит в том, что если время начала и остановки отсутствует, просто используйте авторизованное время

В столбце «Время начала» помещаются следующие выражения. Извините, мне не хватает репутации для отправки изображений или более двух ссылок. Я поставил вывод программы в этом альбоме:

http://imgur.com/a/zJSAY

Выполнение:

=Iif(Fields!START_DATETIME.Value is Nothing, 
    DateAdd(DateInterval.Day,693594,TimeValue(Fields!AUTH_DATETIME.Value)), 
    DateAdd(DateInterval.Day,693594,TimeValue(Fields!AUTH_DATETIME.Value)) 
) 

Выдает уполномочил время, так что работает отлично.

Однако делать:

=Iif(Fields!START_DATETIME.Value is Nothing, 
    DateAdd(DateInterval.Day,693594,TimeValue(Fields!AUTH_DATETIME.Value)), 
    DateAdd(DateInterval.Day,693594,TimeValue(Fields!START_DATETIME.Value)) 
) 

Выходы времяначало, где есть запись, и #VALUE!(нуль или некоторые такие), когда нет ничего.

И делает:

=Iif(Fields!START_DATETIME.Value is Nothing, 
    DateAdd(DateInterval.Day,693594,TimeValue(Fields!START_DATETIME.Value)), 
    DateAdd(DateInterval.Day,693594,TimeValue(Fields!AUTH_DATETIME.Value)) 
) 

Выдает уполномочил время где есть запись в время начала и #value! когда нет ничего.

Я не могу понять это. Я понимаю (1) и (3), но мне нужно, чтобы (2) отображалось правильное время начала , хотя есть одно, и авторизованного времени, когда его нет.

Update 2

Оказывается, что IIF() оценивает каждое условие, даже если он не выбран, и любая ошибка, обнаруженная передается независимо. См комментарии к Why isn't my iif statement evaluating true when the condition is correct?

Чтобы исправить это я сделал:

=DateAdd(
    DateInterval.Day, 
    693594, 
    TimeValue(
     Iif(
      Fields!START_DATETIME.Value is Nothing, 
      Fields!AUTH_DATETIME.Value, 
      Fields!START_DATETIME.Value 
     ) 
    ) 
) 

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

Еще раз спасибо за помощь.

+1

Почему вы хотите «0» в столбце с DATETIME? Что это будет представлять? Вам не нужно ни NULL, ни пустая строка, ни какое-то время по умолчанию? – Jeroen

+0

Если вы хотите отфильтровать их, как в «не показывать их», не можете ли вы сделать это в своем запросе? –

+0

@Jeroen Все, кроме #VALUE! было бы неплохо, это было просто попробовать, я бы, вероятно, оставил его пустым. – user111395

ответ

1

Excel будет Предполагает тип столбца, основанного на первых нескольких ячейках. Если в них есть типичные значения DATETIME, он предположит, что столбец является столбцом даты, и он будет ошибочен с «#VALUE! по значениям, которые не соответствуют типу, например« 0 ».

Вы должны задать себе вопрос что вы хотите отобразить в Excel для значений NULL:.

  • Если вы просто хотите пустую ячейку, не используют выражение вообще Просто Fields!START_DATETIME.Value воздаст значение NULL в качестве пустой ячейки
  • Если. вы хотите «базовый» datetime, убедитесь, что используете это вместо «0». Самый легкий, вероятно, в вашем запросе с чем-то вроде ISNULL(START_DATETIME, GETDATE()).
  • Если вы действительно хотите «0», убедитесь, что он отображается в одной из первых нескольких ячеек при заказе. Excel увидит «0» и не будет устанавливать тип столбца на дату/время.
+0

Спасибо, что сработало отлично. Не могу поверить, что я об этом не думал. Какая измельченная я ... Извините, я не могу упрекать, у меня слишком мало репутации. – user111395

+0

Я не могу заставить его просто пустую ячейку. Любая идея, как Excel хранит пробел? '#Value!' Помещается там, когда используется 'Nothing' (null) как истинная часть выражения Iif(). – user111395

+0

@ user111395 Вам не нужен 'IIF', когда' START_DATETIME' является 'Null', потому что его уже« Null », так как @Jeroen говорит, просто используйте' = Fields! START_DATETIME.Value' как выражение для выражения вашей ячейки.+1 @ Jeroen за отличное объяснение. –

Смежные вопросы