JSRUN 用代码说话

内部表

编辑教程

内部表

内部表实际上是一个临时表,它包含正在执行的 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.

通常为了不至于引起混淆,建议定义与内表结构相同的工作区进行内表操作。

JSRUN闪电教程系统是国内最先开创的教程维护系统, 所有工程师都可以参与共同维护的闪电教程,让知识的积累变得统一完整、自成体系。 大家可以一起参与进共编,让零散的知识点帮助更多的人。
X
支付宝
9.99
无法付款,请点击这里
金额: 0
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间
如有疑问请联系QQ:565830900
正在生成二维码, 此过程可能需要15秒钟