Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Crear un TQuickRep en tiempo de ejecución (https://www.clubdelphi.com/foros/showthread.php?t=24637)

lunatiko 29-08-2005 12:28:17

Crear un TQuickRep en tiempo de ejecución
 
Hola a todos:

Quiero crear un report (usando quickreports) en tiempo de ejecución, con sus bandas sus labels y tal ..., pero sin tener un form que contenga ese quickreport.

La idea es poner un botón que imprima el contenido de un dbGrid, pero ese botón quiero ponerlo en varios forms distintos (con dbGrids distintos). De esta manera si la aplicación que estoy desarrollando tiene 10 dbGrids no hace falta que haga 10 reports (además en un futuro podría haber mas dbGrids...)

Me gustaría saber si alguien sabe si esto se puede hacer, donde encontrar documentación al respecto (he buscado en los foros y todo lo que encontrado se basa en que hay al menos un formulario que contiene el objeto quickreport),...o si creeis que es más aconsejable otra forma de hacerlo....

De momento esa es mi duda, muchas gracias por adelantado!

sabinajoa 29-08-2005 12:44:11

Hola!

Me parece que necesitas un Form, al menos, para poder hacer lo que quieres, si necesitas poder imprimir varios diferentes, lo que yo haría seria, en un Form pon un quickreport básico y lo modificas (añades bandas, datos ....) segun el botón del form que hayan pulsado.

Espero que te sirva de algo, salu2

Lepe 29-08-2005 16:51:58

Esa es la forma visual que lo hacemos todos, ponemos un Form y dentro un TQuickReport, pero desde delphi, File-->new --> other, puedes elegir Quickreport y listo, no necesitas ningún Form.

Para el tema que quieres, lo mejor es que uses la función qrCreateList
que diseña un quickreport en función de los campos que quieras añadir.

Un saludo.

lunatiko 30-08-2005 11:43:37

Muchas gracias Lepe! lo he hecho con la función qrCreateList y es justo lo que necesitaba.

Para lo que necesito hacer ahora me sirve así, aunque me gustaria ir un poco más lejos y hacer algo más elaborado: poder cambiar el ancho de las columnas, los captions de los titulos, los campos que van a ser visibles,las fuentes de los labels, añadir bandas de grupo,etc... Todo esto lo tengo que investigarlo claro, quizá un poco mas adelante, si a alguien se le ocurre alguna cosa, será bienvenido. A ver si para cuando tenga algo decente lo puedo publicar aquí mismo.

Gracias a todos!!

Lepe 30-08-2005 17:22:41

No he comentado una cosa importante, Tampoco necesitas un TQuickREport :D, al menos en diseño:
Código Delphi [-]
var q:TQuickReport;
begin
 q := TquickReport.Create(nil);
 ....

  Freeandnil(q);
Igual que creamos un TStringList, podemos crear cualquier componente de delphi.

Para personalizar, yo lo haría desde el Grid que tengas, ocultando o mostrando las columnas, y despues guardar las columnas visibles en la BBDD.

Para guardar el ancho de los listados, bien podrías usar una tabla especial, yo la llamo "frases":
Código:

codigo (varchar(50))          Valor (varchar(300))
--------------------------------------------------
ListA-Listado Uno                idCliente_150;Nombrecliente_200;NAlbaran_80;
ListA-Listado Dos                idCliente_150;Fecha_90;NAlbaran_80;
ListF-Listado Dos                idCliente_150;Fecha_90;NAlbaran_80;
ListFontA-Listado Dos          Times New Roman,0,16711680,16,7

"ListA-" es un prefijo que se usa, en este caso para Listados de Albaranes.
"ListF-" para listados predefinidos de Facturas.
"ListFontA-" para saber la fuente que se usará en ese listado.

El resto del campo Código (39 caracteres) es el título del listado predefinido, así de paso limitamos la longitud del título para que quepa siempre en el folio.

Con una consulta del tipo
Código SQL [-]
select * from frases where codigo like 'ListA%'
Obtendrías todos los listados predefinidos de Albaranes. En ejecución, recorres esta query y añades cada listado a un TPopupMenu (por ejemplo).

Al cargar un listado predefinido, haces visibles las columnas del grid que estan guardadas en el campo "Valor" de ese listado

El campo Valor, lo cargas en la propiedad DelimitedText de un Stringlist con Delimiterchar := ';', y despues por cada item del Stringlist, buscas la posición del caracter guión bajo "_", a la izquierda tienes el nombre del campo, y a la derecha el ancho que tendrá en Grid.

Sin duda te hará falta FontTostr
para guardar la fuente del Grid y despues recuperarla.

No dudo que otra gente lo haga de una manera mejor. Estaremos a la expectativa ;).

