[ABAP] Leistungsverzeichnis mit Gliederung zu einem Einkaufsbeleg lesen

PARAMETERS: p_ebeln TYPE ekpo-ebeln.

START-OF-SELECTION.

  SELECT SINGLE FROM ekpo
    FIELDS
      menge,
      meins,
      bprme,
      netpr,
      peinh,
      txz01,
      packno
    WHERE ebeln EQ @p_ebeln
      AND ebelp EQ '00001'
    INTO @DATA(lv_ekpo).

  IF sy-subrc EQ 0.
    DATA: it_gliederung TYPE STANDARD TABLE OF ml_esll WITH DEFAULT KEY.

* Holen Gliederungsdaten für Listausgabe
    CALL FUNCTION 'MS_SUBDIVISION_FOR_PRINT'
      EXPORTING
        packno           = lv_ekpo-packno
      TABLES
        gliederung       = it_gliederung
      EXCEPTIONS
        packno_not_exist = 1
        OTHERS           = 2.

    IF sy-subrc = 0.

      DATA: it_leistung TYPE STANDARD TABLE OF ml_esll WITH DEFAULT KEY.

      LOOP AT it_gliederung ASSIGNING FIELD-SYMBOL(<g>).

        DATA(pos) = ( <g>-rang * 2 ).

        IF <g>-rang = 0.
          WRITE: AT /pos '#', lv_ekpo-txz01, lv_ekpo-menge, lv_ekpo-meins, lv_ekpo-netpr.
        ELSE.
          WRITE: AT /pos '#', <g>-ktext1.
        ENDIF.

        CLEAR: it_leistung.

* Holen Leistungen für Listanzeige
        CALL FUNCTION 'MS_SERVICES_FOR_PRINT'
          EXPORTING
            packno            = <g>-sub_packno
          TABLES
            leistung          = it_leistung
          EXCEPTIONS
            no_services_found = 1
            OTHERS            = 2.

        IF sy-subrc = 0.
          LOOP AT it_leistung ASSIGNING FIELD-SYMBOL(<l>).
            WRITE: AT /10 <l>-extrow, '|', <l>-srvpos, '|', <l>-menge, <l>-meins, <l>-brtwr, <l>-waers, <l>-ktext1, '|', <l>-ebeln, <l>-ebelp.
          ENDLOOP.
        ENDIF.

        WRITE: /.

      ENDLOOP.

    ENDIF.
  ENDIF.