本文共 3560 字,大约阅读时间需要 11 分钟。
l 保存数据
[FROM ] ... TO MEMORY ID <</span>>.
如果省略了FROM 选项,则被存储的数据源就来自于程序中与f1自已同名的变量,否则数据源为g1指定的变量(或者g1本身就是字符常量);key 用来标示ABAP内存。可以将多个变量存储在同一个中,它们是通过来区别的。IMPORT中的必须与EXPORT中的名称相同。
DATA text1(10) VALUE 'Exporting'.
DATA itab LIKE sbook OCCURS 10 WITH HEADER LINE.
DO 5 TIMES.
itab-bookid = 100 + sy-index.
APPEND itab.
ENDDO.
"将 text1 与 text2都存储到 text ID的名下
EXPORT text1 "数据来源于上面定义的 text1变量,并以text1名分类存储
text2 FROM 'Literal'"数据直接来源于From后面指定的常量字符串,也以text1名分类存储
TO MEMORY ID 'text'.
"将前面定义的itab存储到以table为ID的内存中,并以itab名分类存储
EXPORT itab TO MEMORY ID 'table'.
l 读取数据
IMPORT [TO ] [TO ] ... FROM MEMORY ID .
如果忽略选项TO,则将内存中的数据对象赋给程序中的同名数据对象;如果使用此选项,则将内存中的数据对象写入字段中。IMPORT中的必须与EXPORT中的名称相同。
不必读取存在特定ID下的所有对象,在读取时可以通过指定名称中进行有选择性的读取。如果内存中不包含指定ID下的对象,则将SY-SUBRC设置为4,但是如果内存中存在带此ID的数据簇,无论数据对象是否也存在,SY-SUBRC之值总是为0。如果簇中不存在数据对象,则目标字段保持不变(gi或fi本身)。
DATA text1(10) VALUE 'TEST1'.
DATA itab LIKE sbook OCCURS 10 WITH HEADER LINE.
DO 5 TIMES.
itab-bookid = 100 + sy-index.
APPEND itab.
ENDDO.
EXPORT text1"被存储的数据来自text1变量
text2 FROM 'Literal'"被存储的数据直接来自FORM后面字符串常量
"将'TEST1'与'Literal'存储到ID为text的ABAP内存中,并且分别以
"text1和text2标签来分类存储
TO MEMORY ID 'text'.
EXPORT itab"被存储的数据来自itab变量所对应的内存
TO MEMORY ID 'table'.
SUBMIT zjzjimpt1 AND RETURN."调用其他程序并等待返回
REPORT zjzjimpt1.
DATA: text1(10),
text3 LIKE text1.
"从ID为text的ABAP内存区域读取分类存储标签为text1
"的内存数据并存储到text1变量中去
IMPORT text1 FROM MEMORY ID 'text'.
WRITE: / sy-subrc, text1.
"从ID为text的ABAP内存区域读取分类存储标签为text2
"的内存数据并存储到text3变量中去
IMPORT text2 TO text3 FROM MEMORY ID 'text'.
WRITE: / sy-subrc, text3.
DATA jtab LIKE sbook OCCURS 10 WITH HEADER LINE.
"从ID为table的ABAP内存区域读取分类存储标签为itab
"的内存数据并存储到jtab变量中去
IMPORT itab TO jtab FROM MEMORY ID 'table'.
LOOP AT jtab.
WRITE / jtab-bookid.
ENDLOOP.
* 0 TEST1
* 0 Literal
*00000101
*00000102
*00000103
*00000104
*00000105
l 删除数据
FREE MEMORY [ID ].
与DELETE FROM MEMORY ID id.等效
如果不附加ID,则此语句删除整个内存,包括此前用EXPORT存储到ABAP/4内存中的所有数据簇。附加ID之后,该语句只删除用此名称命名的数据簇。
用户登陆后,最多一个系统可以开6个窗口,这在SAP中称为External Mode。而同一个窗口中,运行某程序后,可以通过CALL TRANSACTION/SUBMIT或其他代码跳转到其他程序,这个称为Internal Mode。Internal Mode的调用栈最多为9层。那么ABAP Memory,它是属于Internal Mode间可以共享的数据,而External Mode间无法共享。所以,ABAP Memorcy只能在同一窗体中共享,这与浏览器中的Session是一样的。
更多请参考《数据共享与传递.docx》中的SAP Memory语句章节
同一客户端的不同窗体(External Mode)它们之间共享数据必须通过SET/GET PARAMETER语句,不再是EXPORT/IMPORT的模式。
例子. 创建程序A,输入:
DATA matnr TYPE matnr.
GET PARAMETER ID 'ytest' FIELD matnr.
WRITE matnr.
创建程序B,输入:
DATA: matnr TYPE matnr.
matnr = '000000000000012345'.
SET PARAMETER ID 'YTEST' FIELD matnr.
在窗口1运行程序B并关闭后,在窗口2运行程序A,发现程序A仍然读到了SAP Memory的值。
说明:
1、 调试时,可通过点击Goto->System Area->SAP Memory,查看到YTEST及其对应的值。
2、 SET/GET PARAMETER的值与本次登陆有关,当用户注销后才失效。在用户登陆的时候,系统会根据每个用户System->User Profile->Own Data->Parameter下的设置,载入到SAP Memory。
3、 在Data Element中可以看到Further Characteristics下可定义PARAMETER ID,代表该字段作为屏幕元素时,可读取该PARAMETER ID作为默认值。比如VA03会自动显示刚刚创建的订单号。
前面介绍的都是用户内存,那么不同用户间如何实现数据共享呢?可以用SHARED MEMORY或SHARED BUFFER,它们是服务器上的某片所有用户共享的内存。关于SHARED MEMORY和SHARED BUFFER的区别,可以F1查看帮助。如果EXPORT SHARED BUFFER,则必须IMPORT SHARED BUFFER才能读到,用IMPORT SHARED MEMORY是读不到的。反过来也是。
例子. 创建程序A,输入:
DATA matnr TYPE matnr.
IMPORT matnr FROM SHARED BUFFER indx(aa) ID 'YTEST_MATNR '.
WRITE matnr.
创建程序B,输入:
DATA: matnr TYPE matnr.
matnr = '000000000000123456'.
EXPORT matnr TO SHARED BUFFER indx(aa) ID ''.
先在用户1的电脑上运行程序B,然后在用户2的电脑上运行程序A,发现用户2可以读取到值。
说明:
1、 既然是服务器上的所有用户共享空间,那么该值将保存到服务器关机重启为止,除非用户用DELETE语句清除它。其实这个跟ENQUEUE/DEQUEUE有点相似之处。
2、 数据库也可共享数据,不过服务器共享肯定速度快些。
3、 INDX是系统中存在的符合特定格式要求的表。但这不代表该EXPORT/IMPORT语句将在表INDX中增加记录,仅仅代表服务器借用了INDX的结构来管理该片共享内存。
转载地址:http://umqaf.baihongyu.com/