技术接口:日志程序2
之前有发布过Hand的技术接口,日志程序,有兴趣的可以前往。hand日志程序。本文描述的是另外一种方案实现日志程序。
1. 技术需求
接口或者BAPI传输数据日志保存。
2.技术实现
确认系统内有没有下列对象:
R3TR PROG ZAFL_MACROSR3TR PROG ZAFL_VIEWERR3TR CLSD ZUI2_JSONR3TR CLSD ZCL_AFL_JSONR3TR CLSD ZCL_AFL_UTILITIESR3TR TABL ZAFL_CONFIGR3TR TABL ZAFL_LOG
如果有,请不要进行下面的步骤,否则将被覆盖。(程序和表格再后面附上)
修改需要添加Log的函数,普通函数或者Remote函数都可以。
2.1在函数的TOP文件添加语句
2.2在函数内添加语句 :
后面为本函数的函数名,每个函数在最上面只需定义一次。
/afl/log_init.
后面为初始化logger,需要在FM的开头部分调用,放到程序中每个需要记录数据的位置,记录数据即为程序执行到这个点的时候各个返回参数的值。
/afl/set_status 'E' ex_mesage
. 语句
2.3完整的测试程序:ZFM_DI001
FUNCTION ZFM_DI001.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(IM_DAY) TYPE DATS OPTIONAL
*" VALUE(IM_QUAN) TYPE INT4 OPTIONAL
*" VALUE(IM_TIME) TYPE TIMS OPTIONAL
*" EXPORTING
*" VALUE(EX_TYPE) TYPE BAPI_MTYPE
*" VALUE(EX_MESAGE) TYPE BAPI_MSG
*" TABLES
*" ET_TAB STRUCTURE T001W OPTIONAL
*"----------------------------------------------------------------------**初始化logger,需要在FM的开头部分调用/afl/log_init.**可选,最多指定3个用于搜索的字段(比如公司代码、物料号等)/afl/set_custom_fields im_day '' ''.IF im_day IS INITIAL.ex_type = 'E'.ex_mesage = '没有输入日期'.**可选,记录状态码,如S/E等,最多2位/afl/set_status 'E' ex_mesage.ELSE.ex_type = 'S'.ex_mesage = |hello world.{ im_day }| .SELECT *FROM t001wINTO CORRESPONDING FIELDS OF TABLE et_tabUP TO 10 ROWS.* data(lv_i) = 100 / 0."测试abap dump**可选,记录状态码,如S/E等,最多2位/afl/set_status 'S' ex_mesage.ENDIF.**保存日志,必须在FM的结尾处/afl/save.ENDFUNCTION.
2.4 ZAFL_VIEWER读取Log程序(内有彩蛋一枚)
按条件查询到结果,搜索值1,2,3即程序中设定。另外显示程序可以重发,超链接等功能
3.附件-程序
3.1 包含程序ZAFL_MACROS
*&---------------------------------------------------------------------*
*& Include ZAFL_MACROS
*&---------------------------------------------------------------------*
DEFINE /afl/log_init.data: /afl/comp_tab type cl_abap_structdescr=>component_table,/afl/comp_wa like line of /afl/comp_tab.data: /afl/struct_type type ref to cl_abap_structdescr, "Structure/afl/parameter_data type ref to data.data: /afl/table_structure_type type ref to cl_abap_structdescr,/afl/table_type type ref to cl_abap_tabledescr.data: true_fieldname type string.data: /afl/func_name type string.data: /afl/callstack type abap_callstack.data: /afl/callstack_wa type line of abap_callstack.data: /afl/config type zafl_config.data: /afl/log type zafl_log.data: /afl/parameters_tab type table of fupararef.data: /afl/oref type ref to cx_uuid_error.data:lo_typedesc type ref to cl_abap_typedescr.data: /afl/end_time type tzntstmpl.data: /afl/start_time type tzntstmpl.field-symbols: </afl/parameter_data> type any,</afl/parameter_data_field> type any,</afl/parameter> type any,</alf/parameters> like line of /afl/parameters_tab,</alf/comp> like line of /afl/comp_tab.get time.call function 'SYSTEM_CALLSTACK'importingcallstack = /afl/callstack.* DATA(/afl/func_name) = VALUE #( /afl/callstack[ 1 ]-blockname OPTIONAL ).if /afl/callstack[] is not initial.read table /afl/callstack into /afl/callstack_wa index 1./afl/func_name = /afl/callstack_wa-blockname.endif.select single *into /afl/configfrom zafl_configwhere fname = /afl/func_nameand enabled = 'X'.
* INTO @DATA(/afl/config).if sy-subrc = 0.select funcname paramtype pposition parameter structureinto corresponding fields of table /afl/parameters_tabfrom fupararefwhere funcname = /afl/func_name.
* INTO TABLE @DATA(/afl/parameters_tab).if sy-subrc = 0.sort /afl/parameters_tab by paramtype pposition.if /afl/config-import = abap_true./afl/log_get_json 'I' /afl/log-import.endif.if /afl/config-change = abap_true./afl/log_get_json 'C' /afl/log-change_in.endif.if /afl/config-table_in = abap_true./afl/log_get_table_json /afl/log-table_in.endif.try./afl/log-guid = cl_system_uuid=>create_uuid_x16_static( ).catch cx_uuid_error into /afl/oref.endtry.get time stamp field /afl/start_time.get time stamp field /afl/log-timestamp.* /afl/log = VALUE #( BASE /afl/log
* fname = /afl/func_name
* uname = sy-uname
* )./afl/log-fname = /afl/func_name./afl/log-uname = sy-uname.endif.endif.END-OF-DEFINITION.DEFINE /afl/log_get_json.clear /afl/comp_tab.loop at /afl/parameters_tab assigning </alf/parameters> where paramtype = &1./afl/comp_wa-name = </alf/parameters>-parameter./afl/comp_wa-type ?= cl_abap_datadescr=>describe_by_name( </alf/parameters>-structure ).append /afl/comp_wa to /afl/comp_tab.endloop.if /afl/comp_tab is not initial.
* /afl/struct_type = cl_abap_structdescr=>create( /afl/comp_tab ).cl_abap_structdescr=>create(exportingp_components = /afl/comp_tabreceivingp_result = /afl/struct_type).create data /afl/parameter_data type handle /afl/struct_type.assign /afl/parameter_data->* to </afl/parameter_data>.loop at /afl/comp_tab assigning </alf/comp>.assign (</alf/comp>-name) to </afl/parameter>.assign component </alf/comp>-name of structure </afl/parameter_data> to </afl/parameter_data_field>.</afl/parameter_data_field> = </afl/parameter>.endloop.&2 = zui2_json=>serialize( data = </afl/parameter_data> ).endif.END-OF-DEFINITION.DEFINE /afl/log_get_table_json.clear /afl/comp_tab.loop at /afl/parameters_tab assigning </alf/parameters> where paramtype = 'T'./afl/comp_wa-name = </alf/parameters>-parameter.
* /afl/table_structure_type = CAST cl_abap_structdescr( cl_abap_datadescr=>describe_by_name( </alf/parameters>-structure ) ).
* /afl/table_type = CAST cl_abap_tabledescr( cl_abap_tabledescr=>create( /afl/table_structure_type ) ).lo_typedesc = cl_abap_datadescr=>describe_by_name( </alf/parameters>-structure ) ./afl/table_structure_type ?= lo_typedesc./afl/table_type = cl_abap_tabledescr=>create( /afl/table_structure_type ) ./afl/comp_wa-type ?= /afl/table_type.append /afl/comp_wa to /afl/comp_tab.endloop.if /afl/comp_tab is not initial.
* /afl/struct_type = cl_abap_structdescr=>create( /afl/comp_tab ).cl_abap_structdescr=>create(exportingp_components = /afl/comp_tabreceivingp_result = /afl/struct_type).create data /afl/parameter_data type handle /afl/struct_type.assign /afl/parameter_data->* to </afl/parameter_data>.loop at /afl/comp_tab assigning </alf/comp>.true_fieldname = </alf/comp>-name && '[]'.assign (true_fieldname) to </afl/parameter>.assign component </alf/comp>-name of structure </afl/parameter_data> to </afl/parameter_data_field>.</afl/parameter_data_field> = </afl/parameter>.endloop.&1 = zui2_json=>serialize( data = </afl/parameter_data> ).endif.END-OF-DEFINITION.DEFINE /afl/set_custom_fields.* /afl/log = VALUE #( BASE /afl/log
* cust_field1 = &1
* cust_field2 = &2
* cust_field3 = &3
* )./afl/log-cust_field1 = &1./afl/log-cust_field2 = &2./afl/log-cust_field3 = &3.END-OF-DEFINITION.DEFINE /afl/set_status .* /afl/log = VALUE #( BASE /afl/log
* status = &1
* message = &2
* )./afl/log-status = &1./afl/log-message = &2.END-OF-DEFINITION.DEFINE /afl/save .if /afl/log-guid is not initial.clear /afl/end_time.if /afl/config-export = abap_true./afl/log_get_json 'E' /afl/log-export.endif.if /afl/config-table_out = abap_true./afl/log_get_table_json /afl/log-table_out.endif.if /afl/config-change = abap_true./afl/log_get_json 'C' /afl/log-change_out.endif.get time.get time stamp field /afl/end_time./afl/log-time_cost = cl_abap_tstmp=>subtract( tstmp1 = /afl/end_time tstmp2 = /afl/start_time ).modify zafl_log from /afl/log.if /afl/config-no_commit = abap_false.commit work.endif.endif.END-OF-DEFINITION.DEFINE /afl/err_exit./afl/set_status &1 &2./afl/save.
END-OF-DEFINITION.
3.2 查看程序ZAFL_VIEWER
*&---------------------------------------------------------------------*
*& Report ZAFL_VIEWER
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zafl_viewer.DATA: _log TYPE zafl_log.INCLUDE zafl_macros.SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-t00.SELECT-OPTIONS: s_fm FOR _log-fname NO INTERVALS NO-EXTENSION.
SELECT-OPTIONS: s_guid FOR _log-guid.
SELECT-OPTIONS: s_cf1 FOR _log-cust_field1.
SELECT-OPTIONS: s_cf2 FOR _log-cust_field2.
SELECT-OPTIONS: s_cf3 FOR _log-cust_field3.
SELECT-OPTIONS: s_status FOR _log-status NO INTERVALS.
SELECTION-SCREEN END OF BLOCK b1.SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-t01.
SELECTION-SCREEN BEGIN OF LINE .
SELECTION-SCREEN COMMENT 1(20) TEXT-t02 FOR FIELD p_dstart.
PARAMETERS: p_dstart TYPE edidc-upddat DEFAULT sy-datum.
SELECTION-SCREEN COMMENT 35(20) TEXT-t03 FOR FIELD p_dend.
PARAMETERS: p_dend TYPE edidc-upddat.
SELECTION-SCREEN END OF LINE.SELECTION-SCREEN BEGIN OF LINE .
SELECTION-SCREEN COMMENT 1(20) TEXT-t04 FOR FIELD p_tstart.
PARAMETERS: p_tstart TYPE edidc-updtim DEFAULT '000000'.
SELECTION-SCREEN COMMENT 35(20) TEXT-t05 FOR FIELD p_tend.
PARAMETERS: p_tend TYPE edidc-updtim DEFAULT '235959'.
SELECTION-SCREEN END OF LINE.SELECTION-SCREEN END OF BLOCK b2.* Block: Number Of Hits.
SELECTION-SCREEN BEGIN OF BLOCK no_of_hits WITH FRAME TITLE TEXT-t06.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(20) FOR FIELD pv_nofhs.
PARAMETERS pv_nofhs TYPE i DEFAULT 1000 MODIF ID nh2.
SELECTION-SCREEN POSITION 40.
PARAMETERS pc_nhnl AS CHECKBOX USER-COMMAND nh1.
SELECTION-SCREEN COMMENT 47(30) TEXT-t07 FOR FIELD pc_nhnl.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK no_of_hits.TYPES: ty_time_cond TYPE RANGE OF timestamp.TYPES BEGIN OF ty_log.
TYPES date TYPE sy-datum.
TYPES time TYPE sy-uzeit.
TYPES time_zone TYPE sy-zonlo.
INCLUDE TYPE zafl_log.
TYPES END OF ty_log.DATA: gt_log TYPE STANDARD TABLE OF ty_log.
DATA: gr_alv TYPE REF TO cl_salv_table.DATA:gv_s TYPE i,gv_e TYPE i,gv_c TYPE i.*----------------------------------------------------------------------*
* CLASS lcl_handle_events DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_handle_events DEFINITION.PUBLIC SECTION.METHODS:on_user_command FOR EVENT added_function OF cl_salv_eventsIMPORTING e_salv_function,on_link_click FOR EVENT link_click OF cl_salv_events_tableIMPORTING row column.
ENDCLASS. "lcl_handle_events DEFINITION*----------------------------------------------------------------------*
* CLASS lcl_handle_events IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_handle_events IMPLEMENTATION.METHOD on_user_command.PERFORM handle_user_command USING e_salv_function.ENDMETHOD. "on_user_command"on_double_clickMETHOD on_link_click.DATA: value TYPE string.DATA: fm_name TYPE rs38l_fnam.FIELD-SYMBOLS:<row> LIKE LINE OF gt_log,<value> TYPE any.READ TABLE gt_log INDEX row ASSIGNING <row>.IF sy-subrc = 0.ASSIGN COMPONENT column OF STRUCTURE <row> TO <value>.IF sy-subrc = 0.value = <value>.ENDIF.ENDIF.IF column = 'FNAME'.fm_name = value.SET PARAMETER ID 'LIB' FIELD fm_name.CALL TRANSACTION 'SE37' AND SKIP FIRST SCREEN.ELSE.cl_demo_output=>display_json( <value> ).ENDIF.ENDMETHOD. "on_single_click
ENDCLASS. "lcl_handle_events IMPLEMENTATIONINITIALIZATION.START-OF-SELECTION.* DATA(gr_events) = NEW lcl_handle_events( ).DATA gr_events TYPE REF TO lcl_handle_events.CREATE OBJECT gr_events.PERFORM get_data.PERFORM display.
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_data.DATA: s_ts TYPE ty_time_cond.CLEAR :gv_s,gv_e,gv_c.FIELD-SYMBOLS:<fs_log> LIKE LINE OF gt_log.PERFORM get_time_cond USING p_dstartp_dendp_tstartp_tends_ts.CASE pc_nhnl.WHEN 'X'.SELECT *INTO CORRESPONDING FIELDS OF TABLE gt_log
* UP TO pv_nofhs ROWSFROM zafl_logWHERE guid IN s_guidAND fname IN s_fmAND cust_field1 IN s_cf1AND cust_field2 IN s_cf2AND cust_field3 IN s_cf3AND status IN s_statusAND timestamp IN s_ts .WHEN ''.SELECT *INTO CORRESPONDING FIELDS OF TABLE gt_logUP TO pv_nofhs ROWSFROM zafl_logWHERE guid IN s_guidAND fname IN s_fmAND cust_field1 IN s_cf1AND cust_field2 IN s_cf2AND cust_field3 IN s_cf3AND status IN s_statusAND timestamp IN s_ts .ENDCASE.LOOP AT gt_log ASSIGNING <fs_log> WHERE timestamp IS NOT INITIAL.<fs_log>-time_zone = sy-zonlo.CONVERT TIME STAMP <fs_log>-timestampTIME ZONE <fs_log>-time_zoneINTO DATE <fs_log>-dateTIME <fs_log>-time.IF <fs_log>-status = 'S'.gv_s = gv_s + 1.ELSEIF <fs_log>-status = 'E'.gv_e = gv_e + 1.ENDIF.gv_c = gv_c + 1.ENDLOOP.ENDFORM. "get_data*&---------------------------------------------------------------------*
*& Form get_time_cond
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->SDATE text
* -->EDATE text
* -->STIME text
* -->ETIME text
* -->RESULT text
*----------------------------------------------------------------------*
FORM get_time_cond USING sdate TYPE datsedate TYPE datsstime TYPE uzeitetime TYPE uzeitresult TYPE ty_time_cond.DATA:start_date TYPE dats,end_date TYPE dats,start_timestamp TYPE timestamp,end_timestamp TYPE timestamp,ls_result TYPE LINE OF ty_time_cond.IF sdate IS INITIAL AND edate IS INITIAL.RETURN.ENDIF.start_date = sdate.end_date = edate.IF end_date IS INITIAL.end_date = start_date.ENDIF.IF start_date IS INITIAL.start_date = end_date.ENDIF.start_timestamp = start_date && stime.end_timestamp = end_date && etime.* MOVE 'IBT' TO result.ls_result-sign = 'I'.ls_result-option = 'BT'.ls_result-low = start_timestamp.ls_result-high = end_timestamp.APPEND ls_result TO result.CLEAR ls_result.* result = value #( SIGN = 'I' OPTION = 'BT' (
* LOW = start_timestamp
* HIGH = end_timestamp
* )
* ).
ENDFORM. "get_time_cond
*&---------------------------------------------------------------------*
*& Form DISPLAY
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM display.DATA:lr_msg TYPE REF TO cx_salv_msg,lr_cols TYPE REF TO cl_salv_columns,lr_selections TYPE REF TO cl_salv_selections,lr_events TYPE REF TO cl_salv_events_table,config TYPE zafl_config."###ñ#ͷDATA: lr_header TYPE REF TO cl_salv_form_layout_grid,lr_h_header TYPE REF TO cl_salv_form_header_info,lr_h_flow TYPE REF TO cl_salv_form_layout_flow.TRY.cl_salv_table=>factory(IMPORTINGr_salv_table = gr_alvCHANGINGt_table = gt_log ).CATCH cx_salv_msg INTO lr_msg.ENDTRY.* data(lr_cols) = cast cl_salv_columns( gr_alv->get_columns( ) ).lr_cols = gr_alv->get_columns( ).lr_cols->set_optimize( 'X' ).gr_alv->set_screen_status(pfstatus = 'SALV_STANDARD'report = sy-repidset_functions = gr_alv->c_functions_all).* data(lr_selections) = gr_alv->get_selections( ).lr_selections = gr_alv->get_selections( ).lr_selections->set_selection_mode( 3 ).DATA: lr_functions TYPE REF TO cl_salv_functions.IF zcl_afl_utilities=>get_distinct_count( tab_data = gt_log field_name = 'FNAME' ) = 1.SELECT SINGLE cust_name1 cust_name2 cust_name3INTO CORRESPONDING FIELDS OF configFROM zafl_config.
* into @data(config).ENDIF.IF config IS INITIAL.
* config = value #(
* cust_name1 = 'CUST_FIELD1'
* cust_name2 = 'CUST_FIELD2'
* cust_name3 = 'CUST_FIELD3'
* ).config-cust_name1 = 'CUST_FIELD1'.config-cust_name2 = 'CUST_FIELD2'.config-cust_name3 = 'CUST_FIELD3'.ENDIF.PERFORM set_column USING '' lr_cols 'GUID' 'GUID' .PERFORM set_column USING 'X' lr_cols 'FNAME' 'Function Module' .PERFORM set_column USING '' lr_cols 'CUST_FIELD1' config-cust_name1.PERFORM set_column USING '' lr_cols 'CUST_FIELD2' config-cust_name2.PERFORM set_column USING '' lr_cols 'CUST_FIELD3' config-cust_name3.PERFORM set_column USING '' lr_cols 'STATUS' 'Status Code' .PERFORM set_colum2 USING 'X' lr_cols 'TIMESTAMP' 'Timestamp' .PERFORM set_column USING '' lr_cols 'DATE' 'Date' .PERFORM set_column USING '' lr_cols 'TIME' 'Time' .PERFORM set_column USING '' lr_cols 'TIME_ZONE' 'Zone' .PERFORM set_column USING '' lr_cols 'TIME_COST' 'Time Cost' .PERFORM set_column USING '' lr_cols 'UNAME' 'User' .PERFORM set_column USING '' lr_cols 'MESSAGE' 'Message' .PERFORM set_column USING 'X' lr_cols 'IMPORT' 'Import Data' .PERFORM set_column USING 'X' lr_cols 'EXPORT' 'Export Data' .PERFORM set_column USING 'X' lr_cols 'CHANGE_IN' 'Changing In' .PERFORM set_column USING 'X' lr_cols 'CHANGE_OUT' 'Changing Out' .PERFORM set_column USING 'X' lr_cols 'TABLE_IN' 'Tables In ' .PERFORM set_column USING 'X' lr_cols 'TABLE_OUT' 'Tables Out' .* data(lr_events) = gr_alv->get_event( ).lr_events = gr_alv->get_event( ).SET HANDLER gr_events->on_user_command FOR lr_events.SET HANDLER gr_events->on_link_click FOR lr_events.* header objectCREATE OBJECT lr_header.DATA:lv_zmsg TYPE bapi_msg.lv_zmsg = |统计信息:总条目数{ gv_c },成功{ gv_s },失败{ gv_e }|.lr_h_header = lr_header->create_header_information( row = 1 column = 1 ).lr_h_header->set_text( lv_zmsg ).gr_alv->set_top_of_list( lr_header ).gr_alv->display( ).ENDFORM. "display*&---------------------------------------------------------------------*
*& Form set_column
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->I_HOTSPOT text
* -->PR_COLS text
* -->VALUE text
* -->(FNAME) text
* -->VALUE text
* -->(TEXT) text
*----------------------------------------------------------------------*
FORM set_column USING i_hotspot TYPE xfeldpr_cols TYPE REF TO cl_salv_columnsVALUE(fname)VALUE(text).DATA: lr_column TYPE REF TO cl_salv_column_table,lv_text_l TYPE scrtext_l,lv_text_m TYPE scrtext_m,lv_text_s TYPE scrtext_s.TRY.lv_text_l = text.lv_text_m = text.lv_text_s = text.lr_column ?= pr_cols->get_column( fname ).lr_column->set_long_text( lv_text_l ).lr_column->set_medium_text( lv_text_m ).lr_column->set_short_text( lv_text_s ).IF i_hotspot = abap_true.lr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).ENDIF.CATCH cx_salv_not_found. "#EC NO_HANDLERENDTRY.
ENDFORM. "set_column
*&---------------------------------------------------------------------*
*& Form set_column2
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->I_TECHNICAL text
* -->PR_COLS text
* -->VALUE text
* -->(FNAME) text
* -->VALUE text
* -->(TEXT) text
*----------------------------------------------------------------------*
FORM set_colum2 USING i_technical TYPE xfeldpr_cols TYPE REF TO cl_salv_columnsVALUE(fname)VALUE(text).DATA: lr_column TYPE REF TO cl_salv_column_table,lv_text_l TYPE scrtext_l,lv_text_m TYPE scrtext_m,lv_text_s TYPE scrtext_s.CHECK i_technical = 'X'.TRY.lr_column ?= pr_cols->get_column( fname ).lr_column->set_technical( ).CATCH cx_salv_not_found. "#EC NO_HANDLERENDTRY.
ENDFORM. "set_column
*&---------------------------------------------------------------------*
*& Form HANDLE_USER_COMMAND
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_E_SALV_FUNCTION text
*----------------------------------------------------------------------*
FORM handle_user_command USING i_ucomm TYPE salv_de_function.DATA:lv_result TYPE abap_bool.CASE i_ucomm.WHEN 'PROCESS'.lv_result = zcl_afl_utilities=>is_prd( ).IF lv_result = abap_true.DATA: ans TYPE c.CALL FUNCTION 'POPUP_TO_CONFIRM'EXPORTINGtitlebar = 'ȷ'(m01)
* text_question = 'You have called an IDoc test transaction in a client flagged as "Productive".'(m02)text_question = 'ȷ".'text_button_1 = 'OK'icon_button_1 = 'ICON_CHECKED'text_button_2 = 'CANCEL'icon_button_2 = 'ICON_CANCEL'display_cancel_button = ' 'popup_type = 'ICON_MESSAGE_ERROR'IMPORTINGanswer = ans.IF ans = 2.RETURN.ENDIF.ENDIF.PERFORM process_selected_rows.WHEN 'REFRESH'.PERFORM get_data.gr_alv->refresh( ).WHEN OTHERS.ENDCASE.ENDFORM. "handle_user_command
*&---------------------------------------------------------------------*
*& Form PROCESS_SELECTED_ROWS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM process_selected_rows.DATA:lr_selections TYPE REF TO cl_salv_selections,lt_rows TYPE salv_t_row,pass TYPE abap_bool,msg TYPE bapi_msg.FIELD-SYMBOLS:<row> LIKE LINE OF lt_rows,<log> LIKE LINE OF gt_log.* data(lr_selections) = gr_alv->get_selections( ).lr_selections = gr_alv->get_selections( ).
* data(lt_rows) = lr_selections->get_selected_rows( ).lt_rows = lr_selections->get_selected_rows( ).LOOP AT lt_rows ASSIGNING <row>.READ TABLE gt_log INDEX <row> ASSIGNING <log>.IF sy-subrc = 0.IF <log>-status = 'S'.msg = |#ӿ##ѳɹ##########ش###|.MESSAGE msg TYPE 'S' DISPLAY LIKE 'E'.RETURN.ENDIF.pass = zcl_afl_utilities=>fm_authority_check( <log>-fname ).IF pass = abap_false.msg = |You are not authorized to test function module { <log>-fname }|.MESSAGE msg TYPE 'S' DISPLAY LIKE 'E'.RETURN.ENDIF.ENDIF.ENDLOOP.LOOP AT lt_rows ASSIGNING <row>.READ TABLE gt_log INDEX <row> ASSIGNING <log>.IF sy-subrc = 0.zcl_afl_utilities=>re_process( <log>-guid ).ENDIF.ENDLOOP.msg = |{ lines( lt_rows ) } records processed|.MESSAGE msg TYPE 'S'.ENDFORM. "process_selected_rows
3.3 其他类
4. 参考资源
资源可下载