Funktionsbaustein BAPI PO CREATE1

Aus SAP-Wiki
Zur Navigation springenZur Suche springen

Siehe Kategorie: BAPI.

Siehe Sammlung Funktionsbausteine.

Mit dem Funktionsbaustein 'BAPI_PO_CREATE1' wird eine Bestellung, bzw. Umlagerbestellung im SAP-System angelegt und wird daher recht oft benötigt.

Hier ein Beispiel aus dem Projektalltag.

* Erstellung Umlagerbestellung
 METHOD create_bapi_po_create1.
   DATA: ls_poheader          TYPE bapimepoheader,
         ls_poheaderx         TYPE bapimepoheaderx,
         lt_poitem	           TYPE STANDARD TABLE OF bapimepoitem,
         ls_poitem	           TYPE bapimepoitem ##NEEDED,
         lv_po_item           TYPE ebelp,
         lt_poitemx           TYPE STANDARD TABLE OF bapimepoitemx,
         ls_poitemx           TYPE bapimepoitemx,
*         lt_popartner            TYPE STANDARD TABLE OF bapiekkop,
*         lt_poshipping           TYPE STANDARD TABLE OF bapiitemship,
*         lt_poshippingx          TYPE STANDARD TABLE OF bapiitemshipx,
         lt_return_ub         TYPE STANDARD TABLE OF bapiret2,
         lv_po_number         TYPE bapimepoheader-po_number ##NEEDED,
         ls_expheader         TYPE bapimepoheader ##NEEDED,
         ls_exppoexpimpheader TYPE bapieikp        ##NEEDED,
         lv_our_ref           TYPE unsez,
         lv_material          type mara-matnr.

   CONSTANTS:
     lc_doc_type_ub    TYPE bapimepoheader-doc_type   VALUE 'UB',
     lc_vendor_1010    TYPE bapimepoheader-vendor     VALUE '1010',
     lc_purch_org_1010 TYPE bapimepoheader-purch_org  VALUE '1010',
     lc_pur_group_007  TYPE bapimepoheader-pur_group  VALUE '007',
     lc_curr_eur       TYPE bapimepoheader-currency   VALUE 'EUR',
     lc_werk_1010      TYPE bapimepoheader-suppl_plnt VALUE '1010',
     lc_plant_1044     TYPE bapimepoitem-plant        VALUE '1044',
     lc_stge_loc_144a  TYPE bapimepoitem-stge_loc     VALUE '144A',
     lc_shiptype_ds    TYPE bapimepoitem-shiptype     VALUE 'DS'.

*   Die Fortlaufende Nummer in das Feld "Unser Zeichen" der Umlagerbestellung schreiben,
*   damit man eine Referenz auf den Prozeß der Umlagerbestellung UK hat
*   z. B. "UML: 16"
   lv_our_ref = |UML: { mv_nummer ALPHA = OUT }|.            "aus dem Feld MV_NUMMER führende Nullen entfernen

*   Kopffelder Umlagerbestellung füllen
   ls_poheader = VALUE #(   our_ref     = lv_our_ref         "Unser Zeichen
                            comp_code   = mp_bukrs           "Buchungskreis
                            doc_type    = lc_doc_type_ub     "Einkaufsbelegart
                            creat_date  = sy-datum           "Erstellungsdatum
                            created_by  = sy-uname           "Ersteller
                           "ITEM_INTVL  =                    "Positionsnummer-Intervall
                            vendor      = lc_vendor_1010     "Lieferant
                            purch_org   = lc_purch_org_1010  "Einkaufsorganisation
                            pur_group   = lc_pur_group_007   "Einkäufergruppe
                            currency    = lc_curr_eur        "Währung
                            suppl_plnt  = lc_werk_1010 ).    "Werk

   ls_poheaderx = VALUE #(  our_ref     = abap_true
                            comp_code   = abap_true          "X-Buchungskreis
                            doc_type    = abap_true          "X-Einkaufsbelegart
                            creat_date  = abap_true          "X-Erstellungsdatum
                            created_by  = abap_true          "X-Ersteller
                            vendor      = abap_true          "X-Lieferant
                            purch_org   = abap_true          "X-Einkaufsorganisation
                            pur_group   = abap_true          "X-Einkäufergruppe
                            currency    = abap_true          "X-Währung
                            suppl_plnt  = abap_true ).       "X-Werk

*   Positionsfelder Umlagerbestellung füllen: Komponenten Zelt oder Ersatzteile
   LOOP AT ct_itab ASSIGNING FIELD-SYMBOL(<fs_itab>).
 
*     Position füllen
     ADD 10 TO lv_po_item.

*     Positionsdaten füllen
     ls_poitem = VALUE #( po_item     = lv_po_item           "Positionsnummer
                          material    = <fs_itab>-matnr      "Material
                          plant       = lc_plant_1044        "Ziel-Werk
                          stge_loc    = lc_stge_loc_144a     "Ziel-Lagerort
                          quantity    = <fs_itab>-menge_del  "Liefermenge
                          suppl_stloc = <fs_itab>-lgort      "Quell-Lagerort
                          shiptype    = lc_shiptype_ds       "Direct Shipping
                           ).
     APPEND ls_poitem TO lt_poitem.

*     Änderungsstruktur zur Position füllen
     ls_poitemx = VALUE #( po_item     = lv_po_item          "Positionsnummer
                           material    = abap_true           "X-Material
                           plant       = abap_true           "X-Ziel-Werk
                           stge_loc    = abap_true           "X-Ziel-Lagerort
                           quantity    = abap_true           "X-Liefermenge
                           suppl_stloc = abap_true           "X-Quell-Lagerort
                           shiptype    = abap_true           "X-Direct Shipping
                           ).
     APPEND ls_poitemx TO lt_poitemx.

   ENDLOOP.

   CALL FUNCTION 'BAPI_PO_CREATE1'
     EXPORTING
       poheader          = ls_poheader
       poheaderx         = ls_poheaderx
     IMPORTING
       exppurchaseorder  = lv_po_number
       expheader         = ls_expheader
       exppoexpimpheader = ls_exppoexpimpheader
     TABLES
       return            = lt_return_ub
       poitem            = lt_poitem
       poitemx           = lt_poitemx.
*       popartner         = lt_popartner
*       poshipping        = lt_poshipping
*       poshippingx       = lt_poshippingx.
 
   IF lt_return_ub IS NOT INITIAL.
     ...
   ENDIF.

*   Commit work and wait sollte nicht nötig sein. So wird es ein wenig schneller ausgeführt
   CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
 
 ENDMETHOD.