内表是ABAP的基本类型,本文不再对其进行详加分析,只做一些冷门介绍及高级应用场景介绍

内表定义

DATA itab { {TYPE [STANDARD]|SORTED|HASHED TABLE OF [REF TO] type} 
          | {LIKE [STANDARD]|SORTED|HASHED TABLE OF dobj} } 
          [tabkeys] 
          [INITIAL SIZE n] 
          [VALUE IS INITIAL] 
          [READ-ONLY]. 

内表类型

  1. 标准表(STANDARD TABLE),系统为该表的每一行数据生成一个逻辑索引,自己内部维护着行号(Index)的编码。表的键值不唯一,且没有按照表键自动进行排序,支持通过索引访问和键访问两种方式。填充标准表时可以插入到指定位置或现在有行之后,程序对内表的寻址操作可以通过关键字或索引进行。在对表进行插入删除等操作时,各数据行在内存中的物理位置不变,系统仅重新排列各数据行的索引值。当经常用索引访问表的时候就选择标准表。

  2. 排序表(SORTED TABLE),也有一个逻辑索引,不同之处是排序表总是按其表关键字升序排序后现进行存储,排序内表自己内部也维护着行号的编号,表的键值可以唯一或者不唯一,支持通过索引访问和键访问两种方式。如果经常使用键来访问数据,或者希望数据能够自动排序时,就用排序表,排序表不能使用APPEND插入数据。

  3. 哈希表(HASHED TABLE),哈希表通过哈希函数生成的表键来标识和快速访问表行,哈希表中的表键没有顺序,其值在表中必须唯一,只允许通过表键来访问哈希表。寻址一个数据行的所需时间与表行数无关。如果内表非常大而且希望用主键访问,就用哈希表。

  4. INDEX/ANY TABLE通用型内表,除上面三种标准类型外,还有一般性类型,即索引表(INDEX TABLE)和任意表(ANY TABLE),一般性类型可以用于类型定义中,但不能用于声明一个内表对象,因为它并没有指明任何明确的表类型,因而系统无法确定对其操作方式。一般性类型还可以用于指明字段符号和接口参数的类型,其实际类型可能在运行期内才能够确定。

内表的使用

使用关键字定位一行数据不同内表的效率比较如下:

  1. 标准表,取决于表的行数,随行数线性增加。(但也可以先进行排序,再明确使用二分搜索查找)
  2. 排序表,取决于表的行数,随行数对数级增长(系统默认就会使用二分搜索方式来查找)。
  3. 哈希表,与行数无关,在大数据量的情况下根据关键字查询是最快的

像数据库表一样,内表也可以创建多个索引,内表有三种类型第二索引:

  1. UNIQUE HASHED: 哈希算法第二索引
  2. UNIQUE SORTED: 唯一升序第二索引
  3. NON-UNIQUE SORTED: 非唯一升序第二索引
TYPES sbook_tab TYPE STANDARD TABLE OF sbook
"主索引:如果要为主索引指定名称,则只能使用预置的 primary_key,
"但可以通过后面的 ALIAS 选项来修改(注:ALIAS选项只能用于排序与哈希表)
WITH NON-UNIQUE KEY primary_key "ALIAS my_primary_key
     COMPONENTS carrid connid fldate bookid
"第一个第二索引:唯一哈希算法
WITH UNIQUE HASHED KEY hash_key
     COMPONENTS carrid connid fldate bookid
"第二第二索引:非唯一升序排序索引
WITH NON-UNIQUE SORTED KEY sort_key
     COMPONENTS customid.

内表动态排序

简单变量+小括号()

*仅适合排序组件较少的情况
data(lt_common) = itab.
data(lv_component1) ='COL1'.
data(lv_component2) = 'COL2'.
sort lt_common by (lv_component1) ascending (lv_component2).

排序表abap_sortorder_tab

"排序表动态排序
data:lt_sorted_table type abap_sortorder_tab.

lt_sorted_table = value #(
  ( name = 'COL1' astext = abap_false descending = abap_false )
  ( name = 'COL2')
).

data(lt_sort_by_table) = itab.
sort lt_sort_by_table by (lt_sorted_table).

系统标准类cl_abap_itab_utilities(版本7.52支持)

data(out) = cl_demo_output=>new( ).
data(v_index) =
      cl_abap_itab_utilities=>virtual_sort(
      im_virtual_source = value #(
      ( source     = ref #( itab )
      components = value #( ( name = 'COL1' )
      ( name = 'COL2' ) ) ) ) ).
out->write( '排序结果对应的行索引' ).
out->write( v_index ).