FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Maestro/Detalle muy lento ADSL
En una base de datos firebird 2.5 me tarda mucho en hacer un maestro/detalle, tal era que lo cambié por otra forma, pero todavía es lento
cuando se accede a la base de datos por Ip (ADSL 6 MB). Tengo 2 TSimpleDataSet conectados cada uno a un dbgrid. TaulaC.Add('SELECT * FROM albaran where empresa='+emp); TaulaC.Add('AND ALB_CLI='+clieTic); TaulaC.Add('Order by ALB_FEC'); En el evento albaranAfterScroll(DataSet: TDataSet) TaulaCl.DataSet.CommandText:='SELECT * FROM lineas WHERE LIN_CLAVE='+QuotedStr(TaulaC.FieldByName('ALB_CLAVE').AsString)+ ' AND EMPRESA='+emp_act+' order by LIN_NUM'; Las 2 tablas tienen indices correctos. Alguién sabe como puedo arreglar este problema ? Un saludo. |
#2
|
||||
|
||||
Sí, no trabajando por internet
Bromas aparte, para trabajar cliente/servidor debes optimizar mucho las consultas para que que sólo viaje por la red lo único e imprescindible, no puedes pretender trabajar como si fuese una red local. Bueno, sí, cuando internet sea de 100 megabits. Hay cosas simples que tienes que erradicar, por ejemplo, "select *", eso no debe hacerse nunca. Por supuesto, también enlentece muchísimo los maestros/detalles que has comentado, los dblookupcombobox, las tablas, los grids que se traen todos los registros, etc. Resumiendo, tienes que optimizar muchísimo tus sqls. |
#3
|
|||
|
|||
Otras sugerencias...
tec:
Es correcto lo que menciona Casimiro Noteví, además que no veo por ningún lado que prepares tus sentencias SQL (prepare statement). Esto lo que hace es mantener compilada tu sentencia SQL del lado del servidor y posteriormente solo le envías el parámetro de del ID de tu tabla detalle. Lo que alcanzo a ver de tu código es que una y otra vez se compila la sentencia SQL cada que hay un cambio en el "scroll". Otra cosa, es altamente recomendable que limites la cantidad de registros (solo manda los que el usuario esta visualizando), no tiene caso que envíes 100 si tu "grid" solo visualizas 7, ¿me explico?. Te puedo decir que tengo una aplicación a través de internet y todo funciona de maravilla, claro que apliqué lo que explica Casimiro y los demás consejos que menciono arriba. Saludos, Gerardo Suárez Trejo |
#4
|
||||
|
||||
Además de los consejos que te han dado, yo te aconsejo que minimizes el nº de consultas lanzadas al servidor. Carga el máximo de datos posibles en local en Clientdatasets y utilizalos en lugar de volver a consultarlos al Servidor.
Por ejemplo, no necesitas lanzar consultas nuevas en cada AfterScroll. Es mucho mejor cargar todos los datos al cargar la pantalla (aunque tarde un poquito más al cargar), y después filtrar la información en local. Así pues TaulaC es un : select Numero, Fecha, Unidades, ... from Albaran where Empresa = :Empresa and Cliente = :Cliente order by Fecha Y TaulaCL es : select Clave, Producto, Unidades, Importe, ... from Lineas inner join Albaran on Albaran.Clave = Lineas.Clave where Lineas.Empresa = :Empresa and Albaran.Cliente = :Cliente order by Lin_Num Ahora cuando en el Formulario se lanze el Evento AfterScroll, en lugar de volver a consultar los datos, solo tienes que aplicar un filtro en local. Para el usuario el resultado será casi inmediato (a diferencia de lanzar otra consulta al servidor, que debido a los grandes lags de las conexiones por Internet, tendrá un retraso claramente detectable por el usuario). TaulaCL.Filter := 'Clave = ' + Taula.FieldByName('Clave').AsString; TaulaCL.Filtered := True; Espero que se entienda. Salut xiquet.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). Última edición por guillotmarc fecha: 12-01-2011 a las 12:51:02. |
#5
|
|||
|
|||
PackedRecords
Muy interesantes las respuestas.
He probado lo de traer solo los registros que se pueden mostrar en el dbgrid. La velocidad mejora muchisimo, pero al poner PackedRecord=5 cuando bajo por el dbgrid con la flecha de dirección al superar el registro 3 me vuelve a empezar por el primero y luego el 5, en vez de mostrar los siguientes 5. No entiendo ¿ porque no lo gestiona correctamente ? |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Saber si el DBGrid (Detalle) esta Vacio en Relacion Maestro/Detalle | Adrian Murua | Conexión con bases de datos | 2 | 03-01-2009 13:48:46 |
Maestro/Detalle (No graba en tabla Maestro) | teclilla | Tablas planas | 12 | 21-04-2008 20:59:54 |
Problema tabla Maestro-detalle en la q la pk de t.detalle formad por 2cods de la maes | akinom38 | Varios | 1 | 09-11-2007 19:27:44 |
Reporte Maestro/Detalle/Detalle de 4 Tablas | jovehe | Impresión | 2 | 23-03-2005 01:25:02 |
Maestro-Detalle ;Actualizar detalle a partir de un DBgrid | norberto_larios | Conexión con bases de datos | 1 | 11-09-2004 18:17:34 |
|