Skip to Content
Technical Articles
Author's profile photo Lakshminarasimhan Narasimhamurthy

ABAP Code identification/Search in SAP BW or SAP BW/4HANA system

Introduction

I need to search a piece of ABAP code in my SAP BW system or in the SAP BW/4HANA System over the Custom/Standard Class/Methods, Start Routine, End Routine, Expert routines, Transformations, Include Programs and on Custom/Standard Function modules.

There was a situation for me to find a particular function module used in all of the transformations and in the custom datasource’s within the SAP BW system and “where used list” on the function module did not highlight the transformations or start or end or expert routines where the function module was used. There was one more requirement to identify where all “Select * ” had been used in all the transformations, datasource’s and to fix the “*” with required fields. So I came up with this program to identify the code snippets used. This can be used in ECC system too if you are using the Embedded Analytics within the ECC system.

This blog is an enhancement to the blog spot Code search in the SAP BW | SAP Blogs

 

Applies to:

SAP BW 7.x system and BW/4HANA systems,

 

Summary

This Document describes how to search within the SAP BW start, end, expert routines, transformations, custom methods(BADI’s), Include Programs and custom function modules within the SAP BW system.

Author          : Lakshminarasimhan Narasimhamurthy

Created on   : 03/JAN/2021

Body

Requirement

Many a times, code within the SAP BW system will be in the methods of BADI, inside of the Transformations, Function modules and in the Include programs. For example if I need to find the code/logic used for a customer exit variable in SAP BW system, then I need to manually search in all the BADI’s/Methods. Manual search is complex and time consuming, hence I created a program and this program makes the code search easy, just i will type the code snippet to be searched then the output will be in the form of ALV grid showing line numbers and the area where the code is being used.

 

Note

The existing program searches in custom class/methods and custom Include Programs and in custom Function Modules. This can be changed by modifying the code as below, but i dont recommend this as search will take a long time.

select clsname from seoclass into table lt_clsname bypassing buffer
where clsname like ‘Z%’ . —> Remove the where clause to search in all class and methods 

 

select progname from reposrc into table lt_include_programs where
r3state ‘A’ and progname like ‘LZ%UXX’ or progname like ‘LZ%TOP’). —> Remove the “and ( progname like ‘LZ%UXX’ or progname like ‘LZ%TOP’)” to search in all Include programs.

 

select from tfdir into table lt_tfdir where funcname like ‘Z%’. —> Remove the where clause to search in all function modules

 

ABAP Code 

*&---------------------------------------------------------------------*
*& Report  ZBW_CODE_SEARCH
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
************************************************************************
*  Program Title        : Code Search in SAP BW system                 *
*  Description          : To search code snippet in the                *
*                       : Start Routine, End Routine, Expert Routine,  *
*                       : of all the transformations(SAP               *
*                       : as well as user defined transformations).In  *
*                       : User defined Class as well as Methods(Z*).   *
*                       : In case of classes, Include program,         *
*                       : & Function module only the custom generated  *
*                       : objects are considered.(Z* Objects).          *
*                       : count of lines of code added to the display  *
*----------------------------------------------------------------------*
report zbw_code_search.

type-pools : slis.                    " ALV Grid display

types : begin of lty_tranid,
          tranid       type rstranid,
          startroutine type  rssguid25,
          endroutine   type  rssguid25,
          expert       type  rssguid25,
          sourcename   type sobj_name,
          targetname   type sobj_name,
          tranprog     type rstran_progid,
        end of lty_tranid.

types : begin of lty_abap_code,
          codeid  type rscodeid,
          line_no type rslineno,
          line    type string,
        end of lty_abap_code.

types: begin of lty_abap_det,
         tranid     type rstranid,    " Transaction ID
         routine    type c length 25, " Start or end or expert
         targetname type sobj_name,   " source of the transformation
         sourcename type sobj_name,   " target of the transformation
         string     type string,     " String which was searched
       end of  lty_abap_det.

types: begin of lty_class_det,
         class_name type seoclsname,    " Class Name
         method     type seocpdname,    " Method Name
         string     type string,       " String which was searched
       end of  lty_class_det.

types: begin of lty_include_prgm_det,
         progname type progname,    " Include Program Name
         string   type string,     " String which was searched
       end of  lty_include_prgm_det.

types: begin of lty_fm_det,
         fm     type progname,    " Function Module Name
         string type string,     " String which was searched
       end of  lty_fm_det.

types : begin of lty_objects,
          objects type c length 20, " Type of Objects(Transformation, Class, Include and Function Module
          lines   type i,
        end of lty_objects.

types : begin of lty_code_table,
          line   type i,
          string type string,
        end of lty_code_table.


data : lt_tranid           type standard table of lty_tranid,
       lt_tranid_1         type standard table of lty_tranid,
       la_tranid           type                   lty_tranid,
       lt_abap             type standard table of lty_abap_code,
       la_abap             type                   lty_abap_code,
       lt_abap_det_start   type standard table of lty_abap_det,
       lt_abap_det_end     type standard table of lty_abap_det,
       lt_abap_det_expert  type standard table of lty_abap_det,
       lt_abap_det_1       type standard table of lty_abap_det,
       la_abap_det         type                   lty_abap_det,
       la_abap_det_1       type                   lty_abap_det,
       source              type                   seop_source_string,
       wa_source           like line of           source,
       source_1            type                   seop_source_string,
       cifkey              type                   seoclskey,
       cifref              type ref to            if_oo_clif_incl_naming,
       clsref              type ref to            if_oo_class_incl_naming,
       pool_source         type                   seop_source_string,
       source_line         type line of           seop_source_string,
       tabix               type                   sytabix,
       l_string            type                   string,
       includes            type                   seop_methods_w_include,
       include             type                   seop_method_w_include,
       lt_clsname          type standard table of seoclsname,
       la_clsname          type                   seoclsname,
       la_class_det        type                   lty_class_det,
       lv_code_row_no      type                   c length 10,
       lt_class_det        type standard table of lty_class_det,
       la_object           type                   lty_objects,
       lt_object           type standard table of lty_objects,
       lt_include_programs type standard table of progname,
       la_include_programs type                   progname,
       la_fm_prg_name      type                   progname,
       lt_include_prgm_det type standard table of lty_include_prgm_det,
       la_include_prgm_det type                   lty_include_prgm_det,
       lt_fm_det           type standard table of lty_fm_det,
       la_fm_det           type                   lty_fm_det,
       lt_tfdir            type standard table of tfdir,
       la_tfdir            type                   tfdir,
       lv_tran_prgm        type                   progname,
       la_code_table       type                   lty_code_table,
       lt_code_table       type standard table of lty_code_table,
       lv_tabix            type                   syst-tabix,
       lv_tabix_1          type                   syst-tabix,
       lv_lines            type                   i.
*********************** ALV Grid *********************************
data: fieldcatalog         type slis_t_fieldcat_alv with header line,
      gd_layout            type slis_layout_alv,
      fieldcatalog_objects type slis_t_fieldcat_alv with header line.

gd_layout-colwidth_optimize = abap_true.
*********************** ALV Grid *********************************

selection-screen begin of block b1 with frame title text-001.
parameters : line          type edpline obligatory. " String Input/Code snippet which needs to be searched
selection-screen end of block b1.

select
tranid
startroutine
endroutine
expert
sourcename
targetname
tranprog
from
rstran  as a          " Transformation Table
into table lt_tranid bypassing buffer
where
a~objvers = 'A'
and
( startroutine <> ' ' or  endroutine <> ' ' or expert <> ' ' ). " Picking only records where the routines are not empty

if sy-subrc  = 0. " If Entries are present in the table LT_TRANID

  select
  b~codeid
  b~line_no
  b~line
  from
  rsaabap  as  b  " ABAP routine - source code
  into table lt_abap
  for all entries in
  lt_tranid
  where b~codeid = lt_tranid-startroutine or
  b~codeid = lt_tranid-endroutine or
  b~codeid = lt_tranid-expert.


  if sy-subrc = 0. " Entries are present in the table  LT_ABAP

    " Start Routine, End Routine and Expert Routine only
    loop at lt_tranid into la_tranid. " Looping for every transaction Id

      loop  at lt_abap into la_abap where codeid = la_tranid-startroutine.

        if la_abap-line cs line.

          la_abap_det-tranid  = la_tranid-tranid. " Transaction ID
          la_abap_det-routine = 'START'.          " Start
          la_abap_det-sourcename  = la_tranid-sourcename. " Source name
          la_abap_det-targetname  = la_tranid-targetname. " Target name
          shift la_abap-line left deleting leading space.
          la_abap_det-string = la_abap-line.

          append la_abap_det to lt_abap_det_start.

        endif.

      endloop.

      loop  at lt_abap into la_abap where codeid = la_tranid-endroutine.

        if la_abap-line cs line.

          la_abap_det-tranid  = la_tranid-tranid. " Transaction ID
          la_abap_det-routine = 'END'.            " End
          la_abap_det-sourcename  = la_tranid-sourcename. " Source name
          la_abap_det-targetname  = la_tranid-targetname. " Target name
          shift la_abap-line left deleting leading space.
          la_abap_det-string = la_abap-line.

          append la_abap_det to lt_abap_det_end.

        endif.

      endloop.

      loop  at lt_abap into la_abap where codeid = la_tranid-expert.

        if la_abap-line cs line.
          la_abap_det-tranid  = la_tranid-tranid. " Transaction ID
          la_abap_det-routine = 'EXPERT'.          " Expert
          la_abap_det-sourcename  = la_tranid-sourcename. " Source name
          la_abap_det-targetname  = la_tranid-targetname. " Target name
          shift la_abap-line left deleting leading space.
          la_abap_det-string = la_abap-line.

          append la_abap_det to lt_abap_det_expert.

        endif.

      endloop.

    endloop.
  endif.
endif.

" Selecting only Custom classes
" Only the Custom classes are created for Variables exit / F4 Exit / Virtual Char Exit etc and start with 'Z'
select clsname from seoclass into table lt_clsname bypassing buffer
where clsname like 'Z%' . 
" Remove the where clause to search in all classes, not only in Custom classes

loop at lt_clsname into la_clsname.

  clear : la_class_det, source.

  cifkey = la_clsname.
  " Search in class
  " In the classes we use variables exit and F4 exit
  call method cl_oo_include_naming=>get_instance_by_cifkey
    exporting
      cifkey = cifkey
    receiving
      cifref = cifref
    exceptions
      others = 1.

  if sy-subrc <> 0.
* Implement suitable error handling here

  else.

    case cifref->clstype.
      when seoc_clstype_class.
        clsref ?= cifref.
        read report clsref->class_pool
          into pool_source.

        read report clsref->locals_old
          into source.
        loop at source
          into source_line.
          if source_line ns '*"*'.
            if source_line cs line and source_line is not initial.
              shift source_line left deleting leading space.
              lv_code_row_no = sy-tabix.
              concatenate lv_code_row_no source_line into source_line separated by space.
              la_class_det-class_name = la_clsname.
              la_class_det-string = source_line.
              append la_class_det to lt_class_det.
            endif.
          endif.
        endloop.
        read report clsref->locals_def
          into source.
        loop at source
          into source_line.
          if source_line ns '*"*'.
            if source_line cs line and source_line is not initial.
              shift source_line left deleting leading space.
              lv_code_row_no = sy-tabix.
              concatenate lv_code_row_no source_line into source_line separated by space.
              la_class_det-class_name = la_clsname.
              la_class_det-string = source_line.
              append la_class_det to lt_class_det.
            endif.
          endif.
        endloop.
        read report clsref->locals_imp
          into source.
        loop at source
          into source_line.
          if source_line ns '*"*'.
            if source_line cs line and source_line is not initial.
              shift source_line left deleting leading space.
              lv_code_row_no = sy-tabix.
              concatenate lv_code_row_no source_line into source_line separated by space.
              la_class_det-class_name = la_clsname.
              la_class_det-string = source_line.
              append la_class_det to lt_class_det.
            endif.
          endif.
        endloop.
        read report clsref->macros
          into source.
        loop at source
          into source_line.
          if source_line ns '*"*'.
            if source_line cs line and source_line is not initial.
              shift source_line left deleting leading space.
              lv_code_row_no = sy-tabix.
              concatenate lv_code_row_no source_line into source_line separated by space.
              la_class_det-class_name = la_clsname.
              la_class_det-string = source_line.
              append la_class_det to lt_class_det.
            endif.
          endif.
        endloop.
        read report clsref->public_section
          into source.
        loop at source
          into source_line.
          if source_line ns '*"*'.
            if source_line cs line and source_line is not initial.
              shift source_line left deleting leading space.
              lv_code_row_no = sy-tabix.
              concatenate lv_code_row_no source_line into source_line separated by space.
              la_class_det-class_name = la_clsname.
              la_class_det-string = source_line.
              append la_class_det to lt_class_det.
            endif.
          endif.
        endloop.

        read report clsref->protected_section
          into source.
        loop at source
          into source_line.
          if source_line ns '*"*'.
            if source_line cs line and source_line is not initial.
              shift source_line left deleting leading space.
              lv_code_row_no = sy-tabix.
              concatenate lv_code_row_no source_line into source_line separated by space.
              la_class_det-class_name = la_clsname.
              la_class_det-string = source_line.
              append la_class_det to lt_class_det.
            endif.
          endif.
        endloop.

        read report clsref->private_section
          into source.
        loop at source
          into source_line.
          if source_line ns '*"*'.
            if source_line cs line and source_line is not initial.
              shift source_line left deleting leading space.
              lv_code_row_no = sy-tabix.
              concatenate lv_code_row_no source_line into source_line separated by space.
              la_class_det-class_name = la_clsname.
              la_class_det-string = source_line.
              append la_class_det to lt_class_det.
            endif.
          endif.
        endloop.
        concatenate 'CLASS' cifkey 'IMPLEMENTATION' into l_string separated by space.
        loop at pool_source
          from tabix
          into source_line.
          if source_line cs 'ENDCLASS'.
            if ( source_line cs line and source_line is not initial ).
              shift source_line left deleting leading space.
              lv_code_row_no = sy-tabix.
              concatenate lv_code_row_no source_line into source_line separated by space.
              la_class_det-class_name = la_clsname.
              la_class_det-string = source_line.
              append la_class_det to lt_class_det.
            endif.
          endif.
        endloop.
* method implementation
        includes = clsref->get_all_method_includes( ).
        loop at includes
          into include.
          read report include-incname
            into source.
          loop at source
            into source_line.
            if source_line cs line.
              if source_line is not initial.
                shift source_line left deleting leading space.
                lv_code_row_no = sy-tabix.
                concatenate lv_code_row_no source_line into source_line separated by space.
                la_class_det-class_name = la_clsname.
                la_class_det-method = include-cpdkey-cpdname.
                la_class_det-string = source_line.
                append la_class_det to lt_class_det.
              endif.
            endif.
          endloop.
        endloop.
    endcase.
  endif.
endloop.


" Include program
" Top include and UXX includes only
select progname from reposrc into table lt_include_programs where
r3state = 'A' and ( progname like 'LZ%UXX' or progname like 'LZ%TOP').
" The staement "and ( progname like 'LZ%UXX' or progname like 'LZ%TOP')" can be 
" removed to search in all Includes not only the Custom Includes

if sy-subrc = 0.
  loop at lt_include_programs into la_include_programs.

    read report la_include_programs into source.

    if sy-subrc = 0.
      loop at source
      into source_line.
        if source_line cs line.
          la_include_prgm_det-progname = la_include_programs.
          la_include_prgm_det-string   = source_line.
          append la_include_prgm_det to lt_include_prgm_det.
        endif.
      endloop.
    endif.

  endloop.
endif.

" Function modules
select * from tfdir into table lt_tfdir where funcname like 'Z%'.
" The code "where funcname like 'Z%'" can be removed to search in all Function Modules
" not only limiting it to Custom Function Modules

if sy-subrc = 0.
  loop at lt_tfdir into la_tfdir.

    replace 'SAP' in la_tfdir-pname with ''.
    condense la_tfdir-pname.

    concatenate la_tfdir-pname 'U' la_tfdir-include into la_tfdir-pname.

    read report la_tfdir-pname into source.

    if sy-subrc = 0.
      loop at source into source_line.
        if source_line cs line.
          la_fm_det-fm = la_tfdir-funcname.
          shift source_line left deleting leading space.
          lv_code_row_no = sy-tabix.
          concatenate lv_code_row_no source_line into source_line separated by space.
          condense source_line.
          la_fm_det-string = source_line.
          append la_fm_det to lt_fm_det.
        endif.
      endloop.
    endif.
  endloop.
endif.


" Transformations
" Code present in the areas other than
" start/end/expert routines
select
tranid
startroutine
endroutine
expert
sourcename
targetname
tranprog
from
rstran  as a          " Transformation Table
into table lt_tranid bypassing buffer
where
a~objvers = 'A'.

loop at lt_tranid into la_tranid.

  clear : lv_tran_prgm, source, lt_code_table, la_code_table, lv_tabix, lv_tabix_1.

  concatenate 'GP' la_tranid-tranprog into lv_tran_prgm.

  read report lv_tran_prgm into source.

  loop at source
  into source_line.

    la_code_table-line = syst-tabix.
    la_code_table-string = source_line.

    append la_code_table to lt_code_table.

  endloop.

  " End Routine removed
  loop at lt_code_table into la_code_table where string  cs 'method end_routine.'.

    lv_tabix = syst-tabix.

    loop at lt_code_table into la_code_table where string  cs 'endmethod.' and line >= lv_tabix.

      lv_tabix_1 = syst-tabix.
      exit.

    endloop.

    delete lt_code_table where line between lv_tabix and lv_tabix_1.

  endloop.

  " Start Routine removed
  loop at lt_code_table into la_code_table where string  cs 'method start_routine.'.

    lv_tabix = syst-tabix.

    loop at lt_code_table into la_code_table where string  cs 'endmethod.' and line >= lv_tabix.

      lv_tabix_1 = syst-tabix.
      exit.

    endloop.

    delete lt_code_table where line between lv_tabix and lv_tabix_1.

  endloop.

  loop at lt_code_table
    into la_code_table.

    if la_code_table-string cs line.
      if la_code_table-string is not initial.

        lv_code_row_no = la_code_table-line.
        shift la_code_table-string left deleting leading space.

        concatenate lv_code_row_no la_code_table-string into la_code_table-string separated by space.
        la_abap_det_1-sourcename = la_tranid-sourcename.
        la_abap_det_1-tranid = la_tranid-tranid.
        la_abap_det_1-targetname = la_tranid-targetname.
        la_abap_det_1-string = la_code_table-string.
        append la_abap_det_1 to lt_abap_det_1.

      endif.
    endif.
  endloop.


endloop.


fieldcatalog_objects-fieldname   = 'OBJECTS'.
fieldcatalog_objects-seltext_m   = 'OBJECTS'.
fieldcatalog_objects-outputlen  = '40'.
fieldcatalog_objects-row_pos = 1.
fieldcatalog_objects-col_pos = 1.
fieldcatalog_objects-hotspot = 'X'.

append fieldcatalog_objects to fieldcatalog_objects.
clear  fieldcatalog_objects.

fieldcatalog_objects-fieldname   = 'LINES'.
fieldcatalog_objects-seltext_m   = 'LINES COUNT'.
fieldcatalog_objects-outputlen  = '40'.
*fieldcatalog_objects-row_pos = 1.
fieldcatalog_objects-col_pos = 2.
*fieldcatalog_objects-hotspot = 'X'.

append fieldcatalog_objects to fieldcatalog_objects.
clear  fieldcatalog_objects.

la_object-objects = 'START ROUTINE'.
DESCRIBE TABLE lt_abap_det_start lines lv_lines.
la_object-lines = lv_lines.
append la_object to lt_object.

la_object-objects = 'END ROUTINE'.
DESCRIBE TABLE lt_abap_det_end lines lv_lines.
la_object-lines = lv_lines.
append la_object to lt_object.

la_object-objects = 'EXPERT ROUTINE'.
DESCRIBE TABLE lt_abap_det_expert lines lv_lines.
la_object-lines = lv_lines.
append la_object to lt_object.

la_object-objects = 'TRANFORMATIONS'.
DESCRIBE TABLE lt_abap_det_1 lines lv_lines.
la_object-lines = lv_lines.
append la_object to lt_object.

la_object-objects = 'CLASS'.
DESCRIBE TABLE lt_class_det lines lv_lines.
la_object-lines = lv_lines.
append la_object to lt_object.

la_object-objects = 'INCLUDE PROGRAMS'.
DESCRIBE TABLE lt_include_prgm_det lines lv_lines.
la_object-lines = lv_lines.
append la_object to lt_object.

la_object = 'FUNCTION MODULES'.
DESCRIBE TABLE lt_fm_det lines lv_lines.
la_object-lines = lv_lines.
append la_object to lt_object.


call function 'REUSE_ALV_GRID_DISPLAY'
  exporting
    i_callback_program      = sy-repid
    i_callback_user_command = 'USER_COMMAND'
    it_fieldcat             = fieldcatalog_objects[]
  tables
    t_outtab                = lt_object
  exceptions
    program_error           = 1
    others                  = 2.
if sy-subrc <> 0.
* Implement suitable error handling here
endif.



form user_command using fp_ucomm like sy-ucomm
                        fp_selfield type slis_selfield.

  clear : fieldcatalog, fieldcatalog[].

  if fp_ucomm = '&IC1'.

    if fp_selfield-value = 'START ROUTINE'.

      fieldcatalog-fieldname   = 'TRANID'.
      fieldcatalog-seltext_m   = 'TRANSFORMATION'.
      fieldcatalog-outputlen  = '40'.
      append fieldcatalog to fieldcatalog.
      clear  fieldcatalog.

      fieldcatalog-fieldname   = 'ROUTINE'.
      fieldcatalog-seltext_m   = 'ROUTINE'.
      fieldcatalog-outputlen  = '20'.
      append fieldcatalog to fieldcatalog.
      clear  fieldcatalog.

      fieldcatalog-fieldname   = 'SOURCENAME'.
      fieldcatalog-seltext_m   = 'SOURCE'.
      fieldcatalog-outputlen  = '50'.
      append fieldcatalog to fieldcatalog.
      clear  fieldcatalog.

      fieldcatalog-fieldname   = 'TARGETNAME'.
      fieldcatalog-seltext_m   = 'TARGET'.
      fieldcatalog-outputlen  = '30'.
      append fieldcatalog to fieldcatalog.
      clear  fieldcatalog.

      fieldcatalog-fieldname   = 'STRING'.
      fieldcatalog-seltext_m   = 'SEARCHED STRING'.
      fieldcatalog-outputlen  = '72'.
      append fieldcatalog to fieldcatalog.
      clear  fieldcatalog.

      call function 'REUSE_ALV_GRID_DISPLAY'
        exporting
          i_callback_program = sy-repid
          it_fieldcat        = fieldcatalog[]
          i_save             = 'X'
*         IS_VARIANT         = G_VARIANT
        tables
          t_outtab           = lt_abap_det_start
        exceptions
          program_error      = 1
          others             = 2.

      if sy-subrc <> 0.
*     MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*             WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      endif.

    elseif fp_selfield-value = 'END ROUTINE'.

      fieldcatalog-fieldname   = 'TRANID'.
      fieldcatalog-seltext_m   = 'TRANSFORMATION'.
      fieldcatalog-outputlen  = '40'.
      append fieldcatalog to fieldcatalog.
      clear  fieldcatalog.

      fieldcatalog-fieldname   = 'ROUTINE'.
      fieldcatalog-seltext_m   = 'ROUTINE'.
      fieldcatalog-outputlen  = '20'.
      append fieldcatalog to fieldcatalog.
      clear  fieldcatalog.

      fieldcatalog-fieldname   = 'SOURCENAME'.
      fieldcatalog-seltext_m   = 'SOURCE'.
      fieldcatalog-outputlen  = '50'.
      append fieldcatalog to fieldcatalog.
      clear  fieldcatalog.

      fieldcatalog-fieldname   = 'TARGETNAME'.
      fieldcatalog-seltext_m   = 'TARGET'.
      fieldcatalog-outputlen  = '30'.
      append fieldcatalog to fieldcatalog.
      clear  fieldcatalog.

      fieldcatalog-fieldname   = 'STRING'.
      fieldcatalog-seltext_m   = 'SEARCHED STRING'.
      fieldcatalog-outputlen  = '72'.
      append fieldcatalog to fieldcatalog.
      clear  fieldcatalog.

      call function 'REUSE_ALV_GRID_DISPLAY'
        exporting
          i_callback_program = sy-repid
          it_fieldcat        = fieldcatalog[]
          i_save             = 'X'
*         IS_VARIANT         = G_VARIANT
        tables
          t_outtab           = lt_abap_det_end
        exceptions
          program_error      = 1
          others             = 2.

      if sy-subrc <> 0.
*     MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*             WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      endif.

    elseif fp_selfield-value = 'EXPERT ROUTINE'.

      fieldcatalog-fieldname   = 'TRANID'.
      fieldcatalog-seltext_m   = 'TRANSFORMATION'.
      fieldcatalog-outputlen  = '40'.
      append fieldcatalog to fieldcatalog.
      clear  fieldcatalog.

      fieldcatalog-fieldname   = 'ROUTINE'.
      fieldcatalog-seltext_m   = 'ROUTINE'.
      fieldcatalog-outputlen  = '20'.
      append fieldcatalog to fieldcatalog.
      clear  fieldcatalog.

      fieldcatalog-fieldname   = 'SOURCENAME'.
      fieldcatalog-seltext_m   = 'SOURCE'.
      fieldcatalog-outputlen  = '50'.
      append fieldcatalog to fieldcatalog.
      clear  fieldcatalog.

      fieldcatalog-fieldname   = 'TARGETNAME'.
      fieldcatalog-seltext_m   = 'TARGET'.
      fieldcatalog-outputlen  = '30'.
      append fieldcatalog to fieldcatalog.
      clear  fieldcatalog.

      fieldcatalog-fieldname   = 'STRING'.
      fieldcatalog-seltext_m   = 'SEARCHED STRING'.
      fieldcatalog-outputlen  = '72'.
      append fieldcatalog to fieldcatalog.
      clear  fieldcatalog.

      call function 'REUSE_ALV_GRID_DISPLAY'
        exporting
          i_callback_program = sy-repid
          it_fieldcat        = fieldcatalog[]
          i_save             = 'X'
*         IS_VARIANT         = G_VARIANT
        tables
          t_outtab           = lt_abap_det_expert
        exceptions
          program_error      = 1
          others             = 2.

      if sy-subrc <> 0.
*     MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*             WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      endif.

    elseif fp_selfield-value = 'TRANFORMATIONS'.

      fieldcatalog-fieldname   = 'TRANID'.
      fieldcatalog-seltext_m   = 'TRANSFORMATION'.
      fieldcatalog-outputlen  = '40'.
      append fieldcatalog to fieldcatalog.
      clear  fieldcatalog.

      fieldcatalog-fieldname   = 'SOURCENAME'.
      fieldcatalog-seltext_m   = 'SOURCE'.
      fieldcatalog-outputlen  = '50'.
      append fieldcatalog to fieldcatalog.
      clear  fieldcatalog.

      fieldcatalog-fieldname   = 'TARGETNAME'.
      fieldcatalog-seltext_m   = 'TARGET'.
      fieldcatalog-outputlen  = '30'.
      append fieldcatalog to fieldcatalog.
      clear  fieldcatalog.

      fieldcatalog-fieldname   = 'STRING'.
      fieldcatalog-seltext_m   = 'SEARCHED STRING'.
      fieldcatalog-outputlen  = '72'.
      append fieldcatalog to fieldcatalog.
      clear  fieldcatalog.

      call function 'REUSE_ALV_GRID_DISPLAY'
        exporting
          i_callback_program = sy-repid
          it_fieldcat        = fieldcatalog[]
          i_save             = 'X'
*         IS_VARIANT         = G_VARIANT
        tables
          t_outtab           = lt_abap_det_1
        exceptions
          program_error      = 1
          others             = 2.

      if sy-subrc <> 0.
*     MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*             WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      endif.

    elseif fp_selfield-value = 'CLASS'.

      fieldcatalog-fieldname   = 'CLASS_NAME'.
      fieldcatalog-seltext_m   = 'Class Name'.
      fieldcatalog-outputlen  = '40'.
      append fieldcatalog to fieldcatalog.
      clear  fieldcatalog.

      fieldcatalog-fieldname   = 'METHOD'.
      fieldcatalog-seltext_m   = 'Method Name'.
      fieldcatalog-outputlen  = '61'.
      append fieldcatalog to fieldcatalog.
      clear  fieldcatalog.

      fieldcatalog-fieldname   = 'STRING'.
      fieldcatalog-seltext_m   = 'String'.
      fieldcatalog-outputlen  = '20'.
      append fieldcatalog to fieldcatalog.
      clear  fieldcatalog.

      call function 'REUSE_ALV_GRID_DISPLAY'
        exporting
          i_callback_program = sy-repid
          it_fieldcat        = fieldcatalog[]
          is_layout          = gd_layout
*         i_save             = 'X'
        tables
          t_outtab           = lt_class_det
        exceptions
          program_error      = 1
          others             = 2.

      if sy-subrc <> 0.
* Implement suitable error handling here
      endif.

    elseif fp_selfield-value = 'INCLUDE PROGRAMS'.

      fieldcatalog-fieldname   = 'PROGNAME'.
      fieldcatalog-seltext_m   = 'Include Program Name'.
      fieldcatalog-outputlen  = '40'.
      append fieldcatalog to fieldcatalog.
      clear  fieldcatalog.

      fieldcatalog-fieldname   = 'STRING'.
      fieldcatalog-seltext_m   = 'String'.
      fieldcatalog-outputlen  = '61'.
      append fieldcatalog to fieldcatalog.
      clear  fieldcatalog.

      call function 'REUSE_ALV_GRID_DISPLAY'
        exporting
          i_callback_program = sy-repid
          it_fieldcat        = fieldcatalog[]
          is_layout          = gd_layout
*         i_save             = 'X'
        tables
          t_outtab           = lt_include_prgm_det
        exceptions
          program_error      = 1
          others             = 2.

    elseif fp_selfield-value = 'FUNCTION MODULES'.

      fieldcatalog-fieldname   = 'FM'.
      fieldcatalog-seltext_m   = 'Function Module Name'.
      fieldcatalog-outputlen  = '40'.
      append fieldcatalog to fieldcatalog.
      clear  fieldcatalog.

      fieldcatalog-fieldname   = 'STRING'.
      fieldcatalog-seltext_m   = 'String'.
      fieldcatalog-outputlen  = '61'.
      append fieldcatalog to fieldcatalog.
      clear  fieldcatalog.

      call function 'REUSE_ALV_GRID_DISPLAY'
        exporting
          i_callback_program = sy-repid
          it_fieldcat        = fieldcatalog[]
          is_layout          = gd_layout
*         i_save             = 'X'
        tables
          t_outtab           = lt_fm_det
        exceptions
          program_error      = 1
          others             = 2.
    endif.
  endif.
endform.

Example

Execute the program, then i need to find where all the “select *” is used and then change it to select <fields list>.

press F8 or execute button,then the output will be as below.

Then if i click on start routine the drill down will show the below.

 

Conclusion

This way i can search for the custom codes or even standard codes used within the SAP BW or SAP BW/4HANA system.

Assigned tags

      6 Comments
      You must be Logged on to comment or reply to a post.
      Author's profile photo Julien BOILET
      Julien BOILET

      Thanks for you post! it's a very friendly program.

      • What are the major differences with RS_ABAP_SOURCE_SCAN?
      • AMDP lookup seems to be missing, Am I wrong?

       

      Author's profile photo Lakshminarasimhan Narasimhamurthy
      Lakshminarasimhan Narasimhamurthy
      Blog Post Author
      • "What are the major differences with RS_ABAP_SOURCE_SCAN?"RS_ABAP_SOURCE_SCAN gives only the program id, but the program will give the exact transformation and the source and target, hence it will be easy for the developer to check the code.
      • "AMDP lookup seems to be missing, Am I wrong?" The program includes the ABAP class and methods, hence by default it must appear, still let me check and confirm
      Author's profile photo Oscar Alberto Sanchez Verduzco
      Oscar Alberto Sanchez Verduzco

      Great post and thanks for sharing!!

      It works like a charm!!

      Regards!

       

      Author's profile photo Lakshminarasimhan Narasimhamurthy
      Lakshminarasimhan Narasimhamurthy
      Blog Post Author

      Happy that it was useful for you 😊

      Author's profile photo RBEI AMS Support
      RBEI AMS Support

      Hello ,

       

      Nice post and got this right in time of my requirement.  It eased my job.

       i have a doubt.. we do write customer exit in CMOD - include ZXRSRU01.

      this program doesn't get this include isnt ? correct me if am wrong.

       

       

      Thanks,

      Annapoorani

      Author's profile photo Lakshminarasimhan Narasimhamurthy
      Lakshminarasimhan Narasimhamurthy
      Blog Post Author

      Hi Annapoorani,

       

      Happy that the program helped you. 

       

      The code will consider all the Include program and top include, provided they are active and they have the naming convention as highlighted below. If use a different naming convention like Y* then you could change the code accordingly.

       

      select progname from reposrc into table lt_include_programs where
      r3state 'A' and progname like 'LZ%UXX' or progname like 'LZ%TOP').