Badi - технологія впровадження бізнес розширень

Продовження циклу статей "Техніки розширень стандартної системи SAP".

BADI - Технологія впровадження бізнес розширень / доповнень в код стандартних транзакцій; дана техніка доступна в будь-яких модулях системи, фактично ця технологія, яка використовує об'єктно-орієнтований підхід до реалізації розширень системи, вийшла для заміни техніки Customerexits. Технологія BADI покликана вирішити основну проблему використання точки розширення декількома користувачами, - ізолювати призначені для користувача реалізації розширень один від одного. Якщо проаналізувати код системи і подивитися місця додавання викликів BADI, то можна замінити, що виклики додані до або після виклику Customerexits, тобто функції виду CALL CUSTOMER-FUNCTION. Отже, в більшості випадків можна використовувати або Customerexits, або відповідний йому BADI. До речі, в такому випадку, в класі такого BADI перелік доступних для реалізації методів, збігається з кількістю з переліком функцій в рамках компонента розширення Customerexits-а.

Сьогодні існують два варіанти реалізації технології BADI: це так звані старі і нові BADI розширення. Різниця між ними полягає в способі реалізації класу розширення. У старих реалізаціях BADI, використовувалася техніка інтерфейсів, тобто фактично користувачеві пропонувалося, реалізувати спадкоємця методу класу і таким чином вибудовувалася ланцюжок незалежних реалізацій. Така методика дозволяла рознести різні реалізації в свої розширення, однак проблеми в одній з успадкованих реалізацій могли поламати роботу всіх призначених для користувача розширень. Так само не вирішувалася проблема зберігання глобальних змінних. Тому, через деякий час компанія перейшла на новий тип BADI; тепер при реалізації ви пишете клас, як спадкоємець заздалегідь визначеного класу, що реалізує розширення. У точці виклику система перевіряє наявність усіх створених і активних інстанцій - спадкоємців від базового класу розширення і викликає відповідні методи всіх зареєстрованих класів спадкоємців. Перелік методів, які будуть викликатися і точки виклику, заздалегідь визначені в батьківському класі. Для механізму реалізації нових BADI в мову системи були введені дві нові службові команди GET BADI і CALL BADI.

Примітка: За заявами розробників SAP, нова техніка BADI працює швидше використовуваного перш механізму. Однак середньостатистичний користувач навряд чи помітить будь - яке прискорення / уповільнення при викликах нової або старої реалізації.

На перший погляд, для користувача особливо нічого не змінюється при реалізації як старих, так і нових BADI. Однак, насправді відмінності істотні. Нова техніка розширень вирішила проблему зберігання глобальних змінних в рамках класу реалізації, що було досить проблематично здійснити, використовуючи механізми успадкування методів. Класи реалізації повністю стали незалежними і відповідно розробники отримали роздільні об'єкти, які можна незалежно обробляти. Саме нова технологія BADI, надає повну ізоляцію кожної інстанції; нерозуміння цих відмінностей, призводить до неправильного використання нових BADI. Наприклад, при переході від старого типу реалізації до нового набір методів залишився старий, а ось параметри методів істотно змінилися, що призвело до повної дезорієнтації частини розробників, особливо індуських. Простий приклад, в системі існує BADI: MB_MIGO_BADI - Поля користувача на екрані MIGO. У старій реалізації методу CHECK_ITEM, якщо правильно пам'ятаю (на жаль, старої системи у мене вже немає), вам передавалася позиція документа, яку ви могли перевірити на помилки і повернути результат перевірки в параметр ET_BAPIRET2. У новій реалізації в цей метод передається тільки значення змінної I_LINE_ID - Unique Identification of Document Line, тобто лише номер позиції яку треба перевірити, але даних самої позиції вам не передається. Це призвело до того, що на купі індуських форумів і частини російськомовних, скопійованих з індуських, реалізується механізм збереження вводяться позицій через IMPORT TO MEMORY в методі IF_EX_MB_MIGO_BADI

Рекомендація: Якщо ви не розумієте механізму роботи, які не відштовхуйтеся від припущення, що реалізував даний механізм, був неповноцінним, так як в 99% ви просто не розібралися в рішенні, а 1% я залишаю на прикордонні випадки.

Приклад роботи з BADI, пропоную розглянути на основі роботи з транзакцією MB_MIGO_BADI. раз вже почав цей розділ з її згадки. Так як система нова, то будемо використовувати механізм реалізації нового BADI. До речі, якщо ви спробуєте використовувати старий або так званий класичний BADI, то все одно на певному етапі реалізації система скаже вам, що вже існує нова реалізація для даного BADI, тому буде виконана конвертація даних для нового механізму. Звідси випливає, що в системі не може існувати одночасно підтримка реалізації старого і нового механізмів BADI для одного і того ж об'єкта, як наприклад, для MB_MIGO_BADI.

