定义字典结构
学习目标
定义字典结构。
字典结构

字典结构可用作 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_name 和 last_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)。
步骤
将类
/LRN/CL_S4D430_TYT_STRUCTURE复制到自有包中的类(建议名称:ZCL_##_STRUCTURE,其中##是您的组编号)。在项目浏览器视图中,右键单击类
/LRN/CL_S4D430_TYT_STRUCTURE以打开上下文菜单。从上下文菜单中,选择复制 ....
在包字段中输入包的名称。在名称字段中,输入名称
ZCL_##_STRUCTURE,其中 ## 代表组编号。调整描述,然后选择下一步。
确认传输请求并选择完成。
在类定义的 PUBLIC SECTION 中,分析类型
st_address的定义。像之前一样执行此步骤。
创建结构类型的新字典对象(建议名称:
Z##S_ADDRESS)。在 项目浏览器 视图中,展开包并打开子节点 字典 上的上下文菜单。
选择 新→结构 。
确认包,输入名称
Z##S_ADDRESS和描述**地址**,然后选择下一步。将新对象分配到传输请求,然后选择完成。
从结构的组件列表中删除占位符
component_to_be_Changed : abap.string(0);。然后将其替换为组件**街道**。使用与全局类的st_address类型相同的数据元素。如下调整代码:
define structure z##s_address {
street : /dmo/street;
}
为邮政编码、城市和国家/地区添加组件。使用与全局类的
st_address类型中相同的组件名称和数据元素。如下调整代码:
define structure z##s_address {
street : /dmo/street;
postal_code : /dmo/postal_code;
city : /dmo/city;
country : land1;
}
激活结构类型。
按
Ctrl + F3激活开发对象。返回到全局类的源代码。在
IF_OO_ADT_CLASSRUN~MAIN方法的实施中,将st_address替换为新的字典结构类型。确保没有语法错误。如下调整代码:
* 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)。
步骤
创建结构类型的新字典对象。
在项目浏览器视图中,展开包并打开字典子节点上的上下文菜单。
选择 新→结构 。
确认包,输入名称
Z##S_PERSON和描述**人员(名称和地址)**,然后选择下一步。将新对象分配到传输请求,然后选择完成。
从结构的组件列表中删除占位符
component_to_be_Changed : abap.string(0);,并将其替换为地址的组件(建议名称:地址)。输入具有您在先前任务 (Z##S_ADDRESS) 中创建的结构的新组件。如下调整代码:
define structure z##s_person {
address : z##s_address;
}
为人员姓名添加另一个组件(建议名称:
姓名)。输入Z##S_NAME作为组件类型的名称。
注意
此结构类型尚不存在。在下一步中创建。
如下调整代码:
define structure z##s_person {
name : z##s_name;
address : z##s_address;
}
保存结构类型。然后使用快速修复创建结构类型
Z##S_NAME。按
Ctrl + S保存开发对象。左键单击刚刚添加的代码行旁的错误图标,然后选择创建字典结构 ....
输入描述**
名称**,然后选择下一步。将结构分配到传输请求,然后选择完成。
从结构的组件列表中删除占位符
component_to_be_Changed : abap.string(0);并将其替换为名字(建议名称:first_name)的组件和姓氏的组件(建议名称:last_name)。使用 /DMO/ 命名空间中的合适数据元素作为组件类型。如下调整代码:
define structure z##s_name {
first_name : /dmo/first_name;
last_name : /dmo/last_name;
}
保存结构类型。然后激活所有非活动开发对象。
按
Ctrl + S保存开发对象。从 eclipse 工具栏中,选择激活非活动 ABAP 开发对象。或者,按
Ctrl + Shift + F3。选择全选并激活。
返回到全局类的源代码。在类定义的 PUBLIC SECTION 中,移除或注释类型
st_name和st_person的定义。照常执行该步骤。
在
IF_OO_ADT_CLASSRUN~MAIN方法的实施中,将st_person替换为新的字典结构类型。确保没有语法错误。如下调整代码:
* 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)。而不是结构化组件 NAME 和 ADDRESS 定义具有相同名称的命名包含文件。
步骤
创建嵌套字典结构的副本(建议名称:
Z##S_PERSON_INC,其中##是您的组编号)。在项目浏览器视图中,展开包和子节点字典→结构。
打开结构类型
Z##S_PERSON的上下文菜单,然后选择复制。输入名称
Z##S_PERSON_INC并选择下一步。将新开发对象分配到传输请求并选择完成。
将结构化组件**
名称**转换为命名包含文件。在分隔组件名称和组件类型的冒号之后,插入关键字
INCLUDE。对结构化组件**
地址**重复此操作。确保结构类型现在如下所示:
define structure z##s_person_inc {
name : include z##s_name;
address : include z##s_address;
}
激活结构类型。
按
Ctrl + F3激活开发对象。返回到全局类的源代码。在类定义的 PUBLIC SECTION 中,移除或注释
st_person_inc类型的定义。照常执行该步骤。
在
IF_OO_ADT_CLASSRUN~MAIN方法的实施中,将st_person_inc替换为新的字典结构类型。确保两个用于访问组件的备选项都有效。如下调整代码:
* 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'.
激活类并将其调试为控制台应用。分析数据对象**
地址、人员和****人员 2** 的内容。按
Ctrl + F3激活开发对象。按
F9以控制台应用身份执行类。