BAPI_INCOMINGINVOICE_CREATE usage

[b]The BAPI is equivalent to Tcode MIRO.[/b]
LOOP AT itab_bapi.
*Populate header Data
l_header-invoice_ind = 'X'.
CONCATENATE itab_bapi-inv_date+6(4) itab_bapi-inv_date+3(2)
itab_bapi-inv_date(2) INTO l_header-doc_date.
l_header-pstng_date = sy-datum.
l_header-comp_code = itab_bapi-bukrs.
l_header-currency = itab_bapi-waers.
l_header-header_txt = itab_bapi-reference.
l_header-gross_amount = l_header-gross_amount + itab_bapi-tot_subtract_gst.
l_header-alloc_nmbr = itab_bapi-inv_no.
l_header-item_text = itab_bapi-ebeln.
*Populate Item Date
l_item-po_number = itab_bapi-ebeln.
l_item-po_item = itab_bapi-ebelp.
SELECT SINGLE lfbnr lfgja lfpos gjahr INTO
(l_item-ref_doc, l_item-ref_doc_year, l_item-ref_doc_it, l_gjahr)
FROM ekbe WHERE ebeln EQ itab_bapi-ebeln AND
ebelp EQ itab_bapi-ebelp AND belnr EQ itab_bapi-belnr.
*Populate GRS Exchange Rate.
*IF checkbox for Exchange Rate Fixed was ticked, the exchange rate will be extracted from PO header
*Else GRS Exchange rate
CONCATENATE itab_bapi-belnr l_gjahr INTO l_awkey.
SELECT SINGLE kufix wkurs INTO (l_kufix, l_header-exch_rate) FROM ekko
WHERE ebeln EQ itab_bapi-ebeln AND bukrs EQ itab_bapi-bukrs.
IF l_kufix IS INITIAL.
SELECT SINGLE kursf INTO l_header-exch_rate FROM bkpf
WHERE awtyp EQ 'MKPF' AND awkey EQ l_awkey AND bukrs EQ itab_bapi-bukrs.
ENDIF.
SELECT SINGLE lebre bprme pstyp webre INTO (l_lebre,l_item-po_pr_uom, l_pstyp, l_webre) FROM ekpo
WHERE ebeln EQ itab_bapi-ebeln AND ebelp EQ itab_bapi-ebelp AND bukrs EQ itab_bapi-bukrs.
REFRESH: it_ekbe.
l_item-tax_code = itab_bapi-mwskz.
SELECT zekkn wrbtr menge lfbnr lfgja lfpos INTO
(l_zekkn, l_amt, l_accounting-quantity, l_item-ref_doc, l_item-ref_doc_year, l_item-ref_doc_it)
FROM ekbe WHERE ebeln EQ itab_bapi-ebeln AND
ebelp EQ itab_bapi-ebelp AND belnr EQ itab_bapi-belnr.
CLEAR: l_menge, l_wrbtr, l_grn_menge, l_grn_wrbtr.
IF l_webre IS NOT INITIAL.
IF l_pstyp EQ '9'.
SELECT * FROM ekbe INTO CORRESPONDING FIELDS OF TABLE it_ekbe
WHERE ebeln = itab_bapi-ebeln AND ebelp = itab_bapi-ebelp
AND lfbnr = l_item-ref_doc AND lfpos EQ l_item-ref_doc_it AND bewtp IN ('R','Q', 'T').
IF sy-subrc EQ 0.
LOOP AT it_ekbe.
IF it_ekbe-shkzg = 'H'.
l_menge = l_menge - it_ekbe-menge.
l_wrbtr = l_wrbtr - it_ekbe-wrbtr.
ELSEIF it_ekbe-shkzg = 'S'.
l_menge = l_menge + it_ekbe-menge.
l_wrbtr = l_wrbtr + it_ekbe-wrbtr.
ENDIF.
ENDLOOP.
ENDIF.
ELSE.
SELECT * FROM ekbe INTO CORRESPONDING FIELDS OF TABLE it_ekbe
WHERE ebeln = itab_bapi-ebeln AND ebelp = itab_bapi-ebelp
AND lfbnr = l_item-ref_doc AND belnr NE l_item-ref_doc AND lfpos EQ l_item-ref_doc_it.
IF sy-subrc EQ 0.
LOOP AT it_ekbe.
CASE it_ekbe-bewtp.
*get the quantity and amount invoiced or parked
WHEN 'R' OR 'Q' OR 'T'.
IF it_ekbe-shkzg = 'H'.
l_menge = l_menge - it_ekbe-menge.
l_wrbtr = l_wrbtr - it_ekbe-wrbtr.
ELSE.
l_menge = l_menge + it_ekbe-menge.
l_wrbtr = l_wrbtr + it_ekbe-wrbtr.
ENDIF.
*get the quantity and amount returned or canceled
WHEN 'E'.
CHECK it_ekbe-belnr GT itab_bapi-belnr.
ADD it_ekbe-menge TO l_grn_menge.
ADD it_ekbe-wrbtr TO l_grn_wrbtr.
ENDCASE.
ENDLOOP.
ENDIF.
ENDIF.
ELSE. "GR-based IV is not ticked
l_amt = itab_bapi-tot_subtract_gst.
l_accounting-quantity = itab_bapi-menge.
ENDIF.
ADD 1 TO l_index.
l_item-item_amount = l_amt - l_wrbtr - l_grn_wrbtr.
*Convert internal amount to external amount
CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_EXTERNAL'
EXPORTING
currency = l_header-currency
amount_internal = l_item-item_amount
IMPORTING
amount_external = l_item-item_amount.
l_item-invoice_doc_item = l_index.
l_item-sheet_no = l_item-ref_doc.
l_item-sheet_item = l_zekkn * 10.
IF ( l_pstyp NE '9' OR l_lebre IS NOT INITIAL ) AND l_pstyp NE '1'.
l_item-po_unit = itab_bapi-meins.
l_item-quantity = l_accounting-quantity - l_menge - l_grn_menge.
ELSE.
CLEAR: l_item-po_unit, l_item-po_unit_iso,
l_item-quantity, l_item-po_pr_uom.
ENDIF.
APPEND l_item TO l_items.
*Populate account data
l_accounting-invoice_doc_item = l_index.
IF l_zekkn NE 0.
l_accounting-serial_no = l_zekkn.
ELSE.
l_accounting-serial_no = '01'.
ENDIF.
l_accounting-tax_code = itab_bapi-mwskz.
l_accounting-item_amount = l_amt - l_wrbtr - l_grn_wrbtr.
*Convert internal amount to external amount
CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_EXTERNAL'
EXPORTING
currency = l_header-currency
amount_internal = l_accounting-item_amount
IMPORTING
amount_external = l_accounting-item_amount.
IF ( l_pstyp NE '9' OR l_lebre IS NOT INITIAL ) AND l_pstyp NE '1'.
l_accounting-po_unit = itab_bapi-meins.
l_accounting-po_pr_uom = l_item-po_pr_uom.
l_accounting-quantity = l_item-quantity.
ELSE.
CLEAR: l_accounting-po_unit, l_accounting-po_unit_iso,
l_accounting-quantity, l_item-po_pr_uom.
ENDIF.
CLEAR: l_accounting-gl_account, l_accounting-costcenter, l_accounting-sd_doc,
l_accounting-sdoc_item, l_accounting-asset_no, l_accounting-sub_number,
l_accounting-orderid, l_accounting-ref_date, l_accounting-funds_ctr,
l_accounting-fund, l_accounting-grant_nbr, l_accounting-bus_area,
l_accounting-rl_est_key, l_accounting-co_area, l_accounting-costobject,
l_accounting-profit_segm_no, l_accounting-profit_ctr, l_accounting-wbs_elem.
IF l_pstyp NE '9' OR ( l_pstyp EQ '9' AND l_webre IS INITIAL ).
SELECT SINGLE sakto kostl vbeln vbelp anln1 anln2 aufnr dabrz fistl geber
grant_nbr gsber imkey kokrs kstrg paobjnr prctr ps_psp_pnr
INTO (l_accounting-gl_account, l_accounting-costcenter, l_accounting-sd_doc,
l_accounting-sdoc_item, l_accounting-asset_no, l_accounting-sub_number,
l_accounting-orderid, l_accounting-ref_date, l_accounting-funds_ctr,
l_accounting-fund, l_accounting-grant_nbr, l_accounting-bus_area,
l_accounting-rl_est_key, l_accounting-co_area, l_accounting-costobject,
l_accounting-profit_segm_no, l_accounting-profit_ctr, l_accounting-wbs_elem)
FROM ekkn WHERE ebeln EQ itab_bapi-ebeln AND ebelp EQ itab_bapi-ebelp AND
zekkn EQ l_accounting-serial_no.
IF sy-subrc EQ 0.
APPEND l_accounting TO l_accountings.
ENDIF.
ELSE.
SELECT SINGLE sakto kostl vbeln vbelp anln1 anln2 aufnr dabrz fistl geber
grant_nbr gsber imkey kokrs kstrg paobjnr prctr ps_psp_pnr
INTO (l_accounting-gl_account, l_accounting-costcenter, l_accounting-sd_doc,
l_accounting-sdoc_item, l_accounting-asset_no, l_accounting-sub_number,
l_accounting-orderid, l_accounting-ref_date, l_accounting-funds_ctr,
l_accounting-fund, l_accounting-grant_nbr, l_accounting-bus_area,
l_accounting-rl_est_key, l_accounting-co_area, l_accounting-costobject,
l_accounting-profit_segm_no, l_accounting-profit_ctr, l_accounting-wbs_elem)
FROM eskn WHERE packno EQ l_item-ref_doc AND zekkn EQ l_accounting-serial_no.
IF sy-subrc EQ 0.
APPEND l_accounting TO l_accountings.
ENDIF.
ENDIF.
IF l_webre IS INITIAL.
EXIT.
ENDIF.
ENDSELECT.
MOVE-CORRESPONDING itab_bapi TO w_bapi.
AT END OF inv_no.
SUM.
*Convert internal amount to external amount
CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_EXTERNAL'
EXPORTING
currency = l_header-currency
amount_internal = l_header-gross_amount
IMPORTING
amount_external = l_header-gross_amount.
*Post FI Invoice
CALL FUNCTION 'BAPI_INCOMINGINVOICE_CREATE'
EXPORTING
headerdata = l_header
IMPORTING
invoicedocnumber = itab_bapi-belnr_new
TABLES
itemdata = l_items
accountingdata = l_accountings
return = l_returns.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
*Retrieve Error Message
LOOP AT l_returns INTO l_return.
IF sy-tabix EQ 1.
itab_bapi-err_msg = l_return-message.
ELSE.
CONCATENATE itab_bapi-err_msg ';' l_return-message INTO itab_bapi-err_msg.
ENDIF.
ENDLOOP.
MODIFY itab_bapi TRANSPORTING belnr_new err_msg WHERE inv_no EQ itab_bapi-inv_no.
CLEAR: l_header, l_item, l_accounting, l_index.
REFRESH: l_items[], l_accountings[].
ENDAT.
ENDLOOP.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值