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 некоторые полезные отчёты напрямую из функциональных модулей, а возможность передачи таблицы в качестве параметра позволила отказаться от схем с выкладыванием файлов на сетевые папки. Стабильность, скорость и гибкость передачи данных увеличились.
ABAP Blog
Все о разработке в решениях от SAP
ABAP Blog
Все о разработке в решениях от SAP
Ссылки
Цитаты
Чистый код может читаться и усовершенствоваться другими разработчиками, кроме его исходного автора. Для него написаны модульные и приемочные тесты. В чистом
коде используются содержательные имена. Для выполнения одной операции в нем используется один путь (вместо нескольких разных). Чистый код обладает минимальными зависимостями, которые явно определены, и четким, минимальным API. Код должен быть грамотным, потому что в зависимости от языка не вся необходимая информация может быть четко выражена в самом коде.
Д. Томас
Новое
Последние комментарии
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.
Чем BAPI лучше.
В этой статье поговорим о том, что такое BAPI, почему и как их следует использовать и в чем отличие от остальных функциональных модулей.
Для того, чтобы понять, в чем разница BAPI от остальных функциональных модулей (ФМ), стоит понять, что такое ФМ в целом и какие виды бывают.
По-простому, ФМ – это программа (метод для знающих про ООП), которую можно вызвать при выполнении другой программы. Все ФМ разделены на 3 типа:
Первые два типа стандартный и дистанционный, отличаются друг от друга только тем, что дистанционный можно вызвать из внешней системы, а стандартный предназначен для работы внутри одной системы.
Модуль обновления – используют в ФМ или других программах для записи данных в базу данных. Очень часто фм этого типа не обладают никакими дополнительными проверками и содержат только операции, которые приводят к обновлению данных в БД, т. е. insert, update, delete.
По сути, типом ФМ очерчивается его зона действия и возможности. При поиске подходящего ФМ очень полезно понимать эту разницу. Часто первые 2 типа называют модулями верхнего уровня и последний относят к нижнему уровню, имея в виду упрощение операций от верхнего уровня к нижнему, т. е. на верхнем уровне выполняются все проверки и логика, а на нижнем идут только обновления.
И так BAPI (Business Application Programming Interface\ Business API) – это чаще всего дистанционный функциональный модуль, предоставляемый компанией SAP в стандартной поставке системы. Служат для создания большинства стандартных объектов в системе, таких как заказ на поставку (PO), заказ клиента (SO).
Почему стоит стараться использовать BAPI:
Как найти BAPI
Используйте транзакцию BAPI. Далее по аналогичному меню в SPRO находим раздел с перечислением доступных функций к нашему объекту. Например, путь к BAPI по созданию заказа клиента приведен на Рисунок 1.
Рисунок 1 BAPI создать заказ клиента
Обратите внимание, что SAP несет ответственность за ФМ в статусе «Деблокировано».
Заключение
В работе консультанта части требуется найти программу\ФМ, которая по каким-то критериям создаст какой-то стандартный объект. Для этих объектов с вероятностью 90% существует BAPI.
Если не можете найти BAPI ищи стандартные или дистанционные ФМ, желательно в статусе «Деблокировано», но скорее всего получится найти в статусе «Не деблокировано» — это не означает, что ФМ использовать нельзя. Но с такими ФМ нужно проводить больше времени в тестировании т. к. этот ФМ скорее всего используется в SAP в каком-то конкретном случае и результат может немного отличаться от того, что требуется Вам.
И помните, никогда не используйте модули обновления в качестве создания объектов. В прочем, за очень редким исключением это может потребоваться, но перед этим убедитесь что ни Вы ни программист не может найти другого подходящего ФМ с нужными Вам функциями.
Чем BAPI лучше.: 2 комментария
Спасибо за статью, все понятно написано для общего ознакомления
Что такое bapi sap
Часовой пояс: UTC + 3 часа
Правила форума
| Председатель |
![]() |
Зарегистрирован:
Вт, авг 17 2004, 14:35
Сообщения: 1519
Откуда: В ВЕЧНОМ БАНЕ
| Модератор |
![]() |
Зарегистрирован:
Ср, авг 18 2004, 10:59
Сообщения: 754
Откуда: Moscow
| _________________ Часовой пояс: UTC + 3 часа Кто сейчас на конференцииСейчас этот форум просматривают: нет зарегистрированных пользователей |
| Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения |
Логотип © 2006 Андрей Горшков
Поддержка: Кирилл Андреев, 2011-…
SAP BAPI (Business Application Programming Interface)
SAP BAPI (Business Application Programming Interface) is a standard interface to the business object models in SAP products.
BAPIs are the primary method through which customer code and third-party applications interact with SAP products. BAPIs wrap the internal layers of SAP’s business object model to ensure that all business logic, validations and authorization checks are executed properly when accessing or changing business objects.
BAPIs are implemented as function modules that call SAP internal code. Depending on which set of BAPIs is being used, they may call business object models defined using the Business Objects Processing Framework (BOPF) or legacy models defined using programs, tables and function modules.
BAPIs expose a formal and stable interface that developers of customer and third-party code can use to access and interface with SAP business objects in a way that SAP guarantees will work in the future. Accessing underlying tables and non-BAPI function modules, programs, and classes is also possible in SAP systems, but it does not come with the same guarantee that the code will work in the future or that the objects being accessed will even exist.
Such use of non-BAPI interfaces can result in problems during upgrades or require small patches if the signature of an internal function module changes, making the code that relies on it invalid.
BAPIs are only supposed to be used by third-party or customer developers if they have been released, meaning SAP has designated them as ready for use and guaranteed to remain stable in the future. The release status can be checked by looking at the Released On date in the attributes section of the function module BAPI. If that field is blank, then the BAPI hasn’t been released by SAP and should not be used.
To use an SAP BAPI in the Advanced Business Application Programming (ABAP) language, a developer uses ABAP’s CALL FUNCTION to invoke the function module (see screenshot 1). Alternatively, most BAPIs are remote-enabled, meaning they can be invoked via Remote Function Call (RFC), web services or SAP’s Java connector.

