4.模块化技术之子程序

news2024/12/23 22:26:15

 总学习目录请点击下面连接

SAP ABAP开发从0到入职,冷冬备战-CSDN博客


目录

​编辑

1.模块化基础和概述

使用模块化有什么好处

两大类模块化技术

程序局部的模块化

SAP系统内全局模块化

封装有什么好处?

2.子程序模块化

三种传递类型

子程序结构

参数命名习惯

子程序调用和生成语法

使用调试器,来分析代码

3.子程序模块化操作

创建新包

启动编辑器,创建一个程序


1.模块化基础和概述

为什么要学习模块化,模块化有什么意义

目标:能够指出ABAP基础的模块化技术

使用模块化有什么好处

程序A写了三个一样的代码,程序B写了一个代码,在需要用的时候进行调用

好处:有条例,便于修改,不容易改错,易于维护,可读性好

两大类模块化技术

程序局部的模块化

有两种实现方式

1.子程序,subroutine

也称为from程序,因为子程序封装在perform和endform之间

2.本地类的方法

在本地创建class,为这个类创建方法,在本地进行调用

这两个方法都只能在主程序内使用,所以也是本地方法

对于A程序,perform是子程序调用的关键字,下面的Subroutine是一个子程序快

对于B程序,右边有一个CALL METHOD 是调用本地的类方法的关键字

A中定义的方法不能再B中使用,反过来同理

SAP系统内全局模块化

也有两种方法

1.函数组中的函数模块

左边是一个function group 全局函数

2.全局类中的方法

右边是一个global_class 全局类,里面有一个Method

这两种方式都可以被ABC三个函数进行调用。

是属于一个懒加载模式,只有要用到了,才会从知识库进行加载这个模块。

调用时都使用CALL METHOD关键字。

理想情况下,被调用的模块单元不直接使用调用程序的数据对象。有一个数据封装性,参考C语言局部变量。

封装有什么好处?

易于修改,保持一致性,时模块可复用性的基础。

因为封装性,所以要访问数据时,必须要提供接口,对于function group来说接口叫做,interface。对于全局类来说,叫做signature。其实都是接口。

在定义接口参数时,可见性也是要被定义的。后面学习。

参数分为三种:

1.传入参数,给模块的参数,importing 参数

2.返回参数,从模块返回数据到调用者,exporting 参数

3.变动参数,传递数据给模块单元,并在被修改后返回参数,changing 参数,本质时把变量的内存地址赋给了模块,模块操作这个参数时,操作的是内存中参数的地址空间。

2.子程序模块化

如何在ABAP中使用子程序,子程序参数是如何传递的,参数传输类型之间的差别

目标:能够在ABAP中定义子程序,能够调用子程序,能够调试和分析子程序。

看下面程序,外面大框是一个主程序,里面浅色的是一个子程序

子程序必须在主程序内部定义,必须在from和endform之间进行定义,二者都必须以.结尾。

这个代码没有带参数,通常都是那三种参数,甚至可以传链表。

如果变量被定义在主程序中,那么是全局可以使用的。并在整个程序的任意位置都是可以修改的,包括子程序。

一般来说呢,为了复用,所以要使用占位符。相当于C语言形参和实参部分。

当子程序被调用的时候,主程序就会把变量传递给形式参数。参数个数,形式必须一致。

三种传递类型

主程序中的变量被传递到子程序的形式参数时,需要在子程序接口中对每个参数进行指定

1.值拷贝调用

分配给子程序中对应形式参数的拷贝,而不是实际参数的本身。

创建拷贝的时候会消耗一定的时间,此时应用服务器就会给拷贝服务器分配内存和时间。

2.通过值和结果传递

通过提供跟值调用一样的拷贝,但是返回结果时会被写回到原型。如果子程序被stop,结果不会写回。

3.通过引用调用

实际时把地址赋给参数,所以对参数的修改会同步到实际参数。

子程序结构

以form开始,后面指定子程序的接口名称。

下面是实现语句。

以endform结尾。

using下面跟按值传递,和按值和返回传递的变量,changing是按引用传递的。

下面有个value(f1),表示按值传递,没有value就表示按值和返回传递。

changing下面没有value表示按引用传递。

在调用时,如果实际参数不使用value,就要在change和value下面指定

例子中,a分配给f1,b分配给f2,c分配给f3

主程序中定义的变量是全局数据对象,这些变量在整个主程序中都可以使用,包括子程序。

子程序内部定义的变量只能在子程序内部使用

关于SAP的内存管理,是系统自动进行管理的。进入子程序加载,出去后释放。实际也可以自己去手动管理内存。

参数命名习惯

一般情况下,为了清晰的标明程序内的对象,应该使用如下的前缀,对全局数据对象使用g,对using使用p,对changing参数使用c,对局部数据对象使用I