Створення точки розширення виконується в транзакції SE19 - BAdI-Builder - впровадження, Рис.1. Транзакція працює або в режимі створення, або в режимі зміни розширення. Якщо чесно, не дуже поширений варіант першого екрану транзакції. Для створення точки розширення потрібно ввести ім'я існуючої в системі точки розширення, в даному випадку це MB_MIGO_BADI. Вибираємо режим створення розширення.

Badi - технологія впровадження бізнес розширень

З'явиться діалоговий екран із запитом створюваної точки розширення, який буде реалізовувати наше розширення. Так як основне ім'я MB_MIGO_BADI. то ім'я створюваної точки нехай буде ZZ_MB_MIGO_BADI. ім'я може бути будь-яке придатне під угоди по найменуванню об'єктів, Рис.2.

Для угруповання декількох точок розширень, які «обслуговують» один бізнес-процес, можна створити групове ім'я, яке буде об'єднувати створювані розширення, для спрощення управління всіма реалізаціями. Якщо це просто локальна реалізація розширення, то можна не створювати групове ім'я. Після підтвердження створення з'являється запит на введення імені реалізації, вказівки класу реалізації та вибору визначення BADI, Рис.3. це все організовано, так, тому як точка розширення може включати в себе кілька різних класів, в сукупності складових реалізацію точки розширення. У нашому випадку точка розширення збігається на ім'я з класом реалізації, при цьому клас реалізації для точки тільки один.

Після заповнення всіх полів підтверджуємо введення. Система запропонує нам варіант створення реалізації (фактично успадкованого класу). Так як у нас є приклад реалізації, і ми створюємо розширення даного типу в перший раз, то найкращим виходом буде створення реалізації на основі копіювання класу-прикладу Якщо ж ви вже знаєте, як створювати розширення, то вибираєте створення порожнього класу, так як при копіюванні класу-прикладу створюваний новий клас буде реалізовувати всі методи класу-паррента (шаблону), хоча вам, може бути, і не потрібно реалізація всіх методів, Рис.4.

Badi - технологія впровадження бізнес розширень

Badi - технологія впровадження бізнес розширень

Працювати з точкою розширення можна або використовуючи і далі транзакцію SE19 або ж можна працювати вже з класом, які реалізують розширення, використовуючи транзакцію SE24 / SE80.

Так як, клас був створений на основі шаблону, то кількість об'єктів, що підлягають активації буде великим. Ви повинні просто виділити всі позиції і провести активацію всіх об'єктів, Рис.7.

Badi - технологія впровадження бізнес розширень

Після активації даних в транзакції MIGO з'являться закладки полів користувача, Рис.8.

Badi - технологія впровадження бізнес розширень

Badi - технологія впровадження бізнес розширень

Система «бачить», що існує реалізація розширення і «оформлений» спадкоємець класу, тому в момент запуску транзакції вона створює клас, який відповідає за реалізацію. У вашому класі вам доступний метод INIT, який викликається в конструкторі. Для кожного BADI-розширення можливі різні правила створення реалізує класу, саме тому, загальна рекомендація при створенні BADI, в перший раз, виконувати створення шляхом копіювання з зразка, якщо звичайно це можливо. У методі INIT система повинна повернути ім'я вашої реалізації. В даному випадку ім'я реалізації пропонується задати константою в рамках вашого класу і далі інкорпорувати цю константу в повертаються параметри методу ініціалізації класу, Рис.10.

Badi - технологія впровадження бізнес розширень

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

Badi - технологія впровадження бізнес розширень

Далі при кожному додаванні рядка в документ руху матеріалу в транзакції MIGO, система буде викликати метод LINE_MODIFY - Add / Change a Line (GOITEM), тобто при кожному додаванні або зміні рядка документа ви будете отримувати повідомлення. Як чином пропонується реалізувати даний метод? Так як фактично ви створили клас, то все необхідні для роботи поля з позиції документа, пропонується зберігати у внутрішній приватній таблиці класу. Структура, що описує таблицю, створюється в словнику даних і потім ви оформляєте внутрішню змінну в рамках класу, Рис.12.

Badi - технологія впровадження бізнес розширень

У коді реалізації, ви просто читаєте необхідний рядок позиції документа з цієї таблиці по ключу I_LINE_ID, який обов'язково повинен бути включений в вашу внутрішню структуру, так як це унікальний номер рядка позиції документа. Якщо рядок знайдено, тоді ви вносите її у своїй таблиці, так як прийшли нові зміни, якщо ж рядка немає, тоді ви додаєте цей рядок в свою внутрішню таблицю. Таким чином, в рамках класу, що реалізує розширення, ви завжди маєте таблицю рядків документа. Саме тому в метод CHECK_ITEM - Check Item Data of Goods Movement система передає вам тільки унікальний номер рядка, яку слід перевірити, так як саму рядок ви повинні витягти з внутрішньої таблиці рядків свого класу реалізації. Само собою, в цій таблиці потрібно зберегти не тільки поля, які ви додали на власний екран, але і поля які вам будуть потрібні для перевірки введених даних, Рис.13. тому вам не потрібно виконувати якісь рухи тіла по збереженню позицій документа через пам'ять

Обмежений доступ

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