2.2. Модуль отчетов

Synergy предоставляет возможность разработчику формировать и загружать произвольные отчеты на основе данных, содержащихся в БД системы.

2.2.1. Система составления отчетов iReport

Система составления отчетов реализована на основе JasperReports. Для составления шаблонов отчетов используется программа IReport.

2.2.1.1. Минимальные системные требования

  • RAM: 256 MB

  • Дисковое пространство: 50 MB

  • Java 6 или Java 7 (для рассматриваемой версии iReport 5.5.1)

2.2.1.2. Настройка iReport

Необходимость отдельной настройки используемых шрифтов и кодировок связана с тем, что для отчетов в Synergy необходимо использовать русский и казахский языки. По умолчанию iReport работает с кодировкой Cp1252, которая их не поддерживает, поэтому потребуется подключить кодировку Identity-H.

2.2.1.2.1. Загрузка шрифтов

Для установки шрифтов в панели меню выберите пункт Tools - Options. В открывшемся окне перейдите на вкладку «Classpath»:

Рисунок 2.1. Окно «Options», вкладка «Classpath»

Окно «Options», вкладка «Classpath»

Мы предлагаем сформированный файл fonts.jar, который сразу можно добавить в iReport. Для этого нажмите на кнопку Add JAR. Откроется диалог выбора ресурса:

Рисунок 2.2. Выбор jar-файла

Выбор jar-файла

Выберите нужный файл и нажмите на кнопку ОК.

2.2.1.2.2. Замена свойств

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

  1. В архиве ireport/modules/ext/jasperreports-5.5.1.jar изменить содержимое файла default.jasperreports.properties:

В секции # Font settings изменить значения свойств на следующие (как на стороне сервера, так и в редакторе отчетов):

net.sf.jasperreports.default.font.name=Arial
net.sf.jasperreports.default.font.size=10
net.sf.jasperreports.default.pdf.font.name=Arial
net.sf.jasperreports.default.pdf.encoding=Identity-H
net.sf.jasperreports.default.pdf.embedded=true
net.sf.jasperreports.awt.ignore.missing.font=false

Кроме того, убедитесь, что в библиотеке jasperreports в файле default.jasperreports.properties есть строка вида:

# Query executer settings
net.sf.jasperreports.query.executer.factory.xpath2=com.jaspersoft.jrx.query.JRXPathQueryExecuterFactory

При ее отсутствии работа отчетов в формате xml не гарантируется.

2.2.1.3. Установка соединения с Synergy

На панели инструментов нажмите на кнопку Reports Datasources. Откроется окно, содержащее список сохраненных соединений:

Рисунок 2.3. Соединения

Соединения

Для создания нового соединения нужно нажать на кнопку New. Первым шагом создания соединения является выбор типа соединения:

Рисунок 2.4. Выбор типа соединения

Выбор типа соединения

Это же окно открывается в том случае, если на стартовой странице iReport нажать на кнопку установки соединения Step 1.

Для Synergy требуется соединение типа Datasource JDBC connection. После выбора этого типа соединения откроется окно настройки соединения:

Рисунок 2.5. Datasource JDBC connection

Datasource JDBC connection

Введены следующие параметры соединения:

Name

Synergy connection

JDBC Driver

MySQL (com.mysql.jdbc.Driver)

JDBC URL

jdbc:mysql://<hostname>:<mysql_port>/synergy?characterEncoding=utf8

Здесь <hostname>:<mysql_port> - адрес и порт сервера, на котором расположен MySQL, или, как в случае с пробросом соединения через SSH (пример ниже), локальный хост и порт, куда был выполнен проброс.

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

Для проверки соединения можно нажать на кнопку Test. Если соединение с указанными параметрами удалось установить, то будет отображено сообщение с текстом:

Connection test successful!

Если же соединение установить не удалось, то будет отображено сообщение с текстом ошибки.

Проброс соединения через SSH

Если требуется установить соединение с БД, расположенной на удаленном сервере, то предварительно необходимо сделать проброс соединения через SSH, выполнив команду:

ssh -L 3307:localhost:3306 user@remote-host.com

Здесь 3307 - локальный порт, с которым будет устанавливать соединение iReport, localhost - локальный хост, 3306 - удаленный порт (например, порт mysql, запущенного на удаленном сервере), user@remote-host.com - пользователь@удаленный хост.

