CLASS zcl_abapgit_dependencies DEFINITION PUBLIC FINAL CREATE PUBLIC . PUBLIC SECTION. CLASS-METHODS resolve CHANGING !ct_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt RAISING zcx_abapgit_exception . PROTECTED SECTION. PRIVATE SECTION. TYPES: BEGIN OF ty_dependency, depname TYPE dd02l-tabname, deptyp TYPE c LENGTH 4, deplocal TYPE dd02l-as4local, refname TYPE dd02l-tabname, reftyp TYPE c LENGTH 4, kind TYPE c LENGTH 1, END OF ty_dependency . TYPES: ty_dedenpencies TYPE STANDARD TABLE OF ty_dependency WITH NON-UNIQUE DEFAULT KEY . TYPES: BEGIN OF ty_item, obj_type TYPE tadir-object, obj_name TYPE tadir-obj_name, devclass TYPE devclass, END OF ty_item . CLASS-METHODS resolve_ddic CHANGING !ct_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt RAISING zcx_abapgit_exception . CLASS-METHODS get_ddls_dependencies IMPORTING iv_ddls_name TYPE tadir-obj_name RETURNING VALUE(rt_dependency) TYPE ty_dedenpencies. CLASS-METHODS resolve_packages CHANGING ct_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt. ENDCLASS. CLASS ZCL_ABAPGIT_DEPENDENCIES IMPLEMENTATION. METHOD get_ddls_dependencies. DATA: lt_ddls_name TYPE TABLE OF ddsymtab, ls_ddls_name TYPE ddsymtab. ls_ddls_name-name = iv_ddls_name. INSERT ls_ddls_name INTO TABLE lt_ddls_name. PERFORM ('DDLS_GET_DEP') IN PROGRAM ('RADMASDL') TABLES lt_ddls_name rt_dependency. ENDMETHOD. METHOD resolve. DATA: lv_tabclass TYPE dd02l-tabclass. FIELD-SYMBOLS: LIKE LINE OF ct_tadir. " misuse field KORRNUM to fix deletion sequence " higher value means later deletion LOOP AT ct_tadir ASSIGNING . CASE -object. WHEN 'DEVC'. " Packages last -korrnum = '999000'. WHEN 'DOMA'. -korrnum = '900000'. WHEN 'PARA'. " PARA after DTEL -korrnum = '810000'. WHEN 'DTEL'. -korrnum = '800000'. WHEN 'SHLP'. " SHLP after TABL -korrnum = '760000'. WHEN 'TTYP' OR 'TABL' OR 'VIEW'. SELECT SINGLE tabclass FROM dd02l INTO lv_tabclass WHERE tabname = -obj_name AND as4local = 'A' AND as4vers = '0000'. IF sy-subrc = 0 AND lv_tabclass = 'APPEND'. " delete append structures before database tables -korrnum = '730000'. ELSE. -korrnum = '750000'. ENDIF. WHEN 'DDLS'. " DDLS after DCLS but before other DDIC -korrnum = '720000'. WHEN 'AUTH'. " AUTH after DCLS -korrnum = '715000'. WHEN 'SUSO'. " SUSO after DCLS -korrnum = '710000'. WHEN 'DCLS'. " AUTH and SUSO after DCLS -korrnum = '705000'. WHEN 'IASP'. -korrnum = '552000'. WHEN 'IARP'. -korrnum = '551000'. WHEN 'IATU'. -korrnum = '550000'. WHEN 'SUSC'. -korrnum = '500000'. WHEN 'ACID'. " ACID after PROG/FUGR/CLAS -korrnum = '300000'. WHEN 'PROG'. " delete includes after main programs SELECT COUNT(*) FROM reposrc WHERE progname = -obj_name AND r3state = 'A' AND subc = 'I'. IF sy-subrc = 0. -korrnum = '200000'. ELSE. -korrnum = '180000'. ENDIF. WHEN 'IDOC'. -korrnum = '200000'. WHEN 'WDCA'. -korrnum = '174000'. WHEN 'WDYA'. -korrnum = '173000'. WHEN 'WDCC'. -korrnum = '172000'. WHEN 'WDYN'. -korrnum = '171000'. WHEN 'IEXT'. -korrnum = '150000'. WHEN OTHERS. -korrnum = '100000'. ENDCASE. ENDLOOP. resolve_ddic( CHANGING ct_tadir = ct_tadir ). resolve_packages( CHANGING ct_tadir = ct_tadir ). SORT ct_tadir BY korrnum ASCENDING. ENDMETHOD. METHOD resolve_ddic. * this will make sure the deletion sequence of structures/tables work * in case they have dependencies with .INCLUDE TYPES: BEGIN OF ty_edge, from TYPE ty_item, to TYPE ty_item, END OF ty_edge. DATA: lt_nodes TYPE TABLE OF ty_item, lt_edges TYPE TABLE OF ty_edge, lt_findstrings TYPE TABLE OF rsfind, lv_plus TYPE i VALUE 1, lv_find_obj_cls TYPE euobj-id, lv_index TYPE i, lv_before TYPE i, lt_founds TYPE TABLE OF rsfindlst, lt_scope TYPE STANDARD TABLE OF seu_obj, lt_dependency TYPE ty_dedenpencies. FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_tadir, TYPE ty_dependency, TYPE zif_abapgit_definitions=>ty_tadir, LIKE LINE OF ct_tadir, LIKE LINE OF lt_edges, LIKE LINE OF lt_founds, LIKE LINE OF lt_nodes. " build nodes LOOP AT ct_tadir ASSIGNING WHERE object = 'TABL' OR object = 'VIEW' OR object = 'TTYP'. APPEND INITIAL LINE TO lt_nodes ASSIGNING . -obj_name = -obj_name. -obj_type = -object. ENDLOOP. APPEND 'TABL' TO lt_scope. APPEND 'VIEW' TO lt_scope. APPEND 'STRU' TO lt_scope. APPEND 'TTYP' TO lt_scope. " build edges LOOP AT lt_nodes ASSIGNING . CLEAR lt_findstrings. APPEND -obj_name TO lt_findstrings. lv_find_obj_cls = -obj_type. CALL FUNCTION 'RS_EU_CROSSREF' EXPORTING i_find_obj_cls = lv_find_obj_cls 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 <> 0. CONTINUE. ENDIF. LOOP AT lt_founds ASSIGNING . APPEND INITIAL LINE TO lt_edges ASSIGNING . -from = . -to-obj_name = -object. CASE -object_cls. WHEN 'DS' OR 'DT'. -to-obj_type = 'TABL'. WHEN 'DV'. -to-obj_type = 'VIEW'. WHEN 'DA'. -to-obj_type = 'TTYP'. WHEN OTHERS. zcx_abapgit_exception=>raise( 'resolve_ddic, unknown object_cls' ). ENDCASE. ENDLOOP. ENDLOOP. " build DDLS edges LOOP AT ct_tadir ASSIGNING WHERE object = 'DDLS'. CLEAR: lt_dependency. APPEND INITIAL LINE TO lt_nodes ASSIGNING . -obj_name = -obj_name. -obj_type = -object. lt_dependency = get_ddls_dependencies( -obj_name ). LOOP AT lt_dependency ASSIGNING WHERE deptyp = 'DDLS' AND refname = -obj_name. READ TABLE ct_tadir ASSIGNING WITH KEY pgmid = 'R3TR' object = 'DDLS' obj_name = -depname BINARY SEARCH. CHECK sy-subrc = 0. APPEND INITIAL LINE TO lt_edges ASSIGNING . -from = . -to-obj_name = -depname. -to-obj_type = 'DDLS'. ENDLOOP. ENDLOOP. DO. lv_before = lines( lt_nodes ). LOOP AT lt_nodes ASSIGNING . lv_index = sy-tabix. READ TABLE lt_edges WITH KEY from-obj_name = -obj_name from-obj_type = -obj_type TRANSPORTING NO FIELDS. IF sy-subrc <> 0. LOOP AT ct_tadir ASSIGNING WHERE obj_name = -obj_name AND object = -obj_type. -korrnum = -korrnum + lv_plus. CONDENSE -korrnum. ENDLOOP. DELETE lt_edges WHERE to-obj_name = -obj_name AND to-obj_type = -obj_type. DELETE lt_nodes INDEX lv_index. EXIT. " make sure the sequence is fixed ENDIF. ENDLOOP. IF lv_before = lines( lt_nodes ). EXIT. ENDIF. lv_plus = lv_plus + 1. ENDDO. ENDMETHOD. METHOD resolve_packages. DATA: lt_subpackages TYPE zif_abapgit_sap_package=>ty_devclass_tt. FIELD-SYMBOLS: LIKE LINE OF ct_tadir, LIKE LINE OF lt_subpackages, LIKE LINE OF ct_tadir. " List subpackage before corresponding superpackage LOOP AT ct_tadir ASSIGNING WHERE object = 'DEVC'. lt_subpackages = zcl_abapgit_factory=>get_sap_package( |{ -obj_name }| )->list_subpackages( ). LOOP AT lt_subpackages ASSIGNING . READ TABLE ct_tadir ASSIGNING WITH KEY object = 'DEVC' obj_name = . IF sy-subrc = 0. -korrnum = condense( |{ -korrnum - 1 }| ). ENDIF. ENDLOOP. ENDLOOP. ENDMETHOD. ENDCLASS.