zd6 发表于 2015-9-18 08:56:18

SAP开发经验之内存共享

内存传值
1用户内存共享
  1.1   Sap内存:
  1.1.1 共享范围:被所有的主session访问,内存数据可以在同一个session中不同程序之间,或者不同session之间共享。
  1.1.2 作用范围:整个中端session时间内有效。
  1.1.3 用法:
  SET PARAMETER ID ‘MAT’ FIELD P_MATNR.
  GET PARAMETER ID ‘MAT’ FIELD P_MATNR.
  1.2   ABAP内存:
  1.2.1共享范围:在一个session不同程序之间共享数据。
  1.2.2作用范围:一个session时间内有效。
  1.2.3用法:
  EXPORT P_MATNR = P_MATNR TOMEMORY ID ‘ZTESTMAT’.
  INPORT P_MATNR = P_MATNR FROMMEMORY ID ‘ZTESTMAT’.
  1.3   External mode与Internal mode
  用户登陆后最多可以打开6个窗口,这个Sap中称之为External Mode。而在一个窗口中,运行某程序后,可以通过CALL TRANSACTION/SUBMIT或者其他代码跳转到其他程序,这个称之为Internal Mode。Internal Mode的调用栈做多为9层。
  ABAP 内存属于Internal Mode间可以共享的数据,而External Mode间无法共享。
  1.4   实例:
  1.4.1ABAP内存共享实例
  REPORTZ2014HZJ_TEST_MEMORY01.
  DATA MATNR TYPE MATNR.
  IMPORT MATNR FROM MEMORY ID 'ZTEST_MATNR'.
  WRITE: MATNR.
  
  REPORTZ2014HZJ_TEST_MEMORY02.
  DATA MATNR TYPE MATNR.
  MATNR = '000001234'.
  EXPORT MATNR TO MEMORY ID 'ZTEST_MATNR'.
  SUBMIT Z2014HZJ_TEST_MEMORY01.(运行此程序)
  运行结果:

图1.1 ABAP内存共享实例运行结果
  1.4.2 SAP内存共享实例
  REPORTZ2014HZJ_TEST_MEMORY01.
  DATA MATNR TYPE MATNR.
  GET PARAMETER ID 'ZTEST' FIELD MATNR. "内存值在注销本次登录后失效
  WRITE: MATNR.
  
  REPORTZ2014HZJ_TEST_MEMORY02.
  DATA MATNR TYPE MATNR.
  MATNR = '000001234'.
  SET PARAMETER ID 'ZTEST' FIELD MATNR.
  运行结果:

图1.2 SAP内存共享实例运行结果

  
2不同用户之间共享内存
  2.1   SHARED MEMORY/SHARED BUFFER: 服务器上的一片所有用户共享的内存
  如果EXPORT SHARED BUFFER,则必须用IMPORT SHARED BUFFER才能读取到,用IMPORT SHARED MEMORY是读不到的。
  2.2   实例:
  REPORTZ2014HZJ_TEST_MEMORY02.
  DATA: MATNR TYPE MATNR.
  MATNR = '678901'.
  EXPORT MATNR TO SHARED BUFFER INDX(AA) ID'ZTEST_SHARED_BUFFER'.(先运行此程序,BUFFER值被存储到服务器,服务器下所有用户俱可读取,若该值没有进行手动删除(DELETE),则保存至服务器关机为止)。
  
  REPORTZ2014HZJ_TEST_MEMORY01.
  DATA: MATNR TYPE MATNR.
  IMPORT MATNR FROM SHARED BUFFER INDX(AA) ID'ZTEST_SHARED_BUFFER'.
  WRITE: MATNR.
  DELETE FROM SHARED BUFFER INDX(AA) ID'ZTEST_SHARED_BUFFER'.(在本机或者另外的机器上运行此程序均可从服务器读取到值)。
  INDX是系统中符合特定格式的表,IMPORT/EXPORT语句并没有在INDX表中添加记录,服务器仅仅是借用INDX表结构管理该片共享内存(BUFFER)。
  SHARED BUFFER不访问数据库。
  2.3   运行结果:

