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.

Comentarios

  1. Podrias resolverlo con algo asi (*)

    CliTotSDT 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

    ResponderBorrar
  2. Gustavo:

    Gracias 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.

    ResponderBorrar
  3. No habría una navegacion con 2 for each anidados...
    Lo 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 ;)

    ResponderBorrar
  4. Gustavo:
    Perfecto, eso es lo que necesito.

    Te ganaste el premio de este PiensoPienso, que es la suscripcion gratis por un año a este blog.

    ResponderBorrar

Publicar un comentario

1) Lee el post
2) Poné tu opinión sobre el mismo.
Todos los comentarios serán leidos y la mayoría son publicados.

Entradas más populares de este blog

Aplicación monolítica o distribuida?

La nefasta influencia del golero de Cacho Bochinche en el fútbol uruguayo

Funcionalidades de GeneXus que vale la pena conocer: DATE Constants.