Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Curso CR
Curso CR
Este curso le ofrece todos los conocimientos que necesita para disear informes de datos Crystal Reports e incorporarlos en sus aplicaciones .NET (tanto Windows como Web). En este curso aprender: Cmo crear informes de datos utilizando el diseador de informes integrado en Visual Studio 2005 Cmo utilizar los componentes que ofrece Crystal Reports para incorporar esos informes en aplicaciones .NET. Cmo crear instaladores para esas aplicaciones, para facilitar su despliegue. REQUISITOS: Para una correcta asimilacin de los contenidos del curso, el alumno deber estar familiarizado con los conceptos fundamentales de la programacin en Visual Basic .NET y con el entorno de desarrollo Visual Studio 2005. Igualmente, deber conocer los principales conceptos relacionados con el mundo de las bases de datos relacionales (base de datos, tablas, filas, columnas); una ligera familiaridad con el lenguaje SQL (en particular, con la sentencia SELECT) no es imprescindible, pero s muy conveniente. REQUISITOS DE SOFTWARE: Crystal Reports .NET viene incluido nicamente en la edicin Profesional de Visual Studio 2005; si se dispone de una edicin inferior, la alternativa es adquirir de manera independiente el producto Crystal Reports Developer, e instalarlo sobre cualquier versin de Visual Studio 2005. Como motor de bases de datos, el curso utiliza Microsoft SQL Server 2005; cualquiera de sus ediciones es vlida (en particular, la Express, disponible gratuitamente). Los ejemplos se basan en la base de datos AdventureWorks, que viene incluida en las ediciones de pago de SQL Server 2005; si va a utilizar la edicin Express, puede descargarla desde aqu.
QU ES CRYSTAL REPORTS
Crystal Reports es una herramienta potente a la vez que fcil de usar para el diseo y generacin de informes a partir de datos almacenados en una base de datos u otra fuente de informacin. Es, con diferencia, la herramienta ms popular en su categora, y no solo entre quienes podran considerarse sus usuarios puros (aquellos que necesitan obtener peridicamente informacin para la toma de decisiones a partir de los datos de la empresa), sino tambin entre los programadores, que lo han convertido en su herramienta favorita a la hora de embeber capacidades de generacin de informes dentro de las aplicaciones a medida. A este ltimo hecho indudablemente ha contribuido mucho el que, desde hace ms de diez aos, Crystal Reports venga siendo incorporado de serie a las herramientas de desarrollo de Microsoft (Visual Basic y luego Visual Studio). Con la aparicin de .NET Framework, una transformacin revolucionaria de las tecnologas de desarrollo de Microsoft, los fabricantes de Crystal Reports se dieron a la tarea de adaptar el producto a los nuevos
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: Ensearle a utilizar el diseador de Crystal Reports integrado en Visual Studio 2005 para crear informes de datos potentes y flexibles. Mostrarle cmo incorporar esos informes en sus aplicaciones .NET para Windows y la Web, utilizando como lenguaje de programacin a Visual Basic.
Indudablemente, otra de las caractersticas que han hecho tan popular a Crystal Reports es la amplia gama de orgenes de datos que soporta, as como de formatos de salida a los que se pueden exportar los resultados. El Motor de Impresin de Crystal Reports tiene una arquitectura modular, y se apoya en controladores (drivers) independientes para acceder a los diversos orgenes de datos soportados y generar los informes en los diferentes formatos de salida posibles. Las posibilidades de acceso a diferentes orgenes de datos sobrepasan ampliamente la mera capacidad para comunicarse con bases de datos (prcticamente todos los sistemas de bases de datos, tanto relacionales como planos estn soportados), y abarcan desde la lectura de todo tipo de bitcoras (logs), por ejemplo las producidas por los servidores Web para el seguimiento de la navegacin de los usuarios, hasta el acceso a objetos en memoria generados por las aplicaciones que hospedan al Motor de Impresin. Por ejemplo, en este curso veremos cmo ejecutar informes contra conjuntos de datos (objetos de la clase DataSet) que tengamos en nuestras aplicaciones. En cuanto a las posibilidades de salida, el Motor de Impresin de Crystal no solo nos permite obtener nuestros resultados en papel o en pantalla (una ventana, en caso de aplicaciones Windows; o el navegador Web, en el caso de aplicaciones Web), sino que tambin ofrece la posibilidad de exportar los resultados a numerosos formatos externos, como Adobe PDF, Microsoft Word, Microsoft Excel, ficheros de texto o XML, entre otros. Tenga en cuenta que, aunque an no podemos prescindir del papel ni mucho menos, la presentacin de informes se est convirtiendo cada vez ms en una tarea interactiva. Las versiones ms recientes de Crystal Reports incluyen numerosas facilidades que veremos en este curso (rbol de grupos, elementos con hiperenlaces) y que estn orientadas nica y exclusivamente a la visualizacin de informes en una ventana de Windows o en un navegador Web.
Puede encontrar una amplia informacin sobre todas y cada una de las tablas y otros objetos de base de datos que contiene AdventureWorks aqu. En general, el uso de las diferentes tablas a la hora de componer los informes es bastante intuitivo, y siempre comenzaremos cada ejemplo concreto indicando en qu tablas se almacena la informacin a partir de la que se desea disear el informe.
INTRODUCCIN
Antes que nada, es conveniente definir qu entendemos por informe. En este curso, consideraremos como informe a cualquier documento que presente un subconjunto de los datos almacenados en un origen de datos (generalmente, una base de datos relacional) de una manera ms o menos elaborada. En
4
este sentido, un simple listado de los empleados de la empresa podra perfectamente considerarse un informe. Otro documento que muestre a esos empleados agrupados por categoras segn su volumen de ventas del ao anterior sera otro informe, claro est bastante ms elaborado que el anterior. Definir o crear un informe consiste en indicar al Diseador de Crystal Reports de dnde tiene que obtener los datos necesarios, cmo tiene que transformarlos y por ltimo, cmo debe presentar cada elemento de datos sobre el documento final. Toda esa informacin se almacenar de la definicin del informe, que tradicionalmente se guarda en un fichero externo .RPT para su posterior ejecucin. Pero antes de enfrentarse al Diseador de Crystal Reports (o de hecho, a cualquier generador de informes), es altamente conveniente realizar un trabajo de anlisis y diseo previos que nos den una idea clara de a) qu necesita obtener exactamente el usuario que nos ha encargado el informe, b) en consecuencia, cules son los datos que debemos utilizar y c) qu apariencia aproximada deber tener nuestro informe cuando sea ejecutado. Tener las ideas claras nos ayudar a cumplir con los objetivos requeridos en el menor tiempo y con la mayor calidad posible.
a) En primer lugar, cmo queremos disear el informe. Las opciones posibles son: 1. Utilizando el Asistente del Diseador. Como veremos a continuacin, el Asistente nos gua a travs de diferentes pantallas para que definamos las caractersticas principales del informe. Una vez finalizado el Asistente, podremos aadir al informe nuevas posibilidades o modificar las decisiones tomadas anteriormente. Como se dar cuenta rpidamente, el Asistente de informes es una combinacin de otros asistentes ms sencillos que podr invocar por separado posteriormente. En general, es conveniente dejarse guiar por el Asistente, para obtener rpidamente un diseo inicial que luego podemos modificar a voluntad. 2. Partiendo desde cero sobre un lienzo en blanco. Generalmente no es productivo ir por esta ruta difcil. 3. A partir de un informe existente. Esta opcin es conveniente si queremos disear un informe muy parecido a otro que ya hemos creado anteriormente. b) Si decidimos utilizar el Asistente, ste es capaz de ayudarnos con tres tipos de informes diferentes: 1. Informe estndar. Esta opcin se utiliza para crear un informe de tipo listado. Es la opcin ms conveniente en la gran mayora de los casos, a menos que se tenga claro que el informe nicamente incluir una tabla cruzada, en cuyo caso es ms conveniente seleccionar la siguiente opcin. 2. Tablas cruzadas. Un informe de tabla cruzada es un informe que presenta en una tabla resmenes agrupados por categoras, por ejemplo los volmenes de ventas de cada tipo de productos por cada pas en el que la empresa opera. No es ningn problema aadir manualmente una tabla cruzada a un informe estndar si se desea. 3. Etiqueta. Listado de mltiples filas y columnas, generalmente a partir de una tabla de clientes, para producir las etiquetas a adherir a los sobres de correos cuando se hace un mailing. Comenzaremos diseando un informe estndar por ejemplo, un informe que presente la lista de productos que la empresa AdventureWorks ha vendido al pblico o vende actualmente. Mantenga las opciones por defecto y pulse Aceptar. PASO 1. El primer paso a la hora de disear el informe es indicarle al Asistente dnde estn y cules son los datos que se van a utilizar en el informe. Aqu tenemos que indicar: a) La tecnologa a utilizar para conectarse al origen de datos. En este caso, tratndose de una base de datos SQL Server, debemos indicar Crear nueva conexin | OLE DB (ADO) y luego elegir el proveedor Microsoft OLE DB Provider for SQL Server. Pulse Siguiente. b) El nombre del servidor, la base de datos y el usuario y contrasea necesarios para establecer la conexin. En nuestro caso, utilizaremos como nombre de servidor .\SQLExpress (. significa la mquina local, y SQLExpress es el nombre de la instancia en que se instala SQL Server Express de forma predeterminada). De momento utilizaremos la autenticacin integrada (marcando la casilla correspondiente), aunque la autenticacin de usuario/contrasea es ms utilizada en la vida real, sobre todo en aplicaciones Web. Por ltimo, despliegue la lista de bases de datos disponibles y seleccione AdventureWorks. Pulse Siguiente. c) Por ltimo, se nos permite indicar las propiedades avanzadas de la conexin. No necesitamos ninguna en este caso, y por eso pulsamos directamente en Finalizar.
6
Una vez indicados el servidor y la base de datos, la ver en la lista de los orgenes de datos disponibles. En este momento es conveniente pulsar el botn derecho del ratn sobre el nombre del servidor y utilizar la opcin Agregar a Favoritos para recordar este origen de datos para futuros informes. PASO 2. Llega ahora el momento de indicar la(s) tabla(s), vista(s) o procedimiento almacenado de la base de datos de donde se deber obtener la informacin. En nuestro caso, necesitaremos la tabla Product del esquema Production. Seleccione esa tabla en la vista de rbol (pasndola a la columna derecha del dilogo mediante el botn >) y pulse Siguiente. PASO 3. El siguiente paso consiste en indicar cules de las columnas (campos) que componen la tabla elegida queremos mostrar en las columnas del listado. En nuestro ejemplo, seleccionaremos los siguientes campos: ProductNumber el cdigo de identificacin del producto Name el nombre del producto Color el color del producto Cuando haya elegido esos tres campos, pulse Siguiente. PASO 4. Una vez elegidas las columnas a mostrar en el listado, toca el turno a indicar los criterios por los que se quiere agrupar las filas del resultado. Por ejemplo, en nuestro caso podramos agrupar los productos a listar segn su color. Para este ejemplo inicial, sin embargo, no especificaremos criterio de agrupacin alguno. Pulse Siguiente. PASO 5. La otra decisin importante que debemos tomar con respecto a los datos es qu filas de la tabla seleccionada deseamos que aparezcan en el informe. Para ello es necesario especificar una condicin de seleccin slo aquellas filas que satisfagan la condicin que indiquemos sern recuperadas del servidor de base de datos. En nuestro ejemplo (necesitamos los productos que la empresa ha vendido o vende) el producto debe ser un producto que se vende y no para consumo interno (en cuyo caso el campo FinishedGoodsFlag ser 1, que significa verdadero). Fjese cmo al seleccionar un campo en la zona inferior derecha de la ventana aparece un cuadro de combinacin en el que se muestran algunas de las condiciones comunes para campos de ese tipo. En nuestro caso, nos interesa la condicin es Verdadero. Observe tambin que no es necesario que el campo de la condicin est entre los campos a mostrar en el informe para utilizarlo en la condicin de filtro. Una vez indicada la condicin, pulse Siguiente. PASO 6. Por ltimo, el Asistente nos permite elegir entre un conjunto de plantillas de estilos disponibles. Las plantillas de estilos permiten establecer de una sola vez todo el conjunto de caractersticas visuales (estilos) que se aplicarn a los diferentes tipos de objetos que pueden aparecer en el informe. Mantenga el estilo Estndar y pulse Finalizar. En este momento el Asistente generar el informe, que veremos reflejado en el rea de trabajo de Visual Studio 2005.
las modificaciones que queramos para adecuar ms el informe a los requerimientos de nuestra aplicacin o usuarios. Observe tambin en la parte inferior de la ventana la otra posible vista del informe que podemos seleccionar, la Vista previa, que nos ofrecer instantneamente una presentacin del resultado de la ejecucin del informe para que podamos ver cmo lucir nuestro informe con los datos reales. Aunque formalmente el diseo del informe debe hacerse desde la vista Informe principal, ver que el Diseador nos permite tambin realizar casi todas las tareas de diseo sobre esta vista previa. Volviendo a la vista de diseo, ver que el diseo del informe consta de diferentes secciones que se pueden expandir o contraer a voluntad y que juegan un papel conceptual muy importante en Crystal Reports. Bsicamente, la seccin en la que est situado un elemento determina cundo y cuntas veces se imprimir ese elemento al ejecutar el informe. Las secciones disponibles en Crystal Reports son las siguientes: Encabezado del informe: los elementos que se coloquen en esta seccin aparecern en el informe una sola vez, en la parte superior de la primera pgina del informe. En esta seccin tpicamente se colocan el ttulo del informe, la fecha de ejecucin, etc. Por defecto, esta seccin aparece inicialmente suprimida (indicado por las rayas transversales). Encabezado de pgina: los elementos que se siten en esta seccin aparecern en el informe una vez por cada pgina del informe, en la parte superior de la misma. Tradicionalmente se colocan en esta seccin los nmeros de pgina y las etiquetas de las columnas del informe (cosa que el Asistente de informes ya ha hecho por nosotros). Encabezado de grupo: habr uno por cada uno de los grupos que tenga el informe (nuestro informe bsico no tiene grupos). Los elementos que se coloquen en esta seccin (un ejemplo tpico es el nombre del grupo) aparecern en el informe una vez al principio de cada uno de los diferentes grupos que el motor de ejecucin encuentre en los datos. Ms adelante en este mismo tema trataremos con profundidad el tema de los grupos. Detalles: en la seccin de Detalles se coloca todo aquello que se quiere que aparezca una vez por cada uno de los registros del conjunto de datos de entrada. Tpicamente, si el informe es del tradicional estilo listado, en esta seccin se colocan objetos que representan a los campos de la tabla o consulta de origen. En un informe tpico de tabla cruzada, por ejemplo, la seccin de detalles se deja vaca (o se suprime) porque no se desea que aparezca informacin sobre cada uno de los registros, sino solo los resmenes (que normalmente se ponen en la seccin de Pie del Informe). Pie de grupo: es la seccin opuesta al Encabezado de grupo, y se imprime una vez al finalizar cada uno de los grupos que el motor de ejecucin encuentre en los datos que componen el informe. Habr una seccin de Pie de grupo para cada Encabezado de grupo, y los grupos siempre estn perfectamente anidados (por ejemplo, en un informe con dos grupos, por Pases y Provincias, los grupos correspondientes a las provincias de un pas siempre quedarn anidados dentro del grupo correspondiente al pas). En esta seccin tpicamente se colocan los totales de grupo (por ejemplo, la cantidad de clientes por cada pas, en un listado de clientes agrupado por pases). Pie de pgina: opuesta al Encabezado de pgina, los elementos que se siten en esta seccin aparecern en el informe una vez por cada pgina del informe, en la parte inferior de la misma. Tradicionalmente se colocan en esta seccin los totales acumulados (tipo suma y sigue) o tambin los nmeros de pgina. Pie del informe: los elementos que se coloquen en esta seccin aparecern en el informe una sola vez, en la ltima pgina del informe. En esta seccin tpicamente se colocan los totales generales. Si se pulsa con el botn derecho del ratn sobre cualquiera de las bandas que identifican a las secciones (por ejemplo, sobre la seccin de Encabezado del informe) aparecer el men de contexto de la seccin,
que exploraremos con ms profundidad un poco ms adelante en el curso. Por el momento, ejecute la opcin No suprimir sobre la seccin de Encabezado de informe, para indicar que queremos que esta seccin aparezca al ejecutar el informe. Otros tres elementos muy importantes de la interfaz de usuario que aparecen en modo de diseo para ayudarnos con las tareas ms habituales son: Las barras de herramientas de Crystal Reports La barra de herramientas Principal ofrece mltiples botones para, por una parte, lanzar diferentes asistentes que nos ayudarn con las tareas comunes (seleccin, ordenacin), y por otra parte, facilitarnos las tareas de formato (atributos de texto, justificacin, cantidad de decimales en campos numricos) La barra de herramientas Insertar ofrece botones que despliegan asistentes que nos permitirn insertar objetos ms o menos complejos en el informe (grupos, totales, grficos, imgenes) En el men principal de Visual Studio, o si se pulsa el botn derecho del ratn sobre el lienzo de diseo (teniendo cuidado de no estar situado sobre una seccin, pues entonces aparecera el men de la seccin), tendremos el men principal del diseador, que incluye todas las opciones de las barras de herramientas ms algunas otras no disponibles en ningn otro sitio. Las principales opciones de este men son las siguientes: Insertar: para insertar diferentes objetos sobre el lienzo de diseo. Base de datos: para realizar diferentes tareas relacionadas con la base de datos a la que accedemos, por ejemplo agregar nuevas tablas al informe. Report: para lanzar diferentes asistentes o establecer la configuracin del informe. Por ejemplo, vamos a establecer el ttulo del informe y el nombre de su autor. Para ello utilizamos la opcin del men Report | Resumen de informacin, que nos lanzar un cuadro de dilogo en el que podremos indicar esos valores. Utilice como ttulo Listado de productos para venta; ponga su nombre en el campo Autor. Diseo: para actuar sobre las opciones de configuracin general del diseador, que dictan cmo ste se comporta de manera predeterminada. Por ejemplo, una opcin que puede resultar conveniente es la de activar la opcin Cuadrcula, que har aparecer una rejilla de puntos sobre el diseador, lo que nos ayudar a establecer la alineacin de los objetos. El Explorador de campos, que aparece por defecto a la izquierda del lienzo de diseo, nos presenta una vista de rbol desde la que podremos elegir cualquier elemento accesible a nuestro informe para arrastrarlo sobre la seccin adecuada en el rea de diseo. Por ejemplo, si despliega el nodo Campos de base de datos, encontrar la tabla Product con todos sus campos; por favor, seleccione el campo SellEndDate (fecha en que el producto se dej de vender) y arrstrelo sobre la seccin de Detalles del informe, justo a la derecha del campo Color. Si cambia a la Vista previa, ver que slo algunos productos tienen asociada una fecha de vencimiento. En caso de que un campo tenga asociado el valor nulo, simplemente no se mostrar nada en la posicin correspondiente.
Vista previa podr comprobar que el ttulo que hemos asignado al informe aparecer en el lugar elegido (puede que haya que guardar el informe previamente). Si lo que queremos es aadir al informe otro tipo de elemento visual (resumen, grfico, imagen, etc.), tendremos que utilizar el correspondiente asistente desde el men de Crystal Reports o la barra de herramientas Insertar. En cualquier caso, tambin se nos permitir indicar en qu seccin y posicin concreta queremos colocar el elemento. Por ejemplo, vamos insertar un resumen general en la seccin de Pie de informe que indique cuntos productos contiene el listado. Para ello tendremos que dar los siguientes pasos: Pulsar con el botn derecho del ratn sobre la seccin 4 (Pie del informe), y en el men de contexto de la seccin seleccionar No suprimir, para hacer que visible a esa seccin. Pulsar el botn Resumen de la barra de herramientas, que nos pedir que elijamos: El campo a resumir (puede ser cualquier campo, no necesariamente uno de los que se va a mostrar). En nuestro caso, un candidato ideal es el campo ProductNumber. El tipo de resumen deseado. En este caso nos interesa un Recuento (conteo), aunque tambin podra ser un Recuento distintivo, que producira exactamente el mismo resultado dado que el cdigo de producto es nico para cada producto. Ver que las opciones ms tpicas (Suma, Promedio, etc.) no estn disponibles en este caso, por tratarse de un campo alfanumrico. La posicin en la que se desea ubicar el resumen. Tratndose de un listado sencillo, sin grupos, la nica opcin disponible es la de colocar el valor resultante al final de todo, al pie del informe. En presencia de grupos, este asistente nos permitir tambin crear resmenes parciales por cada nivel de agrupacin. Al pulsar el botn Aceptar, el Diseador colocar un objeto de resumen configurado segn le hemos indicado en la seccin Pie del informe. Cambie a la Vista previa y vaya hasta la ltima pgina del informe, y ver el total reflejado en el sitio adecuado. Una vez que el objeto ha sido colocado sobre el lienzo de diseo, toca la labor de configurarlo para que responda a los requisitos de diseo del informe: En primer lugar, podemos seleccionar el objeto con el ratn y arrastrarlo hacia cualquier otro sitio, en la misma seccin o una seccin diferente. Tenga especial cuidado al cambiar un objeto de una seccin a otra su sentido comn le orientar correctamente en la mayora de los casos. Cuando un objeto est seleccionado, en sus cuatro costados aparecen las tpicas grapas que nos permiten redimensionarlo como queramos. La barra de herramientas Principal ofrece diferentes botones que nos permiten establecer los atributos del texto del objeto (fuente y tamao de letra, negrita, itlicas, etc.), la alineacin (izquierda, derecha, centrada), o el formato de presentacin para datos numricos. En el caso de los objetos de texto (por ejemplo, los que corresponden a las etiquetas en que se muestran los encabezados de columnas), haciendo doble clic sobre el objeto se activar el modo de edicin para que podamos modificar el texto a mostrar. Por ltimo, pulsando con el botn derecho del ratn sobre el objeto seleccionado obtendremos un men de contexto que incluye la opcin Dar formato a objeto. Esta opcin de men despliega un cuadro de dilogo de mltiples pestaas que nos permitir configurar todas y cada una de las propiedades del objeto. La mayora de las pestaas (Comn, Bordes, Fuente, Hipervnculo) son comunes a casi todos los objetos, y para ciertos tipos de objetos aparece una pestaa especial con sus caractersticas especficas. Por ejemplo, si seleccionamos el objeto que corresponde al campo SellEndDate, veremos una pestaa Fecha y hora donde podemos establecer el formato de visualizacin de los datos de esa columna, que es de tipo DateTime. Debido a que estamos utilizando la versin del Diseador de Crystal Reports integrada en Visual Studio, una alternativa al cuadro de dilogo anterior es utilizar la Ventana de Propiedades del entorno para establecer los valores de las propiedades. Dado que las propiedades tienen nombres en ingls, mientras
10
que el cuadro de dilogo est traducido al castellano (adems de mejor organizado), recomendamos utilizar ste ltimo.
Subinformes: Una tcnica bastante potente para componer informes complejos es la de insertar un informe ya creado dentro de otro. Veremos los subinformes en el tema 5. Objetos de texto: Los objetos de texto permiten mostrar una etiqueta de texto en cualquier seccin y posicin del informe, horizontal o verticalmente. Imgenes: Podemos incorporar a nuestros informes imgenes BMP, JPG o PNG con el logotipo de la empresa, fondos de marca de agua, etc. Lneas y cuadros: Por ltimo, tambin podemos utilizar objetos de lneas y cuadros para realzar los informes.
EL VISOR DE INFORMES
Si ha activado la pestaa de Vista previa para ver el resultado en pantalla de la ejecucin del informe, habr visto el informe presentado en un contenedor visual que se conoce como el Visor de informes para aplicaciones Windows (en realidad, una versin especializada del mismo). Crystal Reports ofrece igualmente otro visor basado en HTML y Javascript para su utilizacin en aplicaciones Web.
Visor de aplicaciones Windows de Crystal Reports El Visor de informes ofrece los siguientes controles en su barra de herramientas: El botn de Exportar, que permite exportar el resultado del informe a diferentes formatos como Microsoft Excel, Microsoft Word, texto enriquecido (.RTF) o Adobe PDF. El botn de Imprimir, que permite seleccionar una impresora y enviar a ella el informe para as obtener una copia en papel. El botn de rbol de grupos, que permite mostrar u ocultar el rbol de grupos, banda situada a la izquierda del visor (ahora vaca, puesto que nuestro informe inicial no tiene grupos). En un informe con grupos, en esta banda se situarn los nombres de los diferentes grupos existentes en el informe, en forma de hiperenlaces a la pgina del informe en la que comienzan los datos correspondientes a cada uno de los grupos. Por ejemplo, en un listado de clientes agrupados por pases, en el rbol de grupos aparecer cada uno de los nombres de los pases en los que hay clientes, y podramos saltar a ver los clientes de cada pas con un simple clic de ratn. Los botones de navegacin, que permiten desplazarse hacia delante y hacia atrs por las pginas del informe. Tenga en cuenta que la generacin de las pginas de un informe se produce dinmicamente, a medida que va siendo necesario; desplazarse a la ltima pgina del informe provocar que se generen todas y cada una de las pginas (que el motor de Crystal almacena en memoria para su posterior reutilizacin). Un cuadro de texto que nos muestra la pgina actual y tambin nos permite teclear un nmero para saltar a cualquier otra pgina. El botn de Detener carga, que slo est activo mientras se est cargando el informe, con el objetivo de que podamos cancelar la carga de datos si ya hemos visto lo que queramos ver o hemos detectado un error en el informe. El botn de Actualizar (refrescar) informe, que nos permitir regenerar el informe desde cero (por ejemplo, para obtener una versin ms actual del informe en caso de que los datos de la base de datos hayan cambiado). El cuadro de combinacin de Zoom, que nos permitir establecer la escala de visualizacin de las pginas del informe. Este Visor de informes es casi el mismo que vern los usuarios de nuestras aplicaciones Windows que incluyan informes Crystal Reports cuando ordenen la visualizacin de un informe; desde programa,
12
tendremos la posibilidad de ocultar aquellos botones que no tengan sentido o no queramos mostrar (por ejemplo, el botn de rbol de grupos en un listado sencillo que no tenga grupos).
Para lograr esto, haremos uso de otro de los asistentes de Crystal, el Asistente de base de datos (opcin Base de datos | Asistente de base de datos en el men de Crystal Reports). Se dar cuenta que este dilogo de propiedades ya lo ha visto antes: se trata del primer asistente integrado en el Asistente de informes general. Pues bien, debemos seleccionar nuestra tabla Production.ProductSubcategory en la vista de rbol de la izquierda (despliegue el nodo Conexiones actuales y ver nuestro servidor de base de datos y dentro de l, a la base de datos AdventureWorks) y aadirla a la vista de la derecha. Inmediatamente despus de que agregue la tabla de subcategoras al informe, aparecer en el cuadro de dilogo una segunda pestaa, Vnculos, que es donde debemos indicarle a Crystal cmo establecer la relacin entre las dos tablas. Siempre que un informe incluya ms de una tabla, Crystal nos obligar a establecer claramente cul es la relacin entre las mismas. Aunque el Diseador es capaz de proponernos vnculos en base a las relaciones entre las tablas, como podr observar que ocurre en este caso. En la pestaa Vnculos del asistente podemos establecer relaciones entre las tablas simplemente arrastrando con el ratn desde el campo de origen hacia el de destino. Pruebe a borrar el vnculo creado implcitamente (botn Borrar vnculos) y a volverlo a establecer. Una vez lo haya hecho, cierre el asistente pulsando Aceptar. Una vez que hayamos agregado la nueva tabla al informe, veremos que en el Explorador de campos estarn disponibles todos los campos de la tabla de subcategoras, y podremos arrastrar los campos de esa tabla sobre cualquier seccin del informe. Por ejemplo, para ver el nombre de la subcategora a la que pertenece cada producto, arrastraremos el campo Name de la tabla Production.Subcategory sobre la seccin de Detalles. Posteriormente habr que recolocar los objetos de esa seccin para mejorar el aspecto del informe. Si cambia a la Vista previa, ver que para cada producto se muestra su subcategora.
ORDENACIN Y AGRUPACIN
Si al examinar la vista preliminar del informe tiene la impresin de que los registros ya llegan ordenados por subcategoras, no se fe ello ha sido puramente coyuntural. En ningn momento hemos dicho que queremos obtener el listado ordenado por subcategoras, nombres de producto u otro criterio. De hecho, si examina la sentencia SQL que Crystal Reports enviar a la base de datos para recuperar la informacin necesaria (en el men de Crystal Reports, seleccione Base de datos | Mostrar consulta SQL) ver que sta tampoco incluye ninguna clusula ORDER BY. Para indicar los criterios de ordenacin, debemos utilizar el Asistente de ordenacin de registros, en la barra de herramientas Principal o en el men Report | Asistente de ordenacin de registros. Este asistente nos presenta un cuadro de dilogo en el que podemos establecer el criterio de ordenacin principal, as como otros secundarios, que slo entrarn en funcionamiento en caso de que el varios registros coincida en todos los campos anteriores. Por ejemplo, si queremos que nuestros productos aparezcan ordenados por categora, y dentro de cada categora, por nombre, debemos indicar ambos campos, en ese orden, al asistente. Observe que las categoras aparecern en orden alfabtico, dado que se trata de un campo alfanumrico. Hay que tener claro desde el primer momento que ordenar es un prerrequisito necesario para agrupar. Para Crystal Reports, un grupo es un conjunto de registros consecutivos que tienen el mismo valor del campo indicado. Si quitamos los criterios de ordenacin de registros que acabamos de establecer, y vez de ello insertamos un grupo por subcategoras, utilizando el botn correspondiente de la barra de herramientas Insertar (o la opcin Insertar | Grupo del men), y luego lanzamos de nuevo el Asistente de ordenacin de registros, veremos que el campo correspondiente habr sido agregado a la lista de criterios de ordenacin. Cuando se selecciona la opcin de Insertar grupo, se presenta un cuadro de dilogo en el que podemos indicar el campo por el que deseamos agrupar (en nuestro caso, ProductSubcategory.Name, si queremos los grupos en orden alfabtico) y si queremos un orden ascendente o descendente. La pestaa Opciones nos ofrece varias posibilidades adicionales, como la de indicar que deseamos mantener los registros de cada grupo juntos siempre que sea posible (cambiando de pgina para ello si fuera necesario) o repetir el encabezado del grupo en cada pgina al ejecutar el informe.
14
Observar que se crean dos nuevas secciones, de Encabezado y Pie de grupo, numeradas con #1 por tratarse del primer (y nico) grupo del informe. En la seccin de Encabezado de grupo, el Diseador coloca adems un objeto de nombre de grupo asociado al campo que hemos indicado como campo para agrupar. En la Vista previa podremos ver cmo luce ahora el informe; y cmo en principio podemos eliminar el nombre de subcategora (que se repite para cada producto del grupo) de la seccin de Detalles. Vamos a complicar ahora un poco ms el informe y crear un segundo grupo externo. Para ello, necesitaremos agregar al informe otra nueva tabla, Production.ProductCategory, pues las subcategoras pertenecen a su vez a categoras. El enlace esta vez se realiza a travs de la clave fornea ProductCategoryID de la tabla Subcategory. Una vez agregada la tabla al informe, crearemos un nuevo grupo utilizando como campo por el que agrupar al campo Name de la tabla de categoras. Esta vez lo ms conveniente es hacerlo utilizando el Asistente de grupos (en el men de Crystal Reports, seleccionamos Report | Asistente de grupos), pues queremos que este grupo quede a nivel externo, englobando al de subcategoras. Una vez creado el grupo, en la Vista previa podremos observar el resultado.
TOTALIZACIN (RESMENES)
Mediante el botn de Insertar resumen o la opcin correspondiente del men podremos aadir resmenes estadsticos generales (basados en la totalidad de los datos obtenidos de la base de datos, y normalmente mostrados en el Pie de informe) o parciales para cada uno de los grupos (que generalmente se colocan en el Pie de grupo correspondiente). Ya anteriormente hemos hecho un recuento general de los productos disponibles; vamos ahora a mostrar en el informe cuntos productos hay por cada categora y subcategora. Si pulsamos el botn de Insertar resumen, el Diseador nos preguntar, como antes, qu campo es el que queremos resumir (Product.ProductNumber), qu tipo de operacin queremos realizar (Recuento) y la ubicacin del resumen; observe que ahora, dado que tenemos dos grupos, el asistente nos propone tres posibles lugares donde colocar el resumen: en el Pie del informe (si quisiramos un total general, que ya tenemos), en el Pie del grupo externo (si quisiramos contar cuntos productos hay de cada categora) o en el Pie del grupo interno (si quisiramos contar cuntos productos hay en cada subcategora). Primero insertaremos un resumen a nivel de categoras (grupo externo); para mejorar la esttica del informe, pondremos a su izquierda un objeto de texto que diga Total categora. Observe tambin que tendremos que cambiar el formato del resultado, pues Crystal Reports por defecto muestra los campos numricos con dos cifras decimales (opcin que puede cambiarse en la configuracin general del Diseador, accesible desde la opcin del men Diseo | Especificaciones predeterminadas | Campos | Nmero). A continuacin, repetiremos la operacin de insertar resumen, pero ahora contabilizando la cantidad de productos por cada subcategora; para variar, mostraremos el resumen no como una cantidad absoluta, sino como un porcentaje relativo a la cantidad de productos en su categora (opcin Mostrar como porcentaje de). Tenga en cuenta que los resmenes de grupos normalmente se colocan en el pie del grupo, pero pueden tambin moverse a la seccin de Cabecera del grupo correspondiente; esto provocar una cierta sobrecarga al motor de impresin de Crystal Reports, que tendr que generar en memoria todos los datos del grupo antes comenzar a imprimirlo, pero este coste es generalmente asumible y poner los resmenes en la cabecera es muchas veces estticamente conveniente. Esto es lo que haremos con este ltimo resumen por subcategoras.
seccin muestra todas y cada una de las secciones (y subsecciones, posiblemente) de nuestro informe y nos permite establecer para cada una de ellas todo un conjunto de propiedades como: suprimir la seccin completamente. Por ejemplo, en nuestro informe la seccin de Pie de grupo del grupo interno ha quedado vaca y lo mejor es suprimirla. provocar un salto de pgina antes o despus de imprimir la seccin. ajustar la seccin a la parte inferior de la pgina (lo que implica que el contenido de la prxima seccin pasar a la pgina siguiente) reiniciar la numeracin de las pginas despus de imprimir la seccin. mantener unido todo el contenido de la seccin, aunque haya que cambiar de pgina para ello. suprimir la seccin en caso de que no contenga nada. hacer que el contenido de la seccin subyazca al de las siguientes secciones; ms adelante utilizaremos esta opcin para provocar un efecto de marca de agua en todas las pginas del informe. Por ltimo, queramos hacer especial nfasis en la opcin Ocultar (se permite profundizar), que nos parece especialmente importante. Tenga en cuenta que cada vez ms los informes no se destinan a ser presentados en papel, sino a ser consumidos de forma interactiva. Esta opcin, al igual que Suprimir, hace que una seccin no se muestre cuando se presente el informe; pero a diferencia de la anterior, permite que el usuario, haciendo clic con el ratn sobre un elemento de nivel superior (generalmente, un nombre de grupo o resumen), despliegue el contenido de esa seccin oculta en una vista independiente. Por ejemplo, marquemos con la opcin Ocultar (se permite profundizar) a la seccin de detalles de nuestro informe y veamos el efecto que se obtiene: a primera vista, el informe slo contiene los resmenes; pero si el usuario pulsa sobre cualquiera de los nombres de subcategoras, ver los productos pertenecientes a esa subcategora en una nueva pestaa del visor. Esto es a lo que se le llama profundizacin (drill down). Desde el Asistente de seccin tambin tenemos la posibilidad de insertar y eliminar (sub)secciones. El objetivo de la opcin Insertar de men, como hemos mencionado antes, es realmente el de que podamos dividir una seccin en subsecciones con el objetivo de aplicarles distintos valores de propiedades a cada subseccin. Veamos un ejemplo tpico. Supongamos que queremos poner el logotipo de nuestra empresa como marca de agua en el centro de todas las pginas del informe. Para ello, seguiremos los siguientes pasos: a) Dividiremos la seccin de Encabezado de pgina (que, como sabemos, se imprime en la parte superior de cada pgina del informe) en dos subsecciones. Para ello, seleccionamos la seccin de Encabezado de pgina y pulsamos el botn Insertar. Ver que la seccin se divide en dos subsecciones, denominadas a y b, y todo lo que hubiera en la seccin original es pasado a la subseccin a. b) Configuraremos la nueva subseccin b (y solo ella) para que subyazca al resto de las secciones (opcin Situar debajo de las secciones posteriores). c) Ya en el Diseador, ampliaremos por la vertical la subseccin b del encabezado y pondremos cerca del borde inferior el logotipo de nuestra empresa. Listo! Si activa la Vista previa, ver que el logotipo subyace perfectamente a todas las pginas del informe.
SELECCIN DE REGISTROS
El Asistente de seleccin de Crystal Reports permite establecer las condiciones que deben satisfacer los registros que han de ser utilizados para la confeccin del informe. Para nuestro informe actual, el asistente mostrar una nica pestaa asociada a la condicin de que el campo Product.FinishedGoodsFlag sea verdadero. A esa pestaa podremos agregar otras con nuevas condiciones, y Crystal Reports har que solo se utilicen los registros que satisfagan todas las condiciones especificadas (o sea, se aplicar la operacin lgica AND a todas las condiciones). A modo de ejemplo, vamos a limitar el conjunto de registros a aquellos productos que continan a la venta esos registros tendrn un valor nulo en el campo SellEndDate. Pulsemos el botn Nuevo para indicar una nueva
16
condicin de seleccin. Elijamos el campo Product.SellEndDate (de nuevo, observe que podramos seleccionar cualquier campo de cualquiera de las tablas implicadas en el informe). Para indicar que nos interesan los registros con valores no nulos en el campo tendremos que utilizar la ltima opcin de la lista desplegable que aparece en la pestaa: frmula. Y la frmula que deberemos teclear es IsNull ({Product.SellEndDate}). Si pulsamos el botn Mostrar frmula del asistente, veremos una frmula con todas las de la ley escrita en el lenguaje de frmulas de Crystal Reports (que estudiaremos en el tema 4). Se trata de un lenguaje de programacin completo, complementado adems con una enorme biblioteca de funciones para todas las necesidades comunes. En este lenguaje es que se escriben en ltima instancia las condiciones de seleccin de un informe. Nota avanzada: El Diseador de Crystal Reports determina, de manera inteligente, cundo es posible traducir una frmula de seleccin escrita en el lenguaje de Crystal en una clusula WHERE de SQL para pasarla al motor de bases de datos. Si incluye frmulas Crystal complejas en sus frmulas de seleccin, no ser posible traducirlas a SQL y el filtrado de registros deber hacerse en la mquina cliente, con el consiguiente incremento del trfico de red y prdida de rendimiento. Mediante la opcin Base de datos | Mostrar sentencia SQL del men de Crystal Reports podr comprobar que las dos condiciones que hemos puesto se traducen perfectamente a SQL.
incluye dos grupos. El grupo que nos interesa es el externo, que es el preseleccionado por defecto. En el desplegable Ordenar seleccionamos Todo, y entonces a su derecha aparecer la lista de los resmenes definidos a ese nivel, para que indiquemos el criterio segn el que queremos ordenar los grupos. En nuestro caso, habr solo un resumen, que seleccionaremos. Adicionalmente, se nos permite indicar si deseamos que los grupos aparezcan en orden ascendente o descendente (este ltimo, nuestro caso). Despus de pulsar Aceptar podremos ver el resultado en la vista preliminar. Hay que decir que este Asistente, adems de la ordenacin, tambin nos permite realizar una seleccin de grupos segn criterios que se utilizan con relativa frecuencia en la prctica y cuya especificacin mediante el Asistente de seleccin que hemos visto anteriormente requerira la programacin de frmulas de cierta complejidad. Si en lugar de elegir la opcin Todo en el desplegable Ordenar seleccionamos N superiores (N inferiores), estaramos indicando que deseamos incluir en el informe solo los N primeros (ltimos) grupos segn el resumen indicado, en orden descendente (ascendente) de los valores. Por otra parte, las opciones Porcentaje mximo y Porcentaje mnimo nos permiten limitar el informe a aquellos grupos cuyo porcentaje sobre el total general supera o no supera un cierto valor P. Tanto N como P pueden ser especificados segn nuestra conveniencia. Observe adems que existe la posibilidad de agrupar los elementos que los grupos que no superen la criba en un grupo comn, cuyo nombre por defecto es Otros.
GRFICOS.
Crystal Reports ofrece unas posibilidades muy amplias para la incorporacin de grficos comerciales en nuestros informes; aqu simplemente mostraremos un ejemplo tpico que le dar una idea de cmo pueden incorporarse a un informe tales grficos. Para poder incorporar un grfico a un informe, es necesario haber definido previamente los resmenes que servirn como valores a partir de los cuales se dibujar el grfico. Para incorporar un grfico a un informe, se debe utilizar la opcin Insertar | Grfico del men o el botn correspondiente de la barra de herramientas Insertar, que despliegan el Asistente de grficos. Este asistente tiene dos modos de trabajo que se configuran mediante la casilla Establecer opciones automticamente de su primera pestaa. Si la casilla est marcada, el asistente generar automticamente los ttulos para el grfico y los ejes, escalas, colores, etc. En caso contrario, tendremos la posibilidad de indicar todas esas caractersticas. Una buena tcnica puede ser mantener inicialmente la configuracin automtica, y ms adelante editar las opciones del grfico y pasar al modo manual para indicar esas opciones en detalle. Adems de esta opcin, en la primera pestaa se indica el tipo de grfico que deseamos incorporar al informe (de barras, lneas, reas, circular o tarta, etc.). Para nuestro ejemplo elegiremos un grfico de barras. En la segunda pestaa del asistente es donde se especifica lo fundamental: los datos a partir de los cuales se dibujar el grfico y la situacin del mismo. En nuestro caso, debido a que tenemos dos niveles de agrupacin, podemos basar el grfico en dos series de datos: la cantidad de productos por cada categora, en cuyo caso el grfico aparecer una sola vez en el pie o la cabecera del informe (recuerde que generalmente los objetos situados en una seccin de pie pueden moverse a su cabecera hermana); o la cantidad de productos por cada subcategora dentro de cada categora, en cuyo caso tendremos un grfico para cada categora, situado en la seccin de pie (o la cabecera) del grupo correspondiente a las categoras. Vamos a elegir aqu la opcin ms difcil, la segunda: indiquemos Por cada ProductCategory.Name en el desplegable Ubicar. Ver que en el grupo Datos aparecen automticamente la informacin adecuada: los valores a utilizar para el grfico se obtienen cuando cambia la subcategora (el grupo ms interno), y el resumen a utilizar es el nico disponible a ese nivel, el que cuenta la cantidad de productos de cada categora. Por ltimo, la tercera pestaa del asistente permite establecer los textos que aparecern en el grfico como ttulo, subttulo, nombres de ejes, etc. y sus propiedades. De momento, mantenga los valores
18
predeterminados y pulse Aceptar para cerrar el asistente. Ver cmo aparece en el informe un grfico de subcategoras para cada una de las categoras.
TOTALES ACUMULADOS
Un tipo de resumen muy comn y que tiene sus particularidades que lo distinguen de los dems resmenes son los totales acumulados. Los totales acumulados nos permiten implementar en nuestros informes los conocidos suma y sigue frecuentes, por ejemplo, en listados de operaciones bancarias. Suponga que deseamos listar los pedidos (cdigo, fecha, importe) recibidos a partir del 1/7/2004 (no hay datos muy recientes en AdvertureWorks :-) En una columna del listado queremos mostrar un suma y sigue con el total acumulado hasta ese momento del importe de los pedidos. Los datos generales sobre los pedidos se almacenan en la tabla Sales.SalesOrderHeader de la base de datos. Adems, en la tabla Sales.SalesOrderDetail se almacenan los detalles (lneas) de cada pedido, pero en este momento no necesitaremos esa segunda tabla. Ante todo, aadiremos a nuestro proyecto de Visual Studio un nuevo informe (botn derecho sobre el nodo del proyecto en el Explorador de soluciones | Agregar | Nuevo elemento | Crystal Reports). Llamemos al informe ListadoPedidos.rpt. Inmediatamente despus de indicar el nombre, el Asistente de informes aparecer automticamente para que especifiquemos las caractersticas del informe. Se trata de un informe estndar, y seleccionamos la base de datos AdventureWorks, y de ella la tabla Sales.SalesOrderHeader. Los campos que nos interesan son SalesOrderID, OrderDate y TotalDue. No necesitamos agrupaciones, por lo que saltamos directamente sobre esa pgina del Asistente. En la pgina de seleccin de registros, indicamos que nos interesan los pedidos en los que OrderDate es posterior al 1/7/2004. Pulsamos Finalizar y podremos ver la presentacin preliminar del informe. Ahora crearemos el total acumulado. Para ello, en el nodo Campos de totales acumulados del Explorador de campos pulsamos el botn derecho del ratn y seleccionamos Nuevo. Aparecer un cuadro de dilogo en el que se pueden indicar las caractersticas que queremos que tenga el total acumulado. Ante todo, se debe indicar el campo que se quiere acumular (en nuestro caso TotalDue) y la operacin de resumen (aqu suma). En la seccin Evaluar se indica en qu momento queremos que el acumulador se evale. En este caso dejaremos la opcin por defecto, evaluar para cada registro, pero observe que tambin es posible evaluar el total acumulado solo cuando cambie el valor de un campo, cuando se cambie de grupo, o cuando se cumpla una condicin cualquiera (expresada mediante una frmula). Por su parte, en la seccin Restablecer indicamos cundo queremos que el acumulador se reinicie a cero. Aunque tambin lo dejaremos ahora en Nunca, observe que se puede reiniciar el acumulador cada vez que se cambia de campo, de grupo o cuando se cumpla una frmula. Estudiaremos el lenguaje de frmulas de Crystal Reports en el siguiente tema. Y en principio, ya est! Basta con pulsar el botn
19
Finalizar y arrastrar el campo recin creado a la seccin de Detalles del informe (preferiblemente a la derecha del importe del pedido). Ver la suma parcial de los importes evaluada para cada registro. TRUCO: Frecuentemente en listados con este tipo de totales nos piden que pongamos el valor del total acumulado hasta el momento al pie de cada pgina. Para ello, seleccione el campo de total acumulado, cpielo al Portapapeles (CTRL-C) y luego pguelo (CTRL-V) en la seccin de Pie de pgina. Listo! Este es uno de los pocos casos en los que tiene sentido mover objetos de una seccin a otra que no sea su hermana.
FRMULAS
En este tema se presentan las frmulas de Crystal Reports y sus principales aplicaciones. Rpidamente se convencer de que las frmulas juegan un papel muy importe tanto en informes bsicos como en aplicaciones ms avanzadas.
INTRODUCCIN
Las frmulas son una caracterstica muy importante de Crystal Reports, que le dan la potencia necesaria para acometer numerosas tareas que de otras maneras seran imposibles y limitaran seriamente las posibilidades del producto. Bsicamente, una frmula es una expresin ms o menos compleja escrita en uno de los dos lenguajes de programacin que soporta Crystal Reports: Crystal y Visual Basic, y cuyo objetivo es calcular un valor que debe ser utilizado en alguna de las fases de confeccin de un informe. En este curso utilizaremos la sintaxis Visual Basic, que ser mucho ms familiar a los programadores que utilicen VB.NET. Para garantizar que las frmulas utilicen ese lenguaje, por favor vaya a la opcin Crystal Reports | Diseo | Especificaciones predeterminadas | Elaborando informes del men y selecciones Sintaxis Basic en el desplegable Lenguaje de frmulas. En general, los lenguajes de frmulas de Crystal Reports son lenguajes de programacin completos, que incluyen declaraciones de variables, condicionales, estructuras de bucle, etc. No obstante, gracias a los potentes asistentes incorporados al producto, rara vez es necesario hacer uso de tales facilidades y las frmulas se utilizan en el sentido literal del trmino el de una expresin que produce un valor de un determinado tipo.
contiene el nombre del cliente, y en un informe deseamos mostrar ese nombre en maysculas, podemos escribir la siguiente frmula: UCase({Clientes.Nombre}). Aunque pueda parecer necesaria una gran cantidad de tecleo, en realidad el programador no tiene que teclear casi nada para componer estas frmulas: a continuacin veremos cmo un potente editor nos ayuda con esta tarea. Hay que tener en cuenta siempre el tipo de datos del resultado que una frmula produce. En ciertas ocasiones una frmula puede producir un resultado de cualquier tipo que queramos, pero en otros casos Crystal Reports espera que le suministremos una frmula que produce un resultado de un tipo determinado y protestar si le suministramos una frmula que produce otra cosa, aunque sea sintcticamente correcta.
CAMPOS CALCULADOS
La aplicacin ms tpica de las frmulas son los campos calculados. Un campo calculado es un campo (de cualquier tipo de datos soportado por Crystal) que fsicamente no se almacena dentro de la base de datos, pero que puede ser calculado por Crystal a partir de los valores de otros campos del informe. Como ejemplo, supongamos que queremos determinar el tiempo que ha tardado cada pedido del ao 2004 en salir del almacn de la empresa de camino a su destinatario. En la tabla Sales.SalesOrderHeader no tenemos directamente ese dato, pero s tenemos los campos OrderDate (la fecha en que se hizo el pedido) y ShipDate (la fecha en que se hizo el envo). Podemos calcular el intervalo deseado restando ambas fechas, y para ello hace falta una frmula. En nuestro proyecto, seleccione el informe ListadoPedidos.rpt. En el Explorador de campos, pulse el botn derecho del ratn sobre el nodo Campos de frmula y seleccione Nueva. Ante todo, es necesario dar un nombre a la frmula: llammosle DasHastaSalida. Ver que para seguir adelante hay dos opciones: Usar Asistente o Usar Editor. Se trata de dos herramientas diferentes con un mismo propsito: ayudarnos a escribir las frmulas con un mnimo de tecleo y comprobacin de que la frmula es correcta. En este curso utilizaremos el Editor, que nos parece ms intuitivo, sin carecer de ninguna de las posibilidades. Al pulsar el botn Usar Editor, aparecer ante nosotros el Editor de frmulas. En el panel de la izquierda est un rbol con todas las frmulas del informe; podemos cerrarlo para hacer ms espacio para nuestra frmula actual. Ahora, la frmula se compone en la zona inferior del editor (donde ya aparece automticamente formula =). La zona superior se divide en tres paneles: el panel de Identificadores, desde el que podemos elegir los campos del informe o la base de datos, frmulas, totales acumulados, etc.; el panel de Funciones, en el que tenemos a nuestra disposicin la lista de todas las funciones predefinidas de Crystal (algo sumamente til) y el panel de Operadores, en el que podremos encontrar a todos los operadores del lenguaje. Para introducir nuestra frmula, buscamos en el panel de Identificadores el campo ShipDate de SalesOrderHeader (como el campo no est incluido directamente en el informe, debemos bajar a buscarlo en la lista general de todos los campos de la tabla) y hacemos doble clic sobre l ver que es copiado a la frmula con la sintaxis correcta: {SalesOrderHeader.ShipDate}. El operador - podramos elegirlo de un
21
modo similar, seleccionndolo en el nodo de operadores aritmticos; pero en este caso la ventaja no est tan clara, y probablemente sea mejor teclear el carcter. Por ltimo, seleccionamos del panel de Identificadores el segundo operando, OrderDate. La frmula final es: formula = {SalesOrderHeader.ShipDate} - {SalesOrderHeader.OrderDate} En cualquier momento podemos comprobar la validez de una frmula pulsando el botn Revisar. Una vez editada y validada la frmula, podemos guardarla y cerrar el editor mediante Guardar y cerrar. Y ya definida la formula, podemos arrastrarla al informe en este caso, a la seccin de Detalles. Por supuesto, tambin podramos definir resmenes basados en esa frmula, que se convierte en un campo ms del informe.
FORMATO CONDICIONAL
La aplicacin de las frmulas al formato condicional consiste en que, mediante una frmula, es posible programar las caractersticas visuales de cualquier campo o seccin del informe, o incluso que aparezca o no en l. Continuando con el mismo ejemplo, suponga que queremos resaltar aquellos pedidos que tardaron ms de 7 das en salir del almacn. Para ello, vamos a resaltar en color rojo los valores correspondientes. Seleccionamos la frmula, pulsamos el botn derecho del ratn y elegimos la opcin Dar formato al campo. En el dilogo que aparece, activamos la pestaa Fuente. Lo que deseamos es cambiar el color del texto, pero no incondicionalmente, sino sujeto a una condicin. Por eso, pulsamos el botn de frmula situado a la derecha del desplegable correspondiente al color de la fuente. Aparece el editor de frmulas, y en l debemos introducir la frmula que determinar el color del texto. En este caso, la frmula es: if {@DasHastaSalida} >= 5 then formula = crRed else formula = crBlack Las constantes crRed y crBlack , aparecen en el panel de Funciones cuando se est editando una frmula que deba producir un color, como es el caso. De un modo similar, podemos programar cualquiera de las caractersticas visuales de los campos del informe. En estos casos, la frmula que debemos utilizar tiene que producir un resultado del tipo adecuado. Como otro ejemplo, suponga que deseamos que cierto campo no aparezca en el informe (o sea, suprimirlo) en caso de que se cumpla una condicin. En tal caso, debemos utilizar la propiedad Suprimir (pestaa Comn) del Editor de formato. La frmula debe producir un resultado booleano, y cuando su valor sea True el campo se suprimir del informe. Por ltimo, el formato condicional se puede aplicar no solo a campos individuales, sino a secciones enteras. Por ejemplo, vamos a dar al listado de pedidos formato de pijama, haciendo que la seccin de Detalles tenga alternativamente fondo gris o blanco para cada fila del informe. Para ello, lance el Asistente de seccin y seleccione la seccin de Detalles. Active luego la pestaa Color y pulse sobre el botn de frmula asociado al desplegable de color de fondo. Introduzca la siguiente frmula: if RecordNumber mod 2 = 1 then formula = crSilver else formula = crWhite RecordNumber es otra funcin predeterminada de Crystal, que produce un nmero secuencial para cada registro del conjunto de datos (puede encontrarse bajo el nodo Estado de impresin).
GRUPOS PERSONALIZADOS
La siguiente aplicacin de las frmulas es la que tiene que ver con la seleccin de registros y grupos.
22
Como ya hemos presentado anteriormente, Crystal permite hacer una seleccin tanto de los registros individuales como de los grupos que se utilizarn al ejecutar el informe. El Asistente de seleccin nos permite especificar las condiciones que debern cumplir los registros o grupos en los casos de condiciones sencillas, y se encarga de generar automticamente las frmulas correspondientes. Pero cuando lo que queremos expresar va ms all de las posibilidades cubiertas por el asistente, es necesario pasar a la accin y escribir la frmula nosotros mismos. Para un ejemplo sencillo, suponga que deseamos que el listado de pedidos (adems de los pedidos a partir de julio del ao 2004) incluya solamente los pedidos recibidos a travs de Internet (aquellos para los que el campo SalesOrderHeader.OnlineOrderFlag es True). Simplemente lanzamos el Asistente de seleccin (Crystal Reports | Report | Asistente de seleccin o el botn correspondiente en la barra de herramientas Principal). Pulsamos el botn Nuevo para aadir una nueva condicin de seleccin. Y en el desplegable que aparece seleccionamos es Verdadero. Si ahora pulsamos el botn Mostrar frmula podremos ver la frmula correspondiente: {SalesOrderHeader.OrderDate} >= #1/7/2004# and {SalesOrderHeader.OnlineOrderFlag} Nota avanzada: Como hemos comentado anteriormente, es conveniente limitarse a frmulas de seleccin sencillas siempre que sea posible, pues Crystal Reports determina automticamente cundo es posible traducir una frmula de seleccin en una clusula WHERE de SQL para pasarla al motor de bases de datos, lo que redunda en una mayor eficiencia.
Use una frmula y pulse el botn de frmula correspondiente. Introduzca la frmula: formula = PreviousValue({SalesOrderHeader.OrderDate}) <> {SalesOrderHeader.OrderDate} La funcin predefinida PreviousValue nos da el valor del campo indicado en el registro anterior. Es muy til para detectar situaciones de cambios de grupo y otras situaciones similares, frecuentemente en combinacin con otras funciones como OnFirstRecord (que devuelve True si estamos situados en el primer registro).
PARMETROS
En este tema presentaremos los parmetros, que juegan un papel muy importante de cara a la programabilidad de los informes.
INTRODUCCIN
La inmensa mayora de los informes se disean para luego utilizarlos frecuentemente de manera peridica. Sin embargo, cada nueva ejecucin del informe necesitar pequeos ajustes derivado del cambio de los datos de entrada del informe. Si los parmetros no existieran, cada nueva ejecucin requerira una modificacin previa del informe en el Diseador un verdadero problema para la productividad. Los parmetros nos permiten precisamente definir informes adaptables, en los que los datos de entrada cambiantes se solicitan inmediatamente antes de la ejecucin. Continuando con nuestro listado de productos de ejemplo, supongamos que nos interesara poder ejecutar el informe para distintos valores de la fecha de inicio ahora mismo, el informe tiene clavado el valor #1/7/2004#. Pues bien, lo ideal hubiera sido haber definido un parmetro para esa fecha de inicio, cosa que mostraremos a continuacin.
24
Hay que sealar que (como veremos en el prximo tema) las libreras .NET de Crystal ofrecen la posibilidad de asignar desde programa valores a los parmetros, de modo que el cuadro de dilogo no aparezca en pantalla.
SUBINFORMES
Otra posibilidad muy interesante que ofrece Crystal Reports es la de anidar un informe dentro de otro, una caracterstica que comnmente se conoce como subinformes. Para incorporar un informe como subinforme dentro de otro, se utiliza el botn Insertar subinforme de la barra de herramientas Insertar (o la opcin correspondiente del men). Esta posibilidad puede utilizarse, por ejemplo, para concatenar un informe a continuacin de otro, insertndolo en una subseccin del pie de informe. Tal aplicacin es, en general, sumamente directa, y la nica opcin interesante es la de integrar el subinforme completo cuando se ejecuta el informe externo, o simplemente poner un hipervnculo para que el subinforme se ejecute bajo demanda (a peticin es el trmino que utiliza Crystal).
SUBINFORMES PARAMETRIZADOS
La aplicacin ms importante de los subinformes son los subinformes parametrizados. En ellos, un informe se integra como subinforme dentro de otro (normalmente en la seccin de Detalles de ste), y el informe externo (contenedor) comunica al interno a travs de un parmetro un valor que le indica a ste ltimo qu datos debe mostrar. Como ejemplo, supongamos que queremos mostrar los detalles de cada uno de los pedidos de nuestro listado de pedidos. Un posible enfoque podr ser el de integrar dentro de la seccin de Detalles del informe actual un subinforme que presente los detalles del pedido actual. Esta tcnica tiene la ventaja de que podramos indicar que el subinforme se ejecute bajo demanda, lo que reducira la carga sobre el motor de base de datos. Para empezar, inserte un subinforme en la seccin de detalles del listado de pedidos. Marque la casilla Subinforme a peticin. Indique que desea crear un nuevo subinforme con el Asistente; llame al nuevo subinforme DetallesPedido.rpt y pulse el botn Asistente de informes. Al disear el nuevo informe, indicaremos que la tabla deseada es Sales.SalesOrderDetail. Elegiremos varios campos, como ProductID (cdigo de producto en la vida real necesitaramos conectar con la tabla de productos para obtener el nombre), OrderQuantity (cantidad), UnitPrice (precio unitario), UnitPriceDiscount (descuento sobre precio unitario) y LineTotal (importe total de lnea). Pulse Finalizar para terminar el diseo del informe. Ser llevado nuevamente al dilogo de insercin de subinforme; es hora de pasar a la pestaa Vnculo para establecer la conexin entre el informe y el subinforme. En la pestaa Vnculo, debemos primero indicar el campo del informe contenedor cuyo valor se debe pasar al subinforme; es SalesOrderHeader.SalesOrderID, el cdigo del pedido. A continuacin, debemos indicar el campo del subinforme que recibir (a travs de un parmetro cuyo nombre propone el asistente) el cdigo del pedido cuyos detalles debe mostrar. En nuestro ejemplo, es SalesOrderID. Y solo nos queda pulsar el botn Aceptar. De la creacin del parmetro y el establecimiento de la frmula de seleccin adecuada en el informe recin creado se encarga el automticamente el asistente. La presentacin de la vista previa nos mostrar cmo funcionan los informes con subinformes bajo demanda: al pulsar sobre el hipervnculo asociado a un pedido, el subinforme con los detalles de dicho pedido se desplegar en una nueva pestaa del visor de informes.
TCNICAS FUNDAMENTALES
Las diferentes subsecciones de esta seccin presentan los fundamentos tericos y las tcnicas comunes que se utilizan en la incorporacin de informes Crystal a aplicaciones Windows Forms.
En segundo lugar, otra librera ofrece clases para la presentacin de informes en aplicaciones Windows Forms. Estas clases se almacenan en el ensamblado CrystalDecisions.Windows.Forms.dll y entre ellas destaca una en especfico CrystalReportViewer, que implementa el visor de informes Windows. En tercer lugar, otra librera ofrece clases para la presentacin de informes en aplicaciones Web ASP.NET. Estas clases se almacenan en el ensamblado CrystalDecisions.Web.dll y entre ellas destaca tambin una en especfico una que tambin se llama CrystalReportViewer, aunque su espacio de nombres es diferente, y que implementa el visor de informes para aplicaciones Web. Hablaremos ms sobre esta clase en el siguiente tema. Si busca los componentes de Crystal Reports instalados en el Cuadro de herramientas de Visual Studio, ver que actualmente (estamos trabajando en una aplicacin Windows) aparecen dos: ReportDocument y CrystalReportViewer. Un panorama similar se podr observar cuando trabajemos en una aplicacin Web, slo que entonces se tratar del otro visor de informes, el adecuado para aplicaciones Web. En general, cuando se habla del modelo de objetos de Crystal Reports, se hace referencia nicamente a las clases de la primera librera, cuyo uso es comn tanto a las aplicaciones Windows como a las aplicaciones Web. El modelo de objetos de Crystal contiene cientos de clases para representar con todos sus detalles a todos los diferentes elementos que componen un informe o participan de algn modo en l. Por ejemplo, incluye una clase ParameterField para representar las caractersticas de un parmetro, y la clase ReportDocument (que representa a un informe completo) ofrece una propiedad de tipo array ParameterFields() mediante la que podramos acceder a todos los parmetros de un informe.
pregunta si realmente deseamos un objeto no tipado o si preferimos crear una clase tipada asociada a alguno de los informes del proyecto.
Una de las caractersticas favoritas de los desarrolladores es la posibilidad de pasar directamente valores de parmetros a los informes de manera transparente. Ante todo, aadiremos dos parmetros a nuestro informe, correspondientes a la fecha de inicio y fecha de fin de los pedidos. O sea, no deseamos obtener todos los pedidos de la base de datos, sino solo los que estn entre las fechas de inicio y fin indicadas por los parmetros. Llamaremos a los parmetros FInicio y FFin, y haremos que la frmula de seleccin del informe sea: {SalesOrderHeader.OrderDate} in {?FInicio} to {?FFin} Observe la utilizacin de los operadores in..to (desde..hasta) por parte del Asistente. A continuacin, aadiremos las siguientes lneas de cdigo al evento Load del formulario: ' asignar valores a parmetros CrystalReport11.SetParameterValue("FInicio", New DateTime(2003, 9, 1)) CrystalReport11.SetParameterValue("FFin", New DateTime(2003, 9, 5)) Esto es suficiente para hacer que se muestren solamente los pedidos efectuados entre el 1 y el 5 de septiembre de 2003. El mtodo SetParameterValue de ReportDocument espera dos valores, el nombre del parmetro y el valor a asignar, respectivamente. El segundo parmetro es de tipo Object, dado que los parmetros pueden ser de distintos tipos. Hay que comprobar siempre que enviamos datos de los tipos correctos al informe.
IMPRESIN DE INFORMES
Para la impresin de un informe desde cdigo, de nuevo podemos utilizar un potente mtodo de la clase ReportDocument: PrintToPrinter(). Previamente, se debe utilizar la propiedad PrintOptions (una propiedad con poca ciencia y bastante miga, sobre la que no daremos muchos detalles aqu) para seleccionar la impresora activa y establecer mltiples opciones de impresin. Por ejemplo, para enviar a mi impresora predeterminada una copia de todas las pginas del informe, debo escribir: ' imprimir CrystalReport11.PrintOptions.PrinterName = "Dell Laser Printer 5210n" CrystalReport11.PrintToPrinter(1, False, 0, 0)
29
Los parmetros de PrintToPrinter significan: a) la cantidad de copias, b) si se deben combinar o no las copias en caso de ser ms de una, c) pgina de inicio, d) pgina de fin. Las pginas de inicio y fin se deben poner a cero si se desea obtener copias completas.
30
A la hora de presentar el informe en tiempo de ejecucin, es necesario utilizar el mtodo SetDataSource () de la clase ReportDocument para conectar el informe con el objeto concreto que almacena el conjunto de datos. Por ejemplo, CrystalReport21.SetDataSource(AdventureWorksDataSet) CrystalReport21.Refresh() ' elimina datos guardados por el informe CrystalReport21.Show()
DESPLIEGUE CRYSTAL
DE APLICACIONES
WINDOWS
Una vez terminado el desarrollo de una aplicacin, llega el momento del despliegue. Con ese objetivo, Visual Studio ofrece diferentes tipos de proyectos de instalacin que permiten empaquetar los ficheros que se deben copiar al equipo de destino, as como la secuencia de comandos que se deben ejecutar en ste para que la aplicacin quede lista para funcionar en la mquina de destino. En lo concerniente a Crystal Reports, para desplegar correctamente cualquier aplicacin .NET que utilice informes Crystal es necesario incluir en el programa de instalacin: las libreras .NET de Crystal Reports. los ficheros .RPT que sean externos a la aplicacin. Creemos un nuevo proyecto de instalacin para desplegar nuestra reciente aplicacin Ejemplo3. Para ello, lo primero es utilizar Archivo | Nuevo proyecto y seleccionar la plantilla Proyecto de instalacin debajo del nodo Otros tipos de proyectos | Instalacin e implementacin. Llamemos al proyecto Instalar3 y pulsamos Aceptar. Se presentar un editor especializado en el que debemos especificar qu ficheros, accesos directos, etc. queremos colocar en qu directorios del equipo de destino. Generalmente, el ejecutable y los ensamblados privados que componen la aplicacin se colocan en la carpeta de la aplicacin, y opcionalmente se colocan accesos directos al ejecutable en el men Programas o el escritorio del usuario. Ante todo, debemos seleccionar el nodo del proyecto en el Explorador de soluciones e introducir las propiedades bsicas del proyecto, sobre todo Manufacturer (fabricante) y Product Name (nombre del producto), que determinarn la carpeta de aplicacin por defecto (\[Archivos de programa]\[Fabricante] \[NombreProducto]). Para agregar archivos a la carpeta de la aplicacin, pulsamos el botn derecho sobre ella y seleccionamos la opcin Agregar. En este caso sencillo, utilizamos la opcin Archivo para aadir el nico archivo necesario, el ejecutable Ejemplo3.exe (el informe Crystal utilizado est como recurso incrustado). Ahora debemos seleccionar la opcin Proyecto | Propiedades del men de Visual Studio. La mayor parte de las opciones del dilogo que aparece son satisfactorias, pero s debemos pulsar el botn Requisitos previos, que nos permite indicar qu software debe incluirse en nuestro proyecto para instalarlo en la mquina de destino si no estuviera ya instalado. Adems de .NET Framework 2.0 (que ya deber estar marcado), debemos marcar la casilla correspondiente a Microsoft Data Access Components 2.8 (necesario para .NET) y la casilla de Crystal Reports para .NET Framework 2.0. Pulsamos Aceptar dos veces para cerrar los cuadros de dilogo, y ya casi est! Solo nos queda seleccionar la opcin Generar | Generar de Visual Studio para generar el proyecto de instalacin. El proyecto de instalacin siempre consiste de una jerarqua de carpetas con todos los recursos necesarios para la instalacin, empaquetados o no, segn las opciones que hayamos seleccionado. En cualquier caso, en el directorio raz siempre se incluye un fichero Setup.exe, que es el que debemos ejecutar en la mquina de destino para proceder a la instalacin de la aplicacin.
En este tema estudiaremos las particularidades relacionadas con la programacin de aplicaciones Web que utilicen Crystal Reports. Los mecanismos para la incorporacin de informes Crystal Reports en aplicaciones Web son muy similares a los que ya hemos visto para las aplicaciones de escritorio. Casi todos los recursos de programacin que hemos visto anteriormente (conexin a la base de datos, aplicacin de parmetros, utilizacin de un DataSet como origen del informe) son igualmente aplicables para el desarrollo de aplicaciones Web. Las principales diferencias tienen que ver no con el modelo de programacin (como veremos, en el fondo se utiliza la misma clase ReportDocument), sino con las caractersticas relacionadas con la visualizacin, dado que las aplicaciones Web se ejecutan en un navegador como Internet Explorer. El despliegue tambin es muy similar bsicamente se trata de hacer que las libreras .NET de Crystal caigan en su sitio cuando se ejecute el programa de instalacin.
TCNICAS FUNDAMENTALES
Las diferentes subsecciones de esta seccin presentan las tcnicas especficas que se utilizan al incorporar informes Crystal en aplicaciones Web ASP.NET.
ReportDocument. No se ve en la ventana de propiedades, porque es una propiedad de tiempo de ejecucin. Como su nombre indica, almacena una referencia al objeto ReportDocument que representa al informe tipado que ya hemos estudiado en las aplicaciones Windows. A este objeto podremos aplicarle todas las tcnicas que hemos estudiado anteriormente (conexin a la base de datos, aplicacin de parmetros, utilizacin de un DataSet como origen del informe).
Por ltimo, tenemos varias propiedades booleanas que determinan qu botones de la barra de herramientas deben aparecer o no: HasDrillUpButton mostrar o no el botn de Volver al informe anterior. HasExportButton mostrar o no el botn de Exportar. HasGotoPageButton mostrar o no el botn de Ir a pgina. HasPageNavigationButtons mostrar o no los botones de navegacin por las pginas. HasPrintButton mostrar o no el botn de Imprimir. HasRefreshButton mostrar o no el botn de Actualizar. HasSearchButton mostrar o no el botn de Buscar texto. HasToggleGroupTreeButton mostrar o no el botn de Mostrar rbol de grupos. HasZoomFactorList mostrar o no la lista de opciones de zoom.
incluyendo en nuestro caso los ficheros .rpt (que en las aplicaciones Web siempre se almacenan como ficheros externos).
35