SAP ABAP 内部表
内部表实际上是一个临时表,它包含正在执行的 ABAP 程序的记录。 内部表仅在 SAP 程序的运行时期间存在。 它们用于通过使用ABAP语言处理大量数据。 当您需要从数据库表中检索数据时,我们需要在 ABAP 程序中声明一个内部表。
内部表中的数据存储在行和列中。 每一行称为行,每一列称为字段。 在内部表中,所有记录具有相同的结构和键。 使用索引或键访问内部表的各个记录。 由于内部表存在直到正在执行相关联的程序,因此当程序的执行终止时,内部表的记录被丢弃。 因此,内部表可以用作临时存储区或临时缓冲区,其中可以根据需要修改数据。 这些表只在运行时而不是在声明时占用内存。
内部表仅在程序运行时存在,因此在编写代码时,内部表必须以程序可以使用的方式进行结构化。 你会发现内部表的操作方式与结构相同。 主要区别是结构只有一行,而内部表可以有所需的行。
内部表可以由多个字段组成,对应于表的列,正如在 ABAP 字典中一样,使用多个字段创建表。 关键字段也可以与内部表一起使用,在创建这些内部表时,它们提供稍微更大的灵活性。 使用内部表,可以指定非唯一键,允许存储任意数量的非唯一记录,并且如果需要,允许存储重复记录。
内部表的大小或其包含的行数不是固定的。 内部表的大小根据与内部表相关联的程序的要求而改变。 但是建议保持内部表尽可能小。 这是为了避免系统运行缓慢,因为它努力处理大量的数据。
内部表用于许多目的:
它们可用于保存以后可在程序中使用的计算结果。
内部表还可以保存记录和数据,以便可以快速访问,而不必从数据库表访问此数据。
他们是非常多才多艺。 它们可以使用任何数量的其他定义的结构来定义。
内部表的种类:
标准表,表类型为关键字
STANDARD TABLE
,系统为该表的每一行生成一个逻辑索引。填充标准表时,可以讲数据附加在现有行之后,也可以插入到指定的位置,程序对内表行的寻址操作可以通过索引或者关键字,另外,在对表进行插入,删除等操作时,个数据行在内存中的位置不变,系统仅重新排列个数据行的索引值。排序表,表类型关键字为
SORTED TABLE
,也具有一个逻辑索引,不同之处在于排序表总是按其关键字生序排列以后再存储,其访问方式与标准表相同。哈希表,表类型关键字为
HASHED TABLE
,没有索引,只能通过关键字来访问,系统用哈希算法管理表中的数据,因而其寻址一个数据行的时间与表的大小无关。
表关键字:
- 如果内表行是结构体,则可以指定结构体中的某几个字段作为内表关键字,该字段不能是内表或者引用类型,但可以是嵌套体。
- 如果内表的整个行都是由基本类型字段组成,则可以把内表整行指定为关键字。
- 如果不指定任何关键字,则可以使用默认的标准关键字,该选项为默认选项。
- 扁平结构内表的默认表关键字是非数字和非内表的组件字段,举例来说,一个内表有字段姓名(c 类型),年龄(n 类型)和工资(f 类型),则默认的关键字为姓名和年龄。
- 如果内表的整个行都是单个基本类型组成,则默认关键字为整个行,如果内表字段含有内表类型字段,则没有默认关键字。
表的使用:
- SAP里面主要有三处类型的内表:
standard table
,sorted table
,hashed table
- 定义语法:
TYPES|DATA itab {TYPE|LIKE} tabkind OF {linetype|lineobj} [WITH KEY] [INITIAL SIZE n]
. -
standard table
,sorted table
可以通过索引和关键字进行访问,hashed table
只能通过关键字进行访问 -
standard table
在增加或插入数据行时并不对数据行的特理地址进行重新排序存储,只是对其索引进行重表排列。sorted table
在增加和插入数据行时要对数据存储的物理地址进行重新排列。 -
hashed table
在检索数据里与数据行数无关,时间复杂度通常是 o(1) 的时间 - SAP 里内表的层次结构如下:
any table
index table hashed table
standard table sorted table
-
any table
和 index table
是抽象接口类型,不能用于定义具体的数据对象 - 举例:
DATA: BEGIN OF line, num TYPE i, sqr TYPE i, END OF line, itab LIKE STANDARD TABLE OF line WITH KEY table_line. DO 5 TIMES. line-num = sy-index. line-sqr = sy-index ** 2. APPEND line TO itab. ENDDO. LOOP AT itab INTO line. WRITE: / line-num,line-sqr. ENDLOOP.
- 注:特别要注意的定义内表的使用的关键字
LIKE
。通过对象来定义内表要使用关键字 LIKE
。在黄佳的书上是有误的。 - 在声明内表关键字时
TABLE LINE
已经废弃不用,而是使用 TABLE_LINE
代替。TABLE_LINE
表示使用内表行作为表关键字。例如:In ABAP Objects, the following statement causes an error message: ... TABLE LINE ... Correct syntax: ... table_line ... Cause: The pseudo-component table_line replaces the TABLE LINE constuction. - 因为
TABLE_LINE
极象一个行字段,所以内表基于的行结构体不应该包含 TABLE_LINE
字段。 - 内表可以通过
WITH [UNIQUE|NON-UNIQUE] KEY COMP1...COMPn,WITH [UNIQUE|NON-UNIQUE] KEY TABLE_LINE,WITH [UNIQUE|NON-UNIQUE] DEFAULT KEY
定义表关键字。 - 在内表中如果不指定任何表关键字则使用
DEFAULT KEY
。扁平结构内表的默认表关键字是非数字和非内表的的组件字段。如果内表行是单个基本类型组成,由默认关键字为整个行。如果内表行中包含内表类型字段,则没有默认关键字。 - 如果内表行由结构体类型组成,则最好不要使用
TABLE_LINE
作为表关键字。 - 标准表不能使用
UNIQUE
表关键字,且无需特别指定 NON-UNIQUE
表关键字;排序表可以使用NON-UNIQUE
或者 UNIQUE
表关键字,哈希表不能使用 NON-UNIQUE
表关键字,且必须指定 UNIQUE
表关键字。 - 在定义内表时使用
WITH HEADER LINE
选项表示定义内表时也定义同名的工作内。如果在使用的过程中不能明确的分辩出是使用内表或是工作区,那么在名称之后加"[]"表示明确的使用内表。如下:TYPES: BEGIN OF address, street(20) TYPE c, city(20) TYPE c, END OF address. DATA: BEGIN OF company, name(20) TYPE c, addresses TYPE address, END OF company. DATA: itab_company LIKE STANDARD TABLE OF company WITH NON-UNIQUE KEY name. DATA: wa LIKE company. wa-name = 'china'.wa-addresses-street = 'aaa'. wa-addresses-city = 'shanghai'. APPEND wa TO itab_company. LOOP AT itab_company INTO wa. WRITE: / sy-tabix,wa-name,wa-addresses-street,wa-addresses-city. ENDLOOP. wa-name = 'america'. wa-addresses-street = 'ccc'. wa-addresses-city = 'new york'. INSERT wa INTO itab_company INDEX 1. LOOP AT itab_company INTO wa . WRITE: / sy-tabix,wa-name,wa-addresses-street,wa-addresses-city. ENDLOOP. wa-name = 'america'. wa-addresses-street = 'DDD'. wa-addresses-city = 'new york'. MODIFY itab_company[] INDEX 1 FROM wa. WRITE: / '...............................'. LOOP AT itab_company INTO wa . WRITE: / sy-tabix,wa-name,wa-addresses-street,wa-addresses-city. ENDLOOP.
- 通常为了不至于引起混淆,建议定义与内表结构相同的工作区进行内表操作。
更多建议: