博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
程序间数据共享与传递(3):EXPORT/IMPORT、SAP/ABAP Memory
阅读量:2035 次
发布时间:2019-04-28

本文共 3560 字,大约阅读时间需要 11 分钟。

ABAP Memory(同一用户的同一窗口Session

l  保存数据

 [FROM ] ... TO MEMORY ID <</span>>.

如果省略了FROM 选项,则被存储的数据源就来自于程序中与f1自已同名的变量,否则数据源为g1指定的变量(或者g1本身就是字符常量);key 用来标示ABAP内存。可以将多个变量存储在同一个中,它们是通过来区别的。IMPORT中的必须与EXPORT中的名称相同。

DATA text1(10VALUE 'Exporting'.
DATA itab LIKE sbook OCCURS 10 WITH HEADER LINE.
DO 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存储到以tableID的内存中,并以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。如果簇中不存在数据对象,则目标字段保持不变(gifi本身)。

DATA text1(10VALUE 'TEST1'.
DATA itab LIKE sbook OCCURS 10 WITH HEADER LINE.
DO TIMES.
  itab
-bookid 100 + sy-index.
  
APPEND itab.
ENDDO.

EXPORT text1"被存储的数据来自text1变量
       text2 
FROM 'Literal'"被存储的数据直接来自FORM后面字符串常量
       
"'TEST1''Literal'存储到IDtextABAP内存中,并且分别以
       
"text1text2标签来分类存储
       
TO MEMORY ID 'text'.
EXPORT itab"被存储的数据来自itab变量所对应的内存
        
TO MEMORY ID 'table'.
SUBMIT zjzjimpt1 AND RETURN."
调用其他程序并等待返回

 

REPORT  zjzjimpt1.
DATAtext1(10),
      text3 
LIKE text1.

"IDtextABAP内存区域读取分类存储标签为text1
"的内存数据并存储到text1变量中去
IMPORT text1 FROM MEMORY ID 'text'.
WRITE/ sy-subrctext1.
"IDtextABAP内存区域读取分类存储标签为text2
"的内存数据并存储到text3变量中去
IMPORT text2 TO text3 FROM MEMORY ID 'text'.
WRITE/ sy-subrctext3.

DATA jtab LIKE sbook OCCURS 10 WITH HEADER LINE.
"IDtableABAP内存区域读取分类存储标签为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 ModeInternal Mode的调用栈最多为9层。那么ABAP Memory,它是属于Internal Mode间可以共享的数据,而External Mode间无法共享。所以,ABAP Memorcy只能在同一窗体中共享,这与浏览器中的Session是一样的。

 

y(同一用户的不同窗口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不同ClientJob

前面介绍的都是用户内存,那么不同用户间如何实现数据共享呢?可以用SHARED MEMORYSHARED BUFFER,它们是服务器上的某片所有用户共享的内存。关于SHARED MEMORYSHARED 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/

你可能感兴趣的文章
【记录】【2】各种在线网址
查看>>
【Java】【22】读写properties文件
查看>>
【Spring】【1】mybatis spring的自动扫描配置
查看>>
【Java】【28】提高List的removeAll方法的效率
查看>>
【JS】【28】让输入框只能输入正整数
查看>>
【记录】【4】各种工具
查看>>
【JS】【31】读取json文件
查看>>
Ubuntu Boost 编译
查看>>
OpenCV模块分析(转)
查看>>
聊聊我对写好程序的认识
查看>>
OpenSSL源代码学习[转]
查看>>
插件原理2[转自CSDN]
查看>>
OpenCV Windows7 VC6.0安装以及HelloWorld
查看>>
python升级导致yum命令无法使用的解决办法
查看>>
vi/vim 中如何在每行行首或行尾插入指定字符串
查看>>
linux 查看端口被哪个程序占用
查看>>
socket
查看>>
Spring下载地址
查看>>
Linux日志2
查看>>
VS的路径变量[转]
查看>>