CLASS zcl_abapgit_object_tobj DEFINITION PUBLIC INHERITING FROM zcl_abapgit_objects_super FINAL. PUBLIC SECTION. INTERFACES zif_abapgit_object. ALIASES mo_files FOR zif_abapgit_object~mo_files. PROTECTED SECTION. PRIVATE SECTION. TYPES: BEGIN OF ty_tobj, tddat TYPE tddat, tvdir TYPE tvdir, tvimf TYPE STANDARD TABLE OF tvimf WITH DEFAULT KEY, END OF ty_tobj. METHODS: read_extra IMPORTING iv_tabname TYPE vim_name RETURNING VALUE(rs_tobj) TYPE ty_tobj, update_extra IMPORTING is_tobj TYPE ty_tobj, delete_extra IMPORTING iv_tabname TYPE vim_name. ENDCLASS. CLASS ZCL_ABAPGIT_OBJECT_TOBJ IMPLEMENTATION. METHOD delete_extra. DELETE FROM tddat WHERE tabname = iv_tabname. DELETE FROM tvdir WHERE tabname = iv_tabname. DELETE FROM tvimf WHERE tabname = iv_tabname. ENDMETHOD. METHOD read_extra. SELECT SINGLE * FROM tddat INTO rs_tobj-tddat WHERE tabname = iv_tabname. SELECT SINGLE * FROM tvdir INTO rs_tobj-tvdir WHERE tabname = iv_tabname. CLEAR: rs_tobj-tvdir-gendate, rs_tobj-tvdir-gentime. SELECT * FROM tvimf INTO TABLE rs_tobj-tvimf WHERE tabname = iv_tabname. ENDMETHOD. METHOD update_extra. DATA: lt_current_tvimf TYPE STANDARD TABLE OF tvimf. FIELD-SYMBOLS: TYPE tvimf. MODIFY tddat FROM is_tobj-tddat. MODIFY tvdir FROM is_tobj-tvdir. SELECT * INTO TABLE lt_current_tvimf FROM tvimf WHERE tabname = is_tobj-tddat-tabname ORDER BY PRIMARY KEY. LOOP AT lt_current_tvimf ASSIGNING . READ TABLE is_tobj-tvimf WITH KEY tabname = -tabname event = -event TRANSPORTING NO FIELDS. IF sy-subrc <> 0. DELETE tvimf FROM . ENDIF. ENDLOOP. MODIFY tvimf FROM TABLE is_tobj-tvimf. ENDMETHOD. METHOD zif_abapgit_object~changed_by. DATA: lv_type_pos TYPE i. lv_type_pos = strlen( ms_item-obj_name ) - 1. SELECT SINGLE luser FROM objh INTO rv_user WHERE objectname = ms_item-obj_name(lv_type_pos) AND objecttype = ms_item-obj_name+lv_type_pos. "#EC CI_GENBUFF IF sy-subrc <> 0. rv_user = c_user_unknown. ENDIF. ENDMETHOD. METHOD zif_abapgit_object~delete. DATA: ls_objh TYPE objh, lv_type_pos TYPE i. lv_type_pos = strlen( ms_item-obj_name ) - 1. ls_objh-objectname = ms_item-obj_name(lv_type_pos). ls_objh-objecttype = ms_item-obj_name+lv_type_pos. CALL FUNCTION 'OBJ_GENERATE' EXPORTING iv_objectname = ls_objh-objectname iv_objecttype = ls_objh-objecttype iv_maint_mode = 'D' EXCEPTIONS illegal_call = 1 object_not_found = 2 generate_error = 3 transport_error = 4 object_enqueue_failed = 5 OTHERS = 6. IF sy-subrc <> 0. zcx_abapgit_exception=>raise( 'error from OBJ_GENERATE' ). ENDIF. delete_extra( ls_objh-objectname ). ENDMETHOD. METHOD zif_abapgit_object~deserialize. DATA: ls_objh TYPE objh, ls_objt TYPE objt, lt_objs TYPE tt_objs, lt_objsl TYPE tt_objsl, lt_objm TYPE tt_objm, ls_tobj TYPE ty_tobj. io_xml->read( EXPORTING iv_name = 'OBJH' CHANGING cg_data = ls_objh ). io_xml->read( EXPORTING iv_name = 'OBJT' CHANGING cg_data = ls_objt ). io_xml->read( EXPORTING iv_name = 'OBJS' CHANGING cg_data = lt_objs ). io_xml->read( EXPORTING iv_name = 'OBJSL' CHANGING cg_data = lt_objsl ). io_xml->read( EXPORTING iv_name = 'OBJM' CHANGING cg_data = lt_objm ). CALL FUNCTION 'OBJ_GENERATE' EXPORTING iv_objectname = ls_objh-objectname iv_objecttype = ls_objh-objecttype iv_maint_mode = 'I' iv_objecttext = ls_objt-ddtext iv_objcateg = ls_objh-objcateg iv_objtransp = ls_objh-objtransp iv_devclass = iv_package TABLES tt_v_obj_s = lt_objs tt_objm = lt_objm EXCEPTIONS illegal_call = 1 object_not_found = 2 generate_error = 3 transport_error = 4 object_enqueue_failed = 5 OTHERS = 6. IF sy-subrc <> 0. * TOBJ has to be saved/generated after the DDIC tables have been * activated - fixed with late deserialization zcx_abapgit_exception=>raise( 'error from OBJ_GENERATE' ). ENDIF. CALL FUNCTION 'OBJ_SET_IMPORTABLE' EXPORTING iv_objectname = ls_objh-objectname iv_objecttype = ls_objh-objecttype iv_importable = ls_objh-importable EXCEPTIONS object_not_defined = 1 invalid = 2 transport_error = 3 object_enqueue_failed = 4 OTHERS = 5. IF sy-subrc <> 0. zcx_abapgit_exception=>raise( 'error from OBJ_SET_IMPORTABLE' ). ENDIF. * fm OBJ_GENERATE takes the defaults from the DDIC object * set OBJTRANSP directly, should be okay looking at the code in OBJ_SET_IMPORTABLE * locking has been done in OBJ_SET_IMPORTABLE plus recording of transport UPDATE objh SET objtransp = ls_objh-objtransp WHERE objectname = ls_objh-objectname AND objecttype = ls_objh-objecttype. io_xml->read( EXPORTING iv_name = 'TOBJ' CHANGING cg_data = ls_tobj ). ls_tobj-tvdir-gendate = sy-datum. ls_tobj-tvdir-gentime = sy-uzeit. update_extra( ls_tobj ). ENDMETHOD. METHOD zif_abapgit_object~exists. DATA: lv_objectname TYPE objh-objectname, lv_type_pos TYPE i. lv_type_pos = strlen( ms_item-obj_name ) - 1. SELECT SINGLE objectname FROM objh INTO lv_objectname WHERE objectname = ms_item-obj_name(lv_type_pos) AND objecttype = ms_item-obj_name+lv_type_pos. "#EC CI_GENBUFF rv_bool = boolc( sy-subrc = 0 ). ENDMETHOD. METHOD zif_abapgit_object~get_comparator. RETURN. ENDMETHOD. METHOD zif_abapgit_object~get_deserialize_steps. DATA: ls_meta TYPE zif_abapgit_definitions=>ty_metadata. ls_meta = zif_abapgit_object~get_metadata( ). IF ls_meta-late_deser = abap_true. APPEND zif_abapgit_object=>gc_step_id-late TO rt_steps. ELSEIF ls_meta-ddic = abap_true. APPEND zif_abapgit_object=>gc_step_id-ddic TO rt_steps. ELSE. APPEND zif_abapgit_object=>gc_step_id-abap TO rt_steps. ENDIF. ENDMETHOD. METHOD zif_abapgit_object~get_metadata. rs_metadata = get_metadata( ). rs_metadata-late_deser = abap_true. 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: ls_bcdata TYPE bdcdata, lt_bcdata TYPE STANDARD TABLE OF bdcdata. ls_bcdata-program = 'SAPMSVIM'. ls_bcdata-dynpro = '0050'. ls_bcdata-dynbegin = 'X'. APPEND ls_bcdata TO lt_bcdata. CLEAR ls_bcdata. ls_bcdata-fnam = 'VIMDYNFLDS-VIEWNAME'. ls_bcdata-fval = substring( val = ms_item-obj_name len = strlen( ms_item-obj_name ) - 1 ). APPEND ls_bcdata TO lt_bcdata. CLEAR ls_bcdata. ls_bcdata-fnam = 'VIMDYNFLDS-ELEM_GEN'. ls_bcdata-fval = abap_true. APPEND ls_bcdata TO lt_bcdata. CLEAR ls_bcdata. ls_bcdata-fnam = 'BDC_OKCODE'. ls_bcdata-fval = '=SHOW'. APPEND ls_bcdata TO lt_bcdata. CALL FUNCTION 'ABAP4_CALL_TRANSACTION' STARTING NEW TASK 'GIT' EXPORTING tcode = 'SE54' mode_val = 'E' TABLES using_tab = lt_bcdata EXCEPTIONS OTHERS = 1. IF sy-subrc <> 0. zcx_abapgit_exception=>raise( 'error from ABAP4_CALL_TRANSACTION, TOBJ' ). ENDIF. ENDMETHOD. METHOD zif_abapgit_object~serialize. DATA: ls_objh TYPE objh, ls_objt TYPE objt, lt_objs TYPE tt_objs, lt_objsl TYPE tt_objsl, lt_objm TYPE tt_objm, ls_tobj TYPE ty_tobj, lv_type_pos TYPE i. lv_type_pos = strlen( ms_item-obj_name ) - 1. ls_objh-objectname = ms_item-obj_name(lv_type_pos). ls_objh-objecttype = ms_item-obj_name+lv_type_pos. CALL FUNCTION 'CTO_OBJECT_GET' EXPORTING iv_objectname = ls_objh-objectname iv_objecttype = ls_objh-objecttype iv_language = mv_language iv_sel_objt = abap_true iv_sel_objs = abap_true iv_sel_objsl = abap_true iv_sel_objm = abap_true IMPORTING es_objh = ls_objh es_objt = ls_objt TABLES tt_objs = lt_objs tt_objsl = lt_objsl tt_objm = lt_objm EXCEPTIONS object_not_defined = 1 OTHERS = 2. IF sy-subrc = 1. RETURN. ELSEIF sy-subrc <> 0. zcx_abapgit_exception=>raise( 'error from CTO_OBJECT_GET' ). ENDIF. CLEAR: ls_objh-luser, ls_objh-ldate. io_xml->add( iv_name = 'OBJH' ig_data = ls_objh ). io_xml->add( iv_name = 'OBJT' ig_data = ls_objt ). io_xml->add( iv_name = 'OBJS' ig_data = lt_objs ). io_xml->add( iv_name = 'OBJSL' ig_data = lt_objsl ). io_xml->add( iv_name = 'OBJM' ig_data = lt_objm ). ls_tobj = read_extra( ls_objh-objectname ). io_xml->add( iv_name = 'TOBJ' ig_data = ls_tobj ). ENDMETHOD. ENDCLASS.