Вызов BAPI из внешних программ
Введение
Довольно редко IT-ландшафт предприятия, использующего систему SAP ERP, ограничивается только одной этой системой. Чаще всего, в обеспечении бизнес-процесса участвуют сторонние, по отношению к SAP ERP, программы/системы. Как следствие, возникает необходимость обеспечить их взаимодействие с SAP-системой.
Специально для этого в SAP ERP предусмотрен механизм BAPI (Business Application Programming Interface). Смысл этого механизма сводится к возможности реализации вызова функциональных модулей BAPI из внешних программ. Следует заметить, что вызывать извне можно не только функциональные модули (ФМ), имя которых начинается с «BAPI_» или «Z_BAPI_». Для вызова из внешних программ доступна любой ФМ у которого стоит признак «Remote-Enabled Module» (Рис. 1).
Рис. 1. Атрибуты функционального модуля
Именно наличие этого признака и позволяет вызывать ФМ по RFC из внешних систем (как SAP, та и не SAP).
Для реализации внешних вызовов предназначена библиотека SAP RFC SDK. Найти и скачать библиотеку можно на сайте SAP Service Marketplace в разделе Support Packages and Patches (Рис. 2).
Рис. 2. Библиотека SAP RFC SDK на SAP Service Marketplace
Обратите внимание на то, что версия библиотеки должна соответствовать операционной системе, под которой будет работать внешнее приложение, версии системы SAP ERP и быть с поддержкой UNICODE, если система SAP – Unicode (Рис. 3). Необходимая информация находится в меню по пути System->Status…
Рис. 3. Признак Unicode системы
Целью этой статьи является демонстрация полного цикла создания внешнего приложения, вызывающего по RFC функциональный модуль из системы SAP ERP.
Цикл создания внешнего приложения
Итак, предположим, что в каком-то бизнес-процессе нашего предприятия есть шаг, на котором необходимо удаленно создать в системе SAP некий материал с заранее известными характеристиками. Создадим небольшое приложение (.exe), которое будет автоматически запускаться внешним приложением на рабочей станции под управлением Windows с определенными параметрами и будет вызывать по RFC ФМ в SAP системе.
Для демонстрации в SAP ERP был создан функциональный модуль Z_BAPI_CREATE_MATERIAL с признаком вызова по RFC (см. Рис. 1). Исходный код этого ФМ:
function Z_BAPI_CREATE_MATERIAL .
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(I_MATNR) TYPE MATNR
*" VALUE(I_MAKTX) TYPE MAKTX
*" TABLES
*" ET_RETURN STRUCTURE BAPIRET2 OPTIONAL
*"----------------------------------------------------------------------
data:
LV_RETURN type BAPIRET2.
perform CREATE_MATERIAL using I_MATNR
I_MAKTX
changing LV_RETURN.
append LV_RETURN to ET_RETURN.
endfunction.
Исходный код подпрограммы CREATE_MATERIAL:
form CREATE_MATERIAL using VALUE(PV_MATNR) type MATNR
VALUE(PV_MAKTX) type MAKTX
changing PS_RETURN type BAPIRET2.
data:
LS_HEADDATA like BAPIMATHEAD,
LS_CLIENTDATA like BAPI_MARA,
LS_CLIENTDATAX like BAPI_MARAX.
data:
LT_MATERIALDESCRIPTION type table of BAPI_MAKT,
LS_MATERIALDESCRIPTION like line of LT_MATERIALDESCRIPTION.
* -- Header
LS_HEADDATA-MATERIAL = PV_MATNR.
LS_HEADDATA-IND_SECTOR = 'M'.
LS_HEADDATA-MATL_TYPE = 'FERT'.
LS_HEADDATA-BASIC_VIEW = 'X'.
* -- MARA
LS_CLIENTDATA-BASE_UOM = 'EA'.
LS_CLIENTDATA-BASE_UOM_ISO = 'EA'.
LS_CLIENTDATAX-BASE_UOM = ABAP_TRUE.
LS_CLIENTDATAX-BASE_UOM_ISO = ABAP_TRUE.
* -- Text
LS_MATERIALDESCRIPTION-LANGU = 'EN'.
LS_MATERIALDESCRIPTION-LANGU_ISO = 'EN'.
LS_MATERIALDESCRIPTION-MATL_DESC = PV_MAKTX.
append LS_MATERIALDESCRIPTION to LT_MATERIALDESCRIPTION.
call function 'BAPI_MATERIAL_SAVEDATA'
exporting
HEADDATA = LS_HEADDATA
CLIENTDATA = LS_CLIENTDATA
CLIENTDATAX = LS_CLIENTDATAX
importing
RETURN = PS_RETURN
tables
MATERIALDESCRIPTION = LT_MATERIALDESCRIPTION.
if PS_RETURN-TYPE eq 'S'.
call function 'BAPI_TRANSACTION_COMMIT'.
endif.
endform. " CREATE_MATERIAL
Как видно из исходного кода, ФМ принимает на вход 2 параметра: Номер материала и Краткий текст материала. ФМ запускает создание материала и возвращает результат в таблице, имеющей структуру BAPIRET2.
Теперь перейдем к процессу создания .exe приложения. Для этого будем использовать бесплатный продукт Microsoft – Visual Studio Express 2015 for Windows Desktop.
Запускаем Visual Studio и создаем новый проект (Рис. 4)
Рис. 4. Создание нового проекта в Visual Studio
В качестве Application type выбираем Console application (Рис. 5)
Рис. 5. Выбор типа приложения.
Далее, в свойства проекта, в параметр C/C++->General->Additional Include Directories добавляем путь к инклудам библиотеки SAP RFC SDK. В нашем случае, библиотека (представляющая из себя каталог nwrfcsdk) находится по пути C:\Share\, и путь к инклудам будет соответственно: C:\Share\nwrfcsdk\include (Рис. 6)
Рис. 6. Добавление пути к инклудам библиотеки RFC SDK в свойства проекта
Если система SAP является Unicode, то в параметр проекта C/C++->Command Line надо добавить опцию /DSAPwithUNICODE (Рис.7)
Рис. 7. Дополнительная опция для Unicode
Для линковщика в параметрах проекта надо добавить:
1. В параметр Linker->General->Additional Library Directories добавить путь к каталогу lib библиотеки RFC SDK. В нашем случае: C:\Share\nwrfcsdk\lib (Рис. 8)
Рис. 8. Добавление пути к библиотекам.
2. В параметр Linker->Input->Additional Dependenciesдобавить библиотеки: sapnwrfc.libи libsapucum.lib (Рис. 9)
Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland
ЗарегистрироватьсяУ вас уже есть учетная запись?
Войти
Обсуждения 3
Комментарий от
Олег Точенюк
| 15 июня 2016, 19:42
Комментарий от
Александр Неловкин
| 23 июня 2016, 13:38
Олег Точенюк 15 июня 2016, 19:42
Может лучше все же веб-сервисы? Точнее проще, как с поддержкой так и разработкой, да и с точки зрения безопасности, там вроде как вариантов больше чем в явном виде пароль хранить.
Комментарий от
Олег Точенюк
| 23 июня 2016, 23:25
Александр Неловкин 23 июня 2016, 13:38
Да, Олег, тут я с тобой согласен. Только в старых версиях веб-сервисов нет, а этот механизм будет работать и в "древних" системах. В любом случае, знать о такой возможности полезно, а уж какой путь выбрать - решать разработчику в каждом конкретном случае. "Осведомлен - значит вооружен!" :)