Системни разширения (Enhancement Framework)

Системни разширения (Enhancement Framework). Част 1

Продължавам да публикувам на портала SAPLand поредица от статии„Техники за разширения към стандартната система SAP“.

Забележка:Започвайки от версията ECC 6.0, се появи чудесен механизъм за разширяване на функционалността на системата (Enhancementspot/section), но това е и най-лесният начин да "счупите системата на коляно", тъй като системата не упражнява никакъв контрол върху това какво и как прилагате в точката на разширение.

Обща концепция.

Спот/секция за подобрения – Техника за разширение, която ви позволява виртуално да инжектирате персонализиран код навсякъде в стандартна бизнес транзакция. Подобренията в системата се делят на "явни" и "неявни". Явните точки на разширение, като техниката за излизане от клиента, използват специално въведен оператор, докато неявните точки на разширение действително присъстват в началото и края на логически завършени блокове от код или структури от данни. Техниката за подобрения на място/секция ви позволява да инжектирате потребителски код в контекста на изпълнение на стандартния системен код. Получавате достъп до всички променливи и всъщност можете напълно да предефинирате логиката на системата, което е много опасно, тъй като може да доведе до сериозни повреди в работата на стандартните транзакции, ако кодът за разширение е внедрен неправилно. В момента, от една страна, това е много мощен механизъм за разширяване на функционалността, а от друга е най-несигурният от всички видове разширения. Обща препоръка от SAP: ако има възможност за използване на друг тип разширение - използвайте го, използвайте техниката Enhancements само ако няма други възможности за влияние върху изпълнимия код.

подобрениеSpot, образно казано, е нов механизъм за изход в системата, всъщност системата предоставя нова възможност за разширяване на стандартната функционалност без получаване на ключове за модификация на системни обекти. Също така е гарантирано, че при никакви системни актуализации направените от вас разширения ще бъдат презаписани, въпреки че не е гарантирано, че ще останат функционални. В момента концепцията за разширения поддържа следните разширения на системни обекти:

  • Разширяване на класове - възможно е да се добавят нови незадължителни параметри към методи, да се добавят pre и post методи към съществуващ метод, които се извикват преди извикването на самия метод, и общо заместване на метода е налично с помощта на инструкцията за презаписване.
  • Разширение на функцията - възможност за добавяне на нови незадължителни параметри към функцията. В този случай, разбира се, ще трябва да използвате функционалността „разширение на кода“, тъй като параметрите, които сте добавили, трябва да бъдат обработени по някакъв начин от някого.
  • Разширение на изходния код - както възможността да вмъкнете собствена логика в определени позиции на изходния код, така и замяната на част от кода с вашата собствена работна логика. Всъщност този механизъм ми се струва най-често използван в практиката, така че примерите в статията са изградени, за да демонстрират работата на това конкретно разширение.
  • Разширение за уеб екрани - Позволява ви да добавяте нови елементи към вашите UI екрани. Все още не съм срещал това разширение, но ако някой се интересува и има нужда от него, тогава отиваме на www.help.sap.com, тъй като имаме предвид уеб екрани, базирани на парадигмата на Model View Controller (MVC).
  • Нови BADI - технологията за внедряване на BADI е внедрена от версия 4.6, но с появата натехнологията за разширение, принципът на техническо изпълнение на BADI се е променил, т.е. на външен вид употребата е останала практически същата, но разработчиците на SAP казват, че новите BADI са започнали да работят по-бързо. Технологията BADI започна да работи с помощта на така наречените удължителни точки, базирани на техниката Enhancement Spot.

Благодарение на появата на техниката Enhancement, техниката за бизнес разширения на функционалността стана достъпна в системата, т.е. когато влезете в транзакция SFW5,Фигура 1: SFW5-01.png и активирате бизнес функцията, от която се нуждаете, имайте предвид, че всъщност понякога във вашата система се активират стотици точки за разширение, които изпълняват функционалността на тази бизнес функция.

системни

Фиг. 1: SFW5-01.png

Разширения на класове

Ако сте първият, който разшири класа, тогава ще бъдете попитани за името на разширението и ако планирате да разширите няколко обекта, за да реализирате един бизнес процес, тогава е препоръчително да ги комбинирате в група / контейнер за разширения,

разширения

Фиг. 2: CL-01.png

Името на разширението, подобно на името на контейнера, се създава според стандартните потребителски конвенции, т.е. Z или Y,Фигура 3: CL-02.png. Ако вече съществува разширение за класа, тогава ще ви бъде даден списък със съществуващи разширения и можете да изберете да промените съществуващо или да създадете ново, но ако това е разширение от SAP, тогава, разбира се, няма да можете да го използвате, за да включите вашите промени.

Фиг. 3: CL-02.png

След като потвърдите създаването на разширението, ще можете да добавяте нови атрибути или методи към класа, както виждаме наФигура 4: CL-03.png ; в таблиците се отвориха полета за въвеждане на необходимата информация за разширението на класа. Ти трябваразберете, че ако добавите нов атрибут или метод към клас, тогава трябва да се уверите, че той е имплементиран. Няма ограничение за именуване, но ви препоръчвам да останете в рамките на стандартната конвенция за именуване, тъй като разработчикът може също да иска да разшири класа си и ще се натъкнете на проблеми със съвпадението на имената при следващата актуализация. Следователно бих назовал моите добавени атрибути или методи, започвайки с префикса "ZZ_". Така да се каже. за безопасност,Фигура 5: CL-04.png. Както виждаме. след добавяне на нов метод системата вижда, че в този случай методът е в разширението ZI_CL_SALV_TABLE.

като

Фиг. 4: CL-03.png

След това можем да добавим необходимите атрибути за извикване към метода, например в този случай класът показва таблица, но има един проблем: ширината на заглавката се задава автоматично според количеството информация, показана в заглавката, което не е много удобно, ако показваме много редове там. Потребителят трябва да намалява заглавието всеки път след стартиране на отчета.

като

Фиг. 5: CL-04.png

като

Фиг. 6: CL-05.png

Във вашия метод имате пълен достъп до всички променливи на класа, така че можете да извършвате операции като замяна на вътрешните атрибути на класа или извикване на защитени методи. Например, по подразбиране в новия метод за показване на клас, аз просто копирах кода от стандартния метод:

МЕТОД zz_display. ПРОВЕРЕТЕ ме->r_controller IS BOUND.

Както можете да видите, имам достъп до променлива, която е вътрешна за класа,Фигура 7: CL-06.png, и системата не извежда никаква грешка.

Фиг. 7: CL-06.png

Разширение "преди" или "след" извикване на стандартен метод.

Системата позволява не само добавяне на нови атрибути иметоди, но също така добавят така наречените предварителни методи, които винаги ще бъдат извиквани преди извикването на всеки стандартен метод. Можете също така напълно да замените стандартния метод, въпреки че смисълът на това действие не ми е много ясен, причините, поради които смятам така, ще бъдат по-долу.

И така, ние разширяваме класа, като добавяме код, който се изпълнява преди извикването на стандартния метод на класа. За целта ставаме в полето на метода, който ни интересува и избираме от менюто: „Клас“ – „Разширяване“ и тъй като вече имаме едно разширение на класа, системата ще ни помоли да изберем името на разширението, в рамките на което ще извършим модификацията,Фигура 8: CL-07.png.

Фиг. 8: CL-07.png

След това поставете курсора върху името на метода DISPLAY и изберете от менюто: „Процес“ - „Операции за разширение“ - „Добавяне на предварително. метод",Фигура 9: CL-08.png.

системни

Фиг. 9: CL-08.png

Ако няма проблеми с добавянето, тогава в колоната „PreExit“ ще бъде добавен бутон за превключване към кода на метода,Фигура 10: CL-09.png

Фиг. 10: CL-09.png

Тъй като все още не сме създали реализации, последната колона „Инжектиране на разширения“ все още е празна, но веднага щом преминем към въвеждане на кода, името на нашето вградено разширение ще бъде заменено в колоната. Когато за първи път въведете поддръжката на предварителен метод, системата ще генерира нов клас, който прилага този метод. Кодът на класа ще бъде както следва:

ДЕФИНИЦИЯ НА КЛАС LCL_ZI_CL_SALV_TABLE. ПУБЛИЧНА СЕКЦИЯ. КЛАС-ДАННИ OBJ ТИП РЕФ КЪМ LCL_ZI_CL_SALV_TABLE. DATA CORE_OBJECT TYPE REF TO CL_SALV_TABLE. ИНТЕРФЕЙСИ IPR_ZI_CL_SALV_TABLE. МЕТОДИ: КОНСТРУКТОР ИМПОРТИРА CORE_OBJECT ТИП REF КЪМ CL_SALV_TABLE ПО ИЗБОР. КРАЕН КЛАС. РЕАЛИЗАЦИЯ НА КЛАС LCL_ZI_CL_SALV_TABLE. КОНСТРУКТОР НА МЕТОДИ. АЗ->CORE_OBJECT = CORE_OBJECT. КРАЙЕН МЕТОД.

Както можете да видите, създава се клас, в който е декларирана вътрешната променливаCORE_OBJECT. Тази променлива получава препратка към основната реализация на класа, към който ще бъде направено извикването.

Характеристики на внедряване на класове за Pre, Post или Overwrite методи.

Параметрите на тези методи винаги са равни на оригиналните параметри на отменените методи, които вие отменяте, следвайки изискванията:

  • Предварителен метод – Не трябва да има изходни параметри
  • Метод Post – Не трябва да има входни параметри, докато изходните параметри (EXPORT) на оригиналния метод стават променливи параметри (CHANGING) в метода Post. Върнатите параметри (RETURNING) също стават променливи параметри (CHANGING).
  • Презаписване - Изпълнението на параметър не се презаписва.

Не можете да добавяте или променяте набора от предадени параметри и фактът, че получавате препратка към оригиналния обект във вашия локален клас, е точно основата на проблема с такъв метод за разширение на класа. Той се крие във факта, че имате достъп само до декларираните методи и атрибути на класа. В тази реализация на разширението не са налични атрибути или методи, маркирани като вътрешни, така че обхватът на този тип разширение е значително стеснен. Особено не разбирам схемата за предефиниране на OverwriteExit. Тъй като обикновено кодът се извиква вътре в метода, който работи с вътрешни променливи, до които нямаме достъп в рамките на нашата реализация на класа. Какво можем да направим там в тази ситуация, ми е трудно да кажа. Склонен съм да мисля, че тези разширения са по-необходими на самите разработчици на SAP; когато трябва напълно да промените изпълнениетометод, те пишат нов метод, като например DISPLAY_2. Освен това, за да не се счупи целият код, който използва старото извикване, плюс това може да бъде кодът на партньорите, те просто прилагат заместител на метода DISPLAY, вътре в който извикват новия метод DISPLAY_2; по този начин, без да се нарушава използването на този клас навсякъде в системата, и по този начин се гарантира безпроблемно актуализиране на програмите.

Разширяване на функцията.

enhancement

Фиг. 11: FM-01.png

След като изберете командата за разширение, ще имате достъп до полетата за въвеждане на собствени параметри в интерфейса на функционалния модул. Препоръчвам конвенцията за именуване на параметри същата като при разширяване на класове, т.е. започваме имената на полетата с префикса ZZ. Всички добавени параметри ще имат атрибут - "optional", за да не се нарушават извикванията на този модул в съществуващи програмни текстове.

Разширения на изходния код.

След разширяване на класовете, мисля, че това е един от най-интересните начини за разширяване на стандартния системен код. Може да се каже, че от една страна SAP отиде и освен това значително към разработчиците, които поддържат или внедряват системата на клиента, но от друга страна, броят на проблемите, които могат да възникнат с лошо написан код, може просто да стане катастрофален, до пълна загуба на производителност на системата. Затова общата препоръка е да мислите добре и много, преди да внедрите нещо чрез нови опции за разширение на системата.

История на един проблем: Преди около пет години бяхме помолени да разгледаме в една система причината, поради която не е създадена планирана заявка за покупка за определена група материали в производствената система по време на изпълнението на MRP. Преди мен местни специалисти се сблъскаха с този проблем там, след това специалисти от SAP AG търсиха седмица,всъщност един от тях ме свърза. Какво е необходимо спешно стана ясно буквално час след като ми дадоха параметрите

Ограничен достъп

За да прочететепълната версияна статията, трябва да влезете каторегистриран потребител.