上图黄色的不带红框的第一行—FM CRM_PUBLISH_OW是在最初进入CRM MAINTAIN_OW时候被调用的(注意上面只有两个位置有这个FM CRM_PUBLISH_OW, 一个是HEADER入口, 一个是ITEM入口), 也就是你下面所提到的CRM_ORDERADM_H_PUBLISH_OW, 这个FM随后会call CRM_EVENT_PUBLISH_OW, 在FM CRM_EVENT_PUBLISH_OW里的 internal table gt_allowed_callbacks_hdr 存放了当前系统注册的所有call back函数, 然后该FM开始做plan 的工作,所以该FM的作用类似于调度安排。
PLAN_CALLBACKS具体干的活有两大部分:
1利用Object和event信息找出哪些是需要立即执行的, 放到内表lt_atonce_exets里, 随后备用
2 决定哪些是需要随后执行的call back, 放到gt_plan_exets里。
再回来, 对于马上执行的call back函数, 那就在CRM_EVENT_PUBLISH_OW的最下面调用执行代码。如你截图所示。那么不是immediately执行的call back怎么办呢?
第一幅图里面的红框代码, CRM_EVENT_SET_EXETIME_OW, 是用它来执行其他的非immediately的call back,
会看到不同的位置, 都有该FM的身影, 这应该是call back注册的时间点的区别, 有如下几种
· 1. End of header processing(对应下图的end_header_maitain)
· 2. End of item processing(对应下图的end _item_maitain)
· 3. End of document (better name would be “End of CRM_ORDER_MAINTAIN”,应该对应下图的end_order_maintain)
· 4. End of all document(应该是下图的end of order multi_maitain)
再遍历, 通过GUID, KIND, EXETIME找到要执行的call back, 然后在红框处的EXECUTE_CALLBACKS_PLANNED调用执行
从我的trace截图来看, 恰恰是上面说的第三种, End of document的时候触发的EXECUTE_CALLBACKS_PLANNED。
下面的英文注释也解释了这两个FM的作用。
下面的图也说明了这个执行过程, XXX_ publish_OW负责注册,调度, 如果是马上执行的, 那就在CRM_EVENT_PUBLISH里面执行;
CRM_EVENT_SET_EXETIME_OW负责根据不同的时间点去执行其余的call back。
除了之前提到的trace工具SE38- CRM_EVENT_TRACE
还有一个重要的表 – CRMC_EVENT_CALL
可以只查看Z的function, 其实这个表也就是之前那个SPRO里面显示的内容, 可能在这里面更好查询一些, 而且可以根据客户修改的时间检查是否他们最近注册的call back存在问题, 更方便一点。 我不知道还有其他的功能, 仅是自己的理解
CRMV_EVENT is for predefined callbacks. The customer-defined callbacks should not be registered here. Move them to SPRO.
Restrict the number of times the callback is planned in for a certain execution time to a minimum.
- Register the callback for individual transaction categories instead of for the generic transaction category BUS20001 so that the callbacks do not run unnecessarily for other transactions.
- Avoid register the unnecessary callbacks to transaction category BUS2000115 -------115 我知道是CRM Sales Transaction, 注册FM在这个上面,是不是也相当于general的调用, 我看联想很多fm都是注册在这里的,
- consider whether it is absolutely necessary to set the execution time “Immediately”. The other execution times are better for performance since several events might trigger the same callback.-----如果不设置成immediately,
还有很多选项, 这个完全得看业务需要和实际逻辑了。
- Consider carefully which value you set for the parameter Call Callback and restrict the number of times the callback is planned in for a certain execution time to a minimum. ------这个是在哪里设置????是我第一个界面吗?如何限制调用次数?
要获取更多Jerry的原创文章,请关注公众号"汪子熙":