定义字典表类型
学习目标
定义字典表类型。
定义嵌套表类型。
字典表类型
创建字典表类型
播放视频以了解如何创建字典表类型。
视频:本节含 SAP 官方视频(视频 ID
1_8dapgcrl),需在 learning.sap.com 在线观看。
字典表类型
表类型类型的字典对象编辑器基于表单,而不是基于代码,因为编辑器用于结构和数据库表。编辑器由以下四个部分组成:

行类型
此框架包含行类型的来源和名称。创建新表类型时,它使用长度为 1 的预定义字典类型 CHAR。
初始化和访问
此框架包含表访问类别(标准/排序/散列)的定义。缺省情况下,访问类别设置为标准表。
初始行数可用于为 ABAP 运行时提供有关初始内存需求大小的提示。使用缺省值 0, ABAP 运行时会自行完全分配初始内存区。请注意,在大多数情况下,最好保持缺省值 0 不变。
关键概览
此框架提供键值的概览。选择要查看其详细信息的密钥。
每种表类型都包含主键的定义。次键是可选的。示例中的表类型不包含任何次键。
关键详细信息
此框架显示所选键值的详细信息。这可能针对键值类别,即键值是唯一还是非唯一,以及键值定义。在此示例中,主键是非唯一的,由整个行类型组成。

比较字典表类型的定义和使用 ABAP 语句 TYPES 定义的表类型时,您可以轻松识别不同的部分:
在添加 OF 后指定 行类型 。
注意
TYPES 语句的语法在此处仅允许一个单词。使用需要长度的 ABAP 内置类型时(ABAP 类型不完整),必须在单独的 TYPES 语句中定义行类型。
表 访问类别 在附加项 TYPE 后指定。
主键定义 在附加项 WITH 之后指定。键值定义值 行类型 ,对应于 ABAP 语法中的 table_line 。
定义行类型的选项

定义表类型时,有多个选项可用于指定行类型:
字典类型
这是最常见的行类型类别。行类型是通过另一个字典对象(通常是结构)指定的。如果行类型是数据元素,则内部表将仅具有一个没有名称的列。
预定义类型
从技术上讲,使用预定义类型作为行类型与使用数据元素的类型相同。缺少的是数据元素的附加语义。
参考
对于其中一个选项,行类型为参考类型。内部表将具有一个无名列,其中包含数据对象或类实例的引用列表。
上的范围表
使用这些选项之一,表类型定义范围表的类型。尽管仅指定了预定义类型或数据元素,但范围表将具有四列:
OPTION
、
SIGN
、
LOW
和
HIGH
。有关范围表使用的详细信息,请参阅 ABAP 文档。

定义新表类型的行类型时,可以搜索现有字典类型。您将找到数据元素、结构,以及数据库表和表类型。将光标置于输入字段 类型名称 中并按 **Ctrl + 空格**键 ,或选择 浏览 。
提示
如果指定的字典类型存在,左键单击"类型名称"将导航到定义。
警告
即使此处提供了表类型,将其用作行类型也没有意义。生成的"表表"难以处理,因为没有识别外部表的行的简单方法。请改用具有表型组件的结构。我们稍后将讨论这些嵌套表。
访问类别和键值

表类别是表类型的技术属性,用于指定存储和主要访问方法。缺省值为标准表。其他值为:
排序表
内部表的内容随时按其主键排序。ABAP 运行时尽可能使用二进制搜索优化访问。限制适用于写入访问。
散列表
使用散列表管理内部表的内容。ABAP 运行时尽可能使用哈希算法优化访问。限制适用于读取和写入访问。
索引表和未指定
使用这些选项时,不会完全指定表类型。此类通用类型不能用于类型数据对象。其使用仅限于参数和字段符号。要使用通用数据类型,我们需要动态编程技术,而我们在此 ABAP 核心技能培训中不涵盖这些技术。有关详细信息,请参阅 ABAP 文档。

