zoukankan      html  css  js  c++  java
  • 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(问问题免费,欢迎交流!)

  • 相关阅读:
    在MPTCP中引入流量监控——bwm-ng的使用说明
    Ubuntu下配置MPTCP
    实现两台MPTCP主机之间的通信——VSFTPD的配置与使用
    Google 辟谣,Android 和 Chrome OS 不合并
    paper-7
    计算机网络方面国际三大顶尖会议
    谷歌物联网操作系统Android Things揭开面纱
    张纯如
    Android binder机制之 5 --(创建binder服务)
    【BZOJ 1491】[NOI2007]社交网络
  • 原文地址:https://www.cnblogs.com/rainysblog/p/12101544.html
Copyright © 2011-2022 走看看