创建数据库表

学习目标

  • 创建表定义。

  • 编辑数据库表的字段列表。

  • 维护附加表属性。

  • 定义和使用包含文件结构。

表定义创建

创建数据库表定义时,编辑器从说明源代码基本布局的模板开始。它由以下三个部分组成:

语义表属性

@ 符号开头的代码行称为注释,用于定义语义表属性。语义属性预设置为最常见的值。稍后,我们将在本课程中讨论他们。

定义表语句

define table 语句后跟数据库表的名称。创建开发对象时指定此名称。在源代码中进行更改会导致语法错误。

字段清单

表名称后的括号对包含表的字段列表。每个字段定义以分号 ( ;) 结尾,由字段名称和字段类型组成,以冒号 ( :) 分隔。数据库表定义的模板建议第一个表字段,名称为 client,类型为 abap.clnt。保留此字段以确保表仍与客户端相关。

如何创建新表定义

播放视频,了解如何创建新的表定义。

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

字段清单编辑

编辑数据库表的字段列表时,建议使用数据元素。如果数据元素已存在,则可以在冒号后开始键入其名称,然后按 Ctrl + Enter 查看匹配数据元素的列表。向上和向下滚动列表以显示数据元素的详细信息,例如基础类型、描述和字段标签文本。

如果没有要使用的数据元素,可以使用快速修复直接创建一个。输入与数据元素不对应的类型名称时,将显示错误消息。此错误消息附带快速修复。单击此代码行左侧的错误图标,或将光标置于类型名称上并按 Ctrl + 1 调用快速修复。

注意

错误消息为:

字段 <字段名称>:使用的组件类型或域未激活或不存在。不要让这混淆你。无法直接在数据库表的字段列表中使用域。

每个数据库表都需要一个主键。主键是表行的唯一标识。它由名为关键字段的表字段子集组成。为表的主键创建主索引。为关键字段指定值时,此索引提供对表行的优化键访问。

在数据库表定义中,通过在表字段名称前指定附加键值将字段标记为关键字段。必须至少将一个表字段标记为关键字段,并且每个表中最多可以有 16 个关键字段。表的关键字段必须一起位于表的开头,这意味着两个关键字段之间不允许非关键字段。

空值是数据库返回的特殊值,用于指示未定义的值或结果。Null 值与 ABAP 中数据对象的任何内容都不对应。如果数据库返回空值,则会将其替换为 ABAP 中类型特定的初始值。

最初,NOT NULL 附加项用于强制数据库中特定于类型的初始值以避免初始值和空值之间混淆。通过将 NOT NULL 添加到表字段,开发人员可确保表列不能包含空值。这对于主键尤为重要。因此,关键字段的 NOT NULL 附加成为必填字段。

今天,键值字段仍需要 NOT NULL 附加项,但不再起作用。无论是否添加 NOT NULL,字典工具都会为几乎所有字段强制实施类型特定的初始值。

唯一例外是某些类型的字段,即不存在初始值的字段。对于此类字段,技术上无法强制使用初始值。因此,编辑器不允许您向这些字段添加 NOT NULL。在此示例中,数据元素 /DMO/email_address 基于预定义类型 STRG。类型 STRG 是不存在初始值的预定义类型之一。向字段 email_address 添加 NOT NULL 时,编辑器会发出语法错误。

注意

不必手动将 NOT NULL 添加到关键字段。如果在激活期间,关键字段缺少 NOT NULL 标志,则编辑器会自动添加。

金额字段是基于预定义类型 CURR 的字段。数据库表定义中的金额字段需要参考货币代码字段。货币代码字段基于预定义类型 CUKY。在示例中,字段 PRICE 是金额字段,字段 CURRENCY_CODE 是货币代码字段。参考在金额字段之前使用注释 @Semantics.amount.currencyCode 定义。注释的 参数包含表名称加上由句号 (.) 分隔的货币代码字段的名称。

注意

通常,金额和货币代码字段位于同一数据库表中,如示例所示。但是,也可以在另一个数据库表中参考货币代码字段。

同样,基于预定义类型 QUAN 的数量字段需要基于预定义类型 UNIT 参考单位字段。数量字段的相应注释为 @Semantics.quantity.unitOfMeasure

