ABAP 程序间传递数据
ABAP 提供了 IMPORT/EXPORT 和 SET/GET PARAMETER 语句,可对用户内存/服务器内存/数据库进行存储和访问。不过可能很多人对此还不是很了解,下面我们通过实例来测试它们的区别和联系。
1. ABAP Memory
用户登陆后,最多一个系统可以开 6 个窗口,这在 SAP 中称为 External Mode。
而同一个窗口中,运行某程序后,可以通过 CALL TRANSACTION/SUBMIT 或其他代码跳转到其他程序,这个称为 Internal Mode。Internal Mode 的调用栈最多为 9 层。
那么 ABAP Memory,它是属于 Internal Mode 间可以共享的数据,而 External Mode 间无法共享。
例子. 创建程序 A,输入:
创建程序 B,输入:
直接运行 B,发现程序 A 从 ABAP Memory 读到了值并输出到 LIST.
说明:
调试运行 B 到 EXPORT 语句后面,Goto-System Area-ABAP Memory,可以查看到名为 YTEST_MATNR 的一片内存。
如果 B 和 A 运行在不同的窗口,则 A 将访问不到数据;当用户输入/N 退出当前程序时,内存值也将被清空。
该语句适用于 CALL TRANSACTION/SUBMIT 过程中的数据共享,也常用于 User Exit,类似于定义全局变量的效果。
2. SAP Memory
上面说了 External Mode,那么它们之间共享数据必须通过 SET/GET PARAMETER 语句,不再是 EXPORT/IMPORT 的模式。
例子. 创建程序 A,输入:
创建程序 B,输入:
在窗口 1 运行程序 B 并关闭后,在窗口 2 运行程序 A,发现程序 A 仍然读到了 SAP Memory 的值。
说明:
调试时,可通过 Goto-System Area-SAP Memory,查看到 YTEST 及其对应的值。
SET/GET PARAMETER 的值与本次登陆有关,当用户注销后才失效。在用户登陆的时候,系统会根据每个用户 User Profile-Own Data-Parameter 下的设置,载入到 SAP Memory。
Data Element 中可以看到 Further Characteristics 下可定义 PARAMETER ID,代表该字段作为屏幕元素时,可读取该 PARAMETER ID 作为默认值。比如 VA03 会自动显示刚刚创建的订单号。
3. SHARED MEMORY/SHARED BUFFER
前面介绍的都是用户内存,那么不同用户间如何实现数据共享呢?可以用 SHARED MEMORY 或 SHARED BUFFER,它们是服务器上的某片所有用户共享的内存。关于 SHARED MEMORY 和 SHARED BUFFER 的区别,可以 F1 查看帮助。如果 EXPORT SHARED BUFFER,则必须 IMPORT SHARED BUFFER 才能读到,用 IMPORT SHARED MEMORY 是读不到的。反过来也是。
例子. 创建程序 A,输入:
创建程序 B,输入:
先在用户 1 的电脑上运行程序 B,然后在用户 2 的电脑上运行程序 A,发现用户 2 可以读取到值。
说明:
既然是服务器上的所有用户共享空间,那么该值将保存到服务器关机重启为止,除非用户用 DELETE 语句清除它。其实这个跟 ENQUEUE/DEQUEUE 有点相似之处。
数据库也可共享数据,不过服务器共享肯定速度快些,理论上适合网络游戏,呵呵。
INDX 是系统中存在的符合特定格式要求的表。但这不代表该 EXPORT/IMPORT 语句将在表 INDX 中增加记录,仅仅代表服务器借用了 INDX 的结构来管理该片共享内存。
4. DATABASE
上面说了 SHARED BUFFER 并不访问数据库,而要访问数据库就应该用 DATABASE。
创建一个程序,录入代码:
执行程序,然后 SE16 查看表 INDX,发现新增了一条 RELID = AA, SRTFD = YTEST_MATNR 的记录。如果 EXPORT 的数据量比较大,则新增的将是多条,这些条目的字段值 SRTF2 从 0 递增。所以 EXPORT DATABASE 与普通数据库操作的不同之处是,它适合大数据量的操作,系统自动将其拆分成多条记录并存储到数据库中,比如图片或文档。而用 IMPORT DATABASE 的过程则相反,系统将把这些条相关记录又自动组合起来成为一个整体。
评论