Динамическая строка запроса в JRXML

Я пытаюсь создать отчет, который был бы достаточно умен, чтобы немного изменить свой sql-запрос на основе какого-то входного параметра.

Например, если это специальное значение параметра модификации равно «1», оно добавляет поле в выбор и добавляет предложение group by в запрос.

Я просмотрел выражения Java, но они, похоже, не поддерживаются в теге queryString файла jrxml. Также попытался создать переменную, содержащую выражение java, и использовать эту переменную в теге queryString... Это тоже не сработало!

Прямо сейчас я думаю о том, может быть, у меня есть хранимая процедура со всей этой логикой и просто есть jrxml, вызывающий эту хранимую процедуру с модифицирующим входным параметром, но проект, над которым я работаю, похоже, не имеет большого количества сохраненных proc, поэтому я хотел бы посмотреть, есть ли другие решения, прежде чем я пойду по этому пути.

Спасибо за вашу помощь.


Спасибо ребята за помощь, очень признателен. Однако я нашел другой способ сделать это и разместил его для информации: здесь


person Lancelot    schedule 16.03.2009    source источник


Ответы (3)


JasperDesign фактически позволяет вам изменять части вашего документа jrxml. Итак, скажем, у вас есть пакет «отчеты», в котором вы храните свой отчет, созданный либо вручную, либо с помощью такого инструмента, как iReport. Пока ваш запрос определен в теге <queryString>, будет работать следующее, что позволит вам изменять запрос на лету:

try {
    String fileName = getClass().getClassLoader().getResource("com/foo/myproject/reports/TestReport.jrxml").getFile();
    File theFile = new File(fileName);
    JasperDesign jasperDesign = JRXmlLoader.load(theFile);

    //Build a new query
    String theQuery = "SLECT * FROM myTable WHERE ...";

    // update the data query
    JRDesignQuery newQuery = new JRDesignQuery();
    newQuery.setText(theQuery);
    jasperDesign.setQuery(newQuery);

    JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
    Connection conn = MyDatabaseClass.getConnection();
    JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, conn);
    JasperViewer.viewReport(jasperPrint);
} catch (Exception ex) {
    String connectMsg = "Could not create the report " + ex.getMessage() + " " + ex.getLocalizedMessage();
    System.out.println(connectMsg);
}

С помощью чего-то подобного вы можете создать переменную-член вашего класса, которая содержит новый запрос, и построить его с любыми ограничениями пользователя. Затем во время просмотра просто измените дизайн.

-Джефф

person Community    schedule 27.03.2009
comment
на самом деле я искал что-то другое, но этот ваш пост мне очень помог, спасибо - person black sensei; 06.01.2010
comment
Просто решил добавить, что вы также можете получить исходный запрос (если это тот, который вы хотите обновить), выполнив jasperDesign.getQuery().getText(); - person Jacob Schoen; 12.05.2011

JasperDesign помог мне решить проблему построения динамического запроса к файлу Jrxml.

Для создания динамического SQL я использовал Squiggle (код Google) для динамического построения SQL. Спасибо Джефф

person Dazzy    schedule 27.05.2010

Я сделал это, используя хранимые процедуры, которые отлично подходят для таких вещей. В противном случае вы можете переключиться на Java. Просто возьмите данные из базы данных и в соответствии с заданными пользователем параметрами отфильтруйте их, сгруппируйте и отправьте в виде набора bean-компонентов в отчет Jasper, который будет выполнять рендеринг.

person Boris Pavlović    schedule 17.03.2009