PDA

Ver la Versión Completa : FastReport: imprimir listados de campos variables


Lepe
03-02-2008, 15:54:37
Tengo un dbgrid con los resultados de búsqueda según el criterio del usuario, obviamente el sql es variable, tanto de campos, tablas, order by, etc.

¿FastReport tiene alguna forma de hacer ese Report en tiempo de ejecución de forma automática?

¿y FreeReport?

QuickReports tiene el qrCreateList (ya se ha hablado mucho en el foro), pasando los nombres de los campos y el query/tabla, hace el listado automático.

Actualmente estoy probando FreeReport 2.2 y no he encontrado nada, pero igual existe :confused:.

El hecho de preguntar por FastReport, es que de tener esa característica, compraría los componentes.

Agradezco vuestro tiempo y sobre todo, vuestros comentarios ;)

Edito: He visto los "hilos relacionados" pero no están relacionados con mi pregunta.

Saludos

PepeLolo
03-02-2008, 18:13:38
Hola,

Puedo confirmate que la versión 4 de fastreport tienes esa opción.
Pongo un ejemplo que viene con las demos.


procedure TForm1.frxReport1BeforePrint(c: TfrxReportComponent);
var
Cross: TfrxCrossView;
i, j: Integer;
begin
if c is TfrxCrossView then
begin
Cross := TfrxCrossView(c);
Table1.First;
i := 0;
while not Table1.Eof do
begin
for j := 0 to Table1.Fields.Count - 1 do
Cross.AddValue([i], [Table1.Fields[j].DisplayLabel], [Table1.Fields[j].AsString]);
Table1.Next;
Inc(i);
end;
end;
end;


Un saludo.

Lepe
03-02-2008, 21:50:26
Muchas gracias, ni se me hubiese ocurrido mirar por esa vía.

Lepe
04-02-2008, 00:56:58
¿Por qué siempre empezamos por lo más difícil?

En la carpeta Demos de FreeReport 2.34 viene una subcarpeta "runtime" y el código es este:

// FastReport 2.3 demo.
//
// Demonstrates how to create reports with no designer.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
DB, DBTables, FR_DSet, FR_DBSet, FR_Class, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
frReport1: TfrReport;
frDBDataSet1: TfrDBDataSet;
Table1: TTable;
DataSource1: TDataSource;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
v: TfrView;
b: TfrBandView;
Page: TfrPage;
begin
frReport1.Pages.Clear;
frReport1.Pages.Add; // create page
Page := frReport1.Pages[0];

b := TfrBandView(frCreateObject(gtBand, '')); // create MasterData band
b.SetBounds(0, 20, 0, 20);
b.BandType := btMasterData;
b.Dataset := 'frDBDataSet1';
Page.Objects.Add(b);

v := frCreateObject(gtMemo, ''); // create data field
v.SetBounds(20, 20, 200, 16);
v.Memo.Add('[Table1."Company"]');
Page.Objects.Add(v);

frReport1.ShowReport;
end;

Saludos

FerCastro
04-02-2008, 07:11:07
Hola, gracias por la respuesta.

Tratando de hacer algo que indicas obtengo un error. Te adjunto la imágen y te pongo el código de cómo lo realizo.


DM.Letras1.Numero:=DM.QEditaMovs.Fields[5].AsInteger;
DM.reporte.Variables['cCadenaLetra'] := DM.Letras1.AsString;





Agradezco cualquier comentario.

FCG

Lepe
04-02-2008, 18:12:58
Yo todavía no he llegado a las variables, espero que alguien responda.

Un detalle: en este hilo no se ha hablado de "variables" propiamente dichas. Mi idea es algo así:

CreaInforme(table1, 'idcliente, cliente, dirección');
MuestraPresentacionPreliminar;

Aunque la tabla tenga más campos, el informe solo mostraría los campos especificados.

Saludos

Delphius
04-02-2008, 19:18:32
Hola Lepe, no manejo FastReport... y apenas conozco los QReport.
¿Por casualidad lo que buscas es más o menos hacer lo que pretende david_uh en este hilo (http://www.clubdelphi.com/foros/showthread.php?t=52398&highlight=reportes)?

Yo he visto esa demo que envió y parece ser interesante y prometedora. Como para ampliarla...
Si es algo parecido a eso lo que buscas, tal vez se podría "migrar" lo que propone David a FasReport.

Saludos,

fjcg02
05-02-2008, 08:53:20
Hola amigos,
hace tiempo colgé el código de una utilidad para generar reportes cuyo origen es una query ( cualquier query ). A pesar de estar hecho para ADO, es fácil cambiarlo para otros componentes.
Os paso la referencia por si alguien lo considra interesante. Es para QuickReport estandard.

http://www.clubdelphi.com/foros/showthread.php?t=25914&highlight=fjcg02+informes

Este mismo código está incluido ( seguramente mejorado ) en el hilo que abrió Caral del programa de facturación paso a paso, como parte de una apliacción que colgué para que la pudieran destripar los foristas.

Espero haber aportado algo útil.

Saludos

Lepe
08-02-2008, 14:00:15
Perdonad por no responder antes, he perdido el hilo de vista, aunque he progresado bastante. Anoche a las 2 de la madrugada hice funcionar mi "TfrAutoReport".

Exacto Delphius, es eso lo que quiero conseguir, pero con FreeReport (versión con código fuente de los FastReports, aunque algo antiguos).

fjcg02: Estoy migrando una aplicación desde QuickReports a FreeReports. Existe un fallo conocido por QuSoft y sin solución: Cuando le da la gana, no imprime la foto de un QRDBImage. Es un fallo aleatorio y sin excepciones.

Este código es provisional y tendré que añadir más cosas:

with AutoReport1 do
begin
PageOrientation := pgPortrait;
PageHeader := 'Listado de Facturas del cliente ' + DescCliente;

Dataset := query1;
FieldNames.Add('cliente');
FieldNmaes.Add('direccion');
...

SummaryFields.Add('"Base Imponible"');
SummaryFields.Add('Importe');

ShowReport;
end;


Tengo creada una presentación preliminar para FastReport. Mi idea es colocar ese componente en dicha ventana, asignar las propiedades de página y márgenes en el inspector de objetos, y ya en tiempo de ejecución usarlo para generar cualquier informe. De momento funciona.

Reconozco que FreeReports tiene los eventos OnGetValue, algo así como el OnNeedData del QuickReports, pero no quiero usar ese método, implica muchos cambios.

PepeLolo
11-02-2008, 01:47:36
Código Delphi [-] (http://www.clubdelphi.com/foros/#)
DM.Letras1.Numero:=DM.QEditaMovs.Fields[5].AsInteger;
DM.reporte.Variables['cCadenaLetra'] := DM.Letras1.AsString;


FCG

Hola, el código correcto es


Código Delphi [-] (http://www.clubdelphi.com/foros/#)
DM.reporte.Variables['cCadenaLetra'] := QuotedStr(DM.Letras1.AsString);





Los valores se tienen que pasar en formato cadena, no como string.

un saludo.