二维码

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

Twilight发表于 2026-09-02 11:19Twilight 最后回复于 2026-09-02 11:19 [复制链接] 2 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. * 1. 填充抬头数据 (HEADERDATA)
  23.   ls_headerdata-doc_type     = 'RE'.          " 凭证类型,如RE(应付发票)
  24.   ls_headerdata-invoice_ind  = 'X'.           " X 表示这是一张需要过账的正向发票,空 表示这是一张冲销发票
  25.   ls_headerdata-ref_doc_no   = i_header-xblnr." 外部参考编号
  26.   ls_headerdata-comp_code    = i_header-bukrs." 公司代码
  27.   ls_headerdata-doc_date     = i_header-bldat." 凭证日期
  28.   ls_headerdata-pstng_date   = i_header-budat." 过账日期
  29.   ls_headerdata-gross_amount = i_header-rmwwr." 总金额(含税)
  30.   ls_headerdata-currency     = i_header-waers." 货币
  31.   ls_headerdata-header_txt   = i_header-bktxt." 抬头文本
  32.   ls_headerdata-diff_inv     = |{ i_header-lifnr ALPHA = IN }|." 供应商编号
  33.   ls_headerdata-calc_tax_ind = i_header-xmwst." 自动计算税额标识

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

  36. * 2. 填充行项目数据 (ITEMDATA)
  37. * 注意: BUZEI 必须按升序排列
  38.   LOOP AT it_item ASSIGNING FIELD-SYMBOL(<fs_item>).
  39.     ls_itemdata-invoice_doc_item = sy-tabix.       " 发票行项目编号
  40.     ls_itemdata-po_number        = <fs_item>-ebeln." 采购订单号
  41.     ls_itemdata-po_item          = <fs_item>-ebelp." 采购订单行项目
  42.     ls_itemdata-quantity         = <fs_item>-menge." 数量
  43.     ls_itemdata-po_unit          = <fs_item>-bstme." 单位
  44.     ls_itemdata-item_amount      = <fs_item>-wrbtr." 此行总金额(含税)
  45.     ls_itemdata-item_text        = <fs_item>-sgtxt." 行文本

  46.     SELECT SINGLE
  47.             mseg~ebeln,
  48.             mseg~ebelp,
  49.             mseg~mblnr,
  50.             mseg~mjahr,
  51.             mseg~zeile
  52.     FROM mseg
  53.     INNER JOIN mkpf ON mseg~mblnr = mkpf~mblnr AND mseg~mjahr = mkpf~mjahr
  54.     WHERE mseg~ebeln = @<fs_item>-ebeln
  55.       AND mseg~ebelp = @<fs_item>-ebelp
  56.       AND mseg~smbln = ''  "排除冲销的物料凭证
  57.       AND mkpf~blart = 'WE' "WE 收货物料凭证
  58.       AND NOT EXISTS ( SELECT * FROM m_mbmps
  59.                       WHERE m_mbmps~smbln = mseg~mblnr
  60.                         AND m_mbmps~sjahr = mseg~mjahr
  61.                         AND m_mbmps~smblp = mseg~zeile )
  62.       INTO @DATA(ls_mseg).
  63.     IF sy-subrc = 0.
  64.       ls_itemdata-ref_doc      = ls_mseg-mblnr.
  65.       ls_itemdata-ref_doc_year = ls_mseg-mjahr.
  66.       ls_itemdata-ref_doc_it   = ls_mseg-zeile.
  67.     ENDIF.
  68.     APPEND ls_itemdata TO lt_itemdata.
  69.   ENDLOOP.

  70. * 3. 调用BAPI
  71.   CALL FUNCTION 'BAPI_INCOMINGINVOICE_CREATE1'
  72.     EXPORTING
  73.       headerdata       = ls_headerdata
  74.       invoicestatus    = lv_invoicestatus
  75.     IMPORTING
  76.       invoicedocnumber = lv_invoicedocnumber
  77.       fiscalyear       = lv_fiscalyear
  78.     TABLES
  79.       itemdata         = lt_itemdata
  80.       return           = lt_return.

  81. * 4. 处理返回结果
  82.   LOOP AT lt_return INTO ls_return WHERE type CA 'AXE'.
  83.     CLEAR:lv_msage.
  84.     CALL FUNCTION 'MESSAGE_TEXT_BUILD'
  85.       EXPORTING
  86.         msgid               = ls_return-id
  87.         msgnr               = ls_return-number
  88.         msgv1               = ls_return-message_v1
  89.         msgv2               = ls_return-message_v2
  90.         msgv3               = ls_return-message_v3
  91.         msgv4               = ls_return-message_v4
  92.       IMPORTING
  93.         message_text_output = lv_msage.
  94.     IF e_message-message IS INITIAL.
  95.       e_message-message   = lv_msage.
  96.     ELSE.
  97.       CONCATENATE e_message-message lv_msage INTO e_message-message SEPARATED BY '/'.
  98.     ENDIF.
  99.   ENDLOOP.
  100.   IF sy-subrc = 0."失败
  101.     CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  102.     e_message-type   = 'E'.
  103.   ELSE.
  104.     CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
  105.       EXPORTING
  106.         wait = 'X'.
  107.     e_message-type    = 'S'.
  108.     e_message-message = '创建采购发票成功'.
  109.     e_belnr = lv_invoicedocnumber.
  110.     e_gjahr = lv_fiscalyear.
  111.   ENDIF.

  112. ENDFUNCTION.
复制代码


回复

使用道具 举报

快速回帖

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

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