Перейти до вмісту

Dynpro

Dynpro (dynamic program) — класична ABAP-технологія користувацьких інтерфейсів у SAP GUI. До появи ООП і сучасних UI-технологій це був єдиний спосіб інтерактивної роботи з користувачем: намальований екран + процедурна логіка (flow logic) + dialog modules у ABAP-програмі. Сьогодні це legacy, але ти його зустрінеш майже у будь-якому on-premise ABAP-коді.

  • Dynpro ідентифікується чотиризначним номером у ABAP-програмі. 1000 зарезервовано.
  • Створюється тільки у function groups, module pools або executable programs (не у class pools).
  • Складається з:
    • Screen layout — візуальна частина, редагується у screen painter (SAP GUI, транзакція SE51 або подвійний клік на dynpro у SE80).
    • Element list — перелік screen elements (input fields, кнопки, радіо, таблиці тощо) + OK field.
    • Flow logic — процедурна послідовність подій PBO/PAI/POH/POV.
    • Attributes — тип (Normal / Modal / Subscreen), номер наступного dynpro, опис.

Поточний номер dynpro доступний у sy-dynnr.

Чотири події, що викликаються runtime-framework:

ПодіяКоли викликаєтьсяДля чого
PROCESS BEFORE OUTPUT (PBO)Перед показом dynproПідготувати дані, prefill полів, задати GUI status/title
PROCESS AFTER INPUT (PAI)Після дії користувача (ENTER, кнопка)Прочитати введене, валідувати, виконати логіку
PROCESS ON HELP-REQUEST (POH)F1 на поліПоказати field help
PROCESS ON VALUE-REQUEST (POV)F4 на поліПоказати input help
PROCESS BEFORE OUTPUT.
MODULE pbo_9000.
PROCESS AFTER INPUT.
MODULE pai_9000.
PROCESS ON HELP-REQUEST.
FIELD dynp_field MODULE help_mod.
PROCESS ON VALUE-REQUEST.
FIELD dynp_field MODULE f4_mod.

Особливі ключові слова у flow logic:

  • MODULE — викликає dialog module у ABAP-програмі.
  • FIELD — контролює transport поля з dynpro у ABAP та умовний виклик модулів.
  • CHAIN/ENDCHAIN — групує поля для спільної валідації.
  • LOOP/ENDLOOP — цикл для табличних контролів.
  • CALL SUBSCREEN — включає субекран.

Dialog module — processing block у ABAP-програмі, який dynpro викликає через MODULE:

" У ABAP-програмі
MODULE pbo_9000 OUTPUT.
SET PF-STATUS 'STATUS_9000'.
SET TITLEBAR 'TITLE_9000'.
some_input_field = 'Привіт'.
ENDMODULE.
MODULE pai_9000 INPUT.
save_ok = ok_code.
CLEAR ok_code.
CASE save_ok.
WHEN 'SAVE'.
" логіка
WHEN 'CANCEL'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMODULE.

Ключові правила:

  • Модулі без параметричного інтерфейсу — обмін тільки через глобальні змінні ABAP-програми.
  • Локальних даних нема — усе, що оголосиш всередині модуля, стає глобальним у програмі. Якщо потрібні локальні — винось у метод локального класу.
  • OUTPUT — для PBO, INPUT — для PAI/POH/POV.
  • Ім’я модуля довільне; конвенція — pbo_<dynnr> / pai_<dynnr>.

Трансфер даних між dynpro і програмою

Section titled “Трансфер даних між dynpro і програмою”

Dynpro field і глобальна змінна ABAP з однаковим імʼям автоматично обмінюються значеннями:

PROGRAM zdemo.
" Глобальні змінні — мають збігатись з іменами dynpro fields
DATA: ok_code LIKE sy-ucomm,
save_ok LIKE ok_code,
customer TYPE char30.
TABLES sflight. " для DDIC-структури з label/help
  • PBO: присвоєння глобальній змінній → transfer до dynpro field → відображення на екрані.
  • PAI: ввід користувача → dynpro field → transfer до глобальної змінної → обробка в ABAP.
  • TABLES <name> оголошує work area зі структури DDIC (зі всіма label-text і field-help).

Кожен dynpro має OK field — 20-символьне поле, куди потрапляє function code натиснутої кнопки/меню. За конвенцією — OK_CODE.

DATA: ok_code LIKE sy-ucomm,
save_ok LIKE ok_code.
MODULE pai_9000 INPUT.
save_ok = ok_code. " зберегти
CLEAR ok_code. " обовʼязково очистити!
CASE save_ok.
WHEN 'SAVE'.
" ...
WHEN 'EXIT' OR 'CANCEL'.
LEAVE PROGRAM.
ENDCASE.
ENDMODULE.

sy-ucomm теж містить function code, але його значення не завжди стабільне — працюй з власним OK field.

Умовні виклики модулів і валідація

Section titled “Умовні виклики модулів і валідація”

FIELD — контрольоване transporting

Section titled “FIELD — контрольоване transporting”
PROCESS AFTER INPUT.
MODULE pai_9000. " ні field_a, ні field_b ще не доступні в ABAP
FIELD field_a.
MODULE mod_a. " field_a вже transported, field_b — ні
FIELD field_b.
MODULE mod_b. " обидва доступні
" Викликати mod тільки якщо field не порожнє
FIELD dynp_field MODULE mod ON INPUT.
" Викликати mod тільки якщо значення field змінилось з минулого PBO
FIELD dynp_field MODULE mod ON REQUEST.

