SAP ABAP 的内表及其操作

659 阅读3分钟

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]

示例:

*"定义linetype

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定义内表

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.

删除内表记录

语法:delete table <内表> from <工作区>

删除工作区对应的那一条内表记录。删除成功 sy-subrc = 0 ,删除失败 sy-subrc = 4

语法:delete <内表> where <列名> = <值> [and | or <列名> = <值>].

示例:

"使用工作区删除记录

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.

修改内表记录

更新内表记录。

语法: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 = 'tang'.

  MODIFY t_testTable FROM testTable.

ENDLOOP.

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 5 天,点击查看活动详情