Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-07-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
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
__________________
Sonrie al mundo, y el mundo te sonreirá :)

Última edición por Giniromero fecha: 23-07-2003 a las 18:41:07.
Responder Con Cita
  #2  
Antiguo 23-07-2003
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 23-07-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
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
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #4  
Antiguo 23-07-2003
vegalisandro vegalisandro is offline
Registrado
 
Registrado: jul 2003
Ubicación: Lanus - Buenos Aires - Argentina
Posts: 7
Poder: 0
vegalisandro Va por buen camino
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
Responder Con Cita
  #5  
Antiguo 23-07-2003
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #6  
Antiguo 23-07-2003
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 23
kinobi Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 24-07-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
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
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 05:32:55.


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
Copyright 1996-2007 Club Delphi