Fork me on GitHub

ABAP 在被访问的程序中获取访问程序的全局变量

 

前些日子接到过一个看起来比较普通的需求:

存在一个系统标准函数组FG01,内含函数模块FM00,FM01……等等。在系统程序中,FM00会调用FM01,通过FM01获取获取某些数据。

需求要求,复制一个FM01为ZFM01,修改其中的代码,然后通过Work Organizer配置的方式替换掉标准程序中的FM01。

 

做到一半,却遇到了障碍。因为标准程序中,FM00和FM01是在同一个函数组里面的,因此,这两个函数模块会共用某些全局变量。而自建的ZFM01,显然不属于这个标准函数组的一部分,因此并不能直接获取到这些全局变量。如下图:

当时的我认为,标准函数组中的全局变量的作用范围即标准函数组本身,在这个函数组之外的函数是不可能访问到这些全局变量的。因此,我提出当前的方案不妥当,并给出了更为简洁的办法来满足需求。业务顾问对我的建议欣然同意。接下来,我很顺利地完成了开发任务,甚至感觉自己做得很不错。

 

然而,事后看来,我确实犯下了无知的错误...在一个被调用的函数里,真的不能访问到调用函数所属函数组中的全局变量吗?答案是:可以。

 

以下是一个小小的示例:

1,创建第一个函数组:ZTEST_GETV。在TOP文件中声明全局变量global

 

 

2,创建第二个函数组:ZTEST_ACCESS,在其中创建需要被调用的函数模块ZTEST_ACCESSED1

 

3,在ZTEST_GETV中创建一个FM:ZTEST_CALLER,为全局变量global赋值“全局变量”,并调用ZTEST_ACCESSED1

 

4,在被调用的函数模块中写入以下代码(SAPLZ_TEST_GETV是调用函数所在的程序名):

 

现运行ZTEST_CALLER,进入调试模式,可以看到:

 

也就是说,此时,我们已经成功地在第二个函数组中获取了第一个函数组中的全局变量的值。

 

 当然,这不是一种无限制的功能,如果将被调用的程序改为RFC调用,如图:

可以发现,由于调用栈的变化,想要用刚刚的方式获取调用者的全局变量是不行的:

posted @ 2017-03-21 16:15  氢氦  阅读(1738)  评论(1编辑  收藏  举报