Application Development Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

Anyone has the code to determine EDID4 fields SEGNUM, PSGNUM, HLEVEL?

Sandra_Rossi
Active Contributor
0 Kudos

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

1 ACCEPTED SOLUTION

Sandra_Rossi
Active Contributor

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.
3 REPLIES 3

abo
Active Contributor

"my last knowledge update in January 2022" -> hello ChatGPT...

Sandra_Rossi
Active Contributor

"user" reported to the moderator

Sandra_Rossi
Active Contributor

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.