abapGit/src/objects/zcl_abapgit_object_chdo.clas.abap
2022-06-04 10:33:42 +02:00

413 lines
11 KiB
ABAP

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: <ls_report_generated> 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 <ls_report_generated>.
<ls_report_generated>-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: <ls_reports_generated> LIKE LINE OF ls_change_object-reports_generated,
<ls_objects> LIKE LINE OF ls_change_object-objects,
<ls_objects_text> 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 <ls_reports_generated>.
CLEAR: <ls_reports_generated>-datum, <ls_reports_generated>-uzeit,
<ls_reports_generated>-author, <ls_reports_generated>-updname,
<ls_reports_generated>-devclass.
ENDLOOP.
LOOP AT ls_change_object-objects ASSIGNING <ls_objects>.
MOVE-CORRESPONDING ls_nulldatetime TO <ls_objects>. " reset date and time
ENDLOOP.
LOOP AT ls_change_object-objects_text ASSIGNING <ls_objects_text>.
MOVE-CORRESPONDING ls_nulldatetime TO <ls_objects_text>. " reset date and time
ENDLOOP.
io_xml->add( iv_name = 'CHDO'
ig_data = ls_change_object ).
ENDMETHOD.
ENDCLASS.