Екрани вибору та класичні списки
Екран вибору (selection screen) — спеціальний тип dynpro у виконуваних програмах (reports) для введення параметрів і критеріїв вибірки. Класичний список (classic list) — спосіб виводу даних у табличному/форматованому вигляді через оператори WRITE у спеціальний list buffer. Разом вони формують найстарішу модель report-у: користувач задає критерії → програма виконує вибірку → результат виводиться у список.
Попри те що є сучасніші альтернативи (ALV, Fiori), класика залишилась у тисячах z-reports. Її оператори інтегровані у сам ABAP — не треба screen painter, не треба dynpro-нумера: пишеш PARAMETERS p_carr TYPE s_carr_id. у report-і, і екран згенерується автоматично.
Типи selection screens
Section titled “Типи selection screens”- Standard selection screen — автоматично створюється у кожному executable program (dynpro 1000). Усі
PARAMETERS/SELECT-OPTIONS/SELECTION-SCREENпоза блокомBEGIN OF SCREEN...END OF SCREENпотрапляють сюди. - Standalone selection screen — оголошується через
SELECTION-SCREEN BEGIN OF SCREEN nnnn ... END OF SCREEN nnnn. Викликається явно черезCALL SELECTION-SCREEN.
Номер 1000 зарезервований для standard — для standalone бери щось інше (9000+).
PARAMETERS — один параметр
Section titled “PARAMETERS — один параметр”Створює глобальну змінну + input field на екрані:
" БазовийPARAMETERS p_name TYPE string.PARAMETERS p_num TYPE i.PARAMETERS p_len TYPE c LENGTH 10.
" З DDIC-типом (успадковує label, field help, search help)PARAMETERS p_carr TYPE s_carr_id.
" DEFAULT — початкове значенняPARAMETERS p_flag TYPE abap_bool DEFAULT abap_true.PARAMETERS p_date TYPE dats DEFAULT sy-datum.
" LOWER CASE — не капіталізувати автоматичноPARAMETERS p_mix TYPE string DEFAULT `Hello World` LOWER CASE.
" OBLIGATORY — обовʼязкове полеPARAMETERS p_oblg TYPE c LENGTH 10 OBLIGATORY.
" NO-DISPLAY — приховане (задається через SUBMIT ... WITH)PARAMETERS p_hide TYPE string NO-DISPLAY.
" Чекбокс / радіо-кнопкиPARAMETERS p_check AS CHECKBOX DEFAULT 'X'.PARAMETERS: p_rb1 RADIOBUTTON GROUP grp DEFAULT 'X', p_rb2 RADIOBUTTON GROUP grp, p_rb3 RADIOBUTTON GROUP grp.
" Listbox (dropdown) — значення заповнюються через VRM_SET_VALUES у AT SELECTION-SCREEN OUTPUTPARAMETERS p_list TYPE i AS LISTBOX VISIBLE LENGTH 10.
" Валідація значення за check-таблицеюPARAMETERS p_chk TYPE spfli-carrid VALUE CHECK OBLIGATORY.
" MATCHCODE OBJECT — привʼязати search helpPARAMETERS p_carr2 TYPE c LENGTH 3 MATCHCODE OBJECT s_carrier_id.Імʼя параметра — до 8 символів (звідси конвенція p_xxx).
SELECT-OPTIONS — критерій вибірки
Section titled “SELECT-OPTIONS — критерій вибірки”На відміну від PARAMETERS, це не одне значення, а таблиця вибору з колонками SIGN / OPTION / LOW / HIGH. Дозволяє діапазони, списки, виключення.
DATA: BEGIN OF wa, carrid TYPE c LENGTH 3, num TYPE i, END OF wa.
" Базовий — для поляSELECT-OPTIONS s_num FOR wa-num.
" З DEFAULTSELECT-OPTIONS s_bt FOR wa-num DEFAULT 5 TO 10 OPTION BT SIGN I.SELECT-OPTIONS s_cp FOR wa-carrid DEFAULT 'A*' OPTION CP SIGN I.
" ОпціїSELECT-OPTIONS s_obl FOR wa-num OBLIGATORY.SELECT-OPTIONS s_no FOR wa-num NO-DISPLAY.SELECT-OPTIONS s_ne FOR wa-num NO-EXTENSION. " тільки один рядокSELECT-OPTIONS s_ni FOR wa-num NO INTERVALS. " тільки LOW, без HIGHВикористання у SELECT:
SELECT * FROM sflight WHERE carrid IN @s_carr AND seatsmax IN @s_num INTO TABLE @DATA(results).Структура ranges-таблиці:
| SIGN | OPTION | LOW | HIGH |
|---|---|---|---|
I / E | EQ/NE/GT/LT/GE/LE/BT/NB/CP/NP | нижня межа | верхня межа |
I = include, E = exclude. CP — covers pattern (wildcards *, +).
SELECTION-SCREEN — розмітка і блоки
Section titled “SELECTION-SCREEN — розмітка і блоки”" Заголовок блоку + рамкаSELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE t01. PARAMETERS p_a TYPE string. PARAMETERS p_b TYPE i.SELECTION-SCREEN END OF BLOCK b1.
" Кілька полів в один рядокSELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 1(20) text_1. PARAMETERS p_x TYPE i. SELECTION-SCREEN COMMENT 30(20) text_2.SELECTION-SCREEN END OF LINE.
" Пропуск / горизонтальна лініяSELECTION-SCREEN SKIP 2.SELECTION-SCREEN ULINE.
" Кнопка на екрані виборуSELECTION-SCREEN PUSHBUTTON 1(20) btn USER-COMMAND cmd1.
" Текстові символи для заголовківINITIALIZATION. t01 = 'Критерії вибірки'. text_1 = 'Від:'. text_2 = 'До:'. btn = 'Виконати'.Standalone:
SELECTION-SCREEN BEGIN OF SCREEN 9001 TITLE tit AS WINDOW. PARAMETERS p1 TYPE string.SELECTION-SCREEN END OF SCREEN 9001.
INITIALIZATION. tit = 'Діалогове вікно'.
START-OF-SELECTION. CALL SELECTION-SCREEN 9001 STARTING AT 10 10.Event blocks — точки виклику
Section titled “Event blocks — точки виклику”Виконувана програма структурована в event blocks, що викликає runtime-framework у визначеному порядку:
| Блок | Коли | Типове використання |
|---|---|---|
INITIALIZATION | Перед відображенням selection screen | Дефолт-значення, підготовка текстів |
AT SELECTION-SCREEN OUTPUT | PBO selection screen | Модифікація екрану, VRM_SET_VALUES, LOOP AT SCREEN |
AT SELECTION-SCREEN ON field | Після вводу конкретного поля | Валідація одного поля |
AT SELECTION-SCREEN ON VALUE-REQUEST FOR field | F4 на полі | Власна F4-допомога |
AT SELECTION-SCREEN ON HELP-REQUEST FOR field | F1 на полі | Власна F1-допомога |
AT SELECTION-SCREEN | Після натискання Execute (PAI) | Загальна валідація всіх полів |
START-OF-SELECTION | Після успішного валідованого екрану | Основна логіка report-у |
END-OF-SELECTION | Після START-OF-SELECTION | Фінальна обробка (рідко потрібен) |
AT LINE-SELECTION | Подвійний клік на рядку списку | Drill-down у списку |
AT USER-COMMAND | Натискання кнопки у списку | Обробка user-command |
INITIALIZATION. p_date = sy-datum.
AT SELECTION-SCREEN. IF p_num < 0. MESSAGE 'Число не може бути відʼємним' TYPE 'E'. ENDIF.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file. CALL FUNCTION 'F4_FILENAME' IMPORTING file_name = p_file.
START-OF-SELECTION. SELECT ... INTO TABLE @DATA(results). LOOP AT results INTO DATA(row). WRITE: / row-carrid, row-connid, row-cityfrom. ENDLOOP.SUBMIT — запустити інший report
Section titled “SUBMIT — запустити інший report”SUBMIT zr_other_report WITH p_carr = 'LH' WITH s_num IN itab_range AND RETURN. " повернутись після завершення
" Без повернення — тоді наша програма завершуєтьсяSUBMIT zr_other_report VIA SELECTION-SCREEN.Класичні списки — WRITE
Section titled “Класичні списки — WRITE”WRITE виводить у list buffer, який потім показується на спеціальному list-dynpro автоматично після START-OF-SELECTION:
WRITE: / 'Привіт'. " / = новий рядокWRITE: /(10) 'Ім''я:', (20) name. " (n) = ширинаWRITE: / 'Число', num RIGHT-JUSTIFIED.WRITE: / num DECIMALS 2.WRITE: / date DD/MM/YYYY.
NEW-LINE. " форс-новий рядокNEW-PAGE. " нова сторінкаSKIP 3. " 3 порожні рядкиULINE. " горизонтальна лініяFORMAT — стилі
Section titled “FORMAT — стилі”FORMAT COLOR 3 ON. " золотисто-жовтийWRITE: / 'Виділено'.FORMAT COLOR OFF.
FORMAT INTENSIFIED ON. " насиченішеFORMAT INVERSE ON. " інвертоване тло
FORMAT RESET. " скинути всеКольори: 1 (синьо-сірий заголовок), 2 (сіро-зелений), 3 (жовтий), 4 (блакитний), 5 (зелений ключ), 6 (червоний), 7 (помаранчевий).
Інтерактивні списки
Section titled “Інтерактивні списки”Список може реагувати на дії користувача — подвійний клік, кнопку, клавіатуру:
START-OF-SELECTION. " Основний список WRITE: / 'Клікни на рядок:'. LOOP AT results INTO DATA(row). WRITE: / row-carrid HOTSPOT ON, row-cityfrom. " клік-hotspot HIDE: row-carrid. " сховати для читання у event ENDLOOP.
AT LINE-SELECTION. " sy-lisel — текст поточного рядка " sy-lilli — номер рядка " sy-lsind — рівень деталізації (0 = базовий, 1 = після першого кліку, тощо) IF row-carrid IS NOT INITIAL. WRITE: / 'Деталі для', row-carrid. " Перехід у деталі: окремий список на рівні sy-lsind = 1 ENDIF.
AT USER-COMMAND. CASE sy-ucomm. WHEN 'BACK'. LEAVE LIST-PROCESSING. ENDCASE.HIDE зберігає значення для рядка — при AT LINE-SELECTION воно відновлюється у тій самій змінній.
List buffer — робота з вмістом
Section titled “List buffer — робота з вмістом”READ LINE 5. " sy-lisel містить текст рядкаMODIFY LINE 3 WITH 'New text'. " змінити існуючий рядокSCROLL LIST TO FIRST PAGE.SAP List Viewer (ALV) — сучасна альтернатива
Section titled “SAP List Viewer (ALV) — сучасна альтернатива”Для нових report-ів замість WRITE — ALV. Один клас + один виклик:
DATA results TYPE TABLE OF sflight.
SELECT * FROM sflight INTO TABLE @results UP TO 100 ROWS.
cl_salv_table=>factory( IMPORTING r_salv_table = DATA(alv) CHANGING t_table = results ).
alv->get_functions( )->set_all( abap_true ). " всі стандартні функціїalv->get_columns( )->set_optimize( abap_true ). " автоширинаalv->display( ).Переваги ALV:
- Сортування, фільтрація, експорт в Excel — з коробки.
- Реагує на мову/локаль.
- Мінімум коду.
Посилання
Section titled “Посилання”- Selection Screens — ABAP Keyword Documentation.
- Classic Lists — ABAP Keyword Documentation.
- Приклад
demo_select_options,demo_list_generalу системі (CTRL+SHIFT+A).
Адаптовано з 20_Selection_Screens_Lists.md (Apache 2.0). Повний перелік опцій — в оригіналі.