1.内表有3种类型 :
Standard:标准表
Sorted:排序表
Hashed:哈希表.
2. 内表的定义:
UNIQUE|NON-UNIQUE:指定关键字,只能应用于排序表或者哈希表。
INITIAL SIZE n:指定初始化内表大小。
WITH HEADER LINE:定义内表是否有表头。
* DATA <内表名> TYPE <结构类型> WITH [UNIQUE|NON-UNIQUE] [INITIAL SIZE n] [WITH HEADER LINE]。
* DATA <内表名> LIKE TABLE OF <内表或者透明表> WITH [UNIQUE|NON-UNIQUE] [INITIAL SIZE n] [WITH HEADER LINE]。
* DATA: BEGIN OF itab OCCURS n,
......
END OF itab .
例如:
TABLES: USR21."参考某一透明表时,必须先引用定义
TYPES:BEGIN OF EMP,
NAME LIKE USR21-BNAME,
TELNUM LIKE USR21-PERSNUMBER,
ADDR LIKE USR21-ADDRNUMBER,
END OF EMP.
*参考结构定义一个初始化大小为10,并有HEADER LINE的内表.
DATA:EMPTAB TYPE STANDARD TABLE OF EMP INITIAL SIZE 10 WITH HEADER LINE.
*参考上例已建内表,定义大小为20并没有HEADER LINE的内表
DATA:EMPTAB2 LIKE STANDARD TABLE OF EMPTAB INITIAL SIZE 20.
*该方法定义初始化值为10,并有HEADER LINE的内表
DATA:EMPTAB3 LIKE EMPTAB OCCURS 10.
*定义一个排序表,以NAME为关键字,该内表中NAME字段数据不能生重复
DATA:EMPTAB4 LIKE SORTED TABLE OF EMPTAB
WITH UNIQUE KEY NAME INITIAL SIZE 10
WITH HEADER LINE.
*定义一个初始化值为0的哈希表
DATA:EMPTAB5 LIKE HASHED TABLE OF EMPTAB
WITH UNIQUE KEY NAME
WITH HEADER LINE.
3.内表的赋值
内表分为有无HEADER LINE两种。对于有HEADER LINE的内表,可以通过填充HEADER LINE数据后或通过外部的Work Area向内表存储空间中追加数据,相关语法如下:
APPEND (<work area> into) <ITAB>.
对于没有HEADER LINE的内表,只能通表外部WORK AREA来传递数据,如下所示:
TABLES: USR21.
DATA:BEGIN OF EMP OCCURS 0,
NAME LIKE USR21-BNAME,
TELNUM LIKE USR21-PERSNUMBER,
ADDR LIKE USR21-ADDRNUMBER,
END OF EMP.
EMP-NAME = 'jery'.
EMP-TELNUM = '010-12345678'.
EMP-ADDR = 'beijin'.
APPEND EMP."数据据被赋给内表HEADER LINE 后再APPEND 到表中最后一行.
除了上面的赋值方法外,还可以通过OPEN SQL将数据表中的数据按条件查询是后放入内表中,如下所示:
TABLES: USR21.
DATA:BEGIN OF EMP OCCURS 0,
NAME LIKE USR21-BNAME,
TELNUM LIKE USR21-PERSNUMBER,
ADDR LIKE USR21-ADDRNUMBER,
END OF EMP.
SELECT BNAME AS NAME
PERSNUMBER AS TELNUM
ADDRNUMBER AS ADDR
INTO TABLE EMP FROM USR21."通过OPEN SQL将从数据表中抓
4.内表的清空
内表的清空包括以下4种模式:
CLEAR <ITAB>:仅清空HEADER LINE,对内表数据存储空间不影响。
REFRESH <ITAB>:清空内表数据存储空间,对HEADER LINE不影响。
PRFRESH <itab> FROM TABLE <datab>:清空内表存储空间,填充从数据库表所获数据。
FREE <ITAB> :清空内表数据存储空间,对HEADER LINE不影响。
例如:
TABLES: USR21.
DATA:BEGIN OF EMP OCCURS 0,
NAME LIKE USR21-BNAME,
TELNUM LIKE USR21-PERSNUMBER,
ADDR LIKE USR21-ADDRNUMBER,
END OF EMP.
SELECT BNAME AS NAME
PERSNUMBER AS TELNUM
ADDRNUMBER AS ADDR
INTO TABLE EMP FROM USR21.
USR21-BNAME = 'SANLLY'.
REFRESH EMP FROM TABLE USR21."清空EMP的存储空间,并从USER中查找数据填充到内表
5.INSERT (向内表插入数据)
可按内表的具体字段向表中插入一行或多行数据,具休语法如下:
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].
例如:
TABLES: USR21.
DATA:BEGIN OF EMP OCCURS 0,
NAME LIKE USR21-BNAME,
END OF EMP.
DATA:EMPTAB1 LIKE EMP.
DATA:EMPTAB2 LIKE EMP OCCURS 10.
EMP = 'JERY'.
INSERT EMP INDEX 1."若内表有多行数据,该语句将新记录新增到第一行
EMPTAB1 = 'TOM'.
INSERT EMPTAB1 INTO TABLE EMP."将结构休中数据新增到内表
SELECT BNAME AS NAME INTO TABLE EMPTAB2 FROM USR21.
INSERT LINES OF EMPTAB2 FROM 10 INTO EMP."将数据表EMPTAB2从第10行开始的所有数据插入到表EMP中
6.MODIFY(直接修改内表数据)
按内表位置或具体内表字段值等条件修改内表数据
MODIFY itab [FROM wa] [INDEX idx] [TRANSPORTING f1...fn] WHERE cond.
例如:
TABLES: USR21.
DATA:BEGIN OF EMP OCCURS 0,
NAME LIKE USR21-BNAME,
TELNUM LIKE USR21-PERSNUMBER,
END OF EMP.
SELECT BNAME AS NAME
PERSNUMBER AS TELNUM
INTO TABLE EMP FROM USR21.
EMP-NAME = 'Jery'.
EMP-TELNUM = '010-123456'.
MODIFY EMP INDEX 1."修改内表第一行数据为设定值
EMP-TELNUM = '0755-123456'.
MODIFY EMP TRANSPORTING TELNUM WHERE NAME = 'tom'."查找内表中NAME等于TOM的数据,并按设定修改其TELNUM字段,有多行值时会同时修改。
7.COLLECT(内表数据的分类汇总)
将内表中相同的字段合并,若有类型为I的字段,则将其值加总。
COLLECT [wa INTO] itab.
例如:
TYPES:BEGIN OF COMPANY,
NAME(20) TYPE C,
SALES TYPE N,
END OF COMPANY.
DATA: COMP TYPE COMPANY,
COMPTAB TYPE COMPANY OCCURS 0.
COMP-NAME = 'MOBILE'.
COMP-SALES = 10.
COLLECT COMP INTO COMPTAB.
COMP-NAME = 'NOTEBOOK'.
COMP-SALES = 20.
COLLECT COMP INTO COMPTAB.
COMP-NAME = 'MOBILE'.
COMP-SALES = 30.
COLLECT COMP INTO COMPTAB.
輸出結果:
NAME | SALES
MOBILE | 40
NOTEBOOK | 20
8.SORT(內表數據排序)
对内表进行排序,可以指定具体的排序字段、排序方式(升/降),语法如下:
SORT itab [BY f2 f2...fn] [ASCENDING/DESCENDING]
升序 sort itab (ascending),降序 sort itab descending.
9.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 可以提高内表数据查找的速度,但是使用前必须先对内表进行排序。
10.LOOP…ENDLOOP(循环读取内表数据)
循环读取内表数据,在循环中使用系统变量SY-TABIX可获取当前所执行的行数。
LOOP AT ITAB FROM n1 TO n2.:读取内表具体行数间数据。
LOOP AT ITAB WHERE logexp.:按具体字段条件读取内表。
例如:
TABLES:USR21.
DATA:BEGIN OF EMP OCCURS 0,
NAME LIKE USR21-BNAME,
TELNUM LIKE USR21-PERSNUMBER,
END OF EMP.
SELECT BNAME AS NAME
PERSNUMBER AS TELNUM
INTO TABLE EMP FROM USR21.
LOOP AT EMP FROM 1 TO 10."读取内表的第1到10行
WRITE:EMP.
ENDLOOP.
LOOP AT EMP WHERE NAME = 'IBM-ANNY'.
WRITE:EMP.
ENDLOOP.
11. AT...ENDAT(设置内表循环触发条件)
该语法为事件控制函数,应用于LOOP循环语句中,用于获取内表的数据变化事件。
AT NEW f.:当某个字段数据与上一行数据值不同时触发该事件。
AT END OF f.:当内表中某个字段当前行值与下一行值不同时触发该事件。
AT FIRST.:当执行内表第一行时触发该事件。
AT LAST.:当执行内表最后一行时触发该事件。
12. AT…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.删除重复数据前必须先排序
13.DESCRIBE(获取内表的具体属性)
DESCRIBE TABLE itab LINES n : 获取内表当前总行数,n为整数类型。
DESCRIBE TABLE itab OCCURS n: 获取内表初始化行数,n为整数类型。
DESCRIBE TABLE itab KIND K.获取内表类型T:Standard, S:SORTED, H:HASHED.
例如:
DATA:N1 TYPE I,
N2 TYPE I,
K TYPE C.
DATA:BEGIN OF EMP OCCURS 10,
NAME LIKE USR21-BNAME,
TELNUM LIKE USR21-PERSNUMBER,
END OF EMP.
DESCRIBE TABLE EMP LINES N1. "表中无数据,回执为0
DESCRIBE TABLE EMP OCCURS N2."表初始化大小为10,回执为10
DESCRIBE TABLE EMP KIND K. "默认为STANDARD表,回执为T