Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-01-2011
tec tec is offline
Miembro
 
Registrado: dic 2009
Posts: 37
Poder: 0
tec Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 11-01-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por tec Ver Mensaje
Alguién sabe como puedo arreglar este problema ?
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.
Responder Con Cita
  #3  
Antiguo 12-01-2011
Gallosuarez Gallosuarez is offline
Miembro
 
Registrado: feb 2007
Posts: 92
Poder: 18
Gallosuarez Va por buen camino
Talking 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
Responder Con Cita
  #4  
Antiguo 12-01-2011
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 12-01-2011
tec tec is offline
Miembro
 
Registrado: dic 2009
Posts: 37
Poder: 0
tec Va por buen camino
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 ?
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

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


La franja horaria es GMT +2. Ahora son las 18:03:33.


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