PDA

Ver la Versión Completa : Disablecontrols en una relación master detail


pabloparra
20-02-2008, 15:30:49
Hola a Todos

Necesito urgente que alguien me ayude a solucionar el siguiente problema:

Tengo una tabla maestra en un componente TQuery y una Tabla Detalle en otro componente TQuery, las tablas están relacionadas con una llave de tipo entero ('MAE_CONS') y las consultas SQL de cada Query son las siguientes:

-Consulta Maestro: SELECT * FROM TABLAMAESTRA

-Consulta Detalle: SELECT * FROM TABLADETALLE
WHERE MAE_CONS=:MAE_CONS
en el datasource del Querydetalle coloco el datasource del maestro y
defino el parámetro como entero

Hasta aquí todo bien:D, el sistema funciona bien, pero necesito generar un reporte en el cual tengo que recorrer la tabla maestra y el detalle para cargar los valores, lo cual lo hago de la sgt forma:


Querymaestro.Disablecontrols;
Querydetalle.Disablecontrols;
try
Querymaestro.First;
while not Querymaestro.Eof do
begin
MAE_CONS:=QuerymaestroMAE_CONS.Value;
if Querydetalle.Active then
Querydetalle.Close;
Querydetalle.DataSource:=nil;
Querydetalle.ParamByName('MAE_CONS').Value:=MAE_CONS;
Querydetalle.Open;
Querydetalle.First;
while not Querydetalle.eof do
begin
//Codigo
Querydetalle.next
end;
Querymaestro.Next;
end;
finally
Querymaestro.Close;
Querydetalle.Close;
Querydetalle.DataSource:=Datasoursemaestro;
Querymaestro.Open;
Querydetalle.Open;
Querymaestro.Enablecontrols;
Querydetalle.Enablecontrols;
end;


al ejecutar el código anterior el Querydetalle no sigue pegado del maestro,
se queda estático, es decir, se pierde el enlace automático. La verdad he intentado varias cosas pero no consigo solucionar el problema.:mad:

Por la atención prestada mis más sinceros agradecimientos.

mamaro
20-02-2008, 21:03:17
Te cuento lo que yo hago normalmente en este tipo de relaciones y de pronto te sirve:

1) En el evento AferScroll del maestro pongo
QueryDetalle.close;
QueryDetalle.ParamByName('MAE_CONS').asinteger:=MAE_CONS;
QueryDetalle.Open;

2) En el evento BeforeClose también del maestro
QueryDetalle.Close;

3) Y para recorrer todos los registros
try
QueryMaestro.First;
While not(QueryMaestro.eof) do
begin
QueryDetalle.First;
While not(QueryDetalle.eof) do
begin
// codigo
QueryDetalle.next;
end;
QueryMaestro.next;
end;
finally
QueryMaestro.Close;
end;

Yo nunca utilizo los DataSource por eso no comento tu código.

Saludos y espero te sirva. :)

jachguate
20-02-2008, 22:17:54
Hola. He editado tu mensaje para añadir la etiqueta delphi. Úsala para publicar trozos de código.

Hasta luego.

;)

Lepe
21-02-2008, 00:43:20
Para eso está implementado el BlockReadSize, la relación Maestro-Detalle sigue funcionando.

tabla.BlockReadSize := 32;
// operaciones

tabla.BlockReadSize := 0;

Saludos

pabloparra
21-02-2008, 15:52:47
Hola compañeros, muchas gracias por sus sugerencias, pero he encontrado una solución más práctica que aumenta considerablemente el rendimiento de la aplicación:
Utilizo un nuevo datasourse (dtsauxiliar) y el datasourse maestro al que están pegados todos los componentes visuales los desactivo temporalmente mientras se termina el bucle.


dtsauxiliar.Dataset:=Querymaestro;
querydetalle.Datasourse:=dtsauxiliar;
Datasoursemaestro.Enable := False;

querydetalle.DisableControls;
try
querymaestro.First;
while not querymaestro.EOF do
begin
//-----------
querydetalle.First;
while not querydetalle.EOF do
begin
//-----------
querydetalle.Next;
end;
end;
querymaestro.Next;
end;
finally
dtsauxiliar.Dataset:=nil;
dtsauxiliar.Enable := False;
querydetalle.Datasourse:=Datasoursemaestro;
querydetalle.EnableControls;
Datasoursemaestro.Enable := True;
end;

Espero que les sirva, hasta la próxima.