METHOD zmm_i007_in_ii_si_sap_pur_inv~si_sap_pur_inv_pre_in.
DATA: output_hd TYPE zmmi005_dt_mesg_hd,
output_body TYPE zsd_dt_hxm_res_msgbd_tab,
output_line TYPE zsd_dt_hxm_res_msgbd.
DATA: r_obj TYPE REF TO zco_si_unhxm_out.
DATA: out TYPE zsd_mt_hxm_res.
DATA:ls_head TYPE bapi_incinv_create_header,
lt_item TYPE TABLE OF bapi_incinv_create_item,
ls_item LIKE LINE OF lt_item.
DATA: lt_return TYPE STANDARD TABLE OF bapiret2,
ls_return LIKE LINE OF lt_return.
DATA: lv_number TYPE bapi_incinv_fld-inv_doc_no.
DATA: lv_field TYPE c LENGTH 100,
lv_flag TYPE c.
DATA: lv_index TYPE i.
DATA: lt_tax TYPE STANDARD TABLE OF bapi_incinv_create_tax,
ls_tax LIKE LINE OF lt_tax.
DATA: lv_no TYPE i.
LOOP AT input-mt_sap_pur_inv_pre-msgbd INTO DATA(ls_line).
lv_no = lv_no + 1.
ls_head-gross_amount = ls_line-wrbtr.
ls_head-invoice_ind = 'X'.
"ls_head-calc_tax_ind = 'X'.
ls_head-doc_date = ls_line-bldat. "凭证日期
ls_head-pstng_date = ls_line-budat. "过账日期
ls_head-bline_date = ls_line-zfbdt. "基准日期
ls_head-comp_code = ls_line-bukrs. "公司代码
-
ls_head-diff_inv = ls_line-lifnr. "供应商 ls_head-deliv_posting = 'S'. ls_head-return_posting = 'H'. ls_head-ref_doc_no = ls_line-xblnr. "交货单 ls_head-doc_type = ls_line-gsber. "凭证类型 ls_head-currency = ls_line-pswsl. ls_head-currency_iso = 'RMB'. ls_head-pymt_meth = ls_line-zyl-yl2. "支付方法20221101 ls_head-pmtmthsupl = ls_line-zyl-yl1. "支付方法补充20221031 ls_tax-tax_amount = ls_head-gross_amount. LOOP AT ls_line-hxm INTO DATA(in_item). CLEAR ls_item. lv_index = lv_index + 1. ls_item-sheet_no = lv_no. ls_item-sheet_item = lv_index. ls_item-invoice_doc_item = lv_index. "ls_head-gross_amount = ls_head-gross_amount + IN_ITEM-wrbtr2 . "凭证货币的总发票金额 ls_tax-tax_amount = ls_line-wmwst. "税额 ls_item-po_number = in_item-ebeln. "采购凭证 ls_item-po_item = in_item-ebelp. "采购行项目
*参考凭证是105的,取其103参考凭证 20220902
SELECT SINGLE bwart, lfbja, lfbnr, lfpos FROM mseg INTO @DATA(ls_mseg)
WHERE mblnr = @in_item-lfbnr
AND zeile = @in_item-lfpos.
IF ls_mseg-bwart = ‘105’.
ls_item-ref_doc = ls_mseg-lfbnr. "参考物料凭证
ls_item-ref_doc_it = ls_mseg-lfpos. "参考凭证行
ELSE.
ls_item-ref_doc = in_item-lfbnr. "参考物料凭证
ls_item-ref_doc_it = in_item-lfpos. "参考凭证行
ENDIF.
SELECT SINGLE mjahr FROM mkpf INTO ls_item-ref_doc_year "参考年份
WHERE mblnr = in_item-lfbnr.
ls_item-tax_code = in_item-mwskz. "税码
IF in_item-menge < 0.
ls_item-quantity = in_item-menge * -1. "数量
ELSE.
ls_item-quantity = in_item-menge. "数量
ENDIF.
IF in_item-wrbtr1 < 0.
ls_item-retention_docu_currency = in_item-wrbtr1 * -1. "保留金额
ls_item-item_amount = in_item-wrbtr1 * -1. "凭证货币金额
ELSE.
ls_item-retention_docu_currency = in_item-wrbtr1. "保留金额
ls_item-item_amount = in_item-wrbtr1. "凭证货币金额
ENDIF.
SELECT SINGLE meins FROM ekpo INTO ls_item-po_unit
WHERE ebeln = in_item-ebeln
AND ebelp = in_item-ebelp.
APPEND ls_item TO lt_item.
CLEAR ls_item.
ENDLOOP.
-
LOOP AT lt_item ASSIGNING FIELD-SYMBOL(<fs_item>).
-
lv_index = lv_index + 1.
-
<fs_item>-invoice_doc_item = lv_index.
-
ENDLOOP.
APPEND ls_tax TO lt_tax.
CALL FUNCTION ‘BAPI_INCOMINGINVOICE_CREATE1’
EXPORTING
headerdata = ls_head
invoicestatus = ‘A’
IMPORTING
invoicedocnumber = lv_number
TABLES
itemdata = lt_item
taxdata = lt_tax
return = lt_return.CLEAR lv_field.
LOOP AT lt_return INTO ls_return WHERE type CA ‘EAX’.
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 = lv_field.
lv_flag = ‘X’.
ENDLOOP.IF lv_flag IS INITIAL.
CALL FUNCTION ‘BAPI_TRANSACTION_COMMIT’
EXPORTING
wait = ‘X’.
output_line-orderunm1 = ls_line-itemid.
output_line-orderunm2 = lv_number.
output_line-msgcode = ‘S’.
output_line-msg = |过账成功,过账凭证:{ lv_number }|.
APPEND output_line TO output_body.
CLEAR output_line.
ELSE.
CALL FUNCTION ‘BAPI_TRANSACTION_ROLLBACK’.
output_line-orderunm1 = ls_line-itemid.
output_line-orderunm2 = lv_number.
output_line-msgcode = ‘E’.
output_line-msg = |‘过账失败,失败原因:’{ lv_field }|.
APPEND output_line TO output_body.
CLEAR output_line.
ENDIF.
CLEAR: ls_head,lv_index,lt_item,lt_return,ls_tax,lt_tax.
ENDLOOP.
"反馈头信息
out-mt_hxm_res-msghd-msgid = input-mt_sap_pur_inv_pre-msghd-msgid.
out-mt_hxm_res-msghd-tlgid = input-mt_sap_pur_inv_pre-msghd-tlgid.
out-mt_hxm_res-msghd-tlgname = input-mt_sap_pur_inv_pre-msghd-tlgname.
out-mt_hxm_res-msghd-dtsend = sy-datum && sy-uzeit.
out-mt_hxm_res-msghd-sender = 'ERP'.
out-mt_hxm_res-msghd-receiver = input-mt_sap_pur_inv_pre-msghd-sender.
"反馈行信息
out-mt_hxm_res-msgbd = output_body.
TRY .
CREATE OBJECT r_obj.
CALL METHOD r_obj->si_unhxm_out
EXPORTING
output = out.
COMMIT WORK AND WAIT.
CALL FUNCTION 'ZFUN_PO_LOG'
EXPORTING
-
ENDTRY.OUTPUT1 = output2 = out. CATCH cx_ai_system_fault.
ENDMETHOD.