报文log都是存在自建表里,每次接口都会做个报表去展示存在表里的报文,
就想到做了个通用程序,就不需要二次开发报表,直接选择画面输入log表名,
就可以展示表里的数据,双击你的报文字段可以以json的形式展开查看。
其他用途功能还未想到,后期有变化会补充
*&----------------------------------------------------------------V1003-
*& DESCRIPTION:
*&
*&
*&
*&
*&
*&
*& Requestor......:
*& Country........:
*& Requirement No.:
*&----------------------------------------------------------------------
*& STATUS:
*& Development.: [X] in process [ ] finished
*& Test........: [ ] function test
*&----------------------------------------------------------------------
*& TECHNICAL INFORMATION:
*& Interface [ ]
*& Interface RFC [ ]
*& Migration [ ]
*& Repair report [ ] (single usage reports)
*& Updates on DB [ ]
*-----------------------------------------------------------------------
* CHANGE HISTORY:
* SqN Date. Author Description
* --- ---------- ------------ ------------------------------------------
* 001 2011-mm-dd sap-username Creation
*-----------------------------------------------------------------------
REPORT ztest_log.
DATA: where_clauses TYPE rsds_twhere,
expressions TYPE rsds_texpr,
field_ranges TYPE rsds_trange,
number_of_active_fields TYPE sy-tfill,
tables_tab TYPE STANDARD TABLE OF rsdstabs,
tabfields_not_display TYPE STANDARD TABLE OF rsdsfields,
fields_tab TYPE STANDARD TABLE OF rsdsfields,
field_desc TYPE STANDARD TABLE OF fldconvert,
field_texts TYPE STANDARD TABLE OF rsdstexts,
events TYPE STANDARD TABLE OF rsdsevents,
event_fields TYPE STANDARD TABLE OF rsdsevflds,
fields_not_selected TYPE STANDARD TABLE OF rsdsfields,
no_int_check TYPE STANDARD TABLE OF rsdstabs,
alv_qinfo TYPE STANDARD TABLE OF lvc_s_qinf,
selection_id TYPE rsdynsel-selid.
DATA: dref TYPE REF TO data.
FIELD-SYMBOLS: <table> TYPE STANDARD TABLE,
<where> LIKE LINE OF where_clauses.
PARAMETERS: p_tab LIKE dd03l-tabname . "Earlier Table name
AT SELECTION-SCREEN.
TRANSLATE p_tab TO UPPER CASE.
SELECT COUNT(*)
FROM dd03l
WHERE tabname EQ @p_tab.
IF sy-subrc = 0.
ELSE.
MESSAGE 'Database table not found' TYPE 'I' DISPLAY LIKE 'E'.
LEAVE PROGRAM.
ENDIF.
tables_tab = VALUE #( ( prim_tab = p_tab ) ).
CALL FUNCTION 'FREE_SELECTIONS_INIT'
EXPORTING
kind = 'T'
* FIELD_RANGES_INT = " 选择屏幕初始值
IMPORTING
selection_id = selection_id
TABLES
tables_tab = tables_tab "如果kind为T,则定义选择屏幕字段来源表
tabfields_not_display = tabfields_not_display
fields_tab = fields_tab "如果kind为T,则为默认选择字段,为F则为可选选择字段清单
field_desc = field_desc
field_texts = field_texts
events = events " 选择屏幕事件进行逻辑处理
event_fields = event_fields
fields_not_selected = fields_not_selected
no_int_check = no_int_check
alv_qinfo = alv_qinfo
EXCEPTIONS
fields_incomplete = 1
fields_no_join = 2
field_not_found = 3
no_tables = 4
table_not_found = 5
expression_not_supported = 6
incorrect_expression = 7
illegal_kind = 8
area_not_found = 9
inconsistent_area = 10
kind_f_no_fields_left = 11
kind_f_no_fields = 12
too_many_fields = 13
dup_field = 14
field_no_type = 15
field_ill_type = 16
dup_event_field = 17
node_not_in_ldb = 18
area_no_field = 19
OTHERS = 20.
IF sy-subrc <> 0.
MESSAGE 'Error in initialization' TYPE 'I' DISPLAY LIKE 'E'.
LEAVE PROGRAM.
ENDIF.
CALL FUNCTION 'FREE_SELECTIONS_DIALOG'
EXPORTING
selection_id = selection_id
title = 'Free Selection'
status = '1' "选择屏幕状态
as_window = ' ' " 是否弹窗
tree_visible = ' ' "选择树是否可见
IMPORTING
where_clauses = where_clauses "选择屏幕返回的选择条件,自动处理的where条件表,可直接使用
TABLES
fields_tab = fields_tab
EXCEPTIONS
internal_error = 1
no_action = 2
selid_not_found = 3
illegal_status = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE 'No free selection created' TYPE 'I'.
LEAVE PROGRAM.
ENDIF.
CREATE DATA dref TYPE TABLE OF (p_tab).
ASSIGN dref->* TO <table>.
START-OF-SELECTION.
ASSIGN where_clauses[ tablename = p_tab ] TO <where>.
TRY.
IF <where> IS ASSIGNED AND <where>-where_tab IS NOT INITIAL.
SELECT *
FROM (p_tab)
WHERE (<where>-where_tab)
INTO TABLE @<table>.
ELSE.
SELECT *
FROM (p_tab)
INTO TABLE @<table>.
ENDIF.
CATCH cx_sy_dynamic_osql_error.
MESSAGE 'Error in dynamic Open SQL' TYPE 'I' DISPLAY LIKE 'E'.
LEAVE PROGRAM.
ENDTRY.
*------这段代码可以直接显示alv
* TRY.
* cl_salv_table=>factory(
* IMPORTING r_salv_table = DATA(alv)
* CHANGING t_table = <table> ).
* alv->display( ).
* CATCH cx_salv_msg.
* MESSAGE 'Error in ALV display' TYPE 'I' DISPLAY LIKE 'E'.
* ENDTRY.
*----这段我是为了能实现双击查看json报文
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv,
gw_fieldcat TYPE slis_fieldcat_alv,
gw_layout TYPE slis_layout_alv.
gw_layout-colwidth_optimize = 'X'.
gw_layout-zebra = 'X'.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
* I_PROGRAM_NAME =
* I_INTERNAL_TABNAME =
i_structure_name = p_tab
* I_CLIENT_NEVER_DISPLAY = 'X'
* I_INCLNAME =
* I_BYPASSING_BUFFER =
* I_BUFFER_ACTIVE =
CHANGING
ct_fieldcat = gt_fieldcat
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
is_layout = gw_layout
it_fieldcat = gt_fieldcat
i_callback_user_command = 'FRM_USER_COMMAND'
i_default = 'X'
i_save = 'A'
TABLES
t_outtab = <table>
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
*&---------------------------------------------------------------------*
*& Form FRM_USER_COMMAND1
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->I_UCOMM text
* -->RS_SELFIELD text
*----------------------------------------------------------------------*
FORM frm_user_command USING i_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield.
DATA: lr_alv_grid TYPE REF TO cl_gui_alv_grid.
DATA: ls_stbl TYPE lvc_s_stbl.
CASE i_ucomm.
WHEN 'REFRESH'.
* PERFORM FRM_GET_DATA.
WHEN '&IC1'.
PERFORM frm_click USING rs_selfield.
ENDCASE.
IF lr_alv_grid IS INITIAL.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lr_alv_grid.
ENDIF.
ls_stbl-row = 'X'.
ls_stbl-col = 'X'.
CALL METHOD lr_alv_grid->refresh_table_display
EXPORTING
is_stable = ls_stbl.
ENDFORM. "FRM_USER_COMMAND
*&---------------------------------------------------------------------*
*& Form FRM_CLICK
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_RS_SELFIELD text
*----------------------------------------------------------------------*
FORM frm_click USING is_selfield TYPE slis_selfield.
DATA:l_temp TYPE char80.
FIELD-SYMBOLS <lfs_temp> TYPE any.
SELECT *
FROM dd03l
INTO TABLE @DATA(it_dd03l)
WHERE tabname EQ @p_tab.
LOOP AT it_dd03l INTO DATA(ls_dd031)
WHERE datatype = 'STRG'.
l_temp = '<LS_LIST>-' && ls_dd031-fieldname.
CASE is_selfield-fieldname.
WHEN ls_dd031-fieldname.
TRY.
READ TABLE <table> ASSIGNING FIELD-SYMBOL(<ls_list>) INDEX is_selfield-tabindex.
ASSIGN (l_temp) TO <lfs_temp>.
cl_demo_output=>display_json( <lfs_temp> ).
CATCH cx_sy_dynamic_osql_error.
MESSAGE 'Error in dynamic Open SQL' TYPE 'I' DISPLAY LIKE 'E'.
LEAVE PROGRAM.
ENDTRY.
WHEN OTHERS.
ENDCASE.
ENDLOOP.
ENDFORM.