最近写了比较多的复杂逻辑转换,大部分用了expert routine。写个模板,以便在后期项目有可能使用。
"!<p class="shorttext synchronized">Expert routine模板类</p>
CLASS zszc_expert_routine DEFINITION
PUBLIC
CREATE PUBLIC.
PUBLIC SECTION.
"!<p class="shorttext synchronized">结果表计数器</p>
DATA gv_record TYPE /bi0/oirecord.
"!<p class="shorttext synchronized">Request</p>
DATA gv_reqtsn TYPE rspm_request_tsn.
"!<p class="shorttext synchronized">Data Package</p>
DATA gv_datapakid TYPE /bi0/oidatapakid.
"!<p class="shorttext synchronized">DTP Log</p>
DATA gv_log TYPE REF TO cl_rsbm_log_cursor_step.
"!<p class="shorttext synchronized">DTP request instance</p>
DATA gr_request TYPE REF TO if_rsbk_request_admintab_view.
METHODS constructor
IMPORTING !request TYPE rsrequest
datapackid TYPE rsdatapid
req_obj TYPE REF TO if_rsbk_request_admintab_view OPTIONAL
!log TYPE REF TO cl_rsbm_log_cursor_step OPTIONAL.
"!<p class="shorttext synchronized">Expert入口</p>
METHODS main
EXPORTING result_package TYPE ANY TABLE
CHANGING source_package TYPE ANY TABLE
RAISING cx_rs_failed.
"!<p class="shorttext synchronized">记录错误Message</p>
METHODS record_log
IMPORTING msg TYPE rspc_s_msg.
"!<p class="shorttext synchronized">调试</p>
METHODS debug.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS zszc_expert_routine IMPLEMENTATION.
METHOD constructor.
gv_reqtsn = request.
gv_datapakid = datapackid.
gv_log = log.
gr_request = req_obj.
ENDMETHOD.
METHOD record_log.
DATA lt_monitor TYPE rspc_t_msg.
IF msg IS INITIAL.
RETURN.
ENDIF.
APPEND msg TO lt_monitor.
" 调用标准log方法
gv_log->add_t_msg( i_t_msg = lt_monitor ).
ENDMETHOD.
METHOD main.
debug( ).
" 为什么接口都是any table,因为通过include type产生的类型,可能和bw产生的不一样(即使结构完全一样,这是小概率事件)
" 会产生cx_dymanic_check错误
" gt_source = CORRESPONDING #( source_package ).
"
" gt_result = CORRESPONDING #( result_package ).
ENDMETHOD.
METHOD debug.
" 后台模式不考虑
IF sy-batch = abap_true.
RETURN.
ENDIF.
" 避开系统账户。如果用户账户有BIR开头,say sorry
IF sy-uname(3) = 'BIR'.
RETURN.
ENDIF.
" 检查req process mode
" 4--Serially in the Dialog Process (for Debugging)
IF gr_request IS NOT INITIAL.
IF gr_request->get_req_processmode( ) <> '4'.
RETURN.
ENDIF.
ELSE.
RETURN.
ENDIF.
BREAK-POINT.
ENDMETHOD.
ENDCLASS.