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

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

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

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

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

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

以下是一个小小的示例:

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

 

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

ZTEST_ACCESSED1
-->
ZTEST_ACCESSED1
-->

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

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

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

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

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

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

ABAP 在被访问的程序中获取访问程序的全局变量的更多相关文章

  1. java程序中获取kerberos登陆hadoop

    本文由作者周梁伟授权网易云社区发布. 一般我们在使用kbs登陆hadoop服务时都直接在shell中调用kinit命令来获取凭证,这种方式简单直接,只要获取一次凭证之后都可以在该会话过程中重复访问.但 ...

  2. linux c程序中获取shell脚本输出的实现方法

    linux c程序中获取shell脚本输出的实现方法 1. 前言Unix界有一句名言:“一行shell脚本胜过万行C程序”,虽然这句话有些夸张,但不可否认的是,借助脚本确实能够极大的简化一些编程工作. ...

  3. Android中获取应用程序(包)的大小-----PackageManager的使用(二)

    通过第一部分<<Android中获取应用程序(包)的信息-----PackageManager的使用(一)>>的介绍,对PackageManager以及 AndroidMani ...

  4. 如何在Silverlight应用程序中获取ASP.NET页面参数

    asp.net Silverlight应用程序中获取载体aspx页面参数 有时候SL应用中需要使用由aspx页面中传递过来的参数值,此时通常有两种方法获取 1. 使用InitParameters属性, ...

  5. 微信小程序编译包的获取与解压——在手机中获取小程序编译包wxapkg

    准备工作: 微信关注需要下载编译包的小程序,然后点进去看一下,微信就会自动下载相应的编译包到手机上了. 获取小程序编译包: 据说root手机可以直接在手机的文件管理中查找wxapkg文件,自己尝试了下 ...

  6. Android中获取应用程序(包)的信息----PackageManager

    本节内容是如何获取Android系统中应用程序的信息,主要包括packagename.label.icon.占用大小等.具体分为两个 部分,计划如下:   第一部分: 获取应用程序的packagena ...

  7. Android中获取应用程序(包)的信息-----PackageManager的使用(一)

    本节内容是如何获取Android系统中应用程序的信息,主要包括packagename.label.icon.占用大小等.具体分为两个 部分,计划如下:  第一部分: 获取应用程序的packagenam ...

  8. Asp.Net Core 中获取应用程序物理路径(Getting the Web Root Path and the Content Root Path in ASP.NET Core)

    如果要得到传统的ASP.Net应用程序中的相对路径或虚拟路径对应的服务器物理路径,只需要使用使用Server.MapPath()方法来取得Asp.Net根目录的物理路径,如下所示: // Classi ...

  9. Android中获取应用程序(包)的信息-----PackageManager的使用

    本节内容是如何获取Android系统中应用程序的信息,主要包括packagename.label.icon.占用大小等.具体分为两个 部分,计划如下: 第一部分: 获取应用程序的packagename ...

随机推荐

  1. kubernetes1.13之后的kubeadm init config

    1.kubernetes1.13之后kubeadm开始GA,由于1.13的kube-proxy有bug,删除ipvs的地方总是导致kube-proxy挂掉,所以建议直接用1.13.2,这个版本解决了b ...

  2. JavaWeb学习 (三)————Tomcat服务器学习和使用(二)

    一.打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命令的用法如下:

  3. C#winform窗体用户控件自定义事件

    C#许多事情都和事件有关系,大部分的事情我们可以通过C#自己的事件来完成,但如果我们自己新建了一个自定义控件,我们该如何定义自己想要的事件呢?下面我就来为大家粗略的讲解一番. 假设我们自定义了一个控件 ...

  4. asp.net mvc 碰到 XML 解析错误:找不到根元素 位置

    具体报错信息如下: XML 解析错误:找不到根元素 位置:moz-nullprincipal:{4a1d2b7c-6d07-468e-9df9-2267a0422c93} 行 1,列 1: 网上给出的 ...

  5. Docker 安装redis(四)

    Docker 安装redis 1.搜索docker镜像(可以看到搜索的结果,这个结果是按照一定的星级评价规则排序的) docker search redis 2.拉取docker的mysql镜像(如果 ...

  6. JavaSE-基础语法(二)-系统类(java.lang.*)和工具类(java.util.*)

    系统类(java.lang.*)和工具类(java.util.*) 一.系统类(java.lang.*) 这个包下包含java语言的核心类,如String.Math.System和Thread类等,使 ...

  7. Java 初级软件工程师 认证考试试卷1

    Java 初级软件工程师 认证考试试卷   笔试(A卷)   考试时间150分钟 总分 100分     姓    名_______________________ 身份证号_____________ ...

  8. React 入门学习笔记整理(九)——路由

    (1)安装路由 React-router React-router提供了一些router的核心api,包括Router, Route, Switch等,但是它没有提供dom操作进行跳转的api. Re ...

  9. vue.js 键盘enter事件的使用

    在监听键盘事件时,我们经常需要检查常见的键值.Vue 允许为 v-on 在监听键盘事件时添加按键修饰符: <!-- 只有在 `keyCode` 是 13 时调用 `vm.submit()` -- ...

  10. 《Inside C#》笔记(七) Attribute

    Attribute特性可以说是具有开创新的意义,因为一般的语言在被设计出来后,它所具有的能力就已经固定了.而借助Attribute特性,我们可以为C#已有的类型附加信息,既可以在编程时(design- ...