Thursday, February 5, 2015

ABAP TIP How to find out the table in which multiple data elements are used


Chapter 096
How to find out the table in which multiple data elements are used
Source : http://abapjoy.blogspot.com

When developing program, there are occasions when you need to find out in which table data element is used. The sap standard function offers the way which is only available with only one data element.

You can search the table in which multiple data elements are used with the below program.




REPORT  Z_WHEREUSEDLIST.

TABLES : rsrd1.

TYPE-POOLS : slis.
* Types declaration.
TYPES : BEGIN OF ty_where,
          tabname TYPE tabname,
          fieldname TYPE fieldname,
          rollname TYPE rollname,
        END OF ty_where,

        BEGIN OF ty_input,
          element TYPE rsrd1-ddtype_val,
        END OF ty_input,

        BEGIN OF ty_table,
          tabname TYPE tabname,
        END OF ty_table,

        BEGIN OF ty_result,
          tabname TYPE tabname,
        END OF ty_result,

        BEGIN OF ty_display,
          tabname TYPE tabname,
          ddtext TYPE as4text,
        END OF ty_display.

* Internal tables declaration.
DATA  : it_where TYPE TABLE OF ty_where,
        it_input TYPE TABLE OF ty_input,
        it_table TYPE TABLE OF ty_table,
        it_result TYPE TABLE OF ty_result,
        it_display TYPE TABLE OF ty_display,
        it_fcat TYPE slis_t_fieldcat_alv,
        it_bdcdata TYPE TABLE OF bdcdata.

* Work areas declaration.
DATA  : wa_where TYPE ty_where,
        wa_input TYPE ty_input,
        wa_table TYPE ty_table,
        wa_result TYPE ty_result,
        wa_display TYPE ty_display,
        wa_fcat TYPE slis_fieldcat_alv,
        wa_layout TYPE slis_layout_alv,
        wa_bdcdata TYPE bdcdata.

DATA  : v_flag TYPE i,
        v_title TYPE string,
        v_text(70) TYPE c,
        v_strlen TYPE i,
        v_tabname TYPE tabname.

INITIALIZATION.

* Disabling select-options high option.
   LOOP  AT SCREEN.
    IF screen-name = 'S_TYPE-HIGH'.
      screen-input = 0.
      screen-output = 0.
      screen-invisible = 1.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.
* Selection screen.
  SELECTION-SCREEN BEGIN OF BLOCK b WITH FRAME TITLE text-000.
  SELECT-OPTIONS : s_type FOR rsrd1-ddtype_val.
  SELECTION-SCREEN END OF BLOCK b.

* Tables selection
START-OF-SELECTION.
  PERFORM get_tablenames.
  PERFORM get_multiple_matches.
END-OF-SELECTION.


  PERFORM create_fcat USING : 'TABNAME' 1 'Table name',
                              'DDTEXT' 2 'Short description'.
  PERFORM display_result.

FORM create_fcat  USING v_fieldname TYPE c
                        v_colpos TYPE i
                        v_text TYPE c.
  CLEAR wa_fcat.
  wa_fcat-fieldname = v_fieldname.
  wa_fcat-col_pos = v_colpos.
  wa_fcat-seltext_l = v_text.
  wa_fcat-tabname = 'T_DISPLAY'.
  APPEND wa_fcat TO it_fcat.
ENDFORM.                    " CREATE_FCAT

FORM display_result .
  wa_layout-colwidth_optimize = 'X'.
  v_title = 'Where used list for-'.
  LOOP AT it_input INTO wa_input.
      CONCATENATE v_title wa_input-element ', ' INTO v_title.
  ENDLOOP.
  v_strlen = STRLEN( v_title ) - 1.
  v_title = v_title+0(v_strlen).
  v_text = v_title.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program      = sy-repid
      i_callback_user_command = 'USER_COMMAND'
      i_grid_title            = v_text
      is_layout               = wa_layout
      it_fieldcat             = it_fcat
    TABLES
      t_outtab                = it_display.
