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
|