Data serialization, add WHERE condition based on transport (#5720)

This commit is contained in:
Lars Hvam 2022-08-26 08:33:22 +02:00 committed by GitHub
parent 1737957b34
commit ac982560aa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 214 additions and 11 deletions

View File

@ -25,10 +25,10 @@
]
},
"devDependencies": {
"@abaplint/cli": "^2.91.32",
"@abaplint/database-sqlite": "^2.1.29",
"@abaplint/runtime": "^2.1.38",
"@abaplint/transpiler-cli": "^2.1.38",
"@abaplint/cli": "^2.92.0",
"@abaplint/database-sqlite": "^2.1.40",
"@abaplint/runtime": "^2.1.40",
"@abaplint/transpiler-cli": "^2.1.40",
"abapmerge": "^0.14.7",
"c8": "^7.12.0",
"eslint": "^8.22.0"

View File

@ -3,7 +3,7 @@ CLASS zcl_abapgit_transport DEFINITION
CREATE PUBLIC .
PUBLIC SECTION.
* todo, add interfaces for this class, consider merging zcl_abapgit_transport_mass into this class?
CLASS-METHODS zip
IMPORTING
!iv_show_log_popup TYPE abap_bool DEFAULT abap_true
@ -13,6 +13,7 @@ CLASS zcl_abapgit_transport DEFINITION
VALUE(rv_xstr) TYPE xstring
RAISING
zcx_abapgit_exception .
CLASS-METHODS to_tadir
IMPORTING
it_transport_headers TYPE trwbo_request_headers
@ -20,11 +21,21 @@ CLASS zcl_abapgit_transport DEFINITION
VALUE(rt_tadir) TYPE zif_abapgit_definitions=>ty_tadir_tt
RAISING
zcx_abapgit_exception .
CLASS-METHODS add_all_objects_to_trans_req
IMPORTING
iv_key TYPE zif_abapgit_persistence=>ty_value
RAISING
zcx_abapgit_exception .
CLASS-METHODS read
IMPORTING
!is_trkorr TYPE trwbo_request_header OPTIONAL
RETURNING
VALUE(rs_request) TYPE trwbo_request
RAISING
zcx_abapgit_exception .
PROTECTED SECTION.
CLASS-METHODS read_requests
@ -223,6 +234,31 @@ CLASS ZCL_ABAPGIT_TRANSPORT IMPLEMENTATION.
ENDMETHOD.
METHOD read.
rs_request-h-trkorr = is_trkorr-trkorr.
CALL FUNCTION 'TRINT_READ_REQUEST'
EXPORTING
iv_read_e070 = abap_true
iv_read_e07t = abap_true
iv_read_e070c = abap_true
iv_read_e070m = abap_true
iv_read_objs_keys = abap_true
iv_read_objs = abap_true
iv_read_attributes = abap_true
CHANGING
cs_request = rs_request
EXCEPTIONS
error_occured = 1
OTHERS = 2.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise_t100( ).
ENDIF.
ENDMETHOD.
METHOD read_requests.
DATA lt_requests LIKE rt_requests.
FIELD-SYMBOLS <ls_trkorr> LIKE LINE OF it_trkorr.

View File

@ -45,13 +45,25 @@ CLASS ZCL_ABAPGIT_DATA_CONFIG IMPLEMENTATION.
METHOD zif_abapgit_data_config~add_config.
DATA lv_where TYPE string.
FIELD-SYMBOLS <ls_config> LIKE LINE OF mt_config.
ASSERT is_config-type IS NOT INITIAL.
ASSERT is_config-name IS NOT INITIAL.
ASSERT is_config-name = to_upper( is_config-name ).
INSERT is_config INTO TABLE mt_config.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'Already in table' ).
* append to existing
READ TABLE mt_config ASSIGNING <ls_config> WITH KEY type = is_config-type name = is_config-name.
ASSERT sy-subrc = 0.
LOOP AT is_config-where INTO lv_where.
READ TABLE <ls_config>-where TRANSPORTING NO FIELDS WITH KEY table_line = lv_where.
IF sy-subrc <> 0.
INSERT lv_where INTO TABLE <ls_config>-where.
ENDIF.
ENDLOOP.
ENDIF.
ENDMETHOD.

View File

@ -5,6 +5,7 @@ CLASS ltcl_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL.
DATA ms_config TYPE zif_abapgit_data_config=>ty_config.
METHODS setup.
METHODS double_add_config FOR TESTING RAISING cx_static_check.
METHODS to_json FOR TESTING RAISING cx_static_check.
METHODS from_json
IMPORTING it_files TYPE zif_abapgit_definitions=>ty_files_tt
@ -31,6 +32,29 @@ CLASS ltcl_test IMPLEMENTATION.
ENDMETHOD.
METHOD double_add_config.
DATA li_config TYPE REF TO zif_abapgit_data_config.
DATA ls_config TYPE zif_abapgit_data_config=>ty_config.
CREATE OBJECT li_config TYPE zcl_abapgit_data_config.
ls_config-name = 'HELLO'.
ls_config-type = zif_abapgit_data_config=>c_data_type-tabu.
APPEND 'foo' TO ls_config-where.
li_config->add_config( ls_config ).
CLEAR ls_config-where.
APPEND 'bar' TO ls_config-where.
li_config->add_config( ls_config ).
cl_abap_unit_assert=>assert_equals(
act = lines( li_config->get_configs( ) )
exp = 1 ).
ENDMETHOD.
METHOD to_json.
DATA li_config TYPE REF TO zif_abapgit_data_config.

View File

@ -18,9 +18,10 @@ CLASS zcl_abapgit_gui_page_data DEFINITION
CONSTANTS:
BEGIN OF c_event,
add TYPE string VALUE 'add',
update TYPE string VALUE 'update',
remove TYPE string VALUE 'remove',
add TYPE string VALUE 'add',
update TYPE string VALUE 'update',
remove TYPE string VALUE 'remove',
add_via_transport TYPE string VALUE 'add_via_transport',
END OF c_event .
CONSTANTS:
@ -37,6 +38,18 @@ CLASS zcl_abapgit_gui_page_data DEFINITION
DATA mo_repo TYPE REF TO zcl_abapgit_repo .
CLASS-METHODS concatenated_key_to_where
IMPORTING
!iv_table TYPE tabname
!iv_tabkey TYPE clike
RETURNING
VALUE(rv_where) TYPE string .
METHODS add_via_transport
RAISING
zcx_abapgit_exception .
METHODS build_menu
RETURNING
VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar .
METHODS build_where
IMPORTING
!io_map TYPE REF TO zcl_abapgit_string_map
@ -74,6 +87,57 @@ ENDCLASS.
CLASS ZCL_ABAPGIT_GUI_PAGE_DATA IMPLEMENTATION.
METHOD add_via_transport.
DATA lt_trkorr TYPE trwbo_request_headers.
DATA ls_trkorr LIKE LINE OF lt_trkorr.
DATA ls_request TYPE trwbo_request.
DATA ls_key LIKE LINE OF ls_request-keys.
DATA lv_where TYPE string.
DATA ls_config TYPE zif_abapgit_data_config=>ty_config.
lt_trkorr = zcl_abapgit_ui_factory=>get_popups( )->popup_to_select_transports( ).
IF lines( lt_trkorr ) <> 1.
RETURN.
ENDIF.
READ TABLE lt_trkorr INDEX 1 INTO ls_trkorr.
ASSERT sy-subrc = 0.
ls_request = zcl_abapgit_transport=>read( ls_trkorr ).
IF lines( ls_request-keys ) = 0.
zcx_abapgit_exception=>raise( |No keys found, select task| ).
ENDIF.
LOOP AT ls_request-keys INTO ls_key WHERE object = 'TABU'.
ASSERT ls_key-objname IS NOT INITIAL.
ASSERT ls_key-tabkey IS NOT INITIAL.
CLEAR ls_config.
ls_config-type = zif_abapgit_data_config=>c_data_type-tabu.
ls_config-name = to_upper( ls_key-objname ).
lv_where = concatenated_key_to_where(
iv_table = ls_key-objname
iv_tabkey = ls_key-tabkey ).
APPEND lv_where TO ls_config-where.
mi_config->add_config( ls_config ).
ENDLOOP.
ENDMETHOD.
METHOD build_menu.
CREATE OBJECT ro_menu.
ro_menu->add( iv_txt = 'Add via transport'
iv_act = c_event-add_via_transport ).
ENDMETHOD.
METHOD build_where.
DATA lv_where LIKE LINE OF rt_where.
@ -91,11 +155,42 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_DATA IMPLEMENTATION.
ENDMETHOD.
METHOD concatenated_key_to_where.
DATA lo_structdescr TYPE REF TO cl_abap_structdescr.
DATA lt_fields TYPE ddfields.
DATA ls_field LIKE LINE OF lt_fields.
DATA lv_key TYPE string.
lv_key = iv_tabkey.
lo_structdescr ?= cl_abap_typedescr=>describe_by_name( iv_table ).
lt_fields = lo_structdescr->get_ddic_field_list( ).
LOOP AT lt_fields INTO ls_field WHERE keyflag = abap_true.
IF ls_field-position = '0001' AND ls_field-datatype = 'CLNT'.
lv_key = lv_key+ls_field-leng.
CONTINUE.
ENDIF.
IF lv_key = |*|.
EXIT. " current loop
ENDIF.
IF NOT rv_where IS INITIAL.
rv_where = |{ rv_where } AND |.
ENDIF.
rv_where = |{ rv_where }{ to_lower( ls_field-fieldname ) } = '{ lv_key(ls_field-leng) }'|.
lv_key = lv_key+ls_field-leng.
ENDLOOP.
ENDMETHOD.
METHOD constructor.
super->constructor( ).
ms_control-page_title = 'Data'.
ms_control-page_menu = build_menu( ).
mo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
mi_config = mo_repo->get_data_config( ).
@ -179,9 +274,10 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_DATA IMPLEMENTATION.
METHOD render_content.
CREATE OBJECT ri_html TYPE zcl_abapgit_html.
ri_html->add( render_add( ) ).
ri_html->add( '<div class="repo">' ).
ri_html->add( render_existing( ) ).
ri_html->add( render_add( ) ).
ri_html->add( '</div>' ).
ENDMETHOD.
@ -236,12 +332,19 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_DATA IMPLEMENTATION.
CASE ii_event->mv_action.
WHEN c_event-add.
event_add( ii_event ).
mo_repo->refresh( ).
rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
WHEN c_event-update.
event_update( ii_event ).
mo_repo->refresh( ).
rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
WHEN c_event-remove.
event_remove( ii_event ).
mo_repo->refresh( ).
rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
WHEN c_event-add_via_transport.
add_via_transport( ).
mo_repo->refresh( ).
rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
ENDCASE.

View File

@ -0,0 +1,27 @@
CLASS ltcl_test DEFINITION DEFERRED.
CLASS zcl_abapgit_gui_page_data DEFINITION LOCAL FRIENDS ltcl_test.
CLASS ltcl_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL.
PRIVATE SECTION.
METHODS concatenated_key_to_where FOR TESTING RAISING cx_static_check.
ENDCLASS.
CLASS ltcl_test IMPLEMENTATION.
METHOD concatenated_key_to_where.
DATA lv_where TYPE string.
lv_where = zcl_abapgit_gui_page_data=>concatenated_key_to_where(
iv_table = 'T100'
iv_tabkey = 'EABC55555555555555555001' ).
cl_abap_unit_assert=>assert_equals(
act = lv_where
exp = |sprsl = 'E' AND arbgb = 'ABC55555555555555555' AND msgnr = '001'| ).
ENDMETHOD.
ENDCLASS.

View File

@ -10,6 +10,7 @@
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
</VSEOCLASS>
</asx:values>
</asx:abap>