注意

传统 UI 框架直接在字典对象之上构建。他们评估了参考字段,以根据货币代码或单位调整金额和数量的显示。稍后,我们将看到,对于基于 CDS 视图构建的现代 UI,为 CDS 视图中的金额和数量字段提供了类似的注释。

金额和数量字段的快速修复

播放视频以了解金额和数量字段的快速修复。

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

如何编辑字段清单

播放视频,了解如何编辑新建数据库表的字段列表。

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

附加表属性

字段列表是数据库表定义中非常重要的部分。但您必须提供更多信息来定义数据库表。使用以下技术定义表属性:

注释

注释是以 @ 符号开头的代码行。注释是表定义本身的一部分,用于定义技术和语义属性。

技术表设置

技术表设置构成了独立的开发对象,可以独立于表进行激活和传输。它们定义物理数据库表的属性,并影响通过 ABAP SQL 的访问。

注意

创建新的数据库表时,编辑器会将表属性设置为最常见的值。这允许您在不编辑表属性的情况下激活表。但应始终确保缺省值适用于表,并在必要时进行更改。

表注释

播放视频以了解表注释。

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

某些表属性不使用注释进行维护,而是使用基于表单的专用编辑器。要打开此技术表设置编辑器,请右键单击数据库表定义中的任意位置,然后选择打开其他技术设置

提示

技术表设置也显示在项目浏览器中,作为数据库表的子元素。

技术表设置对话框包含以下三个部分:

常规设置

常规设置的主要目的是影响在数据库中创建表的方式。是否将给定设置传递到数据库取决于数据库系统。例如,数据类不再对 SAP HANA 作为数据库系统产生影响。但是,始终必须提供值。

缓冲

使用缓冲设置,可以定义如何在应用服务器实例的表缓冲区中缓冲字典数据库表以及是否允许缓冲。使用 ABAP SQL 访问具有活动缓冲的表时,将隐式使用表缓冲区。

数据更改

如果在此部分激活日志记录,则在 ABAP SQL 中对表条目所做的任何更改都将记录在日志表 DBTABLOG 中。存在各种前提条件和限制。有关详细信息,请参阅 ABAP 文档。

应将此日志记录机制限制为很少更改的非常重要的数据库表。由于具有此标志的所有表的数据更改都记录在同一个数据库表中,因此日志表可能会出现锁定情况。通常,日志记录应由应用程序逻辑完成。

常规设置可用于影响在数据库中创建表的方式。但并非所有设置都会产生影响。它取决于数据库系统,即给定技术设置是否实际传递到数据库。

存在以下常规设置:

数据类

数据类仅对 Oracle 数据库有效。所有其他数据库都会将其忽略 - 尤其是 SAP HANA。它仍然是强制性的,但仅作为文档手段。应用程序数据最重要的数据类包括:

  • APPL0(主数据)

  • 很少更改的数据。主数据的一个示例是地址表中的数据,例如名称、邮政地址和电话号码。

  • APPL1(事务数据)

  • 频繁更改的数据。事务数据的一个示例是每次下订单时都会更改的仓库库存。

  • APPL2(组织数据)

  • 配置系统时指定的定制数据,然后很少更改。一个示例是包含国家/地区代码的表 T005。

运行时框架内部使用的系统表还有其他数据类,例如 ABAP 字典表的数据字典。

大小范畴

大小类别会影响为 数据库中的 表保留的初始内存区的大小。可以指定介于 0 和 9 之间的值,并将预期行的间隔分配给这些值。分配给每个大小类别的间隔限制取决于数据库表的结构。如果超出预留的初始空间,则会根据所选大小类别隐式添加新内存区域。

提示

应选择适当的大小类别,以防止过多的小内存区或内存区过大。

存储类型

