GeneXus - Sobrecarga de información en For each

   
Vista:
Imágen de perfil de David

Sobrecarga de información en For each

Publicado por David (18 intervenciones) el 27/05/2015 23:35:56
Muy buenas. Empiezo aclarando uso Genexus 8 Generador RPG y AS/400

Tengo la siguiente estructura dentro de un reporte:

1
2
3
4
5
6
7
8
9
10
11
12
13
For each order codigo
where codigo >= &codigo
where fecha > &fecha
   For each
   //primer for each anidado
   endFor
   For each
   //segundo for each anidado
   endFor
   For each
   //tercer for each anidado
   endFor
endFor

Dentro del 3er For each debo realizar una subconsulta de todos los productos del código actual. Para aclarar este punto supongamos tenemos los códigos : 3, 5, 7, 45, 48, 114... etc. Vamos por el primer código el cual seria el 3 pues tenemos nuestro for each principal ordenado por codigo, posteriormente será el turno de 5, luego 7 y así sucesivamente recorrerá los códigos que tengan la fecha mayor a la indicada en el for each principal.
Ahora bien dentro del 3er for each se realiza una consulta dentro de una tabla que aproximadamente tiene más de 40 millones de registros demorando el proceso mucho tiempo.

He realizado un sql dentro de la tabla en función a como va a recorrer un for each normal, con lo siguiente, producto de código "3":

Nota: u_com = unidades compradas, u_dev = unidades devueltas y u_inv = unidades en inventario inicial

1
2
3
select local, codigo, u_com, u_dev, u_inv
from existencia
where codigo = 3

esta consulta toma aproximadamente de 4 a 5 seg (Por lo mencionado anterior mente más de 40 millones de registros). Ademas debo realizar operaciones matemáticas dentro del for each demorando aún más la consulta.

Sin embargo si realizo el siguiente sql:

1
2
3
4
5
select codigo, sum(u_com), sum(u_dev), sum(u_inv)
from existencia
where codigo = 3
group by codigo
order by codigo

El resultado es inmediato y realmente me serviría mucho dentro del 3er for each puesto que mensualmente la media de productos actualizados es de 300000 códigos. Haciendo un poco de matemáticas 300000 * 4 (seg)= 1200000 (seg) esto quiere decir 336 horas que es equivalente a 14 días

Por tanto me pregunto si existe alguna función (he provado con SUM y Sum sin obtener resultados) que me ayude a realizar la suma de "u_com", "u_dev" y "u_inv" dentro del 3er For each.

Si alguien a tenido algo similar o sabe algún método me ayudaría mucho si comenta como lo solucionó gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de David

Sobrecarga de información en For each

Publicado por David (18 intervenciones) el 28/05/2015 00:40:19
Ya encontré el error. Resulta que me falto utilizar el lógico correcto (índice en genexus). Ademas encontré para optimizar más la SQL del for each espero les sirva.

http://wiki.genexus.com/commwiki/servlet/hwiki?For+Each+Optimizations,

chau
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de ruben

Sobrecarga de información en For each

Publicado por ruben (72 intervenciones) el 28/05/2015 03:38:16
amigo si te entendi bien, necesitas algun proceso que redusca el tiempo de ejecucion del proceso.

1.- yo trabajo en evo 3 U2.. ami me funciona hacer lo mismo pero en un DATA PROVIDER. puedes intentarlo pero en mi opinion cuando se trabaja con mucha informacion, lo mejor es usar el data provider

Nota: repito utilizo EVO 3 U2.

Saludos!.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar