Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Lazarus, FreePascal, Kylix, etc. (https://www.clubdelphi.com/foros/forumdisplay.php?f=14)
-   -   múltiples filtros de consulta (https://www.clubdelphi.com/foros/showthread.php?t=77178)

anubis 29-12-2011 21:03:32

múltiples filtros de consulta
 
Hola amigos.

Estaba buscando la mejor manera de poder usar múltiples filtros en una consulta en función de checkbox, pero la única forma que se me ocurre es poner las palabras claves en diferentes strings y luego concatenarlas. No se si es lo más adecuado o existe otra forma más convincente y a la par elegante ;).

Gracias y FELIZ AÑO NUEVO!!!!

mightydragonlor 29-12-2011 22:55:01

me parece que lo mejor es el uso de procedimientos almacenados, mandas todos los parámetros a este e internamente armas un sql dinámico, preguntas que si cierto parámetro llega nulo no l tenga en cuenta, no recomiendo el uso de COALESCE ya que este mismo en una consulta con muchos registros en un where genera un scan sobre todos los registros sin filtrar, mejor armas el sql y lo qjecutas al fina, yo lo suelo hacer y me funciona muy bien.

anubis 02-01-2012 14:29:22

Hola y gracias por responder.

ando perdido.

Para una consulta lo tengo montado asi:

Código Delphi [-]
zquery1.close;
 zquery1.sql.clear;
 zquery1.sql.text:='select sum(cmonto) as suma11 FROM tcheques where cbene=:cbene2';
 zquery1.parambyname('cbene2').asinteger:=filtro2;
 zquery1.Open;
  LABEL2.CAPTION:=FloatToStrF((zquery1.Fieldbyname('suma11').asfloat),ffcurrency,8,2);
ZQUERY1.SQL.Clear;
ZQUERY1.SQL.TEXT:='select * from tcheques where cbene=:cbene2';
zquery1.ParamByName('cbene2').asinteger:=filtro2;
zquery1.active:=true;
end;

donde suma11 es un campo que he tenido que crear porque sino no me lo reconoce (uso sqlite) con firebird no hacia falta.

filtro2 es la clave por la que se busca.

Eso así funciona, lo que no tengo muy claro, teniendo en cuenta que campos string para anidar no me lo recomiendas, como se haría con los procedimientos que me dices.

un saludo y gracias

mightydragonlor 02-01-2012 14:48:14

Pos para SQL Lite no se como se haría, pero te pongo un ejemplo del sp, la invocación desde Lazarus con ZeosDB que me parece es el que usas es simple, usa un componente que sino estoy mal es el TzStoredProcedure, este control se encarga de todo, solo le pasas los valores de los parámetros y ya.
Código SQL [-]
CREATE PROCEDURE spTest
@A VARCHAR(10),
@B VARCHAR(10),
@C VARCHAR(10)
AS
BEGIN
  DECLARE @SQL VARCHAR(2000);
  SET @SQL = 'SELECT COLUMNA1, COLUMNA2, COLUMNA3, COLUMNA4 FROM TABLA WHERE ';
  IF @A IS NOT NULL
    SET @SQL = @SQL + 'TABLA.CAMPO1 = ' + @A;
  END;

  IF @B IS NOT NULL
    SET @SQL = @SQL + 'TABLA.CAMPO2 = ' + @B;
  END;

  IF @C IS NOT NULL
    SET @SQL = @SQL + 'TABLA.CAMPO3 = ' + @C;
  END;

  EXEC(@SQL);
END;


La franja horaria es GMT +2. Ahora son las 01:59:35.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi