sap-采购发票预制

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
  •       OUTPUT1 =
          output2 = out.
    CATCH cx_ai_system_fault.
    
    ENDTRY.
    ENDMETHOD.
  • 23
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值