Un saludo

lunatiko 15-11-2005 11:09:07

Report en tiempo de ejecución
 
Tal y como prometí he hecho una función que genera un quickreport simple
en tiempo de ejecución a partir de una tabla (mejor dicho un dbGrid).
Funciona de un modo parecido a QRCreateList pero permite mayor control
sobre las columnas que se imprimen.Ya se que es francamente mejorable,
pero para lo que yo necesitaba hacer es suficiente. Entre las posibles
mejoras tenemos: añadir bandas de grupos, totales, fecha y hora de impresión opcional,...

En fin que espero que a alguién le sea útil. Salu2!

Código:



procedure ImprimirTabla(Tabla: TDBGrid;sTitulo:string);
var
  qr:TQuickRep;

  bandaCabecera:TQRCustomBand;
  bandaPie:TQRCustomBand;
  bandaTitulos:TQRCustomBand;
  bandaDetalle:TQRCustomBand;

  i:integer;
  iDistancia:integer;

begin

  qr := TQuickRep.Create(nil);
  try
        //Definicion de las propiedades del listado
        qr.ReportTitle := sTitulo;
        qr.PreviewInitialState :=wsMaximized;
        qr.Page.Orientation  := poLandscape;
        qr.Page.LeftMargin  := 10;
        qr.Page.RightMargin  := 10;
        qr.Page.TopMargin        := 10;
        qr.Page.BottomMargin := 10;
        qr.Page.PaperSize        := A4;
        qr.DataSet := Tabla.DataSource.DataSet;
        qr.DataSet.Active := true;

 

        //Creacion de bandas
        qr.Bands.HasColumnHeader := true;
        qr.bands.HasPageHeader  := true;
        qr.bands.HasPageFooter  := true;
        qr.Bands.HasDetail          := true;

        bandaCabecera := qr.bands.PageHeaderBand;
        bandaPie          := qr.Bands.PageFooterBand;
        bandaTitulos  := qr.Bands.ColumnHeaderBand;
        bandaDEtalle  := qr.Bands.DetailBand;

        bandaTitulos.Height := 25;
        bandaDetalle.Height := 20;


        //TITULO
        with TQrSysData.create(nil) do
        begin
          Data          := qrsReportTitle;
          Autosize  := false;
          Alignment  := taCenter;
          Font.Color := clBlack;
          Font.Size  := 12;
          Font.Style := [fsBold];
          Width          := bandaCabecera.width;
          Parent        := bandaCabecera;
        end;


        //TITULOS COLUMNAS
        iDistancia := 0;
        for i:=0 to Tabla.Columns.Count-1 do
        begin
          if Tabla.Columns[i].Visible then
          begin
                with TQRLabel.Create(nil) do
                begin
                  AutoSize  := false;
                  caption        := Tabla.Columns[i].Title.Caption;
                  Font.Style := [fsBold,fsUnderline];
                  Font.Size  := 10;
                  Alignment  := taCenter;
                  Width          := Tabla.Columns[i].width + 10 ;
                  Top                := 2;
                  left          := iDistancia;
                  iDistancia := Left+ Width + 5;
                  Parent        := bandaTitulos;
                end;
          end;
        end;


        //DETALLE DEL LISTADO
        iDistancia := 0;
        for i:=0 to Tabla.Columns.Count-1 do
        begin
          if Tabla.Columns[i].Visible then
          begin
                with TQRDBText.Create(nil) do
                begin
                  AutoSize  := false;
                  DataSet        := Tabla.DataSource.DataSet;
                  DataField  := Tabla.Fields[i].FieldName;
                  Font.Size  := 10;
                  alignment  := Tabla.Columns[i].Alignment;
                  width          := Tabla.Columns[i].width +10;
                  Top                := 2;
                  left          := iDistancia;
                  case Tabla.Fields[i].DataType of
                        ftFloat:        mask := '#,##0.00';
                        ftDateTime: mask := 'dd/mm/yyyy';
                  end;
                  iDistancia := Left+ Width + 5;
                  Parent        := bandaDetalle;
                end;
          end;
        end;


        //PIE
        with TQRExpr.create(nil) do
        begin
          expression := QuotedStr('Pág. ') + ' +PAGENUMBER';
          Autosize  := false;
          Alignment  := taRightJustify;
          Font.Color := clBlack;
          Font.Size  := 10;
          Font.Style := [];
          Width          := bandaPie.width;
          Parent        := BandaPie;
        end;

        qr.Preview;
  finally
        qr.Free;
  end;
end;



La franja horaria es GMT +2. Ahora son las 15:43:53.

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