内表
• ABAP中的内表相当于其他程序设计语言中的二维数组,存储多行结构相同的数据
• 不同于二维数组,内表在创建后,列结构与列数是固定不变的,而行数是动态增长的
• 内表支持循环对每行数据进行操作,也支持整体操作
• 内表是具有行和列的表结构,然而,不同于数据库表,内表仅在程序运行期间在内存中存储数据
• ABAP中有三种内表类型:标准表,哈希表,排序表(本手册只介绍常用的内表类型—标准表)
2 / 33
• 内表数据对象是实际的内表,可以用数据进行填充
• 内表数据类型是用于定义内表数据对象的抽象数据类型(ADT)
• 可以使用的内表数据类型有:
• Structure
• 数据库表
• 用户自定义数据类型
3 / 33
• 使用Structure类型
• DATA <itab> TYPE (STANDARD) TABLE OF <structure>.
• 如:
4 / 33
• 使用数据库表
• DATA <itab> TYPE (STANDARD) TABLE OF <DB Table>.
• 如:
5 / 33
• 使用用户自定义数据类型
• 首先定义数据类型
• TYPES:BEGIN OF <type>,
•
•
•
•
<field1>,
<field2>,
……
END OF <type>.
• 然后定义内表
• DATA <itab> TYPE (STANDARD) TABLE OF <type>.
6 / 33
• 如:
7 / 33
• 内表是按行进行访问的,然而,程序对内表的行操作不能直接进行,必须使用一种接口来传输,
这个接口就是工作区(Work Area)
• 工作区对内表的行必须是可转换的,出于安全性考虑,为了保持数据一致性,建议工作区与内表
行具有相同的结构
• 语法:
• DATA <wa> LIKE LINE OF <itab>.
• 如:
8 / 33
• ABAP还提供了一种简单的工作区定义方式,即在创建内表对象的同时隐式地定义一个同名工作
区,这个同名工作区就叫做表头行
• 语法:
• 在内表定义语句后追加关键字WITH HEADER LINE.
• 如:
• 使用带表头行的内表会给内表操作带来方便,但是会增加混淆,降低代码可读性
9 / 33
• 不带表头行的内表
• APPEND <wa> TO <itab>.
• 如:
10 / 33
• 带表头行的内表
• APPEND <itab>.
• 如:
11 / 33
• 不带表头行的内表
• INSERT <wa> INTO [TABLE] <itab> [INDEX <idx>].
• 如:
12 / 33
• 带表头行的内表
• INSERT [TABLE] <itab> [INDEX <idx>].
• 如:
13 / 33
• 不带表头行的内表
• READ TABLE <itab> INTO <wa> INDEX <idx>.
• 如:
14 / 33
• 带表头行的内表
• READ TABLE <itab> INDEX <idx>.
• 如:
15 / 33
• 不带表头行的内表
• MODIFY <itab> FROM <wa> INDEX <idx>.
• 如:
16 / 33
• 带表头行的内表
• MODIFY <itab> INDEX <idx>.
• 如:
17 / 33
• 带表头行与不带表头行语法一致
• DELETE <itab> INDEX <idx>.
• 如:
18 / 33
• LOOP语句可以顺序地逐行读取内表数据
• 在循环体中可以对工作区中的数据进行各种处理,如输出,运算等,也可以对内表行进行新增,
修改,删除等操作
• 循环体中的MODIFY,DELETE等语句不必指定INDEX项,系统默认处理当前行
• 如果不需要读取所有的内表行,可以使用WHERE选项进行限制
19 / 33
• 不带表头行的内表
• LOOP AT <itab> INTO <wa> [WHERE <conditions>].
•
•
•
……
<statement block>
……
• ENDLOOP.
• 如:
20 / 33
• 带表头行的内表
• LOOP AT <itab> [WHERE <conditions>].
•
•
•
……
<statement block>
……
• ENDLOOP.
• 如:
21 / 33
• 注意:
• 在LOOP循环中,应当尽量避免对当前内表进行插入或填充操作,一旦循环终止条件遗漏,就会
出现死循环
• 程序中出现死循环是ABAP程序开发的大忌,一定要引起重视!
22 / 33
• 不带表头行的内表
• CLEAR <itab>.
• 带表头行的内表:
• 清空表头行:CLEAR <itab>.
• 清空表体:CLEAR <itab>[].
• 对于带表头行的内表,进行清空时,通常的做法是同时清空表体与表头行,可简写为:
• CLEAR:<itab>, <itab>[].
23 / 33
• 根据默认关键字对内表进行排序
• SORT <itab> [ASCENDING | DESCENDING] [AS TEXT].
• ASCENDING和DESCENDING指定升序还是降序排列,如果不指定,缺省排序方式是升序
• AS TEXT影响字符字段的排序方式,如果不使用该选项,系统将按字符平台相应内部编码进行
排序,否则,系统根据当前语言按字母顺序排序字符字段
• 如:
24 / 33
• 根据指定字段对内表进行排序
• SORT <itab> BY <field 1> [ASCENDING | DESCENDING] [AS TEXT]
•
•
……
<field n > [ASCENDING | DESCENDING] [AS TEXT].
• 如:
25 / 33
• 第一步,对内表排序,使重复行相邻
• 第二步,删除相邻的重复行
• DELETE ADJACENT DUPLICATES FROM <itab> [COMPARING <comp>].
• 如:
26 / 33
• 将内表中部分或全部的数据行整体插入另一内表(两个内表必须具有相同的或可转换的行结构)
• INSERT LINES OF <itab1> [FROM n1] [TO n2] INTO [TABLE] <itab2> [INDEX <idx>].
• 如:
27 / 33
• 将内表中部分或全部的数据行整体填充到另一内表(两个内表必须具有相同的或可转换的行结构
)
• APPEND LINES OF <itab1> [FROM n1] [TO n2] TO <itab2>.
• 如:
28 / 33
• 按照条件或者索引删除一组选定行
• DELETE <itab> [FROM n1] [TO n2] [WHERE <condition>].
• 如:
29 / 33
• 整体复制内表,目标内表原有内容被覆盖(两个内表必须具有相同的或可转换的行结构)
• 不带表头行的内表之间进行复制:
• MOVE <itab1> TO <itab2>.
• 带表头行的内表之间进行复制:
• MOVE <itab1>[] TO <itab2>[].
• 不带表头行的内表复制到带表头行的内表:
• MOVE <itab1> TO <itab2>[].
• 带表头行的内表复制到不带表头行的内表:
• MOVE <itab1>[] TO <itab2>.
30 / 33
• 如:
31 / 33
• 两个内表行结构不一致时,对同名的具有相同的或可转换结构的字段进行复制
• 在循环中使用MOVE-CORRESPONDING <wa1> TO <wa2>.语句将工作区wa1中的数据复制到
wa2的同名字段中,然后进行压表操作
• 如:
32 / 33
• 第一步,获取内表行数
• DESCRIBE TALBE <itab> LINES <count>.
• 第二步,判断行数<count>是否为0
• 如:
33 / 33