7.5. HTML отчёт с шаблонизатором Groovy

Этот пример основан на приложении Library, исходный код которого доступен на GitHub. Создадим отчёт, который выводит список книжных публикаций для выбранного города. Формат вывода по умолчанию – HTML.

  1. Создайте отчёт с набором данных JPQL

    html groovy template structure
    Рисунок 70. Структура данных отчёта

    Полоса BookPublications выводит список публикаций путем выполнения следующего JPQL запроса:

    Набор данных BookPublications
    select
    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, однако его можно напрямую сравнивать с полями-идентификаторами сущностей, преобразование будет выполнено автоматически.

  2. Задайте параметр отчёта:

    На вкладке Parameters and Formats объявлен один внешний параметр отчёта – City:

    html groovy template parameter
    Рисунок 71. Редактор параметра

    Этот параметр запрашивается у пользователя при запуске отчёта. Выбор города производится через экран library$Town.browse, имеющийся в приложении.

  3. Создайте шаблон отчёта

    На вкладке 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 и сделайте его шаблоном по умолчанию:

    publicationsTemplate editor
    Рисунок 72. Редактор шаблона отчёта

Выполните отчёт, чтобы убедиться в его работоспособности:

publications report
Рисунок 73. Пример выполненного отчёта