子程序调用和生成语法

在程序中使用perform来调用子程序,首先要定义子程序,然后保存主程序,

参数的话,有对应的参数一一匹配。

ABAP工作台中可以直接拖拽子程序进入主程序,可以自动生成命令。

也可以在ABAP编辑器中,使用Pattern按钮,然后输入要调用的子程序的名称,然后生成代码。

使用调试器,来分析代码

在子程序调用部分打上断点,然后选择执行按钮F6,来执行整个程序,也可以使用F5来进入程序的第一行语句,更详细的追踪子程序的操作。

如果当前语句在子程序内,可以使用F7执行完子程序剩余的部分,子程序被执行完。

在ABAP调试器中,所有的调试控制功能,单步执行返回继续都代表相同的意义。

在调试器的standard页签下,能够看到子程序被那个程序调用了,这个工具就是调用栈。

3.子程序模块化操作

开始做子程序练习

创建新包

先去创建一个包se21

点击显示,返回不存在,此时创建

点击对勾

显示需要请求,这里没有就新创建一个

输入描述后确认

点击确认

点击保存然后退出

启动编辑器,创建一个程序

点击保存

进入了编辑器

先通过写代码创建一个子程序

然后点击上面显示对象列表,使用第二种方式上下文菜单,自动生成代码

右键,创建,子程序

选上面表示创建一个新的程序,并将子程序放进去。选下面表示在主程序中添加子程序。

在前面放了个注释区。

还有一种创建方式

在要创建的位置,写一个PERFORM F_Test01 USING GV_T1 GV_T2 CHANGING GV_T3

然后双击文件名,问你是否要创建

也是选一下位置,然后就创建好了

稍微修改下参数名称并指定类型,不然任意类型的参数都可以传入,如果传入的类型和使用的出现了冲突,就会stop。而不能让他称为any类型。

REPORT Z_YITING_12061.
DATA : GV_T1 TYPE I.
DATA : GV_T2 TYPE I.
DATA : GV_T3 TYPE I.
GV_T1 = 10.
GV_T2 = 20.
WRITE /.
WRITE GV_T1.
WRITE GV_T2.
WRITE GV_T3.
PERFORM F_Test01 USING GV_T1 GV_T2 CHANGING GV_T3.
WRITE /.
WRITE GV_T1.
WRITE GV_T2.
WRITE GV_T3.
FORM F_Test01 USING VALUE(gv_t1) TYPE I
gv_t2 TYPE I
CHANGING cv_t3 TYPE I.
cv_t3 = 100.
gv_t2 = gv_t1 + gv_t2.
gv_t1 = 100.
ENDFORM.

输出结果

下面调试一下子程序。

光标放在要调试的代码部分,点击执行

堆栈的规则是先进入后出,可以在这里看堆栈的一个情况。

下一节更新函数和本地类模块化操作和概念。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2255680.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用Python实现子域名简单收集

免责申明 本文仅是用于学习研究子域名信息收集,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》【学法…

k8s,进一步理解Pod

