Hi Ron,
Here is the code from one of my programs:
FORM knjizi_nzn.
DATA wa_tab LIKE LINE OF it_sgr.
DATA onumber LIKE BAPIMEPOHEADER-PO_NUMBER.
DATA: BEGIN OF tab OCCURS 0.
INCLUDE STRUCTURE zserije_mat.
DATA: END OF tab.
DATA: tab_pom LIKE LINE OF tab.
*DATA DECLARATION
CONSTANTS : C_X VALUE 'X'.
*Structures to hold PO header data
DATA : HEADER LIKE BAPIMEPOHEADER ,
HEADERX LIKE BAPIMEPOHEADERX .
*Internal Tables to hold PO ITEM DATA
DATA : ITEM LIKE BAPIMEPOITEM OCCURS 0 WITH HEADER LINE,
ITEMX LIKE BAPIMEPOITEMX OCCURS 0 WITH HEADER LINE,
*Internal table to hold messages from BAPI call
RETURN LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE.
data : w_header(40) value 'Zaglavlje naloga'.
data : ws_langu like sy-langu.
ws_langu = sy-langu. "Language variable
*POPULATE HEADER DATA FOR PO
HEADER-COMP_CODE = wa_zgr-bukrs .
HEADER-DOC_TYPE = mm_wa-bsart .
HEADER-DOC_DATE = wa_zgr-datgr .
HEADERX-creat_date = sy-datum .
HEADER-SUPPL_PLNT = wa_zgr-umwrk .
HEADER-LANGU = ws_langu .
HEADER-PURCH_ORG = mm_wa-ekorg .
HEADER-PUR_GROUP = mm_wa-ekgrp .
*HEADER FLAG
HEADERX-comp_code = c_x.
HEADERX-doc_type = c_x.
HEADERX-creat_date = c_x.
HEADERX-SUPPL_PLNT = c_x.
HEADERX-langu = c_x.
HEADERX-purch_org = c_x.
HEADERX-pur_group = c_x.
HEADERX-doc_date = c_x.
LOOP AT it_sgr_pom INTO wa_sgr_pom.
*ITEM DATA
ITEM-PO_ITEM = wa_sgr_pom-stgr.
ITEM-MATERIAL = wa_sgr_pom-matnr.
ITEM-PLANT = wa_zgr-werks.
ITEM-STGE_LOC = wa_zgr-lgort.
ITEM-QUANTITY = wa_sgr_pom-menge.
ITEM-ITEM_CAT = 'U' .
APPEND ITEM.
ITEMX-PO_ITEM = wa_sgr_pom-stgr.
ITEMX-MATERIAL = C_X.
ITEMX-PLANT = C_X .
ITEMX-STGE_LOC = C_X .
ITEMX-QUANTITY = C_X .
ITEMX-TAX_CODE = C_X .
ITEMX-ITEM_CAT = C_X .
ITEMX-ACCTASSCAT = C_X .
APPEND ITEMX.
ENDLOOP.
CALL FUNCTION 'BAPI_PO_CREATE1'
EXPORTING
POHEADER = HEADER
POHEADERX = HEADERX
*POADDRVENDOR =
*TESTRUN =
IMPORTING
EXPPURCHASEORDER = ONUMBER
*EXPHEADER =
*EXPPOEXPIMPHEADER =
TABLES
RETURN = RETURN
POITEM = ITEM
POITEMX = ITEMX.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
wa_zgr-nalbr = onumber.
* OTPREMNICA
* Structures for BAPI
data: gm_header type bapi2017_gm_head_01.
data: gm_code type bapi2017_gm_code.
data: gm_headret1 type bapi2017_gm_head_ret.
data: gm_headret2 type bapi2017_gm_head_ret.
data: gm_item type table of
bapi2017_gm_item_create with header line.
data: gm_item_wa LIKE LINE OF gm_item.
data: gm_return type bapiret2 occurs 0.
data: gm_retmtd1 type bapi2017_gm_head_ret-mat_doc.
data: gm_retmtd2 type bapi2017_gm_head_ret-mat_doc.
DATA: item_count TYPE ebelp.
DATA: matnr_pom TYPE matnr,
lgort_pom TYPE lgort_d,
loop_count(6) TYPE n.
DATA xchpf1 LIKE mara-xchpf.
clear: gm_return, gm_retmtd1, gm_retmtd2. refresh gm_return.
* Setup BAPI header data.
gm_header-pstng_date = sy-datum.
gm_header-doc_date = sy-datum.
gm_code-gm_code = '04'.
gm_header-ref_doc_no = onumber.
LOOP AT it_sgr_pom INTO wa_sgr_pom.
CLEAR xchpf1.
SELECT SINGLE mara~xchpf INTO xchpf1
FROM mara
WHERE mara~matnr = wa_sgr_pom-matnr.
IF xchpf1 IS NOT INITIAL.
CALL FUNCTION 'ZMATGET'
EXPORTING
im_werks = wa_zgr-umwrk
im_lgort = wa_sgr_pom-nsklok
im_matnr = wa_sgr_pom-matnr
im_kolic = wa_sgr_pom-menge
TABLES
output = tab
EXCEPTIONS
nowerks = 1
nolgort = 2
nomatnr = 3
OTHERS = 4.
LOOP AT tab INTO tab_pom.
IF loop_count IS INITIAL.
item_count = item_count + 10.
ENDIF.
gm_item-move_type = '351'.
gm_item-material = wa_sgr_pom-matnr.
gm_item-entry_qnt = tab_pom-taken.
gm_item-entry_uom = wa_sgr_pom-meins.
gm_item-plant = wa_zgr-umwrk.
gm_item-stge_loc = wa_sgr_pom-nsklok.
gm_item-po_number = onumber.
gm_item-po_item = item_count.
gm_item-batch = tab_pom-charg.
"gmitem-mvt_ind = 'B'.
APPEND gm_item.
IF ( matnr_pom IS NOT INITIAL AND matnr_pom <> wa_sgr_pom-matnr ) OR
( matnr_pom = wa_sgr_pom-matnr
AND lgort_pom <> wa_sgr_pom-nsklok ).
item_count = item_count + 10.
ENDIF.
lgort_pom = wa_sgr_pom-nsklok.
matnr_pom = wa_sgr_pom-matnr.
loop_count = loop_count + 1.
ENDLOOP.
CLEAR loop_count.
ELSE.
item_count = item_count + 10.
gm_item-move_type = '351'.
gm_item-material = wa_sgr_pom-matnr.
gm_item-entry_qnt = wa_sgr_pom-menge.
gm_item-entry_uom = wa_sgr_pom-meins.
gm_item-plant = wa_zgr-umwrk.
gm_item-stge_loc = wa_sgr_pom-nsklok.
gm_item-po_number = onumber.
gm_item-po_item = item_count.
gm_item-batch = ''.
"gmitem-mvt_ind = 'B'.
APPEND gm_item.
ENDIF.
ENDLOOP.
* Call goods movement BAPI
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
goodsmvt_header = gm_header
goodsmvt_code = gm_code
IMPORTING
goodsmvt_headret = gm_headret1
materialdocument = gm_retmtd1
TABLES
goodsmvt_item = gm_item
return = gm_return.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
wa_zgr-otpbr = gm_retmtd1.
* PRIJEM ROBE
gm_code-gm_code = '01'.
LOOP AT gm_item INTO gm_item_wa.
gm_item_wa-move_type = '101'.
gm_item_wa-plant = wa_zgr-werks.
gm_item_wa-stge_loc = wa_zgr-lgort.
IF gm_item_wa-batch IS NOT INITIAL.
gm_item_wa-batch = 'MPRD'.
ELSE.
gm_item_wa-batch = ''.
ENDIF.
gm_item_wa-mvt_ind = 'B'.
MODIFY gm_item FROM gm_item_wa.
ENDLOOP.
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
goodsmvt_header = gm_header
goodsmvt_code = gm_code
IMPORTING
goodsmvt_headret = gm_headret2
materialdocument = gm_retmtd2
TABLES
goodsmvt_item = gm_item
return = gm_return.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
wa_zgr-pribr = gm_retmtd2.
MODIFY sd_zgr FROM wa_zgr.
ENDFORM.
Hope it will help you.
Regards,
Vladimir