Friday, February 01, 2008

Indices de Tablas


Todos sabemos que los índices son muy importantes para poder optimizar los querys en ABAP...Y sabemos también que debemos ir a la transacción SE11, presionar el botón Índices y luego tenemos que revisar uno por uno para ver que campo los componen...Claro, en parte esto es porque a diferencia de mi, la mayoría no incluye los campos del índice en el nombre del índice (SAP incluido)...

Por eso, se me ocurrió un pequeño reporte, en donde pasamos el nombre de la tabla y obtenemos un resumen de los índices con los campos que lo componen...Bastante útil -:)




Este es el código...


REPORT ydummy_atg NO STANDARD PAGE HEADING.

TYPES: BEGIN OF ty_index,
sqltab TYPE dd17s-sqltab,
indexname TYPE dd17s-indexname,
fieldname TYPE dd17s-fieldname,
ddtext TYPE dd12t-ddtext,
END OF ty_index.

DATA: t_index TYPE STANDARD TABLE OF ty_index,
dd03p_tab TYPE STANDARD TABLE OF dd03p.

DATA: w_indexname TYPE dd17s-indexname.

FIELD-SYMBOLS: <fs_index> LIKE LINE OF t_index,
<fs_dd03p_tab> LIKE LINE OF dd03p_tab.

SELECTION-SCREEN BEGIN OF BLOCK test.
PARAMETERS:
p_tabnam TYPE dd17s-sqltab.
SELECTION-SCREEN END OF BLOCK test.

START-OF-SELECTION.

SELECT dd17s~sqltab dd17s~indexname fieldname ddtext
INTO TABLE t_index
FROM dd17s INNER JOIN dd12t
ON dd17s~sqltab EQ dd12t~sqltab
AND dd17s~indexname EQ dd12t~indexname
WHERE dd17s~sqltab EQ p_tabnam
AND ddlanguage EQ sy-langu.

CALL FUNCTION 'DDIF_TABL_GET'
EXPORTING
name = p_tabnam
state = 'A'
langu = sy-langu
TABLES
dd03p_tab = dd03p_tab
EXCEPTIONS
illegal_input = 1
OTHERS = 2.

sy-title = p_tabnam.

LOOP AT t_index ASSIGNING <fs_index>.
IF w_indexname NE <fs_index>-indexname.
SKIP 1.
w_indexname = <fs_index>-indexname.
WRITE:/ 'Indice: ', <fs_index>-indexname, <fs_index>-ddtext.
SKIP 1.
READ TABLE dd03p_tab ASSIGNING <fs_dd03p_tab>
WITH KEY tabname = p_tabnam
fieldname = <fs_index>-fieldname.
WRITE:/ <fs_index>-fieldname, <fs_dd03p_tab>-ddtext.
ELSE.
READ TABLE dd03p_tab ASSIGNING <fs_dd03p_tab>
WITH KEY fieldname = <fs_index>-fieldname.
WRITE:/ <fs_index>-fieldname, <fs_dd03p_tab>-ddtext.
ENDIF.
ENDLOOP.


Saludos,

Blag.

4 comments:

Anonymous said...

hola como sabes si un indice esta duplicado

Alvaro "Blag" Tejada Galindo said...

Hasta donde yo se, SAP no te permite duplicar indices en una tabla...En todo caso, si se pudiera, pues simplemente habría que leer los campos que conforman los índices y compararlos para ver si son iguales...Aunque creo que SAP debería de tener alguna transacción de monitoreo para estos casos.

Saludos,

Blag.

Anonymous said...

Hola que tal, tengo una duda, lo que pasa es que quiero que una consulta utilice un indice creado a una tabla estandar, pero al crear el indice no me lo crea dentro de la base de datos aun cuando selecciono la opcion, por lo tanto no puedo utilizarlo, no se ha que se deba o si este haciendo algo mal.
De antemano muchas gracias.

Alvaro "Blag" Tejada Galindo said...

Has intentado adaptar la tabla utilizándo la transacción SE14?

Saludos,

Blag.