TABL: Simplify control flow (#2552)

* TABL: Simplify control flow

When this commit is applied the control flow in object serializer TABL
is eased. The idoc check returns now a boolean instead of raising an exception. Main purpose is to ease debugging due to reducing the use of 
zcx_abapgit_exception%3D>raise.

* TABL: fill rv_deleted on early exit
This commit is contained in:
Christian Günter 2019-03-19 18:05:15 +01:00 committed by Lars Hvam
parent a3c69433fb
commit 9e2f7e7caf

View File

@ -46,10 +46,10 @@ CLASS zcl_abapgit_object_tabl DEFINITION PUBLIC INHERITING FROM zcl_abapgit_obje
CHANGING CHANGING
!ct_dd03p TYPE ty_dd03p_tt . !ct_dd03p TYPE ty_dd03p_tt .
"! Check if structure is an IDoc segment "! Check if structure is an IDoc segment
"! @raising zcx_abapgit_exception | It's not an IDoc segment "! @parameter rv_is_idoc_segment | It's an IDoc segment or not
METHODS check_is_idoc_segment METHODS is_idoc_segment
RAISING RETURNING
zcx_abapgit_exception . VALUE(rv_is_idoc_segment) TYPE abap_bool.
METHODS clear_dd03p_fields_common METHODS clear_dd03p_fields_common
CHANGING CHANGING
!cs_dd03p TYPE dd03p . !cs_dd03p TYPE dd03p .
@ -60,10 +60,10 @@ ENDCLASS.
CLASS ZCL_ABAPGIT_OBJECT_TABL IMPLEMENTATION. CLASS zcl_abapgit_object_tabl IMPLEMENTATION.
METHOD check_is_idoc_segment. METHOD is_idoc_segment.
DATA lv_segment_type TYPE edilsegtyp. DATA lv_segment_type TYPE edilsegtyp.
@ -73,9 +73,7 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL IMPLEMENTATION.
FROM edisegment FROM edisegment
INTO lv_segment_type INTO lv_segment_type
WHERE segtyp = lv_segment_type. WHERE segtyp = lv_segment_type.
IF sy-subrc <> 0. rv_is_idoc_segment = boolc( sy-subrc = 0 ).
zcx_abapgit_exception=>raise( 'No IDoc segment' ).
ENDIF.
ENDMETHOD. ENDMETHOD.
@ -170,13 +168,10 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL IMPLEMENTATION.
DATA lv_segment_type TYPE edilsegtyp. DATA lv_segment_type TYPE edilsegtyp.
DATA lv_result LIKE sy-subrc. DATA lv_result LIKE sy-subrc.
TRY. IF is_idoc_segment( ) = abap_false.
check_is_idoc_segment( ). rv_deleted = abap_false.
RETURN. "previous XML version or no IDoc segment
CATCH zcx_abapgit_exception ##no_handler. ENDIF.
rv_deleted = abap_false.
RETURN. "previous XML version or no IDoc segment
ENDTRY.
rv_deleted = abap_true. rv_deleted = abap_true.
lv_segment_type = ms_item-obj_name. lv_segment_type = ms_item-obj_name.
@ -300,59 +295,56 @@ CLASS ZCL_ABAPGIT_OBJECT_TABL IMPLEMENTATION.
DATA lt_segment_definitions TYPE ty_segment_definitions. DATA lt_segment_definitions TYPE ty_segment_definitions.
FIELD-SYMBOLS: <ls_segemtndefinition> TYPE edisegmdef. FIELD-SYMBOLS: <ls_segemtndefinition> TYPE edisegmdef.
TRY. IF is_idoc_segment( ) = abap_false.
check_is_idoc_segment( ). RETURN.
ENDIF.
lv_segment_type = ms_item-obj_name. lv_segment_type = ms_item-obj_name.
CALL FUNCTION 'SEGMENT_READ' CALL FUNCTION 'SEGMENT_READ'
EXPORTING EXPORTING
segmenttyp = lv_segment_type segmenttyp = lv_segment_type
IMPORTING IMPORTING
result = lv_result result = lv_result
TABLES TABLES
segmentdefinition = lt_segmentdefinitions segmentdefinition = lt_segmentdefinitions
EXCEPTIONS EXCEPTIONS
OTHERS = 1. OTHERS = 1.
IF sy-subrc <> 0 OR lv_result <> 0. IF sy-subrc <> 0 OR lv_result <> 0.
zcx_abapgit_exception=>raise_t100( ). zcx_abapgit_exception=>raise_t100( ).
ENDIF. ENDIF.
LOOP AT lt_segmentdefinitions ASSIGNING <ls_segemtndefinition>. LOOP AT lt_segmentdefinitions ASSIGNING <ls_segemtndefinition>.
CLEAR ls_segment_definition. CLEAR ls_segment_definition.
CALL FUNCTION 'SEGMENTDEFINITION_READ' CALL FUNCTION 'SEGMENTDEFINITION_READ'
EXPORTING EXPORTING
segmenttyp = <ls_segemtndefinition>-segtyp segmenttyp = <ls_segemtndefinition>-segtyp
IMPORTING IMPORTING
result = lv_result result = lv_result
devclass = lv_devclass devclass = lv_devclass
segmentheader = ls_segment_definition-segmentheader segmentheader = ls_segment_definition-segmentheader
segmentdefinition = ls_segment_definition-segmentdefinition segmentdefinition = ls_segment_definition-segmentdefinition
TABLES TABLES
segmentstructure = ls_segment_definition-segmentstructures segmentstructure = ls_segment_definition-segmentstructures
CHANGING CHANGING
version = <ls_segemtndefinition>-version version = <ls_segemtndefinition>-version
EXCEPTIONS EXCEPTIONS
no_authority = 1 no_authority = 1
segment_not_existing = 2 segment_not_existing = 2
OTHERS = 3. OTHERS = 3.
IF sy-subrc <> 0 OR lv_result <> 0. IF sy-subrc <> 0 OR lv_result <> 0.
zcx_abapgit_exception=>raise_t100( ). zcx_abapgit_exception=>raise_t100( ).
ENDIF. ENDIF.
zcl_abapgit_object_idoc=>clear_idoc_segement_fields( zcl_abapgit_object_idoc=>clear_idoc_segement_fields(
CHANGING cs_structure = ls_segment_definition-segmentdefinition ). CHANGING cs_structure = ls_segment_definition-segmentdefinition ).
zcl_abapgit_object_idoc=>clear_idoc_segement_fields( zcl_abapgit_object_idoc=>clear_idoc_segement_fields(
CHANGING cs_structure = ls_segment_definition-segmentheader ). CHANGING cs_structure = ls_segment_definition-segmentheader ).
APPEND ls_segment_definition TO lt_segment_definitions. APPEND ls_segment_definition TO lt_segment_definitions.
ENDLOOP. ENDLOOP.
io_xml->add( iv_name = c_s_dataname-segment_definition io_xml->add( iv_name = c_s_dataname-segment_definition
ig_data = lt_segment_definitions ). ig_data = lt_segment_definitions ).
CATCH zcx_abapgit_exception ##no_handler.
"ok, no Idoc segment
ENDTRY.
ENDMETHOD. ENDMETHOD.