CLASS zcl_abapgit_object_chdo DEFINITION PUBLIC INHERITING FROM zcl_abapgit_objects_super FINAL CREATE PUBLIC . PUBLIC SECTION. INTERFACES zif_abapgit_object. METHODS constructor IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item iv_language TYPE spras. PROTECTED SECTION. METHODS after_import RAISING zcx_abapgit_exception . METHODS delete_tadir_cdnames IMPORTING !is_cdnames TYPE cdnames RAISING zcx_abapgit_exception . METHODS delete_tadir_tabl IMPORTING !is_tcdrs TYPE tcdrs RAISING zcx_abapgit_exception . PRIVATE SECTION. TYPES: BEGIN OF ty_change_document, reports_generated TYPE SORTED TABLE OF tcdrps WITH UNIQUE KEY object reportname, objects TYPE SORTED TABLE OF tcdobs WITH UNIQUE KEY object tabname, objects_text TYPE SORTED TABLE OF tcdobts WITH UNIQUE KEY spras object, END OF ty_change_document. DATA: mv_object TYPE cdobjectcl. ENDCLASS. CLASS zcl_abapgit_object_chdo IMPLEMENTATION. METHOD after_import. DATA: lt_cts_object_entry TYPE STANDARD TABLE OF e071 WITH DEFAULT KEY, ls_cts_object_entry LIKE LINE OF lt_cts_object_entry, lt_errormsg TYPE STANDARD TABLE OF sprot_u WITH DEFAULT KEY. ls_cts_object_entry-pgmid = seok_pgmid_r3tr. ls_cts_object_entry-object = ms_item-obj_type. ls_cts_object_entry-obj_name = ms_item-obj_name. INSERT ls_cts_object_entry INTO TABLE lt_cts_object_entry. CALL FUNCTION 'AFTER_IMP_CHDO' EXPORTING iv_tarclient = sy-mandt iv_is_upgrade = abap_false TABLES tt_e071 = lt_cts_object_entry tt_errormsg = lt_errormsg. LOOP AT lt_errormsg TRANSPORTING NO FIELDS WHERE severity = 'E' OR severity = 'A'. EXIT. ENDLOOP. IF sy-subrc = 0. zcx_abapgit_exception=>raise( 'Error from AFTER_IMP_CHDO' ). ENDIF. ENDMETHOD. METHOD constructor. super->constructor( is_item = is_item iv_language = iv_language ). mv_object = is_item-obj_name. ENDMETHOD. METHOD delete_tadir_cdnames. DATA: lv_obj_name TYPE sobj_name. IF is_cdnames-repnamec IS NOT INITIAL. lv_obj_name = is_cdnames-repnamec. CALL FUNCTION 'TR_TADIR_INTERFACE' EXPORTING wi_delete_tadir_entry = abap_true wi_tadir_pgmid = 'R3TR' wi_tadir_object = 'PROG' wi_tadir_obj_name = lv_obj_name wi_test_modus = abap_false EXCEPTIONS tadir_entry_not_existing = 1 OTHERS = 2. IF sy-subrc > 1. zcx_abapgit_exception=>raise_t100( ). ENDIF. ENDIF. IF is_cdnames-repnamet IS NOT INITIAL. lv_obj_name = is_cdnames-repnamet. CALL FUNCTION 'TR_TADIR_INTERFACE' EXPORTING wi_delete_tadir_entry = abap_true wi_tadir_pgmid = 'R3TR' wi_tadir_object = 'PROG' wi_tadir_obj_name = lv_obj_name wi_test_modus = abap_false EXCEPTIONS tadir_entry_not_existing = 1 OTHERS = 2. IF sy-subrc > 1. zcx_abapgit_exception=>raise_t100( ). ENDIF. ENDIF. IF is_cdnames-repnamefix IS NOT INITIAL. lv_obj_name = is_cdnames-repnamefix. CALL FUNCTION 'TR_TADIR_INTERFACE' EXPORTING wi_delete_tadir_entry = abap_true wi_tadir_pgmid = 'R3TR' wi_tadir_object = 'PROG' wi_tadir_obj_name = lv_obj_name wi_test_modus = abap_false EXCEPTIONS tadir_entry_not_existing = 1 OTHERS = 2. IF sy-subrc > 1. zcx_abapgit_exception=>raise_t100( ). ENDIF. ENDIF. IF is_cdnames-repnamevar IS NOT INITIAL. lv_obj_name = is_cdnames-repnamevar. CALL FUNCTION 'TR_TADIR_INTERFACE' EXPORTING wi_delete_tadir_entry = abap_true wi_tadir_pgmid = 'R3TR' wi_tadir_object = 'PROG' wi_tadir_obj_name = lv_obj_name wi_test_modus = abap_false EXCEPTIONS tadir_entry_not_existing = 1 OTHERS = 2. IF sy-subrc > 1. zcx_abapgit_exception=>raise_t100( ). ENDIF. ENDIF. IF is_cdnames-fgrp IS NOT INITIAL. lv_obj_name = is_cdnames-fgrp. CALL FUNCTION 'TR_TADIR_INTERFACE' EXPORTING wi_delete_tadir_entry = abap_true wi_tadir_pgmid = 'R3TR' wi_tadir_object = 'FUGR' wi_tadir_obj_name = lv_obj_name wi_test_modus = abap_false EXCEPTIONS tadir_entry_not_existing = 1 OTHERS = 2. IF sy-subrc > 1. zcx_abapgit_exception=>raise_t100( ). ENDIF. ENDIF. ENDMETHOD. METHOD delete_tadir_tabl. DATA: lv_obj_name TYPE sobj_name. IF is_tcdrs-tabname IS NOT INITIAL. lv_obj_name = is_tcdrs-tabname. CALL FUNCTION 'TR_TADIR_INTERFACE' EXPORTING wi_delete_tadir_entry = abap_true wi_tadir_pgmid = 'R3TR' wi_tadir_object = 'TABL' wi_tadir_obj_name = lv_obj_name wi_test_modus = abap_false EXCEPTIONS tadir_entry_not_existing = 1 OTHERS = 2. IF sy-subrc > 1. zcx_abapgit_exception=>raise( |Error from TR_TADIR_INTERFACE (subrc={ sy-subrc } ).| ). ENDIF. ENDIF. ENDMETHOD. METHOD zif_abapgit_object~changed_by. SELECT SINGLE updname INTO rv_user FROM tcdrp WHERE object = mv_object. IF sy-subrc <> 0. rv_user = c_user_unknown. ENDIF. ENDMETHOD. METHOD zif_abapgit_object~delete. DATA: lt_cdnames TYPE STANDARD TABLE OF cdnames, ls_cdnames TYPE cdnames, lt_tcdrs TYPE STANDARD TABLE OF tcdrs, ls_tcdrs TYPE tcdrs, lv_msg TYPE symsgv. CALL FUNCTION 'CDNAMES_GET' EXPORTING iv_object = mv_object TABLES it_tcdrs = lt_tcdrs it_names = lt_cdnames EXCEPTIONS object_space = 1 object_not_found = 2 OTHERS = 3. IF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. CALL FUNCTION 'CHDO_DELETE' EXPORTING iv_object = mv_object iv_with_tadir = abap_true EXCEPTIONS object_is_space = 1 object_not_found = 2 other_error = 3 OTHERS = 4. IF sy-subrc <> 0. lv_msg = mv_object. zcx_abapgit_exception=>raise_t100( iv_msgid = 'CD' iv_msgno = '869' iv_msgv1 = lv_msg ). ENDIF. LOOP AT lt_cdnames INTO ls_cdnames. delete_tadir_cdnames( ls_cdnames ). ENDLOOP. LOOP AT lt_tcdrs INTO ls_tcdrs. delete_tadir_tabl( ls_tcdrs ). ENDLOOP. corr_insert( iv_package ). ENDMETHOD. METHOD zif_abapgit_object~deserialize. DATA: ls_change_object TYPE ty_change_document. FIELD-SYMBOLS: LIKE LINE OF ls_change_object-reports_generated. io_xml->read( EXPORTING iv_name = 'CHDO' CHANGING cg_data = ls_change_object ). DELETE FROM tcdobs WHERE object = mv_object. DELETE FROM tcdobts WHERE object = mv_object. DELETE FROM tcdrps WHERE object = mv_object. LOOP AT ls_change_object-reports_generated ASSIGNING . -devclass = iv_package. ENDLOOP. INSERT tcdobs FROM TABLE ls_change_object-objects. INSERT tcdobts FROM TABLE ls_change_object-objects_text. INSERT tcdrps FROM TABLE ls_change_object-reports_generated. tadir_insert( iv_package ). after_import( ). corr_insert( iv_package ). ENDMETHOD. METHOD zif_abapgit_object~exists. SELECT COUNT(*) FROM tcdrp WHERE object = mv_object. rv_bool = boolc( sy-subrc = 0 ). ENDMETHOD. METHOD zif_abapgit_object~get_comparator. RETURN. ENDMETHOD. METHOD zif_abapgit_object~get_deserialize_steps. APPEND zif_abapgit_object=>gc_step_id-abap TO rt_steps. ENDMETHOD. METHOD zif_abapgit_object~get_metadata. rs_metadata = get_metadata( ). ENDMETHOD. METHOD zif_abapgit_object~is_active. rv_active = is_active( ). ENDMETHOD. METHOD zif_abapgit_object~is_locked. rv_is_locked = abap_false. ENDMETHOD. METHOD zif_abapgit_object~jump. DATA: lt_bdcdata TYPE STANDARD TABLE OF bdcdata, ls_bdcdata LIKE LINE OF lt_bdcdata. CLEAR: ls_bdcdata. ls_bdcdata-program = 'SAPMSCDO_NEW'. ls_bdcdata-dynpro = '0100'. ls_bdcdata-dynbegin = abap_true. APPEND ls_bdcdata TO lt_bdcdata. CLEAR: ls_bdcdata. ls_bdcdata-fnam = 'TCDOB-OBJECT'. ls_bdcdata-fval = mv_object. APPEND ls_bdcdata TO lt_bdcdata. CLEAR: ls_bdcdata. ls_bdcdata-fnam = 'BDC_OKCODE'. ls_bdcdata-fval = '=DISP'. APPEND ls_bdcdata TO lt_bdcdata. zcl_abapgit_ui_factory=>get_gui_jumper( )->jump_batch_input( iv_tcode = 'SCDO' it_bdcdata = lt_bdcdata ). rv_exit = abap_true. ENDMETHOD. METHOD zif_abapgit_object~serialize. DATA: ls_change_object TYPE ty_change_document, lt_tcdrp TYPE STANDARD TABLE OF tcdrp, lt_tcdob TYPE STANDARD TABLE OF tcdob, lt_tcdobt TYPE STANDARD TABLE OF tcdobt, BEGIN OF ls_nulldatetime, " hack ro reset fields when they exist without syntax errors when they don't udate TYPE sy-datum, utime TYPE sy-uzeit, END OF ls_nulldatetime. FIELD-SYMBOLS: LIKE LINE OF ls_change_object-reports_generated, LIKE LINE OF ls_change_object-objects, LIKE LINE OF ls_change_object-objects_text. CALL FUNCTION 'CDNAMES_GET' EXPORTING iv_object = mv_object TABLES it_tcdrp = lt_tcdrp it_tcdob = lt_tcdob it_tcdobt = lt_tcdobt EXCEPTIONS object_space = 1 object_not_found = 2 OTHERS = 3. IF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. ls_change_object-reports_generated = lt_tcdrp. ls_change_object-objects = lt_tcdob. ls_change_object-objects_text = lt_tcdobt. " At import, when CHDO is generated date & time change, so always detects changes for this fields LOOP AT ls_change_object-reports_generated ASSIGNING . CLEAR: -datum, -uzeit, -author, -updname, -devclass. ENDLOOP. LOOP AT ls_change_object-objects ASSIGNING . MOVE-CORRESPONDING ls_nulldatetime TO . " reset date and time ENDLOOP. LOOP AT ls_change_object-objects_text ASSIGNING . MOVE-CORRESPONDING ls_nulldatetime TO . " reset date and time ENDLOOP. io_xml->add( iv_name = 'CHDO' ig_data = ls_change_object ). ENDMETHOD. ENDCLASS.