群里有朋友提问:
ABAP 主程序和 Include 程序的关联关系,存储在哪张表里?
我也不知道这个问题的答案。
但是,我用之前 SAP 错误消息调试之七种武器:让所有的错误消息都能被定位这篇文章里提到的 ST05 工具,在几分钟之内就找到了答案:这张表的名称是 D010INC.
本文就来聊聊此类问题的分析和研究思路。
下面是个实际的例子,ABAP 主程序 ZTETRIS, 包含了四个 INCLUDE 程序,依次以后缀 D,F,I 和 O 结尾。
那么一定存在一张数据库表,存放了 ZTETRIS 和这四个 INCLUDE 程序的关联关系。
如何找到这张表的名称呢?
显然,我们打开 SE80 事务码,输入主程序的名称,然后展开 Includes 文件夹,能看到这四个 INCLUDE 程序的名称。
所以理论上讲,从打开 SE80 到看见这四个 INCLUDE 程序的整个过程中,我们要寻找的数据库表,必然发生过数据读取。读出来的内容,作为点击 Includes文件夹之后显示的数据源。
那么最简单粗暴的办法就是:使用 ST05 跟踪 SE80 打开的全过程,然后在结果列表里,如大浪淘沙一般,将我们要查找的数据库表的名称鉴别出来。
然而这条路只是理论上可行,实际上走不通。在开发者眼中打开 SE80 事务码,输入主程序的名称,这个操作看起来很简单。
但大家用 ST05 动手一试的话,就能发现背后有数百张数据库表参与了这个过程。
要从 ST05 结果集的数百张数据库表里,查找一张我们陌生的表,确实是大海捞针。
所以我们要更换思路。
我的思路是:尽量缩小在 ST05 里查找的范围。
如果用 ST05 跟踪 SE80 里打开 ABAP 主程序的操作,产生的结果集,必定 100% 全是读取操作。
那我如果用 ST05 跟踪一个特殊的操作,在这个操作里,会触发往要查找的目标数据库表里进行数据插入工作。那么在 ST05 里产生的结果集里,我只需要根据 ABAP OPEN SQL 的 INSERT 关键字进行搜索,不是很快就能找到目标了吗?
问题转化为,怎样的操作,才会触发往要查找的数据库表里插入数据?
如下图所示,我先把第四行 INCLUDE ztetris_f 代码注释掉,激活。
然后再重新启用这行代码。
注意,此时先别忙着激活。因为一旦激活,ZTETRIS_F 就会重新和主程序建立关联关系。这意味着一旦激活,我们要查找的数据库表里,就会插入一条主程序和 ZTETRIS_F 关联关系的记录。
所以正确的操作流程是:
1. 打开 ST05,激活跟踪模式。
2. 回到 SE38,激活。
3. 回到 ST05,关闭跟踪。
在 ST05 的结果集里,根据下列条件进行筛选。
1. Statement 里的操作,包含了 INSERT 即数据插入操作。
2. Statement 里的操作,同时出现了主程序 ZTETRIS 和 ZTETRIS_F.
尽管 ST05 的结果有海量数据,但同时满足上面两个条件的记录很少。花了不到一分钟的时间,我就找到了表 D010INC.
SE16 里查看,发现除了我们主程序里包含的 4 个 INCLUDE 程序之外,还存在四个标准的系统层级的 INCLUDE.
笔者之前的文章聊聊 C语言和 ABAP 曾经提到过,每创建一个新的 ABAP 程序,系统都会自动把这些标准的 INCLUDE 程序包含进去,完成 ABAP 报表在 SAP GUI 里运行的基本输入和输出处理逻辑。
写在最后
笔者有一个 SAP 技术交流群,因为已经满 500 人,新的朋友无法再加入了。后来我创建了一个 ABAP 和 UI5 的知识星球,欢迎大家加入,一起交流讨论。