缺乏S账号的生活真的好难啊。
背景是SAP交货单在传输EWM之后,虽然有交货单审核这个动作,但是老是有人再次修改SAP交货单。为了防止两侧数据不一致,SAP逻辑是,SAP交货单再次传输EWM。EWM原处理逻辑是再次创建交货单,因为KEY值SAP交货单重复,会DUMP。目前放开了限制,已经实现数量变更自动同步EWM,除此之外其他的调整传输EWM会报错。我们又不想继续放开更多的更新限制。于是我们选择了删除EWM交货单。
目前交货单两个场景,内向和外向,内向在删除之后会自动创建一个新的单号出来,很怪,后面在查。外向删除之后会产生一个队列给SAP,SAP会同步删除交货单,这很明显不是我们想要的。于是我们开始寻找增强。
1PPF调用点
参考网址:How to Debug PPF action in SAP EWM - SAP Community
类似于我们找BADI增强,在CL_EXITHANDLER里面打断点。我们在 CL_TRIGGER_PPF->IF_ACTION_PPF~EXECUTE打断点。
需要注意的是,我们要打外部断点,因为是新开进程执行的PPF。
另一个需要注意的是,需要修改调试器参数文件,保存即可。
2获取ACTION关键字
action我想大部分EWM开发都很熟悉,同一类型业务数据的处理,都是走同一个类方法,action传参决定执行的内部类方法。
类:/SCWM/CL_IM_ERP_MAPOUT
类方法:IF_EX_EXEC_METHODCALL_PPF~EXECUTE
3找PPF确定的执行类
表:/SCDL/TMP_SRVDET
4全局搜索BADI
通常PUBLISH方法是最后的推送。如果找不到BADI的话,评估一下,是否跳过推送。
5筛选BADI
/SCDL/MP_SRV_OUT_SAP是内部实施,跳过。如果实在找不到,也可以考虑在内部实施的增强点附近做隐式增强。
/SCDL/MP_OUT_EXT目前来看符合要求。
无示例代码,建个实施丢到测试环境。
代码如下:需要增加更多的判断条件
method /SCDL/IF_EX_MP_SRV_OUT~BEFORE_ADAPTER_CALL.
"ct_data type /SCDL/AF_DLV_TAB /SCDL/AF_DLV_STR
FIELD-SYMBOLS :
<fs_data> TYPE /scdl/af_dlv_str.
LOOP AT ct_data ASSIGNING <fs_data>.
IF <fs_data>-s_head-s_ctrl-action_code = '05'."移去
CO_MESSAGE_BOX->ADD_MESSAGE(
is_symsg = VALUE #(
msgty = 'E'
msgid = 'ZEWMPROG'
msgno = '000'
msgv1 = '外向交货单删除不推送SAP'
)
).
ENDIF.
ENDLOOP.
endmethod.
6其他
其实,还有个不是办法的办法。同EWM修改外向交货单过账日期增强一样。最终EWM产生的数据,都会产生队列传输到SAP。我们在EWM处理队列数据,或在SAP队列的处理函数中处理数据,这两者我认为是等效的。
例如本次,我不想推队列给SAP,那么我在SAP队列中,可以判断交货单是否在EWM删除,如果删除,那么我中止队列处理。
7最后的最后
没有S账号的日子真的难过
因为没找到这个BADI的文档,所以后面该测试测试,是否会影响正常的功能。