比如,凡是调度、网络、存储,以及安全相关的属性,基本上是Pod 级别的。 这些属性的共同特征是,它们描述的是“机器”这个整体,而不是里面运行的“程序”。比如,配置这个“机器”的网卡(即&#…

Unity 使用LineRenderer制作模拟2d绳子

效果展示: 实现如下: 首先,直接上代码: using System.Collections; using System.Collections.Generic; using UnityEngine;public class LineFourRender : MonoBehaviour {public Transform StartNode;public Transform MidNod…

博物馆导览系统方案(一)背景需求分析与核心技术实现

维小帮提供多个场所的室内外导航导览方案,如需获取博物馆导览系统解决方案可前往文章最下方获取,如有项目合作及技术交流欢迎私信我们哦~撒花! 一、博物馆导览系统的背景与市场需求 在数字化转型的浪潮中,博物馆作为文化传承和知…

14.在 Vue 3 中使用 OpenLayers 自定义地图版权信息

在 WebGIS 开发中,默认的地图服务通常会带有版权信息,但有时候我们需要根据项目需求自定义版权信息或添加额外的版权声明。在本文中,我们将基于 Vue 3 的 Composition API 和 OpenLayers,完成自定义地图版权信息的实现。 最终效果…

详解下c语言中的typedef

相信学习过c语言的很多同学都对typedef很陌生,感觉它离自己很遥远,自己很少用到。但实际上,我们看很多地方,包括很多大神级别的代码中,它却又经常使用。今天我们就详细描述下它,使我们对它有一个更深的认识…

19. Three.js案例-创建一个带有纹理映射的旋转平面

19. Three.js案例-创建一个带有纹理映射的旋转平面 实现效果 知识点 WebGLRenderer (WebGL渲染器) WebGLRenderer 是 Three.js 中用于渲染场景的主要类。它利用 WebGL 技术在浏览器中绘制 3D 图形。 构造器 new THREE.WebGLRenderer(parameters)参数类型描述parametersobj…

Ensemble Learning via Knowledge Transfer for CTR Prediction 论文阅读

Abstract:点击率(CTR)预测在推荐系统和网络搜索中起着关键作用。虽然许多现有的方法利用集成学习来提高模型性能,但它们通常将集成限制在两个或三个子网络中,很少探索更大的集成。在本文中,我们研究了更大的集成网络&a…

苍穹外卖项目练习总结

做这个练习项目已经接近两年之久,现在拿出来复习一遍,主要就是里面处理问题的流程,以及整体思考的逻辑需要重新回顾一遍,后续会逐渐总结这一段时间以来学习到的知识。 项目整体包含两部分,一个是管理端,一…

数学拯救世界(三)———破魔

题目一: 还记不记得,出现带分数的话可以怎么办? 题目二: 还记不记得,昨天讲的重叠数 题目三: 提公因数,抓住问题本质 题目四:

JAVA |日常开发中连接Sqlite数据库详解

JAVA |日常开发中连接Sqlite数据库详解 前言一、SQLite 数据库概述1.1 定义与特点1.2 适用场景 二、Java 连接 SQLite 数据库的准备工作2.1 添加 SQLite JDBC 驱动依赖2.2 了解 JDBC 基础概念 三、建立数据库连接3.1 代码示例3.2 步骤解析 四、执行 SQL 语句4.1 创建…

对 JavaScript 说“不”

JavaScript编程语言历史悠久,但它是在 1995 年大约一周内创建的。 它最初被称为 LiveScript,但后来更名为 JavaScript,以赶上 Java 的潮流,尽管它与 Java 毫无关系。 它很快就变得非常流行,推动了 Web 应用程序革命&…

解谜类游戏《迷失岛2》等如何抽象出一套通用高效开发框架?

解谜类游戏以精妙的谜题设计和引人入胜的故事叙述为特点,考验着玩家的智慧与观察力。《迷失岛2》与《南瓜先生2九龙城寨》正是这一领域的佳作。游戏以独特的艺术风格和玩法设计吸引了大量玩家,而它们背后隐藏着一套强大的框架。 上海胖布丁游戏的技术总…

CID引流电商

ClickID技术是基于多家媒体平台开发的电商引流服务,通过媒体提供的宏参数,间接解决电商平台订单数据的回传问题,帮助账户收集到极致精准的数据模型,搭建不同媒体往各平台引流的桥梁。简单来说就是通过ClickID数据监测到另外一个平…

保姆级教程Docker部署Redis镜像

目录 1、创建挂载目录和配置文件 2、运行Redis镜像 3、查看redis运行状态 1、创建挂载目录和配置文件 # 创建宿主机Redis配置文件存放目录 sudo mkdir -p /data/docker/redis/conf# 创建Redis配置文件 cd /data/docker/redis/conf sudo touch redis.conf 到Github上找到Redi…

如何将快捷指令添加到启动台

如何将快捷指令添加到启动台/Finder/访达(Mac) 1. 打开快捷指令创建快捷指令 示例创建了一个文件操作测试的快捷指令。 2. 右键选择添加到程序坞 鼠标放在待添加的快捷指令上。 3. 右键添加到访达 鼠标放在待添加的快捷指令上。 之后就可以在启…

【AI学习】Mamba学习(二十):Mamba是一种线性注意力

论文《Demystify Mamba in Vision: A Linear Attention Perspective 》从线性注意力的视角,对Mamba 进行了阐释。 论文名称:Demystify Mamba in Vision: A Linear Attention Perspective (Arxiv 2024.05) 论文地址:https://arxiv.org/pdf/24…

Bootstrap-HTML(三)Bootstrap5列表组全解析

Bootstrap-HTML(三)Bootstrap5列表组全解析 前言(一)HTML 列表基础回顾1.无序列表2.有序列表3.定义列表 二、无样式的有序列表和无序列表内联列表 三、Bootstrap5 列表组1.基础的列表组2.设置禁用和活动项3.链接项的列表组4.移除列…

【CSP CCF记录】202212-2第28次认证 训练计划

题目 样例1输入 10 5 0 0 0 0 0 1 2 3 2 10 样例1输出 1 1 1 1 1 10 9 8 9 1 样例1解释 五项科目间没有依赖关系,都可以从第 1 天就开始训练。 10天时间恰好可以完成所有科目的训练。其中科目 1 耗时仅 1天,所以最晚可以拖延到第 10 天再开始训练&…