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

  • 相关阅读:
    剑指offer——最小的K个数和数组中第K大的元素
    Leetcode刷题指南链接整理
    160. Intersection of Two Linked Lists
    100. Same Tree
    92. Reverse Linked List II
    94. Binary Tree Inorder Traversal
    79. Word Search
    78,90,Subsets,46,47,Permutations,39,40 DFS 大合集
    0x16 Tire之最大的异或对
    0x16 Tire
  • 原文地址:https://www.cnblogs.com/rainysblog/p/12101544.html
Copyright © 2011-2022 走看看