![]() |
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 |
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. ;) |
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 |
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 |
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. ;) |
Hola,
Cita:
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. |
Lo primero gracias a todos por vuestros comentarios.
Cita:
Cita:
¿alguien tiene un ejemplo sencillo para que me haga una idea? Cita:
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