Lo que debo saber sobre Crystal Reports y VB .NET Contenido Introducción Creando un reporte desde cero Crystal y Windows Applications Crystal y Web Applications Crystal y Web Services Funcionalidades del CrystalReportView en tiempo de ejecución Conclusión Introducción Crystal Reports es el generador de reporte por excelencia de Visual Basic desde versiones anteriores a .NET. Esta no es la primera vez que se distribuye una versión de este generador de reporte junto a una versión de Visual Studio; en la versión 4 de Visual Basic se incluía una versión de Crystal Reports, aunque no tan integrada como la versión .NET. Cristal es un producto creado en su esencia orientado al usuario final; es decir que un ejecutivo pueda crear sus propios informes sin necesidad de asistencia de un desarrollador. En este articulo pretendo cubrir los aspectos básicos de Crystal Report y explicar los puntos que necesite cualquier desarrollador (este artículo estará orientado a desarrolladores o aspirantes a desarrollador) para iniciarse en el desarrollo de reportes con Crystal y VB .NET. Crystal Report no es la única herramienta para generar reportes que se puede utilizar con Visual Studio .NET; existen otras entre las que podemos mencionar: Active Reports de Data Dynamics SQL Reporting Services Microsoft Offices Automation, entre otros. Al igual que desde el ambiente de desarrollo de Visual Studio, también podemos crear nuestros reportes desde el ambiente de desarrollo de Crystal Reports y luego ejecutarlo desde nuestro proyecto VB .NET. Los Reportes desarrollados bajo el ambiente de Crystal Reports pueden ser compilados a .EXE para poder ser ejecutados stand-alone. Entre las características principales que debemos conocer en Crystal Reports para poder crear una buena solución de reportes están los fields, que son los componentes que nos permiten mostrar información sobre el ambiente de desarrollo, y se clasifican en: Formula Fields: Son campos cuyo valor puede ser obtenido de fórmulas de cálculo y/o operaciones sobre otros campos. Summary Fields: Son campos que se utilizan para acumular y/o promediar valores según las operaciones que se deseen; entre las operaciones que soportan los Summary Fields están: Count, Sum, Avg, discount, etc. Parameters Fields: Son campos que se utilizan para enviarles valores al reporte desde una aplicación o entrada del usuario. SQL Expresión Fields: Son campos que se utilizan para ejecutar funciones propias del motor de base de datos que se esté utilizando. Group Name Fields: Son campos que se utilizan para agrupar la salida del reporte. Running Total Fields: Son similares a los Summary Fields, pero estos pueden ser condicionados. Special Fields: Son un conjunto de campos preestablecidos que se utilizan en los reportes, tales como: número de página, total de páginas, fecha de impresión, etc. Crystal también posee su propio conjunto de sentencias y funciones para producir información (o sea su propio lenguaje de funciones) y también comparte las sentencias de VB 6. Creando un reporte desde cero Creamos un nuevo proyecto en Visual Studio .NET; seleccionamos “File \ New \ Project”; seleccionamos “Windows Application” y lo nombramos “CrystalWinApp” (Ver Figura 1): Figura 1. Volver al texto. Los componentes necesarios para manejar los reportes de Crystal son los siguientes: CrystalReportViewer: Este componente es la interfaz que utiliza la aplicación para desplegar los reportes; se coloca sobre un Windows o Web Form. Este está localizado en el toolbox en el tab de Windows Forms (o Web Forms, si es un proyecto web). ReportDocument: Este componente es utilizado para comunicarnos con el archivo .RPT generado por Crystal Reports; mediante este componente podemos modificar algunas características del reporte en tiempo de ejecución. Una vez creado el proyecto agregamos un nuevo ítem: en el menú Project, seleccionamos Add New Item … (Ver Figura 2): Figura 2. Volver al texto. Seleccionamos la plantilla de Crystal Reports, luego se abre la ventana “Crystal Reports Gallery” (Ver Figura 3): Figura 3. Volver al texto. En la parte superior tenemos 3 opciones: Using the Report Expert: Esta opción es una especie de Wizard que nos guía paso a paso durante la creación del reporte. As a Blank Report: Esta opción despliega la interfaz de desarrollo de reportes en blanco para que creemos nuestro reporte sin asistencia (ésta es la parte para expertos). From as Existing Report: Esta opción nos permite crear un reporte a partir de otro ya existente; al seleccionar esta opción nos pide la localización del archivo .RPT que queremos utilizar, y crea una copia de este reporte. En la parte media tenemos 2 cuadros, el de la izquierda nos presenta los diferentes tipos de reportes que podemos crear (esta opción solo estará disponible si seleccionamos la primera opción de la parte superior (Using the Report Expert); a continuación describo cada uno de ellos: Standard: Este se utiliza para crear reportes tipos listas, máster/detalle y/o cualquier otro reporte común; ésta es la opción más utilizada. From Letter: Esta plantilla se utiliza para crear reportes tipo cartas donde tienes un documento con un texto estático y en algunas partes del documento que deben ser extraídas de la base de datos, un estilo de Mail Merge (para los que han manejado Microsoft Word, Word Star o algún procesador de palabra). Form: esta plantilla se utiliza para informes tipo formulario. Cross-Tab: Este es un estilo de reporte con valores cruzados. Subreport: Son similares a un reporte normal con la excepción de que éstos se incrustan dentro de los reportes con la finalidad de complementar o agregar información; son muy utilizados. Mail Label: Este se utiliza para generar etiquetas para cartas. Drill Down: Este es un estilo de reporte también muy utilizado; es similar a un máster/detalle, sólo que el detalle se presenta oculto y el usuario puede hacer doble clic sobre el máster y se despliega el detalle; a éste también se le llama reporte interactivo. Seleccionamos “Standard”, damos clic sobre "OK". Luego se despliega la ventana de acceso a datos, presentando diferentes carpetas con diferentes tipos de fuentes de datos entre las que podemos citar (Ver Figura 4): Figura 4. Volver al texto. Project Data: en esta carpeta se despliegan las diferentes conexiones que se encuentren activas en el proyecto actual; despliega 2 sub carpetas, la primera es “ADO.NET DataSets”, donde se despliegan las diferentes estructuras de los DataSet que se encuentren en el proyecto; y la segunda despliega los diferentes objetos connection que se encuentren activos. OLE DB (ADO): Esta carpeta se utiliza para crear una conexión a una fuente de datos a través de OLE DB, Al hacer clic en esta ventana se despliega una ventana con una lista de todos los proveedores de acceso a datos instalados en tu máquina para que se seleccione el adecuado y sea configurado (de éste hablaremos más adelante, ya que es el que estaremos utilizando). ODBC: Esta carpeta se utiliza para crear una conexión a una fuente de datos a través de ODBC, este se utiliza cuando no contamos con un proveedor de acceso a datos de tipo OLEDB. Database file: Esta carpeta se utiliza para especificar proveedores de acceso a datos que son almacenados como archivos (*.MDB, *.DBF, *.XLS, etc.), al seleccionar esta opción se abrirá la ventana para que seleccionemos el archivo y según el tipo se desplegará el cuadro de diálogo correspondiente para su configuración. Favorito, History: Estas carpetas se utilizan de la siguiente forma: la primera para almacenar las conexiones más utilizadas por nosotros, y la segunda guarda automáticamente un histórico de las fuentes de datos que hemos utilizado. More Data Source: Esta carpeta se utiliza para acceder datos en formato XML, EXCEL. Damos clic sobre la carpeta OLE DB (ADO), se despliega la ventana de proveedores de acceso a datos por OLEDB que tengamos instalados en nuestra máquina (estos proveedores se instalan automáticamente cuando instalamos las base de datos, MDAC x.x y algunos ya los trae Windows agregados) (Ver Figura 5): Figura 5. Volver al texto. Seleccionamos Microsoft Jet 4.0 OLE DB Provider y damos clic sobre el botón "Next", luego se abre la ventana de configuración del proveedor que seleccionamos; esta ventana puede variar según el OLEDB Driver que hayamos seleccionado (Ver Figura 6): Figura 6. Volver al texto. Damos clic sobre el pequeño botón que está a la derecha del primer TextBox, se abre la ventana de diálogo Abrir; buscamos la base de datos NorthWind.mdb (esta base de datos viene con Microsoft Office). Damos clic en el botón "Finish" y se despliega bajo la carpeta OLE DB (ADO) de la ventana de acceso a datos, una conexión indicando la ruta de la base de datos y 2 grupos: “Tables” y “Views”; en el grupo Tables están todas la tablas que contiene esta base de datos; y en el grupo Views, las vistas que están contenidas en la base de datos. De aquí seleccionamos las tablas que utilizaremos para extraer la información que se presentará en el reporte; damos clic en el signo más (+) que tiene el grupo a la izquierda y buscamos la tabla “Categories”; damos clic sobre esta tabla y luego sobre el botón “Insert Table” y la tabla se despliega en el cuadro de la derecha; esto nos indica que esta tabla estará incluida en nuestro reporte; luego buscamos la tabla “Products” y damos clic en el botón "Insert Table" otra vez, luego damos clic en "Next". Ahora se desplegará la ventana de relación entre tablas; aquí las tablas que seleccionamos en el punto anterior son representadas por pequeños cuadros con los nombres de los campos dentro; también se desplegará una línea delgada entre las tablas, indicando la relación que existe entre ellas; esta relación la establece Cristal Reports automáticamente tomando como parámetro el nombre de los campos (Ver Figura 7): Figura 7. Volver al texto. Aquí podemos cambiar las relaciones; si quisiéramos agregar nuevas relaciones (tan sólo debemos arrastrar el campo que queramos relacionar desde una tabla hasta la otra y soltarla sobre el campo de la segunda tabla que será relacionado), cambiar el tipo de relación (Inner, Outer, Left Outer, Right Outer), pero en este caso, no hacemos cambios. Damos clic sobre el botón "Next". Luego se despliega la ventana de selección de campos: aquí seleccionamos los campos que queramos que se desplieguen en nuestro reporte; en el cuadro izquierdo están las tablas desde donde podemos seleccionar los campos, y en el cuadro derecho los campos que ya seleccionamos (Ver Figura 8): Figura 8. Volver al texto. Ahora, damos doble clic sobre el campo CategoryName de la tabla Cateogries; éste se despliega en el recuadro de la derecha; hacemos lo mismo para los campos “ProductName, UnitPrice, UnitsInStock” de la tabla Products. Ahora vamos a necesitar un campo que nos presente el precio del total en almacén de cada producto; para eso agregamos un Campo Formula (Formula Fields): damos clic sobre el botón "Formula", nos desplegará un pequeño cuadro pidiéndonos el nombre del campo fórmula; escribimos TotalPrice; damos clic en el botón "OK", y se desplegará la ventana de edición de fórmulas (Ver Figura 9): Figura 9. Volver al texto. Esta presenta 3 cuadros de izquierda a derecha: el primero nos muestra los campos de nuestro reporte que ya seleccionamos anteriormente, también nos muestra la conexión que creamos y las tablas que seleccionamos; el segundo cuadro nos muestra una lista de todas funciones que Cristal Reports soporta agrupadas por el tipo de datos sobre el que actúan; y el tercero nos muestra una lista de los operadores aritméticos, lógicos, de conversión, etc., agrupados también por el tipo de datos sobre el que actúan. Nuestro campo fórmula sólo consistirá en multiplicar el campo UnitPrice por el campo UnitsInStock; damos doble clic sobre el campo UnitPrice en el primer cuadro, éste se agrega al cuadro inferior; luego colocamos el cursor al final del campo y digitamos un asterisco (o sea, el signo de multiplicar para las computadoras); luego damos doble clic sobre el campo UnitsInStock en el primer cuadro y listo, damos clic en el botón "Salvar", y luego clic en el botón "Cerrar" de la ventana (a la derecha en la parte superior), retornaremos a la ventana anterior. Nuestro campo fórmula se despliega en el cuadro de la izquierda junto con los demás campos del reporte; damos clic sobre el cuadro de la derecha sobre el campo “Products.UnitsInStock” y luego damos doble clic sobre nuestro campo formula “@TotalPrice” y éste se despliega en la ventana de la derecha debajo del campo UnitsInStock. Damos clic en el botón "Next". Ahora se despliega la ventana de grupos, aquí podemos especificar por cuáles campos queremos que se agrupe nuestra información; por cada campo que seleccionemos aquí se creará un grupo en nuestro reporte; damos doble clic sobre el campo “Categories.CategoryName” (Ver Figura 10): Figura 10. Volver al texto. Damos clic en el botón "Next". Ahora se despliega la ventana de totales; aquí indicamos los campos que deseemos totalizar. Podremos especificar totales por cada uno de los grupos que hayamos especificados en la ventana anterior (como en nuestro ejemplo sólo seleccionamos un campo, “Categories.CategoryName”, podremos especificar totales para este grupo) (Ver Figura 11): Figura 11. Volver al texto. Automáticamente, Cristal Reports agrega los campos numéricos en el cuadro de la derecha para totalizar; en nuestro ejemplo no tiene caso totalizar el precio y las Unidades en Almacén, pero sí el Total (nuestro campo fórmula TotalPrice), así que damos clic sobre los campos del cuadro de la derecha que no deseamos totalizar y damos clic sobre el botón “Remove”. Debajo del cuadro de la derecha hay un Combobox que dice “Summary Type”: el Summary Type es la operación matemática que queremos aplicar sobre este campo (en este caso sum para sumar todos sus valores). El checkbox que dice “Percentage of” se utiliza para especificar que el total se presentará como un porcentaje de algún otro total y el checkbox al final “Add Grand Totals” se utiliza para indicarle que además de los totales por grupo queremos un Gran Total que sume todos los totales de los grupos. Damos clic en el botón "Next". Aquí se despliega la ventana Orden, donde podemos especificar el orden en que se presentarán los grupos; dejamos todo como está en esta pantalla. Damos clic en el botón "Next". Aquí se despliega la ventana de gráficos estadísticos; aquí podemos seleccionar el tipo de gráfico estadístico que queramos presentar en nuestro reporte. En la parte izquierda están los diferentes tipos de gráficos, y en la derecha los estilos de gráficos por cada tipo; estos gráficos se configuran automáticamente tomando los valores de los reportes, pero si se desea se pueden configurar manualmente; solo hay que desmarcar el checkbox que dice “automatically set chart options” (Ver Figura 12): Figura 12. Volver al texto. Aquí seleccionamos el tipo Pastel (pie) y a la derecha seleccionamos el estilo 3D. Damos clic en el botón "Next". Ahora se despliega la ventana de selección de datos: aquí podemos especificar un criterio de selección de datos fijo para que nuestro reporte sólo presente la información resultante de este filtro. Damos clic en el botón "Next". Y por último, para terminar con el diseño de nuestro reporte, la ventana de selección estilo: aquí se despliega una lista con los diferentes estilos de reportes que Crystal provee (Ver Figura 13): Figura 13. Volver al texto. En la parte izquierda se despliega la lista de los estilos de reportes disponibles, y en la parte de la derecha se presenta una vista preliminar del estilo que se seleccione; también podemos especificar el Título de Reporte en la parte superior. Como título digitamos “Listado de Productos por Categorías” y luego seleccionamos el estilo Executive, Leading Break y damos clic en el botón "Finish". Listo: nuestro reporte ya está diseñado. Visual Studio no cuenta con una herramienta para poder visualizar los reportes en Preview Mode, por eso para ver nuestro reporte corriendo necesitamos crear una aplicación que lo ejecute (ésta es la parte fácil). Luego de diseñar el reporte, éste se presenta en el ambiente de diseño de reporte donde podemos mover los campos y relocalizarlos a nuestro antojo. Crystal y Windows Applications Ahora les mostraré cómo abrir el reporte ya diseñado en una aplicación Windows. Abrimos la forma “Form1” que se creó al momento de crear nuestro proyecto para el reporte; luego arrastramos del ToolBox el componente “CrystalReportViewer” y lo dejamos caer sobre el formulario (Ver Figura 14): Figura 14. Volver al texto. Luego asignamos la propiedad “Dock” del control CrystalReportViewer a “Fill” (Ver Figura 15): Figura 15. Volver al texto. ... Y el control se ajusta al tamaño del formulario; luego seleccionamos la propiedad “ReportSource” del control y damos clic en la opción “Browse …”; esto nos permite seleccionar el archivo .RPT que se despliega en la pantalla (Ver Figura 16): Figura 16. Volver al texto. Seleccionamos el archivo CrystalReport1.vb que está en el carpeta donde estamos creando nuestro proyecto, y listo: ya podemos ejecutar nuestro reporte. Crystal y Web Application Primero creamos un proyecto nuevo, esta vez “ASP .NET Web Application”, y lo nombramos CrystalRWebApp; esta vez nuestro formulario o página web es “WebForm1.aspx”; damos clic derecho sobre el proyecto CrystalRWebApp y seleccionamos “Set as Startup Project”; luego damos clic derecho sobre la página WebForm1.aspx y seleccionamos “Set as Start page”. En el Toolbox en la pestaña “Web Forms” arrastramos el control CrystalReportViewer y lo soltamos en la página; esta vez se verá diferente ya que en proyectos web este control no tiene Interfaz de diseño (Ver Figura 17): Figura 17. Volver al texto. Una vez creado el proyecto agregamos un nuevo ítem; en el menú Project, seleccionamos Add New Item … (Ver Figura 18): Figura 18. Volver al texto. Seleccionamos la plantilla de Crystal Report, luego se abre la ventana “Crystal Report Gallery” (Ver Figura 19): Figura 19. Volver al texto. Ahora seleccionamos la opción “From an Existing Report”; esto crea una copia del reporte que ya creamos en la sección anterior para este proyecto. Se desplegará la ventana de diálogo Abrir y seleccionamos el reporte que creamos “CrystalReport1.rpt” (Ver Figura 20): Figura 20. Volver al texto. Luego damos clic derecho sobre la página y seleccionamos “View Code”, expandimos la región "Web Form Designer Generated Code" y en el método Page_Init después de la llamada a InitializeComponent agregamos el siguiente código: Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init 'CODEGEN: This method call is required by the Web Form Designer 'Do not modify it using the code editor. InitializeComponent() Dim CrRep As New CrystalReport1 CrystalReportViewer1.ReportSource = CrRep CrystalReportViewer1.DataBind() End Sub Aquí estamos instanciando el reporte que creamos, CrystalReport1, ya que Crystal también crea una clase con el mismo nombre del reporte para que podamos instanciarla y manipularla. Por ello, le estamos diciendo al control CrystalReportView1 que tome como fuente la instancia de nuestro reporte, y finalmente le indicamos que se ejecute el reporte. Listo, ya podemos ejecutar nuestro reporte. Crystal y Web Services Unos de los conceptos introducidos con el nacimiento de la tecnología .NET es el de Web Services (Servicios en la Web), los reportes creados en Crystal también pueden ser publicados y consumidos como Web services. Para los que no conocen el concepto de Web Services, esto se refiere a proveer alguna funcionalidad a través de la web para que pueda ser utilizada por otra aplicación. El clásico ejemplo es el de la tarjeta de crédito: cuando hacemos compras por Internet y pagamos con tarjeta de crédito, el sitio desde donde estamos realizando la transacción necesita validar nuestra tarjeta de crédito para determinar si es válida y claro, si tiene fondos disponibles para la transacción. Las instituciones bancarias propietarias de la tarjeta podrían publicar Web Services, el sitio sólo debe acceder al Web Service, enviarle los datos de nuestra tarjeta y el banco a través del mismo, nos devolverá la información que necesitamos, todo esto se hace a través de Web Services, compartiendo la información en forma XML (Extensible Market Language). Esto nos facilita las cosas ya que, no importa en qué lenguaje y/o plataforma estén diseñadas nuestras aplicaciones, si se accede la web y se maneja XML (que casi todos los lenguajes ya manejan este lenguaje) puede hacer uso de este servicio. Para esta prueba tomaremos el proyecto que creamos anteriormente, el Web Application. Abrimos el proyecto CrystalRWebApp, damos clic derecho sobre el archivo del reporte en el Solution Explorer, “CrystalReport1.rpt”, y seleccionamos “Publish as Web Service”. Luego damos clic derecho sobre el archivo “WebForm1.aspx” en el Solution Explorer, y seleccionamos “View Code”. Modificamos el método “Page_Init”: Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init 'CODEGEN: This method call is required by the Web Form Designer 'Do not modify it using the code editor. InitializeComponent() Dim CrRep As New CrystalReport1 CrystalReportViewer1.ReportSource = "http://localhost/CrystalRWebApp/CrystalReport1Service.asmx" CrystalReportViewer1.DataBind() End Sub Listo, podemos ejecutar nuevamente nuestro proyecto y el reporte se ejecutará igual. Funcionalidades del CrystalReportView en tiempo de ejecución La interfaz de ejecución que nos brindan Crystal y Visual Studio, es bastante amigable en cuanto a funciones para el usuario final; entre las funcionalidades más destacadas podemos mencionar: Interfaz Windows Ver Figura 21: Figura 21. Volver al texto. Esta es la barra de funcionamiento de la interfaz de ejecución de los reportes en ambiente Windows: aquí se pueden visualizar 12 botones que de izquierda a derecha, de acuerdo a su utilización, son los siguientes: Los 4 primeros son para moverse entre páginas del reporte, el 5º botón se utiliza para ir a una página a partir del número de la misma. Cuando se hace clic en este botón se despliega el dialogo “Goto Page” para especificar el número de la página que se desea desplegar (Ver Figura 22): Figura 22. Volver al texto. El 6º botón se utiliza para cerrar la interfaz de ejecución del programa, también se puede cerrar la ventana por el botón estándar de las ventanas de Windows. El 7º botón se utiliza para enviar el reporte a la impresora; cuando se presiona este botón se despliega el cuadro de diálogo “Imprimir” estándar de las aplicaciones Windows. El 8º botón se utiliza para refrescar la información que se está desplegando. El 9º botón se utiliza para exportar el reporte a cualquier otro formato; entre los formatos a los que se puede exportar un reporte se encuentran: Excel, Word, PDF, HTML, etc. Al hacer clic en este botón se despliega una ventana similar a la ventana de diálogo "Abrir" estándar de Windows, donde especificaremos el nombre del archivo a crear y el formato al cual deseamos exportar. El 10º botón se utiliza para ocultar o mostrar le ventana de grupos que se encuentra a la izquierda, donde se despliegan los nombres de los grupos por los cuales está agrupado el reporte; haciendo clic sobre cualquiera de estos nombres el focus se colocará sobre él en el reporte (Ver Figura 23): Figura 23. Volver al texto. El 11º botón se utiliza para ampliar o reducir la vista del reporte. El 12º botón se utiliza para localizar cualquier texto en el reporte; al hacer clic sobre éste se despliega el cuadro de diálogo donde digitaremos la palabra a localizar; si es localizada, el focus se coloca sobre la primera vez que aparezca (Ver Figura 24): Figura 24. Volver al texto. La interfaz web también cuenta con todas estas funcionalidades. Conclusión Crystal Reports es una herramienta para diseño de reportes creada mucho antes del nacimiento de la tecnología .NET; gracias a ésta una de las partes más tediosas e importantes del diseño de aplicaciones, que es el diseño de reportes, se nos hace más sencilla. Crystal Reports puede ser utilizado con diferentes bases de datos entre las que podemos mencionar: MS Access, SQL Server, Oracle, Informix, etc.; podemos diseñar reportes tanto desde el mismo ambiente de desarrollo de Visual Studio .NET como desde el ambiente de diseño de Crystal Reports; los reportes creados desde el ambiente de diseño de Crystal pueden ser compilados a .EXE para poder ser ejecutados, sin necesidad de crear un programa o interfaz para ello. Reportes en .NET con Crystal Reports Visual Studio .NET incluye Crystal Reports como un mecanismo "oficial" de creación de reportes. Crystal Reports es un producto muy desarrollado y complejo para la creación de reportes, y cuenta con una infinidad de opciones. En este artículo, nos vamos a concentrar en crear reportes relativamente sencillos, pero mostrando los detalles específicos de la versión .NET, tanto en aplicaciones WinForms como en aplicaciones WebForms (ASP.NET). Este artículo considera que usted ya posee alguna familiaridad con Visual Studio .NET y también con ADO.NET. Crear un reporte Independientemente de cómo se hará la presentación, el reporte se define en un archivo ".RPT", que forma parte de su proyecto. Ese archivo especifica el modo en que se hará la presentación del reporte, pero no incluye los datos propiamente dichos. Los datos se definirán en el tiempo de ejecución. Crystal Reports se basa en un concepto muy común de la definición de reportes: los reportes se componen de "secciones", y cada sección es un espacio horizontal en la página. Existen diversos tipos de secciones, por ejemplo: Encabezado del reporte, aparece en la primera página. Encabezado de página, aparece en la parte superior de todas las páginas. Detalle: lo más importante. En el tiempo de ejecución, se genera una de estas secciones para cada línea (registro) en la base de datos. Pie de página, aparece en la parte inferior de todas las páginas. Pie de reporte, aparece al final del reporte. En un principio, todos los reportes presentan estas cinco secciones. Otras secciones son opcionales, como por ejemplo: Encabezado de grupo, aparece antes de un grupo. Pie de grupo, aparece al final del grupo. Se podrá omitir una o más secciones, en caso de que no sean necesarias. Acceder a la base de datos Antes de crear el reporte, hay que decidir cuál será el mecanismo utilizado para acceder a la base de datos. Crystal Reports puede obtener datos de una infinidad de fuentes, pero una buena cantidad de ellas, como DAO, ADO y OLE/DB, no está "administrada", o sea, es código .NET "puro". En una aplicación .NET, probablemente sea deseable realizar el acceso a través de ADO.NET. Para ello, lo más fácil es definir un Conjunto de datos tipificado, aun antes de crear el reporte. Crear un proyecto Veamos cómo crear un reporte en un programa WinForms. Inicialmente, genere un proyecto en C# de tipo "Windows Application". Vamos a definir ahora el acceso a la base de datos. Como ejemplo, vamos a acceder a la base de datos "Northwind", que se encuentra como ejemplo en SQL Server. Siga la siguiente ruta: Agregue un componente de tipo SqlDataAdapter. Seleccione la conexión con la base Northwind. Introduzca el comando SQL "select * from Products order by CategoryID, ProductName" Haga clic con el botón alterno del mouse sobre el componente DataAdapter, seleccione "Create DataSet" y acepte el nombre sugerido ("DataSet1"). Ahora, agregaremos un reporte al proyecto. Haga clic en "Proyecto | Agregar elemento nuevo" y seleccione "Crystal Report": Acepte el nombre "CrystalReport1.rtp", al presionar Intro. Crystal Reports mostrará un asistente. Marque "Usar el Experto en reportes" y "Estándar": En este momento, cabe hacer algunos comentarios: El asistente puede ayudarle a crear diversos tipos de reportes, pero vamos a explorar solamente algunas posibilidades más sencillas. Puede probar después con otros tipos de reportes; Crystal Reports pedirá que realice el registro de su copia; mostramos el uso con una copia ya registrada. Presione "Aceptar" para pasar a la pantalla siguiente para la elección de la fuente de los datos. Seleccione la tabla "Productos" a partir del Conjunto de datos creado y haga clic en "Insertar tabla": Haga clic en "Siguiente" y seleccione las columnas que aparecerán en el reporte: Haga clic en "Siguiente" y defina un grupo haciendo clic en la columna "CategoryID" al lado izquierdo, y después en "Agregar": Las demás opciones no nos interesan en este reporte sencillo. Haga clic en "Finalizar", para crear el reporte: Observe lo siguiente: El reporte tiene siete secciones; las cinco obligatorias y dos más relativas al grupo. La sección "Encabezado del reporte" tiene la propiedad Suprimir con el valor verdadero, indicando que no aparecerá en el tiempo de ejecución. Puede editar cuantas veces quiera el reporte creado, al agregar componentes o modificar los que hayan sido colocados. Las secciones contienen componentes que se pueden obtener en dos lugares: Página "Crystal Reports" de la Caja de herramientas, si se trata de textos fijos, líneas y cajas. "Explorador de campos", en el caso de campos de la base de datos, fórmulas, totales, grupos y otros datos específicos del reporte, como fecha, hora y numeración de páginas. Presentar el reporte Una vez definido el reporte, hay que presentarlo al tiempo de ejecución. Para ello, coloque un componente "CrystalReportViewer" en el formato y seleccione la propiedad "Acoplar" para "Llenar". Sólo se necesita un componente "Visualizador", aun cuando se hayan creado diversos reportes en archivos RPT separados. Para producir el reporte, agregue un componente "Menú principal" y añada un elemento de menú para producir el reporte. Añada el siguiente código al evento Clic del botón: private void menuItem2_Click(object sender, System.EventArgs e) { // Ejecuta la consulta a la base dados sqlDataAdapter1.Fill(dataSet11); // Crea el reporte CrystalReport1 Rel = new CrystalReport1(); // Asocia el conjunto de datos con el reporte Rel.SetDataSource(dataSet11); // Asocia el reporte con el Visualizador crystalReportViewer1.ReportSource = Rel; } Una vez presentado, puede cambiar el tamaño en el botón "aumentar", ir a otra página o hacer clic del lado izquierdo para solicitar la presentación de algún grupo en particular: El usuario puede hacer clic en el botón con el icono de la impresora para imprimir el reporte. Presentar en el Web Para utilizar el reporte en un proyecto Web, cree un nuevo proyecto de tipo "Aplicación Web ASP.NET" y agregue un reporte exactamente como se mostró anteriormente. Añada al formato un componente CrystalReportsViewer de la página "WebForms" de la Caja de herramientas. Añada el siguiente código al evento Page_Load: private void Page_Load(object sender, System.EventArgs e) { // Ejecuta la consulta a la base de datos sqlDataAdapter1.Fill(dataSet11); // Crea el reporte CrystalReport1 Rel = new CrystalReport1(); // Asocia el conjunto de datos con el reporte Rel.SetDataSource(dataSet11); // Asocia el reporte con el Visualizador CrystalReportViewer1.ReportSource = Rel; } La página Web mostrada es la siguiente: Cabe señalar que la interfaz es similar a la del programa WinForms que se mostró anteriormente, lo que permite cambiar de página, de valor de grupo y de valor de aumento. Conclusión Crystal Reports permite crear y presentar fácilmente reportes tradicionales a partir de bases de datos relacionales. Ejemplo de creación de un informe sencillo con Crystal Reports .NET 2003 Este ejemplo muestra como crear un sencillo informe de una aplicación Windows con el Crystal Reports integrado en el Visual Studio .NET 2003 partiendo de una base de datos de Access. Este ejemplo no es muy técnico ni requiere conocimientos de bases de datos de ningún tipo simplemente siguiendo los pasos se puede crear un informe muy sencillo para nuestra aplicación Windows, para cosas mas complicadas esta igual no sería la mejor solución. Para crear informes con la versión integrada en el Visual Studio .NET 2003 hay que distinguir dos partes fundamentales por un lado el propio informe o archivo .rpt y por otro lado el visor o componente para visualizar informes incluido en .NET. Comenzaremos por crear el informe, para ello en el explorador de soluciones sobre el proyecto botón secundario -->Agregar --> Agregar nuevo elemento … Dentro del cuadro de diálogo que se nos abre escogemos Elementos de proyecto local --> Utilidad --> Crystal Report y en el nombre le pondremos el nombre que le queramos dar al informe, en este caso simplemente le llamaremos “Informe.rpt”. A continuación se nos abrirá el asistente para la creación de informes, en el cual dejaremos la opción por defecto que es Mediante el asistente de informes y dentro de estos el Estándar y le daremos a Aceptar. A continuación se nos abrirá el asistente para la creación de informes estándar donde iremos seleccionando las distintas opciones de nuestro informe. La primera opción que hemos de indicarle al asistente es el origen de datos que pueden ser distintas opciones desde una base de datos de sql Server, un archivo XML, un DataSet del proyecto, etc. en nuestro caso utilizaremos una base de datos de ACCESS para simplificar el ejemplo, escogemos entonces Archivos de base de datos pulsando sobre el símbolo + a la izquierda de la carpeta se nos abrirá el cuadro de diálogo para establecer manualmente el archivo “.mdb”. Una vez seleccionado se nos mostraran las tablas de nuestra base de datos, haciendo doble clic en cada una de las tablas las agregamos al informe, no tienen por que ser todas sino simplemente las que nos interesen. Una vez seleccionadas las tablas pulsamos sobre Siguiente para continuar con el asistente. En la siguiente ventana nos muestra los vínculos o relaciones que establece automáticamente entre las tablas, estos vínculos los establece por el nombre, normalmente por lo cual si dos campos de tablas distintas se llaman igual establecerá una relación entre ellas, con lo cual aquí deberemos comprobar que las relaciones son las de nuestra base de datos y si no es así modificarlas a mano o simplemente borrar los vínculos que será lo que hagamos en este caso para simplificar el ejemplo. Cuando le demos a borrar vínculos nos saldrá una ventana de advertencia le daremos que si y a continuación le damos a Siguiente y nos saldrá una nueva advertencia a la cual le daremos Aceptar. En la nueva ventana del asistente que se nos abre escogeremos los campos de cada una de las tablas que queremos que sean mostrados en nuestro informe. Una vez llegados a este punto le daremos a Finalizar para terminar nuestro informe. Podemos seguir con el asistente para agrupar los datos por alguno de los campos, cambiar el estilo del informe y otras opciones que para este ejemplo no nos interesan. Una vez terminado el asistente nos aparecerá el informe en vista de diseño, el cual podremos retocar, cambiando el tipo de letra, tamaños, colocación de los campos etc. a nuestro gusto teniendo en cuenta varias cosas: el encabezado del informe sale solamente al principio del mismo, el encabezado de página sale al principio de cada página al igual que el pie de página y finalmente el pie de informe sale al final. Podemos añadir campos especiales como por ejemplo fecha de impresión, hora de impresión etc. escogiéndolos dentro del Explorador de Campos, si no tiene esta ventana la puede mostrar escogiendo Ver --> Otras ventanas --> Esquema del documento. Una vez arreglado a gusto tendremos listo el informe, que presentará una apariencia similar al realizado para este ejemplo. Tenemos así lista la primera de las dos partes necesarias para generar informes en .NET. Ahora crearemos un formulario para mostrar el informe realizado con lo cual al igual que anteriormente en el explorador de soluciones sobre el proyecto botón secundario --> Agregar --> Agregar Windows Form … le ponemos de nombre “VisorDeInformes.cs” en este caso por que lo realizaremos sobre C# pero podremos hacerlo sobre cualquiera de los lenguajes soportados por la plataforma. Una vez le demos a Abrir se nos abrirá el formulario en vista de diseño, ajustamos el tamaño a gusto y a continuación en el cuadro de herramientas, normalmente esta situado el último de los elementos, pulsamos sobre CrystalReportsViewer y sin soltar arrastramos al formulario. Lo ajustamos al tamaño del formulario y lo tenemos listo para trabajar con el. Aquí seguir Una vez llegados a este punto solamente nos falta la parte de programación para que nuestro informe pueda ser visualizado. Existen muchas maneras de hacer lo que vamos a hacer ahora, asignar al visor el informe echo anteriormente y dentro de este escoger los datos que queremos que salgan en el informe, en este ejemplo lo haremos todo por código, pero ya digo que se podría hacer de muchas otras maneras. Para ello comenzaremos por el constructor del visor para ello con el formulario VisorDeInformes abierto vamos a Ver --> Código o bien en el Explorador de soluciones sobre el formulario botón secundario Ver Código. Una vez se nos habrá el código vamos al constructor que presentará esta apariencia: public VisorDeInformes() { // // Necesario para admitir el Diseñador de Windows Forms // InitializeComponent(); // // TODO: agregar código de constructor después de llamar a InitializeComponent // } En este punto aclararemos que aunque el informe este realizado en vista de diseño, por detrás .NET crea una clase con el mismo nombre dado al informe, la cual no podemos ver ni tocar, por lo menos yo no sé, pero que si podemos utilizar. Con lo cual lo que haremos ahora dentro del constructor declararemos e instanciaremos un objeto de la mencionada clase y le asignaremos ese informe al CrytalReportViewer como informe, quedando de la siguiente manera: public VisorDeInformes() { // // Necesario para admitir el Diseñador de Windows Forms // InitializeComponent(); Informe informe = new Informe(); crystalReportViewer1.ReportSource = informe; } Por último solamente nos falta seleccionar los datos que queremos mostrar en el informe es decir asignarle una especie de consulta select sql para filtrar los datos. Se hace mediante la propiedad “SelectionFormula” del CrytalReportViewer donde establecemos las condiciones que debe seguir el informe al ser mostrado, por ejemplo en este caso queremos que nos enseñe los datos especificados en el informe que tengan como paciente el indicado y como número de consulta también el indicado. Aquí es donde podemos pasarle parámetros a ese informe por ejemplo si queremos pasarle el código del paciente o de la consulta se la pasaremos como argumentos en el constructor, lo que se puede hacer es pasarle como parámetro una cadena la cual realizamos donde llamemos al VisorDeInformes para no depender del número de parámetros que le queremos pasar. Lo que se debe de cumplir es que el nombre del campo de la base de datos este entre corchetes. Quedando finalmente el constructor como sigue: public VisorDeInformes() { // // Necesario para admitir el Diseñador de Windows Forms // InitializeComponent(); Informe informe = new Informe(); crystalReportViewer1.ReportSource = informe; crystalReportViewer1.SelectionFormula = "{paciente.p_codigo} =" + codigoPaciente + " AND {consulta.c_codigo} =" + codigoConsulta; } Si lo hacemos con parámetros pasados como una cadena quedaría de la siguiente forma: public VisorDeInformes(string cadenaSelect) { // // Necesario para admitir el Diseñador de Windows Forms // InitializeComponent(); Informe informe = new Informe(); crystalReportViewer1.ReportSource = informe; crystalReportViewer1.SelectionFormula = cadenaSelect; } El valor de cadena podría ser por ejemplo: cadenaSelect = "{paciente.p_codigo}=11 AND {consulta.c_codigo}=21"; Y ya tenemos listos tanto el informe como el visor lo único que nos falta es mostrarlo para ello en donde queramos lo que debemos hacer es declarar e instanciar un VisorDeInformes por ejemplo en nuestra clase Principal en el evento Clic de un botón pondríamos: private void BInforme_Click(object sender, System.EventArgs e) { try { VisorDeInformes visor = new VisorDeInformes); visor.ShowDialog(this); } catch(Exception ex) { MessageBox.Show(ex.Message, “Excepcion”); } } Probamos y si todo ha salido bien nos debería de aparecer el visor con el informe y los datos seleccionados. Problemas conocidos: Si el path de la base de datos es muy grande, más de 255 caracteres se produce una excepción por buffer insuficiente. En el momento en que se cambie de sitio la base de datos, en este ejemplo el archivo de ACCESS, el informe no encontrara la misma y lanzará una excepción. Si se esta probando el proyecto en modo debug y pasamos a modo release para terminar la aplicación habrá que tener en cuenta este cambio en el path de la base de datos.