zoukankan      html  css  js  c++  java
  • 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调用,如图:

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

  • 相关阅读:
    Linux常用命令
    杀死进程端口
    Spring boot项目的打包发布
    关于xshell和文件传输相关
    Windows10开发环境搭建
    Windows10设置系统参数
    windows10禁止更新
    Postgresql9.6基础使用(Windows 解压版)
    (转载)Thingsboard入门教程:本地环境搭建和源码编译安装,献给thingsboard编译失败的同学,教程不断完善中,文章最后是thingsboard常见编译失败的问题总结
    系统同时安装 Open JDK and Oracle JDK(Ubuntu16.04)
  • 原文地址:https://www.cnblogs.com/hhelibeb/p/6594683.html
Copyright © 2011-2022 走看看