内表是内存中建立的一个临时表,你可以在程序运行时对表的数据进行增删改查,程序跑完了,内表就会被释放。
内表有三种类型:
1.STANDARD 标准表
2.SORTED 排序表
3.HASHED 哈希表
标准表在增加或者插入数据时并不对数据的地址进行重新排序存储
排序表在增加和插入数据时要对数据存储的地址进行重新排列
哈希表只能通过关键字访问,在检索数据里与数据数无关
WITH [UNIQUE]|[NON-UNIQUE] KEY COMP1…COMPn
WITH [UNIQUE]|[NON-UNIQUE] KEY TABLE_LINE定义关键字
排序表可以使用NON-UNIQUE或者UNIQUE表关键字,哈希表不能使用NON-UNIQUE表关键字,且必须指定UNIQUE关键字,在内表中如果不指定任何表关键字,则使用DEFAULT KEY。扁平结构内表默认表关键字是非数字和非内表的组件字段
在定义内表时使用WITH HEADER LINE选项表示定义内表时也同时定义同名工作区,如果在使用的过程中不能明确的分辨出使用的是内表或者是工作区,那么在名称后加上"[]"表示明确的使用内表
工作区:内表按照行进行访问,必须使用某个区域作为表格互相传输的接口
从内表读取数据时,已定址的行内容覆盖工作区的内容。读数据写入内表时,必须首先在工作区输入内容
内表的定义
①TYPES自定义类型来定义内表
TYPES:
BEGIN OF <TY_ITAB>
…
END OF <TY_ITAB>
DATA < ITAB > TYPE TABLE OF <TY_ITAB>
或者:
TYPES:<T_ITAB> TYPE <TY_ITAB> OCCURS 0.
DATA < ITAB > TYPE <T_ITAB>.
或者:
TYPES:<T_ITAB> TYPE TABLE OF <TY_ITAB>
DATA < ITAB > TYPE <T_ITAB>.
②DATA直接定义内表
DATA:BEGIN OF < ITAB > OCCURS <>
…
END OF ITAB.
③参考定义
参考已定义的内表来定义内表
DATA < ITAB > LIKE <内表>.
参照数据字典里的结构
DATA < ITAB > TYPE TABLE OF <STRUCTURE/TABLE>
使用INCLUDE STRUCTURE包括已经存在的结构体所有字段
DATA:BEGIN OF < ITAB > OCCURS 0.
INCLUDE STRUCTURE .
DATA:< FIELD > TYPE < TYPE >.
…
DATA:END OF < ITAB >.
内表的操作
①初始化表
REFRESH:清空全部内容,没有清空工作区的内容
CLEAR:只清空工作区,如果想清空内表,变量后加[]
②增加数据
INSERT可以按内表的具体字段向表中插入一行或者多行数据
插入单行数据,如果要插入一条空白行,使用INITIAL LINE
INSERT WA(工作区) INTO|INITIAL LINE INTO ITAB INDEX IDX
INSERT WA INTO|INITIAL LINE INTO TABLE ITAB.
插入多行数据
INSERT LINES OF ITAB1 [FROM IDX] [TO IDX2] INTO ITAB2 [INDEX IDX3].
1.要增加内表,既可以逐行添加数据,也可以复制另一个表格的内容,要逐行填充内表,也可以使用APPEND,COLLECT或者INSERT语句。
1.1要将内表仅用于存储数据,处于性能方面的考虑,建议使用APPEND
1.2要计算数字字段之和或要确保内表中没有出现重复条目,使用COLLECT语句
1.3要在内表先有行之前插入语句,使用INSERT语句
语法:
APPEND < WA > TO|INITIAL LINE TO .
COLLECT < WA > INTO .
INSERT < WA > INTO|INITIAL LINE INTO INDEX .
2.将内表内容复制到另一个内表中
2.1要将内表行附加到另一个内表中,请使用APPEND语句
2.2要将内表行插入到另一个内表中,使用INSERT语句
2.3要将内表条目内容复制到另一内表中,并且覆盖该目标表格,使用MOVE语句
语法:
附加内表行:
APPEND LINES OF < ITAB1 > [FROM < N1 >] [TO ] TO .
插入内表:
INSERT LINES OF < ITAB1 > [FROM < N1 >] [TO ]
INTO < ITAB2 > [INDEX < IDX >]
复制内表:
MOVE < ITAB1 > TO < ITAB2 >.
< ITAB2 >=< ITAB1 >
3.通过OPEN SQL将数据表中的数据按照条件查询后放入内表
SELECT…INTO TABLE < ITAB >
SELECT…APPENDING TABLE < ITAB >
③更改数据
MODIFY(直接修改内表数据)按内表位置或具体内表字段值相等条件修改内表数据
MODIFY ITAB [FROM WA] [INDEX IDX] [TRANSPORTIG F1…FN] WHERE COND.
④删除数据
DELETE(删除内表数据)
DELETE TABLE itab WITH TABLE KEY k1=v1…kn=vn.
按具体值删除
DELETE TABLE itab [FROM wa].
参照其它内表值删除
DELETE itab INDEX idx.
删除具体行数据
DELETE itab FROM idx1 TO idx2.
删除具体行数范围间数据
DELETE ADJACENT DUPLICATES FROM itab.
删除重复数据,执行此条件前必须先排序
⑤读取数据
READ依据具体行数或字段值等条件读取某一内表的数据
READ TABLE itab FROM wa.
READ TABLE itab WITH [TABLE] KEY k1=v1…kn=vn [BINARY SEARCH].
READ TABLE itab INDEX i.
使用READ操作的表必须得HEADER LINE作为查找出的数据存储窗口
BINARY SEARCH可以提高内表数据查找的速度,但是使用前必须先对内表进行排序
LOOP循环常用于实现内表数据的循环读取和操作
LOOP AT ITAB.
WRITE: ITAB.
ENDLOOP.
⑥排序和汇总
对内表进行排序,可以指定具体的排序字段、排序方式(升/降),语法如下
SORT itab [BY f2 f2…fn] [ASCENDING/DESCENDING]
< f2 >:为指定的字段
递减(DESCENDING)和递增(ASCENDING)