仅当当前数据库为 SAP HANA 数据库时,存储类型才有效。可以为 SAP HANA 数据库定义以下设置:

  • 列存储 - 在以下情况中应使用此设置:

  • DDIC 数据库表专为在 SAP HANA 中分析的应用程序数据而设计。

  • DDIC 数据库表包含大量行,因为存储类型 列存储 提供更好的压缩。

  • DDIC 数据库表包含仅仓储类型列存储支持的 SAP HANA 数据类型的表字段。

  • 行存储

  • 仅当数据库表主要用于频繁的单行访问时,此设置才应在 SAP HANA 数据库中使用。

提示

有关 SAP HANA 数据库中行存储和列存储之间差异的详细信息,请参阅 SAP HANA 文档。

加载单位

仅当当前数据库为 SAP HANA 数据库时,加载单位才有效。表的加载单位指定如何将表的数据加载到 SAP HANA 数据库的主内存中。SAP HANA 数据库提供以下设置:

  • 可加载列

  • 将整个表视为内存中。系统启动后,以列导向格式将表数据加载到 SAP HANA 数据库的主内存中。这是缺省行为。

  • 页面可加载

  • 通过使用名为本机存储扩展 (NSE) 的 SAP HANA 数据库的功能,表数据以页面而不是列的形式存储在磁盘上。这些页面仅在请求时加载到 SAP HANA 主内存中的特殊缓冲区。缓冲区中未使用的数据可以分页。

通常,页面可加载用于访问频率较低的大型表。

在字典中,您可以强制执行特定的加载单位设置,也可以仅将其设置为首选 - 允许在数据库中进行其他设置。

提示

有关 SAP HANA 数据库上的本机存储扩展的详细信息,请参阅 SAP HANA 文档。

如何维护技术表设置

播放视频,了解如何维护数据库表定义的技术表设置。

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

含 Include 结构的数据库表

Include 结构是一种技术,您可以在其中将整个字段子集添加到数据库表的字段列表中。首先定义结构类型的开发对象,其中包含要添加到数据库表的字段。此开发对象不定义数据库对象本身。但在使用语句 INCLUDE 在字段列表中引用时,数据库中的表将具有在 INCLUDE 语句位置的结构中定义的字段。

在示例中, 结构定义了三个字段。表定义使用第二个和第三个字段之间的 include 语句定义四个字段。然后,数据库中的 表总共有七列。

此技术的常见用例是数据模型,您想要确保多个数据库表包含相同类型的相同字段子集。

在接下来的示例中,我们将使用包含结构将用户和时戳的管理字段添加到数据库表。

注意

此类管理字段在 ABAP RESTful 应用程序编程模型中起着重要作用。

这是含有五个字段的结构定义,两个用于用户名,三个用于不同的时戳。

如您所见,结构定义与数据库表定义非常相似。主要区别在于关键字 define structure 而不是 define table,并且缺少许多数据库表必需的注释。

使用关键字 INCLUDE 将结构的五个字段添加到数据库表的字段列表中,后跟结构的名称。

提示

使用编辑器的自动完成功能(Ctrl + 空格)从现有结构中进行选择。

请注意,不会复制这些字段。数据库表定义引用结构的字段。这意味着稍后编辑结构的字段列表时,数据库表的字段列表将立即更新。

检查结果的便捷方式是数据库表的工具提示显示。将光标置于数据库表的名称上,然后按 F2 键。如您所见,数据库表的字段清单包含 Include 结构的五个字段。

如何定义和使用包含文件结构

播放视频,了解如何定义和使用包含结构。

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

创建数据库表定义

您想要创建自己的数据模型。在本练习中,定义员工数据的数据库表。

模板:

  • 不适用

解决方案:

  • /LRN/EMPLOY(数据库表定义)

  • /LRN/BIRTH_DATE(数据元素)

  • /LRN/ENTRY_DATE(数据元素)

任务 1: 定义数据库表

创建新的数据库表定义 Z##EMPLOY,其中 ## 是您的组编号。

除客户端字段外,添加以下字段:

字段名称

数据元素

employee_id

Z##_EMPLOYEE_ID(在上一练习中创建)

first_name

/DMO/FIRST_NAME

last_name

/DMO/LAST_NAME

出生日期

Z##_BIRTH_DATE(新增,基于域 /DMO/DATE)

entry_date

Z##_ENTRY_DATE(新增,基于域 /DMO/DATE)

年薪工资

