持久化的意思是将对象进行数据磁盘存储。
持久化对象在任何语言中都有对应的方法和理论。ABAP的持久化主要还是通过持久化服务进行对象的数据存储。如下图:
简单来说 持久化服务就是用于管理初始化对象,保存对象,管理对象。
下面我通过一个简单的实例来说明:系统的一个对象在业务处理中如何在属性的存储到SAP自定义表中,并支持增删改查操作。
创建一个自定义表ZTNB_TEST,用于存储持久化后的对象。
维护持久性可通过以下两种方式:
1. 使用业务key作为主键
2. 使用GUID,即SAP提供的全局标识符(类型OS_GUID)
创建一个持久化类(全局)
生成的类是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( ).