Unofficial Content

 Definicion en este link 

Se me ha presentado en varias oportunidades, que en aplicaciones GeneXus WEB necesito tener una tabla de cruces de datos. Esta es una tabla donde se muestre una dimension en las columnas y otra dimension en las filas, poniendo algun indicador (suma o cuenta) en las celdas internas de la tabla.

Ejemplo:

Factura
{
   NroFactura*
   Cliente
   Producto
   Importe
}


 y generar una tabla del tipo
 

..

Cliente1

Cliente2

Cliente3

Cliente4

Cliente5

Total

Producto1

3000

3000

Producto2

200

100

45

345

Producto3

1

1

Total

200

3100

45

1

3346


Esto es relativamente facil de implementar con el codigo: (el ejemplo va sin TOTALES).

Hay que programar un Webpanel, que unicamente tenga un FreeStyle subfile, con una variable &Texto=C(100). Las columnas se setean en runtime.

Event Load
   // Definir la cantidad de columnas
   &Columnas=0
   for each Cliente
      &Columnas +=1
   endfor    
   Grilla.Columns = &Columnas + 1
    //Cargo primer casillero
   &Texto='..'
   Load
    //Cargo Titulos superiores
   for each Cliente
      // where Condicion de clientes
      &Texto=ClienteNombre
      &Texto.FontBold=1
      Load
   endfor
    for each Producto
      //Cargo Titulo de la fila
      &Producto=Producto
      &Texto=ProductoDsc
      &Texto.FontBold=1
      &Texto.Link=link('')
      Load
       for each Cliente
         &Cliente=Cliente
         //Cargo la celda con Cliente y Producto Instanciado.
         do 'Acumulo'
         &Texto.FontBold=0
         Load
      endfor
   endfor
 EndEvent 
 Sub 'Acumulo'
   &Importe=0
   for each
      Where Cliente=&Cliente
      Where Producto=&Producto
      &Importe += Importe
   endfor
    If Not &Importe.IsEmpty()
      &Texto=str(&Importe)
      &Texto.Link=Link(hListoFacturas,&Cliente,&Producto)
   else
      &Texto.SetEmpty()
      &Texto.Link=link('')
   endif
 EndSub
 



Estaría bueno implementarlo para la ROCHA (es fácil y de ingenio), aunque aun no hay demasiada documentación sobre como hacerlos.

PD: Ojo que no es aplicable a todos los casos, pues si la matriz generada es muy dispersa o si tenes alguna dimension que sea de una cardinalidad muy grande, puede consumir muchisimos recursos hacerlo.
Queda como ejercicio interesante, hacer un DataProvider que realice la consulta (agrupando por las dimensiones y haciendo la suma/cuenta) y despues procesar el SDT.
El dataprovider deberia hacer:

SELECT DIMENSION1, DIMENSION2,SUM(INDICADOR) 
FROM TABLA 
GROUP BY DIMENSION1, DIMENSION2"
 

También puede tener problemas de performance si la cardinalidad de la tabla de facturas es muy grande. Hay que usarlo con cariño.

 

 
 

 

Last update: February 2024 | © GeneXus. All rights reserved. GeneXus Powered by Globant