From 6a280baebb01add68d480b68097a5d1439026ed2 Mon Sep 17 00:00:00 2001 From: oblomov <102328295+oblomov-dev@users.noreply.github.com> Date: Wed, 26 Apr 2023 10:36:58 +0200 Subject: [PATCH] update generic table (#193) * update generic table * demos * Update README.md * abalint fixes * Update abaplint.jsonc --- README.md | 2 +- src/00/z2ui5_cl_app_demo_35.clas.abap | 98 +++--- .../z2ui5_cl_app_demo_35.clas.locals_imp.abap | 312 ++++++++++++++++++ src/00/z2ui5_cl_app_demo_44.clas.abap | 7 +- src/00/z2ui5_cl_app_demo_46.clas.abap | 110 ++++++ src/00/z2ui5_cl_app_demo_46.clas.xml | 16 + 6 files changed, 483 insertions(+), 62 deletions(-) create mode 100644 src/00/z2ui5_cl_app_demo_35.clas.locals_imp.abap create mode 100644 src/00/z2ui5_cl_app_demo_46.clas.abap create mode 100644 src/00/z2ui5_cl_app_demo_46.clas.xml diff --git a/README.md b/README.md index 6e62cba2..09006f2e 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Development of UI5 Apps in pure ABAP. Follow this project on [Twitter](https://t * pure ABAP – development using 100% ABAP (no JavaScript, DDL, EML or Customizing) * low system footprint – based on a plain http handler (no BSP, OData, CDS, BOPF, FE or RAP) * cloud and on-premise ready – works with both language versions (ABAP for Cloud, Standard ABAP) -* high system compatibility – runs on all ABAP releases (from NW 7.02 to ABAP 2302) +* high system compatibility – runs on all ABAP releases (from NW 7.02 to ABAP 2305) * easy installation – abapGit project, no additional app deployment needed #### Compatibility diff --git a/src/00/z2ui5_cl_app_demo_35.clas.abap b/src/00/z2ui5_cl_app_demo_35.clas.abap index 8b935ec7..ac837047 100644 --- a/src/00/z2ui5_cl_app_demo_35.clas.abap +++ b/src/00/z2ui5_cl_app_demo_35.clas.abap @@ -4,8 +4,8 @@ CLASS z2ui5_cl_app_demo_35 DEFINITION PUBLIC. INTERFACES z2ui5_if_app. - DATA mt_draft TYPE REF TO data. - DATA mv_test TYPE REF TO data. + DATA mt_table TYPE REF TO data. + DATA mv_name TYPE string. PROTECTED SECTION. @@ -29,7 +29,7 @@ ENDCLASS. -CLASS Z2UI5_CL_APP_DEMO_35 IMPLEMENTATION. +CLASS z2ui5_cl_app_demo_35 IMPLEMENTATION. METHOD z2ui5_if_app~main. @@ -61,14 +61,21 @@ CLASS Z2UI5_CL_APP_DEMO_35 IMPLEMENTATION. CASE app-get-event. WHEN 'BUTTON_POST'. -* client->popup_message_toast( |{ product } { quantity } - send to the server| ). - app-view_popup = 'POPUP_CONFIRM'. + + CREATE DATA mt_table TYPE STANDARD TABLE OF (mv_name). + FIELD-SYMBOLS TYPE table. + ASSIGN mt_table->* TO . + + SELECT FROM (mv_name) + FIELDS * + INTO CORRESPONDING FIELDS OF TABLE @ + UP TO 100 ROWS. + WHEN 'BUTTON_CONFIRM'. client->popup_message_toast( |confirm| ). app-view_popup = ''. - WHEN 'BUTTON_CANCEL'. client->popup_message_toast( |cancel| ). app-view_popup = ''. @@ -84,75 +91,56 @@ CLASS Z2UI5_CL_APP_DEMO_35 IMPLEMENTATION. METHOD z2ui5_on_init. app-view_main = 'VIEW_MAIN'. - - CREATE DATA mv_test TYPE string. - FIELD-SYMBOLS type string. - assign mv_test->* to . - = 'test'. - - CREATE DATA mt_draft TYPE STANDARD TABLE OF z2ui5_t_draft. - - SELECT FROM z2ui5_t_draft - FIELDS * - ORDER BY uuid - INTO TABLE @DATA(lt_data) - UP TO 10 ROWS - . - - types ty_t_draft type STANDARD TABLE OF z2ui5_t_draft. - FIELD-SYMBOLS TYPE ty_t_draft. - - assign mt_draft->* to . - = lt_data. + mv_name = `Z2UI5_T_DRAFT`. ENDMETHOD. METHOD z2ui5_on_render. - DATA(lo_view) = Z2UI5_CL_XML_VIEW=>factory( )->shell( )->page( - title = 'abap2UI5 - First Example' + DATA(lo_view) = z2ui5_cl_xml_view=>factory( )->shell( )->page( + title = 'abap2UI5 - Change the table type with RTTI' navbuttonpress = client->_event( 'BACK' ) shownavbutton = abap_true )->header_content( )->link( text = 'Source_Code' target = '_blank' - href = Z2UI5_CL_XML_VIEW=>hlp_get_source_code_url( app = me get = client->get( ) ) + href = z2ui5_cl_xml_view=>hlp_get_source_code_url( app = me get = client->get( ) ) )->get_parent( - )->simple_form( title = 'Form Title' editable = abap_true - )->content( 'form' - )->title( 'Input' - )->label( 'quantity' ). + )->simple_form( title = 'SE16' editable = abap_true + )->content( `form` + )->title( 'Table' + )->label( 'Name' ). - - FIELD-SYMBOLS type string. - ASSIGN mv_test->* to . - - lo_view->input( client->_bind( val = check_gen_data = abap_true ) ). + lo_view->input( client->_bind( mv_name ) ). lo_view->button( - text = 'post' + text = 'search' press = client->_event( 'BUTTON_POST' ) ). -FIELD-SYMBOLS type STANDARD TABLE. - assign mt_draft->* to . - DATA(tab) = lo_view->get_parent( )->get_parent( )->simple_form( title = 'Table' editable = abap_true - )->content( 'form' )->table( - items = client->_bind( val = check_gen_data = abap_true ) - ). + IF mt_table IS BOUND. - tab->columns( - )->column( - )->text( 'UUID' )->get_parent( - )->column( - )->text( 'UUID_PREV' ). + FIELD-SYMBOLS TYPE STANDARD TABLE. + ASSIGN mt_table->* TO . + DATA(tab) = lo_view->get_parent( )->get_parent( )->simple_form( title = 'Table' editable = abap_true + )->content( 'form' )->table( + items = client->_bind( val = check_gen_data = abap_true ) + ). - tab->items( )->column_list_item( - )->cells( - )->input( '{UUID}' - )->input( '{UUID_PREV}' - ). + DATA(lt_fields) = lcl_db=>get_fieldlist_by_table( ). + + DATA(lo_columns) = tab->columns( ). + LOOP AT lt_fields INTO DATA(lv_field) FROM 2. + lo_columns->column( )->text( lv_field ). + ENDLOOP. + + DATA(lo_cells) = tab->items( )->column_list_item( selected = '{SELKZ}' )->cells( ). + LOOP AT lt_fields INTO lv_field FROM 2. + lo_cells->input( `{` && lv_field && `}` ). + ENDLOOP. + + ENDIF. app-next-xml_main = lo_view->get_root( )->xml_get( ). diff --git a/src/00/z2ui5_cl_app_demo_35.clas.locals_imp.abap b/src/00/z2ui5_cl_app_demo_35.clas.locals_imp.abap new file mode 100644 index 00000000..a4b0e6d8 --- /dev/null +++ b/src/00/z2ui5_cl_app_demo_35.clas.locals_imp.abap @@ -0,0 +1,312 @@ +CLASS lcl_db DEFINITION. + + + PUBLIC SECTION. + + + TYPES ty_t_table TYPE z2ui5_cl_app_demo_13=>ty_t_table. + + CLASS-DATA app TYPE REF TO z2ui5_cl_app_demo_13. + "CLASS-DATA st_table TYPE ty_t_table. + + CLASS-METHODS generate_test_data. + + CLASS-METHODS get_table_by_json + IMPORTING + val TYPE string + RETURNING + VALUE(result) TYPE ty_t_table. + + CLASS-METHODS get_table_by_xml + IMPORTING + val TYPE string + RETURNING + VALUE(result) TYPE ty_t_table. + + CLASS-METHODS get_table_by_csv + IMPORTING + val TYPE string + RETURNING + VALUE(result) TYPE ty_t_table. + + CLASS-METHODS get_csv_by_table + IMPORTING + val TYPE ty_t_table + RETURNING + VALUE(result) TYPE string. + + CLASS-METHODS get_xml_by_table + IMPORTING + val TYPE ty_t_table + RETURNING + VALUE(result) TYPE string. + + CLASS-METHODS get_json_by_table + IMPORTING + val TYPE ty_t_table + RETURNING + VALUE(result) TYPE string. + + CLASS-METHODS get_fieldlist_by_table + IMPORTING + it_table TYPE table + RETURNING + VALUE(result) TYPE string_table. + + CLASS-METHODS db_save + IMPORTING + value TYPE ty_t_table. + + CLASS-METHODS db_read + RETURNING + VALUE(result) TYPE ty_t_table. + CLASS-METHODS get_test_data_json + RETURNING + VALUE(result) TYPE string. + + PROTECTED SECTION. + PRIVATE SECTION. + +ENDCLASS. + +CLASS lcl_db IMPLEMENTATION. + + METHOD generate_test_data. + + app->st_db = VALUE #( + ( carrid = 'DL' connid = '0106' countryfr = 'US' cityfrom = 'NEW YORK' airpfrom = 'JFK' countryto = 'DE' cityto = 'FRANKFURT' airpto = 'FR' ) + ( carrid = 'DL' connid = '0106' countryfr = 'US' cityfrom = 'NEW YORK' airpfrom = 'JFK' countryto = 'DE' cityto = 'FRANKFURT' airpto = 'FR' ) + ( carrid = 'DL' connid = '0106' countryfr = 'US' cityfrom = 'NEW YORK' airpfrom = 'JFK' countryto = 'DE' cityto = 'FRANKFURT' airpto = 'FR' ) + ( carrid = 'DL' connid = '0106' countryfr = 'US' cityfrom = 'NEW YORK' airpfrom = 'JFK' countryto = 'DE' cityto = 'FRANKFURT' airpto = 'FR' ) + ( carrid = 'DL' connid = '0106' countryfr = 'US' cityfrom = 'NEW YORK' airpfrom = 'JFK' countryto = 'DE' cityto = 'FRANKFURT' airpto = 'FR' ) + ( carrid = 'DL' connid = '0106' countryfr = 'US' cityfrom = 'NEW YORK' airpfrom = 'JFK' countryto = 'DE' cityto = 'FRANKFURT' airpto = 'FR' ) + ( carrid = 'DL' connid = '0106' countryfr = 'US' cityfrom = 'NEW YORK' airpfrom = 'JFK' countryto = 'DE' cityto = 'FRANKFURT' airpto = 'FR' ) + ( carrid = 'DL' connid = '0106' countryfr = 'US' cityfrom = 'NEW YORK' airpfrom = 'JFK' countryto = 'DE' cityto = 'FRANKFURT' airpto = 'FR' ) + ). + + ENDMETHOD. + + + METHOD get_table_by_json. + + DATA lt_tab TYPE ty_t_table. + + /ui2/cl_json=>deserialize( + EXPORTING + json = val +* jsonx = +* pretty_name = +* assoc_arrays = +* assoc_arrays_opt = +* name_mappings = +* conversion_exits = +* hex_as_base64 = + CHANGING + data = lt_tab + ). + + result = lt_tab. + + ENDMETHOD. + + + METHOD get_table_by_xml. + + DATA lt_tab TYPE ty_t_table. + + CALL TRANSFORMATION id SOURCE xml = val RESULT data = lt_tab. + + result = lt_tab. + + ENDMETHOD. + + METHOD get_table_by_csv. + + SPLIT val AT ';' INTO TABLE DATA(lt_cols). + + LOOP AT lt_cols INTO DATA(lv_field). + + DATA(ls_row) = VALUE z2ui5_cl_app_demo_13=>ty_s_spfli( ). + DATA(lv_index) = 1. + DO. + ASSIGN COMPONENT lv_index OF STRUCTURE ls_row TO FIELD-SYMBOL(). + IF sy-subrc <> 0. + EXIT. + ENDIF. + = lv_field. + lv_index = lv_index + 1. + ENDDO. + INSERT ls_row INTO TABLE result. + + ENDLOOP. + + ENDMETHOD. + + METHOD db_save. + + "normally modify database here + + "test scenario, therefore write internal table instead + app->st_db = value. + + ENDMETHOD. + + METHOD db_read. + + "normally read database here + + "test scenario, therefore read internal table instead + + result = app->st_db. + + ENDMETHOD. + + METHOD get_csv_by_table. + + LOOP AT val INTO DATA(ls_row). + + DATA(lv_index) = 1. + DO. + ASSIGN COMPONENT lv_index OF STRUCTURE ls_row TO FIELD-SYMBOL(). + IF sy-subrc <> 0. + EXIT. + ENDIF. + lv_index = lv_index + 1. + result = result && && ';'. + ENDDO. + result = result && cl_abap_char_utilities=>cr_lf. + ENDLOOP. + + + ENDMETHOD. + + METHOD get_json_by_table. + + result = /ui2/cl_json=>serialize( + val +* compress = +* name = +* pretty_name = +* type_descr = +* assoc_arrays = +* ts_as_iso8601 = +* expand_includes = +* assoc_arrays_opt = +* numc_as_string = +* name_mappings = +* conversion_exits = + " format_output = abap_true +* hex_as_base64 = + ). + + + ENDMETHOD. + + METHOD get_xml_by_table. + + CALL TRANSFORMATION id SOURCE values = val RESULT XML result. + + ENDMETHOD. + + METHOD get_fieldlist_by_table. + + DATA(lo_tab) = CAST cl_abap_tabledescr( cl_abap_datadescr=>describe_by_data( it_table ) ). + DATA(lo_struc) = CAST cl_abap_structdescr( lo_tab->get_table_line_type( ) ). + + DATA(lt_comp) = lo_struc->get_components( ). + + LOOP AT lt_comp INTO DATA(ls_comp). + INSERT ls_comp-name INTO TABLE result. + ENDLOOP. + + ENDMETHOD. + + + METHOD get_test_data_json. + + result = `[` && |\n| && + ` {` && |\n| && + ` "CARRID": "DL",` && |\n| && + ` "CONNID": 106,` && |\n| && + ` "COUNTRYFR": "US",` && |\n| && + ` "CITYFROM": "NEW YORK",` && |\n| && + ` "AIRPFROM": "JFK",` && |\n| && + ` "COUNTRYTO": "DE",` && |\n| && + ` "CITYTO": "FRANKFURT",` && |\n| && + ` "AIRPTO": "FR"` && |\n| && + ` },` && |\n| && + ` {` && |\n| && + ` "CARRID": "DL",` && |\n| && + ` "CONNID": 106,` && |\n| && + ` "COUNTRYFR": "US",` && |\n| && + ` "CITYFROM": "NEW YORK",` && |\n| && + ` "AIRPFROM": "JFK",` && |\n| && + ` "COUNTRYTO": "DE",` && |\n| && + ` "CITYTO": "FRANKFURT",` && |\n| && + ` "AIRPTO": "FR"` && |\n| && + ` },` && |\n| && + ` {` && |\n| && + ` "CARRID": "DL",` && |\n| && + ` "CONNID": 106,` && |\n| && + ` "COUNTRYFR": "US",` && |\n| && + ` "CITYFROM": "NEW YORK",` && |\n| && + ` "AIRPFROM": "JFK",` && |\n| && + ` "COUNTRYTO": "DE",` && |\n| && + ` "CITYTO": "FRANKFURT",` && |\n| && + ` "AIRPTO": "FR"` && |\n| && + ` },` && |\n| && + ` {` && |\n| && + ` "CARRID": "DL",` && |\n| && + ` "CONNID": 106,` && |\n| && + ` "COUNTRYFR": "US",` && |\n| && + ` "CITYFROM": "NEW YORK",` && |\n| && + ` "AIRPFROM": "JFK",` && |\n| && + ` "COUNTRYTO": "DE",` && |\n| && + ` "CITYTO": "FRANKFURT",` && |\n| && + ` "AIRPTO": "FR"` && |\n| && + ` },` && |\n| && + ` {` && |\n| && + ` "CARRID": "DL",` && |\n| && + ` "CONNID": 106,` && |\n| && + ` "COUNTRYFR": "US",` && |\n| && + ` "CITYFROM": "NEW YORK",` && |\n| && + ` "AIRPFROM": "JFK",` && |\n| && + ` "COUNTRYTO": "DE",` && |\n| && + ` "CITYTO": "FRANKFURT",` && |\n| && + ` "AIRPTO": "FR"` && |\n| && + ` },` && |\n| && + ` {` && |\n| && + ` "CARRID": "DL",` && |\n| && + ` "CONNID": 106,` && |\n| && + ` "COUNTRYFR": "US",` && |\n| && + ` "CITYFROM": "NEW YORK",` && |\n| && + ` "AIRPFROM": "JFK",` && |\n| && + ` "COUNTRYTO": "DE",` && |\n| && + ` "CITYTO": "FRANKFURT",` && |\n| && + ` "AIRPTO": "FR"` && |\n| && + ` },` && |\n| && + ` {` && |\n| && + ` "CARRID": "DL",` && |\n| && + ` "CONNID": 106,` && |\n| && + ` "COUNTRYFR": "US",` && |\n| && + ` "CITYFROM": "NEW YORK",` && |\n| && + ` "AIRPFROM": "JFK",` && |\n| && + ` "COUNTRYTO": "DE",` && |\n| && + ` "CITYTO": "FRANKFURT",` && |\n| && + ` "AIRPTO": "FR"` && |\n| && + ` },` && |\n| && + ` {` && |\n| && + ` "CARRID": "DL",` && |\n| && + ` "CONNID": 106,` && |\n| && + ` "COUNTRYFR": "US",` && |\n| && + ` "CITYFROM": "NEW YORK",` && |\n| && + ` "AIRPFROM": "JFK",` && |\n| && + ` "COUNTRYTO": "DE",` && |\n| && + ` "CITYTO": "FRANKFURT",` && |\n| && + ` "AIRPTO": "FR"` && |\n| && + ` }` && |\n| && + `]`. + + ENDMETHOD. + +ENDCLASS. diff --git a/src/00/z2ui5_cl_app_demo_44.clas.abap b/src/00/z2ui5_cl_app_demo_44.clas.abap index 4491bce3..5deb7eae 100644 --- a/src/00/z2ui5_cl_app_demo_44.clas.abap +++ b/src/00/z2ui5_cl_app_demo_44.clas.abap @@ -5,21 +5,16 @@ CLASS z2ui5_cl_app_demo_44 DEFINITION PUBLIC. INTERFACES z2ui5_if_app. INTERFACES if_oo_adt_classrun. -protected section. -private section. ENDCLASS. - - CLASS Z2UI5_CL_APP_DEMO_44 IMPLEMENTATION. - METHOD if_oo_adt_classrun~main. out->write( `Hello World` ). ENDMETHOD. - METHOD z2ui5_if_app~main. client->set_next( VALUE #( xml_main = z2ui5_cl_xml_view=>factory( )->label( 'Hello World!' )->get_root( )->xml_get( ) ) ). ENDMETHOD. + ENDCLASS. diff --git a/src/00/z2ui5_cl_app_demo_46.clas.abap b/src/00/z2ui5_cl_app_demo_46.clas.abap new file mode 100644 index 00000000..98782bd0 --- /dev/null +++ b/src/00/z2ui5_cl_app_demo_46.clas.abap @@ -0,0 +1,110 @@ +CLASS z2ui5_cl_app_demo_46 DEFINITION PUBLIC. + + PUBLIC SECTION. + + INTERFACES z2ui5_if_app. + + TYPES: + BEGIN OF ty_row, + title TYPE string, + value TYPE string, + descr TYPE string, + icon TYPE string, + info TYPE string, + selected TYPE abap_bool, + checkbox TYPE abap_bool, + END OF ty_row. + + DATA t_tab TYPE STANDARD TABLE OF ty_row WITH EMPTY KEY. + DATA check_initialized TYPE abap_bool. + DATA mv_display TYPE string. + + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS z2ui5_cl_app_demo_46 IMPLEMENTATION. + + + METHOD z2ui5_if_app~main. + + IF check_initialized = abap_false. + check_initialized = abap_true. + + mv_display = 'LIST'. + + t_tab = VALUE #( + ( title = 'Peter' info = 'completed' descr = 'this is a description' icon = 'sap-icon://account' ) + ( title = 'Peter' info = 'incompleted' descr = 'this is a description' icon = 'sap-icon://account' ) + ( title = 'Peter' info = 'working' descr = 'this is a description' icon = 'sap-icon://account' ) + ( title = 'Peter' info = 'working' descr = 'this is a description' icon = 'sap-icon://account' ) + ( title = 'Peter' info = 'completed' descr = 'this is a description' icon = 'sap-icon://account' ) + ( title = 'Peter' info = 'completed' descr = 'this is a description' icon = 'sap-icon://account' ) + ). + + ELSE. + + CASE client->get( )-event. + WHEN 'BACK'. + client->nav_app_leave( client->get_app( client->get( )-id_prev_app_stack ) ). + WHEN OTHERS. + mv_display = client->get( )-event. + ENDCASE. + + ENDIF. + + DATA(page) = z2ui5_cl_xml_view=>factory( )->shell( + )->page( + title = 'abap2UI5 - Table output in two different Ways - Changing UI without Model' + navbuttonpress = client->_event( 'BACK' ) + shownavbutton = abap_true + )->header_content( + )->button( text = 'Display List' press = client->_event( 'LIST' ) + )->button( text = 'Display Table' press = client->_event( 'TABLE' ) + )->link( + text = 'Source_Code' target = '_blank' + href = z2ui5_cl_xml_view=>hlp_get_source_code_url( app = me get = client->get( ) ) + )->get_parent( ). + + CASE mv_display. + + WHEN 'LIST'. + page->list( + headertext = 'List Control' + items = client->_bind( t_tab ) + )->standard_list_item( + title = '{TITLE}' + description = '{DESCR}' + icon = '{ICON}' + info = '{INFO}' + ). + + WHEN 'TABLE'. + + DATA(tab) = page->table( + headertext = 'Table Control' + items = client->_bind( t_tab ) ). + + tab->columns( + )->column( + )->text( 'Title' )->get_parent( + )->column( + )->text( 'Descr' )->get_parent( + )->column( + )->text( 'Icon' )->get_parent( + )->column( + )->text( 'Info' ). + + tab->items( )->column_list_item( )->cells( + )->text( '{TITLE}' + )->text( '{DESCR}' + )->text( '{ICON}' + )->text( '{INFO}' ). + + ENDCASE. + client->set_next( VALUE #( xml_main = page->get_root( )->xml_get( ) ) ). + + ENDMETHOD. +ENDCLASS. diff --git a/src/00/z2ui5_cl_app_demo_46.clas.xml b/src/00/z2ui5_cl_app_demo_46.clas.xml new file mode 100644 index 00000000..8b106cd9 --- /dev/null +++ b/src/00/z2ui5_cl_app_demo_46.clas.xml @@ -0,0 +1,16 @@ + + + + + + Z2UI5_CL_APP_DEMO_46 + E + tab and list change + 1 + X + X + X + + + +