You are on page 1of 35

1

BIENVENIDO AL CURSO "DESARROLLO DE INFORMES DE DATOS CON


CRYSTAL REPORTS .NET"!

Este curso le ofrece todos los conocimientos que necesita para disear informes de datos Crystal Reports
e incorporarlos en sus aplicaciones .NET (tanto Windows como Web).
En este curso aprender:
Cmo crear informes de datos utilizando el diseador de informes integrado en Visual Studio 2005
Cmo utilizar los componentes que ofrece Crystal Reports para incorporar esos informes en
aplicaciones .NET.
Cmo crear instaladores para esas aplicaciones, para facilitar su despliegue.
REQUISITOS: Para una correcta asimilacin de los contenidos del curso, el alumno deber estar
familiarizado con los conceptos fundamentales de la programacin en Visual Basic .NET y con el entorno
de desarrollo Visual Studio 2005. Igualmente, deber conocer los principales conceptos relacionados con
el mundo de las bases de datos relacionales (base de datos, tablas, filas, columnas); una ligera
familiaridad con el lenguaje SQL (en particular, con la sentencia SELECT) no es imprescindible, pero s muy
conveniente.
REQUISITOS DE SOFTWARE: Crystal Reports .NET viene incluido nicamente en la edicin Profesional de
Visual Studio 2005; si se dispone de una edicin inferior, la alternativa es adquirir de manera
independiente el producto Crystal Reports Developer, e instalarlo sobre cualquier versin de Visual Studio
2005. Como motor de bases de datos, el curso utiliza Microsoft SQL Server 2005; cualquiera de sus
ediciones es vlida (en particular, la Express, disponible gratuitamente). Los ejemplos se basan en la base
de datos AdventureWorks, que viene incluida en las ediciones de pago de SQL Server 2005; si va a utilizar
la edicin Express, puede descargarla desde aqu.

INTRODUCCIN A CRYSTAL REPORTS .NET
En esta primera leccin aprender qu es Crystal Reports, las particularidades de su versin para .NET
Framework, su arquitectura y las posibilidades que ofrece para el diseo y ejecucin de informes de
datos.
La leccin consta de los siguientes temas:
Cmo crear informes de datos utilizando el diseador de informes integrado en Visual Studio 2005
Cmo utilizar los componentes que ofrece Crystal Reports para incorporar esos informes en
aplicaciones .NET.
Cmo crear instaladores para esas aplicaciones, para facilitar su despliegue.

QU ES CRYSTAL REPORTS
Crystal Reports es una herramienta potente a la vez que fcil de usar para el diseo y generacin de
informes a partir de datos almacenados en una base de datos u otra fuente de informacin. Es, con
diferencia, la herramienta ms popular en su categora, y no solo entre quienes podran considerarse sus
usuarios puros (aquellos que necesitan obtener peridicamente informacin para la toma de decisiones
a partir de los datos de la empresa), sino tambin entre los programadores, que lo han convertido en su
herramienta favorita a la hora de embeber capacidades de generacin de informes dentro de las
aplicaciones a medida. A este ltimo hecho indudablemente ha contribuido mucho el que, desde hace
ms de diez aos, Crystal Reports venga siendo incorporado de serie a las herramientas de desarrollo
de Microsoft (Visual Basic y luego Visual Studio).
Con la aparicin de .NET Framework, una transformacin revolucionaria de las tecnologas de desarrollo
de Microsoft, los fabricantes de Crystal Reports se dieron a la tarea de adaptar el producto a los nuevos

2

requerimientos de la plataforma y del entorno de desarrollo. Como resultado, todas las versiones .NET
aparecidas hasta la fecha de Visual Studio han incorporado las versiones correspondientes de lo que se ha
dado en llamar Crystal Reports .NET.
Este curso tiene dos objetivos fundamentales:
Ensearle a utilizar el diseador de Crystal Reports integrado en Visual Studio 2005 para crear informes
de datos potentes y flexibles.
Mostrarle cmo incorporar esos informes en sus aplicaciones .NET para Windows y la Web, utilizando
como lenguaje de programacin a Visual Basic.

ARQUITECTURA. COMPONENTES PRINCIPALES
La arquitectura de Crystal Reports.NET gira alrededor del soporte para un tipo de ficheros de formato
propietario, que se distingue por la extensin .RPT (report) y en el que se almacena la definicin de los
informes. El producto se puede ver como la combinacin de tres componentes principales, que son:
El Motor de Impresin (Crystal Reports Print Engine, CRPE). A pesar de lo que su nombre sugiere, este
componente, escrito en cdigo no administrado, no slo se encarga de lo relacionado con la impresin en
papel de los informes, sino adems con todo lo que tiene que ver con la ejecucin de los mismos,
empezando por el acceso a la base de datos para leer la informacin y continuando con la generacin de
la imagen de las diferentes pginas para luego volcarlas en pantalla, papel o exportarlas a otros formatos
como Adobe PDF o Microsoft Word.
Las Libreras de Cdigo Manejado encapsulan la funcionalidad del Motor de Impresin a travs de un
conjunto de clases fcilmente accesibles desde aplicaciones escritas en Visual Basic, C# o cualquier otro
lenguaje .NET. Estas son las libreras que utilizaremos desde nuestras aplicaciones o servicios (para
Windows o la Web) para cargar, ejecutar e imprimir los informes.
Por ltimo, el Diseador de Informes es el software que presenta la interfaz de usuario a travs de la
cual un usuario, programador o no, puede crear (disear) un informe y guardarlo en un fichero .RPT
para su posterior reutilizacin. Se trata de una aplicacin sofisticada, repleta de potentes asistentes que
garantizan una alta productividad sin limitar las posibilidades a nuestra disposicin. La versin del
Diseador que incluye Crystal Reports.NET se integra perfectamente dentro de Visual Studio 2005,
permitiendo creando una experiencia an ms gil y productiva.

Arquitectura de Crystal Reports

POSIBILIDADES DE ACCESO A DATOS Y EXPORTACIN

3

Indudablemente, otra de las caractersticas que han hecho tan popular a Crystal Reports es la amplia
gama de orgenes de datos que soporta, as como de formatos de salida a los que se pueden exportar los
resultados. El Motor de Impresin de Crystal Reports tiene una arquitectura modular, y se apoya en
controladores (drivers) independientes para acceder a los diversos orgenes de datos soportados y
generar los informes en los diferentes formatos de salida posibles.
Las posibilidades de acceso a diferentes orgenes de datos sobrepasan ampliamente la mera capacidad
para comunicarse con bases de datos (prcticamente todos los sistemas de bases de datos, tanto
relacionales como planos estn soportados), y abarcan desde la lectura de todo tipo de bitcoras (logs),
por ejemplo las producidas por los servidores Web para el seguimiento de la navegacin de los usuarios,
hasta el acceso a objetos en memoria generados por las aplicaciones que hospedan al Motor de
Impresin. Por ejemplo, en este curso veremos cmo ejecutar informes contra conjuntos de datos
(objetos de la clase DataSet) que tengamos en nuestras aplicaciones.
En cuanto a las posibilidades de salida, el Motor de Impresin de Crystal no solo nos permite obtener
nuestros resultados en papel o en pantalla (una ventana, en caso de aplicaciones Windows; o el
navegador Web, en el caso de aplicaciones Web), sino que tambin ofrece la posibilidad de exportar los
resultados a numerosos formatos externos, como Adobe PDF, Microsoft Word, Microsoft Excel, ficheros
de texto o XML, entre otros.
Tenga en cuenta que, aunque an no podemos prescindir del papel ni mucho menos, la presentacin de
informes se est convirtiendo cada vez ms en una tarea interactiva. Las versiones ms recientes de
Crystal Reports incluyen numerosas facilidades que veremos en este curso (rbol de grupos, elementos
con hiperenlaces) y que estn orientadas nica y exclusivamente a la visualizacin de informes en una
ventana de Windows o en un navegador Web.

LIBRERAS DE CRYSTAL REPORTS
Las libreras de cdigo manejado incluidas en Crystal Reports.NET conforman una potente API Application
Programming Interface - Interfaz para la Programacin de Aplicaciones) que facilita a los desarrolladores
la tarea de integrar informes previamente desarrollados dentro de sus propias aplicaciones.
Debido a la diversidad de contextos en los que se puede hacer uso de Crystal Reports en aplicaciones
.NET (aplicaciones Windows, aplicaciones o servicios Web), el fabricante decidi crear diferentes
ensamblados fsicos (DLLs) para simplificar las dependencias y el despliegue ulterior de las aplicaciones.
La siguiente tabla presenta los principales ensamblados (libreras de clases) que forman parte de Crystal
Reports.NET y se instalan en la Cach Global al instalar el producto. Generalmente no es necesario
agregar explcitamente las referencias a estos ensamblados en nuestros proyectos, ya que los asistentes
de Visual Studio se encargan automticamente de ello cuando, por ejemplo, incorporamos a una
aplicacin un informe de Crystal Reports.

ENSAMBLADO USO
CrystalDecisions.Shared

Contiene tipos compartidos por Crystal Reports.NET y otras
aplicaciones de la empresa.
CrystalDecisions.ReportSource Contiene la implementacin de clases para conectarse a
diferentes orgenes de informes.
CrystalDecisions.CrystalReports.Engine

Interfaz con el Motor de Impresin de Crystal Reports.
CrystalDecisions.Windows.Forms

Clases para la presentacin de informes Crystal en
aplicaciones Windows.
CrystalDecisions.Web

Clases para la presentacin de informes Crystal en
aplicaciones Web


4

REQUISITOS PARA SEGUIR EL CURSO
Para seguir este curso, necesitar tener instalado el siguiente software:
Visual Studio 2005 edicin Profesional o superior. Las ediciones Express y Estndar *NO* incluyen,
desgraciadamente, Crystal Reports.NET. La alternativa, en caso de disponer de alguna de esas ediciones
de gama baja de Visual Studio, consiste en adquirir Crystal Reports.NET de forma independiente
(dirjase al sitio web del fabricante).
SQL Server 2005, cualquier edicin. Si no dispone de una edicin comercial de SQL Server 2005, puede
descargar e instalar la edicin Express (Service Pack 1) desde aqu. En este ltimo caso, tambin le ser de
utilidad el SQL Server Management Studio Express.
La base de datos de ejemplo AdventureWorks, que utilizaremos para los informes. Si dispone de una
edicin comercial de SQL Server 2005, la base de datos forma parte de la instalacin del producto; en
cualquier caso, puede descargarse desde aqu. En principio, de esta descarga nicamente es necesario el
fichero AdventureWorksDB.msi.
El curso asume una cierta familiaridad con la programacin de aplicaciones .NET en Visual Basic y con el
trabajo con bases de datos relacionales.

PRESENTACIN DE LA BASE DE DATOS DE EJEMPLO
Desarrollaremos los ejemplos de este curso utilizando como origen de datos para los informes a
AdventureWorks, la base de datos de ejemplo que acompaa a SQL Server 2005. Se trata de una base de
datos que almacena toda la informacin generada por una empresa ficticia dedicada a la fabricacin y
venta de bicicletas. Dado que cubre todos los aspectos del funcionamiento de la empresa, es una base de
datos bastante extensa, y por eso Microsoft ha dividido las tablas que componen la base de datos en los
siguientes esquemas:

Esquema Contiene objetos relacionados con
Person Personas. Aqu se almacenan los nombres y direcciones de clientes
individuales, proveedores y empleados.
Purchasing Compras. Informacin sobre las piezas y productos que la empresa
compra y sus proveedores.
Production Produccin. Informacin sobre los productos fabricados y vendidos por
la empresa.
Sales Ventas. Informacin sobre los clientes y los pedidos que realizan.
HumanResources Recursos Humanos. Informacin sobre los empleados de la empresa.

Puede encontrar una amplia informacin sobre todas y cada una de las tablas y otros objetos de base de
datos que contiene AdventureWorks aqu. En general, el uso de las diferentes tablas a la hora de
componer los informes es bastante intuitivo, y siempre comenzaremos cada ejemplo concreto indicando
en qu tablas se almacena la informacin a partir de la que se desea disear el informe.

TCNICAS BSICAS DE DISEO DE INFORMES
En este tema se presenta el Diseador de Informes de Crystal Reports integrado en Visual Studio 2005 y
se presentan las tcnicas bsicas de diseo de informes en las que se apoyan los temas subsiguientes.

INTRODUCCIN
Antes que nada, es conveniente definir qu entendemos por informe. En este curso, consideraremos
como informe a cualquier documento que presente un subconjunto de los datos almacenados en un
origen de datos (generalmente, una base de datos relacional) de una manera ms o menos elaborada. En

5

este sentido, un simple listado de los empleados de la empresa podra perfectamente considerarse un
informe.
Otro documento que muestre a esos empleados agrupados por categoras segn su volumen de ventas
del ao anterior sera otro informe, claro est bastante ms elaborado que el anterior.
Definir o crear un informe consiste en indicar al Diseador de Crystal Reports de dnde tiene que obtener
los datos necesarios, cmo tiene que transformarlos y por ltimo, cmo debe presentar cada elemento
de datos sobre el documento final. Toda esa informacin se almacenar de la definicin del informe, que
tradicionalmente se guarda en un fichero externo .RPT para su posterior ejecucin. Pero antes de
enfrentarse al Diseador de Crystal Reports (o de hecho, a cualquier generador de informes), es
altamente conveniente realizar un trabajo de anlisis y diseo previos que nos den una idea clara de a)
qu necesita obtener exactamente el usuario que nos ha encargado el informe, b) en consecuencia,
cules son los datos que debemos utilizar y c) qu apariencia aproximada deber tener nuestro informe
cuando sea ejecutado. Tener las ideas claras nos ayudar a cumplir con los objetivos requeridos en el
menor tiempo y con la mayor calidad posible.

CREACIN DE INFORMES ESTNDAR UTILIZANDO EL ASISTENTE
Dentro de Visual Studio 2005, seleccione Archivo | Nuevo | Proyecto y cuando aparezca el cuadro de
dilogo Nuevo proyecto elija Visual Basic | Aplicacin para Windows (observe que hay otra plantilla
Aplicacin de Crystal Reports, que evitaremos de momento). Llame al proyecto Ejemplo1 y pngalo en el
directorio adecuado. Como toda aplicacin para Windows, incluye un formulario principal inicialmente
vaco.
Ahora sobre el nombre del proyecto en el Explorador de Soluciones, pulse botn derecho del ratn y
Agregar | Nuevo elemento. Del cuadro de dilogo con los distintos tipos de elemento posibles, elija
Crystal Reports. Llame al nuevo fichero ListadoProductos.rpt. Al agregar un informe al proyecto, se activa
el Diseador de Crystal Reports. Lo que ve en pantalla ahora (Galera de Crystal Reports) es la ventana
introductoria del Diseador, que nos pregunta:



6


a) En primer lugar, cmo queremos disear el informe. Las opciones posibles son:

1. Utilizando el Asistente del Diseador. Como veremos a continuacin, el Asistente nos gua a travs de
diferentes pantallas para que definamos las caractersticas principales del informe. Una vez finalizado el
Asistente, podremos aadir al informe nuevas posibilidades o modificar las decisiones tomadas
anteriormente. Como se dar cuenta rpidamente, el Asistente de informes es una combinacin de otros
asistentes ms sencillos que podr invocar por separado posteriormente. En general, es conveniente
dejarse guiar por el Asistente, para obtener rpidamente un diseo inicial que luego podemos modificar a
voluntad.
2. Partiendo desde cero sobre un lienzo en blanco. Generalmente no es productivo ir por esta ruta
difcil.
3. A partir de un informe existente. Esta opcin es conveniente si queremos disear un informe muy
parecido a otro que ya hemos creado anteriormente.

b) Si decidimos utilizar el Asistente, ste es capaz de ayudarnos con tres tipos de informes diferentes:

1. Informe estndar. Esta opcin se utiliza para crear un informe de tipo listado. Es la opcin ms
conveniente en la gran mayora de los casos, a menos que se tenga claro que el informe nicamente
incluir una tabla cruzada, en cuyo caso es ms conveniente seleccionar la siguiente opcin.
2. Tablas cruzadas. Un informe de tabla cruzada es un informe que presenta en una tabla resmenes
agrupados por categoras, por ejemplo los volmenes de ventas de cada tipo de productos por cada pas
en el que la empresa opera. No es ningn problema aadir manualmente una tabla cruzada a un informe
estndar si se desea.
3. Etiqueta. Listado de mltiples filas y columnas, generalmente a partir de una tabla de clientes, para
producir las etiquetas a adherir a los sobres de correos cuando se hace un mailing.
Comenzaremos diseando un informe estndar por ejemplo, un informe que presente la lista de
productos que la empresa AdventureWorks ha vendido al pblico o vende actualmente. Mantenga las
opciones por defecto y pulse Aceptar.

PASO 1.
El primer paso a la hora de disear el informe es indicarle al Asistente dnde estn y cules son los datos
que se van a utilizar en el informe. Aqu tenemos que indicar:

a) La tecnologa a utilizar para conectarse al origen de datos. En este caso, tratndose de una base de
datos SQL Server, debemos indicar Crear nueva conexin | OLE DB (ADO) y luego elegir el proveedor
Microsoft OLE DB Provider for SQL Server. Pulse Siguiente.

b) El nombre del servidor, la base de datos y el usuario y contrasea necesarios para establecer la
conexin. En nuestro caso, utilizaremos como nombre de servidor .\SQLExpress (. significa la mquina
local, y SQLExpress es el nombre de la instancia en que se instala SQL Server Express de forma
predeterminada). De momento utilizaremos la autenticacin integrada (marcando la casilla
correspondiente), aunque la autenticacin de usuario/contrasea es ms utilizada en la vida real, sobre
todo en aplicaciones Web. Por ltimo, despliegue la lista de bases de datos disponibles y seleccione
AdventureWorks. Pulse Siguiente.

c) Por ltimo, se nos permite indicar las propiedades avanzadas de la conexin. No necesitamos ninguna
en este caso, y por eso pulsamos directamente en Finalizar.


7

Una vez indicados el servidor y la base de datos, la ver en la lista de los orgenes de datos disponibles.
En este momento es conveniente pulsar el botn derecho del ratn sobre el nombre del servidor y
utilizar la opcin Agregar a Favoritos para recordar este origen de datos para futuros informes.

PASO 2.
Llega ahora el momento de indicar la(s) tabla(s), vista(s) o procedimiento almacenado de la base de datos
de donde se deber obtener la informacin. En nuestro caso, necesitaremos la tabla Product del esquema
Production. Seleccione esa tabla en la vista de rbol (pasndola a la columna derecha del dilogo
mediante el botn >) y pulse Siguiente.

PASO 3.
El siguiente paso consiste en indicar cules de las columnas (campos) que componen la tabla elegida
queremos mostrar en las columnas del listado. En nuestro ejemplo, seleccionaremos los siguientes
campos:
ProductNumber el cdigo de identificacin del producto
Name el nombre del producto
Color el color del producto

Cuando haya elegido esos tres campos, pulse Siguiente.

PASO 4.
Una vez elegidas las columnas a mostrar en el listado, toca el turno a indicar los criterios por los que se
quiere agrupar las filas del resultado. Por ejemplo, en nuestro caso podramos agrupar los productos a
listar segn su color. Para este ejemplo inicial, sin embargo, no especificaremos criterio de agrupacin
alguno. Pulse Siguiente.

PASO 5.
La otra decisin importante que debemos tomar con respecto a los datos es qu filas de la tabla
seleccionada deseamos que aparezcan en el informe. Para ello es necesario especificar una condicin de
seleccin slo aquellas filas que satisfagan la condicin que indiquemos sern recuperadas del servidor
de base de datos. En nuestro ejemplo (necesitamos los productos que la empresa ha vendido o vende) el
producto debe ser un producto que se vende y no para consumo interno (en cuyo caso el campo
FinishedGoodsFlag ser 1, que significa verdadero). Fjese cmo al seleccionar un campo en la zona
inferior derecha de la ventana aparece un cuadro de combinacin en el que se muestran algunas de las
condiciones comunes para campos de ese tipo. En nuestro caso, nos interesa la condicin es Verdadero.
Observe tambin que no es necesario que el campo de la condicin est entre los campos a mostrar en el
informe para utilizarlo en la condicin de filtro. Una vez indicada la condicin, pulse Siguiente.

PASO 6.
Por ltimo, el Asistente nos permite elegir entre un conjunto de plantillas de estilos disponibles. Las
plantillas de estilos permiten establecer de una sola vez todo el conjunto de caractersticas visuales
(estilos) que se aplicarn a los diferentes tipos de objetos que pueden aparecer en el informe.
Mantenga el estilo Estndar y pulse Finalizar. En este momento el Asistente generar el informe, que
veremos reflejado en el rea de trabajo de Visual Studio 2005.

ESPECIFICACIN DE LAS TABLAS DEL INFORME. OPCIONES DE ENLACE
Como resultado del paso anterior, tenemos a nuestra disposicin en el rea de trabajo de Visual Studio
como vista activa del informe el lienzo generado por el Asistente, sobre el que podremos hacer todas

8

las modificaciones que queramos para adecuar ms el informe a los requerimientos de nuestra aplicacin
o usuarios.
Observe tambin en la parte inferior de la ventana la otra posible vista del informe que podemos
seleccionar, la Vista previa, que nos ofrecer instantneamente una presentacin del resultado de la
ejecucin del informe para que podamos ver cmo lucir nuestro informe con los datos reales. Aunque
formalmente el diseo del informe debe hacerse desde la vista Informe principal, ver que el Diseador
nos permite tambin realizar casi todas las tareas de diseo sobre esta vista previa.
Volviendo a la vista de diseo, ver que el diseo del informe consta de diferentes secciones que se
pueden expandir o contraer a voluntad y que juegan un papel conceptual muy importante en Crystal
Reports. Bsicamente, la seccin en la que est situado un elemento determina cundo y cuntas veces
se imprimir ese elemento al ejecutar el informe. Las secciones disponibles en Crystal Reports son las
siguientes:

Encabezado del informe: los elementos que se coloquen en esta seccin aparecern en el informe una
sola vez, en la parte superior de la primera pgina del informe. En esta seccin tpicamente se colocan el
ttulo del informe, la fecha de ejecucin, etc. Por defecto, esta seccin aparece inicialmente suprimida
(indicado por las rayas transversales).
Encabezado de pgina: los elementos que se siten en esta seccin aparecern en el informe una vez
por cada pgina del informe, en la parte superior de la misma. Tradicionalmente se colocan en esta
seccin los nmeros de pgina y las etiquetas de las columnas del informe (cosa que el Asistente de
informes ya ha hecho por nosotros).
Encabezado de grupo: habr uno por cada uno de los grupos que tenga el informe (nuestro informe
bsico no tiene grupos). Los elementos que se coloquen en esta seccin (un ejemplo tpico es el nombre
del grupo) aparecern en el informe una vez al principio de cada uno de los diferentes grupos que el
motor de ejecucin encuentre en los datos. Ms adelante en este mismo tema trataremos con
profundidad el tema de los grupos.
Detalles: en la seccin de Detalles se coloca todo aquello que se quiere que aparezca una vez por cada
uno de los registros del conjunto de datos de entrada. Tpicamente, si el informe es del tradicional estilo
listado, en esta seccin se colocan objetos que representan a los campos de la tabla o consulta de
origen. En un informe tpico de tabla cruzada, por ejemplo, la seccin de detalles se deja vaca (o se
suprime) porque no se desea que aparezca informacin sobre cada uno de los registros, sino solo los
resmenes (que normalmente se ponen en la seccin de Pie del Informe).
Pie de grupo: es la seccin opuesta al Encabezado de grupo, y se imprime una vez al finalizar cada
uno de los grupos que el motor de ejecucin encuentre en los datos que componen el informe. Habr una
seccin de Pie de grupo para cada Encabezado de grupo, y los grupos siempre estn perfectamente
anidados (por ejemplo, en un informe con dos grupos, por Pases y Provincias, los grupos
correspondientes a las provincias de un pas siempre quedarn anidados dentro del grupo
correspondiente al pas). En esta seccin tpicamente se colocan los totales de grupo (por ejemplo, la
cantidad de clientes por cada pas, en un listado de clientes agrupado por pases).
Pie de pgina: opuesta al Encabezado de pgina, los elementos que se siten en esta seccin
aparecern en el informe una vez por cada pgina del informe, en la parte inferior de la misma.
Tradicionalmente se colocan en esta seccin los totales acumulados (tipo suma y sigue) o tambin los
nmeros de pgina.
Pie del informe: los elementos que se coloquen en esta seccin aparecern en el informe una sola vez,
en la ltima pgina del informe. En esta seccin tpicamente se colocan los totales generales.
Si se pulsa con el botn derecho del ratn sobre cualquiera de las bandas que identifican a las secciones
(por ejemplo, sobre la seccin de Encabezado del informe) aparecer el men de contexto de la seccin,

9

que exploraremos con ms profundidad un poco ms adelante en el curso. Por el momento, ejecute la
opcin No suprimir sobre la seccin de Encabezado de informe, para indicar que queremos que esta
seccin aparezca al ejecutar el informe.
Otros tres elementos muy importantes de la interfaz de usuario que aparecen en modo de diseo para
ayudarnos con las tareas ms habituales son:

Las barras de herramientas de Crystal Reports
La barra de herramientas Principal ofrece mltiples botones para, por una parte, lanzar diferentes
asistentes que nos ayudarn con las tareas comunes (seleccin, ordenacin), y por otra parte, facilitarnos
las tareas de formato (atributos de texto, justificacin, cantidad de decimales en campos numricos)
La barra de herramientas Insertar ofrece botones que despliegan asistentes que nos permitirn
insertar objetos ms o menos complejos en el informe (grupos, totales, grficos, imgenes)
En el men principal de Visual Studio, o si se pulsa el botn derecho del ratn sobre el lienzo de diseo
(teniendo cuidado de no estar situado sobre una seccin, pues entonces aparecera el men de la
seccin), tendremos el men principal del diseador, que incluye todas las opciones de las barras de
herramientas ms algunas otras no disponibles en ningn otro sitio. Las principales opciones de este
men son las siguientes:

Insertar: para insertar diferentes objetos sobre el lienzo de diseo.
Base de datos: para realizar diferentes tareas relacionadas con la base de datos a la que accedemos,
por ejemplo agregar nuevas tablas al informe.
Report: para lanzar diferentes asistentes o establecer la configuracin del informe. Por ejemplo, vamos
a establecer el ttulo del informe y el nombre de su autor. Para ello utilizamos la opcin del men Report
| Resumen de informacin, que nos lanzar un cuadro de dilogo en el que podremos indicar esos
valores. Utilice como ttulo Listado de productos para venta; ponga su nombre en el campo Autor.
Diseo: para actuar sobre las opciones de configuracin general del diseador, que dictan cmo ste se
comporta de manera predeterminada. Por ejemplo, una opcin que puede resultar conveniente es la de
activar la opcin Cuadrcula, que har aparecer una rejilla de puntos sobre el diseador, lo que nos
ayudar a establecer la alineacin de los objetos.
El Explorador de campos, que aparece por defecto a la izquierda del lienzo de diseo, nos presenta una
vista de rbol desde la que podremos elegir cualquier elemento accesible a nuestro informe para
arrastrarlo sobre la seccin adecuada en el rea de diseo. Por ejemplo, si despliega el nodo Campos de
base de datos, encontrar la tabla Product con todos sus campos; por favor, seleccione el campo
SellEndDate (fecha en que el producto se dej de vender) y arrstrelo sobre la seccin de Detalles del
informe, justo a la derecha del campo Color. Si cambia a la Vista previa, ver que slo algunos productos
tienen asociada una fecha de vencimiento. En caso de que un campo tenga asociado el valor nulo,
simplemente no se mostrar nada en la posicin correspondiente.

TCNICAS PRINCIPALES DE UTILIZACIN DEL ENTORNO DE DISEO
Para insertar cualquier elemento en un informe, como hemos visto antes, se utilizan dos tcnicas
fundamentales:
Si se trata de un campo de base de datos, parmetro, grupo, etc. ya existente y visible en el Explorador
de campos, basta con arrastrarlo desde all hacia la posicin deseada dentro de la seccin adecuada,
como acabamos de hacer. Como segundo ejemplo, vamos a poner el ttulo del informe en la seccin de
Encabezado del informe (para que aparezca una vez, en la parte superior de la primera pgina, cuando se
ejecute el informe). Para ello iremos al Explorador de campos, desplegaremos el nodo Campos
especiales, y elegiremos el elemento Ttulo del informe y lo arrastraremos hacia la seccin de
Encabezado de informe, digamos que ms hacia la esquina izquierda del informe. De nuevo, pasando a la

10

