diff --git a/src/objects/zcl_abapgit_object_tabl_valid.clas.abap b/src/objects/zcl_abapgit_object_tabl_valid.clas.abap index 000b56074..5dd0d1a53 100644 --- a/src/objects/zcl_abapgit_object_tabl_valid.clas.abap +++ b/src/objects/zcl_abapgit_object_tabl_valid.clas.abap @@ -8,20 +8,127 @@ CLASS zcl_abapgit_object_tabl_valid DEFINITION PUBLIC FINAL. VALUE(rv_message) TYPE string RAISING zcx_abapgit_exception. + + PRIVATE SECTION. + TYPES: + tty_founds TYPE STANDARD TABLE OF rsfindlst + WITH NON-UNIQUE DEFAULT KEY, + tty_seu_obj TYPE STANDARD TABLE OF seu_obj + WITH NON-UNIQUE DEFAULT KEY. + + METHODS: + get_where_used_recursive + IMPORTING + iv_object_name TYPE csequence + iv_depth TYPE i + iv_object_type TYPE euobj-id + it_scope TYPE tty_seu_obj + RETURNING + VALUE(rt_founds_all) TYPE tty_founds + RAISING + zcx_abapgit_exception, + + is_structure_used_in_db_table + IMPORTING + iv_object_name TYPE dd02v-tabname + RETURNING + VALUE(rv_is_structure_used_in_db_tab) TYPE abap_bool + RAISING + zcx_abapgit_exception. + ENDCLASS. + + CLASS zcl_abapgit_object_tabl_valid IMPLEMENTATION. + + METHOD get_where_used_recursive. + + DATA: lt_findstrings TYPE stringtab, + lt_founds TYPE STANDARD TABLE OF rsfindlst, + lt_scope TYPE tty_seu_obj, + lv_findstring LIKE LINE OF lt_findstrings. + + FIELD-SYMBOLS: TYPE rsfindlst. + + lt_scope = it_scope. + + lv_findstring = iv_object_name. + INSERT lv_findstring INTO TABLE lt_findstrings. + + DO iv_depth TIMES. + + CLEAR: lt_founds. + + CALL FUNCTION 'RS_EU_CROSSREF' + EXPORTING + i_find_obj_cls = iv_object_type + no_dialog = 'X' + TABLES + i_findstrings = lt_findstrings + o_founds = lt_founds + i_scope_object_cls = lt_scope + EXCEPTIONS + not_executed = 1 + not_found = 2 + illegal_object = 3 + no_cross_for_this_object = 4 + batch = 5 + batchjob_error = 6 + wrong_type = 7 + object_not_exist = 8 + OTHERS = 9. + + IF sy-subrc = 1 + OR sy-subrc = 2 + OR lines( lt_founds ) = 0. + EXIT. + ELSEIF sy-subrc > 2. + zcx_abapgit_exception=>raise_t100( ). + ENDIF. + + INSERT LINES OF lt_founds INTO TABLE rt_founds_all. + + CLEAR: lt_findstrings. + + LOOP AT lt_founds ASSIGNING . + + lv_findstring = -object. + INSERT lv_findstring INTO TABLE lt_findstrings. + + ENDLOOP. + + ENDDO. + + ENDMETHOD. + + METHOD validate. + DATA: lt_previous_table_fields TYPE TABLE OF dd03p, ls_previous_table_field LIKE LINE OF lt_previous_table_fields, lt_current_table_fields TYPE TABLE OF dd03p, - ls_current_table_field LIKE LINE OF lt_current_table_fields. + ls_current_table_field LIKE LINE OF lt_current_table_fields, + ls_dd02v TYPE dd02v. + + io_remote_version->read( + EXPORTING + iv_name = 'DD02V' + CHANGING + cg_data = ls_dd02v ). + + " We only want to compare transparent tables, or structures used in transparent tables + IF ls_dd02v-tabclass <> 'TRANSP' AND is_structure_used_in_db_table( ls_dd02v-tabname ) = abap_false. + RETURN. + ENDIF. + io_remote_version->read( EXPORTING iv_name = 'DD03P_TABLE' CHANGING cg_data = lt_previous_table_fields ). + io_local_version->read( EXPORTING iv_name = 'DD03P_TABLE' @@ -39,6 +146,26 @@ CLASS zcl_abapgit_object_tabl_valid IMPLEMENTATION. rv_message = 'Fields were changed. This may lead to inconsistencies.'. ENDIF. ENDLOOP. + + ENDMETHOD. + + METHOD is_structure_used_in_db_table. + + DATA: lt_scope TYPE tty_seu_obj, + lt_founds TYPE tty_founds. + + APPEND 'TABL' TO lt_scope. + APPEND 'STRU' TO lt_scope. + + lt_founds = get_where_used_recursive( iv_object_name = iv_object_name + iv_object_type = 'STRU' + it_scope = lt_scope + iv_depth = 5 ). + + DELETE lt_founds WHERE object_cls <> 'DT'. + + rv_is_structure_used_in_db_tab = boolc( lines( lt_founds ) > 0 ). + ENDMETHOD. ENDCLASS.