模块化:事件和子程序
ABAP/4的模块单元
ABAP/4有三种模块单元:
- Event:事件
- Subroutine:子程序
- Function module:功能模块
事件
Table 17.1 ABAP/4 Events
Category
| Events
|
Driver
| initialization
|
User
| at line-selection
|
Program
| top-of-page
|
子程序
定义子程序的语句
form s [tables t1 t2 ...]
[using u1 value(u2) ...]
[changing c1 value(c2) ...].
---
endform.
这里:
- s 是子程序名称
- t1, t2, u1, u2, c1, 和 c2 是参数(parameter)
- tables 允许内表作为参数传递
- value 不能用在tables后
- The value addition can be applied to any variables passed via using or changing.
- --- 代表任意行数的代码
注意事项:
l 所有子句都是可选的
l 子句的顺序不可颠倒
l 每个子句最多只能出现一次,但子句后的参数可以有多个
l 参数之间用空格分隔
l tables的参数只能是内表,不能是数据库表
l 一个子程序可以调用另一个子程序
l 支持递归,一个子程序可以调用它自己,也可以调用调用它的子程序
l 子程序的定义不能嵌套,即不能在一个子程序内定义另一个子程序
调用子程序的语句
perform a) s
b) n of s1 s2 s3 ...
[tables t1 t2 ...]
[using u1 u2 ...]
[changing c1 c2 ...].
这里:
- s, s1, s2, s3, 是子程序名称
- n 是数值变量
- a) 和b) 只能选者其一
- a) 和b) 中都可出现tables, using, 和 changing
- perform语句中不能用value()
- 在b)中执行的是第n个子程序
在任何时候都可以用下面的语句退出子程序:
- exit 如果不在循环语句内,就退出子程序,执行perform后的下一语句;如果在循环语句内,则退出循环
- check 同上
- stop 退出子程序,触发end-of-selection事件
全局变量和局部变量
在子程序外部用tables或data语句定义的变量称为全局变量。
在子程序内部用local、data或statics定义的变量称为局部变量。
Tables定义的总是全局变量,在子程序内用local代替tables定义局部变量。用local定义的变量可以在被调用的子程序中使用,用data或statics定义的变量则不能。使用statics定义的局部变量在子程序结束时不会被释放,仍可被它自己使用,这样的变量在第一次调用该子程序时初始化(分配内存和赋初值),在后面调用时会保留上一次调用后的值。使用data定义的局部变量则不同,在每次调用时都要初始化。
了解功能组
功能组是包含了功能模块的程序。R/3预置了5000多个功能组,总共有30000多个功能模块。
功能组的标识符由4个字符组成,自定义功能组的标识符必须以Y或Z开头。创建功能模块的事务代码是SE37-Function Builder(SAP menu-Tools-ABAP Work bench-Overview),查看功能库的事务代码是SE84-Information System (SAP menu-Tools-ABAP Work bench-Development)。SE84可以看到所有信息。
功能模块与子程序类似,用语句
function fName
endfunction
定义。用语句
call function 'F'
[exporting p1 = v1 ... ]
[importing p2 = v2 ... ]
[changing p3 = v3 ... ]
[tables p4 = it ... ]
[exceptions x1 = n [others = n]].
这里:
- F 是功能模块名称
- p1 到 p4 是在功能模块接口中定义的参数名
- v1 到 v3 是在调用程序中定义的变量或字串名
- it 是在调用程序中定义的内表
- n 任何整数,不能是变量
- x1 是功能模块中抛出的异常名
调用。