4.1模块化技术之函数,本地类
总学习目录请点击下面连接
SAP ABAP开发从0到入职,冷冬备战-CSDN博客
目录
目录
4.函数模块化
函数的概念和组件
函数的属性
函数接口
函数在调用时,应用服务器如何处理。
函数调用
异常处理
如何创建函数
创建函数组
创建函数
BAPI
5.函数模块化操作
创建函数组
创建函数
标签页
属性
导入
导出
正在更改
表
例外
源代码
程序调用函数
Bug总结
6.本地类模块化
本地类的定义
本地类的调用
本地类的练习
上一节子程序模块化的连接:4.模块化技术之子程序-CSDN博客
4.函数模块化
学习目标:在程序中调用函数,创建函数组,创建函数。
函数的概念和组件
也称为是功能模块,每个函数都有一个导入或导出数据的接口。函数的主要目的是复用性。属于复用组件。
函数必须被分配给一个函数组,函数组是拥有相似功能或处理相同数据的函数的集合。
函数组除了函数,还有一些其他的对象,也就是组件。
全局数据对象
函数组的每一个函数都可以访问函数组的数据对象。不能修改,但是可以读取值。
子程序
这些子程序可以被函数组中的函数调用。
屏幕
这些屏幕能够被函数组中的函数所调用。
函数的属性
短描述:简单的描述一下函数的功能
所属的函数组:就是函数在那个组里面
函数除了能访问全局的数据对象外,还可以像program一样有属于自己局部的类型和数据对象。
函数接口
函数导入和导出的接口由四部分组成
importing 参数:当函数调用程序的值或者变量能够被传递给输入参数,可选可不选。
export参数:函数调用时,会把函数调用参数import参数接受一下,并返回结果,可选可不选。
changing参数:按引入设置参数,一旦传进去,被修改就会同步,可选可不选。
exception参数:异常参数,如果在函数中抛出了异常,在调用这个函数是可以看到的,可选可不选。
函数接口中使用的类型,尽量使用ABAP字典中的数据元素,全局的变量类型。
函数在调用时,应用服务器如何处理。
当程序调用函数时,整个对应的函数组被加载,函数被执行。函数组保持加载在工作内存中,知道调用程序被关闭,当调用这个函数组中的其他函数时,不需要重新加载同名的函数组,并且带有函数的全局数据。
只有当前用户的session清除掉时,函数才会被清除掉。
如果一个函数给被调用的的函数组中的全局数据写值,其他在相同函数组中的函数在被相同的程序调用时候能够访问这个数据。可以实现在不同的函数组之间进行传值。
函数可以访问全局数据对象,也可以访问自己的接口参数和局部变量。
函数的接口包含输入和输出,修改和异常。里面有一个passvalue,和value一样,将值复制了一份。
如果不是按value传送,就是按引用传送。
有一个optional,是可选的,如果这个参数可选可不选,就要在这里打一个对勾,这样在调用时就可以不用赋值。
函数调用
使用关键字,CALL FUNCTION 语句进行调用。
exporting参数在调用时,对应的是importing参数。
importing参数在调用时,对应的是exporting参数。
左边是函数接口各个参数的名字,也是形式参数。右边你要传递进去的参数。如果漏写或者多写了参数。语法检查是没有问题的。这里执行的是一种弱检查。这里需要人工检查。
为了防止拼写错误,可以使用向导来生成。直接将函数拖拽到主程序中。
另一种方法是使用pattern来生成
这样调用代码,所有接口参数和异常都会被列出来。
如果函数有异常还需要进行异常的处理。
异常处理
函数如果有异常的发生,异常抛出的值会放在,sy_subrc系统字段里面。如果不抛出就会等于0.抛出就会等于异常的值。在后续的调用中,可以根据异常进行相应的处理。
也可以为一些可能的异常设置一个返回码,这样做,列出形式异常others。
调用时,应该获所有异常,并在程序中做出反应,如果一个异常被引发而没有获取,就会发生一个运行时错误。
如何创建函数
因为函数是在函数组里面的
所以要先去创建函数组。
创建函数组
进入se80
搜索函数组,然后给框里面输入自己要创建的函数组名称。
点击确认,如果这个函数组不存在,系统询问你是否需要创建,选择是
输入短文本进行描述,然后保存
最后把它分配给一个开发包
输入请求
此时函数组就创建好了,可以创建函数了
创建函数
进入对象浏览器,选择函数要放的函数组,然后右键创建,功能模块
这里录入函数的名字,和短文本描述。
进入这个函数
顶栏可以设置各种参数,代码维护在源代码部分。
BAPI
BAPI是商业对象知识库,是SAP系统的一个业务对象知识库。
商业对象是一个类和相应的SAP表或者表层级。
我们可以调用BAPI来访问相应的表,所以BAPI是访问SAO系统中数据的通道。
右边灰色的图是外部系统,左边是SAP系统,外部和SAP进行数据交换,就要使用BAPI函数。
BAPI通常为商业对象的基础功能存在
比如:创建对象,检索对象属性,修改对象属性,列出对象属性。
BAPI封装在一个能被远程调用的函数模块中,因为BAPI能够被SAP系统的ABAP程序调用,同时能够被系统外程序调用。
有一些BAPI有一些重要的方法名称
如何查询和使用BAPI?
可以使用BAPI浏览器。
命名规则,必须满足如下技术要求,
命名规则BAPI——商业对象名。
能够远程调用。
不能包含用户信息和对话。
接口结构类型来自ABAP字典
不能包含修改参数
不能引发异常:错误通过特殊的输出参数return 报告给用户。
如果要同一个系统内表使用BAPI,那么必须直接调用相关的函数模块。
5.函数模块化操作
创建函数组
进入se80
搜索函数组,然后给框里面输入自己要创建的函数组名称。
点击确认,如果这个函数组不存在,系统询问你是否需要创建,选择是
输入短文本进行描述,然后保存
最后把它分配给一个开发包
输入请求
此时函数组就创建好了,可以创建函数了
创建函数
进入对象浏览器,选择函数要放的函数组,然后右键创建,功能模块
这里录入函数的名字,和短文本描述。
进入这个函数
顶栏可以设置各种参数,代码维护在源代码部分。
看函数名右边,目前显示未激活
标签页
属性
先看处理类型,有常规和远程模块、
导入
函数被调用是传入函数的变量,可以是单值,结构,甚至列表。
命名通常为IV+什么
类型部分,如果不是对象类型的,就选type
等学了面向对象就可以选下面了。
关联类型:这里使用一个全局的数据类型,这里选BNAME
缺省值:如果没有赋值,就有一个默认值。
可选:在主程序中调用时是可以不选这个的。
值传递:这个变量是把值传递给参数,按值传递,修改不同步。
导出
函数可以通过这些参数,将函数的运算结果,传递给调用它的参数。
通常使用EV命名开头
它没有可选的选项,因为他全部的参数都是可选的
正在更改
表示引用传递的参数
通常CV开头
表
还没学列表,后面说
例外
其实就是异常。
源代码
实现逻辑的地方
可以看到,前面输入的参数,现在都出现在了注释中
下面在代码中操作这几种数据类型。
对返回参数进行一个赋值。
再点击上面测试,进行代码测试。
会让你输入导入参数。
然后点击执行按钮
发现成功返回了。
测试时也可以在函数中下断点。
所以函数可以单独调试。
程序调用函数
函数在程序中如何进行调用。先打开一个程序。
点击模式,然后录入程序的名称。
点击确认,代码就出现了
函数参数名字都被准确的放进来了。选了可选的参数都没有被注释。
输入一些参数进行测试
运行过程中遇到了问题。
分析了一下感觉可能时IV1变量的类型设置的有问题,哪里应该使用字典里面的类型,我目前还没有学习到,先将这个类型删除掉看是否可以跑起来。
发现还是类型出现了问题。
检查类型,发现自己把BNAME类型。写成了ENAME类型。真是服啦。
重新进行测试,看看类型是否符合。
成功了。太不容易了。第一次写函数就寄了,以后得多加小心。注意类型。
REPORT z_yiting_12061.
DATA : GV_PARA1 TYPE BNAME.
DATA : GV_PARA2 TYPE CHAR1.
DATA : EV_PARA2 TYPE BNAME.
GV_PARA1 = 'name'.
*当前登录用户账号
CALL FUNCTION 'Z_YT_F_12081'
IMPORTING
EV_PARA1 = EV_PARA2
EXCEPTIONS
NOT_FOUND = 1
OTHERS = 2
.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
WRITE /.
WRITE EV_PARA2.
Bug总结
BUG时间:12.8。
BUG地点:学习在主程序中调用函数。
BUG描述:函数参数类型和主程序中的变量类型不符合。
BUG原因:自己因为不熟悉ABAP字典类型,导致写错了。
BUG解决思路:第一时间感觉是自己写法有问题,传入字符串传的不对,都改成可传可不传后,发现还有问题,考虑编辑器和视频教学版本不一致,字典类型写法可能有问题。最后检查变量类型,进行比对,发现BUG原因,是自己写错了。已处理。
6.本地类模块化
目标:能够在程序中定义,调用和执行本地类。
本地类的定义
开头使用关键字,class 后面加类名称,然后DEFINITION ,表示类的定义
以ENDCLASS 结尾。
里面有两个模块,一个共有的一个私有的。
下面的使用了关键字IMPLEMENTATION,表示类的实现。
类的属性描述和方法signature信息被放在定义块中,而实现块只包括类的方法的实现代码。
下图是一个公共静态方法的定义,因为方法位于类定义的public段,多以是公共方法,需要定义实例化的方法,使用METHODS。
CLASS-METHOD后面跟方法名称,如果这样写就算一个静态方法,如果只有一个METHOD就是一个实例化方法,调用时需要create Object
下面也是key value形式的参数
然后在实现部分进行实现。
参数如果想可选可不选,就使用option进行定义参数,default能够指定一个初始值。
本地类的调用
使用关键字CALL METHOD
然后输入类名称方法名和参数
本地类的练习
登录系统打开一个程序
先大好框架并进行检查
简单进行补全
在下面要加一个事件
START-OF-SELECTION
如果不使用,下面的代码就会混在一起无法执行。
告诉程序定义已经完成,后面是执行部分。
实例化这个类
DATA : LCL TYPE REF TO LC_T01.
CREATE OBJECT LCL.
执行完后本地就有了个实例类
下面使用call 调用本地类方法。
运行发生了报错,原因是使用了不匹配的类型。
使用一个BNAME的类型进行赋值
这下就ok了
代码
REPORT z_yiting_12061.
CLASS LC_T01 DEFINITION.
PUBLIC SECTION.
DATA:GV_ATTR1 type I.
METHODS MT_TEST01 IMPORTING IV_ATTR1 TYPE BNAME.
PROTECTED SECTION.
ENDCLASS.
CLASS LC_T01 IMPLEMENTATION.
METHOD MT_TEST01.
GV_ATTR1 = 100.
WRITE /.
WRITE IV_ATTR1.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA : LCL TYPE REF TO LC_T01.
DATA : GV_NAME TYPE BNAME.
CREATE OBJECT LCL.
GV_NAME = SY-UNAME.
CALL METHOD LCL->MT_TEST01( EXPORTINg IV_ATTR1 = GV_NAME ).
WRITE /.
WRITE LCL->GV_ATTR1.