Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   como filtro en un TQuery? (https://www.clubdelphi.com/foros/showthread.php?t=28235)

pborges36 14-12-2005 00:01:42

como filtro en un TQuery?
 
Hola a todos: Necesito una ayudita, tengo un TQuery (con una consulta obviamente) para mostrar mi lista de productos de una tabla de MySql. Le hice una busqueda que en realidad es un filtro, que a medida que se ingresan las letras se va filtrando el TQuery. Hasta ahi todo ok, pero me filtra solo por las letras de comienzo del nombre del producto, lo que necesito ahora que que me filtre los productos que contengan esos caracteres en cualquier posicion del nombre del producto. Utilizo Deplhi6. el codigo es mas o menos asi:
en el evento onchange del edit en el que ingreso el nombre del producto:
Código Delphi [-]
      listq1.Query.Filter:='campo'+' = ' + QuotedStr(buscar.Text+'*');
      listq1.Query.FilterOptions:=[foCaseInsensitive];
      listq1.Query.Filtered:=(buscar.Text<>'');
      try
        listq1.Query.Filter:='campo'+' = ' + buscar.Text;
        listq1.Query.FilterOptions:=[foCaseInsensitive];
        listq1.Query.Filtered:=(buscar.Text<>'');
      except
        listq1.Query.Filtered:=false;
      end;

Como veran el flitro es buscar.text+'*';
lo que necesito es '*'+buscar.text+'*';
pero asi no funciona. Espero se entienda cual es mi problema y que me puedaqn ayudar. Gracias!!

marcoszorrilla 14-12-2005 07:25:02

No veo muy claro el asunto, pero si interpreto bien lo que quieres, yo utilizaría una Consulta con:
Código SQL [-]
 Where MiCampo Like %Letras%

Un Saludo.

pborges36 14-12-2005 21:55:47

Gracias marcoszorrilla, es lo que necesito: Where MiCampo Like %Letras%
Pero no puedo hacerlo en sql porque tendria que desactivar y activar el TQuery cada vez que se presione una tecla y en mi tabla actual tengo 13000 registros. Te imaginaras lo que tarda cada vez que se presiona una tecla. Debe haber alguna forma de hacerlo, que yo no se, desde el filter del TQuery.

Lepe 14-12-2005 23:28:08

La solución es facil:

en el evento onkeypress, solo se realiza la busqueda si se ha presionado la tecla Enter.

Y además pones un boton "solicitar consulta".

saludos

roman 15-12-2005 00:02:09

Cita:

Empezado por pborges36
en mi tabla actual tengo 13000 registros.

¿Y por qué deseas traer 13000 registros si a fin de cuentas los vas a filtrar? Aunque ésta es una vieja costumbre, la realidad es que el cliente no quiere ver tal cantidad de registros, incluso cuando piense que sí.

Si bien el filtrado conforme se escribe da un efecto atractivo, por lo general resulta en una pérdida de tiempo e ineficiencia.

Es más adecuado presentar al usuario una opción de búsqueda mediante la cuál pueda establecer uno o más criterios, y formar la consulta SQL acorde a los valores introducidos.

Dicha opción de búsqueda puede ir desde algo tan sencillo como lo que propone Lepe hasta un formulario especializado que cuente con varios campos de búsqueda.

Puedes entonces usar el evento OnFilterRecord del Query para un filtrado conforme se escribe pero sobre los resultados limitados de la consulta SQL. El evento trabajará rápido con pocos registros, lo que no sucedería con 13000.

El cliente estará satisfecho porque le estás proporcionando (en el caso de un formulario de búsqueda) un método mucho más potente para encontrar datos que un simple filtrado sobre un campo, y porque el sistema será mucho más rápido.

Si el cliente insiste, pones un botón de "Buscar todos" con la advertencia de "esto demorará algunos minutos...". Pronto se dará cuenta de que no desea ver todos los registros.

// Saludos

pborges36 15-12-2005 20:17:00

Muchas gracias por las ideas, pero la verdad es que todo eso ya lo probe y comprobe que es mucho mas rapido y mas agil como lo estoy haciendo. Es en un punto critico del sistema que es cuando se ingresan los detalles a la factura. Lo unico que necesito ahora es poder hacer ese filtro. En SQL seria:

Where MiCampo Like %Letras%

Ahora bien, necesito el equivalente en delphi, con la propiedad Filter del TQuery. Mi pregunta es: se puede hacer algo asi en Delphi? Como lo hago?


Gracias!!

roman 15-12-2005 20:25:47

Ok.

Entonces usa el evento OnFilterRecord del Query. Este evento se genera por cada registro y tú decides si aparece o no ajustando el parámetro Accept. En tu caso, por ejemplo, sería algo como:


Código Delphi [-]
Accept := AnsiContainsStr(DataSet['MiCampo'], Edit1.Text);

esto es, el registro se muestra si lo escrito en Edit1.Text está contenido en el valor de MiCampo del registro actual.

// Saludos

pborges36 15-12-2005 20:44:19

Asi es Roman, eso es mas o menos lo que necesito, pero una pregunta:

el filter del TQuery sigue igual?

Query.Filter:=campo+' = ' + QuotedStr(buscar.Text+'*');

Porque me sigue filtrando igual.
:)

darkerbyte 19-05-2011 17:48:20

Aqui la respuesta, luego de 6 años
 
Bueno, yo tenia el mismo problema, la consulta es demasiado compleja para estar repitiendo cada vez q el usuario presionaba una tecla en el edit.

Otras ocasiones he utilizado un TJvDBFindEdit de los controles Jedi el cual asignandole un DataSet y el campo ya no hay que programar nada mas. Funciona excelente a excepción de que cuando utilizas el mismo query para diferentes consultas, el control empieza a generar excepciones ya que las nuevas consultas no tienen el campo que tiene asignado para filtrar.

Esto es un dolor de cabeza y por mas que busque no logre hecharlo a andar correctamente (hay que reportar ese error a la comunida de JEDI).
Asi que estuve buscando otras alternavitas prara crear un filtro sobre un TZQuery (ZeosLib)
Aqui la respuesta:

En el Evento OnChange de un edit (en este caso, sEdit5)

Código Delphi [-]
    DM.ZQuery.Filter := 'descripcion LIKE '+#39+'*'+sEdit5.text+'*'+#39;
    DM.ZQuery.FilterOptions := [foCaseInsensitive];
    DM.ZQuery.Filtered := (sEdit5.Text <> '');
   //descripción es el nombre del campo sobre el cual se va a filtrar

Y eso es todo! Probablemente muchos ya lo sabían pero pienso que al igual que yo, mucha gente desconoce este truco, de hecho estuve buscando en muchos hilos.

Este filtro funciona como un "WHERE CAMPO LIKE %CONDICION%"


Salud OS

cokocool 30-03-2015 03:55:24

gracias
 
muchas gracias por compartir la solucion


La franja horaria es GMT +2. Ahora son las 06:33:24.

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