02 enero 2009

Creación de informes con QuickReport (I)

Aunque en los tiempos que estamos disponemos de gran cantidad de generadores de informes para Delphi (Rave Reports, Report Maganer, FastReport, etc.) hay que reconocer que QuickReport es el que tiene mayor predilección por parte de los usuarios debido a que venía incorporado de serie el las primeras versiones de Delphi.

Luego Borland-Inprise-CodeGear se deshizo de él a partir de Delphi 7 (no se porque) e incorporó Rave Reports, donde este último destacaba por tener su propio editor, por tener una documentación cutre e inexistente así como por dar Access Violations si lo mirabas mal.

Pero la empresa QBS Software siguió ampliando estos componentes hasta incluso las últimas versiones de Delphi 2009.

Los componentes QuickReport son comerciales estando actualmente en la versión 5.0 (podemos descargar una versión trial para probarlos). Para la serie de artículos que voy a escribir es suficiente con tener la versión 4.xx que está disponible desde para las versiones de Delphi 5, 6 y 7.

Para escribir este artículo me he basado en la versión 4.07 de QuickReport para Delphi 2007 instalándolo en RAD Studio 2007.

INSTALANDO LOS COMPONENTES QUICKREPORT

Aunque las instalaciones suelen variar en aspecto de una versión a otra, la forma de instalarlas suele ser la misma:

1º Descargamos el archivo de la instalación en un exe o archivo zip y al ejecutarla se instalará en un subdirectorio según la ruta donde tengamos instalado Delphi o RAD Studio:


2º Cuando finalice la instalación abrimos nuestra versión de Delphi habitual y abrimos los archivos con extensión DPK para instalarlos:


3º Una vez instalados los componentes deben aparecer en la paleta de herramientas:


CREANDO UN NUEVO PROYECTO

Al crear un nuevo proyecto debemos configurar en las opciones de nuestro proyecto la ruta donde se encuentran los componentes QuickReport. En Delphi 2007 se haría seleccionando Project -> Options y en el apartado Directories/Conditionals introducimos la ruta donde se han instalado los componentes, por ejemplo:


De este modo ya no dará problemas al compilar.

CREANDO LA BASE DE DATOS PARA IMPRIMIR EL INFORME

A modo de ejemplo vamos a crear una tabla de memoria utilizando los componentes de la clase TClientDataSet para crear una base de datos de clientes para luego imprimir su formulario en QuickReport.

De la pestaña Data Access extraemos el componente ClientDataSet y los insertamos en el formulario con el nombre Clientes:


En la propiedad FieldDefs de este componente vamos a definir los siguientes campos:


Para convertirlo en una tabla de memoria pinchamos el componente con el botón derecho del ratón y seleccionamos Create Dataset:


También voy a añadir un botón cuyo evento sea añadir un registro a la tabla:

procedure TForm1.BIntroducirDatosClick(Sender: TObject);
begin
Clientes.Append;
Clientes['ID'] := 1;
Clientes['NOMBRE'] := 'PABLO AGUILAR RUIZ';
Clientes['CIF'] := '11222333Z';
Clientes['DIRECCION'] := 'PLAZA ESPAÑA, 8';
Clientes['POBLACION'] := 'MADRID';
Clientes['CP'] := '28547';
Clientes['PROVINCIA'] := 'MADRID';
Clientes['SALDOINICIAL'] := 4200.28;
Clientes['FECHAALTA'] := '12/05/2008';
Clientes['ACTIVO'] := False;
Clientes.Post;
end;

Ahora pasemos a imprimir un informe con estos datos.

CREANDO EL INFORME

Un informe creado en QuickReport va vinculado directamente a un formulario de Delphi por lo que obligatoriamente debemos utilizar como mínimo un formulario por cada informe. También tiene sus ventajas y es que aprovecha las nuevas características del editor de formularios de los nuevos Delphi.

Creamos un nuevo formulario que vamos a llamar FCliente y dentro del mismo añadimos el componente TQuickRept:


Hay que ampliar bien el formulario ya que nos inserta el equivalente a un folio A4 donde vamos a diseñar nuestro informe. Encima de este componente es donde debemos añadir sólo componentes de la pestaña QuickReport (no vale meter por ejemplo un componente TLabel, si lo deja pero no imprimirá nada).

Lo siguiente que tenemos que hacer es insertar una banda la cual va a contener los datos que queremos imprimir. Esto se hace añadiendo el componente de la clase TQRBand dentro del informe:


La banda que hemos insertado es de tipo Title, es decir, sólo se va a imprimir una sola vez independientemente del número de registros tenga nuestra tabla. Esto puede verse en el inspector de objetos (cuando tenemos la banda seleccionada) con su propiedad BandType:


Como vamos a imprimir la ficha de un cliente podemos dejarla como esta y empezar a meter componentes. Comenzamos añadiendo etiquetas para los nombres de los campos utilizando el componente TQRLabel:


Para poder añadir los campos de la base de datos de clientes debemos añadir a este formulario la unidad donde se halla la tabla que queremos imprimir (en mi ejemplo Form1):

uses Unit1;

Ahora pinchamos sobre cualquier borde del objeto TQuickRep y en el inspector de objetos le ponemos el su propiedad DataSet la tabla que queremos imprimir:


Una vez hecho esto ya podemos introducir campos de base de datos para traernos la información. Una de las ventajas de las que goza QuickReport es que podemos vincular directamente el informe a una tabla de datos sin tener que utilizar el objeto DataSource de la pestaña DataAccess.

Para introducir los campos vamos a utilizar el componente TQRDBText:


Sólo hay que procurar que cada campo tenga las propiedades DataSet (Form1.Clientes) y DataSource (el nombre del campo) rellenas.

EJECUTANDO LA VISTA PREVIA DEL INFORME

Desde nuestro formulario principal (Form1) voy a crear un botón para abrir la vista previa del informe que hemos hecho. Antes de esto tengo que vincular la unidad UClientes.pas a nuestro formulario para poder llamarlo.

Para programar de una manera más clara voy a llamar al objeto TQuickRep con el nombre Informe. Así se llama a la vista previa:

procedure TForm1.BInformeClientesClick(Sender: TObject);
begin
FCliente.Informe.Preview;
end;

Con algo tan simple como esto ya tenemos el informe en pantalla:


En principio nos aparece la vista previa del informe en una ventana pequeña en el centro de la pantalla. En la parte izquierda de la ventana nos aparecen dos pestañas:

Thumbails: contiene la vista previa cada folio que se imprime (al estilo PowerPoint).

Search Result: permite hacer búsquedas de texto en las hojas impresas.

Si nos interesa que se vea sólo el informe a pantalla completa entonces seleccionamos el objeto TQuickRep llamado Informe y en su propiedad PreviewInitialState seleccionamos wsMaximized.

Para quitar las pestañas Thumbails y Search result hay que deshabilitar las opciones PrevShowThumbs y PrevShowSearch. Y por último vamos a ampliar la visualización del folio (el Zoom) seleccionando en su propiedad PrevInitialZoom el valor qrZoomToWith. Este sería el resultado:


También sería conveniente darle un título al informe sobre todo porque si lo mandamos a imprimir aparecerá sin título en la cola de impresión. Para ello escribimos en su propiedad ReportTitle por ejemplo Datos del cliente. Puede verse al abrir la vista previa:


Esta barra superior contiene los típicos botones para modificar el zoom, avanzar o retroceder por las páginas, modificar las propiedades de la impresión o imprimir directamente. QuickReport también permite guardar el informe generado en un archivo con extensión QRP para poder abrirlo posteriormente y reimprimirlo.

No hay que confundir esto con una plantilla de informe ya que lo que guardamos el todo el informe (incluyendo los datos). Esto puede ser útil para guardar copias de factura, recibos, etc. cuando los datos ya no existen en nuestra base de datos y necesitamos reimprimirlos por pérdida del documento original. También nos evita volver a procesar listados lentos (informe de estadísticas de enero, febrero, etc.). Con procesarlo una vez sobra.

Esta sería la parte básica de generación de informes aunque veremos en artículos posteriores que QuickReport es mucho más potente que esto.

Pruebas realizadas en RAD Studio 2007.

13 comentarios:

Mariano Rocha dijo...

Hola, estoy entusiasmado con la explicacion y esperando ancioso la siguiente parte. Quisiera saber si tienes el servicio rss para registrarlo en mi reader de google. Gracias

Administrador dijo...

Me alegro de que artículo te sea útil. En la parte izquierda del blog tienes el feed para suscribirte con Google Reader:

http://feeds.feedburner.com/delphiallimite

Saludos y Feliz Año Nuevo.

Anónimo dijo...

Hola que tal saludos. Soy bastante nuevo en esto y tengo el siguiente mensaje: Failed to save the project.The following error happened while saving: Cannot create file "C:\ProgramFiles\CodeGear\RadStudio\5.0\QuickRep\QR4RunD2007.$$$.AccesoDenegado

