【转载】MIR7 发票预制 BAPI_INCOMINGINVOICE_PARK

本文介绍了一个ABAP程序的功能,该程序用于创建预制发票。它详细解释了如何通过读取输入参数并设置相应的抬头数据和行项目数据来构建发票。此外,还展示了如何调用BAPI_INCOMINGINVOICE_PARK函数来执行预制发票操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引自:http://blog.youkuaiyun.com/champaignwolf/article/details/51422329

需要根据实际情况进行调整。

FUNCTION zincominginvoice_park.

*"----------------------------------------------------------------------
*"*"Local interface:
*"  EXPORTING
*"     VALUE(CODE) TYPE  CHAR01
*"     VALUE(MESSAGE) TYPE  CHAR200
*"  TABLES
*"      INPUT STRUCTURE  ZFC_INCOMINGINVOICE_PARK_INPUT OPTIONAL
*"----------------------------------------------------------------------

  DATA: vp_eind(1),
        ls_headerdata       LIKE bapi_incinv_create_header,
        lt_itemdata         LIKE TABLE OF bapi_incinv_create_item,
        ls_itemdata         LIKE bapi_incinv_create_item,
        lt_materialdata     LIKE TABLE OF bapi_incinv_create_material,
        ls_materialdata     LIKE bapi_incinv_create_material,
        lt_taxdata          LIKE TABLE OF bapi_incinv_create_tax,
        ls_taxdata          LIKE bapi_incinv_create_tax,
        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_mwskz LIKE ekpo-mwskz.
  DATA:lv_rblgp TYPE rblgp.
*1/3 invoice_ind='X' db_cr_ind='S' (抬头),  2/4 invoice_ind='' db_cr_ind='H'  (外部物料相关项目)
*1/2 de_cre_ind =''   ,  3/4 de_cre_ind='X'   (po采购订单相关项目)


* BAPI赋值
  CLEAR input.
  READ TABLE input INDEX 1.
  IF sy-subrc EQ 0.
    ls_headerdata-invoice_ind  = 'X'." sp_head-xrech.    "发票标志
*  ls_headerdata-doc_type     = 'RE'."sp_head-blart.
    ls_headerdata-doc_date     = sy-datum."sp_head-bldat.
    ls_headerdata-pstng_date   = sy-datum. "sp_head-budat.
    ls_headerdata-bline_date   = sy-datum. "sp_head-zfbdt.    "基线日期/付款计算的起始日期

    ls_headerdata-comp_code    = '6100'."sp_head-bukrs.
    SELECT SINGLE
           waers
           INTO ls_headerdata-currency
           FROM ekko
           WHERE ebeln = input-ebeln.

*    ls_headerdata-gross_amount = '24'."sp_head-rmwwr.    "总金额
*  ls_headerdata-del_costs    = sp_head-beznk.    "未计划的交货费
*  ls_headerdata-pmnttrms     = sp_head-zterm.    "付款条件
*  ls_headerdata-alloc_nmbr   = sp_head-zuonr.    "分配编号/外部发票号码
*  ls_headerdata-diff_inv     = sp_head-lifnr.    "出票方/供应商
*  ls_headerdata-ref_doc_no   = sp_head-xblnr.
    ls_headerdata-header_txt   = input-bktxt."'123'."sp_head-bktxt.
    ls_headerdata-item_text    = input-sgtxt."'456'."sp_head-sgtxt.
  ENDIF.


  CLEAR lv_rblgp.
  LOOP AT input.
    lv_rblgp = lv_rblgp + 1.
    CLEAR lv_mwskz.
    SELECT SINGLE
           mwskz
           meins
           INTO (lv_mwskz,ls_itemdata-po_unit)
           FROM ekpo
           WHERE ebeln = input-ebeln
             AND ebelp = input-ebelp.

    ls_headerdata-gross_amount = ls_headerdata-gross_amount + input-wrbtr.

    ls_itemdata-invoice_doc_item = lv_rblgp."ls_poitem-buzei.   "发票行项目号
    ls_itemdata-po_number        = input-ebeln."'4500038014'."ls_poitem-ebeln.
    ls_itemdata-po_item          = input-ebelp."'10'."ls_poitem-ebelp.

    SELECT SINGLE
           belnr
           gjahr
           buzei
           INTO (ls_itemdata-ref_doc,ls_itemdata-ref_doc_year,ls_itemdata-ref_doc_it  )
           FROM ekbe
           WHERE ebeln = input-ebeln
             AND ebelp = input-ebelp
             AND belnr = input-mblnr.
*    ls_itemdata-ref_doc          = '5000188866'."ls_poitem-lfbnr.
*    ls_itemdata-ref_doc_year     = '2016'."ls_poitem-lfgja.
*    ls_itemdata-ref_doc_it       = '1'."ls_poitem-lfpos.

    ls_itemdata-item_amount      = input-wrbtr."'24'."ls_poitem-wrbtr.
    ls_itemdata-quantity         = input-menge."'2'."ls_poitem-menge.
*    ls_itemdata-po_unit          = 'EA'."ls_poitem-meins.
    ls_itemdata-tax_code         = lv_mwskz."ls_poitem-mwskz.

    APPEND ls_itemdata TO lt_itemdata.
    CLEAR: ls_itemdata.



    "  LOOP AT tp_baitem INTO ls_baitem.
    ls_materialdata-invoice_doc_item = lv_rblgp."ls_baitem-buzei.
    ls_materialdata-material         = input-matnr."'VBJHH05000000000'."ls_baitem-matnr.
    ls_materialdata-val_area         = '6100'."ls_baitem-bwkey.    "评估范围/工厂
    ls_materialdata-valuation_type   = '6100'."ls_baitem-bwtar.    "评估类型
    ls_materialdata-db_cr_ind        = 'S'."ls_baitem-shkzg.    "借方/贷方标识
    ls_materialdata-item_amount      = '0'."ls_baitem-wrbtr.
    ls_materialdata-quantity         = input-menge."ls_baitem-menge.
    SELECT SINGLE
           meins
           INTO ls_materialdata-base_uom
           FROM mara
           WHERE matnr = input-matnr.
