JasperReports – популярное средство генерации отчетов. Для генерации отчетов используются шаблоны в XML-формате с расширением *.JRXML. Предварительно файл шаблона конвертируется в Java-код, который и используется для генерации отчета.
Это обстоятельство может быть использовано для разработки довольно сложных вычислений внутри отчета.
В этом нам помогут переменные (тег variable), которые позволяют использовать не только текущие значения полей и переменных, но и значения из предыдущей итерации.
Допустим у нас есть subDataset Persons с полем Name:
Посчитаем все имена, начинающиеся на «А»:
Перед началом итераций по набору данных, переменной присваивается значение, заданное в теге initialValueExpression.
Затем, при расчете нового значения переменной, используется значение, рассчитанное на предыдущей итерации.
Соберем все имена в строку через запятую:
Здесь на любой итерации мы имеем дело с одним и тем-же объектом, созданным в initialValueExpression. На каждой итерации в конец буфера добавляется новое имя.
Чтобы извлечь результаты расчетов используем тег returnValue:
В основной отчет добавлены переменные того же типа и дополнительным атрибутом calculation=«System».
Теперь, после datasetRun, переменные AstartingCount и NamesText будут содержать вычисленные ранее значения.
Красивых отчётов!
Это обстоятельство может быть использовано для разработки довольно сложных вычислений внутри отчета.
В этом нам помогут переменные (тег 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 будут содержать вычисленные ранее значения.
Красивых отчётов!