持久类和对象持久化的应用
整理转自 —《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.