¡BIENVENIDO AL CURSO "DESARROLLO CRYSTAL REPORTS .NET"!

DE INFORMES DE DATOS CON

Este curso le ofrece todos los conocimientos que necesita para diseñar informes de datos Crystal Reports e incorporarlos en sus aplicaciones .NET (tanto Windows como Web). En este curso aprenderá: 󲐀 Cómo crear informes de datos utilizando el diseñador de informes integrado en Visual Studio 2005 󲐀 Cómo utilizar los componentes que ofrece Crystal Reports para incorporar esos informes en aplicaciones .NET. 󲐀 Cómo crear instaladores para esas aplicaciones, para facilitar su despliegue. REQUISITOS: Para una correcta asimilación de los contenidos del curso, el alumno deberá estar familiarizado con los conceptos fundamentales de la programación 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 edición Profesional de Visual Studio 2005; si se dispone de una edición inferior, la alternativa es adquirir de manera independiente el producto Crystal Reports Developer, e instalarlo sobre cualquier versión de Visual Studio 2005. Como motor de bases de datos, el curso utiliza Microsoft SQL Server 2005; cualquiera de sus ediciones es válida (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 edición Express, puede descargarla desde aquí.

INTRODUCCIÓN A CRYSTAL REPORTS .NET
En esta primera lección aprenderá qué es Crystal Reports, las particularidades de su versión para .NET Framework, su arquitectura y las posibilidades que ofrece para el diseño y ejecución de informes de datos. La lección consta de los siguientes temas: 󲐀 Cómo crear informes de datos utilizando el diseñador de informes integrado en Visual Studio 2005 󲐀 Cómo utilizar los componentes que ofrece Crystal Reports para incorporar esos informes en aplicaciones .NET. 󲐀 Cómo crear instaladores para esas aplicaciones, para facilitar su despliegue.

QUÉ ES CRYSTAL REPORTS
Crystal Reports es una herramienta potente a la vez que fácil de usar para el diseño y generación de informes a partir de datos almacenados en una base de datos u otra fuente de información. Es, con diferencia, la herramienta más popular en su categoría, y no solo entre quienes podrían considerarse sus “usuarios” puros (aquellos que necesitan obtener periódicamente información para la toma de decisiones a partir de los datos de la empresa), sino también entre los programadores, que lo han convertido en su herramienta favorita a la hora de embeber capacidades de generación de informes dentro de las aplicaciones a medida. A este último hecho indudablemente ha contribuido mucho el que, desde hace más de diez años, Crystal Reports venga siendo incorporado “de serie” a las herramientas de desarrollo de Microsoft (Visual Basic y luego Visual Studio). Con la aparición de .NET Framework, una transformación revolucionaria de las tecnologías de desarrollo de Microsoft, los fabricantes de Crystal Reports se dieron a la tarea de adaptar el producto a los nuevos
1

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: 󲐀 Enseñarle a utilizar el diseñador de Crystal Reports integrado en Visual Studio 2005 para crear informes de datos potentes y flexibles. 󲐀 Mostrarle cómo incorporar esos informes en sus aplicaciones .NET para Windows y la Web, utilizando como lenguaje de programación 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 extensión .RPT (report) y en el que se almacena la definición de los informes. El producto se puede ver como la combinación de tres componentes principales, que son: 󲐀 El Motor de Impresión (Crystal Reports Print Engine, CRPE). A pesar de lo que su nombre sugiere, este componente, escrito en código no administrado, no sólo se encarga de lo relacionado con la impresión en papel de los informes, sino además con todo lo que tiene que ver con la ejecución de los mismos, empezando por el acceso a la base de datos para leer la información y continuando con la generación de la imagen de las diferentes páginas para luego volcarlas en pantalla, papel o exportarlas a otros formatos como Adobe PDF o Microsoft Word. 󲐀 Las Librerías de Código Manejado encapsulan la funcionalidad del Motor de Impresión a través de un conjunto de clases fácilmente accesibles desde aplicaciones escritas en Visual Basic, C# o cualquier otro lenguaje .NET. Estas son las librerías que utilizaremos desde nuestras aplicaciones o servicios (para Windows o la Web) para cargar, ejecutar e imprimir los informes. 󲐀 Por último, el Diseñador de Informes es el software que presenta la interfaz de usuario a través de la cual un usuario, programador o no, puede crear (“diseñar”) un informe y guardarlo en un fichero .RPT para su posterior reutilización. Se trata de una aplicación sofisticada, repleta de potentes asistentes que garantizan una alta productividad sin limitar las posibilidades a nuestra disposición. La versión del Diseñador que incluye Crystal Reports.NET se integra perfectamente dentro de Visual Studio 2005, permitiendo creando una experiencia aún más ágil y productiva.

Arquitectura de Crystal Reports

POSIBILIDADES DE ACCESO A DATOS Y EXPORTACIÓN
2

Indudablemente, otra de las características que han hecho tan popular a Crystal Reports es la amplia gama de orígenes de datos que soporta, así como de formatos de salida a los que se pueden exportar los resultados. El Motor de Impresión de Crystal Reports tiene una arquitectura modular, y se apoya en controladores (drivers) independientes para acceder a los diversos orígenes de datos soportados y generar los informes en los diferentes formatos de salida posibles. Las posibilidades de acceso a diferentes orígenes de datos sobrepasan ampliamente la mera capacidad para comunicarse con bases de datos (prácticamente todos los sistemas de bases de datos, tanto relacionales como “planos” están soportados), y abarcan desde la lectura de todo tipo de bitácoras (logs), por ejemplo las producidas por los servidores Web para el seguimiento de la navegación de los usuarios, hasta el acceso a objetos en memoria generados por las aplicaciones que hospedan al Motor de Impresión. Por ejemplo, en este curso veremos cómo 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 Impresión 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 también 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 aún no podemos prescindir del papel ni mucho menos, la presentación de informes se está convirtiendo cada vez más en una tarea interactiva. Las versiones más recientes de Crystal Reports incluyen numerosas facilidades que veremos en este curso (Árbol de grupos, elementos con hiperenlaces) y que están orientadas única y exclusivamente a la visualización de informes en una ventana de Windows o en un navegador Web.

LIBRERÍAS DE CRYSTAL REPORTS
Las librerías de código manejado incluidas en Crystal Reports.NET conforman una potente API Application Programming Interface - Interfaz para la Programación 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 físicos (DLLs) para simplificar las dependencias y el despliegue ulterior de las aplicaciones. La siguiente tabla presenta los principales ensamblados (librerías 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 explícitamente las referencias a estos ensamblados en nuestros proyectos, ya que los asistentes de Visual Studio se encargan automáticamente de ello cuando, por ejemplo, incorporamos a una aplicación un informe de Crystal Reports. ENSAMBLADO CrystalDecisions.Shared CrystalDecisions.ReportSource CrystalDecisions.CrystalReports.Engine CrystalDecisions.Windows.Forms CrystalDecisions.Web USO Contiene tipos compartidos por Crystal Reports.NET y otras aplicaciones de la empresa. Contiene la implementación de clases para conectarse a diferentes orígenes de informes. Interfaz con el Motor de Impresión de Crystal Reports. Clases para la presentación de informes Crystal en aplicaciones Windows. Clases para la presentación de informes Crystal en aplicaciones Web
3

puede descargar e instalar la edición Express (Service Pack 1) desde aquí. que utilizaremos para los informes. en caso de disponer de alguna de esas ediciones “de gama baja” de Visual Studio. En este curso. consiste en adquirir Crystal Reports. Puede encontrar una amplia información sobre todas y cada una de las tablas y otros objetos de base de datos que contiene AdventureWorks aquí. 󲐀 SQL Server 2005. Dado que cubre todos los aspectos del funcionamiento de la empresa. En 4 . la base de datos forma parte de la instalación del producto. INTRODUCCIÓN Antes que nada. de esta descarga únicamente es necesario el fichero AdventureWorksDB. puede descargarse desde aquí. es una base de datos bastante extensa. Se trata de una base de datos que almacena toda la información generada por una empresa ficticia dedicada a la fabricación y venta de bicicletas. una base de datos relacional) de una manera más o menos elaborada. Información sobre las piezas y productos que la empresa compra y sus proveedores. 󲐀 La base de datos de ejemplo AdventureWorks. Las ediciones Express y Estándar *NO* incluyen. es conveniente definir qué entendemos por informe. Información sobre los empleados de la empresa. PRESENTACIÓN DE LA BASE DE DATOS DE EJEMPLO Desarrollaremos los ejemplos de este curso utilizando como origen de datos para los informes a AdventureWorks. Crystal Reports. consideraremos como informe a cualquier documento que presente un subconjunto de los datos almacenados en un origen de datos (generalmente.NET de forma independiente (diríjase al sitio web del fabricante). Recursos Humanos. Si no dispone de una edición comercial de SQL Server 2005. Compras. necesitará tener instalado el siguiente software: 󲐀 Visual Studio 2005 edición Profesional o superior.NET. El curso asume una cierta familiaridad con la programación de aplicaciones . En este último caso. cualquier edición. Si dispone de una edición comercial de SQL Server 2005. Información sobre los productos fabricados y vendidos por la empresa.REQUISITOS PARA SEGUIR EL CURSO Para seguir este curso. En general. TÉCNICAS BÁSICAS DE DISEÑO DE INFORMES En este tema se presenta el Diseñador de Informes de Crystal Reports integrado en Visual Studio 2005 y se presentan las técnicas básicas de diseño de informes en las que se apoyan los temas subsiguientes. la base de datos de ejemplo que acompaña a SQL Server 2005. Información sobre los clientes y los pedidos que realizan. En principio.msi. y siempre comenzaremos cada ejemplo concreto indicando en qué tablas se almacena la información a partir de la que se desea diseñar el informe. Producción. y por eso Microsoft ha dividido las tablas que componen la base de datos en los siguientes esquemas: Esquema Person Purchasing Production Sales HumanResources Contiene objetos relacionados con Personas. La alternativa. Aquí se almacenan los nombres y direcciones de clientes individuales. en cualquier caso. el uso de las diferentes tablas a la hora de componer los informes es bastante intuitivo. también le será de utilidad el SQL Server Management Studio Express. proveedores y empleados. desgraciadamente.NET en Visual Basic y con el trabajo con bases de datos relacionales. Ventas.

incluye un formulario principal inicialmente vacío. cómo tiene que transformarlos y por último.este sentido.RPT para su posterior ejecución. que tradicionalmente se guarda en un fichero externo . CREACIÓN DE INFORMES ESTÁNDAR UTILIZANDO EL ASISTENTE Dentro de Visual Studio 2005. Lo que ve en pantalla ahora (“Galería de Crystal Reports”) es la ventana introductoria del Diseñador. Pero antes de enfrentarse al Diseñador de Crystal Reports (o de hecho. Del cuadro de diálogo con los distintos tipos de elemento posibles. Ahora sobre el nombre del proyecto en el Explorador de Soluciones. pulse botón derecho del ratón y Agregar | Nuevo elemento. un simple listado de los empleados de la empresa podría perfectamente considerarse un informe. seleccione Archivo | Nuevo | Proyecto y cuando aparezca el cuadro de diálogo ‘Nuevo proyecto’ elija Visual Basic | Aplicación para Windows (observe que hay otra plantilla Aplicación de Crystal Reports. que nos pregunta: 5 . b) en consecuencia. que evitaremos de momento). se activa el Diseñador de Crystal Reports. a cualquier generador de informes). Toda esa información se almacenará de la definición del informe. claro está bastante más elaborado que el anterior. Llame al nuevo fichero ListadoProductos. elija Crystal Reports. Tener las ideas claras nos ayudará a cumplir con los objetivos requeridos en el menor tiempo y con la mayor calidad posible. cuáles son los datos que debemos utilizar y c) qué apariencia aproximada deberá tener nuestro informe cuando sea ejecutado. Al agregar un informe al proyecto. Llame al proyecto Ejemplo1 y póngalo en el directorio adecuado. es altamente conveniente realizar un trabajo de análisis y diseño previos que nos den una idea clara de a) qué necesita obtener exactamente el usuario que nos ha encargado el informe. Como toda aplicación para Windows.rpt. Otro documento que muestre a esos empleados agrupados por categorías según su volumen de ventas del año anterior sería otro informe. cómo debe presentar cada elemento de datos sobre el documento final. Definir o crear un informe consiste en indicar al Diseñador de Crystal Reports de dónde tiene que obtener los datos necesarios.

Un informe de tabla cruzada es un informe que presenta en una tabla resúmenes agrupados por categorías. Esta opción es conveniente si queremos diseñar un informe muy parecido a otro que ya hemos creado anteriormente. y ‘SQLExpress’ es el nombre de la instancia en que se instala SQL Server Express de forma predeterminada). el Asistente de informes es una combinación de otros asistentes más sencillos que podrá invocar por separado posteriormente. PASO 1. Por último.\SQLExpress (‘. debemos indicar Crear nueva conexión | OLE DB (ADO) y luego elegir el proveedor ‘Microsoft OLE DB Provider for SQL Server’. por ejemplo los volúmenes de ventas de cada tipo de productos por cada país en el que la empresa opera. es conveniente dejarse guiar por el Asistente. despliegue la lista de bases de datos disponibles y seleccione AdventureWorks. No necesitamos ninguna en este caso. En general. Una vez finalizado el Asistente. Comenzaremos diseñando un informe estándar – por ejemplo. Aquí tenemos que indicar: a) La tecnología a utilizar para conectarse al origen de datos. Como veremos a continuación. Pulse Siguiente. Pulse Siguiente. generalmente a partir de una tabla de clientes. Es la opción más conveniente en la gran mayoría de los casos. Etiqueta. 3. Generalmente no es productivo ir por esta “ruta difícil”. A partir de un informe existente. el Asistente nos guía a través de diferentes pantallas para que definamos las características principales del informe. éste es capaz de ayudarnos con tres tipos de informes diferentes: 1. Mantenga las opciones por defecto y pulse Aceptar. 2. c) Por último. a menos que se tenga claro que el informe únicamente incluirá una tabla cruzada. Informe estándar. Como se dará cuenta rápidamente. aunque la autenticación de usuario/contraseña es más utilizada en la vida real.’ significa la máquina local. b) El nombre del servidor. Esta opción se utiliza para crear un informe de tipo “listado”. en cuyo caso es más conveniente seleccionar la siguiente opción. Las opciones posibles son: 1. En nuestro caso. No es ningún problema añadir manualmente una tabla cruzada a un informe estándar si se desea. El primer paso a la hora de diseñar el informe es indicarle al Asistente dónde están y cuáles son los datos que se van a utilizar en el informe. para producir las etiquetas a adherir a los sobres de correos cuando se hace un mailing. 6 . Listado de múltiples filas y columnas. En este caso. sobre todo en aplicaciones Web. para obtener rápidamente un diseño inicial que luego podemos modificar a voluntad. un informe que presente la lista de productos que la empresa AdventureWorks ha vendido al público o vende actualmente. utilizaremos como nombre de servidor . podremos añadir al informe nuevas posibilidades o modificar las decisiones tomadas anteriormente. Utilizando el Asistente del Diseñador. se nos permite indicar las propiedades avanzadas de la conexión. Tablas cruzadas.a) En primer lugar. 3. De momento utilizaremos la autenticación integrada (marcando la casilla correspondiente). b) Si decidimos utilizar el Asistente. la base de datos y el usuario y contraseña necesarios para establecer la conexión. cómo queremos diseñar el informe. 2. Partiendo desde cero sobre un lienzo en blanco. tratándose de una base de datos SQL Server. y por eso pulsamos directamente en Finalizar.

Para ello es necesario especificar una condición de selección – sólo aquellas filas que satisfagan la condición que indiquemos serán recuperadas del servidor de base de datos. OPCIONES DE ENLACE Como resultado del paso anterior. que veremos reflejado en el área de trabajo de Visual Studio 2005. Observe también que no es necesario que el campo de la condición esté entre los campos a mostrar en el informe para utilizarlo en la condición de filtro.Una vez indicados el servidor y la base de datos. Por último. 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. En este momento es conveniente pulsar el botón derecho del ratón sobre el nombre del servidor y utilizar la opción ‘Agregar a Favoritos’ para recordar este origen de datos para futuros informes. sin embargo. Una vez indicada la condición. pulse Siguiente. tenemos a nuestra disposición en el área de trabajo de Visual Studio como “vista activa” del informe el “lienzo” generado por el Asistente. no especificaremos criterio de agrupación alguno. Una vez elegidas las columnas a mostrar en el listado. PASO 3. necesitaremos la tabla Product del esquema Production. La otra decisión importante que debemos tomar con respecto a los datos es qué filas de la tabla seleccionada deseamos que aparezcan en el informe. el Asistente nos permite elegir entre un conjunto de plantillas de estilos disponibles. vista(s) o procedimiento almacenado de la base de datos de donde se deberá obtener la información. Llega ahora el momento de indicar la(s) tabla(s). ESPECIFICACIÓN DE LAS TABLAS DEL INFORME. Fíjese cómo al seleccionar un campo en la zona inferior derecha de la ventana aparece un cuadro de combinación en el que se muestran algunas de las condiciones comunes para campos de ese tipo. Para este ejemplo inicial. pulse Siguiente. seleccionaremos los siguientes campos: 󲐀 ProductNumber – el código de identificación del producto 󲐀 Name – el nombre del producto 󲐀 Color – el color del producto Cuando haya elegido esos tres campos. En nuestro caso. Seleccione esa tabla en la vista de árbol (pasándola a la columna derecha del diálogo mediante el botón ‘>’) y pulse Siguiente. nos interesa la condición ‘es Verdadero’. PASO 5. toca el turno a indicar los criterios por los que se quiere agrupar las filas del resultado. PASO 2. Las plantillas de estilos permiten establecer de una sola vez todo el conjunto de características visuales (“estilos”) que se aplicarán a los diferentes tipos de objetos que pueden aparecer en el informe. Pulse Siguiente. en nuestro caso podríamos agrupar los productos a listar según su color. PASO 6. sobre el que podremos hacer todas 7 . Mantenga el estilo Estándar y pulse Finalizar. que significa verdadero). PASO 4. En este momento el Asistente generará el informe. En nuestro ejemplo. En nuestro caso. Por ejemplo. El siguiente paso consiste en indicar cuáles de las columnas (campos) que componen la tabla elegida queremos mostrar en las columnas del listado. la verá en la lista de los orígenes de datos disponibles.

Básicamente. verá que el diseño 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. la cantidad de clientes por cada país. En esta sección típicamente se colocan los totales generales. Tradicionalmente se colocan en esta sección los totales acumulados (tipo “suma y sigue”) o también los números de página. Aunque formalmente el diseño del informe debe hacerse desde la vista ‘Informe principal’. 󲐀 Detalles: en la sección 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. 󲐀 Pie del informe: los elementos que se coloquen en esta sección aparecerán en el informe una sola vez.las modificaciones que queramos para adecuar más el informe a los requerimientos de nuestra aplicación o usuarios. la fecha de ejecución. la sección en la que esté situado un elemento determina cuándo y cuántas veces se imprimirá ese elemento al ejecutar el informe. que nos ofrecerá instantáneamente una presentación del resultado de la ejecución del informe para que podamos ver cómo lucirá nuestro informe con los datos reales. sobre la sección de Encabezado del informe) aparecerá el menú de contexto de la sección. etc. en un listado de clientes agrupado por países). Por defecto. verá que el Diseñador nos permite también realizar casi todas las tareas de diseño sobre esta vista previa. por Países y Provincias. Volviendo a la vista de diseño. En esta sección típicamente se colocan el título del informe. por ejemplo. y los grupos siempre están perfectamente anidados (por ejemplo. 󲐀 Pie de grupo: es la sección “opuesta” al Encabezado de grupo. en la parte inferior de la misma. la sección de detalles se deja vacía (o se suprime) porque no se desea que aparezca información sobre cada uno de los registros. en un informe con dos grupos. Tradicionalmente se colocan en esta sección los números de página y las etiquetas de las columnas del informe (cosa que el Asistente de informes ya ha hecho por nosotros). Observe también en la parte inferior de la ventana la otra posible vista del informe que podemos seleccionar. Si se pulsa con el botón derecho del ratón sobre cualquiera de las bandas que identifican a las secciones (por ejemplo. los elementos que se sitúen en esta sección aparecerán en el informe una vez por cada página del informe. Típicamente. esta sección aparece inicialmente suprimida (indicado por las rayas transversales). los grupos correspondientes a las provincias de un país siempre quedarán anidados dentro del grupo correspondiente al país). si el informe es del tradicional estilo “listado”. la Vista previa. en la parte superior de la primera página del informe. 󲐀 Pie de página: opuesta al Encabezado de página. en la parte superior de la misma. Habrá una sección de Pie de grupo para cada Encabezado de grupo. en esta sección se colocan objetos que representan a los campos de la tabla o consulta de origen. Los elementos que se coloquen en esta sección (un ejemplo típico es el nombre del grupo) aparecerán en el informe una vez al principio de cada uno de los diferentes grupos que el motor de ejecución encuentre en los datos. Las secciones disponibles en Crystal Reports son las siguientes: 󲐀 Encabezado del informe: los elementos que se coloquen en esta sección aparecerán en el informe una sola vez. 8 . Más adelante en este mismo tema trataremos con profundidad el tema de los grupos. En un informe típico de tabla cruzada. y se imprime una vez al finalizar cada uno de los grupos que el motor de ejecución encuentre en los datos que componen el informe. En esta sección típicamente se colocan los totales de grupo (por ejemplo. sino solo los resúmenes (que normalmente se ponen en la sección de Pie del Informe). 󲐀 Encabezado de página: los elementos que se sitúen en esta sección aparecerán en el informe una vez por cada página del informe. en la última página del informe. 󲐀 Encabezado de grupo: habrá uno por cada uno de los grupos que tenga el informe (nuestro informe básico no tiene grupos).

gráficos. vamos a poner el título del informe en la sección de Encabezado del informe (para que aparezca una vez. Por ejemplo. 󲐀 Report: para lanzar diferentes asistentes o establecer la configuración del informe. ya existente y visible en el Explorador de campos. o si se pulsa el botón derecho del ratón sobre el lienzo de diseño (teniendo cuidado de no estar situado sobre una sección. por una parte. Utilice como título ‘Listado de productos para venta’. Por ejemplo. pasando a la 9 . nos presenta una vista de árbol desde la que podremos elegir cualquier elemento accesible a nuestro informe para arrastrarlo sobre la sección adecuada en el área de diseño. como hemos visto antes. cuando se ejecute el informe). como acabamos de hacer. Para ello utilizamos la opción del menú Report | Resumen de información. Otros tres elementos muy importantes de la interfaz de usuario que aparecen en modo de diseño para ayudarnos con las tareas más habituales son: 󲐀 Las barras de herramientas de Crystal Reports 󲐀 La barra de herramientas ‘Principal’ ofrece múltiples botones para. ponga su nombre en el campo ‘Autor’. justificación. vamos a establecer el título del informe y el nombre de su autor. digamos que más hacia la esquina izquierda del informe. parámetro. totales. por favor. en la parte superior de la primera página. TÉCNICAS PRINCIPALES DE UTILIZACIÓN DEL ENTORNO DE DISEÑO Para insertar cualquier elemento en un informe. ordenación). 󲐀 Base de datos: para realizar diferentes tareas relacionadas con la base de datos a la que accedemos. Por ejemplo. si despliega el nodo ‘Campos de base de datos’. cantidad de decimales en campos numéricos) 󲐀 La barra de herramientas ‘Insertar’ ofrece botones que despliegan asistentes que nos permitirán insertar objetos más o menos complejos en el informe (grupos. seleccione el campo SellEndDate (fecha en que el producto se dejó de vender) y arrástrelo sobre la sección de Detalles del informe. verá que sólo algunos productos tienen asociada una fecha de vencimiento. imágenes) 󲐀 En el menú principal de Visual Studio. basta con arrastrarlo desde allí hacia la posición deseada dentro de la sección adecuada. que aparece por defecto a la izquierda del lienzo de diseño. lo que nos ayudará a establecer la alineación de los objetos. Las principales opciones de este menú son las siguientes: 󲐀 Insertar: para insertar diferentes objetos sobre el lienzo de diseño. encontrará la tabla Product con todos sus campos. para indicar que queremos que esta sección aparezca al ejecutar el informe. desplegaremos el nodo ‘Campos especiales’. y elegiremos el elemento ‘Título del informe’ y lo arrastraremos hacia la sección de Encabezado de informe. Como segundo ejemplo. por ejemplo agregar nuevas tablas al informe. que dictan cómo éste se comporta de manera predeterminada. 󲐀 Diseño: para actuar sobre las opciones de configuración general del diseñador. En caso de que un campo tenga asociado el valor nulo. ejecute la opción No suprimir sobre la sección de Encabezado de informe. 󲐀 El Explorador de campos. una opción que puede resultar conveniente es la de activar la opción Cuadrícula. grupo. pues entonces aparecería el menú de la sección). simplemente no se mostrará nada en la posición correspondiente. Por el momento. Para ello iremos al Explorador de campos. etc. justo a la derecha del campo Color. tendremos el menú principal del diseñador. De nuevo. que incluye todas las opciones de las barras de herramientas más algunas otras no disponibles en ningún otro sitio. se utilizan dos técnicas fundamentales: 󲐀 Si se trata de un campo de base de datos. facilitarnos las tareas de formato (atributos de texto. que nos lanzará un cuadro de diálogo en el que podremos indicar esos valores. Si cambia a la Vista previa. que hará aparecer una rejilla de puntos sobre el diseñador. lanzar diferentes asistentes que nos ayudarán con las tareas comunes (selección. y por otra parte.que exploraremos con más profundidad un poco más adelante en el curso.

Fuente. 󲐀 Al pulsar el botón Aceptar. sin grupos. Hipervínculo) son comunes a casi todos los objetos. la alineación (izquierda. o el formato de presentación para datos numéricos.) no están disponibles en este caso. los que corresponden a las etiquetas en que se muestran los encabezados de columnas). 󲐀 Cuando un objeto está seleccionado. no necesariamente uno de los que se va a mostrar). por tratarse de un campo alfanumérico. En cualquier caso. 󲐀 Pulsar el botón ‘Resumen’ de la barra de herramientas.). la única opción disponible es la de colocar el valor resultante al final de todo. La mayoría de las pestañas (Común. Promedio. al pie del informe. Bordes. 󲐀 Si lo que queremos es añadir al informe otro tipo de elemento visual (resumen. 󲐀 Debido a que estamos utilizando la versión del Diseñador de Crystal Reports integrada en Visual Studio. 󲐀 El tipo de resumen deseado. En presencia de grupos. aunque también podría ser un Recuento distintivo. este asistente nos permitirá también crear resúmenes parciales por cada nivel de agrupación. haciendo doble clic sobre el objeto se activará el modo de edición para que podamos modificar el texto a mostrar. imagen. mientras 10 . Una vez que el objeto ha sido colocado sobre el lienzo de diseño. y en el menú de contexto de la sección seleccionar ‘No suprimir’. Para ello tendremos que dar los siguientes pasos: 󲐀 Pulsar con el botón derecho del ratón sobre la sección 4 (Pie del informe). tendremos que utilizar el correspondiente asistente desde el menú de Crystal Reports o la barra de herramientas Insertar. En nuestro caso. gráfico. que produciría exactamente el mismo resultado dado que el código de producto es único para cada producto. un candidato ideal es el campo ProductNumber. Verá que las opciones más típicas (Suma. Tenga especial cuidado al cambiar un objeto de una sección a otra – su sentido común le orientará correctamente en la mayoría de los casos. y para ciertos tipos de objetos aparece una pestaña especial con sus características específicas. En este caso nos interesa un Recuento (conteo). Tratándose de un listado sencillo. si seleccionamos el objeto que corresponde al campo SellEndDate. etc. y verá el total reflejado en el sitio adecuado. también se nos permitirá indicar en qué sección y posición concreta queremos colocar el elemento. en la misma sección o una sección diferente. derecha. podemos seleccionar el objeto con el ratón y arrastrarlo hacia cualquier otro sitio. 󲐀 La barra de herramientas ‘Principal’ ofrece diferentes botones que nos permiten establecer los atributos del texto del objeto (fuente y tamaño de letra. etc. Por ejemplo. toca la labor de configurarlo para que responda a los requisitos de diseño del informe: 󲐀 En primer lugar. Cambie a la Vista previa y vaya hasta la última página del informe. negrita. itálicas.). veremos una pestaña ‘Fecha y hora’ donde podemos establecer el formato de visualización de los datos de esa columna. 󲐀 En el caso de los objetos de texto (por ejemplo. 󲐀 La posición en la que se desea ubicar el resumen. vamos insertar un resumen general en la sección de Pie de informe que indique cuántos productos contiene el listado. en sus cuatro costados aparecen las típicas “grapas” que nos permiten redimensionarlo como queramos. que es de tipo DateTime. 󲐀 Por último. pulsando con el botón derecho del ratón sobre el objeto seleccionado obtendremos un menú de contexto que incluye la opción ‘Dar formato a objeto’.Vista previa podrá comprobar que el título que hemos asignado al informe aparecerá en el lugar elegido (puede que haya que guardar el informe previamente). para hacer que visible a esa sección. el Diseñador colocará un objeto de resumen configurado según le hemos indicado en la sección Pie del informe. etc. Esta opción de menú despliega un cuadro de diálogo de múltiples pestañas que nos permitirá configurar todas y cada una de las propiedades del objeto. Dado que las propiedades tienen nombres en inglés. Por ejemplo. que nos pedirá que elijamos: 󲐀 El campo a resumir (puede ser cualquier campo. una alternativa al cuadro de diálogo anterior es utilizar la Ventana de Propiedades del entorno para establecer los valores de las propiedades. centrada).

Hablaremos más sobre las secciones algo más adelante en el curso. Por ejemplo. cantidad total de páginas del informe. Crystal Reports ofrece un lenguaje de fórmulas que nos permitirá implementar. 󲐀 Resúmenes: Los objetos de resumen sirven para hacer totalizaciones generales o parciales (por grupos) de los valores de un campo de la base de datos. 󲐀 Campos de parámetro: Otro de los elementos importantísimos de Crystal Reports desde el punto de vista práctico son los parámetros. inmediatamente antes de cada ejecución del informe. tarta. Número. número de página actual. 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 típicas de un informe. 󲐀 Campos de fórmula: Como estudiaremos en el tema 4. campos calculados que no existan físicamente en la base de datos. Generalmente los gráficos se colocan en la sección de Pie del informe o algún Pie de grupo. el nombre de grupo será el nombre del país. o insertamos un objeto desde el menú o la barra de herramientas. el nombre de grupo es el campo por el que se agrupan los datos. por ejemplo. Hora. etc. fecha de impresión o modificación del informe. 󲐀 Campos de nombre de grupo: En un informe con datos agrupados. 󲐀 Campos de totales acumulados: Los totales acumulados permiten implementar los típicos “suma y sigue”. En dependencia del tipo de datos del campo – Crystal Reports distingue los tipos Alfanumérico (Cadena). el nombre de grupo se coloca en la sección de Encabezado de grupo. 󲐀 Gráficos: Crystal Reports permite incorporar a los informes diversos tipos de gráficos comerciales (de líneas. Fecha/Hora y Lógico (Booleano) -. 󲐀 Grupos: Al insertar un grupo en el informe. más un campo de nombre de grupo asociado al campo por el que hemos indicado que queremos agrupar.que el cuadro de diálogo está traducido al castellano (además de mejor organizado). recomendamos utilizar éste último. Estudiaremos los totales acumulados en el tema 3. resúmenes que se van acumulando y pueden ser reiniciados cuando se desee (al final de cada grupo. o nunca). por ejemplo los volúmenes de ventas de cada tipo de productos por cada país en el que la empresa opera. y Crystal ofrece una amplísima biblioteca de funciones predefinidas para facilitarnos el desarrollo de fórmulas. barras. Generalmente las tablas cruzadas se insertan en la sección de Pie del informe. Los parámetros (que estudiaremos en el tema 5) hacen posible que un mismo informe pueda ser utilizado en múltiples situaciones sin necesidad de hacer “retoques” al diseño del informe. el Diseñador de Crystal Reports crea para nosotros un objeto del tipo correspondiente. en realidad (como veremos a continuación) se crean tres elementos diferentes: la sección de Encabezado de grupo y Pie de grupo correspondiente. 󲐀 Tablas cruzadas: Una tabla cruzada permite mostrar en una tabla resúmenes agrupados por categorías. el cuadro de diálogo de configuración ofrecerá una pestaña específica para configurar los datos de ese tipo. 󲐀 Campos especiales: Bajo el nombre común de “campos especiales” se han agrupado toda una serie de elementos de información que generalmente se desea mostrar en los informes: título y autor del informe (que ya hemos presentado antes). Se puede crear fórmulas de cualquiera de los tipos de datos antes mencionados. Por otra parte. El informe se diseña con uno o más parámetros. PRINCIPALES TIPOS DE OBJETOS Cada vez que arrastramos algo desde el Explorador de campos. Generalmente.) basados en los registros obtenidos de la base de datos. al cambiar el valor de cierto campo. Los principales tipos de objetos que podemos arrastrar sobre el lienzo de diseño desde el Explorador de campos son: 󲐀 Campos de bases de datos: objetos que mostrarán los valores de los campos de los diferentes registros extraídos de la base de datos. Fecha. 11 . Moneda. entre otros. un programador podría estar interesado en dividir una sección en dos o más subsecciones. en un listado de clientes agrupados por países. y los valores de los parámetros se suministran al motor de impresión “desde fuera”.

puesto que nuestro informe inicial no tiene grupos). que nos permitirá regenerar el informe desde cero (por ejemplo. Tenga en cuenta que la generación de las páginas de un informe se produce dinámicamente. 󲐀 El botón de Árbol de grupos. 󲐀 El cuadro de combinación de Zoom. 󲐀 Los botones de navegación. 12 . en un listado de clientes agrupados por países. JPG o PNG con el logotipo de la empresa. 󲐀 El botón de Detener carga. Microsoft Word. a medida que va siendo necesario. 󲐀 Imágenes: Podemos incorporar a nuestros informes imágenes BMP. banda situada a la izquierda del visor (ahora vacía.󲐀 Subinformes: Una técnica bastante potente para componer informes complejos es la de insertar un informe ya creado dentro de otro. que nos permitirá establecer la escala de visualización de las páginas del informe.RTF) o Adobe PDF. que permiten desplazarse hacia delante y hacia atrás por las páginas del informe. para obtener una versión más actual del informe en caso de que los datos de la base de datos hayan cambiado). que sólo está activo mientras se está cargando el informe. texto enriquecido (. En un informe con grupos. también podemos utilizar objetos de líneas y cuadros para realzar los informes. que permite seleccionar una impresora y enviar a ella el informe para así obtener una copia en papel. Por ejemplo. 󲐀 El botón de Actualizar (refrescar) informe. y podríamos saltar a ver los clientes de cada país con un simple clic de ratón. en esta banda se situarán los nombres de los diferentes grupos existentes en el informe. 󲐀 El botón de Imprimir. 󲐀 Objetos de texto: Los objetos de texto permiten mostrar una etiqueta de texto en cualquier sección y posición del informe. horizontal o verticalmente. que permite mostrar u ocultar el árbol de grupos. que permite exportar el resultado del informe a diferentes formatos como Microsoft Excel. 󲐀 Líneas y cuadros: Por último. Crystal Reports ofrece igualmente otro visor basado en HTML y Javascript para su utilización en aplicaciones Web. 󲐀 Un cuadro de texto que nos muestra la página actual y también nos permite teclear un número para saltar a cualquier otra página. Este Visor de informes es casi el mismo que verán los usuarios de nuestras aplicaciones Windows que incluyan informes Crystal Reports cuando ordenen la visualización de un informe. fondos de “marca de agua”. con el objetivo de que podamos cancelar la carga de datos si ya hemos visto lo que queríamos ver o hemos detectado un error en el informe. una versión especializada del mismo). desde programa. Veremos los subinformes en el tema 5. en forma de hiperenlaces a la página del informe en la que comienzan los datos correspondientes a cada uno de los grupos. desplazarse a la última página del informe provocará que se generen todas y cada una de las páginas (que el motor de Crystal almacena en memoria para su posterior reutilización). Visor de aplicaciones Windows de Crystal Reports El Visor de informes ofrece los siguientes controles en su barra de herramientas: 󲐀 El botón de Exportar. EL VISOR DE INFORMES Si ha activado la pestaña de Vista previa para ver el resultado en pantalla de la ejecución del informe. habrá visto el informe presentado en un contenedor visual que se conoce como el Visor de informes para aplicaciones Windows (en realidad. en el Árbol de grupos aparecerá cada uno de los nombres de los países en los que hay clientes. etc.

En nuestro caso. Luego coloque sobre el formulario un componente de la clase CrystalReportsViewer (ficha Crystal Reports). cruzando la tabla de productos con la de subcategorías. dimensiones. que es integrar los informes Crystal dentro de una aplicación Windows. EJEMPLO BÁSICO DE APLICACIÓN WINDOWS Estamos utilizando el Diseñador de Crystal Reports embebido en Visual Studio. 13 . Configuremos sus propiedades principales: 󲐀 La propiedad ReportSource es una propiedad polimórfica que puede apuntar a diferentes entidades capaces de proveer un informe. TÉCNICAS FUNDAMENTALES DE DISEÑO DE INFORMES En este tema se presentan las técnicas fundamentales que necesitará dominar perfectamente el programador que diseñe informes de Crystal Reports.ListadoProductos’. INFORMES CON MÚLTIPLES TABLAS Rara es la ocasión en que todos los datos necesarios para presentar en un informe se pueden obtener de una misma tabla de la base de datos.tendremos la posibilidad de ocultar aquellos botones que no tengan sentido o no queramos mostrar (por ejemplo. Generalmente. Suponga que necesitamos mostrar en nuestro informe anterior los productos organizados. Encaje el visor en el área cliente de la ventana para que la llene completamente. y muestra la potencia de la programación basada en componentes que Visual Studio promueve. estilo. 󲐀 Si examina las propiedades disponibles en la Ventana de propiedades. vamos a asignar False a las propiedades DisplayGroupTree y ShowGroupTreeButton. Seleccione el formulario principal (y único) de la aplicación y configure sus tres o cuatro propiedades principales (título. ¡Y ya está! Ejecute la aplicación. posición inicial). al diseñar un informe necesitaremos combinar la información proveniente de la tabla principal con los contenidos de al menos uno o más catálogos u otras tablas de propósito general. una clave externa (foránea) a otra tabla de la base de datos. y verá cómo hemos logrado mostrar en una ventana de Windows un informe Crystal Reports sin escribir ni una sola línea de código. y no vamos a dejarle con la miel en los labios. inicialmente. Las metodologías modernas de diseño de bases de datos relacionales favorecen la normalización. CrystalReportsViewer es un componente que encapsula el visor de Crystal Reports para aplicaciones Windows. el botón de Árbol de grupos en un listado sencillo que no tenga grupos). despliegue la lista de posibles opciones para la propiedad y seleccione ‘Crear una nueva instancia de ReportDocument | Ejemplo1. tendremos que indicarle a Crystal Reports que obtenga la información correspondiente. La tabla Products incluye un campo ProductSubcategory en la que se almacena el código de subcategoría. dado que el informe no tiene grupos. pues se presentan en la práctica con mucha frecuencia. Para este primer ejemplo. Si queremos mostrar en el informe los nombres de las subcategorías en lugar de sus códigos. El proceso en relativamente muy simple. por subcategorías. cuyo objetivo es permitirnos configurar qué zonas o botones queremos que el visor muestre o no. y esa técnica promueve la separación de la información en diferentes tablas para evitar problemas de redundancia e inconsistencia. la base de datos AdventureWorks agrupa los productos por subcategorías y categorías. Production.ProductSubcategory. Más adelante veremos con más detalles qué significa eso. sino que mostraremos ahora un sencillo ejemplo de cómo alcanzar uno de los objetivos finales de este curso. Por ejemplo. verá toda una serie de propiedades lógicas con nombres ‘Display…’ y ‘Show…’.

así como otros secundarios. En ningún momento hemos dicho que queremos obtener el listado ordenado por subcategorías. Por ejemplo. debemos indicar ambos campos. que es donde debemos indicarle a Crystal cómo establecer la relación entre las dos tablas. por nombre. Crystal nos obligará a establecer claramente cuál es la relación entre las mismas. ORDENACIÓN Y AGRUPACIÓN Si al examinar la vista preliminar del informe tiene la impresión de que los registros ya llegan ordenados por subcategorías. y dentro de cada categoría. el Asistente de base de datos (opción Base de datos | Asistente de base de datos en el menú de Crystal Reports). Pruebe a borrar el vínculo creado implícitamente (botón ‘Borrar vínculos’) y a volverlo a establecer. para ver el nombre de la subcategoría a la que pertenece cada producto. debemos utilizar el Asistente de ordenación de registros.Name. Se dará cuenta que este diálogo de propiedades ya lo ha visto antes: se trata del primer asistente integrado en el Asistente de informes general. a la base de datos AdventureWorks) y añadirla a la vista de la derecha. utilizando el botón correspondiente de la barra de herramientas ‘Insertar’ (o la opción Insertar | Grupo del menú). arrastraremos el campo Name de la tabla Production. aparecerá en el cuadro de diálogo una segunda pestaña.Para lograr esto. cierre el asistente pulsando Aceptar. Para Crystal Reports. un grupo es un conjunto de registros consecutivos que tienen el mismo valor del campo indicado. Cuando se selecciona la opción de Insertar grupo. verá que para cada producto se muestra su subcategoría. nombres de producto u otro criterio. 14 . como podrá observar que ocurre en este caso. Si quitamos los criterios de ordenación de registros que acabamos de establecer. En la pestaña Vínculos del asistente podemos establecer relaciones entre las tablas simplemente arrastrando con el ratón desde el campo de origen hacia el de destino. Hay que tener claro desde el primer momento que ordenar es un prerrequisito necesario para agrupar. Para indicar los criterios de ordenación.Subcategory sobre la sección de Detalles. Siempre que un informe incluya más de una tabla. Vínculos. veremos que en el Explorador de campos estarán disponibles todos los campos de la tabla de subcategorías. como la de indicar que deseamos mantener los registros de cada grupo juntos siempre que sea posible (cambiando de página para ello si fuera necesario) o repetir el encabezado del grupo en cada página al ejecutar el informe. que sólo entrarán en funcionamiento en caso de que el varios registros coincida en todos los campos anteriores. Pues bien. haremos uso de otro de los asistentes de Crystal. en la barra de herramientas ‘Principal’ o en el menú Report | Asistente de ordenación de registros. si examina la sentencia SQL que Crystal Reports enviará a la base de datos para recuperar la información necesaria (en el menú de Crystal Reports. Observe que las categorías aparecerán en orden alfabético. seleccione Base de datos | Mostrar consulta SQL) verá que ésta tampoco incluye ninguna cláusula ORDER BY. debemos seleccionar nuestra tabla Production. y vez de ello insertamos un grupo por subcategorías. si queremos los grupos en orden alfabético) y si queremos un orden ascendente o descendente. Inmediatamente después de que agregue la tabla de subcategorías al informe. y luego lanzamos de nuevo el Asistente de ordenación de registros. no se fíe – ello ha sido puramente coyuntural. en ese orden. si queremos que nuestros productos aparezcan ordenados por categoría. Este asistente nos presenta un cuadro de diálogo en el que podemos establecer el criterio de ordenación principal. veremos que el campo correspondiente habrá sido agregado a la lista de criterios de ordenación. De hecho. dado que se trata de un campo alfanumérico. ProductSubcategory. La pestaña Opciones nos ofrece varias posibilidades adicionales. se presenta un cuadro de diálogo en el que podemos indicar el campo por el que deseamos agrupar (en nuestro caso. y podremos arrastrar los campos de esa tabla sobre cualquier sección del informe. Una vez que hayamos agregado la nueva tabla al informe. al asistente. Por ejemplo.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. Si cambia a la Vista previa. Posteriormente habrá que recolocar los objetos de esa sección para mejorar el aspecto del informe. Aunque el Diseñador es capaz de proponernos vínculos en base a las relaciones entre las tablas. Una vez lo haya hecho.

pondremos a su izquierda un objeto de texto que diga ‘Total categoría’. vamos ahora a mostrar en el informe cuántos productos hay por cada categoría y subcategoría.ProductNumber). Tenga en cuenta que los resúmenes de grupos normalmente se colocan en el pie del grupo. Una vez creado el grupo. que tendrá que generar en memoria todos los datos del grupo antes comenzar a imprimirlo. En la Vista previa podremos ver cómo luce ahora el informe. Una vez agregada la tabla al informe. El Asistente de 15 . el asistente nos propone tres posibles lugares donde colocar el resumen: en el Pie del informe (si quisiéramos un total general. pero este coste es generalmente asumible y poner los resúmenes en la cabecera es muchas veces estéticamente conveniente. dado que tenemos dos grupos.ProductCategory. Observe también que tendremos que cambiar el formato del resultado. sino como un porcentaje relativo a la cantidad de productos en su categoría (opción ‘Mostrar como porcentaje de’). 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). Para ello. TOTALIZACIÓN (RESÚMENES) Mediante el botón de Insertar resumen o la opción correspondiente del menú podremos añadir resúmenes estadísticos generales (basados en la totalidad de los datos obtenidos de la base de datos. pues queremos que este grupo quede a nivel externo. observe que ahora. es necesario utilizar el Asistente de sección. seleccionamos Report | Asistente de grupos). como antes.Observará que se crean dos nuevas secciones. esto provocará una cierta sobrecarga al motor de impresión de Crystal Reports. crearemos un nuevo grupo utilizando como campo por el que agrupar al campo Name de la tabla de categorías. que ya tenemos). necesitaremos agregar al informe otra nueva tabla. pero pueden también moverse a la sección de Cabecera del grupo correspondiente. el Diseñador nos preguntará. accesible desde la opción del menú Diseño | Especificaciones predeterminadas | Campos | Número). repetiremos la operación de insertar resumen. Vamos a complicar ahora un poco más el informe y crear un segundo grupo externo. Esto es lo que haremos con este último resumen por subcategorías. A continuación. mostraremos el resumen no como una cantidad absoluta. de Encabezado y Pie de grupo. El enlace esta vez se realiza a través de la clave foránea ProductCategoryID de la tabla Subcategory. MÁS SOBRE LAS SECCIONES. y cómo en principio podemos eliminar el nombre de subcategoría (que se repite para cada producto del grupo) de la sección de Detalles. qué campo es el que queremos resumir (Product. pero ahora contabilizando la cantidad de productos por cada subcategoría. Para ello. Primero insertaremos un resumen a nivel de categorías (grupo externo). En la sección de Encabezado de grupo. para variar. qué tipo de operación queremos realizar (Recuento) y la ubicación del resumen. Production. pues las subcategorías pertenecen a su vez a categorías. pues Crystal Reports por defecto muestra los campos numéricos con dos cifras decimales (opción que puede cambiarse en la configuración general del Diseñador. el Diseñador coloca además un objeto de nombre de grupo asociado al campo que hemos indicado como campo para agrupar. en el Pie del grupo externo (si quisiéramos contar cuántos productos hay de cada categoría) o en el Pie del grupo interno (si quisiéramos contar cuántos productos hay en cada subcategoría). PROFUNDIZACIÓN Las secciones como un todo también tienen un conjunto de propiedades que podemos configurar para mejorar la apariencia y funcionalidad de nuestros informes. englobando al de subcategorías. en la Vista previa podremos observar el resultado. Si pulsamos el botón de Insertar resumen. para mejorar la estética del informe. numeradas con #1 por tratarse del primer (y único) grupo del informe. Ya anteriormente hemos hecho un recuento general de los productos disponibles. Esta vez lo más conveniente es hacerlo utilizando el Asistente de grupos (en el menú de Crystal Reports. disponible en el menú de Crystal Reports en Report | Asistente de sección.

Veamos un ejemplo típico. se aplicará la operación lógica AND a todas las condiciones). 󲐀 mantener unido todo el contenido de la sección. Desde el Asistente de sección también tenemos la posibilidad de insertar y eliminar (sub)secciones. permite que el usuario. posiblemente) de nuestro informe y nos permite establecer para cada una de ellas todo un conjunto de propiedades como: 󲐀 suprimir la sección completamente. como sabemos. queríamos hacer especial énfasis en la opción ‘Ocultar (se permite profundizar)’. b) Configuraremos la nueva subsección ‘b’ (y solo ella) para que subyazca al resto de las secciones (opción ‘Situar debajo de las secciones posteriores’). A modo de ejemplo. y todo lo que hubiera en la sección original es pasado a la subsección ‘a’.FinishedGoodsFlag sea verdadero. verá que el logotipo subyace perfectamente a todas las páginas del informe. SELECCIÓN DE REGISTROS El Asistente de selección de Crystal Reports permite establecer las condiciones que deben satisfacer los registros que han de ser utilizados para la confección del informe. 󲐀 ajustar la sección a la parte inferior de la página (lo que implica que el contenido de la próxima sección pasará a la página siguiente) 󲐀 reiniciar la numeración de las páginas después de imprimir la sección. hace que una sección no se muestre cuando se presente el informe. 󲐀 Por último. despliegue el contenido de esa sección oculta en una vista independiente. y Crystal Reports hará que solo se utilicen los registros que satisfagan todas las condiciones especificadas (o sea. Para nuestro informe actual. A esa pestaña podremos agregar otras con nuevas condiciones. seguiremos los siguientes pasos: a) Dividiremos la sección de Encabezado de página (que. verá los productos pertenecientes a esa subcategoría en una nueva pestaña del visor. c) Ya en el Diseñador. denominadas ‘a’ y ‘b’. Supongamos que queremos poner el logotipo de nuestra empresa como “marca de agua” en el centro de todas las páginas del informe. pero si el usuario pulsa sobre cualquiera de los nombres de subcategorías. un nombre de grupo o resumen). como hemos mencionado antes. seleccionamos la sección de Encabezado de página y pulsamos el botón ‘Insertar’. Pulsemos el botón ‘Nuevo’ para indicar una nueva 16 . Verá que la sección se divide en dos subsecciones. Tenga en cuenta que cada vez más los informes no se destinan a ser presentados en papel. Para ello. marquemos con la opción ‘Ocultar (se permite profundizar)’ a la sección de detalles de nuestro informe y veamos el efecto que se obtiene: a primera vista. más adelante utilizaremos esta opción para provocar un efecto de “marca de agua” en todas las páginas del informe.sección muestra todas y cada una de las secciones (y subsecciones. el asistente mostrará una única pestaña asociada a la condición de que el campo Product. al igual que ‘Suprimir’. en nuestro informe la sección de Pie de grupo del grupo interno ha quedado vacía y lo mejor es suprimirla. ¡Listo! Si activa la Vista previa. Para ello. haciendo clic con el ratón sobre un elemento de nivel superior (generalmente. 󲐀 hacer que el contenido de la sección subyazca al de las siguientes secciones. ampliaremos por la vertical la subsección ‘b’ del encabezado y pondremos cerca del borde inferior el logotipo de nuestra empresa. 󲐀 provocar un salto de página antes o después de imprimir la sección. es realmente el de que podamos dividir una sección en subsecciones con el objetivo de aplicarles distintos valores de propiedades a cada subsección. El objetivo de la opción ‘Insertar’ de menú. vamos a limitar el conjunto de registros a aquellos productos que continúan a la venta – esos registros tendrán un valor nulo en el campo SellEndDate. Esto es a lo que se le llama “profundización” (drill down). pero a diferencia de la anterior. Esta opción. sino a ser consumidos de forma interactiva. Por ejemplo. aunque haya que cambiar de página para ello. que nos parece especialmente importante. se imprime en la parte superior de cada página del informe) en dos subsecciones. Por ejemplo. 󲐀 suprimir la sección en caso de que no contenga nada. el informe sólo contiene los resúmenes.

SellEndDate (de nuevo. veremos la fórmula Crystal correspondiente a la condición especificada. lo que se desea no es eso. y en los siguientes desplegables introducimos ‘es mayor que’ y el valor 50. de manera inteligente.condición de selección. elegimos el recuento de productos por nombre de categorías. complementado además con una enorme biblioteca de funciones para todas las necesidades comunes. u opción Report | Asistente de ordenación de grupos en el menú). con el consiguiente incremento del tráfico de red y pérdida de rendimiento. Existe una opción de configuración. si la formula de selección de registros corresponde a la cláusula WHERE de una sentencia SELECT. En este lenguaje es que se escriben en última instancia las condiciones de selección de un informe. en el diálogo de selección de campo que aparece. sino presentar los grupos en orden ascendente o descendente del valor de un resumen incorporado al informe. que incluye o excluye del informe registros individuales en base a una condición. Y la fórmula que deberemos teclear es IsNull ({Product. el motor de Crystal Reports ejecuta la agrupación y la selección de grupos en la máquina cliente. Supongamos por ejemplo que deseamos presentar las categorías no en orden alfabético. Para indicar que nos interesan los registros con valores no nulos en el campo tendremos que utilizar la última opción de la lista desplegable que aparece en la pestaña: ‘fórmula’. Pero cuando es necesario traer también los registros individuales para utilizarlos en el informe. está claro que se trata de una condición de selección de grupo. las categorías y subcategorías se presentarán en orden alfabético. supongamos que nos interesan únicamente las categorías con más de 50 productos. sino en orden descendente de la cantidad de productos diferentes pertenecientes a cada categoría. 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.SellEndDate}). En el Asistente de selección. En este último caso. ‘Realizar agrupamiento en el servidor’ (Report | Opciones del informe del menú). Crystal Reports ofrece un Asistente de ordenación de grupos (botón en la barra de herramientas ‘Principal’. Elijamos el campo Product. En términos de SQL. El Asistente de selección determina que una fórmula de selección es de grupo si el campo de Crystal Reports que utilizamos en la condición es un campo normal de la base de datos o un resumen. mediante la cual se indica al motor que utilice cláusulas GROUP BY y HAVING cuando sea posible. Nota avanzada: El Diseñador de Crystal Reports determina. Mediante la opción 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. dado que hemos agrupado por los nombres. Se trata de un lenguaje de programación completo. Si pulsamos el botón ‘Mostrar fórmula’ del asistente. la selección de grupos permite establecer qué grupos enteros deben o no ser incluidos en el informe. Por ejemplo. el motor no hace uso de esa posibilidad. no será posible traducirlas a SQL y el filtrado de registros deberá hacerse en la máquina cliente. Por otra parte. pulsamos ‘Nuevo’ para agregar una nueva condición. Si incluye fórmulas Crystal complejas en sus fórmulas de selección. veremos una fórmula con todas las de la ley escrita en el lenguaje de fórmulas de Crystal Reports (que estudiaremos en el tema 4). entonces la fórmula de selección de grupo corresponde a la cláusula HAVING. Para eso. Al pulsar el botón ‘Mostrar fórmula’. cuándo es posible traducir una fórmula de selección escrita en el lenguaje de Crystal en una cláusula WHERE de SQL para pasarla al motor de bases de datos. Frecuentemente. SELECCIÓN Y ORDENACIÓN DE GRUPOS A diferencia de la selección de registros. En nuestro ejemplo. una ojeada a la Vista previa nos convencerá de que la selección funciona. y veremos que nos presenta dos pestañas. Lanzamos el Asistente de ordenación de grupos. Nota avanzada: Por lo general (al menos en informes de tipo “listado”). En cuanto a la ordenación de grupos. dado que el informe 17 . que son campos de cadena de caracteres. observe que podríamos seleccionar cualquier campo de cualquiera de las tablas implicadas en el informe).

circular o tarta. aquí simplemente mostraremos un ejemplo típico que le dará una idea de cómo pueden incorporarse a un informe tales gráficos. nuestro caso). tendremos la posibilidad de indicar todas esas características. y sus propiedades. Si en lugar de elegir la opción ‘Todo’ en el desplegable ‘Ordenar’ seleccionamos ‘N superiores’ (‘N inferiores’). situado en la sección de pie (o la cabecera) del grupo correspondiente a las categorías. En la segunda pestaña del asistente es donde se especifica lo fundamental: los datos a partir de los cuales se dibujará el gráfico y la situación del mismo. el asistente generará automáticamente los títulos para el gráfico y los ejes. etc. Si la casilla está marcada.). que despliegan el Asistente de gráficos. Adicionalmente. y más adelante editar las opciones del gráfico y pasar al modo manual para indicar esas opciones en detalle. en la primera pestaña se indica el tipo de gráfico que deseamos incorporar al informe (de barras. mantenga los valores 18 . Hay que decir que este Asistente. etc. Además de esta opción. En el desplegable ‘Ordenar’ seleccionamos Todo. se nos permite indicar si deseamos que los grupos aparezcan en orden ascendente o descendente (este último. Este asistente tiene dos modos de trabajo que se configuran mediante la casilla ‘Establecer opciones automáticamente’ de su primera pestaña. que es el preseleccionado por defecto. además de la ordenación. En caso contrario. en cuyo caso tendremos un gráfico para cada categoría. Crystal Reports ofrece unas posibilidades muy amplias para la incorporación de gráficos comerciales en nuestros informes. Para incorporar un gráfico a un informe. en cuyo caso el gráfico aparecerá una sola vez en el pie o la cabecera del informe (recuerde que generalmente los objetos situados en una sección de ‘pie’ pueden moverse a su ‘cabecera’ hermana). Tanto N como P pueden ser especificados según nuestra conveniencia. líneas. nombres de ejes. Para poder incorporar un gráfico a un informe. etc. en orden descendente (ascendente) de los valores. cuyo nombre por defecto es ‘Otros’. y el resumen a utilizar es el único disponible a ese nivel. escalas. podemos basar el gráfico en dos series de datos: la cantidad de productos por cada categoría. En nuestro caso. la segunda: indiquemos ‘Por cada ProductCategory. Por último. habrá solo un resumen. áreas. Vamos a elegir aquí la opción más difícil. Para nuestro ejemplo elegiremos un gráfico de barras. Una buena técnica puede ser mantener inicialmente la configuración automática. GRÁFICOS. y entonces a su derecha aparecerá la lista de los resúmenes definidos a ese nivel. la tercera pestaña del asistente permite establecer los textos que aparecerán en el gráfico como título. las opciones ‘Porcentaje máximo’ y ‘Porcentaje mínimo’ nos permiten limitar el informe a aquellos grupos cuyo porcentaje sobre el total general supera o no supera un cierto valor P. El grupo que nos interesa es el externo. se debe utilizar la opción Insertar | Gráfico del menú o el botón correspondiente de la barra de herramientas ‘Insertar’. o la cantidad de productos por cada subcategoría dentro de cada categoría. el que cuenta la cantidad de productos de cada categoría. Verá que en el grupo ‘Datos’ aparecen automáticamente la información adecuada: los valores a utilizar para el gráfico se obtienen cuando cambia la subcategoría (el grupo más interno).Name’ en el desplegable ‘Ubicar’. En nuestro caso. Observe además que existe la posibilidad de agrupar los elementos que los grupos que no superen la “criba” en un grupo común. De momento. Por otra parte. debido a que tenemos dos niveles de agrupación. colores. subtítulo. es necesario haber definido previamente los resúmenes que servirán como valores a partir de los cuales se dibujará el gráfico. para que indiquemos el criterio según el que queremos ordenar los grupos. que seleccionaremos. Después de pulsar Aceptar podremos ver el resultado en la vista preliminar. también nos permite realizar una selección de grupos según criterios que se utilizan con relativa frecuencia en la práctica y cuya especificación mediante el Asistente de selección que hemos visto anteriormente requeriría la programación de fórmulas de cierta complejidad. estaríamos indicando que deseamos incluir en el informe solo los N primeros (últimos) grupos según el resumen indicado.incluye dos grupos.

el objetivo es capturar los resultados numéricos que el informe contiene para realizar ciertas transformaciones posteriores sobre ellos utilizando otras aplicaciones. le aparecerá un diálogo en el que podrá elegir el formato de exportación y el destino (en la versión integrada en Visual Studio. OrderDate y TotalDue. únicamente un fichero en disco). en otros casos (Microsoft Excel. Verá cómo aparece en el informe un gráfico de subcategorías para cada una de las categorías. En los temas del curso dedicados a la programación veremos cómo exportar informes desde nuestras aplicaciones. Y esto dará paso a un tercer cuadro de diálogo en el que podremos elegir la ruta y el nombre del fichero a crear. TOTALES ACUMULADOS Un tipo de resumen muy común y que tiene sus particularidades que lo distinguen de los demás resúmenes son los totales acumulados. indicamos que nos interesan los pedidos en los que OrderDate es posterior al 1/7/2004. Los totales acumulados nos permiten implementar en nuestros informes los conocidos “suma y sigue” frecuentes.SalesOrderDetail se almacenan los detalles (líneas) de cada pedido. Adobe Acrobat. en la sección ‘Restablecer’ indicamos cuándo queremos que el acumulador se reinicie a cero. PDF Crystal Reports nos permite exportar los resultados de la ejecución de un informe a diferentes formatos. No necesitamos agrupaciones. por ejemplo.SalesOrderHeader. fecha. añadiremos a nuestro proyecto de Visual Studio un nuevo informe (botón derecho sobre el nodo del proyecto en el Explorador de soluciones | Agregar | Nuevo elemento | Crystal Reports). por lo que saltamos directamente sobre esa página del Asistente. evaluar para cada registro. Pulsamos ‘Finalizar’ y podremos ver la presentación preliminar del informe. Ante todo. o cuando se cumpla una condición cualquiera (expresada mediante una fórmula). HTML. En la página de selección de registros. Ahora crearemos el total acumulado.SalesOrderHeader de la base de datos. Un segundo diálogo específico para el formato de exportación elegido aparecerá a continuación para permitirnos configurar el resultado. ¡ya está! Basta con pulsar el botón 19 . en listados de operaciones bancarias. En la sección ‘Evaluar’ se indica en qué momento queremos que el acumulador se evalúe.rpt. en el nodo ‘Campos de totales acumulados’ del Explorador de campos pulsamos el botón derecho del ratón y seleccionamos ‘Nuevo’. Suponga que deseamos listar los pedidos (código.predeterminados y pulse Aceptar para cerrar el asistente. HTML) se utilizan mayormente con vistas a poner el informe como tal a disposición de terceros. Ciertos formatos (Microsoft Word. Aunque también lo dejaremos ahora en ‘Nunca’. de grupo o cuando se cumpla una fórmula. Inmediatamente después de indicar el nombre. EXCEL. En este caso dejaremos la opción por defecto. Llamemos al informe ListadoPedidos. Los campos que nos interesan son SalesOrderID. el Asistente de informes aparecerá automáticamente para que especifiquemos las características del informe. pero en este momento no necesitaremos esa segunda tabla. y seleccionamos la base de datos AdventureWorks. Aparecerá un cuadro de diálogo en el que se pueden indicar las características que queremos que tenga el total acumulado. en la tabla Sales. se debe indicar el campo que se quiere acumular (en nuestro caso TotalDue) y la operación de resumen (aquí suma). EXPORTACIÓN A OTROS FORMATOS. observe que se puede reiniciar el acumulador cada vez que se cambia de campo. Los datos generales sobre los pedidos se almacenan en la tabla Sales. Si pulsa el botón de Exportar informe de la barra de herramientas del visor. Microsoft ODBC). Ante todo. Se trata de un informe estándar. 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. Y en principio. Para ello. WORD. Además. cuando se cambie de grupo. pero observe que también es posible evaluar el total acumulado solo cuando cambie el valor de un campo. Estudiaremos el lenguaje de fórmulas de Crystal Reports en el siguiente tema. Por su parte. y de ella la tabla Sales.

Verá la suma parcial de los importes evaluada para cada registro. No obstante. que pueden representar: 󲐀 Nombres de campos. con la sintaxis {#NombreTotal}. etc. de modo que el programador no tenga que “reinventar la rueda” cada vez que quiera ejecutar una tarea más o menos trivial. que será mucho más familiar a los programadores que utilicen VB. Por ejemplo. Por ejemplo. como son: 󲐀 Constantes: 12 (entero). SINTAXIS DEL LENGUAJE DE FÓRMULAS CRYSTAL Y VISUAL BASIC Una fórmula se compone a partir de diferentes elementos básicos. 󲐀 Operadores: +. > (de comparación). 󲐀 Funciones predefinidas: Crystal ofrece un amplio espectro de funciones de uso general incorporadas de antemano al producto.NombreCampo}. estructuras de bucle. utilizaríamos {Clientes. <. rara vez es necesario hacer uso de tales facilidades y las fórmulas se utilizan en el sentido literal del término – el de una expresión que produce un valor de un determinado tipo. que le dan la potencia necesaria para acometer numerosas tareas que de otras maneras serían imposibles y limitarían seriamente las posibilidades del producto. 󲐀 Identificadores. And.‘Finalizar’ y arrastrar el campo recién creado a la sección de Detalles del informe (preferiblemente a la derecha del importe del pedido). FÓRMULAS En este tema se presentan las fórmulas de Crystal Reports y sus principales aplicaciones. Por ejemplo. los lenguajes de fórmulas de Crystal Reports son lenguajes de programación completos.(aritméticos). seleccione el campo de total acumulado. . 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 página. 0. A ellos les dedicaremos el Tema 5. Not. #12/5/2006# (de fecha/hora).Sexo}. la escribiríamos así {@A}. Para ello. En este curso utilizaremos la sintaxis Visual Basic. si al definir la fórmula B necesitamos utilizar otra fórmula A. 󲐀 Totales acumulados. 󲐀 Parámetros del informe. cópielo al Portapapeles (CTRL-C) y luego páguelo (CTRL-V) en la sección de Pie de página. True (lógica). INTRODUCCIÓN Las fórmulas son una característica muy importante de Crystal Reports. con la sintaxis {@NombreFormula}. ¡Listo! Este es uno de los pocos casos en los que tiene sentido mover objetos de una sección a otra que no sea su “hermana”. gracias a los potentes asistentes incorporados al producto. Los parámetros juegan un papel esencial en el desarrollo de informes genéricos que puedan utilizarse en múltiples situaciones diferentes sin necesidad de modificaciones. para representar al campo Sexo de una tabla llamada Clientes. En general. con la sintaxis {?NombreParametro}. y otros.NET. condicionales. 󲐀 Otras fórmulas. que incluyen declaraciones de variables. y cuyo objetivo es calcular un valor que debe ser utilizado en alguna de las fases de confección de un informe. por favor vaya a la opción Crystal Reports | Diseño | Especificaciones predeterminadas | Elaborando informes del menú y selecciones ‘Sintaxis Basic’ en el desplegable Lenguaje de fórmulas. Básicamente. “Total” (cadena de caracteres).07 (número decimal). con la sintaxis {NombreTabla. Or (lógicos). Para garantizar que las fórmulas utilicen ese lenguaje. si el campo Nombre de la tabla Clientes 20 . una fórmula es una expresión más o menos compleja escrita en uno de los dos lenguajes de programación que soporta Crystal Reports: Crystal y Visual Basic. Rápidamente se convencerá de que las fórmulas juegan un papel muy importe tanto en informes básicos como en aplicaciones más avanzadas.

Ante todo.contiene el nombre del cliente. podemos cerrarlo para hacer más espacio para nuestra fórmula actual. es necesario dar un nombre a la fórmula: llamémosle ‘DíasHastaSalida’.SalesOrderHeader no tenemos directamente ese dato. en el que podremos encontrar a todos los operadores del lenguaje. seleccione el informe ListadoPedidos. En el panel de la izquierda está un árbol con todas las fórmulas del informe. En el Explorador de campos. aparecerá ante nosotros el Editor de fórmulas. y en un informe deseamos mostrar ese nombre en mayúsculas. pulse el botón derecho del ratón sobre el nodo ‘Campos de fórmula’ y seleccione ‘Nueva’. pero sí tenemos los campos OrderDate (la fecha en que se hizo el pedido) y ShipDate (la fecha en que se hizo el envío). la fórmula se compone en la zona inferior del editor (donde ya aparece automáticamente ‘formula =’). en realidad el programador no tiene que teclear casi nada para componer estas fórmulas: a continuación veremos cómo un potente editor nos ayuda con esta tarea. En ciertas ocasiones una fórmula puede producir un resultado de cualquier tipo que queramos. Podemos calcular el intervalo deseado restando ambas fechas. APLICACIONES DE LAS FÓRMULAS En esta sección estudiaremos los fundamentos de las fórmulas de Crystal Reports y presentaremos sus principales aplicaciones. buscamos en el panel de Identificadores el campo ShipDate de SalesOrderHeader (como el campo no está incluido directamente en el informe. Ahora. aunque sea sintácticamente correcta. podemos escribir la siguiente fórmula: UCase({Clientes. La zona superior se divide en tres paneles: el panel de Identificadores.Nombre}). que nos parece más intuitivo. En este curso utilizaremos el Editor. sin carecer de ninguna de las posibilidades. Hay que tener en cuenta siempre el tipo de datos del resultado que una fórmula produce. el panel de Funciones. Para introducir nuestra fórmula. pero en otros casos Crystal Reports espera que le suministremos una fórmula que produce un resultado de un tipo determinado y protestará si le suministramos una fórmula que produce otra cosa. en el que tenemos a nuestra disposición la lista de todas las funciones predefinidas de Crystal (algo sumamente útil) y el panel de Operadores.rpt. que son: 󲐀 Campos calculados 󲐀 Formato condicional 󲐀 Selección de registros y grupos 󲐀 Grupos a medida 󲐀 Totales acumulados condicionales CAMPOS CALCULADOS La aplicación más típica de las fórmulas son los campos calculados. 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 fórmula con la sintaxis correcta: {SalesOrderHeader. El operador ‘-’ podríamos elegirlo de un 21 . Como ejemplo. En nuestro proyecto. Aunque pueda parecer necesaria una gran cantidad de tecleo. desde el que podemos elegir los campos del informe o la base de datos. y para ello hace falta una fórmula. fórmulas.. Verá que para seguir adelante hay dos opciones: ‘Usar Asistente’ o ‘Usar Editor’.ShipDate}. Un campo calculado es un campo (de cualquier tipo de datos soportado por Crystal) que físicamente 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. totales acumulados. Al pulsar el botón ‘Usar Editor’. En la tabla Sales. supongamos que queremos determinar el tiempo que ha tardado cada pedido del año 2004 en salir del almacén de la empresa de camino a su destinatario. Se trata de dos herramientas diferentes con un mismo propósito: ayudarnos a escribir las fórmulas con un mínimo de tecleo y comprobación de que la fórmula es correcta. etc.

podemos arrastrarla al informe – en este caso. Por ejemplo. Continuando con el mismo ejemplo.ShipDate} . también podríamos definir resúmenes basados en esa fórmula. Una vez editada y validada la fórmula. Aparece el editor de fórmulas. FORMATO CONDICIONAL La aplicación de las fórmulas al formato condicional consiste en que. 22 . sino a secciones enteras. La fórmula debe producir un resultado booleano. pero en este caso la ventaja no está tan clara. pero no incondicionalmente. Introduzca la siguiente fórmula: if RecordNumber mod 2 = 1 then formula = crSilver else formula = crWhite RecordNumber es otra función predeterminada de Crystal. la fórmula es: if {@DíasHastaSalida} >= 5 then formula = crRed else formula = crBlack Las constantes crRed y crBlack . lance el Asistente de sección y seleccione la sección de Detalles. GRUPOS PERSONALIZADOS La siguiente aplicación de las fórmulas es la que tiene que ver con la selección de registros y grupos. De un modo similar. podemos programar cualquiera de las características visuales de los campos del informe. haciendo que la sección de Detalles tenga alternativamente fondo gris o blanco para cada fila del informe. como es el caso. pulsamos el botón de fórmula situado a la derecha del desplegable correspondiente al color de la fuente. La fórmula final es: formula = {SalesOrderHeader. Para ello. Lo que deseamos es cambiar el color del texto. sino sujeto a una condición. debemos utilizar la propiedad Suprimir (pestaña ‘Común’) del Editor de formato. Y ya definida la formula. mediante una fórmula. Para ello. y probablemente sea mejor teclear el carácter. En este caso. suprimirlo) en caso de que se cumpla una condición. suponga que deseamos que cierto campo no aparezca en el informe (o sea. y cuando su valor sea True el campo se suprimirá del informe. y en él debemos introducir la fórmula que determinará el color del texto. a la sección de Detalles. En estos casos. Por último. Por supuesto. vamos a dar al listado de pedidos formato de “pijama”. o incluso que aparezca o no en él. seleccionamos del panel de Identificadores el segundo operando. la fórmula que debemos utilizar tiene que producir un resultado del tipo adecuado. activamos la pestaña ‘Fuente’.modo similar. podemos guardarla y cerrar el editor mediante ‘Guardar y cerrar’.{SalesOrderHeader. seleccionándolo en el nodo de operadores aritméticos. Por eso. el formato condicional se puede aplicar no solo a campos individuales. que se convierte en un campo más del informe. Como otro ejemplo. Por último. OrderDate. aparecen en el panel de Funciones cuando se esté editando una fórmula que deba producir un color. es posible programar las características visuales de cualquier campo o sección del informe. En el diálogo que aparece. vamos a resaltar en color rojo los valores correspondientes. Seleccionamos la fórmula.OrderDate} En cualquier momento podemos comprobar la validez de una fórmula pulsando el botón ‘Revisar’. que produce un número secuencial para cada registro del conjunto de datos (puede encontrarse bajo el nodo “Estado de impresión”). En tal caso. pulsamos el botón derecho del ratón y elegimos la opción ‘Dar formato al campo’. Active luego la pestaña ‘Color’ y pulse sobre el botón de fórmula asociado al desplegable de color de fondo. suponga que queremos resaltar aquellos pedidos que tardaron más de 7 días en salir del almacén.

Previamente ordenamos el listado por el campo OrderDate. utilizando el Asistente de ordenación.OnlineOrderFlag es True). seleccionamos SalesOrderHeader. Esta es una posibilidad que conviene tener en cuenta para cuando sea necesaria. suponga que queremos hacer que el total acumulado del listado de pedidos se reinicie cada vez que se produzca un cambio de fecha. Para un ejemplo sencillo. y la vista previa nos convencerá de que la agrupación se realiza correctamente. y asociemos a cada grupo las condiciones correspondientes. es necesario pasar a la acción y escribir la fórmula nosotros mismos. y los de más de 100 Euros. Pulsamos el botón ‘Nuevo…’ para añadir una nueva condición de selección. Aparecerá una nueva pestaña. Pero cuando lo que queremos expresar va más allá de las posibilidades cubiertas por el asistente. El Asistente de selección nos permite especificar las condiciones que deberán cumplir los registros o grupos en los casos de condiciones sencillas. Como campo para agrupar. 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 categorías: los de menos de 25 Euros. En este veremos que ya hay un criterio establecido. MEDIANOS y GRANDES. los que están entre 25 y 100. Al pulsar ‘Aceptar’ podremos comprobar que el grupo ha sido creado. los grupos de Crystal Reports están compuestos por registros que tienen un mismo valor en el campo seleccionado. llamemos a los grupos PEQUEÑOS. Crystal permite hacer una selección tanto de los registros individuales como de los grupos que se utilizarán al ejecutar el informe.Como ya hemos presentado anteriormente. en la que podremos crear nuestros grupos personalizados. pero podremos establecer la fecha como criterio de ordenación secundario dentro de cada grupo. Debemos utilizar el botón ‘Insertar grupo’ de la barra de herramientas ‘Insertar’ (o seleccionar la opción correspondiente del menú). es conveniente limitarse a fórmulas de selección sencillas siempre que sea posible. hay que ordenar”). TOTALES ACUMULADOS CON CONDICIONES En el tema anterior estudiamos los totales acumulados. En nuestro caso. pues Crystal Reports determina automáticamente cuándo es posible traducir una fórmula de selección en una cláusula WHERE de SQL para pasarla al motor de bases de datos. SELECCIÓN DE REGISTROS Y GRUPOS Otra aplicación sumamente útil de las fórmulas son los grupos personalizados o a medida. Por ejemplo. Ahora seleccionemos nuestro total acumulado. pulsemos el botón derecho del ratón sobre él y seleccionemos ‘Editar total acumulado’. Simplemente lanzamos el Asistente de selección (Crystal Reports | Report | Asistente de selección o el botón correspondiente en la barra de herramientas ‘Principal’).TotalDue y como criterio de agrupación ‘en orden específico’.OrderDate} >= #1/7/2004# and {SalesOrderHeader. frecuentemente se quieren agrupar los registros de forma que la pertenencia a un mismo grupo venga dictada por otra condición que no es la estricta igualdad de los campos. De manera predeterminada. Sin embargo. lo que redunda en una mayor eficiencia. y la condición (fórmula) de pertenencia de los registros a los grupos.OnlineOrderFlag} Nota avanzada: Como hemos comentado anteriormente. Y en el desplegable que aparece seleccionamos ‘es Verdadero’. pero no profundizamos en la posibilidad de asociarles fórmulas para indicar cuándo se desea evaluarlas y cuándo reiniciarlas a cero. y se encarga de generar automáticamente las fórmulas correspondientes. En la zona ‘Restablecer’ (inferior derecha) marquemos la opción 23 . Si ahora pulsamos el botón ‘Mostrar fórmula’ podremos ver la fórmula correspondiente: {SalesOrderHeader. suponga que deseamos que el listado de pedidos (además de los pedidos a partir de julio del año 2004) incluya solamente los pedidos recibidos a través de Internet (aquellos para los que el campo SalesOrderHeader. indicando para cada uno un nombre. el del grupo (recuerde la máxima “para agrupar.

El tipo de datos del parámetro. Sin embargo. en este caso ‘Fecha de inicio’.OrderDate}) <> {SalesOrderHeader. Llamemos al parámetro FechaInicio. Aquí se debe introducir el texto que aparecerá en el diálogo de pregunta. PARÁMETROS En este tema presentaremos los parámetros. Antes de ejecutar un informe con parámetros. Esa es una de las dos facetas de la utilización de un parámetro. 󲐀 Tipo de datos. supongamos que nos interesara poder ejecutar el informe para distintos valores de la fecha de inicio – ahora mismo. lanzamos el Asistente de selección y sustituimos la fecha actualmente en uso por la sintaxis de uso del parámetro {?FechaInicio}. cosa que mostraremos a continuación. Crystal Reports preguntará los valores a asignar a los parámetros. cada nueva ejecución del informe necesitará pequeños ajustes derivado del cambio de los datos de entrada del informe. debemos introducir los siguientes datos: 󲐀 Nombre del parámetro. la fecha de inicio forma parte de la fórmula de selección de registros. 24 . el informe tiene “clavado” el valor #1/7/2004#. 󲐀 Valores predeterminados. que juegan un papel muy importante de cara a la programabilidad de los informes. La segunda es su utilización. se utilizará la sintaxis {?FechaInicio}.‘Use una fórmula’ y pulse el botón de fórmula correspondiente. Continuando con nuestro listado de productos de ejemplo. Introduzca la fórmula: formula = PreviousValue({SalesOrderHeader. y para ello podemos hacer con el parámetro todo lo que podemos hacer con cualquier otro campo: arrastrarlo sobre el informe o utilizarlo en cualquier fórmula. Solo resta entonces mostrar la vista previa para cerciorarnos de que la definición del parámetro ha sido aceptada: Crystal nos solicitará que indiquemos un valor para la fecha de inicio antes de mostrar el informe. frecuentemente en combinación con otras funciones como OnFirstRecord (que devuelve True si estamos situados en el primer registro). INTRODUCCIÓN La inmensa mayoría de los informes se diseñan para luego utilizarlos frecuentemente de manera periódica. Para referirse luego al parámetro desde fórmulas. Para hacer uso del parámetro. En nuestro ejemplo. Pues bien. DEFINICIÓN Y USO DE PARÁMETROS Para definir un parámetro. Los parámetros nos permiten precisamente definir informes adaptables. En el diálogo que aparece. Es muy útil para detectar situaciones de cambios de grupo y otras situaciones similares. que se mostrarán en el cuadro de diálogo de solicitud de parámetros para que el usuario no tenga que teclearlos.OrderDate} La función predefinida PreviousValue nos da el valor del campo indicado en el registro anterior. Si los parámetros no existieran. 󲐀 Texto de la solicitud. 󲐀 Opciones. cada nueva ejecución requeriría una modificación previa del informe en el Diseñador – un verdadero problema para la productividad. se debe pulsar con el botón derecho del ratón sobre el nodo ‘Campos de parámetro’ del Explorador de campos y seleccionar la opción ‘Nuevo’. lo ideal hubiera sido haber definido un parámetro para esa fecha de inicio. Opciones avanzadas relacionadas con la utilización de múltiples valores. Aquí podemos especificar para el parámetro uno o más valores por defecto. en los que los datos de entrada cambiantes se solicitan inmediatamente antes de la ejecución. etc. en este caso Fecha.

el subinforme con los detalles de dicho pedido se desplegará en una nueva pestaña del visor de informes. En ellos. para “concatenar” un informe a continuación de otro. lo que reduciría la carga sobre el motor de base de datos. es SalesOrderID.Hay que señalar que (como veremos en el próximo tema) las librerías . La presentación de la vista previa nos mostrará cómo funcionan los informes con subinformes bajo demanda: al pulsar sobre el “hipervínculo” asociado a un pedido. Y solo nos queda pulsar el botón ‘Aceptar’. como ProductID (código de producto – en la vida real necesitaríamos conectar con la tabla de productos para obtener el nombre). de modo que el cuadro de diálogo no aparezca en pantalla. o simplemente poner un hipervínculo para que el subinforme se ejecute bajo demanda (‘a petición’ es el término que utiliza Crystal). Pulse ‘Finalizar’ para terminar el diseño del informe. A continuación. supongamos que queremos mostrar los detalles de cada uno de los pedidos de nuestro listado de pedidos. insertándolo en una subsección del pie de informe. es SalesOrderHeader. debemos indicar el campo del subinforme que recibirá (a través de un parámetro cuyo nombre propone el asistente) el código del pedido cuyos detalles debe mostrar.SalesOrderID. OrderQuantity (cantidad).SalesOrderDetail. UTILIZACIÓN DE INFORMES EN APLICACIONES WINDOWS En este primer tema relacionado con la programación de aplicaciones que utilicen informes se presentan los recursos fundamentales que hacen posible incorporar informes Crystal Reports en aplicaciones de escritorio. y la única opción interesante es la de integrar el subinforme completo cuando se ejecuta el informe externo. Esta técnica tiene la ventaja de que podríamos indicar que el subinforme se ejecute bajo demanda. debemos primero indicar el campo del informe contenedor cuyo valor se debe pasar al subinforme. Esta posibilidad puede utilizarse. SUBINFORMES Otra posibilidad muy interesante que ofrece Crystal Reports es la de anidar un informe dentro de otro. En la pestaña ‘Vínculo’. inserte un subinforme en la sección de detalles del listado de pedidos. sumamente directa. Al diseñar el nuevo informe. Un posible enfoque podrá ser el de integrar dentro de la sección de Detalles del informe actual un subinforme que presente los detalles del pedido actual. un informe se integra como subinforme dentro de otro (normalmente en la sección de Detalles de éste). Para incorporar un informe como subinforme dentro de otro. En nuestro ejemplo.rpt y pulse el botón ‘Asistente de informes’. Indique que desea crear un nuevo subinforme con el Asistente. se utiliza el botón ‘Insertar subinforme’ de la barra de herramientas ‘Insertar’ (o la opción correspondiente del menú). Para empezar. es hora de pasar a la pestaña ‘Vínculo’ para establecer la conexión entre el informe y el subinforme. por ejemplo. en general. SUBINFORMES PARAMETRIZADOS La aplicación más importante de los subinformes son los subinformes parametrizados. el código del pedido. Elegiremos varios campos. 25 . y el informe externo (contenedor) comunica al interno a través de un parámetro un valor que le indica a éste último qué datos debe mostrar. Será llevado nuevamente al diálogo de inserción de subinforme. una característica que comúnmente se conoce como subinformes. Como ejemplo.NET de Crystal ofrecen la posibilidad de asignar desde programa valores a los parámetros. UnitPrice (precio unitario). Tal aplicación es. De la creación del parámetro y el establecimiento de la fórmula de selección adecuada en el informe recién creado se encarga el automáticamente el asistente. UnitPriceDiscount (descuento sobre precio unitario) y LineTotal (importe total de línea). Marque la casilla ‘Subinforme a petición’. indicaremos que la tabla deseada es Sales. llame al nuevo subinforme DetallesPedido.

Eso sí. EL MODELO DE OBJETOS DE CRYSTAL REPORTS. lo haremos más adelante.TÉCNICAS FUNDAMENTALES Las diferentes subsecciones de esta sección presentan los fundamentos teóricos y las técnicas comunes que se utilizan en la incorporación de informes Crystal a aplicaciones Windows Forms. y si abrimos ese archivo. y por lo tanto es un objeto que representa a un informe como ése.NET de Crystal Reports.CrystalReports. Por ahora trabajaremos con un listado totalmente “plano”. veremos que en éste contiene dos componentes: 󲐀 Un componente no visual (por lo tanto.Engine. la construcción de estos objetos al crearse el formulario es suficiente para que veamos el informe al ejecutar la aplicación. se trata de una clase que representa al informe concreto (en el argot de Crystal. En Visual Studio 2005.SalesOrderHeader. No incluiremos fórmula de selección ni parámetros de momento. lo que nos ahorrará ciertos pasos que ya hemos visto en el tema 1. el informe incluirá parámetros. Definiremos en este caso un listado de pedidos similar al que ya hemos hecho anteriormente: la tabla es Sales.NET El ejemplo anterior ya nos da una idea bastante completa de las librerías de clases para .Forms). Inmediatamente se presentará el Asistente de informes de Crystal. comenzaremos una nueva aplicación Windows Forms en la que incluiremos un informe Crystal sencillo. 26 . Estas clases de propósito general se concentran fundamentalmente en el ensamblado CrystalDecisions. Se trata ni más 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. Al finalizar el diseño del informe. 󲐀 Un componente visual que ocupa toda el área de la ventana y tiene como función presentar un informe Crystal.rpt tiene un archivo de VB dependiente. La clase a la que pertenece es CrystalReportViewer (cuyo espacio de nombres es CrystalDecisions. cierre la solución que tenga abierta y seleccione Archivo | Nuevo | Proyecto. se dice que la clase implementa un informe tipado). se nos presenta el entorno integrado de Visual Studio con una aplicación que en principio ya funciona. ¿A qué clase pertenece este objeto? Para responder a esta pregunta. El componente CrystalReport11 es de esa clase. una librería 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. ¿Qué ha creado el asistente de proyectos Crystal para nosotros? Si mostramos la vista Diseño del formulario Form1. 󲐀 Por una parte. situado en la banda inferior del diseñador) llamado CrystalReport11. como podemos comprobar. Veremos que nuestro informe CrystalReport1. puesto que ya hemos cubierto los temas relacionados con el diseño de informes. OrderDate y TotalDue. 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). Llame al proyecto Ejemplo2 y póngalo en el directorio adecuado. INCORPORACIÓN DE UN INFORME A UNA APLICACIÓN Para este nuevo tema relacionado con la programación . para que diseñemos el (primer) informe que el proyecto contendrá.NET. en la vista de Código veremos que contiene la definición de una clase llamada CrystalReport1 igual que el informe. llamado CrystalReportViewer1. conviene pulsar el botón ‘Mostrar todos los archivos’ en el Explorador de soluciones. En la siguiente sección hablaremos con más detalle sobre este objeto. Cuando aparezca el cuadro de diálogo ‘Nuevo proyecto’ elija Visual Basic | Aplicación de Crystal Reports.Windows. y los campos que mostraremos son SalesOrderID. En principio. ya que como hemos dicho los parámetros son uno de los recursos fundamentales que ofrece Crystal a los desarrolladores de aplicaciones.

que permite representar un informe. INFORMES TIPADOS Y NO TIPADOS Como acabamos de ver. pero que almacena información sobre él que nos facilitan la vida.dll y entre ellas destaca una en específico – CrystalReportViewer.Section1.Windows. Observe ahora cómo el uso de la clase tipada facilita el acceso a la primera sección del informe: Dim doc As ReportDocument = CType(CrystalReport11.Show(CrystalReport11. y la clase ReportDocument (que representa a un informe completo) ofrece una propiedad de tipo array ParameterFields() mediante la que podríamos acceder a todos los parámetros de un informe. que se almacena dentro del ejecutable en forma de recurso. Observe en el código fuente de CrystalReport1 la propiedad ResourceName. representa un informe tipado – una clase especializada a partir de ReportDocument que solo vale para nuestro informe concreto. y tendríamos que referirnos a cualquier característica del informe a través de las propiedades y métodos generales de ReportDocument. Hablaremos más sobre esta clase en el siguiente tema. Si busca los componentes de Crystal Reports instalados en el Cuadro de herramientas de Visual Studio. y que implementa el visor de informes para 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 algún modo en él. En general. incluye una clase ParameterField para representar las características de un parámetro. A diferencia de lo anterior. Visual Studio nos 27 .dll y entre ellas destaca también una en específico – una que también se llama CrystalReportViewer.Name) Como habrá comprendido. Como otro ejemplo. cuando se habla del modelo de objetos de Crystal Reports. y utilizar directamente la clase ReportDocument sólo para trabajos de índole genérica. que a su vez hereda de ReportDocument).󲐀 En segundo lugar. sólo que entonces se tratará del otro visor de informes. esta clase representa a un informe genérico.Web.ReportDefinition. la clase que juega un papel predominante en el modelo de objetos de Crystal Reports es ReportDocument. el adecuado para aplicaciones Web. ReportDocument) ' estas dos líneas hacen lo mismo MessageBox.Show(doc.NET. que implementa el visor de informes Windows. Ahora bien.Forms. En general. se hace referencia únicamente a las clases de la primera librería. 󲐀 En tercer lugar. la clase CrystalReport1 generada por el asistente e incluida en nuestro proyecto (que hereda de ReportClass. En Crystal a esta clase se la conoce bajo el nombre de informe no tipado. Estas clases se almacenan en el ensamblado CrystalDecisions. pero perderíamos cierta información específica de nuestro informe concreto. los informes tipados contienen código que se encarga automáticamente de cargar el informe concreto. la primera línea de código declara una variable genérica de tipo ReportDocument y la inicializa para que apunte a nuestro informe tipado. otra librería ofrece clases para la presentación de informes en aplicaciones Windows Forms. De hecho. otra librería ofrece clases para la presentación de informes en aplicaciones Web ASP. sin ninguna característica conocida de antemano. aunque su espacio de nombres es diferente. Un panorama similar se podrá observar cuando trabajemos en una aplicación Web. vea la definición de la propiedad Section1 de CrystalReport1.Name) MessageBox.Sections(0). cuando se arrastra un ReportDocument del Cuadro de herramientas a un formulario. cuyo uso es común tanto a las aplicaciones Windows como a las aplicaciones Web. Podríamos trabajar con nuestro listado de pedidos a través de un objeto ReportDocument. por ejemplo cuando queremos que el mismo componente apunte a diferentes informes durante la ejecución. es recomendable trabajar con los informes tipados siempre que sea posible. Por ejemplo. Estas clases se almacenan en el ensamblado CrystalDecisions. verá que actualmente (estamos trabajando en una aplicación Windows) aparecen dos: ReportDocument y CrystalReportViewer. En particular.

