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)
-   -   busqueda lenta (https://www.clubdelphi.com/foros/showthread.php?t=2435)

Giniromero 23-07-2003 18:36:16

busqueda lenta
 
Hola a todos....

Tengo una aplicación en delphi6 y con interbase7.

En el módulo principal tiene que aparecerme toda la información respecto al cliente que esté seleccionado. Tengo un Tnavigator, para irme moviendo por los registros de los cliente, y con ello, ir cambiando de ficha. También tengo un botón, que me muestra una nueva ventana, donde, puedo seleccionar el nombre de un cliente en concreto, para que se valla a su ficha, sin tener que ir moviendome con el Tnavigator, ficha por ficha.

El caso es, que aunque ese form funciona, esto es, consigo que me muestre la ficha que le indico, tarda mucho desde que doy a aceptar, hasta que se posiciona en el registro de la tabla en cuestión.

Tengo esto mismo motantado para otras tablas más pequeñas en otros puntos de mi aplicación, y no va tan lento.

Estoy usando TIBQuery y TibTables para gestionar las tablas, por que no se como se usan los IBDataSet, aunque me han dicho que irían mejor.

El código que tengo para esto es:

DENTRO DE MAIN:

procedure TFrmFxMain.MnuSeleAluClick(Sender: TObject);
begin

screen.cursor := crHourGlass;
FrmSeleAlu := TFrmSeleAlu.Create(Self);
Screen.cursor := crDefault;
TRY
//mostramos el módulo FrmSeleAlu como modal
FrmSeleAlu.Showmodal;
//si salimos del módulo con OK
if FrmSeleAlu.ModalResult = mrOK then begin
//refrescamos los datos
Refrescadatos(sender);
end;

FINALLY
FrmSeleAlu.Free;
END;



DENTRO DEL FORM QUE SE ABRE:

private
{ Private declarations }
RCampo : String; // para seleccionar la columna en la que buscamos
public
{ Public declarations }
end;

var
FrmSeleAlu: TFrmSeleAlu;

implementation
uses FxMain;
{$R *.DFM}


//procedure que gestiona el campo por el que se va a buscar en la tabla
// según radio que seleccionemos así nos busca en un campo o en otro
// el texto que escribimos en EditBuscar
procedure TFrmSeleAlu.RadioGroup1Click(Sender: TObject);
begin
EditBuscar.Text := '';

Case RadioGroup1.ItemIndex of
0:RCampo := 'APENOM';
1:RCampo := 'NUMALU';
2:RCampo := 'NIFALU';
3:RCampo := 'NOMALU';
end;


EditBuscar.SetFocus;

end;


//al mostrarse el form ponemos el cursor en el EditBuscar y le damos el valor por defecto al radiogroup1
procedure TFrmSeleAlu.FormShow(Sender: TObject);
begin
EditBuscar.Setfocus;
RadioGroup1Click(self);
end;


//si cambiamos los datos del EditBuscar, busca en la tabla lo que este tiene
procedure TFrmSeleAlu.EditBuscarChange(Sender: TObject);

begin

TbAlumnos.Locate(Rcampo,(EditBuscar.Text), [lopartialKey]);

end;

//cuando hacemos dobleclick sobre el grid o damos a aceptar, buscamos el alumno
//que figure en nuestra tabla de alumnos, dentro de alumnos de FxMain, y salimos
//con modal OK
procedure TFrmSeleAlu.DBGrid1DblClick(Sender: TObject);
begin
FrmFxMain.TbAlumnos.Locate('NUMALU',(TbAlumnosNUMALU.AsVariant), []);
ModalResult := mrOK;
end;


CUESTIÓN:

1) Como hago para que no me vaya tan lenta la aplicación al situarme en la ficha concreta, (no va tan lento mientras vas escribiendo en el campo "EditBuscar", te lo va mostrando en el tdbGrid los cambios de registro, y una vez que llegas al que tu quieres, que es cuando haces doble click sobre el Grid o das a OK, tarda al rededor de 30 seg.)

2) Sabría explicarme alguien, como se usan los IBDataSet? Tengo entendido que permite especificar una accion SQL para cada acción IBDataSet, (esto es insert, modif...), pero con la documentación no me aclaro, y no se como se hace esto. ¿alguien podría pasarme un ejemplo, o decirme donde puedo enterarme de como usar esto?

Muchas Gracias por todo
Virginia

jachguate 23-07-2003 19:06:18

