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