Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Master / Detail Quickreport (https://www.clubdelphi.com/foros/showthread.php?t=50419)

The_Duke 16-11-2007 23:39:40

Master / Detail Quickreport
 
hola a todos

tengo el siguiente problema:

Estoy haciendo una aplicasion de medicina donde nececito imprimir una receta medica el problema
es que tengo una tabla llama Tindicacion (que es la receta) contiene: El medico, la fecha y el
paciente. Otra del detalle Tdetalle_ind donde se guardan los medicamentos. Todo se hace muy Bien
pero para el reporte tengo un boton con el siguiente codigo.


Código Delphi [-]
procedure TFreceta.BitBtn8Click(Sender: TObject);
var
rep: string;
begin

Data.Tindicaciones.edit;
Data.Tindicaciones.post;
rep:=DBEdit2.Text; //uso esta variable para saver el codigo de la indicacion (receta) (odtengo el
//codigo del ultimo registro para imprimirlo de esta forma
//para imprimir uso este codigo para pasarselo al reporte que esta en el form llamado form1
Form1.ADOQuery1.close;
Form1.ADOQuery1.SQL.Text:='select * from Indicaciones WHERE Cod_ind Like'+Quotedstr('%'+rep+'%');
Form1.ADOQuery1.open;
Form1.Tdetalle.Active:=true;
Form1.Tmedicamento.Active:=true;
Form1.QuickRep1.Preview;
Data.Tindicaciones.insert;
Data.Tpaciente.insert;
Data.Tmedico.insert;
Data.Tindicaciones.edit;
DBText1.caption:=datetostr(DateTimePicker1.Date);
DBGrid1.Enabled:=false;
end;




El problema es que en el reporte avece en el detalle sale mal osea sale como un selec * ó
no sale el detalle (los medicamentos).
pero si es un registro ya guardado sale todo bien (un registro que se guardo y luego se busco y
se le dio al reporte de nuevo.
En el reporte tengo:
ADOQuery1 (El del codigo de arriva): es el maestro todo sale bien con el
ADOTable1 (Tdetalle_ind): Es la de detalle esta conectado con el QuickRep1 y solo sale bien si
estavan guardado los datos.
Todo esta bajo Ado
Como corrijo que el detalle sarga siempre bien

luego suvo un pequeño ejemplo del problema

Caral 16-11-2007 23:55:27

Hola
Me estraña mucho todo esto, tal vez nos puedes explicar un poco mas?
Código Delphi [-]
procedure TFreceta.BitBtn8Click(Sender: TObject);
var
rep: string;
begin

Data.Tindicaciones.edit; // edito la tabla
Data.Tindicaciones.post; // graba la tabla sin nada de por medio
rep:=DBEdit2.Text; //uso esta variable para saver el codigo de la indicacion (receta) (odtengo el
//codigo del ultimo registro para imprimirlo de esta forma
//para imprimir uso este codigo para pasarselo al reporte que esta en el form llamado form1
Form1.ADOQuery1.close;
Form1.ADOQuery1.SQL.Text:='select * from Indicaciones WHERE Cod_ind Like'+Quotedstr('%'+rep+'%');
Form1.ADOQuery1.open;
Form1.Tdetalle.Active:=true;
Form1.Tmedicamento.Active:=true;
Form1.QuickRep1.Preview; // indico que el qreport es parte del form?
Data.Tindicaciones.insert;
Data.Tpaciente.insert;
Data.Tmedico.insert;
Data.Tindicaciones.edit; // otra vez edito la tabla como en el primer paso
DBText1.caption:=datetostr(DateTimePicker1.Date);
DBGrid1.Enabled:=false;
end;
Las partes que tengo dudas estan subrayadas
Saludos

ContraVeneno 17-11-2007 00:49:47

En lugar de abrir un TQuery, luego un TADOTable y luego todo el relajo que estas haciendo, sería mucho mejor simplemente utilizar un Tquery.

Código Delphi [-]
With TuQuery do begin
 if active then close;
 SQL.Clear;
 SQL.Add('Select I.Medico, I.Fecha, I.Paciente.....etc'); //todos los campos que necesitas de Indicaciones
 SQL.Add('M.Medicamento, M.Cantidad, M.Precio.....etc'); //todos los campos que necesitas del detalle
 SQL.Add('From Indicaciones I');
 SQL.Add('join Detalle_Ind M on I.Llave = M.Llave'); //tu campo llave que une a los dos tablas
 SQL.Add('where I.Cod_ID = :CodigoIndicacion');
 ParamByName('CodigoIndicacion').AsString := DBEdit2.Text;
 Open;
end; //

Y luego simplemente enlazas tu reporte a este query y listo.
Nunca es recomendable utilizar "Select *", las bases de datos cambia y seguro a tu aplicación en algún momento le cambiaras algo y si utilizas "Select *" un cambio que hagas en la base de datos, ocasionará que cambies también el programa.

The_Duke 17-11-2007 20:37:17

lo solucione:) de esta forma y sale bien
Código Delphi [-]
With Form1 do begin
With ADOQuery1 do begin
 if active then close;
 SQL.Clear;
 SQL.Add('Select I.Cod_med, I.Fecha, I.Cod_pac, I.cod_ind'); //todos los campos que necesitas de Indicaciones
 SQL.Add('From Indicaciones I');
 SQL.Add('where I.cod_ind = :CodigoIndicacion');
 Parameters.ParamByName('CodigoIndicacion').Value := DBEdit2.Text;
 Open;
end;
With ADOQuery2 do begin
 if active then close;
 SQL.Clear;
 SQL.Add('Select M.Cod_medi, M.cantidad, M.dosis'); //todos los campos que necesitas de Indicaciones
 SQL.Add('From IM M');
 SQL.Add('where M.cod_ind = :CodigoIndicacion');
 Parameters.ParamByName('CodigoIndicacion').Value := DBEdit2.Text;
 Open;
end;
Form1.QuickRep1.Preview;
end;
sobre esto:
Código Delphi [-]
Data.Tindicaciones.edit; // edito porque andes de guardar puede que de error y asi me lo evito
Data.Tindicaciones.post; // graba la tabla con lo datos que se le introdujo
y esto
Form1.QuickRep1.Preview; // indico que el qreport esta en ese formulario que seria igual a:
With Form1 do begin
 QuickRep1.Preview;
end;
Gracias por ayudarme;)


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

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi