程序间数据共享与传递(3):EXPORT/IMPORT、SAP/ABAP Memory
ABAP Memory(同一用户的同一窗口Session)
l 保存数据
EXPORT[FROM ] [FROM ] ... TO MEMORY ID <</span>key>.
如果省略了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是一样的。
SAP Memory(同一用户的不同窗口Session)
更多请参考《数据共享与传递.docx》中的SAP Memory语句章节
同一客户端的不同窗体(External Mode)它们之间共享数据必须通过SET/GET PARAMETER语句,不再是EXPORT/IMPORT的模式。
DATA matnr TYPE matnr.
GET PARAMETER ID 'ytest' FIELD matnr.
WRITE matnr.
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及其对应的值。
SHARED MEMORY/SHARED BUFFER(不同Client、Job)
前面介绍的都是用户内存,那么不同用户间如何实现数据共享呢?可以用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 'YTEST_MATNR'.
先在用户1的电脑上运行程序B,然后在用户2的电脑上运行程序A,发现用户2可以读取到值。
说明:
1、 既然是服务器上的所有用户共享空间,那么该值将保存到服务器关机重启为止,除非用户用DELETE语句清除它。其实这个跟ENQUEUE/DEQUEUE有点相似之处。
2、 数据库也可共享数据,不过服务器共享肯定速度快些。
3、 INDX是系统中存在的符合特定格式要求的表。但这不代表该EXPORT/IMPORT语句将在表INDX中增加记录,仅仅代表服务器借用了INDX的结构来管理该片共享内存。
程序间数据共享与传递(3):EXPORT/IMPORT、SAP/ABAP Memory相关推荐
- 程序间数据共享与传递(1):EXPORT/IMPORT、SAP/ABAP Memory
EXPORT 语句 EXPORT {p1 = dobj1 p2 = dobj2 ...} | {p1 FROM dobj1 p2 FROM dobj2 ...} | (ptab) TO | { ME ...
- 程序间数据共享与传递(2):EXPORT/IMPORT、SAP/ABAP Memory
IMPORT语句 IMPORT {p1 = dobj1 p2 = dobj2 ...} | {p1 TO dobj1 p2 TO dobj2 ...} | (ptab) FROM | { MEMOR ...
- 实现程序间的数据传递
在实际应用中,我们经常需要多个程序相互配合来完成某些特定功能.例如两个应用程序间的同步.互斥:应用程序在起第二份实例时的参数自动传递-.要实现这些功能,就必须能实现程序间的数据传递. 有些特殊的高级技 ...
- 【转载】用Delphi实现程序间的数据传递
在实际应用中,我们经常需要多个程序相互配合来完成某些特定功能.例如两个应用程序间的同步.互斥:应用程序在起第二份实例时的参数自动传递-.要实现这些功能,就必须能实现程序间的数据传递. 有些特殊的高级技 ...
- Android ContentProvider实现两个程序间数据共享demo,跨进程通讯
1.客户端代码: 先实现服务端 SQL创建: public class DBHelper extends SQLiteOpenHelper {// 数据库名private static final S ...
- SAP ABAP ZCL_XML_UTIL 使用介绍:ABAP 和 XML 间的序列化和解析
SAP ABAP ZCL_XML_UTIL 使用介绍:ABAP 和 XML 间的序列化和解析 简介: SAP ABAP ZCL_XML_UTIL 使用介绍:ABAP 和 XML 间的序列化和解析. 关 ...
- 进程间数据传递:Queue,Pipe 进程间数据共享:Manager
进程间数据传递:Queue,Pipe 进程间数据共享:Manager 1.使用multiprocessing模块的Queue实现数据传递 ''' 进程间通讯:Queue,用法跟线程里的Queue一样, ...
- 微信小程序-页面间如何进行传递数据(通信)
前言 在小程序中组件与组件之间的通信是通过在引用组件处,在自定义组件上添加自定义属性实现的,子组件内部通过properties进行接收 更多关于组件与组件之间的通信可参考小程序-实现自定义组件以及自定 ...
- smartform 与调用程序间内表数据传递方法
1.通过表格接口传输 2.通过句柄(export,import)传输 3.通过指针传输: DATA:field(50). "字段长度根据内表所有字段长度总合设定 Field-symbo ...
最新文章
- ThreadLocal原理分析与使用场景
- 用Python如何查快递?
- 使用 ale.js 制作一个小而美的表格编辑器(2)
- php cms拥有博客功能,20款最为知名的开源PHP CMS
- requirejs 加载其它js
- java基础提升篇:深入分析Java的序列化与反序列化
- object detection
- c4d支持mac系统渲染器有哪些_在macOS Catalina发布前检查哪些应用程序不支持64位系统...
- 问题 A: 青蛙约会(数学)
- tomcat 开启远程debug
- 数据的gzip压缩解压缩_使用GZIP和压缩数据
- 32路视频光端机性能指标及视频特性介绍
- Memcache监控小工具stats命令
- python 装饰器相关 从后往前看
- access连接mysql_如何正确连接access数据库
- 怎样卸载deepin系统_系统卸载
- php自动盖章,印章自动生成器?
- 【系】微信小程序云开发实战坚果商城-前端之分类实现
- 如何设置Macbook pro的Touch bar
- 小技巧:不显示打印对话框直接打印网页到打印机