SAP ABAP 内部表

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

赛锐信息:SAP ABAP 内部表 图1
赛锐信息,SAP ERP定制,ERP定制

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

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

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

关于赛锐信息

作为SAP的资深合作伙伴,赛锐信息是一家专业提供SAP行业化管理软件解决方案的顾问公司,致力于为企业提供SAP ERP系统咨询服务、IT规划、业务流程优化、信息系统实施、行业信息系统方案开发,运营外包及售后维护等全面的服务方案。已服务1000+家不同行业、规模的大中小型企业客户。在电子高科技、汽车零部件、印刷包装、医疗器械、快消品、专业服务等行业信息化管理领域具有领导性地位。

相关新闻

联系我们

联系我们

130-0752-1773

在线咨询:点击这里给我发消息

邮件:info@sapzx.com

工作时间:周一至周五9:00-18:00,节假日正常休息

关注微信
关注微信
分享本页
返回顶部