Примечания:

  1. Эту команду требуется выполнять после каждого перезапуска сервера.

  1. Время отклика возрастает, поскольку добавляются накладные расходы на шифрование/расшифровывание.

  1. На локальном сервере появляется уязвимость удаленного сервера, так как есть прямой проброс соединения. Поэтому для порта 3307 следует заблокировать доступ извне через iptable или брандмауэр.

2.2.1.4. Создание отчетов

Создание отчета производится в несколько шагов:

  1. Выбор внешнего вида отчета, настройка его частей.

  2. Формирование запроса отчета, подключение и настройка параметров.

  3. Публикация шаблона отчета в Synergy.

Примечание:

В данном разделе рассмотрена только небольшая часть функций iReport. Для изучения всех его возможностей рекомендуем обращаться к официальной документации (для версии 5.5.1).

На стартовой странице iReport расположены имена ранее открытых отчетов и кнопка для запуска мастера отчета (Step 2):

Рисунок 2.6. Стартовая страница iReport

Стартовая страница iReport

Откроется мастер отчетов, первым шагом которого будет выбор шаблона отчета:

Рисунок 2.7. Выбор шаблона отчета

Выбор шаблона отчета

Кроме внешнего вида отчета, этот мастер позволяет:

  • выбрать стиль текста (вкладка Style)

  • выбрать вид диаграмм (вкладка Chart Theme)

  • создать пакет ресурсов с переводами строк, используемых в документе (вкладка Resource Bundle)

  • создать другие типы конфигурацонных файлов (вкладка Other file Types)

В качестве примера во вкладке Report выберем шаблон Blank A4 - стандартный лист формата А4.

Для продолжения работы в мастере отчетов нужно нажать на кнопку Launch Report Wizard. В этом случае мастер после указания имени отчета и места для его сохранения позволит сформировать запрос отчета, выбрать используемые поля и указать способ их группировки.

Вместо этого рассмотрим ручное составление отчета. Для этого после выбора шаблона отчета нужно нажать на кнопку Open this Template. В этом случае постребуется только ввод имени отчета и указание его расположения:

Рисунок 2.8. Сохранение нового отчета

Сохранение нового отчета

После этого нужно нажать на кнопку Next >, а после появления сообщения о завершении создания шаблона - на кнопку Finish.

Будет отображено окно составления нового отчета:

Рисунок 2.9. Окно составления отчета

Окно составления отчета

В левой части располагается дерево элементов отчета, где в качестве корня выступает сам отчет. В правой части будут отображаться свойства элемента, выбранного в дереве элементов. В нижней части окна расположена область вывода ошибок при генерации отчета (вкладка Report Problems Window) и область отображения сообщений о статусе отчета (вкладка iReport output).

Посередине окна располагается рабочая область отчета. По умолчанию открыта вкладка Designer - в ней отображена структура отчета, и именно в ней настраивается внешний вид отчета.

Вкладка XML содержит полученный отчет в формате XML.

Вкладка Preview предназначена для предварительного просмотра итогового отчета.

2.2.1.4.1. Структура отчета

Отчет состоит из следующих основных секций:

  • Title - заголовок отчета. Секция будет напечатана один раз на первой странице отчета.

  • Page Header - заголовок страницы. Секция будет напечана в начале каждой страницы отчета. Обычно здесь размещается название отчета либо номер текущей страницы.

  • Column Header - название колонок отчета.

  • Detail 1 - тело отчета. Секция отличается от остальных тем, что она повторяется в отчете ровно столько раз, сколько строк будет в полученном отчете.

  • Column Footer - нижняя подпись колонок.

  • Page Footer - нижний колонтитул страницы. Секция будет напечатана в конце каждой страницы отчета. Аналогично с заголовком страницы, здесь могут быть размещены название отчета или номер текущей страницы.

  • Summary - нижняя подпись отчета. Секция будет напечатана один раз в конце отчета.

Если какая-либо секция в отчете не нужна, то достаточно просто уменьшить ее размер до 0 и не помещать в нее компонентов. Если необходимо, чтобы область начиналась на следующей странице, следует вставить в конец предыдущей области компонент разрыва (Break).

2.2.1.4.2. Запрос в отчете

Доступ к редактирования отчета возможен двумя способами:

  1. В дереве элементов отчета выделить корневой элемент, и в его контекстном меню выбрать пункт Edit query.

  2. На верхней панели отчета, правее вкладки Preview, нажать на кнопку .

Откроется окно редактирования запроса отчета:

Рисунок 2.10. Запрос отчета

Запрос отчета

В поле Query language можно выбрать нужный язык запросов.