图1.3 SHARED BUFFER内存共享实例运行结果

3   DATABASE访问数据库
3.1 SHARED BUFFER不访问数据库,需要访问数据库用DATABASE.
3.2 访问DATABASE实例
DATA: MATNR TYPE MATNR.
MATNR = '45667890123'.
EXPORT MATNR TO DATABASE INDX(AA) ID'ZTEST_SHARED_AND_DATABASE'.(运行此程序,将在数据库表INDX中添加一条记录)
运行结果:(SE16查看数据库表INDX,可以发现新增了一条RELID = AA, SRTFD = YTEST_MATNR的记录)。

图1.4.1 EXPORT DATABASE查看INDX表选择屏幕

图1.4.2 EXPORT DATABASE查看INDX表条目

DATA: MATNR TYPE MATNR.
IMPORT MATNR FROM DATABASE INDX(AA) ID'ZTEST_SHARED_AND_DATABASE'.(从数据库读取该记录)
WRITE: MATNR.
DELETE FROM DATABASE INDX(AA) ID'ZTEST_SHARED_AND_DATABASE'.(删除测试记录)
  运行结果:(从数据库表INDX中读取到了记录并打印)

图1.5 INPORT DATABASE查看打印新增的INDX表条目

  
  
4附注
  4.1 SHARED BUFFER对于内表的操作(SHARED MEMORY,DATABASE类似)
  4.1.1 示例程序:REPORTZ2014HZJ_TEST_MEMORY02.(共享内表)
  TABLES:
  MAKT.
  
  TYPES: BEGIN OF TY_MAKT.
  INCLUDE STRUCTURE MAKT.
  TYPES: END OF TY_MAKT.
  
  DATA: GT_MAKT TYPE TY_MAKT OCCURS 0,
  GW_MAKT TYPE TY_MAKT.
  
  SELECT-OPTIONS:MATNR FOR MAKT-MATNR .
  
  START-OF-SELECTION.
  PERFORM FRM_GET_DATA.
  EXPORT GT_MAKT TO SHARED BUFFER INDX(AA) ID 'SHARED_BUFFER_MAKT'.
  END-OF-SELECTION.
  
  FORM FRM_GET_DATA.
  SELECT *
  INTO CORRESPONDING FIELDS OF TABLE GT_MAKT
  FROM MAKT
  WHERE MAKT~MATNR IN MATNR.
  WRITE: 'OK'.
  ENDFORM.
  4.1.2运行结果:

图1.6.1 EXPORT SHARED BUFFER程序选择屏幕


图1.6.2 EXPORT SHARED BUFFER程序运行结果

  
  4.2.1示例程序:REPORTZ2014HZJ_TEST_MEMORY02.(读取内存中的内表)
  TABLES:
  MAKT.
  
  TYPES: BEGIN OF TY_MAKT.
  INCLUDE STRUCTURE MAKT.
  TYPES: END OF TY_MAKT.
  
  DATA: GT_MAKT TYPE TY_MAKT OCCURS 0,
  GW_MAKT TYPE TY_MAKT.
  
  IMPORT GT_MAKT FROM SHARED BUFFER INDX(AA) ID 'SHARED_BUFFER_MAKT'.
  LOOP AT GT_MAKT INTO GW_MAKT.
  WRITE: / GW_MAKT-MANDT,
  GW_MAKT-MATNR,
  GW_MAKT-SPRAS,
  GW_MAKT-MAKTX,
  GW_MAKT-MAKTG.
  ENDLOOP.
  DELETE FROM SHARED BUFFER INDX(AA) ID'SHARED_BUFFER_MAKT'.
  
  4.2.2运行结果:

图1.7 IMPORT SHARED BUFFER程序运行结果
本文相关图片没有显示,详细文档参见:
http://files.cnblogs.com/Goergia/%E5%86%85%E5%AD%98%E4%BC%A0%E5%80%BC.pdf
  
页: [1]
查看完整版本: SAP开发经验之内存共享