二维码

[BAPI] MIRO采购发票预制过账BAPI_INCOMINGINVOICE_CREATE1

Twilight发表于 2026-09-02 11:19Twilight 最后回复于 2026-09-02 11:19 [复制链接] 212 0

  1. FUNCTION zpufm040.
  2. *"----------------------------------------------------------------------
  3. *"*"本地接口:
  4. *"  IMPORTING
  5. *"     VALUE(I_HEADER) TYPE  ZPUS049 OPTIONAL
  6. *"  EXPORTING
  7. *"     VALUE(E_MESSAGE) TYPE  ZOTS001
  8. *"     VALUE(E_BELNR) TYPE  RE_BELNR
  9. *"     VALUE(E_GJAHR) TYPE  GJAHR
  10. *"  TABLES
  11. *"      IT_ITEM STRUCTURE  ZPUS050 OPTIONAL
  12. *"----------------------------------------------------------------------
  13.   DATA: ls_headerdata       TYPE bapi_incinv_create_header,
  14.         lv_invoicestatus    TYPE bapi_incinv_create_status-rbstat,
  15.         lv_invoicedocnumber TYPE bapi_incinv_fld-inv_doc_no,
  16.         lv_fiscalyear       TYPE bapi_incinv_fld-fisc_year,
  17.         lv_msage            TYPE string.

  18.   DATA: lt_itemdata TYPE STANDARD TABLE OF bapi_incinv_create_item,
  19.         lt_return   TYPE STANDARD TABLE OF bapiret2.

  20.   DATA: ls_itemdata LIKE LINE OF lt_itemdata,
  21.         ls_return   LIKE LINE OF lt_return.

  22.   IF it_item[] IS NOT INITIAL.
  23.     SELECT ebeln,
  24.            ebelp,
  25.            meins,
  26.            bprme,
  27.            bpumz,
  28.            bpumn
  29.       FROM ekpo
  30.       FOR ALL ENTRIES IN @it_item
  31.       WHERE ebeln = @it_item-ebeln
  32.         AND ebelp = @it_item-ebelp
  33.       INTO TABLE @DATA(lt_ekpo).
  34.   ENDIF.

  35. * 1. 填充抬头数据 (HEADERDATA)
  36.   ls_headerdata-doc_type     = 'RE'.          " 凭证类型,如RE(应付发票)
  37.   ls_headerdata-invoice_ind  = 'X'.           " X 表示这是一张需要过账的正向发票,空 表示这是一张冲销发票
  38.   ls_headerdata-ref_doc_no   = i_header-xblnr." 外部参考编号
  39.   ls_headerdata-comp_code    = i_header-bukrs." 公司代码
  40.   ls_headerdata-doc_date     = i_header-bldat." 凭证日期
  41.   ls_headerdata-pstng_date   = i_header-budat." 过账日期
  42.   ls_headerdata-gross_amount = i_header-rmwwr." 总金额(含税)
  43.   ls_headerdata-currency     = i_header-waers." 货币
  44.   ls_headerdata-header_txt   = i_header-bktxt." 抬头文本
  45.   ls_headerdata-diff_inv     = |{ i_header-lifnr ALPHA = IN }|." 供应商编号
  46.   ls_headerdata-calc_tax_ind = i_header-xmwst." 自动计算税额标识

  47. * 设置发票状态为“过账”
  48.   lv_invoicestatus           = i_header-rbstat."5        已过账 A        预制

  49. * 2. 填充行项目数据 (ITEMDATA)
  50. * 注意: BUZEI 必须按升序排列
  51.   SORT lt_ekpo BY ebeln ebelp.
  52.   LOOP AT it_item ASSIGNING FIELD-SYMBOL(<fs_item>).
  53.     CLEAR:ls_itemdata.
  54.     ls_itemdata-invoice_doc_item = sy-tabix.       " 发票行项目编号
  55.     ls_itemdata-po_number        = <fs_item>-ebeln." 采购订单号
  56.     ls_itemdata-po_item          = <fs_item>-ebelp." 采购订单行项目
  57.     ls_itemdata-quantity         = <fs_item>-menge." 数量
  58.     ls_itemdata-po_unit          = <fs_item>-bstme." 单位
  59.     ls_itemdata-item_amount      = <fs_item>-wrbtr." 此行总金额(含税)
  60.     ls_itemdata-item_text        = <fs_item>-sgtxt." 行文本
  61.     READ TABLE lt_ekpo ASSIGNING FIELD-SYMBOL(<fs_ekpo>) WITH KEY ebeln = <fs_item>-ebeln ebelp = <fs_item>-ebelp BINARY SEARCH.
  62.     IF sy-subrc = 0 AND <fs_ekpo>-bprme NE ls_itemdata-po_unit.
  63.       ls_itemdata-po_pr_qnt = <fs_item>-menge / <fs_ekpo>-bpumn * <fs_ekpo>-bpumz.
  64.       ls_itemdata-po_pr_uom = <fs_ekpo>-bprme.
  65.     ENDIF.

  66.     SELECT SINGLE
  67.             mseg~ebeln,
  68.             mseg~ebelp,
  69.             mseg~mblnr,
  70.             mseg~mjahr,
  71.             mseg~zeile
  72.     FROM mseg
  73.     INNER JOIN mkpf ON mseg~mblnr = mkpf~mblnr AND mseg~mjahr = mkpf~mjahr
  74.     WHERE mseg~ebeln = @<fs_item>-ebeln
  75.       AND mseg~ebelp = @<fs_item>-ebelp
  76.       AND mseg~smbln = ''  "排除冲销的物料凭证
  77.       AND mkpf~blart = 'WE' "WE 收货物料凭证
  78.       AND NOT EXISTS ( SELECT * FROM m_mbmps
  79.                       WHERE m_mbmps~smbln = mseg~mblnr
  80.                         AND m_mbmps~sjahr = mseg~mjahr
  81.                         AND m_mbmps~smblp = mseg~zeile )
  82.       INTO @DATA(ls_mseg).
  83.     IF sy-subrc = 0.
  84.       ls_itemdata-ref_doc      = ls_mseg-mblnr.
  85.       ls_itemdata-ref_doc_year = ls_mseg-mjahr.
  86.       ls_itemdata-ref_doc_it   = ls_mseg-zeile.
  87.     ENDIF.
  88.     APPEND ls_itemdata TO lt_itemdata.
  89.   ENDLOOP.

  90. * 3. 调用BAPI
  91.   CALL FUNCTION 'BAPI_INCOMINGINVOICE_CREATE1'
  92.     EXPORTING
  93.       headerdata       = ls_headerdata
  94.       invoicestatus    = lv_invoicestatus
  95.     IMPORTING
  96.       invoicedocnumber = lv_invoicedocnumber
  97.       fiscalyear       = lv_fiscalyear
  98.     TABLES
  99.       itemdata         = lt_itemdata
  100.       return           = lt_return.

  101. * 4. 处理返回结果
  102.   LOOP AT lt_return INTO ls_return WHERE type CA 'AXE'.
  103.     CLEAR:lv_msage.
  104.     CALL FUNCTION 'MESSAGE_TEXT_BUILD'
  105.       EXPORTING
  106.         msgid               = ls_return-id
  107.         msgnr               = ls_return-number
  108.         msgv1               = ls_return-message_v1
  109.         msgv2               = ls_return-message_v2
  110.         msgv3               = ls_return-message_v3
  111.         msgv4               = ls_return-message_v4
  112.       IMPORTING
  113.         message_text_output = lv_msage.
  114.     IF e_message-message IS INITIAL.
  115.       e_message-message   = lv_msage.
  116.     ELSE.
  117.       CONCATENATE e_message-message lv_msage INTO e_message-message SEPARATED BY '/'.
  118.     ENDIF.
  119.   ENDLOOP.
  120.   IF sy-subrc = 0."失败
  121.     CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  122.     e_message-type   = 'E'.
  123.   ELSE.
  124.     CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
  125.       EXPORTING
  126.         wait = 'X'.
  127.     e_message-type    = 'S'.
  128.     e_message-message = '创建采购发票成功'.
  129.     e_belnr = lv_invoicedocnumber.
  130.     e_gjahr = lv_fiscalyear.
  131.   ENDIF.

  132. ENDFUNCTION.
复制代码
回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表