ABAP 内表介绍及其操作
ABAP 内表
ABAP 内表类似于一个结构体,可以用来保存从数据库表中查出来的数据。内表只是在内存中作为操作表数据载体,在 Java 等语言中使用对象保存一条数据库记录,对象列表保存多条记录。ABAP 中使用内表保存数据库表中的一条或多条记录。
内表定义方式
- 方式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].
示例:
*"定义内表行结构
TYPES: BEGIN OF firstLine,
id(8) type C,
name(20) type C,
age type I,
addr(30) type C,
end of firstLine.
"定义内表(不指定 talbe 类型默认标准 table,标准表只能使用 with NON-UNIQUE DEFAULT KEY
Data: firstTab TYPE TABLE OF firstLine
with NON-UNIQUE DEFAULT KEY
INITIAL SIZE 20
WITH HEADER LINE.
"定义sorted table WITH UNIQUE KEY,或with non-unique default key 指定是否使用重复key field
Data: firstTab1 type SORTED TABLE OF firstLine
INITIAL SIZE 20
WITH HEADER LINE
WITH NON-UNIQUE DEFAULT KEY.
"定义hash table 必须指定 WITH UNIQUE key,key field不重复
Data: firstTab2 TYPE HASHED TABLE OF firstLine
WITH UNIQUE KEY id.
INITIAL SIZE 20
WITH HEADER LINE.
- 方式 2:
使用 data
定义结构体:定义行结构
Data: begin of <结构体名>,
<变量名> type|like <数据类型>,
…………
end of <结构体名>.
定义内表:语法类似,只是将 type
关键字换成 like
关键字
示例:
"使用 data 定义结构体
DATA: BEGIN OF firstLine1,
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 OF firstLine1.
DATA:firstTab4 LIKE SORTED TABLE OF firstLine1 WITH NON-UNIQUE DEFAULT KEY.
DATA:firstTab5 LIKE HASHED TABLE OF firstLine1 WITH UNIQUE KEY id.
- 方式 3:直接使用
data
定义内表
主要借助于 occurs
语句,语法如下:
Data:begin of <内表名> occurs <数字>,
<变量名> type|like <数据类型>,
…………
end of <内表名>.
示例:
"直接定义内表,带header line
DATA:BEGIN OF t_people OCCURS 0,
name type string,
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 OF spfli.
DATA:t_spfli1 TYPE TABLE OF spfli.
"有表头行
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 OF Z_SPFLI.
DATA:t_test TYPE TABLE OF Z_SPFLI.
删除内表记录
有多种方法可以从内部表中删除行:
1. 删除循环中的行
DELETE <ITABLE>.
该语句仅在循环内有效。它删除当前行。您可以通过添加 WHERE
子句有条件地删除循环中的行。
推荐使用如下方式删除某种特点的内表:
语法:
delete <内表> where <列名> = <值> [and | or <列名> = <值>].
例如:
定义一个内表标识位,在 LOOP
中将需要删除的数据将 flag
设置为 X
,然后通过这种方式进行删除:
DELETE gt_out WHERE flag = 'X'.
2. 通过工作区进行删除
语法:delete table <内表> from <工作区>.
删除工作区对应的那一条内表记录。删除成功 sy-subrc = 0
,删除失败 sy-subrc = 4
。
示例:
"使用工作区删除记录
DATA: wa_testTable LIKE LINE OF testTable.
wa_testTable-col1 = 'a'.
wa_testTable-col2 = 20.
wa_testTable-col3 = 'cd'.
"删除的记录每个域值必须和内表对应域值相等
DELETE TABLE testTable FROM wa_testTable.
"直接条件删除记录,对应符合条件多条记录删除
DELETE testTable where col1 = 'a'.
"直接条件删除记录,对应符合条件多条记录删除
DELETE testTable where col1 = 'a' AND col2 = 20 OR col2 = 39.
3. 使用索引删除行
语法:
DELETE <ITABLE> INDEX <IDX>.
修改内表记录
更新内表记录。
语法:modify <内表> transporting <列名> [列名……] where <列名> = <值> [ and | or <列名> = <值>]
.
语法:modify <内表>
如果内表有表头行,直接在循环中更新内表属性值。
语法:modify <内表> from
如果内表没有表头行,需要使用工作区,将要更新内容写入。
示例:
testTable-col1 = 'd'.
testTable-col2 = 40.
testTable-col3 = 'hello'.
"使用transporting指定修改列,where条件筛选列
modify testTable TRANSPORTING col1 col2 col3 WHERE col1 = 'a'.
"测试循环 modify
Data:BEGIN OF testTable OCCURS 0,
name TYPE String,
desc TYPE String,
END OF testTable.
testTable-name = 'tang'.
APPEND testTable.
LOOP AT testTable.
testTable-desc = sy-uname.
MODIFY testTable.
ENDLOOP.
"没有表头行操作
Data:BEGIN OF testTable,
name TYPE String,
desc TYPE String,
END OF testTable.
DATA:t_testTable LIKE TABLE OF testTable.
testTable-name = 'hello'.
APPEND testTable TO t_testTable.
testTable-name = 'hello1'.
APPEND testTable TO t_testTable.
LOOP AT t_testTable INTO testTable.
testTable-desc = sy-uname.
MODIFY t_testTable FROM testTable.
ENDLOOP.
"所有字段重新赋值
LOOP AT t_testTable INTO testTable.
testTable-strs = 'hello'.
testTable-desc = sy-uname.
testTable-name = 'sap'.
MODIFY t_testTable FROM testTable.
ENDLOOP.
- 点赞
- 收藏
- 关注作者
评论(0)