ABAP 内表介绍及其操作

举报
雨绸缪 发表于 2023/07/31 17:08:06 2023/07/31
【摘要】 ABAP 内表ABAP 内表类似于一个结构体,可以用来保存从数据库表中查出来的数据。内表只是在内存中作为操作表数据载体,在 Java 等语言中使用对象保存一条数据库记录,对象列表保存多条记录。ABAP 中使用内表保存数据库表中的一条或多条记录。 内表定义方式方式1:使用 types 定义结构类型:定义内表行结构,代码如下:Types:BEGIN OF <结构名>, <变量名> typ...

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.
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。