黑龙江供销社接口日志平台
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.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本