JasperReportExample: различия между версиями
(не показаны 3 промежуточные версии 2 участников) | |||
Строка 25: | Строка 25: | ||
[[Image:jr_3.png]] | [[Image:jr_3.png]] | ||
Введите название отчета, например | Введите название отчета, например “processDetails” и нажмите Finish | ||
[[Image:jr_4.png]] | [[Image:jr_4.png]] | ||
Строка 91: | Строка 91: | ||
Для получения этой информации необходимо настроить источник данных. | Для получения этой информации необходимо настроить источник данных. | ||
Кликните по корневому элементу | Кликните по корневому элементу “processDetails” в панели “Outline”, справа отобразится панель с настройками. | ||
Нажмите кнопку “Edit query, filter and sort” | Нажмите кнопку “Edit query, filter and sort” | ||
Строка 101: | Строка 101: | ||
SELECT | SELECT | ||
BPM_PROCESS.ID, | |||
BPM_PROCESS_DEFINITION_PACK.NAME | |||
FROM | FROM | ||
BPM_PROCESS | BPM_PROCESS | ||
INNER JOIN | INNER JOIN | ||
BPM_PROCESS_DEFINITION | BPM_PROCESS_DEFINITION ON BPM_PROCESS.DEFINITION_ID = BPM_PROCESS_DEFINITION.ID | ||
INNER JOIN | |||
BPM_PROCESS_DEFINITION_PACK ON BPM_PROCESS_DEFINITION.PACK_ID = BPM_PROCESS_DEFINITION_PACK.ID | |||
WHERE | WHERE | ||
BPM_PROCESS.ID= $P{ProcessId} | BPM_PROCESS.ID= $P{ProcessId} | ||
Строка 160: | Строка 162: | ||
Выделите “Text field” | Выделите “Text field” заголовка и перейдите в панель Properties. Здесь можно настроить внешний вид элемента или применить стиль. | ||
В разделе Color задайте цвет текста (Forecolor) и цвет фона (Backcolor) | В разделе Color задайте цвет текста (Forecolor) и цвет фона (Backcolor) | ||
Строка 199: | Строка 201: | ||
В секцию “Texts” добавьте следующий sql запрос на получение информации о процессе по его id | В секцию “Texts” добавьте следующий sql запрос на получение информации о процессе по его id | ||
SELECT | |||
SELECT BPM_PROCESS.ID, | BPM_PROCESS.ID, | ||
BPM_PROCESS_DEFINITION_PACK.NAME, | |||
BPM_PROCESS.START_DATE, | |||
BPM_PROCESS.END_DATE, | |||
BPM_PROCESS_DEFINITION.VERSION, | |||
BPM_PROCESS.EXECUTION_STATUS | |||
FROM | FROM | ||
BPM_PROCESS | |||
INNER JOIN | INNER JOIN | ||
BPM_PROCESS_DEFINITION ON BPM_PROCESS.DEFINITION_ID = BPM_PROCESS_DEFINITION.ID | |||
INNER JOIN | |||
BPM_PROCESS_DEFINITION_PACK ON BPM_PROCESS_DEFINITION.PACK_ID = BPM_PROCESS_DEFINITION_PACK.ID | |||
WHERE | WHERE | ||
BPM_PROCESS.ID= $P{ProcessId} | |||
Добавьте возвращаемые поля, установите их тип как показано на рисунке ниже. | Добавьте возвращаемые поля, установите их тип как показано на рисунке ниже. | ||
Строка 325: | Строка 331: | ||
* Фактическая длительность | * Фактическая длительность | ||
* Осталось до окончания | * Осталось до окончания | ||
== {{Title|ActiveTasksDataSet|Источник данных}} == | == {{Title|ActiveTasksDataSet|Источник данных}} == | ||
Строка 336: | Строка 340: | ||
Используйте следующий sql запрос для получения данных об активных задачах: | Используйте следующий sql запрос для получения данных об активных задачах: | ||
SELECT | SELECT | ||
BPM_TASK.NAME as TASK_NAME, | |||
BPM_TASK.CREATE_DATE, | |||
BPM_TASK.DEADLINE_DATE, | |||
EXECUTOR.NAME as EXECUTOR_NAME, | |||
BPM_SWIMLANE.NAME as SWIMLANE_NAME | |||
FROM | FROM | ||
BPM_TASK | |||
INNER JOIN | INNER JOIN | ||
EXECUTOR ON BPM_TASK.EXECUTOR_ID = EXECUTOR.ID | |||
INNER JOIN | INNER JOIN | ||
BPM_SWIMLANE ON BPM_TASK.SWIMLANE_ID = BPM_SWIMLANE.ID | |||
WHERE | WHERE | ||
BPM_TASK.PROCESS_ID= $P{ProcessId} | |||
Добавьте возвращаемые поля TASK_NAME , CREATE_DATE, DEADLINE_DATE, EXECUTOR_NAME, | Добавьте возвращаемые поля TASK_NAME , CREATE_DATE, DEADLINE_DATE, EXECUTOR_NAME, SWIMLANE_NAME, а также параметр ProcessId | ||
[[Image:jr_37.png]] | [[Image:jr_37.png]] | ||
Строка 494: | Строка 487: | ||
* Осталось до окончания | * Осталось до окончания | ||
$P{DataFormatter}.timeMultilineFormat().interval($P{DTNow},$F{DEADLINE_DATE}) | $P{DataFormatter}.timeMultilineFormat().interval($P{DTNow},$F{DEADLINE_DATE}) | ||
[[Image:jr_56.png]] | [[Image:jr_56.png]] | ||
Для полей формата Timestamp используется DataFormatter, позволяющий преобразовать значение в единый с RunaWFE формат отображения. | Для полей формата Timestamp используется DataFormatter, позволяющий преобразовать значение в единый с RunaWFE формат отображения. | ||
С помощью метода interval(StartDate, EndDate) | С помощью метода interval(StartDate, EndDate) рассчитывается интервал между двумя заданными датами. | ||
Параметры DTNow, DataFormatter и ProcessId должны быть переданы в DataSet таблицы активных заданий. | Параметры DTNow, DataFormatter и ProcessId должны быть переданы в DataSet таблицы активных заданий. | ||
Строка 529: | Строка 518: | ||
SELECT | SELECT | ||
BPM_SWIMLANE.NAME as SWIMLANE_NAME, EXECUTOR.NAME as EXECUTOR_NAME | |||
FROM | FROM | ||
BPM_SWIMLANE | |||
INNER JOIN | INNER JOIN | ||
EXECUTOR | |||
ON | ON BPM_SWIMLANE.EXECUTOR_ID = EXECUTOR.ID | ||
WHERE | WHERE | ||
BPM_SWIMLANE.PROCESS_ID= $P{ProcessId} | |||
Строка 554: | Строка 543: | ||
[[Image:jr_61.png]] | [[Image:jr_61.png]] | ||
= {{Title|VariableTable|Таблица переменных процесса}} = | = {{Title|VariableTable|Таблица переменных процесса}} = | ||
Строка 561: | Строка 549: | ||
SELECT | SELECT | ||
BPM_VARIABLE.NAME, BPM_VARIABLE.STRINGVALUE | |||
FROM | FROM | ||
BPM_VARIABLE | |||
WHERE | WHERE | ||
PROCESS_ID= $P{ProcessId} | PROCESS_ID= $P{ProcessId} | ||
Строка 582: | Строка 570: | ||
$F{STRINGVALUE} == null ? "" : $F{STRINGVALUE} | $F{STRINGVALUE} == null ? "" : $F{STRINGVALUE} | ||
= {{Title|Footer|Область Page Footer}} = | = {{Title|Footer|Область Page Footer}} = | ||
Строка 655: | Строка 642: | ||
Пример разработанного по данному руководству отчета доступен по следующим ссылкам | Пример разработанного по данному руководству отчета доступен по следующим ссылкам | ||
[[Файл: | [[Файл:processDetails.jrxml]] | ||
[[Файл:processDetails.jasper]] | |||
Актуальные версии демо отчёта для Релиза 4.5.0 | |||
-[https://releases.runawfe.ru/releases/4.5.0/processDetails.jrxml Исходник отчёта: processDetails.jrxml] | |||
-[https://releases.runawfe.ru/releases/4.5.0/processDetails.jasper Скомпилированный отчёт: processDetails.jasper] | |||
[[Категория:Документация]] | [[Категория:Документация]] |
Текущая версия на 11:02, 4 марта 2024
Пример разработки отчета по данным экземпляра БП
Версия 4.6.0
© 2015-2023, ООО "Процессные технологии"
# Установка Jaspersoft Studio
Загрузите программное обеспечение Jaspersoft Studio (! версия 6.4.0). Для этого перейдите по ссылке и выберите инсталлятор соответствующий вашей операционной системе https://sourceforge.net/projects/jasperstudio/files/JaspersoftStudio-6.4.0/
# Шаблон отчета. Описание секций
Создадим отчет, соответствующий странице свойств запущенного экземпляра процесса
Отчет будет содержать общую информацию о процессе (имя определения, номер экземпляра, версия, когда запущен, статус), раздел активных заданий, ролей и переменных.
Откройте установленный Jaspersoft Studio и создайте новый отчет
Выберите шаблон “Blank A4” и нажмите Далее
Введите название отчета, например “processDetails” и нажмите Finish
Откроется рабочая область Jaspersoft Studio
Выбранный ранее шаблон “Blank A4” содержит следующие секции
- “Title” – заголовок отчета, отображается только на первой странице
- “Page Header” – секция, которая отображается на каждой странице
- “Column Header” – отображение в начале столбца отчета. Не будем использовать данную секцию, кликните по ней левой клавишей мыши и нажмите клавишу Delete.
- “Detail” – отображается для каждой записи в источнике данных.
- “Column Footer” – секция для отображения данных в конце столбца отчета. Не будет использоваться, удалите ее.
- “Page Footer” – секция для отображения данных внизу каждой страницы.
Добавьте в отчет еще две секции Detail. Для этого кликните правой клавишей мыши по разделу Detail и выберите пункт “Add detail band”
Сохраните отчет (используйте комбинацию клавиш Ctrl+S или соответствующую иконку панели инструментов)
# Работа над заголовком отчета
В качестве входного параметра для формирования отчета будет использоваться Id экземпляра БП.
Перейдите в раздел “Parameters” и создайте новый параметр
В “Properties” введите название параметра – “ProcessId”
Id экземпляра БП это целочисленное значение, поэтому в качестве типа задайте “java.lang.Long”
Перейдите в палитру элементов и перетащите “Text field” в секцию заголовка (Title)
“Text field” – элемент для отображения строки формирующейся динамически
# Источник данных
Отобразим в заголовке: ID экземпляра процесса и имя его определения.
Для получения этой информации необходимо настроить источник данных.
Кликните по корневому элементу “processDetails” в панели “Outline”, справа отобразится панель с настройками.
Нажмите кнопку “Edit query, filter and sort”
SQL запрос для получения имени определения процесса по id экземпляра БП выглядит следующим образом:
SELECT BPM_PROCESS.ID, BPM_PROCESS_DEFINITION_PACK.NAME FROM BPM_PROCESS INNER JOIN BPM_PROCESS_DEFINITION ON BPM_PROCESS.DEFINITION_ID = BPM_PROCESS_DEFINITION.ID INNER JOIN BPM_PROCESS_DEFINITION_PACK ON BPM_PROCESS_DEFINITION.PACK_ID = BPM_PROCESS_DEFINITION_PACK.ID WHERE BPM_PROCESS.ID= $P{ProcessId}
Добавьте этот запрос в окно “Texts”
Запрос возвращает название определения БП. Нажмите “Add” и добавьте новое поле. Введите имя – NAME, тип “java.lang.String”
Перейдите на вкладку Parameters и определите входной параметр ProcessId типа java.lang.Long
Нажмите ОК.
# Выражение для заголовка
Теперь можно использовать полученное в результате запроса поле Name в ранее добавленном элементе “Text Field” секции Title
Дважды кликните по нему мышью, откроется окно редактора выражений.
В Fields и Parameters должны присутствовать добавленные ранее поле Name и параметр ProcessId, которые можно использовать в выражении.
Введите выражение:
"Report on the process '"+ $F{NAME} + "' (id=" + $P{ProcessId}.toString() + ")"
Для добавления в выражение поля или параметра, выделите его в соответствующем списке и дважды кликните по нему мышью.
Для преобразования параметра ProcessId (типа Long) в его строковое представление, используйте метод toString()
Таким образом в заголовке отчета будет отображаться динамически сформированная строка, содержащая id процесса и имя его определения.
# Настройка стиля отображения заголовка
Выделите “Text field” заголовка и перейдите в панель Properties. Здесь можно настроить внешний вид элемента или применить стиль.
В разделе Color задайте цвет текста (Forecolor) и цвет фона (Backcolor)
Используйте шрифт “DejaVu Sans”. Это даст возможность корректно отображать кириллицу в отчетах формата pdf.
Задайте выравнивание текста и его размер.
Сохраните отчет.
# Секция детальной информации по экземпляру процесса
В секции Detail1 отобразим id, имя, дату запуска, дату завершения, версию и статус процесса.
# Источник данных
Для получения этих значений необходимо создать новый источник данных.
Перейдите в окно “Outline”, вызовите контекстное меню на корневом элементе и выберите “Create DataSet”
Дайте имя источнику – “processInfo”, создаем пустой источник (опция empty dataset)
Перейдите в настройки processInfo и нажмите “Edit query, filter and sort options”.
В секцию “Texts” добавьте следующий sql запрос на получение информации о процессе по его id
SELECT
BPM_PROCESS.ID, BPM_PROCESS_DEFINITION_PACK.NAME, BPM_PROCESS.START_DATE, BPM_PROCESS.END_DATE, BPM_PROCESS_DEFINITION.VERSION, BPM_PROCESS.EXECUTION_STATUS
FROM
BPM_PROCESS
INNER JOIN BPM_PROCESS_DEFINITION ON BPM_PROCESS.DEFINITION_ID = BPM_PROCESS_DEFINITION.ID INNER JOIN BPM_PROCESS_DEFINITION_PACK ON BPM_PROCESS_DEFINITION.PACK_ID = BPM_PROCESS_DEFINITION_PACK.ID WHERE
BPM_PROCESS.ID= $P{ProcessId}
Добавьте возвращаемые поля, установите их тип как показано на рисунке ниже.
# Элемент List
Отобразим информацию о процессе с помощью элемента List.
Для этого перейдите в палитру графических элементов, выделите List и перетащите его в секцию Detail1.
Будет предложено выбрать источник данных.
Выберите ранее созданный processInfo
Дважды кликните по добавленному List, будет открыта форма для редактирования.
Расположите на форме уже известные элементы “Static text” и “Text Field” как показано на рисунке ниже.
Дважды кликните по каждому добавленному “Static Text” и введите названия параметров процесса,
В элементы “Text Field” добавьте поля, соответствующие возвращаемым полям запроса “processInfo”
Обратите внимание на конструкции вида
$F{EXECUTION_STATUS} == null ? "" :$F{EXECUTION_STATUS}
В приведенном выше примере, выполняется проверка статуса (EXECUTION_STATUS), если значение не задано (равно NULL) то будет отображаться пустая строка “”, иначе значение статуса.
Используйте такие конструкции в полях, которые могут быть не заполнены. В данном случае это “Статус” и “Дата завершения процесса’.
В запросе processInfo присутствует входной параметр processId, его требуется передать в элемент List
Выделите List, перейдите в его параметры на вкладку DataSet и нажмите кнопку Parameters
В появившемся окне нажмите Add и выберите из списка параметр processId.
Задайте для него выражение вида
# Настройка стиля отображения
Кликните на элементе Styles, окна “Outline”, и выберите “Create Style”
Создайте два стиля:
1). PropertyName – для элементов с названиями параметров
2). PropertyValue – для элементов, отображающих значения параметров
Выделите созданный стиль и перейдите в настройки (Окно Properties).
Задайте цвет фона, выберите шрифт (используйте Deja Vu Sans) и его размер
Также можно задать отступы, выравнивание текста, границы элементов и т.д.
Далее необходимо применить созданный стиль к элементам отвечающим за вывод названия параметра и его значения в List.
Выделите элемент, перейдите в его свойства, и на вкладке “Appearance” в выпадающем списке Style выберите соответствующий стиль
Элемент List примет вид:
# Активные задачи
Выведем информацию по активным задачам процесса в виде таблицы с колонками:
- Состояние
- Роль
- Исполнитель
- Время создания
- Срок окончания
- Фактическая длительность
- Осталось до окончания
# Источник данных
Создайте новый источник данных “processTasks”
Используйте следующий sql запрос для получения данных об активных задачах:
SELECT
BPM_TASK.NAME as TASK_NAME, BPM_TASK.CREATE_DATE, BPM_TASK.DEADLINE_DATE, EXECUTOR.NAME as EXECUTOR_NAME, BPM_SWIMLANE.NAME as SWIMLANE_NAME
FROM
BPM_TASK
INNER JOIN EXECUTOR ON BPM_TASK.EXECUTOR_ID = EXECUTOR.ID INNER JOIN BPM_SWIMLANE ON BPM_TASK.SWIMLANE_ID = BPM_SWIMLANE.ID WHERE
BPM_TASK.PROCESS_ID= $P{ProcessId}
Добавьте возвращаемые поля TASK_NAME , CREATE_DATE, DEADLINE_DATE, EXECUTOR_NAME, SWIMLANE_NAME, а также параметр ProcessId
Как видно из запроса и состава возвращаемых полей, здесь отсутствуют такие данные как фактическая длительность задачи и оставшееся время до ее окончания. Эти данные являются вычисляемые исходя из текущего времени и значений полей “Дата создания задачи” (CREATE_DATE), “Срок окончания” (DEADLINE_DATE).
“Фактическая длительность” = CREATE_DATE – “Текущее время”
“Осталось до окончания” = “Текущее время” – DEADLINE_DATE
Создайте новый параметр - DTNow, который будет содержать текущее время
Используйте тип “java.util.Date”
Кликните на иконке напротив строки “Default Value Expression”
Введите код:
new Date()
Опция “Is For Prompting” не должна быть установлена, т.к. данный параметр не используется в качестве входного параметра запроса
Кроме того, для вычисления интервалов между датами, а также приведения дат к единому (с отображением в RunaWFE) формату, потребуется использование еще одного параметра DataFormatter класса ru.runa.wfe.report.ReportFormatter
Для использования класса ReportFormatter, в проект необходимо добавить библиотеку Файл:Wfe-core-4.3.0-SNAPSHOT.jar
Откройте настройки проекта
Выделите “Java Build Path” и перейдите на вкладку “Libraries”
Нажмите “Add External JARs” и выберите jar файл
Теперь создайте новый параметр с именем DataFormatter, класса ru.runa.wfe.report.ReportFormatter
Значение по умолчанию задайте в виде строки
new ru.runa.wfe.report.ReportFormatterImpl()
Вернитесь к источнику processTasks, откройте вкладку параметров, добавьте DTNow и DataFormatter
# Таблица "Активные задачи"
Добавьте из палитры графических элементов таблицу (элемент Table)
Используйте ранее созданный источник “processTasks”
Дважды кликните по таблице для переход в режим редактирования.
Поочередно выделите и удалите“Column Footer” и “Table Footer”
Создайте 8 колонок
Сгруппируйте колонки в заголовке и растяните полученную таблицу на всю область
Расположите элементы “Static text” и введите названия колонок
В колонках для значений расположите элементы “Text Field”
Используйте следующие выражения для полей:
- Состояние
$F{TASK_NAME}
- Роль
$F{SWIMLANE_NAME}
- Исполнитель
$F{EXECUTOR_NAME}
- Время создания
$P{DataFormatter}.timeMultilineFormat().dateTime($F{CREATE_DATE})
- Срок окончания
$P{DataFormatter}.timeMultilineFormat().dateTime($F{DEADLINE_DATE})
- Фактическая длительность
$P{DataFormatter}.timeMultilineFormat().interval($F{CREATE_DATE},$P{DTNow})
- Осталось до окончания
$P{DataFormatter}.timeMultilineFormat().interval($P{DTNow},$F{DEADLINE_DATE})
Для полей формата Timestamp используется DataFormatter, позволяющий преобразовать значение в единый с RunaWFE формат отображения. С помощью метода interval(StartDate, EndDate) рассчитывается интервал между двумя заданными датами.
Параметры DTNow, DataFormatter и ProcessId должны быть переданы в DataSet таблицы активных заданий.
# Стили таблицы
Вместе с таблицей автоматически создаются стили:
Отредактируйте их и примените к заголовку, ячейкам с названиями параметров, ячейкам значений:
# Секция информации о ролях
Создайте новый источник данных processExecutors
Для получения ролей экземпляра БП используйте следующий sql запрос\
SELECT BPM_SWIMLANE.NAME as SWIMLANE_NAME, EXECUTOR.NAME as EXECUTOR_NAME FROM BPM_SWIMLANE INNER JOIN EXECUTOR ON BPM_SWIMLANE.EXECUTOR_ID = EXECUTOR.ID WHERE BPM_SWIMLANE.PROCESS_ID= $P{ProcessId}
Расположите в секции Detail2 таблицу для отображения ролей экземпляра БП, в качестве источника данных используйте processExecutors
Добавьте следующие выражения для полей Роль и Исполнитель:
$F{SWIMLANE_NAME}
$F{EXECUTOR_NAME} == null ? "" : $F{EXECUTOR_NAME}
Примените для таблицы стили
# Таблица переменных процесса
Создайте новый источник данных для получения значений переменных экземпляра БП
SELECT BPM_VARIABLE.NAME, BPM_VARIABLE.STRINGVALUE FROM BPM_VARIABLE WHERE PROCESS_ID= $P{ProcessId}
Создайте таблицу для отображения значений переменных экземпляра БП, аналогично таблицы ролей и расположите ее в секции Detail3
Используйте выражения для полей “Variable Name” и “Value”
$F{NAME}
$F{STRINGVALUE} == null ? "" : $F{STRINGVALUE}
Расположите в “подвале” отчета два элемента “Text Field” с выражениями вида:
"Page " + $V{PAGE_NUMBER}
" of " + $V{PAGE_COUNT}
где
- PAGE_NUMBER – номер текущей страницы
- PAGE_COUNT – количество страниц в отчете
# Компиляция отчета
Выделите файл отчета (расширение jrxml), вызовите контекстное меню и выберите пункт “Compile Report”
Если отчет не содержит ошибок, то будет сгенерирован файл с расширением jasper, который можно загрузить на сервер RunaWFE.
# Загрузка и выполнение отчета
Откройте “Отчеты”, нажмите Загрузить.
Выберите файл отчета (расширение .jasper) и заполните обязательные поля.
Нажмите “Проанализировать”
Введите название выводимое пользователю для параметра ProcessId
Выберите тип Integer, установите опцию обязательности параметра.
Нажмите “Загрузить”, отчет появится в списке
Выполните отчет:
Введите id экземпляра БП, данные которого хотим получить в отчете и выберите Тип отчета
Нажмите “Построить”
Ниже приведены примеры сформированных отчетов:
# Файлы отчета по данным экземпляра БП
Пример разработанного по данному руководству отчета доступен по следующим ссылкам
Актуальные версии демо отчёта для Релиза 4.5.0