声明复杂内部表
学习目标
声明复杂内部表。
复杂内部表的属性

到目前为止,我们使用的内部表具有标量数据类型作为其行类型。在此处图中所示的示例中,内部表编号的行类型为 ABAP 内置类型 I。
我们将这些类型的内部表称为简单的内部表。

如果行类型是结构化数据类型,我们指的是复杂的内部表。
虽然简单内部表只有一个无名列,但复杂内部表由多个列组成,每个列都具有结构化行类型的相应组件的名称和类型。在该示例中,内部表 connections 的行类型是具有五个组件的结构化类型:carrier_id、connection_id、airport_from_id、airport_to_id 和 carrier_name。因此,内部表 connections 具有具有这些名称的五列。
注意
"提醒:简单内部表和具有结构化行类型的内部表"图中的示例中的列都具有标量类型。更一般地说,内部表的列也可以是结构化类型,甚至具有表类型。在后一种情况下,我们将讨论嵌套内部表。

到目前为止,我们已按位置处理内部表的行。这称为索引访问。
使用复杂内部表的命名列,关键字访问变得更为重要。键值访问意味着通过查找特定列中的特定值,寻址内部表的行。在其中进行搜索的列可以是内部表的任意列。
对内部表的索引访问始终非常快,即使内部表包含许多行。但是,如果表包含大量行,密钥访问可能会非常慢。为内部表选择正确的访问类型可以提高关键访问的性能。

每个内部表都有三种访问类型之一。访问类型确定数据在表中的存储方式,并据此确定系统如何读取表以检索数据。
不同类型的表如下:
标准表
在标准表中,内容不会以特定的排序顺序存储。缺省情况下,新记录将附加到表的末尾。为了按键值检索数据,系统必须按顺序读取数据,如果表非常大,可能会导致检索时间过长。到目前为止,我们使用的简单内部表是标准表。
排序表
在排序表中,表的内容始终根据关键字段按升序排序。向表中插入新记录时,系统会确保将其放置在正确的位置。由于数据始终进行排序,因此系统可以比从标准表中更有效地检索记录(只要您遵循特定规则)。
散列表
哈希表使用特殊的哈希算法进行管理。这可确保即使表非常大,系统也可以非常快速地检索记录。但是,这种性能提升仅在非常特殊的情况下有效。

每个内部表都有一个键值。在标准表中,键值不会发挥特别重要的作用。对于排序表和散列表,键非常重要,因为它确定在表中管理数据的方式。重要的是,排序表和散列表只有处理全部或至少一个键值字段子集的键值访问速度更快。
表键的另一个属性是其唯一性。有时您希望允许内部表中存在重复条目,有时需要确保键值唯一。在此,以下规则适用:
标准表中始终允许重复
散列表中绝不允许重复
对于排序表,在定义中选择键值是唯一还是不唯一。
注意
内部表也可能具有次键。次键是一种提高对内部表的关键字访问性能的方法,这些表使用不同的字段组合。有关次关键字的详细信息,请参阅 ABAP 语法文档。
复杂表类型
观看此视频,了解声明复杂内部表的一些示例。
视频:本节含 SAP 官方视频(视频 ID
1_nsynvqn4),需在 learning.sap.com 在线观看。

此外,最好先定义数据类型,然后再创建引用该类型的变量。
您应该使用命名的表类型,而不是在 DATA 语句中指定内部表的访问类型和键值。如果仅在方法中本地需要表类型,或与给定类相关的表类型,则可以使用 TYPES 语句进行定义。
此示例首先定义结构化类型 st_connection。然后使用此结构化类型作为行类型,定义表类型 tt_connections。最后,内部表 connections_5 的声明指的是表类型。
如果全局需要表类型,则可以使用全局表类型。
全局表类型是资源库对象,可用作系统中任意位置的数据类型。ADT 为此类资源库对象提供专用编辑器。该工具由以下框架组成:
以下视频介绍了如何在本地定义表类型。
视频:本节含 SAP 官方视频(视频 ID
1_6upcy1qj),需在 learning.sap.com 在线观看。
试用:复杂表类型
与本课程的第一个练习一样,创建一个实施接口 IF_OO_ADT_CLASSRUN 的新全局类。
将以下代码片段复制到方法 if_oo_adt_classrun~main() 的实施部分:
TYPES: BEGIN OF st_connection,
carrier_id TYPE /dmo/carrier_id,
connection_id TYPE /dmo/connection_id,
airport_from_id TYPE /dmo/airport_from_id,
airport_to_id TYPE /dmo/airport_to_id,
carrier_name TYPE /dmo/carrier_name,
END OF st_connection.
* Example 1 : Simple and Complex Internal Table
**********************************************************************
" simple table (scalar row type)
DATA numbers TYPE TABLE OF i.
" complex table (structured row type)
DATA connections TYPE TABLE OF st_connection.
out->write( `--------------------------------------------` ).
out->write( `Example 1: Simple and Complex Internal Table` ).
out->write( data = numbers
name = `Simple Table NUMBERS:`).
out->write( data = connections
name = `Complex Table CONNECTIONS:`).
* Example 2 : Complex Internal Tables
**********************************************************************
" standard table with non-unique standard key (short form)
DATA connections_1 TYPE TABLE OF st_connection.
" standard table with non-unique standard key (explicit form)
DATA connections_2 TYPE STANDARD TABLE OF st_connection
WITH NON-UNIQUE DEFAULT KEY.
" sorted table with non-unique explicit key
DATA connections_3 TYPE SORTED TABLE OF st_connection
WITH NON-UNIQUE KEY airport_from_id
airport_to_id.
" sorted hashed with unique explicit key
DATA connections_4 TYPE HASHED TABLE OF st_connection
WITH UNIQUE KEY carrier_id
connection_id.
* Example 3 : Local Table Type
**********************************************************************
TYPES tt_connections TYPE SORTED TABLE OF st_connection
WITH UNIQUE KEY carrier_id
connection_id.
DATA connections_5 TYPE tt_connections.
* Example 4 : Global Table Type
**********************************************************************
DATA flights TYPE /dmo/t_flight.
out->write( `------------------------------------------` ).
out->write( `Example 4: Global Table TYpe /DMO/T_FLIGHT` ).
out->write( data = flights
name = `Internal Table FLIGHTS:` ).
按键盘上的 CTRL + F3 激活类,按 F9 执行控制台应用。
分析控制台输出。调试程序,使用源代码熟悉概念。