MUNDOSAP

MUNDOSAP (foro/index.php)
-   Programación ABAP IV (foro/forumdisplay.php?f=4)
-   -   Optimizacion Consulta con LOOP y READ TABLE (foro/showthread.php?t=38213)

andresf02 12/08/10 19:02:25

Optimizacion Consulta con LOOP y READ TABLE
 
Buenas Tardes:

Tengo un escenario en el cual traigo informacion de las tablas EKKO (Doc de Compra).

El reporte imprimi el listado de documentos de Compra con los items y para cada una, muestra el/los los correspondiente(s) documentos MIRO (si los tiene) con el valor del importe.

Al comienzo estaba excluyendo del reporte todos aquellos documentos de compras que nunca hubieran tenido MIRO. El reporte asi se corriera para todo un año completo, nunca pasaba de los 2 minutos en tiempo de ejecucion.

Pero ahora el usuario quiere que se muestren tambien los documentos de compras que no tienen MIRO, y que en la columna MIRO salga para esos documentos el texto "NO CREADO".

Pude resolver el problema pero ahora el tiempo de ejecucion del reporte para 1 año es de 9 minutos.

Les envio el codigo que tuve que realizar para este nuevo requerimiento. Resalto en ROJO el ajuste que hice para que mostrara los Documentos de compra sin MIRO.

Por favor si saben como podria optimizar eso, o si existe alguna forma mejor de preguntar si el doc de compras EBELN esta en la tabla interna IT_EKBE sin realizar el READ TABLE, se los agradeceria.








Gracias!

mysmb2 12/08/10 19:46:27

Hola,
Proba con ordenar la tabla it_ekbe por ebeln y realizar una lectura binaria. Ademas seria bueno que uses field-symbol en vez de un area de trabajo en los READ y LOOP

En cuanto a las relaciones entre las tablas fijate si hay algun otro campo clave que te sirva para restringir las lecuras.

Espero te siriva.
Saludos!

aldape 16/08/10 17:35:32

Igual podrias crear una(s) tabla(s) fisicas, para insertarles los datos desde tus tablas en memoria y una vez que esten los datos en disco duro hacer los queries necesarios...

se que hacer un "delete from"->"insert from table"... es muy lento... pero estoy seguro que seran menos de 2 minutos para obtener tu reporte final...

Saludos!

DavidXD_XD 16/08/10 18:37:00

Hola, lo que haria seria un ordenamiento por el campo EBELN y realizaria la consulta de esta manera


La sentencia BINARY SEARCH agiliza de manera considerable la busqueda del registro que quieres, y como ese registro que encuentras no t servira para el proceso luego del sy-subrc = 0, adiciono la sentencia TRANSPORTING NO FIELDS para evitar gastar memorias en asignacion y copia del registro en un area de trabajo, espero te ayude ... :D

Garces 16/08/10 20:00:41

Lo que estás haciendo con ese cambio es duplicar la cantidad de lecturas a tu tabla interna...

No necesitas ni siquiera hacer un READ TABLE, puesto que en el LOOP ... WHERE ya estás validando el hecho de que exista o no la entrada buscada... además, el LOOP ya te devuelve el sy-subrc = 0 si encuentra el registro o el sy-subrc = 4 si no existe, por lo que lo único que necesitarías hacer es agregar tus líneas de código validando el valor sy-subrc justo despues de terminar tu LOOP... Con eso debería ser suficiente sin necesidad de utilizar tu READ TABLE...

Lo que sí te recomendaría es que la table que recorres con el LOOP sea tipo SORTED o mejor aún, de tipo HASHED... Esto acelera el prodceso de búsqueda en el loop...

Algo así...

DATA: it_ekko TYPE HASHED TABLE OF ekko WITH UNIQUE KEY ebeln.

Esto último utilízalo sólo en caso la tabla it_ekko la llenas una única vez con un select y luego ya no le hagas inserts ni la modifiques, pues eso puede terminar en un dump si la tabla es tipo HASHED o si la tabla es tipo SORTED y el registro ingresado no está ordenado.

aldape 18/08/10 17:08:14


Voy a hacer pruebas con esto :)


Husos Horarios son GMT. La hora en este momento es 23:14:34.

www.mundosap.com 2006 - Spain
software crm, crm on demand, software call center, crm act, crm solutions, crm gratis, crm web