5.2. Запуск отчётов из экранов
Отчёты можно запускать из произвольных экранов системы, используя специальные действия и связанные с ними кнопки или элементы контекстного меню компонентов. При этом кроме доступности отчёта в соответствии с ролью пользователя проверяется также его принадлежность данному экрану.
Рассмотрим типы действий и примеры их использования.
-
com.haulmont.reports.gui.actions.list.RunReportAction
– стандартное действие, отображающее список всех доступных отчётов. Действие определяется для компонентаButton
или для компонента-списка (Table
,DataGrid
и так далее).Пример декларативного объявления действия для
GroupTable
:<groupTable id="booksTable" width="100%" dataContainer="booksDc"> <actions> <action id="create" type="create"/> <action id="edit" type="edit"/> <action id="remove" type="remove"/> <action id="run" type="runReport"/> (1) </actions> <columns> <!-- --> </columns> <rowsCount/> <buttonsPanel id="buttonsPanel" alwaysVisible="true"> <!-- --> <button id="runBtn" action="booksTable.run"/> </buttonsPanel> </groupTable>
1 - в атрибуте type
задаётся тип действияrunReport
, предоставляемый фреймворком.Пример программного создания действия для кнопки, объявленной в XML-дескрипторе экрана:
@Inject protected Actions actions; @Inject protected Button runReportBtn; @Subscribe public void onInit(InitEvent event) { Action runReportAction = actions.create(RunReportAction.class, "runReport"); runReportBtn.setAction(runReportAction); }
При выполнении действия
RunReportAction
откроется модальное окно Run Reports, в котором будут отображаться отчёты, доступные для текущего экрана. При выборе пользователем отчёта из списка отображается форма ввода параметров (если они заданы), и отчёт запускается на исполнение.
-
com.haulmont.reports.gui.actions.list.ListPrintFormAction
– стандартное действие для печати отчётов для экземпляров сущностей, определённое для компонента-списка (Table
,DataGrid
и так далее).Действие отбирает только те отчёты, которые имеют внешний параметр типа Entity или List of entities, и тип сущности параметра совпадает с типом сущности, отображаемой компонентом-списком. Если в результате отбора доступен только один отчёт, он сразу запускается на исполнение. Если доступно несколько отчётов, их список предлагается пользователю.
В отчёт передается значение внешнего параметра по следующим правилам:
-
Если параметр типа List of entities, то в него передаются выбранные в данный момент в компоненте-списке экземпляры сущности.
-
Если параметр типа Entity, и в компоненте-списке выбран один экземпляр (выделена одна строка), то в отчёт передается этот экземпляр.
-
Если параметр типа Entity, а в компоненте-списке выделено несколько строк, то отчёт исполняется несколько раз по числу выбранных экземпляров. После выполнения пользователю возвращается один ZIP архив, в котором находятся все сформированные отчёты.
Пример декларативного объявления действия для
GroupTable
:<groupTable id="authorsTable" width="100%" dataContainer="authorsDc"> <actions> <action id="create" type="create"/> <action id="edit" type="edit"/> <action id="remove" type="remove"/> <action id="list" type="listPrintForm"/> (1) </actions> <columns> <!-- --> </columns> <rowsCount/> <buttonsPanel id="buttonsPanel" alwaysVisible="true"> <!-- --> <button id="listBtn" action="authorsTable.list"/> </buttonsPanel> </groupTable>
1 - в атрибуте type
задаётся тип действияlistPrintForm
, предоставляемый фреймворком.Пример программного создания действия для кнопки, объявленной в XML-дескрипторе экрана:
@Inject protected Actions actions; @Inject protected Button listPrintBtn; @Inject private GroupTable<Author> authorsTable; @Subscribe public void onInit(InitEvent event) { Action listPrintFormAction = actions.create(ListPrintFormAction.class, "listPrintFormAction"); authorsTable.addAction(listPrintFormAction); listPrintBtn.setAction(listPrintFormAction); }
Если в компоненте-списке не было выбрано ни одной сущности, то при выполнении действия
ListPrintFormAction
появится окно подтверждения:Рисунок 57. Окно подтвержденияПосле этого откроется модальное окно Run reports, в котором отображаются отчёты, относящиеся к текущему экрану. С этого экрана пользователь может запустить некоторый отчёт для выбранной сущности.
-
-
com.haulmont.reports.gui.actions.EditorPrintFormAction
– действие, связанное с экраном редактирования экземпляра сущности. Действие отбирает только те отчёты, которые имеют внешний параметр типа Entity или List of entities, и тип сущности параметра совпадает с типом редактируемой сущности. Если в результате отбора доступен только один отчёт, он сразу запускается на выполнение. Если доступно несколько отчётов, их список предлагается пользователю.В отчёт передается значение внешнего параметра – экземпляр редактируемой сущности. Если тип параметра – List of entities, то передается список из одного элемента.
Пример использования с кнопкой, размещенной рядом со стандартными кнопками OK и Cancel:
-
XML-дескриптор
<layout expand="editActions" spacing="true"> <!--...--> <hbox id="editActions" spacing="true"> <button action="windowCommitAndClose"/> <button action="windowClose"/> <button id="reportButton" icon="PRINT"/> </hbox> </layout>
-
Контроллер
@Inject private Button reportButton; @Subscribe public void onInit(InitEvent event) { reportButton.setAction(new EditorPrintFormAction(this,null)); }
-
-
com.haulmont.reports.gui.actions.list.ExecutionHistoryAction
– стандартное действие для отображения истории исполнения отчёта. Действие определяется для компонентаButton
или для компонента-списка (Table
,DataGrid
и так далее).Для просмотра истории задайте свойству reporting.executionHistory.enabled значение
true
в экране Administration > Application Properties.Пример декларативного объявления действия для
GroupTable
:<groupTable id="authorsTable" width="100%" dataContainer="authorsDc"> <actions> <action id="create" type="create"/> <action id="edit" type="edit"/> <action id="remove" type="remove"/> <action id="history" type="executionHistory"/> (1) </actions> <columns> <!-- --> </columns> <rowsCount/> <buttonsPanel id="buttonsPanel" alwaysVisible="true"> <!-- --> <button id="historyBtn" action="authorsTable.history"/> </buttonsPanel> </groupTable>
1 - в атрибуте type
задаётся тип действияexecutionHistory
, предоставляемый фреймворком.Пример программного создания действия для кнопки, объявленной в XML-дескрипторе экрана:
@Inject protected Actions actions; @Inject protected Button execHistoryBtn; @Subscribe public void onInit(InitEvent event) { Action execHistoryAction = actions.create(ExecutionHistoryAction.class, "execHistoryReport"); execHistoryBtn.setAction(execHistoryAction); }
При выполнении действия
ExecutionHistoryAction
откроется модальное окно Execution history, в котором будут отображаться отчёты, доступные для текущего экрана. При выборе пользователем отчёта из списка отображается экран просмотра истории исполнения выбранного отчёта. Если в списке отчётов ни один отчёт не был выбран, то в экране просмотра будет отображена история исполнения всех отчётов, связанных с экраном.