学习笔记持久类和对象持久化的应用
Posted SAP剑客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习笔记持久类和对象持久化的应用相关的知识,希望对你有一定的参考价值。
持久类和对象持久化的应用
整理转自 —《SAP ABAP 面向对象程序设计(原则、模式及实践)》
对于一般的面向对象语言,对象持久化通常是指将对象存储于数据库或者磁盘文件中,便于以后调用处理,也就是通过操作将内存中的对象保存到数据库或者文件中。
对于ABAP程序,持久化一般是保存到数据库表中,ABAP也提供了自动化方式和服务来帮助我们管理和操作持久化对象。
【实例】
下面通过一个简单实例来说明:系统中的一个类对象,在业务处理中属性被赋予了不同的值,我们将对象实例的属性值存储到SAP数据库自定义表中,并支持读取功能,即可将该对象从数据库中调出,将提取出的属性值赋值给对象实例,以便业务继续处理。
一、创建自定义表用于存储持久化后的对象。
维护持久性可通过一下两种方式:
- 使用Business Key,即采用数据列作为主键;
- 使用GUID,即SAP提供的全局标识符(类型OS_GUID);
二、创建全局类,类型为持久类(Persistent Class)。
选择了创建持久类(Persistent Class),类实例的属性会自动调整为受保护(Protected)。
点击持久性(Persistence)按钮(或者通过菜单“转到”→“持久性代表”),维护与持久类相关的数据库表。输入自定义表名,然后分配需要持久化的列。
分配好属性后点击“生成器设置”按钮设定创建持久类的设定。
一般需要将最后一个复选框(方法CREATE PERSISTENT和CREATE TRANSIENT使用最小接口)勾选去掉,如果勾选了,生成的持久类会仅仅针对自定义表的主键进行记录创建,而忽略其他属性。
然后保存,返回后发现系统自动创建了属性以及存取属性的方法。
最后激活该类,会提示是否创建类行动者,点击“是”系统将为这个持久类创建对应的操作用的虚拟类和操作类。
三、创建测试程序,将实例化的持久化类存入数据库并进行查询和删除操作。
代码分别调用系统自动生成的方法:GET_PERSISTENT、CREATE_PERSISTENT、DELETE_PERSISTENT,传入适当的参数,即可实现类的持久化操作。
【源代码】
*&---------------------------------------------------------------------*
*& Report ZPRT_PERSIST_MARA_GUID
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZPRT_PERSIST_MARA_GUID.
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
PARAMETERS : P_GET RADIOBUTTON GROUP G1,
P_CRE RADIOBUTTON GROUP G1,
P_DEL RADIOBUTTON GROUP G1.
SELECTION-SCREEN END OF BLOCK B1.
SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-002.
PARAMETERS :
P_MATNR LIKE ZTB_MARA_KEY-MATNR,
P_MAKTX LIKE ZTB_MARA_KEY-MAKTX,
P_ERSDA LIKE ZTB_MARA_KEY-ERSDA,
P_MTART LIKE ZTB_MARA_KEY-MTART,
P_MATKL LIKE ZTB_MARA_KEY-MATKL.
SELECTION-SCREEN END OF BLOCK B2.
DATA : GO_MATERIAL_AGENT TYPE REF TO ZCA_PERSIST_MARA_KEY,
GO_RESULT_OBJ TYPE REF TO OBJECT,
GO_MATERIAL_KEY TYPE REF TO ZCL_PERSIST_MARA_KEY.
START-OF-SELECTION.
"创建操作类对象
GO_MATERIAL_AGENT = ZCA_PERSIST_MARA_KEY=>AGENT.
IF P_GET = 'X'.
TRY.
"调用操作类,读取持久化记录,初始化持久类并对属性赋值
CALL METHOD GO_MATERIAL_AGENT->GET_PERSISTENT
EXPORTING
I_MATNR = P_MATNR
RECEIVING
RESULT = GO_RESULT_OBJ.
GO_MATERIAL_KEY ?= GO_RESULT_OBJ.
P_MAKTX = GO_MATERIAL_KEY->GET_MAKTX( ).
P_ERSDA = GO_MATERIAL_KEY->GET_ERSDA( ).
P_MTART = GO_MATERIAL_KEY->GET_MTART( ).
P_MATKL = GO_MATERIAL_KEY->GET_MATKL( ).
WRITE : / '物料号:',P_MATNR.
WRITE : / '物料描述:',P_MAKTX.
WRITE : / '创建日期:',P_ERSDA.
WRITE : / '物料类型:',P_MTART.
WRITE : / '物料组:',P_MATKL.
CATCH CX_OS_OBJECT_NOT_FOUND.
MESSAGE 'Oject does not exist.' TYPE 'E'.
ENDTRY.
ELSEIF P_CRE = 'X'.
TRY.
"调用操作类,查询数据库中是否存在持久化记录
CALL METHOD GO_MATERIAL_AGENT->GET_PERSISTENT
EXPORTING
I_MATNR = P_MATNR
RECEIVING
RESULT = GO_RESULT_OBJ.
CATCH CX_OS_OBJECT_NOT_FOUND .
ENDTRY.
IF GO_RESULT_OBJ IS BOUND.
MESSAGE 'Oject already exist.' TYPE 'E'.
ENDIF.
TRY.
"调用操作类,创建持久化类的属性和主键记录到数据库表
CALL METHOD GO_MATERIAL_AGENT->CREATE_PERSISTENT
EXPORTING
I_MATNR = P_MATNR
I_MAKTX = P_MAKTX
I_ERSDA = P_ERSDA
I_MTART = P_MTART
I_MATKL = P_MATKL
RECEIVING
RESULT = GO_MATERIAL_KEY.
COMMIT WORK.
WRITE : / 'Object Created.'.
CATCH CX_OS_OBJECT_EXISTING .
MESSAGE 'Oject already exist.' TYPE 'E'.
ENDTRY.
ELSEIF P_DEL = 'X'.
TRY.
"调用操作类,查询数据库中是否存在持久化记录
CALL METHOD GO_MATERIAL_AGENT->GET_PERSISTENT
EXPORTING
I_MATNR = P_MATNR
RECEIVING
RESULT = GO_RESULT_OBJ.
CATCH CX_OS_OBJECT_NOT_FOUND .
MESSAGE 'Oject does not exist.' TYPE 'E'.
ENDTRY.
GO_MATERIAL_KEY ?= GO_RESULT_OBJ.
TRY.
"调用操作类,按主键删除持久化记录
CALL METHOD GO_MATERIAL_AGENT->DELETE_PERSISTENT
EXPORTING
I_MATNR = P_MATNR.
COMMIT WORK.
WRITE : / 'Object Deleted.'.
CATCH CX_OS_OBJECT_NOT_EXISTING .
MESSAGE 'Oject does not exist.' TYPE 'E'.
ENDTRY.
ENDIF.
以上是关于学习笔记持久类和对象持久化的应用的主要内容,如果未能解决你的问题,请参考以下文章