PDA

Ver la Versión Completa : Locate Firebird


keys
28-07-2011, 09:46:21
Hola a todos. Tengo una tabla de clientes con unos 4000 registros. Tengo que mostrar todos los registros en un grid. Esto se hace muy rapido a través de un query (select campos from clientes order by codigo) conectado a un TDbGrid.

El problema viene cuando tengo que posicionarme en un registro en concreto, esto lo hago con un locate, si el registro es de los primeros se hace rápidamente pero si es de los últimos tarda un rato.

El problema viene dado por que el locate se recorre todos los registros hasta encontrar el que busca y si es el de los últimos por eso tarda más.

La pregunta es, hay alguna forma de posicionarse en un registro concreto de una forma más rápida?. Un Saludo y Gracias.

Casimiro Notevi
28-07-2011, 09:59:29
Bueno, para empezar, ¿para qué se quiere 4000 registros en la pantalla?, ¿para estar con las teclas arriba y abajo?, si va a buscar uno en particular pues pon un filtro y te traes los que busque únicamente.
Si no queda más remedio que tenerlos todos en la pantalla, entonces usa una tabla en memoria, tipo tkbmemtable, por ejemplo, su sistema de búsqueda con índices es hiperultrasupermegarapidísimo :D

keys
28-07-2011, 12:47:41
Tu lo has dicho, tiene que tener 4000 registros para estar con las teclas para arriba y para abajo. O lo que es mejor tener la lista de todos sus clientes y moverse entre ellos rapidamente sin tener hacer filtros.

El usuario no quiere buscar uno en concreto, ya que sino haría un filtro como tu dices, sino posicionarse en uno en concreto para trabajar con el.

GRACIAS

Casimiro Notevi
28-07-2011, 13:48:36
Tu lo has dicho, tiene que tener 4000 registros para estar con las teclas para arriba y para abajo. O lo que es mejor tener la lista de todos sus clientes y moverse entre ellos rapidamente sin tener hacer filtros.
El usuario no quiere buscar uno en concreto, ya que sino haría un filtro como tu dices, sino posicionarse en uno en concreto para trabajar con el.
GRACIAS

O sea, para no perder tiempo en poner "GOMEZ" y dar al botón buscar, prefiere darle cuatro mil veces a la tecla del cursor, que es más rápido, vale.
Pues nada, que siga así, cuando tenga mil millones de clientes se hartará de reir :D:D:D

duilioisola
28-07-2011, 16:16:18
También puedes tener una tabla que tenga solo codigo y nombre de cliente y que cuando cambie de registro muestre todos los demás datos en otras tablas.

TClientes (ID, Nombre)
TCliente (ID, Nombre, Direccion, etc.)

Unes las dos tablas por el DataSource. (Haces un maestro/detalle)
TCliente.DataSource := TClientes;

En el grid muestras solo ID y nombre de la tabla TClientes.

Quedaría algo asi:

TClientes.AfterOpen
begin
TCliente.Open;
end;

TClientes.BeforeClose
begin
TCliente.Close;
end;

Locate
begin
TClientes.DisableControls;
TClientes.Locate(...);
TClientes.EnableControls;
end

PepeLolo
29-07-2011, 01:03:03
Pardon, pero eso de mostrar 4000 registros es una ....., no tiene ninguna justificación. De todas formas yo siempre obligo al usuario a filtrar por los campos que muestro en la rejilla.

De que sirve mostrar 4000 registros, si el registro que va a necesitar el 99% de los casos nunca será de los primeros, ni de los que estén a la altura del registro activo. De todas formas yo siempre ejecuto SQL, locate no sirve para bbdd y cargar información en tablas de memoria no veo que sea una solución. Al usuario hay que proporcionarle los medios correctos no los que el considere que son, sobre todo cuando hablamos de acceso a datos.