PiensoPienso - Genexus Data Provider
Este es un problema para resolverlo con GeneXus Rocha.
Tengo las tablas
==Clientes
*ClienteId
ClienteNombre
==Facturas
*FacturaId
ClienteId
Fecha
(*ProductoId
Precio
Cantidad
TotalLineaFactura = Cantidad * Precio
)
TotalFactura = Sum(TotalLineaFactura)
Tengo que hacer un ranking de total vendido por cliente en un periodo.
Se necesita hacer un Data Provider que devuelva un SDT que tenga
ClienteId
ClienteNombre
TotalFacturado
ordenado por TotalFacturado descendente.
Como seria dicho Data Provider?.
Yo tengo mas de una solución y ninguna me convence del todo.
Los Data Providers, tienen un potencial maravilloso, pero vamos (o al menos voy) a necesitar un tiempo para poder entender todo su polenta.
Tengo las tablas
==Clientes
*ClienteId
ClienteNombre
==Facturas
*FacturaId
ClienteId
Fecha
(*ProductoId
Precio
Cantidad
TotalLineaFactura = Cantidad * Precio
)
TotalFactura = Sum(TotalLineaFactura)
Tengo que hacer un ranking de total vendido por cliente en un periodo.
Se necesita hacer un Data Provider que devuelva un SDT que tenga
ClienteId
ClienteNombre
TotalFacturado
ordenado por TotalFacturado descendente.
Como seria dicho Data Provider?.
Yo tengo mas de una solución y ninguna me convence del todo.
Los Data Providers, tienen un potencial maravilloso, pero vamos (o al menos voy) a necesitar un tiempo para poder entender todo su polenta.
Podrias resolverlo con algo asi (*)
ResponderBorrarCliTotSDT order sum(TotalFactura, Fecha > &inicio .AND. Fecha < &fin)
{
ClienteId = ClienteId
ClienteNombre = ClienteNombre
TotalFacturado = sum(TotalFactura, Fecha > &inicio .AND. Fecha < &fin)
}
(*) El detalle es que hoy la gramatica de GX no te esta dejando salvar el 'order sum(....)'. Estamos viendo de permitirlo
Saludos,
Gustavo
Gustavo:
ResponderBorrarGracias por la respuesta.
Esto (sin el order) es mas o menos a lo que he llegado (con ayuda).
El tema es que si entiendo bien, hay una navegacion similar a :
for each ClienteId //tabña de clientes
for each FacturaId,ClienteId //tabla de facturas
sum(TotalFactura)
endfor
endfor
Esto puede tener performance muy mala, si hay muchos clientes a los cuales NO les facture nada en ese periodo.
Hay alguna forma de hacer un CORTE DE CONTROL o un GROUP BY, de forma de recorrer el join de Clientes y Facturas y generar algo parecido a un
SELECT ClienteId,ClienteNombre,
SUM(TotalFactura) AS TotalFacturado
FROM Clientes C, Facturas F
WHERE C.ClienteId=F.ClienteId
GROUP BY ClienteId,ClienteNombre
ORDER BY TotalFacturado
y con eso cargar el SDT.
No habría una navegacion con 2 for each anidados...
ResponderBorrarLo que habria seria una navegacion de este estilo (obviemos la parte del order):
for each ClienteId
&clitot = sum(FacTot, FacFecha > &inicio .AND. FacFecha < &fin)
endfor
Esto en tiempo de generacion se traduce a una sentencia SQL que va a la tabla de Clientes y hace join con la de facturas (via CliCod) de donde va agregando los totales.
O sea, en este caso el Group By queda implicito (o mas bien dicho queda explicito en la sentencia SQL ;)
Gustavo:
ResponderBorrarPerfecto, eso es lo que necesito.
Te ganaste el premio de este PiensoPienso, que es la suscripcion gratis por un año a este blog.