PDA

Ver la Versión Completa : Pasar parametro a un QuickReport desde un formulario


DobleSiete
11-01-2005, 16:38:34
Saludos a todos en el foro ...

Necesito crear en Delphi 7 un QuickReport a partir de una consulta SQL que utiliza un parametro obtenido desde un formulario (con un DBGrid). Tengo todo hecho, pero el reporte siempre aparece vacio.

Aquí está el código del formulario, tiene dos procedimientos, creo que el segundo es el del problema.

El parametro es codinfo. Primero se obtienen las cuentas mayores (en el dbgrid), y a partir de allí se genera el reporte con las cuentas de movimiento:

procedure TForm1.FormCreate(Sender: TObject);
begin
with IBQuery1 do
begin
SQL.Clear;
SQL.Add('SELECT * ');
SQL.Add('FROM scginf ');
SQL.Add('WHERE estado = ' + estado);
Open;
end;
end;

procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
with QuickReport2.IBQuery1 do
begin
SQL.Clear;
SQL.Add('SELECT * ');
SQL.Add('FROM scgctas ');
SQL.Add('WHERE est_fnz = :codinfo');
ParamByName('codinfo').AsString :=
Form1.IBQuery1.FieldValues['COD_INF'];
Open;
end;


with TQuickReport2.Create(nil) do
begin
Preview;
Destroy;
end;
end;

Gracias a todos ...

marcoszorrilla
11-01-2005, 17:03:27
O en la consulta no obtienes datos o QuickReport no apunta al DataSet de la segunda consulta.

En vez de lanzar QuickReport visualiza la segunda consulta en otra rejilla, así sabras si te devuelve registros.

Si te devuelve registros, entonces mira a ver si QuickReport está conectado al Dataset de esa consulta.

Un Saludo.

DobleSiete
11-01-2005, 17:12:32
Un saludo a tí también :-)

En vez de lanzar QuickReport visualiza la segunda consulta en otra rejilla, así sabras si te devuelve registros.

Se me había olvidado agregar que este mismo ejemplo ya lo había hecho con un DBGrid en vez de un QReport... y funcionó perfectamente bien... de hecho en este ejemplo, también veo los datos en el DBGrid del Form1, es el reporte el que no muestra dato alguno.

Si te devuelve registros, entonces mira a ver si QuickReport está conectado al Dataset de esa consulta.

Ya lo revisé, incluso prove colocando la consulta dentro del CommandText Editor y también funcionó a la perfección... pero por código... nada que ver

Gracias por tu ayuda

DobleSiete
12-01-2005, 13:14:25
Ya encontre la solución: colocar el parametro dentro del QuickReport y crearla a partir de una variable declarada en una unidad publica, la cual llamo en el uses del formulario y del reporte. He aquí la solución para los interesados:

En el Unit1 que tiene el Form1 con el DBGrid de las cuentas mayores, se hace la primera consulta SQL, se captura el valor seleccionado con un click y se llama al QuickReport:

uses MID_DM, Unit2, Unit3;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
with IBQuery1 do
begin
SQL.Clear;
SQL.Add('SELECT * ');
SQL.Add('FROM scginf ');
SQL.Add('WHERE estado = 2');
Open;
end;
end;


procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin

codigo := Form1.IBQuery1.FieldValues['cod_inf'];

with Unit3.TQuickReport1.Create(nil) do
begin
Preview;
Destroy;
end;
end;
... luego en un Unit publico simplemente declaro la variable codigo que es el parametro para generar el reporte ...

unit Unit2;

interface

var
codigo: string;

implementation

end.
... y por último el Unit3, que es el QuickReport, se hace otra consulta SQL para mostrar las cuentas de movimientos relacionadas con la cuenta mayor elegida por el usuario:

uses MID_DM, Unit2;

{$R *.DFM}

procedure TQuickReport1.QuickRepBeforePrint(Sender: TCustomQuickRep;
var PrintReport: Boolean);
begin
with IBQuery1 do
begin
SQL.Clear;
SQL.Add('SELECT * ');
SQL.Add('FROM scgctas ');
SQL.Add('WHERE est_fnz = :cod');
ParamByName('cod').AsString := codigo;
Open;
end;
end;
Como ven, el Unit2 es llamado por el Unit1 (formulario) y el Unit3 (reporte) para compartir la variable codigo. Mi problema es que queria llamar al IBQuery1 del QuickReport1 desde el Form1 lo cual me impedia pasar la variable.