使用复杂内部表

学习目标

  • 使用数据填充复杂内部表。

  • 访问复杂内部表的内容。

  • 在 ABAP SQL 中使用复杂的内部表。

复杂内部表填充

如您所知,向内部表添加新行的最简单方法是包含类型与内部表的行类型相对应的数据对象的 APPEND 语句。此数据对象有时称为工作区。

对于简单的内部表,APPEND 中使用的工作区可以是标量变量、常量或文字。对于复杂的内部表,必须对工作区进行结构化。

在此示例中,结构化变量连接用于填充内部表连接。

原则上,有两种方法可以声明工作区连接:

  • 直接引用行类型 st_connection

  • 使用 LIKE LINE OF <internal_table> 间接引用行类型。

使用 LIKE LINE OF 定义工作区有两个优势:

  • 它显示结构化变量的用途,作为内部表的工作区域

  • 即使内部表的定义发生更改,它也能确保工作区适合内部表

如果未在 APPEND 语句之前填充工作区,则使用类型特定的初始值填充内部表的新行。

提示

使用特殊变式 APPEND INITIAL LINE TO <internal_table> 获得相同的结果。此变式甚至不需要工作区。

要填充结构化工作区,可以填充单个组件,也可以使用值 #() 表达式(如示例所示)。

如示例中所示,您也可以直接在 APPEND 语句中使用 VALUE #( ) 表达式。在这种情况下,您不需要工作区。

注意

这会对程序的总体内存消耗产生积极影响。

存在可直接分配给内部表的 VALUE #() 表达式的变式。在此值 #() 变式中,附加括号对用于分隔表行。

代码示例用三行填充内部表载体,每个行具有 carrier_id 和 carrier_name 的不同值。因此,未提及 currency_code 列,使用类型特定的初始值填充。

注意

通过上述分配,在用新行填充表之前移除所有现有表行。

要在两个内部表的相同命名字段之间复制数据,请使用 CORRESPONDING 运算符。这类似于结构的 CORRESPONDING:对于源内部表的每一行,系统在目标内部表中创建新行,并在名称相同的字段之间复制数据。不会复制目标中没有相同命名字段的源字段。源中没有相同命名字段的目标字段使用类型特定的初始值填充。

在示例中,源内部表运输公司包含三行。因此,在值分配后,目标内部表连接还包含三行。

字段 carrier_id 和 carrier_name 存在于两个内部表中。它们从源复制到目标。字段 currency_code 仅存在于源中。不会复制。connection_id、airport_from_id 和 airport_to_id 字段仅存在于目标中。它们使用初始值填充。

注意

如果目标内部表包含分配前的数据,系统会将其删除。

如何调试复杂内部表

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

试用:填充复杂内部表

  1. 由于这是本课程的第一个练习,因此创建一个实施接口 IF_OO_ADT_CLASSRUN 的新全局类。

  2. 将以下代码片段复制到方法 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.
TYPES tt_connections TYPE STANDARD TABLE OF   st_connection
WITH NON-UNIQUE KEY carrier_id
connection_id.
DATA connections TYPE tt_connections.
TYPES: BEGIN OF st_carrier,
carrier_id    TYPE /dmo/carrier_id,
carrier_name  TYPE /dmo/carrier_name,
currency_code TYPE /dmo/currency_code,
END OF st_carrier.
TYPES tt_carriers TYPE STANDARD TABLE OF st_carrier
WITH NON-UNIQUE KEY carrier_id.
DATA carriers TYPE tt_carriers.
* Example 1: APPEND with structured data object (work area)
**********************************************************************
*    DATA connection  TYPE st_connection.
" Declare the work area with LIKE LINE OF
DATA connection LIKE LINE OF connections.
*    connection-carrier_id       = 'NN'.
*    connection-connection_id    = '1234'.
*    connection-airport_from_id  = 'ABC'.
*    connection-airport_to_id    = 'XYZ'.
*    connection-carrier_name     = 'My Airline'.
" Use VALUE #( ) instead assignment to individual components
connection = VALUE #( carrier_id       = 'NN'
connection_id    = '1234'
airport_from_id  = 'ABC'
airport_to_id    = 'XYZ'
carrier_name     = 'My Airline' ).
APPEND connection TO connections.
out->write(  `--------------------------------` ).
out->write(  `Example 1: APPEND with Work Area` ).
out->write(  connections ).
* Example 2: APPEND with VALUE #( ) expression
**********************************************************************
APPEND VALUE #( carrier_id       = 'NN'
connection_id    = '1234'
airport_from_id  = 'ABC'
airport_to_id    = 'XYZ'
carrier_name     = 'My Airline'
)
TO connections.
out->write(  `----------------------------` ).
out->write(  `Example 2: Append with VALUE` ).
out->write(  connections ).
* Example 3: Filling an Internal Table with Several Rows
**********************************************************************
carriers = VALUE #(  (  carrier_id = 'AA' carrier_name = 'American Airlines' )
(  carrier_id = 'JL' carrier_name = 'Japan Airlines'    )
(  carrier_id = 'SQ' carrier_name = 'Singapore Airlines')
).
out->write(  `-----------------------------------------` ).
out->write(  `Example 3: Fill Internal Table with VALUE` ).
out->write(  carriers ).
* Example 4: Filling one Internal Table from Another
**********************************************************************
connections = CORRESPONDING #( carriers ).
out->write(  `--------------------------------------------` ).
out->write(  `Example 4: CORRESPONDING for Internal Tables` ).
out->write(  data = carriers
name = `Source Table CARRIERS:`).
out->write(  data = connections
name = `Target Table CONNECTIONS:`).
  1. 按键盘上的 CTRL + F3 激活类,按 F9 执行控制台应用。

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

访问复杂内部表

在本课程之前的版本中,您学习了如何使用内部表表达式从简单的内部表中检索单个行。然后,我们使用索引访问,即通过行在内部表中的位置标识行。此索引访问以同样的方式用于复杂的内部表。但是,对于复杂的内部表,具有关键字访问的内部表表达式变得很重要,您可以通过其内容识别行。

注意

尽管这称为键值访问,但您可以使用任何字段进行选择,而不仅仅是内部表的关键字段。如果多行满足要求,STANDARD 表将返回第一行,即索引最低的行。

此示例从内部表连接中读取单个行。此内部表的键值由字段 carrier_id 和 connection_id 组成,但键值访问使用 airport_from_id 和 airport_to_id 标识行。内部表包含从机场 SFO 到 SIN 的两个连接,因此返回第一个。

请记住,如果没有行满足要求,ABAP 运行时会引发异常 CX_SY_ITAB_LINE_NOT_FOUND。在 TRY…CATCH…ENDTRY 结构中处理此异常以避免运行时错误

要通过指定字段处理内部表的多行,请使用 LOOP AT <内部表> INTO <目标> WHERE <条件>。WHERE 条件可以包含任意数量的使用 AND 和 OR 连接的构成表达式。在表达式中,不仅可以使用等于运算符 (=),还可以使用运算符 >、>=、<、<=、<> 和 BETWEEN。

将表行的内容读取到工作区后,有时想要将更改从工作区写回内部表。一种方法是 MODIFY TABLE 语句。

此语句是键值访问,因为系统使用工作区中关键字段的内容来标识需要修改的表行。然后用工作区的内容覆盖此表行。

在此示例中,工作区载体在关键字段 carrier_id 中包含值 'JL'。系统基于此值标识要更新的第二行。然后使用工作区中的值更新此行。

注意

只能使用 MODIFY TABLE 更改非键值字段。语句不支持更改关键字段。

MODIFY 语句(无关键字 TABLE!)不区分关键字段和非关键字段。它使用工作区中的新值覆盖整个表行。此语句被视为索引访问,因为要更新的行由其在内部表中的位置标识。通常,使用附加 INDEX 后跟整数参数(文字、常量、变量、表达式)显式指定索引。

注意

还有一个不含附加 INDEX 的特殊变式。我们接下来将讨论此变式。

在此示例中,MODIFY 语句使用 INDEX 附加来寻址第一个表行。在此行中,使用工作区中的值覆盖所有字段,甚至关键字段 carrier_id。

有时您需要修改内部表的多行的内容,甚至可能修改所有行的内容。为此,对表实施循环,将您需要连续更改的每一行置于工作区域中。在 循环中,首先更改工作区的内容,然后使用 MODIFY 语句将更改写回内部表。

注意

如果未将更改写回到表中,则使用下一行中的数据填充工作区时,更改将丢失。

在示例中,循环读取尚未填充字段 currency_code 的内部表运输公司的所有行。这适用于最后两行。对于其中每一行,程序将字段 currency_code 中的初始值替换为新值 'USD'。最后,它使用 MODIFY 语句用更新的值覆盖当前行。

代码示例使用缺少 INDEX 附加的 MODIFY 语句的简写形式,而不是显式指定索引。此简写形式仅允许在 LOOP…ENDLOOP 之间。只有在该处,系统才能隐式更新当前正在处理的行。

如果在 LOOP…ENDLOOP 之外使用不含 INDEX 的 MODIFY,则系统不知道要修改的行并触发不可捕获的运行时错误。为避免此类运行时错误,请确保不忽略语法检查中的相关警告!

试用:访问复杂内部表

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

  2. 将以下代码片段复制到方法 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.
TYPES tt_connections TYPE SORTED TABLE OF   st_connection
WITH NON-UNIQUE KEY carrier_id
connection_id.
DATA connections TYPE tt_connections.
DATA connection  LIKE LINE OF connections.
TYPES: BEGIN OF st_carrier,
carrier_id    TYPE /dmo/carrier_id,
currency_code TYPE /dmo/currency_code,
END OF st_carrier.
DATA carriers TYPE STANDARD TABLE OF st_carrier
WITH NON-UNIQUE KEY carrier_id.
DATA carrier LIKE LINE OF carriers.
* Preparation: Fill internal tables with data
**********************************************************************
connections = VALUE #(  ( carrier_id      = 'JL'
connection_id   = '0408'
airport_from_id = 'FRA'
airport_to_id   = 'NRT'
carrier_name    = 'Japan Airlines'
)
( carrier_id      = 'AA'
connection_id   = '0017'
airport_from_id = 'MIA'
airport_to_id   = 'HAV'
carrier_name    = 'American Airlines'
)
( carrier_id      = 'SQ'
connection_id   = '0001'
airport_from_id = 'SFO'
airport_to_id   = 'SIN'
carrier_name    = 'Singapore Airlines'
)
( carrier_id      = 'UA'
connection_id   = '0078'
airport_from_id = 'SFO'
airport_to_id   = 'SIN'
carrier_name    = 'United Airlines'
)
).
carriers = VALUE #(  (  carrier_id    = 'SQ'
currency_code = ' '
)
(  carrier_id    = 'JL'
currency_code = ' '
)
(  carrier_id    = 'AA'
currency_code = ' '
)
(  carrier_id    = 'UA'
currency_code = ' '
)
).
* Example 1: Table Expression with Key Access
**********************************************************************
out->write(  `--------------------------------------------` ).
out->write(  `Example 1: Table Expressions with Key Access` ).
out->write(  data = connections
name = `Internal Table CONNECTIONS: ` ).
" with key fields
connection = connections[ carrier_id    = 'SQ'
connection_id = '0001' ].
out->write(  data = connection
name = `CARRIER_ID = 'SQ' AND CONNECTION_ID = '001':` ).
" with non-key fields
connection = connections[ airport_from_id = 'SFO'
airport_to_id   = 'SIN' ].
out->write(  data = connection
name = `AIRPORT_FROM_ID = 'SFO' AND AIRPORT_TO_ID = 'SIN':` ).
* Example 2: LOOP with key access
**********************************************************************
out->write(  `-------------------------------` ).
out->write(  `Example 2: LOOP with Key Access` ).
LOOP AT connections INTO connection
WHERE airport_from_id <> 'MIA'.
"do something with the content of connection
out->write( data = connection
name = |This is row number { sy-tabix }: | ).
ENDLOOP.
* Example 3: MODIFY TABLE (key access)
**********************************************************************
out->write(  `-----------------------------------` ).
out->write(  `Example 3: MODIFY TABLE (key access` ).
out->write(  data = carriers
name = `Table CARRRIERS before MODIFY TABLE:`).
carrier = carriers[  carrier_id = 'JL' ].
carrier-currency_code = 'JPY'.
MODIFY TABLE carriers FROM carrier.
out->write(  data = carriers
name = `Table CARRRIERS after MODIFY TABLE:`).
* Example 4: MODIFY (index access)
**********************************************************************
out->write(  `--------------------------------` ).
out->write(  `Example 4: MODIFY (index access)` ).
carrier-carrier_id    = 'LH'.
carrier-currency_code = 'EUR'.
MODIFY carriers FROM carrier INDEX 1.
out->write(  data = carriers
name = `Table CARRRIERS after MODIFY:`).
* Example 5: MODIFY in a LOOP
**********************************************************************
out->write(  `----------------------------` ).
out->write(  `Example 5: MODIFY  in a LOOP` ).
LOOP AT carriers INTO carrier
WHERE currency_code IS INITIAL.
carrier-currency_code = 'USD'.
MODIFY carriers FROM carrier.
ENDLOOP.
out->write(  data = carriers
name = `Table CARRRIERS after the LOOP:`).
  1. 按键盘上的 CTRL + F3 激活类,按 F9 执行控制台应用。

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

ABAP SQL 中的复杂内部表

ABAP SQL 语句 SELECT 从数据库表或 CDS 视图中读取数据。使用 SINGLE 选项时,即使存在满足 WHERE 子句中条件的更多数据,也只会从数据库中读取一条记录。

如前所述,接收此单个记录结果的一种方式是在关键字 INTO 后的结构变量。

如果使用 SELECT 而不使用 SINGLE,则表明您对与 WHERE 子句中的条件匹配的所有记录感兴趣。然后,您必须确保实际可以接收和存储多个记录。执行此操作的明显方法是将复杂内部表用作 SELECT 语句的目标。这是可能的,但它要求在关键字 INTO 和内部表的名称之间增加附加项 TABLE。

在示例中,我们希望阅读与伦敦相关的所有三个机场,而不仅仅是其中一个。因此,我们将关键字 SINGLE 留在 SELECT 之后,在 INTO 后添加关键字 TABLE,并使用内部表 airports_full 作为 SELECT 语句的目标。

该示例在与内部表 airports_full 的列匹配的 FIELDS 之后使用显式字段列表。当然,您还可以在字段列表中使用 FIELDS *、INTO CORRESPONDING FIELDS OF TABLE 和别名。

此示例使用 FIELDS * 代替显式字段列表和 INTO CORRESPONDING FIELDS OF TABLE 而不是 INTO TABLE。

由于内部表机场的行类型仅包含两个组件 AirportID 和 Name,因此仅从数据库中读取具有相同名称的字段。

如果在附加 INTO TABLE 之后在 SELECT 语句中使用 DATA( ),则内联声明内部表。此内部表的行类型派生自 FIELDS 子句。对于表字段和视图元素,别名是可选的。对于 FIELDS 子句中的表达式,如果 INTO 子句包含内联声明,则别名是必需的。

注意

仅在 INTO TABLE 之后支持内部表的内联声明。INTO CORRESPONDING FIELDS OF TABLE 之后不能使用内联声明。

内联声明的内部表始终是不含键值的标准表。无法使用内联声明声明排序表或散列表。如果用多个行填充内部表并使用大量键值访问,这可能会导致性能问题。

从数据库中读取多个记录时,一些特殊的 SQL 技术变得特别有趣。其中一种技术是用于组合多个 SELECT 语句结果的 UNION 指令。

该图说明了两个 SELECT 结果的组合:

第一个 SELECT 结果读取具有 CurrencyCode = 'GBP' 的所有运输公司的标识和 NAME。第二个 SELECT 读取具有 City = 'London' 的所有机场的 ID 和 NAME。第一个 SELECT 返回一条记录,第二个 SELECT 返回三条记录。它们不是单独检索这些结果,而是通过四个记录合并为一个结果。需要指出的是,数据库内部会发生这种情况。

当然,此技术的前提条件是两个结果相互兼容,即它们具有相同的字段数和相同字段名称。尽管不必这样做,但字段类型也是一样的。

此示例的 ABAP SQL 语法由两个 SELECT 语句组成。每个 SELECT 语句都有自己的 FROM 子句、FIELDS 子句和 WHERE 子句,但在最末尾只有一个 INTO 子句。两个 SELECT 语句通过关键字 UNION ALL 连接。

注意

使用 UNION 而不是 UNION ALL,数据库将在返回结果之前查找并消除重复项。我们使用 UNION ALL 避免对数据库进行不必要的额外装载。

两个字段列表由三个元素组成,第一个和第二个元素在两个 FIELDS 子句中具有相同的别名。第三个字段不需要别名,因为两个 CDS 视图中的字段名称相同。

注意

FIELDS 中的第一个元素是文字文本,允许我们在组合结果中区分航空公司和机场。

