技术接口:日志程序2

   

之前有发布过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. 参考资源

  资源可下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值