Меню

Интеграция SAP и Python. Как проще забрать данные из SAP

|

Хочу поделиться опытом решения интересной задачи: как без особого труда взаимодействовать с системами SAP с помощью Python — не важно, какой модуль или версия платформы.

Если интересно только техническое решение, то пропускайте всю лирику и смотрите пример реализации.

Хочу поделиться опытом решения интересной задачи: как без особого труда взаимодействовать с системами SAP с помощью Python — не важно, какой модуль или версия платформы.

Если интересно только техническое решение, то пропускайте всю лирику и смотрите пример реализации.

Оглавление

Постановка задачи

Решение на Python

Реализация

Коннект к системе заказчика

Результат

Итог

Постановка задачи

Одному из заказчиков потребовалось выгружать данные из своей SAP ERP системы, путем манипуляций создавать отчеты и рассылки интересованным людям по email, и некоторые другие действия.

При обсуждениях путей решения такой задачи мы, как подрядчик, предлагали различные варианты и один из самых очевидных - это все сделать именно с помощью внутреннего функционала SAP, по-простому, на жаргоне, принятом среди «саперов», заЗедить все с помощью ABAP.

Первое. С чем мы столкнулись, это не совсем прозрачные, со слов заказчика, критерии выборки данных, а именно, данные каких таблиц, зачем и почему выбирать, какие действия с ними необходимо совершить. Если привести пример, то заказчику нужна была выгрузка данных посещаемости сотрудниками офиса,  в разрезе табеля и отпусков. Также нужно было создать отчеты по эффективности сотрудника с аналитикой по его времени на рабочем месте, не буду вдаваться в подробности, но скажу, что количество проведенного времени влияет на продуктивность, но что бы это выяснить нужно рассчитывать количество времени на работе с результатом работы и многое другое. Это только один из примеров отчета, а заказчик генерировал их очень много в ходе обсуждений.

После долгих разговоров мы поняли, что таким решением может стать SAP Query или BI\BO, но заказчика не очень устроила рассчитанная стоимость решения и не самая удобная гибкость.

Решение на Python

Тут, на свою голову, я вспомнил об одной статье на ресурсе про библиотеку pyrfc и так-как я, не будучи программистом python, всё же читал о нем когда-то статьи, решил изучить это дома. К моему удивлению я с легкостью в домашних условия, будучи дилетантом данного языка программирования, обнаружил, что подключиться к любой системе SAP невероятно просто, более того, это занимает 20 минут.

Двадцать минут, КАРЛ!!!

Просто представьте, что можно настроить интерфейс подключения с ERP системой SAP без использования шин данных и всяких там PI\XI за такое крошечное время.

Реализация

Окончательно убедившись, что это вполне рабочее решение и удовлетворяет заказчика, я изучил несколько платформ (изучил подразумевается почитал о каждой минут по 10) я выбрал среди прочих равных платформу Odoo, так как она проще развертывается и у нее есть все необходимые свойства, такие как: Хороший интерфейс, система прав доступа, мобильное приложение, почтовый сервер, хороший интерфейс с базой данных(psql).

Далее все очень просто.

Установить на виртуальную машину заказчика Odoo (я взял версию 8) т.к. она самая простая на текущий момент, знаю, что уже существует версия 12, но задача не требует всех крутых новинок.

Установил все необходимые библиотеки, в частности pyrfc — ссылка на статью посвящённую установке и подключению.

Далее необходимо было только написать небольшой модуль в самой платформе Odoo, для коннекта, а инструментов для визуализации данных у нее предостаточно.

Коннект к системе заказчика:

from pyrfc import Connection
user = 'user'
passwd = 'secretuser'
saprouter = '/H/192.168.0.140/S/3297'

