Y he visto todo tipo de soluciones para resolver el problema, desde crear expresiones con complejos Set Analysis hasta tablas de conversión de periodos de vencimiento pasando por complejos if anidados tanto en script como en expresiones.
Esta solución es una más y la que yo suelo usar.
Consiste en añadir un campo más con el periodo de vencimiento a cada registro de factura. Este periodo se calcula en el script y se actualiza cada vez que se recarga la aplicación, lo que mejora luego bastante su rendimiento porque no hará falta ningún set analysis ni ifs anidados en las expresiones.
Para no complicar mucho el tema, imaginemos que tenemos esta tabla de facturas:
FACTURAS:
LOAD * INLINE [
Num_factura, FechaFactura, FechaVencimiento
1 , 13/02/2018, 13/03/2018
2, 13/02/2018, 25/08/2018
3, 25/07/2018, 25/11/2018
];
LOAD * INLINE [
Num_factura, FechaFactura, FechaVencimiento
1 , 13/02/2018, 13/03/2018
2, 13/02/2018, 25/08/2018
3, 25/07/2018, 25/11/2018
];
Y las queremos clasificar en los siguientes rangos de vencimiento de modo que el usuario seleccione uno de ellos y automáticamente nos aparezca un listado con las facturas vencidas de ese periodo.
0 a 1 meses, 1 a 2 meses, 2 a 3 meses, 3 a 6 meses, 6 a 12 meses. 12 a 24 meses, 24 a 36 meses y más de 36 meses.
Siguiendo la regla de oro de que todo lo que se pueda calcular en el script hay que hacerlo en el script mejor que en expresiones de objetos, calculamos el rango de vencimiento y lo añadimos como un nuevo campo.
LEFT JOIN(FACTURAS)
LOAD *,
Pick(ALT(
IF(Interval(today()-FechaVencimiento,'D') <30, 1),
IF(Interval(today()-FechaVencimiento,'D') <60, 2),
IF(Interval(today()-FechaVencimiento,'D') <90, 3),
IF(Interval(today()-FechaVencimiento,'D') <180, 4),
IF(Interval(today()-FechaVencimiento,'D') <365, 5),
IF(Interval(today()-FechaVencimiento,'D') <730, 6),
IF(Interval(today()-FechaVencimiento,'D') <1095, 7),
8),
'0 a 1', '1 a 2', '2 a 3', '3 a 6', '8 a 12', '12 a 24', '24 a 36',' más 36 meses') &' meses' AS RangoDeuda
RESIDENT FACTURAS;
LOAD *,
Pick(ALT(
IF(Interval(today()-FechaVencimiento,'D') <30, 1),
IF(Interval(today()-FechaVencimiento,'D') <60, 2),
IF(Interval(today()-FechaVencimiento,'D') <90, 3),
IF(Interval(today()-FechaVencimiento,'D') <180, 4),
IF(Interval(today()-FechaVencimiento,'D') <365, 5),
IF(Interval(today()-FechaVencimiento,'D') <730, 6),
IF(Interval(today()-FechaVencimiento,'D') <1095, 7),
8),
'0 a 1', '1 a 2', '2 a 3', '3 a 6', '8 a 12', '12 a 24', '24 a 36',' más 36 meses') &' meses' AS RangoDeuda
RESIDENT FACTURAS;
Como vemos, el LEFT JOIN se hace leyendo la propia tabla (LEF JOIN Y RESIDENT tienen como origen y destino la misma tabla), sin necesidad de usar una tabla auxiliar intermedia.
Utilizo ALT() por evitar los IF anidados, que siempre son más engorrosos, pero como ALT() sólo devuelve valores numéricos y no puede devolver directamente el nombre del rango, hay que recoger su valor en un PICK() .
El resultado final del ejemplo sería algo así:
Cuando el usuario elige un rango, la tabla se filtra automáticamente.