Algo que comentó Felipe, como para tirar la idea al aire, es que se puede hacer ese filtrado sin estar lanzando consultas.
Los datasets tienen dos propiedades que permiten trabajar con el filtrado: Filtered y Filter. La primera es de valor booleano (true/false) y permite activar o desactivar el filtro. En Filter se pone la condición de filtro.
El filtro es casi equivalente a hacer una consulta SQL con WHERE, como la que tu haces. La diferencia es que esto se aplica sobre el conjunto de datos que devuelve el query y se realiza en forma local (y no en el motor de base de datos).
Cuando activas el filtro, verás en tu dbgrid (por ejemplo) como se "ocultan" el resto de los registros y sólo se ven los que cumplen el filtro. Una vez que desactivas el filtro todo vuelve al estado original.
Por ejemplo, digamos que tu consulta inicial sobre ADOQuery3 es:
sql
SELECT * FROM Clientes
Esto te mostrará todos los registros (y con todos los campos de la tabla).
Hagamos de cuanta que ahora de ese total quieres filtrar los del mes de enero. Fácil:
delphi
ADOQuery3.Filter := 'MES = 1'; ADOQuery3.Filtered := True;
Como se aprecia, en Filter tenemos que añadir las condiciones del filtro, como si se tratase de una sección WHERE de un SQL. Eso sería algo equivalente a ejecutar el SQL:
sql
SELECT * FROM Clientes WHERE Mes = 1
Y, más tarde, para desactivarlo:
delphi
ADOQuery3.Filtered := False; ADOQuery3.Filter := ''; // preventiva
Ahora bien. Déjame decir que esto del filtrado tiene sus límites... Ten en cuenta que este filtrado se hace a nivel local y no aprovecha las bondades y velocidad que ofrece el motor de base de datos. Hay que usar esta técnica cuando los registros sean pocos. Además las condiciones que puede aceptar Filter son básicas, no intentes con algo complicado.
Lo mejor es emitir la consulta SQL con los datos filtrados (es decir con condiciones WHERE) lo más pronto posible y dejarle el trabajo duro a quien sabe hacer el trabajo eficazmente: el motor.
En tu caso debes evaluar si es tan necesario devolver de forma inicial todos los registros... Piensa si tal vez no sea más conveniente, efectivo y productivo, devolver de una sola vez los datos ya pre-filtrados.
Saludos,