了解ABAP
SAP的三层体系结构
ABAP语法概述
ABAP语言的基本元素
ABAP的语法格式
结构类型和结构体
内表
数据库操作
ABAP:(Advanced business applicationprogram),是一种高级企业应用编程语言,它支持封装性和继承性,封装性是面向对象的基础,而继承性是建立在封装性基础上的重要特性。它适合生成报表,支持对数据库的操作,如:SQLServer,Oracle,DB2等主流数据库系统。
SAP三层体系结构:
表现层(PresentationLayer):这是SAP用户和R/3系统交流 的接口,用户在这一层对SAP系统进行操作。这层将用户的命令或者操作传送给R/3系统,然后系统进行相应的处理后把数据返还给用户。
应用层(ApplicationLayer):这层包括一个或者多个应用服务器和一个消息服务器。每一个应用服务器包括一系列服务以便运行应用程序。所有的服务分置在这些应用服务器之中,其实用户需要的只是其中的一个应用服务器,多个服务器之间传递信息以决定用户到底需要的是哪个服务器的服务。
数据库层(Database Layer):这里是SAP系统的核心,存放了所有SAP系统的数据。
语法概述:
ABAP基本语法特点:
由各自独立的语句构成;
每个语句的第一个单词必须是ABAP关键字;
单词之间至少要用一个空格分隔;
每个语句结束必须要用句号;
支持分块缩进,便于阅读;
一个语句可以跨多行,只要不遇到句号,就认为是一个延续的语句;
可以把多个语句放在一行;
ABAP不区分大小写,关键字和用户操作数都一样,为了便于阅读,一般把关键字大写,而操作数小写;
由于编程的时候随时切换大小写比较麻烦,可以在ABAP编辑器中用“规范化打印机”按钮来自动转换;
如果连续多行的第一关键字相同,可以使用链语句,链语句的方式减少输入。
注释:
注释行由第一列的星号(*)开头,并且必须写在第一列,前面不能有空格;
编译器忽略注释行,不会执行;
在行末的注释用双引号(”)作为前导。
数据类型:
D:日期类型,格式为YYYYMMDD,长度为8;
T:时间类型,格式为HHMMSS,长度为6;
I:整数类型,长度为4;
F:浮点类型,长度为8;
STRING:变长字符串类型;
XSTRING:变长字节序列类型;
C:字符串类型,定义变量时指定字符个数;
N:数字字符串类型,定义变量时指定数值字符个数;
X:字节序列类型,定义变量时指定字节数;
P:组合数值类型,定义变量时指定长度和小数点后位数。
ABAP运算:
数值运算(在ABAP中数学表达式可以任意多层嵌套)
--算术运算
--数学函数
--时间日期运算
逻辑表达式
--通用逻辑运算符
EQ(=) NE(<>) LT(<)LE(<=) GT(>)GE(>=)
--IS操作符
IS INITIAL 检查字段是否为初始值
IS ASSIGNED 检查字段是否被分配
--BETWEEN操作符
--组合逻辑表达式
AND 与 OR或 NOT 非
ABAP程序的关键字:关键字是语句的第一个词,它决定整个语句的意义,有四种不同类型的关键字。
1.说明性关键字
TYPES,DATA,TABLES,这些关键字说明定义数据类型或者说明程序可以访问的数据对象。
2.事件关键字
ATSELECTION SCREEN;
START-OF-SELECTION;
ATUSER-COMMAND;
这些关键字在ABAP中定义处理块,处理快是当特定事件发生时进行处理的语句组。
3.控制关键字
IF,WHILE,CASE
4.操作关键字
WRITE,MOVE,ADD
用于处理数据
语法格式:
定义数据对象
-DATAname TYPE type-name
例:DATAnumber TYPE I.
定义了一个对象number,其类型为I
DATA num TYPE I value 18.
定义了一个对象num,其类型为I,初始值为18
-TYPES:address TYPE C.
注:TYPES语句用来创建用户定义的基本数据类型和结构化的数据类型,通过TYPE定义的类型不能直接诶使用,需要通过DATA进行定义其对应的变量后才可使用。
如:DATA:address1 TYPE address.
语句链:如果连续多行的第一个关键字相同,可以使用链语句,链语句的方式减少输入
WRITEtext1.
WRITEtext2.
WIRTEtext3.
可以写成:WRITE:text1,text2,text3.
分支结构(IF,CASE)
使用IF的条件分支
IF <condition1>.
<statement block>
ELSEIF <condition2>.
<statement block>
ELSEIF <condition3>.
<statement block>
......
ELSE.
<statement block>
ENDIF.
例子:DATAflag TYPE c VALUE 'a'.
IFflag = 'a'.
WRITE /'true'.
ELSE.
WRITE /'error'.
ENDIF.
产生输出为:true
使用CASE的条件分支
基本语法:
CASE <f>.
WHEN <F1>.
<statement block>
WHEN <F2>.
<statement block>
WHEN <F3>.
<statement block>
WHEN ...
......
WHEN OTHERS.
<statement block>
ENDCASE.
例子:DATA:TEXT1 VALUE 'X',
TEXT2 VALUE 'Y',
TEXT3 VALUE 'Z',
STRING VALUE 'A'.
CASESTRING.
WHEN TEXT1.
WRITE:/'String is',TEXT1.
WHEN TEXT2.
WRITE:/'String is',TEXT2.
WHEN TEXT3.
WRITE:/'String is',TEXT3.
WHEN OTHERS.
WRITE:/'String is not',TEXT1,TEXT2,TEXT3.
ENDCASE.
产生输出:String is not X Y Z
这里,执行WHEN OTHERS后面的语句块,因为STRING的内容“A”不等于“X”、“Y”或“Z”。
循环结构(DO,WHILE)
使用DO的无条件循环:
DO
[<n> TIMES]
[VARYING <f> FROM<F1> NEXT<F2>].
<statement block>
ENDDO.
TIMES 循环次数;
VARYING 选项在每次循环中给变量 <f> 重新赋值;
<n> 可以是文字或变量,如果<n> 是0或负数,系统不执行该循环;
使用DO语句时要避免死循环,如果不使用TIMES选项,则在语句块中至少应包含一个EXIT、STOP或REJECT语句,以便系统能够推出循环。
例子:DO.
WRITE SY-INDEX.
IF SY-INDEX = 3.
EXIT.
ENDIF.
ENDDO.
产生输出:12 3
这里,处理3次循环,然后在EXIT语句后推出循环;
SY-INDEX代表循环次数。
使用WHILE的条件循环:
语法:WHILE<condition> [VARY<f> FROM<F1> NEXT<F2>].
<statement block>
ENDWHILE.
循环终止(CONTINUE,CHECK,EXIT)
--无条件终止循环:CONTINUE
DO 4 TIMES.
IF SY-INDEX = 2.
CONTINUE.
ENDIF.
WRITE SY-INDEX.
ENDDO.
输出结果:13 4
--有条件终止循环:CHECK <condition>
DO 4 TIMES.
CHECK SY-INDEX BETWEEN 2 and 3.
WRITE SY-INDEX.
ENDDO.
输出结果:2 3
注:condition的条件不为真时,跳出此次循环,继续下条循环
--完全终止循环:EXIT
DO 4 TIMES.
IF SY-INDEX = 3.
EXIT.
ENDIF.
WRITE SY-INDEX.
ENDDO.
输出结果:1 2
结构类型和结构体:
--结构类型由多个数据元素作为组件构成
--参照结构类型生成的数据对象称为结构体
--定义方式
TYPES | DATA: BEGIN OF structure,
k1 [TYPE type | LIKE dobj] ...,
k2 [TYPE type | LIKE dobj] ...,
......
kn [TYPE type | LIKE dobj] ...,
END OF structure.
或者TYPES| DATA structure TYPE str_type | LIKE str_dob.
TYPES| DATA structure TYPE dbtab.
--组件通过取组件运算符“-”进行访问,如:structure-comp
例子:TYPES:BEGIN OF address,
nameTYPEString,
street(30)TYPE C,
cityTYPEString,
END OF address.
DATAmy_add TYPE address.
my_add-name= 'yang qingshan'.
my_add-street= 'huangguoshu'.
my_add-city= 'anshun'.
write:my_add-name, my_add-street, my_add-city.
内表:内表是一个数据对象,在运行时内表可保存多个相同结构的数据,行数是动态的,系统可实时增加内表的大小。
内表的属性:
--几种数据表的访问:分为索引访问,键访问
--三种表的类型:标准表,排序表,哈希表
内表的定义:
TYPES | DATA itab {TYPE | LIKE}tabkind OF {linetype |lineobj}
[WITH key]
[INITIAL SIZE n].
--tabkind 内表种类
--linetype行类型
--key 表关键字
--n 初始内存大小
内表类型(一):
--标准表 STANDARD TABLE
具有逻辑索引
寻址操作通过关键字或者索引
--排序表 SORTED TABLE
具有逻辑索引
寻址操作通过关键字或者索引
按表关键字升序后存储
--哈希表 HASHED TABLE
没有逻辑索引
寻址操作只通过关键字
内表类型(二):
行类型:
基本类型结构体 内表
表关键字:
--行结构为结构体
WITH [UNIQUE | NON-UNIQUE] KEYcomp1 ... compn
--行结构为基本类型
WITH [UNIQUE|NON-UNIQUE] KEY TABLE LINE
--不指定关键字
WITH [UNIQUE | NON-UNIQUE]DEFAULT KEY
初始内存大小:
INITIALSIZE n
例子:创建一个内表
TYPES: BEGIN OF address,
street(20)TYPE C,
city(20)TYPE C,
ENDOF address.
DATA: BEGIN OF company,
name(20)TYPE C,
addressTYPEaddress,
ENDOF company.
DATA itab_company LIKE HASHED TABLE OF company WITH UNIQUE KEYname.
内表操作:
操作内表行:
--插入行 INSERT 语句
插入单行
INSERT line INTO itab INDEX index.
插入多行
INSERT LINES OF itab1[FROMn1][TO n2]
INTO [TABLE ]itab2[INDEX index]
--附加行 APPEND 语句
附加单行
APPEND line TO itab.
附加多行
APPEND LINES OF itab1 [FROM n1][TO n2] TO itab.
--读取行 READ 语句
利用索引读取
READ itab INTO wa INDEX index.
利用关键字读取
READ TABLE itab FROM key INTOwa.
--修改行 MODIFY 语句
根据索引修改
MODIFY itab [FROM wa][INDEX index]
[TRANSPORTING f1 f2 ...].
根据关键字修改
MODIFY TABLE itab FROM wa
[TRANSPORTING f1 f2 ...].
修改多行
MODIFY itab FROM wa TRANSPORTING f1 f2 ...
WHERE cond.
--删除行 DELETE 语句
通过索引删除
DELETE itab INDEX index.
通过关键字删除
DELETE TABLE itab FROMwa.
DELETE TABLE itab WITH TABLE KEY k1 = f1 ... ki = fi.
删除多行
DELETE itab [FROM n1][TO n2][WHERE<condition>]
--循环处理结果集合 LOOP 语句
Loop语句一条条的读出的数据行,写入 INTO 字指定的结构中,结构内容可用于输出或写回内表。
LOOP AT itab [INTO wa][FROM n1] [TOn2]
[WHERE<condition>].
<statement block>
ENDLOOP
表工作区:
创建表工作区:
--Tables t_name.
DATA:begin of t_name,
F type c,
Endt_name.
--表工作区就是其他语言的结构,像自定义的一个类型一样,但一旦创建一个内表之后,工作区就成了外界跟内表的交流口,每条记录的进入和取出都得通过它,并且清除它们的时候分开来清除。
数据库操作:
Open SQL
--完全集成到ABAP中的标准SQL子集中;
--只包括数据操纵(DML)
SELECT, INSERT, UPDATE, MODIFY, DELETE
--不包括数据定义(DDL)和数据控制(DCL)
提取数据 SELECT 语句
--选择单行数据:
SELECT SINGLE <result> INTO<target> FROM<source> ...
--选择多行数据:循环选择
SELECT [DISTINCT ]<result> ...
<statement block>
ENDSELECT
--选择多行数据:选择至内表
SELECT ... INTO TABLE itab.
插入数据 INSERT 语句
--插入单行数据
INSERT INTO dbtab VALUES wa.
INSERT INTO dbtab FROM wa.
--插入多行数据
INSERT dbtab FROM TABLE itab.
更新数据 UPDATE 语句
--更新单行数据
UPDATE dbtab SET f1 = g1 ... fi = gi WHERE<fix_key>.
* fix_key 全部表关键字段的值
或 UPDATE dbtab FROM wa.
--更新多行数据
UPDATE datab SET f1 = g1 ... fi = gi [WHERE<condition>]
或 UPDATE dbtab FROM TABLE itab.
添加或更新数据 MODIFY 语句
--添加或更新单行数据
MODIFY dbtab FROM wa.
--添加或更新多行数据
MODIFY dbtab FROM itab.
Native SQL
--包含 DDL, DML, DCL
--依赖特定数据库类型
--不具备好的可移植性
EXEC SQL [PERFORMING<form>].
<Native SQL statement> [;]
ENDEXEC.