SAP Shared Memory Objects在不同会话不同ABAP程序中传输数据示例

原文链接:https://blog.csdn.net/qq_30797051/article/details/124816115

也可参考:https://blogs.sap.com/2020/04/28/shared-memory-objects-transfer-data-between-abap-programs/

1. 创建Shared Memory实现类

    创建新的实现类,并勾选共享内存启用
    

    添加全局属性

 

   集成接口:

  

   实现方法
        GET_MEMORY_DATA

METHOD get_memory_data.
  et_data = gt_data.
ENDMETHOD.

       


        SET_MEMORY_DATA

 METHOD set_memory_data.
   gt_data = it_data.
 ENDMETHOD.

 


2. 创建Shared Memory内存区域
    事务代码:SHMA


    实现类构造器IF_SHM_BUILD_INSTANCE~BUILD

    METHOD if_shm_build_instance~build.
      DATA: area TYPE REF TO zcl_test_area_001,
            root TYPE REF TO zcl_test_shma_001,
            exception TYPE REF TO cx_root.

      DATA: lt_data TYPE TABLE OF sflight.

      TRY.
          area = zcl_test_area_001=>attach_for_write( ).            "请求写入锁
        CATCH cx_shm_error INTO exception.
          RAISE EXCEPTION TYPE cx_shm_build_failed
            EXPORTING
              previous = exception.
      ENDTRY.

      CREATE OBJECT root AREA HANDLE area.
      CALL METHOD root->set_memory_data
        EXPORTING
          it_data = lt_data.

      area->set_root( root ).
      area->detach_commit( ).                "提交并释放锁
    ENDMETHOD.


3. 创建Shared Memory测试程序
    写入Shared Memory

    DATA: lo_area TYPE REF TO zcl_test_area_001,
          lo_root TYPE REF TO zcl_test_shma_001.

    DATA: lt_sflight TYPE TABLE OF sflight.

    SELECT * FROM sflight
      INTO TABLE lt_sflight
      UP TO 50 ROWS.

    TRY.            “直接调用区域构造函数
        zcl_test_area_001=>build( ).
      CATCH cx_shma_not_configured.
        RETURN.
      CATCH cx_shm_inconsistent.
        RETURN.
      CATCH cx_shm_build_failed.
        RETURN.
    ENDTRY.

    TRY.
        lo_area = zcl_test_area_001=>attach_for_update( ).                ""请求更新锁
      CATCH cx_shm_pending_lock_removed.
        RETURN.
      CATCH cx_shm_change_lock_active.
        RETURN.
      CATCH cx_shm_version_limit_exceeded.
        RETURN.
      CATCH cx_shm_exclusive_lock_active.
        RETURN.
      CATCH cx_shm_inconsistent.
        RETURN.
      CATCH cx_shm_no_active_version.
        RETURN.
    ENDTRY.

    lo_root ?= lo_area->get_root( ).
    IF lo_root IS INITIAL.
      CREATE OBJECT lo_root AREA HANDLE lo_area.
    ENDIF.

    CALL METHOD lo_root->set_memory_data
      EXPORTING
        it_data = lt_sflight.

    lo_area->set_root( lo_root ).
    lo_area->detach_commit( ).            "提交并释放锁
    WRITE: / '写入完成!'.


    读取Shared Memory

DATA: lo_area TYPE REF TO zcl_test_area_001,
          lo_root TYPE REF TO zcl_test_shma_001.

    DATA: lt_sflight TYPE TABLE OF sflight.

    TRY.
      lo_area = zcl_test_area_001=>attach_for_read( ).            ""请求读取锁
    ENDTRY.

    lt_sflight = lo_area->root->get_memory_data( ).

    lo_area->detach( ).            "释放锁

    BREAK-POINT.
4. 测试验证

    运行写入程序,并结束程序运行
   
    运行读取程序,查看获取到的数据

posted on 2022-05-20 09:43  seven1314pp  阅读(253)  评论(0)    收藏  举报