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.

输出结果

下面调试一下子程序。

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

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

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

相关推荐
Cindy的SAP加油站1 天前
SAP Ariba_Order Fulfillment Status
sap·sap ariba
SAP学习成长之路2 天前
ADBC 查询语法介绍:EXECUTE_QUERY
java·服务器·开发语言·数据库·sap·abap·零售
syounger4 天前
近四分之一SAP ECC用户对未来规划尚不明朗
sap
hope_wisdom4 天前
实战设计模式之简介
设计模式·架构·软件工程·模块化·封装
HeathlX6 天前
ABAP - 系统集成之SAP的数据同步到OA(泛微E9)服务器数据库
数据库·abap
SAP学习成长之路9 天前
SAP HANA 上进行 ABAP 开发:简介
开发语言·数据结构·数据库·sap·abap·代码规范
Android小码家9 天前
开发者如何使用GCC提升开发效率GUI操作
c++·gui·g++
Fireworks_me11 天前
SAP Native SQL 的简单说明
sql·abap
CHENWENFEIc12 天前
数据结构之栈:从原理到实现
c语言·开发语言·数据结构·程序人生·学习方法·改行学it