5.2. Запуск отчётов из экранов

Отчёты можно запускать из произвольных экранов системы, используя специальные действия и связанные с ними кнопки или элементы контекстного меню компонентов. При этом кроме доступности отчёта в соответствии с ролью пользователя проверяется также его принадлежность данному экрану.

Рассмотрим типы действий и примеры их использования.

  • com.haulmont.reports.gui.actions.RunReportAction – действие, отображающее список всех доступных отчётов. При выборе пользователем отчёта из списка отображается форма ввода параметров (если они заданы), и отчёт запускается на исполнение.

    Пример использования действия совместно с кнопкой, объявленной в XML-дескрипторе экрана:

    • XML-дескриптор

      <layout>
          <groupTable id="booksTable">
              ...
              <buttonsPanel id="buttonsPanel">
                  ...
                  <button id="reportButton"
                          icon="PRINT"/>
              </buttonsPanel>
          </groupTable>
    • Контроллер

      @Inject
      private Button reportButton;
      
      @Subscribe
      private void onInit(InitEvent event) {
          reportButton.setAction(new RunReportAction("report"));
      }
    • messages.properties

      report = Report
  • com.haulmont.reports.gui.actions.TablePrintFormAction – действие, связанное с таблицей, отображающей список экземпляров сущности. Действие отбирает только те отчёты, которые имеют внешний параметр типа Entity или List of entities, и тип сущности параметра совпадает с типом сущности, отображаемой таблицей. Если в результате отбора доступен только один отчёт, он сразу запускается на выполнение. Если доступно несколько отчётов, их список предлагается пользователю.

    В отчёт передается значение внешнего параметра по следующим правилам:

    • Если параметр типа List of entities, то в него передается список выбранных в данный момент в таблице экземпляров.

    • Если параметр типа Entity, и в таблице выбран один экземпляр (выделена одна строка), то в отчёт передается этот экземпляр.

    • Если параметр типа Entity, а в таблице выделено несколько строк, то отчёт выполняется несколько раз по числу выбранных экземпляров. После выполнения пользователю возвращается один ZIP архив, в котором находятся все сформированные отчёты.

    Пример использования с кнопкой и контекстным меню таблицы:

    • XML-дескриптор

      <layout>
          <groupTable id="booksTable">
              ...
              <buttonsPanel id="buttonsPanel">
                  ...
                  <button id="reportButton"
                          icon="PRINT"/>
              </buttonsPanel>
          </groupTable>
    • Контроллер

      @Inject
       private Button reportButton;
      
      @Inject
      private GroupTable<Book> booksTable;
      
      @Subscribe
      private void onInit(InitEvent event) {
          TablePrintFormAction action = new TablePrintFormAction("report", booksTable);
          booksTable.addAction(action);
          reportButton.setAction(action);
      }
    • messages.properties

      report = Report
  • 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
    private void onBeforeShow(BeforeShowEvent event) {
        reportButton.setAction(new EditorPrintFormAction("report", this, null));
    }
  • messages.properties

    report = Report