update generic table (#193)

* update generic table

* demos

* Update README.md

* abalint fixes

* Update abaplint.jsonc
This commit is contained in:
oblomov 2023-04-26 10:36:58 +02:00
parent 1571898a9f
commit 6a280baebb
6 changed files with 483 additions and 62 deletions

View File

@ -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

View File

@ -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 <tab> TYPE table.
ASSIGN mt_table->* TO <tab>.
SELECT FROM (mv_name)
FIELDS *
INTO CORRESPONDING FIELDS OF TABLE @<tab>
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 <field> type string.
assign mv_test->* to <field>.
<field> = '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 <tab> TYPE ty_t_draft.
assign mt_draft->* to <tab>.
<tab> = 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 <field> type string.
ASSIGN mv_test->* to <field>.
lo_view->input( client->_bind( val = <field> 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 <tab> type STANDARD TABLE.
assign mt_draft->* to <tab>.
DATA(tab) = lo_view->get_parent( )->get_parent( )->simple_form( title = 'Table' editable = abap_true
)->content( 'form' )->table(
items = client->_bind( val = <tab> check_gen_data = abap_true )
).
IF mt_table IS BOUND.
tab->columns(
)->column(
)->text( 'UUID' )->get_parent(
)->column(
)->text( 'UUID_PREV' ).
FIELD-SYMBOLS <tab> TYPE STANDARD TABLE.
ASSIGN mt_table->* TO <tab>.
DATA(tab) = lo_view->get_parent( )->get_parent( )->simple_form( title = 'Table' editable = abap_true
)->content( 'form' )->table(
items = client->_bind( val = <tab> 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( <tab> ).
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( ).

View File

@ -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(<field>).
IF sy-subrc <> 0.
EXIT.
ENDIF.
<field> = 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(<field>).
IF sy-subrc <> 0.
EXIT.
ENDIF.
lv_index = lv_index + 1.
result = result && <field> && ';'.
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.

View File

@ -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.

View File

@ -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.

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>Z2UI5_CL_APP_DEMO_46</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>tab and list change</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>