Birden Çok Alan Adı İle Tablo Bulma

blog-cover
Tarafından gönderildi: Koras Teknoloji Yorumlar: 0

Fonksiyonel ve teknik danışmanların projelerde en sıkıntılı konularından biri de tablolar arasındaki join konusudur. Aşağıdaki kod yapısnı SE38 işlem kodundan aktif hale getirip birden fazla alan adını girip ortak tablolarını bulabilirsiniz.

Bu çözüm sadece tablolar için geçerlidir.

Seçim ekranına bulmak istediğimiz alanları yazıyoruz.

Table Finder Selection Screen

 

Çalıştır dediğimizde ALV olarak ortak alanların olduğu tablolar sıralanıyor.

 

Table Finder ALV Screen

 

REPORT ztable_finder_xmkoc.
TABLES: dd03l,
        boole.
DATA:dref TYPE REF TO data.
FIELD-SYMBOLS:<table> TYPE STANDARD TABLE.
TYPE-POOLS: slis, icon.
* Internal Tables
TYPES: BEGIN OF t_ialv,
         tabname TYPE dd03l-tabname,
         field1  TYPE dd03l-fieldname,
         field2  TYPE dd03l-fieldname,
         field3  TYPE dd03l-fieldname,
         field4  TYPE dd03l-fieldname,
       END OF t_ialv .
DATA: ialv   TYPE STANDARD TABLE OF t_ialv,
      wa_alv TYPE t_ialv.
DATA: alv_container TYPE REF TO cl_gui_custom_container,
      alv_grid      TYPE REF TO cl_gui_alv_grid,
      ok_code       LIKE sy-ucomm,
      fieldcat      TYPE slis_t_fieldcat_alv WITH HEADER LINE.
SELECT-OPTIONS:s_field1 FOR dd03l-fieldname NO-EXTENSION,
s_field2 FOR dd03l-fieldname NO-EXTENSION,
s_field3 FOR dd03l-fieldname NO-EXTENSION,
s_field4 FOR dd03l-fieldname NO-EXTENSION,
s_exc FOR boole-boole.
FIELD-SYMBOLS:<fs-tab13> TYPE mandt.
DATA:wa_dd1      TYPE dd03l,
     wa_dd2      TYPE dd03l,
     wa_dd3      TYPE dd03l,
     wa_dd4      TYPE dd03l,
     lv_tab      TYPE dd03l-tabname,
     wa_dd_final TYPE dd03l.
IF s_exc-low IS NOT INITIAL.
  lv_tab = '/%'.
ENDIF.
IF s_field1-low IS NOT INITIAL.
  SELECT c~tabname
    FROM ( ( dd03l AS c
         INNER JOIN dd02v AS p ON p~tabname  = c~tabname
                              AND p~tabclass = 'TRANSP')
*                              AND p~cityto   = @cityto )
         INNER JOIN dd09l AS f ON f~tabname = p~tabname )
    WHERE ( ( c~rollname EQ @s_field1-low )
    OR ( c~fieldname EQ @s_field1-low  ) )
    AND p~tabname NOT LIKE @lv_tab
       INTO TABLE @DATA(itab13).
ENDIF.
IF s_field2-low IS NOT INITIAL.
  SELECT c~tabname
  FROM ( ( dd03l AS c
       INNER JOIN dd02v AS p ON p~tabname  = c~tabname
                            AND p~tabclass = 'TRANSP')
*                              AND p~cityto   = @cityto )
       INNER JOIN dd09l AS f ON f~tabname = p~tabname )
  WHERE ( ( c~rollname EQ @s_field2-low )
  OR ( c~fieldname EQ @s_field2-low  )    )
  AND p~tabname NOT LIKE @lv_tab
     INTO TABLE @DATA(itab14).
ENDIF.
IF s_field3-low IS NOT INITIAL.
  SELECT c~tabname
  FROM ( ( dd03l AS c
       INNER JOIN dd02v AS p ON p~tabname  = c~tabname
                            AND p~tabclass = 'TRANSP')
       INNER JOIN dd09l AS f ON f~tabname = p~tabname )
  WHERE ( ( c~rollname EQ @s_field3-low )
OR ( c~fieldname EQ @s_field3-low  )    )
  AND p~tabname NOT LIKE @lv_tab
     INTO TABLE @DATA(itab15).
ENDIF.
IF s_field4-low IS NOT INITIAL.
  SELECT c~tabname
FROM ( ( dd03l AS c
     INNER JOIN dd02v AS p ON p~tabname  = c~tabname
                          AND p~tabclass = 'TRANSP')
*                              AND p~cityto   = @cityto )
     INNER JOIN dd09l AS f ON f~tabname = p~tabname )
WHERE ( ( c~rollname EQ @s_field4-low )
OR ( c~fieldname EQ @s_field4-low  )
)
AND p~tabname NOT LIKE @lv_tab
*                                AND f~connid = p~connid )
*       ORDER BY c~carrname, p~connid, f~fldate
   INTO TABLE @DATA(itab16).
ENDIF.
SORT itab13 BY tabname.
DELETE ADJACENT DUPLICATES FROM itab13 COMPARING tabname..
SORT itab14 BY tabname.
DELETE ADJACENT DUPLICATES FROM itab14 COMPARING tabname..
SORT itab15 BY tabname.
DELETE ADJACENT DUPLICATES FROM itab15 COMPARING tabname..
SORT itab16 BY tabname.
DELETE ADJACENT DUPLICATES FROM itab16 COMPARING tabname.
IF s_field1-low IS NOT INITIAL.
  LOOP AT itab13 INTO DATA(wa_tab133).
    IF itab14[] IS NOT INITIAL.
      READ TABLE itab14  INTO DATA(wa_tab134) WITH KEY tabname = wa_tab133-tabname.
      IF sy-subrc = 0.
        CREATE DATA dref TYPE TABLE OF (wa_tab134-tabname).
        IF itab15[] IS NOT INITIAL.
          READ TABLE itab15  INTO DATA(wa_tab135) WITH KEY tabname = wa_tab133-tabname.
          IF sy-subrc = 0.
            IF itab16[] IS NOT INITIAL.
              READ TABLE itab16  INTO DATA(wa_tab136) WITH KEY tabname = wa_tab133-tabname.
              IF sy-subrc = 0.
                ASSIGN dref->* TO <table>.
                SELECT  *
              FROM (wa_tab134-tabname)
                  INTO TABLE @<table>.
                IF <table> IS NOT INITIAL.
                  wa_alv-tabname =  wa_tab134-tabname.
                  wa_alv-field1 =  s_field1-low.
                  wa_alv-field2 =  s_field2-low.
                  wa_alv-field3 =  s_field3-low.
                  wa_alv-field4 =  s_field4-low.
                  APPEND wa_alv TO ialv.
                  CLEAR wa_alv.
*      exit.
                ENDIF.
              ELSE.
                ASSIGN dref->* TO <table>.
                SELECT  *
              FROM (wa_tab134-tabname)
                  INTO TABLE @<table>.
                IF <table> IS NOT INITIAL.
                  wa_alv-tabname =  wa_tab134-tabname.
                  wa_alv-field1 =  s_field1-low.
                  wa_alv-field2 =  s_field2-low.
                  wa_alv-field3 =  s_field3-low.
*                  WA_ALV-FIELD4 =  S_FIELD4-LOW.
                  APPEND wa_alv TO ialv.
                  CLEAR wa_alv.
*      exit.
                ENDIF.
              ENDIF.
            ELSE.
              ASSIGN dref->* TO <table>.
              SELECT  *
            FROM (wa_tab134-tabname)
                INTO TABLE @<table>.
              IF <table> IS NOT INITIAL.
                wa_alv-tabname =  wa_tab134-tabname.
                wa_alv-field1 =  s_field1-low.
                wa_alv-field2 =  s_field2-low.
                wa_alv-field3 =  s_field3-low.
                APPEND wa_alv TO ialv.
                CLEAR wa_alv.
              ENDIF.
            ENDIF.
          ELSE.
            ASSIGN dref->* TO <table>.
            SELECT  *
          FROM (wa_tab134-tabname)
              INTO TABLE @<table>.
            IF <table> IS NOT INITIAL.
              wa_alv-tabname =  wa_tab134-tabname.
              wa_alv-field1 =  s_field1-low.
              wa_alv-field2 =  s_field2-low.
              APPEND wa_alv TO ialv.
              CLEAR wa_alv.
            ENDIF.
          ENDIF.
        ELSE.
          ASSIGN dref->* TO <table>.
          SELECT  *
        FROM (wa_tab134-tabname)
            INTO TABLE @<table>.
          IF <table> IS NOT INITIAL.
            wa_alv-tabname =  wa_tab134-tabname.
            wa_alv-field1 =  s_field1-low.
            wa_alv-field2 =  s_field2-low.
            APPEND wa_alv TO ialv.
            CLEAR wa_tab134.
          ENDIF.
        ENDIF.
      ENDIF.
    ENDIF.
*  endif.
  ENDLOOP.
ENDIF.
*  Populate Field Catalog
PERFORM get_fieldcatalog.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  EXPORTING
    i_callback_program = sy-repid
*   is_layout          = w_layout
    it_fieldcat        = fieldcat[]
*   it_events          = i_events
  TABLES
    t_outtab           = ialv
  EXCEPTIONS
    program_error      = 1
    OTHERS             = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
************************************************************************
*      Form  Get_Fieldcatalog - Set Up Columns/Headers
************************************************************************
FORM get_fieldcatalog.
  CLEAR: fieldcat.
  fieldcat-seltext_m    = 'Tablename'.
  fieldcat-fieldname  = 'TABNAME'.
  fieldcat-outputlen  = '36'.
  APPEND fieldcat TO fieldcat.
  CLEAR: fieldcat.
  fieldcat-seltext_m   = 'Field1'.
  fieldcat-fieldname  = 'FIELD1'.
  fieldcat-outputlen  = '12'.
  APPEND fieldcat TO fieldcat.
  CLEAR: fieldcat.
  fieldcat-seltext_m   = 'Field2'.
  fieldcat-fieldname  = 'FIELD2'.
  fieldcat-outputlen  = '12'.
  APPEND fieldcat TO fieldcat.
  CLEAR: fieldcat.
  fieldcat-seltext_m   = 'Field3'.
  fieldcat-fieldname  = 'FIELD3'.
  fieldcat-outputlen  = '12'.
  APPEND fieldcat TO fieldcat.
  CLEAR: fieldcat.
  fieldcat-seltext_m    = 'Field4'.
  fieldcat-fieldname  = 'FIELD4'.
  fieldcat-outputlen  = '12'.
  APPEND fieldcat TO fieldcat.
ENDFORM.