此博客为原创博客,都是个人工作经历所得,转载请注明出处

ABAP DEMO篇40 ABAP内存传值运用

原文链接 :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(问问题免费,欢迎交流!)

 

posted @ 2019-12-26 13:30  Rainystuday  阅读(838)  评论(0编辑  收藏  举报