• abap一个功能非常全面的增强出口查找工具 (仅供学习)


    相关链接:http://blog.csdn.net/compassbutton/archive/2007/03/19/1533453.aspx
                       http://blog.csdn.net/CompassButton/archive/2006/09/16/1231652.aspx
                       http://blog.csdn.net/CompassButton/archive/2006/09/16/1230344.aspx
                       http://blog.csdn.net/CompassButton/archive/2005/02/05/281437.aspx

    *&--------------------------------------------------------------------&*
    *& Report:       Z_USEREXIT (V9)                                      &*
    *& PJA Consultancy Services (www.pjas.com)                            &*
    *&--------------------------------------------------------------------&*
    *& This report attmpts to find Enhancements, Program-Exits, BADIs     &*
    *& and Business Transaction Events in a particular program/tcode.     &*
    *& Last updated: 09 May 2007                                          &*
    *&--------------------------------------------------------------------&*
    *& Selection Texts:
    *& P_ALV   ALV format
    *& P_AUTH   Include authority-check search
    *& P_BADI   Display BADIs
    *& P_BTE   Display business trans events
    *& P_DEVC   Show development class exits
    *& P_EXIT   Display user exits
    *& P_FUNC   Show function modules
    *& P_LIMIT   Limit no. of submits to search
    *& P_LST   Standard list format
    *& P_PNAME   Program name
    *& P_PROG   Display program exits
    *& P_SUBM   Show submits
    *& P_TCODE   Transaction code
    *& P_TEXT   Search for text
    *& P_WFLOW   Display workflow links
    *&--------------------------------------------------------------------&*
    *& Text symbols:
    *& M01   Enter TCode or program
    *& M02   Enter at least one scope criteria
    *& S01   Selection data (TCode takes precedence over program name)
    *& S02   Scope criteria
    *& S03   Display criteria
    *&--------------------------------------------------------------------&*
    report  z_userexit
      no standard page heading
      line-size 201.

    tables: sxs_attr,
            tobjt,
            tstct,               "TCode texts
            trdirt,              "Program texts
            sxc_exit.            "BADI exits

    type-pools: slis.            "Globale Typen fьr generische Listbausteine

    data: tabix         like sy-tabix,
          w_linnum      type i,
          w_off         type i,
          w_index       like sy-tabix,
          w_include     like trdir-name,
          w_prog        like trdir-name,
          w_incl        like trdir-name,
          w_area        like rs38l-area,
          w_level,
          w_str(50)     type c,
          w_cnt(2)      type c,
          w_funcname    like tfdir-funcname,
          w_fsel        like sy-ucomm,    " Determination of screen field
          w_gridtxt(70) type c.           "ALV grid title

    constants: c_fmod(40) type c value 'Function modules searched: ',
               c_subm(40) type c value 'Submit programs searched: ',
               c_devc(60) type c value 'User-exits from development classes in function modules',
               c_col1(12) type c value 'Enhanmt Type',
               c_col2(40) type c value 'Enhancement',
               c_col3(30) type c value 'Program/Include',
               c_col4(20) type c value 'Enhancement Name',
               c_col5(40) type c value 'Enhancement Description',
               c_col6(8)  type c value 'Project',
               c_col7(1)  type c value 'S',
               c_col8(12) type c value 'ChangeName',
               c_col9(10) type c value 'ChangeDate',
               c_x        type c value 'X'.

    * Work Areas: ABAP Workbench
    data: begin of wa_d010inc.
    data: master type d010inc-master.
    data: end of wa_d010inc.

    data: begin of wa_tfdir.
    data: funcname type tfdir-funcname,
          pname    type tfdir-pname,
          include  type tfdir-include.
    data: end of wa_tfdir.

    data: begin of wa_tadir.
    data: devclass type tadir-devclass.
    data: end of wa_tadir.

    data: begin of wa_tstc.
    data: pgmna type tstc-pgmna.
    data: end of wa_tstc.

    data: begin of wa_tstcp.
    data: param type tstcp-param.
    data: end of wa_tstcp.

    data: begin of wa_enlfdir.
    data: area type enlfdir-area.
    data: end of wa_enlfdir.

    * Work Areas: BADIs
    data: begin of wa_sxs_attr.
    data: exit_name type sxs_attr-exit_name.
    data: end of wa_sxs_attr.

    data: begin of wa_sxs_attrt.
    data: text type sxs_attrt-text.
    data: end of wa_sxs_attrt.

    * Work Areas: Enhancements
    data: begin of wa_modsap.
    data: member type modsap-member.
    data: end of wa_modsap.

    data: begin of wa_modsapa.
    data: name type modsapa-name.
    data: end of wa_modsapa.

    data: begin of wa_modsapt.
    data: modtext type modsapt-modtext.
    data: end of wa_modsapt.

    * Work Areas: Business Transaction Events
    data: begin of wa_tbe01t.
    data: text1 type tbe01t-text1.
    data: end of wa_tbe01t.

    data: begin of wa_tps01t.
    data: text1 type tps01t-text1.
    data: end of wa_tps01t.

    * user-exits
    types:  begin of ty_mod,
              member  like modact-member,
              name    like modact-name,
              status  like modattr-status,
              anam    like modattr-anam,
              adat    like modattr-adat,
            end of ty_mod.
    data:   w_mod  type ty_mod.

    types: begin of t_userexit,
          type(12) type c,
          pname    like trdir-name,
          txt(300),
          level    type c,
          modname(30) type c,
          modtext(60) type c,
          modattr     type ty_mod,
          colour(4)   type c,
    end of t_userexit.
    data: i_userexit type standard table of t_userexit with header line.

    * Function module developmnet classes
    types: begin of t_devclass,
          clas   like trdir-clas,
    end of t_devclass.
    data: i_devclass type standard table of t_devclass with header line.

    * Submit programs
    types: begin of t_submit,
          pname     like trdir-name,
          level,
          done,
    end of t_submit.
    data: i_submit type standard table of t_submit with header line.

    * Source code
    types: begin of t_sourcetab,                        "#EC * (SLIN lьgt!)
            line(200),                                  "#EC * (SLIN lьgt!)
          end of t_sourcetab.                           "#EC * (SLIN lьgt!)
    data: sourcetab type standard table of t_sourcetab with header line.
    data c_overflow(30000) type c.

    * Description of an ABAP/4 source analysis token
    data: i_stoken type standard table of stokex with header line.
    data wa_stoken like i_stoken.

    * Description of an ABAP/4 source analysis statement
    data: i_sstmnt type standard table of sstmnt with header line."#EC NEEDED

    * keywords for searching ABAP code
    types: begin of t_keywords,
          word(30),
    end of t_keywords.
    data: keywords type standard table of t_keywords with header line.

    * function modules within program
    types: begin of t_fmodule,
          name   like rs38l-name,
          pname  like trdir-name,
          pname2 like trdir-name,
          level,
          bapi,
          done,
    end of t_fmodule.
    data: i_fmodule type standard table of t_fmodule with header line.

    * ALV definitions
    data i_fieldcat type slis_t_fieldcat_alv with header line.
    data i_layout   type slis_layout_alv.
    data i_sort     type slis_t_sortinfo_alv with header line.

    *&--------------------------------------------------------------------&*
    *& Selection Options                                                  &*
    *&--------------------------------------------------------------------&*
    selection-screen begin of block selscr1 with frame title text-s01.
    parameter: p_pname like trdir-name,
               p_tcode like syst-tcode,
               p_limit(4) type n default 500.
    selection-screen skip.
    selection-screen end of block selscr1.

    selection-screen begin of block selscr2 with frame title text-s02.
    parameter: p_badi  as checkbox default c_x,
               p_bte   as checkbox default c_x,
               p_exit  as checkbox default c_x,
               p_prog  as checkbox default c_x,
               p_wflow as checkbox,
               p_auth  as checkbox.
    selection-screen skip.
    parameter: p_text(40) type c.
    selection-screen end of block selscr2.

    selection-screen begin of block selscr3 with frame title text-s03.
    parameter: p_alv radiobutton group rad1 default 'X',
               p_lst radiobutton group rad1.
    selection-screen skip.
    parameter: p_devc  like rihea-dy_ofn default ' ' modif id a01,
               p_func  like rihea-dy_ofn default ' ' modif id a01,
               p_subm  like rihea-dy_ofn default ' ' modif id a01.
    selection-screen end of block selscr3.

    *&--------------------------------------------------------------------&*
    *& START-OF-SELECTION                                                 &*
    *&--------------------------------------------------------------------&*
    start-of-selection.

      if p_pname is initial and p_tcode is initial.
        message i000(g01) with text-m01.
        stop.
      endif.

      if p_badi  is initial and
         p_exit  is initial and
         p_bte   is initial and
         p_wflow is initial and
         p_auth  is initial and
         p_prog  is initial.
        message i000(g01) with text-m02.
        stop.
      endif.

    * ensure P_LIMIT is not zero.
      if p_limit = 0.
        p_limit = 1.
      endif.

      perform data_select.
      perform get_submit_data.
      perform get_fm_data.
      perform get_additional_data.
      perform data_display.

    *&--------------------------------------------------------------------&*
    *& Form DATA_SELECT                                                   &*
    *&--------------------------------------------------------------------&*
    *&                                                                    &*
    *&--------------------------------------------------------------------&*
    form data_select.

    * data selection message to sap gui
      call function 'SAPGUI_PROGRESS_INDICATOR'
        destination 'SAPGUI'
        keeping logical unit of work
        EXPORTING
          text                  = 'Get programs/includes'       "#EC NOTEXT
        EXCEPTIONS
          system_failure
          communication_failure
        .                                                       "#EC *

    * get TCode name for ALV grid title
      clear w_gridtxt.
      if not p_tcode is initial.
        select single * from tstct where tcode = p_tcode
                                     and sprsl = sy-langu.
        concatenate 'TCode:' p_tcode tstct-ttext into w_gridtxt
                                    separated by space.
      endif.
    * get program name for ALV grid title
      if not p_pname is initial.
        select single * from trdirt where name = p_pname
                                     and sprsl = sy-langu.
        concatenate 'Program:' p_pname tstct-ttext into w_gridtxt
                                    separated by space.
      endif.

    * determine search words
      keywords-word = 'CALL'.
      append keywords.
      keywords-word = 'FORM'.
      append keywords.
      keywords-word = 'PERFORM'.
      append keywords.
      keywords-word = 'SUBMIT'.
      append keywords.
      keywords-word = 'INCLUDE'.
      append keywords.
      keywords-word = 'AUTHORITY-CHECK'.
      append keywords.

      if not p_tcode is initial.
    * get program name from TCode
        select single pgmna from tstc into wa_tstc-pgmna
                     where tcode eq p_tcode.
        if not wa_tstc-pgmna is initial.
          p_pname = wa_tstc-pgmna.
    * TCode does not include program name, but does have reference TCode
        else.
          select single param from tstcp into wa_tstcp-param
                       where tcode eq p_tcode.
          if sy-subrc = 0.
            check wa_tstcp-param(1)   = '/'.
            check wa_tstcp-param+1(1) = '*'.
            if wa_tstcp-param ca ' '.
            endif.
            w_off = sy-fdpos + 1.
            subtract 2 from sy-fdpos.
            if sy-fdpos gt 0.
              p_tcode = wa_tstcp-param+2(sy-fdpos).
            endif.
            select single pgmna from tstc into wa_tstc-pgmna
                   where tcode eq p_tcode.
            p_pname = wa_tstc-pgmna.
            if sy-subrc <> 0.
              message s110(/saptrx/asc) with 'No program found for: ' p_tcode."#EC NOTEXT
              stop.
            endif.
          else.
            message s110(/saptrx/asc) with 'No program found for: ' p_tcode."#EC NOTEXT
            stop.
          endif.

        endif.
      endif.

    * Call customer-function aus Program coding
      read report p_pname into sourcetab.
      if sy-subrc > 0.
        message e017(enhancement) with p_pname raising no_program."#EC *
      endif.

      scan abap-source sourcetab tokens     into i_stoken
                                 statements into i_sstmnt
                                 keywords   from keywords
                                 overflow into c_overflow
                                 with includes.                 "#EC
      if sy-subrc > 0. "keine/syntakt. falsche Ablauflog./Fehler im Skanner
        message e130(enhancement) raising syntax_error.         "#EC
      endif.

    * check I_STOKEN for entries
      clear w_linnum.
      describe table i_stoken lines w_linnum.
      if w_linnum gt 0.
        w_level = '0'.
        w_prog = ''.
        w_incl = ''.
        perform data_search tables i_stoken using w_level w_prog w_incl.
      endif.

    endform.                        "DATA_SELECT

    *&--------------------------------------------------------------------&*
    *& Form GET_FM_DATA                              ௥                    &*
    *&--------------------------------------------------------------------&*
    *&                                                                    &*
    *&--------------------------------------------------------------------&*
    form get_fm_data.

    * data selection message to sap gui
      call function 'SAPGUI_PROGRESS_INDICATOR'
        destination 'SAPGUI'
        keeping logical unit of work
        EXPORTING
          text                  = 'Get function module data'    "#EC NOTEXT
        EXCEPTIONS
          system_failure
          communication_failure
        .                                                       "#EC *

    * Function module data
      sort i_fmodule by name.
      delete adjacent duplicates from i_fmodule comparing name.

      loop at i_fmodule where done  ne c_x.

        clear:   i_stoken, i_sstmnt, sourcetab, wa_tfdir, w_include .
        refresh: i_stoken, i_sstmnt, sourcetab.

        clear wa_tfdir.
        select single funcname pname include from tfdir into wa_tfdir
                                where funcname = i_fmodule-name.
        check sy-subrc = 0.

        call function 'FUNCTION_INCLUDE_SPLIT'
          EXPORTING
            program = wa_tfdir-pname
          IMPORTING
            group   = w_area.

        concatenate 'L' w_area 'U' wa_tfdir-include into w_include.
        i_fmodule-pname  = w_include.
        i_fmodule-pname2 = wa_tfdir-pname.
        modify i_fmodule.

        read report i_fmodule-pname into sourcetab.
        if sy-subrc = 0.

          scan abap-source sourcetab tokens     into i_stoken
                                     statements into i_sstmnt
                                     keywords   from keywords
                                     with includes.
          if sy-subrc > 0.
            message e130(enhancement) raising syntax_error.
          endif.

    * check i_stoken for entries
          clear w_linnum.
          describe table i_stoken lines w_linnum.
          if w_linnum gt 0.
            w_level = '1'.
            w_prog  = i_fmodule-pname2.
            w_incl =  i_fmodule-pname.
            perform data_search tables i_stoken using w_level w_prog w_incl.
          endif.
        endif.

      endloop.

    * store development classes
      if p_devc = c_x.
        loop at i_fmodule.
          clear: wa_tadir, wa_enlfdir.

          select single area from enlfdir into wa_enlfdir-area
                                where funcname = i_fmodule-name.
          check not wa_enlfdir-area is initial.

          select single devclass into wa_tadir-devclass
                          from tadir where pgmid    = 'R3TR'
                                       and object   = 'FUGR'
                                       and obj_name = wa_enlfdir-area.
          check not wa_tadir-devclass is initial.
          move wa_tadir-devclass to i_devclass-clas.
          append i_devclass.
          i_fmodule-done = c_x.
          modify i_fmodule.
        endloop.

        sort i_devclass.
        delete adjacent duplicates from i_devclass.
      endif.

    endform.                        "GET_FM_DATA

    *&--------------------------------------------------------------------&*
    *& Form GET_SUBMIT_DATA                                               &*
    *&--------------------------------------------------------------------&*
    *&                                                                    &*
    *&--------------------------------------------------------------------&*
    form get_submit_data.

    * data selection message to sap gui
      call function 'SAPGUI_PROGRESS_INDICATOR'
        destination 'SAPGUI'
        keeping logical unit of work
        EXPORTING
          text                  = 'Get submit data'             "#EC NOTEXT
        EXCEPTIONS
          system_failure
          communication_failure
        .                                                       "#EC *

      sort i_submit.
      delete adjacent duplicates from i_submit comparing pname.
      w_level = '0'.

      loop at i_submit where done ne c_x.

        clear:   i_stoken, i_sstmnt, sourcetab.
        refresh: i_stoken, i_sstmnt, sourcetab.

        read report i_submit-pname into sourcetab.
        if sy-subrc = 0.

          scan abap-source sourcetab tokens     into i_stoken
                                     statements into i_sstmnt
                                     keywords   from keywords
                                     with includes.
          if sy-subrc > 0.
    *        message e130(enhancement) raising syntax_error.
            continue.
          endif.

    * check i_stoken for entries
          clear w_linnum.
          describe table i_stoken lines w_linnum.
          if w_linnum gt 0.
            w_prog  = i_submit-pname.
            w_incl = ''.
            perform data_search tables i_stoken using w_level w_prog w_incl.
          endif.
        endif.

    * restrict number of submit program selected for processing
        describe table i_submit lines w_linnum.
        if w_linnum ge p_limit.
          w_level = '1'.
        endif.
        i_submit-done = c_x.
        modify i_submit.
      endloop.

    endform.                       "GET_SUBMIT_DATA

    *&--------------------------------------------------------------------&*
    *& Form DATA_SEARCH                                                   &*
    *&--------------------------------------------------------------------&*
    *&                                                                    &*
    *&--------------------------------------------------------------------&*
    form data_search tables p_stoken structure stoken
                            using p_level l_prog l_incl.

      loop at p_stoken.

        clear i_userexit.

    * Workflow
        if p_wflow = c_x.
          if p_level eq '1'.    " do not perform for function modules (2nd pass)
            if  p_stoken-str+1(16) cs 'SWE_EVENT_CREATE'.
              replace all occurrences of '''' in p_stoken-str with ''.
              i_userexit-type = 'WorkFlow'.
              i_userexit-txt  = p_stoken-str.
              concatenate l_prog '/' l_incl into i_userexit-pname.
              append i_userexit.
            endif.
          endif.
        endif.

        tabix = sy-tabix + 1.
        i_userexit-level = p_level.
        if i_userexit-level = '0'.
          if l_incl is initial.
            i_userexit-pname = p_pname.
          else.
            concatenate  p_pname '-' l_incl into i_userexit-pname.
          endif.
        else.
          if l_incl is initial.
            i_userexit-pname = l_prog.
          else.
            concatenate  l_prog '-' l_incl into i_userexit-pname.
          endif.
        endif.

    * AUTHORITY-CHECKS
        if p_auth = c_x.
          if p_stoken-str eq 'AUTHORITY-CHECK'.
            check p_level eq '0'.    " do not perform for function modules (2nd pass)
            w_index = sy-tabix + 2.
            read table p_stoken index w_index into wa_stoken.
            check not wa_stoken-str cs 'STRUCTURE'.
            check not wa_stoken-str cs 'SYMBOL'.
            read table i_submit with key pname = wa_stoken-str.
            if sy-subrc <> 0.
              i_userexit-pname = i_submit-pname.
              i_userexit-type = 'AuthCheck'.
              i_userexit-txt  = wa_stoken-str.
              replace all occurrences of '''' in i_userexit-txt with space.
              clear tobjt.
              select single * from tobjt where object = i_userexit-txt
                                           and langu  = sy-langu.
              i_userexit-modname = 'AUTHORITY-CHECK'.
              i_userexit-modtext = tobjt-ttext.
              append i_userexit.
            endif.
          endif.
        endif.

    * Text searches
        if not p_text is initial.
          if p_stoken-str cs p_text.
            i_userexit-pname = i_submit-pname.
            i_userexit-type = 'TextSearch'.
            i_userexit-txt  = wa_stoken-str.
            i_userexit-modname = 'Text Search'.
            i_userexit-modtext = p_stoken-str.
            append i_userexit.
          endif.
        endif.

    * Include (SE38)
        if p_stoken-str eq 'INCLUDE'.
          check p_level eq '0'.    " do not perform for function modules (2nd pass)
          w_index = sy-tabix + 1.
          read table p_stoken index w_index into wa_stoken.
          check not wa_stoken-str cs 'STRUCTURE'.
          check not wa_stoken-str cs 'SYMBOL'.
          read table i_submit with key pname = wa_stoken-str.
          if sy-subrc <> 0.
            i_submit-pname = wa_stoken-str.
            i_submit-level = p_level.
            append i_submit.
          endif.
        endif.

    * Enhancements (SMOD)
        if p_exit = c_x.
          if p_stoken-str eq 'CUSTOMER-FUNCTION'.
            clear w_funcname.
            read table p_stoken index tabix.
            translate p_stoken-str using ''' '.
            condense p_stoken-str.
            if l_prog is initial.
              concatenate 'EXIT' p_pname p_stoken-str into w_funcname
                           separated by '_'.
            else.
              concatenate 'EXIT' l_prog p_stoken-str into w_funcname
                     separated by '_'.
            endif.
            select single member from modsap into wa_modsap-member
                  where member = w_funcname.
            if sy-subrc = 0.   " check for valid enhancement
              i_userexit-type = 'Enhancement'.
              i_userexit-txt  = w_funcname.
              append i_userexit.
            else.
              clear wa_d010inc.
              select single master into wa_d010inc-master
                    from d010inc
                       where include = l_prog.
              concatenate 'EXIT' wa_d010inc-master p_stoken-str into w_funcname
                     separated by '_'.
              i_userexit-type = 'Enhancement'.
              i_userexit-txt  = w_funcname.
            endif.
          endif.
        endif.

    * BADIs (SE18)
        if p_badi = c_x.
          if p_stoken-str cs 'cl_exithandler='.
            w_index = sy-tabix + 4.
            read table p_stoken index w_index into wa_stoken.
            i_userexit-txt = wa_stoken-str.
            replace all occurrences of '''' in i_userexit-txt with space.
            i_userexit-type = 'BADI'.
            clear sxs_attr.   " ensure a real BADI
            select single * from sxs_attr where exit_name = i_userexit-txt.
            if sy-subrc = 0.
              append i_userexit.
            endif.
          endif.
        endif.

    * Business transaction events (FIBF)
        if p_bte = c_x.
          if p_stoken-str cs 'OPEN_FI_PERFORM'.
            i_userexit-type = 'BusTrEvent'.
            i_userexit-txt = p_stoken-str.
            replace all occurrences of '''' in i_userexit-txt with space.
            i_userexit-modname =  i_userexit-txt+16(8).
            case i_userexit-txt+25(1).
              when 'E'.
                clear wa_tbe01t.
                select single text1 into wa_tbe01t-text1 from tbe01t
                                 where event = i_userexit-txt+16(8)
                                   and spras = sy-langu.
                if wa_tbe01t-text1 is initial.
                  i_userexit-modtext = '<Not active>'.          "#EC NOTEXT
                else.
                  i_userexit-modtext = wa_tbe01t-text1.
                endif.
                i_userexit-modname+8 = '/P&S'.                  "#EC NOTEXT
              when 'P'.
                clear wa_tps01t.
                select single text1 into wa_tps01t-text1 from tps01t
                                 where procs = i_userexit-txt+16(8)
                                   and spras = sy-langu.
                i_userexit-modtext = wa_tps01t-text1.
                i_userexit-modname+8 = '/Process'.
            endcase.

            append i_userexit.
          endif.
        endif.

    * Program exits (SE38)
        if p_prog = c_x.
          if p_stoken-str cs 'USEREXIT_'.
            check not p_stoken-str cs '-'.   " ensure not USEREXIT_XX-XXX
            check not p_stoken-str cs '('.   " ensure not SUBMIT_XX(X)
            i_userexit-type = 'Program Exit'.
            i_userexit-txt = p_stoken-str.
            replace all occurrences of '''' in i_userexit-txt with space.
            append i_userexit.
          endif.
        endif.

    * Submit programs (SE38)
        if p_stoken-str cs 'SUBMIT'.
          check p_level eq '0'.    " do not perform for function modules (2nd pass)
          check not p_stoken-str cs '_'.   " ensure not SUBMIT_XXX
          w_index = sy-tabix + 1.
          read table p_stoken index w_index into wa_stoken.
          check not wa_stoken-str cs '_'.   " ensure not SUBMIT_XXX
          replace all occurrences of '''' in wa_stoken-str with space.
          read table i_submit with key pname = wa_stoken-str.
          if sy-subrc <> 0.
            i_submit-pname = wa_stoken-str.
            i_submit-level = p_level.
            append i_submit.
          endif.
        endif.

    * Perform routines (which reference external programs)
        if p_stoken-str cs 'PERFORM'.
          check p_level eq '0'.    " do not perform for function modules (2nd pass)
          w_index = sy-tabix + 1.
          read table p_stoken index w_index into wa_stoken.
          if not wa_stoken-ovfl is initial.
            w_off = wa_stoken-off1 + 10.
            w_str = c_overflow+w_off(30).
            find ')' in w_str match offset w_off.
            if sy-subrc = 0.
              w_off = w_off + 1.
              wa_stoken-str = w_str(w_off).
            endif.
          endif.

          check wa_stoken-str cs '('.
          w_off = 0.
          while sy-subrc  = 0.
            if wa_stoken-str+w_off(1) eq '('.
              replace section offset w_off length 1 of wa_stoken-str with ''.
              replace all occurrences of ')' in wa_stoken-str with space.
              read table i_submit with key pname = wa_stoken-str.
              if sy-subrc <> 0.
                i_submit-pname = wa_stoken-str.
                append i_submit.
              endif.
              exit.
            else.
              replace section offset w_off length 1 of wa_stoken-str with ''.
              shift wa_stoken-str left deleting leading space.
            endif.
          endwhile.
        endif.

    * Function modules (SE37)
        if p_stoken-str cs 'FUNCTION'.

          clear i_fmodule.
          if p_level eq '0'.    " do not perform for function modules (2nd pass)
            w_index = sy-tabix + 1.
            read table p_stoken index w_index into wa_stoken.

            if wa_stoken-str cs 'BAPI'.
              i_fmodule-bapi = c_x.
            endif.

            replace first occurrence of '''' in wa_stoken-str with space.
            replace first occurrence of '''' in wa_stoken-str with space.
            if sy-subrc = 4.   " didn't find 2nd quote (ie name truncated)
              clear wa_tfdir.
              concatenate wa_stoken-str '%' into wa_stoken-str.
              select single funcname into wa_tfdir-funcname from tfdir
                           where funcname like wa_stoken-str.
              if sy-subrc = 0.
                i_fmodule-name = wa_tfdir-funcname.
              else.
                continue.
              endif.
            else.
              i_fmodule-name = wa_stoken-str.
            endif.
            i_fmodule-level = p_level.
            append i_fmodule.
          endif.
        endif.

      endloop.

    endform.                        "DATA_SEARCH

    *&--------------------------------------------------------------------&*
    *& Form GET_ADDITIONAL_DATA                                           &*
    *&--------------------------------------------------------------------&*
    *&                                                                    &*
    *&--------------------------------------------------------------------&*
    form get_additional_data.

    * data selection message to sap gui
      call function 'SAPGUI_PROGRESS_INDICATOR'
        destination 'SAPGUI'
        keeping logical unit of work
        EXPORTING
          text                  = 'Get additional data'         "#EC NOTEXT
        EXCEPTIONS
          system_failure
          communication_failure
        .                                                       "#EC *

      loop at i_userexit.

    * Workflow
        if i_userexit-type eq 'WorkFlow'.
          continue.
        endif.



    * Enhancement data
        if  i_userexit-type cs 'Enh'.
          clear: wa_modsapa.
          select single name into wa_modsapa-name from modsap
                            where member = i_userexit-txt.
          check sy-subrc = 0.
          i_userexit-modname = wa_modsapa-name.

          clear wa_modsapt.
          select single modtext into wa_modsapt-modtext from modsapt
                            where name = wa_modsapa-name
                                         and sprsl = sy-langu.
          i_userexit-modtext = wa_modsapt-modtext.

    * Get the CMOD project name
          clear w_mod.
          select single modact~member modact~name modattr~status
                        modattr~anam  modattr~adat
            into w_mod
            from modact
            inner join modattr
              on modattr~name = modact~name
            where modact~member = wa_modsapa-name
              and modact~typ    = space.
          if sy-subrc = 0.
            i_userexit-modattr  = w_mod.
          endif.
        endif.


    * BADI data
        if  i_userexit-type eq 'BADI'.
          clear wa_sxs_attr.
          select single exit_name into wa_sxs_attr-exit_name from sxs_attr
                                        where exit_name = i_userexit-txt.
          if sy-subrc = 0.
            i_userexit-modname = i_userexit-txt.
          else.
            i_userexit-modname = 'Dynamic call'.                "#EC NOTEXT
          endif.
          clear wa_sxs_attrt.
          select single text into wa_sxs_attrt-text from sxs_attrt
                                         where exit_name = wa_sxs_attr-exit_name
                                           and sprsl = sy-langu.
          i_userexit-modtext = wa_sxs_attrt-text.
        endif.

    * BADI Implementation
        if  i_userexit-type eq 'BADI'.
          clear sxc_exit.
          select COUNT( * ) from sxc_exit where exit_name = i_userexit-txt.
          w_cnt = sy-dbcnt.
    * determine id BADI is for interal or external use
          clear sxs_attr.
          select single * from sxs_attr where exit_name = i_userexit-txt.
          if sxs_attr-internal = 'X'.
            wa_sxs_attrt-text = 'SAP '.
          else.
            wa_sxs_attrt-text = 'CUST'.
          endif.
    *        concatenate wa_sxs_attrt-text w_cnt into i_userexit-modattr-name
    *        separated by space.
          write wa_sxs_attrt-text to i_userexit-modattr-name.
          write w_cnt             to i_userexit-modattr-name+5.
        endif.

        modify i_userexit.
      endloop.

    * get enhancements via program package
      clear wa_tadir.
      select single devclass into wa_tadir-devclass from tadir
                                 where pgmid    = 'R3TR'
                                   and object   = 'PROG'
                                   and obj_name = p_pname.
      if sy-subrc = 0.
        clear: wa_modsapa, wa_modsapt.
        select name from modsapa into wa_modsapa-name
                              where devclass = wa_tadir-devclass.
          select single modtext from modsapt into wa_modsapt-modtext
                              where name = wa_modsapa-name
                                and sprsl = sy-langu.

          clear i_userexit.
          read table i_userexit with key modname = wa_modsapa-name.
          if sy-subrc <> 0.
            i_userexit-modtext = wa_modsapt-modtext.
            i_userexit-type = 'Enhancement'.                    "#EC NOTEXT
            i_userexit-modname  = wa_modsapa-name.
            i_userexit-txt = 'Determined from program DevClass'."#EC NOTEXT
            i_userexit-pname = 'Unknown'.                       "#EC NOTEXT
            append i_userexit.
          endif.
        endselect.
      endif.

    * set row colour.
      loop at i_userexit.
        case i_userexit-type.
          when 'BADI'.
            i_userexit-colour = 'C601'.
          when 'Enhancement'.
            i_userexit-colour = 'C501'.
          when 'Program Exit'.
            i_userexit-colour = 'C401'.
          when 'WorkFlow'.
            i_userexit-colour = 'C301'.
          when 'BusTrEvent'.
            i_userexit-colour = 'C201'.
        endcase.
        modify i_userexit.
      endloop.

    endform.                        "GET_ADDITIONAL_DATA

    *&--------------------------------------------------------------------&*
    *& Form DATA_DISPLAY                                                  &*
    *&--------------------------------------------------------------------&*
    *&                                                                    &*
    *&--------------------------------------------------------------------&*
    form data_display.

    * data selection message to sap gui
      call function 'SAPGUI_PROGRESS_INDICATOR'
        destination 'SAPGUI'
        keeping logical unit of work
        EXPORTING
          text                  = 'Prepare screen for display'  "#EC NOTEXT
        EXCEPTIONS
          system_failure
          communication_failure
        .                                                       "#EC *

      sort i_userexit by type txt modname.
      delete adjacent duplicates from i_userexit comparing txt pname modname.

    * ensure records selected.
      describe table i_userexit lines w_linnum.
      if w_linnum = 0.
        message s003(g00).   "No data records were selected
        exit.
      endif.

      if p_alv = ' '.

    * format headings
        write: 'Enhancements from main program: ', p_pname.
        write: 'Enhancements from TCode: ', p_tcode.
        write: 201''.
        uline.
        format color col_heading.
        write: /    sy-vline,
               (12) c_col1,                    "Enhanmt Type
                    sy-vline,
               (40) c_col2,                    "Enhancement
                    sy-vline,
               (30) c_col3,                    "Program/Include
                    sy-vline,
               (20) c_col4,                    "Enhancement name
                    sy-vline,
               (40) c_col5,                    "Enhancement description
                    sy-vline,
               (8)  c_col6,                    "Project
                    sy-vline,
               (1)  c_col7,                    "S
                    sy-vline,
               (12) c_col8,                    "ChangeName
                    sy-vline,
               (10)  c_col9,                    "ChangeDate
                    sy-vline.
        format reset.
        uline.

    * format lines
        loop at i_userexit.
    * set line colour
          case i_userexit-type.
            when 'Enhancement'.
              format color 3 intensified off.
            when 'BADI'.
              format color 4 intensified off.
            when 'BusTrEvent'.
              format color 5 intensified off.
            when 'Program Exit'.
              format color 6 intensified off.
            when others.
              format reset.
          endcase.
          write: / sy-vline,
                   i_userexit-type,
                   sy-vline,
                   i_userexit-txt(40),
                   sy-vline,
                   i_userexit-pname(30),
                   sy-vline,
                   i_userexit-modname(20),
                   sy-vline,
                   i_userexit-modtext(40),
                   sy-vline.

          write:  i_userexit-modattr-name,
                  sy-vline,
                  i_userexit-modattr-status,
                  sy-vline,
                  i_userexit-modattr-anam,
                  sy-vline,
                  i_userexit-modattr-adat no-zero,
                  sy-vline.
          hide: i_userexit-modname, i_userexit-type, i_userexit-modattr-name.

        endloop.
        format reset.
        uline.

    * user-exits from development class of function modules
        if p_devc = c_x.
          write: /.
          write: / c_devc.
          write: 201''.
          uline (90).
          write: 201''.

          loop at i_devclass.
            clear wa_modsapa.
            select name from modsapa into wa_modsapa
                         where devclass = i_devclass-clas.
              select single name modtext into corresponding fields of wa_modsapt
                                         from modsapt
                                           where name  = wa_modsapa-name
                                             and sprsl = sy-langu.
              format color 3 intensified off.
              write: / sy-vline,
                       (12) 'Enhancement',
                       sy-vline,
                      wa_modsapa-name,
                      sy-vline,
                      wa_modsapt-modtext,
                      sy-vline.
            endselect.
          endloop.
          write: 201''.
          uline (90).
          format reset.
        endif.

    * display fuction modules used in program
        write /.
        describe table i_fmodule lines w_linnum.
        write: / c_fmod , at 35 w_linnum.                       "#EC NOTEXT
        write: 201''.

        if p_func = c_x.
          uline (38).
          write: 201''.
          loop at i_fmodule.
            write: sy-vline,
                   i_fmodule-name,
                   sy-vline,
                   i_fmodule-bapi,
                   sy-vline.
            write: 201''.
          endloop.
          write: 201''.
          uline (38).
        endif.

    * display submit programs used in program
        write /.
        describe table i_submit lines w_linnum.
        write: / c_subm , at 35 w_linnum.                       "#EC NOTEXT
        write: 201''.
        if p_subm = c_x.
          uline (44).
          write: 201''.
          loop at i_submit.
            write: sy-vline,
                   i_submit-pname,
                   sy-vline.
            write: 201''.
          endloop.
          write: 201''.
          uline (44).
        endif.

    * issue message with number of user-exits displayed
        describe table i_userexit lines w_linnum.
        message s697(56) with w_linnum.

      else.    " Show in alv format

    * issue message with number of user-exits displayed
        describe table i_userexit lines w_linnum.
        message s697(56) with w_linnum.

    * Create field catalog
        perform create_field_catalog using 'TYPE'           'T_USEREXIT' ' ' 'Type'.
        perform create_field_catalog using 'PNAME'          'T_USEREXIT' ' ' 'Prog௥am name'.
        perform create_field_catalog using 'TXT'            'T_USEREXIT' ' ' 'Enhancement'.
        perform create_field_catalog using 'LEVEL'          'T_USEREXIT' c_x 'Level'.
        perform create_field_catalog using 'MODNAME'        'T_USEREXIT' ' ' 'Enhancement name'.
        perform create_field_catalog using 'MODTEXT'        'T_USEREXIT' ' ' 'Enhancement text'.
        perform create_field_catalog using 'MODATTR-MEMBER' 'T_USEREXIT' c_x 'Member'.
        perform create_field_catalog using 'MODATTR-NAME'   'T_USEREXIT' ' ' 'Project'.
        perform create_field_catalog using 'MODATTR-STATUS' 'T_USEREXIT' ' ' 'Status'.
        perform create_field_catalog using 'MODATTR-ANAM'   'T_USEREXIT' ' ' 'Changed by'.
        perform create_field_catalog using 'MODATTR-ADAT'   'T_USEREXIT' ' ' 'Change date'.

    * Layout
        clear i_layout.
        i_layout-colwidth_optimize = c_x.
        i_layout-info_fieldname    = 'COLOUR'.

    * Sort
        clear i_sort.
        i_sort-fieldname = 'TYPE'.
        i_sort-tabname   = 'T_USEREXIT'.
        i_sort-up = c_x.
        append i_sort.

        call function 'REUSE_ALV_GRID_DISPLAY'
          EXPORTING
            i_callback_program      = sy-cprog
            i_callback_user_command = 'USER_COMMAND'
            is_layout               = i_layout
            it_fieldcat             = i_fieldcat[]
            it_sort                 = i_sort[]
            i_default               = c_x
            i_save                  = 'A'
            i_grid_title            = w_gridtxt
          TABLES
            t_outtab                = i_userexit.

      endif.

    * issue message with number of user-exits displayed
      describe table i_userexit lines w_linnum.
      message s697(56) with w_linnum.

    endform.                        "DATA_DISPLAY

    *&---------------------------------------------------------------------&*
    *& Form  CREATE_FIELD_CATALOG                                          &*
    *&---------------------------------------------------------------------&*
    form create_field_catalog using    p_fieldname
                                       p_tabname
                                       p_hide
                                       p_text.

      i_fieldcat-fieldname        = p_fieldname.
      i_fieldcat-tabname          = p_tabname.
      i_fieldcat-no_out           = p_hide.
      i_fieldcat-seltext_l        = p_text.

      append i_fieldcat.

    endform.                    " CREATE_FIELD_CATALOG

    *&---------------------------------------------------------------------&*
    *& Form  CREATE_FIELD_CATALOG                                          &*
    *&---------------------------------------------------------------------&*
    form user_command using r_ucomm like sy-ucomm
                            rs_selfield type slis_selfield.
      read table i_userexit index rs_selfield-tabindex.
      check sy-subrc = 0.
      case r_ucomm.
        when '&IC1'.
          case rs_selfield-sel_tab_field.
            when 'T_USEREXIT-MODNAME'.
              read table i_userexit index rs_selfield-tabindex.
              case i_userexit-type.
                when 'Enhancement'.
                  set parameter id 'MON' field i_userexit-modname.
                  call transaction 'SMOD'.
                when 'BADI'.
                  set parameter id 'EXN' field i_userexit-modname.
                  call transaction 'SE18' and skip first screen.
                when 'BusTrEvent'.
                  submit rfopfi00 with event = i_userexit-modname(8) and return.
                when others.
                  message s030(cj). "Navigation not possible
              endcase.
            when 'T_USEREXIT-MODATTR-NAME'.
              if not i_userexit-modattr-name is initial.
                set parameter id 'MON_KUN' field i_userexit-modattr-name.
                call transaction 'CMOD'.
              else.
                message s030(cj)."Navigation not possible
              endif.
            when others.
              message s030(cj)."Navigation not possible
          endcase.
      endcase.

    endform.                    "user_command

    *&--------------------------------------------------------------------&*
    *& AT LINE-SELECTION                                                  ௥*
    *&--------------------------------------------------------------------&*
    at line-selection.

      get cursor field w_fsel.

      case w_fsel.

        when 'I_USEREXIT-MODNAME'.
          case i_userexit-type.
            when 'Enhancement'.
              set parameter id 'MON' field i_userexit-modname.
              call transaction 'SMOD'.
            when 'BADI'.
              set parameter id 'EXN' field i_userexit-modname.
              call transaction 'SE18' and skip first screen.
            when 'BusTrEvent'.
              submit rfopfi00 with event = i_userexit-modname(8) and return.
            when others.
              message s030(cj)."Navigation not possible
          endcase.

        when 'I_USEREXIT-MODATTR-NAME'.
          if not i_userexit-modattr-name is initial.
            set parameter id 'MON_KUN' field i_userexit-modattr-name.
            call transaction 'CMOD'.
          else.
            message s030(cj)."Navigation not possible
          endif.

        when others.
          message s030(cj)."Navigation not possible

      endcase.

    *&--------------------------------------------------------------------&*
    *& AT SELECTION-SCREEN                                                &*
    *&--------------------------------------------------------------------&*
    at selection-screen on radiobutton group rad1.

    * grey-out checkboxes if ALV selected
    at selection-screen output.
      loop at screen.
        if p_alv = c_x.
          if screen-group1 = 'A01'.
            screen-input = '0'.
            modify screen.
          endif.
        else.
          if screen-group1 = 'A01'.
            screen-input = '1'.
            modify screen.
          endif.
        endif.
      endloop. 

  • 相关阅读:
    C#在与java对接时候的UrlEncode的坑
    sql server 删除大量数据的一次坑爹之旅
    js实现黑客帝国文字下落效果
    第一个SignalR案例
    简单的放天灯动画
    计量单位符号的书写规范【转】
    阿里云OSS搭建移动应用直传服务的.Net C#示例
    UWP Windows10开发更新磁贴和动态更新磁贴
    UWP Windows10开发获取设备位置(经纬度)
    Asp.Net识别手机访问
  • 原文地址:https://www.cnblogs.com/xiaomaohai/p/6157113.html
Copyright © 2020-2023  润新知