单元 5:对象依赖练习(6 道题)
单元 5:对象依赖练习(6 道题)
#practice #abap #abap-dictionary #abap-dependency
相关概念
📌关键模式(点击展开)
| Keyword (关键词) | Answer (答案) |
|---|---|
| 运行时对象存储 | 系统表(如 DD02L, DD03L) |
| 不一致后果 | ABAP 程序可能出错 |
| Where-Used List 用途 | 评估修改影响范围 |
| 保存后状态 | 非活跃版本 (inactive) |
问题 1 - 运行时对象 [recall]
什么是运行时对象 (Runtime Object)?它存储在哪里?
📌显示答案
运行时对象是 Dictionary 中定义被编译后的内部格式,ABAP 程序和 Screen Painter 访问的是运行时对象(而非 Dictionary 定义本身)。
- 存储在系统表中(如 DD02L for tables, DD03L for fields)
- 修改 Dictionary 对象后必须激活才能更新运行时对象
- 如果运行时对象与 Dictionary 定义不一致,ABAP 程序可能出错
问题 2 - Where-Used List [recall]
Where-Used List(使用处清单)的功能是什么?给出两个使用场景。
📌显示答案
Where-Used List 用于查找对象的引用关系,确定哪些程序/表/结构会受变更影响。
使用场景:
使用场景:
- 评估修改影响范围:修改一个域前,查看哪些数据元素和表使用了该域
- 计划重构或迁移:确定需要同步更新的依赖对象
- 访问方式:SE11 → 选择对象类型 → Where-Used
问题 3 - 激活过程 [recall]
描述 Dictionary 对象从修改到生效的激活过程。
📌显示答案
1 | 修改对象 → 保存(非活跃版本 / inactive version) |
- 保存时创建的是非活跃版本,不影响现有程序
- 激活时系统自动检查依赖并更新运行时对象
- 失败的激活可通过
Utilities → Activation Log查看错误信息 - 依赖的对象可能需要一起重新激活
问题 4 - 依赖关系 [recall]
列出 Dictionary 对象之间的主要依赖关系层次。
📌显示答案
1 | Domain |
修改底层对象(如 Domain)可能级联影响所有上层对象。
问题 5 - 不一致问题 [application]
一个开发者修改了某个结构体(添加了新字段)但忘记激活。另一个开发者在该结构体基础上编写了使用新字段的程序。程序运行时会出现什么问题?如何解决?
📌显示答案
问题:程序运行时会出错,因为运行时对象仍然是旧版本(不包含新字段)。未激活的修改只存在于 Dictionary 的非活跃版本中,ABAP 程序访问的是运行时对象。
解决:激活修改后的结构体定义。激活后系统会:
- 检查所有依赖对象
- 更新运行时对象(DD02L, DD03L 等系统表)
- 新字段才会对程序可见
问题 6 - 依赖修改影响分析 [analysis]
你需要将一个域的数据类型从 CHAR(3) 改为 CHAR(5)。分析这个修改会影响哪些对象?修改前应该做什么准备?
📌显示答案
影响范围(需要用 Where-Used List 确认):
- 所有引用该域的数据元素
- 使用这些数据元素的所有结构和表字段
- 使用这些表的所有视图(可能需要调整投影)
- 使用这些表的所有索引(键长度变化影响索引)
- 使用这些表/结构的所有ABAP 程序(变量长度可能不匹配)
- 所有锁对象和搜索帮助
修改前准备:
- 使用 Where-Used List 完整列出所有依赖
- 评估哪些对象需要同步修改
- 检查是否需要表转换(更改字段长度可能触发转换)
- 在非生产环境中测试激活
- 计划在低负载时段执行
📌模式总结(点击展开)
| Keyword (关键词) | Answer (答案) |
|---|---|
| 运行时对象 | Dictionary 定义的编译格式,存储在系统表中 |
| 系统表示例 | DD02L (tables), DD03L (fields) |
| 保存后状态 | 非活跃版本 (inactive) |
| 激活作用 | 更新运行时对象 + 数据库 |
| Where-Used List | 查找引用关系,评估修改影响 |
| 不一致后果 | ABAP 程序可能出错 |