Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Impresión
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-08-2005
lunatiko lunatiko is offline
Miembro
 
Registrado: oct 2004
Posts: 17
Poder: 0
lunatiko Va por buen camino
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!
Responder Con Cita
  #2  
Antiguo 29-08-2005
sabinajoa sabinajoa is offline
Miembro
 
Registrado: abr 2005
Posts: 17
Poder: 0
sabinajoa Va por buen camino
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
Responder Con Cita
  #3  
Antiguo 29-08-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 30-08-2005
lunatiko lunatiko is offline
Miembro
 
Registrado: oct 2004
Posts: 17
Poder: 0
lunatiko Va por buen camino
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!!
Responder Con Cita
  #5  
Antiguo 30-08-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
No he comentado una cosa importante, Tampoco necesitas un TQuickREport , 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

Última edición por Lepe fecha: 30-08-2005 a las 17:32:36.
Responder Con Cita
  #6  
Antiguo 15-11-2005
lunatiko lunatiko is offline
Miembro
 
Registrado: oct 2004
Posts: 17
Poder: 0
lunatiko Va por buen camino
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;
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 10:45:08.


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
Copyright 1996-2007 Club Delphi