内存使用SAP ABAP Shared Object文档格式.docx
- 文档编号:19373964
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:23
- 大小:411.92KB
内存使用SAP ABAP Shared Object文档格式.docx
《内存使用SAP ABAP Shared Object文档格式.docx》由会员分享,可在线阅读,更多相关《内存使用SAP ABAP Shared Object文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
所以它最大只能有一个的version是build
最大只能有一个是activeversion
可能有多个obsoleteversion;
可以通过以下的方法取得AreaHandle:
·
ATTACH_FOR_WRITE
ATTACH_FOR_UPDATE
ATTACH_FOR_READ
Multi_ATTACH:
注它可以同时创建多个handle.
产生的Areahandle都对应着一个AreaInstanceversion,同时会产生lock.
其中ATTACH_FOR_WRITE:
如果lock允许的话,产生一个AreaInstanceversion;
同时还可以指定其name,这样一个area就可以有多个instance(每个instance都会有自己的version),如果没有Name指定,那么将使用CL_SHM_AREA=>
DEFAULT_INSTANCE;
所以建议,使用特定的name,当这个binding(areahandle=>
areainstanceversion)存活间,都可以对该areainstanceversion进行修改;
将产生一个changelock;
ATTACH_FOR_UPDATE
如果lock允许的话:
如果areawithversion:
那么将copyactiveareainstanceversion
如果areawithoutversion,那么将Bind(areahandle=>
activeareainstanceversion)
同write一下,可以赋一个name,如果没有的话,则使用CL_SHM_AREA=>
将Bind(areahandle=>
将产生一个Readlock;
可以通过以下的方法取得解除AreaHandle与Areainstanceversion间的bind:
DETACH
DETACH_COMMIT
DETACH_ROLLBACK
DETACH_AREA与DETACH_ALL_AREAS:
用于一次解除多个bind
以上的方法都同时会releaselock.
DETACH:
removesareadlock.
DETACH_COMMIT:
removesachangelockbyconfirmingthechangesthatweremade.
DETACH_ROLLBACK:
removesachangelockwithoutconfirmingthechangesthatweremade.
另外还具有一些很有用的方法:
InvalidatingVersion:
Invalidate_instance
Invalidate_area
这些方法可以防止另一个readlock来设置,哪怕即使已存在一个readlock.
DeleteVersion:
Free_instance
Free_area
这些方法将所有的lock解掉,并将instance给expired,所以,后续任何的锁都不可再加.
GetAreaInstanceinformation:
Get_instance_infos
这将得到该Instance的信息到一个内表.
GetAreaHandleinformation:
Get_lock_kind
Is_valid
Is_active_version
Has_active_properties
Get_detach_info
这将得到该lock以及stateofarea-handle.
另外build方法作为consturctormethodofarea也是非常有用的.
同时,我们在得到了areahandle后,我们必须再用它来与rootclass进行联系起来:
每一个areainstanceversion必须有一个rootclass;
我们可以得到rootclass的reference,通过调用handle的root的attribute.
当writelock在detach_commit后,我们需要使用Handle的set_root将rootclass联接起来.
更多Sharedobject可以参阅SAPHelp:
2.SMO实例
在下面的实例中,我们的需求是:
Program1:
Report,负责取得数据,然后传递给sharedarea;
Program2:
Report,从sharedarea中取得数据并展示出来;
这样的需求非常常见,也可以将其视为job的两个step或者WD中的多个task。
因为我们program1中产生的数据是”临时”的,所以,不希望通过DB或者其他memory等方式来保存这些临时数据;
(1)创建RootDataClass
Rootdataclass即是我们需要保存数据或instance的class。
它是后面创建sharedarea的必须;
Tcode:
SE24
首先需要在property下勾选share-memoryenable
定义两个globaldata(就是需要shared的data)
其中GT_MEMBER的类型为tabletypeof表zt_member.
然后进入定义Method
注:
这里仅实现parse_write_data
它的实现:
参数
IV_CL_ID
TYPE
INT4
method
PARSE_WRITE_DATA.
IF
is
INITIAL.
clear:
gv_msg.
CONCATENATE
‘No
Class
ID
Input’
‘Time:
’
sy-UZEIT
into
gv_msg
SEPARATED
BY
space.
else.
*
Retrieve
data
GT_MEMBER.
SELECT
from
ZTB_MEMBER
table
GT_MEMBER
where
=
IV_CL_ID.
sy-subrc
0.
‘Retreve
data
successfully!
failed!
ENDIF.
endmethod.
(2)创建SharedArea
创建sharedarea,它是所有的areainstanceversion的template,以class进行组织.
SHMA
点击创建:
这里有几个地方值得注意,可以参考第一部分的SMO介绍,比如version的允许等;
另外,这里在上面可以看到,并没有指定auto.AreaStrcuting以及constructorclass。
(3)创建Program1:
保存sharedObject
该program负责,正常的使用class解析数据至自己的globaldata中,然后通过调用areahandle来将该class保存为一个sharedobject.
*&
———————————————————————*
Report
ZTEST_SMO_WRITE_1
Using
SMO
-
Parse(Write)
Data
and
saved
in
Shared
object
REPORT
ZTEST_SMO_WRITE_1
NO
STANDARD
PAGE
HEADING.
*—Data
Types
DATA:
lo_area_handle
type
REF
TO
ZCL_SMO_AREA,
lo_root_data
ZCL_SMO_ROOT_DATA.
*—Parameter:
ID
PARAMETERS:
p_cl_id
int4.
START-OF-SELECTION.
*1.
Instantiate
the
Area_Handle
TRY.
CALL
METHOD
ZCL_SMO_AREA=>
ATTACH_FOR_WRITE
EXPORTING
INST_NAME
‘Edison_tc’
“CL_SHM_AREA=>
DEFAULT_INSTANCE
ATTACH_MODE
CL_SHM_AREA=>
ATTACH_MODE_DEFAULT
WAIT_TIME
RECEIVING
HANDLE
lo_area_handle
.
CATCH
CX_SHM_EXCLUSIVE_LOCK_ACTIVE
WRITE:
/
‘Instantiate
Area_Handle:
Error!
’.
CX_SHM_VERSION_LIMIT_EXCEEDED
CX_SHM_CHANGE_LOCK_ACTIVE
CX_SHM_PARAMETER_ERROR
CX_SHM_PENDING_LOCK_REMOVED
ENDTRY.
*2.
Root
Data
CREATE
OBJECT
AREA
lo_area_handle.
*3.
Parse
as
normal
lo_root_data->
PARSE_WRITE_DATA
p_cl_id.
*4.
Set
root
of
Area-handle
lo_area_handle->
SET_ROOT
ROOT
lo_root_data.
CX_SHM_INITIAL_REFERENCE
‘Set
Area-handle:
CX_SHM_WRONG_HANDLE
*5.
SMO-Write
access-Commit
DETACH_COMMIT.
‘SMO-Write
access-Commit:
CX_SHM_ALREADY_DETACHED
CX_SHM_SECONDARY_COMMIT
CX_SHM_EVENT_EXECUTION_FAILED
CX_SHM_COMPLETION_ERROR
‘Using
share
object
(4)创建Program2:
读取保存在sharedObject中的数据
该program负责,从sharedobject中读取数据.
ZTEST_SMO_READ_1
Parse(Read)
ZTEST_SMO_READ_1
ls_member
ZTB_MEMBER.
Open
one
Read-access
ATTACH_FOR_READ
CX_SHM_INCONSISTENT
CX_SHM_NO_ACTIVE_VERSION
CX_SHM_READ_LOCK_ACTIVE
Access
to
Instance
*2-1.
Output
msg
‘Msg
Object:
’,
root->
GV_MSG.
*2-2.
parsed
by
Root-class
‘Output
Root-class:
/10
‘ID’,
20
‘Member
ID’,
30
Name’.
LOOP
AT
GT_MEMBER
ls_member.
ls_member-id,
ls_member-MM_ID,
ls_member-MM_NM.
ENDLOOP.
(5)测试使用SMO
先执行program1
输入一个classID,然后执行
此时,我们去check一下sharedmemory
SHMM
可以发现,我们的这个areainstanceversion就存在了,同时通过上面的统计信息可以很清楚地知道对于这个area它的一些基本信息,如instance、version等;
再双击进去就可以看到具体的instaceversion了:
正是通过程序创建的instance;
然后我们通过执行program2,看能否得到共享的数据.
此时,数据抽取并没有成功.
(原因是没有classID为1的数据)
所以,我们再重新执行program1(ClassID:
1000)à
SHMMà
Program2
此时,更可以注意,instanceversion/ActiveInstanceversion的变化。
如执行program1后,因为program2还挂着的(并没有退出),所以我们可以看到有两个version一个为active(即重新执行的program1),另一个为obsolete(即挂着的program2)
最后结果为:
数据共享与抽取成功。
我们也可以通过上面的instance点击
可以得到activeinstanceversion下的数据:
(6)扩充SMO功能
以上是标准的使用SMO的过程,也是我们经常在项目中使用的过程。
但是,有的时候,如果我们
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 内存使用SAP ABAP Shared Object 内存 使用 SAP