Vista previa podr comprobar que el ttulo que hemos asignado al informe aparecer en el lugar elegido
(puede que haya que guardar el informe previamente).
Si lo que queremos es aadir al informe otro tipo de elemento visual (resumen, grfico, imagen, etc.),
tendremos que utilizar el correspondiente asistente desde el men de Crystal Reports o la barra de
herramientas Insertar. En cualquier caso, tambin se nos permitir indicar en qu seccin y posicin
concreta queremos colocar el elemento. Por ejemplo, vamos insertar un resumen general en la seccin
de Pie de informe que indique cuntos productos contiene el listado. Para ello tendremos que dar los
siguientes pasos:
Pulsar con el botn derecho del ratn sobre la seccin 4 (Pie del informe), y en el men de contexto de
la seccin seleccionar No suprimir, para hacer que visible a esa seccin.
Pulsar el botn Resumen de la barra de herramientas, que nos pedir que elijamos:
El campo a resumir (puede ser cualquier campo, no necesariamente uno de los que se va a mostrar). En
nuestro caso, un candidato ideal es el campo ProductNumber.
El tipo de resumen deseado. En este caso nos interesa un Recuento (conteo), aunque tambin podra
ser un Recuento distintivo, que producira exactamente el mismo resultado dado que el cdigo de
producto es nico para cada producto.
Ver que las opciones ms tpicas (Suma, Promedio, etc.) no estn disponibles en este caso, por tratarse
de un campo alfanumrico.
La posicin en la que se desea ubicar el resumen. Tratndose de un listado sencillo, sin grupos, la nica
opcin disponible es la de colocar el valor resultante al final de todo, al pie del informe. En presencia de
grupos, este asistente nos permitir tambin crear resmenes parciales por cada nivel de agrupacin.
Al pulsar el botn Aceptar, el Diseador colocar un objeto de resumen configurado segn le hemos
indicado en la seccin Pie del informe. Cambie a la Vista previa y vaya hasta la ltima pgina del informe,
y ver el total reflejado en el sitio adecuado.
Una vez que el objeto ha sido colocado sobre el lienzo de diseo, toca la labor de configurarlo para que
responda a los requisitos de diseo del informe:
En primer lugar, podemos seleccionar el objeto con el ratn y arrastrarlo hacia cualquier otro sitio, en
la misma seccin o una seccin diferente. Tenga especial cuidado al cambiar un objeto de una seccin a
otra su sentido comn le orientar correctamente en la mayora de los casos.
Cuando un objeto est seleccionado, en sus cuatro costados aparecen las tpicas grapas que nos
permiten redimensionarlo como queramos.
La barra de herramientas Principal ofrece diferentes botones que nos permiten establecer los
atributos del texto del objeto (fuente y tamao de letra, negrita, itlicas, etc.), la alineacin (izquierda,
derecha, centrada), o el formato de presentacin para datos numricos.
En el caso de los objetos de texto (por ejemplo, los que corresponden a las etiquetas en que se
muestran los encabezados de columnas), haciendo doble clic sobre el objeto se activar el modo de
edicin para que podamos modificar el texto a mostrar.
Por ltimo, pulsando con el botn derecho del ratn sobre el objeto seleccionado obtendremos un
men de contexto que incluye la opcin Dar formato a objeto. Esta opcin de men despliega un cuadro
de dilogo de mltiples pestaas que nos permitir configurar todas y cada una de las propiedades del
objeto. La mayora de las pestaas (Comn, Bordes, Fuente, Hipervnculo) son comunes a casi todos los
objetos, y para ciertos tipos de objetos aparece una pestaa especial con sus caractersticas especficas.
Por ejemplo, si seleccionamos el objeto que corresponde al campo SellEndDate, veremos una pestaa
Fecha y hora donde podemos establecer el formato de visualizacin de los datos de esa columna, que es
de tipo DateTime.
Debido a que estamos utilizando la versin del Diseador de Crystal Reports integrada en Visual Studio,
una alternativa al cuadro de dilogo anterior es utilizar la Ventana de Propiedades del entorno para
establecer los valores de las propiedades. Dado que las propiedades tienen nombres en ingls, mientras

11

que el cuadro de dilogo est traducido al castellano (adems de mejor organizado), recomendamos
utilizar ste ltimo.

PRINCIPALES TIPOS DE OBJETOS
Cada vez que arrastramos algo desde el Explorador de campos, o insertamos un objeto desde el men o
la barra de herramientas, el Diseador de Crystal Reports crea para nosotros un objeto del tipo
correspondiente. Los principales tipos de objetos que podemos arrastrar sobre el lienzo de diseo desde
el Explorador de campos son:
Campos de bases de datos: objetos que mostrarn los valores de los campos de los diferentes registros
extrados de la base de datos. En dependencia del tipo de datos del campo Crystal Reports distingue los
tipos Alfanumrico (Cadena), Nmero, Moneda, Fecha, Hora, Fecha/Hora y Lgico (Booleano) -, el cuadro
de dilogo de configuracin ofrecer una pestaa especfica para configurar los datos de ese tipo.
Campos de frmula: Como estudiaremos en el tema 4, Crystal Reports ofrece un lenguaje de frmulas
que nos permitir implementar, por ejemplo, campos calculados que no existan fsicamente en la base de
datos. Se puede crear frmulas de cualquiera de los tipos de datos antes mencionados, y Crystal ofrece
una amplsima biblioteca de funciones predefinidas para facilitarnos el desarrollo de frmulas.
Campos de parmetro: Otro de los elementos importantsimos de Crystal Reports desde el punto de
vista prctico son los parmetros. Los parmetros (que estudiaremos en el tema 5) hacen posible que un
mismo informe pueda ser utilizado en mltiples situaciones sin necesidad de hacer retoques al diseo
del informe. El informe se disea con uno o ms parmetros, y los valores de los parmetros se
suministran al motor de impresin desde fuera, inmediatamente antes de cada ejecucin del informe.
Campos de nombre de grupo: En un informe con datos agrupados, el nombre de grupo es el campo
por el que se agrupan los datos. Por ejemplo, en un listado de clientes agrupados por pases, el nombre
de grupo ser el nombre del pas. Generalmente, el nombre de grupo se coloca en la seccin de
Encabezado de grupo.
Campos de totales acumulados: Los totales acumulados permiten implementar los tpicos suma y
sigue, resmenes que se van acumulando y pueden ser reiniciados cuando se desee (al final de cada
grupo, al cambiar el valor de cierto campo, o nunca). Estudiaremos los totales acumulados en el tema 3.
Campos especiales: Bajo el nombre comn de campos especiales se han agrupado toda una serie de
elementos de informacin que generalmente se desea mostrar en los informes: ttulo y autor del informe
(que ya hemos presentado antes), fecha de impresin o modificacin del informe, nmero de pgina
actual, cantidad total de pginas del informe, entre otros.
Por otra parte, desde el men de Crystal Reports o la barra de herramientas correspondiente podremos
insertar en el informe objetos como:
Secciones: Aunque ya el Asistente ha creado para nosotros cada una de las secciones tpicas de un
informe, un programador podra estar interesado en dividir una seccin en dos o ms subsecciones.
Hablaremos ms sobre las secciones algo ms adelante en el curso.
Grupos: Al insertar un grupo en el informe, en realidad (como veremos a continuacin) se crean tres
elementos diferentes: la seccin de Encabezado de grupo y Pie de grupo correspondiente, ms un campo
de nombre de grupo asociado al campo por el que hemos indicado que queremos agrupar.
Resmenes: Los objetos de resumen sirven para hacer totalizaciones generales o parciales (por grupos)
de los valores de un campo de la base de datos.
Tablas cruzadas: Una tabla cruzada permite mostrar en una tabla resmenes agrupados por categoras,
por ejemplo los volmenes de ventas de cada tipo de productos por cada pas en el que la empresa
opera. Generalmente las tablas cruzadas se insertan en la seccin de Pie del informe.
Grficos: Crystal Reports permite incorporar a los informes diversos tipos de grficos comerciales (de
lneas, barras, tarta, etc.) basados en los registros obtenidos de la base de datos. Generalmente los
grficos se colocan en la seccin de Pie del informe o algn Pie de grupo.

12

Subinformes: Una tcnica bastante potente para componer informes complejos es la de insertar un
informe ya creado dentro de otro. Veremos los subinformes en el tema 5.
Objetos de texto: Los objetos de texto permiten mostrar una etiqueta de texto en cualquier seccin y
posicin del informe, horizontal o verticalmente.
Imgenes: Podemos incorporar a nuestros informes imgenes BMP, JPG o PNG con el logotipo de la
empresa, fondos de marca de agua, etc.
Lneas y cuadros: Por ltimo, tambin podemos utilizar objetos de lneas y cuadros para realzar los
informes.

EL VISOR DE INFORMES
Si ha activado la pestaa de Vista previa para ver el resultado en pantalla de la ejecucin del informe,
habr visto el informe presentado en un contenedor visual que se conoce como el Visor de informes para
aplicaciones Windows (en realidad, una versin especializada del mismo). Crystal Reports ofrece
igualmente otro visor basado en HTML y Javascript para su utilizacin en aplicaciones Web.


Visor de aplicaciones Windows de Crystal Reports

El Visor de informes ofrece los siguientes controles en su barra de herramientas:
El botn de Exportar, que permite exportar el resultado del informe a diferentes formatos como
Microsoft Excel, Microsoft Word, texto enriquecido (.RTF) o Adobe PDF.
El botn de Imprimir, que permite seleccionar una impresora y enviar a ella el informe para as obtener
una copia en papel.
El botn de rbol de grupos, que permite mostrar u ocultar el rbol de grupos, banda situada a la
izquierda del visor (ahora vaca, puesto que nuestro informe inicial no tiene grupos). En un informe con
grupos, en esta banda se situarn los nombres de los diferentes grupos existentes en el informe, en forma
de hiperenlaces a la pgina del informe en la que comienzan los datos correspondientes a cada uno de los
grupos. Por ejemplo, en un listado de clientes agrupados por pases, en el rbol de grupos aparecer cada
uno de los nombres de los pases en los que hay clientes, y podramos saltar a ver los clientes de cada pas
con un simple clic de ratn.
Los botones de navegacin, que permiten desplazarse hacia delante y hacia atrs por las pginas del
informe. Tenga en cuenta que la generacin de las pginas de un informe se produce dinmicamente, a
medida que va siendo necesario; desplazarse a la ltima pgina del informe provocar que se generen
todas y cada una de las pginas (que el motor de Crystal almacena en memoria para su posterior
reutilizacin).
Un cuadro de texto que nos muestra la pgina actual y tambin nos permite teclear un nmero para
saltar a cualquier otra pgina.
El botn de Detener carga, que slo est activo mientras se est cargando el informe, con el objetivo
de que podamos cancelar la carga de datos si ya hemos visto lo que queramos ver o hemos detectado un
error en el informe.
El botn de Actualizar (refrescar) informe, que nos permitir regenerar el informe desde cero (por
ejemplo, para obtener una versin ms actual del informe en caso de que los datos de la base de datos
hayan cambiado).
El cuadro de combinacin de Zoom, que nos permitir establecer la escala de visualizacin de las
pginas del informe.
Este Visor de informes es casi el mismo que vern los usuarios de nuestras aplicaciones Windows que
incluyan informes Crystal Reports cuando ordenen la visualizacin de un informe; desde programa,

13

tendremos la posibilidad de ocultar aquellos botones que no tengan sentido o no queramos mostrar (por
ejemplo, el botn de rbol de grupos en un listado sencillo que no tenga grupos).

EJEMPLO BSICO DE APLICACIN WINDOWS
Estamos utilizando el Diseador de Crystal Reports embebido en Visual Studio, y no vamos a dejarle con
la miel en los labios, sino que mostraremos ahora un sencillo ejemplo de cmo alcanzar uno de los
objetivos finales de este curso, que es integrar los informes Crystal dentro de una aplicacin Windows. El
proceso en relativamente muy simple, y muestra la potencia de la programacin basada en componentes
que Visual Studio promueve.
Seleccione el formulario principal (y nico) de la aplicacin y configure sus tres o cuatro propiedades
principales (ttulo, estilo, dimensiones, posicin inicial). Luego coloque sobre el formulario un
componente de la clase CrystalReportsViewer (ficha Crystal Reports). Encaje el visor en el rea cliente de
la ventana para que la llene completamente.
CrystalReportsViewer es un componente que encapsula el visor de Crystal Reports para aplicaciones
Windows. Configuremos sus propiedades principales:

La propiedad ReportSource es una propiedad polimrfica que puede apuntar a diferentes entidades
capaces de proveer un informe. Para este primer ejemplo, despliegue la lista de posibles opciones para la
propiedad y seleccione Crear una nueva instancia de ReportDocument | Ejemplo1.ListadoProductos.
Ms adelante veremos con ms detalles qu significa eso.
Si examina las propiedades disponibles en la Ventana de propiedades, ver toda una serie de
propiedades lgicas con nombres Display y Show, cuyo objetivo es permitirnos configurar qu zonas
o botones queremos que el visor muestre o no. En nuestro caso, dado que el informe no tiene grupos,
vamos a asignar False a las propiedades DisplayGroupTree y ShowGroupTreeButton.

Y ya est! Ejecute la aplicacin, y ver cmo hemos logrado mostrar en una ventana de Windows un
informe Crystal Reports sin escribir ni una sola lnea de cdigo.

TCNICAS FUNDAMENTALES DE DISEO DE INFORMES
En este tema se presentan las tcnicas fundamentales que necesitar dominar perfectamente el
programador que disee informes de Crystal Reports, pues se presentan en la prctica con mucha
frecuencia.

INFORMES CON MLTIPLES TABLAS
Rara es la ocasin en que todos los datos necesarios para presentar en un informe se pueden obtener de
una misma tabla de la base de datos. Las metodologas modernas de diseo de bases de datos
relacionales favorecen la normalizacin, y esa tcnica promueve la separacin de la informacin en
diferentes tablas para evitar problemas de redundancia e inconsistencia. Generalmente, al disear un
informe necesitaremos combinar la informacin proveniente de la tabla principal con los contenidos de al
menos uno o ms catlogos u otras tablas de propsito general.
Por ejemplo, la base de datos AdventureWorks agrupa los productos por subcategoras y categoras.
Suponga que necesitamos mostrar en nuestro informe anterior los productos organizados, inicialmente,
por subcategoras. La tabla Products incluye un campo ProductSubcategory en la que se almacena el
cdigo de subcategora, una clave externa (fornea) a otra tabla de la base de datos,
Production.ProductSubcategory. Si queremos mostrar en el informe los nombres de las subcategoras
en lugar de sus cdigos, tendremos que indicarle a Crystal Reports que obtenga la informacin
correspondiente, cruzando la tabla de productos con la de subcategoras.

14

Para lograr esto, haremos uso de otro de los asistentes de Crystal, el Asistente de base de datos (opcin
Base de datos | Asistente de base de datos en el men de Crystal Reports). Se dar cuenta que este
dilogo de propiedades ya lo ha visto antes: se trata del primer asistente integrado en el Asistente de
informes general. Pues bien, debemos seleccionar nuestra tabla Production.ProductSubcategory en la
vista de rbol de la izquierda (despliegue el nodo Conexiones actuales y ver nuestro servidor de base de
datos y dentro de l, a la base de datos AdventureWorks) y aadirla a la vista de la derecha.
Inmediatamente despus de que agregue la tabla de subcategoras al informe, aparecer en el cuadro de
dilogo una segunda pestaa, Vnculos, que es donde debemos indicarle a Crystal cmo establecer la
relacin entre las dos tablas. Siempre que un informe incluya ms de una tabla, Crystal nos obligar a
establecer claramente cul es la relacin entre las mismas. Aunque el Diseador es capaz de proponernos
vnculos en base a las relaciones entre las tablas, como podr observar que ocurre en este caso.
En la pestaa Vnculos del asistente podemos establecer relaciones entre las tablas simplemente
arrastrando con el ratn desde el campo de origen hacia el de destino. Pruebe a borrar el vnculo creado
implcitamente (botn Borrar vnculos) y a volverlo a establecer. Una vez lo haya hecho, cierre el
asistente pulsando Aceptar.
Una vez que hayamos agregado la nueva tabla al informe, veremos que en el Explorador de campos
estarn disponibles todos los campos de la tabla de subcategoras, y podremos arrastrar los campos de
esa tabla sobre cualquier seccin del informe. Por ejemplo, para ver el nombre de la subcategora a la que
pertenece cada producto, arrastraremos el campo Name de la tabla Production.Subcategory sobre la
seccin de Detalles. Posteriormente habr que recolocar los objetos de esa seccin para mejorar el
aspecto del informe. Si cambia a la Vista previa, ver que para cada producto se muestra su subcategora.