CHAIN для валідації групи полів

Section titled “CHAIN для валідації групи полів”
CHAIN.
FIELD customer.
FIELD order_id.
MODULE validate_order.
ENDCHAIN.

Якщо у validate_order викинути MESSAGE ... TYPE 'E'усі поля з chain лишаються input-enabled, користувач їх правитиме.

Input checks — автоматичні і власні

Section titled “Input checks — автоматичні і власні”
  • Автоматичні — required fields (OBLIGATORY у screen painter). Без валідного вводу program не продовжує.
  • Exit command — тип функції E (MODULE mod AT EXIT-COMMAND) обходить автопровірки. Використовується для кнопок Cancel/Back, щоб користувач міг вийти, не заповнюючи required.
PROCESS AFTER INPUT.
MODULE exit_handler AT EXIT-COMMAND. " викликається першим, обходить required
FIELD customer MODULE check_customer.
  • Власні перевірки — у dialog module через FIELD/CHAIN + MESSAGE:
    • TYPE 'E' — error, користувач мусить виправити.
    • TYPE 'W' — warning, можна проігнорувати.

Керування послідовністю dynpro:

" Динамічно задати наступний dynpro (перезаписує статичний)
SET SCREEN 9200.
LEAVE SCREEN. " вийти у заданий наступний
" Короткий варіант
LEAVE TO SCREEN 9200.
" Закінчити послідовність
SET SCREEN 0.
LEAVE SCREEN.
" або просто
LEAVE TO SCREEN 0.
" Запустити нову (вкладену) послідовність
CALL SCREEN 9300.
" Модальне вікно
CALL SCREEN 9300 STARTING AT 10 5 ENDING AT 50 20.
" Вийти з програми повністю
LEAVE PROGRAM.

Правила:

  • Якщо next dynpro = 0 — послідовність завершується.
  • CALL SCREEN створює вкладену послідовність. По її завершенню повертаємось у попередню.
  • LEAVE PROGRAM — виход з програми в цілому.

Динамічна зміна screen elements

Section titled “Динамічна зміна screen elements”

У PBO можна перебрати елементи через LOOP AT SCREEN і змінити їхні атрибути:

MODULE pbo_9000 OUTPUT.
LOOP AT SCREEN INTO DATA(scr).
IF scr-name = 'CUSTOMER_FIELD'.
scr-required = '1'. " зробити required
scr-invisible = '0'.
MODIFY SCREEN FROM scr.
ENDIF.
IF scr-group1 = 'GRP1' AND hide_group = abap_true.
scr-active = '0'. " приховати
MODIFY SCREEN FROM scr.
ENDIF.
ENDLOOP.
ENDMODULE.

У dynpro значення булевих атрибутів — '0' / '1' (не abap_true/abap_false).

" У PBO
SET PF-STATUS 'STATUS_9000'.
SET PF-STATUS 'STATUS_9000' EXCLUDING 'DELETE'. " заборонити функцію
SET TITLEBAR 'TITLE_9000'.
SET TITLEBAR 'TITLE_9000' WITH customer_name. " плейсхолдер &1
" Отримати поточний
DATA current_status TYPE sy-pfkey.
GET PF-STATUS current_status.

Status і titlebar — окремі репо-обʼєкти, редагуються у menu painter (SE41) або в SE80 під програмою.

Для табличного вводу/виводу:

" ABAP declaration
CONTROLS tc_orders TYPE TABLEVIEW USING SCREEN 9000.
" Flow logic
PROCESS BEFORE OUTPUT.
LOOP WITH CONTROL tc_orders.
MODULE fill_row.
ENDLOOP.
PROCESS AFTER INPUT.
LOOP WITH CONTROL tc_orders.
MODULE read_row.
ENDLOOP.

Для сучасних застосунків краще ALV Grid (CL_SALV_TABLE) або Fiori — table control незручний у підтримці.

CONTROLS tabs TYPE TABSTRIP.
" PBO
tabs-activetab = 'TAB1'.
dynnr = '9100'.
prog = sy-repid.
" Flow logic
PROCESS BEFORE OUTPUT.
CALL SUBSCREEN area INCLUDING prog dynnr.
PROCESS AFTER INPUT.
CALL SUBSCREEN area.

Tabstrip — набір субекранів з перемиканням через tab-кнопки.

CL_GUI_* — Toolbar, Picture, HTML viewer, TextEdit, Tree, ALV Grid. Інтегруються через CL_GUI_CUSTOM_CONTAINER, інстанційований на Custom Control у dynpro. Більш сучасні, ніж табличні контролі, але все одно legacy.

Коротка шпаргалка методики

Section titled “Коротка шпаргалка методики”
  1. SE80 → створити program/function group → dynpro (номер 9000).
  2. Screen painter → малюєш layout, додаєш елементи. Кожному input field — імʼя, що збігається з глобальною змінною у програмі.
  3. Element list → додаєш OK_CODE (тип OK).
  4. Flow logic → PBO/PAI + MODULE.
  5. У ABAP-програмі оголошуєш глобальні змінні, пишеш модулі між MODULE ... OUTPUT/INPUT і ENDMODULE.
  6. GUI status (SE41) → додаєш кнопки з function codes.
  7. Запуск через transaction code або з іншої програми через CALL SCREEN/LEAVE TO SCREEN.

Адаптовано з 18_Dynpro.md (Apache 2.0).