четверг, 20 декабря 2012 г.

JasperReport в Adempiere: добавляем динамики в отчет с помощью scriptlet

Механизм JasperReport позволяет подключать внешние классы java для генерации контента отчета. Конечно, полностью изменить структуру страницы, заданной в jrxml файле, мы не можем. Однако возможность влиять на наполнение отчета данными все-равно очень сильно увеличивает  динамичость.

Эти классы называются скриптлетами. В этой статье я покажу как сделать простой скриптлет.

Предположим у нас уже есть проект с исходниками adempiere. Нам он понадобиться только для того, чтобы брать из него классы jasper. Создадим новый проект и назовем его "scriptlets". Сразу сделаем пустой класс "org.anteastra.SampleScriptlet".


код класса:

package org.anteastra; import net.sf.jasperreports.engine.JRDefaultScriptlet; import net.sf.jasperreports.engine.JRScriptletException; public class SampleScriptlet extends JRDefaultScriptlet{ public String getSampleString(String input) throws JRScriptletException{ java.util.Date date= new java.util.Date(); String answer = "This is sample generated string for "+ input +". CurrentTime is "+date.getTime(); return answer; } public static void main(String arg[]){ SampleScriptlet ss= new SampleScriptlet(); String test = null; try { test = ss.getSampleString("Jerry"); } catch (JRScriptletException e) { e.printStackTrace(); } System.out.println(test); } }

Как видно, он унаследован от JRDefaultScriptlet. Метод main сделан только для тестовых целей, он не обязателен. Метод getSampleString будет вызываться прямо во время выполнения отчета. Указать, что он может выбросить исключение JRScriptletException - обязательно.

Для того, чтобы классы JRDefaultScriptlet, JRScriptletException  были найдены проектом scriptlets, добавим в Java build path проект с исходниками Adempiere.


Скомпилированный класс разместим в customization.jar нашего %ADEMPIERE_HOME%



Не забудьте запустить silent_setup и можете запускать сервер.

Теперь пришла очередь изменить наш отчет. Создадим экземпляр скриптлета.



Для того, чтобы мы могли протестировать наш отчет в iReport добавим в classpath наш customization.jar


Теперь добавим в отчет пару новых полей.



Как видно, в редакторе выражения можно увидеть методы скриптлета. Однако, они появляются не сразу после создания скриптлета в отчете, а после повторного открытия. Видимо, определение методов происходит только на стадии загрузки файла jrxml.



$P{sampleScriptlet_SCRIPTLET}.getSampleString( $F{name} )

Мы передаем скриптлету поле "name" текущей строки из таблицы, и нам должна вернуться сгенерированная строка. Проверим, что получилось, в iReport.


И что выводит  Adempiere.



Комментариев нет:

Отправить комментарий