原文链接 :ABAP DEMO篇40 ABAP内存传值运用
1、ABAP 内存运用语句:
**传递数据到内存 EXPORT LT_ITAB TO MEMORY ID ‘MM’. **从内存读取数据 IMOIRT LT_ITTAB FROM MEMORY ID ‘MM’.
ABAP内存只能在同个session的不同程序之间共享数据,新的session内存数据消失;
适用场景:
一般使用是程序A 后面的进程,有个程序B,其中某个值或者内表在程序A存在,但是到B程序使用不了,这时候可以考虑内存传值的方式,
在程序A中把数据传递到内存,然后在程序B 中读取;增强中很实用。
自建程序同样可以用这个方式读取一些不方便直接传值的数据。
示例:A程序 内表数据传递到内存 MEMORY ID 'MM'.
*&---------------------------------------------------------------------* *& Report YCX_EXPORT *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT YCX_EXPORT. TYPES:BEGIN OF TY_ITAB, FIELD1 TYPE CHAR10, FIELD2 TYPE CHAR10, END OF TY_ITAB. DATA:LT_ITAB TYPE TABLE OF TY_ITAB, WA_ITAB TYPE TY_ITAB. DATA:L_LINES TYPE SY-TABIX. DO 10 TIMES. * L_LINES = L_LINES + 1. L_LINES = sy-index. IF L_LINES = 10. WA_ITAB-FIELD1 = L_LINES. WA_ITAB-FIELD2 = 'LAST line'. APPEND WA_ITAB TO LT_ITAB. CLEAR WA_ITAB. ELSE. WA_ITAB-FIELD1 = L_LINES. CONDENSE WA_ITAB-FIELD1 NO-GAPS. WA_ITAB-FIELD2 = '这是第' && WA_ITAB-FIELD1 && '条数据!'. APPEND WA_ITAB TO LT_ITAB. CLEAR WA_ITAB. ENDIF. ENDDO. WA_ITAB-FIELD1 = '100'. WA_ITAB-FIELD2 = 'aaa'. APPEND WA_ITAB TO LT_ITAB. WA_ITAB-FIELD1 = '200'. WA_ITAB-FIELD2 = 'bbb'. APPEND WA_ITAB TO LT_ITAB. EXPORT LT_ITAB TO MEMORY ID 'MM'. IF SY-SUBRC EQ 0. MESSAGE I001(VL) WITH '使用ABAP内存 20170313 输出成功!'. ENDIF. * ADD ON 20170313 SUBMIT YTST_2017008_001. *& submit 则可以访问你,如果B和A运行在不同的窗口,则A将访问不到数据; WAIT UP TO 3 SECONDS.
B程序,从内存里IMPORT数据
但是A SUMBIT B 可以读到内存数据,如果单独运行B是读不到数据的
*&---------------------------------------------------------------------* *& Report YCX_IMPORT *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT YCX_IMPORT. * *TYPES:BEGIN OF TY_ITAB, * field1 type char10, * field2 type char20, * END OF TY_ITAB. TYPES:BEGIN OF TY_ITAB, FIELD1 TYPE CHAR10, FIELD2 TYPE CHAR10, END OF TY_ITAB. DATA:LT_ITAB TYPE TABLE OF TY_ITAB, WA_ITAB TYPE TY_ITAB. IMPORT LT_ITAB FROM MEMORY ID 'MM'. IF SY-SUBRC NE 0. MESSAGE I001(VL) WITH '使用ABAP 内存 传值失败!'. ENDIF. BREAK-POINT.
运行A程序,会在B程序的 BREAK-POINT这里停下来
跟踪下执行过程:
显示内存对象
SUBMIT语句进入B程序
-
2、SAP内存使用SET/GET parameters方法;
SET PARAMETER ID 'MAT' field p_matnr. GET PARAMETER ID 'MAT' field p_matnr.
标准屏幕字段的默认值,很多就是用PARAMETER ID实现,
SAP内存可以被所有的主session访问,内存数据可以在同一个session中不同程序之间,或者不同session之间共享数据,整个终端session时间内都有效;
延伸
(20191226日补充)
感谢同道中人: QQ(太上皇) 提出的问题:
问题场景:
当服务器有多个实例,通过ABAP内存转发的时候,程序A在 服务器SERVER1实例,
程序B要读数据,但是程序B 在服务器 SERVER2实例,这样会出现程序B 读不到数据的情况,因为不同服务器实例之间存在物理隔离,数据不能共享。
这种情况怎么处理?
翔子有个项目就遇到过这种问题, 程序A使用SHARED BUFFER传值到 ID c_tmp
EXPORT lt_data TO SHARED BUFFER indx(fi) ID c_tmp.
程序B 通过 这个ID 读数据,
结果有时候能读到,有时候读不到, 结论 就是上面的问题(通过SM50或者 SM66 ,查到两个程序不是同一个应用服务器实例)
应用服务器实例图(示例)
解决方法可以用
EXPORT lt_data TO DATABASE indx(bs) ID c_tmp.
可参考我的文章:ABAP DEMO篇35 A程序调用B程序启动后台作业
本人常年接收SAP运维和远程项目,ECC,S/4HANA,CRM,WDA.
人天可谈,终身售后 有活请联系V信:18925782767(问问题免费,欢迎交流!)