改良的找表程序

多网上的一个找表程序,实际使用过程中发现有诸多不变,特根据自己的需要做了些修改,如下:
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.


DATABEGIN 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(5TYPE 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环境下调试通过。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值