JasperReports, iReport y Subreportes

Francesc Ros és A lbiol Novie mbr e 2004 v. 1.0

INTRODUCCIÓN Y JUSTIFICACIÓN
Últimamente, han aparecido en los fórums de javaHispano diversas preguntas sobre un mismo tema: la incorporación de subreportes en JasperReports. Hasta la fecha, no he tenido que usar subreportes, pero siempre hay una primera vez y, finalmente, me he tenido que enfrentar a ello. Lo primero que hice fue buscar información al respecto y me topé con la cruda realidad: Hay poca o no me alcanza para lo que quiero hacer. En la documentación de JasperReports, y más concretamente en el documento Tutorial (http://jasperreports.sourceforge.net/tutorial/index.html), aparece un apartado que lleva por título “Subreports”, pero al acceder a él me encuentro con tres líneas y un aviso en rojo: Documentation pending.... Afortunadamente, en las demos de JasperReports aparece un ejemplo que proporciona varias ideas al respecto. Acto seguido, voy a ver qué hay en mi interficie gráfica favorita para la generación de reportes: iReport-Designer for JasperReports (http://ireport.sourceforge.net/). Allí encuentro más información al respecto. En el manual, sólo dice que iReport soporta subreportes, pero encuentro un par de tutoriales1 sobre el tema. El primero, How to create a subreport (http://ireport.sourceforge.net/subreport_tutorial.zip), de Shailesh Kadam, es del 2003 y lo encuentro un poco incongruente. Se basa en dos tablas, una de empleados y otra de direcciones, y nos dice que un empleado puede tener cero o más direcciones asociadas. La verdad es que no sé cómo asocia direcciones a un empleado, ya que no hay ningún campo que enlace ambas tablas ni tabla alguna que enlace empleados y direcciones. Además, si existiera el enlace, no haría falta el uso de subreportes para mostrar las direcciones asociadas a un empleado. Un simple grupo nos resolvería el problema. El segundo es un vídeo creado por unos usuarios hawaianos (http://ireport.sourceforge.net/swf/Subreport_viewlet_swf.htm) y parece más reciente. Una vez más, nos encontramos con un ejemplo basado en una relación maestro-detalle: disponemos de una tabla de países y otra de estados o provincias de cada país. El tutorial muestra la mecánica bastante bien, pero el ejemplo, a mi entender, no es del todo bueno porque puede resolverse usando grupos. El objetivo de este tutorial es, pues, intentar cubrir la falta de documentación sobre el uso de subreportes en JasperReports. No pretendo en ningún momento que este tutorial se convierta en un tutorial de JasperReports ni de iReport. Doy por supuesto que el lector conoce el funcionamiento de ambos productos y que sólo desea profundizar en el uso de subreportes. Tampoco quiero cubrir todas las posibilidades de los subreportes. Me centraré en un ejemplo
1 Parece ser que la Real Academia de la Lengua Española todavía no acepta la palabra tutorial (-es). Sin embargo, yo la uso porque entiendo que un tutorial es un subtipo de manual y no hallo otra palabra en castellano que pueda usar.

1 de 18

pues. Como la descripción de una imagen nunca le hace justicia. La inscripción en un curso supone el pago de una matrícula inicial y una serie de mensualidades. ESCENARIO Nuestro escenario va a ser un proceso de matrícula a una serie de cursos. Una persona se matricula a uno o más cursos y debe saber qué le va a costar en total. Para ello. hemos diseñado una base de datos con la siguiente estructura: Figura 1: Esquema de tablas El significado de la mayor parte de las columnas de las tablas se puede deducir fácilmente de su nombre. Comento. las columnas que la forman: Colu mna ID NOMBRE MATRICULA MENSUALIDAD Com entario Es la clave primaria.concreto que. el total de mensualidades a pagar y el importe total de mensualidades. Curso 1.) Contiene los precios de las matrículas de los distintos cursos Contiene los precios de cada una de las mensualidades a pagar por cada curso MENSUALIDADES Contiene el número de mensualidades a pagar por cada curso Tabla 1: Descripción de la tabla Cursos Obsérvese que el informe que deseamos no se corresponde con el típico maestro-detalle. Quizá la tabla menos clara sea la de Cursos. veamos. Nuestro informe debe generar una simulación de la factura de la matrícula y.e. sirva de inspiración al lector para usar subreportes. El primero nos va a mostrar los datos de la persona. El segundo nos va a mostrar cuánto va a tener que pagar al mes por cada uno de los cursos matriculados. creo y deseo. y los gastos detallados que va a tener que pagar en concepto de matrículas. en este caso sólo nombre y apellidos. pues. En realidad estamos hablando de dos informes en uno. Curso 2. etc. además. durante cuántos meses y el importe total por curso. qué es lo que realmente queremos obtener en nuestro informe: 2 de 18 . mostrar el precio de cada mensualidad. Un entero autoincrementado Contiene los nombres de los cursos (p.

Información sobre las mensualidades Las partes 1.Figura 2: Aspecto del informe final Nuestro reporte tiene cuatro partes diferenciadas: 1. mensualidades. llamaremos reporte maestro a aquél que contiene algún otro reporte. Lo más frecuente. y 3 configuran el reporte maestro y la 4. más o menos complejo. No hay diferencia entre un reporte y un subreporte. Se diseña de la misma manera que un reporte cualquiera. en el ámbito informático. y a los reportes 3 de 18 . Información sobre la matrícula 4. Este concepto es importante. Información sobre la persona: “ARAGÓN LÓPEZ. 2. En este tutorial. ya que nos indica que no hay que hacer nada especial para diseñar un subreporte. de datos que pueden proceder de diversas fuentes. Pedro” 3. es que los datos procedan de una base de datos. es el subreport. Todo reporte pasa a convertirse en subreporte en cuanto forma parte de otro reporte. Un título: “Presupuesto de cursos” 2. REPORTES Y SUBREPORTES Un reporte es un informe resultado del proceso.

no hay diferencia entre reporte y subreporte ya que ambos son reportes. Definir los enlaces entre el reporte maestro y el subreporte Después de llevar a cabo los puntos 1 y 2 debemos ser capaces de visualizar por separado reporte y subreporte usando iReport. los llamaremos subreportes. Nuestra estrategia es sencilla: 1.que forman parte del maestro. Diseñar el reporte maestro un elemento vacío de subreporte 2. el grueso de este tutorial se centrará en cómo establecer el enlace entre el reporte maestro y el subreporte. Así pues. ESTRATEGIA DISEÑO Como he comentado más arriba. La siguiente imagen muestra el resultado de la visualización de nuestro reporte maestro antes de ligarlo al subreporte: Figura 3: Vista previa del reporte maestro Y la que sigue nos muestra la visualización del subreporte por separado: 4 de 18 . sin embargo para conseguir el informe que deseamos. Diseñar el subreporte como un reporte más 3. hemos de enlazarlos.

5 de 18 . El tutorial incluye los fuentes de los reportes y de la clase Java que los muestra. CURSOS C.ID AND PC.APELLIDOS. extenderme demasiado en la descripción de los diseños del reporte y subreporte. éste sepa de qué persona debe obtener los datos.MATRICULA FROM PERSONAS P. P.ID = $P{PERSONA_ID} AND PC.NOMBRE AS CURSO. así que sólo comentaré los puntos más significativos. Dicha columna contiene el nombre del curso.ID_PERSONA = P.NOMBRE de la tabla CURSO. que a la columna C. le asignamos el alias CURSO. no puede ser referenciado en la consulta. Obsérvese.ID Obsérvese que para identificar a la persona sobre la que queremos realizar el reporte usamos un parámetro: $P{PERSONA_ID}. C. ya que si no existe.jasperreports.ID.sf. Campos Los campos se generan a partir de la consulta SQL. P. como ya he comentado. también.Figura 4: Vista previa del subreporte DISEÑO DE REPORTE MAESTRO Y SUBREPORTE No es mi intención.NOMBRE AS NOMBRE. Re porte maestro Consulta El reporte maestro nos muestra la información existente en nuestra base de datos sobre la matrícula de una persona en concreto.JasperReport para que en el momento de llenado del reporte.2 Este parámetro deberá ser pasado por nuestro programa a la instancia de net. Para obtener dicha información.engine. PERSONA_CURSOS PC WHERE P. La siguiente tabla presenta una descripción 2 Es conveniente crear el parámetro PERSONA_ID antes de crear la consulta. C. usamos la siguiente consulta SQL: SELECT P.ID_CURSO = C.

resultado de sumar los valores de la variable MATR_SUBTOT para cada registro El texto estático “MENSUALIDADES” El elemento SUBREPORT La fecha y el número de página • Group Header • • • • • Detail • • • • Group Footer • • • • • • Page Footer • Estructura: Grupo Como nuestro reporte hace referencia a una sola persona. “Base Imponible”. no tiene mucho sentido crear un grupo ya que sólo podemos agrupar a nuestra persona con ella misma.16 La variable MATR_SUBTOT. resultado de sumar el campo MATRICULA a la variable IVA El texto estático “TOTAL MATRÍCULAS” La variable MATR_TOTAL_IVA. Este campo será invisible. que se usa como dato de corte para el grupo. resultado de sumar los valores de la variable IVA para cada registro La variable MATR_TOTAL. “IVA 16%” y “Total” Los campos de texto asociados a los campos CURSO y MATRICULA La variable IVA.somera de los mismos: Cam po APELLIDOS CURSO ID MATRICULA NOMBRE Los apellidos de la persona El nombre del curso El identificador único de la persona El precio de la matrícula del curso El nombre de la persona Descripción Tabla 2: Descripción de los campos Estructura: Bandas Trabajamos con cuatro de las bandas que nos ofrece JasperReports: • Title • Título del reporte: “Presupuesto de cursos” El texto estático “MATRÍCULA” El campo ID. La variable PERSONA: resultado de la concatenación de los campos APELLIDOS y NOMBRE. 6 de 18 . pasando los apellidos a mayúsculas y separándolos del nombre por una coma Los textos estáticos “Concepto”. resultado de multiplicar el campo MATRICULA por 0.

El resultado sería que dicha banda nos presentaría los resultados al final de la página y quedaría poco estético. C. $P{PERSONA_ID} para identificar a la persona. sino que lo tomará directamente del reporte maestro. nos conviene crearlo desde el punto de vista de la facilidad de presentación. Sólo usaremos dos: • Column Header • Los textos estáticos “Concepto”. Si no lo tuviéramos. C. deberíamos emplear la banda Column Footer para presentar los totales de matrícula y el subreporte de mensualidades. como veremos más adelante.MENSUALIDADES FROM PERSONAS P.ID_CURSO = C. MENSUALIDAD y • Detail • 3 Es muy posible que esto no sea así y que haya alguna manera de evitar el efecto no deseado de la Column Footer. 7 de 18 . también aquí usamos un parámetro.4 A diferencia de éste. 4 Como como hemos visto en la descripción el reporte maestro. aquí también es conveniente crear el parámetro PERSONA_ID antes de definir la consulta. tanto los totales de matrícula como el subreporte.MENSUALIDAD. pero yo la desconozco y creo que es poco relevante para el objetivo principal de este artículo.3 Para evitar este efecto no deseado. el valor del parámetro no se lo proporcionará nuestro programa.NOMBRE AS CURSO. “Mensualidad”.ID AND PC. a nuestra conveniencia. usaremos la siguiente consulta SQL: SELECT C. Sub reporte Consulta El subreporte nos presentará información sobre las mensualidades que una persona en concreto deberá pagar por cada uno de los cursos matriculados. “Mensualidades” y “Total” Los campos de texto asociados a los campos CURSO. PERSONA_CURSOS PC WHERE P. he optado por usar un grupo.ID Como en la consulta del reporte maestro.ID_PERSONA = P. CURSOS C. Los grupos proporcionan la banda Group Footer interesante para nuestro ejemplo porque nos permite ubicar en ella.Sin embargo. Campos La siguiente tabla describe someramente los campos que se desprenden de la consulta SQL del subreporte: Cam po CURSO MENSUALIDAD MENSUALIDADES Nombre del curso Importe de cada mensualidad de un curso Número de mensualidades a abonar Descrip ción Tabla 3: Campos a partir de la consulta SQL Estructura: bandas La estructura de bandas en el subreporte es mucho más sencilla que en el reporte.ID = $P{PERSONA_ID} AND PC. Para obtener dicha información.

jasperreports.sf. Simplemente hay que pulsar el botón de Subreport tool de la barra de herramientas y después arrastrar el ratón en la banda que nos interese hasta conseguir el tamaño deseado para nuestro subreporte. Nuestro programa creará una instancia de java.Map que contendrá la información necesaria para que el reporte maestro cargue el subreporte. pues.MENSUALIDADES • La variable SUBTOTAL_MENSUALIDADES. es definir en el reporte maestro un parámetro. ¿Quién es? ¿Dónde está? Lo primero que se nos ocurre es que necesita tenerlo para poderlo cargar en el espacio que le hemos reservado.util. Fijémonos en el detalle. Para ello. han optado por esta solución. La siguiente imagen muestra la parte de la barra de herramientas que incluye el botón de subreportes: Figura 5: Botón de inclusión de subreporte ENLACE REPORTE MAESTRO – SUBREPORTE Hemos visto hasta ahora cómo diseñar el reporte maestro y el subreporte y cómo reservar un espacio para éste en el reporte maestro. Pensemos en lo que necesitaría saber el reporte maestro para poder presentar el subreporte. Lo que haremos. pulsaremos el botón New para acceder al diálogo que nos permitirá definir nuestro parámetro. Sin embargo. En esta ventana. Una estrategia sería definir un parámetro de tipo String que nuestro programa rellenará con el path completo de nuestro reporte. de tipo net. Fijémonos que la manera más cómoda de pasárselo es mediante un parámetro. yo le veo un problema si lo que pretendo es que el subreporte forme parte del archivo jar que contendrá nuestra aplicación.engine. al que llamaremos SUBREPORT. En alguno de los ejemplos que he consultado. Éste no sabe absolutamente nada del subreporte que tiene que presentar. En realidad hemos reservado un espacio en el reporte maestro.JasperReport. La siguiente figura intenta sintetizar lo dicho hasta ahora: 8 de 18 . abriremos la vista de parámetros del menú View y accederemos a la ventana de definición de parámetros. resultado de multiplicar los valores del campo MENSUALIDAD por los del campo MENSUALIDADES Inclusión del subr eporte en iR eport La inclusión de un subreporte en un reporte usando iReport supone lo mismo que incluir un campo de texto o un texto estático.

9 de 18 .sql. ¿Cómo lo lleno? Claro que con saber qué reporte ocupará el espacio reservado para el subreporte no hay bastante. hay un desplegable. Es posible que éste no contenga el tipo que nos interesa: net.engine. Una vez entrados los datos del parámetro. Si es así.jasperreports. Hemos de establecer los mecanismos para que este subreporte se pueda llenar con los datos pertinentes. Desde nuestro programa Java solemos abrir una conexión con la base de datos que queda plasmada en un objeto de tipo java.JasperReport. Bien. comentaremos esta llamada con más detalle.jasperreports. nos conformamos con saber que nuestro reporte maestro dispone de una conexión a la base de datos que va a usar para ejecutar la consulta SQL que hemos comentado más arriba. pulsamos OK y ya lo tendremos definido.sf.sf.Connection. ya hemos establecido el mecanismo para que nuestro reporte maestro sepa qué tiene que poner en el espacio reservado para el subreporte. nuestra fuente de datos es una base de datos. pasándosela como parámetro al método fillReport() de la clase net. bajo el título Parameter class type.Figura 6: Definición del parámetro SUBREPORT Obsérvese que en la ventana de definición de parámetro. no hay problema ya que el desplegable es editable y lo podremos escribir. Como hemos visto. Más adelante.fillReport(masterReport. Para acceder a nuestra base de datos necesitamos una conexión con ella.JasperFillManager: JasperPrint masterPrint = JasperFillManager. Esta instancia es la que usamos para llenar nuestro reporte maestro de datos. De momento.engine. con). masterParams.

escribimos la expresión que nos va a llevar a la conexión deseada. seleccionamos el elemento Use connection expression ya que los vamos a obtener de una base de datos mediante una conexión. Para ello. A continuación. En nuestro caso. hemos visto que el reporte maestro tiene información suficiente para ejecutar su consulta y presentar sus datos. pero nos queda todavía entender cómo se las arreglará para que el subreporte haga lo propio ya que es el reporte maestro quien lanza el llenado del subreporte.Subreport Bajo el título Connection / Datasource expression. que hemos incluido en el reporte maestro. llegado a este punto. El parámetro existe. vemos una lista desplegable. Curiosamente. para acceder a sus propiedades y seleccionamos la segunda pestaña (Subreport): Figura 7: Propiedades del subreporte . Bien. Es decir. Lo primero que hay que indicar es el método utilizado por el subreporte para acceder a los datos. nuestro reporte maestro le va a pasar a nuestro subreporte la conexión referenciada en el parámetro REPORT_CONNECTION para que pueda ejecutar su consulta SQL. De ella. pero hay que tenerlo muy presente. al formar éste parte de él. estará preguntándose el porqué de tanto preámbulo. podemos seleccionar el método que usará nuestro subreport para obtener los datos. 10 de 18 . iReport no muestra dicho parámetro en la ventana de definición de parámetros.Esta conexión está guardada en un parámetro interno de nuestro reporte maestro que JasperReports se encarga de crear para nosotros: REPORT_CONNECTION. Hasta el momento. el parámetro REPORT_CONNECTION comentado más arriba. hacemos doble clic en el elemento subreporte. es importante entender qué hace un reporte para poder acceder y presentar después los datos. El lector. En nuestro caso.

Allí le diremos que le vamos a proporcionar un objeto del tipo net. Por ejemplo.jasperreports.swing. seleccionaremos la tercera pestaña del diálogo de propiedades del subreporte (Subreport (Other)).JasperReport y que su referencia la puede encontrar en el parámetro SUBREPORT. La segunda. fuente de datos. si los datos de los que se nutre le son proporcionados por parámetros. “Usa una expresión de datasource”.JRTableModelDataSource que se basa en un un modelo de javax.sf. es útil si lo que le pasamos es un subreporte que no necesita ni de una fuente de datos ni de una conexión. Pues bien. observamos que nos ofrece dos posibilidades más: • • Don't use connection or datasource Use datasource expression La primera.data. como lo tiene que llenar. En este caso. “qué le pasamos” también hay que indicárselo. “no uses nada”. le pasamos un JasperReport que deberá obtener sus datos mediante una conexión a una base de datos y una consulta SQL.engine.JRDataSource como la clase net. definiríamos un parámetro de tipo JRTableModelDataSource que contuviera la referencia a la fuente de datos deseada.engine. se utilizaría en el caso de que el subreporte se llenara directamente a partir de una fuente de datos que implementase la interficie net. será conveniente pasarle una cosa u otra. Para ello.sf. nada). La siguiente imagen nos lo muestra: 11 de 18 .JTable.Volviendo a la lista desplegable.jasperreports. En nuestro caso. Acabamos de ver que dependiendo del método que nuestro subreporte use para obtener los datos (base de datos.engine.sf.jasperreports.

Se tiene que rellenar con los datos de la misma persona que el reporte maestro. no tuvieran el mismo nombre que el del reporte maestro o hubiera que realizar algún cálculo previo.. Recordemos que el reporte maestro tiene un parámetro llamado PERSONA_ID y que. al llamarse igual y ser del mismo tipo. etc. nuestro subreporte tiene otro con el mismo nombre y del mismo tipo. y para ser más exactos. En este caso. En ambos casos.. Si la cosa no fuera tan sencilla y tuviéramos que pasarle más parámetros o los parámetros del subreporte. en el apartado Subreport Parameters: 12 de 18 . etc.Subreport (Other) ¿Con quién me lleno? Bueno. los podríamos especificar en la tercera pestaña del diálogo de propiedades del subreporte. la misma de la que obtendrá datos el reporte maestro. el reporte maestro se lo pasará al subreporte de manera que éste sabrá que tiene que obtener los datos de una persona concreta. el valor del parámetro se utiliza para discriminar la persona sobre la que se va a realizar el reporte.Figura 8: Propiedades del subreporte . por ejemplo. esta es la pregunta existencial que nuestro subreporte se hace. curiosamente.

Describiré sólo las partes más relevantes del programa. Es decir. del path de la clase. El fuente del programa está disponible. Para referirme a ellos. a partir del path interno. estarán en el subdirectorio reports de mi archivo jar. Obtención de URL s de los archivos de reportes Lo primero que hago es conseguir la ubicación de los archivos previamente compilados de los reportes. pues. Este es el método habitual de cargar recursos y evita aquello tan pesado de “no encuentro el recurso” en cuanto sales del IDE. Simplemente le hemos indicado dónde los puede encontrar. veremos sólo el reporte maestro. ¡seguimos sin tener nada! Si intentamos visualizar el reporte maestro desde iReport. no veremos nada. escribiremos un pequeño programa en Java que nos acabará de llenar los huecos que iReport no puede. SubreportsSample t1 = new SubreportsSample(). En el espacio del subreporte. Estos archivos se encuentran en el subdirectorio reports de mi proyecto. Para ver el resultado final de nuestra obra de arte.getResource 13 de 18 . La aplicación iReport no sabe crear un objeto JaspeReport y pasárselo en un parámetro al reporte maestro. crearé sendas URLs usando el método getResource() de la clase Class. no le hemos pasado al reporte maestro todos los datos necesarios para que pueda mostrarnos el subreporte. URL urlMaestro = t1. La razón es simple.getClass(). La referencia será.EL PROGRAMA Una vez diseñados el reporte maestro y el subreporte por separado y cumplimentadas las especificaciones de localización y rellenado.

false. vamos a ver el resultado de nuestros esfuerzos. los toma del maestro. Con ellos el reporte maestro sabrá de qué persona tiene que obtener los datos (PERSONA_ID) y dispondrá del subreporte para llenar su hueco (SUBREPORT). En este caso. Cre ación de los obje tos JasperReport A continuación. subReport). convertido en HTML. URL urlSubreporte = t1. listo para ser visualizado. Parámet ros Hemos visto que sólo nuestro reporte maestro necesita parámetros ya que el subreporte. 14 de 18 . etc. sólo hay que rellenar el reporte maestro ya que el subreporte se llenará en cascada desde el maestro.jasper"). Vi sualización Por fin. new Integer(3)).getClass(). indica que la aplicación no debe cerrarse al cerrar la ventana de visualización. false). Creamos. JasperReport subReport = (JasperReport) JRLoader.util. Para ello. Ll enado Para que podamos ver el resultado.viewReport(masterPrint.jasper"). masterParams.Map y lo llenamos con los parámetros: Map masterParams = new HashMap(). usaremos el método estático viewReport() de la clase JasperViewer: JasperViewer.loadObject (urlMaestro). voy a crear los objetos JasperReport a partir de los reportes compilados: JasperReport masterReport = (JasperReport) JRLoader. pues un java.getResource ("/reports/TUTORIAL_SUBREPORTS_SUBREPORT. Para ello. El segundo parámetro de viewReport . masterParams.fillReport(masterReport. en PDF. con). tenemos que llenar con los datos nuestros reportes.put("PERSONA_ID". masterParams. lo prefiero así porque quiero cerrar la conexión con la base de datos después de visualizar el reporte. en este ejemplo.put("SUBREPORT".loadObject (urlSubreporte).("/reports/TUTORIAL_SUBREPORTS_MASTER. Obsérvese que aquí le pasamos todo lo necesario: • • • El reporte maestro: masterReport Los valores de los parámetros del reporte maestro: masterParams La conexión a la base de datos: con El resultado es un objeto JasperPrint. El siguiente código muestra cómo se llena: JasperPrint masterPrint = JasperFillManager.

es conveniente que dichos parámetros compartan el nombre y el tipo con los del reporte maestro (p. Definir la consulta SQL usando. PERSONA_CURSOS PC WHERE P. PERSONA_ID. si fuera necesario.ID = $P{PERSONA_ID} AND PC. 15 de 18 . si fuera necesario. Compilar y visualizar el reporte maestro6 verificando que el resultado sea el esperado.APELLIDOS.ID AND PC. 6 En la visualización no aparecerá el subreporte.ID_PERSONA = P. C. su diseño no difiere del de otros reportes. C.NOMBRE AS CURSO.ID. Este elemento reserva espacio para el reporte que actuará como subreporte. para identificar a una persona en concreto)5 2. si fuera necesario. Diseñar el subreporte: 1. Diseñar el reporte maestro: 1. llamado subreporte.MENSUALIDAD.RESUMEN Intentaré resumir aquí los principales conceptos y pasos a seguir necesarios para construir un subreporte. que nos permitan acotar nuestra consulta (p. Por ejemplo: SELECT C.e. P. CURSOS C. Definir uno o más parámetros. los parámetros del punto anterior. los parámetros del punto anterior. Por ejemplo: SELECT P. C.MATRICULA FROM PERSONAS P. que nos permitan acotar nuestra consulta. Definir la consulta SQL usando.MENSUALIDADES 5 Obsérvese que no es posible utilizar en la definición de la consulta parámetros que aún no se han definido. 2. Por lo tanto. Conceptos • Un subre port e no es otra cosa que un reporte. Definir uno o más parámetros.ID_CURSO = C. sin tener en cuenta el subreporte 2.NOMBRE AS CURSO. C. Diseñar como un reporte normal 1. si fuera necesario. Las propiedades del elemento subreporte permiten enlazar el reporte maestro con el subreporte de manera que el reporte maestro sepa localizarlo y pueda pasar la información necesaria al reporte que actúa como subreporte para que éste se pueda llenar con los datos pertinentes. Incluir un elemento de tipo subreporte en el diseño que reservará espacio para que se muestre el reporte que actuará como subreporte 3.NOMBRE AS NOMBRE. Si hemos de enlazar el subreporte con el reporte maestro. • Pasos a seguir 1. La aplicación iReport nos daría un error si así lo hiciéramos.ID. P. Diseñar como un reporte normal 1. Un repo rte m aestro es un reporte que contiene un elemento más. PERSONA_ID) 2.e.

Asignamos como tipo de parámetro net. especificamos el parámetro que va a proporcionar la conexión a la base de datos: $P{REPORT_CONNECTION} 4. Abrimos el diálogo de propiedades del subreporte haciendo doble clic en el elemento subreporte del reporte maestro 2.engine. De la lista desplegable Connection / Datasource Expression.util. Compilar y visualizar el subreporte verificando que el resultado es el esperado. 2. 16 de 18 .Map que contendrá los parámetros correspondientes al reporte maestro 7 El valor de dicho parámetro será asignado desde nuestra aplicación Java.jasperreports. PERSONA_CURSOS PC WHERE P. CURSOS C. seleccionamos el elemento Use connection expression para indicar que los datos se van a obtener mediante una conexión a una base de datos 3. Definimos un parámetro llamado. especificamos el parámetro que contendrá nuestro subreport: $P{SUBREPORT} 3. Obtención de las URLs de los archivos que contienen el reporte maestro y el subreporte: URL urlMaestro = t1.sf. En el campo de texto que se encuentra debajo de la lista de selección del punto anterior.sf. En la lista desplegable que lleva por título Image Expression Class.getResource ("/reports/TUTORIAL_SUBREPORTS_SUBREPORT.FROM PERSONAS P.ID_CURSO = C.engine. correspondientes al reporte maestro y al subreporte. sin tener en cuenta el subreporte 2.getClass(). como veremos más adelante.jasperreports. Definición en el reporte maestro del parámetro que contendrá el subreporte:7 1.ID_PERSONA = P. En el campo que lleva por título Subreport Expression. Dicho programa tendrá la siguiente estructura: 1. 2.ID. Definir el objeto java.ID = $P{PERSONA_ID} AND PC. 2. Crear los objetos JasperReport.jasper").ID AND PC. URL urlSubreporte = t1. SUBREPORT. por ejemplo.JasperReport. Enlazar reporte maestro y subreporte: 1. 3. debemos crear un pequeño programa que proporcione al reporte maestro aquellos datos que iReport no puede obtener.getResource ("/reports/TUTORIAL_SUBREPORTS_MASTER.getClass(). Seleccionamos la pestaña Subreport (Other) del diálogo de propiedades 3.jasper"). Especificación del método usado por el subreport para obtener los datos: 1. Seleccionamos la pestaña Subreport del diálogo de propiedades del subreport 2.JasperReport 4. seleccionamos el tipo net. a partir de las URLs obtenidas en el punto anterior 3. Creación del programa: Para poder visualizar los resultados de nuestro trabajo. Asignación de este parámetro al elemento subreporte 1.

ZIP contiene: • • • El archivo LEEME. Para la generación del modelo de datos y los DDLs.1. he utilizado el extraordinario OpenOfiice 1. Gestor es de bases de datos He usado la versión 4.6.openoffice.2. También he usado HSQLDB 1.8 (http://hsqldb.eclipse. Procesador de textos Para escribir el tutorial y para generar el PDF. Para crear la clase Java de visualización.jrxml) [directorio subreports\reports] La clase de ejemplo. he utilizado la versión 3.4.net/): la 0.0. Incluir las parejas nombre de parámetro – valor en el Map definido en el punto anterior 5. Sin embargo.jp/en/software/clay/index.5 del plugin de Eclipse Clay Database Modeling (http://www.2. he usado la versión 1.mysql.0. mientras escribía este tutorial ha aparecido la versión 0. SubreportsSample.com) como gestor de bases de datos principal.jsp).sourceforge.TXT que contiene esta información en formato texto [directorio raíz] El tutorial en PDF. cuyos cambios no afectan en nada a este tutorial. Sobre él he desarrollado la aplicación y he relizado pruebas.org/).net/). CONTENIDO DEL ARCHIVO ZIP El archivo SUBREPORTS.sourceforge. en fuente y compilada [directorio subreports] 17 de 18 • • . si bien.4.org).1 de JasperReports (http://jasperreports. He utilizado la última versión de iReport -Designer for JasperReports (http://ireport. El plugin también se ha utilizado para convertir el modelo de datos de MySQL a HSQLDB. SUBREPORTS_TUTORIAL. no he realizado pruebas contra HSQLDB.1 de Eclipse (http://www.pdf [directorio raíz] Los DDL que permiten crear tablas e insertar datos de ejemplos para MySQL y para HSQLDB [directorio subreports\database] Los reportes maestro y subreporte compilados (*.0.6.azzurri.7.net/).sourceforge.7-nt de MySQL (http://www.jasper) y sin compilar (*. Visualización del reporte maestro (que ahora ya incluye el subreporte) mediante el método estático viewReport() de JasperViewer ¿QUÉ HE USADO? Herrami entas de reportes He usado la versión 0.3 (http://www.1. Llenar el reporte maestro con los valores para obtener un objeto JasperPrint capaz de ser visualizado 6.

Toda crítica será bien recibida y contribuirá a la generación de una versión más completa de este tutorial. Espero y deseo que. por lo que seguro que está tapizado de agujeros y errores. 18 de 18 . este tutorial cubra una buena parte de las expectativas de los desarrolladores.PARA TERMINAR Decir que este tutorial es el resultado de mi primer trabajo con subreportes de JasperReport. que espero que el lector sabrá disculpar y poner de manifiesto en el apartado de comentarios de javaHispano. a pesar de todo.

Sign up to vote on this title
UsefulNot useful