处理数据库表的更改
学习目标
描述数据库表的调整。
调整数据库表的直接更改。
描述数据库表的转换流程。
调整对数据库表的间接更改。
调整数据库表

如果字典中的更改直接或间接影响数据库表,则需要将此更改应用于数据库表。这称为数据库表调整。
调整数据库表有三种不同的方法:
ALTER TABLE
使用此 SQL 语句,字典工具可以更改数据库中的表布局。如有必要,将调整表中的数据。但是,并非每个更改都可以使用 ALTER TABLE 实施。特别是,使用 ALTER TABLE 不会实施意味着数据丢失或转换错误风险的更改。
删除并创建
这是最简单的方法。将删除数据库对象,并根据更改的定义再次创建。当然,这只有在表为空或表中存储的数据冗余时才是一个好主意。
表转换
在此过程中,首先以新名称在数据库上创建 表。然后,将数据从旧表复制到新表,并在必要时进行转换。最后,删除旧表并重命名新表以替换旧表。
在表转换期间,可能会部分丢失数据,例如,当您移除表字段或减少其长度时。如果更改现有表字段的主键或类型,则会发生运行时错误。
激活更改 - 决策树
播放视频,了解有关激活更改的更多信息。
视频:本节含 SAP 官方视频(视频 ID
1_qg0tsn51),需在 learning.sap.com 在线观看。
如何执行和分析直接更改
播放视频,了解如何执行和分析对数据库表的直接更改。
视频:本节含 SAP 官方视频(视频 ID
1_4v368qyw),需在 learning.sap.com 在线观看。
转换数据库表

如果无法在激活期间对数据库实施更改,编辑器将显示错误消息 "TABLE <...> was not activated"。
要查看更多详细信息,请右键单击源代码上的任意位置,然后选择打开方式→字典日志。
然后,字典日志视图会告诉您 ALTER TABLE 不可用,并显示错误消息 Structure change at field level (convert table <...> )。

使用快速修复执行手动转换。在编辑器中,右键单击表名称,然后选择快速修复。或者,将光标置于表名称上,然后按 Ctrl + 1。有两个快速修复可用于调整和激活数据库表:
调整并激活数据库表,转换数据
如果要保留和转换数据,请选择此快速修复。在大多数情况下,这将是正确的选项。
调整并激活数据库表,删除数据
如果不再需要表中的数据,请选择此快速修复。
避免在数据库上使用快速修复删除表。这将从数据库中删除 表。此后,对表的任何访问都将失败,直到您再次激活字典中的数据库表。
注意
出现激活错误不是使用这些快速修复的前提条件。原则上,只要您具有足够的权限,就可以随时调整或删除数据库中的表。

选择调整激活数据库表,转换数据时,快速帮助视图将自动在编辑器窗口下打开。在左侧的部分中,您可以再次触发相同或其他快速修复。右侧部分允许您更详细地分析上次调整。在此,您可以找到上次调整的开始时间和详细数据库调整日志的链接。

数据库调整日志包含有关如何调整表的详细信息。在转换过程中出现错误时,此功能特别有用。
在详细讨论表转换期间到底发生了什么之前,请观看以下视频以查看数据库表的调整。
如何转换数据库表
播放视频,了解如何转换数据库表。
视频:本节含 SAP 官方视频(视频 ID
1_s5u7x0di),需在 learning.sap.com 在线观看。
转换流程(逐步)
播放视频,了解转换流程。
视频:本节含 SAP 官方视频(视频 ID
1_gze0u3ky),需在 learning.sap.com 在线观看。
调整对数据库表的间接更改

以前,我们讨论了在 ABAP 字典中直接更改表定义后需要如何调整数据库表。现在,我们想了解一下间接更改。
此类间接更改的一个示例是域基本类型的更改,用于描述数据库表的字段。另一个示例是替换数据元素中使用的域。如果表包含结构,则包含结构的更改也会影响数据库中的表。

激活字典对象时,该工具也会调整所有相关对象。但是,如果数据库表受到影响,工具会停止激活,并显示错误消息 Domain <...> cannot be activated due to dependent tables。此错误与问题无关,即是否可以直接调整受影响的数据库表或者是否需要手动转换。
在此示例中,域 ZS4D430_DEPARMENT_ID 间接用于表定义 ZS4D430_EMPLOYEE。长度从 20 更改为 40 后,激活失败并显示错误消息,即使可以使用 ALTER TABLE 调整字段的长度扩展。
错误消息附带快速修复。要调用快速修复,请右键单击 问题 视图上的错误消息。或者,左键单击错误消息并按 Ctrl + 1。在打开的快速修复窗口中,选择完成。

