SAP应用及ABAP开发最佳实践—Internal-Table_2内表

 

内表

 

• 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

 

转载于:https://www.cnblogs.com/hcmy00/p/6528802.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值