#reporting-services #ssrs-2008-r2
#службы отчетов #ssrs-2008-r2
Вопрос:
-
Я использую SSRS (2008R2) для создания большого отчета по базе данных Oracle.
-
Из-за размера отчета я хотел кэшировать общий набор данных на ночь.
-
Набор данных имеет один параметр, который по умолчанию должен иметь сегодняшнюю
дату, но может быть изменен в отчете (хотя это приведет к запуску
другого кэша).
Я боролся с этим в течение 3 дней и хотел задокументировать, как я заставил его работать, а также получить отзывы о моем подходе.
Ответ №1:
1. Oracle Datasource:
- Я обнаружил, что передача параметров в набор данных хорошо работает только для меня, используя собственные драйверы Oracle, а не драйверы OLE DB.
2. Общий набор данных:
- Я так и не смог заставить SSRS передавать параметр даты в Oracle. Поэтому в моем запросе Oracle я использовал преобразование
TO_DATE(:EffectiveDate,'YYYY-MM-DD"T"HH24:MI:SS')
(позже вы поймете, почему мне пришлось использовать формат ISO 8601). - При добавлении переменной
:EffectiveDate
в мой SQL-запрос параметр автоматически добавлялся в общий набор данных. Первоначально это вызвало ошибку OracleORA-01008: not all variables bound
. Проблема была решена путем удаления параметра dataset, а затем нажатия кнопки «обновить поля» на экране запроса набора данных, чтобы создать его заново. Единственная разница, по-видимому, заключается в том, что теперь имя параметра имеет двоеточие. - Я установил параметр dataset, как показано ниже на скриншоте:
- Параметр имеет тип «текст» и по умолчанию имеет значение сегодня в полночь в формате ISO 8601 (
=Format(Today(),"yyyy-MM-ddT::")
)
3. Набор данных отчета:
- Набор данных отчета использует указанный выше общий набор данных, а также имеет параметр dataset. В этом случае я хочу, чтобы параметр набора данных отчета принимал дату из параметра отчета, но передавал строку в параметр общего набора данных, как показано ниже:
- Для параметра Dataset устанавливается значение
=Format(Parameters!EffectiveDate.Value,"yyyy-MM-ddT::")
4. Параметр отчета:
- Для параметра отчета задается тип «дата», как показано ниже, по умолчанию
=Today()
:
5. Кэширование общего набора данных:
- Сначала я настроил общий набор данных на использование кэшированных данных (на сервере отчетов через ваш браузер):
- Затем я настроил «План обновления кэша»:
- План обновления кэша кажется очень требовательным к формату параметров, и именно этот последний шаг, похоже, работает только при передаче дат в виде строк, совместимых с ISO 8601.
6. Примечания:
:EffectiveDate
это имя моей переменной привязки строки Oracle иEffectiveDate
имя моего параметра отчета. Измените свой код соответствующим образом.- Меня интересовала только дата (т. Е. Не Время). Если вам также нужно время, вам может потребоваться внести некоторые изменения.
- Чтобы конечный пользователь знал, сколько лет данным, я добавил дополнительный столбец
,SYSDATE AS DATA_AGE
в свой SQL-запрос. Затем я смог указать возраст данных в заголовке моего отчета с помощьюFirst(Fields!Report_Date.Value, "<report_dataset_name")
- Я могу создавать моментальные снимки отчета, но все запросы отображаются серым цветом, хотя все остальные запросы влияют только на фильтрацию отчетов.
- Чтобы иметь разные значения по умолчанию в моих моментальных снимках, я использовал тест
IsNothing(User!UserID)
. Я хотел бы знать, есть ли лучший способ. - Мой пример не обязательно в том порядке, в котором я настраивал (т. Е. Я ссылаюсь на параметр отчета, прежде чем показывать его настройку).