PDA

Ver la Versión Completa : Tabla relativamente pequeña, muy lenta al indexarla...


JuanBCT
05-04-2005, 14:37:06
Hola a todos, espero q me puedan dar una mano con este problemita...
Tengo una tabla Paradox de Clientes, estos están ordenados por número... mi intención es que uno los pueda ubicar por nombre cuando se va escribiendo el mismo en un edit, lo q me obliga a indexarlo por nombre. Todo me funciona bien pero el problema es que es muy lento... el dbgrid tarda aproximadamente 5 segundos en cargarse, y cuando voy escribiendo el nombre, luego de apretar cada tecla tarda, también, alrededor de 5 segundos (uno puede terminar de teclear el apellido entero y por ahí ni apareció la segunda letra).

¿Hay alguna alternativa para hacer esto más rápido? La tabla tiene 1757 registros, me parece chica ya que leyendo el foro veo que los problemas de lentitud comienzan a aparecer cuando se tienen registros en el orden de decenas de miles...

Acá les paso el código, desde ya les agradezco su tiempo...


//Al activar el form
procedure TeMark_ConsuCli_form.FormActivate(Sender: TObject);
begin
Datamodule1.Client.indexname:='indexnom';
end;


//Al presionar una tecla en el Edit
procedure TeMark_ConsuCli_form.Edit1Change(Sender: TObject);
begin
Datamodule1.Client.setkey;
Datamodule1.Client['CLI_NOM']:=Edit1.Text;
Datamodule1.Client.GotoNearest;
end;


//Al cerrar el form
procedure TeMark_ConsuCli_form.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Datamodule1.Client.indexname:='indexnum';
end;

El dbgrid lo tengo relacionado directamente con la tabla Paradox, traté de hacerlo con un Query pero no me da la función GotoNearest...

De nuevo, gracias.
Juan

marcoszorrilla
05-04-2005, 14:51:38
Si se trata de tablas Paradox, mejor utiliza FindNearest.

Un Saludo.

JuanBCT
05-04-2005, 15:15:12
Hola Marcos, gracias por responder tan rápido...
Te comento que cambié GotoNearest por FindNearest, por lo que el código quedó así:


//Al presionar una tecla en el Edit
procedure TeMark_ConsuCli_form.Edit1Change(Sender: TObject);
begin
Datamodule1.Client.setkey;
Datamodule1.Client.FindNearest([Edit1.Text]);
end;

Sin embargo sigue tardando lo mismo... yo creo que tiene algo que ver con los índices; si no le cambio el índice se carga / busca rápido... ¿alguien tendrá alguna otra idea?

marcoszorrilla
05-04-2005, 15:26:40
procedure TeMark_ConsuCli_form.Edit1Change(Sender: TObject);
begin
Datamodule1.Client.FindNearest([Edit1.Text]);
end;

SetKey se utiliza solamente con Dbase.

Un Saludo.

JuanBCT
05-04-2005, 15:51:37
procedure TeMark_ConsuCli_form.Edit1Change(Sender: TObject);
begin
Datamodule1.Client.FindNearest([Edit1.Text]);
end;

SetKey se utiliza solamente con Dbase.

Un Saludo.
Gracias Marcos, saqué el setkey y funciona.... pero sigue siendo lento... :confused:

marcoszorrilla
05-04-2005, 16:30:26
Y cuántos registros tiene esa tabla?.


Un Saludo.

JuanBCT
05-04-2005, 16:38:37
La tabla tiene 1757 registros, si no cambio el índice funciona rápido... el tema es cuando paso el nombre al indexname (indexnom en este caso) y cuando realiza la búsqueda con cada FindNearest...

marcoszorrilla
05-04-2005, 19:28:01
Pues no tiene explicación que con tampocos registros vaya lento, porque no generas los índices de nuevo y nos dices como resulta, yo busco con más de 100.000 registros y va rápido.

Un Saludo.

vtdeleon
05-04-2005, 20:20:45
Saludos.

Otro asunto es que tipo de maquinas utilizas?
Cuanto Procesador, memoria,....?
Estas en Red?

Ing_Fajardo
05-04-2005, 20:54:33
Mi metodo es el siguiente

Uso un control combobox que tenga autocompletar ( como los de kdsdev.com, con skin)

La lista de nombres las paso al combobox por programacion y listo, valido el nombre cuando pierde el foto el combobox.

Es mas programacion, pero es mas rapido que cualquier otro metodo.

jachguate
05-04-2005, 22:40:07
Saludos.

Otro asunto es que tipo de maquinas utilizas?
Cuanto Procesador, memoria,....?
Estas en Red?

La búsqueda sobre un índice de mil y tantos nodos debiera volar incluso en una 286 con unos cuantos Kb de memoria...

Hasta luego
;)

JuanBCT
07-04-2005, 17:05:15
Hola! Gracias a todos por sus respuestas... en un principio pensé que se trataba de los índices por lo q los volví a definir, probé otra vez y seguía lento. Luego hice una prueba haciendo un programa nuevo; con un form con dbgrid q me mostrase la tabla y un RadioButton para cambiar el índice... funciona bien (rápido)!!

Evidentemente hay algo en el programa que lo lentifica, que podría llegar a ser? Estoy buscando pero no encuentro nada.... alguna idea?

Les agradezco a todos por su tiempo.

Juan

vtdeleon
07-04-2005, 22:20:11
Saludos.

Cuales y cuantos componentes(DB) usas en ese formulario?
Es un formulario MDI y/o usas Datamodule?
muestranos los codigos que utilizas para la funcionabilidad de ese form!

Hasta luego.

JuanBCT
08-04-2005, 03:47:10
Hola vtdeleon! Uso un DbGrid para mostrarla, pero no creo q sea esa la causa ya que en todo el programa anda así; porque no sólo ahí la muestro. Tengo la "ficha de clientes" donde muestro todos los campos para hacerles Alta / Baja / Modificaciones, etc., y con el bóton que uso para cambiar de ficha (NombreDeTabla.Next o NombreDeTabla.Prior) también noto que tarda bastante.
Uso un Datamodule para manejarlo, en la prueba que hice también lo definí asi y anduvo bien...
Mañana en el trabajo te muestro el código de los form... (no tengo el proyecto aquí), aunque creo q el problema pasa por otro lado.
Gracias...

JuanBCT
11-04-2005, 21:16:48
Hola! Solucioné el problema, lo que pasaba era que cada query que había en mi programa estaba en Active:=true desde la creación del form... los puse en false (igual los desactivaba y volvía a activar al ejecutar los queries).....
Ahora funciona todo como debería, gracias a todos por ayudarme.
Saludos!
Juan