之前有发布过Hand的技术接口,日志程序,有兴趣的可以前往。hand日志程序。本文描述的是另外一种方案实现日志程序。
1. 技术需求
接口或者BAPI传输数据日志保存。
2.技术实现
确认系统内有没有下列对象:
R3TR PROG ZAFL_MACROS
R3TR PROG ZAFL_VIEWER
R3TR CLSD ZUI2_JSON
R3TR CLSD ZCL_AFL_JSON
R3TR CLSD ZCL_AFL_UTILITIES
R3TR TABL ZAFL_CONFIG
R3TR 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 t001w
INTO CORRESPONDING FIELDS OF TABLE et_tab
UP 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'
importing
callstack = /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/config
from zafl_config
where fname = /afl/func_name
and enabled = 'X'.
* INTO @DATA(/afl/config).
if sy-subrc = 0.
select funcname paramtype pposition parameter structure
into corresponding fields of table /afl/parameters_tab
from fupararef
where 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(
exporting
p_components = /afl/comp_tab
receiving
p_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(
exporting
p_components = /afl/comp_tab
receiving
p_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_events
IMPORTING e_salv_function,
on_link_click FOR EVENT link_click OF cl_salv_events_table
IMPORTING 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_click
METHOD 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 IMPLEMENTATION
INITIALIZATION.
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_dstart
p_dend
p_tstart
p_tend
s_ts.
CASE pc_nhnl.
WHEN 'X'.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE gt_log
* UP TO pv_nofhs ROWS
FROM zafl_log
WHERE guid IN s_guid
AND fname IN s_fm
AND cust_field1 IN s_cf1
AND cust_field2 IN s_cf2
AND cust_field3 IN s_cf3
AND status IN s_status
AND timestamp IN s_ts .
WHEN ''.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE gt_log
UP TO pv_nofhs ROWS
FROM zafl_log
WHERE guid IN s_guid
AND fname IN s_fm
AND cust_field1 IN s_cf1
AND cust_field2 IN s_cf2
AND cust_field3 IN s_cf3
AND status IN s_status
AND 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>-timestamp
TIME ZONE <fs_log>-time_zone
INTO DATE <fs_log>-date
TIME <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 dats
edate TYPE dats
stime TYPE uzeit
etime TYPE uzeit
result 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(
IMPORTING
r_salv_table = gr_alv
CHANGING
t_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-repid
set_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_name3
INTO CORRESPONDING FIELDS OF config
FROM 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 object
CREATE 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 xfeld
pr_cols TYPE REF TO cl_salv_columns
VALUE(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_HANDLER
ENDTRY.
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 xfeld
pr_cols TYPE REF TO cl_salv_columns
VALUE(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_HANDLER
ENDTRY.
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'
EXPORTING
titlebar = 'ȷ'(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'
IMPORTING
answer = 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. 参考资源
资源可下载