公司今年计划大批扩建门店,需要自动化维护相关主数据,其中就有一步通过调用 WB01的BDC录屏来自动创建地点,前台跑没有问题,但后台JOB死活不行,屏幕是以前同事录好的,只能硬着头皮修改。
后台任务日志:

抛RAISE_EXCEPTION异常。
用ST22进去跟踪出错的代码:


出错的地方:

结合前台调式,发现了出错屏幕:

即SAPLPLANT_DISPLAY_CUSTOMIZING的1000屏幕出问题,经查证原因是屏幕上的ALV是OO方式写的
解决办法:后台时跳过该屏幕,但处理逻辑不能省。由于屏幕只是个交互过程,可以在后台代码直接将有用户输入的值给赋值上,屏幕自然就可以不要了,具体实现就是将原屏幕PAI与PBO相关的代码抠出来直接调用,而不再Call 屏幕
查找该屏幕被调用的地方:

发现两处调用:

将这两处都打上断点:


然后断点调试看是哪个地方,SM37进去:

勾上出错的JOB,输入JDBG事务码,回车:

看调用栈,这样就知道是哪个调用了吧,就是DISPLAY_PLANT_COPY_CUSTOMIZING函数,然后进该函数,找到调用
SAPLPLANT_DISPLAY_CUSTOMIZING的1000屏幕的位置进行代码修改。(
注:在按F8调试完JOB后,发现报
OBJECTS_OBJREF_NOT_ASSIGNED异常

但先不要去解决这个问题,本人就因为去解决这个问题耗费了大量时间,这个问题的本质还是因为OO方式的ALV在后台无法构建出的问题,与前面的问题其实是同一问题,只是运行方式不一样:前面的
RAISE_EXCEPTION异常是直接通过任务跑出来的,这个
OBJECTS_OBJREF_NOT_ASSIGNED异常是通过再一次调试该任务出来的。
可以ST22查看出错点:

)
下面就继续修改代码,但代码是标准的程序,一般是不让改的,但我司是老的SAP系统,都不会再升级或打补丁了,再说SAP出来了新的S/4产品,都明确说过,以后不再对老的SAP产品进行维护,就像Windows XP一样,所以想维护想修改BUG的话,就自己来吧
在修改标准程序前,还需要破解程序,不然是修改不了的,我想搞过的人都知道吧,这里就不说破解的事了