There are BAPIs that enable full automation of most business processes in each SAP product that is based on the ABAP platform. The documentation for each SAP product offers some information about the available BAPIs. It can also be useful to search for function modules starting with BAPI in the SE37 and SE80 SAP transaction codes or ABAP for Eclipse.
Each BAPI function module should have extensive documentation available in multiple languages accessible through the Function Module Documentation option in SE37. It is important to read this documentation thoroughly because BAPIs vary widely in their structure and behavior, and they can sometimes work in unexpected ways or fail with cryptic error messages if their requirements are not met.

Two of the important parameters in screenshot 2 are ADDRESSDATA and ADDRESSDATA_X. This type of pairing is typical of BAPIs, where the second _X structure is a set of flags indicating exactly which fields should be updated.
Because BAPIs are implemented as function modules, they do not fit naturally in the ABAP object-oriented programming (OOP) paradigm of classes, methods and interfaces. Nonetheless, they are usually implemented in an object-oriented way, as they are interfaces to SAP business objects.
In ABAP, these function modules can be called from programs, function modules or classes. It is often preferable to wrap BAPI calls in data access objects (DAOs), which are classes that encapsulate the calls to the BAPIs. Doing this enables unit testing with a mock version of the DAO, allowing testing of developer code separate from the testing of the BAPI calls themselves.
Related Terms
ABAP (Advanced Business Application Programming)
Must-know modularization basics from ABAP programming tutorial
Implementing modern practices in an ABAP development shop
SAP ABAP programming needs to be brought into the modern era
Unit4 CEO Mike Ettling discusses the midmarket vendor’s evolution to multi-tenant SaaS ERP and the «people experience» of ERP for.
A new supply chain dashboard from the White House promises to provide valuable data on supply chain disruption, but it may not be.
The latest database release from Cockroach Labs focuses on providing optimized capabilities for large deployments that can handle.
Think you’re ready for the AWS Certified Solutions Architect certification exam? Test your knowledge with these 12 questions, and.
Amazon said its van monitoring system is designed solely for driver safety. But many industry experts have concerns regarding the.
Amazon would like to strengthen its global footprint, but the e-commerce giant faces roadblocks and challenges today that did not.
Choosing the right HR technology and tools for your company requires first understanding one truth: There is no perfect software.




















