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)
-   -   Findkey?? o Locate (https://www.clubdelphi.com/foros/showthread.php?t=48845)

Ubed 05-10-2007 13:18:55

Findkey?? o Locate
 
Buenas tengo un dataset relleno con mas de 10000 registros y quiero visualizarlos para kon un control movermer por ellos el problema es que al posicionarme en uno con el locate se ace muy lento, me an comentado algo de un FindKey o Find Index, que sabeis de esto??

Caro 05-10-2007 15:23:42

Hola Ubed, puedes usar los metodos FindKey (para una busqueda exacta) o FindNearest (para una busqueda aproximada) para ambos casos debes definir el campo que sera tu indice, esto lo haces en la propiedad IndexFieldNames de tu componente Table y lo usas de la siguiente manera:

Código Delphi [-]
 //busqueda aproximada
 Table1.FindNearest([Edit1.Text]);
 
//busqueda exacta
Table1.FindKey([Edit1.Text]);

Con el Locate la busqueda se hace mas rapida si tienes definido un indice, pero si no lo tuvieras hace una busqueda secuencial lo cual seria lento si tienes muchos registros.

Saluditos

Ubed 05-10-2007 16:47:08

Cita:

Empezado por Caro (Mensaje 236376)
Hola Ubed, puedes usar los metodos FindKey (para una busqueda exacta) o FindNearest (para una busqueda aproximada) para ambos casos debes definir el campo que sera tu indice, esto lo haces en la propiedad IndexFieldNames de tu componente Table y lo usas de la siguiente manera:

Código Delphi [-] //busqueda aproximada
Table1.FindNearest([Edit1.Text]);

//busqueda exacta
Table1.FindKey([Edit1.Text]);


Con el Locate la busqueda se hace mas rapida si tienes definido un indice, pero si no lo tuvieras hace una busqueda secuencial lo cual seria lento si tienes muchos registros.

Saluditos

esa funcion la puedo usar en un dataset??

basti 05-10-2007 17:35:14

FindKey no está implementado en todos los tipos de Datasets. Por lo general, aunque esto depende del tipo de dataset que uses, locate usa los índices de la tabla si existen para el campo sobre el que estás haciendo la búsqueda, por lo que no hay diferencia en cuanto a la velocidad.

Locate, además, está definido en todos los datasets.

defcon1_es 05-10-2007 18:01:13

Cita:

Empezado por Ubed (Mensaje 236365)
tengo un dataset relleno con mas de 10000 registros y quiero visualizarlos para kon un control movermer por ellos

¿Y quieres navegar entre 10.000 registros? :eek:

¿El control al que te refieres es un dbgrid?

En principio, y sin conocer más detalles, te recomiendo que te plantees filtrar previamente esa información para navegar entre los registros que realmente necesitas... asi no creo que te haga falta usar ni locate ni findkey.. no se.

jhlsys 05-10-2007 19:04:31

Sugerencia
 
Código Delphi [-] //busqueda aproximada
Table1.FindNearest([Edit1.Text]);

//busqueda exacta
Table1.FindKey([Edit1.Text]);
Para este tipo de busqueda se necesita un indice activo, y obviamente la busqueda sera precisa y te ubicara al primer registro coincidente.

Si pretendes buscarlos con el metodo locate, al ser un metodo de busqueda secuencial, sera mas lento, salvo que busques varios regiustro coincidentes, se acelera un poco si lo trabajas con un indice activo, pero si desabilitas los controles de la data, y lo activas despues de haber llegado al registro buscado,

Table1.disablecontrols;
Table1.locate(parametros de busques);
table1.enablecontrols

Pero como sugirienron, si son varios y coinicentes, seria mejor que emplees un filtro.

Ubed 08-10-2007 11:49:46

muchas gracias a todos, al final use el locate, pero ahora se me plantea otra pregunta.

Puedo utilizar un unico valor para buscar en varios campos??

kiero decir yo tengo mis registros y kier ver el k tiene el telefono 978834266 pero puede estar en 4 campos, telefono1, telefono2, telefono3, fax

Puede emplear el locate para buscar en los 4 ese valor??

basti 08-10-2007 14:58:07

Puedes usar varios locate, aunque para ese caso creo que sería mejor un filtro o una consulta sql. De todas maneras si quieres usar locate:
Código Delphi [-]
  if not Table.Locate('telefono1', numTelefono, []) then
    if not Table.Locate('telefono2', numTelefono, []) then
      if not Table.Locate('telefono3', numTelefono, []) then
          Table.Locate('telefono4', numTelefono, []);

GustavoCruz 10-10-2007 00:56:04

hola Ubed, también puedes usar esta forma:
Código Delphi [-]
if tutabla.Locate('campo1;campo2', VarArrayOf([edit1.text, edit2.text]), []) then
// lo que quieras hacer...
Puedes colocar todos los campos que quieras:)


La franja horaria es GMT +2. Ahora son las 19:58:03.

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