Одним из самых неудобных в моментов разработки в SAP является работа с экранами. Для отображения экрана с ALV-таблицей необходимо: создать экран с контейнером, создать GUI-заголовок и GUI-статус, определить PBO/PAI модули. Большая часть из этих действий содержит шаблонный код и не содержит полезной нагрузки. А самое неприятное то, что все это нельзя создать в ОО-контексте.
SAP частично избавил разработчиков от этой боли, написав ФМ REUSE_ALV_GRID_DISPLAY и класс CL_SALV_TABLE. Но они решают лишь часть проблем: для добавления кнопок в GUI-статус требуется создавать свой статус (в добавок к нему и программу или группу функций), а если требуется создать редактируемый ALV, то CL_SALV_TABLE бессилен, а REUSE_ALV_GRID_DISPLAY нельзя полноценно обернуть в класс. А если требуется нарисовать несколько таблиц на экране, или сделать текстовое поле через CL_GUI_TEXTEDIT, то создание своего экрана с PBO/PAI неизбежно.
Для решения проблем подобного рода, многие разработчики делают свои обертки над ALV. У кого-то они получаются удачными, у других же они сложны в настройке и чувствительны к кастомизации. Я один из тех разработчиков, кто решил написал подобную библиотеку ZCA_GUI, которую вы можете скачать через ABAP-Git. В статье приведено описание основных возможностей данной библиотеки.
ZCL_GUI_SCREEN — Класс для управления экраном с контейнером
Возможности:
- Создание экрана с контейнером и возможность его переиспользования
- Создание кнопок на GUI-статусе через ABAP код
- Определение PBO/PAI экрана через события класса
- Возможность вывода в полноэкранном режиме и в модальном окне
- Не требует создания экранов, GUI-заголовков/статусов, PBO/PAI модулей
- Класс можно использовать как через наследование, так и через композицию
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
CLASS lcl_app DEFINITION INHERITING FROM zcl_gui_screen. PUBLIC SECTION. METHODS constructor. PRIVATE SECTION. METHODS on_init FOR EVENT init OF zcl_gui_screen IMPORTING io_container. METHODS on_exit FOR EVENT exit OF zcl_gui_screen IMPORTING iv_command. METHODS on_pbo FOR EVENT pbo OF zcl_gui_screen. METHODS on_pai FOR EVENT pai OF zcl_gui_screen IMPORTING iv_command. ENDCLASS. CLASS lcl_app IMPLEMENTATION. METHOD constructor. super->constructor( ). set_title( 'ZCL_GUI_SCREEN - демо' ). SET HANDLER on_init FOR me. SET HANDLER on_exit FOR me. SET HANDLER on_pbo FOR me. SET HANDLER on_pai FOR me. ENDMETHOD. METHOD on_init. " Инициализация, первый вызов в PBO " Делим экран пополам и выводим в них таблицы DATA(lo_splitter) = NEW cl_gui_splitter_container( parent = io_container rows = 1 columns = 2 ). DATA(lo_box1) = lo_splitter->get_container( row = 1 column = 1 ). DATA(lo_box2) = lo_splitter->get_container( row = 1 column = 2 ). SELECT * FROM spfli INTO TABLE @DATA(lt_spfli). SELECT * FROM scarr INTO TABLE @DATA(lt_scarr). CALL METHOD cl_salv_table=>factory EXPORTING r_container = lo_box1 IMPORTING r_salv_table = DATA(lo_grid1) CHANGING t_table = lt_spfli. CALL METHOD cl_salv_table=>factory EXPORTING r_container = lo_box2 IMPORTING r_salv_table = DATA(lo_grid2) CHANGING t_table = lt_scarr. lo_grid1->display( ). lo_grid2->display( ). " Добавляем кнопку в GUI-статус create_function( iv_command = 'CREATE_POPUP' iv_icon = icon_create iv_text = 'Новое окно' ). ENDMETHOD. METHOD on_exit. " Выход, последний вызов в PAI MESSAGE iv_command TYPE rs_c_success. ENDMETHOD. METHOD on_pbo. " Логика PBO ENDMETHOD. METHOD on_pai. " Логика PAI CASE iv_command. WHEN 'CREATE_POPUP'. DATA(lo_screen) = NEW lcl_app( ). lo_screen->create_function( iv_command = 'CLOSE' iv_icon = icon_close iv_text = 'Закрыть' ). lo_screen->popup( iv_row = 2 iv_col = 2 iv_width = 150 iv_height = 20 ). WHEN 'CLOSE'. SET SCREEN 0. WHEN OTHERS. MESSAGE iv_command TYPE rs_c_success. ENDCASE. ENDMETHOD. ENDCLASS. START-OF-SELECTION. NEW lcl_app( )->display( ). |
Пример экрана с выводом 2-х таблиц. С кнопкой, которая открывает новый экран в модальном окне.
Присоединиться к обсуждению...