SAP ABAP 内部表

2020-10-28 10:29 更新

内部表实际上是一个临时表,它包含正在执行的 ABAP 程序的记录。 内部表仅在 SAP 程序的运行时期间存在。 它们用于通过使用ABAP语言处理大量数据。 当您需要从数据库表中检索数据时,我们需要在 ABAP 程序中声明一个内部表。

内部表中的数据存储在行和列中。 每一行称为,每一列称为字段 在内部表中,所有记录具有相同的结构和键。 使用索引或键访问内部表的各个记录。 由于内部表存在直到正在执行相关联的程序,因此当程序的执行终止时,内部表的记录被丢弃。 因此,内部表可以用作临时存储区或临时缓冲区,其中可以根据需要修改数据。 这些表只在运行时而不是在声明时占用内存。

内部表仅在程序运行时存在,因此在编写代码时,内部表必须以程序可以使用的方式进行结构化。 你会发现内部表的操作方式与结构相同。 主要区别是结构只有一行,而内部表可以有所需的行。

内部表可以由多个字段组成,对应于表的列,正如在 ABAP 字典中一样,使用多个字段创建表。 关键字段也可以与内部表一起使用,在创建这些内部表时,它们提供稍微更大的灵活性。 使用内部表,可以指定非唯一键,允许存储任意数量的非唯一记录,并且如果需要,允许存储重复记录。

内部表的大小或其包含的行数不是固定的。 内部表的大小根据与内部表相关联的程序的要求而改变。 但是建议保持内部表尽可能小。 这是为了避免系统运行缓慢,因为它努力处理大量的数据。

内部表用于许多目的:

  • 它们可用于保存以后可在程序中使用的计算结果。

  • 内部表还可以保存记录和数据,以便可以快速访问,而不必从数据库表访问此数据。

  • 他们是非常多才多艺。 它们可以使用任何数量的其他定义的结构来定义。

内部表的种类:

  • 标准表,表类型为关键字​STANDARD TABLE​,系统为该表的每一行生成一个逻辑索引。填充标准表时,可以讲数据附加在现有行之后,也可以插入到指定的位置,程序对内表行的寻址操作可以通过索引或者关键字,另外,在对表进行插入,删除等操作时,个数据行在内存中的位置不变,系统仅重新排列个数据行的索引值。

  • 排序表,表类型关键字为​SORTED TABLE​,也具有一个逻辑索引,不同之处在于排序表总是按其关键字生序排列以后再存储,其访问方式与标准表相同。

  • 哈希表,表类型关键字为​HASHED TABLE​,没有索引,只能通过关键字来访问,系统用哈希算法管理表中的数据,因而其寻址一个数据行的时间与表的大小无关。

表关键字:

  • 如果内表行是结构体,则可以指定结构体中的某几个字段作为内表关键字,该字段不能是内表或者引用类型,但可以是嵌套体。
  • 如果内表的整个行都是由基本类型字段组成,则可以把内表整行指定为关键字。
  • 如果不指定任何关键字,则可以使用默认的标准关键字,该选项为默认选项。
  • 扁平结构内表的默认表关键字是非数字和非内表的组件字段,举例来说,一个内表有字段姓名(c 类型),年龄(n 类型)和工资(f 类型),则默认的关键字为姓名和年龄。
  • 如果内表的整个行都是单个基本类型组成,则默认关键字为整个行,如果内表字段含有内表类型字段,则没有默认关键字。

表的使用:

  1. SAP里面主要有三处类型的内表:​standard table​,​sorted table​,​hashed table
  2. 定义语法:​TYPES|DATA itab {TYPE|LIKE} tabkind OF {linetype|lineobj} [WITH KEY] [INITIAL SIZE n]​.
  3. standard table​,​sorted table​ 可以通过索引和关键字进行访问,​hashed table​ 只能通过关键字进行访问
  4. standard table​在增加或插入数据行时并不对数据行的特理地址进行重新排序存储,只是对其索引进行重表排列。​sorted table​ 在增加和插入数据行时要对数据存储的物理地址进行重新排列。
  5. hashed table​ 在检索数据里与数据行数无关,时间复杂度通常是 o(1) 的时间
  6. SAP 里内表的层次结构如下:

    any table
    index table           hashed table
    standard table     sorted table

  1. any table​ 和 ​index table ​是抽象接口类型,不能用于定义具体的数据对象
  2. 举例:
    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.
  3. 注:特别要注意的定义内表的使用的关键字 ​LIKE​。通过对象来定义内表要使用关键字 ​LIKE​。在黄佳的书上是有误的。
  4. 在声明内表关键字时 ​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. 
  5. 因为 ​TABLE_LINE​ 极象一个行字段,所以内表基于的行结构体不应该包含 ​TABLE_LINE ​字段。
  6. 内表可以通过 ​WITH [UNIQUE|NON-UNIQUE] KEY COMP1...COMPn,WITH [UNIQUE|NON-UNIQUE] KEY TABLE_LINE,WITH [UNIQUE|NON-UNIQUE] DEFAULT KEY ​定义表关键字。
  7. 在内表中如果不指定任何表关键字则使用​ DEFAULT KEY​。扁平结构内表的默认表关键字是非数字和非内表的的组件字段。如果内表行是单个基本类型组成,由默认关键字为整个行。如果内表行中包含内表类型字段,则没有默认关键字。
  8. 如果内表行由结构体类型组成,则最好不要使用 ​TABLE_LINE​ 作为表关键字。
  9. 标准表不能使用 ​UNIQUE​ 表关键字,且无需特别指定 ​NON-UNIQUE​ 表关键字;排序表可以使用​ NON-UNIQUE​ 或者 ​UNIQUE​ 表关键字,哈希表不能使用 ​NON-UNIQUE ​表关键字,且必须指定 ​UNIQUE ​表关键字。
  10. 在定义内表时使用​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.
  11. 通常为了不至于引起混淆,建议定义与内表结构相同的工作区进行内表操作。



以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号