PDA

Ver la Versión Completa : Master / Detail Quickreport


The_Duke
16-11-2007, 23:39:40
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 [-] (http://www.clubdelphi.com/foros/#)
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?

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.


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

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:

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;)