Skip to Content

在物料凭证过账(入出库处理,物料转储处理)时,如果产生了相应借贷金额的变化,系统会自动产生相应的会计凭证。

有许多用户发现系统中有时会出现物料凭证产生了会计凭证没有产生,或者是相反会计凭证产生了物料凭证却丢失了的现象。在物料分类总帐被启用的情况下,系统会报错C+048,相关物料的入出库移动因为此错误而不能进行。由此会对业务产生巨大影响,如重要物料不能移动,月结年结不能做之类。更甚者由此产生的MM和FI之间的巨大差异会成为审计的焦点。

在此对于此现象产生的可能原因,以及如何避免此现象发生的注意事项进行了如下的总结。

  • 在物料凭证过账中经常被使用到的User-exit以及BAdI
    • 物料凭证丢失相应的财务凭证
    • 财务凭证丢失相应的物料凭证
    • 检查机制
  • SAP notes

在物料凭证过账中经常被使用到的User-exit以及BAdI

物料凭证过账中,有很多需求是进行企业内部自定义的一些过账前的检查,BAdI MB_DOCUMENT_BADI
(method MB_DOCUMENT_BEFORE_UPDATE)和User-exit  EXIT_SAPLMBMB_001(include ZXMBCU01
/ enhancement component MB_CF001)是经常被使用到的。如果在这些用户出口中写入了不恰当的代码,
就会造成表题中所描述的现象。下面给出了一些不恰当的代码示例:

  • COMMIT WORK
  • FROM MEMORY
  • Remote Function Call (CALL FUNCTION .. DESTINATION)
  • Own updates on the document or stock tables (for example, an update on the table MBEW, MARD, MSEG)
  • Unlocking data (for example, by DEQUEUE_ALL)
  • ROLLBACK WORK
  • MESSAGE TYPE ‘A’
  • Calling a dialog box (POPUP_TO_CONFIRM, for example)

摘选自SAP note 92550

  • 物料凭证丢失相应的财务凭证

        这里引入一个SAP LUW的概念。LUW是Unit Logical Unit of Work的缩写,通常有Database LUWs
        和SAP LUWs的区别。 通俗的理解就是SAP为了在多个对话屏幕之间保证数据一致性
       (只有保存操作成功一个事务代码才算完成),在Database LUW的基础上所进行的一种设计。
        而SAP LUW的技术手段之一就是使用CALL FUNCTION… IN UPDATE TASK将所有要更新的
        内容封装并登记起来,由COMMIT WORK触发一并在更新进程(update work process)上执行。
        ABAPHELP文档中有更为详细的的介绍与解释。

        BAdI MB_DOCUMENT_BADI就是在起到这样作用的Function Module MB_UPDATE_TASK
        后被调用到的,因此如果在此BAdI implementation中写入COMMIT WORK这样的命令,
        将直接破坏SAP LUW的构成。

        2-9-2015 5-36-17 PM.png

        因为在此时物料凭证相关的更新任务已经被登记到系统中,等待COMMIT WORK从而写入数据表,
        而会计凭证相关的更新任务还没有被系统登记。 如在BAdI 中写入COMMIT WORK,那一旦在会计
        更新处理中出现了异常,SAP LUW将不能完整地ROLL BACK。

        物料凭证方:

          Call function ‘A’ in update task.

          Call function ‘B’ in update task.

      
        BAdI  MB_DOCUMENT_BADI (method MB_DOCUMENT_BEFORE_UPDATE)
        写入COMMIT WORK -> 物料凭证的更新被触发,数据表MKPF/MSEG会被更新。

      

        会计凭证方:

        Call function ‘C’ in update task.

        Call function ‘D’ in update task.
         ->假设在此阶段发生了更新异常,系统将只能ROLL BACK到前次COMMIT WORK后的状态,
            由此产生了会计凭证未更新而物料凭证被更新的情况

        仍然有用户会有问题,为什么这个问题不是一直发生,以前不都用得好好的?因为此现象只在FI这边
        更新异常出错,
整个事务代码不能完整地 ROLLBACK 时才会发生。 可能因为后台配置的改变或者是
        系统在运用中数据的改变(number range 重复了之类)而产生了FI更新的错误,
才会发生此现象。
        两次COMMIT WORK如果都成功的话,用户是观察不到此现象的。

     

  • 财务凭证丢失相应的物料凭证

        类似的,如果在BAdI或者User exit中写入了ROLL BACK的命令,那么

        物料凭证方:

          Call function ‘A’ in update task.

          Call function ‘B’ in update task.

      
        BAdI  MB_DOCUMENT_BADI (method MB_DOCUMENT_BEFORE_UPDATE)写入ROLLBACK
        -> 物料凭证的更新被取消

      

        会计凭证方:

        Call function ‘C’ in update task.

        Call function ‘D’ in update task.

        标准的COMMIT WORK被执行,却只有会计凭证将会得到更新

  • 检查机制
    因为此问题经常产生,而且一旦大批量发生的话修正非常繁琐,业务影响非常之大,SAP发行了Note 1776835
    一旦系统检测到非标准的COMMIT WORK或者是ROLLBACK 的命令,将丢出中断信息(dump)
    而终止整个事务代码的进行。在ST22 dump的详细信息中,用户可以看到非标准COMMIT WORK是
    在何处被执行的,从而修改代码,避免此类问题的发生。
    因此对于系统版本不够高的用户,推荐使用SNOTE将此Note导入系统中,以免发生
    丢失会计凭证的现象。总之用户的自开发应遵循SAP LUW,避免引起不必要的不整合的现象。

SAP notes

      

关于MMFI整合性问题,SAP有许多官方的Note进行说明与解释

  • Note 968812 MM-FI Differences caused by ROLLBACK or COMMIT
  • Note 92550  Stock inconsistency due to customer enhancement (exit, BAdI)
  • Note 1284654  Caution with implementations of the BAdI: MB_DOCUMENT_BADI
To report this post you need to login first.

5 Comments

You must be Logged on to comment or reply to a post.

  1. Diana Dai

    感谢分享!非常值得收藏的信息,特别是关于不恰当的代码示例,不仅对于物料凭证,对于其他模块在使用User-exit以及BAdI时出现问题的情况,也可以参考.

    (0) 
  2. Myra Zhao

    赞一个, 这回对这样的问题整体有个概念了, 也同时对使用BAdI等用户增强的时候应该注意的点有了一个把握,感谢

    (0) 

Leave a Reply