Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Disablecontrols en una relación master detail (https://www.clubdelphi.com/foros/showthread.php?t=53416)

pabloparra 20-02-2008 15:30:49

Disablecontrols en una relación master detail
 
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:

Código Delphi [-]
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

Hola
 
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
Código Delphi [-]
QueryDetalle.close;
QueryDetalle.ParamByName('MAE_CONS').asinteger:=MAE_CONS;
QueryDetalle.Open;

2) En el evento BeforeClose también del maestro
Código Delphi [-]
QueryDetalle.Close;

3) Y para recorrer todos los registros
Código Delphi [-]
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

Solucion disablecontrols en master detail
 
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.


Código Delphi [-]
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.


La franja horaria es GMT +2. Ahora son las 22:03:59.

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