声明结构化数据对象

学习目标

  • 声明结构化数据对象。

结构化数据对象

到目前为止,您一直使用简单变量,每个变量都可以存储单个信息。例如,此处有两个变量,一个用于出发机场,另一个用于到达机场。

从数据库中读取记录时,需要将所有这些信息保存在一起。示例中的两个变量完全彼此独立,因此不适合存储属于同一类的不同信息。

在 ABAP 中,解决方案是使用结构化变量或结构(简而言之)。

结构是具有名称和结构化类型的可变 ABAP 数据对象。

在此示例中,数据对象 connection_full 是这样的结构。它细分为八个组件,每个组件也有名称和类型。您可以将结构作为一个整体和单个组件进行处理。重要的是,您可以以与使用独立简单变量完全相同的方式使用每个组件。

声明结构有多种可能性。您可以使用关键字 TYPES 定义结构化类型,也可以使用结构类型的资源库对象。视图和数据库表的定义也可以用作结构化类型。该示例使用 CDS 视图 /DMO/I_Connection 作为结构化类型。

调试器透视图中,有两种方法可以分析结构化变量的结构和内容:

变量预览(鼠标悬停)

将焦点设置在源代码编辑器上,并将指针放在变量名称上。稍后,将打开一个对话框窗口,其中包含有关数据对象结构和内容的详细信息。

变量

视图中显示(双击)

要在 变量 视图中显示变量,请在 <输入变量> 下输入变量名称,或双击源代码编辑器中某处的变量名称。展开具有结构名称的节点以查看组件清单。

如何使用调试透视图分析结构化数据对象。

演示观看演示(SAP 官方交互式练习)

结构化数据类型

全局结构类型是资源库对象,可用作系统中任意位置的数据类型。在此示例中,结构化类型 SYMSG 用于声明变量消息。

当您按 F2 键显示此数据类型的详细信息时,您可以看到这是一个由七个组件组成的结构类型。您还可以查看组件的名称、技术类型和描述。

F3 键导航到类型定义时,将打开一个新视图,其中包含用于全局结构化类型的 ADT 编辑器。

全局结构类型的定义与数据库表的定义非常相似。定义的主要部分由具有结构类型名称的 DEFINE STRUCTURE 语句组成。后面是一对花括号 ( { , }) 中的结构组件列表;每个组件都具有组件类型。组件类型通常由数据元素描述,但也可以使用结构类型作为组件类型。具有结构化组件的结构称为嵌套结构。

DEFINE STRUCTURE 语句之前的附加代码行会在其中指定结构类型的附加属性。

还可以使用 TYPES 语句在 ABAP 程序中定义结构化类型。结构定义以语句 TYPES BEGIN OF <结构类型名称> 开头,以 TYPES END OF <结构类型名称> 结尾。在两者之间,为每个组件命名并在附加 TYPES 语句中指定其类型。

紧凑形式仅使用一次关键字 TYPES,后跟冒号 ( :)。BEGIN OF 附加项、END OF 附加项和两者之间的组件定义随后用逗号分隔。

这称为链语句。

注意

过去,在 ABAP 中大量使用链语句。现在,建议仅合并同属一类的语句。

在此示例中,链语句 TYPES:用于定义本地结构化类型 st_connection,该类型由 airport_from_id、airport_to_id 和 carrier_name 三个组件组成。每个组件都使用以 /dmo/ 开头的数据元素进行类型分配。

然后在 DATA 语句中使用本地结构化类型 st_connection 来键入结构化变量连接。

在此示例中,变量 connection 具有嵌套结构化类型。类型 st_nested 定义 4 个组件。三个用数据元素键入,因此它们是简单的组件。但是,组件 message 使用结构化类型键入。因此,它是一个结构化组件。这将使变量 connection 成为嵌套结构。

ABAP 不仅支持结构化变量,还支持结构化常量。要定义结构化常量,请使用 BEGIN OF 和 END OF 作为 CONSTANTS 语句的一部分。该示例显示在全局类 CL_ABAP_BEHV 的公共部分中定义的结构化常量。所有五个组件均使用数据元素 SECKEYNAME 键入。请记住,在定义常量时,附加项 VALUE 是必需的。

试用:结构化数据类型

  1. 与本课程的第一个练习一样,创建一个实施接口 IF_OO_ADT_CLASSRUN 的新全局类。

  2. 将以下代码片段复制到方法 if_oo_adt_classrun~main() 的实施部分:

* Example 1 : Motivation for Structured Variables
**********************************************************************
DATA connection_full TYPE /DMO/I_Connection.
SELECT SINGLE
FROM /dmo/I_Connection
FIELDS AirlineID, ConnectionID, DepartureAirport, DestinationAirport,
DepartureTime, ArrivalTime, Distance, DistanceUnit
WHERE AirlineId    = 'LH'
AND ConnectionId = '0400'
INTO @connection_full.
out->write(  `--------------------------------------` ).
out->write(  `Example 1: CDS View as Structured Type` ).
out->write( connection_full ).
* Example 2: Global Structured Type
**********************************************************************
DATA message TYPE symsg.
out->write(  `---------------------------------` ).
out->write(  `Example 2: Global Structured Type` ).
out->write( message ).
* Example 3 : Local Structured Type
**********************************************************************
TYPES: BEGIN OF st_connection,
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.
DATA connection TYPE st_connection.
SELECT SINGLE
FROM /DMO/I_Connection
FIELDS DepartureAirport, DestinationAirport, \_Airline-Name
WHERE AirlineID = 'LH'
AND ConnectionID = '0400'
INTO @connection.
out->write(  `---------------------------------------` ).
out->write(  `Example 3: Local Structured Type` ).
out->write( connection ).
* Example 4 : Nested Structured Type
**********************************************************************
TYPES: BEGIN OF st_nested,
airport_from_id TYPE /dmo/airport_from_id,
airport_to_id   TYPE /dmo/airport_to_id,
message         TYPE symsg,
carrier_name    TYPE /dmo/carrier_name,
END OF st_nested.
DATA connection_nested TYPE st_nested.
out->write(  `---------------------------------` ).
out->write(  `Example 4: Nested Structured Type` ).
out->write( connection_nested ).
  1. 按 CTRL + F3 激活类,按 F9 执行控制台应用。

  2. 分析控制台输出。调试程序,使用源代码熟悉概念。