Por lo tanto. Esta variante es más útil en situaciones donde tenemos una base de datos de desarrollo y otra de producción. lo cual es más cómodo y más seguro. que permiten indicar: 󲐀 a) Usuario y contraseña. La ventaja de este enfoque es que se podría enviar una nueva versión del informe al usuario sin necesidad de redesplegar toda la aplicación. La otra opción de esta propiedad que se utiliza con cierta frecuencia es ‘Ninguna’.rpt siempre deberá ir junto con el ejecutable. con el objetivo de que el fichero . Para un correcto funcionamiento de la aplicación. El informe se ejecutará contra el servidor y base de datos especificados. En ese caso.pregunta si realmente deseamos un objeto no tipado o si preferimos crear una clase tipada asociada a alguno de los informes del proyecto.ReportSource = reportDocument1 CONEXIÓN A LA BASE DE DATOS La clase ReportDocument (y por herencia. que heredan de ella). El informe se ejecutará contra el servidor y base de datos definidos dentro del informe. Verá que su valor predeterminado es ‘Recurso incrustado’.rpt sea copiado al mismo directorio que el ejecutable o librería final. a la propiedad Copiar en el directorio de resultado se le asigna el valor ‘Copiar siempre’ o ‘Copiar si es posterior’. deberíamos desconectar el visor de informes de CrystalReport11 en tiempo de diseño y programar lo siguiente en el evento Load del formulario: CrystalReport11.rpt") ReportDocument1. Debemos mencionar dos muy importantes. para no incrustar el informe en el ensamblado. "AdventureWorks".Load("CrystalReport1.rpt junto con el ejecutable cuando instalemos la aplicación a otros usuarios. del ejecutable). si necesitamos hacer modificaciones a un informe incrustado. Usuario y contraseña. Eso significa que cuando la aplicación es compilada la definición del informe es almacenada como un recurso dentro del ensamblado principal del proyecto (en nuestro caso. "sa". el fichero . todos los informes tipados. no necesitaremos desplegar físicamente el fichero . Como inconveniente. "kk") ' conexión del visor en tiempo de ejecución CrystalReportViewer1. Para cargar la definición de un informe externo a un objeto ReportDocument o una clase derivada (informe tipado) se utiliza el método Load: ' carga cualquier informe externo en un ReportDocument no tipado ReportDocument1. Este método ofrece dos variantes fundamentales. INFORMES INCRUSTADOS Y EXTERNOS Si selecciona un informe de Crystal Reports en el Explorador de soluciones. verá sus propiedades en la Ventana de propiedades. tendremos que recompilar la aplicación y volver a desplegar el ejecutable. Y el peligro está en que el informe podría ser borrado o alterado con o sin mala intención. ofrecen un método SetDatabaseLogon que permite suministrar al motor de Crystal Reports la información de conexión necesaria para acceder a la base de datos donde están los datos que necesita el informe. cuyo significado conviene conocer.SetDatabaseLogon(". Base de datos. 󲐀 b) Servidor.Refresh() CrystalReportViewer1. La primera de ellas es Acción de generación.\SQLExpress". Si en nuestro ejemplo necesitáramos suministrar información de conexión para ejecutar el informe.ReportSource = CrystalReport11 PASO DE PARÁMETROS EN TIEMPO DE EJECUCIÓN 28 .

sino solo los que estén entre las fechas de inicio y fin indicadas por los parámetros. sobre la que no daremos muchos detalles aquí) para seleccionar la impresora activa y establecer múltiples opciones de impresión.PortableDocFormat. 1)) CrystalReport11. 9. de nuevo podemos utilizar un potente método de la clase ReportDocument: PrintToPrinter().OrderDate} in {?FInicio} to {?FFin} Observe la utilización de los operadores in. se debe utilizar la propiedad PrintOptions (una propiedad con poca “ciencia” y bastante “miga”. IMPRESIÓN DE INFORMES Para la impresión de un informe desde código. tenemos los métodos ExportToDisk(). tradicionalmente Adobe PDF o Microsoft Word o Excel. _ "C:\PEDIDOS. Llamaremos a los parámetros FInicio y FFin. New DateTime(2003. A continuación. para enviar a mi impresora predeterminada una copia de todas las páginas del informe...Shared. New DateTime(2003. 0) 29 . Adicionalmente. Permite especificar. podremos escribir: ' exportar a PDF CrystalReport11. El método Export() es el más potente de la familia.to (desde. un flujo de salida cualquiera o un flujo HTTP como el generado por una aplicación o servicio Web. además del destino de la exportación.ExportFormatType. El segundo parámetro es de tipo Object. correspondientes a la fecha de inicio y fecha de fin de los pedidos. False.SetParameterValue("FFin".hasta) por parte del Asistente.Una de las características favoritas de los desarrolladores es la posibilidad de pasar directamente valores de parámetros a los informes de manera transparente. y haremos que la fórmula de selección del informe sea: {SalesOrderHeader. O sea. Ante todo. respectivamente. 9. que simplifican la exportación de informes a un fichero en disco. El método SetParameterValue de ReportDocument espera dos valores. debo escribir: ' imprimir CrystalReport11. y a la vez el mas complejo de utilizar. añadiremos dos parámetros a nuestro informe. EXPORTACIÓN DE INFORMES MEDIANTE CÓDIGO Otra de las técnicas comúnmente requeridas por los desarrolladores es la posibilidad de exportar el informe a un formato de presentación diferente. Hay que comprobar siempre que enviamos datos de los tipos correctos al informe. Aquí de nuevo viene en nuestra ayuda la clase ReportDocument. añadiremos las siguientes líneas de código al evento Load del formulario: ' asignar valores a parámetros CrystalReport11. 0. el nombre del parámetro y el valor a asignar. que ofrece varios métodos que nos facilitan la tarea.SetParameterValue("FInicio". 5)) Esto es suficiente para hacer que se muestren solamente los pedidos efectuados entre el 1 y el 5 de septiembre de 2003. ExportToStream() y ExportToHttpResponse(). Por ejemplo.PrintToPrinter(1.PrintOptions.PDF") El primer parámetro es de un tipo enumerado que determina el formato de exportación.ExportToDisk( CrystalDecisions.PrinterName = "Dell Laser Printer 5210n" CrystalReport11. no deseamos obtener todos los pedidos de la base de datos. Para exportar nuestro informe a un fichero en formato PDF. Previamente. otras características de la exportación que son útiles sobre todo cuando se exporta a Excel. dado que los parámetros pueden ser de distintos tipos.

NET. y generalmente se los puede encontrar en la capa de presentación de las aplicaciones. 󲐀 ShowTextSearchButton – mostrar o no el botón de Buscar texto. con los que queremos trabajar. d) página de fin. 󲐀 ShowExportButton – mostrar o no el botón de Exportar. 󲐀 Un objeto de la clase ReportDocument (informe no tipado) o derivada de ella (informe tipado). el Diseñador de Crystal es capaz de acceder a ella para permitirnos seleccionar las tablas. 󲐀 ShowPageNavigateButtons – mostrar o no los botones de navegación por las páginas. En particular. 󲐀 DisplayStatusBar – si se debe mostrar o no la barra de estado. Como los conjuntos de datos tipados contienen metadatos que describen su estructura. 󲐀 ShowZoomButton – mostrar o no el botón de Acercar/Alejar. existe desde la primera versión de la librería. porque se le puede asignar diferentes valores: 󲐀 Una cadena de caracteres que representa el nombre del fichero que contiene el informe. 30 . lo cual es muy conveniente porque las arquitecturas de múltiples capas de uso común en la práctica actual favorecen la utilización de objetos de este tipo para la transmisión de información entre capas. 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).Los parámetros de PrintToPrinter significan: a) la cantidad de copias. 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.NET DataSets’ dentro del cual se muestran todos las clases derivadas de DataSet (los llamados conjuntos de datos tipados) disponibles en el proyecto. b) si se deben combinar o no las copias en caso de ser más de una. 󲐀 ShowGroupTreeButton – mostrar o no el botón de Mostrar Árbol de grupos. que es donde se muestran los informes. Esta variante es la que estamos presentando aquí. veremos que en la lista de los posibles orígenes de datos a utilizar para un informe hay un nodo ‘ADO. un informe Crystal puede obtener sus datos de un DataSet (conjunto de datos) de ADO. Utilizando esta opción es posible saltarse completamente el modelo de objetos de Crystal. CONFIGURACIÓN DEL VISOR DE INFORMES El Visor de informes de Crystal Reports posee varias propiedades dignas de mencionar aquí. tiene que ver con el origen a partir del que el visor obtiene el informe a mostrar. 󲐀 ShowRefreshButton – mostrar o no el botón de Actualizar. 󲐀 DisplayToolbar – si se debe mostrar o no la barra de herramientas. ReportSource. etc. Esta variante es la más simple y primitiva de todas. 󲐀 ShowPrintButton – mostrar o no el botón de Imprimir. Pero los informes de Crystal Reports pueden nutrirse de muchas otras diversas fuentes de información. campos. Es una propiedad de tipo Object. Las páginas de inicio y fin se deben poner a cero si se desea obtener copias completas. 󲐀 A continuación. Si creamos un nuevo informe con el Asistente. c) página de inicio. las demás tienen relación con la estética de presentación del informe. La primera. 󲐀 ReportSource: esta propiedad indica al visor de dónde debe obtener el informe a mostrar. 󲐀 ShowGotoPageButton – mostrar o no el botón de Ir a página. tenemos varias propiedades booleanas que determinan qué botones de la barra de herramientas deben aparecer o no: 󲐀 ShowCloseButton – mostrar o no el botón de Cerrar. 󲐀 Por último.

Show() DESPLIEGUE CRYSTAL DE APLICACIONES WINDOWS QUE INCLUYAN INFORMES Una vez terminado el desarrollo de una aplicación. que determinarán la carpeta de aplicación por defecto (\[Archivos de programa]\[Fabricante] \[NombreProducto]). Ahora debemos seleccionar la opción Proyecto | Propiedades del menú de Visual Studio. Pulsamos Aceptar dos veces para cerrar los cuadros de diálogo.Refresh() ' elimina datos guardados por el informe CrystalReport21. Se presentará un editor especializado en el que debemos especificar qué ficheros.NET de Crystal Reports.NET) y la casilla de Crystal Reports para . debemos marcar la casilla correspondiente a Microsoft Data Access Components 2. es necesario utilizar el método SetDataSource () de la clase ReportDocument para conectar el informe con el objeto concreto que almacena el conjunto de datos. CrystalReport21.0. Visual Studio ofrece diferentes tipos de proyectos de instalación que permiten empaquetar los ficheros que se deben copiar al equipo de destino. Creemos un nuevo proyecto de instalación para desplegar nuestra reciente aplicación Ejemplo3. lo primero es utilizar Archivo | Nuevo proyecto y seleccionar la plantilla Proyecto de instalación debajo del nodo Otros tipos de proyectos | Instalación e implementación. accesos directos. etc. según las opciones que hayamos seleccionado. En lo concerniente a Crystal Reports. queremos colocar en qué directorios del equipo de destino. En este caso sencillo. que nos permite indicar qué software debe incluirse en nuestro proyecto para instalarlo en la máquina de destino si no estuviera ya instalado. empaquetados o no. Para ello.SetDataSource(AdventureWorksDataSet) CrystalReport21. llega el momento del despliegue. pero sí debemos pulsar el botón Requisitos previos.A la hora de presentar el informe en tiempo de ejecución.NET que utilice informes Crystal es necesario incluir en el programa de instalación: 󲐀 las librerías . Además de . y ¡ya casi está! Solo nos queda seleccionar la opción Generar | Generar de Visual Studio para generar el proyecto de instalación. en el directorio raíz siempre se incluye un fichero Setup.exe (el informe Crystal utilizado está como recurso incrustado). En cualquier caso.NET Framework 2. sobre todo Manufacturer (fabricante) y Product Name (nombre del producto). Ante todo.8 (necesario para . el ejecutable y los ensamblados privados que componen la aplicación se colocan en la carpeta de la aplicación. Llamemos al proyecto Instalar3 y pulsamos Aceptar. utilizamos la opción Archivo para añadir el único archivo necesario. Por ejemplo. 󲐀 los ficheros . así como la secuencia de comandos que se deben ejecutar en éste para que la aplicación quede lista para funcionar en la máquina de destino. Para agregar archivos a la carpeta de la aplicación.0 (que ya deberá estar marcado). pulsamos el botón derecho sobre ella y seleccionamos la opción Agregar. el ejecutable Ejemplo3. Con ese objetivo. y opcionalmente se colocan accesos directos al ejecutable en el menú Programas o el escritorio del usuario.NET Framework 2. para desplegar correctamente cualquier aplicación . UTILIZACIÓN DE INFORMES EN APLICACIONES WEB 31 . La mayor parte de las opciones del diálogo que aparece son satisfactorias. debemos seleccionar el nodo del proyecto en el Explorador de soluciones e introducir las propiedades básicas del proyecto.exe. que es el que debemos ejecutar en la máquina de destino para proceder a la instalación de la aplicación.RPT que sean externos a la aplicación. Generalmente. El proyecto de instalación siempre consiste de una jerarquía de carpetas con todos los recursos necesarios para la instalación.

A continuación pulsamos sobre el enlace a su utilidad de configuración.aspx. aplicación de parámetros. para mostrar un informe en una página ASPX necesitaremos un componente CrystalReportSource (‘origen de informe Crystal’). sino con las características relacionadas con la visualización. Esta posibilidad permite aumentar en gran medida la productividad de nuestros sitios Web. 󲐀 Report. utilización de un DataSet como origen del informe) son igualmente aplicables para el desarrollo de aplicaciones Web. Seleccione la plantilla genérica ‘Sitio Web ASP. Casi todos los recursos de programación que hemos visto anteriormente (conexión a la base de datos. que llamaremos Paises. en el fondo se utiliza la misma clase ReportDocument). Entre las propiedades que ofrece la clase CrystalReportSource. Llega la hora de configurar la página Web actual. Vamos a arrastrar un componente CrystalReportSource sobre la vista de Diseño de la página ASPX. A continuación. El despliegue también es muy similar – básicamente se trata de hacer que las librerías . para el tratamiento programático del informe recomendamos utilizar la propiedad ReportDocument. Las principales diferencias tienen que ver no con el modelo de programación (como veremos. para que muestre nuestro informe cuando ejecutemos la aplicación. Una vez diseñado el informe. 32 . y llame al directorio EjemploWeb (puede ubicarlo en la zona del disco que desee. agregaremos al proyecto un nuevo informe Crystal. TÉCNICAS FUNDAMENTALES Las diferentes subsecciones de esta sección presentan las técnicas específicas que se utilizan al incorporar informes Crystal en aplicaciones Web ASP. Default. veamos primero qué componentes debemos seleccionar del nodo ‘Crystal Reports’ del Cuadro de herramientas en el caso de una aplicación Web. Es una propiedad que integra varias características del informe.NET de Crystal caigan “en su sitio” cuando se ejecute el programa de instalación. dado que las aplicaciones Web se ejecutan en un navegador como Internet Explorer. podemos arrastrarlo hacia esa carpeta. Si EnableCaching es verdadera.CountryRegion de AdventureWorks. Se trata de un componente que encapsula un objeto de la clase ReportDocument que hemos estudiado antes. aquí vamos a evitarlo para estudiar el mecanismo a utilizar en el caso general. el motor de CrystalReports “cacheará” en la memoria del servidor el resultado de la ejecución de un informe durante el intervalo indicado en CacheDuration. no teniendo que ejecutar el informe nuevamente si se recibe otra petición del informe antes de que expire el intervalo. los parámetros y orígenes de datos de los que se nutre. una de las grandes ventajas de Visual Studio 2005 a la hora de crear aplicaciones Web). En primer lugar.NET’. comenzaremos un nuevo sitio Web ASP.NET ubicado en el sistema de archivos. debemos destacar: 󲐀 EnableCaching (booleana) y CacheDuration (entero que representa un entero en segundos). donde debemos indicar a qué informe del proyecto queremos asociarlo. y veremos que sólo ofrece una opción: ‘Configurar el origen del informe’.NET. INCORPORACIÓN DE UN INFORME A UNA APLICACIÓN Para mostrar cómo incorporar un informe Crystal Reports a una aplicación Web. como el nombre del fichero de informe. dotándonos a la vez de propiedades adicionales que son de gran utilidad en el mundo de las aplicaciones Web. Los mecanismos para la incorporación de informes Crystal Reports en aplicaciones Web son muy similares a los que ya hemos visto para las aplicaciones de escritorio. Se trata mayormente de información descriptiva. que llamaremos ‘informes’.NET de Crystal Reports’ que nos haría aún más fácil la vida. es conveniente colocar todos los informes del proyecto dentro de una carpeta común.En este tema estudiaremos las particularidades relacionadas con la programación de aplicaciones Web que utilicen Crystal Reports. Para ello.rpt y mostrará un listado sencillo de los países/regiones almacenados en la tabla Person. En el caso de las aplicaciones Web. Al pulsar Archivo | Nuevo | Sitio Web verá que existe una plantilla ‘Sitio Web ASP.

Esta conexión se establece a través de la propiedad ReportSourceID del visor. Para ello necesitaremos el componente CrystalReportViewer (nodo ‘Crystal Reports’ del Cuadro de herramientas). el valor adecuado puede ser Uplevel. Como su nombre indica.CrystalReportViewer.esta propiedad conecta al visor con el objeto ReportSource que determina el informe a mostrar. como en una sola gran página. porque es una propiedad de tiempo de ejecución. utilización de un DataSet como origen del informe).󲐀 ReportDocument. el significado de los botones es intuitivamente claro. 󲐀 PrintMode – el método que se utilizará para la impresión local de los informes: ActiveX o Pdf. en el evento Load de la página) utilizando los métodos ya estudiados de la clase ReportDocument: 󲐀 EnableDatabaseLogonPrompt – si debe solicitarse el usuario y contraseña de conexión en caso necesario.Web. donde el propio componente determina qué tipo de HTML generar en función del navegador que hace la llamada. no se trata ni mucho menos de la misma clase. CONFIGURACIÓN DEL VISOR DE INFORMES HTML Una vez configurado el objeto CrystalReportSource. lo mejor es mantener el valor Auto. A este objeto podremos aplicarle todas las técnicas que hemos estudiado anteriormente (conexión a la base de datos. Cuando arrastramos un componente CrystalReportViewer sobre una página ASPX. almacena una referencia al objeto ReportDocument que representa al informe tipado que ya hemos estudiado en las aplicaciones Windows. por el contrario. nunca deberíamos dejar que estos diálogos aparecieran. 󲐀 Dos propiedades booleanas permiten indicar si queremos que el visor presente cuadros de diálogo emergentes para solicitar la información que pueda faltarle para la ejecución del informe. 33 . lo primero que debemos indicar es a qué origen de informe queremos conectarlo (en nuestro caso. 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). Si sabemos que algunos usuarios utilizan navegadores antiguos o limitados. o si todos deben ir contiguos. el origen recién creado). La tarea del componente CrystalReportViewer es generar código HTML + Javascript que pueda ser mostrado por un navegador estándar. sino que deberíamos suministrar los datos por programa (por ejemplo. en general. Le recomendamos ejecutar la aplicación Web y utilizar la opción Ver | Código fuente del navegador para cerciorarse de que la interfaz de usuario está “hecha” con HTML. llega el momento de poner sobre la página ASPX el componente que permitirá mostrar en el navegador el resultado de la ejecución del informe. 󲐀 ClientTarget – determina el código que emitirá el componente para enviar al navegador. automáticamente se lanza el asistente para su configuración. 󲐀 A continuación. Se recomienda utilizar este último valor. aplicación de parámetros. No se ve en la ventana de propiedades. si sabemos que todos utilizan navegadores avanzados. La siguiente imagen muestra la barra de botones del visor Web. Observe que aunque el nombre corto de esta clase es el mismo de la que se utiliza en las aplicaciones Windows. podemos asignar a esta propiedad el valor Downlevel. a continuación detallamos las propiedades más importantes: 󲐀 ReportSourceID . 󲐀 SeparatePages – indica si los registros del informe deben separarse en páginas. 󲐀 DisplayToolbar – si se debe mostrar o no la barra de herramientas. El resto de las propiedades del visor tiene que ver con la visualización en sí. su nombre completo es CrystalDecisions. 󲐀 EnableParameterPrompt – si deben solicitarse valores para los parámetros que carezcan de ellos. 󲐀 DisplayPage – si se debe mostrar o no la página del informe. Teóricamente.

Close() End Sub Es esencial un nombre de fichero que sea único para cada sesión.EventArgs) Handles Button1. 󲐀 HasToggleGroupTreeButton – mostrar o no el botón de Mostrar Árbol de grupos. En general.pdf" ' exportamos a PDF CrystalReportSource1. 󲐀 HasRefreshButton – mostrar o no el botón de Actualizar. 󲐀 HasPageNavigationButtons – mostrar o no los botones de navegación por las páginas. 󲐀 HasZoomFactorList – mostrar o no la lista de opciones de zoom. Esta técnica nos permitiría incluso obviar la utilización del visor.ReportDocument. con modus operandi y resultados similares. 󲐀 HasGotoPageButton – mostrar o no el botón de Ir a página. nombre) ' enviamos el fichero PDF al navegador Response.Flush() Response. Programe el evento Click del botón de la siguiente forma: Protected Sub Button1_Click(ByVal sender As Object. dado que las aplicaciones Web se desplieguen de forma centralizada en un servidor. tenemos varias propiedades booleanas que determinan qué botones de la barra de herramientas deben aparecer o no: 󲐀 HasDrillUpButton – mostrar o no el botón de Volver al informe anterior. se debe utilizar un nuevo Proyecto de programa de instalación Web. En el caso de una aplicación Web. es un tipo de proyecto muy similar al anterior.ContentType = "application/pdf" ' tipo MIME Response.WriteFile(nombre) ' contenido Response. 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. Frecuentemente quisiéramos que la exportación a PDF (un formato de amplia popularidad) se produjera de manera automática y que en el navegador apareciera directamente el resultado.Click ' nombre de fichero único Dim nombre As String = "C:\temp\" & Session. En lugar de crear un nuevo Proyecto de instalación. VISUALIZACIÓN DIRECTA EN FORMATO PDF Si probamos las opciones de Exportar o Imprimir del visor de informes Web. para su correcto despliegue es necesario incluir en el proyecto todos los ficheros que forman parte de la carpeta de la aplicación y sus subcarpetas. 󲐀 HasPrintButton – mostrar o no el botón de Imprimir.ExportToDisk( _ CrystalDecisions.PortableDocFormat. entre otras características. Aquí mostraremos cómo hacerlo. pero generalmente causan muchísimo menos dolores de cabeza. 󲐀 HasExportButton – mostrar o no el botón de Exportar.SessionID & ". Sobre la página con la que estamos trabajando.󲐀 Por último. de modo que no existan “interferencias” entre varios posibles visitantes de la página. 34 .ExportFormatType. veremos que presentan un cuadro de diálogo para que el usuario final seleccione el formato de exportación o el rango de páginas.ClearContent() Response. colocaremos un botón y le asignaremos el título ‘PDF’. 󲐀 HasSearchButton – mostrar o no el botón de Buscar texto.ClearHeaders() Response. ByVal e As System.Shared.

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