Построитель отчетов SQL Server — значение TransactionDate некорректно отображается большим, чем значение EndDate

#sql-server #reporting-services

#sql-сервер #службы отчетов

Вопрос:

У меня есть значение, TransactionDate которое извлекается из набора данных, и значение endDate , которое создается в качестве параметра после выбора пользователем.

Примерно для 98% всех строк моего отчета соответственно отображается правильный результат, но у меня есть несколько строк, которые не возвращают данные надлежащим образом, как предполагалось, и это потому, что построитель отчетов определяет, что некоторые данные TransactionDates больше, чем endDate .

Параметр уже установлен в вычисляемое поле -> FormatDateTime(Parameters!endDate.Value,DateFormat.ShortDate)

Я использую инструкцию, которая показывает мне результаты, которые я просматриваю, чтобы понять, что работает, а что нет, это:

 =IIF((Fields!endDateCalc.Value >= Fields!TransactionDateCalc.Value), Fields!UnitSales.Value, "N/A")
  

По сути, я обеспокоен пониманием того, почему это может происходить / что я делаю, чтобы это произошло.

Я, конечно, изменил использованную формулу, которая показывает мне результаты, которые я ищу, и изменил ее, чтобы увидеть, реагирует ли строка, и это происходит. (Просто переключаем >= на <= .

Например, мы можем сказать, что TransactionDate есть 3/4/2019 и endDate является 3/25/2019 . Для этой строки оно вернет неверный результат и будет представлено как N/A . Это должно возвращать правильное UnitSales значение для этой строки, но, как указано, этого не происходит.

В то время как если бы TransactionDate было 3/12/2019 и endDate все еще 3/25/2019 было, это вернуло бы правильное UnitSales значение.

Пожалуйста, дайте мне знать, если потребуется какая-либо другая информация.

Комментарии:

1. Похоже, ваша логика сравнивает строки, не так ли? Итак, каковы типы данных этих столбцов?

Ответ №1:

Я думаю, что при сравнении используется 3/4/2019 и по какой-то причине берется 4 и сравнивается с 2 в endDate . Я бы предложил изменить сравнение на что-то вроде следующего выражения.

   =IIF((Year(CDate(Fields!endDate.Value)) >= Year(CDate(Fields!TransactionDate.Value))) 
     AND DatePart(DateInterval.DayOfYear, CDate(Fields!endDate.Value)) >= DatePart(DateInterval.DayOfYear, CDate(Fields!TransactionDate.Value)),
     Fields!UnitSales.Value, "N/A")
  

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

Комментарии:

1. Это возвращает правильный результат, как и предполагалось для приведенных выше примеров, однако, если TransactionDate гипотетически равен 26/22/2019, то в качестве значения выражения будет возвращено «N / A».

2. @AlC. И какова конечная дата для этого гипотетического?

3. То же самое, 25.03.2019

4. @AlC. Я думаю, вам нужно будет включить CDate вокруг ваших полей в это выражение, чтобы заставить его работать. Во время тестирования я вижу, что 2/26/2019 возвращает 57 для DayOfYear и 3/26/2019 возвращает 84. Я редактирую свой ответ с соответствующими изменениями.

5. Похоже, что с моей стороны все еще возвращается неверный результат («N / A») для: TransactionDate = 26/22/2019 и EndDate = 25/23/2019 при использовании приведенного выше выражения даже с добавленным обновлением CDate.