Поговорим о выгрузке данных из SAP ERP или S/4 HANA с использованием механизма SAP RFC.
Такая выгрузка может служить для наполнения аналитического хранилища данных или для интеграции с другой системой.
Интерфейс SAP RFC (remote function call) позволяет вызывать различные функции SAP из стороннего приложения.
Преимущества этого интерфейса:
- прямое и быстрое подключение с SAP. 
- возможность менять параметры запроса, запрашивая данные частями. 
- отсутствие промежуточных звеньев в обмене данными и, как следствие, высокая надежность. 
Установка
Для работы через RFC вам потребуется установить следующее:
- Библиотека PyRFC https://github.com/SAP/PyRFC pip install pynwrfc 
- Библиотека SAP NW RFC для вашей платформы, скачанный с https://support.sap.com (нужен акаунт SAP). 
- Установить переменную окружения, указав каталог с библиотекой SAP NW RFC: SAPNWRFC_HOME=C:\NWRFC\nwrfcsdk\ 
Поиск уже имеющихся в системе функций
В системе SAP можно поискать уже готовые функциональные модули.
Сделать это можно следующим образом:
- Запустить транзакцию SE16 (просмотр таблиц). 
- Указать имя таблицы TFDIR. 
- Задать фильтры для поиска: 
- FUNCNAME=*MATERIAL* (задать маску поиска) 
- FMODE=R (возможность вызова функции через механизм RFC) 
Чтение таблиц через RFC_READ_TABLE
RFC_READ_TABLE позволяет выгружать данные из таблицы SAP, ограничивая выборку фильтрами.
Несмотря на то, что SAP позиционирует эту функцию как тестовую и не предназначенную для использования в продуктивной среде, она вполне работоспособна.
Следует сказать, что RFC_READ_TABLE часто неудобна, т.к. она позволяет читать только одну таблицу (не поддерживает JOIN).
В этой статье я не буду подробно описывать работу с этой функцией, т.к. в интернете существует множество примеров ее использования. Вместо этого приведу пример вызова функции стандартной функции BAPI_MATERIAL_GETLIST, выдающий список материалов по заданным критериям поиска.
Просмотр функции через SE37
Входные и выходные параметры функции можно просмотреть с использованием транзакции SE37.
Параметры вызова функции присутствуют на следующих вкладках:
- Importing - входные параметры простого типа (не табличные) 
- Exporting - выходные параметры простого типа 
- Tables - как входные, так и выходные параметры в виде таблиц 
Рассмотрим использование SE37 на примере BAPI_MATERIAL_GETLIST.
Для того, чтобы посмотреть состав полей таблиц нужно дважды кликнуть на поле с типом данных.
Эта функция выдает не слишком много полезных данных: Номер материала и описание.
Другие таблицы нужны для передачи на вход параметров выборки.
Например поиск по коду материала (MATNRSELECTION):
Подключаемся к SAP
Подключение к SAP с использованием библиотеки pyrfc делается не сложно. (Настройки подключения можно посмотреть в SAP GUI.)
Код на Python:
import pandas as pd
import os
import pyrfc
conn = pyrfc.Connection(user='', passwd='', 
    mshost='111.111.11.11', msserv='3600', sysid='010', 
    group='NN', saprouter='', lang='EN',client='')   
Вызываем необходимую функцию
Рассмотрим вызов функции на примере BAPI_MATERIAL_GETLIST.
Сначала зададим входные параметры.
В данном случае для каждого параметра в таблице будет по одной строке.
Строка таблицы задается как python dictionary, а вся таблица задается как list, состоящий из строк.
В нашем примере укажем фильтр на код материала: '' (т.е. все значения), а также укажем значение для Plant.
Для выборки используем SIGN="I" (Includes),
Варианты для OPTION:
- EQ Equal 
- BT Between (требует задать значение для для LOW и HIGH) 
- LE Less Equal 
- GE Greater Equal 
- CP Contains Pattern 
matnrselection = [{'SIGN':'I', 'OPTION':'CP', 'MATNR_LOW':''}]
plantselection = [{'SIGN':'I', 'OPTION':'EQ', 'PLANT_LOW':'NNNN'}]
Далее вызываем функцию с этими параметрами.
result = conn.call('BAPI_MATERIAL_GETLIST', 
    MATNRSELECTION = matnrselection,   PLANTSELECTION = plantselection)
Преобразуем результат в DataFrame
DataFrame можно получить в одну строку:
df = pd.DataFrame(result['MATNRLIST'])
Где MATNRLIST, это имя результирующей таблицы, указанное в разделе Tables.
Итак, с помощью буквально нескольких строк кода, мы получили данные из SAP в DataFrame и можем дальше работать с этими данным используя все возможности языка Python.
 
           
 


menket
А с полномочиями что? Можно прямо любую таблицу прочесть? Вот безопасники-то обрадуются.
SobolevP Автор
Добрый день! Когда вы подключаетесь к RFC, SAP проверяет полномочия вашего пользователя. Таблицы сможете прочитать те, которые разрешены правами. (Конечно лучше создать специальную учетную запись для интеграции).