模块化编程
模块化编程包括:
- 函数
- 子例程
- 宏
- 类
参数
- 用于在程序和模块之间交换数据
- 定义模块化单元的时候就确定了可以使用那些参数
参数分类
- 输入参数——是用来传递数据给模块化单元
- 导出参数——把模块化单元中的数据返回给调用程序
- 变更参数——是把数据传递给模块化单元并返回更改后的数据
函数
Function
- Function模块是具有全局可见性的特殊程序。
- Function模块只能在Function Group中定义并使用。
Function Group
- Function Group中可以包含一个以上的函数,是对某一类对象的操作。
- Function Group专门用作Function的主程序。
Function Group的维护
T-Code:SE37
执行创建修改维护(以ZFG开头)
- 菜单—Goto—>Function Groups—>Create/Change/Display/Delete Group
Function Group的显示
T-Code:SE80
在对象浏览器中找到Function Group显示其结构
Function的创建
T-Code:SE37
执行创建修改维护(以ZFM开头)
- 输入模块名称
- 选择所在Function Group,输入Function的描述
维护Function的属性
- 简短描述、所属的函数组
- 处理类型、开发类
函数处理类型
- Normal Function Module(一般函数模块):只能用于当前系统。
- Remote fahiger Baustein(RFC远程模块):可用于其他系统,SAP系统,或者非SAP系统,调用时指定目的地,目的地在SM59配置。
- Update Module(更新函数):用于数据库数据更新
接口元素
- 输入参数:当Function被调用时,通过输入参数向Function传递变量或者数值,若一个输入参数是可选的(Optional),则该参数可以不传递。
- 输出参数:当Function被调用时,通过输出参数接收从Function输出的数据,输出参数始终是可选的(Optional)。
- 变更参数:通过变更参数向Function传递变量,在Function中可以改变可更改参数的值,并且返回更改后的结果到程序中。
- 表:是通过内表进行参数传递,处理方式与更改参数一样。
- 异常:处理Function中可能发生错误的情况,调用程序检查是否发生了错误,然后采取相应的措施。
使用可选参数
- 可以将导入、更改和表参数标记为可选
- 调用Function时不必为这些参数提供值
- 可以为可选的导入和更改参数定义缺省值,当调用程序不可传输任何值时,可使用这些缺省值
- 导出参数始终是可选的
Function的异常
- 函数模块可引起异常,以便将错误情况通知调用程序。
- 必须在函数模块接口中声明异常,为函数模块可能引起的每个异常选择一个名称。
触发异常
RAISE <exception>.
- 如果在Function的调用中指定异常 exception,则控制直接返回调用程序。
- 如果未列出异常,则程序会因运行时错误而终止。
Function的异常处理
在处理Function时出现应用程序错误(例如:值不适于计算),函数模块就会提出相应的异常。
- 出现异常会取消对Function的处理,系统会返回到调用程序。
- 可在Exception中为可能的异常明确设置返回代码(sy-subrc),同时指定OTHERS,则会为所有未明确列出的异常分配一个共享的返回码。
维护Function的源代码
- Function和ENDFunction语句表示Function的开始和结束。
- Function的接口显示为生成的注释行,这些行在更新接口时自动更新。
Function的调用
- 使用CALL FUNCTION语句调用(后跟名称)
- Function的名称采用单引号内包含大写字母的形式
- 在EXPORTING块中,系统会将值传递给Function的导入参数
- 在IMPORTING块中,可使用导出参数访问调用结果
前导零
*例如lv_vbeln = '4969';表里面是0000004969
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = lv_vbeln
IMPORTING
output = lv_vbeln.
常用Function
- GUI_DOWNLOAD:下载文件中的数据
- GUI_UPLOAD:上载数据到文件夹
- WS_FILENAME_GET:获得文件名
- CLOI_PUT_SIGN_IN_FRONT:将负号前置,SAP默认将负号放在数字后面
- CONVERSION_EXIT_ALPHA_INPUT:数字前导零
子例程
子例程概述:
子例程是源代码里具有一定独立功能的模块单元。
类型
- 内部子例程:内部子例程的源代码与调用程序位于同一个ABAP程序中
- 外部子例程;外部子例程的源代码位于另外的ABAP程序中,而不是位于调用程序内部。
注意:子例程中应避免使用主程序的变量,应使用参数;在子例程中定义的变量,只在子例程中有效
子例程的定义
以FORM开头,以ENDFORM结尾
语法:
FORM <subroutine> [<pass>].
<statement block>
ENDFORM.
- subroutine用于定义子例程名
- pass参数,可选
- 子例程可以访问其他主程序中声明所有数据对象。
- 一般都将同一程序中定义的所有内部子例程都集中定义在程序的末尾。
- 子例程的定义不能互相嵌套。
形参和实参
- 形参(formal parametes):子例程定义期间用FORM语句定义的参数(多个实参使用空格隔开)。
- 实参(actual parameters):子例程调用期间用PERFORM语句指定的参数。
注意:在子例程中一般把 USING作为输入参数;把CHANGING作为可变更参数,输出参数。形参尽量不要用实参。
参数的传递类型
将主程序变量传递给子例程形式参数(实参和形参的个数要相同)
-
值传递:子例程中参数变量的值的改变,不影响外部程序实际变量的值。USING VALUE(参数名),多个参数多个VALUE。
-
引用传递:若子例程中的参数变量的值发生了改变,那么,外部程序的实际变量的值也发生改变。CHANGING 名或USING 名
-
值传递并返回结果:传递参数的方式同值传递相同,但在子例程执行过程中,变量值不改变,而结束执行后,把变量的最终值返回。
注意:指定单一变量时不用指定类型,但如果是内表或结构一定要用TYPE指定类型。
局部和全局变量
全局变量:
- 在主程序中定义的变量
- 这些变量在整个主程序和调用的每个子例程中都可进行处理
局部变量
- 在子例程中定义的变量称作局部变量
- 这些变量只存在于相关的子例程中(与形参相同),只能在子例程中使用。
注意:
- 当全局变量和局部变量同名时,在子例程中局部变量起作用,而全局变量的值不改变。
- 在子例程中对全局变量的值进行修改以后,其修改的值仅存在于子例程中(值传递)
子例程的调用
可以调用代码位于同一ABAP程序中的子例程(内部调用)
也可调用代码位于其它ABAP程序中的子例程(外部调用)
内部调用语法:
PERFORM <subroutine> [USING <actual intput list>]
[CHANGING <actual output list>] ...
注意:调用时参数个数要一样,如果不想传参用空格预留出来
外部调用语法:
PERFORM form IN PROGRAM prog
T-Code调用:
通过CALL来实现对某T-Code中相对应的子例程的调用
CALL TRANSACTION 'T-Code'
SUBMIT调用:
在ABAP中可以直接调用具体程序来实现该程序的所有功能,并提供程序执行中所需要输入的字段及参数
SUBMIT <程序名>.
...USING SELECTION-SCREEN <SCR>. "调用子屏幕
...VIA SELECTION-SCREEN. "显示所调用程序的初始屏幕
...AND RETURN. "调用指定程序执行后可返回上一个屏幕
宏(Macros)
宏是一段独立的代码,能实现数据的运算与输出,功能与子例程类似,主要应用于同一程序中某些重复的运算,以简化代码
语法:
DEFINE INCREMENT. "INCREMENT为宏的名称
...
END-OF-DEFINITION.
- 与子例程不同的是,宏通过&N(N为索引)接收传入的参数,不需要定义接收参数的类型及格式。
- 宏参数最多可以包含九个(&1,&2,…,&9)
- 宏只能被本程序中定义于宏后面的语名所调用,宏一般定义于程序的最开始
Include Program(包含程序)
子程序
在ABAP/4中可以使用Include加载另一个程序,通常用于共享数据项的定义
语法:
INCLUDE <include program file>
- 包含的程序中不能包含 PROGRAM 或 REPORT 语句
- 包含程序不能调用自身
- 包含的程序必须包含完整语句
Global变量定义应用
将数据声明为公共部分
为了使程序更透明,移植性更好,在调用程序和子例程之间进行数据传递时,应尽量选择在内部和外部子例程中,明确指定所需的及可能更改的数据。
语法:
DATA:BENGIN OF COMMON PART [<name>],
<data declaration>,
END OF COMMON PART [<name>].