Ayuda para programar un sistema de búsqueda en Delphi

Antes que nada quiero agradecerte por haberme contestado el día de ayer pero creo que no me supe explicar bien, sigo con la misma duda del like.
Estoy realizando un programilla de llamas, quiero que por medio de una búsqueda sencilla sin querys al ir introduciendo cada letra de un nombre vaya apareciendo en un dbgrid los nombres que contengan esa letras. Por ejemplo si quiero buscar todos los nombres que sean ulises, aparezcan, o si quiero buscar todos los Perez, aparezcan todos, el nombre esta compuesto por nombre-apellido paterno-apellido materno, he estado intentando esto pero no me funciona.
procedure TFLlamadas.Edit1KeyPress(Sender: TObject; var Key: char);
begin
Tllamadas.Filter:= 'NOMBRE like' + QuotedStr(strupper(Pchar(Edit1.Text))+'*');
Tllamadas.feltered:= True;
End;
Me mandaste esta respuesta:
Re: filtros con like
Experto
18/06/2007
Hola que tal: no, el like no funciona en los filtros de un componente en este caso de TTable.
El asunto esta así:
TLlamadas.Filtered := false;
TLlamadas.Filter :='NOMBRE = '+QuotedStr(Edit1.TExt);
TLlamadas.Filtered := true;
Así seria el código.
Pero antes a tu table TLlamadas tiene una propiedad FilterOptions buscala en el inspector de objectos, esta opción tiene dos opciones más llamadas foCaseInsensitive y foNoPartialCompare ha estas 2 deberás ponerlas en TRUE.
Has este movimiento y checalo. Ok
Saludos.
De lo que te conteste: Gracias por contestar mi pregunta, pero mira lo que quiero es que si tengo ULISES MONTALVO DIAZ, pueda buscarlo por ulises o por montalvo o por diaz, todo el nombre esta en un solo campo, por eso es que quería utilizar el like, es que si utilizo este código que me diste si solo pongo montalvo no me aparece nada.
Ahora con respecto a tu nota de Pero antes a tu table TLlamadas tiene una propiedad FilterOptions buscala en el inspector de objectos, esta opción tiene dos opciones más llamadas foCaseInsensitive y foNoPartialCompare ha estas 2 deberás ponerlas en TRUE.
Has este movimiento y checalo. Lo hice y ya no me mostró nada en el dbgrid al correr el código que me diste.
Ya llevo varios días con esto y no encuentro la solución soy principiante ojala puedas ayudarme.

1 respuesta

Respuesta
1
Ok, las opciones del filterOptions la primera es para que no haga diferencias entre mayúsculas y minúsculas y la otra es para que te busque texto parcialmente que es lo que tu quieres, es decir si presionas la u tendrá que mostrarte aquellos que empiezan con U.
Ahora tienes razon me falto algo, como te mencione el "like" no es reconocido por delphi, tienes que usar el comodin %, este comodin funciona como el * en windows, si en windows tu quieres buscar los archivos que tenga extension txt, le pones *.txt cierto? entonces en nuestro caso, pondras TLlamadas.Filter = 'NOMBRE = %'+QuotedStr(Edit1.TExt)+'%';
Entonces lo único que me falto seria el %, esto significa que te busque en cualquier parte del texto lo que contenga el Edit1, checalo.
Gracias por contestar de nuevo, ya hice lo que me comentaste lo tengo así:
procedure TFLlamadas.Edit1KeyPress(Sender: TObject; var Key: char);
begin
Tllamadas.Filter:= 'NOMBRE= %' + QuotedStr(Edit1.Text)+'%';
Tllamadas.feltered:= True;
End;
Y me dice que no es una expresión valida el %, lo cambie por * y me marca el mismo error, pero solo cuando lo estoy ejecutando, porque lo compile y no me marco error, cual crees que sea el problema.
Si perdón, jejejeje es asterisco igual que en windows *.
Perdón, checalo y me dices.
Saludos.
Como te escribí en mi mensaje anterior, el % lo cambie por *, y me marca el mismo error que no identifica el '%' o en su caso '*'. Gracias por seguir ayudándome.
Ok, va de nuevo. Recuerdas que te dije que las opciones del FilterOptions las pusieras en true, bueno la opción que se llama foNoPartialCompare dejala en false y la otra si dejala en TRUE.
Ahora el filter esta bien con el *, pero creo que lo estábamos haciendo mal, así seria:
Tllamadas.filtered:= False;
Tllamadas.Filter:= 'NOMBRE= ' + QuotedStr(Edit1.Text+'*');
Tllamadas.filtered:= True;
Lo único que note es que no funciona con el * al inicio, solo al final, no se cual sea la razón.
Antes que nada, gracias por seguir contestando mis preguntas, pero así como me estas diciendo ya lo he hecho, pero solo me da en el grid los que inician con la letra escrita, digamos si tengo un nombre como Juan Perez si pongo en el edit Ju, me va a dar en el grid el nombre, hasta ahí esta perfecto, pero si quiero buscar por Perez me no arroja nada, es por ello que quería utilizar like.
Si ya me di cuenta, que no funciona con el * al inicio.
Pues lo que te recomiendo es que lo hagas con Query y ahora si usas el like: digamos así:
Select * from nombreTabla
where nombre like :parametro
entonces en codigo pondrias
Query1.Active := false;
Query1.Param[0].Value :='%'+ Edit1.Text+'%';
Query1.Active := true;
Y así si debe funcionar. ¿Si me explique?

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas