Sap bapi connector, data-daily

Нарешті знайшовся час написати про ще одному варіанті SAP коннектора, який також активно використовується в роботі!

Отже, зустрічаємо: SAP BAPI Connector!

SAP BAPI Connector працює з функціональними модулями в SAP.

Функціональний модуль (ФМ, він же FM) - код ABAP, оформлений у вигляді окремої функції, яка може бути повторно використана в інших розробках.

Має два види параметрів:

  • Імпортовані - дані, що передаються «на вхід» ФМ з викликає програми;
  • Експортовані - дані, які повертаються з ФМ, результат роботи;

Якраз з цими параметрами і працює коннектор, передає певні значення на вхід і отримує запитуваний результат.

Імпортовані параметри можуть бути як певними значеннями або змінними, так і таблицями. Результат зазвичай у вигляді таблиці.

Використання SAP BAPI Connector

Ми використовуємо SAP BAPI коннектор в двох випадках:

  1. Отримання даних (таблиці) з уже існуючого ФМ вSAP. Отриману таблицю з SAP вбудовуємо в асоціативну модель Кліка або вивантажували в файл формату qvd.
  2. Передача даних вSAP за допомогою імпортованого параметра у вигляді таблиці. Таким чином, ми передаємо в модуль дані, а вже ці дані обробляються на стороні SAP і записуються в кінцеву таблицю на стороні SAP, тобто ми безпосередньо передаємо дані в структуру таблиць SAP. Як експортованих даних ми отримуємо таблицю з неуспішно обробленими записами, а також причиною, по якій запис була відхилена (цей функціонал реалізується фахівцями SAP).

Так як на таблиці SAP у нас є строго тільки права для читання, цей функціонал виявився дуже зручною можливістю для взаємодії QlikView і SAP.

Тепер по крокам розповім про кожного з двох випадків.

Створення конекту і отримання даних з ФМ SAP

Для початку потрібно створити рядок конекту.

Вибираємо серед варіантів конекту QvSAPBAPIConnector (при наявності встановленого SAP коннектора)

Sap bapi connector, data-daily

Фахівці SAP із задоволенням повідомлять необхідні параметри, залишається натиснути TestConnection:

Sap bapi connector, data-daily

При коректному заповненні отримаємо:

Sap bapi connector, data-daily

Далі переходимо в режим роботи з функціональними модулями і натискаємо на кнопку BAPI:

Sap bapi connector, data-daily

У вікні послідовно виконуємо дії:

  1. Вказуємо ім'я функціонального модуля.
  2. Натискаємо кнопку "Getparameters" (Отримати параметри).
  3. Заповнюємо необхідні значення для отриманих параметрів.
  4. Вибираємо експортований параметр.
  5. Натискаємо кнопку "Add call to script"
  6. Генерітся код скрипта
  7. Натискаємо на кнопку «ОК» і отримуємо скрипт з п.6 в скрипті QV.

Sap bapi connector, data-daily

В отриманому скрипті замість значень параметра можна вказати змінні.

Як результат отримуємо таблицю ET_CALENDAR_TB і далі або використовуємо її при побудові асоціативної моделі, або вивантажуємо дані в файл формату qvd.

Передача даних в SAP за допомогою BAPI Connector

Цей випадок мені здається більш цікавим і незвичайним, тому детально його розглянемо.

Приблизний алгоритм роботи для передачі даних у вигляді таблиці в якості параметра при використанні SAP BAPI Connector такий:

  1. Визначитися з даними
  2. підготувати дані
  3. Узгодити формат.
  4. Завантажити дані для попередньої звірки.
  5. Підготувати змінні.
  6. Передати дані в SAP
  7. Обробити дані на стороні SAP
  8. Обробити інформацію, передану від SAP (в нашому випадку, як говорив, - це таблиця з неуспішно обробленими записами і їх причинами)

Давайте розберемо на прикладі передачі даних в SAP по парафіях грошових коштів від інкасацій.

  1. Визначаємося з даними, які потрібно відправити.

У нас є таблиця Result. яку нам треба передати в SAP:

Це найбільший пункт!

По-перше, нам потрібно дізнатися у фахівців SAP структуру таблиці, в яку будуть заливатися даних.

Структура цільової таблиці SAP в даному випадку така:

MANDT, - номер мандант

BUKRS, - найменування балансової одиниці

BUDAT, - дата

KUNNR, - номер магазину

WAERS, - валюта

WRBTR, - сума у ​​валюті

HBKID - банк зарахування

У нас є не всі стовпці, тому відсутні стовпці створюємо самостійно, решта перетворимо. В результаті отримуємо такий код:

LOAD
'100' as MANDT,
'BSTP' as BUKRS,
Year (Дата_пріхода_корр) Num (Month (Дата_пріхода_корр), '00') Num (Day (Дата_пріхода_корр), '00') as BUDAT,
ПФМ as KUNNR,
'RUB' as WAERS,
Floor (Sum (проінкасованої)) as WRBTR,
ApplyMap ( 'BankNameMap2', Банк_план) as HBKID
Resident Result
Where not IsNull (ПФМ)
Group By Дата_пріхода_корр, ПФМ, ApplyMap ( 'BankNameMap2', Банк_план);

  • Поля MANDT. BURKS. WAERS створюємо самостійно.
  • Поле Дата_пріхода_корр перетворюємо в формат приймається SAP, 'YYYYMMDD'.
  • Поле Банк_план коригуємо за допомогою таблиці зіставлення на значення, які використовуються в SAP, як короткий код кредитора.
  • Поле проінкасованої округляем і підсумовуємо, так як після застосування mapping може вийти кілька рядків по одному магазину / банку в один день, що суперечить логіці вивантаження.
  • При передачі чисел з дробовою частиною необхідно передавати значення з роздільником '. '(Точка), кому як роздільник числа функціональний модуль не прийняв.

Так як логіка вивантаження була такою, щоб ми перезаписували оновлені значення на майбутні дати, виникла необхідність додати одну перевірку, на випадок, якщо в новій вивантаженні немає даних по будь-яким магазинах. Дану перевірку можна реалізувати і на стороні SAP, ми ж зробили в QlikView таким чином:

  • Додаємо в LOAD ключове поле:

Num (Дата_пріхода_корр) '|' ApplyMap ( 'BankNameMap2', Банк_план) '|' ПФМ as ПФМ_БАНК_ДАТА

  • Вивантажуємо з таблиці, в яку буде йти вивантаження, дані по магазинам, яких немає в поточній вивантаженні, замість суми передаємо «0» для перезапису цих даних в подальшому:

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)';

  • Видаляємо ключове поле DROP Field ПФМ_БАНК_ДАТА;

Підготовка даних завершена, але це ще не все.

Тепер потрібно перетворити їх для подальшої передачі в функціональний модуль.

Дані передаються в функціональний метод наступним чином (частина скрипта для поля MANDT):

Усередині фігурних дужок ми повинні передати всі значення. Щоб зробити це за одну команду, ми знайшли таке рішення - використовувати змінні.

  • для початку об'єднуємо всі значення в одне поле, робимо це за допомогою функції Concat. Обов'язковою є використання сортування, тому що без неї дані всередині отриманого поля будуть розташовуватися в хаотичному порядку.

Як роздільник потрібно використовувати «,».

  • Таблиця Т2 буде містити тільки один запис, а значення в кожному полі буде містити всі значення поля з попередньої таблиці.

На прикладі поля BUDAT:

T2: // Об'єднуємо значення по полях.
LOAD
Concat (MANDT, ' »,»') as MANDTx,
Concat (BUKRS, ' »,»') as BUKRSx,
Concat (BUDAT, ' »,»', KUNNR * 100000000 + BUDAT + WRBTR) as BUDATx, // KUNNR * 100000000 + BUDAT, це сортування при використанні Concat, без неї весь скрипт марний.
Concat (KUNNR, ' »,»'. KUNNR * 100000000 + BUDAT + WRBTR) as KUNNRx,

Concat (WAERS, ' »,»') as WAERSx,
Concat (WRBTR, ' »,»'. KUNNR * 100000000 + BUDAT + WRBTR) as WRBTRx,
Concat (HBKID, ' »,»'. KUNNR * 100000000 + BUDAT + WRBTR) as HBKIDx
Resident T1;

  • І, нарешті, значення з отриманих полів передаємо в змінні, тут як варіант підійде функція Peek.
  1. Залишилося передати дані в SAP.

Виробляємо коннект, як в попередньому прикладі.

В даному випадку, в якості вхідного параметра наведено таблицю:

Sap bapi connector, data-daily

Для прикладу і кращого розуміння заповнимо кілька записів, натиснувши на рядок з таблицею:

Sap bapi connector, data-daily

Натискаємо Add call to script

В отриманому скрипті залишається замінити значення в квадратних дужках на створені раніше змінні!

Важливо: поставити змінну в лапках.

  1. При запуску скрипта QlikView дані передаються функціональним модулю, який і обробляє отримані значення.
  2. Як експортного параметра приходить таблиця, при наявності записів у ній можна зрозуміти, які дані не передалися в таблицю.
  • При необхідності, змінивши рядок конекту, можна передати дані на інший сервер SAP (наприклад, на тестовий) або ж кілька разів вивантажувати модуль з різними параметрами.
  • Самі дані записуються в таблицю досить швидко, але іноді відповідь до QlikView доходить досить довго і програма переходить до наступного кроку з затримкою. На практиці це було тільки один раз. В результаті розділили вивантаження на кілька потоків.
  • Якщо після скрипта коннектора на вкладці є ще оператори, то на них не діє підсвічування синтаксису. Цю проблему вирішує створення нової вкладки.
  • Обов'язково потрібно переконатися, що значення в таблиці на стороні SAP відповідають значенням в початковій таблиці, при наявності розбіжностей потрібно повернутися до умові сортування функції Concat.

Можливості SAP BAPI Connector виявилися дуже затребувані, ми змогли перенести в звіти QlikView деякі корисні звіти безпосередньо з функціональних модулів, а можливість передачі таблиці в якості параметра дозволила відмовитися від схем з викладанням файлів на мережеві папки. Стабільність, швидкість і гнучкість передачі даних збільшилися.

Задавайте свої питання.

Дякую за увагу!

Вам також може бути цікаво: