ABAP 搜索程序中定义的文本

REPORT zGetTextElements NO STANDARD PAGE HEADING LINE-SIZE 255.
*---搜索自定义程序中,定义的类似 'text-001' 中的文本内容.
*---支持SE38/FM/CLASS 的搜索和全量显示.
*---Search Text Elements - Text Symbols from  customer program.
*--Author: lijq21@qq.com  20200911

TABLES : tadir, trdir.
TYPES: ttexttable LIKE textpool.

TYPES: BEGIN OF tprogram,
         progname LIKE trdir-name,
         subc     LIKE trdir-subc,
       END OF tprogram.

TYPES: BEGIN OF tfunction,
         functionname  LIKE tfdir-funcname,
         functiongroup LIKE enlfdir-area,
       END OF tfunction.

TYPES: BEGIN OF tclass,
         clsname        LIKE vseoclass-clsname,
         textelementkey TYPE string,
       END OF tclass.

DATA: iprograms       TYPE STANDARD TABLE OF tprogram WITH HEADER LINE,
      ifunctions      TYPE STANDARD TABLE OF tfunction WITH HEADER LINE,
      iclasses        TYPE STANDARD TABLE OF tclass WITH HEADER LINE,
      itexttable      TYPE STANDARD TABLE OF ttexttable WITH HEADER LINE,
      lv_progname     LIKE trdir-name,
      lv_functionname LIKE tfdir-funcname,
      lv_clsname      LIKE vseoclass-clsname.

DATA:BEGIN OF ls_output,
       type     LIKE tadir-object,
       progname LIKE trdir-name,
       key      TYPE textpoolky,
       entry    TYPE char80, "textpooltx,
     END OF ls_output,
     lt_output LIKE TABLE OF ls_output.

*----------------------------------------------------------------------*
* Selection-screen:
*----------------------------------------------------------------------*
SELECTION-SCREEN: BEGIN OF BLOCK b1 WITH FRAME TITLE text1.
SELECTION-SCREEN: BEGIN OF BLOCK b2 WITH FRAME TITLE text2.

SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS:p_prog RADIOBUTTON GROUP g1 USER-COMMAND a DEFAULT 'X'.
SELECTION-SCREEN COMMENT 5(23) t_prog.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS:p_fugr RADIOBUTTON GROUP g1.
SELECTION-SCREEN COMMENT 5(23) t_fugr.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS:p_clas RADIOBUTTON GROUP g1.
SELECTION-SCREEN COMMENT 5(23) t_clas.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS:p_all  RADIOBUTTON GROUP g1.
SELECTION-SCREEN COMMENT 5(23) t_all.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN: END OF BLOCK b2.

SELECTION-SCREEN: BEGIN OF BLOCK b3 WITH FRAME TITLE text3.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 5(11) t_txt.
PARAMETERS: p_txt TYPE string LOWER CASE.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(15) t_empty.
PARAMETERS: p_alltxt AS CHECKBOX USER-COMMAND a.
SELECTION-SCREEN COMMENT 19(45) t_alltxt.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN: END OF BLOCK b3.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 7(11) t_lang.
PARAMETERS: p_lang LIKE sy-langu DEFAULT sy-langu.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN: END OF BLOCK b1.

*---------------------------------------------------------------------------------------
* initialisation
*---------------------------------------------------------------------------------------
INITIALIZATION.
  t_prog = 'Program'.
  t_fugr = 'Function'.
  t_clas = 'Class'.
  t_all  = 'All Program'.
  t_txt  = 'Search text'.
  t_alltxt = 'Display all Text Elements '.
  t_lang = 'Language '.

AT SELECTION-SCREEN OUTPUT.
  IF p_alltxt EQ 'X'.
    CLEAR:p_txt.
    LOOP AT SCREEN.
      IF screen-name CP '*P_TXT*'.
        screen-input = 0.
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.
  ELSE.
    LOOP AT SCREEN.
      IF screen-name CP '*P_TXT*'.
        screen-input = 1.
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.
  ENDIF.
*----------------------------------------------------------------------*
* START-OF-SELECTION.:
*----------------------------------------------------------------------*
START-OF-SELECTION.

  IF p_alltxt IS INITIAL.
    CHECK p_txt IS NOT INITIAL.
  ENDIF.

  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage = 100
      text       = 'Processing ...'.

  CLEAR:lv_functionname,lv_clsname.
*---search Text Elements - Text Symbols
  IF p_prog = 'X' OR p_all = 'X'.
    SELECT progname
           subc
    APPENDING CORRESPONDING FIELDS OF TABLE iprograms
                            FROM reposrc AS a
                      INNER JOIN tadir AS b ON a~progname = b~obj_name
                            WHERE
                              ( a~progname LIKE 'Z%'
                              OR a~progname LIKE 'Y%'
                              OR a~progname LIKE 'SAPMZ%'
                              OR a~progname LIKE 'SAPMY%')
                              AND ( a~subc = '1' OR a~subc = 'M' OR a~subc = 'S' )
                              AND b~pgmid  = 'R3TR'
                              AND b~object = 'PROG'.

    LOOP AT iprograms.
      PERFORM gettextelements USING iprograms-progname lv_functionname lv_clsname.
    ENDLOOP.
  ENDIF.

  IF p_fugr = 'X' OR p_all = 'X'.
    CLEAR:lv_progname,lv_clsname.
    SELECT a~funcname AS functionname
           a~area AS functiongroup
    INTO CORRESPONDING FIELDS OF TABLE ifunctions
                         FROM v_fdir AS a
                   INNER JOIN tlibv AS b ON a~area = b~area
                   INNER JOIN tadir AS c ON a~area = c~obj_name
                        WHERE
                           ( a~funcname LIKE 'Z%'
                           OR a~funcname LIKE 'Y%' )
                          AND pgmid  = 'R3TR'
                          AND object = 'FUGR'.

    LOOP AT ifunctions.
      SELECT SINGLE pname FROM tfdir
               INTO lv_progname
              WHERE funcname = ifunctions-functionname.
      IF sy-subrc = 0.
        PERFORM gettextelements USING lv_progname ifunctions-functionname lv_clsname.
      ENDIF.
    ENDLOOP.
  ENDIF.

  IF p_clas = 'X' OR p_all = 'X'.
    CLEAR:lv_progname,lv_functionname.
    SELECT obj_name AS clsname FROM tadir
                 INTO CORRESPONDING FIELDS OF TABLE iclasses
                              WHERE pgmid = 'R3TR'
                                AND object = 'CLAS'
                                 AND ( obj_name LIKE 'Z%'
                                    OR obj_name LIKE 'Y%' ).
    LOOP AT iclasses.
      PERFORM buildclasskeys USING iclasses.
      lv_progname = iclasses-textelementkey.
      PERFORM gettextelements USING lv_progname lv_functionname iclasses-clsname.
    ENDLOOP.

  ENDIF.

  SORT lt_output BY type progname key.

*  LOOP AT lt_output INTO ls_output.
*    WRITE: / ls_output-type, 8 ls_output-progname,  50 ls_output-key , 60 ls_output-entry.
*  ENDLOOP.
*--alv display search result.
  PERFORM alv_cl_salv_table.

END-OF-SELECTION.
*&---------------------------------------------------------------------*
*&      Form  GETTEXTELEMENTS
*&---------------------------------------------------------------------*
FORM gettextelements  USING p_progname p_functionname p_clsname.
  DATA: castprogramname(35).

  CLEAR:castprogramname,ls_output.

  REFRESH itexttable.
  MOVE p_progname TO castprogramname.

  READ TEXTPOOL castprogramname INTO itexttable LANGUAGE p_lang.

  DELETE itexttable WHERE key = 'R'.
  DELETE itexttable WHERE key = 'S'."Selection texts

* Text elements.
  IF p_functionname IS INITIAL AND p_clsname IS INITIAL.
    ls_output-type = 'PROG'.
    ls_output-progname = p_progname.
  ELSEIF p_functionname IS NOT INITIAL.
    ls_output-type = 'FUGR'.
    ls_output-progname = p_functionname.
  ELSEIF p_clsname IS NOT INITIAL.
    ls_output-type = 'CLAS'.
    ls_output-progname = p_clsname.
  ENDIF.

  LOOP AT itexttable WHERE id = 'I'.
    IF p_alltxt = 'X'.
      MOVE itexttable-key   TO ls_output-key.
      MOVE itexttable-entry TO ls_output-entry.
      APPEND ls_output TO lt_output.
    ELSE.
      IF itexttable-entry CS p_txt.
        MOVE itexttable-key   TO ls_output-key.
        MOVE itexttable-entry TO ls_output-entry.
        APPEND ls_output TO lt_output.
      ENDIF.
    ENDIF.
  ENDLOOP.
ENDFORM.

*------------------------------------------------------------------------
*  buildClassKeys...   Finds the title text of a class.
*------------------------------------------------------------------------
FORM buildclasskeys USING waclass TYPE tclass.
  DATA:classnamelength TYPE i,
       loops           TYPE i.

  classnamelength = strlen( waclass-clsname ).

* Text element key - length of text element key has to be 32 characters.
  loops = 30 - classnamelength.
  waclass-textelementkey = waclass-clsname.

  DO loops TIMES.
    CONCATENATE waclass-textelementkey '=' INTO waclass-textelementkey.
  ENDDO.
  CONCATENATE waclass-textelementkey 'CP' INTO waclass-textelementkey.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  ALV_CL_SALV_TABLE
FORM alv_cl_salv_table .
  DATA: salv_table       TYPE REF TO cl_salv_table,
        lr_columns       TYPE REF TO cl_salv_columns,
        lr_column        TYPE REF TO cl_salv_column,
        lv_column_text_s TYPE scrtext_s,
        lv_column_text_m TYPE scrtext_m,
        lv_column_text_l TYPE scrtext_l,
        gr_display       TYPE REF TO cl_salv_display_settings,
        gr_functions     TYPE REF TO cl_salv_functions.

  TRY.
      CALL METHOD cl_salv_table=>factory
        EXPORTING
          list_display = if_salv_c_bool_sap=>false
        IMPORTING
          r_salv_table = salv_table
        CHANGING
          t_table      = lt_output.
    CATCH cx_salv_msg.
  ENDTRY.

  gr_functions = salv_table->get_functions( ).
  gr_functions->set_all( abap_true ).

  gr_display = salv_table->get_display_settings( ).
  gr_display->set_list_header('Text Elements : Search Result').
  gr_display->set_striped_pattern('X').

  salv_table->display( ).
ENDFORM.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值