7.5. HTML отчёт с шаблонизатором Groovy
Этот пример основан на приложении Library, исходный код которого доступен на GitHub. Создадим отчёт, который выводит список книжных публикаций для выбранного города. Формат вывода по умолчанию – HTML.
-
Создайте отчёт с набором данных JPQL
Рисунок 70. Структура данных отчётаПолоса
BookPublications
выводит список публикаций путем выполнения следующего JPQL запроса:Набор данных BookPublicationsselect book.name as "book", publisher.name as "publisher" from library$BookPublication e left join e.book book left join e.publisher publisher where e.town.id = ${city}
В запросе используется внешний параметр отчёта –
city
. Параметр имеет тип Entity, однако его можно напрямую сравнивать с полями-идентификаторами сущностей, преобразование будет выполнено автоматически. -
Задайте параметр отчёта:
На вкладке Parameters and Formats объявлен один внешний параметр отчёта –
City
:Рисунок 71. Редактор параметраЭтот параметр запрашивается у пользователя при запуске отчёта. Выбор города производится через экран
library$Town.browse
, имеющийся в приложении. -
Создайте шаблон отчёта
На вкладке Templates определен один шаблон формата HTML, сгенерированный по умолчанию с тэгами FreeMarker.
Создайте новый файл HTML со следующим содержимым:
PublicationsTemplate<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru"> <head> <title> Publications by city </title> <style type="text/css"> body {font: 12pt Georgia, "Times New Roman", Times, serif; line-height: 1.3; padding-top: 30px;} tbody tr {height:40px; min-height:20px} </style> </head> <body> <h1>Publications, published in <% out << "${Root.fields.city.name}"%></h1> <% def bookPublications = Root.bands.BookPublications.fields %> <table class="report-table" border="1" cellspacing="2" > <thead> <tr> <th>Book</th> <th>Publisher</th> </tr> </thead> <tbody> <% bookPublications.title.eachWithIndex{elem, index -> out << "<tr><td> ${bookPublications.book[index]} </td><td> ${bookPublications.publisher[index]} </td></tr>"}%> </tbody> </table> </body> </html>
Для формирования заголовка отчёта используется значение входного параметра:
${Root.fields.city.name}
.Ниже определена переменная
bookPublications
:<% def bookPublications = Root.bands.BookPublications.fields %>
Эта переменная используется в теле таблицы для вывода полей отчёта.
<% bookPublications.title.eachWithIndex{elem, index -> out << "<tr><td> ${bookPublications.book[index]} </td><td> ${bookPublications.publisher[index]} </td></tr>"}%>
Загрузите новый шаблон в приложение, выбрав формат вывода HTML, установите переключатель Template type в значение Groovy template и сделайте его шаблоном по умолчанию:
Рисунок 72. Редактор шаблона отчёта
Выполните отчёт, чтобы убедиться в его работоспособности: