bapi_goodsmvt_create

www.4AP.de - ABAP Syntaxbeispiel: Warenbewegungen mit dem bapi_goodsmvt_create buchen

Beispielcoding: Warenbewegungen mit dem bapi_goodsmvt_create buchen (kopieren erlaubt aber auf eigene Gefahr :-))

 


Warenbewegungen mit dem bapi_goodsmvt_create buchen:
*
* Coded by Thorsten Neubüser - www.4ap.de
*
PARAMETERS:
  p_bu_dat LIKE goodsmvt_header-pstng_date,
  p_beldat LIKE goodsmvt_header-doc_date,
  p_uname  LIKE goodsmvt_header-pr_uname,
  p_header LIKE goodsmvt_header-header_txt,
  p_gmcode LIKE goodsmvt_code-gm_code,
  p_bwart  LIKE goodsmvt_item-move_type,
  p_mvtind LIKE goodsmvt_item-mvt_ind.

* <SNIP>

PERFORM prepare_bapi_goodsmvt_create.
PERFORM create_sap_documents_bapi. " LOOP AT split_tab.

* <SNIP>

*&---------------------------------------------------------------------*
*&      Form  prepare_bapi_GOODSMVT_CREATE
*&---------------------------------------------------------------------*
FORM prepare_bapi_goodsmvt_create.
*  goodsmvt_header LIKE bapi2017_gm_head_01
  goodsmvt_header-pstng_date  = p_bu_dat. " Buchungsdatum im Beleg
  goodsmvt_header-doc_date    = p_beldat. " Belegdatum im Beleg
*   REF_DOC_NO        Referenz-Belegnummer
*   BILL_OF_LADING        Nummer des Frachtbriefes beim Wareneingang
*   GR_GI_SLIP_NO         Warenbegleitscheinnummer
  goodsmvt_header-pr_uname    = p_uname.  " Benutzername
  goodsmvt_header-header_txt  = p_header. " Belegkopftext
*   VER_GR_GI_SLIP         Version für den Druck des Warenbegleitscheines
*   VER_GR_GI_SLIPX        Änderungsinformation zum zugehörigen Nutzdatenfeld
*   EXT_WMS        Steuerung Buchung für externes WMS

*  goodsmvt_code LIKE bapi2017_gm_code
  goodsmvt_code-gm_code = p_gmcode.    " Zuordnung Code zu Transaktion
  " für BAPI Warenbewegung
  WRITE: /  'Kopfdaten der Belege BAPI_GOODSMVT_CREATE'(012).
  WRITE: /5 'Buchungsdatum im Beleg'(013), 50 p_bu_dat.
  WRITE: /5 'Belegdatum'(014), 50 p_bu_dat.
  WRITE: /5 'Benutzername'(015), 50 p_uname.
  WRITE: /5 'Belegkopftext'(016), 50 p_header.
  ULINE.
ENDFORM.                    " prepare_bapi_GOODSMVT_CREATE


*&---------------------------------------------------------------------*
*&      Form  create_sap_documents_BAPI
*&---------------------------------------------------------------------*
FORM create_sap_documents_bapi.
  DATA: d_count TYPE i,
        d_mod TYPE i.
  LOOP AT split_tab.
*   goodsmvt_item type BAPI2017_GM_ITEM_CREATE occurs 0

*Sonstiger Wareneingang ohne Bezug zu einer Reservierung
*Siehe Warenausgang ohne Bezug zu einer Reservierung

*   GM_Code 03: Warenausgang [siehe Form  prepare_bapi]
*  Warenausgang ohne Bezug zu einer Reservierung
*  Folgende Felder müssen gefüllt werden:
*    Materialnummer
*    Werk
*    Lagerort
*    Bewegungsart
*    Bewegungskennzeichen
*    Menge in Erfassungsmengeneinheit
*    ISO-Code Maßeinheit für Erfassungsmengeneinheit

*andere mögliche GM_CODE
*01    MB01   Wareneingang zur Bestellung buchen - Goods Receipts for Purchase Order
*02    MB31   Wareneingang zum Fertigungsauftrag - Goods Receipts for Prod Order
*03    MB1A   Warenentnahme                      - Goods Issue
*04    MB1B   Umbuchung                          - Transfer Posting
*05    MB1C   Wareneingang Sonstige              - Enter Other Goods Receipt
*06    MB11   Warenbewegung
*07    MB04   Nachverrechnung von Beistellmaterial


*  goodsmvt_item
*  siehe BAPI2017_GM_ITEM_CREATE.xls

    MOVE:
     split_tab-matnr TO goodsmvt_item-material,
     split_tab-werks TO goodsmvt_item-plant,
     split_tab-lgort TO goodsmvt_item-stge_loc,
     p_bwart         TO goodsmvt_item-move_type,
     p_mvtind        TO goodsmvt_item-mvt_ind,   " Bewegungskennzeichen
*  nur frei verwendbarer Bestand
     split_tab-lgbst TO goodsmvt_item-entry_qnt,

* Lagermengeneinheit in ISO umschlüsseln???
*    split_tab-      to goodsmvt_item-ENTRY_UOM_ISO. " ISO-Code !
     split_tab-meins TO goodsmvt_item-entry_uom.

* Daten anfügen
    APPEND goodsmvt_item.


*  Folgende Felder müssen unter Umständen gefüllt werden (keine
*  vollständige Aufzählung):
*    Sonderbestand (z.B. Kundenauftrag, Projekt, Lieferant usw.)
*    Mindesthaltbarkeitsdatum (wenn dies im System so eingestellt ist)
*    Grund der Bewegung (wenn dies im System so eingestellt ist)
*    Charge (wenn das Material chargenpflichtig ist und keine
*      automatische *Chargennummernvergabe eingestellt ist)
*    Kontierungsfelder
*  Folgende Felder können gefüllt werden (keine vollständige
*  Aufzählung):
*    Sonderbestandskennzeichen
*    Positionstext
*    Abladestelle
*    Warenempfänger
*  Folgende Felder dürfen nicht gefüllt werden (keine vollständige
*  Aufzählung):
*    Reservierung
*    Empfangendes/Abgebendes Material
*    Empfangendes/Abgebendes Werk
*    Empfangender/Abgebender Lagerort
*    Empfangende/Abgebende Charge
    d_mod = d_count MOD 100.
    IF d_mod = 0.
      CLEAR save_subrc.
      PERFORM call_bapi_goodsmvt_create.
      REFRESH goodsmvt_item.
      CLEAR goodsmvt_item.
    ENDIF.
  ENDLOOP. " at split_tab
  PERFORM call_bapi_goodsmvt_create.
ENDFORM.                    " create_sap_documents_BAPI



*&---------------------------------------------------------------------*
*&      Form  call_BAPI_GOODSMVT_CREATE
*&---------------------------------------------------------------------*
FORM call_bapi_goodsmvt_create.

  IF p_mard EQ 'X'.
    CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
      EXPORTING
        goodsmvt_header             = goodsmvt_header
        goodsmvt_code               = goodsmvt_code
        testrun                     = p_testrn
      IMPORTING
        goodsmvt_headret            = goodsmvt_headret
        materialdocument            = materialdocument
        matdocumentyear             = matdocumentyear
      TABLES
        goodsmvt_item               = goodsmvt_item
*     GOODSMVT_SERIALNUMBER       =
        return                      = bapi_return.
*Es wird keine Transaktionssteuerung implementiert. Der Aufrufer muß
*dementsprechend nach erfolgreichem Aufruf dieser Methode, wenn also im
*Parameter Return dem Aufrufer keine Fehler mitgeteilt wurden, das
*'Commit Work' selber ausführen.
    PERFORM commit_work TABLES bapi_return
                        USING  'BAPI_GOODSMVT_CREATE'.
  ENDIF.
ENDFORM.                    " call_BAPI_GOODSMVT_CREATE


*&---------------------------------------------------------------------*
*&      Form  commit_work
*&---------------------------------------------------------------------*
FORM commit_work TABLES bapi_return STRUCTURE bapi_return
                 USING  aufrufender_baustein.

  IF bapi_return[] IS INITIAL.
