add IDoc Segment support as part of TABL (#2246)

* add IDoc Segement support as part of TABL

IDoc Segement type/definition is just customizing and has no own transport object but it generates a structure and is coupled to it

The segment type/definitions have their own XML at the TABL object

* fix abaplint errors

* move segment type/defintion to TABL xml
This commit is contained in:
Domi Bigl 2019-01-02 06:05:49 +01:00 committed by Lars Hvam
parent 95b8120ef0
commit 311efc0d20
3 changed files with 488 additions and 208 deletions

View File

@ -8,6 +8,7 @@ CLASS zcl_abapgit_object_idoc DEFINITION PUBLIC INHERITING FROM zcl_abapgit_obje
IMPORTING IMPORTING
is_item TYPE zif_abapgit_definitions=>ty_item is_item TYPE zif_abapgit_definitions=>ty_item
iv_language TYPE spras. iv_language TYPE spras.
CLASS-METHODS clear_idoc_segement_fields CHANGING cs_structure TYPE any.
PRIVATE SECTION. PRIVATE SECTION.
TYPES: TYPES:
@ -16,13 +17,13 @@ CLASS zcl_abapgit_object_idoc DEFINITION PUBLIC INHERITING FROM zcl_abapgit_obje
t_syntax TYPE STANDARD TABLE OF edi_iapi02 WITH NON-UNIQUE DEFAULT KEY, t_syntax TYPE STANDARD TABLE OF edi_iapi02 WITH NON-UNIQUE DEFAULT KEY,
END OF ty_idoc. END OF ty_idoc.
DATA: DATA: mv_idoctyp TYPE edi_iapi00-idoctyp.
mv_idoctyp TYPE edi_iapi00-idoctyp.
CLASS-METHODS clear_idoc_segement_field IMPORTING iv_fieldname TYPE csequence CHANGING cs_structure TYPE any.
ENDCLASS. ENDCLASS.
CLASS zcl_abapgit_object_idoc IMPLEMENTATION. CLASS zcl_abapgit_object_idoc IMPLEMENTATION.
@ -101,21 +102,13 @@ CLASS zcl_abapgit_object_idoc IMPLEMENTATION.
CALL FUNCTION 'IDOCTYPE_CREATE' CALL FUNCTION 'IDOCTYPE_CREATE'
EXPORTING EXPORTING
pi_idoctyp = mv_idoctyp pi_idoctyp = mv_idoctyp
pi_devclass = iv_package pi_devclass = iv_package
pi_attributes = ls_attributes pi_attributes = ls_attributes
TABLES TABLES
pt_syntax = ls_idoc-t_syntax pt_syntax = ls_idoc-t_syntax
EXCEPTIONS EXCEPTIONS
object_not_found = 1 OTHERS = 1.
object_exists = 2
action_not_possible = 3
syntax_error = 4
segment_error = 5
transport_error = 6
db_error = 7
no_authority = 8
OTHERS = 9.
IF sy-subrc <> 0. IF sy-subrc <> 0.
zcx_abapgit_exception=>raise_t100( ). zcx_abapgit_exception=>raise_t100( ).
@ -176,15 +169,12 @@ CLASS zcl_abapgit_object_idoc IMPLEMENTATION.
CALL FUNCTION 'ABAP4_CALL_TRANSACTION' CALL FUNCTION 'ABAP4_CALL_TRANSACTION'
STARTING NEW TASK 'GIT' STARTING NEW TASK 'GIT'
EXPORTING EXPORTING
tcode = 'WE30' tcode = 'WE30'
mode_val = 'E' mode_val = 'E'
TABLES TABLES
using_tab = lt_bdcdata using_tab = lt_bdcdata
EXCEPTIONS EXCEPTIONS
system_failure = 1 OTHERS = 1.
communication_failure = 2
resource_failure = 3
OTHERS = 4.
IF sy-subrc <> 0. IF sy-subrc <> 0.
zcx_abapgit_exception=>raise_t100( ). zcx_abapgit_exception=>raise_t100( ).
@ -214,12 +204,7 @@ CLASS zcl_abapgit_object_idoc IMPLEMENTATION.
zcx_abapgit_exception=>raise_t100( ). zcx_abapgit_exception=>raise_t100( ).
ENDIF. ENDIF.
CLEAR: ls_idoc-attributes-devc, clear_idoc_segement_fields( CHANGING cs_structure = ls_idoc-attributes ).
ls_idoc-attributes-plast,
ls_idoc-attributes-credate,
ls_idoc-attributes-cretime,
ls_idoc-attributes-ldate,
ls_idoc-attributes-ltime.
io_xml->add( iv_name = 'IDOC' io_xml->add( iv_name = 'IDOC'
ig_data = ls_idoc ). ig_data = ls_idoc ).
@ -234,4 +219,37 @@ CLASS zcl_abapgit_object_idoc IMPLEMENTATION.
METHOD zif_abapgit_object~is_active. METHOD zif_abapgit_object~is_active.
rv_active = is_active( ). rv_active = is_active( ).
ENDMETHOD. ENDMETHOD.
METHOD clear_idoc_segement_fields.
clear_idoc_segement_field( EXPORTING iv_fieldname = 'DEVC'
CHANGING cs_structure = cs_structure ).
clear_idoc_segement_field( EXPORTING iv_fieldname = 'PLAST'
CHANGING cs_structure = cs_structure ).
clear_idoc_segement_field( EXPORTING iv_fieldname = 'PWORK'
CHANGING cs_structure = cs_structure ).
clear_idoc_segement_field( EXPORTING iv_fieldname = 'PRESP'
CHANGING cs_structure = cs_structure ).
clear_idoc_segement_field( EXPORTING iv_fieldname = 'CREDATE'
CHANGING cs_structure = cs_structure ).
clear_idoc_segement_field( EXPORTING iv_fieldname = 'CRETIME'
CHANGING cs_structure = cs_structure ).
clear_idoc_segement_field( EXPORTING iv_fieldname = 'LDATE'
CHANGING cs_structure = cs_structure ).
clear_idoc_segement_field( EXPORTING iv_fieldname = 'LTIME'
CHANGING cs_structure = cs_structure ).
ENDMETHOD.
METHOD clear_idoc_segement_field.
FIELD-SYMBOLS <lv_any_field> TYPE any.
ASSIGN COMPONENT iv_fieldname OF STRUCTURE cs_structure TO <lv_any_field>.
IF sy-subrc = 0.
CLEAR <lv_any_field>.
ENDIF.
ENDMETHOD.
ENDCLASS. ENDCLASS.

View File

@ -8,16 +8,14 @@ CLASS zcl_abapgit_object_iext DEFINITION PUBLIC INHERITING FROM zcl_abapgit_obje
IMPORTING IMPORTING
is_item TYPE zif_abapgit_definitions=>ty_item is_item TYPE zif_abapgit_definitions=>ty_item
iv_language TYPE spras. iv_language TYPE spras.
PRIVATE SECTION. PRIVATE SECTION.
TYPES: TYPES: BEGIN OF ty_extention,
BEGIN OF ty_extention, attributes TYPE edi_iapi01,
attributes TYPE edi_iapi01, t_syntax TYPE STANDARD TABLE OF edi_iapi03 WITH NON-UNIQUE DEFAULT KEY,
t_syntax TYPE STANDARD TABLE OF edi_iapi03 WITH NON-UNIQUE DEFAULT KEY, END OF ty_extention.
END OF ty_extention.
DATA: CONSTANTS c_dataname_iext TYPE string VALUE 'IEXT' ##NO_TEXT.
mv_extension TYPE edi_cimtyp. DATA: mv_extension TYPE edi_cimtyp.
ENDCLASS. ENDCLASS.
@ -28,7 +26,7 @@ CLASS zcl_abapgit_object_iext IMPLEMENTATION.
METHOD constructor. METHOD constructor.
super->constructor( is_item = is_item super->constructor( is_item = is_item
iv_language = iv_language ). iv_language = iv_language ).
mv_extension = ms_item-obj_name. mv_extension = ms_item-obj_name.
@ -78,30 +76,38 @@ CLASS zcl_abapgit_object_iext IMPLEMENTATION.
DATA: ls_extension TYPE ty_extention, DATA: ls_extension TYPE ty_extention,
ls_attributes TYPE edi_iapi05. ls_attributes TYPE edi_iapi05.
io_xml->read( io_xml->read( EXPORTING iv_name = c_dataname_iext
EXPORTING CHANGING cg_data = ls_extension ).
iv_name = 'IEXT'
CHANGING
cg_data = ls_extension ).
MOVE-CORRESPONDING ls_extension-attributes TO ls_attributes. MOVE-CORRESPONDING ls_extension-attributes TO ls_attributes.
ls_attributes-presp = cl_abap_syst=>get_user_name( ). ls_attributes-presp = cl_abap_syst=>get_user_name( ).
ls_attributes-pwork = ls_attributes-presp. ls_attributes-pwork = ls_attributes-presp.
CALL FUNCTION 'EXTTYPE_CREATE' IF me->zif_abapgit_object~exists( ) = abap_true.
EXPORTING CALL FUNCTION 'EXTTYPE_UPDATE'
pi_cimtyp = mv_extension EXPORTING
pi_devclass = iv_package pi_cimtyp = mv_extension
pi_attributes = ls_attributes pi_attributes = ls_attributes
TABLES TABLES
pt_syntax = ls_extension-t_syntax pt_syntax = ls_extension-t_syntax
EXCEPTIONS EXCEPTIONS
OTHERS = 1. OTHERS = 1.
ELSE.
CALL FUNCTION 'EXTTYPE_CREATE'
EXPORTING
pi_cimtyp = mv_extension
pi_devclass = iv_package
pi_attributes = ls_attributes
TABLES
pt_syntax = ls_extension-t_syntax
EXCEPTIONS
OTHERS = 1.
ENDIF.
IF sy-subrc <> 0. IF sy-subrc <> 0.
zcx_abapgit_exception=>raise_t100( ). zcx_abapgit_exception=>raise_t100( ).
ENDIF. ENDIF.
ENDMETHOD. ENDMETHOD.
@ -170,7 +176,7 @@ CLASS zcl_abapgit_object_iext IMPLEMENTATION.
METHOD zif_abapgit_object~serialize. METHOD zif_abapgit_object~serialize.
DATA: ls_extension TYPE ty_extention. DATA ls_extension TYPE ty_extention.
CALL FUNCTION 'EXTTYPE_READ' CALL FUNCTION 'EXTTYPE_READ'
EXPORTING EXPORTING
@ -186,20 +192,14 @@ CLASS zcl_abapgit_object_iext IMPLEMENTATION.
zcx_abapgit_exception=>raise_t100( ). zcx_abapgit_exception=>raise_t100( ).
ENDIF. ENDIF.
CLEAR: ls_extension-attributes-devc, zcl_abapgit_object_idoc=>clear_idoc_segement_fields( CHANGING cs_structure = ls_extension-attributes ).
ls_extension-attributes-plast,
ls_extension-attributes-credate,
ls_extension-attributes-cretime,
ls_extension-attributes-ldate,
ls_extension-attributes-ltime,
ls_extension-attributes-pwork,
ls_extension-attributes-presp.
io_xml->add( iv_name = 'IEXT' io_xml->add( iv_name = c_dataname_iext
ig_data = ls_extension ). ig_data = ls_extension ).
ENDMETHOD. ENDMETHOD.
METHOD zif_abapgit_object~is_locked. METHOD zif_abapgit_object~is_locked.
rv_is_locked = abap_false. rv_is_locked = abap_false.
ENDMETHOD. ENDMETHOD.

View File

@ -4,27 +4,63 @@ CLASS zcl_abapgit_object_tabl DEFINITION PUBLIC INHERITING FROM zcl_abapgit_obje
INTERFACES zif_abapgit_object. INTERFACES zif_abapgit_object.
ALIASES mo_files FOR zif_abapgit_object~mo_files. ALIASES mo_files FOR zif_abapgit_object~mo_files.
PROTECTED SECTION. PROTECTED SECTION.
TYPES: BEGIN OF ty_segment_definition,
segmentheader TYPE edisegmhd,
segmentdefinition TYPE edisegmdef,
segmentstructures TYPE STANDARD TABLE OF edisegstru WITH DEFAULT KEY,
END OF ty_segment_definition.
TYPES: ty_segment_definitions TYPE STANDARD TABLE OF ty_segment_definition WITH DEFAULT KEY.
"! Serialize IDoc Segment type/definition if exits
"! @parameter io_xml | XML writer
"! @raising zcx_abapgit_exception | Exceptions
METHODS serialize_idoc_segment IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_output
RAISING zcx_abapgit_exception.
"! Deserialize IDoc Segment type/definition if exits
"! @parameter io_xml | XML writer
"! @parameter iv_package | Target package
"! @parameter rv_deserialized | It's a segment and was desserialized
"! @raising zcx_abapgit_exception | Exceptions
METHODS deserialize_idoc_segment IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_input
iv_package TYPE devclass
RETURNING VALUE(rv_deserialized) TYPE abap_bool
RAISING zcx_abapgit_exception.
"! Delete the IDoc Segment type if exists
"! @parameter rv_deleted | It's a segment and was deleted
"! @raising zcx_abapgit_exception | Exceptions
METHODS delete_idoc_segment RETURNING VALUE(rv_deleted) TYPE abap_bool
RAISING zcx_abapgit_exception.
PRIVATE SECTION. PRIVATE SECTION.
CONSTANTS c_extension_xml TYPE string VALUE 'xml' ##NO_TEXT.
CONSTANTS c_longtext_id_tabl TYPE dokil-id VALUE 'TB' ##NO_TEXT. CONSTANTS c_longtext_id_tabl TYPE dokil-id VALUE 'TB' ##NO_TEXT.
CONSTANTS: BEGIN OF c_s_dataname,
segment_definition TYPE string VALUE 'SEGMENT_DEFINITION' ##NO_TEXT,
END OF c_s_dataname.
TYPES: ty_dd03p_tt TYPE STANDARD TABLE OF dd03p. TYPES: ty_dd03p_tt TYPE STANDARD TABLE OF dd03p.
METHODS clear_dd03p_fields METHODS clear_dd03p_fields
CHANGING ct_dd03p TYPE ty_dd03p_tt. CHANGING ct_dd03p TYPE ty_dd03p_tt.
"! Check if structure is an IDoc segment
"! @raising zcx_abapgit_exception | It's not an IDoc segment
METHODS check_is_idoc_segment RAISING zcx_abapgit_exception.
METHODS clear_dd03p_fields_common CHANGING cs_dd03p TYPE dd03p.
METHODS clear_dd03p_fields_dataelement CHANGING cs_dd03p TYPE dd03p.
ENDCLASS. ENDCLASS.
CLASS ZCL_ABAPGIT_OBJECT_TABL IMPLEMENTATION. CLASS zcl_abapgit_object_tabl IMPLEMENTATION.
METHOD clear_dd03p_fields. METHOD clear_dd03p_fields.
CONSTANTS lc_comptype_dataelement TYPE comptype VALUE 'E' ##NO_TEXT.
DATA: lv_masklen TYPE c LENGTH 4. DATA: lv_masklen TYPE c LENGTH 4.
FIELD-SYMBOLS: <ls_dd03p> LIKE LINE OF ct_dd03p. FIELD-SYMBOLS: <ls_dd03p> TYPE dd03p.
* remove nested structures * remove nested structures
DELETE ct_dd03p WHERE depth <> '00'. DELETE ct_dd03p WHERE depth <> '00'.
@ -32,15 +68,8 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL IMPLEMENTATION.
DELETE ct_dd03p WHERE adminfield <> '0'. DELETE ct_dd03p WHERE adminfield <> '0'.
LOOP AT ct_dd03p ASSIGNING <ls_dd03p> WHERE NOT rollname IS INITIAL. LOOP AT ct_dd03p ASSIGNING <ls_dd03p> WHERE NOT rollname IS INITIAL.
CLEAR: <ls_dd03p>-ddlanguage,
<ls_dd03p>-dtelmaster, clear_dd03p_fields_common( CHANGING cs_dd03p = <ls_dd03p> ).
<ls_dd03p>-logflag,
<ls_dd03p>-ddtext,
<ls_dd03p>-reservedte,
<ls_dd03p>-reptext,
<ls_dd03p>-scrtext_s,
<ls_dd03p>-scrtext_m,
<ls_dd03p>-scrtext_l.
lv_masklen = <ls_dd03p>-masklen. lv_masklen = <ls_dd03p>-masklen.
IF lv_masklen = '' OR NOT lv_masklen CO '0123456789'. IF lv_masklen = '' OR NOT lv_masklen CO '0123456789'.
@ -48,34 +77,14 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL IMPLEMENTATION.
CLEAR <ls_dd03p>-masklen. CLEAR <ls_dd03p>-masklen.
ENDIF. ENDIF.
IF <ls_dd03p>-comptype = 'E'. IF <ls_dd03p>-comptype = lc_comptype_dataelement.
* type specified via data element clear_dd03p_fields_dataelement( CHANGING cs_dd03p = <ls_dd03p> ).
CLEAR: <ls_dd03p>-domname,
<ls_dd03p>-inttype,
<ls_dd03p>-intlen,
<ls_dd03p>-mask,
<ls_dd03p>-memoryid,
<ls_dd03p>-headlen,
<ls_dd03p>-scrlen1,
<ls_dd03p>-scrlen2,
<ls_dd03p>-scrlen3,
<ls_dd03p>-datatype,
<ls_dd03p>-leng,
<ls_dd03p>-outputlen,
<ls_dd03p>-deffdname,
<ls_dd03p>-convexit,
<ls_dd03p>-entitytab,
<ls_dd03p>-dommaster,
<ls_dd03p>-domname3l,
<ls_dd03p>-decimals,
<ls_dd03p>-lowercase,
<ls_dd03p>-signflag.
ENDIF. ENDIF.
IF <ls_dd03p>-shlporigin = 'D'. IF <ls_dd03p>-shlporigin = 'D'.
* search help from domain * search help from domain
CLEAR: <ls_dd03p>-shlpfield, CLEAR: <ls_dd03p>-shlpfield,
<ls_dd03p>-shlpname. <ls_dd03p>-shlpname.
ENDIF. ENDIF.
* XML output assumes correct field content * XML output assumes correct field content
@ -87,6 +96,48 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD clear_dd03p_fields_dataelement.
* type specified via data element
CLEAR: cs_dd03p-domname,
cs_dd03p-inttype,
cs_dd03p-intlen,
cs_dd03p-mask,
cs_dd03p-memoryid,
cs_dd03p-headlen,
cs_dd03p-scrlen1,
cs_dd03p-scrlen2,
cs_dd03p-scrlen3,
cs_dd03p-datatype,
cs_dd03p-leng,
cs_dd03p-outputlen,
cs_dd03p-deffdname,
cs_dd03p-convexit,
cs_dd03p-entitytab,
cs_dd03p-dommaster,
cs_dd03p-domname3l,
cs_dd03p-decimals,
cs_dd03p-lowercase,
cs_dd03p-signflag.
ENDMETHOD.
METHOD clear_dd03p_fields_common.
CLEAR: cs_dd03p-ddlanguage,
cs_dd03p-dtelmaster,
cs_dd03p-logflag,
cs_dd03p-ddtext,
cs_dd03p-reservedte,
cs_dd03p-reptext,
cs_dd03p-scrtext_s,
cs_dd03p-scrtext_m,
cs_dd03p-scrtext_l.
ENDMETHOD.
METHOD zif_abapgit_object~changed_by. METHOD zif_abapgit_object~changed_by.
@ -174,45 +225,49 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL IMPLEMENTATION.
lv_objname = ms_item-obj_name. lv_objname = ms_item-obj_name.
lv_no_ask = abap_true. IF delete_idoc_segment( ) = abap_false.
SELECT SINGLE tabclass FROM dd02l INTO lv_tabclass
WHERE tabname = ms_item-obj_name lv_no_ask = abap_true.
AND as4local = 'A' SELECT SINGLE tabclass FROM dd02l INTO lv_tabclass
AND as4vers = '0000'. WHERE tabname = ms_item-obj_name
IF sy-subrc = 0 AND lv_tabclass = 'TRANSP'. AND as4local = 'A'
AND as4vers = '0000'.
IF sy-subrc = 0 AND lv_tabclass = 'TRANSP'.
* Avoid dump in dynamic SELECT in case the table does not exist on database * Avoid dump in dynamic SELECT in case the table does not exist on database
CALL FUNCTION 'DB_EXISTS_TABLE' CALL FUNCTION 'DB_EXISTS_TABLE'
EXPORTING EXPORTING
tabname = lv_objname tabname = lv_objname
IMPORTING IMPORTING
subrc = lv_subrc. subrc = lv_subrc.
IF lv_subrc = 0. IF lv_subrc = 0.
* it cannot delete table with table wihtout asking * it cannot delete table with table without asking
CREATE DATA lr_data TYPE (lv_objname). CREATE DATA lr_data TYPE (lv_objname).
ASSIGN lr_data->* TO <lg_data>. ASSIGN lr_data->* TO <lg_data>.
SELECT SINGLE * FROM (lv_objname) INTO <lg_data>. SELECT SINGLE * FROM (lv_objname) INTO <lg_data>.
IF sy-subrc = 0. IF sy-subrc = 0.
lv_no_ask = abap_false. lv_no_ask = abap_false.
ENDIF.
ENDIF. ENDIF.
ENDIF. ENDIF.
ENDIF.
CALL FUNCTION 'RS_DD_DELETE_OBJ' CALL FUNCTION 'RS_DD_DELETE_OBJ'
EXPORTING EXPORTING
no_ask = lv_no_ask no_ask = lv_no_ask
objname = lv_objname objname = lv_objname
objtype = 'T' objtype = 'T'
EXCEPTIONS EXCEPTIONS
not_executed = 1 not_executed = 1
object_not_found = 2 object_not_found = 2
object_not_specified = 3 object_not_specified = 3
permission_failure = 4. permission_failure = 4.
IF sy-subrc <> 0. IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'error from RS_DD_DELETE_OBJ, TABL' ). zcx_abapgit_exception=>raise( 'error from RS_DD_DELETE_OBJ, TABL' ).
ENDIF. ENDIF.
delete_longtexts( c_longtext_id_tabl ). delete_longtexts( c_longtext_id_tabl ).
ENDIF.
ENDMETHOD. ENDMETHOD.
@ -234,97 +289,101 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL IMPLEMENTATION.
lt_dd36m TYPE dd36mttyp, lt_dd36m TYPE dd36mttyp,
ls_dd12v LIKE LINE OF lt_dd12v. ls_dd12v LIKE LINE OF lt_dd12v.
IF deserialize_idoc_segment( io_xml = io_xml
iv_package = iv_package ) = abap_false.
io_xml->read( EXPORTING iv_name = 'DD02V' io_xml->read( EXPORTING iv_name = 'DD02V'
CHANGING cg_data = ls_dd02v ). CHANGING cg_data = ls_dd02v ).
io_xml->read( EXPORTING iv_name = 'DD09L' io_xml->read( EXPORTING iv_name = 'DD09L'
CHANGING cg_data = ls_dd09l ). CHANGING cg_data = ls_dd09l ).
io_xml->read( EXPORTING iv_name = 'DD03P_TABLE' io_xml->read( EXPORTING iv_name = 'DD03P_TABLE'
CHANGING cg_data = lt_dd03p ). CHANGING cg_data = lt_dd03p ).
io_xml->read( EXPORTING iv_name = 'DD05M_TABLE' io_xml->read( EXPORTING iv_name = 'DD05M_TABLE'
CHANGING cg_data = lt_dd05m ). CHANGING cg_data = lt_dd05m ).
io_xml->read( EXPORTING iv_name = 'DD08V_TABLE' io_xml->read( EXPORTING iv_name = 'DD08V_TABLE'
CHANGING cg_data = lt_dd08v ). CHANGING cg_data = lt_dd08v ).
io_xml->read( EXPORTING iv_name = 'DD12V' io_xml->read( EXPORTING iv_name = 'DD12V'
CHANGING cg_data = lt_dd12v ). CHANGING cg_data = lt_dd12v ).
io_xml->read( EXPORTING iv_name = 'DD17V' io_xml->read( EXPORTING iv_name = 'DD17V'
CHANGING cg_data = lt_dd17v ). CHANGING cg_data = lt_dd17v ).
io_xml->read( EXPORTING iv_name = 'DD35V_TALE' io_xml->read( EXPORTING iv_name = 'DD35V_TALE'
CHANGING cg_data = lt_dd35v ). CHANGING cg_data = lt_dd35v ).
io_xml->read( EXPORTING iv_name = 'DD36M' io_xml->read( EXPORTING iv_name = 'DD36M'
CHANGING cg_data = lt_dd36m ). CHANGING cg_data = lt_dd36m ).
corr_insert( iv_package ). corr_insert( iv_package ).
lv_name = ms_item-obj_name. " type conversion lv_name = ms_item-obj_name. " type conversion
CALL FUNCTION 'DDIF_TABL_PUT' CALL FUNCTION 'DDIF_TABL_PUT'
EXPORTING
name = lv_name
dd02v_wa = ls_dd02v
dd09l_wa = ls_dd09l
TABLES
dd03p_tab = lt_dd03p
dd05m_tab = lt_dd05m
dd08v_tab = lt_dd08v
dd35v_tab = lt_dd35v
dd36m_tab = lt_dd36m
EXCEPTIONS
tabl_not_found = 1
name_inconsistent = 2
tabl_inconsistent = 3
put_failure = 4
put_refused = 5
OTHERS = 6.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'error from DDIF_TABL_PUT' ).
ENDIF.
zcl_abapgit_objects_activation=>add_item( ms_item ).
* handle indexes
LOOP AT lt_dd12v INTO ls_dd12v.
* todo, call corr_insert?
CLEAR lt_secondary.
LOOP AT lt_dd17v INTO ls_dd17v
WHERE sqltab = ls_dd12v-sqltab AND indexname = ls_dd12v-indexname.
APPEND ls_dd17v TO lt_secondary.
ENDLOOP.
CALL FUNCTION 'DDIF_INDX_PUT'
EXPORTING EXPORTING
name = ls_dd12v-sqltab name = lv_name
id = ls_dd12v-indexname dd02v_wa = ls_dd02v
dd12v_wa = ls_dd12v dd09l_wa = ls_dd09l
TABLES TABLES
dd17v_tab = lt_secondary dd03p_tab = lt_dd03p
dd05m_tab = lt_dd05m
dd08v_tab = lt_dd08v
dd35v_tab = lt_dd35v
dd36m_tab = lt_dd36m
EXCEPTIONS EXCEPTIONS
indx_not_found = 1 tabl_not_found = 1
name_inconsistent = 2 name_inconsistent = 2
indx_inconsistent = 3 tabl_inconsistent = 3
put_failure = 4 put_failure = 4
put_refused = 5 put_refused = 5
OTHERS = 6. OTHERS = 6.
IF sy-subrc <> 0. IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'error from DDIF_INDX_PUT' ). zcx_abapgit_exception=>raise( 'error from DDIF_TABL_PUT' ).
ENDIF. ENDIF.
CALL FUNCTION 'DD_DD_TO_E071' zcl_abapgit_objects_activation=>add_item( ms_item ).
EXPORTING
type = 'INDX'
name = ls_dd12v-sqltab
id = ls_dd12v-indexname
IMPORTING
obj_name = lv_tname.
zcl_abapgit_objects_activation=>add( iv_type = 'INDX' * handle indexes
iv_name = lv_tname ). LOOP AT lt_dd12v INTO ls_dd12v.
ENDLOOP. * todo, call corr_insert?
deserialize_longtexts( io_xml ). CLEAR lt_secondary.
LOOP AT lt_dd17v INTO ls_dd17v
WHERE sqltab = ls_dd12v-sqltab AND indexname = ls_dd12v-indexname.
APPEND ls_dd17v TO lt_secondary.
ENDLOOP.
CALL FUNCTION 'DDIF_INDX_PUT'
EXPORTING
name = ls_dd12v-sqltab
id = ls_dd12v-indexname
dd12v_wa = ls_dd12v
TABLES
dd17v_tab = lt_secondary
EXCEPTIONS
indx_not_found = 1
name_inconsistent = 2
indx_inconsistent = 3
put_failure = 4
put_refused = 5
OTHERS = 6.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'error from DDIF_INDX_PUT' ).
ENDIF.
CALL FUNCTION 'DD_DD_TO_E071'
EXPORTING
type = 'INDX'
name = ls_dd12v-sqltab
id = ls_dd12v-indexname
IMPORTING
obj_name = lv_tname.
zcl_abapgit_objects_activation=>add( iv_type = 'INDX'
iv_name = lv_tname ).
ENDLOOP.
deserialize_longtexts( io_xml ).
ENDIF.
ENDMETHOD. ENDMETHOD.
@ -333,7 +392,6 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL IMPLEMENTATION.
DATA: lv_tabname TYPE dd02l-tabname. DATA: lv_tabname TYPE dd02l-tabname.
SELECT SINGLE tabname FROM dd02l INTO lv_tabname SELECT SINGLE tabname FROM dd02l INTO lv_tabname
WHERE tabname = ms_item-obj_name WHERE tabname = ms_item-obj_name
AND as4local = 'A' AND as4local = 'A'
@ -553,5 +611,209 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL IMPLEMENTATION.
serialize_longtexts( io_xml = io_xml serialize_longtexts( io_xml = io_xml
iv_longtext_id = c_longtext_id_tabl ). iv_longtext_id = c_longtext_id_tabl ).
serialize_idoc_segment( io_xml ).
ENDMETHOD. ENDMETHOD.
METHOD serialize_idoc_segment.
DATA lv_segment_type TYPE edilsegtyp.
DATA lv_result TYPE syst_subrc.
DATA lv_devclass TYPE devclass.
DATA lt_segmentdefinitions TYPE STANDARD TABLE OF edisegmdef.
DATA ls_segment_definition TYPE ty_segment_definition.
DATA lt_segment_definitions TYPE ty_segment_definitions.
FIELD-SYMBOLS: <ls_segemtndefinition> TYPE edisegmdef.
TRY.
check_is_idoc_segment( ).
lv_segment_type = ms_item-obj_name.
CALL FUNCTION 'SEGMENT_READ'
EXPORTING
segmenttyp = lv_segment_type
IMPORTING
result = lv_result
TABLES
segmentdefinition = lt_segmentdefinitions
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0 OR lv_result <> 0.
zcx_abapgit_exception=>raise_t100( ).
ENDIF.
LOOP AT lt_segmentdefinitions ASSIGNING <ls_segemtndefinition>.
CLEAR ls_segment_definition.
CALL FUNCTION 'SEGMENTDEFINITION_READ'
EXPORTING
segmenttyp = <ls_segemtndefinition>-segtyp
IMPORTING
result = lv_result
devclass = lv_devclass
segmentheader = ls_segment_definition-segmentheader
segmentdefinition = ls_segment_definition-segmentdefinition
TABLES
segmentstructure = ls_segment_definition-segmentstructures
CHANGING
version = <ls_segemtndefinition>-version
EXCEPTIONS
no_authority = 1
segment_not_existing = 2
OTHERS = 3.
IF sy-subrc <> 0 OR lv_result <> 0.
zcx_abapgit_exception=>raise_t100( ).
ENDIF.
zcl_abapgit_object_idoc=>clear_idoc_segement_fields(
CHANGING cs_structure = ls_segment_definition-segmentdefinition ).
zcl_abapgit_object_idoc=>clear_idoc_segement_fields(
CHANGING cs_structure = ls_segment_definition-segmentheader ).
APPEND ls_segment_definition TO lt_segment_definitions.
ENDLOOP.
io_xml->add( iv_name = c_s_dataname-segment_definition
ig_data = lt_segment_definitions ).
CATCH zcx_abapgit_exception ##no_handler.
"ok, no Idoc segment
ENDTRY.
ENDMETHOD.
METHOD check_is_idoc_segment.
DATA lv_segment_type TYPE edilsegtyp.
lv_segment_type = ms_item-obj_name.
SELECT SINGLE segtyp
FROM edisegment
INTO lv_segment_type
WHERE segtyp = lv_segment_type.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'No IDoc segment' ).
ENDIF.
ENDMETHOD.
METHOD deserialize_idoc_segment.
DATA lv_version TYPE segmentvrs .
DATA lv_result TYPE syst_subrc.
DATA lt_segment_definitions TYPE ty_segment_definitions.
DATA lv_package TYPE devclass.
FIELD-SYMBOLS <ls_segment_definition> TYPE ty_segment_definition.
TRY.
io_xml->read( EXPORTING iv_name = c_s_dataname-segment_definition
CHANGING cg_data = lt_segment_definitions ).
CATCH zcx_abapgit_exception ##no_handler.
rv_deserialized = abap_false.
RETURN. "previous XML version or no IDoc segment
ENDTRY.
rv_deserialized = abap_true.
lv_package = iv_package.
LOOP AT lt_segment_definitions ASSIGNING <ls_segment_definition>.
<ls_segment_definition>-segmentheader-presp =
<ls_segment_definition>-segmentheader-pwork = cl_abap_syst=>get_user_name( ).
CALL FUNCTION 'SEGMENT_READ'
EXPORTING
segmenttyp = <ls_segment_definition>-segmentheader-segtyp
IMPORTING
result = lv_result
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0 OR lv_result <> 0.
CALL FUNCTION 'SEGMENT_CREATE'
IMPORTING
segmentdefinition = <ls_segment_definition>-segmentdefinition
TABLES
segmentstructure = <ls_segment_definition>-segmentstructures
CHANGING
segmentheader = <ls_segment_definition>-segmentheader
devclass = lv_package
EXCEPTIONS
OTHERS = 1.
ELSE.
CALL FUNCTION 'SEGMENT_MODIFY'
CHANGING
segmentheader = <ls_segment_definition>-segmentheader
devclass = lv_package
EXCEPTIONS
OTHERS = 1.
IF sy-subrc = 0.
CALL FUNCTION 'SEGMENTDEFINITION_MODIFY'
TABLES
segmentstructure = <ls_segment_definition>-segmentstructures
CHANGING
segmentdefinition = <ls_segment_definition>-segmentdefinition
EXCEPTIONS
OTHERS = 1.
ENDIF.
ENDIF.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise_t100( ).
ENDIF.
ENDLOOP.
CALL FUNCTION 'TR_TADIR_INTERFACE'
EXPORTING
wi_test_modus = abap_false
wi_tadir_pgmid = 'R3TR'
wi_tadir_object = ms_item-obj_type
wi_tadir_obj_name = ms_item-obj_name
wi_tadir_author = cl_abap_syst=>get_user_name( )
wi_tadir_devclass = iv_package
wi_tadir_masterlang = mv_language
iv_set_edtflag = abap_true
iv_delflag = abap_false
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'error from TR_TADIR_INTERFACE' ).
ENDIF.
ENDMETHOD.
METHOD delete_idoc_segment.
DATA lv_segment_type TYPE edilsegtyp.
DATA lv_result TYPE syst_subrc.
TRY.
check_is_idoc_segment( ).
CATCH zcx_abapgit_exception ##no_handler.
rv_deleted = abap_false.
RETURN. "previous XML version or no IDoc segment
ENDTRY.
rv_deleted = abap_true.
lv_segment_type = ms_item-obj_name.
CALL FUNCTION 'SEGMENT_DELETE'
EXPORTING
segmenttyp = lv_segment_type
IMPORTING
result = lv_result
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0 OR lv_result <> 0.
zcx_abapgit_exception=>raise_t100( ).
ENDIF.
ENDMETHOD.
ENDCLASS. ENDCLASS.