ORDENACIN Y AGRUPACIN
Si al examinar la vista preliminar del informe tiene la impresin de que los registros ya llegan ordenados
por subcategoras, no se fe ello ha sido puramente coyuntural. En ningn momento hemos dicho que
queremos obtener el listado ordenado por subcategoras, nombres de producto u otro criterio. De hecho,
si examina la sentencia SQL que Crystal Reports enviar a la base de datos para recuperar la informacin
necesaria (en el men de Crystal Reports, seleccione Base de datos | Mostrar consulta SQL) ver que
sta tampoco incluye ninguna clusula ORDER BY. Para indicar los criterios de ordenacin, debemos
utilizar el Asistente de ordenacin de registros, en la barra de herramientas Principal o en el men
Report | Asistente de ordenacin de registros. Este asistente nos presenta un cuadro de dilogo en el
que podemos establecer el criterio de ordenacin principal, as como otros secundarios, que slo
entrarn en funcionamiento en caso de que el varios registros coincida en todos los campos anteriores.
Por ejemplo, si queremos que nuestros productos aparezcan ordenados por categora, y dentro de cada
categora, por nombre, debemos indicar ambos campos, en ese orden, al asistente. Observe que las
categoras aparecern en orden alfabtico, dado que se trata de un campo alfanumrico.
Hay que tener claro desde el primer momento que ordenar es un prerrequisito necesario para agrupar.
Para Crystal Reports, un grupo es un conjunto de registros consecutivos que tienen el mismo valor del
campo indicado. Si quitamos los criterios de ordenacin de registros que acabamos de establecer, y vez
de ello insertamos un grupo por subcategoras, utilizando el botn correspondiente de la barra de
herramientas Insertar (o la opcin Insertar | Grupo del men), y luego lanzamos de nuevo el Asistente
de ordenacin de registros, veremos que el campo correspondiente habr sido agregado a la lista de
criterios de ordenacin.
Cuando se selecciona la opcin de Insertar grupo, se presenta un cuadro de dilogo en el que podemos
indicar el campo por el que deseamos agrupar (en nuestro caso, ProductSubcategory.Name, si queremos
los grupos en orden alfabtico) y si queremos un orden ascendente o descendente. La pestaa Opciones
nos ofrece varias posibilidades adicionales, como la de indicar que deseamos mantener los registros de
cada grupo juntos siempre que sea posible (cambiando de pgina para ello si fuera necesario) o repetir el
encabezado del grupo en cada pgina al ejecutar el informe.

15

Observar que se crean dos nuevas secciones, de Encabezado y Pie de grupo, numeradas con #1 por
tratarse del primer (y nico) grupo del informe. En la seccin de Encabezado de grupo, el Diseador
coloca adems un objeto de nombre de grupo asociado al campo que hemos indicado como campo para
agrupar. En la Vista previa podremos ver cmo luce ahora el informe; y cmo en principio podemos
eliminar el nombre de subcategora (que se repite para cada producto del grupo) de la seccin de
Detalles.
Vamos a complicar ahora un poco ms el informe y crear un segundo grupo externo. Para ello,
necesitaremos agregar al informe otra nueva tabla, Production.ProductCategory, pues las subcategoras
pertenecen a su vez a categoras. El enlace esta vez se realiza a travs de la clave fornea
ProductCategoryID de la tabla Subcategory. Una vez agregada la tabla al informe, crearemos un nuevo
grupo utilizando como campo por el que agrupar al campo Name de la tabla de categoras. Esta vez lo
ms conveniente es hacerlo utilizando el Asistente de grupos (en el men de Crystal Reports,
seleccionamos Report | Asistente de grupos), pues queremos que este grupo quede a nivel externo,
englobando al de subcategoras. Una vez creado el grupo, en la Vista previa podremos observar el
resultado.

TOTALIZACIN (RESMENES)
Mediante el botn de Insertar resumen o la opcin correspondiente del men podremos aadir
resmenes estadsticos generales (basados en la totalidad de los datos obtenidos de la base de datos, y
normalmente mostrados en el Pie de informe) o parciales para cada uno de los grupos (que generalmente
se colocan en el Pie de grupo correspondiente). Ya anteriormente hemos hecho un recuento general de
los productos disponibles; vamos ahora a mostrar en el informe cuntos productos hay por cada
categora y subcategora.
Si pulsamos el botn de Insertar resumen, el Diseador nos preguntar, como antes, qu campo es el que
queremos resumir (Product.ProductNumber), qu tipo de operacin queremos realizar (Recuento) y la
ubicacin del resumen; observe que ahora, dado que tenemos dos grupos, el asistente nos propone tres
posibles lugares donde colocar el resumen: en el Pie del informe (si quisiramos un total general, que ya
tenemos), en el Pie del grupo externo (si quisiramos contar cuntos productos hay de cada categora) o
en el Pie del grupo interno (si quisiramos contar cuntos productos hay en cada subcategora). Primero
insertaremos un resumen a nivel de categoras (grupo externo); para mejorar la esttica del informe,
pondremos a su izquierda un objeto de texto que diga Total categora. Observe tambin que tendremos
que cambiar el formato del resultado, pues Crystal Reports por defecto muestra los campos numricos
con dos cifras decimales (opcin que puede cambiarse en la configuracin general del Diseador,
accesible desde la opcin del men Diseo | Especificaciones predeterminadas | Campos | Nmero).
A continuacin, repetiremos la operacin de insertar resumen, pero ahora contabilizando la cantidad de
productos por cada subcategora; para variar, mostraremos el resumen no como una cantidad absoluta,
sino como un porcentaje relativo a la cantidad de productos en su categora (opcin Mostrar como
porcentaje de).
Tenga en cuenta que los resmenes de grupos normalmente se colocan en el pie del grupo, pero pueden
tambin moverse a la seccin de Cabecera del grupo correspondiente; esto provocar una cierta
sobrecarga al motor de impresin de Crystal Reports, que tendr que generar en memoria todos los datos
del grupo antes comenzar a imprimirlo, pero este coste es generalmente asumible y poner los resmenes
en la cabecera es muchas veces estticamente conveniente. Esto es lo que haremos con este ltimo
resumen por subcategoras.

MS SOBRE LAS SECCIONES. PROFUNDIZACIN
Las secciones como un todo tambin tienen un conjunto de propiedades que podemos configurar para
mejorar la apariencia y funcionalidad de nuestros informes. Para ello, es necesario utilizar el Asistente de
seccin, disponible en el men de Crystal Reports en Report | Asistente de seccin. El Asistente de

16

seccin muestra todas y cada una de las secciones (y subsecciones, posiblemente) de nuestro informe y
nos permite establecer para cada una de ellas todo un conjunto de propiedades como:
suprimir la seccin completamente. Por ejemplo, en nuestro informe la seccin de Pie de grupo del
grupo interno ha quedado vaca y lo mejor es suprimirla.
provocar un salto de pgina antes o despus de imprimir la seccin.
ajustar la seccin a la parte inferior de la pgina (lo que implica que el contenido de la prxima seccin
pasar a la pgina siguiente)
reiniciar la numeracin de las pginas despus de imprimir la seccin.
mantener unido todo el contenido de la seccin, aunque haya que cambiar de pgina para ello.
suprimir la seccin en caso de que no contenga nada.
hacer que el contenido de la seccin subyazca al de las siguientes secciones; ms adelante utilizaremos
esta opcin para provocar un efecto de marca de agua en todas las pginas del informe.
Por ltimo, queramos hacer especial nfasis en la opcin Ocultar (se permite profundizar), que nos
parece especialmente importante. Tenga en cuenta que cada vez ms los informes no se destinan a ser
presentados en papel, sino a ser consumidos de forma interactiva. Esta opcin, al igual que Suprimir,
hace que una seccin no se muestre cuando se presente el informe; pero a diferencia de la anterior,
permite que el usuario, haciendo clic con el ratn sobre un elemento de nivel superior (generalmente, un
nombre de grupo o resumen), despliegue el contenido de esa seccin oculta en una vista independiente.
Por ejemplo, marquemos con la opcin Ocultar (se permite profundizar) a la seccin de detalles de
nuestro informe y veamos el efecto que se obtiene: a primera vista, el informe slo contiene los
resmenes; pero si el usuario pulsa sobre cualquiera de los nombres de subcategoras, ver los productos
pertenecientes a esa subcategora en una nueva pestaa del visor. Esto es a lo que se le llama
profundizacin (drill down).
Desde el Asistente de seccin tambin tenemos la posibilidad de insertar y eliminar (sub)secciones. El
objetivo de la opcin Insertar de men, como hemos mencionado antes, es realmente el de que
podamos dividir una seccin en subsecciones con el objetivo de aplicarles distintos valores de
propiedades a cada subseccin. Veamos un ejemplo tpico. Supongamos que queremos poner el logotipo
de nuestra empresa como marca de agua en el centro de todas las pginas del informe. Para ello,
seguiremos los siguientes pasos:
a) Dividiremos la seccin de Encabezado de pgina (que, como sabemos, se imprime en la parte superior
de cada pgina del informe) en dos subsecciones. Para ello, seleccionamos la seccin de Encabezado de
pgina y pulsamos el botn Insertar. Ver que la seccin se divide en dos subsecciones, denominadas a
y b, y todo lo que hubiera en la seccin original es pasado a la subseccin a.
b) Configuraremos la nueva subseccin b (y solo ella) para que subyazca al resto de las secciones (opcin
Situar debajo de las secciones posteriores).
c) Ya en el Diseador, ampliaremos por la vertical la subseccin b del encabezado y pondremos cerca del
borde inferior el logotipo de nuestra empresa.
Listo! Si activa la Vista previa, ver que el logotipo subyace perfectamente a todas las pginas del
informe.

SELECCIN DE REGISTROS
El Asistente de seleccin de Crystal Reports permite establecer las condiciones que deben satisfacer los
registros que han de ser utilizados para la confeccin del informe. Para nuestro informe actual, el
asistente mostrar una nica pestaa asociada a la condicin de que el campo
Product.FinishedGoodsFlag sea verdadero. A esa pestaa podremos agregar otras con nuevas
condiciones, y Crystal Reports har que solo se utilicen los registros que satisfagan todas las condiciones
especificadas (o sea, se aplicar la operacin lgica AND a todas las condiciones). A modo de ejemplo,
vamos a limitar el conjunto de registros a aquellos productos que continan a la venta esos registros
tendrn un valor nulo en el campo SellEndDate. Pulsemos el botn Nuevo para indicar una nueva

17

condicin de seleccin. Elijamos el campo Product.SellEndDate (de nuevo, observe que podramos
seleccionar cualquier campo de cualquiera de las tablas implicadas en el informe). Para indicar que nos
interesan los registros con valores no nulos en el campo tendremos que utilizar la ltima opcin de la lista
desplegable que aparece en la pestaa: frmula. Y la frmula que deberemos teclear es IsNull
({Product.SellEndDate}).
Si pulsamos el botn Mostrar frmula del asistente, veremos una frmula con todas las de la ley escrita
en el lenguaje de frmulas de Crystal Reports (que estudiaremos en el tema 4). Se trata de un lenguaje de
programacin completo, complementado adems con una enorme biblioteca de funciones para todas las
necesidades comunes. En este lenguaje es que se escriben en ltima instancia las condiciones de
seleccin de un informe.
Nota avanzada: El Diseador de Crystal Reports determina, de manera inteligente, cundo es posible
traducir una frmula de seleccin escrita en el lenguaje de Crystal en una clusula WHERE de SQL para
pasarla al motor de bases de datos. Si incluye frmulas Crystal complejas en sus frmulas de seleccin, no
ser posible traducirlas a SQL y el filtrado de registros deber hacerse en la mquina cliente, con el
consiguiente incremento del trfico de red y prdida de rendimiento. Mediante la opcin Base de datos |
Mostrar sentencia SQL del men de Crystal Reports podr comprobar que las dos condiciones que hemos
puesto se traducen perfectamente a SQL.

SELECCIN Y ORDENACIN DE GRUPOS
A diferencia de la seleccin de registros, que incluye o excluye del informe registros individuales en base a
una condicin, la seleccin de grupos permite establecer qu grupos enteros deben o no ser incluidos en
el informe. En trminos de SQL, si la formula de seleccin de registros corresponde a la clusula WHERE
de una sentencia SELECT, entonces la frmula de seleccin de grupo corresponde a la clusula HAVING.
El Asistente de seleccin determina que una frmula de seleccin es de grupo si el campo de Crystal
Reports que utilizamos en la condicin es un campo normal de la base de datos o un resumen. En este
ltimo caso, est claro que se trata de una condicin de seleccin de grupo. Por ejemplo, supongamos
que nos interesan nicamente las categoras con ms de 50 productos. En el Asistente de seleccin,
pulsamos Nuevo para agregar una nueva condicin; en el dilogo de seleccin de campo que aparece,
elegimos el recuento de productos por nombre de categoras, y en los siguientes desplegables
introducimos es mayor que y el valor 50. Al pulsar el botn Mostrar frmula, veremos la frmula
Crystal correspondiente a la condicin especificada. Por otra parte, una ojeada a la Vista previa nos
convencer de que la seleccin funciona.
Nota avanzada: Por lo general (al menos en informes de tipo listado), el motor de Crystal Reports
ejecuta la agrupacin y la seleccin de grupos en la mquina cliente. Existe una opcin de configuracin,
Realizar agrupamiento en el servidor (Report | Opciones del informe del men), mediante la cual se
indica al motor que utilice clusulas GROUP BY y HAVING cuando sea posible. Pero cuando es necesario
traer tambin los registros individuales para utilizarlos en el informe, el motor no hace uso de esa
posibilidad.
En cuanto a la ordenacin de grupos, por defecto los grupos aparecen en el informe en el orden
determinado por el tipo de datos al que pertenece el campo por el que se agrupa. En nuestro ejemplo, las
categoras y subcategoras se presentarn en orden alfabtico, dado que hemos agrupado por los
nombres, que son campos de cadena de caracteres. Frecuentemente, lo que se desea no es eso, sino
presentar los grupos en orden ascendente o descendente del valor de un resumen incorporado al
informe.
Para eso, Crystal Reports ofrece un Asistente de ordenacin de grupos (botn en la barra de herramientas
Principal, u opcin Report | Asistente de ordenacin de grupos en el men).
Supongamos por ejemplo que deseamos presentar las categoras no en orden alfabtico, sino en orden
descendente de la cantidad de productos diferentes pertenecientes a cada categora. Lanzamos el
Asistente de ordenacin de grupos, y veremos que nos presenta dos pestaas, dado que el informe

18

incluye dos grupos. El grupo que nos interesa es el externo, que es el preseleccionado por defecto. En el
desplegable Ordenar seleccionamos Todo, y entonces a su derecha aparecer la lista de los resmenes
definidos a ese nivel, para que indiquemos el criterio segn el que queremos ordenar los grupos. En
nuestro caso, habr solo un resumen, que seleccionaremos. Adicionalmente, se nos permite indicar si
deseamos que los grupos aparezcan en orden ascendente o descendente (este ltimo, nuestro caso).
Despus de pulsar Aceptar podremos ver el resultado en la vista preliminar.
Hay que decir que este Asistente, adems de la ordenacin, tambin nos permite realizar una seleccin
de grupos segn criterios que se utilizan con relativa frecuencia en la prctica y cuya especificacin
mediante el Asistente de seleccin que hemos visto anteriormente requerira la programacin de
frmulas de cierta complejidad. Si en lugar de elegir la opcin Todo en el desplegable Ordenar
seleccionamos N superiores (N inferiores), estaramos indicando que deseamos incluir en el informe
solo los N primeros (ltimos) grupos segn el resumen indicado, en orden descendente (ascendente) de
los valores. Por otra parte, las opciones Porcentaje mximo y Porcentaje mnimo nos permiten limitar
el informe a aquellos grupos cuyo porcentaje sobre el total general supera o no supera un cierto valor P.
Tanto N como P pueden ser especificados segn nuestra conveniencia. Observe adems que existe la
posibilidad de agrupar los elementos que los grupos que no superen la criba en un grupo comn, cuyo
nombre por defecto es Otros.