快速修复的结果显示在快速帮助视图中。如果可以使用 ALTER TABLE 或 删除并创建 调整所有相关表,则激活成功。
如果至少一个相关表需要手动调整,则激活失败。检查激活日志以识别受影响的数据库表,并像以前一样手动对其进行调整。
提示
调整所有相关表后,返回到直接更改的字典对象,并确保其处于活动状态。在我们的示例中,这是域 ZS4D430_DEPARTMENT_ID。
如何激活间接更改
播放视频,了解如何在数据库表中激活间接更改。
视频:本节含 SAP 官方视频(视频 ID
1_s4wf2d3l),需在 learning.sap.com 在线观看。
处理对数据库表的更改
您需要对已包含数据的数据库表的字段列表进行更改。根据更改的性质,系统要求您调整表。
模板:
/LRN/EMPLOY(数据库表定义)
解决方案:
/LRN/EMPLOY_DEP(数据库表定义)
/LRN/DEPARTMENT_ID(数据元素)
/LRN/DEPARTMENT_ID(域)
任务 1: 复制模板(可选)
复制模板数据库表定义。如果已完成上一练习,则可以跳过此任务并继续编辑数据库表 Z##EMPLOY。
步骤
将数据库表定义
/LRN/EMPLOY复制到您自己的包(建议名称:Z##EMPLOY,其中 ## 代表组编号)。在项目浏览器视图中,右键单击数据库表定义
/LRN/EMPLOY以打开上下文菜单。从上下文菜单中,选择复制 ....
在包字段中输入包的名称。在名称字段中,输入名称
Z##EMPLOY,其中 ## 代表组编号。确认传输请求并选择完成。
激活复制。
按
Ctrl + F3激活数据库表定义。
任务 2: 处理直接更改
在数据库表的字段列表中,添加新字段(建议名称:DEPARTMENT_ID)并使用内置类型 CHAR 和长度 40 键入。使用新字段激活表后,将字段长度减少到 20 并调整数据库中的表。
步骤
在 ANNUAL_SALARY字段之前,添加新字段(建议名称:DEPARTMENT_ID)并使用内置类型CHAR和长度40键入。如下调整代码:
birth_date : z##birth_date;
entry_date : z##entry_date;
department_id : abap.char(40);
@Semantics.amount.currencyCode : 'z##employ.currency_code'
annual_salary : z##annual_salary;
currency_code : waers;
激活数据库表定义。
按
Ctrl + F3激活开发对象。显示表的字典日志。
右键单击源代码中的任意位置,然后选择 打开方式→字典日志 。
导航至编辑器下方显示的字典日志标签。
按住
Ctrl键,然后单击以 查看日志 开头的行。从字典日志标签上的工具栏中,选择显示搜索工具栏。
在*查找:字段中输入数据库表的名称,然后按*
回车**。更新策略在行 调整数据库中的表 >>> 之后提及。
将新字段的长度从
40减少到20。如下调整代码:
birth_date : z##birth_date;
entry_date : z##entry_date;
department_id : abap.char(20);
@Semantics.amount.currencyCode : 'z##employ.currency_code'
annual_salary : z##annual_salary;
currency_code : waers;
激活数据库表定义。
按
Ctrl + F3激活开发对象。分析 ABAP 日志。
在包含错误消息的对话窗口中,选择打开 ABAP 日志以显示字典日志。
在 字典日志 标签中,按住
Ctrl键并单击以 查看日志 开头的行。从字典日志标签上的工具栏中,选择显示搜索工具栏。
在*查找:字段中输入数据库表的名称,然后按*
回车**。更新策略在行 调整数据库中的表 >>> 之后提及。
使用快速修复转换数据库表的内容。
导航到数据库表定义的源代码。
在以
define table开头的代码行中,将光标置于表名上,然后按Ctrl + 1调用快速修复。从可用快速修复列表中,选择调整并激活数据库表,转换数据。
任务 3: 处理间接更改
将硬编码类型替换为使用新域(建议名称:Z##_DEPARTMENT_ID)的新数据元素(建议名称:Z#**#_DEPARTMENT_**ID,其中 ## 是您的组编号)。在域中,使用长度为 20 的技术类型 CHAR。激活数据库表后,将域中的长度更改为 10。然后激活并调整数据库表。
步骤
在数据库表定义中,将
abap.char(20)替换为Z##_DEPARTMENT_ID并使用快速修复来创建新的数据元素。如下调整代码:
birth_date : z##_birth_date;
entry_date : z##_entry_date;
department_id : z##_department_id;
@Semantics.amount.currencyCode : 'z##employ_dep.currency_code'
annual_salary : z##_annual_salary;
currency_code : waers;
单击
z##_department_id,然后按Ctrl + 1打开快速修复菜单。在快速修复菜单中,双击创建数据元素 ....
确认包和名称,输入描述,例如**
部门标识**,然后选择下一步。将新对象分配到传输请求,然后选择完成。
在类型名称下,输入
Z##_DEPARTMENT_ID并输入以下字段标签: | 字段 | 值 | | --- | --- | | 短 | 折旧 | | 中 | 部门 | | 长整型 | 部门标识 | | 标题 | 部门标识 |保存数据元素。然后使用向前导航创建技术类型为
CHAR且长度为20的域。按
Ctrl + S保存数据元素。选择*类型名称:*标签以开始创建域。
确认包和名称,输入描述,例如**
部门标识**,然后选择下一步。将新对象分配到传输请求,然后选择完成。
输入
CHAR作为数据类型,输入20作为长度。保存域。然后激活域、数据元素和数据库表定义。
按
Ctrl + S保存域。选择激活非活动 ABAP 开发对象。或者,按
Ctrl + Shift + F3。选择全选,然后选择激活。
在部门标识的域中,将技术长度和显示长度从
20减少到10。导航到域
Z##_DEPARTMENT_ID。将长度字段中的值从
20更改为10。移除输出长度字段中的值(这将在激活期间自动填充)。
尝试激活域并分析问题视图中的消息。
按
Ctrl + F3激活域。打开编辑器下方的 问题 视图以显示错误消息。
将快速修复用于错误消息域 ... 由于相关表而无法激活。
在 问题 视图中,将光标置于以 域 ... 开头的错误消息上,然后按
Ctrl + 1调用快速修复。选择完成。
从右下方的上一结果部分,选择激活日志以分析激活日志。
使用快速修复来调整和转换相关数据库表,即您的数据库表
Z##EMPLOY。导航到数据库表定义的源代码。
在以
define table开头的代码行中,将光标置于表名上,然后按Ctrl + 1调用快速修复。从可用快速修复列表中,选择调整并激活数据库表,转换数据。
激活部门标识的域。
导航到部门标识的域定义。
按
Ctrl + F3激活开发对象。