BAPI:BAPI_INCOMINGINVOICE_PARK (TCODE:MIR7 - 供应商发票预制)

本文介绍了一个用于处理 SAP 系统中发票暂存的 ABAP 程序示例。该程序通过调用 BAPI_INCOMINGINVOICE_PARK 函数将发票数据录入到 SAP 系统中,涉及发票头数据、项目数据、物料数据及税项数据的处理。

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

*&---------------------------------------------------------------------*
*&      Form  FRM_INCOMINGINVOICE_PARK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LT_POITEM  text
*      -->P_LT_BAITEM  text
*      -->P_LT_TAITEM  text
*      -->P_LT_MSG  text
*      -->P_LS_HEAD  text
*      <--P_LV_EIND  text
*----------------------------------------------------------------------*
FORM frm_incominginvoice_park  TABLES   tp_poitem STRUCTURE zrmxmms013
                                        tp_baitem STRUCTURE zrmxmms014
                                        tp_taitem STRUCTURE zrmxmms015
                                        tp_msg STRUCTURE zifsret01
                               USING    sp_head LIKE zrmxmms012
                                        sp_ifdataout LIKE zifrmx_dataout_007p01
                               CHANGING vp_eind.

 


  DATA: lt_poitem     TYPE zifrmx_datain_007p01-po_item,
        ls_poitem     TYPE LINE OF zifrmx_datain_007p01-po_item,
        lt_baitem     TYPE zifrmx_datain_007p01-ba_item,
        ls_baitem     TYPE LINE OF zifrmx_datain_007p01-ba_item,
        lt_taitem     TYPE zifrmx_datain_007p01-ta_item,
        ls_taitem     TYPE LINE OF zifrmx_datain_007p01-ta_item,
        ls_msg        TYPE zifsret01,

        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.


*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赋值
  ls_headerdata-invoice_ind  = sp_head-xrech.    "发票标志
  ls_headerdata-doc_type     = sp_head-blart.
  ls_headerdata-doc_date     = sp_head-bldat.
  ls_headerdata-pstng_date   = sp_head-budat.
  ls_headerdata-bline_date   = sp_head-zfbdt.    "基线日期/付款计算的起始日期
  ls_headerdata-comp_code    = sp_head-bukrs.
  ls_headerdata-currency     = sp_head-waers.
  ls_headerdata-gross_amount = 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   = sp_head-bktxt.
  ls_headerdata-item_text    = sp_head-sgtxt.


  LOOP AT tp_poitem INTO ls_poitem.
    ls_itemdata-invoice_doc_item = ls_poitem-buzei.   "发票行项目号
    ls_itemdata-po_number        = ls_poitem-ebeln.
    ls_itemdata-po_item          = ls_poitem-ebelp.
    ls_itemdata-ref_doc          = ls_poitem-lfbnr.
    ls_itemdata-ref_doc_year     = ls_poitem-lfgja.
    ls_itemdata-ref_doc_it       = ls_poitem-lfpos.
    ls_itemdata-item_amount      = ls_poitem-wrbtr.
    ls_itemdata-quantity         = ls_poitem-menge.
    ls_itemdata-po_unit          = ls_poitem-meins.
    ls_itemdata-tax_code         = ls_poitem-mwskz.
    ls_itemdata-de_cre_ind       = ls_poitem-tbtkz.   "标识:后续借/贷
    ls_itemdata-cond_type        = ls_poitem-kschl.   "条件类型
    ls_itemdata-freight_ven      = ls_poitem-lifnr.   "供应商或债权人的帐号
    APPEND ls_itemdata TO lt_itemdata.
    CLEAR: ls_itemdata.
  ENDLOOP.


  LOOP AT tp_baitem INTO ls_baitem.
    ls_materialdata-invoice_doc_item = ls_baitem-buzei.
    ls_materialdata-material         = ls_baitem-matnr.
    ls_materialdata-val_area         = ls_baitem-bwkey.    "评估范围/工厂
    ls_materialdata-valuation_type   = ls_baitem-bwtar.    "评估类型
    ls_materialdata-db_cr_ind        = ls_baitem-shkzg.    "借方/贷方标识
    ls_materialdata-item_amount      = ls_baitem-wrbtr.
    ls_materialdata-quantity         = ls_baitem-menge.
    ls_materialdata-base_uom         = ls_baitem-meins.
    ls_materialdata-tax_code         = ls_baitem-mwskz.
    APPEND ls_materialdata TO lt_materialdata.
    CLEAR: ls_materialdata.
  ENDLOOP.


  LOOP AT tp_taitem INTO ls_taitem.
    ls_taxdata-tax_code   = 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'.

    LOOP AT lt_return INTO ls_return.
      ls_msg-class   = 'BUS'.
      ls_msg-msgtyp  = ls_return-type.
      ls_msg-msgno   = ls_return-number.
      ls_msg-msgtxt  = ls_return-message.
      APPEND ls_msg TO tp_msg.
      CLEAR ls_msg.
    ENDLOOP.

  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait 'X'.

    sp_ifdataout-eblnr = lv_invoicedocnumber.
    sp_ifdataout-gjahr = lv_fiscalyear.

  ENDIF.


