Има ли начин за екстернализиране на заявки за отчети за 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 на набора от данни.
Какво ще кажете за поставянето на една и съща съхранена процедура във всяка DB? След това можете да параметризирате информацията за връзката с данни (на страницата Редактиране за източника на данни за отчета) и динамично да насочите отчета си към конкретен източник на данни. Докато съхранената процедура е на всички инстанции, ще получите правилните данни от правилния източник.