【学习笔记】持久类和对象持久化的应用

  • 2021-11-25
  • Admin

持久类和对象持久化的应用

整理转自 —《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,传入适当的参数,即可实现类的持久化操作。

【源代码】

  1. *&---------------------------------------------------------------------*
  2. *& Report  ZPRT_PERSIST_MARA_GUID
  3. *&
  4. *&---------------------------------------------------------------------*
  5. *&
  6. *&
  7. *&---------------------------------------------------------------------*
  8. REPORT ZPRT_PERSIST_MARA_GUID.
  9. SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
  10. PARAMETERS : P_GET RADIOBUTTON GROUP G1,
  11.              P_CRE RADIOBUTTON GROUP G1,
  12.              P_DEL RADIOBUTTON GROUP G1.
  13. SELECTION-SCREEN END OF BLOCK B1.
  14. SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-002.
  15. PARAMETERS :
  16.             P_MATNR LIKE ZTB_MARA_KEY-MATNR,
  17.             P_MAKTX LIKE ZTB_MARA_KEY-MAKTX,
  18.             P_ERSDA LIKE ZTB_MARA_KEY-ERSDA,
  19.             P_MTART LIKE ZTB_MARA_KEY-MTART,
  20.             P_MATKL LIKE ZTB_MARA_KEY-MATKL.
  21. SELECTION-SCREEN END OF BLOCK B2.
  22. DATA : GO_MATERIAL_AGENT TYPE REF TO ZCA_PERSIST_MARA_KEY,
  23.        GO_RESULT_OBJ TYPE REF TO OBJECT,
  24.        GO_MATERIAL_KEY TYPE REF TO ZCL_PERSIST_MARA_KEY.
  25. START-OF-SELECTION.
  26.   "创建操作类对象
  27.   GO_MATERIAL_AGENT = ZCA_PERSIST_MARA_KEY=>AGENT.
  28.   IF P_GET = 'X'.
  29.     TRY.
  30.         "调用操作类,读取持久化记录,初始化持久类并对属性赋值
  31.         CALL METHOD GO_MATERIAL_AGENT->GET_PERSISTENT
  32.           EXPORTING
  33.             I_MATNR = P_MATNR
  34.           RECEIVING
  35.             RESULT  = GO_RESULT_OBJ.
  36.         GO_MATERIAL_KEY ?= GO_RESULT_OBJ.
  37.         P_MAKTX = GO_MATERIAL_KEY->GET_MAKTX( ).
  38.         P_ERSDA = GO_MATERIAL_KEY->GET_ERSDA( ).
  39.         P_MTART = GO_MATERIAL_KEY->GET_MTART( ).
  40.         P_MATKL = GO_MATERIAL_KEY->GET_MATKL( ).
  41.         WRITE : / '物料号:',P_MATNR.
  42.         WRITE : / '物料描述:',P_MAKTX.
  43.         WRITE : / '创建日期:',P_ERSDA.
  44.         WRITE : / '物料类型:',P_MTART.
  45.         WRITE : / '物料组:',P_MATKL.
  46.       CATCH CX_OS_OBJECT_NOT_FOUND.
  47.         MESSAGE 'Oject does not exist.' TYPE 'E'.
  48.     ENDTRY.
  49.   ELSEIF P_CRE = 'X'.
  50.     TRY.
  51.         "调用操作类,查询数据库中是否存在持久化记录
  52.         CALL METHOD GO_MATERIAL_AGENT->GET_PERSISTENT
  53.           EXPORTING
  54.             I_MATNR = P_MATNR
  55.           RECEIVING
  56.             RESULT  = GO_RESULT_OBJ.
  57.       CATCH CX_OS_OBJECT_NOT_FOUND .
  58.     ENDTRY.
  59.     IF GO_RESULT_OBJ IS BOUND.
  60.       MESSAGE 'Oject already exist.' TYPE 'E'.
  61.     ENDIF.
  62.     TRY.
  63.         "调用操作类,创建持久化类的属性和主键记录到数据库表
  64.         CALL METHOD GO_MATERIAL_AGENT->CREATE_PERSISTENT
  65.           EXPORTING
  66.             I_MATNR = P_MATNR
  67.             I_MAKTX = P_MAKTX
  68.             I_ERSDA = P_ERSDA
  69.             I_MTART = P_MTART
  70.             I_MATKL = P_MATKL
  71.           RECEIVING
  72.             RESULT  = GO_MATERIAL_KEY.
  73.         COMMIT WORK.
  74.         WRITE : / 'Object Created.'.
  75.       CATCH CX_OS_OBJECT_EXISTING .
  76.         MESSAGE 'Oject already exist.' TYPE 'E'.
  77.     ENDTRY.
  78.   ELSEIF P_DEL = 'X'.
  79.     TRY.
  80.         "调用操作类,查询数据库中是否存在持久化记录
  81.         CALL METHOD GO_MATERIAL_AGENT->GET_PERSISTENT
  82.           EXPORTING
  83.             I_MATNR = P_MATNR
  84.           RECEIVING
  85.             RESULT  = GO_RESULT_OBJ.
  86.       CATCH CX_OS_OBJECT_NOT_FOUND .
  87.         MESSAGE 'Oject does not exist.' TYPE 'E'.
  88.     ENDTRY.
  89.     GO_MATERIAL_KEY ?= GO_RESULT_OBJ.
  90.     TRY.
  91.         "调用操作类,按主键删除持久化记录
  92.         CALL METHOD GO_MATERIAL_AGENT->DELETE_PERSISTENT
  93.           EXPORTING
  94.             I_MATNR = P_MATNR.
  95.         COMMIT WORK.
  96.         WRITE : / 'Object Deleted.'.
  97.       CATCH CX_OS_OBJECT_NOT_EXISTING .
  98.         MESSAGE 'Oject does not exist.' TYPE 'E'.
  99.     ENDTRY.
  100.   ENDIF.

原文:https://blog.csdn.net/zhongguomao/article/details/121546734

联系站长

QQ:769220720