多网上的一个找表程序,实际使用过程中发现有诸多不变,特根据自己的需要做了些修改,如下:
1. 只显示有记录数的结果,原版程序结果太多了,其中有很多是空表,其实我们在实际工作中要找的表肯定是有数据的才对,故做此修改。
2. 设定四个字段为与的关系,即只找到同时包括这四个字段的表。原版程序简单采用的选择列,其中的输入多个字段名称检索数据时是或的关系,实际使用中我们需要的是与,即同时包含,故做此修改。
代码如下:
*&---------------------------------------------------------------------*
*& Report Z_FIND_TABLE2
*&
*&---------------------------------------------------------------------*
REPORT z_find_table2.
REPORT z_find_table2.
TABLES: tadir,trdirt,tstc,dd03l,dd02l,dd04l,dd02t,dd03t,dd04t.
TYPE-POOLS: slis.
DATA: fieldcat TYPE slis_t_fieldcat_alv,
fieldcat_ln LIKE LINE OF fieldcat,
event_exit TYPE slis_t_event_exit,
event_exit_ln LIKE LINE OF event_exit,
sortcat TYPE slis_t_sortinfo_alv,
sortcat_ln LIKE LINE OF sortcat,
eventcat TYPE slis_t_event,
eventcat_ln LIKE LINE OF eventcat.
DATA: gt_list_top_of_page TYPE slis_t_listheader.
DATA: gc_formname_top_of_page TYPE slis_formname VALUE 'ALV_TOP_OF_PAGE'.
DATA : ps_layout TYPE slis_layout_alv.
DATA: BEGIN OF wa_itab,
tabname LIKE dd02l-tabname,
tabtext LIKE dd02t-ddtext,
tabclass LIKE dd02l-tabclass,
fieldname LIKE dd03l-fieldname,
fieldtext LIKE dd03t-ddtext,
count TYPE i,
END OF wa_itab.
DATA: itab LIKE wa_itab OCCURS 0 WITH HEADER LINE.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECT-OPTIONS: v_tname FOR dd02l-tabname, "表名
v_tabcls FOR dd02l-tabclass DEFAULT 'TRANSP'. "表類型
"v_fname FOR dd03l-fieldname. "欄位名
PARAMETERS: p_fname1 LIKE dd03l-fieldname.
PARAMETERS: p_fname2 LIKE dd03l-fieldname.
PARAMETERS: p_fname3 LIKE dd03l-fieldname.
PARAMETERS: p_fname4 LIKE dd03l-fieldname.
PARAMETERS: p_ttext LIKE dd02t-ddtext. "文本
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.
PARAMETERS: p_tab AS CHECKBOX DEFAULT 'X'. "只查找表記錄
SELECTION-SCREEN END OF BLOCK b2.
START-OF-SELECTION.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
text = '数据处理中,请稍待...'.
PERFORM get_data.
REFRESH gt_list_top_of_page[].
PERFORM e04_comment_build .
CLEAR fieldcat.
REFRESH fieldcat.
PERFORM build_fieldcat.
PERFORM build_eventcat.
PERFORM alv_display.
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_data .
CLEAR: itab[], itab.
CONCATENATE '%' p_ttext '%' INTO p_ttext.
DATA: v_tips TYPE string.
IF p_tab = 'X'.
SELECT a~tabname c~ddtext AS tabtext a~tabclass INTO CORRESPONDING FIELDS OF TABLE itab
FROM dd02l AS a
INNER JOIN dd03l AS b ON a~tabname = b~tabname
INNER JOIN dd02t AS c ON a~tabname = c~tabname AND c~ddlanguage = sy-langu
LEFT JOIN dd03t AS d ON b~fieldname = d~fieldname AND d~ddlanguage = sy-langu
WHERE a~tabname IN v_tname
AND a~tabclass IN v_tabcls
"AND b~fieldname IN v_fname
AND b~fieldname = p_fname1
AND c~ddtext LIKE p_ttext.
SORT itab BY tabname.
DELETE ADJACENT DUPLICATES FROM itab. " 删除重复值
ELSE.
SELECT a~tabname c~ddtext AS tabtext a~tabclass b~fieldname d~ddtext AS fieldtext INTO CORRESPONDING FIELDS OF TABLE itab
FROM dd02l AS a
INNER JOIN dd03l AS b ON a~tabname = b~tabname
INNER JOIN dd02t AS c ON a~tabname = c~tabname AND c~ddlanguage = sy-langu
LEFT JOIN dd03t AS d ON b~fieldname = d~fieldname AND d~ddlanguage = sy-langu
WHERE a~tabname IN v_tname
AND a~tabclass IN v_tabcls
"AND b~fieldname IN v_fname
AND b~fieldname = p_fname1
AND c~ddtext LIKE p_ttext.
SORT itab BY tabname fieldname.
DELETE ADJACENT DUPLICATES FROM itab.
ENDIF.
" 提示
v_tips = '数据提取完成,开始筛选数据...'.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
text = v_tips.
" get record count
FIELD-SYMBOLS: <wa> LIKE wa_itab.
DATA: v_tabname LIKE dd02l-tabname.
LOOP AT itab ASSIGNING <wa>.
" 提示
v_tips = '正在处理表--'.
CONCATENATE v_tips <wa>-tabname into v_tips.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
text = v_tips.
SELECT COUNT(*) FROM (<wa>-tabname) INTO <wa>-count.
IF <wa>-count EQ 0.
DELETE itab.
CONTINUE.
ENDIF.
" 是否包含字段 p_fname2,不含则删除
IF p_fname2 IS NOT INITIAL.
SELECT SINGLE a~tabname INTO v_tabname
FROM dd02l AS a
INNER JOIN dd03l AS b ON a~tabname = b~tabname
AND b~fieldname = p_fname2
WHERE a~tabname = <wa>-tabname.
IF sy-subrc NE 0.
DELETE itab.
CONTINUE.
ENDIF.
ENDIF.
" 是否包含字段 p_fname2,不含则删3
IF p_fname3 IS NOT INITIAL.
SELECT SINGLE a~tabname INTO v_tabname
FROM dd02l AS a
INNER JOIN dd03l AS b ON a~tabname = b~tabname
AND b~fieldname = p_fname3
WHERE a~tabname = <wa>-tabname.
IF sy-subrc NE 0.
DELETE itab.
CONTINUE.
ENDIF.
ENDIF.
" 是否包含字段 p_fname2,不含则删4
IF p_fname4 IS NOT INITIAL.
SELECT SINGLE a~tabname INTO v_tabname
FROM dd02l AS a
INNER JOIN dd03l AS b ON a~tabname = b~tabname
AND b~fieldname = p_fname4
WHERE a~tabname = <wa>-tabname.
IF sy-subrc NE 0.
DELETE itab.
CONTINUE.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM. " GET_DATA
*&--------------------------------------------------------------------*
*& FORM BUILD_EVENTCAT
*&--------------------------------------------------------------------*
* TEXT
*---------------------------------------------------------------------*
FORM build_eventcat.
DATA : ls_event TYPE slis_alv_event.
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = 0
IMPORTING
et_events = eventcat.
READ TABLE eventcat
WITH KEY name = slis_ev_top_of_page
INTO ls_event.
IF sy-subrc = 0.
MOVE gc_formname_top_of_page TO ls_event-form.
APPEND ls_event TO eventcat.
ENDIF.
ENDFORM. " BUILD_EVENTCAT
*&----------------------------------------------------
*& FORM ALV_DISPLAY
* TEXT
*-----------------------------------------------------
* --> P1 TEXT
* < -- P2 TEXT
*-----------------------------------------------------
FORM alv_display.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = 'Z_FIND_TABLE2'
i_callback_user_command = 'USER_COMMAND'
is_layout = ps_layout
it_fieldcat = fieldcat
i_save = 'A'
it_events = eventcat
TABLES
t_outtab = itab
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM. " ALV_DISPLAY
*&--------------------------------------------------------------------*
*& FORM ALV_TOP_OF_PAGE
*&--------------------------------------------------------------------*
* TEXT
*---------------------------------------------------------------------*
FORM alv_top_of_page.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = gt_list_top_of_page.
* I_LOGO = 'SAPLOGO' .
* I_END_OF_LIST_GRID = 'X'.
ENDFORM. "ALV_TOP_OF_PAGE
*-----------------------------------------------------
* FORM BUILD_FIELDCAT
*-----------------------------------------------------
* ........
*-----------------------------------------------------
FORM build_fieldcat.
DATA : col_pos TYPE i VALUE 0.
ps_layout-get_selinfos = 'X'.
ps_layout-colwidth_optimize = 'X'.
ps_layout-detail_popup = 'X'.
ps_layout-no_keyfix = ''.
ps_layout-colwidth_optimize = 'X'.
ADD 1 TO col_pos.
CLEAR fieldcat_ln.
fieldcat_ln-tabname = 'ITAB'.
fieldcat_ln-ref_fieldname = 'TABNAME'.
fieldcat_ln-fieldname = 'TABNAME '.
fieldcat_ln-key = 'X'.
fieldcat_ln-seltext_l = '表名'.
fieldcat_ln-col_pos = col_pos.
APPEND fieldcat_ln TO fieldcat.
ADD 1 TO col_pos.
CLEAR fieldcat_ln.
fieldcat_ln-tabname = 'ITAB'.
fieldcat_ln-ref_fieldname = 'TABTEXT'.
fieldcat_ln-fieldname = 'TABTEXT '.
fieldcat_ln-key = 'X'.
fieldcat_ln-seltext_l = '表说明'.
fieldcat_ln-col_pos = col_pos.
APPEND fieldcat_ln TO fieldcat.
ADD 1 TO col_pos.
CLEAR fieldcat_ln.
fieldcat_ln-tabname = 'ITAB'.
fieldcat_ln-ref_fieldname = 'TABCLASS'.
fieldcat_ln-fieldname = 'TABCLASS '.
fieldcat_ln-key = 'X'.
fieldcat_ln-seltext_l = '表类型'.
fieldcat_ln-col_pos = col_pos.
APPEND fieldcat_ln TO fieldcat.
IF p_tab <> 'X'.
ADD 1 TO col_pos.
CLEAR fieldcat_ln.
fieldcat_ln-tabname = 'ITAB'.
fieldcat_ln-ref_fieldname = 'FIELDNAME'.
fieldcat_ln-fieldname = 'FIELDNAME'.
fieldcat_ln-key = 'X'.
fieldcat_ln-seltext_l = '字段名'.
fieldcat_ln-col_pos = col_pos.
APPEND fieldcat_ln TO fieldcat.
ADD 1 TO col_pos.
CLEAR fieldcat_ln.
fieldcat_ln-tabname = 'ITAB'.
fieldcat_ln-ref_fieldname = 'FIELDTEXT'.
fieldcat_ln-fieldname = 'FIELDTEXT'.
fieldcat_ln-key = 'X'.
fieldcat_ln-seltext_l = '字段说明'.
fieldcat_ln-col_pos = col_pos.
APPEND fieldcat_ln TO fieldcat.
ENDIF.
ADD 1 TO col_pos.
CLEAR fieldcat_ln.
fieldcat_ln-tabname = 'ITAB'.
fieldcat_ln-ref_fieldname = 'COUNT'.
fieldcat_ln-fieldname = 'COUNT'.
fieldcat_ln-key = 'X'.
fieldcat_ln-seltext_l = '记录数'.
fieldcat_ln-col_pos = col_pos.
APPEND fieldcat_ln TO fieldcat.
ENDFORM. "BUILD_FIELDCAT
*&--------------------------------------------------------------------*
*& FORM USER_COMMAND
*&--------------------------------------------------------------------*
* TEXT
*---------------------------------------------------------------------*
* -->UCOMM TEXT
* -->SELFIELD TEXT
*---------------------------------------------------------------------*
FORM user_command USING ucomm LIKE sy-ucomm
selfield TYPE slis_selfield.
READ TABLE itab INDEX selfield-tabindex.
CHECK sy-subrc = 0.
CASE ucomm.
WHEN '&IC1'.
CASE selfield-sel_tab_field.
WHEN 'ITAB-TABNAME'.
SET PARAMETER ID 'DTB' FIELD itab-tabname.
CALL TRANSACTION 'SE11' AND SKIP FIRST SCREEN.
ENDCASE.
WHEN 'PRI' .
ENDCASE.
ENDFORM. "USER_COMMAND
*&---------------------------------------------------------------------*
*& Form E04_COMMENT_BUILD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM e04_comment_build .
DATA : list_line LIKE LINE OF gt_list_top_of_page.
DATA: i_count TYPE i, c_count(5) TYPE c.
list_line-typ = 'H'.
list_line-key = ''.
DESCRIBE TABLE itab LINES i_count.
c_count = i_count.
CONCATENATE '符合條件的記錄數:' c_count INTO list_line-info.
APPEND list_line TO gt_list_top_of_page.
ENDFORM. " E04_COMMENT_BUILD
以上代码, ECC6环境下调试通过。