定义字典表类型

学习目标

  • 定义字典表类型。

  • 定义嵌套表类型。

字典表类型

创建字典表类型

播放视频以了解如何创建字典表类型。

视频:本节含 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)。

步骤

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

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

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

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

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

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

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

  8. 照常执行该步骤。

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

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

  11. 选择 表类型

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

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

  14. 指定结构类型 Z##S_ADDRESS 作为行类型。

注意

如果尚未完成上一练习,则可以改用结构类型 /LRN/S_ADDRESS。

  1. 行类型部分中,将类别预定义类型更改为字典

  2. 类型名称字段中,输入 /LRN/S_ADDRESSZ##S_ADDRESS

  3. 指定与表类型 tt_addresses 中相同的表种类和键值定义。

  4. 初始化和访问部分,将表类型从标准表更改为排序表

  5. 在"密钥概览"部分,选择*"<主键>"*。

  6. 在主密钥详细信息部分,将密钥定义从**标准密钥更改为密钥组件**。

  7. 关键组件部分,使用代码完整化输入 COUNTRYCITY 作为关键字段。

  8. 激活表类型。

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

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

  11. 如下调整代码:

* 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)。对于地址,重用已创建的表类型。

步骤

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

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

  3. 选择 结构

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

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

  6. 从结构的组件列表中删除占位符 component_to_be_Changed : abap.string(0);并将其替换为 first_name 的组件(建议名称:first_name),姓氏(建议名称:last_name)

  7. 如下调整代码:

define structure z##s_person_deep {
first_name : /dmo/first_name;
last_name  : /dmo/last_name;
}
  1. 为人员地址添加另一个组件(建议名称:地址)。使用您在上一个任务中创建的表类型作为类型。

  2. 如下调整代码:

define structure z##s_person_deep {
first_name : /dmo/first_name;
last_name  : /dmo/last_name;
addresses : z##t_addresses;
}
  1. 激活结构类型。

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

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

  4. 照常执行该步骤。

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

  6. 如下调整代码:

* 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)。使用您在先前任务中创建的深度结构类型作为其行类型。

步骤

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

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

  3. 选择 表类型

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

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

  6. 指定结构类型 Z##S_PERSON_DEEP 作为行类型。

  7. 行类型部分中,将类别预定义类型更改为字典

  8. 类型名称字段中,输入 Z##S_PERSON_DEEP

  9. 指定与表类型 tt_persons 中相同的表类型和键值定义。

  10. 初始化和访问部分,将表类型从**标准表更改为哈希表**。

  11. 在"密钥概览"部分,选择*"<主键>"*。

  12. 主键详细信息 部分,将 键值定义标准键值 更改为 键值组件 ,并将 键值类别非唯一 更改为 唯一

  13. 关键组件部分,指定关键字段 LAST_NAMEFIRST_NAME

  14. 激活表类型。

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

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

  17. 照常执行该步骤。

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

  19. 如下调整代码:

* 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'
)
)
)
).
  1. 激活类并将其调试为控制台应用。分析数据对象**地址人员和****人员**的内容。

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

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