处理数据库表的更改

学习目标

  • 描述数据库表的调整。

  • 调整数据库表的直接更改。

  • 描述数据库表的转换流程。

  • 调整对数据库表的间接更改。

调整数据库表

如果字典中的更改直接或间接影响数据库表,则需要将此更改应用于数据库表。这称为数据库表调整

调整数据库表有三种不同的方法:

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

步骤

  1. 将数据库表定义 /LRN/EMPLOY 复制到您自己的包(建议名称:Z##EMPLOY,其中 ## 代表组编号)。

  2. 在项目浏览器视图中,右键单击数据库表定义 /LRN/EMPLOY 以打开上下文菜单。

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

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

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

  6. 激活复制。

  7. Ctrl + F3 激活数据库表定义。

任务 2: 处理直接更改

在数据库表的字段列表中,添加新字段(建议名称:DEPARTMENT_ID)并使用内置类型 CHAR 和长度 40 键入。使用新字段激活表后,将字段长度减少到 20 并调整数据库中的表。

步骤

  1. ANNUAL_SALARY 字段之前,添加新字段(建议名称:DEPARTMENT_ID)并使用内置类型 CHAR 和长度 40 键入。

  2. 如下调整代码:

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;
  1. 激活数据库表定义。

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

  3. 显示表的字典日志

  4. 右键单击源代码中的任意位置,然后选择 打开方式字典日志

  5. 导航至编辑器下方显示的字典日志标签。

  6. 按住 Ctrl 键,然后单击以 查看日志 开头的行。

  7. 字典日志标签上的工具栏中,选择显示搜索工具栏

  8. 在*查找:字段中输入数据库表的名称,然后按*回车**。

  9. 更新策略在行 调整数据库中的表 >>> 之后提及。

  10. 将新字段的长度从 40 减少到 20

  11. 如下调整代码:

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;
  1. 激活数据库表定义。

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

  3. 分析 ABAP 日志

  4. 在包含错误消息的对话窗口中,选择打开 ABAP 日志以显示字典日志

  5. 字典日志 标签中,按住 Ctrl 键并单击以 查看日志 开头的行。

  6. 字典日志标签上的工具栏中,选择显示搜索工具栏

  7. 在*查找:字段中输入数据库表的名称,然后按*回车**。

  8. 更新策略在行 调整数据库中的表 >>> 之后提及。

  9. 使用快速修复转换数据库表的内容。

  10. 导航到数据库表定义的源代码。

  11. 在以 define table 开头的代码行中,将光标置于表名上,然后按 Ctrl + 1 调用快速修复。

  12. 从可用快速修复列表中,选择调整并激活数据库表,转换数据

任务 3: 处理间接更改

将硬编码类型替换为使用新域(建议名称:Z##_DEPARTMENT_ID)的新数据元素(建议名称:Z#**#_DEPARTMENT_**ID,其中 ## 是您的组编号)。在域中,使用长度为 20 的技术类型 CHAR。激活数据库表后,将域中的长度更改为 10。然后激活并调整数据库表。

步骤

  1. 在数据库表定义中,将 abap.char(20) 替换为 Z##_DEPARTMENT_ID 并使用快速修复来创建新的数据元素。

  2. 如下调整代码:

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;
  1. 单击 z##_department_id ,然后按 Ctrl + 1 打开快速修复菜单。

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

  3. 确认包和名称,输入描述,例如**部门标识**,然后选择下一步

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

  5. 类型名称下,输入 Z##_DEPARTMENT_ID 并输入以下字段标签: | 字段 | 值 | | --- | --- | | 短 | 折旧 | | 中 | 部门 | | 长整型 | 部门标识 | | 标题 | 部门标识 |

  6. 保存数据元素。然后使用向前导航创建技术类型为 CHAR 且长度为 20 的域。

  7. Ctrl + S 保存数据元素。

  8. 选择*类型名称:*标签以开始创建域。

  9. 确认包和名称,输入描述,例如**部门标识**,然后选择下一步

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

  11. 输入 CHAR 作为数据类型,输入 20 作为长度

  12. 保存域。然后激活域、数据元素和数据库表定义。

  13. Ctrl + S 保存域。

  14. 选择激活非活动 ABAP 开发对象。或者,按 Ctrl + Shift + F3

  15. 选择全选,然后选择激活

  16. 在部门标识的域中,将技术长度和显示长度从 20 减少到 10

  17. 导航到域 Z##_DEPARTMENT_ID

  18. 长度字段中的值从 20 更改为 10

  19. 移除输出长度字段中的值(这将在激活期间自动填充)。

  20. 尝试激活域并分析问题视图中的消息。

  21. Ctrl + F3 激活域。

  22. 打开编辑器下方的 问题 视图以显示错误消息。

  23. 将快速修复用于错误消息域 ... 由于相关表而无法激活

  24. 问题 视图中,将光标置于以 域 ... 开头的错误消息上,然后按 Ctrl + 1 调用快速修复。

  25. 选择完成

  26. 从右下方的上一结果部分,选择激活日志以分析激活日志。

  27. 使用快速修复来调整和转换相关数据库表,即您的数据库表 Z##EMPLOY

  28. 导航到数据库表定义的源代码。

  29. 在以 define table 开头的代码行中,将光标置于表名上,然后按 Ctrl + 1 调用快速修复。

  30. 从可用快速修复列表中,选择调整并激活数据库表,转换数据

  31. 激活部门标识的域。

  32. 导航到部门标识的域定义。

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