Недавно вышла библиотека 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