不久前看到SAP Community里面有这样一个问题,可能比较老了,但个人觉得比较新奇,就去做了下面一个测试。
首先通过事务代码“CMOD”对增强“MB_CF001”(更新物料凭证时的客户功能出口)进行实现。
其中增强代码主要功能是采购入库后将产生的物料凭证自动发送至其他外部系统(如WMS系统),部分关键代码选摘如下:
- BREAK SAP_001.
-
- DATA : LT_TAB LIKE TABLE OF ZWMS_TAB WITH HEADER LINE.
- LOOP AT XMKPF.
- LOOP AT XMSEG WHERE MBLNR EQ XMKPF-MBLNR
- AND MJAHR EQ XMKPF-MJAHR.
-
- IF XMSEG-EBELN <> ''
- AND ( XMSEG-BWART = '101' OR XMSEG-BWART = '102' OR XMSEG-BWART = '161' OR XMSEG-BWART = '162' ).
- CLEAR LT_TAB.
- MOVE-CORRESPONDING XMSEG TO LT_TAB.
- LT_TAB-BUDAT = XMKPF-BUDAT.
- LT_TAB-ERDAT = SY-DATUM.
- LT_TAB-ERZET = SY-UZEIT.
- LT_TAB-ERNAM = SY-UNAME.
- APPEND LT_TAB.
- ENDIF.
- ENDLOOP.
- ENDLOOP.
- IF LT_TAB[] IS NOT INITIAL.
- ”发送到外部系统的逻辑
- ENDIF.
本人用SAP账号“SAP_001”对某采购订单进行收货操作,能正常产生物料凭证,也正确传输到了外部WMS系统中,但是其间未进入到该Exit中进行Debuging。
费解之余在SAP Note“453577”中找到了相关解释:
功能模块MB_UPDATE_TASKS是一个更新模块,因此会在更新任务中被调用,它又调用更新任务中的功能模块(MB_POST_DOCUMENT)。这不是必需的,并且在某些情况下,会导致功能模块MB_POST_DOCUMENT中的调试,特别是位于功能模块中的用户出口变得很困难或不可能。
另外,更新任务中函数模块MB_POST_DOCUMENT的内部调用是不必要的性能负载。
“Update task”是用于对话或报表中实现同步和异步更新数据库的功能,在Update之前还有一个Before Update,用于更新数据前的检查,当二者都执行完,才会进行到后面的Commit,当before update成功执行,而update不成功,会报错如下,显示数据回滚:
Express document "Update was terminated" received from author "SAP_001".SAP is detecting that and rolling back the body of work that was just committed to the database.
如果我们需要进入“Update task”进行调试,则需要在“SAPMM07M ~ MM07MFB9_BUCHEN_AUSFUEHREN”打上内部断点,在“MB_UPDATE_TASKS ”函数中打上外部断点,等到采购订单收货时则会进入Debugging。
在进入的Debuging界面的菜单“设置”-“更改调试器参数文件/设置”中将“更新调试”复选框勾选。
然后会在“MIGO”操作界面中提示“已触发更新调试”(详见下图),紧接着就跳转进入到“MB_UPDATE_TASKS ”函数中进行Debugging。
逐步调试则会来到我们增强实现的地方“CALL CUSTOMER-FUNCTION '001' ”。
好了,上面就是调试“Update Task”的方法。