定义表类型的主键时,存在以下选项:
标准关键字
标准键值(也称为缺省键值)由行类型的所有非数值组件组成。
行类型
使用此选项,主键由行类型的所有组件组成。如果行类型是非结构化的,则一列为关键列。
未指定
如果使用此选项,则不会定义主键。表类型是通用的,不能用于 ABAP 数据对象。
关键组件
主键由显式指定的组件组成。选择此选项时,编辑器将在*"主密钥详细信息*"部分下方显示一个新部分。然后,您必须在此部分输入关键组件。
注意
按 Ctrl + 空格从行类型的组件中进行选择。
注意
请记住,内部表的主键不必唯一。对于标准表和排序表,还支持非唯一主键。对于标准表,实际上是唯一的选项。这与主键始终是唯一键的数据库表相反。
次键定义
播放视频,了解辅助密钥定义。
视频:本节含 SAP 官方视频(视频 ID
1_9dcyd3dp),需在 learning.sap.com 在线观看。
如何定义字典表类型
播放视频以了解如何定义字典表类型。
视频:本节含 SAP 官方视频(视频 ID
1_74wznkxa),需在 learning.sap.com 在线观看。
嵌套表类型

可以使用表类型来键入结构类型的组件。在此示例中,使用表类型 zs4d430T_ad**dresses 键入组件地址。右侧的 ABAP 代码说明了如何在 ABAP 中定义完全相同的结构类型。
注意
具有表型组件的结构通常称为深度结构。相反的是平面结构。这必须与 ABAP 中此类数据对象的内存布局相关。有关深层结构和平面结构的详细信息,请参阅 ABAP 文档。

