#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.