Есть ли способ внедрить запросы отчетов для отчетов BIRT. Нам нужно поддерживать несколько механизмов баз данных, поэтому наши запросы различаются в зависимости от базовой базы данных. Я хотел бы использовать параметр конфигурации, чтобы сообщить отчету BIRT об использовании определенного файла запроса.
Экстернализация запросов BIRT
Ответы (2)
Что вы можете. Если вы запрограммируете код Javascript в самом отчете, он сможет получить доступ к файлам на диске для получения текстовых запросов и изменить запрос перед его выполнением.
Событие, для которого нужно закодировать, — beforeOpen
в источнике данных. На самом деле мы используем это для подстановочных знаков, определяя, установлено ли для них значение "*"
, и динамически корректируя SQL-запрос, изменяя его с:
select A from B where C = ?
to:
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 набора данных.
Как насчет размещения одной и той же хранимой процедуры в каждой БД? Затем вы можете параметризовать информацию о подключении к данным (на странице «Редактировать» для источника данных отчета) и динамически направлять отчет для запроса определенного источника данных. Пока хранимый процесс есть во всех экземплярах, вы получите правильные данные из правильного источника.