Экстернализировать запросы BIRT
Вопрос
Есть ли способ экстернализировать запросы отчетов для отчетов BIRT?Нам необходимо поддерживать несколько ядер баз данных, и поэтому наши запросы различаются в зависимости от базовой базы данных.Я хотел бы использовать параметр конфигурации, чтобы указать BIRT report использовать определенный файл запроса
Решение
Конечно, ты можешь.Если вы закодируете некоторый Javascript в самом отчете, он сможет получить доступ к файлам на диске для извлечения текстовых запросов и измените запрос перед его выполнением.
Событие, для которого вам нужно закодировать, это beforeOpen
об источнике данных.На самом деле мы используем это для подстановочных параметров, определяя, установлены ли они в "*"
и динамически настраивает SQL-запрос, изменяя его с:
select A from B where C = ?
Для:
select A from B where ((C = ?) or (1==1))
Уродливая модификация предназначена только для того, чтобы нам не нужно было беспокоиться об изменении позиционных параметров.
Вы можете прочитать строку из файла на диске и изменить запрос чем-то вроде:
try {
var fip0 = new Packages.java.io.FileInputStream("/query.txt");
try {
var fip1 = new Packages.java.io.DataInputStream(fip0);
try {
queryText = fip1.readLine() + "";
} catch(e1) {}
fip1.close();
} catch(e2) {}
fip0.close();
} catch(e3) {}
хотя у вас, вероятно, должна быть лучшая проверка ошибок, чем эта :-) Я удалил ее, поскольку она (1) несколько большая;и (2) несколько проприетарный.
Другие советы
Я не знаю способа сделать это из коробки.Вероятно, вы могли бы придумать какой-нибудь довольно сложный сценарий для запуска при событии onLoad набора данных.
Как насчет размещения одной и той же хранимой процедуры в каждой базе данных?Затем вы можете параметризовать информацию о подключении к данным (на странице Редактирования источника данных отчета) и динамически направлять свой отчет на запрос к определенному источнику данных.Пока сохраненная процедура находится во всех экземплярах, вы будете получать правильные данные из правильного источника.