Меню

Вызов 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

Может лучше все же веб-сервисы? Точнее проще, как с поддержкой так и разработкой, да и с точки зрения безопасности, там вроде как вариантов больше чем в явном виде пароль хранить.

Да, Олег, тут я с тобой согласен. Только в старых версиях веб-сервисов нет, а этот механизм будет работать и в "древних" системах. В любом случае, знать о такой возможности полезно, а уж какой путь выбрать - решать разработчику в каждом конкретном случае. "Осведомлен - значит вооружен!" :)

Комментарий от  

Олег Точенюк

  |  23 июня 2016, 23:25

Да, Олег, тут я с тобой согласен. Только в старых версиях веб-сервисов нет, а этот механизм будет работать и в "древних" системах. В любом случае, знать о такой возможности полезно, а уж какой путь выбрать - решать разработчику в каждом конкретном случае. "Осведомлен - значит вооружен!" :)

Да где ж ты их такие берешь типа 4.6С :-)