ABAP内存、SAP内存、跨client内存

用户登陆后,最多一个系统可以开6个窗口,这在SAP中称为External Mode。而同一个窗口中,运行某程序后,可以通过CALL TRANSACTION/SUBMIT或其他代码跳转到其他程序,这个称为Internal Mode。Internal Mode的调用栈最多为9层。那么ABAP Memory,它是属于Internal Mode间可以共享的数据,而External Mode间无法共享。所以,ABAP Memorcy只能在同一窗体中共享,这与浏览器中的Session是一样的。

1、ABAP Memory 

在同一用户的当前窗口session实现数据共享,用到的IMPORT/EXPORT

保存数据:EXPORT<f1>[FROM <g1>] <f2> [FROM <g2>] ... TO MEMORY ID <key>.

如果省略from则被存储的数据就来源当前程序中与F1同名的变量,否则就等于from后面的常量。

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'.

读取数据:IMPORT <f1> [TO <g1>] <f2> [TO <g2>] ... FROM MEMORY ID <key>.

如果忽略选项TO<gi>,则将内存中的数据对象<fi>赋给程序中的同名数据对象;如果使用此选项,则将内存中的数据对象<fi>写入字段<gi>中。IMPORT中的<fi>必须与EXPORT中的<fi>名称相同。

删除数据:

FREE MEMORY [ID <key>].

与DELETE FROM MEMORY ID id.等效

如果是标准的程序,不方便在里面增加ABAP memory,这时候可以submit/call transaction 的方式,然后用指针的方式获取内存。

FIELD-SYMBOLS: <ft> TYPE tt_resb_bt,
               <fs> TYPE ts_resb_bt.

ASSIGN ('(SAPLCOBC)RESB_BT[]') TO <ft>.

注:

IMPORT / EXPORT 还有一个很常用的用途,针对 含有 LRAW类型的表,IMPORT / EXPORT 是用来实现数据的增加和读取。

簇数据库:带LRAW类型的表必须满足特定规则才能够建立,特点是LRAW数据类型可以存在非扁平结构,而且本身是一种压缩类型,相比RAWSTRING能够节省内存空间。如系统标准表INDX、

具体详细信息可参考下面:

https://blog.csdn.net/weixin_42646630/article/details/106640947

2、SAP Memory 

同一客户端的不同窗口的数据共享需要通过SAP Memory,

保存数据:SET PARAMETER ID ,读取数据:GET PARAMETER ID

注:调试时,可通过Goto -> Systerm -> SAP Memory,查看对应值。SAP Memory与本次登陆有关,用户注销才会失效。数据字典的Date Element 中可定义Parameter ID,当该字段作为屏幕元素的时候,会读取刚刚保存的parameter id值作为默认值。

3、跨client 内存

前面都是用户内存,不同用户之间也可以实现数据共享.

SHARED MEMORY/SHARED BUFFER

两种的作用是一样的,最大不同是在数据达到最大内存限制时的处理方式不同:最大内存限制值分别是通过rsdb/esm/buffersize_kb (SHARED MEMORY)、rsdb/obj/buffersize (SHARED BUFFER)来设置的,当内存占用快满时,SHARED MEMORY必须通过DELETE FROM SHARED MEMORY来手动清理,而SHARED BUFFER会自动删除很少被使用到的数据(当然也可以通过DELETE FROM SHARED BUFFER手动及时的删除不用的数据)

例子. 创建程序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可以读取到值。

注:所有用户都共享空间,所以该值会保存到服务器关机重启为止,除非用户删除清空,这一点和锁有点相识。数据库可以共享数据,但是服务器共享会更加快速。

删除:

DELETE FROMSHARED BUFFER dbtab(ar) [CLIENT cl] ID id

     DELETE FROMSHARED MEMORY dbtab(ar) [CLIENT cl] ID id

https://www.cnblogs.com/jiangzhengjun/p/4293544.html

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值