总学习目录请点击下面连接
目录
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.
输出结果
下面调试一下子程序。
光标放在要调试的代码部分,点击执行
堆栈的规则是先进入后出,可以在这里看堆栈的一个情况。
下一节更新函数和本地类模块化操作和概念。