程序调用与内存练习

程序调用与内存练习 (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 RETURNSUBMIT 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 内表时,哪些字段标识屏幕,哪些字段填充输入值?

📌点击查看答案
屏幕标识PROGRAMDYNPRODYNBEGIN = '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 语句及其用途。

📌点击查看答案
  1. EXPORT ... TO MEMORY ID 'cluster_id' – 将数据簇写入 ABAP 内存
  2. IMPORT ... FROM MEMORY ID 'cluster_id' – 从 ABAP 内存读取数据簇
  3. FREE MEMORY ID 'cluster_id' – 显式释放 ABAP 内存中的数据簇

第7题 - SAP 内存 [应用]

需要在事务首屏的输入字段中预填值。该字段关联参数 ID ‘CAR’,且已启用”Set Parameter”。写出设置值的语句。

📌点击查看答案
1
2
SET PARAMETER ID 'CAR' FIELD lv_carrid.
CALL TRANSACTION 'BC402MCAR' AND SKIP FIRST SCREEN.

SET PARAMETER 填充 SAP 内存,事务在屏幕初始化时如果字段的”Get Parameter”已激活,就会读取该值。


第8题 - 封装组件 [应用]

何时应使用封装组件?至少说出两个必须满足的条件。

📌点击查看答案
封装组件在以下所有条件都满足时有益:
  1. 子结构/属性通常保持初始状态(优势 = 初始值共享)
  2. 子结构不太小(节省必须超过 8 字节引用开销)
  3. 结构使用频繁(实例多或程序执行频繁 – 节省与使用量成正比)

封装组件增加 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,每个用户会话
封装组件 适用条件:通常为初始、不太小、使用频繁
写入时复制 共享直到首次修改