编程技术分享平台

网站首页 > 技术教程 正文

在ABAP中如何将对象进行持久化(abap changing)

xnh888 2024-11-04 14:55:10 技术教程 25 ℃ 0 评论

持久化的意思是将对象进行数据磁盘存储。

持久化对象在任何语言中都有对应的方法和理论。ABAP的持久化主要还是通过持久化服务进行对象的数据存储。如下图:



简单来说 持久化服务就是用于管理初始化对象,保存对象,管理对象。


下面我通过一个简单的实例来说明:系统的一个对象在业务处理中如何在属性的存储到SAP自定义表中,并支持增删改查操作。


  1. 创建一个自定义表ZTNB_TEST,用于存储持久化后的对象。

  2. 维护持久性可通过以下两种方式:
  3. 1. 使用业务key作为主键
  4. 2. 使用GUID,即SAP提供的全局标识符(类型OS_GUID)
  5. 创建一个持久化类(全局)


生成的类是Protected类

3.通过菜单“转到”→“持久性代表”,维护与持久类相关的数据库表。输入自定义表名,然后分配需要持久化的列。

分配好属性后点击“生成器设置”按钮设定创建持久类的设定。

一般需要将最后一个复选框(方法CREATE PERSISTENT和CREATE TRANSIENT使用最小接口)勾选去掉,如果勾选了,生成的持久类会仅仅针对自定义表的主键进行记录创建,而忽略其他属性。


最后激活该类,会提示是否创建类行动者,点击“是”系统将为这个持久类创建对应的操作用的虚拟类和操作类。


4.创建测试程序,将实例化的持久化类存入数据库并进行查询和删除操作。

创建:


读取:


删除:


5.测试源代码

REPORT znb_persist_test.


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_guid LIKE ztnb_test-guid,
  p_text LIKE ztnb_test-text.
SELECTION-SCREEN END OF BLOCK b2.




CLASS lcl_application DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS:
      run.


ENDCLASS.


CLASS lcl_application IMPLEMENTATION.
  METHOD run.
    DATA : go_ztnb_test_agent TYPE REF TO zca_persist_ztnb_test,
           go_ztnb_test       TYPE REF TO zcl_persist_ztnb_test.


    "创建操作类对象
    go_ztnb_test_agent = zca_persist_ztnb_test=>agent.
    IF p_get = abap_true.
      TRY.
          "调用操作类,读取持久化记录,初始化持久类并对属性赋值
          go_ztnb_test ?= go_ztnb_test_agent->get_persistent( i_guid = p_guid ).
          WRITE : / 'GUID:',go_ztnb_test->get_guid( ).
          WRITE : / 'TEXT:',go_ztnb_test->get_text( ).
        CATCH cx_os_object_not_found.
          MESSAGE 'Oject does not exist.' TYPE 'E'.
      ENDTRY.


    ELSEIF p_cre = abap_true.
      TRY.
          "调用操作类,查询数据库中是否存在持久化记录
          go_ztnb_test ?= go_ztnb_test_agent->get_persistent( i_guid = p_guid ).
        CATCH cx_os_object_not_found.
      ENDTRY.


      IF go_ztnb_test IS BOUND.
        MESSAGE 'Oject already exist.' TYPE 'E'.
      ENDIF.


      TRY.
          "调用操作类,创建持久化类的属性和主键记录到数据库表
          go_ztnb_test = go_ztnb_test_agent->create_persistent(
               i_guid = p_guid
               i_text = p_text
               ) .
          COMMIT WORK.
          WRITE : / 'Object Created.'.


        CATCH cx_os_object_existing .
          MESSAGE 'Oject already exist.' TYPE 'E'.
      ENDTRY.


    ELSEIF p_del = abap_true.
      TRY.
          "调用操作类,查询数据库中是否存在持久化记录
          go_ztnb_test ?= go_ztnb_test_agent->get_persistent( i_guid = p_guid ).


          "调用操作类,按主键删除持久化记录
          go_ztnb_test_agent->delete_persistent( i_guid = p_guid ).
          COMMIT WORK.
          WRITE : / 'Object Deleted.'.
        CATCH cx_os_object_not_found.
          MESSAGE 'Oject does not exist.' TYPE 'E'.
        CATCH cx_os_object_not_existing .
          MESSAGE 'Oject does not exist.' TYPE 'E'.
      ENDTRY.
    ENDIF.
  ENDMETHOD.


ENDCLASS.


START-OF-SELECTION.
  lcl_application=>run( ).

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表