Complacency is the enemy of study
学习的敌人是自己的满足。
标准内表定位代码位置!!!
不知道大家有没有尝试体会过debug标准程序,debug过程中发现SAP标准的内表不知道什么时候赋值,或者类的静态属性什么时候改变的,本文通过ABAP DEBUG SCRIPT的方式快速定位内表赋值或者类的静态属性值变换时候的代码位置,加快解决问题能力,因为很多教程都是一个简单的例子,我这次的例子是调试标准程序PPOSE,尽可能的实战模拟现实案例。
ABAP SCRIPT DEBUG脚本编辑初始化
1首先我们来熟悉一个TCODE:SAS,这个TCODE是专门写脚本代码的,原理很简单,就是在标准程序或者自定义程序中插入一些脚本代码,脚本代码能获取到标准程序或者自定义程序的变量,然后你进行一些加工处理,下图就是abap script的显示界面

业务场景:需要在标准TCODE中找到M_TABLE_BUTTON内表赋值的地方
2 在这里介绍几个常用的按钮,默认进来的时候是上图那样,系统会有代码的框架,一般来说我们都是在method的script方法中实现,代码编写完成后点另存为按钮,这样代码可以保存到数据库里面也可以保存到本地文件,可以根据需求处理。调试过程中有几个选项比较重要,调试器单步、断点已达到、观察点已到达这三个,如果说你的内表是全局变量,一般我们选择观察点已到达没然后后面会有一个小笔,输入观察点的条件就可以,比如我想看M_TABLE_BUTTON这个内表的变量,在条件中输入lines(M_TABLE_BUTTON) > 即可,此处注意,你这个M_TABLE_BUTTON表一定是针对debug程序而且的全局变量,如果是局部变量,你保存会提示监控点无法创建。


标准程序初始位置:对象实例化阶段,M_TABLE_BUTTON内表就在是这个对象的内表
3 我们现在开始debug变成程序PPOSE,我在778行打一个断点,然后不不知道M_TABLE_BUTTON内表在什么时候赋值,但是知道在778行以后的某个程序。

如何加载脚本代码:在debug界面中加入自己编辑的脚本代码
4 我切换到脚本的以前,然后选择加载脚本,因为开始的时候我已经通过tcode:sas创建好我的脚本,脚本名字叫zvivi,所以这个时候我只要引入就可以,我开始尝试使用观察点的方式,但是系统提示M_TABLE_BUTTON不能创建,估计这个内表的作用域有限,所以我切换到调试单独的选项,这个意思,就是没有执行一行代码,系统就会调用这个脚本程序,脚本程序执行完以后,系统又会执行下一步标准代码,如此反复,我的脚本代码写的逻辑是读取M_TABLE_BUTTON内表,然后循环他,如果代码能进入循环,就断点停止,这样系统就会帮我去找到什么时候赋值的,只要能进入我脚本停止的代码,那么只要执行完这个段脚本,看调用路径,就知道在标准代码的什么维护是内表赋值的地方。

如何快速停留在break-point位置
5 然后不停点启动脚本按钮,因为我们选的是调试器单步,所以需要不停的按F8,大概按拉40次左右,系统进入我debug模式,效果如下

正确停留在需要停止的位置:系统自动停留在符合条件的位置
6 这个时候我去看table_CLONE的内表值,发现有数据,那就是找到M_TABLE_BUTTON内表的值啦,现在就是把这个脚本跑完,然后切换到桌面1的页签

停留在断点位置之前,就是M_TABLE_BUTTON内表赋值地方
7 此时发现我的代码停在815行,那脚本执行肯定是815以前的代码,我看应该就是806行的这个方法中,点进入看看这个方法

最终找到具体位置:找到M_TABLE_BUTTON最终赋值地方。
8发现确实M_TABLE_BUTTON表有赋值的地方,在52行中发现他有append的动作,所以就定位到标准程序他在什么时候赋值。

本文介绍了如何通过ABAP SCRIPT DEBUG脚本在SAP HCM标准程序中快速定位内表M_TABLE_BUTTON的赋值位置。在调试标准TCODE PPOSE时,通过设置观察点和脚本代码,最终在方法中找到内表赋值的代码行。
943

被折叠的 条评论
为什么被折叠?



