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
is_item TYPE zif_abapgit_definitions=>ty_item
iv_language TYPE spras.
CLASS-METHODS clear_idoc_segement_fields CHANGING cs_structure TYPE any.
PRIVATE SECTION.
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,
END OF ty_idoc.
DATA:
mv_idoctyp TYPE edi_iapi00-idoctyp.
DATA: mv_idoctyp TYPE edi_iapi00-idoctyp.
CLASS-METHODS clear_idoc_segement_field IMPORTING iv_fieldname TYPE csequence CHANGING cs_structure TYPE any.
ENDCLASS.
CLASS zcl_abapgit_object_idoc IMPLEMENTATION.
@ -101,21 +102,13 @@ CLASS zcl_abapgit_object_idoc IMPLEMENTATION.
CALL FUNCTION 'IDOCTYPE_CREATE'
EXPORTING
pi_idoctyp = mv_idoctyp
pi_devclass = iv_package
pi_attributes = ls_attributes
pi_idoctyp = mv_idoctyp
pi_devclass = iv_package
pi_attributes = ls_attributes
TABLES
pt_syntax = ls_idoc-t_syntax
pt_syntax = ls_idoc-t_syntax
EXCEPTIONS
object_not_found = 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.
OTHERS = 1.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise_t100( ).
@ -176,15 +169,12 @@ CLASS zcl_abapgit_object_idoc IMPLEMENTATION.
CALL FUNCTION 'ABAP4_CALL_TRANSACTION'
STARTING NEW TASK 'GIT'
EXPORTING
tcode = 'WE30'
mode_val = 'E'
tcode = 'WE30'
mode_val = 'E'
TABLES
using_tab = lt_bdcdata
using_tab = lt_bdcdata
EXCEPTIONS
system_failure = 1
communication_failure = 2
resource_failure = 3
OTHERS = 4.
OTHERS = 1.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise_t100( ).
@ -214,12 +204,7 @@ CLASS zcl_abapgit_object_idoc IMPLEMENTATION.
zcx_abapgit_exception=>raise_t100( ).
ENDIF.
CLEAR: ls_idoc-attributes-devc,
ls_idoc-attributes-plast,
ls_idoc-attributes-credate,
ls_idoc-attributes-cretime,
ls_idoc-attributes-ldate,
ls_idoc-attributes-ltime.
clear_idoc_segement_fields( CHANGING cs_structure = ls_idoc-attributes ).
io_xml->add( iv_name = 'IDOC'
ig_data = ls_idoc ).
@ -234,4 +219,37 @@ CLASS zcl_abapgit_object_idoc IMPLEMENTATION.
METHOD zif_abapgit_object~is_active.
rv_active = is_active( ).
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.

View File

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

View File

@ -4,27 +4,63 @@ CLASS zcl_abapgit_object_tabl DEFINITION PUBLIC INHERITING FROM zcl_abapgit_obje
INTERFACES zif_abapgit_object.
ALIASES mo_files FOR zif_abapgit_object~mo_files.
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.
CONSTANTS c_extension_xml TYPE string VALUE 'xml' ##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.
METHODS clear_dd03p_fields
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.
CLASS ZCL_ABAPGIT_OBJECT_TABL IMPLEMENTATION.
CLASS zcl_abapgit_object_tabl IMPLEMENTATION.
METHOD clear_dd03p_fields.
CONSTANTS lc_comptype_dataelement TYPE comptype VALUE 'E' ##NO_TEXT.
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
DELETE ct_dd03p WHERE depth <> '00'.
@ -32,15 +68,8 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL IMPLEMENTATION.
DELETE ct_dd03p WHERE adminfield <> '0'.
LOOP AT ct_dd03p ASSIGNING <ls_dd03p> WHERE NOT rollname IS INITIAL.
CLEAR: <ls_dd03p>-ddlanguage,
<ls_dd03p>-dtelmaster,
<ls_dd03p>-logflag,
<ls_dd03p>-ddtext,
<ls_dd03p>-reservedte,
<ls_dd03p>-reptext,
<ls_dd03p>-scrtext_s,
<ls_dd03p>-scrtext_m,
<ls_dd03p>-scrtext_l.
clear_dd03p_fields_common( CHANGING cs_dd03p = <ls_dd03p> ).
lv_masklen = <ls_dd03p>-masklen.
IF lv_masklen = '' OR NOT lv_masklen CO '0123456789'.
@ -48,34 +77,14 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL IMPLEMENTATION.
CLEAR <ls_dd03p>-masklen.
ENDIF.
IF <ls_dd03p>-comptype = 'E'.
* type specified via data element
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.
IF <ls_dd03p>-comptype = lc_comptype_dataelement.
clear_dd03p_fields_dataelement( CHANGING cs_dd03p = <ls_dd03p> ).
ENDIF.
IF <ls_dd03p>-shlporigin = 'D'.
* search help from domain
CLEAR: <ls_dd03p>-shlpfield,
<ls_dd03p>-shlpname.
<ls_dd03p>-shlpname.
ENDIF.
* XML output assumes correct field content
@ -87,6 +96,48 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL IMPLEMENTATION.
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.
@ -174,45 +225,49 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL IMPLEMENTATION.
lv_objname = ms_item-obj_name.
lv_no_ask = abap_true.
SELECT SINGLE tabclass FROM dd02l INTO lv_tabclass
WHERE tabname = ms_item-obj_name
AND as4local = 'A'
AND as4vers = '0000'.
IF sy-subrc = 0 AND lv_tabclass = 'TRANSP'.
IF delete_idoc_segment( ) = abap_false.
lv_no_ask = abap_true.
SELECT SINGLE tabclass FROM dd02l INTO lv_tabclass
WHERE tabname = ms_item-obj_name
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
CALL FUNCTION 'DB_EXISTS_TABLE'
EXPORTING
tabname = lv_objname
IMPORTING
subrc = lv_subrc.
IF lv_subrc = 0.
* it cannot delete table with table wihtout asking
CREATE DATA lr_data TYPE (lv_objname).
ASSIGN lr_data->* TO <lg_data>.
SELECT SINGLE * FROM (lv_objname) INTO <lg_data>.
IF sy-subrc = 0.
lv_no_ask = abap_false.
CALL FUNCTION 'DB_EXISTS_TABLE'
EXPORTING
tabname = lv_objname
IMPORTING
subrc = lv_subrc.
IF lv_subrc = 0.
* it cannot delete table with table without asking
CREATE DATA lr_data TYPE (lv_objname).
ASSIGN lr_data->* TO <lg_data>.
SELECT SINGLE * FROM (lv_objname) INTO <lg_data>.
IF sy-subrc = 0.
lv_no_ask = abap_false.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
CALL FUNCTION 'RS_DD_DELETE_OBJ'
EXPORTING
no_ask = lv_no_ask
objname = lv_objname
objtype = 'T'
EXCEPTIONS
not_executed = 1
object_not_found = 2
object_not_specified = 3
permission_failure = 4.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'error from RS_DD_DELETE_OBJ, TABL' ).
ENDIF.
CALL FUNCTION 'RS_DD_DELETE_OBJ'
EXPORTING
no_ask = lv_no_ask
objname = lv_objname
objtype = 'T'
EXCEPTIONS
not_executed = 1
object_not_found = 2
object_not_specified = 3
permission_failure = 4.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'error from RS_DD_DELETE_OBJ, TABL' ).
ENDIF.
delete_longtexts( c_longtext_id_tabl ).
delete_longtexts( c_longtext_id_tabl ).
ENDIF.
ENDMETHOD.
@ -234,97 +289,101 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL IMPLEMENTATION.
lt_dd36m TYPE dd36mttyp,
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'
CHANGING cg_data = ls_dd02v ).
io_xml->read( EXPORTING iv_name = 'DD09L'
CHANGING cg_data = ls_dd09l ).
io_xml->read( EXPORTING iv_name = 'DD03P_TABLE'
CHANGING cg_data = lt_dd03p ).
io_xml->read( EXPORTING iv_name = 'DD05M_TABLE'
CHANGING cg_data = lt_dd05m ).
io_xml->read( EXPORTING iv_name = 'DD08V_TABLE'
CHANGING cg_data = lt_dd08v ).
io_xml->read( EXPORTING iv_name = 'DD12V'
CHANGING cg_data = lt_dd12v ).
io_xml->read( EXPORTING iv_name = 'DD17V'
CHANGING cg_data = lt_dd17v ).
io_xml->read( EXPORTING iv_name = 'DD35V_TALE'
CHANGING cg_data = lt_dd35v ).
io_xml->read( EXPORTING iv_name = 'DD36M'
CHANGING cg_data = lt_dd36m ).
io_xml->read( EXPORTING iv_name = 'DD02V'
CHANGING cg_data = ls_dd02v ).
io_xml->read( EXPORTING iv_name = 'DD09L'
CHANGING cg_data = ls_dd09l ).
io_xml->read( EXPORTING iv_name = 'DD03P_TABLE'
CHANGING cg_data = lt_dd03p ).
io_xml->read( EXPORTING iv_name = 'DD05M_TABLE'
CHANGING cg_data = lt_dd05m ).
io_xml->read( EXPORTING iv_name = 'DD08V_TABLE'
CHANGING cg_data = lt_dd08v ).
io_xml->read( EXPORTING iv_name = 'DD12V'
CHANGING cg_data = lt_dd12v ).
io_xml->read( EXPORTING iv_name = 'DD17V'
CHANGING cg_data = lt_dd17v ).
io_xml->read( EXPORTING iv_name = 'DD35V_TALE'
CHANGING cg_data = lt_dd35v ).
io_xml->read( EXPORTING iv_name = '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'
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'
CALL FUNCTION 'DDIF_TABL_PUT'
EXPORTING
name = ls_dd12v-sqltab
id = ls_dd12v-indexname
dd12v_wa = ls_dd12v
name = lv_name
dd02v_wa = ls_dd02v
dd09l_wa = ls_dd09l
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
indx_not_found = 1
tabl_not_found = 1
name_inconsistent = 2
indx_inconsistent = 3
tabl_inconsistent = 3
put_failure = 4
put_refused = 5
OTHERS = 6.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'error from DDIF_INDX_PUT' ).
zcx_abapgit_exception=>raise( 'error from DDIF_TABL_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_item( ms_item ).
zcl_abapgit_objects_activation=>add( iv_type = 'INDX'
iv_name = lv_tname ).
* handle indexes
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.
@ -333,7 +392,6 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL IMPLEMENTATION.
DATA: lv_tabname TYPE dd02l-tabname.
SELECT SINGLE tabname FROM dd02l INTO lv_tabname
WHERE tabname = ms_item-obj_name
AND as4local = 'A'
@ -553,5 +611,209 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL IMPLEMENTATION.
serialize_longtexts( io_xml = io_xml
iv_longtext_id = c_longtext_id_tabl ).
serialize_idoc_segment( io_xml ).
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.