授人以渔:如何找到 ABAP 主程序和 Include 程序关联关系的存储表

群里有朋友提问:

ABAP 主程序和 Include 程序的关联关系,存储在哪张表里?

e1fce09f2cbb008287ada79b54a08b07.png

我也不知道这个问题的答案。

但是,我用之前 SAP 错误消息调试之七种武器:让所有的错误消息都能被定位这篇文章里提到的 ST05 工具,在几分钟之内就找到了答案:这张表的名称是 D010INC.

本文就来聊聊此类问题的分析和研究思路。

下面是个实际的例子,ABAP 主程序 ZTETRIS, 包含了四个 INCLUDE 程序,依次以后缀 D,F,I 和 O 结尾。

d3076fcb78138d8b807cffc6d60887e8.png

那么一定存在一张数据库表,存放了 ZTETRIS 和这四个 INCLUDE 程序的关联关系。

如何找到这张表的名称呢?

显然,我们打开 SE80 事务码,输入主程序的名称,然后展开 Includes 文件夹,能看到这四个 INCLUDE 程序的名称。

所以理论上讲,从打开 SE80 到看见这四个 INCLUDE 程序的整个过程中,我们要寻找的数据库表,必然发生过数据读取。读出来的内容,作为点击 Includes文件夹之后显示的数据源。

92555587222a9777c664bb205c90a5e2.png

那么最简单粗暴的办法就是:使用 ST05 跟踪 SE80 打开的全过程,然后在结果列表里,如大浪淘沙一般,将我们要查找的数据库表的名称鉴别出来。

然而这条路只是理论上可行,实际上走不通。在开发者眼中打开 SE80 事务码,输入主程序的名称,这个操作看起来很简单。

但大家用 ST05 动手一试的话,就能发现背后有数百张数据库表参与了这个过程。

要从 ST05 结果集的数百张数据库表里,查找一张我们陌生的表,确实是大海捞针。

所以我们要更换思路。

我的思路是:尽量缩小在 ST05 里查找的范围。

如果用 ST05 跟踪 SE80 里打开 ABAP 主程序的操作,产生的结果集,必定 100% 全是读取操作。

那我如果用 ST05 跟踪一个特殊的操作,在这个操作里,会触发往要查找的目标数据库表里进行数据插入工作。那么在 ST05 里产生的结果集里,我只需要根据 ABAP OPEN SQL 的 INSERT 关键字进行搜索,不是很快就能找到目标了吗?

问题转化为,怎样的操作,才会触发往要查找的数据库表里插入数据?

如下图所示,我先把第四行 INCLUDE ztetris_f 代码注释掉,激活。

1eb29149af98c6f8f1e879889d33f23b.png

然后再重新启用这行代码。

注意,此时先别忙着激活。因为一旦激活,ZTETRIS_F 就会重新和主程序建立关联关系。这意味着一旦激活,我们要查找的数据库表里,就会插入一条主程序和 ZTETRIS_F 关联关系的记录。

450ad04e69066c68bbbe0b0fcb5c8538.png

所以正确的操作流程是:

1. 打开 ST05,激活跟踪模式。

2. 回到 SE38,激活。

3. 回到 ST05,关闭跟踪。

在 ST05 的结果集里,根据下列条件进行筛选。

1. Statement 里的操作,包含了 INSERT 即数据插入操作。

2. Statement 里的操作,同时出现了主程序 ZTETRIS 和 ZTETRIS_F.

7329dbd8df421c211523e441a6588b95.png

尽管 ST05 的结果有海量数据,但同时满足上面两个条件的记录很少。花了不到一分钟的时间,我就找到了表 D010INC.

SE16 里查看,发现除了我们主程序里包含的 4 个 INCLUDE 程序之外,还存在四个标准的系统层级的 INCLUDE.

6bdeca14bf7da690966361ae0d28d264.png

笔者之前的文章聊聊 C语言和 ABAP 曾经提到过,每创建一个新的 ABAP 程序,系统都会自动把这些标准的 INCLUDE 程序包含进去,完成 ABAP 报表在 SAP GUI 里运行的基本输入和输出处理逻辑。

写在最后

笔者有一个 SAP 技术交流群,因为已经满 500 人,新的朋友无法再加入了。后来我创建了一个 ABAP 和 UI5 的知识星球,欢迎大家加入,一起交流讨论。

055c689bebd745075adc9f2213a6f277.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值