[ABAP] Vertriebsbelege – Belegfluss lesen

* Vorgängervertriebsbeleg
PARAMETERS: p_vbeln TYPE vbfa-vbelv DEFAULT '12345678'.

* Übergabestruktur
DATA(lv_vbco6) = VALUE vbco6( vbeln = p_vbeln
*                              posnr = '000010'
                            ).

* Rückgabetabelle
DATA: it_vbfa TYPE STANDARD TABLE OF vbfa WITH DEFAULT KEY.

* Liest Verkaufsbelegfluß von Verkaufsbeleg nach Lieferung und Faktura
* Tabellen: VBFA, VBUK
CALL FUNCTION 'RV_ORDER_FLOW_INFORMATION'
  EXPORTING
    comwa         = lv_vbco6
  TABLES
    vbfa_tab      = it_vbfa
  EXCEPTIONS
    no_vbfa       = 1
    no_vbuk_found = 2
    OTHERS        = 3.

* Datenausgabe
IF sy-subrc = 0.
* Tabelle mit Belegfluss anzeigen
*  cl_demo_output=>display( it_vbfa ).

* Dialogbaustein zur Anzeige des Belegflusses anzeigen
  CALL DIALOG 'RV_DOCUMENT_FLOW'
    EXPORTING
      vbco6 FROM lv_vbco6.
ENDIF.

[ABAP] IDoc: Strukturen der IDoc-Segmente in eine interne Tabelle lesen

* http://thinkdoforward.com/sap-idoc-tabellen-erfahrene-berater-kennen-diese-tabellen/

* Tabellen: EDIDC   – Kontrollsatz (IDoc)
*           EDIDS   – Statussatz (IDoc)
*           EDID4   – IDoc-Datensätze ab 4.0
*           EDISDEF - IDoc Entwicklung : IDoc Segmentdefinitionen
*           EDSAPPL - EDI: IDoc-Segment Anwendungsstruktur
*           EDIMSGT - Kurzbeschreibung der SAP Nachrichtentypen

TYPES: BEGIN OF ty_idoc_seg_entry,
         seg_name  TYPE string,
         comp_name TYPE string,
         value     TYPE string,
       END OF ty_idoc_seg_entry.

* IDoc-Nummer
PARAMETERS: p_idoc TYPE edidc-docnum DEFAULT '12345'.

START-OF-SELECTION.

* Lesen Segmentdaten des IDocs
  SELECT *
    INTO TABLE @DATA(it_int_edid)
    FROM edid4
    WHERE docnum EQ @p_idoc.

  IF sy-subrc = 0.
* Tabelle für aufbereitete Segmentdaten
    DATA: it_segment_data TYPE STANDARD TABLE OF ty_idoc_seg_entry WITH DEFAULT KEY.

* all. Feldsymbol für Umwandlung der Daten
    FIELD-SYMBOLS: <seg_data> TYPE any.

* Segmentdaten auslesen
    LOOP AT it_int_edid ASSIGNING FIELD-SYMBOL(<s>).
* Typecast für Umwandlung LCHR -> Type
      ASSIGN <s>-sdata TO <seg_data> CASTING TYPE (<s>-segnam).

* Typedescriptor zum Auslesen der einzelnen Datenfelder
      DATA(o_type) = cl_abap_typedescr=>describe_by_data( <seg_data> ).

      CASE o_type->kind.
* wenn Strukturtyp
        WHEN cl_abap_typedescr=>kind_struct.
          DATA(o_desc) = CAST cl_abap_structdescr( o_type ).

* Datenfelder der Struktur durchloopen
          LOOP AT o_desc->get_components( ) ASSIGNING FIELD-SYMBOL(<c>).
* Wert des Feldes auslesen
            ASSIGN COMPONENT <c>-name OF STRUCTURE <seg_data> TO FIELD-SYMBOL(<val>).
            IF <val> IS ASSIGNED.
* Zeile für Segment erstellen mit Segmentname, Komponenten-(Feld-)name, Wert
              APPEND VALUE #( seg_name  = <s>-segnam
                              comp_name = <c>-name
                              value     = <val>
                            ) TO it_segment_data.
            ENDIF.
          ENDLOOP.

        WHEN OTHERS.

      ENDCASE.
    ENDLOOP.

* Datenausgabe
    cl_demo_output=>display( it_segment_data ).
  ENDIF.

[ABAP] IDoc: Segmente und Statusinfos lesen

* http://thinkdoforward.com/sap-idoc-tabellen-erfahrene-berater-kennen-diese-tabellen/

* Tabellen: EDIDC   – Kontrollsatz (IDoc)
*           EDIDS   – Statussatz (IDoc)
*           EDID4   – IDoc-Datensätze ab 4.0
*           EDISDEF - IDoc Entwicklung : IDoc Segmentdefinitionen
*           EDSAPPL - EDI: IDoc-Segment Anwendungsstruktur
*           EDIMSGT - Kurzbeschreibung der SAP Nachrichtentypen

* IDoc-Nummer
PARAMETERS: p_idoc TYPE edidc-docnum DEFAULT '12345'.

START-OF-SELECTION.

  DATA: lv_idoc_control TYPE edidc.
  DATA: lv_number_of_data_records TYPE sy-dbcnt.
  DATA: lv_number_of_status_records TYPE sy-dbcnt.
  DATA: it_int_edids TYPE STANDARD TABLE OF edids WITH DEFAULT KEY.
  DATA: it_int_edidd TYPE STANDARD TABLE OF edidd WITH DEFAULT KEY.

* Lesen aller Informationen eines IDocs
  CALL FUNCTION 'IDOC_READ_COMPLETELY'
    EXPORTING
      document_number          = p_idoc
    IMPORTING
      idoc_control             = lv_idoc_control
      number_of_data_records   = lv_number_of_data_records
      number_of_status_records = lv_number_of_status_records
    TABLES
      int_edids                = it_int_edids
      int_edidd                = it_int_edidd
    EXCEPTIONS
      document_not_exist       = 1
      document_number_invalid  = 2
      OTHERS                   = 3.

  IF sy-subrc = 0.
    cl_demo_output=>write_data( lv_idoc_control ).
    cl_demo_output=>write_data( lv_number_of_data_records ).
    cl_demo_output=>write_data( lv_number_of_status_records ).
    cl_demo_output=>write_data( it_int_edids ).
    cl_demo_output=>write_data( it_int_edidd ).
    cl_demo_output=>display( ).
  ENDIF.

[ABAP] IDoc: Infos zu IDoc-Typ lesen (Segmente, Felder)

* Tabelle EDBAS
PARAMETERS: p_btype TYPE edbas-idoctyp DEFAULT 'ORDERS05'.

START-OF-SELECTION.

  DATA: lv_pe_header TYPE edi_iapi10.

  DATA: it_pt_segments TYPE STANDARD TABLE OF edi_iapi11 WITH DEFAULT KEY.
  DATA: it_pt_fields TYPE STANDARD TABLE OF edi_iapi12 WITH DEFAULT KEY.
  DATA: it_pt_fvalues TYPE STANDARD TABLE OF edi_iapi14 WITH DEFAULT KEY.
  DATA: it_pt_messages TYPE STANDARD TABLE OF edi_iapi17 WITH DEFAULT KEY.

* IDoctyp mit Segmenten lesen (RFC-fähig)
  CALL FUNCTION 'IDOCTYPE_READ_COMPLETE'
    EXPORTING
      pi_idoctyp         = p_btype
    IMPORTING
      pe_header          = lv_pe_header
    TABLES
      pt_segments        = it_pt_segments
      pt_fields          = it_pt_fields
      pt_fvalues         = it_pt_fvalues
      pt_messages        = it_pt_messages
    EXCEPTIONS
      object_unknown     = 1
      segment_unknown    = 2
      relation_not_found = 3.

  IF sy-subrc = 0.
    cl_demo_output=>write_data( lv_pe_header ).
    cl_demo_output=>write_data( it_pt_segments ).
    cl_demo_output=>write_data( it_pt_fields ).
    cl_demo_output=>write_data( it_pt_fvalues ).
    cl_demo_output=>write_data( it_pt_messages ).
    cl_demo_output=>display( ).
  ENDIF.

[ABAP] BAPI: Bestellung anzeigen

* Bestellung
PARAMETERS: p_po TYPE bapimepoheader-po_number DEFAULT '0001234567'.

* Bestellung Kopfdaten
DATA: lv_bapimepoheader TYPE bapimepoheader.
* Returnparameter
DATA: it_return TYPE STANDARD TABLE OF bapiret2 WITH DEFAULT KEY.
* Bestellposition
DATA: it_poitem TYPE STANDARD TABLE OF bapimepoitem WITH DEFAULT KEY.
* Felder für Einteilungen der Bestellung
DATA: it_poschedule TYPE STANDARD TABLE OF bapimeposchedule WITH DEFAULT KEY.
* Kontierungsfelder der Bestellung
DATA: it_poaccount TYPE STANDARD TABLE OF bapimepoaccount WITH DEFAULT KEY.
* Kommunikationsstruktur Anlegen Leistungszeile
DATA: it_poservices TYPE STANDARD TABLE OF bapiesllc WITH DEFAULT KEY.
* Komm.struktur Anlege Kontierungsverteilung Leistungszeile
DATA: it_posrvaccessvalues TYPE STANDARD TABLE OF bapiesklc WITH DEFAULT KEY.

* Detailinformationen für eine Bestellung
CALL FUNCTION 'BAPI_PO_GETDETAIL1'
  EXPORTING
    purchaseorder      = p_po
    account_assignment = abap_true
    item_text          = abap_true
    header_text        = abap_true
    services           = abap_true
  IMPORTING
    poheader           = lv_bapimepoheader
*   POEXPIMPHEADER     =
  TABLES
    return             = it_return
    poitem             = it_poitem
    poschedule         = it_poschedule
    poaccount          = it_poaccount
    poservices         = it_poservices
    posrvaccessvalues  = it_posrvaccessvalues.

cl_demo_output=>write_data( it_return ).
cl_demo_output=>write_data( lv_bapimepoheader ).
cl_demo_output=>write_data( it_poitem ).
cl_demo_output=>write_data( it_poschedule ).
cl_demo_output=>write_data( it_poaccount ).
cl_demo_output=>write_data( it_poservices ).
cl_demo_output=>write_data( it_posrvaccessvalues ).

* HTML-Code holen
DATA(lv_html) = cl_demo_output=>get( ).
* Daten im Inline-Browser im SAP-Fenster anzeigen
cl_abap_browser=>show_html( EXPORTING
                              title        = 'Daten zur Bestellung'
                              html_string  = lv_html
                              container    = cl_gui_container=>default_screen ).
* cl_gui_container=>default_screen erzwingen
WRITE: space.

[ABAP] BAPI: Bestellung ändern

* Bestellung
PARAMETERS: p_po TYPE bapimepoheader-po_number DEFAULT '0001234567'.
* Testmodus
PARAMETERS: p_test TYPE bapiflag-bapiflag DEFAULT abap_true.
* Authority-Check
PARAMETERS: p_noauth TYPE bapiflag-bapiflag DEFAULT abap_true.

* Returnparameter
DATA: it_return TYPE STANDARD TABLE OF bapiret2 WITH DEFAULT KEY.
* Bestellung Kopfdaten
DATA: lv_bapimepoheader TYPE bapimepoheader.
* Bestellung Kopfdaten (Änderungsleiste)
DATA: lv_bapimepoheaderx TYPE bapimepoheaderx.
* Bestellposition
DATA: it_bapimepoitem TYPE STANDARD TABLE OF bapimepoitem WITH DEFAULT KEY.
* Bestellung Positionsdaten (Änderungsleiste)
DATA: it_bapimepoitemx TYPE STANDARD TABLE OF bapimepoitemx WITH DEFAULT KEY.

* Headerdaten
lv_bapimepoheader = VALUE #( po_number = p_po
                             pmnttrms = 'ZB03'
                           ).

* Flags zum Ändern der Headerdaten
lv_bapimepoheaderx = VALUE #( po_number = abap_true
                              pmnttrms = abap_true
                            ).

* Positionsdaten
it_bapimepoitem = VALUE #( ( po_item = '00001'
                             quantity = '1.0'
                           )
                         ).

* Flags zum Ändern der Positionsdaten
it_bapimepoitemx = VALUE #( ( po_item = '00001'
                              po_itemx = abap_true
                              quantity = abap_true
                            )
                          ).

* Bestellung ändern
CALL FUNCTION 'BAPI_PO_CHANGE'
  EXPORTING
    purchaseorder = p_po
    no_authority  = p_noauth
    testrun       = p_test
    poheader      = lv_bapimepoheader
    poheaderx     = lv_bapimepoheaderx
  TABLES
    return        = it_return
    poitem        = it_bapimepoitem
    poitemx       = it_bapimepoitemx.

* Wenn keine Fehler, dann COMMIT
IF NOT line_exists( it_return[ type = 'E' ] ).
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    EXPORTING
      wait = abap_true.
ENDIF.

* Ausgabe der Meldungen
cl_demo_output=>write_data( it_return ).

* HTML-Code holen
DATA(lv_html) = cl_demo_output=>get( ).
* Daten im Inline-Browser im SAP-Fenster anzeigen
cl_abap_browser=>show_html( EXPORTING
                              title        = 'Daten zur Bestellung'
                              html_string  = lv_html
                              container    = cl_gui_container=>default_screen ).
* cl_gui_container=>default_screen erzwingen
WRITE: space.

[ABAP] BAPI: Bestellung anlegen

PARAMETERS: p_bukrs TYPE bukrs DEFAULT '0001'.
PARAMETERS: p_bsart TYPE bsart DEFAULT 'NB'.
PARAMETERS: p_ekorg TYPE ekorg DEFAULT '0001'.
PARAMETERS: p_ekgrp TYPE ekgrp DEFAULT '123'.
PARAMETERS: p_werks TYPE werks DEFAULT '01'.
PARAMETERS: p_lgort TYPE lgort_d DEFAULT '10'.
PARAMETERS: p_matnr TYPE matnr DEFAULT '1234567890'.
PARAMETERS: p_vendor TYPE lifnr DEFAULT '0000012345'.

* Testmodus
PARAMETERS: p_test TYPE bapiflag-bapiflag DEFAULT abap_true.
* Authority-Check
PARAMETERS: p_noauth TYPE bapiflag-bapiflag DEFAULT abap_true.

* Returnparameter
DATA: it_return TYPE STANDARD TABLE OF bapiret2 WITH DEFAULT KEY.
DATA: it_poitem TYPE STANDARD TABLE OF bapimepoitem WITH DEFAULT KEY.
DATA: it_poitemx TYPE STANDARD TABLE OF bapimepoitemx WITH DEFAULT KEY.

DATA(ls_poheader) = VALUE bapimepoheader( comp_code  = p_bukrs
                                          doc_type   = p_bsart
                                          purch_org  = p_ekorg
                                          pur_group  = p_ekgrp
                                          doc_date   = sy-datum
                                          suppl_plnt = p_werks
                                          vendor     = p_vendor
                                        ).

DATA(ls_poheaderx) = VALUE bapimepoheaderx( comp_code  = abap_true
                                            doc_type   = abap_true
                                            purch_org  = abap_true
                                            pur_group  = abap_true
                                            doc_date   = abap_true
                                            suppl_plnt = abap_true
                                            vendor     = abap_true
                                          ).


it_poitem = VALUE #( ( po_item  = '00001'
                       material = p_matnr
                       plant    = p_werks
                       stge_loc = p_lgort
                       quantity = '1.0'
                     )
                   ).

it_poitemx = VALUE #( ( po_item  = '00001'
                        material = abap_true
                        plant    = abap_true
                        stge_loc = abap_true
                        quantity = abap_true
                      )
                    ).

DATA: lv_new_po TYPE bapimepoheader-po_number.
DATA: lv_expheader TYPE bapimepoheader.
DATA: lv_exppoexpimpheader TYPE bapieikp.

* Bestellung anlegen
CALL FUNCTION 'BAPI_PO_CREATE1'
  EXPORTING
    no_authority      = p_noauth
    testrun           = p_test
    poheader          = ls_poheader
    poheaderx         = ls_poheaderx
  IMPORTING
    exppurchaseorder  = lv_new_po
    expheader         = lv_expheader
    exppoexpimpheader = lv_exppoexpimpheader
  TABLES
    return            = it_return
    poitem            = it_poitem
    poitemx           = it_poitemx.

IF NOT lv_new_po IS INITIAL.
* Wenn Bestellung angelegt wurde, COMMIT durchführen
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    EXPORTING
      wait = abap_true.
ELSE.
  CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.

* Ausgabe der Meldungen
cl_demo_output=>write_data( it_return ).
cl_demo_output=>write_data( it_poitem ).
cl_demo_output=>write_data( it_poitemx ).
cl_demo_output=>write_data( lv_new_po ).
cl_demo_output=>write_data( lv_expheader ).
cl_demo_output=>write_data( lv_exppoexpimpheader ).

* HTML-Code holen
DATA(lv_html) = cl_demo_output=>get( ).
* Daten im Inline-Browser im SAP-Fenster anzeigen
cl_abap_browser=>show_html( EXPORTING
                              title        = 'Daten zur Bestellung'
                              html_string  = lv_html
                              container    = cl_gui_container=>default_screen ).
* cl_gui_container=>default_screen erzwingen
WRITE: space.