PDA

Ver la Versión Completa : ¿Cual es la diferencia entre Find Key y Goto Key?


Jere_84
05-04-2012, 21:46:19
Quiero saber cual es al diferencia entre estas técnicas de búsqueda que tienen los ClientDataSet. Lo mismo con Find Nearest que diferencia tienen con Goto Nearest?

Saludos y gracias

ecfisa
05-04-2012, 23:15:22
Hola.

FindKey busca un valor sobre el índice activo; se posiciona y devuelve verdadero si lo encuentra de otro modo devuelve falso.

if ClientDataSet1.FindKey([Edit1.Text]) then
...


Del mismo modo GotoKey devuelve verdadero si halla el dato y falso si no.
En conjunto con SetKey se usa cuando nos encontramos ante un índice de expresiones de dBase. Por ejemplo para buscar un artículo por codigo + marca, no servirá hacer:

ClientDataSet1.FindKey([Edit1.Text, Edit2.Text]);

En su lugar:

ClientDataSet1.SetKey;
ClientDataSet1['CODIGO']:= Edit1.Text;
ClientDataSet1['MARCA']:= Edit2.Text;
ClientDataSet1.GotoKey; // o GotoNearest

En la ayuda de Delphi y en La cara oculta de Delphi 4 que podés descargar del [FTP de Club Delphi] (http://terawiki.clubdelphi.com/Delphi/Manuales/) encontrarás información más detallada.

También te podría interesar revisar el metodo Locate.

Un saludo.

Jere_84
05-04-2012, 23:21:01
Gracias sigo sin entender la diferencia, los dos se basan en indices? de que caso me sirve utilizar uno u otro?

Voy a leer la cara oculta.

ecfisa
05-04-2012, 23:36:14
Gracias sigo sin entender la diferencia, los dos se basan en indices? de que caso me sirve utilizar uno u otro?

Si, los dos se basan en índices.
Como te dije anteriormente en el caso de los índices de expresiones no te sirve utilizar FindKey.

Saludos.

Jere_84
09-04-2012, 14:19:35
Bueno entonces la diferencia seria que GotoKey y GotoNearest pueden utilizarse en indices basados en expresión dBase. En este tipo de indices FindKey y FindNearest se niegan rotundamente a trabajar lanzando una excepción. ¿Estoy en lo correcto?

ecfisa
09-04-2012, 18:32:52
Hola Jere_84.

Así es. Creo que este fragmento de La cara oculta de Delphi 4 lo explica más claramente:


(Pag. 406)

¿ Por qué existe SetKey ?
Además de cualquier motivo filosófico o espiritual que puedan alegar ciertos libros de Delphi que circulan por ahí, Setkey existe por que existen los índices de expresiones de dBase; de no ser por esta razón, SetKey pudiera quedar como un método interno de la implementación de la VCL.

En este tipo de índices, FindKey y FindNearest se niegan rotundamente a trabajar: el primer paso de estos métodos es "repartir" los valores de lista pasada como parámetro entre los campos que forman el índice. per en un índice de expresiones no es sencillo determinar cuáles son los campos que forman el índice; en realidad es algo que no se intenta en absoluto.

Por ejemplo, tomemos una tabla que tenga los campos Nombre y Apellidos, y cuyo índice activo sea un índice basado en la expresion Nombre + Apellidos. Hay dos campos involucrados en el índice, y un programador inocente puede verse tentado a programar algo así:

Table1.FindKey(['Howard', 'Lovecraft']); // No funciona

¿ Cuál es el valor que debe tomarse como nombre y cuál debe tomarse como apellido ? Delphi no lo sabe. Y tanto FindKey como FindNearest están programados para lanzar una excepción si el índice activo es un índice de expresiones.
...


Saludos.