CREATE OR ALTER PROCEDURE CONSULTA_DESPACHOS (
ficha varchar(15),
desde varchar(10),
hasta varchar(10))
returns (
sficha varchar(15),
sconsumidor varchar(150),
smarca varchar(40),
smodelo varchar(40),
splaca varchar(10),
scolor varchar(25),
sanio integer,
sasignadoa varchar(60),
scombustible varchar(15),
sasignacion numeric(15,2),
sfecha date,
scantidad numeric(15,2),
stipodesp varchar(5),
skm integer,
sdespid integer)
as
BEGIN
FOR SELECT iif(D.ve_ficha IS NULL, D.ve_ficha, D.desp_placa),
IIF(D.desp_consnombre = 'CARTA DE RUTA', D.desp_consnombre, DE.DEP_NOMBRE),
COALESCE(V.VE_MARCA,D.DESP_MARCA),
COALESCE(V.VE_MODELO,D.DESP_MODELO),
COALESCE(V.VE_PLACA,D.DESP_PLACA),
COALESCE(V.VE_COLOR,D.DESP_COLOR),
COALESCE(V.VE_ANIO,D.DESP_VEHANIO),
IIF(D.desp_consnombre = 'CARTA DE RUTA', V.ve_asignadoa, D.desp_recibido),
C.COMB_NOMBRE, A.AS_ASACTUAL, D.DESP_FECHA, COALESCE(D.DESP_CANT,0),
D.DESP_TIPO, D.DESP_KM, D.DESP_ID FROM DESPACHOS D
LEFT JOIN VEHICULOS V ON V.ve_id = D.ve_id
LEFT join ASIGNACION A ON A.ve_id = D.ve_id
LEFT JOIN COMBUSTIBLES C ON C.comb_id = D.desp_comb
LEFT JOIN departamentos DE on DE.dep_id = D.desp_consumidor
WHERE D.ve_ficha NOT IN ('TANQUE') AND D.desp_estado = 1
AND D.desp_fecha >= :DESDE and D.DESP_FECHA <= :HASTA
and D.VE_FICHA = :FICHA OR D.desp_placa = :FICHA
ORDER by D.DESP_FECHA DESC
INTO :SFICHA, :SCONSUMIDOR, :SMARCA, :SMODELO, :SPLACA, :SCOLOR,
:SANIO, :SASIGNADOA, :SCOMBUSTIBLE, :SASIGNACION, :SFECHA, :SCANTIDAD, :STIPODESP, :SKM, :SDESPID DO
BEGIN
SUSPEND;
END
END
El objetivo es encontrar despachos tanto por el no. de ficha o por placa del vehículo, hasta ahora todo bien, pero tiene dos problemas:
1) La consulta es bastante lenta, todos los left join tiene su índice creado.
2) Mientras la consulta se hace por una ficha o placa que no esté en el catálogo de vehículos no funciona el filtro entre fechas, me lo muestra todos, más sin embargo, los que sí están en el catálogo sí funciona ese filtro.
¿Hay una mejor forma de hacer esa consulta?.
Saludos.