From f8076e9ca23844b9012501b22690ef18c9c8f492 Mon Sep 17 00:00:00 2001 From: Marc Bernard <59966492+mbtools@users.noreply.github.com> Date: Sun, 28 Feb 2021 04:47:16 -0500 Subject: [PATCH] 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 --- src/objects/zcl_abapgit_object_tabl.clas.abap | 224 +++++++++++------- 1 file changed, 140 insertions(+), 84 deletions(-) diff --git a/src/objects/zcl_abapgit_object_tabl.clas.abap b/src/objects/zcl_abapgit_object_tabl.clas.abap index bbe611419..124a7df9a 100644 --- a/src/objects/zcl_abapgit_object_tabl.clas.abap +++ b/src/objects/zcl_abapgit_object_tabl.clas.abap @@ -61,22 +61,26 @@ CLASS zcl_abapgit_object_tabl DEFINITION TYPES: ty_dd03p_tt TYPE STANDARD TABLE OF dd03p . - TYPES: BEGIN OF ty_dd02_text, ddlanguage TYPE dd02t-ddlanguage, ddtext TYPE dd02t-ddtext, - END OF ty_dd02_text, - ty_dd02_texts TYPE STANDARD TABLE OF ty_dd02_text. + END 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: BEGIN OF c_s_dataname, segment_definition TYPE string VALUE 'SEGMENT_DEFINITION', 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 CHANGING !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 METHODS is_idoc_segment RETURNING - VALUE(rv_is_idoc_segment) TYPE abap_bool. + VALUE(rv_is_idoc_segment) TYPE abap_bool . METHODS clear_dd03p_fields_common CHANGING !cs_dd03p TYPE dd03p . METHODS clear_dd03p_fields_dataelement CHANGING !cs_dd03p TYPE dd03p . - - METHODS: - serialize_texts - IMPORTING io_xml TYPE REF TO zif_abapgit_xml_output - RAISING zcx_abapgit_exception, - deserialize_texts - IMPORTING io_xml TYPE REF TO zif_abapgit_xml_input - is_dd02v TYPE dd02v - RAISING zcx_abapgit_exception, - is_db_table_category - IMPORTING iv_tabclass TYPE dd02l-tabclass - RETURNING VALUE(rv_is_db_table_type) TYPE dd02l-tabclass. - + METHODS serialize_texts + IMPORTING + !io_xml TYPE REF TO zif_abapgit_xml_output + RAISING + zcx_abapgit_exception . + METHODS deserialize_texts + IMPORTING + !io_xml TYPE REF TO zif_abapgit_xml_input + !is_dd02v TYPE dd02v + RAISING + zcx_abapgit_exception . + METHODS is_db_table_category + IMPORTING + !iv_tabclass TYPE dd02l-tabclass + RETURNING + VALUE(rv_is_db_table_type) TYPE dd02l-tabclass . ENDCLASS. @@ -151,6 +158,11 @@ CLASS zcl_abapgit_object_tabl IMPLEMENTATION. ENDLOOP. + " Clear position to avoid issues with include structures that contain different number of fields + LOOP AT ct_dd03p ASSIGNING . + CLEAR: -position, -tabname, -ddlanguage. + ENDLOOP. + ENDMETHOD. @@ -324,6 +336,65 @@ CLASS zcl_abapgit_object_tabl IMPLEMENTATION. 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. DATA: lv_name TYPE ddobjname, @@ -644,26 +715,26 @@ CLASS zcl_abapgit_object_tabl IMPLEMENTATION. METHOD zif_abapgit_object~deserialize. - DATA: lv_name TYPE ddobjname, - lv_tname TYPE trobj_name, - ls_dd02v TYPE dd02v, - ls_dd09l TYPE dd09l, - lt_dd03p TYPE TABLE OF dd03p, - lt_dd05m TYPE TABLE OF dd05m, - lt_dd08v TYPE TABLE OF dd08v, - lt_dd12v TYPE dd12vtab, - lt_dd17v TYPE dd17vtab, - ls_dd17v LIKE LINE OF lt_dd17v, - 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. + DATA: lv_name TYPE ddobjname, + ls_dd02v TYPE dd02v, + ls_dd09l TYPE dd09l, + lt_dd03p TYPE TABLE OF dd03p, + lt_dd05m TYPE TABLE OF dd05m, + lt_dd08v TYPE TABLE OF dd08v, + lt_dd35v TYPE TABLE OF dd35v, + lt_dd36m TYPE dd36mttyp, + lv_refs TYPE abap_bool, + ls_extras TYPE ty_tabl_extras. - FIELD-SYMBOLS: TYPE dd03p, + FIELD-SYMBOLS: TYPE dd03p, + TYPE dd05m, + TYPE dd08v, + TYPE dd35v, + TYPE dd36m, TYPE any. + lv_name = ms_item-obj_name. " type conversion + IF deserialize_idoc_segment( io_xml = io_xml iv_package = iv_package ) = abap_false. @@ -687,19 +758,36 @@ CLASS zcl_abapgit_object_tabl IMPLEMENTATION. ENDIF. ENDLOOP. + " Number fields sequentially and fill table name + LOOP AT lt_dd03p ASSIGNING . + -position = sy-tabix. + -tabname = lv_name. + -ddlanguage = mv_language. + ENDLOOP. + io_xml->read( EXPORTING iv_name = 'DD05M_TABLE' CHANGING cg_data = lt_dd05m ). io_xml->read( EXPORTING iv_name = 'DD08V_TABLE' 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' CHANGING cg_data = lt_dd35v ). io_xml->read( EXPORTING iv_name = 'DD36M' CHANGING cg_data = lt_dd36m ). + LOOP AT lt_dd05m ASSIGNING . + -tabname = lv_name. + ENDLOOP. + LOOP AT lt_dd08v ASSIGNING . + -tabname = lv_name. + -ddlanguage = mv_language. + ENDLOOP. + LOOP AT lt_dd35v ASSIGNING . + -tabname = lv_name. + ENDLOOP. + LOOP AT lt_dd36m ASSIGNING . + -tabname = lv_name. + ENDLOOP. + " DDIC Step: Remove references to search helps and foreign keys IF iv_step = zif_abapgit_object=>gc_step_id-ddic. CLEAR: lt_dd08v, lt_dd35v, lt_dd36m. @@ -713,8 +801,6 @@ CLASS zcl_abapgit_object_tabl IMPLEMENTATION. corr_insert( iv_package = iv_package ig_object_class = 'DICT' ). - lv_name = ms_item-obj_name. " type conversion - CALL FUNCTION 'DDIF_TABL_PUT' EXPORTING name = lv_name @@ -739,47 +825,7 @@ CLASS zcl_abapgit_object_tabl IMPLEMENTATION. zcl_abapgit_objects_activation=>add_item( ms_item ). -* handle indexes - 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_indexes( io_xml ). deserialize_texts( io_xml = io_xml is_dd02v = ls_dd02v ). @@ -890,10 +936,11 @@ CLASS zcl_abapgit_object_tabl IMPLEMENTATION. FIELD-SYMBOLS: LIKE LINE OF lt_dd12v, LIKE LINE OF lt_dd05m, + LIKE LINE OF lt_dd08v, + LIKE LINE OF lt_dd35v, LIKE LINE OF lt_dd36m, TYPE any. - lv_name = ms_item-obj_name. CALL FUNCTION 'DDIF_TABL_GET' @@ -960,6 +1007,7 @@ CLASS zcl_abapgit_object_tabl IMPLEMENTATION. * remove foreign keys inherited from .INCLUDEs DELETE lt_dd08v WHERE noinherit = 'N'. LOOP AT lt_dd05m ASSIGNING . + CLEAR -tabname. lv_index = sy-tabix. READ TABLE lt_dd08v WITH KEY fieldname = -fieldname TRANSPORTING NO FIELDS. IF sy-subrc <> 0. @@ -967,9 +1015,17 @@ CLASS zcl_abapgit_object_tabl IMPLEMENTATION. ENDIF. ENDLOOP. + LOOP AT lt_dd08v ASSIGNING . + CLEAR: -tabname, -ddlanguage. + ENDLOOP. + LOOP AT lt_dd35v ASSIGNING . + CLEAR -tabname. + ENDLOOP. + * remove inherited search helps DELETE lt_dd35v WHERE shlpinher = abap_true. LOOP AT lt_dd36m ASSIGNING . + CLEAR -tabname. lv_index = sy-tabix. READ TABLE lt_dd35v WITH KEY fieldname = -fieldname TRANSPORTING NO FIELDS. IF sy-subrc <> 0.