目录
1. 实现IF_WORKFLOW接口
2. 创建流程属性
3. 接口方法参考
4. 定义事件
5. 工作流触发(事件抛出)
业务对象作为工作流的数据内核,也是联系业务流程和工作流的重要核心,体现形式一般为BOR或者业务对象类,用来标识不同业务流程的工作流。示例步骤为工作流对象类的创建。
1. 实现IF_WORKFLOW接口
2. 创建流程属性
MV_INSTANCE_ID: 流程唯一业务ID,可以视为主键,可以为多个字段组合
LPOR-INSTID=》SWW_WI2OBJ-INSTID
LPOR-TYPEID =》SWW_WI2OBJ-TYPEID
LPOR- CATID =》SWW_WI2OBJ- CATID。
注意:key关键字段和参考类型(非数据字典类型的属性可能无法在工作流中使用)
3. 接口方法参考
构造方法主要包含属性字段的赋值逻辑,参考如下,其余逻辑根据需求填充
METHOD constructor.
mv_instance_id = iv_instid.
ms_lpor-catid = cl_swf_evt_event=>mc_objcateg_cl.
ms_lpor-typeid = me->get_class_name( ).
ms_lpor-instid = iv_instid.
ENDMETHOD.
接口IF_WORKFLOW的六个方法中,实施方法BI_PERSISTENT~FIND_BY_LPOR和BI_PERSISTENT~LPOR,其它方法可置空,根据业务场景确定逻辑。
METHOD bi_persistent~lpor.
result = me->ms_lpor.
ENDMETHOD.
METHOD bi_persistent~find_by_lpor.
IF mo_instance IS NOT INITIAL.
CLEAR mo_instance.
ENDIF.
CREATE OBJECT mo_instance
EXPORTING
iv_instid = lpor-instid.
result = mo_instance.
ENDMETHOD.
其它参考方法示例
DUMMY方法(部分工作流任务无需逻辑处理,可以使用该方法,比如事件驱动的审批节点)
method DUMMY.
endmethod.
value( RV_CLASS_NAME ) TYPE ABAP_ABSTYPENAME
METHOD get_class_name.
DATA:
lv_class_name TYPE abap_abstypename,
lo_descr_ref TYPE REF TO cl_abap_typedescr.
* determine type
lo_descr_ref = cl_abap_typedescr=>describe_by_object_ref( me ).
lv_class_name = lo_descr_ref->get_relative_name( ).
rv_class_name = lv_class_name.
ENDMETHOD.
4. 定义事件
注:事件中也可以定义参数,事件参数可以在抛出事件时传出,并随事件传递到工作流中。
5. 工作流触发(事件抛出)
IV_UNAME TYPE UNAME User Name
METHOD start_workflow.
DATA: lo_event TYPE REF TO if_swf_evt_event,
lv_object_id TYPE sibfinstid,
lo_event_container TYPE REF TO if_swf_ifs_parameter_container.
lv_object_id = mv_instance_id.
TRY.
* start workflow
lo_event = cl_swf_evt_event=>get_instance(
im_objcateg = cl_swf_evt_event=>mc_objcateg_cl
im_objtype = me->get_class_name( )
im_event = gc_submit
im_objkey = lv_object_id ).
lo_event_container = lo_event->get_event_container( ).
lo_event_container->set(
EXPORTING
name = gc_iv_initiator "IV_INITIATOR event container parameter
value = iv_uname ). "Value to be set
CATCH cx_swf_cnt_cont_access_denied cx_swf_cnt_elem_access_denied cx_swf_cnt_elem_not_found
cx_swf_cnt_elem_type_conflict cx_swf_cnt_unit_type_conflict cx_swf_cnt_elem_def_invalid
cx_swf_cnt_container.
##NO_HANDLER
ENDTRY.
TRY.
lo_event->raise( ).
CATCH cx_swf_evt_invalid_objtype cx_swf_evt_invalid_event.
##NO_HANDLER
ENDTRY.
ENDMETHOD.