
在物料凭证过账(入出库处理,物料转储处理)时,如果产生了相应借贷金额的变化,系统会自动产生相应的会计凭证。
有许多用户发现系统中有时会出现物料凭证产生了会计凭证没有产生,或者是相反会计凭证产生了物料凭证却丢失了的现象。在物料分类总帐被启用的情况下,系统会报错C+048,相关物料的入出库移动因为此错误而不能进行。由此会对业务产生巨大影响,如重要物料不能移动,月结年结不能做之类。更甚者由此产生的MM和FI之间的巨大差异会成为审计的焦点。
在此对于此现象产生的可能原因,以及如何避免此现象发生的注意事项进行了如下的总结。
在物料凭证过账中经常被使用到的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的构成。
因为在此时物料凭证相关的更新任务已经被登记到系统中,等待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 notes
关于MMFI整合性问题,SAP有许多官方的Note进行说明与解释
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
5 | |
4 | |
4 | |
3 | |
3 | |
3 | |
3 | |
3 | |
3 | |
2 |