定义字典结构

学习目标

  • 定义字典结构。

字典结构

字典结构可用作 ABAP 字典中的数据类型。

示例左侧的结构由五个组件组成。前四个组件参考各种数据元素。最后一个组件使用预定义的字典类型 CHAR 直接键入。

右侧的 ABAP 代码使用 TYPES 语句定义完全相同的结构类型。此代码可以位于方法、类的定义部分或接口中。前四个组件使用与字典结构中的组件相同的数据元素。最后一个组件使用内置 ABAP 类型 C。

除可扩展性和标签外,这两个结构完全兼容。

嵌套结构

ABAP 字典中的嵌套结构类型

播放视频以了解 ABAP 字典中的嵌套结构类型。

视频:本节含 SAP 官方视频(视频 ID 1_vj8b6dpx),需在 learning.sap.com 在线观看。

注意

输入具有嵌套结构类型的数据对象时,必须按如下方式访问其组件:

gs_struct-address-post_code = '69190'.
gs_struct-address-city      = 'Walldorf'.

无法直接访问地址的子组件。

如何定义嵌套结构

播放视频,了解如何定义嵌套结构。

视频:本节含 SAP 官方视频(视频 ID 1_0kokws3g),需在 learning.sap.com 在线观看。

Include 结构

不得将嵌套结构与包含其他结构类型的结构相混淆。

在本课程之前,您已了解如何在数据库表的字段列表中包含结构。定义结构类型时可使用相同的技术。

在示例中,结构 zs4d430s_person_include 共有 7 个组件:组件 first_namelast_name 直接在结构中定义,其他五个组件通过包括结构类型 zs4d430s_address 添加。

右侧的 ABAP 代码说明了如何使用 ABAP 类或接口中的 TYPES 语句定义相同的类型。

注意

要了解此代码,您必须注意 INCLUDE TYPES 是自己的语句,而不是语句 TYPES 的附加。TYPES 链语句在带有句号 (.) 的 INCLUDE 语句之前完成,新的 TYPES 链语句在 INCLUDE 语句之后开始。

注意

在 ABAP 中使用此类结构类型时,Include 不可见。您可以照常访问附加组件:

gs_struct-first_name = 'John'.
gs_struct-post_code  = '69190'.
gs_struct-city       = 'Walldorf'.

命名包含

将结构包括在其他结构中时,可以为包含文件命名。然后,此包含文件称为命名包含文件

在 ABAP 字典中,在关键字 INCLUDE 前添加名称,并用冒号 (:) 将两者隔开。在 ABAP 中定义结构类型时,将名称放在包含结构的名称之后,将关键字 AS 置于其前面。

命名包含文件建立了字段组的类型,允许您不仅直接访问字段,还可通过包含文件的名称进行访问。

让我们考虑一个使用结构类型 zs4d430s_person_include 键入的数据对象结构。您可以通过两种方式访问字段城市:像使用常规 include 文件一样使用 struct-city,或作为 struct-address-city

注意

命名的包含文件和字段组在 ABAP RESTful 应用程序编程模型的派生数据类型中大量使用。

如何包括结构

播放视频,了解如何包含结构。

视频:本节含 SAP 官方视频(视频 ID 1_pkph3xjr),需在 learning.sap.com 在线观看。

定义和使用字典结构

您需要一些可在多个全局类中访问的结构类型。您决定在 ABAP 字典中定义结构类型。

提示

在 ABAP 字典中定义结构类型之前,应研究在其中一个全局类或全局接口中定义公共结构类型的选项。

模板:

  • /LRN/CL_S4D430_TYT_STRUCTURE(全局类)

解决方案:

  • /LRN/CL_S4D430_TYS_STRUCTURE(全局类)

  • /LRN/S_ADDRESS(结构类型)

  • /LRN/S_NAME(结构类型)

  • /LRN/S_PERSON(结构类型)

任务 1: 定义简单结构

