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

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

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

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

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

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

      <layout>
          <table id="bookTable">
              ...
              <buttonsPanel id="buttonsPanel">
                  ...
                  <button id="reportButton"
                          icon="icons/reports-print.png"/>
              </buttonsPanel>
          </table>
    • Контроллер

      @Inject
      private Button reportButton;
      
      @Override
      public void init(Map<String, Object> params) {
          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>
          <table id="bookTable">
              ...
              <buttonsPanel id="buttonsPanel">
                  ...
                  <button id="reportButton"
                          icon="icons/reports-print.png"/>
              </buttonsPanel>
          </table>
    • Контроллер

      @Inject
      private Button reportButton;
      
      @Inject
      private Table bookTable;
      
      @Override
      public void init(Map<String, Object> params) {
          TablePrintFormAction action = new TablePrintFormAction("report", bookTable);
          bookTable.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="windowActionsBox">
    ...
    <hbox id="windowActionsBox"
          spacing="true">
        <iframe id="windowActions"
                screen="editWindowActions"/>
        <button id="reportButton"/>
    </hbox>
</layout>
  • Контроллер

    @Inject
    private Button reportButton;
    
    @Override
    public void init(Map<String, Object> params) {
        reportButton.setAction(new EditorPrintFormAction("report", this, null));
    }
  • messages.properties

    report = Report