黑龙江供销社接口日志平台

复制代码
FUNCTION zfm_oa_001.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(IV_JSON) TYPE  STRING
*"     VALUE(IV_DATA) TYPE  ZSMM_OA_001 OPTIONAL
*"  EXPORTING
*"     VALUE(EV_JSON) TYPE  STRING
*"----------------------------------------------------------------------

  /afl/log_init.

  DATA:ls_data   TYPE zsmm_oa_001,
       ls_return TYPE zsmm_oa_001_ret.

  CLEAR:ls_data,ls_return.

  IF iv_data IS NOT INITIAL.
    /ui2/cl_json=>serialize( EXPORTING data = iv_data
                           RECEIVING r_json = iv_json ).
  ENDIF.

  "反序列json解析
  /ui2/cl_json=>deserialize( EXPORTING json = iv_json
                             CHANGING  data = ls_data ).

  IF ls_data IS NOT INITIAL.
    "校验
    PERFORM frm_check_data_001  CHANGING ls_data ls_return.

    IF ls_return-ev_type EQ ''.
      "创建
      PERFORM frm_create_data_001 USING ls_data CHANGING ls_return.
    ENDIF.
  ELSE.
    ls_return-ev_type = 'E'.
    ls_return-ev_message = '数据为空/解析错误'.
  ENDIF.

  "序列化JSON解析
  /ui2/cl_json=>serialize( EXPORTING data = ls_return
                           RECEIVING r_json = ev_json ).

  /afl/set_status ls_return-ev_type ls_return-ev_message.    "更新日志
  /afl/save.   "记录日志

ENDFUNCTION.
复制代码

 

 

 

复制代码
*&---------------------------------------------------------------------*
*&  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.


  FIELD-SYMBOLS: </afl/parameter_data>       TYPE any,
                 </afl/parameter_data_field> TYPE any,
                 </afl/parameter>            TYPE any.

  DATA: /afl/callstack TYPE abap_callstack.

  DATA: /afl/log TYPE zafl_log.

*L
    DATA: /afl/end_time TYPE tzntstmpl.
*L

  GET TIME.

  CALL FUNCTION 'SYSTEM_CALLSTACK'
    IMPORTING
      callstack = /afl/callstack.

  DATA(/afl/func_name) = VALUE #( /afl/callstack[ 1 ]-blockname OPTIONAL ).

    SELECT SINGLE * 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
      FROM fupararef
      WHERE funcname = @/afl/func_name
      INTO TABLE @DATA(/afl/parameters_tab).
    IF sy-subrc = 0.

      SORT /afl/parameters_tab BY paramtype pposition.

      FIELD-SYMBOLS: </alf/parameters> LIKE LINE OF /afl/parameters_tab,
                     </alf/comp>       LIKE LINE OF /afl/comp_tab.

      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.

      DATA: /afl/start_time TYPE tzntstmpl.

      TRY.
          /afl/log-guid = cl_system_uuid=>create_uuid_x16_static( ).
        CATCH cx_uuid_error INTO DATA(/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
      ).

    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 ).

    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 = /ui2/cl_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
  ).

END-OF-DEFINITION.

DEFINE /afl/set_status .

  /afl/log = VALUE #( BASE /afl/log
    status  = &1
    message = &2
  ).

END-OF-DEFINITION.

DEFINE /afl/save .

  IF /afl/log-guid IS NOT INITIAL.

*L
*    DATA: /afl/end_time TYPE tzntstmpl.
*L

    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/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 ) ).
    /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 ).

    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 = /ui2/cl_json=>serialize( data = </afl/parameter_data> ).
  ENDIF.

END-OF-DEFINITION.
复制代码

 

 

 

复制代码
REPORT zafl_viewer.
TABLES sscrfields.
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.
SELECTION-SCREEN FUNCTION KEY 1.
TYPES: ty_time_cond TYPE RANGE OF timestamp.

TYPES BEGIN OF ty_log.
INCLUDE TYPE zafl_log.
TYPES date TYPE sy-datum.
TYPES time TYPE sy-uzeit.
TYPES time_zone TYPE sy-zonlo.
TYPES END OF ty_log.

DATA: gt_log TYPE STANDARD TABLE OF ty_log.
DATA: gr_alv TYPE REF TO cl_salv_table.

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.

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.

    READ TABLE gt_log INDEX row ASSIGNING FIELD-SYMBOL(<row>).
    IF sy-subrc = 0.
      ASSIGN COMPONENT column OF STRUCTURE <row> TO FIELD-SYMBOL(<value>).
      IF sy-subrc = 0.
        value = <value>.
      ENDIF.
    ENDIF.

    IF column = 'FNAME'.

      DATA(fm_name) = CONV rs38l_fnam( 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.


INITIALIZATION.
  sscrfields-functxt_01 = '函数日志配置'.

AT SELECTION-SCREEN.
  CASE sscrfields-ucomm.
    WHEN 'FC01'.
      CALL TRANSACTION 'ZAFL_CONFIG'.
      DATA: seltab    TYPE TABLE OF rsparams,
            seltab_wa LIKE LINE OF seltab.
      seltab_wa-selname = 'S_FM'.
      seltab_wa-sign    = 'I'.
      seltab_wa-option  = 'EQ'.
      seltab_wa-low  = 'ZPPFM_002'.
      APPEND seltab_wa TO seltab.
      seltab_wa-selname = 'S_CF1'.
      seltab_wa-sign    = 'I'.
      seltab_wa-option  = 'EQ'.
      seltab_wa-low  = 'WMS_PP0002'.
      APPEND seltab_wa TO seltab.
      SUBMIT zafl_viewer WITH SELECTION-TABLE seltab VIA SELECTION-SCREEN AND RETURN.

    WHEN OTHERS.
  ENDCASE.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_fm-low. " 制单人 F4
  PERFORM frm_set_f4.

START-OF-SELECTION.

  DATA(gr_events) = NEW lcl_handle_events( ).

  PERFORM get_data.

  PERFORM display.
*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM get_data.


  DATA: s_ts TYPE ty_time_cond.

  PERFORM get_time_cond USING p_dstart
                              p_dend
                              p_tstart
                              p_tend
                              s_ts.

  SELECT * 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
    INTO CORRESPONDING FIELDS OF TABLE @gt_log
  UP TO @pv_nofhs ROWS.


  LOOP AT gt_log ASSIGNING FIELD-SYMBOL(<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.

  ENDLOOP.

ENDFORM.

FORM get_time_cond USING sdate  TYPE dats
                         edate  TYPE dats
                         stime  TYPE uzeit
                         etime  TYPE uzeit
                         result TYPE ty_time_cond.
  IF sdate IS INITIAL AND edate IS INITIAL.
    RETURN.
  ENDIF.

  DATA(start_date) = sdate.
  DATA(end_date) = edate.

  IF end_date IS INITIAL.
    end_date = start_date.
  ENDIF.

  IF start_date IS INITIAL.
    start_date = end_date.
  ENDIF.

  DATA(start_timestamp) = start_date && stime.
  DATA(end_timestamp)   = end_date && etime.

  result = VALUE #( sign = 'I' option = 'BT' (
      low  = start_timestamp
      high = end_timestamp
    )
  ).
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  DISPLAY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM display.

  TRY.
      cl_salv_table=>factory(
        IMPORTING
          r_salv_table = gr_alv
        CHANGING
          t_table      = gt_log ).
    CATCH cx_salv_msg INTO DATA(lr_msg).
  ENDTRY.

  DATA(lr_cols) = CAST cl_salv_columns( 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->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 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'
    ).
  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_column USING ''  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( ).

  SET HANDLER gr_events->on_user_command FOR lr_events.

  SET HANDLER gr_events->on_link_click FOR lr_events.


  gr_alv->display( ).

ENDFORM.

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.

  TRY.
      lr_column ?= pr_cols->get_column( fname ).
      lr_column->set_long_text( CONV #( text ) ).
      lr_column->set_medium_text( CONV #( text ) ).
      lr_column->set_short_text( CONV #( text ) ).
      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.
*&---------------------------------------------------------------------*
*&      Form  HANDLE_USER_COMMAND
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_E_SALV_FUNCTION  text
*----------------------------------------------------------------------*
FORM handle_user_command  USING  i_ucomm TYPE salv_de_function.

  CASE i_ucomm.
    WHEN 'PROCESS'.
      IF zcl_afl_utilities=>is_prd( ).
        DATA: ans TYPE c.
        CALL FUNCTION 'POPUP_TO_CONFIRM'
          EXPORTING
            titlebar              = 'Confirm'(m01)
            text_question         = 'You have called an IDoc test transaction in a client flagged as "Productive".'(m02)
            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.
*&---------------------------------------------------------------------*
*&      Form  PROCESS_SELECTED_ROWS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM process_selected_rows.

  DATA(lr_selections) = gr_alv->get_selections( ).
  DATA(lt_rows) = lr_selections->get_selected_rows( ).

  LOOP AT lt_rows ASSIGNING FIELD-SYMBOL(<row>).

    READ TABLE gt_log INDEX <row> ASSIGNING FIELD-SYMBOL(<log>).
    IF sy-subrc = 0.
      DATA(pass) = zcl_afl_utilities=>fm_authority_check( <log>-fname ).
      IF pass = abap_false.
        DATA(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.
*&---------------------------------------------------------------------*
*& Form frm_set_f4
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_f4 .
  TYPES :BEGIN OF lty_help,
           fname    TYPE zafl_config-fname,
           fnametxt TYPE zafl_config-fnametxt,
         END OF   lty_help.
  DATA:
    lt_help TYPE TABLE OF lty_help,
    ls_help TYPE          lty_help.

  SELECT fname fnametxt INTO CORRESPONDING FIELDS OF TABLE lt_help FROM zafl_config.

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield         = 'FNAME'
      dynpprog         = sy-repid
      dynpnr           = sy-dynnr
      dynprofield      = 'X'
      window_title     = '函数名称'
      value_org        = 'S'
      callback_program = sy-repid
    TABLES
      value_tab        = lt_help[]
    EXCEPTIONS
      parameter_error  = 1
      no_values_found  = 2
      OTHERS           = 3.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.
复制代码

 

创建类 

ZCL_AFL_UTILITIES

复制代码
class ZCL_AFL_UTILITIES definition
  public
  final
  create public .

public section.

  class-methods RE_PROCESS
    importing
      !GUID type GUID .
  class-methods IS_PRD
    returning
      value(RESULT) type ABAP_BOOL .
  class-methods GET_DISTINCT_COUNT
    importing
      !TAB_DATA type ANY TABLE
      !FIELD_NAME type CLIKE
    returning
      value(COUNT) type INT4 .
  class-methods FM_AUTHORITY_CHECK
    importing
      !FM_NAME type RS38L_FNAM
      !BUFFER type ABAP_BOOL default ABAP_TRUE
    returning
      value(PASS) type ABAP_BOOL .
protected section.
  PRIVATE SECTION.

    TYPES: BEGIN OF ty_auth_result,
             fname TYPE zafl_config-fname,
             pass  TYPE abap_bool,
           END OF ty_auth_result.

    CLASS-DATA: auth_results_list TYPE HASHED TABLE OF ty_auth_result WITH UNIQUE KEY fname.
ENDCLASS.



CLASS ZCL_AFL_UTILITIES IMPLEMENTATION.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_AFL_UTILITIES=>FM_AUTHORITY_CHECK
* +-------------------------------------------------------------------------------------------------+
* | [--->] FM_NAME                        TYPE        RS38L_FNAM
* | [--->] BUFFER                         TYPE        ABAP_BOOL (default =ABAP_TRUE)
* | [<-()] PASS                           TYPE        ABAP_BOOL
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD fm_authority_check.
    "有需求再增加
    pass = abap_true.
  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_AFL_UTILITIES=>GET_DISTINCT_COUNT
* +-------------------------------------------------------------------------------------------------+
* | [--->] TAB_DATA                       TYPE        ANY TABLE
* | [--->] FIELD_NAME                     TYPE        CLIKE
* | [<-()] COUNT                          TYPE        INT4
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD get_distinct_count.

    TYPES: BEGIN OF ty_temp,
             field TYPE string,
           END OF ty_temp.
    DATA: count_table TYPE HASHED TABLE OF ty_temp WITH UNIQUE KEY field,
          count_wa    LIKE LINE OF count_table.

    LOOP AT tab_data ASSIGNING FIELD-SYMBOL(<wa>).
      ASSIGN COMPONENT field_name OF STRUCTURE <wa> TO FIELD-SYMBOL(<field>).
      IF sy-subrc <> 0.
        RETURN.
      ELSE.
        count_wa-field = <field>.
        INSERT count_wa INTO TABLE count_table.
      ENDIF.
    ENDLOOP.

    count = lines( count_table ).

  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_AFL_UTILITIES=>IS_PRD
* +-------------------------------------------------------------------------------------------------+
* | [<-()] RESULT                         TYPE        ABAP_BOOL
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD is_prd.

    DATA: role TYPE t000-cccategory.

    CALL FUNCTION 'TR_SYS_PARAMS'
      IMPORTING
        system_client_role = role
      EXCEPTIONS
        no_systemname      = 1
        no_systemtype      = 2
        OTHERS             = 3.
    IF sy-subrc <> 0.
* Implement suitable error handling here
    ENDIF.

    IF role = 'P' OR role = 'T'.
      result = abap_true.
    ENDIF.

  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_AFL_UTILITIES=>RE_PROCESS
* +-------------------------------------------------------------------------------------------------+
* | [--->] GUID                           TYPE        GUID
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD re_process.

    DATA: data_ref TYPE REF TO data.

    SELECT SINGLE guid, fname, import, change_in, table_in
      FROM zafl_log
      WHERE guid = @guid
      INTO @DATA(record).
    IF sy-subrc <> 0.
      RETURN.
    ENDIF.

    SELECT funcname, paramtype, pposition, parameter, structure
      FROM fupararef
      WHERE funcname = @record-fname
      INTO TABLE @DATA(parameters_tab).
    IF sy-subrc <> 0.
      RETURN.
    ENDIF.

    DATA: temp_dd04l TYPE STANDARD TABLE OF dd04l.
    LOOP AT parameters_tab ASSIGNING FIELD-SYMBOL(<ptab>).
      IF strlen( <ptab>-structure ) > 30.
        CONTINUE.
      ENDIF.
      temp_dd04l = VALUE #( BASE temp_dd04l ( domname = <ptab>-structure ) ).
    ENDLOOP.

    IF temp_dd04l IS NOT INITIAL.
      SELECT domname FROM dd04l
        FOR ALL ENTRIES IN @temp_dd04l
        WHERE domname = @temp_dd04l-domname
        INTO TABLE @DATA(data_elements).
    ENDIF.

    DATA: func      TYPE string,
          ptab      TYPE abap_func_parmbind_tab,
          ptab_line TYPE abap_func_parmbind,
          etab      TYPE abap_func_excpbind_tab,
          etab_line TYPE abap_func_excpbind.

    LOOP AT parameters_tab ASSIGNING FIELD-SYMBOL(<parameter>).

      CLEAR ptab_line.
      ptab_line-name = <parameter>-parameter.
      ptab_line-kind = COND #( WHEN <parameter>-paramtype = 'E' THEN abap_func_importing
                               WHEN <parameter>-paramtype = 'I' THEN abap_func_exporting
                               WHEN <parameter>-paramtype = 'T' THEN abap_func_tables
                               WHEN <parameter>-paramtype = 'C' THEN abap_func_changing
                               ELSE                                  ''
      ).

      DATA(json_field_name) = COND string( WHEN ptab_line-kind = abap_func_exporting THEN 'IMPORT'
                                           WHEN ptab_line-kind = abap_func_tables    THEN 'TABLE_IN'
                                           WHEN ptab_line-kind = abap_func_changing  THEN 'CHANGE_IN'
                                           ELSE                                           ''
      ).

      IF json_field_name IS INITIAL.
        CONTINUE.
      ENDIF.

      ASSIGN COMPONENT json_field_name OF STRUCTURE record TO FIELD-SYMBOL(<json_raw>).
      IF sy-subrc <> 0 OR <json_raw> IS INITIAL.
        CONTINUE.
      ENDIF.

      DATA(json_data) = zcl_afl_json=>generate_new( json = <json_raw> ).
      ASSIGN json_data->* TO FIELD-SYMBOL(<json_data>).


      ASSIGN COMPONENT <parameter>-parameter OF STRUCTURE <json_data> TO FIELD-SYMBOL(<parameter_val>).
      IF sy-subrc <> 0.
        CONTINUE.
      ENDIF.

      IF ptab_line-kind = abap_func_exporting OR ptab_line-kind = abap_func_changing.

        CREATE DATA data_ref TYPE (<parameter>-structure).
        FIELD-SYMBOLS: <temp> TYPE any.
        ASSIGN <parameter_val>->* TO <temp>.

      ENDIF.

      IF ptab_line-kind = abap_func_tables.
        DATA(structure_type) = CAST cl_abap_structdescr( cl_abap_datadescr=>describe_by_name( <parameter>-structure ) ).
        DATA(table_type) = CAST cl_abap_tabledescr( cl_abap_tabledescr=>create( structure_type ) ).
        CREATE DATA data_ref TYPE HANDLE table_type.
        ASSIGN <parameter_val>->* TO <temp>.
      ENDIF.

      IF data_ref IS BOUND.
        ASSIGN data_ref->* TO FIELD-SYMBOL(<data_ref>).
      ENDIF.

      IF line_exists( data_elements[ domname = <parameter>-structure ] ).
        <data_ref> = <temp>.
      ELSE.
        DATA(json_temp) = zcl_afl_json=>serialize( data = <parameter_val> ).
        zcl_afl_json=>deserialize( EXPORTING json = json_temp CHANGING data = <data_ref> ).
      ENDIF.

      GET REFERENCE OF <data_ref> INTO ptab_line-value.

      INSERT ptab_line INTO TABLE ptab.

    ENDLOOP.

    etab_line-name = 'OTHERS'.
    etab_line-value = 2.
    INSERT etab_line INTO TABLE etab.

    CALL FUNCTION record-fname
      PARAMETER-TABLE
      ptab
      EXCEPTION-TABLE
      etab.

  ENDMETHOD.
ENDCLASS.

复制代码

创建类 

ZCL_AFL_JSON

 

复制代码
*"* use this source file for the definition and implementation of
*"* local helper classes, interface definitions and type
*"* declarations

DEFINE eat_white.
  while_offset_cs sv_white_space.
END-OF-DEFINITION.

DEFINE while_offset_cs.
*  >= 7.02 alternative
*  pos = find_any_not_of( val = json sub = &1 off = offset ).
*  if pos eq -1. offset = length.
*  else. offset = pos. endif.

* < 7.02
  while offset < length.
    find first occurrence of json+offset(1) in &1.
    if sy-subrc is not initial.
      exit.
    endif.
    offset = offset + 1.
  endwhile.
* < 7.02

END-OF-DEFINITION.
复制代码

 

 

复制代码
class ZCL_AFL_JSON definition
  public
  inheriting from /UI2/CL_JSON
  final
  create public .

public section.

  methods GENERATE_INT_NEW
    importing
      !JSON type JSON
    returning
      value(RR_DATA) type ref to DATA .
  class-methods GENERATE_NEW
    importing
      !JSON type JSON
      !PRETTY_NAME type PRETTY_NAME_MODE default PRETTY_MODE-NONE
      !NAME_MAPPINGS type NAME_MAPPINGS optional
    returning
      value(RR_DATA) type ref to DATA .
protected section.
private section.
ENDCLASS.



CLASS ZCL_AFL_JSON IMPLEMENTATION.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_AFL_JSON->GENERATE_INT_NEW
* +-------------------------------------------------------------------------------------------------+
* | [--->] JSON                           TYPE        JSON
* | [<-()] RR_DATA                        TYPE REF TO DATA
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD generate_int_new.

    TYPES: BEGIN OF ts_field,
             name  TYPE string,
             value TYPE json,
           END OF ts_field.

    DATA: length TYPE i,
          offset TYPE i.

    DATA: lt_json      TYPE STANDARD TABLE OF json WITH DEFAULT KEY,
          lv_json      LIKE LINE OF lt_json,
          lv_comp_name TYPE abap_compname,
          lt_fields    TYPE SORTED TABLE OF ts_field WITH UNIQUE KEY name,
          lo_type      TYPE REF TO cl_abap_datadescr,
          lt_comp      TYPE abap_component_tab,
          lt_names     TYPE HASHED TABLE OF string WITH UNIQUE KEY table_line,
          cache        LIKE LINE OF mt_name_mappings_ex,
          ls_comp      LIKE LINE OF lt_comp.

    FIELD-SYMBOLS: <data>   TYPE any,
                   <struct> TYPE any,
                   <field>  LIKE LINE OF lt_fields,
                   <table>  TYPE STANDARD TABLE,
                   <cache>  LIKE LINE OF mt_name_mappings_ex.

    length = numofchar( json ).

    eat_white.

    CASE json+offset(1).
      WHEN `{`."result must be a structure
        restore_type( EXPORTING json = json length = length CHANGING  data = lt_fields ).
        IF lt_fields IS NOT INITIAL.
          ls_comp-type = cl_abap_refdescr=>get_ref_to_data( ).
          LOOP AT lt_fields ASSIGNING <field>.
            READ TABLE mt_name_mappings_ex WITH TABLE KEY json = <field>-name ASSIGNING <cache>.
            IF sy-subrc IS INITIAL.
              ls_comp-name = <cache>-abap.
            ELSE.
              cache-json = ls_comp-name = <field>-name.
              TRANSLATE ls_comp-name USING `/_:_~_._-_`. " remove characters not allowed in component names
              IF mv_pretty_name EQ pretty_mode-camel_case OR mv_pretty_name EQ pretty_mode-extended.
                REPLACE ALL OCCURRENCES OF REGEX `([a-z])([A-Z])` IN ls_comp-name WITH `$1_$2`. "#EC NOTEXT
              ENDIF.
              TRANSLATE ls_comp-name TO UPPER CASE.
              cache-abap = ls_comp-name = lv_comp_name = ls_comp-name. " truncate by allowed field name length
              INSERT cache INTO TABLE mt_name_mappings_ex.
            ENDIF.
            INSERT ls_comp-name INTO TABLE lt_names.
            IF sy-subrc IS INITIAL.
              APPEND ls_comp TO lt_comp.
            ELSE.
              DELETE lt_fields.
            ENDIF.
          ENDLOOP.
          TRY.
              lo_type = cl_abap_structdescr=>create( p_components = lt_comp p_strict = c_bool-false ).
              CREATE DATA rr_data TYPE HANDLE lo_type.
              ASSIGN rr_data->* TO <struct>.
              LOOP AT lt_fields ASSIGNING <field>.
                ASSIGN COMPONENT sy-tabix OF STRUCTURE <struct> TO <data>.
                <data> = generate_int_new( <field>-value ).
              ENDLOOP.
            CATCH cx_sy_create_data_error cx_sy_struct_creation.
          ENDTRY.
        ENDIF.
      WHEN `[`."result must be a table of ref
        restore_type( EXPORTING json = json length = length CHANGING  data = lt_json ).
        CREATE DATA rr_data TYPE TABLE OF REF TO data.
        ASSIGN rr_data->* TO <table>.
        LOOP AT lt_json INTO lv_json.
          APPEND INITIAL LINE TO <table> ASSIGNING <data>.
          <data> = generate_int_new( lv_json ).
        ENDLOOP.
      WHEN OTHERS.
        IF json+offset(1) EQ `"`.
          CREATE DATA rr_data TYPE string.
        ELSEIF json+offset(1) CA `-0123456789.`.
          IF json+offset CS '.'.
            CREATE DATA rr_data TYPE decfloat34.
          ELSEIF length GT 9.
            CREATE DATA rr_data TYPE p.
          ELSE.
            CREATE DATA rr_data TYPE i.
          ENDIF.
        ELSEIF json+offset EQ `true` OR json+offset EQ `false`.
          CREATE DATA rr_data TYPE abap_bool.
        ENDIF.
        IF rr_data IS BOUND.
          ASSIGN rr_data->* TO <data>.
          restore_type( EXPORTING json = json length = length CHANGING  data = <data> ).
        ENDIF.
    ENDCASE.
  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_AFL_JSON=>GENERATE_NEW
* +-------------------------------------------------------------------------------------------------+
* | [--->] JSON                           TYPE        JSON
* | [--->] PRETTY_NAME                    TYPE        PRETTY_NAME_MODE (default =PRETTY_MODE-NONE)
* | [--->] NAME_MAPPINGS                  TYPE        NAME_MAPPINGS(optional)
* | [<-()] RR_DATA                        TYPE REF TO DATA
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD generate_new.

    DATA: lo_json TYPE REF TO zcl_afl_json,
          lv_json LIKE json.

    lv_json = json.

    REPLACE ALL OCCURRENCES OF `\r\n` IN lv_json WITH cl_abap_char_utilities=>cr_lf.
    REPLACE ALL OCCURRENCES OF `\n`   IN lv_json WITH cl_abap_char_utilities=>newline.
    REPLACE ALL OCCURRENCES OF `\t`   IN lv_json WITH cl_abap_char_utilities=>horizontal_tab.

    CREATE OBJECT lo_json
      EXPORTING
        pretty_name      = pretty_name
        name_mappings    = name_mappings
        assoc_arrays     = c_bool-true
        assoc_arrays_opt = c_bool-true.

    TRY .
        rr_data = lo_json->generate_int_new( lv_json ).
      CATCH cx_sy_move_cast_error.
    ENDTRY.

  ENDMETHOD.
ENDCLASS.
复制代码

 

posted @   ABAP-武汉  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示