conn = Connection(user=user, passwd=password,
                  mshost='CLient',
                  msserv='192.168.0.140',
                  sysid='01',
                  group="SPACE",
                  saprouter=saprouter, 
                  client=‘900')

Вызов BAPI для получения информации о юзере

b_result = conn.call('BAPI_USER_GET_DETAIL',

                     USERNAME = 'user',

                     CACHE_RESULTS  = ' ')

Изменение юзера

     updated_address['CITY'] = u'Moscow'

r = conn.call('BAPI_USER_CHANGE',

               USERNAME='user',

               ADDRESS=updated_address)

Самым главным инструментом для получения данных из SAP, если речь идет о таблицах, является функциональный модуль RFC_READ_TABLE, есть в SAP платформе и другие модули, которые можно вызвать, на них должна быть настройка, которая говорит о том, что их можно вызвать средствами RFC.

Например:

from pyrfc import Connection, ABAPApplicationError, ABAPRuntimeError, LogonError, CommunicationError

from ConfigParser import ConfigParser

Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland

У вас уже есть учетная запись?

Войти

Обсуждения Количество комментариев4

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

Олег Точенюк

  |  23 октября 2018, 14:17

1.
==По большому счету данный метод открывает огромные возможности по
==замене очень дорогих инструментов SAP
Это звучит как денег на дорогой болид формулы не хватило, поэтому купили только двигатель. Потом поставили его в кузов лады-калины, ну как-то втолкали, но все равно едет хренова и обслуживать дорого. Вопрос, а нахрена так кувыркаться?
 
2. По RFC все равно из какого языка конектиться, в бытности 4.6 из php ходили в свое время, чуть позже на С#. Кстати примеры для PHP были в справке сапа, там еще кажется джава была.
 
3. Что касается лицензий, то раньше вроде как всем было все равно, но сейчас сап стал не ровно дышать к таким реализациям, считая что это нарушение лицензии, ну или предлагает для каждого коннекта заводить отдельность пользователя, а это само собой лицензии со всеми вытекающими. В итоге недорогой инструмент, становится как-то очень дорогим если считать правильно по лицензиям. Да и кстати не понял, чем программа на питоне проще той же программы на абапе, а так же, как неясные критерии заказчика стали ясными в питоне и оставались такими же неясными в абапе, ну т.е. зазЭтить на питоне типа зазЭтом не считается как я понимаю? Кстати, поддерживать всю эту кухню, тоже та еще радость.
 
4. Ну и по поводу отсутствия галки RFC в заголовке ФМ. Если функция не имеет галки удаленного вызова, то никто вам не мешает сделать окаймляющую функцию вокруг нужной с галкой RFC и без проблем использовать удаленные вызовы функционала.

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

Виктор Шведов

  |  29 октября 2018, 11:36

1.
==По большому счету данный метод открывает огромные возможности по
==замене очень дорогих инструментов SAP
Это звучит как денег на дорогой болид формулы не хватило, поэтому купили только двигатель. Потом поставили его в кузов лады-калины, ну как-то втолкали, но все равно едет хренова и обслуживать дорого. Вопрос, а нахрена так кувыркаться?
 
2. По RFC все равно из какого языка конектиться, в бытности 4.6 из php ходили в свое время, чуть позже на С#. Кстати примеры для PHP были в справке сапа, там еще кажется джава была.
 
3. Что касается лицензий, то раньше вроде как всем было все равно, но сейчас сап стал не ровно дышать к таким реализациям, считая что это нарушение лицензии, ну или предлагает для каждого коннекта заводить отдельность пользователя, а это само собой лицензии со всеми вытекающими. В итоге недорогой инструмент, становится как-то очень дорогим если считать правильно по лицензиям. Да и кстати не понял, чем программа на питоне проще той же программы на абапе, а так же, как неясные критерии заказчика стали ясными в питоне и оставались такими же неясными в абапе, ну т.е. зазЭтить на питоне типа зазЭтом не считается как я понимаю? Кстати, поддерживать всю эту кухню, тоже та еще радость.
 
4. Ну и по поводу отсутствия галки RFC в заголовке ФМ. Если функция не имеет галки удаленного вызова, то никто вам не мешает сделать окаймляющую функцию вокруг нужной с галкой RFC и без проблем использовать удаленные вызовы функционала.

Добрый день Олег, по большому счету вы правы, RFC не самый лучший способ исполнения, но он работает, и бог с ним.
 
Сейчас я практикую конект с SAP по rest(oData) с SAP, он более эффективен
 
Но суть не в том, чтобы скрестить Дорогой болид формулы 1 (python) и ржавую ладу калину (SAP), если сравнивать технологии, то именно так правильнее.
Суть — это брать данные из SAP и передавать их в современные системы обработки данных и библиотек, tenser Flow, pandas и прочее.
Сказки о том, что у SAP есть эффективные инструменты обработки данных с помощью нейросетей и предиктивной аналитики не выдерживают никакой критики.
Пока SAP скупит все компании, которые этим занимаются на приемлемом уровне, появятся еще 100500 технологий.
А по вашему вопросу(почему не написать все это на ABAP) все просто, Среда SAP NetWiever не позволяет быть гибкой, современной, функциональной.

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

Антон Сорокин

  |  31 октября 2018, 09:02

Отличная статья! Спасибо, Виктор.

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

Олег Точенюк

  |  31 октября 2018, 17:28

Добрый день Олег, по большому счету вы правы, RFC не самый лучший способ исполнения, но он работает, и бог с ним.
 
Сейчас я практикую конект с SAP по rest(oData) с SAP, он более эффективен
 
Но суть не в том, чтобы скрестить Дорогой болид формулы 1 (python) и ржавую ладу калину (SAP), если сравнивать технологии, то именно так правильнее.
Суть — это брать данные из SAP и передавать их в современные системы обработки данных и библиотек, tenser Flow, pandas и прочее.
Сказки о том, что у SAP есть эффективные инструменты обработки данных с помощью нейросетей и предиктивной аналитики не выдерживают никакой критики.
Пока SAP скупит все компании, которые этим занимаются на приемлемом уровне, появятся еще 100500 технологий.
А по вашему вопросу(почему не написать все это на ABAP) все просто, Среда SAP NetWiever не позволяет быть гибкой, современной, функциональной.

===
реда SAP NetWiever не позволяет быть гибкой, современной, функциональной.
===
 
Спорное заявление, как и предыдущие кто лада, а кто формула 1 :-) но смысла спорить на эту тему не вижу.