GRFICOS.
Crystal Reports ofrece unas posibilidades muy amplias para la incorporacin de grficos comerciales en
nuestros informes; aqu simplemente mostraremos un ejemplo tpico que le dar una idea de cmo
pueden incorporarse a un informe tales grficos. Para poder incorporar un grfico a un informe, es
necesario haber definido previamente los resmenes que servirn como valores a partir de los cuales se
dibujar el grfico.
Para incorporar un grfico a un informe, se debe utilizar la opcin Insertar | Grfico del men o el botn
correspondiente de la barra de herramientas Insertar, que despliegan el Asistente de grficos. Este
asistente tiene dos modos de trabajo que se configuran mediante la casilla Establecer opciones
automticamente de su primera pestaa. Si la casilla est marcada, el asistente generar
automticamente los ttulos para el grfico y los ejes, escalas, colores, etc. En caso contrario, tendremos
la posibilidad de indicar todas esas caractersticas. Una buena tcnica puede ser mantener inicialmente la
configuracin automtica, y ms adelante editar las opciones del grfico y pasar al modo manual para
indicar esas opciones en detalle. Adems de esta opcin, en la primera pestaa se indica el tipo de grfico
que deseamos incorporar al informe (de barras, lneas, reas, circular o tarta, etc.). Para nuestro ejemplo
elegiremos un grfico de barras.
En la segunda pestaa del asistente es donde se especifica lo fundamental: los datos a partir de los cuales
se dibujar el grfico y la situacin del mismo. En nuestro caso, debido a que tenemos dos niveles de
agrupacin, podemos basar el grfico en dos series de datos: la cantidad de productos por cada categora,
en cuyo caso el grfico aparecer una sola vez en el pie o la cabecera del informe (recuerde que
generalmente los objetos situados en una seccin de pie pueden moverse a su cabecera hermana); o la
cantidad de productos por cada subcategora dentro de cada categora, en cuyo caso tendremos un
grfico para cada categora, situado en la seccin de pie (o la cabecera) del grupo correspondiente a las
categoras. Vamos a elegir aqu la opcin ms difcil, la segunda: indiquemos Por cada
ProductCategory.Name en el desplegable Ubicar. Ver que en el grupo Datos aparecen
automticamente la informacin adecuada: los valores a utilizar para el grfico se obtienen cuando
cambia la subcategora (el grupo ms interno), y el resumen a utilizar es el nico disponible a ese nivel, el
que cuenta la cantidad de productos de cada categora.
Por ltimo, la tercera pestaa del asistente permite establecer los textos que aparecern en el grfico
como ttulo, subttulo, nombres de ejes, etc. y sus propiedades. De momento, mantenga los valores

19

predeterminados y pulse Aceptar para cerrar el asistente. Ver cmo aparece en el informe un grfico de
subcategoras para cada una de las categoras.

EXPORTACIN A OTROS FORMATOS. WORD, EXCEL, HTML, PDF
Crystal Reports nos permite exportar los resultados de la ejecucin de un informe a diferentes formatos.
Ciertos formatos (Microsoft Word, Adobe Acrobat, HTML) se utilizan mayormente con vistas a poner el
informe como tal a disposicin de terceros; en otros casos (Microsoft Excel, Microsoft ODBC), el objetivo
es capturar los resultados numricos que el informe contiene para realizar ciertas transformaciones
posteriores sobre ellos utilizando otras aplicaciones.
Si pulsa el botn de Exportar informe de la barra de herramientas del visor, le aparecer un dilogo en el
que podr elegir el formato de exportacin y el destino (en la versin integrada en Visual Studio,
nicamente un fichero en disco). Un segundo dilogo especfico para el formato de exportacin elegido
aparecer a continuacin para permitirnos configurar el resultado. Y esto dar paso a un tercer cuadro de
dilogo en el que podremos elegir la ruta y el nombre del fichero a crear.
En los temas del curso dedicados a la programacin veremos cmo exportar informes desde nuestras
aplicaciones.

TOTALES ACUMULADOS
Un tipo de resumen muy comn y que tiene sus particularidades que lo distinguen de los dems
resmenes son los totales acumulados. Los totales acumulados nos permiten implementar en nuestros
informes los conocidos suma y sigue frecuentes, por ejemplo, en listados de operaciones bancarias.
Suponga que deseamos listar los pedidos (cdigo, fecha, importe) recibidos a partir del 1/7/2004 (no hay
datos muy recientes en AdvertureWorks :-) En una columna del listado queremos mostrar un suma y
sigue con el total acumulado hasta ese momento del importe de los pedidos. Los datos generales sobre
los pedidos se almacenan en la tabla Sales.SalesOrderHeader de la base de datos. Adems, en la tabla
Sales.SalesOrderDetail se almacenan los detalles (lneas) de cada pedido, pero en este momento no
necesitaremos esa segunda tabla.
Ante todo, aadiremos a nuestro proyecto de Visual Studio un nuevo informe (botn derecho sobre el
nodo del proyecto en el Explorador de soluciones | Agregar | Nuevo elemento | Crystal Reports).
Llamemos al informe ListadoPedidos.rpt. Inmediatamente despus de indicar el nombre, el Asistente de
informes aparecer automticamente para que especifiquemos las caractersticas del informe. Se trata de
un informe estndar, y seleccionamos la base de datos AdventureWorks, y de ella la tabla
Sales.SalesOrderHeader. Los campos que nos interesan son SalesOrderID, OrderDate y TotalDue. No
necesitamos agrupaciones, por lo que saltamos directamente sobre esa pgina del Asistente. En la pgina
de seleccin de registros, indicamos que nos interesan los pedidos en los que OrderDate es posterior al
1/7/2004. Pulsamos Finalizar y podremos ver la presentacin preliminar del informe.
Ahora crearemos el total acumulado. Para ello, en el nodo Campos de totales acumulados del
Explorador de campos pulsamos el botn derecho del ratn y seleccionamos Nuevo. Aparecer un
cuadro de dilogo en el que se pueden indicar las caractersticas que queremos que tenga el total
acumulado.
Ante todo, se debe indicar el campo que se quiere acumular (en nuestro caso TotalDue) y la operacin de
resumen (aqu suma). En la seccin Evaluar se indica en qu momento queremos que el acumulador se
evale. En este caso dejaremos la opcin por defecto, evaluar para cada registro, pero observe que
tambin es posible evaluar el total acumulado solo cuando cambie el valor de un campo, cuando se
cambie de grupo, o cuando se cumpla una condicin cualquiera (expresada mediante una frmula). Por
su parte, en la seccin Restablecer indicamos cundo queremos que el acumulador se reinicie a cero.
Aunque tambin lo dejaremos ahora en Nunca, observe que se puede reiniciar el acumulador cada vez
que se cambia de campo, de grupo o cuando se cumpla una frmula. Estudiaremos el lenguaje de
frmulas de Crystal Reports en el siguiente tema. Y en principio, ya est! Basta con pulsar el botn

20

Finalizar y arrastrar el campo recin creado a la seccin de Detalles del informe (preferiblemente a la
derecha del importe del pedido). Ver la suma parcial de los importes evaluada para cada registro.
TRUCO: Frecuentemente en listados con este tipo de totales nos piden que pongamos el valor del total
acumulado hasta el momento al pie de cada pgina. Para ello, seleccione el campo de total acumulado,
cpielo al Portapapeles (CTRL-C) y luego pguelo (CTRL-V) en la seccin de Pie de pgina. Listo! Este es
uno de los pocos casos en los que tiene sentido mover objetos de una seccin a otra que no sea su
hermana.

FRMULAS
En este tema se presentan las frmulas de Crystal Reports y sus principales aplicaciones. Rpidamente se
convencer de que las frmulas juegan un papel muy importe tanto en informes bsicos como en
aplicaciones ms avanzadas.

INTRODUCCIN
Las frmulas son una caracterstica muy importante de Crystal Reports, que le dan la potencia necesaria
para acometer numerosas tareas que de otras maneras seran imposibles y limitaran seriamente las
posibilidades del producto.
Bsicamente, una frmula es una expresin ms o menos compleja escrita en uno de los dos lenguajes de
programacin que soporta Crystal Reports: Crystal y Visual Basic, y cuyo objetivo es calcular un valor que
debe ser utilizado en alguna de las fases de confeccin de un informe. En este curso utilizaremos la
sintaxis Visual Basic, que ser mucho ms familiar a los programadores que utilicen VB.NET. Para
garantizar que las frmulas utilicen ese lenguaje, por favor vaya a la opcin Crystal Reports | Diseo |
Especificaciones predeterminadas | Elaborando informes del men y selecciones Sintaxis Basic en el
desplegable Lenguaje de frmulas.
En general, los lenguajes de frmulas de Crystal Reports son lenguajes de programacin completos, que
incluyen declaraciones de variables, condicionales, estructuras de bucle, etc. No obstante, gracias a los
potentes asistentes incorporados al producto, rara vez es necesario hacer uso de tales facilidades y las
frmulas se utilizan en el sentido literal del trmino el de una expresin que produce un valor de un
determinado tipo.

