程序调用与内存练习
程序调用与内存练习 (10题)
#practice #memory-mgmt #program-structure #shared-objects
相关概念
📌核心模式(点击查看)
| 关键词 | 答案 |
|---|---|
| 插入 vs 新启动 | AND RETURN = 插入;不带 AND RETURN = 替换 |
| LEAVE TO TRANSACTION | 销毁整个栈 + ABAP 内存 |
| ABAP 内存范围 | 每个外部会话,内部会话共享 |
| SAP 内存范围 | 每个用户会话,所有外部会话 |
| 封装组件 | PXA 中的初始值共享,节省内存 |
第1题 - SUBMIT 变体 [记忆]
SUBMIT prog AND RETURN和SUBMIT prog(不带 AND RETURN)有什么区别?
📌点击查看答案
SUBMIT prog AND RETURN:插入被调用程序。新的内部会话压入栈。被调用程序结束后,在调用程序中 SUBMIT 语句之后继续执行。SUBMIT prog(不带 AND RETURN):替换顶层内部会话。调用程序的会话被销毁。被调用程序的新会话替换它。
第2题 - CALL TRANSACTION 模式 [记忆]
CALL TRANSACTION的 MODE 附加项可以取哪些值?各表示什么?
📌点击查看答案
| 值 | 行为 |
|---|---|
A |
显示所有屏幕(默认) |
E |
仅在出错时显示 |
N |
不显示屏幕(后台模式) |
第3题 - BDCDATA 结构 [记忆]
在为
CALL TRANSACTION ... USING填充 BDCDATA 内表时,哪些字段标识屏幕,哪些字段填充输入值?
📌点击查看答案
PROGRAM、DYNPRO、DYNBEGIN = 'X'字段填充:
FNAM(字段名或 BDC_OKCODE/BDC_CURSOR)、FVAL(字段值)第4题 - LEAVE TO TRANSACTION 内存效果 [应用]
一个程序使用
LEAVE TO TRANSACTION调用另一个程序。调用前使用EXPORT TO MEMORY ID 'MY_DATA'存储了数据。被调用程序能读取这些数据吗?为什么?
📌点击查看答案
LEAVE TO TRANSACTION 销毁整个内部会话栈,同时清除了 ABAP 内存。ABAP 内存与外部会话的内部会话关联,当它们全部被销毁时,内存被释放。只有 CALL TRANSACTION(插入模式)保留 ABAP 内存。第5题 - 程序组 [记忆]
两个不同的内部会话调用同一函数组的函数模块时会发生什么?
📌点击查看答案
第6题 - ABAP 内存操作 [记忆]
说出操作 ABAP 内存的三条 ABAP 语句及其用途。
📌点击查看答案
EXPORT ... TO MEMORY ID 'cluster_id'– 将数据簇写入 ABAP 内存IMPORT ... FROM MEMORY ID 'cluster_id'– 从 ABAP 内存读取数据簇FREE MEMORY ID 'cluster_id'– 显式释放 ABAP 内存中的数据簇
第7题 - SAP 内存 [应用]
需要在事务首屏的输入字段中预填值。该字段关联参数 ID ‘CAR’,且已启用”Set Parameter”。写出设置值的语句。
📌点击查看答案
1 | SET PARAMETER ID 'CAR' FIELD lv_carrid. |
SET PARAMETER 填充 SAP 内存,事务在屏幕初始化时如果字段的”Get Parameter”已激活,就会读取该值。
第8题 - 封装组件 [应用]
何时应使用封装组件?至少说出两个必须满足的条件。
📌点击查看答案
- 子结构/属性通常保持初始状态(优势 = 初始值共享)
- 子结构不太小(节省必须超过 8 字节引用开销)
- 结构使用频繁(实例多或程序执行频繁 – 节省与使用量成正比)
封装组件增加 8 字节的内部引用。如果子结构总是有数据或非常小,开销会超过收益。
第9题 - 共享对象架构 [分析]
比较共享对象方法与 ABAP 内存用于跨程序数据交换。各在什么时候适用?
📌点击查看答案
| 方面 | ABAP 内存 | 共享对象 |
|---|---|---|
| 范围 | 一个外部会话 | 同一应用服务器上所有用户 |
| 生命周期 | 直到会话关闭 | 直到显式删除或服务器重启 |
| 数据类型 | 任意 ABAP 数据对象 | 类的实例(数据作为属性) |
| 性能 | 快(同一进程) | 非常快(共享内存,无数据库) |
| 使用场景 | 被调用程序间的数据传递 | 目录、共享缓存、购物车 |
在单个用户的程序调用链内交换数据时使用 ABAP 内存。在多个用户需要并发访问而不读数据库时使用共享对象。
第10题 - 写入时复制 [分析]
解释内表的写入时复制语义。将一个内表赋值给另一个时会发生什么?
📌点击查看答案
itab2 = itab1 时,实际数据不会被复制。两个表共享同一个表体 – 仅表头/管理信息被复制。这节省了内存和运行时间。实际复制仅在其中一个表被修改(写访问)时发生。此时共享体被复制,修改的表指向自己的副本。
例外:具有嵌套表行类型的表从不共享。
这也适用于过程传参 – 按值传递在形式参数被修改之前不会产生复制开销。
📌模式总结(点击查看)
| 关键词 | 答案 |
|---|---|
| SUBMIT AND RETURN | 插入程序,保留调用者 |
| LEAVE TO TRANSACTION | 销毁栈,清除 ABAP 内存 |
| BDCDATA 字段 | PROGRAM+DYNPRO+DYNBEGIN 标识屏幕;FNAM+FVAL 填数据 |
| ABAP 内存 | EXPORT/IMPORT/FREE,每个外部会话 |
| SAP 内存 | SET/GET PARAMETER,每个用户会话 |
| 封装组件 | 适用条件:通常为初始、不太小、使用频繁 |
| 写入时复制 | 共享直到首次修改 |