Creo que tu problema está en la utilización del método Locate, que hace un barrido de la tabla.

Te valdria mas utilizar FindKey, no con el nombre del cliente, sino con su código (o el campo clave, pues) que de cualquier forma ya lo sabes (o podrias saberlo) cuando el usuario selecciona uno.

Hasta luego.

;)

Giniromero 23-07-2003 19:16:01

el problema es que como estoy usando Interbase, lo que estoy usando son TIBTables, no las TTables, y por desgracia, el findKey, no me funciona con estas. De hecho, he tenido que cambiar todos los finkey que tenía mi aplicación, (pues estoy cambiando de paradox a interbase), por locate.

Alomejor tengo que añadir algo en uses de interfaces para que tambien puedan funcionar los finkey con los TIBTables... si es así te agradecería que me comentases como hacer.

Muchas gracias

Virginia

vegalisandro 23-07-2003 19:18:23

Por empezar, se recomienda no utilizar muchos objetos Tables, debido a que estos son mas lentos, quizas la lentitud sea tambien el tema de que tengas demasiados registros y el locate va a hacer que esto sea lento de por si. En cuanto a como utilizar IBDataSet, no es muy dificil, de hecho es muy parecido al IBQuery, lo que tenes que hacer es agregar las sentencias de Update, Insert, Delete, Refresh y Select, las primeras tres sentencias estan relacionadas con la actualizacion de datos y la cuarta se va a ejecutar cuando dispares un refresh y el select cuando debas traer los datos. Seguramente el IBDataSet va a ser el mas rapido, pero probalos.

Saludos

jachguate 23-07-2003 19:20:55

Pues nunca he utilizado IBTables, así que lamento no poder ayudarte mas. Sin embargo creo que debieran tener un método equivalente a FindKey... no te parece lógico?

Te recomiendo que leas la documentación detenidamente.

Hasta luego.

;)

kinobi 23-07-2003 20:32:47

Hola,

Cita:

Posteado originalmente por Giniromero
Alomejor tengo que añadir algo en uses de interfaces para que tambien puedan funcionar los finkey con los TIBTables...
No tengo a mano un Delphi para comprobarlo, pero creo recordar que el método FindKey no está implementado en IBX. Solución alternativa: método Locate.

A tener en cuenta que no todos los métodos disponibles en los componentes de acceso para el BDE están disponibles en IBX (o caso de estarlo, que proporcionen la misma funcionalidad). Aunque ambas ramas de componentes, BDE e IBX, derivan de un antecesor común, TDataSet, existen abundantes cambios una vez que las ramas de la jerarquía se separan.

Por otro lado, como se ha comentado ya en el hilo, TIBTable no es la mejor opción para trabajar con InterBase. Alternativas: TIBQuery, TIBDataSet.

Saludos.

Giniromero 24-07-2003 09:36:48

Lo primero gracias a todos por vuestros comentarios.

Cita:

quizas la lentitud sea también el tema de que tengas demasiados registros
La verdad es que si, tengo muchos registros, pero con un findkey, a una TTable que estaba conectada a la misma tabla en paradox, la busqueda es casi inmediata. Si tenemos en cuanta que es más robusta interbase, ¿no debería ser más rápida buscando en el mismo número de registros?

Cita:

Uso de TIBDataSet: agregar las sentencias de Update, Insert, Delete, Refresh y Select, las primeras tres sentencias estan relacionadas con la actualizacion de datos y la cuarta se va a ejecutar cuando dispares un refresh y el select cuando debas traer los datos.
Ya he visto que tienes que usar sql como en las TIBQuerys, pero que tienes que darle código a cada sentencia por separado(Update....), ¿pero que tipo de codigo? ¿SQL, o el del propio delphi?
¿alguien tiene un ejemplo sencillo para que me haga una idea?


Cita:

Por otro lado, como se ha comentado ya en el hilo, TIBTable no es la mejor opción para trabajar con InterBase. Alternativas: TIBQuery, TIBDataSet.
El problema es que si trabajas con tablas en las que necesitas insertar registros nuevos, no puedes usar TIBQuery, pues estos no te permiten añadir registros, tiene que ser o la TIBTable, o la TIBDataSet, que como ya he comentado, seguro que es la mejor elección, pero, por desgracia, en la documentación que viene con el delphi, no me queda claro su funcionamiento.


Un saludo.

Virginia


La franja horaria es GMT +2. Ahora son las 08:34:21.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi