что такое bapi в sap
SAP BAPI Connector
Наконец-то нашлось время написать об ещё одном варианте SAP коннектора, который также активно используется в работе!
Итак, встречаем: SAP BAPI Connector!
SAP BAPI Connector работает с функциональными модулями в SAP.
Функциональный модуль (ФМ, он же FM) — код ABAP, оформленный в виде отдельной функции, которая может быть повторно использована в других разработках.
Имеет два вида параметров:
Как раз с этими параметрами и работает коннектор, передает определенные значения на вход и получает запрашиваемый результат.
Импортируемые параметры могут быть как определенными значениями или переменными, так и таблицами. Результат обычно в виде таблицы.
Использование SAP BAPI Connector
Мы используем SAP BAPI коннектор в двух случаях:
Так как на таблицы SAP у нас есть строго только права для чтения, этот функционал оказался очень удобной возможностью для взаимодействия QlikView и SAP.
Теперь по шагам расскажу о каждом из двух случаев.
Создание коннекта и получение данных из ФМ SAP
Для начала нужно создать строку коннекта.
Выбираем среди вариантов коннекта QvSAPBAPIConnector (при наличии установленного SAP коннектора)
Специалисты SAP с удовольствием сообщат необходимые параметры, остается нажать Test Connection:
При корректном заполнении получим:
Далее переходим в режим работы с функциональными модулями и нажимаем на кнопку BAPI:
В появившемся окне последовательно выполняем действия:
В полученном скрипте вместо значений параметра можно указать переменные.
Как результат получаем таблицу ET_CALENDAR_TB и далее либо используем её при построении ассоциативной модели, либо выгружаем данные в файл формата qvd.
Передача данных в SAP с помощью BAPI Connector
Этот случай мне кажется более интересным и необычным, поэтому подробно его рассмотрим.
Примерный алгоритм работы для передачи данных в виде таблицы в качестве параметра при использовании SAP BAPI Connector таков:
Пример
Давайте разберём на примере передачи данных в SAP по приходам денежных средств от инкассаций.
У нас есть таблица Result, которую нам надо передать в SAP:
Result:
Это самый большой пункт!
Во-первых, нам нужно узнать у специалистов SAP структуру таблицы, в которую будут заливаться данных.
Структура целевой таблицы SAP в данном случае такова:
MANDT, — номер манданта
BUKRS, — наименование балансовой единицы
KUNNR, — номер магазина
WRBTR, — сумма в валюте
HBKID — банк зачисления
У нас есть не все столбцы, поэтому недостающие столбцы создаём самостоятельно, остальное преобразуем. В итоге получаем такой код:
Так как логика выгрузки была такой, чтобы мы перезаписывали обновленные значения на будущие даты, возникла необходимость добавить одну проверку, на случай, если в новой выгрузке нет данных по каким-либо магазинам. Данную проверку можно реализовать и на стороне SAP, мы же сделали в QlikView таким образом:
Num(Дата_прихода_корр) & ‘|’& ApplyMap(‘BankNameMap2’, Банк_план) &’|’& ПФМ as ПФМ_БАНК_ДАТА
Concatenate (T1)
LOAD
If(isNum(KUNNR), Num(KUNNR),KUNNR) as KUNNR,
HBKID,
100 as MANDT,
‘RUB’ as WAERS,
‘BSTP’ as BUKRS,
0 as WRBTR,
Year(BUDAT)&Num(Month(BUDAT),’00’)&Num(Day(BUDAT),’00’) as BUDAT
Where not Exists(ПФМ_БАНК_ДАТА, Num(BUDAT)&’|’& HBKID &’|’& If(isNum(KUNNR), Num(KUNNR),KUNNR));
SELECT
KUNNR,
HBKID,
WRBTR,
BUDAT
From Z_TABLE_IN_SAP
WHERE BUDAT >= ‘$(vTodayYear)$(vTodayMonth)$(vTodayDay)’;
Подготовка данных завершена, но это еще не все.
Теперь нужно преобразовать их для дальнейшей передачи в функциональный модуль.
Данные передаются в функциональный метод следующим образом (часть скрипта для поля MANDT):
«table»:
[
<
«field»:»MANDT»,
«length»:3,
«type»:»CHAR»,
«values»:
[ «100» ]
>,
Внутри фигурных скобок мы должны передать все значения. Чтобы сделать это за одну команду, мы нашли такое решение — использовать переменные.
В качестве разделителя нужно использовать «,».
На примере поля BUDAT:
LET vMandt = Peek(‘MANDTx’); //Присваиваем переменным значения полей для дальнейшей загрузки в SAP
LET vBukrs = Peek(‘BUKRSx’);
LET vBudat = Peek(‘BUDATx’);
LET vKunnr = Peek(‘KUNNRx’);
LET vWaers = Peek(‘WAERSx’);
LET vWrbtr = Peek(‘WRBTRx’);
LET vHbkid = Peek(‘HBKIDx’);
Производим коннект, как в предыдущем примере.
В данном случае, в качестве входного параметра представлена таблица:
Для примера и лучшего понимания заполним несколько записей, нажав на строку с таблицей:
Нажимаем Add call to script
В полученном скрипте остается заменить значения в квадратных скобках на созданные ранее переменные!
«field»:»KUNNR»,
«length»:10,
«type»:»CHAR»,
«values»:
[ «555», «777» ]
«field»:»KUNNR»,
«length»:10,
«type»:»CHAR»,
«values»:
[ «$(vKunnr)» ]
Важно: поставить переменную в кавычках.
Заметки:
Возможности SAP BAPI Connector оказались очень востребованы, мы смогли перенести в отчёты QlikView некоторые полезные отчёты напрямую из функциональных модулей, а возможность передачи таблицы в качестве параметра позволила отказаться от схем с выкладыванием файлов на сетевые папки. Стабильность, скорость и гибкость передачи данных увеличились.
Что такое BAPI?
Они предоставляют стабильные и стандартизованные методы для достижения полной интеграции между системой R / 3 и внешними приложениями, унаследованными системами и надстройками.
BAPI определены в BOR (репозитории бизнес-объектов) как методы типов бизнес-объектов SAP, которые выполняют определенные бизнес-функции. Они реализованы как функциональные модули с поддержкой RFC и создаются в построителе функций ABAP Workbench.
Как создать BAPI
Шаг 3. В следующем диалоговом окне необходимо указать следующую информацию:
Шаг 4. Чтобы создать метод, выберите «Да» в следующем диалоговом окне.
Шаг 5. После того, как программа была сгенерирована и выполнена, проверьте программу в только что созданном методе. Таким образом, создается BAPI.
Тестирование BAPI
Вы можете протестировать BAPI, протестировав отдельный метод бизнес-объекта в построителе бизнес-объектов. (или можно использовать транзакцию SWUD для проверки метода).
Освобождение и замораживание BAPI
Вы также можете использовать BAPI Explorer (код транзакции BAPI) для просмотра 360 ‘на BAPI
Методика создания DMS-документа посредством BAPI
Самородов Евгений Александрович
В статье рассмотрим на примере методику автоматического создания прототипа DMS-документа и прикрепления оригинала к нему.
Оглавление
Введение
В SAP ERP можно найти такой компонент, как DMS (Document Management System или Система управления документами). DMS позволяет избежать избыточности данных и минимизировать рабочую нагрузку при обновлении и обмене данными. Система управления документами, предназначенная для создания, хранения, изменения и просмотра документов доступна через транзакции: CV01N, CV02N, CV03N.
В статье рассмотрим на примере методику автоматического создания прототипа DMS-документа и прикрепления оригинала к нему.
Создание прототипа
Создание нового вида документа
«Определение видов документов» (в англ. варианте «Define Document Type») (Рисунок 1).
Рисунок 1 – Поиск в структуре
В списке совпадений находим «Система управления документами» (или «Document management system») (Рисунок 2):
Рисунок 2 – Окно списка совпадений
После чего произойдет позиционирование на нашем элементе (Рисунок 3):
Рисунок 3 – IMG-операция «Определение видов документов» в структуре
Затем кликаем на иконку с часами и попадаем на экран определения видов документов.
Инструмент также доступен из транзакции DC10, но запуск через SPRO предпочтителен, потому как в этом случае будет автоматически создан настроечный запрос с записью IMG-операции.
Рисунок 4 – «Определение видов документов»
Рисунок 5 – Создание нового вида документа
В открывшемся окне (Рисунок 4) в строке инструментов нажимаем на «Новые записи» (Рисунок 5).
Далее, кликаем на подпункт «Описание зависящих от языка видов документов», где указываем требуемые данные для языка (Рисунок 6).
Рисунок 6 Описание вида документа для языка.
Создание прототипа DMS-документа
Для создания прототипа DMS-документа будем использовать BAPI_DOCUMENT_CREATE2. Пример:
ls_document TYPE bapi_doc_aux,
ls_return TYPE bapiret2,
ls_document_in TYPE bapi_doc_draw2.
ls_document_in-description = ‘Документ для теста’.
CALL FUNCTION ‘BAPI_DOCUMENT_CREATE2’
На вход ФМ «BAPI_DOCUMENT_CREATE2» подается:
Работа над ошибками и проверка корректности процесса
ФМ должен вернуть информацию о созданном документе в структуре LS_DOCUMENT или информацию об ошибке в LS_RETURN, если что-то пошло не так.
Если ошибки нет (LS_RETURN-TYPE <> ‘E’), выполняем COMMIT, чтобы изменения вступили в силу или, в противном случае, откатываем изменения. Пример:
IF ls_return-type NE ‘E’.
CALL FUNCTION ‘BAPI_TRANSACTION_COMMIT’
После COMMIT проверяем успешность создания через транзакцию CV02N, с указанием типа LS_DOCUMENT-DOCTYPE и номера LS_DOCUMENT-DOCNUMBER документа. Где можем убедиться, что документ создан (Рисунок 7).
Рисунок 7 – Просмотр созданного документа
Может так случиться, что LS_RETURN вернет ошибку(E 26 068): «Сетевой адрес DEFAULT вашей ЭВМ не определен» (англ. «Network address DEFAULT of your computer is not maintained»).
В этом случае, требуется задать тип носителя данных в транзакции DC20, например, как показано на следующей серии рисунков (Рисунок 8, Рисунок 9, Рисунок 10).
Рисунок 8 – Определение типа носителя данных для внешнего интерфейса
Рисунок 9 – Указание носителя данных
Рисунок 10 – Идентификация компьютеров внешнего интерфейса
Прикрепление оригинала к прототипу
Прикрепление файла, расположенного на стороне клиента
Далее приступим к прикреплению оригинала к созданному прототипу документа. Для этого, используем ФМ BAPI_DOCUMENT_CHANGE2.
Также потребуется файл, если быть точнее, адрес файла для загрузки.
Перед вызовом BAPI_DOCUMENT_CHANGE2 для загрузки оригинала можно проверить наличие документа, тип и номер которого следует передать на вход ФМ. Для этого следует использовать BAPI_DOCUMENT_GETDETAIL2. Пример:
DATA: lt_files TYPE TABLE OF bapi_doc_files2.
CALL FUNCTION ‘BAPI_DOCUMENT_GETDETAIL2’
На вход подаются поля типа документа DOCUMENTTYPE и его номера DOCUMENTNUMBER из структуры LS_DOCUMENT, полученной на выходе BAPI_DOCUMENT_CREATE2, при создании DMS. Выставление флага GETDOCFILES, дает возможность увидеть в таблице LT_FILES уже имеющиеся оригиналы в документе.
В случае успеха, BAPI вернет пустую структуру LS_RETURN и структуру LS_DOCUMENT_IN с заполненными данными документа.
Если файл, требующий загрузки, находится на стороне клиента. Загрузка оригинала так, как показано ниже.
lt_file_table TYPE filetable,
lv_filename TYPE string,
CALL METHOD cl_gui_frontend_services=>file_open_dialog
Вызов BAPI из внешних программ
Неловкин Александр Николаевич
Chief Software Engineer
Введение
Довольно редко 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). Исходный код этого ФМ:
perform CREATE_MATERIAL using I_MATNR
I_MAKTX
changing LV_RETURN.
append LV_RETURN to ET_RETURN.
Исходный код подпрограммы 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.
LS_CLIENTDATAX-BASE_UOM = ABAP_TRUE.
LS_CLIENTDATAX-BASE_UOM_ISO = ABAP_TRUE.
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.
Как видно из исходного кода, ФМ принимает на вход 2 параметра: Номер материала и Краткий текст материала. ФМ запускает создание материала и возвращает результат в таблице, имеющей структуру BAPIRET2.
Запускаем 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
ABAP Blog
Все о разработке в решениях от SAP
ABAP Blog
Все о разработке в решениях от SAP
Ссылки
Цитаты
Прежде всего следует узнать, не что система выполняет, а над ЧЕМ она это выполняет!
Бертран Мейер
Новое
Последние комментарии
Remote Function Call
Remote Function Call (RFC, удалённый вызов функций) – стандартный интерфейс для обмена данными между SAP и не SAP системами. Интерфейс передачи данных основан на CPI-C или TCP/IP. Стандартная справка по теме RFC или курс BC415.
Особенности RFC функций
Настроить назначение для RFC вызова можно через транзакцию SM59 (Таблица RFCDES). Подробнее о настройке RFC соединений можно посмотреть в курсе BC415.
Назначение RFC вызовов
Назначение RFC вызова определяется с помощью ключевого слова DESTINATION. В качестве параметра может принимать имя удаленной системы, SPACE, NONE, BACK.
Обработка исключений при вызовах RFC
При вызове RFC модуля могут возникать следующие исключения:
Типы RFC функций:
В случае, когда вы вызываете несколько sRFC подряд из одной группы функций, глобальные данные группы функций будут доступны до тех пор, пока не будет вызвана последняя функция из данной группы.
Если в sRFC внутри себя вызывает CALL SCREEN, CALL TRANSACTION или отображение списка, вызываемые экраны будут отображены в программе запустившей sRFC, но только если в SM59 указан диалоговый удаленный доступ, иначе система выдаст исключение SYSTEM_FAILURE.
Процедура не должна иметь в своем теле операторы, прерывающие выполнение программы, такие как: CALL SCREEN, SUBMIT, COMMIT WORK, WAIT, RFC вызовы, сообщения с типами W и I.
Пример программы запускающей 2 aRFC функции и ожидающей выполнение обоих:
Если в качестве имени задачи в вызове aRFC указать TASK3, условия выполнены не будут.
Пример распараллеливания вычислений с помощью групп:
aRFC вызовы так же как и sRFC могут вызывать внутри себя диалоги, но их использование в данном контексте выглядит сомнительно, более подробно рассмотрено в курсе (BC415).
Все tRFC вызовы сохраняются в таблицах: ARFCSSTATE и ARFCSDATA. Если вы не хотите вызывать tRFC немедленно после COMMIT WORK, вы можете вызвать ФМ START_OF_BACKGROUNDTASK (до COMMITWORK) и задать время и дату запуска для накопленных tRFC вызовов.
После выполнения COMMIT WORK в случае успешного локального обновления (в рамках LUW основной программы), накопленные данные создают фоновую задачу, в случае успешного выполнения этой задачи все данные из таблиц tRFC удаляются. Если задача не была выполнена, срабатывает механизм повтора или отката.
Так, например если связь с удаленной системой не была установлена, срабатывает автоматический повтор выполнения задания. По умолчанию количество повторов равно 30, интервал ожидания равен 15 минутам.
В случае если во втором из двух tRFC вызовов произошел сбой, сообщение с типом A или X или вызов исключения через RAISE после успешного выполнения первого происходит следующее:
Для принудительного отката всех изменений или отмены tRFC-LUW служит ФМ — RESTART_OF_BACKGROUNDTASK.
В случае если вызовы tRFC происходят на разных системах (DESTINATION ‘A’, DESTIONATION ‘B’), для каждой из них создается свой tRFC-LUW, вызовы tRFC группируются в зависимости от назначения.
Для вызова tRFC отдельно от остальных можно воспользоваться ключевым словом: AS SEPARATE UNIT.
Каждый tRFC-LUW имеет свой уникальный ID, для его получения можно использовать ФМ: ID_OF_BACKGROUNDTASK (вызывать перед COMMIT WORK). Используя данный ID можно определить статус для tRFC-LUW через ФМ — STATUS_OF_BACKGROUNDTASK.
Для размещения tRFC вызовов в порядке FIFO (первый пришел, первый вышел) необходимо перед каждым tRFC вызовом указывать имя очереди, делается это с помощью ФМ: TRFC_SET_QUEUE_NAME:
Имя очереди может содержать 24 символа, исключая % и *.
Для администрирования qRFC вместо транзакции SM58 используется транзакция — SMQ1. Таблица, в которой хранятся данные qRFC — TRFCQOUT.
Более подробная информация о bgRFC находится тут.
Транзакции, используемые при работе с RFC
BAPI функции
Для обмена бизнес данными, между SAP и не SAP системами, был создан так называемый Business Framework. Центральной его частью является хранилище бизнес объектов (BOR – Business Object Repository). Каждый бизнес объект обеспечивает объектно-ориентированный подход к хранению бизнес данных и работы с бизнес процессами. Например, вызывая методы бизнес объектов, мы тем самым манипулируем бизнес данными, за которые он отвечает, не заботясь о техническом вопросе (связях в таблицах и т.п.)
Бизнес объект состоит из следующих частей:
BAPI – реализация метода бизнес объекта, представляет собой функциональный модуль RFC. BAPI могут вызываться как синхронно (COMMIT WORK AND WAIT), так и асинхронно т.е. ожидая выполнения работы функции или нет.
BAPI могут представлять различные действия над объектом:
BAPI могут вызываться из различных приложений: офисных приложений (через VBA), JAVA и С++ программ и т.п.
Все BAPI после своей работы возвращают результат в виде внутренней таблицы с одной из структур: BAPIRETURN, BAPIRETURN1, BAPIRET1, BAPIRET2, BAPIRET1_FIX. В связи с этим в BAPI нет обработки исключений как в стандартных ФМ. Все эти структуры содержат в себе следующие поля:
Если транзакция выполнена успешно, то в таблице RETURN не будет существовать записей с типом ошибки «Е». Должно присутствовать сообщение с типом ошибки «S».
Обновление в BAPI всегда происходит в IN UPDATE TASK (см. документацию по ключевому слову IN UPDATE TASK или курс по обновлению БД – BC414). Внутри BAPI никогда не вызывается COMMIT WORK. Для подтверждения или отката LUW всегда должны использоваться ФМ: BAPI_TRANSCATION_COMMIT, BAPI_TRANSACTION_ROLLBACK, разница между данными ФМ и COMMIT WORK (ROLLBACK WORK) в том что они чистят внутренние переменные используемые при вызовах BAPI, если этого не делать могут возникать проблемы при повторном вызове BAPI. Все BAPI вызванные в программе до вызова BAPI_TRANSCATION_COMMIT (BAPI_TRANSCATION_ROLLBACK) вызываются в одном LUW. Для просмотра всех имеющихся в системе BAPI служит транзакция BAPI (запускает BAPI EXPLORER).
Курс, в котором рассматривается создание собственных BAPI — BC417.