内部表实际上是一个临时表,它包含正在执行的 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
是抽象接口类型,不能用于定义具体的数据对象
下面是一个例子:
append lines of it_tabA to lt_tabB.其实就是将内表A的值附到内表B,而且,B原有的数据也被保存着。算是添加
如果只是单纯的内表赋值:it_tabB[] = it_tabA[].
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.
输出结果: