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

Екрани вибору та класичні списки

Екран вибору (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-і, і екран згенерується автоматично.

  • 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+).

Створює глобальну змінну + 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 OUTPUT
PARAMETERS p_list TYPE i AS LISTBOX VISIBLE LENGTH 10.
" Валідація значення за check-таблицею
PARAMETERS p_chk TYPE spfli-carrid VALUE CHECK OBLIGATORY.
" MATCHCODE OBJECT — привʼязати search help
PARAMETERS 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.
" З DEFAULT
SELECT-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-таблиці:

SIGNOPTIONLOWHIGH
I / EEQ/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 OUTPUTPBO selection screenМодифікація екрану, VRM_SET_VALUES, LOOP AT SCREEN
AT SELECTION-SCREEN ON fieldПісля вводу конкретного поляВалідація одного поля
AT SELECTION-SCREEN ON VALUE-REQUEST FOR fieldF4 на поліВласна F4-допомога
AT SELECTION-SCREEN ON HELP-REQUEST FOR fieldF1 на поліВласна 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 виводить у 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 COLOR 3 ON. " золотисто-жовтий
WRITE: / 'Виділено'.
FORMAT COLOR OFF.
FORMAT INTENSIFIED ON. " насиченіше
FORMAT INVERSE ON. " інвертоване тло
FORMAT RESET. " скинути все

Кольори: 1 (синьо-сірий заголовок), 2 (сіро-зелений), 3 (жовтий), 4 (блакитний), 5 (зелений ключ), 6 (червоний), 7 (помаранчевий).

Список може реагувати на дії користувача — подвійний клік, кнопку, клавіатуру:

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 — з коробки.
  • Реагує на мову/локаль.
  • Мінімум коду.

Адаптовано з 20_Selection_Screens_Lists.md (Apache 2.0). Повний перелік опцій — в оригіналі.