TABL: Remove field position from serialization (#4508)

* TABL: Remove field position from serialization

It's not necessary to serialize field position (`DD03P-POSTION`). Fields can simply be numberred sequentially during deserialize.

This avoid issues with include structures that have different number of fields in original and target systems.

Closes #4506

* Clear tabname, ddlanguage

* Lint

Co-authored-by: abaplint[bot] <24845621+abaplint[bot]@users.noreply.github.com>

* Clear dd08v-ddlanguage

Co-authored-by: abaplint[bot] <24845621+abaplint[bot]@users.noreply.github.com>
Co-authored-by: Lars Hvam <larshp@hotmail.com>
This commit is contained in:
Marc Bernard 2021-02-28 04:47:16 -05:00 committed by GitHub
parent 09ce51e646
commit f8076e9ca2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -61,22 +61,26 @@ CLASS zcl_abapgit_object_tabl DEFINITION
TYPES: TYPES:
ty_dd03p_tt TYPE STANDARD TABLE OF dd03p . ty_dd03p_tt TYPE STANDARD TABLE OF dd03p .
TYPES: TYPES:
BEGIN OF ty_dd02_text, BEGIN OF ty_dd02_text,
ddlanguage TYPE dd02t-ddlanguage, ddlanguage TYPE dd02t-ddlanguage,
ddtext TYPE dd02t-ddtext, ddtext TYPE dd02t-ddtext,
END OF ty_dd02_text, END OF ty_dd02_text .
ty_dd02_texts TYPE STANDARD TABLE OF ty_dd02_text. TYPES:
ty_dd02_texts TYPE STANDARD TABLE OF ty_dd02_text .
CONSTANTS c_longtext_id_tabl TYPE dokil-id VALUE 'TB' ##NO_TEXT. CONSTANTS c_longtext_id_tabl TYPE dokil-id VALUE 'TB' ##NO_TEXT.
CONSTANTS: CONSTANTS:
BEGIN OF c_s_dataname, BEGIN OF c_s_dataname,
segment_definition TYPE string VALUE 'SEGMENT_DEFINITION', segment_definition TYPE string VALUE 'SEGMENT_DEFINITION',
tabl_extras TYPE string VALUE 'TABL_EXTRAS', tabl_extras TYPE string VALUE 'TABL_EXTRAS',
END OF c_s_dataname. END OF c_s_dataname .
METHODS deserialize_indexes
IMPORTING
!io_xml TYPE REF TO zif_abapgit_xml_input
RAISING
zcx_abapgit_exception .
METHODS clear_dd03p_fields METHODS clear_dd03p_fields
CHANGING CHANGING
!ct_dd03p TYPE ty_dd03p_tt . !ct_dd03p TYPE ty_dd03p_tt .
@ -84,26 +88,29 @@ CLASS zcl_abapgit_object_tabl DEFINITION
"! @parameter rv_is_idoc_segment | It's an IDoc segment or not "! @parameter rv_is_idoc_segment | It's an IDoc segment or not
METHODS is_idoc_segment METHODS is_idoc_segment
RETURNING RETURNING
VALUE(rv_is_idoc_segment) TYPE abap_bool. VALUE(rv_is_idoc_segment) TYPE abap_bool .
METHODS clear_dd03p_fields_common METHODS clear_dd03p_fields_common
CHANGING CHANGING
!cs_dd03p TYPE dd03p . !cs_dd03p TYPE dd03p .
METHODS clear_dd03p_fields_dataelement METHODS clear_dd03p_fields_dataelement
CHANGING CHANGING
!cs_dd03p TYPE dd03p . !cs_dd03p TYPE dd03p .
METHODS serialize_texts
METHODS: IMPORTING
serialize_texts !io_xml TYPE REF TO zif_abapgit_xml_output
IMPORTING io_xml TYPE REF TO zif_abapgit_xml_output RAISING
RAISING zcx_abapgit_exception, zcx_abapgit_exception .
deserialize_texts METHODS deserialize_texts
IMPORTING io_xml TYPE REF TO zif_abapgit_xml_input IMPORTING
is_dd02v TYPE dd02v !io_xml TYPE REF TO zif_abapgit_xml_input
RAISING zcx_abapgit_exception, !is_dd02v TYPE dd02v
is_db_table_category RAISING
IMPORTING iv_tabclass TYPE dd02l-tabclass zcx_abapgit_exception .
RETURNING VALUE(rv_is_db_table_type) TYPE dd02l-tabclass. METHODS is_db_table_category
IMPORTING
!iv_tabclass TYPE dd02l-tabclass
RETURNING
VALUE(rv_is_db_table_type) TYPE dd02l-tabclass .
ENDCLASS. ENDCLASS.
@ -151,6 +158,11 @@ CLASS zcl_abapgit_object_tabl IMPLEMENTATION.
ENDLOOP. ENDLOOP.
" Clear position to avoid issues with include structures that contain different number of fields
LOOP AT ct_dd03p ASSIGNING <ls_dd03p>.
CLEAR: <ls_dd03p>-position, <ls_dd03p>-tabname, <ls_dd03p>-ddlanguage.
ENDLOOP.
ENDMETHOD. ENDMETHOD.
@ -324,6 +336,65 @@ CLASS zcl_abapgit_object_tabl IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD deserialize_indexes.
DATA:
lv_tname TYPE trobj_name,
lt_dd12v TYPE dd12vtab,
ls_dd12v LIKE LINE OF lt_dd12v,
lt_dd17v TYPE dd17vtab,
ls_dd17v LIKE LINE OF lt_dd17v,
lt_secondary LIKE lt_dd17v.
io_xml->read( EXPORTING iv_name = 'DD12V'
CHANGING cg_data = lt_dd12v ).
io_xml->read( EXPORTING iv_name = 'DD17V'
CHANGING cg_data = lt_dd17v ).
LOOP AT lt_dd12v INTO ls_dd12v.
* todo, call corr_insert?
CLEAR lt_secondary.
LOOP AT lt_dd17v INTO ls_dd17v
WHERE sqltab = ls_dd12v-sqltab AND indexname = ls_dd12v-indexname.
APPEND ls_dd17v TO lt_secondary.
ENDLOOP.
CALL FUNCTION 'DDIF_INDX_PUT'
EXPORTING
name = ls_dd12v-sqltab
id = ls_dd12v-indexname
dd12v_wa = ls_dd12v
TABLES
dd17v_tab = lt_secondary
EXCEPTIONS
indx_not_found = 1
name_inconsistent = 2
indx_inconsistent = 3
put_failure = 4
put_refused = 5
OTHERS = 6.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise_t100( ).
ENDIF.
CALL FUNCTION 'DD_DD_TO_E071'
EXPORTING
type = 'INDX'
name = ls_dd12v-sqltab
id = ls_dd12v-indexname
IMPORTING
obj_name = lv_tname.
zcl_abapgit_objects_activation=>add( iv_type = 'INDX'
iv_name = lv_tname ).
ENDLOOP.
ENDMETHOD.
METHOD deserialize_texts. METHOD deserialize_texts.
DATA: lv_name TYPE ddobjname, DATA: lv_name TYPE ddobjname,
@ -644,26 +715,26 @@ CLASS zcl_abapgit_object_tabl IMPLEMENTATION.
METHOD zif_abapgit_object~deserialize. METHOD zif_abapgit_object~deserialize.
DATA: lv_name TYPE ddobjname, DATA: lv_name TYPE ddobjname,
lv_tname TYPE trobj_name, ls_dd02v TYPE dd02v,
ls_dd02v TYPE dd02v, ls_dd09l TYPE dd09l,
ls_dd09l TYPE dd09l, lt_dd03p TYPE TABLE OF dd03p,
lt_dd03p TYPE TABLE OF dd03p, lt_dd05m TYPE TABLE OF dd05m,
lt_dd05m TYPE TABLE OF dd05m, lt_dd08v TYPE TABLE OF dd08v,
lt_dd08v TYPE TABLE OF dd08v, lt_dd35v TYPE TABLE OF dd35v,
lt_dd12v TYPE dd12vtab, lt_dd36m TYPE dd36mttyp,
lt_dd17v TYPE dd17vtab, lv_refs TYPE abap_bool,
ls_dd17v LIKE LINE OF lt_dd17v, ls_extras TYPE ty_tabl_extras.
lt_secondary LIKE lt_dd17v,
lt_dd35v TYPE TABLE OF dd35v,
lt_dd36m TYPE dd36mttyp,
ls_dd12v LIKE LINE OF lt_dd12v,
lv_refs TYPE abap_bool,
ls_extras TYPE ty_tabl_extras.
FIELD-SYMBOLS: <ls_dd03p> TYPE dd03p, FIELD-SYMBOLS: <ls_dd03p> TYPE dd03p,
<ls_dd05m> TYPE dd05m,
<ls_dd08v> TYPE dd08v,
<ls_dd35v> TYPE dd35v,
<ls_dd36m> TYPE dd36m,
<lg_roworcolst> TYPE any. <lg_roworcolst> TYPE any.
lv_name = ms_item-obj_name. " type conversion
IF deserialize_idoc_segment( io_xml = io_xml IF deserialize_idoc_segment( io_xml = io_xml
iv_package = iv_package ) = abap_false. iv_package = iv_package ) = abap_false.
@ -687,19 +758,36 @@ CLASS zcl_abapgit_object_tabl IMPLEMENTATION.
ENDIF. ENDIF.
ENDLOOP. ENDLOOP.
" Number fields sequentially and fill table name
LOOP AT lt_dd03p ASSIGNING <ls_dd03p>.
<ls_dd03p>-position = sy-tabix.
<ls_dd03p>-tabname = lv_name.
<ls_dd03p>-ddlanguage = mv_language.
ENDLOOP.
io_xml->read( EXPORTING iv_name = 'DD05M_TABLE' io_xml->read( EXPORTING iv_name = 'DD05M_TABLE'
CHANGING cg_data = lt_dd05m ). CHANGING cg_data = lt_dd05m ).
io_xml->read( EXPORTING iv_name = 'DD08V_TABLE' io_xml->read( EXPORTING iv_name = 'DD08V_TABLE'
CHANGING cg_data = lt_dd08v ). CHANGING cg_data = lt_dd08v ).
io_xml->read( EXPORTING iv_name = 'DD12V'
CHANGING cg_data = lt_dd12v ).
io_xml->read( EXPORTING iv_name = 'DD17V'
CHANGING cg_data = lt_dd17v ).
io_xml->read( EXPORTING iv_name = 'DD35V_TALE' io_xml->read( EXPORTING iv_name = 'DD35V_TALE'
CHANGING cg_data = lt_dd35v ). CHANGING cg_data = lt_dd35v ).
io_xml->read( EXPORTING iv_name = 'DD36M' io_xml->read( EXPORTING iv_name = 'DD36M'
CHANGING cg_data = lt_dd36m ). CHANGING cg_data = lt_dd36m ).
LOOP AT lt_dd05m ASSIGNING <ls_dd05m>.
<ls_dd05m>-tabname = lv_name.
ENDLOOP.
LOOP AT lt_dd08v ASSIGNING <ls_dd08v>.
<ls_dd08v>-tabname = lv_name.
<ls_dd08v>-ddlanguage = mv_language.
ENDLOOP.
LOOP AT lt_dd35v ASSIGNING <ls_dd35v>.
<ls_dd35v>-tabname = lv_name.
ENDLOOP.
LOOP AT lt_dd36m ASSIGNING <ls_dd36m>.
<ls_dd36m>-tabname = lv_name.
ENDLOOP.
" DDIC Step: Remove references to search helps and foreign keys " DDIC Step: Remove references to search helps and foreign keys
IF iv_step = zif_abapgit_object=>gc_step_id-ddic. IF iv_step = zif_abapgit_object=>gc_step_id-ddic.
CLEAR: lt_dd08v, lt_dd35v, lt_dd36m. CLEAR: lt_dd08v, lt_dd35v, lt_dd36m.
@ -713,8 +801,6 @@ CLASS zcl_abapgit_object_tabl IMPLEMENTATION.
corr_insert( iv_package = iv_package corr_insert( iv_package = iv_package
ig_object_class = 'DICT' ). ig_object_class = 'DICT' ).
lv_name = ms_item-obj_name. " type conversion
CALL FUNCTION 'DDIF_TABL_PUT' CALL FUNCTION 'DDIF_TABL_PUT'
EXPORTING EXPORTING
name = lv_name name = lv_name
@ -739,47 +825,7 @@ CLASS zcl_abapgit_object_tabl IMPLEMENTATION.
zcl_abapgit_objects_activation=>add_item( ms_item ). zcl_abapgit_objects_activation=>add_item( ms_item ).
* handle indexes deserialize_indexes( io_xml ).
LOOP AT lt_dd12v INTO ls_dd12v.
* todo, call corr_insert?
CLEAR lt_secondary.
LOOP AT lt_dd17v INTO ls_dd17v
WHERE sqltab = ls_dd12v-sqltab AND indexname = ls_dd12v-indexname.
APPEND ls_dd17v TO lt_secondary.
ENDLOOP.
CALL FUNCTION 'DDIF_INDX_PUT'
EXPORTING
name = ls_dd12v-sqltab
id = ls_dd12v-indexname
dd12v_wa = ls_dd12v
TABLES
dd17v_tab = lt_secondary
EXCEPTIONS
indx_not_found = 1
name_inconsistent = 2
indx_inconsistent = 3
put_failure = 4
put_refused = 5
OTHERS = 6.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise_t100( ).
ENDIF.
CALL FUNCTION 'DD_DD_TO_E071'
EXPORTING
type = 'INDX'
name = ls_dd12v-sqltab
id = ls_dd12v-indexname
IMPORTING
obj_name = lv_tname.
zcl_abapgit_objects_activation=>add( iv_type = 'INDX'
iv_name = lv_tname ).
ENDLOOP.
deserialize_texts( io_xml = io_xml deserialize_texts( io_xml = io_xml
is_dd02v = ls_dd02v ). is_dd02v = ls_dd02v ).
@ -890,10 +936,11 @@ CLASS zcl_abapgit_object_tabl IMPLEMENTATION.
FIELD-SYMBOLS: <ls_dd12v> LIKE LINE OF lt_dd12v, FIELD-SYMBOLS: <ls_dd12v> LIKE LINE OF lt_dd12v,
<ls_dd05m> LIKE LINE OF lt_dd05m, <ls_dd05m> LIKE LINE OF lt_dd05m,
<ls_dd08v> LIKE LINE OF lt_dd08v,
<ls_dd35v> LIKE LINE OF lt_dd35v,
<ls_dd36m> LIKE LINE OF lt_dd36m, <ls_dd36m> LIKE LINE OF lt_dd36m,
<lg_roworcolst> TYPE any. <lg_roworcolst> TYPE any.
lv_name = ms_item-obj_name. lv_name = ms_item-obj_name.
CALL FUNCTION 'DDIF_TABL_GET' CALL FUNCTION 'DDIF_TABL_GET'
@ -960,6 +1007,7 @@ CLASS zcl_abapgit_object_tabl IMPLEMENTATION.
* remove foreign keys inherited from .INCLUDEs * remove foreign keys inherited from .INCLUDEs
DELETE lt_dd08v WHERE noinherit = 'N'. DELETE lt_dd08v WHERE noinherit = 'N'.
LOOP AT lt_dd05m ASSIGNING <ls_dd05m>. LOOP AT lt_dd05m ASSIGNING <ls_dd05m>.
CLEAR <ls_dd05m>-tabname.
lv_index = sy-tabix. lv_index = sy-tabix.
READ TABLE lt_dd08v WITH KEY fieldname = <ls_dd05m>-fieldname TRANSPORTING NO FIELDS. READ TABLE lt_dd08v WITH KEY fieldname = <ls_dd05m>-fieldname TRANSPORTING NO FIELDS.
IF sy-subrc <> 0. IF sy-subrc <> 0.
@ -967,9 +1015,17 @@ CLASS zcl_abapgit_object_tabl IMPLEMENTATION.
ENDIF. ENDIF.
ENDLOOP. ENDLOOP.
LOOP AT lt_dd08v ASSIGNING <ls_dd08v>.
CLEAR: <ls_dd08v>-tabname, <ls_dd08v>-ddlanguage.
ENDLOOP.
LOOP AT lt_dd35v ASSIGNING <ls_dd35v>.
CLEAR <ls_dd35v>-tabname.
ENDLOOP.
* remove inherited search helps * remove inherited search helps
DELETE lt_dd35v WHERE shlpinher = abap_true. DELETE lt_dd35v WHERE shlpinher = abap_true.
LOOP AT lt_dd36m ASSIGNING <ls_dd36m>. LOOP AT lt_dd36m ASSIGNING <ls_dd36m>.
CLEAR <ls_dd36m>-tabname.
lv_index = sy-tabix. lv_index = sy-tabix.
READ TABLE lt_dd35v WITH KEY fieldname = <ls_dd36m>-fieldname TRANSPORTING NO FIELDS. READ TABLE lt_dd35v WITH KEY fieldname = <ls_dd36m>-fieldname TRANSPORTING NO FIELDS.
IF sy-subrc <> 0. IF sy-subrc <> 0.