Текст запроса можно написать вручную, загрузить из файла txt или sql (кнопка Load query), либо создать с помощью составителя отчетов (кнопка Query designer, необходимо работающее соединение с базой данных).

Полученный текст запроса можно сохранить в файл txt или sql.

В качестве примера напишем простой запрос выбора всех пользователей:

SELECT lastname, firstname, patronymic FROM users

Для упрощения написания запросов рекомендуем обращаться к описанию базы данных Synergy.

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

После завершения составления отчета нажмите на кнопку OK.

2.2.1.4.3. Элементы отчета

После формирования запроса обновляется дерево элементов отчета. Поля, полученные в запросе, содержатся в элементе Fiels. Для того, чтобы отобразить поле в отчете, нужно перетащить поле из дерева в нужную секцию отчета:

Рисунок 2.11. Добавление нового поля в отчет

Добавление нового поля в отчет

При этом в отчете одновременно появляются два элемента: Static Text, содержащий заголовок поля, и элемент вида $F{field_name}, содержащий значение поля. Заголовок поля следует расположить в секции Column Header, а значение поля - вплотную под заголовком в секции Detail 1.

Настройки текста, отображаемого в элементе, отображаются в правой части окна при выделении элемента в виде его свойств. В частности, форматирование текста настраивается в группе свойств Text properties:

Рисунок 2.12. Текстовые свойства элемента «Поле»

Текстовые свойства элемента «Поле»

Аналогично в отчете размещаются и настраиваются остальные элементы.

2.2.1.4.4. Параметры отчета

Часто возникает необходимость формировать отчет с использованием данных, которые должен вводить пользователь. Например, пользователь должен указать условие поиска сотрудников. Для того, чтобы это сделать, в отчете необходимо использовать параметры.

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

Рисунок 2.13. Запрос отчета

Запрос отчета

Для добавления нового параметра нужно нажать на кнопку New Parameter. Откроется окно редактирования параметра:

Рисунок 2.14. Окно редактирования параметра

Окно редактирования параметра

Обращение к параметру в запросе производится в формате $P{<имя_параметра>}, например:

SELECT * FROM users WHERE lastname LIKE CONCAT($P{params1}, '%')

В результате в отчет будут включены пользователи, чья фамилия начинается на значение, введенное пользователем.

Описание параметра - текст, который будет отображаться пользователю при генерации отчетов из Synergy. Он заполняется в свойстве Description:

Рисунок 2.15. Заполнение описания параметра

Заполнение описания параметра

2.2.1.4.4.1. Специальные параметры

При соединении iReport с Synergy предусмотрены некоторые специальные параметры.

Если название параметра (Parameter name) содержит комбинацию символов как в коде переменной, то для данной переменной применяется специальный редактор:

Код Описание

users_names

Для параметра с данным кодом в названии будет предоставляться возможность выбора нескольких пользователей. В значение параметра будут записаны имена пользователей, перечисленные через запятую, в формате Фамилия Имя О.

users_id

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

Этот параметр предназначен только для выполнения запросов. Пример:

SELECT lastname, firstname FROM users WHERE userid in ($P!{param})

Обратите внимание, что параметр в запросе должен быть записан с !

user_name

Имя выбранного пользователя

user_id

ID выбранного пользователя

departments_names

Названия выбранных подразделений, перечисленные через запятую

departments_id

Идентификаторы выбранных подразделений, перечисленные через запятую

department_name

Название выбранного подразделения

department_id

Идентификатор выбранного подразделения

currentuser_id

Идентификатор пользователя, который формирует отчет. Данный параметр не отображается при заполнении отчета. Название используемого параметра быть точно равно коду

currentuser_name

Полное имя пользователя, который формирует отчет. Данный параметр не отображается при заполнении отчета. Название используемого параметра должно быть точно равно коду

currentdate

Дата формирования отчета. Данный параметр не отображается при заполнении отчета

action

Идентификатор выбранного проекта

actions

Идентификаторы выбранных проектов, перечисленные через запятую

_dictionary

В параметре необходимо указать код справочника и коды полей, которые должны быть использованы в качестве значения параметра (value) и его подписи, отображаемой в отчете (title), в формате: <dictionary_code>.<value_code>.<title_code>_dictionary. Например: send_items.item_number.item_name_dictionary. Если справочник содержит поля с кодами title и value, то значение и подпись элементов справочника будут выделены автоматически, и в названии параметра достаточно указать только код справочника в формате <dictionary_code>_dictionary

2.2.1.4.4.2. Опциональные параметры

Для того, чтобы параметр стал опциональным, необходимо добавить для него специальное свойство:

  1. Выбрать нужный параметр в дереве объектов

