ABAP 如何进行OO面向对象的事务管理
在上一篇文章里面,我们提到了ABAP的对象持久化实现,这次我们如何以面向对象的方式进行ABAP面向对象的持久化对象事务管理?
在传统的SAP编程里面,SAP事务管理是基于SAP LUWs。所有的数据都绑定到一个DB LUW里面。例如程序中执行的数据更改,以及注册到LUW里面以后执行(并不立即执行)的程序,例如子程序(使用 PERFORM ON COMMIT 注册的) 、更新程序函数(使用CALL FUNCTION IN UPDATE TASK)。这两种注册的程序都会在COMMIT WORK之后被执行。
而在面向对象的事务管理也是Transaction Service 也是基于SAP LUWs,并不是新的概念。所以它并没有单独创建注册到数据库的方法,也是基于传统的更新函数的方法进行事务管理,相当于用面向对象方式将其进行了封装。
cl_os_system=>init_and_set_modes( i_external_commit = oscon_false
i_update_mode = oscon_dmode_default ).
i_external_commit 表示是否允许过程中使用类似于COMMIT WORK的语句,如果为true,那么代码里面COMMIT WORK将影响数据的改变。一般建议是false,这样才能保证整个面向对象事务设计。
i_update_mode 更新方式
OSCON_DMODE_DEFAULT 或者 OSCON_DMODE_UPDATE_TASK: 异步更新
OSCON_DMODE_UPDATE_TASK_SYNC: 同步更新(相当于 COMMIT WORK AND WAIT)
OSCON_DMODE_DIRECT 或者 OSCON_DMODE_LOCAL: 本地更新 (类似于 SET UPDATE TASK LOCAL)
那我们将上次代码进行一个优化,加入面向对象的事物管理
源代码如下:
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.
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE TEXT-003.
PARAMETERS: p_test TYPE char1 AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK b3.
CLASS lcl_application DEFINITION.
PUBLIC SECTION.
"!主程序
CLASS-METHODS: run.
"!注册一个方法 用来监听事务的状态
CLASS-METHODS: handle FOR EVENT finished OF if_os_transaction IMPORTING status.
ENDCLASS.
CLASS lcl_application IMPLEMENTATION.
METHOD handle.
WRITE:/ status.
ENDMETHOD.
METHOD run.
DATA go_transaction_manager TYPE REF TO if_os_transaction_manager.
DATA go_transaction TYPE REF TO if_os_transaction.
DATA : go_ztnb_test_agent TYPE REF TO zca_persist_ztnb_test,
go_ztnb_test TYPE REF TO zcl_persist_ztnb_test.
go_transaction_manager = cl_os_system=>get_transaction_manager( ).
go_transaction = go_transaction_manager->create_transaction( ).
SET HANDLER handle FOR go_transaction."注册一个方法 用来监听事务的状态
go_transaction->start( ).
"创建操作类对象
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
) .
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 ).
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.
IF p_test = abap_true.
go_transaction->undo( ).
ELSE.
go_transaction->end( ).
ENDIF.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
lcl_application=>run( ).
LOAD-OF-PROGRAM.
cl_os_system=>init_and_set_modes( i_external_commit = oscon_false
i_update_mode = oscon_dmode_default ).
post SAP-Garson
原文链接:https://blog.csdn.net/duoergui/article/details/124667917文章来自于网络,如果侵犯了您的权益,请联系站长删除!