Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Reporte con características predefinidas (https://www.clubdelphi.com/foros/showthread.php?t=65512)

GerTorresM 21-12-2009 11:38:07

Reporte con características predefinidas
 
Hola a tod@s


Bien la situacion que tengo hoy es la siguiente:


Pretendo crear una clase con la que se manejan algunas caractericas que deseo tener en los reportes de la totalidad de la aplicación, es decir un reporte base; para el efecto he hecho lo siguiente:

1. Cree tomando las opciones : File -> new -> other -> Report un reporte basado en quick report.

2. Defini una serie de etiquetas que se han de utilizar en el report.

3. Por último intente llenar las etiquetas utilizando los siguiente eventos :
1. Con el Create, pero como no encontre el create en QReport, entonces utliice el WinControlFormCreate, que pertence al formulario como tal, tal como se puede ver en el código adjunto, sin obtener resultado alguno.

2. Como no obtuve resultados, decidi utilizar el evento OnPreview, pero para desgracia ni siquiera visualiza el reporte.

Adjunto el Código

Código Delphi [-]

unit FrepBaseReporte;

interface

uses Windows, SysUtils, Messages, Classes, Graphics, Controls,
  DB, DBTables, StdCtrls, ExtCtrls, Forms, QuickRpt, QRCtrls, Dialogs,
  QRExport;

type
  TQRRepBaseReporte = class(TQuickRep)
    PageHeaderBand1: TQRBand;
    TitleBand1: TQRBand;
    PageFooterBand1: TQRBand;
    QRLSoftmilenium: TQRLabel;
    QRPagina: TQRLabel;
    QRSDPagina: TQRSysData;
    QRSDFechaHora: TQRSysData;
    QRIEscudoIzquierda: TQRImage;
    QRIEscudoDerecha: TQRImage;
    QRLNombreEmpresa: TQRLabel;
    QRLNit: TQRLabel;
    QRLCiudad: TQRLabel;
    QRLNombreReporte: TQRLabel;
    QRLLogo: TQRLabel;
    QRTFTexto: TQRTextFilter;
    QRCSVFComas: TQRCSVFilter;
    QRHTMLFWeb: TQRHTMLFilter;
    procedure QuickRepAfterPreview(Sender: TObject);
    procedure WinControlFormCreate(Sender: TObject);
  private

  public

  end;

var
  QRRepBaseReporte: TQRRepBaseReporte;

implementation

uses Uprocedimientos, UDMReportes;

{$R *.DFM}

procedure TQRRepBaseReporte.QuickRepAfterPreview(Sender: TObject);
begin
  Self.DataSet.Close;
end;

procedure TQRRepBaseReporte.WinControlFormCreate(Sender: TObject);
Var QCodigo : TQuery;
begin
  QCodigo:= UProcedimientos.CrearConsulta();
  With QCodigo do
    begin
      sql.Text:= 'Select * from Configuracion';
      try
        open;
        QRLNombreEmpresa.Caption:= FieldByName('NombreEmpresa').AsString;
        QRLNit.Caption:= 'Nit ' + FieldByName('Nit').AsString;
        QRLCiudad.Caption:= FieldByName('Ciudad').AsString;
        QRLNombreReporte.Caption:='';
        QRLLogo.Caption:= FieldByName('Lema').AsString;
        QRIEscudoIzquierda.Picture.LoadFromFile(FieldByName('Escudo').AsString);
        QRIEscudoDerecha.Picture.LoadFromFile(FieldByName('Escudo').AsString);
      Except
      end
    end;
  Self.DataSet.Open;
end;

end.


¿Que debo hacer, en que evento lo debo ingresar?



Gracias de antemano



gertorresm

bubba 21-12-2009 18:15:22

Hola,

Yo lo tengo resuelto más o menos y sin TQRLabel, directamente con TQRDBText.

Para ello tengo en la parte pública definido un TDataSet con el nombre Tabla (lo puedes poner como propiedad publicada), y tengo un procedimiento (AsignarTabla), para asignar a la propiedad DataSet de todos los TQRDBText del QuickReport el TDataSet con nombre Tabla que he definido en la parte pública. Eso sí, es para los listados estándar y siempre creo la tabla con los mismos campos y conforme voy grabando el detalle, a esos campos le doy los valores que me interesan, a saber, título del listado, fecha, nombre de la empresa, etc... Cuando creo el formulario que contiene el QuickReport, antes de hacer el Preview o Print del mismo, asigno a la variable Tabla el TDataSet con todos los registros, llamo al procedimiento AsignarTabla y ya está. El ejemplo:

Código Delphi [-]
type
  TfrmImpListado = class(TForm)
    qrListado: TQuickRep;
    PageHeaderBand1: TQRBand;
    DetailBand1: TQRBand;
    PageFooterBand1: TQRBand;
    QRDBText1: TQRDBText;
    QRDBText2: TQRDBText;
    QRDBText3: TQRDBText;
    QRDBText4: TQRDBText;
    QRDBText5: TQRDBText;
    QRDBText6: TQRDBText;
    QRDBText7: TQRDBText;
    QRDBText8: TQRDBText;
    QRDBText9: TQRDBText;
    QRDBText10: TQRDBText;
    QRDBText11: TQRDBText;
    QRDBText12: TQRDBText;
    procedure AsignarTabla;
  private
    { Private declarations }
  public
    { Public declarations }
    Tabla: TDataSet;
  end;

implementation
 
{$R *.DFM}
procedure TfrmImpListado.AsignarTabla;
var
   n: Integer;
begin
   qrListado.DataSet := Tabla;
   for n := 0 to frmImpListado.ComponentCount - 1 do begin
      if frmImpListado.Components[n] is TQRDBText then begin
         (frmImpListado.Components[n] as TQRDBText).DataSet := Tabla;
      end;
   end;
end;

Saludos

fjcg02 21-12-2009 21:59:35

1 Archivos Adjunto(s)
Hola,
puedes pasar de todo y crear los componentes en tiempo de ejecución. Sabiendo los campos de la query o tabla, calculas sus anchos y haces un bucle para que se creen.
Si además dejas que el usuario pueda elegir los campos que quiere enviar al listado, pues ya está.

Te dejo una unidad que hace esto. Es mejorable, pero yo es la única forma de hacer listados más o menos genéricos que utilizo en mis aplicaciones.
Lo único que como soy un gañán, la llamos a través de una función, en lugar de hacer un objeto y tirarla en los formularios.
Además, permite mostrar la selección de campos o no en base a un parámetro, permite obtener totales por uno o varios campos, ..... te podría servir. Se instancia cada vez que se invoca y se destruye al finalizar.

Saludos


La franja horaria es GMT +2. Ahora son las 14:35:44.

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