*    ls_materialdata-base_uom         = 'EA'."ls_baitem-meins.
    ls_materialdata-tax_code         = lv_mwskz."ls_baitem-mwskz.
    APPEND ls_materialdata TO lt_materialdata.
    CLEAR: ls_materialdata.



    ls_taxdata-tax_code   = lv_mwskz."ls_taitem-mwskz.
    "    ls_taxdata-tax_amount = ''."ls_taitem-wrbtr.
    APPEND ls_taxdata TO lt_taxdata.
    CLEAR: ls_taxdata.
  ENDLOOP.


  CALL FUNCTION 'BAPI_INCOMINGINVOICE_PARK'
    EXPORTING
      headerdata          = ls_headerdata
*     ADDRESSDATA         =
    IMPORTING
      invoicedocnumber    = lv_invoicedocnumber
      fiscalyear          = lv_fiscalyear
    TABLES
      itemdata            = lt_itemdata
*     ACCOUNTINGDATA      =
*     GLACCOUNTDATA       =
      materialdata        = lt_materialdata
      taxdata             = lt_taxdata
*     WITHTAXDATA         =
*     VENDORITEMSPLITDATA =
      return              = lt_return.

  IF lv_invoicedocnumber IS INITIAL OR lv_fiscalyear IS INITIAL.
    vp_eind = 'X'.
  ENDIF.


  IF vp_eind = 'X'.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

    code = '1'.
    LOOP AT lt_return INTO ls_return WHERE type = 'E'.
      IF message IS INITIAL.
        message = ls_return-message.
      ELSE.
        CONCATENATE message ';' ls_return-message INTO message.
      ENDIF.

      CONCATENATE '预制发票失败:' message INTO message.
    ENDLOOP.


  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
    code = '0'.
    CONCATENATE '预制发票成功,发票号:' lv_invoicedocnumber '发票年度:' lv_fiscalyear INTO message.
  ENDIF.



ENDFUNCTION.

### 关于SAP MIR7 预制发票底表的技术信息 在SAP系统中,`MIR7` 是用于处理预制发票的一个事务码。它主要用于创建基于采购订单的预制发票凭证,并允许用户手动输入或调整发票数据。为了理解 `MIR7` 的底层逻辑和技术细节,我们需要关注其涉及的核心底表以及配置方法。 #### 核心底表及其作用 以下是与 `MIR7` 预制发票相关的几个重要底表: 1. **`EKPO` 表** - 存储采购订单项目的详细信息。 - 当通过 `MIR7` 创建预制发票时,系统会从该表读取采购订单的相关数据以填充发票字段[^1]。 2. **`EBAN` 表** - 记录采购申请的信息。 - 如果采购订单是从采购申请生成的,则此表中的数据可能间接影响 `MIR7` 中的数据展示[^3]。 3. **`RBKP` 和 `RSEG` 表** - 这两个表分别存储财务会计凭证头和行项目信息。 - 在执行 `MIR7` 后,如果成功生成了预制发票凭证,这些数据会被写入到这两个表中[^2]。 4. **`BKPF` 和 `BSEG` 表** - 类似于 `RBKP` 和 `RSEG`,但更偏向于总账层面的记录。 - 它们同样会在最终确认发票并过账时被更新[^3]。 #### 数据流概述 当使用 `MIR7` 处理预制发票时,整个流程遵循以下顺序: - 用户启动 `MIR7` 并选择对应的采购订单作为依据。 - 系统根据选定的采购订单号访问 `EKPO` 表获取商品和服务的具体明细。 - 若存在已收货物的数量差异或其他特殊情况(如容差范围),则需调用后台作业 (Job Program) 如 `RMBABG00` 来完成自动对比计算。 - 成功匹配后,产生的临时凭证将存放在内存缓冲区直至正式提交至数据库;一旦提交完毕,“实际”的凭证条目即刻录入前述提到的各种核心表格之中。 #### 自定义配置指南 对于希望进一步优化或者修改默认行为的企业来说,可以通过如下方式来定制化自己的解决方案: 1. 使用 T-CODE: OLMRLIST 调整显示布局 此工具可以帮助管理员重新排列界面上各栏位的位置以便更好地满足特定需求。具体步骤包括但不限于复制现有视图模板、增删所需栏目等操作[^4]。 2. 设置合理的容差参数 企业可以根据自身的管理策略设定不同的容忍度界限(比如金额上的轻微偏差),从而减少不必要的干预次数。这通常涉及到更改某些隐藏参数文件的内容或是利用标准交易界面来进行相应设置。 3. 开发额外的功能扩展程序 对于那些超出开箱即用能力范畴的要求而言,往往还需要借助 ABAP 编程技能来自行构建附加组件。例如增加新的校验规则、改变原始算法等等皆可通过此类手段达成目标。 ```abap REPORT zmir7_customization. DATA: lv_order TYPE ekko-bstnk, lt_items TYPE TABLE OF ekpo. SELECT * FROM ekpo INTO TABLE lt_items WHERE bstnk = lv_order. IF sy-subrc EQ 0 AND lines( lt_items ) GT 0. WRITE: / 'Order Items Found:', lines( lt_items ). ELSE. WRITE: / 'No Order Items Found.'. ENDIF. ``` 以上代码片段展示了如何查询给定采购订单下的所有子项列表——这是任何深入分析之前必不可少的基础工作之一。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值