Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-12-2005
Avatar de pborges36
pborges36 pborges36 is offline
Miembro
 
Registrado: oct 2004
Ubicación: Argentina
Posts: 192
Poder: 20
pborges36 Va por buen camino
Question 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!!

Última edición por vtdeleon fecha: 14-12-2005 a las 01:11:32. Razón: Etiqueta Delphi
Responder Con Cita
  #2  
Antiguo 14-12-2005
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #3  
Antiguo 14-12-2005
Avatar de pborges36
pborges36 pborges36 is offline
Miembro
 
Registrado: oct 2004
Ubicación: Argentina
Posts: 192
Poder: 20
pborges36 Va por buen camino
Question

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.
Responder Con Cita
  #4  
Antiguo 14-12-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 15-12-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #6  
Antiguo 15-12-2005
Avatar de pborges36
pborges36 pborges36 is offline
Miembro
 
Registrado: oct 2004
Ubicación: Argentina
Posts: 192
Poder: 20
pborges36 Va por buen camino
Question

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!!
Responder Con Cita
  #7  
Antiguo 15-12-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #8  
Antiguo 15-12-2005
Avatar de pborges36
pborges36 pborges36 is offline
Miembro
 
Registrado: oct 2004
Ubicación: Argentina
Posts: 192
Poder: 20
pborges36 Va por buen camino
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.
Responder Con Cita
  #9  
Antiguo 19-05-2011
Avatar de darkerbyte
darkerbyte darkerbyte is offline
Miembro
 
Registrado: feb 2005
Posts: 196
Poder: 20
darkerbyte Va por buen camino
Thumbs up 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
Responder Con Cita
  #10  
Antiguo 30-03-2015
cokocool cokocool is offline
Registrado
NULL
 
Registrado: mar 2011
Posts: 7
Poder: 0
cokocool Va por buen camino
gracias

muchas gracias por compartir la solucion
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 05:35:07.


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
Copyright 1996-2007 Club Delphi