Anexo Crystal Reports ANEXO CRYSTAL REPORTS Crystal Reports permite crear, administrar, distribuir y modificar el contenido de informes corporativos así como su generación dinámica desde un entorno J2EE mediante el componente Java Reporting Component (JRC). Siendo posiblemente el más potente y más utilizado diseñador de informes, no se pretende dar alcance en este documento a una descripción de sus funcionalidades, si bien, si destacar que en su última versión (Crystal Reports XI), trae un avance tecnológico significativo, con la posibilidad de crear informes de manera mas fácil, y con mantenimiento simplificado, además de una completa integración con la plataforma BusinessObjects XI. Las ventajas que incorpora son las siguientes, (véase crxi_WhatsNew_es.pdf): Report Publishing Wizard: Permite la publicación fácil de informes y otros contenidos en la web. Esta característica suministra una guía paso a paso para configurar y subir contenido - incluyendo Crystal Reports, Crystal Analysis, Microsoft Office, PDF, y archivos de texto—a la web. Zero-client User Interface: Provee a los usuarios finales acceso instantáneo y seguro a informes corporativos a través de la web con una sola URL. Report Scheduler: Ajuste de informes para generarse a horas específicas o basados en eventos específicos. También se puede programar informes para que se generen en formatos específicos como XLS, PDF, y RTF. Interactive report viewers: Aprovechamiento del la interactividad avanzada de los informes en la web: imprimir, exportar y profundizar en cuadros y otros objetos de los informes, y realizar búsquedas condicionales dentro de ellos. Los visores de ActiveX, DHTML, y Java están incluidos. Opciones de Seguridad: Asegura que las personas indicadas tengan acceso a la información correcta y en el tiempo correcto. Crystal Reports Server XI incluye opciones de seguridad robustas para usuarios, grupos y objetos. Lo que si se pretende es definir en este documento es una solución sencilla, una operativa de trabajo para evitar tener que modificar los informes cuando estos sean entregados y puestos en producción. Los orígenes de datos de los informes que se generen, deberán recuperarse del fichero de configuración de la aplicación, incorporándose estos al informe de manera dinámica. Seguidamente se hace referencia a direcciones donde poder obtener una versión del producto, manuales y ejemplos que ayuden a su utilización y como trabajar con el API java. Página del producto http://www.businessobjects.com/ Manuales y ejemplos de uso en entorno java http://www.businessobjects.com/products/dev_zone/java/default.asp?ref=devzone_main Manuales del diseñador de informes http://www.businessobjects.com/products/dev_zone/reporting/default.asp?ref=devzone_main Subdirección General de Desarrollo, Tecnología e Infraestructuras. Página: 1 Anexo Crystal Reports 1.1 Instalación y despliegue. Para poder utilizar dicho componente habrá que incluir en nuestra aplicación los ficheros jar con las librerías necesarias. Estos ficheros los podemos localizar tras la instalación en las siguientes rutas: Business Objects\3.0\java\lib Business Objects\3.0\java\lib\external. Es conveniente descargar las últimas actualizaciones de estas librerías de la página de Crystal Reports. Podemos encontrar dichas actualizaciones en el área de soporte de la página web de bussinesobjets. w La última actualización disponible cuando se realizó este documento puede descargarse desde la siguiente dirección: http://ftp1.businessobjects.com/outgoing/ehf/CE/XI/JRCpatch.zip. También hemos de copiar el directorio crystalreportviewers11 que se encuentra en Business Objects\3.0 dentro del directorio raíz de la aplicación. Una vez copiado debemos incluir las siguientes líneas en nuestro fichero web.xml: <context-param> <param-name>crystal_image_uri</param-name> <param-value>crystalreportviewers11</param-value> </context-param> Por último hemos de copiar el fichero Business Objects\3.0\java\CRconfig.xml dentro de nuestro directorio de fuentes java (en nuestro caso bajo /build/src/java). También copiaremos el tld (que se encuentra en Crystal Decisions\3.0\java\lib\taglib) a nuestro directorio de tlds (/WEB-INF/config/tld/) y configuraremos nuestro fichero web.xml si vamos a hacer uso de las taglibs. <taglib> <taglib-uri>/crystal-tags-reportviewer.tld</taglib-uri> <taglib-location>/WEB-INF/config/tld/crystal-tagsreportviewer.tld </taglib-location> </taglib> Adjunto a este documento de incluye un fichero crxi_Install_es.pdf en castellano con todas las recomendaciones para poder proceder a la correcta instalación y configuración de Crystal Report XI. Subdirección General de Desarrollo, Tecnología e Infraestructuras. Página: 2 Anexo Crystal Reports 1.2 Configuración de las fuentes de datos. Crystal Reports permite generar informes a partir de distintas fuentes de datos. Es habitual en la secuencia de desarrollo del software que la fuente de datos que alimenta nuestro informe cambie debido a la evolución de los entornos de desarrollo al de integración, certificación o producción. Sería poco efectivo y laborioso tener que editar todo el conjunto de plantillas de los informes para cambiar las fuentes de datos cada vez que cambiásemos de entorno. Así pues teniendo en cuenta que la fuente de datos usada a la hora de diseñar el informe será distinta a la fuente de datos que se usará en el entorno de producción se recomienda el uso de una conexión JDBC que modificaremos posteriormente en tiempo de ejecución valiéndonos de algún mecanismo como el que se propone seguidamente. Primero configuraremos el fichero CRconfig.xml tanto en la instalación de Crystal Reports como en la copia que hemos hecho en nuestra aplicación. Para ello configuraremos los datos de nuestra conexión JDBC y añadiremos el jar del driver JDBC en el Classpath. En este ejemplo vamos a configurar el acceso a una base de datos MySQL. Subdirección General de Desarrollo, Tecnología e Infraestructuras. Página: 3 Anexo Crystal Reports Ahora generaremos nuestro informe creando una nueva conexión de tipo JDBC. El asistente para el diseño del informe tomará los valores que hemos configurado en el fichero CRconfig.xml. Subdirección General de Desarrollo, Tecnología e Infraestructuras. Página: 4 Anexo Crystal Reports Ahora nuestro informe contiene la información necesaria para conectarse a nuestra BD pero necesitamos conectar con distintos servidores dependiendo del entorno de trabajo (desarrollo, integración, certificación, producción…) Para ello vamos a crear una clase OrigenDatos con un método estático que nos permita cambiar esta conexión en tiempo de ejecución. public static void cambiar(DatabaseController databaseController) throws ReportSDKException { /*En una aplicación real estos datos de conexión deberán obtenerse del fichero de configuración.*/ String TABLE_NAME_QUALIFIER = "testdb."; String DBUSERNAME = "root"; String DBPASSWORD = ""; String JDBCDRIVER = "org.gjt.mm.mysql.Driver"; String DATABASE_NAME = "testdb"; String SERVERNAME = "localhost/" + DATABASE_NAME; String URLJDBC = "jdbc:mysql://"+ SERVERNAME; String URI = “!"+JDBCDRIVER+"!"+URLJDBC+"!ServerType=29!QuoteChar=`"; String CONNECTION_STRING = "Use JDBC=b(true);ConnectionURL=s("+URLJDBC+");"+ "Database Class Name=s("+JDBCDRIVER+");" + "JNDI Datasource Name=s();Server=s("+SERVERNAME+");"+ "User ID=s("+DBUSERNAME+");Password="+DBPASSWORD+";"+ "JDBC Connection String=s("+URI+");"+ "Generic JDBC Driver Behavior=s(No)"; String DATABASE_DLL = "crdb_jdbc.dll"; /*Creamos un objeto de propiedades para el informe.*/ PropertyBag propertyBag = new PropertyBag(); propertyBag.put("Trusted_Connection", "false"); propertyBag.put("Server Name", SERVERNAME); propertyBag.put("Connection String", CONNECTION_STRING); Subdirección General de Desarrollo, Tecnología e Infraestructuras. Página: 5 Anexo Crystal Reports propertyBag.put("Database Name", DATABASE_NAME); propertyBag.put("Server Type", "JDBC (JNDI)"); propertyBag.put("URI", URI); propertyBag.put("Use JDBC", "true"); propertyBag.put("Database DLL", DATABASE_DLL); /*Recorremos las tablas usadas en nuestro informe y les cambiamos los datos de conexión.*/ Tables tables = databaseController.getDatabase().getTables(); for (int i = 0; i < tables.size(); i++) { ITable table = tables.getTable(i); table.setName(table.getName()); table.setAlias(table.getAlias()); table.setQualifiedName(TABLE_NAME_QUALIFIER + table.getName()); IConnectionInfo connectionInfo = table.getConnectionInfo(); connectionInfo.setAttributes(propertyBag); connectionInfo.setUserName(DBUSERNAME); connectionInfo.setPassword(DBPASSWORD); connectionInfo.setKind(ConnectionInfoKind.SQL); table.setConnectionInfo(connectionInfo); databaseController.setTableLocation(table, tables.getTable(i)); } } Ahora podremos usar este método estático para cambiar la conexión a base de datos de nuestro informe. Subdirección General de Desarrollo, Tecnología e Infraestructuras. Página: 6 Anexo Crystal Reports 1.3 Visualización del informe en nuestra aplicación Tras estos pasos de configuración podemos generar y visualizar informes Crystal Reports desde nuestra aplicación J2EE. Para ello crearemos nuestro informe como se especifica en el punto anterior y copiaremos el fichero .rpt en nuestra aplicación J2EE (bajo el directorio WEB-INF/config/data). Ahora podemos construir las páginas JSP que se encargarán de leer el fichero .rpt y visualizar el resultado. Este fragmento de código muestra dichas operaciones: /*Leemos el fichero rpt.*/ ReportClientDocument oReportClientDocument = new ReportClientDocument(); oReportClientDocument.open(reportName, 0); IReportSource reportSource = oReportClientDocument.getReportSource(); /*Cambiamos los datos de conexión.*/ OrigenDatos.cambiar(oReportClientDocument.getDatabaseController()); /*Inicializamos el visualizador de informes.*/ CrystalReportViewer oCrystalReportViewer = new CrystalReportViewer(); oCrystalReportViewer.setReportSource(reportSource); oCrystalReportViewer.setOwnPage(true); oCrystalReportViewer.setOwnForm(true); oCrystalReportViewer.setHasPrintButton(false); oCrystalReportViewer.setHasExportButton(false); oCrystalReportViewer.refresh(); /*Mostramos el informe.*/ oCrystalReportViewer.processHttpRequest(request, response, getServletConfig().getServletContext(), out); oCrystalReportViewer.dispose(); oCrystalReportViewer=null; Acción de Struts (ej: VerInforme.do?nombreInforme=Informe.rpt) Cargar en Memoria Informe.rpt JSP Cambiar origen de datos del informe Instanciamos el visor de crystal reports Crystal Report VIewer Datos Informe Subdirección General de Desarrollo, Tecnología e Infraestructuras. Base de Datos Página: 7