GeneXus - Ayudas optimizar consultas for each

 
Vista:

Ayudas optimizar consultas for each

Publicado por Hector (2 intervenciones) el 14/08/2006 09:07:49
Necesito ayuda para optimizar las consultas con el for each de Genexus....las consultas de tardan demasiado en tablas de 2 o mas millones de registros...me entere de una instruccion llamada order [atributo] when not null([variable])..que al parecer optimizo mi busqueda..pero algunas veces no entra al for each y en cortes de control no funciona....alguien me puede detallar el funcionamiento de esta instruccion? 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

RE:Ayudas optimizar consultas for each

Publicado por cknu (22 intervenciones) el 14/08/2006 18:34:59
Es bastante trivial, es un condicional para el Order.

Al igual que utilizás los when en las cláusulas WHERE para aplicar filtros si se cumple una condición (att no nulo, etc), utilizas lo mismo para los ordenes.
En lugar de especificar un único orden para el conjunto de registros, podés especificar un orden particular según se cumplan determinadas condiciones.
En caso de ambiguedad (que se cumpla la condicion para mas de un orden) creo que utiliza el primer orden que cumpla.
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

RE:Ayudas optimizar consultas for each

Publicado por Federico Gordillo (120 intervenciones) el 15/08/2006 19:46:03
Si podes, crea todos los indices por los que vas a recorrer en las tablas. Luego usa el order Atributo y controla la navegacion. La navegacion te dice si vas a recorrer un registro o solo una seleccion.

Los ordenes a partir de la 8.0 los podes definir condicionales con la instruccion when
Es decir

For Each
Order At1 when &listarporAt = 1
Order At2 When &listarporAt = 2

Si estas realizando una busqueda ,debes tratar de que quede, en lo posible algo asi
Start from: Buscar = &Buscar
Loop while: Buscar = &Buscar

y no

Start from: FirstRecord
Loop while: NotEndOfTable

Saludos Ate
Federico
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

RE:Ayudas optimizar consultas for each

Publicado por hector (2 intervenciones) el 16/08/2006 00:33:38
Gracias por su ayuda...pero lo que necesito saber es si puede aplicar eso a cortes de control...por ejemplo

un corte de control normal como este

for each order atrib1
where atrib1 = &vatrib1
for each
suma += atrib2
endfor
endfor

si le aplico order when:

for each
order atrib1 when not null(&vatrib1)
where atrib1 = &vatrib1
for each
suma += atrib2
endfor
endfor

el gx me marca este error:

Conditional order in group starting at line 28 not allowed (Break group).

Ojala y alguien sepa como utilizar los cortes de control con order condicionales o si el gx no lo soporta....
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

RE:Ayudas optimizar consultas for each

Publicado por cknu (22 intervenciones) el 17/08/2006 18:40:27
Negativo. No podés utilizar ordenes condicionales en los cortes de control y la razón es simple. GX no puede evaluar la condición para un break en runtime.
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

RE:Ayudas optimizar consultas for each

Publicado por Juan García (53 intervenciones) el 17/08/2006 19:25:32
Creo que aqui hay una confusión, esto no es mas que una condición que se tiene que evaluar antes de entrar al for each o bien especificar adecuadamente el filtro, en este caso yo haría un indice de usuario al archivo con ordenado por atrib1.
yo haría:

If .not. null(&vatrib1)
for each atrib1
where atrib1 = &vatrib1
for each
suma += atrib2
endfor
endfor
...
...
endif

si lo que quieres es que entre a la lectura del segundo for each siempre y cuando atrib1 tenga un valor intenta esto:

&vatrib1 = valor nulo (' ' ó 0)
For each atrib1
Where atrib1 > &vatrib1
For each atrib1
suma += atrib2
endfor
Endfor

Si estas leyendo solo una tabla y quieres que sume todos los atrib2 por cada atrib1 esta es la forma, si quieres que sume todos los atrib2 siempre y cuando atrib1 no sea nulo entonces debe ser asi:

&vatrib1 = valor nulo (' ' ó 0)
For each atrib1
Where atrib1 > &vatrib1
suma += atrib2
endfor
no entiendo exactamente cual es la duda sobre los cortes de control, ojalá esto te ayude
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

RE:Ayudas optimizar consultas for each

Publicado por Shon Filipo (4 intervenciones) el 12/11/2008 13:44:25
Para utilizar un corte de control sin generar un break debes usar una sub rutina ke apunte a la misma tabla dentro del primer for each ke tienes, esa es la manera......
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