Abap blog, динамічне програмування в abap

Abap blog, динамічне програмування в abap

Днями довелося прослухати курс BC402 в рамках програми «Вечірній ABAP», хочеться висловити подяку компанії SAP за таку можливість, а також відзначити професіоналізм викладача, в ролі якого виступав Василь Ковальський. Сам курс присвячений огляду досить великих тим, які, так чи інакше, стануть в нагоді всім ABAP програмістам в їх повсякденній діяльності. Однією з розглянутих тем даного курсу була можливість динамічного програмування в ABAP, про яку і хотілося б поговорити далі.

Ключовою особливістю програмного забезпечення є його здатність до зміни і пристосування до мінливих умов. Одним з інструментів забезпечують таке пристосування є динамічне програмування.

У ABAP під динамічним програмуванням можуть розумітися такі речі:

  • Динамічні доповнення до операторів, коли замість констант, підставляються змінні: CALL FUNCTION gv_function, go_some => (gv_method), SORT lt_tab BY (gv_column, SELECT (lv_fieldlist) FROM (gv_table) ... WHERE (lv_where) і т.д.
  • Генерація програм за допомогою спеціальних операторів: INSERT REPORT, GENERATE SUBROUTINE POOL.
  • Динаміка з використанням field-symbols.
  • Динаміка з використанням довідкових змінних, в т.ч. за допомогою runtime type services.

У даній статті будуть розглянуті останні 2 способи, інформацію по іншим можна отримати з офіційної довідки, а також з курсу BC402.

Для динамічного програмування необхідно зрозуміти, що таке посилальні змінні і покажчики на поля (field symbols) і в чому їх відмінності.

Для розробників, які тільки починають вивчення ABAP термін field-symbols часто може викликати плутанину. Ті з них, хто працював з мовами C / C ++, часто плутають їх з типом покажчика (Pointer). Але field-symbols не є покажчиками на область пам'яті, вони лише є покажчиками на змінну або об'єкт даних які є видимими в поточному блоці коду (можна використовувати термін alias).

На наступному малюнку добре видно основні відмінності.

Abap blog, динамічне програмування в abap

У нас є три об'єкти:

узагальнені типи

На додаток до стандартних типів даних, в ABAP існує так само ряд узагальнених типів, використання яких можливе тільки в разі: формальних параметрів методів (функцій, процедур), field-symbols і довідкових змінних. Часто використовуючи динамічне програмування, доводиться мати справу із заздалегідь невідомими типами даних, для цього потрібно знати яким чином їх можна представити у вигляді узагальнених типів.

Перелік таких типів визначено нижче:

Runtime type services

Раніше розглянуті приклади показували, яким чином можна використовувати field-symbols і посилальні змінні, проте в підсумку ми працювали з типами даних, які так чи інакше вже десь описані. А що якщо до нас на вхід прийшов тип даних, створений під час виконання? Для отримання його опису ми можемо скористатися інструментом, який називається RTTS. По суті це певна ієрархія (набір) класів, викликаючи методи яких ми можемо отримати повний опис типу даних. Крім описової можливості, даний інструмент дозволяє динамічно створювати типи даних під час виконання програми.

Ієрархія класів RTTS виглядає наступним чином:

Abap blog, динамічне програмування в abap

У верху ієрархії стоїть клас CL_ABAP_TYPEDESCR який має абстрактний тип, таким чином ви не зможете створити його інстанцію, проте важливість цього класу в іншому, він містить фабричні методи які дозволять вам отримати інстанцію нижчестоящих класів в залежності від переданих параметрів і методів. Наприклад можна отримати опис щодо імені типу даних:

З приводу динамічного програмування, вірніше, динамічного створення таблиці.
Була у мене завдання створити звіт по залишках коштів на всіх рахунках компанії в різних країнах і різних банках. ЕСС-но, рахунків може бути скільки завгодно і їх кількість може змінюватися.
Моє таке динамічне рішення (create_dynamic_table) було забраковано «верхівкою» відділу і було наказано створити словникову структуру з 300 стовпців ( «цього має вистачити»), ессно, руками. Суперечка дійшов майже до бійки. Ось думаю, це у мене проблеми з логікою або начальницьку самодурство непереможне?

На жаль начальницьку самодурство складно перемогти. Був випадок коли через не знання того що таке rfc начальство було складно переконати в його використанні, хоча це цілком собі стандарт комунікації між sap системами 😉

молоде завзяття + бажання довести, що все все роблять неправильно

Схожі статті