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).

 

posted @ 2021-09-27 15:56  宁海峰  阅读(278)  评论(0编辑  收藏  举报