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的模式。

例子. 创建程序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(不同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. 程序间数据共享与传递(1):EXPORT/IMPORT、SAP/ABAP Memory

    EXPORT 语句 EXPORT {p1 = dobj1 p2 = dobj2 ...} | {p1 FROM dobj1 p2 FROM dobj2 ...} | (ptab)  TO | { ME ...

  2. 程序间数据共享与传递(2):EXPORT/IMPORT、SAP/ABAP Memory

    IMPORT语句 IMPORT {p1 = dobj1 p2 = dobj2 ...} | {p1 TO dobj1 p2 TO dobj2 ...} | (ptab)  FROM | { MEMOR ...

  3. 实现程序间的数据传递

    在实际应用中,我们经常需要多个程序相互配合来完成某些特定功能.例如两个应用程序间的同步.互斥:应用程序在起第二份实例时的参数自动传递-.要实现这些功能,就必须能实现程序间的数据传递. 有些特殊的高级技 ...

  4. 【转载】用Delphi实现程序间的数据传递

    在实际应用中,我们经常需要多个程序相互配合来完成某些特定功能.例如两个应用程序间的同步.互斥:应用程序在起第二份实例时的参数自动传递-.要实现这些功能,就必须能实现程序间的数据传递. 有些特殊的高级技 ...

  5. Android ContentProvider实现两个程序间数据共享demo,跨进程通讯

    1.客户端代码: 先实现服务端 SQL创建: public class DBHelper extends SQLiteOpenHelper {// 数据库名private static final S ...

  6. SAP ABAP ZCL_XML_UTIL 使用介绍:ABAP 和 XML 间的序列化和解析

    SAP ABAP ZCL_XML_UTIL 使用介绍:ABAP 和 XML 间的序列化和解析 简介: SAP ABAP ZCL_XML_UTIL 使用介绍:ABAP 和 XML 间的序列化和解析. 关 ...

  7. 进程间数据传递:Queue,Pipe 进程间数据共享:Manager

    进程间数据传递:Queue,Pipe 进程间数据共享:Manager 1.使用multiprocessing模块的Queue实现数据传递 ''' 进程间通讯:Queue,用法跟线程里的Queue一样, ...

  8. 微信小程序-页面间如何进行传递数据(通信)

    前言 在小程序中组件与组件之间的通信是通过在引用组件处,在自定义组件上添加自定义属性实现的,子组件内部通过properties进行接收 更多关于组件与组件之间的通信可参考小程序-实现自定义组件以及自定 ...

  9. smartform 与调用程序间内表数据传递方法

    1.通过表格接口传输 2.通过句柄(export,import)传输 3.通过指针传输: DATA:field(50). "字段长度根据内表所有字段长度总合设定    Field-symbo ...

最新文章

  1. ThreadLocal原理分析与使用场景
  2. 用Python如何查快递?
  3. 使用 ale.js 制作一个小而美的表格编辑器(2)
  4. php cms拥有博客功能,20款最为知名的开源PHP CMS
  5. requirejs 加载其它js
  6. java基础提升篇:深入分析Java的序列化与反序列化
  7. object detection
  8. c4d支持mac系统渲染器有哪些_在macOS Catalina发布前检查哪些应用程序不支持64位系统...
  9. 问题 A: 青蛙约会(数学)
  10. tomcat 开启远程debug
  11. 数据的gzip压缩解压缩_使用GZIP和压缩数据
  12. 32路视频光端机性能指标及视频特性介绍
  13. Memcache监控小工具stats命令
  14. python 装饰器相关 从后往前看
  15. access连接mysql_如何正确连接access数据库
  16. 怎样卸载deepin系统_系统卸载
  17. php自动盖章,印章自动生成器?
  18. 【系】微信小程序云开发实战坚果商城-前端之分类实现
  19. 如何设置Macbook pro的Touch bar
  20. 小技巧:不显示打印对话框直接打印网页到打印机

热门文章

  1. 为自己的网站添加RSS功能(转载)
  2. 10次迭代9次delay??拒绝项目延期,这里有一整套方法!
  3. 神吐槽|产品经理都是如何相爱相撕的?
  4. PMcaff O2O 产品峰会:行业最强干货,BAT总监级最佳实战 | 火热报名
  5. 【必读】文案都写不好,还谈什么互联网思维
  6. 华为产品技术学习笔记之路由原理(二)
  7. 使用SharePoint Online PowerShell cmdlet有哪些好处?
  8. canvas 绘制跟随鼠标移动的线条
  9. quartz 数据库配置
  10. Azure手把手系列 1:微软中国公有云概述