Z##_ANNUAL_SALARY(在上一练习中创建)

货币代码

WAERS

提示

如果尚未完成上一练习,则可以使用数据元素 /LRN/EMPLOYEE_ID 和 /LRN/ANNUAL_SALARY,而不是自己的数据元素。

步骤

  1. 创建数据库表类型的新开发对象(建议名称:Z##EMPLOY)。

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

  3. 选择新→数据库表

  4. 确认包,输入名称 Z##EMPLOY 和描述**员工**,然后选择下一步

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

  6. 数据库表定义的代码应如下所示:

@EndUserText.label : 'Employee'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table z##employ {
key client : abap.clnt not null;
}
  1. **在客户端**字段之后,添加第二个关键字段 employee_id,并使用数据元素 Z##_EMPLOYEE_ID 键入。使用代码完整化插入数据元素的名称。

注意

如果尚未完成上一练习,请改用数据元素 /LRN/EMPLOYEE_ID。

  1. 如下调整代码:

define table z##employ {
key client      : abap.clnt not null;
key employee_id : z##_employee_id;
}
  1. 添加以下非关键字段。使用代码完整化插入现有数据元素的名称。 | 字段名称 | 数据元素 | | --- | --- | | first_name | /DMO/FIRST_NAME | | last_name | /DMO/LAST_NAME |

  2. 如下调整代码:

define table z##employ {
key client      : abap.clnt not null;
key employee_id : z##_employee_id;
first_name  : /dmo/first_name;
last_name   : /dmo/last_name;
}
  1. 添加以下字段并使用快速修复创建新的数据元素: | 字段名称 | 数据元素 | | --- | --- | | 出生日期 | Z##_BIRTH_DATE | | entry_date | Z##_ENTRY_DATE | 对于这两个数据元素,使用现有域 /DMO/DATE 作为数据类型。

  2. 在元素清单的末尾添加 birth_date : z##_birth_date;(其中 ## 是您的组编号)。

  3. 打开 问题 视图。您应该看到错误字段 BIRTH_DATE:使用的组件类型或域未激活或不存在

  4. 将光标置于z##_birth_date 上,然后按 Ctrl + 1 打开快速修复菜单。

  5. 在快速修复菜单中,双击创建数据元素 ....

  6. 确认包和名称,输入描述,例如**出生日期**,然后选择下一步

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

  8. 类型名称下,输入 /DMO/DATE 并输入以下字段标签: | 字段 | 值 | | --- | --- | | 短 | 出生 | | 中 | 出生日期 | | 长整型 | 出生日期 | | 标题 | 出生日期 |

  9. 激活新数据元素并返回到数据库表 Z##EMPLOY

  10. 在新代码行中,添加entry_date : z##_entry_date; 并再次使用快速修复通过相同域创建数据元素 Z##_ENTRY_DATE,但具有以下字段标签: | 字段 | 值 | | --- | --- | | 短 | 输入日期 | | 中 | 公司入职日期 | | 长整型 | 自此为公司工作 | | 标题 | 自此为公司工作 |

  11. 添加以下金额和货币代码字段,并使用快速修复添加 @Semantics.amount.currencyCode: 注释以参考货币代码字段。 | 字段名称 | 数据元素 | | --- | --- | | 年薪工资 | Z##_ANNUAL_SALARY | | 货币代码 | WAERS |

  12. 如下调整代码:

define table z##employ {
key client        : abap.clnt not null;
key employee_id   : z##_employee_id;
first_name    : /dmo/first_name;
last_name     : /dmo/last_name;
birth_date    : z##_birth_date;
entry_date    : z##_entry_date;
annual_salary : z##_annual_salary;
currency_code : waers;
}
  1. 将光标置于 annual_salary 旁的错误图标上,以查看错误消息 缺少参考字段 ANNUAL_SALARY 的货币代码注释

  2. 选择错误图标以打开快速修复菜单。

  3. 选择将货币代码参考分配到字段 currency_code

  4. 确保快速修复按如下方式调整代码:

