Buen día compañeros, tengo un Select que uso para un Reporte de Antiguedad de Saldos por Factura, del cual me obliga revisarlo muy bien, consume muchos recursos al servidor al momento de que alguien genera dicho reporte, aparte que tarda de masiado tiempo ( 10 a 15 mins ) depende del rango de fecha especificado, el reporte muestra aquellos clientes con sus facturas desglosado por X etapa de vigencia de la Factura por ejemplo:
FACTURA FECHA VENCIM Normal 15DIAS 30DIAS ....
CLIENTE : JOSE SANCHEZ
FA-00001 01-12-2007 16-01-2008 0.00 0.00 6,800.00
FA-00002 02-01-2008 18-01-2008 0.00 3,400.00 0.00
FA-00003 04-04-2008 20-01-2008 200.00 0.00 0.00
_______ ________ ________
TOTAL CLIENTE : JOSE SANCHEZ 200.00 3,400.00 6,800.00
...........
Y asi sucesicamente
..............
Tengo el siguiente select:
Código SQL
[-]
SELECT V.CLAVE,V.NOMBRE,C.CLIENTE,CC.NOMCLI,C.TIPOMOV||C.FOLIO FOLMOV,C.FECHAMOV,C.FECVENCI,
//NORMAL
(
FUD_ROUND((SELECT COALESCE(SUM(FUD_ROUND(IMPORTE,2)),0) FROM TCXC_CARABO WHERE CAST('31.12.2007' AS DATE) -
FECHAMOV <15 AND FECHAMOV<='31.12.2007' AND CARABO = 1 AND CLIENTE = C.CLIENTE AND TIPOMOV = C.TIPOMOV AND
FOLIO = C.FOLIO AND CVEDOCUM <> 'CREM'
)
-
(SELECT COALESCE(SUM(FUD_ROUND(IMPORTE,2)),0) FROM TCXC_DCARABO WHERE CAST('31.12.2007' AS DATE) - FECHAFAC
< 15 AND FECHAMOV<='31.12.2007' AND CARABO = 2 AND CLIENTE = C.CLIENTE AND REFERENCIA = C.TIPOMOV||C.FOLIO),2))
VNORMAL,
//15 DIAS
(FUD_ROUND((SELECT COALESCE(SUM(FUD_ROUND(IMPORTE,2)),0) FROM TCXC_CARABO WHERE CAST('31.12.2007' AS DATE) -
FECHAMOV >=15 AND CAST('31.12.2007' AS DATE) - FECHAMOV <30 AND CARABO = 1 AND CLIENTE = C.CLIENTE AND
TIPOMOV = C.TIPOMOV AND FOLIO = C.FOLIO AND CVEDOCUM <>'CREM')
-
(SELECT COALESCE(SUM(FUD_ROUND(IMPORTE,2)),0) FROM TCXC_DCARABO WHERE CAST('31.12.2007' AS DATE) - FECHAFAC >=
15 AND CAST('31.12.2007' AS DATE) - FECHAFAC <30 AND FECHAMOV<='31.12.2007' AND CARABO = 2 AND CLIENTE = C.CLIENTE
AND REFERENCIA = C.TIPOMOV||C.FOLIO),2)) V15DIAS,
//30 DIAS
(FUD_ROUND((SELECT COALESCE(SUM(FUD_ROUND(IMPORTE,2)),0) FROM TCXC_CARABO WHERE CAST('31.12.2007' AS DATE) -
FECHAMOV >=30 AND CAST('31.12.2007' AS DATE) - FECHAMOV <45 AND CARABO = 1 AND CLIENTE = C.CLIENTE AND TIPOMOV =
C.TIPOMOV AND FOLIO = C.FOLIO AND CVEDOCUM <>'CREM')
-
(SELECT COALESCE(SUM(FUD_ROUND(IMPORTE,2)),0) FROM TCXC_DCARABO WHERE CAST('31.12.2007' AS DATE) - FECHAFAC >=
30 AND CAST('31.12.2007' AS DATE) - FECHAFAC <45 AND FECHAMOV<='31.12.2007' AND CARABO = 2 AND CLIENTE = C.CLIENTE
AND REFERENCIA = C.TIPOMOV||C.FOLIO),2)) V30DIAS,
..............................
................................
FROM TCXC_CARABO C
JOIN TCXC_CLIENTES CC ON (CC.NUMCLI = C.CLIENTE)
JOIN TFAC_VENDGRUPOS V ON (V.CLAVE = CC.CLAVEN)
WHERE
CAST('31.12.2007' AS DATE) - C.FECHAMOV >= 0 AND
C.CARABO = 1
GROUP BY
......
ORDER BY
.......
Si ejecuto el Select que señalo no tarda ni 1 seg. en executarse, pero me muestra todos las
facturas de cada cliente en ceros que son las liquidadas, por lo tanto hay que meterle un filtro
ya sea en el Where ó dentro del Having del Group By, lo que hago es lo siguiente, en el Having:
Código SQL
[-]
.....
HAVING
//NORMAL
(FUD_ROUND((SELECT FUD_ROUND(COALESCE(SUM(FUD_ROUND(IMPORTE,2)),0),2) FROM TCXC_CARABO
WHERE CAST('31.12.2007' AS DATE) - FECHAMOV <15 AND FECHAMOV<='31.12.2007' AND CARABO = 1 AND
CLIENTE = C.CLIENTE AND TIPOMOV = C.TIPOMOV AND FOLIO = C.FOLIO AND CVEDOCUM <>'CREM')
-
(SELECT FUD_ROUND(COALESCE(SUM(FUD_ROUND(IMPORTE,2)),0),2) FROM TCXC_DCARABO
WHERE CAST('31.12.2007' AS DATE) - FECHAFAC <15 AND FECHAMOV<='31.12.2007' AND CARABO = 2 AND
CLIENTE = C.CLIENTE AND REFERENCIA = C.TIPOMOV||C.FOLIO),2)
) <> 0 OR
//15 DIAS
(FUD_ROUND((SELECT FUD_ROUND(COALESCE(SUM(FUD_ROUND(IMPORTE,2)),0),2) FROM TCXC_CARABO
WHERE CAST('31.12.2007' AS DATE) - FECHAMOV >=15 AND CAST('31.12.2007' AS DATE) - FECHAMOV <30 AND
CARABO = 1 AND CLIENTE = C.CLIENTE AND TIPOMOV = C.TIPOMOV AND FOLIO = C.FOLIO AND CVEDOCUM <>'CREM')
-
(SELECT FUD_ROUND(COALESCE(SUM(FUD_ROUND(IMPORTE,2)),0),2) FROM TCXC_DCARABO
WHERE CAST('31.12.2007' AS DATE) - FECHAFAC >=15 AND CAST('31.12.2007' AS DATE) - FECHAFAC <30
AND FECHAMOV<='31.12.2007' AND CARABO = 2 AND CLIENTE = C.CLIENTE AND REFERENCIA = C.TIPOMOV||C.FOLIO),2)
) <> 0 OR
......................
......................
Al agregarle el filtro anterior, para que me muestre solo aquellos registros donde haya facturas pendientes por pagar y esten en el
rango de antiguedad señalado, tarda alrededor de 2 mins por ciertos clientes, hay algunos que tarda 5,10,15 Segs., en realidad
tarda aprox. de 15 a 20 mins, ya intente por meterle algunos INDICES a las tablas relacionadas y si ayuda pero no mucho, ahora
bien, no he llegado a mi pregunta aun

, mi pregunta es la siguiente, se podrá en firebird 1.5.5 hacer referencia a un resultado de
un campo calculado en este caso el campo VNORMAL que es producto de 2 select's, tomarlo como referencia en el having para no
volver a ejecturar los 2 Select's por campo, es decir algo asi:
Código SQL
[-]
HAVING
VNORMAL <> 0 OR
V15DIAS <> 0 OR
.............
Ya lo intente asi, pero me marca error que el campo no existe, pero se podrá hacer algo con alguna UDF ???? ó
alguna función que venga con firebird ????
Agradezco mucho cualquier sugerencia al respecto....
Saludos....