2023 Dec 04 2:12 PM
Hello,
For ABAP Unit, I need to update the fields SEGNUM, PSGNUM, HLEVEL of an internal table made of lines of type EDIDD, equivalent to the table EDID4 of IDocs, the same way it's done by the standard program when the IDoc is created (more or less the subroutine FA5_DOCUMENT_SYNTAX_CHECK in the function group EDI1).
Does anyone have the code ready-to-use?
DATA(table_edidd) = initialize_table_edidd( ... ).
update_segnum_psgnum_hlevel( EXPORTING idoc_type = '...'
CHANGING table_edidd = table_edidd ).
Except reading the tables containing the hierarchy of segment types corresponding to the IDoc type ("syntax"), I don't want the code to access anything else external (as per ABAP Unit principle / well, okay, I accept that the syntax tables of the IDoc type may vary).
EDIT: I'm starting writing the code, quick and dirty, I'll post it as an answer. Any clean code still appreciated.
Thank you.
Sandra
2023 Dec 04 5:42 PM
Solution quick and dirty, by reusing standard ABAP in SAP BASIS 7.40 SP 23.
Example calling:
lcl_idoc=>update_segnum_psgnum_hlevel(
EXPORTING
is_edidc = VALUE #( idoctp = 'ZCUSTOM_IDOC_TYPE' )
iv_ignore_errors = abap_true
CHANGING
ct_edidd = segments ).
Class:CLASS lcl_idoc DEFINITION.
PUBLIC SECTION.
TYPES tt_edidd TYPE STANDARD TABLE OF edidd WITH DEFAULT KEY.
CLASS-METHODS update_segnum_psgnum_hlevel
IMPORTING
is_edidc TYPE edidc
iv_ignore_errors TYPE edi_iapi00-flag
CHANGING
ct_edidd TYPE tt_edidd.
ENDCLASS.
CLASS lcl_idoc IMPLEMENTATION.
METHOD update_segnum_psgnum_hlevel.
FIELD-SYMBOLS <list_control_create_itab> TYPE ANY TABLE.
FIELD-SYMBOLS <list_container_create_itab> TYPE ANY TABLE.
PERFORM dummy_dummy IN PROGRAM sapledi1 IF FOUND.
ASSIGN ('(SAPLEDI1)LIST_CONTROL_CREATE') TO FIELD-SYMBOL(<list_control_create>).
ASSIGN ('(SAPLEDI1)LIST_CONTROL_CREATE[]') TO <list_control_create_itab>.
ASSIGN ('(SAPLEDI1)LIST_CONTAINER_CREATE[]') TO <list_container_create_itab>.
DATA(ls_edidc) = is_edidc.
ls_edidc-mandt = sy-mandt.
MOVE-CORRESPONDING is_edidc TO <list_control_create>.
CLEAR <list_control_create_itab>.
INSERT <list_control_create> INTO TABLE <list_control_create_itab>.
LOOP AT ct_edidd REFERENCE INTO DATA(segment).
segment->mandt = sy-mandt.
segment->segnum = sy-tabix.
ENDLOOP.
MOVE-CORRESPONDING ct_edidd TO <list_container_create_itab>.
PERFORM fa5_document_syntax_check
IN PROGRAM sapledi1
USING is_edidc-docnum
is_edidc
iv_ignore_errors.
MOVE-CORRESPONDING <list_container_create_itab> TO ct_edidd.
ENDMETHOD.
ENDCLASS.
2023 Dec 04 2:21 PM
"my last knowledge update in January 2022" -> hello ChatGPT...
2023 Dec 04 2:22 PM
2023 Dec 04 5:42 PM
Solution quick and dirty, by reusing standard ABAP in SAP BASIS 7.40 SP 23.
Example calling:
lcl_idoc=>update_segnum_psgnum_hlevel(
EXPORTING
is_edidc = VALUE #( idoctp = 'ZCUSTOM_IDOC_TYPE' )
iv_ignore_errors = abap_true
CHANGING
ct_edidd = segments ).
Class:CLASS lcl_idoc DEFINITION.
PUBLIC SECTION.
TYPES tt_edidd TYPE STANDARD TABLE OF edidd WITH DEFAULT KEY.
CLASS-METHODS update_segnum_psgnum_hlevel
IMPORTING
is_edidc TYPE edidc
iv_ignore_errors TYPE edi_iapi00-flag
CHANGING
ct_edidd TYPE tt_edidd.
ENDCLASS.
CLASS lcl_idoc IMPLEMENTATION.
METHOD update_segnum_psgnum_hlevel.
FIELD-SYMBOLS <list_control_create_itab> TYPE ANY TABLE.
FIELD-SYMBOLS <list_container_create_itab> TYPE ANY TABLE.
PERFORM dummy_dummy IN PROGRAM sapledi1 IF FOUND.
ASSIGN ('(SAPLEDI1)LIST_CONTROL_CREATE') TO FIELD-SYMBOL(<list_control_create>).
ASSIGN ('(SAPLEDI1)LIST_CONTROL_CREATE[]') TO <list_control_create_itab>.
ASSIGN ('(SAPLEDI1)LIST_CONTAINER_CREATE[]') TO <list_container_create_itab>.
DATA(ls_edidc) = is_edidc.
ls_edidc-mandt = sy-mandt.
MOVE-CORRESPONDING is_edidc TO <list_control_create>.
CLEAR <list_control_create_itab>.
INSERT <list_control_create> INTO TABLE <list_control_create_itab>.
LOOP AT ct_edidd REFERENCE INTO DATA(segment).
segment->mandt = sy-mandt.
segment->segnum = sy-tabix.
ENDLOOP.
MOVE-CORRESPONDING ct_edidd TO <list_container_create_itab>.
PERFORM fa5_document_syntax_check
IN PROGRAM sapledi1
USING is_edidc-docnum
is_edidc
iv_ignore_errors.
MOVE-CORRESPONDING <list_container_create_itab> TO ct_edidd.
ENDMETHOD.
ENDCLASS.