4.模块化技术之子程序

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

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.

输出结果

下面调试一下子程序。

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

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

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

相关推荐
上单带刀不带妹26 分钟前
Node.js 的模块化规范是什么?CommonJS 和 ES6 模块有什么区别?
前端·node.js·es6·模块化
小羔羊的官方学习账号2 天前
整理期初数据用到的EXCEL里面的函数操作
excel·sap·期初数据整理
大龄门外汉7 天前
CPP学习之map和set
c++·笔记·学习·stl·set·map·改行学it
闲人编程9 天前
PyQt6 进阶篇:构建现代化、功能强大的桌面应用
数据库·python·oracle·gui·脚本·pyqt6·软件
plle17 天前
JavaScript 多人协作的“修罗场”:如何优雅地规避函数重名问题?
模块化·javascript 小技巧
duangww21 天前
SAP ALV导出excel 报 XML 错误的 /xl/sharedStrings.xml
abap
guidovans22 天前
基于tkinter开发电脑工具集(源码在底部)
linux·windows·python·gui·tkinter
Z y..1 个月前
abap po使用函数入参出参作为接口参数
abap
你好coder1 个月前
VSCode连接SAP ABAP开发环境
ide·vscode·编辑器·sap·abap·cds
爱喝水的鱼丶1 个月前
SAP-ABAP: Open SQL集合函数COUNT(统计行数)、SUM(数值求和)、AVG(平均值)、MAX/MIN(极值)深度指南
运维·数据库·sql·sap·报表·abap·程序