SINTAXIS DEL LENGUAJE DE FRMULAS CRYSTAL Y VISUAL BASIC
Una frmula se compone a partir de diferentes elementos bsicos, como son:
Constantes: 12 (entero), 0.07 (nmero decimal), Total (cadena de caracteres), True (lgica),
#12/5/2006# (de fecha/hora).
Identificadores, que pueden representar:
Nombres de campos, con la sintaxis {NombreTabla.NombreCampo}. Por ejemplo, para representar al
campo Sexo de una tabla llamada Clientes, utilizaramos {Clientes.Sexo}.
Otras frmulas, con la sintaxis {@NombreFormula}. Por ejemplo, si al definir la frmula B necesitamos
utilizar otra frmula A, la escribiramos as {@A}.
Totales acumulados, con la sintaxis {#NombreTotal}.
Parmetros del informe, con la sintaxis {?NombreParametro}. Los parmetros juegan un papel esencial
en el desarrollo de informes genricos que puedan utilizarse en mltiples situaciones diferentes sin
necesidad de modificaciones. A ellos les dedicaremos el Tema 5.
Operadores: +, - (aritmticos), <, > (de comparacin), Not, And, Or (lgicos), y otros.
Funciones predefinidas: Crystal ofrece un amplio espectro de funciones de uso general incorporadas de
antemano al producto, de modo que el programador no tenga que reinventar la rueda cada vez que
quiera ejecutar una tarea ms o menos trivial. Por ejemplo, si el campo Nombre de la tabla Clientes

21

contiene el nombre del cliente, y en un informe deseamos mostrar ese nombre en maysculas, podemos
escribir la siguiente frmula: UCase({Clientes.Nombre}).
Aunque pueda parecer necesaria una gran cantidad de tecleo, en realidad el programador no tiene que
teclear casi nada para componer estas frmulas: a continuacin veremos cmo un potente editor nos
ayuda con esta tarea.
Hay que tener en cuenta siempre el tipo de datos del resultado que una frmula produce. En ciertas
ocasiones una frmula puede producir un resultado de cualquier tipo que queramos, pero en otros casos
Crystal Reports espera que le suministremos una frmula que produce un resultado de un tipo
determinado y protestar si le suministramos una frmula que produce otra cosa, aunque sea
sintcticamente correcta.

APLICACIONES DE LAS FRMULAS
En esta seccin estudiaremos los fundamentos de las frmulas de Crystal Reports y presentaremos sus
principales aplicaciones, que son:
Campos calculados
Formato condicional
Seleccin de registros y grupos
Grupos a medida
Totales acumulados condicionales

CAMPOS CALCULADOS
La aplicacin ms tpica de las frmulas son los campos calculados. Un campo calculado es un campo (de
cualquier tipo de datos soportado por Crystal) que fsicamente no se almacena dentro de la base de
datos, pero que puede ser calculado por Crystal a partir de los valores de otros campos del informe.
Como ejemplo, supongamos que queremos determinar el tiempo que ha tardado cada pedido del ao
2004 en salir del almacn de la empresa de camino a su destinatario. En la tabla Sales.SalesOrderHeader
no tenemos directamente ese dato, pero s tenemos los campos OrderDate (la fecha en que se hizo el
pedido) y ShipDate (la fecha en que se hizo el envo). Podemos calcular el intervalo deseado restando
ambas fechas, y para ello hace falta una frmula.
En nuestro proyecto, seleccione el informe ListadoPedidos.rpt. En el Explorador de campos, pulse el
botn derecho del ratn sobre el nodo Campos de frmula y seleccione Nueva. Ante todo, es necesario
dar un nombre a la frmula: llammosle DasHastaSalida. Ver que para seguir adelante hay dos
opciones: Usar Asistente o Usar Editor. Se trata de dos herramientas diferentes con un mismo
propsito: ayudarnos a escribir las frmulas con un mnimo de tecleo y comprobacin de que la frmula
es correcta. En este curso utilizaremos el Editor, que nos parece ms intuitivo, sin carecer de ninguna de
las posibilidades.
Al pulsar el botn Usar Editor, aparecer ante nosotros el Editor de frmulas. En el panel de la izquierda
est un rbol con todas las frmulas del informe; podemos cerrarlo para hacer ms espacio para nuestra
frmula actual.
Ahora, la frmula se compone en la zona inferior del editor (donde ya aparece automticamente formula
=). La zona superior se divide en tres paneles: el panel de Identificadores, desde el que podemos elegir
los campos del informe o la base de datos, frmulas, totales acumulados, etc.; el panel de Funciones, en
el que tenemos a nuestra disposicin la lista de todas las funciones predefinidas de Crystal (algo
sumamente til) y el panel de Operadores, en el que podremos encontrar a todos los operadores del
lenguaje.
Para introducir nuestra frmula, buscamos en el panel de Identificadores el campo ShipDate de
SalesOrderHeader (como el campo no est incluido directamente en el informe, debemos bajar a buscarlo
en la lista general de todos los campos de la tabla) y hacemos doble clic sobre l ver que es copiado a
la frmula con la sintaxis correcta: {SalesOrderHeader.ShipDate}. El operador - podramos elegirlo de un

22

modo similar, seleccionndolo en el nodo de operadores aritmticos; pero en este caso la ventaja no est
tan clara, y probablemente sea mejor teclear el carcter. Por ltimo, seleccionamos del panel de
Identificadores el segundo operando, OrderDate. La frmula final es:

formula = {SalesOrderHeader.ShipDate} - {SalesOrderHeader.OrderDate}

En cualquier momento podemos comprobar la validez de una frmula pulsando el botn Revisar. Una
vez editada y validada la frmula, podemos guardarla y cerrar el editor mediante Guardar y cerrar. Y ya
definida la formula, podemos arrastrarla al informe en este caso, a la seccin de Detalles. Por supuesto,
tambin podramos definir resmenes basados en esa frmula, que se convierte en un campo ms del
informe.

FORMATO CONDICIONAL
La aplicacin de las frmulas al formato condicional consiste en que, mediante una frmula, es posible
programar las caractersticas visuales de cualquier campo o seccin del informe, o incluso que aparezca o
no en l.
Continuando con el mismo ejemplo, suponga que queremos resaltar aquellos pedidos que tardaron ms
de 7 das en salir del almacn. Para ello, vamos a resaltar en color rojo los valores correspondientes.
Seleccionamos la frmula, pulsamos el botn derecho del ratn y elegimos la opcin Dar formato al
campo. En el dilogo que aparece, activamos la pestaa Fuente. Lo que deseamos es cambiar el color
del texto, pero no incondicionalmente, sino sujeto a una condicin. Por eso, pulsamos el botn de
frmula situado a la derecha del desplegable correspondiente al color de la fuente. Aparece el editor de
frmulas, y en l debemos introducir la frmula que determinar el color del texto. En este caso, la
frmula es:

if {@DasHastaSalida} >= 5 then formula = crRed else formula = crBlack

Las constantes crRed y crBlack , aparecen en el panel de Funciones cuando se est editando una frmula
que deba producir un color, como es el caso.
De un modo similar, podemos programar cualquiera de las caractersticas visuales de los campos del
informe. En estos casos, la frmula que debemos utilizar tiene que producir un resultado del tipo
adecuado. Como otro ejemplo, suponga que deseamos que cierto campo no aparezca en el informe (o
sea, suprimirlo) en caso de que se cumpla una condicin. En tal caso, debemos utilizar la propiedad
Suprimir (pestaa Comn) del Editor de formato. La frmula debe producir un resultado booleano, y
cuando su valor sea True el campo se suprimir del informe.
Por ltimo, el formato condicional se puede aplicar no solo a campos individuales, sino a secciones
enteras. Por ejemplo, vamos a dar al listado de pedidos formato de pijama, haciendo que la seccin de
Detalles tenga alternativamente fondo gris o blanco para cada fila del informe. Para ello, lance el
Asistente de seccin y seleccione la seccin de Detalles. Active luego la pestaa Color y pulse sobre el
botn de frmula asociado al desplegable de color de fondo. Introduzca la siguiente frmula:

if RecordNumber mod 2 = 1 then formula = crSilver else formula = crWhite

RecordNumber es otra funcin predeterminada de Crystal, que produce un nmero secuencial para cada
registro del conjunto de datos (puede encontrarse bajo el nodo Estado de impresin).

GRUPOS PERSONALIZADOS
La siguiente aplicacin de las frmulas es la que tiene que ver con la seleccin de registros y grupos.

23

Como ya hemos presentado anteriormente, Crystal permite hacer una seleccin tanto de los registros
individuales como de los grupos que se utilizarn al ejecutar el informe. El Asistente de seleccin nos
permite especificar las condiciones que debern cumplir los registros o grupos en los casos de
condiciones sencillas, y se encarga de generar automticamente las frmulas correspondientes. Pero
cuando lo que queremos expresar va ms all de las posibilidades cubiertas por el asistente, es necesario
pasar a la accin y escribir la frmula nosotros mismos.
Para un ejemplo sencillo, suponga que deseamos que el listado de pedidos (adems de los pedidos a
partir de julio del ao 2004) incluya solamente los pedidos recibidos a travs de Internet (aquellos para
los que el campo SalesOrderHeader.OnlineOrderFlag es True). Simplemente lanzamos el Asistente de
seleccin (Crystal Reports | Report | Asistente de seleccin o el botn correspondiente en la barra de
herramientas Principal). Pulsamos el botn Nuevo para aadir una nueva condicin de seleccin. Y en
el desplegable que aparece seleccionamos es Verdadero. Si ahora pulsamos el botn Mostrar frmula
podremos ver la frmula correspondiente:

{SalesOrderHeader.OrderDate} >= #1/7/2004# and {SalesOrderHeader.OnlineOrderFlag}

Nota avanzada: Como hemos comentado anteriormente, es conveniente limitarse a frmulas de
seleccin sencillas siempre que sea posible, pues Crystal Reports determina automticamente cundo es
posible traducir una frmula de seleccin en una clusula WHERE de SQL para pasarla al motor de bases
de datos, lo que redunda en una mayor eficiencia.

SELECCIN DE REGISTROS Y GRUPOS
Otra aplicacin sumamente til de las frmulas son los grupos personalizados o a medida. De manera
predeterminada, los grupos de Crystal Reports estn compuestos por registros que tienen un mismo valor
en el campo seleccionado. Sin embargo, frecuentemente se quieren agrupar los registros de forma que la
pertenencia a un mismo grupo venga dictada por otra condicin que no es la estricta igualdad de los
campos. Esto es lo que hacen posible los grupos a medida de Crystal Reports.
Suponga que deseamos agrupar los registros del listado de pedidos en tres categoras: los de menos de 25
Euros, los que estn entre 25 y 100, y los de ms de 100 Euros. Debemos utilizar el botn Insertar grupo
de la barra de herramientas Insertar (o seleccionar la opcin correspondiente del men). Como campo
para agrupar, seleccionamos SalesOrderHeader.TotalDue y como criterio de agrupacin en orden
especfico.
Aparecer una nueva pestaa, en la que podremos crear nuestros grupos personalizados, indicando para
cada uno un nombre, y la condicin (frmula) de pertenencia de los registros a los grupos. En nuestro
caso, llamemos a los grupos PEQUEOS, MEDIANOS y GRANDES, y asociemos a cada grupo las
condiciones correspondientes. Al pulsar Aceptar podremos comprobar que el grupo ha sido creado, y la
vista previa nos convencer de que la agrupacin se realiza correctamente.

TOTALES ACUMULADOS CON CONDICIONES
En el tema anterior estudiamos los totales acumulados, pero no profundizamos en la posibilidad de
asociarles frmulas para indicar cundo se desea evaluarlas y cundo reiniciarlas a cero. Esta es una
posibilidad que conviene tener en cuenta para cuando sea necesaria.
Por ejemplo, suponga que queremos hacer que el total acumulado del listado de pedidos se reinicie cada
vez que se produzca un cambio de fecha. Previamente ordenamos el listado por el campo OrderDate,
utilizando el Asistente de ordenacin. En este veremos que ya hay un criterio establecido, el del grupo
(recuerde la mxima para agrupar, hay que ordenar), pero podremos establecer la fecha como criterio
de ordenacin secundario dentro de cada grupo.
Ahora seleccionemos nuestro total acumulado, pulsemos el botn derecho del ratn sobre l y
seleccionemos Editar total acumulado. En la zona Restablecer (inferior derecha) marquemos la opcin

24

Use una frmula y pulse el botn de frmula correspondiente. Introduzca la frmula:

formula = PreviousValue({SalesOrderHeader.OrderDate}) <> {SalesOrderHeader.OrderDate}

La funcin predefinida PreviousValue nos da el valor del campo indicado en el registro anterior. Es muy
til para detectar situaciones de cambios de grupo y otras situaciones similares, frecuentemente en
combinacin con otras funciones como OnFirstRecord (que devuelve True si estamos situados en el
primer registro).

PARMETROS
En este tema presentaremos los parmetros, que juegan un papel muy importante de cara a la
programabilidad de los informes.

INTRODUCCIN
La inmensa mayora de los informes se disean para luego utilizarlos frecuentemente de manera
peridica. Sin embargo, cada nueva ejecucin del informe necesitar pequeos ajustes derivado del
cambio de los datos de entrada del informe. Si los parmetros no existieran, cada nueva ejecucin
requerira una modificacin previa del informe en el Diseador un verdadero problema para la
productividad. Los parmetros nos permiten precisamente definir informes adaptables, en los que los
datos de entrada cambiantes se solicitan inmediatamente antes de la ejecucin.
Continuando con nuestro listado de productos de ejemplo, supongamos que nos interesara poder
ejecutar el informe para distintos valores de la fecha de inicio ahora mismo, el informe tiene clavado
el valor #1/7/2004#. Pues bien, lo ideal hubiera sido haber definido un parmetro para esa fecha de
inicio, cosa que mostraremos a continuacin.

DEFINICIN Y USO DE PARMETROS
Para definir un parmetro, se debe pulsar con el botn derecho del ratn sobre el nodo Campos de
parmetro del Explorador de campos y seleccionar la opcin Nuevo. En el dilogo que aparece,
debemos introducir los siguientes datos:
Nombre del parmetro. Llamemos al parmetro FechaInicio. Para referirse luego al parmetro desde
frmulas, etc. se utilizar la sintaxis {?FechaInicio}.
Texto de la solicitud. Antes de ejecutar un informe con parmetros, Crystal Reports preguntar los
valores a asignar a los parmetros. Aqu se debe introducir el texto que aparecer en el dilogo de
pregunta, en este caso Fecha de inicio.
Tipo de datos. El tipo de datos del parmetro, en este caso Fecha.
Valores predeterminados. Aqu podemos especificar para el parmetro uno o ms valores por defecto,
que se mostrarn en el cuadro de dilogo de solicitud de parmetros para que el usuario no tenga que
teclearlos.
Opciones. Opciones avanzadas relacionadas con la utilizacin de mltiples valores.
Esa es una de las dos facetas de la utilizacin de un parmetro. La segunda es su utilizacin, y para ello
podemos hacer con el parmetro todo lo que podemos hacer con cualquier otro campo: arrastrarlo sobre
el informe o utilizarlo en cualquier frmula. En nuestro ejemplo, la fecha de inicio forma parte de la
frmula de seleccin de registros. Para hacer uso del parmetro, lanzamos el Asistente de seleccin y
sustituimos la fecha actualmente en uso por la sintaxis de uso del parmetro {?FechaInicio}. Solo resta
entonces mostrar la vista previa para cerciorarnos de que la definicin del parmetro ha sido aceptada:
Crystal nos solicitar que indiquemos un valor para la fecha de inicio antes de mostrar el informe.

25

Hay que sealar que (como veremos en el prximo tema) las libreras .NET de Crystal ofrecen la
posibilidad de asignar desde programa valores a los parmetros, de modo que el cuadro de dilogo no
aparezca en pantalla.

SUBINFORMES
Otra posibilidad muy interesante que ofrece Crystal Reports es la de anidar un informe dentro de otro,
una caracterstica que comnmente se conoce como subinformes. Para incorporar un informe como
subinforme dentro de otro, se utiliza el botn Insertar subinforme de la barra de herramientas Insertar
(o la opcin correspondiente del men). Esta posibilidad puede utilizarse, por ejemplo, para concatenar
un informe a continuacin de otro, insertndolo en una subseccin del pie de informe. Tal aplicacin es,
en general, sumamente directa, y la nica opcin interesante es la de integrar el subinforme completo
cuando se ejecuta el informe externo, o simplemente poner un hipervnculo para que el subinforme se
ejecute bajo demanda (a peticin es el trmino que utiliza Crystal).

SUBINFORMES PARAMETRIZADOS
La aplicacin ms importante de los subinformes son los subinformes parametrizados. En ellos, un
informe se integra como subinforme dentro de otro (normalmente en la seccin de Detalles de ste), y el
informe externo (contenedor) comunica al interno a travs de un parmetro un valor que le indica a ste
ltimo qu datos debe mostrar.
Como ejemplo, supongamos que queremos mostrar los detalles de cada uno de los pedidos de nuestro
listado de pedidos. Un posible enfoque podr ser el de integrar dentro de la seccin de Detalles del
informe actual un subinforme que presente los detalles del pedido actual. Esta tcnica tiene la ventaja de
que podramos indicar que el subinforme se ejecute bajo demanda, lo que reducira la carga sobre el
motor de base de datos.
Para empezar, inserte un subinforme en la seccin de detalles del listado de pedidos. Marque la casilla
Subinforme a peticin. Indique que desea crear un nuevo subinforme con el Asistente; llame al nuevo
subinforme DetallesPedido.rpt y pulse el botn Asistente de informes.
Al disear el nuevo informe, indicaremos que la tabla deseada es Sales.SalesOrderDetail. Elegiremos
varios campos, como ProductID (cdigo de producto en la vida real necesitaramos conectar con la tabla
de productos para obtener el nombre), OrderQuantity (cantidad), UnitPrice (precio unitario),
UnitPriceDiscount (descuento sobre precio unitario) y LineTotal (importe total de lnea). Pulse Finalizar
para terminar el diseo del informe. Ser llevado nuevamente al dilogo de insercin de subinforme; es
hora de pasar a la pestaa Vnculo para establecer la conexin entre el informe y el subinforme.
En la pestaa Vnculo, debemos primero indicar el campo del informe contenedor cuyo valor se debe
pasar al subinforme; es SalesOrderHeader.SalesOrderID, el cdigo del pedido. A continuacin, debemos
indicar el campo del subinforme que recibir (a travs de un parmetro cuyo nombre propone el
asistente) el cdigo del pedido cuyos detalles debe mostrar. En nuestro ejemplo, es SalesOrderID. Y solo
nos queda pulsar el botn Aceptar. De la creacin del parmetro y el establecimiento de la frmula de
seleccin adecuada en el informe recin creado se encarga el automticamente el asistente.
La presentacin de la vista previa nos mostrar cmo funcionan los informes con subinformes bajo
demanda: al pulsar sobre el hipervnculo asociado a un pedido, el subinforme con los detalles de dicho
pedido se desplegar en una nueva pestaa del visor de informes.

UTILIZACIN DE INFORMES EN APLICACIONES WINDOWS
En este primer tema relacionado con la programacin de aplicaciones que utilicen informes se presentan
los recursos fundamentales que hacen posible incorporar informes Crystal Reports en aplicaciones de
escritorio.


26

TCNICAS FUNDAMENTALES
Las diferentes subsecciones de esta seccin presentan los fundamentos tericos y las tcnicas comunes
que se utilizan en la incorporacin de informes Crystal a aplicaciones Windows Forms.

INCORPORACIN DE UN INFORME A UNA APLICACIN
Para este nuevo tema relacionado con la programacin .NET, comenzaremos una nueva aplicacin
Windows Forms en la que incluiremos un informe Crystal sencillo, puesto que ya hemos cubierto los
temas relacionados con el diseo de informes. Eso s, el informe incluir parmetros, ya que como hemos
dicho los parmetros son uno de los recursos fundamentales que ofrece Crystal a los desarrolladores de
aplicaciones.
En Visual Studio 2005, cierre la solucin que tenga abierta y seleccione Archivo | Nuevo | Proyecto.
Cuando aparezca el cuadro de dilogo Nuevo proyecto elija Visual Basic | Aplicacin de Crystal Reports,
lo que nos ahorrar ciertos pasos que ya hemos visto en el tema 1. Llame al proyecto Ejemplo2 y pngalo
en el directorio adecuado.
Inmediatamente se presentar el Asistente de informes de Crystal, para que diseemos el (primer)
informe que el proyecto contendr. Definiremos en este caso un listado de pedidos similar al que ya
hemos hecho anteriormente: la tabla es Sales.SalesOrderHeader, y los campos que mostraremos son
SalesOrderID, OrderDate y TotalDue. No incluiremos frmula de seleccin ni parmetros de momento; lo
haremos ms adelante. Por ahora trabajaremos con un listado totalmente plano.
Al finalizar el diseo del informe, se nos presenta el entorno integrado de Visual Studio con una aplicacin
que en principio ya funciona, como podemos comprobar.
Qu ha creado el asistente de proyectos Crystal para nosotros? Si mostramos la vista Diseo del
formulario Form1, veremos que en ste contiene dos componentes:
Un componente no visual (por lo tanto, situado en la banda inferior del diseador) llamado
CrystalReport11. A qu clase pertenece este objeto? Para responder a esta pregunta, conviene pulsar el
botn Mostrar todos los archivos en el Explorador de soluciones. Veremos que nuestro informe
CrystalReport1.rpt tiene un archivo de VB dependiente, y si abrimos ese archivo, en la vista de Cdigo
veremos que contiene la definicin de una clase llamada CrystalReport1 igual que el informe; se trata de
una clase que representa al informe concreto (en el argot de Crystal, se dice que la clase implementa un
informe tipado). El componente CrystalReport11 es de esa clase, y por lo tanto es un objeto que
representa a un informe como se. En la siguiente seccin hablaremos con ms detalle sobre este objeto.
Un componente visual que ocupa toda el rea de la ventana y tiene como funcin presentar un informe
Crystal, llamado CrystalReportViewer1. La clase a la que pertenece es CrystalReportViewer (cuyo espacio
de nombres es CrystalDecisions.Windows.Forms). Se trata ni ms ni menos que del visor de informes
Crystal para Windows utilizaremos siempre objetos de esta clase para mostrar los informes en nuestras
aplicaciones de escritorio. Observe en la Ventana de propiedades que la propiedad ReportSource del
visor la apunta al componente CrystalReport11 (recordemos que al inicio del curso ya hemos visto algo
similar).
En principio, la construccin de estos objetos al crearse el formulario es suficiente para que veamos el
informe al ejecutar la aplicacin.

EL MODELO DE OBJETOS DE CRYSTAL REPORTS.NET
El ejemplo anterior ya nos da una idea bastante completa de las libreras de clases para .NET de Crystal
Reports.
Por una parte, una librera ofrece clases que representan a un informe como un todo
(ReportDocument) y a todos los objetos que componen un informe Crystal o participan en l.
Estas clases de propsito general se concentran fundamentalmente en el ensamblado
CrystalDecisions.CrystalReports.Engine.

27

En segundo lugar, otra librera ofrece clases para la presentacin de informes en aplicaciones Windows
Forms. Estas clases se almacenan en el ensamblado CrystalDecisions.Windows.Forms.dll y entre ellas
destaca una en especfico CrystalReportViewer, que implementa el visor de informes Windows.
En tercer lugar, otra librera ofrece clases para la presentacin de informes en aplicaciones Web
ASP.NET. Estas clases se almacenan en el ensamblado CrystalDecisions.Web.dll y entre ellas destaca
tambin una en especfico una que tambin se llama CrystalReportViewer, aunque su espacio de
nombres es diferente, y que implementa el visor de informes para aplicaciones Web.
Hablaremos ms sobre esta clase en el siguiente tema.
Si busca los componentes de Crystal Reports instalados en el Cuadro de herramientas de Visual Studio,
ver que actualmente (estamos trabajando en una aplicacin Windows) aparecen dos: ReportDocument y
CrystalReportViewer. Un panorama similar se podr observar cuando trabajemos en una aplicacin Web,
slo que entonces se tratar del otro visor de informes, el adecuado para aplicaciones Web.
En general, cuando se habla del modelo de objetos de Crystal Reports, se hace referencia nicamente a
las clases de la primera librera, cuyo uso es comn tanto a las aplicaciones Windows como a las
aplicaciones Web. El modelo de objetos de Crystal contiene cientos de clases para representar con todos
sus detalles a todos los diferentes elementos que componen un informe o participan de algn modo en
l.
Por ejemplo, incluye una clase ParameterField para representar las caractersticas de un parmetro, y la
clase ReportDocument (que representa a un informe completo) ofrece una propiedad de tipo array
ParameterFields() mediante la que podramos acceder a todos los parmetros de un informe.
INFORMES TIPADOS Y NO TIPADOS
Como acabamos de ver, la clase que juega un papel predominante en el modelo de objetos de Crystal
Reports es ReportDocument, que permite representar un informe. Ahora bien, esta clase representa a un
informe genrico, sin ninguna caracterstica conocida de antemano. En Crystal a esta clase se la conoce
bajo el nombre de informe no tipado. Podramos trabajar con nuestro listado de pedidos a travs de un
objeto ReportDocument, pero perderamos cierta informacin especfica de nuestro informe concreto, y
tendramos que referirnos a cualquier caracterstica del informe a travs de las propiedades y mtodos
generales de ReportDocument.
A diferencia de lo anterior, la clase CrystalReport1 generada por el asistente e incluida en nuestro
proyecto (que hereda de ReportClass, que a su vez hereda de ReportDocument), representa un informe
tipado una clase especializada a partir de ReportDocument que solo vale para nuestro informe
concreto, pero que almacena informacin sobre l que nos facilitan la vida. En particular, los informes
tipados contienen cdigo que se encarga automticamente de cargar el informe concreto, que se
almacena dentro del ejecutable en forma de recurso. Observe en el cdigo fuente de CrystalReport1 la
propiedad ResourceName.
Como otro ejemplo, vea la definicin de la propiedad Section1 de CrystalReport1. Observe ahora cmo el
uso de la clase tipada facilita el acceso a la primera seccin del informe:

Dim doc As ReportDocument = CType(CrystalReport11, ReportDocument)
' estas dos lneas hacen lo mismo
MessageBox.Show(CrystalReport11.Section1.Name)
MessageBox.Show(doc.ReportDefinition.Sections(0).Name)

Como habr comprendido, la primera lnea de cdigo declara una variable genrica de tipo
ReportDocument y la inicializa para que apunte a nuestro informe tipado.
En general, es recomendable trabajar con los informes tipados siempre que sea posible, y utilizar
directamente la clase ReportDocument slo para trabajos de ndole genrica, por ejemplo cuando
queremos que el mismo componente apunte a diferentes informes durante la ejecucin. De hecho,
cuando se arrastra un ReportDocument del Cuadro de herramientas a un formulario, Visual Studio nos

28

pregunta si realmente deseamos un objeto no tipado o si preferimos crear una clase tipada asociada a
alguno de los informes del proyecto.

INFORMES INCRUSTADOS Y EXTERNOS
Si selecciona un informe de Crystal Reports en el Explorador de soluciones, ver sus propiedades en la
Ventana de propiedades. Debemos mencionar dos muy importantes, cuyo significado conviene conocer.
La primera de ellas es Accin de generacin. Ver que su valor predeterminado es Recurso incrustado.
Eso significa que cuando la aplicacin es compilada la definicin del informe es almacenada como un
recurso dentro del ensamblado principal del proyecto (en nuestro caso, del ejecutable). Por lo tanto, no
necesitaremos desplegar fsicamente el fichero .rpt junto con el ejecutable cuando instalemos la
aplicacin a otros usuarios, lo cual es ms cmodo y ms seguro. Como inconveniente, si necesitamos
hacer modificaciones a un informe incrustado, tendremos que recompilar la aplicacin y volver a
desplegar el ejecutable.
La otra opcin de esta propiedad que se utiliza con cierta frecuencia es Ninguna, para no incrustar el
informe en el ensamblado. En ese caso, a la propiedad Copiar en el directorio de resultado se le asigna el
valor Copiar siempre o Copiar si es posterior, con el objetivo de que el fichero .rpt sea copiado al
mismo directorio que el ejecutable o librera final. Para un correcto funcionamiento de la aplicacin, el
fichero .rpt siempre deber ir junto con el ejecutable. La ventaja de este enfoque es que se podra enviar
una nueva versin del informe al usuario sin necesidad de redesplegar toda la aplicacin. Y el peligro est
en que el informe podra ser borrado o alterado con o sin mala intencin.
Para cargar la definicin de un informe externo a un objeto ReportDocument o una clase derivada
(informe tipado) se utiliza el mtodo Load:

' carga cualquier informe externo en un ReportDocument no tipado
ReportDocument1.Load("CrystalReport1.rpt")
ReportDocument1.Refresh()
CrystalReportViewer1.ReportSource = reportDocument1

CONEXIN A LA BASE DE DATOS
La clase ReportDocument (y por herencia, todos los informes tipados, que heredan de ella), ofrecen un
mtodo SetDatabaseLogon que permite suministrar al motor de Crystal Reports la informacin de
conexin necesaria para acceder a la base de datos donde estn los datos que necesita el informe.
Este mtodo ofrece dos variantes fundamentales, que permiten indicar:
a) Usuario y contrasea. El informe se ejecutar contra el servidor y base de datos definidos dentro del
informe.
b) Servidor, Base de datos, Usuario y contrasea. El informe se ejecutar contra el servidor y base de
datos especificados. Esta variante es ms til en situaciones donde tenemos una base de datos de
desarrollo y otra de produccin.
Si en nuestro ejemplo necesitramos suministrar informacin de conexin para ejecutar el informe,
deberamos desconectar el visor de informes de CrystalReport11 en tiempo de diseo y programar lo
siguiente en el evento Load del formulario:

CrystalReport11.SetDatabaseLogon(".\SQLExpress", "AdventureWorks", "sa", "kk")
' conexin del visor en tiempo de ejecucin
CrystalReportViewer1.ReportSource = CrystalReport11

PASO DE PARMETROS EN TIEMPO DE EJECUCIN

29

Una de las caractersticas favoritas de los desarrolladores es la posibilidad de pasar directamente valores
de parmetros a los informes de manera transparente.
Ante todo, aadiremos dos parmetros a nuestro informe, correspondientes a la fecha de inicio y fecha
de fin de los pedidos. O sea, no deseamos obtener todos los pedidos de la base de datos, sino solo los que
estn entre las fechas de inicio y fin indicadas por los parmetros. Llamaremos a los parmetros FInicio y
FFin, y haremos que la frmula de seleccin del informe sea:

{SalesOrderHeader.OrderDate} in {?FInicio} to {?FFin}

Observe la utilizacin de los operadores in..to (desde..hasta) por parte del Asistente.
A continuacin, aadiremos las siguientes lneas de cdigo al evento Load del formulario: ' asignar valores
a parmetros CrystalReport11.SetParameterValue("FInicio", New DateTime(2003, 9, 1))
CrystalReport11.SetParameterValue("FFin", New DateTime(2003, 9, 5))
Esto es suficiente para hacer que se muestren solamente los pedidos efectuados entre el 1 y el 5 de
septiembre de 2003. El mtodo SetParameterValue de ReportDocument espera dos valores, el nombre
del parmetro y el valor a asignar, respectivamente. El segundo parmetro es de tipo Object, dado que
los parmetros pueden ser de distintos tipos. Hay que comprobar siempre que enviamos datos de los
tipos correctos al informe.

EXPORTACIN DE INFORMES MEDIANTE CDIGO
Otra de las tcnicas comnmente requeridas por los desarrolladores es la posibilidad de exportar el
informe a un formato de presentacin diferente, tradicionalmente Adobe PDF o Microsoft Word o Excel.
Aqu de nuevo viene en nuestra ayuda la clase ReportDocument, que ofrece varios mtodos que nos
facilitan la tarea.
El mtodo Export() es el ms potente de la familia, y a la vez el mas complejo de utilizar. Permite
especificar, adems del destino de la exportacin, otras caractersticas de la exportacin que son tiles
sobre todo cuando se exporta a Excel. Adicionalmente, tenemos los mtodos ExportToDisk(),
ExportToStream() y ExportToHttpResponse(), que simplifican la exportacin de informes a un fichero en
disco, un flujo de salida cualquiera o un flujo HTTP como el generado por una aplicacin o servicio Web.
Para exportar nuestro informe a un fichero en formato PDF, podremos escribir:

' exportar a PDF
CrystalReport11.ExportToDisk( CrystalDecisions.Shared.ExportFormatType.PortableDocFormat, _
"C:\PEDIDOS.PDF")

El primer parmetro es de un tipo enumerado que determina el formato de exportacin.

IMPRESIN DE INFORMES
Para la impresin de un informe desde cdigo, de nuevo podemos utilizar un potente mtodo de la clase
ReportDocument: PrintToPrinter(). Previamente, se debe utilizar la propiedad PrintOptions (una
propiedad con poca ciencia y bastante miga, sobre la que no daremos muchos detalles aqu) para
seleccionar la impresora activa y establecer mltiples opciones de impresin.
Por ejemplo, para enviar a mi impresora predeterminada una copia de todas las pginas del informe,
debo escribir:

' imprimir
CrystalReport11.PrintOptions.PrinterName = "Dell Laser Printer 5210n"
CrystalReport11.PrintToPrinter(1, False, 0, 0)


30

Los parmetros de PrintToPrinter significan: a) la cantidad de copias, b) si se deben combinar o no las
copias en caso de ser ms de una, c) pgina de inicio, d) pgina de fin. Las pginas de inicio y fin se deben
poner a cero si se desea obtener copias completas.

CONFIGURACIN DEL VISOR DE INFORMES
El Visor de informes de Crystal Reports posee varias propiedades dignas de mencionar aqu. La primera,
ReportSource, tiene que ver con el origen a partir del que el visor obtiene el informe a mostrar; las dems
tienen relacin con la esttica de presentacin del informe.
ReportSource: esta propiedad indica al visor de dnde debe obtener el informe a mostrar. Es una
propiedad de tipo Object, porque se le puede asignar diferentes valores:
Una cadena de caracteres que representa el nombre del fichero que contiene el informe.
Esta variante es la ms simple y primitiva de todas; existe desde la primera versin de la librera.
Utilizando esta opcin es posible saltarse completamente el modelo de objetos de Crystal.
Un objeto de la clase ReportDocument (informe no tipado) o derivada de ella (informe tipado). Esta
variante es la que estamos presentando aqu.
A continuacin, tenemos tres propiedades booleanas que determinan si ciertas zonas del visor deben
aparecer o no:
DisplayGroupTree si se debe mostrar o no el rbol de grupos (en caso de que el informe tenga
grupos).
DisplayStatusBar si se debe mostrar o no la barra de estado.
DisplayToolbar si se debe mostrar o no la barra de herramientas.
Por ltimo, tenemos varias propiedades booleanas que determinan qu botones de la barra de
herramientas deben aparecer o no:
ShowCloseButton mostrar o no el botn de Cerrar.
ShowExportButton mostrar o no el botn de Exportar.
ShowGotoPageButton mostrar o no el botn de Ir a pgina.
ShowGroupTreeButton mostrar o no el botn de Mostrar rbol de grupos.
ShowPageNavigateButtons mostrar o no los botones de navegacin por las pginas.
ShowPrintButton mostrar o no el botn de Imprimir.
ShowRefreshButton mostrar o no el botn de Actualizar.
ShowTextSearchButton mostrar o no el botn de Buscar texto.
ShowZoomButton mostrar o no el botn de Acercar/Alejar.