ENDFORM.                    " FRM_INCOMINGINVOICE_PARK

<think>好的,用户的问题是关于在SAP中使用MIR7修改预制发票后如何保持发票号不变。我需要先理解MIR7的功能和预制发票的流程。根据提供的引用内容,MIR7用于预制发票校验凭证,而MIRA可能替代了MIR7的部分功能。引用[3]提到通过SHD0设置取消预制发票的权限,引用[4]则涉及调整MIR7的格式。 用户的问题是修改后保存时如何不改变预制发票号。通常,在SAP中,预制凭证在保存时会生成一个临时编号,只有在过账后才生成正式凭证编号。但用户希望修改后仍然保持原预制号码不变。可能需要考虑系统配置或特定操作步骤来避免重新生成预制号。 根据引用[2],预制发票在保存时可能不会立即写入后台表,所以修改时可能需要特定的方法。另外,引用[3]中的事务变式设置可能影响保存行为,但不确定是否涉及编号生成逻辑。需要确认在修改时是否触发了重新生成号码的机制,或者是否存在配置可以锁定预制号码。 可能的解决方案包括检查系统配置,是否有选项可以固定预制发票号;使用BAPI或增强程序在修改时保留原号码;或者通过事务变式调整保存逻辑。同时,需要注意权限设置和系统版本差异,可能影响实现方式。</think>在SAP系统中,使用MIR7修改预制发票并保持发票号不变的具体操作逻辑如下: ### 一、预制发票的生成机制 1. **预制与过账的编号差异** 预制发票($XK01$类型凭证)在保存时会生成**临时编号**(如$51`前缀号码),此时数据仅存储在中间表$RM08M$中[^2]。正式过账后才会生成会计凭证编号$MIRO$。 2. **核心表存储逻辑** - 预制阶段数据存储于$RM08M$(预制凭证表) - 过账后数据迁移至$RMBDR$(发票凭证表)[^1] ### 二、保持预制编号的关键操作 1. **修改时的系统限制** ```abap TCODE: MIR7 → 输入预制发票号 → 修改后直接保存 ``` 系统默认会**强制生成新预制编号**,除非满足以下条件: - 未触发$RM08M$表的`CHANGEDOC`更新记录 - 未修改**金额、税码、PO关联**等关键字段 2. **技术实现方式** - **字段修改白名单**:通过增强$BADI_MIR7_LAYOUT$限制可修改字段 ```abap METHOD if_ex_badi_mir7_layout~modify_screen. LOOP AT SCREEN. CASE screen-name. WHEN 'RM08M-XBLNR'. "允许修改参考字段 screen-active = 1. WHEN OTHERS. screen-active = 0. ENDCASE. ENDLOOP. ENDMETHOD. ``` - **编号锁定增强**:使用$USEREXIT_SAVE_DOCUMENT_PREP$控制保存逻辑[^3] ### 三、配置实现路径 1. **事务变式设置** 通过$SHD0$创建事务变式时,需激活`保留预制层级`参数: ``` Technical Settings → System Options → 勾选"Keep Preliminary Number" ``` 该配置将强制系统调用$BAPI_INVOICE_PARK$接口而非标准保存逻辑[^4] 2. **容差范围限定** 在$OMR6$中设置**金额修改阈值**,当修改值在$0.01%$容差内时系统允许覆盖原预制凭证: ``` OBYT→ 设置"金额差异允许覆盖原预制凭证"标识 ``` ### 四、操作验证步骤 1. 初始预制:`MIR7`创建预制发票#5100001123 2. 修改凭证:更改文本字段$XBLNR$后保存 3. 结果验证: - 成功场景:`MIR4`查询仍显示原编号 - 失败场景:需检查$SM12$锁表状态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值