define table z##employ {
key client        : abap.clnt not null;
key employee_id   : z##_employee_id;
first_name    : /dmo/first_name;
last_name     : /dmo/last_name;
birth_date    : z##_birth_date;
entry_date    : z##_entry_date;
@Semantics.amount.currencyCode : 'z##_employ.currency_code'
annual_salary : z##_annual_salary;
currency_code : waers;
}
  1. 维护技术表设置。使用值帮助为数据类和大小类别选择适当的值。

注意

我们希望该表包含 5 万到 6 万个数据集。

  1. 右键单击编辑器中的任意位置,然后选择打开其他技术设置

  2. 将光标放在数据类字段的开头,然后按 **Ctrl + 空格**键显示值帮助。

  3. 选择 APPL0 主数据,透明表

  4. 重复大小类别字段,然后选择 3 预期记录 43.000 - 170.000

  5. 激活技术表设置和数据库表定义。

  6. 仍在技术表设置对话框中,按 Ctrl + F3 激活技术表设置。

  7. 使用数据库表定义的源代码返回到编辑器,然后按 Ctrl + F3 激活数据库表定义。

任务 2: 包括结构

分析字典结构 /LRN/S_ADMIN 并将其包含在数据库表定义的字段列表中。

提示

此结构中的管理字段在 ABAP RESTful 应用程序编程模型中起着重要作用。有关详细信息,请参阅基本 ABAP 编程课程的相应单元。

步骤

  1. 打开结构类型 /LRN/S_ADMIN 的定义。

  2. 从 eclipse 工具栏中,选择打开 ABAP 开发对象。或者,按 Ctrl + Shift + A

  3. 输入 /LRN/S_ADMIN 并按**回车**。

  4. 分析结构和参考数据类型的组件列表。

  5. 在以 define structure 开头的行中,将光标置于 /lrn/s_admin ,然后按 F2 显示代码元素信息

  6. 编辑数据库表定义 Z##_EMPLOYEE 中的字段清单。使用代码完整化在字段列表末尾包括结构 /LRN/S_ADMIN。

  7. 在右花括号之前, 中输入 并按 **Ctrl + 空格**以调用代码完整化。

  8. 从建议清单中,选择模板 includeStructure - Include Structure

  9. 将占位符 other_structure_name 替换为 Z##S,然后按 **Ctrl + 空格**键。

  10. 从建议清单中选择 Z##S_ADMIN。

  11. 确保代码现在如下所示:

currency_code   : waers;
include /lrn/s_admin;
}
  1. 显示数据库表的代码元素信息并分析字段列表。

  2. 在以 define table 开头的代码行中,将光标置于表名称中并按 F2

  3. 确认结构 /LRN/S_ADMIN 的五个组件现在是数据库表的字段。

  4. 激活所有非活动开发对象。

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

  6. 选择全选激活

任务 3: 填写表

使用一些示例数据填充新的数据库表。为此,创建 ABAP 类 /LRN/CL_S4D430_CHECK_AND_FILL 的副本(建议名称:ZCL_##_CHECK_AND_FILL,其中 ## 是您的组编号),调整常量 c_employ_table 的值,然后执行该类作为控制台应用。

步骤

  1. 创建 ABAP 类 /LRN/CL_S4D430_CHECK_AND_FILL 的副本,将其命名为 Z##_S4D430_CHECK_AND_FILL 并将其放置在包 ZS4D430_## 中。

  2. 在项目浏览器视图中,找到包 /LRN/S4D4**30_EXERCISE 中的 /LRN/****CL_S4D430_CHECK_AND_FILL** 类,然后右键单击以打开上下文菜单。

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

  4. 输入包名称、副本名称和描述。然后选择下一步

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

  6. c_employ_table 常量的值更改为数据库表的名称。

  7. 向下滚动到以 CONSTANTS c_employ_table 开头的代码行。

  8. 在 VALUE 后的文字中,将 ## 替换为您的组编号。

  9. 激活 ABAP 类并将其作为控制台应用执行。如果控制台输出包含错误,请调整数据库表的定义,直到与数据库表定义 /LRN/EMPLOY 兼容。

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

  11. F9 将 ABAP 类作为控制台应用执行。

  12. 确保控制台输出包含数据库表 的已填充表 ... 文本。