Agradeceria su ayuda
De antemano gracias

Administrador dijo...

Ese error parece un tanto extraño. Primero porque creo que debería mirar la ruta:

C:\Archivos de programa\....

en vez de

C:\ProgramFiles\...

y luego no se porque están intentando modificar el componente QR4RunD2007 que ya está creado.

¿El problema te lo ha dado al instalar los componentes QuickReport?

¿Estas en Windows en modo Administrador? (con todos los permisos).

Anónimo dijo...

Hola. Primero que nada, felicidades por el blog; llevo tiempo programando en Delphi y me ha servido mucho.
La cuestión es que tengo un problema con QuickReport 5 en D2007, pues no tiene ningún efecto el cambio de propiedad del PreviewInitialState ni menos del PreviewInitialZoom. Es decir, que los cambio a wsMaximized y qrZoomToWidth pero al momento de ejecutar el programa sigue apareciendo como wsNormal. Ya lo hice de todas maneras por código y ni así. Igual busqué por todo internet y encontré un foro en inglés con el mismo problema, pero nadie dio solución y se cerró la pregunta. Espero que me puedas ayudar.
De antemano, gracias.

Administrador dijo...

Yo utilizo actualmente Delphi 2007 pero con la versión 4 de QuickReport.

Siempre me espero a que se prueben bien las versiones de QuickReport porque he tenido muchos disgustos con ellas. No me extrañaría que fuera un error de la versión.

¿Ha alguién le ha ocurrido este problema?

NELSON MATEO DELA CRUZ dijo...

hola tengo problema con el quick report 4 en delphi7 me da un error al correr el proyecto el errol es el sigiente

Build
[Warning] QuickRpt.pas(835): Property declaration references ancestor private 'TCustomQuickRep.FBands'
[Warning] QuickRpt.pas(835): Property declaration references ancestor private 'TCustomQuickRep.FBands'
[Warning] QuickRpt.pas(871): Property declaration references ancestor private 'TCustomQuickRep.FBands'
[Warning] QuickRpt.pas(871): Property declaration references ancestor private 'TCustomQuickRep.FBands'
[Fatal Error] QuickRpt.pas(1150): Unit QRCtrls was compiled with a different version of QuickRpt.TQRPrintable
otra pregunta puedo pasar de delphi7 a delphi 2007 sin probema trabajo con la dbe y con sql mediante odbc en delphi7

NELSON MATEO DELA CRUZ dijo...

por favor en eltimo comentario que hice nesecito que me ayuden con este error grasias de antemano

Administrador dijo...

Eso tiene pinta de que estás utilizando una versión de QuickReport más antigua de la que tenías anteriormente en Delphi.

¿Por casualidad has reinstalado los componentes QuickReport? Yo tengo la versión 4.06 para Delphi 7 y funciona perfectamente.

Saludos.

Oscar Guzmán dijo...

hola a todos, quisiera saber si a alguien le ha sucedido que tiene que totalizar una columna con la función SUM de Quickreport, pero dentro de esa columna se encuentran valores negativos que no deben ser tomados en cuenta?, he tratado con SUM y también con un IF dentro para condicionar el campo pero no me funciona. agradecería cualquier comentario.
Gracias.

Oscar Guzmán dijo...

hola a todos, quisiera saber si a alguien le ha sucedido que tiene que totalizar una columna con la función SUM de Quickreport, pero dentro de esa columna se encuentran valores negativos que no deben ser tomados en cuenta?, he tratado con SUM y también con un IF dentro para condicionar el campo pero no me funciona. agradecería cualquier comentario.
Gracias.

Mp dijo...

Hola que tal me gustaría saber si existe alguna forma de yo saber cuando un reporte se ha cerrado ya que ocupo realizar una condición con el resultado.

Administrador dijo...

No se si te refieres a que el documento ha terminado de hacer la vista previa o la impresión.

Si hay una vista previa y el usuario la ha cerrado, como el objeto TQuickRep está encima de un formulario, compruebas si el formulario es nil.

Pero si lo que quieres decir es que son muchas páginas y no ha terminado de hacer la vista previa, puedes comprobarlo con esta condición:

if VistaPrevia.QRPrinter.PageCount = VistaPrevia.QRPrinter.AvailablePages then
...

Siendo el objeto VistaPrevia de la clase TQRPreview.

Saludos.

Publicidad