试用:ABAP SQL 中的内部表

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

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

TYPES: BEGIN OF st_airport,
airportid TYPE /dmo/airport_id,
name      TYPE /dmo/airport_name,
END OF st_airport.
TYPES tt_airports TYPE STANDARD TABLE OF st_airport
WITH NON-UNIQUE KEY airportid.
DATA airports TYPE tt_airports.
* Example 1: Structured Variables in SELECT SINGLE ... INTO ...
**********************************************************************
DATA airport_full TYPE /DMO/I_Airport.
SELECT SINGLE
FROM /DMO/I_Airport
FIELDS AirportID, Name, City, CountryCode
WHERE City = 'Zurich'
INTO @airport_full.
out->write(  `-------------------------------------` ).
out->write(  `Example 1: SELECT SINGLE ... INTO ...` ).
out->write(  data = airport_full
name = `One of the airports in Zurich (Structure):` ).
* Example 2: Internal Tables in SELECT ... INTO TABLE ...
**********************************************************************
DATA airports_full TYPE STANDARD TABLE OF /DMO/I_Airport
WITH NON-UNIQUE KEY AirportID.
SELECT
FROM /DMO/I_Airport
FIELDS airportid, Name, City, CountryCode
WHERE City = 'London'
INTO TABLE @airports_full.
out->write(  `------------------------------------` ).
out->write(  `Example 2: SELECT ... INTO TABLE ...` ).
out->write(  data = airports_full
name = `All airports in London (Internal Table):` ).
* Example 3: FIELDS * and INTO CORRESPONDING FIELDS OF TABLE
**********************************************************************
SELECT
FROM /DMO/I_Airport
FIELDS *
WHERE City = 'London'
INTO CORRESPONDING FIELDS OF TABLE @airports.
out->write(  `----------------------------------------------------------` ).
out->write(  `Example 3: FIELDS * and INTO CORRESPONDING FIELDS OF TABLE` ).
out->write(  data = airports
name = `Internal Table AIRPORTS:` ).
* Example 4: Inline Declaration
**********************************************************************
SELECT
FROM /DMO/I_airport
FIELDS AirportID, Name AS AirportName
WHERE City = 'London'
INTO TABLE @DATA(airports_inline).
out->write(  `----------------------------------------------------------` ).
out->write(  `Example 4: Inline Declaration after INTO TABLE` ).
out->write(  data = airports_inline
name = `Internal Table AIRPORTS_INLINE:` ).
** Example 4: ORDER BY and DISTINCT
***********************************************************************
*
*    SELECT
*      FROM /DMO/I_Airport
*    FIELDS DISTINCT CountryCode
*     ORDER BY CountryCode
*     INTO TABLE @DATA(countryCodes).
*
*    out->write(  countryCodes ).
* Example 5: UNION (ALL)
**********************************************************************
SELECT FROM /DMO/I_Carrier
FIELDS 'Airline' AS type, AirlineID AS Id, Name
WHERE CurrencyCode = 'GBP'
UNION ALL
SELECT FROM /DMO/I_Airport
FIELDS 'Airport' AS type, AirportID AS Id,  Name
WHERE City = 'London'
*    ORDER BY type, Id
INTO TABLE @DATA(names).
out->write(  `----------------------------------------------` ).
out->write(  `Example 5: UNION ALL of Airlines and Airports ` ).
out->write(  data = names
name = `ID and Name of Airlines and Airports:` ).
  1. 按键盘上的 CTRL + F3 激活类,按 F9 执行控制台应用。

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

使用复杂内部表

在本练习中,您将声明类似表的属性,使用 SELECT 语句填充该属性并访问内容。

模板:

  • /LRN/CL_S4D400_STS_STRUCTURE(全局类)

解决方案:

  • /LRN/CL_S4D400_ITS_ITAB(全局类)

任务 1: 复制模板

复制模板类。或者,复制上一练习的解决方案。