当使用具有表型组件的结构作为另一个表类型的行类型时,此表类型将变为嵌套。在此示例中,结构 ZS4D430S_PERSON_DEEP 用作表类型 ZS4D430T_NESTED 的行类型。生成的内部表的列地址在每行中包含一个内部表。
注意
在外部表的每一行中,内部表可以有不同的行数。
定义和使用字典表类型
您需要一些可在多个全局类中访问的表类型。您决定在 ABAP 字典中定义表类型。
提示
在 ABAP 字典中定义表类型之前,应研究在其中一个全局类或全局接口中定义公共表类型的选项。
模板:
/LRN/CL_S4D430_TYT_TABLE_TYPE(全局类)
解决方案:
/LRN/CL_S4D430_TYS_TABLE_TYPE(全局类)
/LRN/T_ADDRESSES(表类型)
/LRN/S_PERSON_DEEP(结构类型)
/LRN/T_PERSONS(表类型)
任务 1: 定义表类型
创建全局类 /LRN/CL_S4D430_TYT_TABLE_TYPE 的副本(建议名称:ZCL_##_TABLE_TYPE,其中 ## 是您的组编号)。将公共表类型 tt_addresses 替换为字典表类型(建议名称:Z##T_ADDRESSES)。
步骤
将类
/LRN/CL_S4D430_TYT_TABLE_TYPE复制到您自己的包中的类(建议名称:ZCL_##_TABLE_TYPE,其中 ## 代表组编号)。在项目浏览器视图中,右键单击类
/LRN/CL_S4D430_TYT_TABLE_TYPE以打开上下文菜单。从上下文菜单中,选择复制 ....
在包字段中输入包的名称。在名称字段中,输入名称
ZCL_##_TABLE_TYPE,其中 ## 代表组编号。调整描述,然后选择下一步。
确认传输请求并选择完成。
在类定义的 PUBLIC SECTION 中,分析类型
tt_addresses的定义。照常执行该步骤。
创建表类型类型的新字典对象(建议名称:
Z##T_ADDRESSES)。在 项目浏览器 视图中,展开包并打开子节点 字典 上的上下文菜单。
选择 新→表类型 。
确认包,输入名称
Z##T_ADDRESSES和描述**地址**,然后选择下一步。将新对象分配到传输请求,然后选择完成。
指定结构类型
Z##S_ADDRESS作为行类型。
注意
如果尚未完成上一练习,则可以改用结构类型 /LRN/S_ADDRESS。
在行类型部分中,将类别从预定义类型更改为字典。
在类型名称字段中,输入
/LRN/S_ADDRESS或Z##S_ADDRESS。指定与表类型
tt_addresses中相同的表种类和键值定义。在初始化和访问部分,将表类型从标准表更改为排序表。
在"密钥概览"部分,选择*"<主键>"*。
在主密钥详细信息部分,将密钥定义从**
标准密钥更改为密钥组件**。在关键组件部分,使用代码完整化输入
COUNTRY和CITY作为关键字段。激活表类型。
按
Ctrl + F3激活开发对象。返回到全局类的源代码。在
IF_OO_ADT_CLASSRUN~MAIN方法的实施中,将tt_addresses替换为新的字典结构类型。确保没有语法错误。如下调整代码:
* Task 1
**********************************************************************
* DATA addresses TYPE tt_addresses.
DATA addresses TYPE z##t_addresses.
addresses =
VALUE #(
( street = 'Dietmar-Hopp-Allee 16'
postal_code = '69190'
city = 'Walldorf'
country = 'DE'
)
( street = '3999 West Chester Pike'
postal_code = '19073'
city = 'Newtown Square, PA'
country = 'US'
)
).
任务 2: 定义深度结构
在全局类中,移除或注释公共结构类型 st_person_deep,并将其替换为字典结构(建议名称:Z##S_PERSON_DEEP)。对于地址,重用已创建的表类型。
步骤
创建结构类型的新字典对象。
在 项目浏览器 视图中,展开包并打开子节点 字典 上的上下文菜单。
选择 新→结构 。
确认包,输入名称
Z##S_PERSON_DEEP和描述**人员(名称和多个地址)**,然后选择下一步。将新对象分配到传输请求,然后选择完成。
从结构的组件列表中删除占位符
component_to_be_Changed : abap.string(0);并将其替换为 first_name 的组件(建议名称:first_name),姓氏(建议名称:last_name)。如下调整代码:
define structure z##s_person_deep {
first_name : /dmo/first_name;
last_name : /dmo/last_name;
}
为人员地址添加另一个组件(建议名称:
地址)。使用您在上一个任务中创建的表类型作为类型。如下调整代码:
define structure z##s_person_deep {
first_name : /dmo/first_name;
last_name : /dmo/last_name;
addresses : z##t_addresses;
}
激活结构类型。
按
Ctrl + F3激活开发对象。返回到全局类的源代码。在类定义的 PUBLIC SECTION 中,移除或注释
st_person_deep类型的定义。照常执行该步骤。
在
IF_OO_ADT_CLASSRUN~MAIN方法的实施中,将st_person_deep替换为新的字典结构类型。确保没有语法错误。如下调整代码:
* Task 2
**********************************************************************
* DATA person TYPE st_person_deep.
DATA person TYPE /lrn/s_person_deep.
person-first_name = 'Dictionary'.
person-last_name = 'ABAP'.
person-addresses = addresses.
任务 3: 定义嵌套表类型
在全局类中,移除或注释公共表类型 tt_persons,并将其替换为字典表类型(建议名称:Z##T_PERSONS)。使用您在先前任务中创建的深度结构类型作为其行类型。
步骤
创建表类型的新字典对象。
在 项目浏览器 视图中,展开包并打开子节点 字典 上的上下文菜单。
选择 新→表类型 。
确认包,输入名称
Z##T_PERSONS和描述**人员(含名称和地址)**,然后选择下一步。将新对象分配到传输请求,然后选择完成。
指定结构类型
Z##S_PERSON_DEEP作为行类型。在行类型部分中,将类别从预定义类型更改为字典。
在类型名称字段中,输入
Z##S_PERSON_DEEP。指定与表类型
tt_persons中相同的表类型和键值定义。在初始化和访问部分,将表类型从**
标准表更改为哈希表**。在"密钥概览"部分,选择*"<主键>"*。
在 主键详细信息 部分,将 键值定义 从
标准键值更改为键值组件,并将 键值类别 从非唯一更改为唯一。在关键组件部分,指定关键字段
LAST_NAME和FIRST_NAME。激活表类型。
按
Ctrl + F3激活开发对象。返回到全局类的源代码。在类定义的 PUBLIC SECTION 中,移除或注释
tt_persons类型的定义。照常执行该步骤。
在
IF_OO_ADT_CLASSRUN~MAIN方法的实施中,将tt_persons替换为新的字典表类型。确保没有语法错误。如下调整代码:
* Task 3
**********************************************************************
* DATA persons TYPE tt_persons.
DATA persons TYPE /lrn/t_persons.
persons =
VALUE #(
( person )
(
first_name = 'CDS'
last_name = 'ABAP'
addresses =
VALUE #(
( street = 'SAP-Allee 29'
postal_code = '68789'
city = 'St.Leon-Rot'
country = 'DE'
)
( street = '35 rue d''Alsace'
postal_code = '92300'
city = 'Levallois-Perret'
country = 'FR'
)
( street = 'Bedfont Road'
postal_code = 'TW14 8HD'
city = 'Feltham'
country = 'GB'
)
)
)
).
激活类并将其调试为控制台应用。分析数据对象**
地址、人员和****人员**的内容。按
Ctrl + F3激活开发对象。按
F9以控制台应用身份执行类。