PDA

Ver la Versión Completa : Busqueda con Locate o Lookup


noshy
12-05-2006, 16:18:21
Hola a todos, me surgio un proble,a y es el siguiente:
Tengo un Query con una tabla en la cual necesito realizar una busqueda, el tema es que necesito realizar la busqueda por un fragmento del campo, para que me entiendadn necesito que me encuentre el primer registro que contenga la cadena 'ASA', por lo cual me tiene que devolver el registro que tenga 'PASA' o 'ASADO', el problema es que lo hago con Query1.locate pero me busca por cadena completa no por fragmento, y no encuentro la funcion que lo haga. (Obviamente lo puedo hacer recorriendo registro por registro con un POS() pero al tener muchos registros se torna lenta la busqueda)

Salu2, Noshy

Acanol
12-05-2006, 16:33:19
Buenas, no se si esto te servira, con el siguiente ejemplo hace o que pides pero escribiendo en un edit, por la palabra que quieres que se realice el locate... Espero que te sirva, sino es asi dime como puedo ayudarte. ;)


Tabla:= Nombre de tu tabla;
Edit:= Nombre del edit donde escribes lo que quieres filtrar;
Campo:= El campo de la tabla el cual quieres filtrar;


//En el evento Onchange de tu edit pones lo siguiente
Código:
procedure TForm1.Edit1Change(Sender: TObject);
begin
datamodule1.Tabla.Filtered:= True; //Datamodule1, es donde se encuentra la tabla (para tenerlas un poco mas organizadas, si tienes mas de una)
end;

//En el evento OnFilterRecord de la tabla

Código:
procedure TDataModule1.TablaFilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
if datamodule1.Tabla.Locate ('Campo',unit1.Form1.Edit.text,[Lopartialkey,LocaseInsensitive]) then
accept:=true
else
accept:= false;

end;

//Si solo quieres coger letras en el "Edit", añades esto en el evento "OnKeyPress" del edit
Código:
procedure TForm1.EditKeyPress(Sender: TObject; var Key: Char);
begin

if key in ['0'..'9'] then key:=#0;

end;

noshy
12-05-2006, 16:42:00
Gracias por tu respuesta, pero no funciona, porque sigue filtrando por el campo entero no por un fragmento, yo en el campo tengo direcciones, y necesito buscar por una palabra de la direccion no por la direccion completa o sea por in LIKE de SQL, pero necesito hacerlo en memoria para que sea mas rapido. No se si el LOCATE tieme parametros como el % de SQL.

Acanol
12-05-2006, 16:49:23
Disculpa, pero a mi me funcionaba ya que lopartialkey busca que coincida una parte no todo, asi si buscamos 'A', nos mostrara lo campos Antonio Andres... vamos si no me equivoco... tal vez no te entendi lo que necesitabas. Disculpa otra vez. Si esto no te sirve por que no haces una query al campo¿? Select * from Empleado Where NOMBRE LIKE '%An%' Order by NOMBRE

QUERY1.SQL.ADD(....);
QUERY1.OPEN;

noshy
12-05-2006, 17:12:52
Disculpa, pero a mi me funcionaba ya que lopartialkey busca que coincida una parte no todo, asi si buscamos 'A', nos mostrara lo campos Antonio Andres... vamos si no me equivoco... tal vez no te entendi lo que necesitabas. Disculpa otra vez. Si esto no te sirve por que no haces una query al campo¿? Select * from Empleado Where NOMBRE LIKE '%An%' Order by NOMBRE

QUERY1.SQL.ADD(....);
QUERY1.OPEN;


Si tenes razon pero el lopartialkey te busca una cadena que comienze con la cadena de busqueda si buscas 'A' de muestra Antonio Andres, pero yo quiero que me muestre Antonio Andres buscando 'N' por ejemplo.

noshy
12-05-2006, 17:13:47
o sea que la cadena que buscas se encuentre en cualquier parte del campo y no solamente al comienzo

luisgutierrezb
12-05-2006, 18:40:10
pues para eso, puedes filtrar la tabla, algo asi como
Dataset.filter := 'Nombredelcampo like %' + buscar.text + '%';

Acanol
15-05-2006, 01:45:02
No se si lo habras solucionado, pero creo que este link te servira ;) :
http://www.clubdelphi.com/foros/showthread.php?t=31663