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)