ABAP内表
ABAP内表类似于一个结构体,可以用来保存从数据库表中查出来的数据。内表只是在内存中作为操作表数据载体,在java等语言中使用对象保存一条数据库记录,对象列表保存多条记录。ABAP中使用内表保存数据库表中的一条或多条记录。
1内表定义
方式1:
使用types定义结构类型:定义内表行结构
Types:begin of ,
type|like ,
…………
end of .
定义内表:
Data: type ( table| sorted table | hashed table ) of
[with non-unique default key]
[initial size ]
[with header line]
示例:
*"定义linetype
TYPES: BEGIN OFfirstLine,
id(8) type C,
name(20) type C,
age type I,
addr(30) type C,
end of firstLine."定义内表(不指定talbe类型默认标准table,标准表只能使用 with NON-UNIQUE DEFAULT KEYData: firstTabTYPE TABLE OFfirstLine
with NON-UNIQUE DEFAULT KEYINITIAL SIZE 20
WITH HEADER LINE
"定义sorted table WITH UNIQUE KEY,或with non-unique default key 指定是否使用重复key fieldData: firstTab1 type SORTEDTABLE OFfirstLineINITIAL SIZE 20
WITH HEADER LINE
WITH NON-UNIQUE DEFAULT KEY."定义hash table 必须指定 WITH UNIQUE key,key field不重复Data: firstTab2TYPE HASHED TABLE OFfirstLineWITHUNIQUE KEY id.INITIAL SIZE 20
WITH HEADER LINE.
方式2:
使用data定义结构体:定义行结构
Data:begin of ,
type|like ,
…………
end of .
定义内表:语法类似,只是将type关键字换成like关键字
示例:
"使用data定义结构体
DATA: BEGIN OFfirstLine1,
id(8) type C,
name(20) type C,
age type I,
addr(30) type C,
end of firstLine1."定义内表必须使用like table of
DATA:firstTab3 LIKE TABLE OFfirstLine1.DATA:firstTab4 LIKE SORTED TABLE OF firstLine1 WITH NON-UNIQUE DEFAULT KEY.DATA:firstTab5 LIKE HASHED TABLE OF firstLine1 WITHUNIQUE KEY id.
方式3:直接使用data定义内表
Data:begin of occurs ,
type|like ,
…………
end of .
示例:
"直接定义内表,带header line
DATA:BEGIN OF t_people OCCURS 0,
name typestring,
age type I,END OF t_people.
方式4:定义数据库表,结构体类型的内表:
Data: ( type | like ) [] table of ( 数据库表名 | 结构体名 )
[with header line]
示例:
"type:ABAP中使用types定义类型需使用type;ABAP提供的基本类型,结构体,数据库表,感觉和like区别不大
"like : 程序员定义类型,数据库表名
"根据数据库表定义内表
DATA:t_spfli LIKE TABLE OFspfli.DATA:t_spfli1 TYPE TABLE OFspfli."有表头行
DATA:t_spfli2 LIKE TABLE OF spfli WITH HEADER LINE.DATA:t_spfli3 TYPE TABLE OF spfli WITH HEADER LINE."可以是自己定义的数据库表,结构体,z_spfli 为自定义数据库表,结构体
DATA:t_test LIKE TABLE OFZ_SPFLI.DATA:t_test TYPE TABLE OF Z_SPFLI.
2内表表头行
根据内表是否具有表头行,我们的操作也不同。判断内表是否具有表头行我们一般判断定义内表时,是否有with header line 关键词,occurs定义的内表,具有表头行。
带表头行内表插入操作:直接使用append 语句插入
不带表头行内表插入操作:需要先定义一个结构体类型的工作区,然后将工作区赋值,通过append to
示例:
"直接定义内表,带header line
DATA:BEGIN OF t_people OCCURS 0,
name typestring,
age type I,END OFt_people."带headline的内表赋值
t_people-name = 'tang'.
t_people-age = 11."添加记录到t_people
APPENDt_people."没有表头行内表赋值
DATA:BEGIN OFl_people,
nameTYPE string,
ageTYPEI,END OFl_people."如果上面是使用types定义type,还需要定义一个工作区
"DATA:wa_people LIKE LINE OF l_people.
DATA:t_people LIKE TABLE OFl_people."内表赋值
l_people-name = 'tang'.
l_people-age = 10.APPEND l_people to t_people.
3内表赋值
内表初始化:使用refresh
内表和其他类型变量:
内表使用clear [];
clear 工作区初始化
clear
释放内存空间:free
"初始化内表
"清空内表,不能用于其他类型变量初始化
refresh firstTab."clear可以用于其他类型变量初始化
"如果内表有表头行,清空表头工作区。
CLEARfirstTab."refresh功能,清空内表
CLEARfirstTab[]."clear,refresh不会释放内存,free释放内表所占内存
FREE firstTab.
两个内表之间赋值,需要在循环中逐条赋值:
将内表表头行A赋值给B内表表头行
语法:move-corresponding to
语法:append
这个也可以用于两个工作区之间赋值
DATA:firstTab TYPE TABLE OF firstLine WITH HEADER LINE.DATA:firstTab1 TYPE TABLE OF firstLine WITH HEADER LINE.
firstTab-id = 1.
firstTab-name = '113'.APPENDfirstTab.
firstTab-id = 2.
firstTab-name = '114'.APPENDfirstTab."table之间赋值,这个语句必须两个都是具有表头行内表
LOOP ATfirstTab."这句只是将工作区值加入目标内表工作区,三种写法都可
MOVE-CORRESPONDINGfirstTab to firstTab1.*firstTab1[] = firstTab[].
*MOVE firstTab[] to firstTab1[].
*firstTab1 = firstTab[]. "这种写法只有firstTab1是不带表头行的内表才有效
*MOVE firstTab to firstTab1[]."这句报错
"将工作区保存到内表
APPENDfirstTab1.ENDLOOP.DATA:wa_line LIKE LINE OFfirstTab1.