Pienso-Pienso: Trabajar con Facturas.(SOLUCIONES)

En el post Trabajar con Facturas  planteaba el problema de hacer un programa siguiendo el patrón de diseño Work with y poder filtrar por una condición sobre las lineas de las facturas. En el ejemplo se planteaba que se debía poder filtrar por las facturas que tenían un determinado producto. El problema a evitar era que las lineas no se repitieran.

En los comentarios plantearon las siguientes soluciones:

1) Trabajar con lineas de facturas con una linea especial.
Gustavo planteaba agregar una linea especial a las facturas con un producto ficticio y filtrar siempre por dicho producto.
Ventaja: Es bastante sencilla de implementar, aunque hay que agregar la linea ficticia en el momento de crear facturas.
Desventaja: Hay que ocultar en el resto de la aplicación la existencia de dicho producto. No siempre es aplicable.

2) Crear una formula que concatena los productos.
Alejandro plantea crear una formula con los productos redundantes y se busca con like en dicho campo.
Ventajas: No le encuentro.
Desventajas: Por cada registro del cabezal, va a acceder a todos los registros de las lineas y va a tener mala performance.
En caso de tener muchos productos para una factura, se va a tener una variable muy grande que ocupara mucha memoria y se corre el riesgo que se trunque y no filtre correctamente.

3) Modificar tabla base para que trabaje con un Join de Facturas y Lineas.
Pablo propone modificar el evento load para recorrer las lineas de las facturas en un join con facturas.
Esto puede hacerse agregando if o con un corte de control.
Ventajas: Es relativamente fácil de implementar
Desventajas: No va a traer las facturas que no tengan lineas. En las facturas puede no ser el mejor ejemplo pero no puede usarse en los casos generales, por ejemplo cuando tengo objetivos y responsables de dichos objetivos. En este caso, no mostraría los objetivos que no tengan responsable asignado.

4) La que me gusta a mi :)

Agregar un filtro &ProductoId, sin condiciones y no hacer referencia a ningun atributo de las lineas de factura, para que la tabla base sean las facturas.

En el evento Load, se agrega para filtrar por producto

//Load
if TieneProducto.Udp(FacturaId,&ProductoId)
   Load
endif

Se crea el procedure TieneProducto con la forma




parm(in:&FacturaId, in:&ProductoId,out:&Existe);
&Existe=false
if &Producto.IsEmpty()
 &Existe=true
else
 for each
  where ProductoId=&ProductoId and FacturaId=&FacturaId
  &Existe=true
  exit
 endfor
endif

Me gustaría que los patterns pudieran resolver esto en forma automática.

5) Con DataProviders. 
Se puede hacer una grilla basada en un SDT y hacer un dataprovider que reciba como parámetro el &ProductoId del filtro y que navegue a las lineas si tengo valor en dicho filtro o a las facturas (cabezal) si el filtro esta vacío.
El Dataprovider debería tener el filtro por paginado para que la performance sea buena.


Comentarios

Entradas más populares de este blog

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

Aplicación monolítica o distribuida?

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