Текущее время: Ср, июн 25 2025, 11:34

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Программа для просмотра индексов к таблице БД
СообщениеДобавлено: Пн, фев 01 2016, 14:04 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Чт, мар 09 2006, 10:12
Сообщения: 565
Откуда: Волгодонск
Пол: Мужской
При написании запросов желательно учитывать имеющиеся в БД индексы, а вот нормального способа посмотреть индексы БД как-то не нашлось
написал простенькую программку - показывает все индексы таблицы БД в одной ALV табличке:
Изображение
Code:
*&---------------------------------------------------------------------*
*& Report  YDK_DBTAB_INDEXES
*& Display all indexes for db table
*&---------------------------------------------------------------------*
*& Autor: Kiyanov Dmitry
*& Email: DKiyanov@mail.ru
*& site: http://saptaskbar.ru/
*&---------------------------------------------------------------------*

REPORT ydk_dbtab_indexes.

PARAMETERS: tabname TYPE dd02l-tabname MEMORY ID dtb OBLIGATORY.

DATA: fc  TYPE lvc_t_fcat.
DATA: fct TYPE abap_component_tab.
FIELD-SYMBOLS <fc> LIKE LINE OF fc.
FIELD-SYMBOLS <fct> LIKE LINE OF fct.

FIELD-SYMBOLS: <alv_tab> TYPE STANDARD TABLE.
FIELD-SYMBOLS: <alv_wa> TYPE any.

DATA: htext TYPE c LENGTH 255.

START-OF-SELECTION.
  PERFORM get_data.
  PERFORM alv_show.

FORM get_data.
  DATA: itfld TYPE STANDARD TABLE OF dfies WITH HEADER LINE.
  DATA: indx TYPE STANDARD TABLE OF dd17s-indexname WITH HEADER LINE.
  DATA: BEGIN OF indxf OCCURS 0,
          indexname LIKE dd17s-indexname,
          position  LIKE dd17s-position,
          fieldname LIKE dd17s-fieldname,
        END   OF indxf.
  DATA: fname TYPE string.

  FIELD-SYMBOLS <fs> TYPE dd17s-position.

  CALL FUNCTION 'GET_FIELDTAB'
    EXPORTING
      tabname             = tabname
    TABLES
      fieldtab            = itfld
    EXCEPTIONS
      internal_error      = 1
      no_texts_found      = 2
      table_has_no_fields = 3
      table_not_activ     = 4
      OTHERS              = 5.

  IF sy-subrc <> 0.
    MESSAGE 'table not found' TYPE 'S' DISPLAY LIKE 'E'.
    STOP.
  ENDIF.

  SELECT * INTO CORRESPONDING FIELDS OF TABLE indxf
    FROM dd17s
   WHERE sqltab   = tabname
     AND as4local = 'A'
     AND as4vers  = '0000'.

  indxf-indexname = '0'.
  LOOP AT itfld WHERE keyflag = 'X'.
    indxf-position  = itfld-position.
    indxf-fieldname = itfld-fieldname.
    APPEND indxf.
  ENDLOOP.

  IF indxf[] IS INITIAL.
    MESSAGE 'it is not DB table' TYPE 'S' DISPLAY LIKE 'E'.
    STOP.
  ENDIF.

  SELECT SINGLE  ddtext INTO htext
    FROM dd02t
   WHERE tabname    = tabname
     AND ddlanguage = sy-langu
     AND as4local   = 'A'
     AND as4vers    = '0000'.
  CONCATENATE tabname htext INTO htext SEPARATED BY space.

  SORT indxf BY indexname.

  LOOP AT indxf.
    AT NEW indexname.
      APPEND indxf-indexname TO indx.
    ENDAT.
  ENDLOOP.

  PERFORM fc_add_field USING 'FIELDNAME' 'DFIES-FIELDNAME' '' '' ''.
  PERFORM fc_add_field USING 'FIELDTEXT' 'DFIES-FIELDTEXT' '' '' ''.

  LOOP AT indx.
    CONCATENATE 'ZZYDFD' indx INTO fname.
    PERFORM fc_add_field USING fname 'DD17S-POSITION' '' '' indx.
  ENDLOOP.

  PERFORM fc_create.

  LOOP AT itfld.
    READ TABLE indxf WITH KEY fieldname = itfld-fieldname.
    CHECK sy-subrc = 0.

    APPEND INITIAL LINE TO <alv_tab> ASSIGNING <alv_wa>.
    MOVE-CORRESPONDING itfld TO <alv_wa>.

    LOOP AT indx.
      READ TABLE indxf WITH KEY indexname = indx fieldname = itfld-fieldname.
      CHECK sy-subrc = 0.

      CONCATENATE 'ZZYDFD' indx INTO fname.
      ASSIGN COMPONENT fname OF STRUCTURE <alv_wa> TO <fs>.
      <fs> = indxf-position.
    ENDLOOP.
  ENDLOOP.
ENDFORM.

FORM fc_add_field USING fname ftype flength fdecimals fdesc.
  DATA: l TYPE i.
  DATA: xdd03l TYPE dd_x031l_table WITH HEADER LINE.
  DATA: elemdescr TYPE REF TO cl_abap_elemdescr.

  READ TABLE fct WITH KEY name = fname TRANSPORTING NO FIELDS.
  CHECK sy-subrc <> 0.

  APPEND INITIAL LINE TO fc ASSIGNING <fc>.
  APPEND INITIAL LINE TO fct ASSIGNING <fct>.

  <fct>-name = fname.
  TRANSLATE <fct>-name TO UPPER CASE.

  l = strlen( ftype ).

  IF l <= 1.
    CASE ftype.
      WHEN ' '. <fct>-type ?= cl_abap_elemdescr=>get_string( ).
      WHEN 'g'. <fct>-type ?= cl_abap_elemdescr=>get_string( ).
      WHEN 'I'. <fct>-type ?= cl_abap_elemdescr=>get_i( ).
      WHEN 'F'. <fct>-type ?= cl_abap_elemdescr=>get_f( ).
      WHEN 'D'. <fct>-type ?= cl_abap_elemdescr=>get_d( ).
      WHEN 'T'. <fct>-type ?= cl_abap_elemdescr=>get_t( ).
      WHEN 'C'. <fct>-type ?= cl_abap_elemdescr=>get_c( p_length = flength ).
      WHEN 'N'. <fct>-type ?= cl_abap_elemdescr=>get_n( p_length = flength ).
      WHEN 'X'. <fct>-type ?= cl_abap_elemdescr=>get_x( p_length = flength ).
      WHEN 'P'. <fct>-type ?= cl_abap_elemdescr=>get_p( p_length = flength p_decimals = fdecimals ).
    ENDCASE.
  ELSE.
    <fct>-type ?= cl_abap_elemdescr=>describe_by_name( ftype ).

    CALL METHOD <fct>-type->get_ddic_object
      RECEIVING
        p_object     = xdd03l[]
      EXCEPTIONS
        not_found    = 1
        no_ddic_type = 2
        OTHERS       = 3.

    IF sy-subrc = 0.
      READ TABLE xdd03l INDEX 1.
      IF xdd03l-rollname IS INITIAL.
        elemdescr ?= <fct>-type.
        <fc>-rollname = elemdescr->help_id.
      ELSE.
        <fc>-rollname = xdd03l-rollname.
      ENDIF.
      <fc>-convexit = xdd03l-convexit.
      <fc>-datatype = xdd03l-dtyp.
    ENDIF.
  ENDIF.

*  <fc>-col_pos   = reg_wa-findex.
  <fc>-fieldname = fname.
  <fc>-tabname   = 1.
*  <fc>-datatype  = reg_dd03p_wa-datatype.
  <fc>-inttype   = <fct>-type->type_kind.
  <fc>-intlen    = <fct>-type->length.
*  <fc>-domname   = reg_dd03p_wa-domname.
*  <fc>-dd_outlen = reg_dd03p_wa-outputlen.
  <fc>-decimals  = <fct>-type->decimals.
*  <fc>-ref_table = reg_wa-sname.
*  <fc>-ref_field = reg_wa-fld.
  <fc>-coltext   = fdesc.
  <fc>-tooltip   = fdesc.

  DATA: tabname   TYPE dd03t-tabname.
  DATA: fieldname TYPE dd03t-fieldname.
  DATA: ddtext    TYPE dd03t-ddtext.

  IF fdesc IS INITIAL AND ftype CA '-'.
    SPLIT ftype AT '-' INTO tabname fieldname.

    SELECT SINGLE ddtext INTO ddtext
      FROM dd03t
     WHERE tabname = tabname
       AND ddlanguage = sy-langu
       AND as4local = 'A'
       AND fieldname = fieldname.
    <fc>-coltext   = ddtext.
    <fc>-tooltip   = ddtext.
  ENDIF.

ENDFORM.                    "add_fc_field

FORM fc_create.
  DATA: alv_wa_ref TYPE REF TO data.
  DATA: alv_tab_ref TYPE REF TO data.
  DATA: structdescr TYPE REF TO cl_abap_structdescr.

  structdescr ?= cl_abap_structdescr=>create( fct ).
  CREATE DATA alv_wa_ref TYPE HANDLE structdescr.

  ASSIGN alv_wa_ref->* TO <alv_wa>.
  CREATE DATA alv_tab_ref LIKE TABLE OF <alv_wa>.
  ASSIGN alv_tab_ref->* TO <alv_tab>.
ENDFORM.

FORM alv_show.
  DATA: repid TYPE sy-repid.
  repid = sy-repid.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
*     I_INTERFACE_CHECK           = ' '
*     I_BYPASSING_BUFFER          =
*     I_BUFFER_ACTIVE             =
      i_callback_program          = repid
*     i_callback_pf_status_set    = 'ALV_STATUS_SET'
*     i_callback_user_command     = 'ALV_USER_COMMAND'
*     I_CALLBACK_TOP_OF_PAGE      = ' '
      i_callback_html_top_of_page = 'ALV_HTML_TOP_OF_PAGE'
*     I_CALLBACK_HTML_END_OF_LIST = ' '
*     I_STRUCTURE_NAME            =
*     I_BACKGROUND_ID             = ' '
*     I_GRID_TITLE                =
*     I_GRID_SETTINGS             =
*     IS_LAYOUT_LVC               =
      it_fieldcat_lvc             = fc[]
*     IT_EXCLUDING                =
*     IT_SPECIAL_GROUPS_LVC       =
*     IT_SORT_LVC                 =
*     IT_FILTER_LVC               =
*     IT_HYPERLINK                =
*     IS_SEL_HIDE                 =
*     I_DEFAULT                   = 'X'
*     i_save                      = 'A'
*     is_variant                  = variant
*     IT_EVENTS                   =
*     IT_EVENT_EXIT               =
*     IS_PRINT_LVC                =
*     IS_REPREP_ID_LVC            =
*     I_SCREEN_START_COLUMN       = 0
*     I_SCREEN_START_LINE         = 0
*     I_SCREEN_END_COLUMN         = 0
*     I_SCREEN_END_LINE           = 0
      i_html_height_top           = 4
*     I_HTML_HEIGHT_END           =
*     IT_ALV_GRAPHICS             =
*     IT_EXCEPT_QINFO_LVC         =
*     IR_SALV_FULLSCREEN_ADAPTER  =
    TABLES
      t_outtab                    = <alv_tab>
    EXCEPTIONS
      program_error               = 1
      OTHERS                      = 2.
ENDFORM.                    "alv_show

FORM alv_html_top_of_page USING document  TYPE REF TO cl_dd_document.
  CALL METHOD document->add_text
    EXPORTING
      text = htext.
ENDFORM.

_________________
Изображение Попытка не пытка


Последний раз редактировалось DKiyanov Пн, фев 01 2016, 17:54, всего редактировалось 1 раз.

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программа для просмотра индексов к таблице БД
СообщениеДобавлено: Пн, фев 01 2016, 15:11 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Мы обычно пользуемся ST05 - Enter SQL-statement - Explain.
Code:
Table   MKPF

Last statistics date              01.06.2015 06:54
Analyze Method                  Sample 11 536 Rows
Number of rows                             115 360
Number of blocks allocated                   2 644
Number of empty blocks                           0
Average space                                    0
Chain count                                      0
Average row length                             153
Partitioned                                     NO
Parallel degree                                  1
LAST DDL Date                     08.04.2013
Creation Date                     08.04.2013
Tablespace                                 PSAPSR3

UNIQUE     Index     MKPF~0

Column Name                     #Distinct
MANDT                                            2
MBLNR                                       59 372
MJAHR                                           11

NONUNIQUE  Index     MKPF~BUD

Column Name                     #Distinct
MANDT                                            2
BUDAT                                        1 950
MBLNR                                       59 372

NONUNIQUE  Index     MKPF~ZXB

Column Name                     #Distinct
MANDT                                            2
XBLNR                                        3 394
BLDAT                                        2 052

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программа для просмотра индексов к таблице БД
СообщениеДобавлено: Пн, фев 01 2016, 15:35 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Вт, авг 31 2004, 14:57
Сообщения: 5258
Откуда: Ростов невеликий
Пол: Мужской
качество бы ещё вывести...

_________________
Нет сегодняшних проблем -
есть вчерашние ошибки
(с)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программа для просмотра индексов к таблице БД
СообщениеДобавлено: Пн, фев 01 2016, 15:43 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Вт, май 17 2005, 13:35
Сообщения: 4871
Откуда: Москва
Пол: Мужской
Skif написал:
качество бы ещё вывести...

И уровень компрессии..

_________________
Удача - результат нашего желания (© А. Нортон)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программа для просмотра индексов к таблице БД
СообщениеДобавлено: Пн, фев 01 2016, 15:50 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Вт, авг 31 2004, 14:57
Сообщения: 5258
Откуда: Ростов невеликий
Пол: Мужской
LKU написал:
И уровень компрессии..

и волосатость повышенную :)

_________________
Нет сегодняшних проблем -
есть вчерашние ошибки
(с)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программа для просмотра индексов к таблице БД
СообщениеДобавлено: Пн, фев 01 2016, 17:15 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, дек 20 2007, 18:21
Сообщения: 1613
Skif написал:
LKU написал:
И уровень компрессии..

и волосатость повышенную :)

лохматость... :D

_________________
я твой сап эфай внедрял
BAdI-позитив
Взять немножечко абопу, сунь туда кошачью *опу, RFC лапки, БТ старой бабки, на медленном базиснике переносить, тестовое окружение материть, снимать SAT пенку, биться головой о стенку, охапка тайм-шитов, отчет готов!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программа для просмотра индексов к таблице БД
СообщениеДобавлено: Вт, фев 02 2016, 06:44 
Специалист
Специалист

Зарегистрирован:
Вт, июн 10 2014, 09:41
Сообщения: 180
Можно ещё в SE11 в меню Утилиты->Объект базы данных->Просмотреть. Потом прокрутить вниз и у увидеть индексы:
Изображение


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB