FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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! |
#2
|
|||
|
|||
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 |
#3
|
||||
|
||||
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. |
#4
|
|||
|
|||
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!! |
#5
|
||||
|
||||
No he comentado una cosa importante, Tampoco necesitas un TQuickREport , al menos en diseño:
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 "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 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 Última edición por Lepe fecha: 30-08-2005 a las 17:32:36. |
#6
|
|||
|
|||
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; |
|
|
|