1. 業務處理(transaction)字段選擇:
創建后續借記(subsequent debit)
ItemData DE_CRE_IND = 'X'
HeaderData INVOICE_IND = 'X'
創建后續貸記(subsequent credit)
ItemData DE_CRE_IND = 'X'
HeaderData INVOICE_IND = ' '
發票(invoice)
HeaderData INVOICE_IND = 'X'
貸方憑證(credit demo)
HeaderData INVOICE_IND = ' '
2. 標識: 貨物項目/交貨成本/全部(Indicator: Goods Items/Delivery Costs/Both)
貨物/服務項目(Goods/service items)
ItemData COND_TYPE = ' '
COND_ST_NO = ' '
COND_COUNT = ' '
計划交貨成本(Planned delivery costs)
ItemData COND_TYPE = 'X'
COND_ST_NO = 'X'
COND_COUNT = 'X'
form frm_invoice_create2 .
data: str type string.
data: ls_headerdata like bapi_incinv_create_header,
lt_itemdata like table of bapi_incinv_create_item,
ls_itemdata like bapi_incinv_create_item,
lt_return like table of bapiret2,
ls_return like bapiret2,
lv_invoicedocnumber like bapi_incinv_fld-inv_doc_no,
lv_fiscalyear like bapi_incinv_fld-fisc_year.
data: lv_price1 type bapi_rmwwr.
data: lv_item type n length 6.
data: lv_retpo type retpo.
clear:l_menge,ls_headerdata,lv_fiscalyear,lv_price1,lv_item.
* 處理退貨和非退貨項目
clear: gt_ret,gt_ret[],gt_inv,gt_inv[].
loop at gt_alv into gs_alv where source = 'EKBE'.
clear: lv_retpo.
select single retpo into lv_retpo from ekpo where ebeln = gs_alv-ebeln and ebelp = gs_alv-ebelp.
loop at gt_invoice into gs_invoice where ebeln = gs_alv-ebeln and ebelp = gs_alv-ebelp.
*---------根據退貨標識 放入不同的內表
if lv_retpo = 'X'."退貨項目
if gs_invoice-shkzg = 'H'.
gs_invoice-dmbtr = 0 - gs_invoice-dmbtr.
endif.
gt_ret-ebeln = gs_invoice-ebeln."采購訂單
gt_ret-ebelp = gs_invoice-ebelp."行項目
gt_ret-lfbnr = gs_invoice-lfbnr. "參考憑證號
gt_ret-lfpos = gs_invoice-lfpos."行項目
gt_ret-lfgja = gs_invoice-lfgja."年度
gt_ret-mwskz = gs_invoice-mwskz."稅碼
gt_ret-dmbtr = gs_invoice-dmbtr. "金額
gt_ret-menge = gs_invoice-menge. "數量
select single meins into gt_ret-meins from ekpo where ebeln = gs_invoice-ebeln and ebelp = gs_invoice-ebelp.
collect gt_ret.
else.
if gs_invoice-shkzg = 'H'.
gs_invoice-dmbtr = 0 - gs_invoice-dmbtr.
endif.
gt_inv-ebeln = gs_invoice-ebeln."采購訂單
gt_inv-ebelp = gs_invoice-ebelp."行項目
gt_inv-lfbnr = gs_invoice-lfbnr. "參考憑證號
gt_inv-lfpos = gs_invoice-lfpos."行項目
gt_inv-lfgja = gs_invoice-lfgja."年度
gt_inv-mwskz = gs_invoice-mwskz."稅碼
gt_inv-dmbtr = gs_invoice-dmbtr. "金額
gt_inv-menge = gs_invoice-menge. "數量
select single meins into gt_inv-meins from ekpo where ebeln = gs_invoice-ebeln and ebelp = gs_invoice-ebelp.
collect gt_inv.
endif.
endloop.
endloop.
*---正常訂單發票校驗
clear: ls_headerdata.
ls_headerdata-invoice_ind = 'X'. "當采購訂單行項目是正常訂單時該標識必為X,為miro界面上的業務處理為1.發票否則為2.貸方憑證(invoice_ind='X'表示miro界面最上部的業務處理是1.發票,invoice_ind='', 表示miro界面最上部的業務處理為2.貸方憑證)
ls_headerdata-doc_type = 'YX'.
ls_headerdata-doc_date = p_datum.
ls_headerdata-pstng_date = g_post_date.
ls_headerdata-bline_date = g_post_date. "基線日期/付款計算的起始日期
ls_headerdata-comp_code = p_bukr2.
ls_headerdata-currency = 'CNY'.
ls_headerdata-calc_tax_ind = 'X'. "自動結算稅額
ls_headerdata-bus_area = '9999'.
clear: lv_item.
loop at gt_inv.
lv_item = lv_item + 1. "發票行項目號
ls_itemdata-invoice_doc_item = lv_item.
ls_itemdata-po_number = gt_inv-ebeln.
ls_itemdata-po_item = gt_inv-ebelp.
ls_itemdata-ref_doc = gt_inv-lfbnr.
ls_itemdata-ref_doc_year = gt_inv-lfgja.
ls_itemdata-ref_doc_it = gt_inv-lfpos.
ls_itemdata-item_amount = gt_inv-dmbtr.
ls_itemdata-quantity = gt_inv-menge.
ls_itemdata-po_unit = gt_inv-meins.
if gt_ret-mwskz is not initial.
ls_itemdata-tax_code = gt_inv-mwskz.
else.
ls_itemdata-tax_code = p_mwskz.
endif.
append ls_itemdata to lt_itemdata.
clear: ls_itemdata.
lv_price1 = lv_price1 + abs( gt_inv-dmbtr ).
endloop.
ls_headerdata-gross_amount = lv_price1 * ( 100 + l_mwskz ) / 100. "總金額
refresh: lt_return.clear: ls_return,invoicedocnumber.
call function 'BAPI_INCOMINGINVOICE_CREATE'
exporting
headerdata = ls_headerdata
importing
invoicedocnumber = invoicedocnumber
tables
itemdata = lt_itemdata
return = lt_return.
loop at lt_return into ls_return where type = 'E' or type = 'A'.
cp_eind = 'X'.
exit.
endloop.
if cp_eind ne 'X'.
call function 'BAPI_TRANSACTION_COMMIT'
exporting
wait = 'X'.
*---插入值到表ZTFI014
gs_ztfi014-tcode = sy-tcode.
gs_ztfi014-seqno = p_datum.
gs_ztfi014-objnr = p_bukr2.
gs_ztfi014-gjahr = p_datum(4).
gs_ztfi014-bukrs = p_bukrs.
gs_ztfi014-belnr = invoicedocnumber.
modify ztfi014 from gs_ztfi014.
else.
call function 'BAPI_TRANSACTION_ROLLBACK'.
loop at lt_return into ls_return.
clear gs_log.
gs_log-type = ls_return-type.
gs_log-docno = invoicedocnumber.
call function 'MESSAGE_TEXT_BUILD'
exporting
msgid = ls_return-id
msgnr = ls_return-number
msgv1 = ls_return-message_v1
msgv2 = ls_return-message_v2
msgv3 = ls_return-message_v3
msgv4 = ls_return-message_v4
importing
message_text_output = gs_log-message.
case gs_log-type.
when 'S'.
gs_log-icon = '3'.
when 'W'.
gs_log-icon = '2'.
when 'E' or 'A'.
gs_log-icon = '1'.
when others.
endcase.
append gs_log to gt_log.
clear ls_return.
endloop.
message e001(00) with '第一張發票預制失敗,請點擊顯示消息查看詳情!'.
endif.
*---退貨訂單發票校驗
clear: ls_headerdata-invoice_ind,ls_headerdata-gross_amount. "發票標志 退貨是該標識必須為空
clear: lv_item,ls_itemdata,ls_return,invoicedocnumber,lv_price1.
refresh: lt_itemdata,lt_return.
loop at gt_ret.
lv_item = lv_item + 1. "發票行項目號
ls_itemdata-invoice_doc_item = lv_item.
ls_itemdata-po_number = gt_ret-ebeln.
ls_itemdata-po_item = gt_ret-ebelp.
ls_itemdata-ref_doc = gt_ret-lfbnr.
ls_itemdata-ref_doc_year = gt_ret-lfgja.
ls_itemdata-ref_doc_it = gt_ret-lfpos.
ls_itemdata-item_amount = abs( gt_ret-dmbtr ).
ls_itemdata-quantity = gt_ret-menge.
ls_itemdata-po_unit = gt_ret-meins.
if gt_inv-mwskz is not initial.
ls_itemdata-tax_code = gt_ret-mwskz.
else.
ls_itemdata-tax_code = p_mwskz.
endif.
append ls_itemdata to lt_itemdata.
clear: ls_itemdata.
lv_price1 = lv_price1 + abs( gt_ret-dmbtr ).
endloop.
ls_headerdata-gross_amount = lv_price1 * ( 100 + l_mwskz ) / 100. "總金額
refresh: lt_return.clear: ls_return.
call function 'BAPI_INCOMINGINVOICE_CREATE'
exporting
headerdata = ls_headerdata
importing
invoicedocnumber = invoicedocnumber
tables
itemdata = lt_itemdata
return = lt_return.
loop at lt_return into ls_return where type = 'E' or type = 'A'.
cp_eind = 'X'.
exit.
endloop.
if cp_eind ne 'X'.
call function 'BAPI_TRANSACTION_COMMIT'
exporting
wait = 'X'.
*---插入值到表ZTFI014
gs_ztfi014-tcode = sy-tcode.
gs_ztfi014-seqno = p_datum.
gs_ztfi014-objnr = p_bukr2.
gs_ztfi014-gjahr = p_datum(4).
gs_ztfi014-bukrs = p_bukrs.
gs_ztfi014-belnr = invoicedocnumber.
modify ztfi014 from gs_ztfi014.
else.
call function 'BAPI_TRANSACTION_ROLLBACK'.
loop at lt_return into ls_return.
clear gs_log.
gs_log-type = ls_return-type.
gs_log-docno = invoicedocnumber.
call function 'MESSAGE_TEXT_BUILD'
exporting
msgid = ls_return-id
msgnr = ls_return-number
msgv1 = ls_return-message_v1
msgv2 = ls_return-message_v2
msgv3 = ls_return-message_v3
msgv4 = ls_return-message_v4
importing
message_text_output = gs_log-message.
case gs_log-type.
when 'S'.
gs_log-icon = '3'.
when 'W'.
gs_log-icon = '2'.
when 'E' or 'A'.
gs_log-icon = '1'.
when others.
endcase.
append gs_log to gt_log.
clear ls_return.
endloop.
message e001(00) with '第二張發票預制失敗,請點擊顯示消息查看詳情!'.
endif.
endform. " FRM_INVOICE_CREATE2
注意:
在PO收貨后,做發票校驗,發現一個問題,就是在headerdata中有個參數 calc_tax_ind ,如果將這個值‘X’,那么在
ME23N中會看不到生成的發票校驗憑證invoicedocnumber的值。
headerdata中的必輸值:
invoice_ind 為'X'
doc_date
pstng_date
comp_code
currency
gross_amount
itemdata中的必輸值:
invoice_doc_item
po_number
po_item
item_amount
quantity
po_unit
ref_doc
ref_doc_year
ref_doc_it
