一、面向对象
* 1.声明
* CLASS DEFINITION | IMPLEMENTATION | DEFERRED
* PUBLIC SECTION | PROTECTED | PRIVATE
* DATA | CLASS-DATA | METHODS | CLASS-METHODS
* TYPE REF TO | CREATE OBJECT
* 构造器:constructor | class_constructor
* 2.继承
* INHERITING FROM | REDEFINITION
* FRIENDS | ABSTRACT | FINAL
* me | super
* 3.多态
* = | ?=
* 4.接口
* INTERFACE | ALIAS
* 5.事件
* EVENTS XXX EXPORTING XXX | CLASS-EVENTS
* RAISE EVENTS XXX
* METHOD XXX FOR EVENT XXX OF XXX IMPORTING XXX
* SET HANDLER XXX FOR XXX | ALL INSTANCE
二、异常类
- Exceptions
- Class-Based
- CX_STATIC_CHECK
- CX_DYNAMIC_CHECK
- CX_NO_CHECK
- 异常消息类
- IF_T100_DYN_MSG
三、模块化
- SE38、SE37、SE24
- INCLUDE | MACRO
- 事件
LOAD-OF-PROGRAM(程序加载前执行 一般进行一些初始化操作)
| START-OF-SELECTION(程序加载后执行)
end-of-selection 过时
- FORM | FUNCTION MODULE | METHOD
四、新语法
* NEW | CAST | REF
* VALUE | CONV | EXACT
* CORRESPONDING | FILTER
* REDUCE
* COND | SWITCH
面向对象
待续
模块化
From子例程(代码块)[se38创建]
以下是子程序定义的一般语法。
FORM <subroutine_name>.
<statements> "这里面声明的变量为局部变量
ENDFORM.
我们可以通过使用PERFORM语句调用子例程。 控制跳转到子例程< subroutine_name>中的第一可执行语句。 当遇到ENDFORM时,控制跳回到PERFORM语句之后的语句。
示例:
REPORT ZSUBTEST.
PERFORM Sub_Display.
* Form Sub_Display
* --> p1 text
* <-- p2 text
FORM Sub_Display.
Write: 'This is Subroutine'.
Write: / 'Subroutine created successfully'.
ENDFORM. " Sub_Display
结果
Subroutine Test:
This is Subroutine
Subroutine created successfully
FUNCTION MODULE 功能模块[se37]
要了解如何创建功能模块,必须探索函数构建器。 您可以找到事务代码为SE37的函数构建器。 只需用通配符键入功能模块名称的一部分,以演示可以搜索功能模块的方式。 键入* amount *,然后按F4键。
![](https://i-blog.csdnimg.cn/blog_migrate/c48c4682b25985afe2e17c16458f63a1.jpeg)
搜索结果将显示在新窗口中。 功能模块显示在具有蓝色背景的行中,其功能组以粉红色的行显示。 您可以使用对象导航器屏幕(事务SE80)进一步查看功能组ISOC。 您可以看到功能模块列表以及功能组中保存的其他对象。 让我们考虑函数模块SPELL_AMOUNT。 此功能模块将数字转换为字。
CALL FUNCTION <函数模块名>"调用模块
INCLUDE程序
INCLUDE程序是用于模块化源代码的全局存储库对象。 它们允许您在不同的程序中使用相同的源代码。 包含程序还允许您以有序的方式管理复杂的程序。 为了在另一个程序中使用include程序,我们使用以下语法:
INCLUDE <program_name>.
INCLUDE语句具有与复制包含程序< program_name>的源代码相同的效果。 进入另一个程序。 由于包括程序不能独立运行,它必须内置到其他程序中。 您也可以嵌套包含程序。
INCLUDE程序创建se38中创建zdemo程序
report zdemo.
include zdemo_top."双击include程序名称进入创建
include zdemo_main.
define宏(se38创建)
语法
DEFINE <macro_name>.
<statements>
END-OF-DEFINITION.
宏就是一个词代替一堆语句的效果.
示例:
define demo.
write 'demo'.
end-of-definition.
demo.
define demo1.
write:':','&1','&2','&3'."最多支持加参数9个
end-of-definition.
demo1'A''B'.
结果
demo:AB
ABAP/4
中所谓的模块在一般语言称之为子程序,其数据传递方式皆相似,如传值调用
(
CALL BY VALUE
),参数调用(
CALL BY REFERENCE
)等,可分成以下几个部分:
1.
宏块(
Macro Block
)
2.
包含程序(
Include Program
)
3.
子程序(
Subroutine Program
)
4.
函数模块(
Function Module
)
宏块(
Macro Block
)
在程序中可以定义一段宏代码,并且可以传入参数,参数占位符
(Placeholder)
可自
&1, &2
至
&9
1.
宏的定义
DEFINE <macro>.
<
宏的内容
>
END-OF-DEFINITION.
2.
宏的调用使用
<macro> [<p1> <p2>….]
<p1>
为传入宏的参数值,在参数间至少要给予一个空格
示例:利用宏计算
N
次方
DATA RESULT TYPE I.
DEFINE MULTI.
RESULT = &1 ** &2.
WRITE: / '&1 ^ &2 = ', RESULT.
END-OF-DEFINITION.
MULTI 3 4.
执行结果为
3 ^ 4 = 81
包含程序(
Include Program
)
1.
在
ABAP/4
中可以使用
Include
语句加载另一个程序的全部语句
,通常用于共享数
据项的声明,很类似
C
的
Include
头文件的做法。
语法:
INCLUDE <include program file>
示例:
程序
YStart
的内容如下
:
***INCLUDE YSTART.
WRITE: / 'User Name = ', SY-UNAME.
WRITE: / 'Host Server = ', SY-HOST.
另一程序如下:
PROGRAM YTEST1.
INCLUDE YSTART. "
载入
YSstart
的所有内容
执行结果:
User Name = MIS-CHOU
Host Server = deidv01
2.
全局变量声明应用
语法:
DATA: BEGIN OF COMMON PART [<name>],
<data
声明
>
END OF COMMON PART [<name>]
此常使用在
Include
的文件中,如
***INCLUDE INCOMMON.
DATA: BEGIN OF COMMON PART NUMBERS,
MID(8),
MNUM TYPE I,
END OF COMMON PART NUMBERS.
子程序(
Subroutine Procedure
)
在
ABAP/4
子程序的调用可分成内部调用和外部调用,前者撰写在程序中,后者存在另一
程序中,通常为专存放子程序的公用程序集,可提供给不同的程序调用。
1.
子程序的声明
FORM <subr> [<pass>].
<subroutine statement block>
ENDFORM.
2.
调用的方法
(1).
内部调用
语法:
PERFORM <subr> [<pass>]
示例:
NUM1 = 100. NUM2 = 200.
PROFORM ADD.
FORM ADD.
SUM = NUM1 + NUM2.
WRITE: / 'NUM1 + NUM2 = ', SUM.
ENDFORM.
执行结果:
NUM1 + NUM2 = 300
(2).
外部调用另一程序
语法:
PERFORM <subr>(<prog>) [<pass>] [IF FOUND]
<subr>:
子程序名称
<prog>:
存放子程序的程序名称
IF FOUND:
找到才执行
示例:
PROGRAM FORMPOOL.
FORM HEADER.
WRITE: / 'USER NAME: ', SY-UNAME.
ENDFORM.
在程序中调用
HEADER
子程序
PROGRAM YTEST1.
PERFORM HEADER(FORMPOOL) IF FOUND.
(3).
外部调用另一专存放子程序的程序文件
语法:
PERFORM (<fsubr>) [IN PROGRAM (<fprog>) [<pass>] [IF FOUND]
示例:
存放子程序的程序文件
PROGRAM FORMPOOL.
FORM SUB1.
WRITE: / 'USER NAME:', SY-UNAME.
ENDFORM.
FORM SUB2.
WRITE: / 'HOST SERVER:', SY-HOST.
ENDFORM.
在程序中调用
FORMPOOL
中的
SUB2
子程序
SUBNAME = 'SUB2'.
PROGNAME = 'FORMPOOL'.
PERFORM (SUBNAME) IN PROGRAM (PROGNAME) IF FOUND
参数值的传递
在
ABAP/4
中参数的传递可分成
1.
参数调用(
Call By Reference
)
传参数时将数据的存放地址
(address)
传至参数中,也就是子程序中的参数变量与外部实际
变量共享地址内的值,又称为传地址调用(
Call By Address
),若在子程序中地址中的值改变
了,外部实际变量的值也会跟着改变。
语法:
FORM <subr> [USING <f1> <f2>…] [CHANGING <f1>…]
PERFORM <subr> [USING <f1> <f2>…] [CHANGING <f1>…]
Using
之后接在子程序中不会改变的变量,
CHANGING
接会改变值的变量但实际上
USING
之后的参数在子程序中也可将值改变
示例:
SUM = 0.
NUM1 = 100. NUM2=200.
PERFORM ADD USING NUM1 NUM2 CHANGING SUM.
WRITE: / NUM1, NUM2, SUM ' SUM
由
0
变成
300
FORM ADD USING NUM1 NUM2 CHANGING SUM.
SUM = NUM1 + NUM2.
ENDFORM.
执行结果
:
100 200 300
2.
传值调用(
Call By Value
)
传参数时将数据的值复制一份至另一地址中,所以在子程序中参数变量值改变,并不会影
响外部实际变数的值。
语法:
FORM <subr> USING VALUE(<f1>…)
使用
VALUE(<f1>)
表示
<f1>
是
Call By Value
的传递
PERFORM <subr> USING <f1>
示例:
SUM = 0.
NUM1 = 5.
PERFORM MULTI USING NUM1 CHANGING SUM.
WRITE: / NUM1,SUM "NUM1
值还是
5, SUM
由
0
变成
120
FORM MULTI USING VALUE(NUM1) CHANGING SUM.
SUM = 1.
WHILE NUM1 > 1
SUM = SUM * NUM1.
NUM1 = NUM1 – 1.
ENDWHILE..
ENDFORM.
执行结果:
5 120
3.
传值调用并返回结果(
Call By Value and Return Result
)
传入参数值的方式同
Call By Value
,但在子程序结束执行时会将传入的参数值复制一份传
回给外部实际变数。
语法:
FORM ….. CHANGING VALUE(<f1>)
PERFORM …. CHANGING …. <f1>
示例:
SUM = 0.
NUM1 = 100. NUM2=200.
PERFORM ADD USING NUM1 NUM2 CHANGING SUM.
WRITE: / NUM1, NUM2, SUM " SUM
由
0
变成
300
FORM ADD USING NUM1 NUM2 CHANGING VALUE(S).
S = NUM1 + NUM2.
WRITE: / NUM1, NUM2, SUM "
得到结果为
100 200 0
ENDFORM.
执行结果:
100 200 0 "
在子程序中
SUM
值尚未改变
100 200 300 "
返回程序时,将变量
S
的值复制给
SUM
,所以
SUM
值变成
300
FORM ADD tables itab type scarr.
endform.
perform add table itab1.
传表.
子程序的控制
1. CHECK <Condition>
CHECK
之后条件成立才继续往下子程序语句
示例:
PERFORM SUB1.
CHECK NUM1 < 10.
WRITE / NUM1.
NUM1 = NUM1 + 1.
ENDFORM.
2. EXIT
强迫结束子程序执行,返回上一层程序