步骤

  1. 将类 /LRN/CL_S4D400_STS_STRUCTURE 复制到您自己的包中的类(建议名称:ZCL_##_ITAB,其中 ## 代表组编号)。

  2. 打开全局类 /LRN/CL_S4D400_STS_STRUCTURE 的源代码。

  3. 将项目浏览器视图与编辑器链接。

  4. 在项目浏览器视图中,右键单击类 /LRN/CL_S4D400_STS_STRUCTURE 以打开上下文菜单。

  5. 从上下文菜单中,选择复制 ....

  6. 在包字段中输入的名称。在名称字段中,输入名称 ZCL_##_ITAB,其中 ## 代表组编号。

  7. 调整描述,然后选择下一步

  8. 确认传输请求并选择完成

任务 2: 声明内部表

在本地 类中,声明类似表的静态属性**"机场**"以缓冲所有可用机场的详细信息。首先在本地类中定义私有结构类型 st_airport 和表类型 tt_airport

步骤

  1. 切换到局部类 lcl_connection

  2. 在全局类中,选择局部类型

  3. 使用以下组件定义私有结构类型 st_airport

结构类型 st_airport 的组件:

组件名称

数据类型

AirportID

/dmo/airport_id

名称

/dmo/airport_name

  1. 如下调整代码:

TYPES:
BEGIN OF st_details,
DepartureAirport   TYPE /dmo/airport_from_id,
DestinationAirport TYPE /dmo/airport_to_id,
AirlineName        TYPE /dmo/carrier_name,
END OF st_details.
TYPES:
BEGIN OF st_airport,
AirportId TYPE /dmo/airport_id,
Name      TYPE /dmo/airport_name,
END OF st_airport.
  1. 使用以下属性定义私有表类型 tt_airport

表类型 tt_airbilities 的属性:

属性

行类型

st_airport

表类别

标准表

键定义

非唯一缺省代码

  1. 如下调整代码:

TYPES:
BEGIN OF st_airport,
AirportId TYPE /dmo/airport_id,
Name      TYPE /dmo/airport_name,
END OF st_airport.
TYPES tt_airports TYPE STANDARD TABLE OF st_airport
WITH NON-UNIQUE DEFAULT KEY.
  1. 声明新的私有静态属性**机场**,并使用表类型 tt_airbilities 键入它。

  2. 在类定义末尾,添加以下代码:

CLASS-DATA airports TYPE tt_airports.

任务 3: 在类构造函数中填充静态属性

定义类构造函数并实施 SELECT 语句,该语句将 CDS 视图实体 /DMO/I_Airport 中的所有可用机场读取到静态属性**机场**。

步骤

  1. 使用快速修复将类构造函数添加到局部类 lcl_connection

  2. 将光标置于类名称上,然后按 Ctrl + 1

  3. 双击生成类构造函数

  4. 在类构造函数中,实施一个 SELECT 语句,该语句将 CDS 视图实体 /DMO/I_Airport 中的所有数据集读取到静态属性**机场**。

  5. 导航到方法 class_constructor 的实施。

  6. 在方法实施中添加以下代码:

SELECT FROM /DMO/I_Airport
FIELDS AirportID, Name
INTO TABLE @airports.

任务 4: 访问内部表的内容

在方法 get_output 中使用内部表**机场**的内容将机场名称添加到输出。

步骤

  1. 导航到方法 get_output 的实施。

  2. 按照先前练习中的操作继续操作。

  3. 方法开始时,将启运机场的详细信息读入结构化数据对象**启运**。

提示

使用表表达式 airports[ ... ] 和数据对象离开的内联声明。

  1. 在 方法的开头,添加以下代码:

DATA(departure)   = airports[ airportID = details-departureairport ].
  1. 同样,将目的地机场的详细信息读入结构化数据对象**目的地**。

  2. 如下调整代码:

DATA(departure)   = airports[ airportID = details-departureairport   ].
DATA(destination) = airports[ airportID = details-destinationairport ].
  1. 使用两个结构的组件**名称**将机场名称添加到输出。

  2. 如下调整代码:

APPEND |Departure:   { details-departureairport   } { departure-name   }| TO r_output.
APPEND |Destination: { details-destinationairport } { destination-name }| TO r_output.
  1. **可选:**忽略结构化数据对象并直接在字符串模板中使用表表达式。

  2. 对填充结构**启运目的地的**代码行进行注释。

  3. 在字符串模板中,将 departure-name 替换为 airports\[ airportid = details-departureairport \]-name

  4. 同样,将 destination-name 替换为 airports\[ airportid = details-destinationairport \]-name

  5. 激活此类。执行并分析控制台输出。检查输出是否显示所有属性的数据。

  6. Ctrl + F3 激活类。

  7. F9 键运行类。