INFORMES A PARTIR DE UN DATASET
Los informes Crystal que hemos presentado hasta ahora han obtenido sus datos directamente de la base
de datos en el momento necesario. Pero los informes de Crystal Reports pueden nutrirse de muchas otras
diversas fuentes de informacin. En particular, un informe Crystal puede obtener sus datos de un DataSet
(conjunto de datos) de ADO.NET, lo cual es muy conveniente porque las arquitecturas de mltiples capas
de uso comn en la prctica actual favorecen la utilizacin de objetos de este tipo para la transmisin de
informacin entre capas, y generalmente se los puede encontrar en la capa de presentacin de las
aplicaciones, que es donde se muestran los informes.
Si creamos un nuevo informe con el Asistente, veremos que en la lista de los posibles orgenes de datos a
utilizar para un informe hay un nodo ADO.NET DataSets dentro del cual se muestran todos las clases
derivadas de DataSet (los llamados conjuntos de datos tipados) disponibles en el proyecto. Como los
conjuntos de datos tipados contienen metadatos que describen su estructura, el Diseador de Crystal es
capaz de acceder a ella para permitirnos seleccionar las tablas, campos, etc. con los que queremos
trabajar.

31

A la hora de presentar el informe en tiempo de ejecucin, es necesario utilizar el mtodo SetDataSource
() de la clase ReportDocument para conectar el informe con el objeto concreto que almacena el conjunto
de datos. Por ejemplo,

CrystalReport21.SetDataSource(AdventureWorksDataSet)
CrystalReport21.Refresh() ' elimina datos guardados por el informe
CrystalReport21.Show()

DESPLIEGUE DE APLICACIONES WINDOWS QUE INCLUYAN INFORMES
CRYSTAL
Una vez terminado el desarrollo de una aplicacin, llega el momento del despliegue. Con ese objetivo,
Visual Studio ofrece diferentes tipos de proyectos de instalacin que permiten empaquetar los ficheros
que se deben copiar al equipo de destino, as como la secuencia de comandos que se deben ejecutar en
ste para que la aplicacin quede lista para funcionar en la mquina de destino.
En lo concerniente a Crystal Reports, para desplegar correctamente cualquier aplicacin .NET que utilice
informes Crystal es necesario incluir en el programa de instalacin:
las libreras .NET de Crystal Reports.
los ficheros .RPT que sean externos a la aplicacin.
Creemos un nuevo proyecto de instalacin para desplegar nuestra reciente aplicacin Ejemplo3. Para
ello, lo primero es utilizar Archivo | Nuevo proyecto y seleccionar la plantilla Proyecto de instalacin
debajo del nodo Otros tipos de proyectos | Instalacin e implementacin. Llamemos al proyecto
Instalar3 y pulsamos Aceptar. Se presentar un editor especializado en el que debemos especificar qu
ficheros, accesos directos, etc. queremos colocar en qu directorios del equipo de destino.
Generalmente, el ejecutable y los ensamblados privados que componen la aplicacin se colocan en la
carpeta de la aplicacin, y opcionalmente se colocan accesos directos al ejecutable en el men Programas
o el escritorio del usuario.
Ante todo, debemos seleccionar el nodo del proyecto en el Explorador de soluciones e introducir las
propiedades bsicas del proyecto, sobre todo Manufacturer (fabricante) y Product Name (nombre del
producto), que determinarn la carpeta de aplicacin por defecto (\[Archivos de programa]\[Fabricante]
\[NombreProducto]). Para agregar archivos a la carpeta de la aplicacin, pulsamos el botn derecho sobre
ella y seleccionamos la opcin Agregar. En este caso sencillo, utilizamos la opcin Archivo para aadir el
nico archivo necesario, el ejecutable Ejemplo3.exe (el informe Crystal utilizado est como recurso
incrustado).
Ahora debemos seleccionar la opcin Proyecto | Propiedades del men de Visual Studio. La mayor parte
de las opciones del dilogo que aparece son satisfactorias, pero s debemos pulsar el botn Requisitos
previos, que nos permite indicar qu software debe incluirse en nuestro proyecto para instalarlo en la
mquina de destino si no estuviera ya instalado. Adems de .NET Framework 2.0 (que ya deber estar
marcado), debemos marcar la casilla correspondiente a Microsoft Data Access Components 2.8
(necesario para .NET) y la casilla de Crystal Reports para .NET Framework 2.0.
Pulsamos Aceptar dos veces para cerrar los cuadros de dilogo, y ya casi est! Solo nos queda
seleccionar la opcin Generar | Generar de Visual Studio para generar el proyecto de instalacin.
El proyecto de instalacin siempre consiste de una jerarqua de carpetas con todos los recursos
necesarios para la instalacin, empaquetados o no, segn las opciones que hayamos seleccionado. En
cualquier caso, en el directorio raz siempre se incluye un fichero Setup.exe, que es el que debemos
ejecutar en la mquina de destino para proceder a la instalacin de la aplicacin.

UTILIZACIN DE INFORMES EN APLICACIONES WEB

32

En este tema estudiaremos las particularidades relacionadas con la programacin de aplicaciones Web
que utilicen Crystal Reports.
Los mecanismos para la incorporacin de informes Crystal Reports en aplicaciones Web son muy similares
a los que ya hemos visto para las aplicaciones de escritorio. Casi todos los recursos de programacin que
hemos visto anteriormente (conexin a la base de datos, aplicacin de parmetros, utilizacin de un
DataSet como origen del informe) son igualmente aplicables para el desarrollo de aplicaciones Web. Las
principales diferencias tienen que ver no con el modelo de programacin (como veremos, en el fondo se
utiliza la misma clase ReportDocument), sino con las caractersticas relacionadas con la visualizacin,
dado que las aplicaciones Web se ejecutan en un navegador como Internet Explorer.
El despliegue tambin es muy similar bsicamente se trata de hacer que las libreras .NET de Crystal
caigan en su sitio cuando se ejecute el programa de instalacin.

TCNICAS FUNDAMENTALES
Las diferentes subsecciones de esta seccin presentan las tcnicas especficas que se utilizan al incorporar
informes Crystal en aplicaciones Web ASP.NET.

INCORPORACIN DE UN INFORME A UNA APLICACIN
Para mostrar cmo incorporar un informe Crystal Reports a una aplicacin Web, comenzaremos un nuevo
sitio Web ASP.NET ubicado en el sistema de archivos. Al pulsar Archivo | Nuevo | Sitio Web ver que
existe una plantilla Sitio Web ASP.NET de Crystal Reports que nos hara an ms fcil la vida; aqu vamos
a evitarlo para estudiar el mecanismo a utilizar en el caso general. Seleccione la plantilla genrica Sitio
Web ASP.NET, y llame al directorio EjemploWeb (puede ubicarlo en la zona del disco que desee, una de
las grandes ventajas de Visual Studio 2005 a la hora de crear aplicaciones Web).
A continuacin, agregaremos al proyecto un nuevo informe Crystal, que llamaremos Paises.rpt y mostrar
un listado sencillo de los pases/regiones almacenados en la tabla Person.CountryRegion de
AdventureWorks. En el caso de las aplicaciones Web, es conveniente colocar todos los informes del
proyecto dentro de una carpeta comn, que llamaremos informes. Una vez diseado el informe,
podemos arrastrarlo hacia esa carpeta.
Llega la hora de configurar la pgina Web actual, Default.aspx, para que muestre nuestro informe cuando
ejecutemos la aplicacin. Para ello, veamos primero qu componentes debemos seleccionar del nodo
Crystal Reports del Cuadro de herramientas en el caso de una aplicacin Web.
En primer lugar, para mostrar un informe en una pgina ASPX necesitaremos un componente
CrystalReportSource (origen de informe Crystal). Se trata de un componente que encapsula un objeto
de la clase ReportDocument que hemos estudiado antes, dotndonos a la vez de propiedades adicionales
que son de gran utilidad en el mundo de las aplicaciones Web. Vamos a arrastrar un componente
CrystalReportSource sobre la vista de Diseo de la pgina ASPX. A continuacin pulsamos sobre el enlace
a su utilidad de configuracin, y veremos que slo ofrece una opcin: Configurar el origen del informe,
donde debemos indicar a qu informe del proyecto queremos asociarlo.
Entre las propiedades que ofrece la clase CrystalReportSource, debemos destacar:
EnableCaching (booleana) y CacheDuration (entero que representa un entero en segundos). Si
EnableCaching es verdadera, el motor de CrystalReports cachear en la memoria del servidor el
resultado de la ejecucin de un informe durante el intervalo indicado en CacheDuration, no teniendo que
ejecutar el informe nuevamente si se recibe otra peticin del informe antes de que expire el intervalo.
Esta posibilidad permite aumentar en gran medida la productividad de nuestros sitios Web.
Report. Es una propiedad que integra varias caractersticas del informe, como el nombre del fichero de
informe, los parmetros y orgenes de datos de los que se nutre. Se trata mayormente de informacin
descriptiva; para el tratamiento programtico del informe recomendamos utilizar la propiedad
ReportDocument.

33

ReportDocument. No se ve en la ventana de propiedades, porque es una propiedad de tiempo de
ejecucin. Como su nombre indica, almacena una referencia al objeto ReportDocument que representa al
informe tipado que ya hemos estudiado en las aplicaciones Windows. A este objeto podremos aplicarle
todas las tcnicas que hemos estudiado anteriormente (conexin a la base de datos, aplicacin de
parmetros, utilizacin de un DataSet como origen del informe).

CONFIGURACIN DEL VISOR DE INFORMES HTML
Una vez configurado el objeto CrystalReportSource, llega el momento de poner sobre la pgina ASPX el
componente que permitir mostrar en el navegador el resultado de la ejecucin del informe. Para ello
necesitaremos el componente CrystalReportViewer (nodo Crystal Reports del Cuadro de herramientas).
Observe que aunque el nombre corto de esta clase es el mismo de la que se utiliza en las aplicaciones
Windows, no se trata ni mucho menos de la misma clase; su nombre completo es
CrystalDecisions.Web.CrystalReportViewer.
La tarea del componente CrystalReportViewer es generar cdigo HTML + Javascript que pueda ser
mostrado por un navegador estndar. Le recomendamos ejecutar la aplicacin Web y utilizar la opcin
Ver | Cdigo fuente del navegador para cerciorarse de que la interfaz de usuario est hecha con HTML.
La siguiente imagen muestra la barra de botones del visor Web; el significado de los botones es
intuitivamente claro.
Cuando arrastramos un componente CrystalReportViewer sobre una pgina ASPX, automticamente se
lanza el asistente para su configuracin; lo primero que debemos indicar es a qu origen de informe
queremos conectarlo (en nuestro caso, el origen recin creado). Esta conexin se establece a travs de la
propiedad ReportSourceID del visor. El resto de las propiedades del visor tiene que ver con la
visualizacin en s; a continuacin detallamos las propiedades ms importantes:
ReportSourceID - esta propiedad conecta al visor con el objeto ReportSource que determina el informe
a mostrar.
SeparatePages indica si los registros del informe deben separarse en pginas, o si todos deben ir
contiguos, como en una sola gran pgina.
ClientTarget determina el cdigo que emitir el componente para enviar al navegador. Si sabemos
que algunos usuarios utilizan navegadores antiguos o limitados, podemos asignar a esta propiedad el
valor Downlevel; por el contrario, si sabemos que todos utilizan navegadores avanzados, el valor
adecuado puede ser Uplevel; en general, lo mejor es mantener el valor Auto, donde el propio
componente determina qu tipo de HTML generar en funcin del navegador que hace la llamada.
PrintMode el mtodo que se utilizar para la impresin local de los informes: ActiveX o Pdf. Se
recomienda utilizar este ltimo valor.
Dos propiedades booleanas permiten indicar si queremos que el visor presente cuadros de dilogo
emergentes para solicitar la informacin que pueda faltarle para la ejecucin del informe. Tericamente,
nunca deberamos dejar que estos dilogos aparecieran, sino que deberamos suministrar los datos por
programa (por ejemplo, en el evento Load de la pgina) utilizando los mtodos ya estudiados de la clase
ReportDocument:
EnableDatabaseLogonPrompt si debe solicitarse el usuario y contrasea de conexin en caso
necesario.
EnableParameterPrompt si deben solicitarse valores para los parmetros que carezcan de ellos.
A continuacin, tenemos tres propiedades booleanas que determinan si ciertas zonas del visor deben
aparecer o no:
DisplayGroupTree si se debe mostrar o no el rbol de grupos (en caso de que el informe tenga
grupos).
DisplayPage si se debe mostrar o no la pgina del informe.
DisplayToolbar si se debe mostrar o no la barra de herramientas.

34

Por ltimo, tenemos varias propiedades booleanas que determinan qu botones de la barra de
herramientas deben aparecer o no:
HasDrillUpButton mostrar o no el botn de Volver al informe anterior.
HasExportButton mostrar o no el botn de Exportar.
HasGotoPageButton mostrar o no el botn de Ir a pgina.
HasPageNavigationButtons mostrar o no los botones de navegacin por las pginas.
HasPrintButton mostrar o no el botn de Imprimir.
HasRefreshButton mostrar o no el botn de Actualizar.
HasSearchButton mostrar o no el botn de Buscar texto.
HasToggleGroupTreeButton mostrar o no el botn de Mostrar rbol de grupos.
HasZoomFactorList mostrar o no la lista de opciones de zoom.

VISUALIZACIN DIRECTA EN FORMATO PDF
Si probamos las opciones de Exportar o Imprimir del visor de informes Web, veremos que presentan un
cuadro de dilogo para que el usuario final seleccione el formato de exportacin o el rango de pginas,
entre otras caractersticas. Frecuentemente quisiramos que la exportacin a PDF (un formato de amplia
popularidad) se produjera de manera automtica y que en el navegador apareciera directamente el
resultado. Esta tcnica nos permitira incluso obviar la utilizacin del visor. Aqu mostraremos cmo
hacerlo.
Sobre la pgina con la que estamos trabajando, colocaremos un botn y le asignaremos el ttulo PDF.
Programe el evento Click del botn de la siguiente forma:

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
' nombre de fichero nico
Dim nombre As String = "C:\temp\" & Session.SessionID & ".pdf"
' exportamos a PDF
CrystalReportSource1.ReportDocument.ExportToDisk( _
CrystalDecisions.Shared.ExportFormatType.PortableDocFormat, nombre)
' enviamos el fichero PDF al navegador
Response.ClearHeaders()
Response.ClearContent()
Response.ContentType = "application/pdf" ' tipo MIME
Response.WriteFile(nombre) ' contenido
Response.Flush()
Response.Close()
End Sub

Es esencial un nombre de fichero que sea nico para cada sesin, de modo que no existan
interferencias entre varios posibles visitantes de la pgina.

DESPLIEGUE DE APLICACIONES WEB QUE INCLUYAN INFORMES CRYSTAL
El despliegue de aplicaciones Web que utilizan informes Crystal es realmente muy similar al despliegue de
aplicaciones Windows, pero generalmente causan muchsimo menos dolores de cabeza, dado que las
aplicaciones Web se desplieguen de forma centralizada en un servidor.
En lugar de crear un nuevo Proyecto de instalacin, se debe utilizar un nuevo Proyecto de programa de
instalacin Web. En general, es un tipo de proyecto muy similar al anterior, con modus operandi y
resultados similares. En el caso de una aplicacin Web, para su correcto despliegue es necesario incluir en
el proyecto todos los ficheros que forman parte de la carpeta de la aplicacin y sus subcarpetas,

35

incluyendo en nuestro caso los ficheros .rpt (que en las aplicaciones Web siempre se almacenan como
ficheros externos).

You might also like