Печатное представление
Печатное представление формы состоит из набора шаблонов (отчетов), при подстановке данных в которые происходит формирование документа в графическом формате (с пиксельным позиционированием) или псевдографическом (с позиционированием по ячейкам). Этот документ отображается пользователю при помощи специального графического компонента, внутри которого пользователь может осуществлять навигацию по страницам, приближение/отдаление внутри страниц, а также выводить содержимое компонента на печать или экспортировать в различные форматы (например PDF или Excel). При необходимости отображение компонента пользователю можно пропустить, и сразу отправить документ на печать или сохранить в выбранный файл в заданном формате.
Для каждого отчета определяется набор групп объектов формы, которые он будет отображать.
Иерархия отчетов
Также как и у группы объектов, у каждого отчета есть родительский отчет, таким образом все отчеты образуют иерархию. При этом иерархия отчетов должна :
- включать в себя иерархию групп объектов, то есть если группа объектов одного отчета является потомком группы объектов второго отчета, то первый отчет должен совпадать со вторым отчетом или также являться его потомком
- внутри одного отчета у каждой группы объектов должен быть ровно один потомок.
Построение иерархии отчетов
Как следует из ограничений на иерархию отчетов, в один отчет можно включать только "цепочки" групп объектов (то есть, G1, G2, G3, ... Gn, где G2 - единственный прямой потомок G1, G3 - единственный прямой потомок G2 и т.д.). Соответственно решение о том, как разбивать группы объектов на отчеты сводится к тому, надо ли сливать группу объектов с ее единственным прямым потомком (при наличии такого) или нет. По умолчанию, такое слияние выполняется, однако, при необходимости, разработчик может запретить его задав соответствующую опцию (SUBREPORT) для группы объектов-потомка.
Использование этой опции сводится к тому, нужно ли отображать данные для группы объектов-родителя при отсутствии данных в группе объектов-потомке. Слитый отчет заполняется соединением групп объектов: набор объектов родительской группы, которому не соответствует ни один набор объектов группы-потомка, в документ не попадает. Чтобы такие наборы объектов отображались, группе-потомку задается опция SUBREPORT — тогда потомок формируется отдельным отчетом, а родительская группа отображает все свои наборы объектов.
Пример построения иерархии отчетов
Форма такая же как и в примере построения иерархии групп объектов:
FORM myForm 'myForm'
OBJECTS A, B SUBREPORT, C, D, E
PROPERTIES f(B, C), g(A, C)
FILTERS c(E) = C, h(B, D)
;
Иерархия отчетов для этой формы будет построена следующим образом:
Формирование документа
Какой сервер строит документ, зависит от клиента. Десктоп-клиент всегда строит его сам, из шаблонов и данных, которые ему присылает сервер приложений. Для веб-клиента рабочий параметр generateReportsOnWebServer (по умолчанию false) выбирает между сервером приложений, который строит документ и отдает готовый файл, и веб-сервером, которому передаются шаблоны и данные и который строит документ сам, запрашивая по ходу нужные классы у сервера приложений. Печать в файл всегда выполняется сервером приложений, независимо от клиента.
Работу самого генератора отчетов ограничивают два параметра, чтобы зациклившийся шаблон завершался ошибкой, а не исчерпывал ресурсы того процесса, который строит документ. Оба значения едут вместе с заданием на построение, поэтому действуют и когда документ строит сервер приложений, и когда его строит десктоп-клиент или веб-сервер: jasperReportsGovernorMaxPages (по умолчанию 500) ограничивает количество сформированных страниц, а jasperReportsGovernorTimeout (0) - время построения документа в миллисекундах. 0 означает, что это ограничение не применяется вовсе, поэтому из коробки ограничено только количество страниц.
jasperReportsIgnorePageMargins (по умолчанию true) отбрасывает поля страницы шаблона при экспорте документа в файл и размещает одну страницу документа на одном листе книги Excel.
useDefaultPrinterInPrintIfNotSpecified (по умолчанию false) используется только десктоп-клиентом и только когда документ печатается без указания принтера: кнопка печати в печатном представлении тогда отправляет документ сразу на принтер операционной системы по умолчанию, а не открывает диалог. Принтер по умолчанию определяется только в Windows; в остальных системах кнопка по-прежнему открывает диалог.
Язык
Использование всех вышеперечисленных возможностей, как и задание структуры формы, осуществляется при помощи инструкции FORM.
Открытие формы
Для отображения формы в печатном представлении используется соответствующий оператор открытия формы в печатном представлении.
Примеры
FORM printOrder
OBJECTS o = Order
PROPERTIES(o) currency, customer
OBJECTS d = OrderDetail
PROPERTIES(d) idSku, price
FILTERS order(d) = o
;
print (Order o) {
PRINT printOrder OBJECTS o = o; // выводим на печать
LOCAL file = FILE ();
PRINT printOrder OBJECTS o = o DOCX TO file;
open(file());
PRINT printOrder OBJECTS o = o XLS SHEET 'encrypted' PASSWORD 'pass';
}