Недавно вышла библиотека ABAP2UI5, позволяющая создавать приложения UI5 на старом добром ABAP без необходимости изучения UI5. В качестве примера попробуем создать фронд-энд для акта выполненных работ с помощью этой библиотеки.

Прежде всего надо установить библиотеку с помощью ABAPGIT.

И выполнить необходимые шаги
Все приложение представляет собой класс с интерфейсом Z2UI5_IF_APP. Создадим класс Z2UI5_AVR и добавим нужный интерфейс.
Единственный метод интерфейса Z2UI5_IF_APP~CONTROLLER будет вызывать нужные методы:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |   METHOD z2ui5_if_app~controller.     CASE client->get( )-lifecycle_method.       WHEN client->cs-lifecycle_method-on_init.         z2ui5_on_init( client ).       WHEN client->cs-lifecycle_method-on_event.         z2ui5_on_event( client ).       WHEN client->cs-lifecycle_method-on_rendering.         z2ui5_on_rendering( client ).     ENDCASE.   ENDMETHOD. | 
Метод Z2UI5_ON_INIT устанавливает начальные значения для формы на экране
| 1 2 3 |   METHOD z2ui5_on_init.     ms_screen = COND #( WHEN ms_link IS INITIAL THEN VALUE #( year = sy-datum(4) month = sy-datum+4(2) ) ELSE ms_link ).   ENDMETHOD. | 
Метод Z2UI5_ON_EVENT обрабатывает события, которые произошли на фронд-энде:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |   METHOD z2ui5_on_event.     CASE client->get( )-event.       WHEN gc_s_command-open.         IF line_exists( st_year[ key = ms_screen-year ] ) AND line_exists( st_month[ key = ms_screen-month ] ).           ms_link = ms_screen.         ELSE.           CLEAR ms_link.           client->display_message_toast( CONV #( 'Error'(err) ) ).         ENDIF.       WHEN gc_s_command-clear.         CLEAR ms_link.         z2ui5_on_init( client ).         client->display_message_toast( CONV #( 'View initialized'(006) ) ).     ENDCASE.   ENDMETHOD. | 
Метод Z2UI5_ON_RENDERING выполняет формирование формы в браузере:
| 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 |   METHOD z2ui5_on_rendering.     DATA(view) = client->factory_view( ).     DATA(page) = view->page( title = CONV #( 'AVR'(avr) )                              nav_button_tap = view->_event_display_id( client->get( )-id_prev_app ) ).     page->grid( default_span  = 'L12 M12 S12' )->content( 'l'        )->simple_form( CONV #( 'Select period'(001) ) )->content( 'f'     )->label( CONV #( 'Year'(002) )     )->combobox(          selectedkey = view->_bind( ms_screen-year )          items      = view->_bind_one_way( st_year )          )->get( )->item( key = '{KEY}' text = '{TEXT}'         )->get_parent( )->get_parent(     )->label( CONV #( 'Month'(003) )     )->combobox(          selectedkey = view->_bind( ms_screen-month )          items      = view->_bind_one_way( st_month )          )->get( )->item( key = '{KEY}' text = '{TEXT}'     ).     IF ms_link IS NOT INITIAL.       page->link( text = |{ st_month[ key = ms_screen-month ]-text } { ms_screen-year }|                   href = |/sap/opu/odata/SAP/ZODATA_AVR_SRV/AVRSet(Gjahr='{ ms_link-year }',Monat='{ ms_link-month }')/$value| ).     ENDIF.     page->footer( )->overflow_toolbar(          )->toolbar_spacer(          )->button(              text  = 'Clear'(004)              press = view->_event( gc_s_command-clear )              type  = gc_s_type-reject              icon  = gc_s_icon-delete          )->button(              text  = 'Open'(005)              press = view->_event( gc_s_command-open )              type  = gc_s_type-success ).   ENDMETHOD. | 
Тогда на экране будет два выпадающих списка с возможностью выбора года и месяца и две кнопки «Clear» и «Open» в результате которых произойдет сброс формы на начальные значения и заполнения структуры ms_link. Если эта структура заполнена, то метод rendering показывает ссылку на формирование файла Excel.
Остались небольшие штрихи — объявление необходимых типов и атрибутов класса
| 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 | CLASS z2ui5_avr DEFINITION   PUBLIC   CREATE PUBLIC .   PUBLIC SECTION.     INTERFACES if_serializable_object .     INTERFACES z2ui5_if_app .     TYPES:       BEGIN OF ts_combobox,         key  TYPE string,         text TYPE string,       END OF ts_combobox .     TYPES:       tt_combo TYPE STANDARD TABLE OF ts_combobox WITH EMPTY KEY .     TYPES:       BEGIN OF ts_data,         year  TYPE string,         month TYPE string,       END OF ts_data .     DATA:       BEGIN OF ms_screen,         year  TYPE string,         month TYPE string,       END OF ms_screen .     CLASS-METHODS class_constructor .   PROTECTED SECTION.   PRIVATE SECTION.     CONSTANTS: BEGIN OF gc_s_command,                  open  TYPE string VALUE 'OPEN',                  clear TYPE string VALUE 'CLEAR',                END OF gc_s_command.     CONSTANTS: BEGIN OF gc_s_type,                  reject  TYPE string VALUE 'Reject',                  success TYPE string VALUE 'Success',                END OF gc_s_type.     DATA ms_link TYPE ts_data .     CLASS-DATA:       st_year TYPE HASHED TABLE OF ts_combobox WITH UNIQUE KEY key .     CLASS-DATA:       st_month TYPE HASHED TABLE OF ts_combobox WITH UNIQUE KEY key .     METHODS z2ui5_on_event       IMPORTING         !client TYPE REF TO z2ui5_if_client .     METHODS z2ui5_on_init       IMPORTING         !client TYPE REF TO z2ui5_if_client .     METHODS z2ui5_on_rendering       IMPORTING         !client TYPE REF TO z2ui5_if_client . ENDCLASS. | 
И в class-constructor-е заполнять таблицы st_year и st_month:
| 1 2 3 4 5 6 7 |   METHOD class_constructor.     st_year = VALUE #( FOR j = sy-datum(4) - 3 UNTIL j > sy-datum(4)                         ( key = |{ j }|                           text = j ) ).     SELECT monum AS key, monam AS text FROM t015m WHERE spras = sy-langu ORDER BY monum INTO TABLE @st_month.   ENDMETHOD. | 
В этом методе заполним таблицы с номерами последние 4 лет и названиями месяцев
Также нужны тексты

В результате нажатия на кнопку Open появится ссылка для формирования файла

Теперь можем открыть ссылку с библиотекой ABAP2UI5 с указанием класса
https://<имя сервера:порт>/zabap2ui5?app=Z2UI5_AVR
