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 появится окно подтверждения:

    run actions listPrint confirmation
    Рисунок 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, в котором будут отображаться отчёты, доступные для текущего экрана. При выборе пользователем отчёта из списка отображается экран просмотра истории исполнения выбранного отчёта. Если в списке отчётов ни один отчёт не был выбран, то в экране просмотра будет отображена история исполнения всех отчётов, связанных с экраном.