Рисунок 2.16. Выбранный парамер в дереве объектов

Выбранный парамер в дереве объектов

  1. В свойствах параметра (Properties в правой части окна) открыть список свойств параметра:

Рисунок 2.17. Список свойств параметра

Список свойств параметра

  1. Нажать на кнопку Add и добавить новое свойство kz.arta.synergy.reports.parameters.optional с любым значением:

Рисунок 2.18. Добавление нового свойства параметра

Добавление нового свойства параметра

Чтобы проверить значение опционального параметра в отчете, используется условие вида:

IF($P{param}='', true, t=$P{param})

То есть если параметр param не задан, его значение не учитывается (результат сравнения true). Если параметр задан, то он сравнивается с переменной t.

Если же параметр - это мультивыбор значения справочника, то условие имеет вид:

IF('$P!{param_dictionary}' <> '[]', $X{IN, t, param_dictionary}, true)

То есть если список значений param_dictionary не имеет элементов, то условие считается верным, иначе - выполняется проверка, содержится ли (ключевое слово IN) значение поля t в значениях param_dictionary. Если необходимо проверить, что значение поля не содержится в списке значений параметра, можно использовать ключевое слово NOTIN.

2.2.1.4.5. Предпросмотр и публикация отчета

Для просмотра результата составления отчета нужно перейти во вкладку Preview.

Если отчет содержит параметры, то в первую очередь отобразится диалог ввода параметров:

Рисунок 2.19. Ввод параметров отчета

Ввод параметров отчета

Для использования значения по умолчанию нужно нажать на кнопку Use default.

После ввода параметра отображается результат составления отчета, содержащий данные, полученные в результате выполнения запроса:

Рисунок 2.20. Итоговый вид отчета

Итоговый вид отчета

После завершения составления отчета его необходимо сохранить в формате jrxml и загрузить этот файл в окне составления нового пользовательского отчета.

2.2.1.4.6. Некоторые полезные функции

1. Получение информации о карточке документа и его визах (подписях, согласованиях и т.д.)

Сервис доступен по ссылке:

http://host:port/Synergy/docsightings?docID={elementid}&type={type}

Здесь:

  • elementid - идентификатор документа (доступен в ссылке на документ)

  • type - тип необходимых виз документа, необязательный параметр. Возможные значения:

  • -1 - лист подписей;

  • 0 - лист согласования;

  • 1 - лист утверждения;

  • 2 - лист ознакомления.

Если параметр type не передан, то будут получены все подписи.

Пример получаемых данных:

<document>
   <docInfo>
      <number />
      <subject>111111 - 23333</subject>
      <regDate />
      <author>Ермолаев М.О.</author>
      <docType>Служебные записки между департаментами</docType>
      <registry />
   </docInfo>
   <signatures>
      <signature>
         <userID>73635fff7b742f7aa5af93c96bd6c2ae</userID>
         <userName>Ермолаев М.О.</userName>
         <position>Председатель правления</position>
         <signDate>20.11.2014 10.25.26</signDate>
         <comment />
         <signType>Согласовано</signType>
         <signResult>Согласовано</signResult>
         <value>Обычная</value>
      </signature>
      <signature>
         <userID>a8773e4f56b4cc73381bb1e74d479902</userID>
         <userName>Абдазимова Г.А.</userName>
         <position>Инженер ПО</position>
         <signDate>19.11.2014 10.31.53</signDate>
         <comment>Согласен</comment>
         <signType>Согласовано</signType>
         <signResult>Согласовано с комментарием</signResult>
         <value>Обычная</value>
      </signature>
   </signatures>
</document>

2. Получение строки с полным именем пользователя

Формат вызова: getFullName(userID, addPosition)

Функция возвращает полное имя пользователя в формате Фамилия И.О..

Параметр addPosition регулирует, передавать ли дополнительно должность пользователя.

Примеры использования:

Select getFullName('<userID>', true)

Select getFullName('<userID>', false)

3. Сортировка по иерархической структуре подразделений

Во многих отчетах требуется сортировать данные согласно какой-либо иерархической структуре, например, по департаментам. В таблице departments есть поле struct_number вида 1.2.1. Поскольку это строковое поле, сортировать по этому полю прямо не получится. Для сортировки по департаментам используется функция вида:

getStruct(struct_number)

Пример использования:

SELECT nameru FROM departments WHERE deleted IS NULL ORDER BY getStruct(struct_number) - отобразить названия неудаленных подразделений, отсортированные согласно иерархии в орг.структуре.

2.2.2. Модули

Модуль отчетности состоит из трех подмодулей:

2.2.2.1. ReportsBean (ReportsBean.jar)

2.2.2.1.1. Зависимости на модули
  1. am-common

  2. ai-common

  3. Reports

  4. aiBean

  5. synergy-ejb

  6. synergy-generic

2.2.2.1.2. Зависимости на библиотеки
  1. jasperreports (svn+ssh://scm.forge.arta.local/var/lib/gforge/chroot/scmrepos/svn/synergy/trunk/reports/deps)

  2. javaee (am-libs/jboss, ai-libs/jboss, ai-libs/jcr, am-libs/persist)

2.2.2.1.3. Назначение

Сохраняет информацию об отчетах в базу, формирует отчеты.

svn+ssh://scm.forge.arta.local/var/lib/gforge/chroot/scmrepos/svn/synergy/trunk/reports/ReportBean

2.2.2.2. reports (Reports.jar)

2.2.2.2.1. Зависимости на модули
  1. synergy-web

  2. am-common

  3. arta-components

  4. ReportsBean

  5. Management

  6. Information

2.2.2.2.2. Зависимости на библиотеки
  1. gwt-user

2.2.2.2.3. Назначение

Модуль представляет собой стандартную кнопку отчетов (о ней далее).

svn+ssh://scm.forge.arta.local/var/lib/gforge/chroot/scmrepos/svn/synergy/trunk/reports/clientmodule

2.2.2.3. ReportsAdmin (ar-admin.jar)

2.2.2.3.1. Зависимости на модули
  1. Reports

  2. ReportsBean

  3. am-common

  4. arta-components

  5. ai-common

2.2.2.3.2. Зависимости на библиотеки
  1. gwt-user

2.2.2.3.3. Назначение

Админка отчетов svn+ssh://scm.forge.arta.local/var/lib/gforge/chroot/scmrepos/svn/synergy/trunk/reports/Admin

2.2.3. Формирование шаблона отчета

Шаблоны отчетов составляются на странице управления отчетами, расположенной по адресу: http://<host>:<port>/Reports/Admin

2.2.4. Использование стандартной кнопки отчетов

К каждому модулю в системе можно добавить системную кнопку, по нажатию на которую появится всплывающее меню, в котором будут отчеты этого модуля. Для этого необходимо загрузить отчет и указать ему тип объекта, к которому он относится (если нужного типа объекта нет, то нужно добавить его в ObjectType и таблицу object_types, это нужно сделать в классе MboDBSchema, примерно после 1815 строчки (там добавляются все типы объектов системы)).

После этого в модуле Synergy необходимо добавить кнопку ReportButton (обычно слева на панели заголовка модуля), вот таким способом:

ReportButton reportButton = new ReportButton(ObjectType.PLAN|ObjectType.ACTION) {
            @Override
            public String getSelectedID(int objectTypeID) {
                if (objectTypeID == ObjectType.PLAN) {
                    return getCurrentPlanID();
                }else if (objectTypeID == ObjectType.ACTION) {
                    ActionHolder ac = panelsManager.plansList.actionsTreeTable.getSelectedAction();
                    if (ac != null) return ac.getAction().getActionID();
                }
                return null;
            }
        };

В качестве параметра в конструктор передаем типы объектов, отчеты по которым должны быть отображены в меню. Далее реализовываем метод getSelectedID(int objectTypeID). Далее данный параметр будет передаваться в качестве специального параметра в отчет.

Кнопка будет видна, только если существуют хоть какие-то отчеты, связанные с переданными в конструктор типами объектов.

В меню кнопки можно добавить свои пункты.

Параметры расположения пункта отчета в списке отчетов:

  • setAdditionalItems(ArrayList<PopupMenuItemIF> additionalItems) - пункты будут отображаться после системных отчетов.

  • setFirstAdditionalItems(ArrayList<PopupMenuItemIF> additionalItems) - пункты будут отображаться до системных отчетов.

Если меню состоит всего из одного пункта, то по нажатию на кнопку отчетов он выполняется сразу.

2.2.5. Что можно дополнить, изменить, улучшить

  1. Внешний вид компонентов выбора пользователя, пользователей, департамента, департаментов, планов, элемента справочника.

  2. Расширить список специальных параметров отчета (например, добавить возможность выбрать журнал или дело). Также можно это решить справочниками (например, создать справочник, где будут перечислены все журналы) и создать такой параметр, но этот способ не рекомендуется.