Начало работы с Reports

Данный раздел содержит инструкции по использованию мастера отчетов и редактора отчетов. Для удобства работы дополнение Reports поставляется с мастером – визуальным инструментом для быстрого создания отчетов, включая структуру данных и дизайн шаблонов.

Приводимые в этом разделе примеры основаны на приложении Library, исходный код которого доступен на GitHub.

Настройка проекта

  1. Загрузите и распакуйте исходный репозиторий приложения Jmix samples или клонируйте его с помощью git:

    git clone https://github.com/jmix-framework/jmix-samples
  2. Откройте проект jmix-samples, как описано в разделе Открытие существующего проекта.

  3. Выберите конфигурацию Reports-sample Jmix Application и запустите приложение, как описано в Запуск приложения.

  4. Войдите в приложение Library, указав имя пользователя и пароль admin / admin.

Чтобы запустить мастер, откройте Браузер отчетов и нажмите CreateUsing wizard.

reports wizard main

С помощью мастера можно создать три типа отчетов:

  1. Отчет для одной сущности.

  2. Отчет для списка заданных сущностей.

  3. Отчет для списка сущностей, отфильтрованных по запросу.

Разработка отчета – это трехэтапный процесс:

  1. Создание структуры данных отчета.

  2. Редактирование областей отчета.

  3. Сохранение отчета.

Созданный отчет можно изменить обычным способом с помощью редактора отчетов и запустить через общий браузер отчетов или с помощью специальных действий (ListPrintFormAction, EditorPrintFormAction и т.д.).

Создание отчетов с помощью мастера

Сначала рассмотрим, как сгенерировать отчет с записями об авторах для данной книги Book. В нем будет содержаться обзор основных данных и авторов этой книги.

В этом случае шаблоном документа будет документ Word. Однако целевым документом будет PDF-файл. Отчет будет иметь следующие настройки по умолчанию:

  • Сущность отчета: Book (jmxrpr_Book).

  • Тип шаблона: DOCX.

  • Имя отчета: Book Record.

  • Тип отчета: Report for single entity.

single entity step 1

Определение атрибутов

Укажите атрибуты сущности Book и связанной сущности LiteratureType, которые должны быть отражены в отчете: Book.Name, Book.Summary, Book.Literature type.Name. Эти атрибуты образуют так называемую "простую область".

Нажмите OK, чтобы перейти ко второму этапу – редактированию областей отчета.

Появившийся экран содержит список именованных областей – полос, в которых отображаются связанные данные. Мастер позволяет добавить в шаблон несколько областей обычного текста для отображения различных наборов данных.

Набор атрибутов сущности, загруженных в определенную область, можно изменить, щелкнув по ссылке, представленной в виде списка выбранных атрибутов. Также новую область можно добавить кнопкой Add simple region.

Если сущность содержит атрибуты коллекции, появится кнопка Add tabulated region. Это позволяет добавить область для отображения табличных данных.

Итак, чтобы отобразить список связанных авторов данной сущности Book, мы создадим еще одну полосу данных. Нажмите на кнопку Add tabulated region.

single entity step 2

Выберите атрибуты Book.Authors.First name и Book.Authors.Last name.

Когда все области отчета настроены, можно переходить к третьему этапу: сохранению отчета. На этом этапе вы можете просмотреть полный шаблон отчета или изменить имя и формат выходного файла на один из доступных типов. Выберите тип вывода отчета в формате PDF.

После нажатия кнопки Save откроется стандартный редактор отчетов для точной настройки обычным способом.

Настройка выходного документа

Выходной документ для этого отчета содержит один шаблон, изначально определенный с помощью мастера создания отчетов. Тип вывода – PDF, в то время как файл шаблона – DOCX.

configure template

Нажмите на имя файла шаблона и откройте его в, например, LibreOffice. Измените содержимое шаблона в соответствии со скриншотом:

edit template for report1

Шаблоны отчетов можно найти в демонстрационном проекте в разделе reports/templates.

Также можно определить имя файла выходного документа. Оно может быть либо статическим, либо настроенным программно.

В нашем случае имя файла для книги с названием "The 20th Century Art Book" должно выглядеть следующим образом: Book Record - The 20th Century Art Book.pdf.