创建全局类 /LRN/CL_S4D430_TYT_STRUCTURE 的副本(建议名称:ZCL_##_STRUCTURE,其中 ## 是您的组编号)。将结构类型 st_address 替换为字典结构(建议名称:Z##S_ADDRESS)。

步骤

  1. 将类 /LRN/CL_S4D430_TYT_STRUCTURE 复制到自有包中的类(建议名称:ZCL_##_STRUCTURE,其中 ## 是您的组编号)。

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

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

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

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

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

  7. 在类定义的 PUBLIC SECTION 中,分析类型 st_address 的定义。

  8. 像之前一样执行此步骤。

  9. 创建结构类型的新字典对象(建议名称:Z##S_ADDRESS)。

  10. 在 项目浏览器 视图中,展开包并打开子节点 字典 上的上下文菜单。

  11. 选择 结构

  12. 确认包,输入名称 Z##S_ADDRESS 和描述**地址**,然后选择下一步

  13. 将新对象分配到传输请求,然后选择完成

  14. 从结构的组件列表中删除占位符 component_to_be_Changed : abap.string(0);。然后将其替换为组件**街道**。使用与全局类的 st_address 类型相同的数据元素。

  15. 如下调整代码:

define structure z##s_address {
street : /dmo/street;
}
  1. 为邮政编码、城市和国家/地区添加组件。使用与全局类的 st_address 类型中相同的组件名称和数据元素。

  2. 如下调整代码:

define structure z##s_address {
street      : /dmo/street;
postal_code : /dmo/postal_code;
city        : /dmo/city;
country     : land1;
}
  1. 激活结构类型。

  2. Ctrl + F3 激活开发对象。

  3. 返回到全局类的源代码。在 IF_OO_ADT_CLASSRUN~MAIN 方法的实施中,将 st_address 替换为新的字典结构类型。确保没有语法错误。

  4. 如下调整代码:

* Task 1
*****************************************************************
*    DATA address TYPE st_address.
DATA address TYPE z##s_address.
address-street      = 'Dietmar-Hopp-Allee 16'.
address-postal_code = '69190'.
address-city        = 'Walldorf'.
address-country     = 'DE'.

任务 2: 定义嵌套结构

在全局类中,移除或注释公共结构类型 st_person 并将其替换为字典结构(建议名称:Z##S_PERSON)。对于地址,重用已创建的结构类型。对于名称,使用快速修复创建包含两个组件的第二个简单结构(建议名称:Z##S_NAME)。

步骤

  1. 创建结构类型的新字典对象。

  2. 在项目浏览器视图中,展开包并打开字典子节点上的上下文菜单。

  3. 选择 结构

  4. 确认包,输入名称 Z##S_PERSON 和描述**人员(名称和地址)**,然后选择下一步

  5. 将新对象分配到传输请求,然后选择完成

  6. 从结构的组件列表中删除占位符 component_to_be_Changed : abap.string(0);,并将其替换为地址的组件(建议名称:地址)。输入具有您在先前任务 (Z##S_ADDRESS) 中创建的结构的新组件。

  7. 如下调整代码:

define structure z##s_person {
address : z##s_address;
}
  1. 为人员姓名添加另一个组件(建议名称:姓名)。输入 Z##S_NAME 作为组件类型的名称。

注意

此结构类型尚不存在。在下一步中创建。

  1. 如下调整代码:

define structure z##s_person {
name    : z##s_name;
address : z##s_address;
}
  1. 保存结构类型。然后使用快速修复创建结构类型 Z##S_NAME

  2. Ctrl + S 保存开发对象。

  3. 左键单击刚刚添加的代码行旁的错误图标,然后选择创建字典结构 ....

  4. 输入描述**名称**,然后选择下一步

  5. 将结构分配到传输请求,然后选择完成

  6. 从结构的组件列表中删除占位符 component_to_be_Changed : abap.string(0);并将其替换为名字(建议名称:first_name)的组件和姓氏的组件(建议名称:last_name)。使用 /DMO/ 命名空间中的合适数据元素作为组件类型。

  7. 如下调整代码:

define structure z##s_name {
first_name : /dmo/first_name;
last_name : /dmo/last_name;
}
  1. 保存结构类型。然后激活所有非活动开发对象。

  2. Ctrl + S 保存开发对象。

  3. 从 eclipse 工具栏中,选择激活非活动 ABAP 开发对象。或者,按 Ctrl + Shift + F3

  4. 选择全选激活

  5. 返回到全局类的源代码。在类定义的 PUBLIC SECTION 中,移除或注释类型 st_namest_person 的定义。

  6. 照常执行该步骤。

  7. IF_OO_ADT_CLASSRUN~MAIN 方法的实施中,将 st_person 替换为新的字典结构类型。确保没有语法错误。

  8. 如下调整代码:

* Task 2
***********************************************************
*    DATA person TYPE st_person.
DATA person TYPE z##s_person.
person-name-first_name     = 'Dictionary'.
person-name-last_name      = 'ABAP'.
person-address-street      = 'Dietmar-Hopp-Allee 16'.
person-address-postal_code = '69190'.
person-address-city        = 'Walldorf'.
person-address-country     = 'DE'.

任务 3: 定义命名包含文件

在全局类中,移除或注释公共结构类型 st_person_inc 并将其替换为字典结构(建议名称:Z##S_PERSON_INC)。而不是结构化组件 NAMEADDRESS 定义具有相同名称的命名包含文件。

步骤

  1. 创建嵌套字典结构的副本(建议名称:Z##S_PERSON_INC,其中 ## 是您的组编号)。

  2. 在项目浏览器视图中,展开包和子节点字典结构

  3. 打开结构类型 Z##S_PERSON 的上下文菜单,然后选择复制

  4. 输入名称 Z##S_PERSON_INC 并选择下一步

  5. 将新开发对象分配到传输请求并选择完成

  6. 将结构化组件**名称**转换为命名包含文件。

  7. 在分隔组件名称和组件类型的冒号之后,插入关键字 INCLUDE

  8. 对结构化组件**地址**重复此操作。

  9. 确保结构类型现在如下所示:

define structure z##s_person_inc {
name    : include z##s_name;
address : include z##s_address;
}
  1. 激活结构类型。

  2. Ctrl + F3 激活开发对象。

  3. 返回到全局类的源代码。在类定义的 PUBLIC SECTION 中,移除或注释 st_person_inc 类型的定义。

  4. 照常执行该步骤。

  5. IF_OO_ADT_CLASSRUN~MAIN 方法的实施中,将 st_person_inc 替换为新的字典结构类型。确保两个用于访问组件的备选项都有效。

  6. 如下调整代码:

* Task 3
**********************************************************************
* DATA person2 TYPE st_person_inc.
DATA person2 TYPE z##s_person_inc.
person2-name-first_name = 'Dictionary'.
person2-name-last_name = 'ABAP'.
person2-address-street = 'Dietmar-Hopp-Allee 16'.
person2-address-postal_code = '69190'.
person2-address-city = 'Walldorf'.
person2-address-country = 'DE'.
* or -------------------------------------------------------
person2-first_name = 'Dictionary'.
person2-last_name = 'ABAP'.
person2-street = 'Dietmar-Hopp-Allee 16'.
person2-postal_code = '69190'.
person2-city = 'Walldorf'.
person2-country = 'DE'.
  1. 激活类并将其调试为控制台应用。分析数据对象**地址人员和****人员 2** 的内容。

  2. Ctrl + F3 激活开发对象。

  3. F9 以控制台应用身份执行类。