*   DO IT NOW!
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
         EXPORTING
              wait   = 'X'
         IMPORTING
              return = bapi_return.
    save_subrc = sy-subrc.

    LOOP AT bapi_return.
      WRITE: / bapi_return-message, aufrufender_baustein.
    ENDLOOP.

    IF save_subrc NE 0.
      MESSAGE e000(zmig) WITH 'BAPI_TRANSACTION_COMMIT'
                     sy-subrc aufrufender_baustein.
      WRITE: / 'BAPI_TRANSACTION_COMMIT',
               sy-subrc, aufrufender_baustein.
    ELSE. " save_subrc NE 0
*     alles ging gut :-))
      CASE aufrufender_baustein.
        WHEN 'BAPI_GOODSMVT_CREATE'.
          count_bapi_goodsmvt_create = count_bapi_goodsmvt_create + 1.
          IF NOT p_succes IS INITIAL.
            WRITE: /
            'Warenbewegung erfolgreich gebucht:'(017),
            split_tab-matnr,
            split_tab-werks,
            split_tab-lgort,
            p_bwart,
            split_tab-lgbst,
            split_tab-meins,
            'Beleg:'(018),
            materialdocument,
            matdocumentyear.
          ENDIF. " not p_succes is initial
        WHEN 'L_TO_CREATE_SINGLE'.
          count_l_to_create_single = count_l_to_create_single + 1.
          IF NOT p_succes IS INITIAL.
            WRITE: /
            'Transportauftrag erfolgreich angelegt:'(039),
            e_ltap-matnr,
            e_tanum,
            e_ltap-nsolm,
            e_ltap-nltyp,
            e_ltap-nlber,
            e_ltap-nlpla,
            e_ltap-nppos.
          ENDIF. " not p_succes is initial
        WHEN OTHERS.
*          ÄHH, ist nicht vorgesehen :-))
      ENDCASE. " aufrufender_baustein
    ENDIF. " save_subrc NE 0
  ELSE.  " return[] is initial
*   anything is going wrong!
    save_subrc = '999'.
    WRITE: / 'Return-codes des:'(011), aufrufender_baustein.
    LOOP AT bapi_return.
      WRITE: /3  'ID',     bapi_return-id,
                 'TYPE',   bapi_return-type,
                 'NUMBER', bapi_return-number.
      IF NOT bapi_return-message IS INITIAL.
        WRITE: /3  bapi_return-message.
      ENDIF.
      IF NOT bapi_return-message_v1 IS INITIAL.
        WRITE: /3  bapi_return-message_v1.
      ENDIF.
      IF NOT bapi_return-message_v2 IS INITIAL.
        WRITE: /3  bapi_return-message_v2.
      ENDIF.
      IF NOT bapi_return-message_v3 IS INITIAL.
        WRITE: /3  bapi_return-message_v3.
      ENDIF.

      CASE aufrufender_baustein.
        WHEN 'BAPI_GOODSMVT_CREATE'.
          WRITE: /3
            'Warenbewegung die scheiterte:'(029),
            split_tab-matnr,
            split_tab-werks,
            split_tab-lgort,
            p_bwart,
            split_tab-lgbst,
            split_tab-meins.
        WHEN OTHERS.
      ENDCASE. " aufrufender_baustein

*      IF bapi_return-type = 'A'.
*        bapi_return-type = 'E'.     " no abortion!!!
*      ENDIF. " bapi_return-type = 'A'
*      MESSAGE
*                  ID  bapi_return-id(2)
*                TYPE  bapi_return-type
*              NUMBER  bapi_return-number
*                WITH  bapi_return-message
*                      bapi_return-message_v1
*                      bapi_return-message_v2
*                      bapi_return-message_v3.
    ENDLOOP. " at bapi_return
  ENDIF. " bapi_return[] is initial
  CLEAR: bapi_return.
  REFRESH: bapi_return.
ENDFORM.                    " commit_work