Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   Subconsulta dentro de un QuickReport.. Utilizo tablas Paradox..Ayudaaaa Please... (https://www.clubdelphi.com/foros/showthread.php?t=61781)

dinover7 21-11-2008 17:23:18

Subconsulta dentro de un QuickReport.. Utilizo tablas Paradox..Ayudaaaa Please...
 
Tengo un problemon...

tengo 2 tablas paradox.. Empleados y Inasistencias...


cuando tiro un reporte quickreport.. muestro los datos de los empleados, y tengo que revisar en la base de datos de inasistencias, cuantas veces falto esee empleado , en un periodo de tiempo entre 2 fechas...

esa subconsulta.. la hago en el evento.. OnStartPage, del quick report.. aveces funciona bien..otras veces.. se tilda.. se me cierra la aplicacion porque dice que tengo demasiadas tablas abiertas...

CUAL ES LA FORMA CORRECTA DE HACERLO...

PEGO EL CODIGO:


este es el codigo de cuando se carga el quickreport:


DBSearch.DatabaseName := 'dbs\';
DBSearch.SQL.Clear;
DBSearch.SQL.Add('SELECT * FROM EMPLEADO.DB WHERE COOPERATIVA LIKE '+quotedstr('%'+wndmain.cbCooperativa.text+'%')+ ' AND TRABAJO_ASIGNADO LIKE '+quotedstr('%'+wndmain.cbPuestoTrabajo.Text+'%')+ ' AND HABILITADO LIKE '+quotedstr('%SI%'));
DBSearch.SQL.Add(' ORDER BY APELLIDO') ;
DBSearch.ExecSQL ;

quickrep1.DataSet := dbSearch;

dbsearch.Active := true;



Este es el codigo que tengo en el evento OnStarPage: del quickrepott:



Monto_Inasistencia := 0;

dbInasistencias.DatabaseName := 'dbs\';
dbinasistencias.Active:=false;
dbInasistencias.SQL.Clear;
dbInasistencias.SQL.Add('SELECT * FROM '+ 'INA2008.db' + ' WHERE DNI= :DNI AND FECHA >= :fecha1 AND FECHA<= :fecha2' );


dbInasistencias.Params.ParamByName('DNI').AsInteger := dbsearch.FieldValues['DNI'];
dbInasistencias.Params.ParamByName('fecha1').AsDate:= wndmain.pImpresionFrom;
dbInasistencias.Params.ParamByName('fecha2').AsDate:= wndmain.pImpresionTo;

dbInasistencias.ExecSQL;
dbInasistencias.Open;


while not dbInasistencias.Eof do
begin

// repita y almacena el monto de descuento
monto_Inasistencia := monto_Inasistencia + dbInasistencias.FieldValues ['MONTO'];


dbInasistencias.Next;

end;


dbInasistencias.Active:=true;



BUENO, AGRADECERE MUCHISIMO SI ALGUIEN ME DA UNA MANO...


ya no se que tocar...

gracias.

si alguno tiene un email para el msn, mejor.. mil gracias !!!
leandro

Caral 21-11-2008 21:31:40

Hola
No se lo que haces, pero hay varias contradicciones.
Creo que esta mejor asi:
Código Delphi [-]
DBSearch.DatabaseName := 'dbs\';
DBSearch.SQL.Clear;
DBSearch.SQL.Add('SELECT * FROM EMPLEADO.DB WHERE COOPERATIVA LIKE '+quotedstr('%'+wndmain.cbCooperativa.text+'%')+ ' AND TRABAJO_ASIGNADO LIKE '+quotedstr('%'+wndmain.cbPuestoTrabajo.Text+'%')+ ' AND HABILITADO LIKE '+quotedstr('%SI%'));
DBSearch.SQL.Add(' ORDER BY APELLIDO') ;
quickrep1.DataSet := DBSearch;
dbsearch.Active := true;

Código Delphi [-]
Monto_Inasistencia := 0;
dbInasistencias.DatabaseName := 'dbs\';
dbInasistencias.SQL.Clear;
dbInasistencias.SQL.Add('SELECT * FROM '+ 'INA2008.db' + ' WHERE DNI= NI AND FECHA >= :fecha1 AND FECHA<= :fecha2' );
dbInasistencias.Params.ParamByName('DNI').AsInteger := dbsearch.FieldValues['DNI'];
dbInasistencias.Params.ParamByName('fecha1').AsDate:= wndmain.pImpresionFrom;
dbInasistencias.Params.ParamByName('fecha2').AsDate:= wndmain.pImpresionTo;

while not dbInasistencias.Eof do
begin
// repita y almacena el monto de descuento
monto_Inasistencia := monto_Inasistencia + dbInasistencias.FieldValues ['MONTO'];
dbInasistencias.Next;
end;
dbInasistencias.Active:=true;
Saludos

Galahad 21-11-2008 21:45:51

subconsulta dentro de un quickreport
 
a ver si te puedo ayudar...
la sentencia sql secundaria la deberias de poner junto a la otra, con la carga inicial del quickreport, con un cámbio que implique la consulta que necesitas


en lugar de
dbInasistencias.SQL.Add('SELECT * FROM '+ 'INA2008.db' + ' WHERE DNI= :DNI AND FECHA >= :fecha1 AND FECHA<= :fecha2' );
podrías poner
dbInasistencias.SQL.Add('SELECT DNI,SUM( MONTO) AS NTOTAL FROM '+ 'INA2008.db' + ' WHERE FECHA >= :fecha1 AND FECHA<= :fecha2' );

después, podrías crear una relación 'master-detail' entre las dos consultas con la propiedas 'mastersource', relacionandolas por la columna DNI.
Por último, ya podrías en el quickreport hacer referencia a los datos de esas faltas utilizando un componente TQREXPR, en el evento Onprint puedes poner : 'value := dbinasistencias.fieldbyname('ntotal').value

Espero te sirva...


La franja horaria es GMT +2. Ahora son las 18:27:40.

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