ENDFORM.                    " DISPLAY_RESULT

FORM user_command USING uco TYPE sy-ucomm sf TYPE slis_selfield.
  v_tabname = sf-value.
  SELECT SINGLE
    tabname
  FROM
    dd03vv
  INTO
    v_tabname
  WHERE tabname = v_tabname.
  IF sy-subrc = 0.
    PERFORM bdc_dynpro      USING 'SAPMSRD0' '0102'.
    PERFORM bdc_field       USING 'BDC_CURSOR'
                                  'RSRD1-TBMA_VAL'.
    PERFORM bdc_field       USING 'BDC_OKCODE'
                                  '=SHOW'.
    PERFORM bdc_field       USING 'RSRD1-TBMA'
                                  'X'.
    PERFORM bdc_field       USING 'RSRD1-TBMA_VAL'
                                  sf-value.
    PERFORM bdc_dynpro      USING 'SAPLSD41' '2200'.
    CALL TRANSACTION 'SE11' USING it_bdcdata MODE 'E' UPDATE 'S'.
    CLEAR it_bdcdata[].
  ENDIF.
ENDFORM.                    "USER_COMMAND

FORM bdc_dynpro USING program dynpro.
  CLEAR wa_bdcdata.
  wa_bdcdata-program  = program.
  wa_bdcdata-dynpro   = dynpro.
  wa_bdcdata-dynbegin = 'X'.
  APPEND wa_bdcdata TO it_bdcdata.
ENDFORM.                    "bdc_dynpro

FORM bdc_field USING fnam fval.
  CLEAR wa_bdcdata.
  wa_bdcdata-fnam = fnam.
  wa_bdcdata-fval = fval.
  APPEND wa_bdcdata TO it_bdcdata.
ENDFORM.                    " bdc_field

FORM get_tablenames.

* Consolidating selection inputs into an internal table.
  LOOP AT s_type.
    wa_input-element = s_type-low.
    APPEND wa_input TO it_input.
  ENDLOOP.

* Selecting the table names having the input data elements.
  SELECT
    tabname
    fieldname
    rollname
  FROM
    dd03vv
  INTO TABLE
    it_where
  FOR ALL ENTRIES IN it_input
  WHERE
    rollname   = it_input-element AND
    as4local   = 'A' AND
    ( tabclass = 'TRANSP' OR
      tabclass = 'CLUSTER' OR
      tabclass = 'POOL' ).

* Segregating the table names.
  LOOP AT it_where INTO wa_where.
    wa_table-tabname = wa_where-tabname.
    APPEND wa_table TO it_table.
  ENDLOOP.
  SORT it_table BY tabname.
  DELETE ADJACENT DUPLICATES FROM it_table COMPARING ALL FIELDS.


ENDFORM.                    " GET_TABLENAMES

FORM get_multiple_matches .

* Selecting the tables which are having all the input table names.
  LOOP AT it_table INTO wa_table.
    v_flag = 0.
    LOOP AT it_input INTO wa_input.
      READ TABLE it_where INTO wa_where WITH KEY

                                        tabname = wa_table-tabname
                                        rollname = wa_input-element.
      IF sy-subrc NE 0.
        v_flag = 1.
      ENDIF.
    ENDLOOP.
    IF v_flag = 0.
      wa_result-tabname = wa_table.
      APPEND wa_result TO it_result.
    ENDIF.
  ENDLOOP.

* Retrieving table's short description.
  IF it_result[] IS NOT INITIAL.
    SELECT
      tabname
      ddtext
    FROM
      dd02t
    INTO TABLE
      it_display
    FOR ALL ENTRIES IN it_result
      WHERE
        tabname = it_result-tabname.
    IF sy-subrc = 0.
      SORT it_display BY tabname ddtext.
      DELETE ADJACENT DUPLICATES FROM it_display COMPARING tabname.
    ENDIF.
  ENDIF.
ENDFORM.                    " GET_MULTIPLE_MATCHES



No comments:

Post a Comment