• SAP Shared Object Demo 02


    前文介绍了共享对象相关内容,这篇主要从实战中简单介绍一下如何使用共享对象。

    Demo 1:

    1、创建根类(Root Class)

    首先SE24创建一个新的Class:ZCL_SHR_AREAHANDLE_ROOT_HF,在Class的属性中勾选“共享内存启用(Shared Memory-Enabled)”,如图:

     2、创建属性

    创建两个属性:1、“ID_NUM”参考类型:String,级别:Instance Attribute(实例属性),可见性:Public;2、“DREF”参考类型:DATA,级别:Instance Attribute(实例属性),可见性:Public。

     3、分配接口

    在接口Tab页中,分配接口名称:IF_SHM_BUILD_INSTANCE。激活Class。

     4、创建区域(SHMA)

    使用事务代码:SHMA创建区域名称:ZCL_SHAR_AREAHANDLE_ARE_HF,将之前创建的Root Class:ZCL_SHR_AREAHANDLE_ROOT_HF 分配到区域属性中的根类(Root Class)和构造器类(Constructor Class),

    并且勾选属性的“自动区域构建(Aut. Area Creation)”和“带版本控制(With Versioning)”,动态属性中“置换类型(Displacem.Type)”选择“无法替换(Displacement Not Possible)”,

    运行时间设置(Runtime Setting)中“区域构建(Area Structure)”选择“如读取请求则自动启动(Autostart fo Read Request and Every Ivalidation)”。

     5、创建共享数据:attach_for_write()

    SE38创建程序:ZCL_SHR_AREAHANDLE_SET_HF。首先定义一个区域抓手变量和一个区域根类变量,然后分别进行实例化。在创建根类中已经定义好了属性:dref,使用CREATE DATA 在区域实例版本中创建一个匿名数据对象。

    REPORT zcl_shr_areahandle_set_hf.

    DATA: zcl_area_handle TYPE REF TO zcl_shar_areahandle_are_hf,
          zcl_root        TYPE REF TO zcl_shr_areahandle_root_hf.

    FIELD-SYMBOLS: <fs_data> TYPE any .

    TRY.
      zcl_area_handle = zcl_shar_areahandle_are_hf=>attach_for_write).

      CREATE OBJECT zcl_root AREA HANDLE zcl_area_handle.
      zcl_area_handle->set_root( zcl_root ).

      CREATE DATA zcl_root->dref AREA HANDLE zcl_area_handle TYPE string.
      ASSIGN zcl_root->dref->* TO <fs_data>.
      <fs_data> '800'.
      zcl_area_handle->detach_commit).
    CATCH cx_shm_external_type.

    CATCH cx_shm_attach_error.

    ENDTRY.

    6、读取共享数据:attach_for_read()

    SE38新建一个读取共享数据的程序:ZCL_SHR_AREAHANDLE_GET_HF

    REPORT zcl_shr_areahandle_get_hf.

    DATA: zcl_area_get TYPE REF TO zcl_shar_areahandle_are_hf.
    FIELD-SYMBOLS: <fs_get> TYPE any.

    DATA: zcx_error TYPE REF TO cx_shm_attach_error.

    TRY.
      zcl_area_get = zcl_shar_areahandle_are_hf=>attach_for_read).
      ASSIGN zcl_area_get->root->dref->* TO <fs_get>.
      WRITE:/ <fs_get>.
      zcl_area_get->detach).
      zcl_area_get->free_area).
    CATCH cx_shm_attach_error INTO zcx_error.
      WRITE:/ zcx_error->get_text).
    ENDTRY.

    结果如图:

     Demo 2

    下面的例子我们对Root Class新增两个方法,用于共享对象的写入和读取。

    1、新增方法

    在Root Class 方法Tab页中新增方法:GET_ID_NUM和SET_ID_NUM,设置级别和可见性设置如下图:

     2、给GET方法分配参数

    方法GET_ID_NUM添加一个参数名:I_MSG,类型为Returning。如下图:

     方法SET_ID_NUM添加一个参数名:L_ID_NUM,类型:Import,关联类型:STRING。

     3、区域构造

    双击Root Class的方法:IF_SHM_BUILD_INSTANCE~BUILD 添加如下代码:

        DATA: sh_area type REF TO zcl_shar_areahandle_are_hf,
              sh_root TYPE REF TO zcl_shr_areahandle_root_hf.
        * Get a pointer to shared area
        sh_area = zcl_shar_areahandle_are_hf=>attach_for_write).
        * Create an instance of the root
        create OBJECT sh_root AREA HANDLE sh_area.
        * Sets Intial values
        sh_root->set_id_num'999').
        * set the root back into the area
        sh_area->set_root( sh_root ).
        * Commit and detach
        sh_area->detach_commit).

    4、SET/GET方法添加代码行

    SET_ID_NUM方法添加如下代码:

        id_num = l_id_num.

    GET_ID_NUM方法中添加如下代码:

        DATA: lv_id_msg TYPE string.
        * Concatenating a title to id_num.
        lv_id_msg 'Identification Number:' && id_num.
        l_msg = lv_id_msg.

    5、方法:attach_for_update()

    SE38新建程序:ZCL_SHR_AREAHANDLE_UPDATE_HF,使用方法attach_for_update()更新步骤3中已初始化的数据。

    REPORT zcl_shr_areahandle_update_hf.

    DATA: zcl_area TYPE REF TO zcl_shar_areahandle_are_hf,
          zcl_root TYPE REF TO zcl_shr_areahandle_root_hf.

    TRY.
      zcl_area = zcl_shar_areahandle_are_hf=>attach_for_update).

    CATCH cx_shm_no_active_version.
      WAIT UP TO 1 SECONDS.
      zcl_area = zcl_shar_areahandle_are_hf=>attach_for_update).
    ENDTRY.

    zcl_root ?= zcl_area->get_root).

    IF zcl_root IS INITIAL.
      CREATE OBJECT zcl_root AREA HANDLE zcl_area.
    ENDIF.

    zcl_root->set_id_num'900').

    zcl_area->set_root( zcl_root ).

    zcl_area->detach_commit).

    6、方法:attach_for_read()

    SE38新建程序:ZCL_SHR_AREAHANDLE_READ_HF,使用方法attach_for_read读取更新后的共享对象。

    REPORT zcl_shr_areahandle_read_hf.

    DATA: zcl_area TYPE REF TO zcl_shar_areahandle_are_hf.

    TRY.
      zcl_area = zcl_shar_areahandle_are_hf=>attach_for_read).

    CATCH cx_shm_no_active_version.
      WAIT UP TO 1 SECONDS.
      zcl_area = zcl_shar_areahandle_are_hf=>attach_for_read).
    ENDTRY.

    DATA: lv_msg TYPE string.

    lv_msg = zcl_area->root->get_id_num).
    WRITE:/ lv_msg.
    zcl_area->detach).

    zcl_area->free_area).

    本文来自博客园,作者:宁海峰,转载请注明原文链接:https://www.cnblogs.com/robinNing/p/15341973.html

  • 相关阅读:
    [NOIP2020]T2字符串匹配
    【CSGRound2】逐梦者的初心(洛谷11月月赛 II & CSG Round 2 T3)
    【CF1225E Rock Is Push】推岩石
    [HAOI2016]食物链
    求先序排列
    图书管理员
    合并果子
    联合权值
    和为0的4个值
    玩具谜题
  • 原文地址:https://www.cnblogs.com/robinNing/p/15341973.html
Copyright © 2020-2023  润新知