Для этого мы можем настроить шаблон, который ссылается на определенную полосу: ${Root.title}.pdf.

Root.title ссылается на значение title полосы данных Root. Набор данных на основе groovy определит значение атрибута title следующим образом:

def bookName = params["entity"]["name"] (1)

return [
    ["title" : "Book Record - $bookName"] (2)
]
1 Переменная params предоставляет доступ к различным внешним параметрам. params["entity"] ссылается на выбранный экземпляр книги.
2 Список Maps должен быть возвращен из этого скрипта groovy. Под ключом title он поместит имя целевого файла.

Результат использования набора данных на основе groovy выглядит следующим образом:

title band for report1

Запуск отчета с экрана

Запуск отчета можно включить в браузере Book. Для этого мы объявим стандарт ListPrintFormAction в дескриптор экрана book-browse.xml:

<actions>
    ...
    <action id="listPrintForm"
            type="listPrintForm"
            caption="Print details"/> (1)
    ...
</actions>
...
<buttonsPanel id="buttonsPanel" alwaysVisible="true">
    ...
    <button id="printBtn" action="booksTable.listPrintForm"/> (2)
    ...
</buttonsPanel>
1 Атрибут type определяет конкретный тип действия listPrintForm.
2 Добавляет кнопку с действием "Запустить отчет".

Затем мы должны связать наш отчет с браузером Book. Откройте редактор отчетов, перейдите на вкладку Roles and Screens и добавьте экран Book.browse из выпадающего списка в таблицу ниже:

single entity screens

Теперь вы можете запустить отчет для любой книги, просто выбрав ее в таблице и нажав кнопку Print details.

single entity running

Результат выглядит следующим образом:

single entity result

Создание отчета вручную

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

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

Отчет будет иметь следующие настройки по умолчанию:

  • Тип шаблона: XLSX.

  • Название отчета: Publications grouped by types and books.

  • Тип отчета: ручной, созданный с помощью редактора отчетов.

Создание шаблона

Создайте шаиблон Template for publications by type.xlsx для отчета с помощью Microsoft Office или LibreOffice.

template for report2

Этот шаблон отчета содержит именованные области (type, book, publisher) для трех наборов данных зависимых полос и, дополнительно, именованные области для заголовка столбца (tableheader) и для дополнительной информации об отчете (header).

Шаблоны отчетов можно найти в демонстрационном проекте в разделе under reports/templates.

Определение структуры отчета

Создайте отчет, используя всплывающую кнопку New.

Откроется вкладка Report structure редактора отчетов.

Определите название отчета – Publications grouped by types and books.

structure for report2

Нажмите на кнопку Create template button.

Откроется диалоговое окно Template editor. Загрузите созданный шаблон и определите шаблон выходного имени.

upload template for report2

Теперь создадим полосы отчета.

  • header содержит набор данных со скриптом Groovy, который выводит имя текущего пользователя и текущую дату.

    import io.jmix.core.security.CurrentAuthentication;
    import io.jmix.core.TimeSource;
    
    def user = currentAuthentication.getUser().getUsername();
    def currentDate = timeSource.currentTimestamp();
    
    return [["generated_by":user, "generated_when":currentDate]]
  • tableheader пуст. Используется для отображения заголовка таблицы.

  • type выводит список типов литературы, выполнив следующий запрос JPQL:

    select b.literatureType.id as typeId,
    b.literatureType.name as type
    from jmxrpr_Book b
  • book является дочерним по отношению к type. Выводит книги, выполнив следующий запрос JPQL:

    select b.id as bookId,
    b.name as bookName
    from jmxrpr_Book b
    where b.literatureType.id = ${type.typeId}

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

  • publisher является дочерним по отношению к book. Выводит данные о публикации книг, выполнив следующий запрос JPQL:

    select bp.publisher.name as publisher,
    bp.year as year,
    bp.town as town
    from jmxrpr_BookPublication bp
    where bp.book.id = ${book.bookId}

    Этот запрос использует родительское поле полосы BookID в качестве параметра.

В редакторе отчет выглядит следующим образом:

report structure report2

Как только отчет сохранен, вы можете запустить его через общий браузер отчетов.

Результат выглядит следующим образом:

output report2