SAP ABAP 内表使用

时间:2022-04-12 05:34:07


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