Как стать автором
Поиск
Написать публикацию
Обновить

Нетривиальные приемы в JasperReports

JasperReports – популярное средство генерации отчетов. Для генерации отчетов используются шаблоны в XML-формате с расширением *.JRXML. Предварительно файл шаблона конвертируется в Java-код, который и используется для генерации отчета.

Это обстоятельство может быть использовано для разработки довольно сложных вычислений внутри отчета.

В этом нам помогут переменные (тег variable), которые позволяют использовать не только текущие значения полей и переменных, но и значения из предыдущей итерации.

Допустим у нас есть subDataset Persons с полем Name:

<subDataset name="Persons">
	...
	<field name="Name"/>
	...
</subDataset>

Умный счетчик


Посчитаем все имена, начинающиеся на «А»:

<subDataset name="Persons">
	...
	<field name="Name"/>
	...
	<variable name="AstartingCount" class="java.lang.Integer">
		<variableExpression><![CDATA[
			$F{Name}.startsWith("А") ?
				$V{AstartingCount}+1 : $V{AstartingCount}
		]]></variableExpression>
		<initialValueExpression><![CDATA[0]]></initialValueExpression>
	</variable>
	...
</subDataset>

Перед началом итераций по набору данных, переменной присваивается значение, заданное в теге initialValueExpression.

Затем, при расчете нового значения переменной, используется значение, рассчитанное на предыдущей итерации.

Переменная типа StringBuilder


Соберем все имена в строку через запятую:

<subDataset name="Persons">
	...
	<field name="Name"/>
	...
	<variable name="NamesText" class="java.lang.StringBuilder">
		<variableExpression><![CDATA[
			$V{NamesText}.length()<1 ?
				$V{NamesText}.append($F{Name})
			:
				$V{NamesText}.append(", ").append($F{Name})
		]]></variableExpression>
		<initialValueExpression><![CDATA[
			new StringBuilder()
		]]></initialValueExpression>
	</variable>
	...
</subDataset>

Здесь на любой итерации мы имеем дело с одним и тем-же объектом, созданным в initialValueExpression. На каждой итерации в конец буфера добавляется новое имя.

Извлечь результат


Чтобы извлечь результаты расчетов используем тег returnValue:

<subDataset name="Persons">
	...
	<field name="Name"/>
	...
	<variable name="AstartingCount" class="java.lang.Integer">
		...
	</variable>
	<variable name="NamesText" class="java.lang.StringBuilder">
		...
	</variable>
	...
</subDataset>
...
<variable name="AstartingCount" class="java.lang.Integer" calculation="System"/>
<variable name="NamesText" class="java.lang.StringBuilder" calculation="System"/>
...
	<datasetRun subDataset="Persons">
		...
		<returnValue fromVariable="AstartingCount" toVariable="AstartingCount"/>
 		<returnValue fromVariable="NamesText" toVariable="NamesText"/>
		...
	</datasetRun>
...

В основной отчет добавлены переменные того же типа и дополнительным атрибутом calculation=«System».

Теперь, после datasetRun, переменные AstartingCount и NamesText будут содержать вычисленные ранее значения.

Красивых отчётов!
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.