Статьи и публикации

Реализация в SAP PI выгрузки в нестандартных форматах

Антонов Д.А.

Антонов Д.А.

Руководитель отдела разработки Департамента практики SAP ООО «ЭнергоДата»

Введение

Как правило, при реализации интеграционного обмена «с чистого листа» консультанты применяют рекомендуемые SAP форматы – XML, IDoc, изредка текстовые файлы (CSV/TXT). Однако при создании интеграционных решений, связанных с унаследованными или сторонними системами, консультантам приходится реализовывать специфические требования этих смежных систем – выгрузку/загрузку данных в бинарных форматах, специальную обработку данных и так далее. Эти задачи не решаются путем простых настроек и требуют либо покупки достаточно дорогостоящих специализированных адаптеров, либо программных разработок.

Материалом для статьи стала реализация требования контрагента, участвовавшего в интеграции, осуществить выгрузку интеграционных данных строго в формате Excel 2003, причем с выполнением нескольких дополнительных требований:

  1. Книга Excel должна содержать единственную страницу с определенным названием;
  2. Запись должна быть запрещена путем установки пароля, заранее неизвестного контрагенту;
  3. В целях последующего развития должна быть предусмотрена возможность электронной подписи файла средствами Excel.

Так как стандартные адаптеры, поставляемые в составе SAP PI, подобных функций не предоставляют, было принято решение выполнить программную разработку.

Выбор этапа и инструментария разработки

С целью упрощения дальнейшего изменения и развития решения был использован стандартный механизм преобразования сообщений SAP PI – трансформация сообщений. Из имеющихся вариантов реализации – Java, ABAP, Message Mapping, XSLT – единственным подходящим является Java. Осталось только выбрать наиболее удобную для реализации Java-библиотеку, работающую с форматами MS Office.

Последние несколько лет стандартом де-факто стала доступная в исходных кодах библиотека Apache POI. Существует также ряд других библиотек, но по сочетанию открытости, богатства функционала и оперативности устранения проблем у нее немного соперников.

Однако реализация формирования файлов Excel непосредственно из Apache POI достаточно трудоемка, содержит множество рутинных операций. Для ускорения процесса и опять же простоты дальнейшего сопровождения, в связке с Apache POI была выбрана весьма удобная библиотека jXLS. Она является фактически надстройкой над Apache POI, которая позволяет быстро формировать файлы Excel на основании шаблонов и простейшего макроязыка. То есть, достаточно создать готовый файл Excel со всеми необходимыми форматированиями, вставив в ячейки вместо конечных значений имена переменных (например, $AMOUNT вместо суммы), а jXLS уже сама подставит конкретные значения в соответствующие ячейки, сформирует таблицы, рассчитает подсуммы и выполнит прочие действия.

Таким образом, к началу реализации было принято следующее архитектурное решение:

  • Формирование выходного файла Excel 2003 выполняется на этапе Java Mapping-а;
  • Инструмент разработки – стандартная NetWeaver Development Studio;
  • Базовая библиотека для работы с Excel – Apache POI;
  • Используемая надстройка – jXLS.

Реализация проекта выгрузки

Разработка

Реализация класса мэппинга начинается с создания проекта Java. В простейшем случае можно создать простой проект Java с использованием мастера через меню File –> New –> Project…(Рис. 1).

схема работы решения на примере процесса согласования заявки на платеж

Рис. 1. Мастер создания проектов NWDS

В нашем случае, проект назван ExcelConverter. В зависимости проекта необходимо подключить стандартную библиотеку SAP PI com.sap.xpi.ib.mapping.lib.jar, содержащую определения стандартных интерфейсов Java-мэппинга. Кроме того, так как цель проекта – реализация выгрузки в формат Excel, в список библиотек также необходимо включить пакет jXLS (в том числе в него входит набор библиотек Apache POI). Это, в частности:

  • commons-collections
  • commons-beanutils
  • commons-digester
  • commons-logging
  • poi
  • poi-ooxml-schemas
  • poi-ooxml
  • commons-jexl

Конкретные версии библиотек лучше уточнить непосредственно в процессе реализации, так как проекты постоянно развиваются и выпускают обновления. Следует также обратить внимание на соответствие используемых версий библиотек и версии JDK, используемой SAP PI. В нашем случае, ограничением при выборе версии библиотеки послужила необходимость запуска именно на версии JDK 1.6 или более ранней.

В созданном проекте был добавлен класс Converter, реализующий интерфейс Java-мэппинга com.sap.aii.mapping.api.StreamTransformation. Этот интерфейс содержит всего два метода: setParameter, принимающий при запуске набор дополнительных параметров мэппинга (полезная функция для увеличения гибкости), и собственно метод преобразования сообщений - execute. Именно последний метод представляет для проекта наибольший интерес. В нем всего два параметра: поток исходного сообщения (java.io.InputStream) и поток-результат преобразования (java.io.OutputStream). Соответственно, на вход преобразования будет поступать исходное сообщение в формате XML, а в выходной поток алгоритм будет писать уже бинарные данные.

Первым шагом к реализации алгоритма будет создание шаблона выходного файла непосредственно в формате Excel. Ниже приводится пример такого файла, созданного для проекта: (Рис. 2)

схема работы решения на примере процесса согласования заявки на платеж

Рис. 2. Пример шаблона Excel для библиотеки jXLS

Как видно из скриншота, шаблон представляет собой обычный файл Excel, в котором вписаны наименования подставляемых при формировании файла параметров.

Соответственно, для формирования выходного файла требуется выполнить следующие шаги:

  1. Произвести разбор исходного XML-сообщения.
  2. Создать набор Java-объектов, поместить их в именованный список (java.util.Map).
  3. Загрузить в память приведенный выше шаблон Excel.
  4. Вызвать библиотеку jXLS, передав ей шаблон и список значений.
  5. Записать полученный результат в выходной поток.

Шаг 1. Разбор исходного XML-сообщения

Принципы разбора исходного XML-сообщения многократно рассматривались в справочных материалах SAP, а также публикациях отдельных консультантов, поэтому описывать данную реализацию подробно не будем. Была использована обычная обработка с использованием SAX-парсера – создан класс InputHandler, расширяющий родительский класс org.xml.sax.helpers.DefaultHandler. Далее этот класс вызывается с передачей ему исходного сообщения в методе execute:

SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
InputHandler handler = new InputHandler();
saxParser.parse(in, handler);

Шаг 2. Создание набора Java-объектов

По окончанию разбора сообщения в классе InputHandler должен быть сформирован набор объектов для передачи в библиотеку jXLS. Принципы создания классов для передачи достаточно просты:

  • Класс параметра для листа Excel должен быть обычным POJO-объектом.
  • Он должен реализовать интерфейс java.io.Serializable.
  • Все поля также должны быть либо простыми типами, либо реализовать java.io.Serializable.

В качестве примера приведен код одного из классов-данных:

package ru.energodata.reestr.psb.dao;

import java.io.Serializable;

public class ReestrHeader implements Serializable {

      private String docnum;

      private String amount;

      private String currency;

      private Estimate estimate = new Estimate();

      public String getCurrency() {

            return currency;

      }

      public void setCurrency(String currency) {

            this.currency = currency;

      }

      public Estimate getEstimate() {

            return estimate;

      }
}

Источник: http://sapland.ru/articles/stats/realizatsiya-v-sap-pi-vigruzki-v-nestandartnih-phormatah.html