Subinformes con iReport
Actualmente en www.AdictosAltrabajo.com
hay varios tutoriales relacionados con iReport
(http://jasperforge.org/sf/projects/ireport):
·
Exportar
PDF multidioma con iReport
Recordemos que iReport es una herramienta gratuita escrita
integramente en Java que nos sirve para crear y diseñar informes (jrxml = JasperReport XML) que posteriormente podremos
utilizar para JasperReport (http://jasperreports.sourceforge.net/).
Como hemos visto anteriormente, ya se han publicado varios
tutoriales relativos a iReport y sus funcionalidades. Una de estas
funcionalidades es poder crear subinformes que posteriormente usaremos dentro
de nuestros informes (que llamaremos informes padre).
Cuando queremos crear un informe cuya consulta a base de
datos se antoja algo complicada o hay que realizar cálculos parciales podemos
pensar en usar subinformes.
Realmente un subinforme tiene la misma estructura que un informe
normal pero se le da ese nombre ya que un informe padre puede contener varios
subinformes que devuelvan ciertos datos específicos.
En este tutorial vamos a explicar paso a paso como crear un
ejemplo de un informe “padre” que usa un subinforme para hacer una determinada
tarea y devuelve un valor al padre para que este lo trate como desee.
En nuestro ejemplo tenemos 2 tablas, una con los alumnos de
un colegio de primaria y otra con las calificaciones de esos alumnos en las
diferentes asignaturas.
La estructura del informe padre es muy sencilla, va a hacer
una consulta para que le de los nombres e id
de todos los alumnos y para cada alumno usará un subinforme para que le
devuelva las calificaciones de cada asignatura y sus calificaciones medias para
ese determinado alumno. Evidentemente esto se podría hacer con una consulta bastante
complicada y seguramente ineficiente, por eso vamos a usar subinformes y
veremos que nos facilitará mucho la vida.
Aquí les dejo el volcado de la base de datos usada en el ejemplo:
tutorial-subinformes.sql.
1er PASO: Crear el informe padre
Para crear el informe padre podemos ayudarnos del wizard que
posee iReport y bien crearlo nosotros desde cero. Aquí también les dejo el
informe padre que he diseñado para ilustrar el ejemplo: informe_padre.jrxml.
La consulta de este informe simplemente recupera la lista de
todos los alumnos (select * from alumno).
2do PASO: Crear el informe hijo (subinforme)
Después de diseñar el informe padre vamos a ver como crear
el informe hijo.
Para hacer esto podemos hacer de dos formas distintas:
- Ayudarnos
del wizard de iReport para crear un subinforme y insertarlo en el informe
padre. - Crear
nuestro subinforme nosotros mismos e insertarlo en el informe padre.
En este tutorial vamos a hacer la segunda opción para así
entender mejor los subinformes y tener más manejo con ellos.
Como se dijo en la introducción un subinforme tiene la misma
estructura que un informe normal con la única peculariedad que se integra
dentro de otro informe (padre).
Por lo que para crear nuestro subinforme lo vamos a hacer de
la misma forma que si fuera un informe normal. Aquí les dejo el diseño que he
hecho para este tutorial: tutorial_padre_subreport0.jrxml
CONSEJO: Cuando
diseñéis subinformes quitarle los márgenes para que se integre mejor dentro del
informe padre. (Menú Editar -> Quitar Márgenes).
La consulta del subinforme es también bastante sencilla (select * from calificacion where idAlumno =
$P{idAlumno}). Simplemente devolvemos las calificaciones de un alumno
determinado. Para este subinforme hemos utilizado un parámetro de entrada
(idAlumno) para identificar al alumno y una variable (notaMedia) que hace la media de las
calificaciones.
3er PASO: Integrar nuestro subinforme en el informe padre
Cuando tenemos ya creados y diseñados nuestro informe padre
y subinformes y funcionan por separado, vamos a proceder a integrar nuestro
subinforme dentro del informe padre. Para ello tenemos que hacer clic en el
botón correspondiente y posteriormente seleccionar el área donde meteremos el
subinforme.
A continuación nos aparecerá una ventana, que es el wizard
del que anteriormente he hablado, y seleccionamos la opción de “Usar un informe
existente”, buscamos nuestro subinforme (.jasper que estará en el classpath de iReport)
y damos a siguiente.
En la siguiente pantalla nos pregunta como queremos llenar
nuestro subinforme:
- Podemos
usar la misma conexión o fuente de datos que usa nuestro informe padre.
- Podemos
querer que el subinforme vaya a otra base de datos o utilize otra fuente
de datos diferente.
En este caso tenemos que especificar la conexión a utilizar
para llenar nuestro subinforme. (java.sql.DriverManager.getConnection( String de la URL de base de datos, String
de login, String de password).
Nosotros para nuestro ejemplo vamos a usar la misma conexión
usada para llenar el informe principal.
En la siguiente pantalla podemos asignar valores a los
parámetros del subinforme.
En nuestro ejemplo vemos que nos aparece el único parámetro
de nuestro subinforme, idAlumno y
elegimos que lo queremos rellenar con el valor del campo id del informe padre.
En esta última pantalla seleccionamos la opción de “Use una
referencia estática de localización absoluta” ya que nuestro subinforme está en
la misma localización que nuestro informe padre. Si no fuese así tendríamos que
seleccionar la otra opción y poner en el parámetro $P{SUBREPORT_DIR} el path
donde se encontrase el subinforme.
Pulsamos “Terminar”
y listo, ya tenemos nuestro subinforme integrado dentro de nuestro informe
principal. Hay que decir que una vez situado nuestro subinforme dentro del
informe padre podremos moverlo, redimensionarlo, etc. como si fuera un
componente más del informe.
Otra de las características de los subinformes es que pueden
devolver valores al informe padre. Si haces clic en el botón derecho del ratón
sobre el subinforme y das a “Propiedades”
podrás ver todos los datos relativos al informe (que anteriormente hemos
configurado con el wizard). En la pestaña de Subinforme(Otros) podrás ver los
parámetros del subinforme y también los valores de retorno del subinforme.
Es ahí donde tenemos que añadir una nueva entrada haciendo
clic en el botón de “Añadir. Nos
aparecerá una ventana donde nos preguntará por las asignaciones de variables
entre el subinforme y el informe padre. Ahí le ponemos que la variable del
subreport notaMedia devuelva su
valor y se almacene en la variable del informe padre llamada notaMediaPadre. Además podemos
elegir el tipo de cálculo que queremos asignar a la variable, en nuestro caso
vamos a seleccionar “Promedio” para
que nos saque la nota media de todos los alumnos.
Le damos a OK y ya tenemos totalmente configurado nuestro subinforme.
Ahora sólo nos queda ejecutar el informe padre y ver los resultados.
NOTA: Como se ha visto a la hora de integrar nuestro subinforme, hemos seleccionado
el fichero .jasper, que es el compilado de nuestro subinforme, por lo que cuando queramos hacer
algún cambio en nuestro subinforme y verlo posteriormente reflejado en el informe principal tendremos
que compilar previamente el subinforme para generar de nuevo su .jasper.
Conclusión
Como se puede ver la creación de informes complejos se puede
simplificar muy rápidamente y de una forma más o menos sencilla usando
subinformes.
iReport es una herramienta bastante útil (y OpenSource) a la
hora de diseñar informes y tiene multitud de funcionalidades que poco a poco
iremos viendo en www.adictosaltrabajo.com
Hola… Me parece muy bueno el tutorial. Tengo un problema, sigo los pasos del tutorial pero el reporte aparece en blanco podrian darme posibles soluciones..??? Gracias.
Hola… mi problema es el siguiente, he creado un subreporte y funcionaba, pero me di cuenta de que faltaban algunos datos porque estaba lo había colocado en la band header, cuando lo moví a detail el reporte maestro dejó de funcionar. no muestra ningún error, solo se queda en generating report. Traté de hacerlo desde el principio en un nuevo reporte maestro, pero este aparece en blanco. Se me dificulta enviar el modelo de la base de datos porque es muy complejo. Alguna idea?
Saludos, el tutorial es sencillo lo cual lo hace bueno. Yo estoy generando un reporte y su subreporte, al crearlo primera vez funcionó, sin embargo al querer modificar el reporte maestro (unos meses después) no me permitió compilar.
Volví a agregar el subreporte y logró compilar, sin embargo al llamar el reporte desde mi interfáz me arroja la excepción NoDefClassFoundError para la clase \\\»CallSiteArray\\\».
¿Alguna idea de como solucionar esto?
Muchas gracias por el tutorial !!!
yo hice todo pero me da un error Error loading object from URL que sera? ayuda por favor
Tengo problemas para agregar n subreportes, ayuda
hola necesito ayuda con un subreporte, estoy tratando de poner de forma horizontal la informacion que me trae la query del subreporte, pero esta al desplegarla solo la pone de forma vertical, como puedo hacer para que aparesca de forma horizontal
Quisiera saber si el mismo concepto se puede usar para java con formularios
Genial manual para subreportes !!!!
Tengo un problemilla, tengo 1 reporte con varios subreportes, el caso es que, a ver como explico esto:
– – Reporte Padre
| – Sub Reporte1 (2 páginas)
| – Sub Reporte2 (1 página)
| – Sub Reporte3 (2 páginas)
Al ejecutar el reporte padre, en la hoja donde veo resultados del SubReporte1 tambíen veo por solapamiento datos del SubReporte3, en cambio, y cuando paso de página continuo viendo la segunda página del subreporte 1, y luego el subReporte2 sin incidencias.
Como puedo evitarlo? He probado con saltos de página pero no afecta, si sustituyo SubReporte3 por un Static Text, sucede lo mismo, y dependiendo la altura a la que lo situe en el Reporte Padre, afecta la ubicación en la que se solapa con el subReporte1.
Gracias
Buenas, quiero pasar los datos (fieles), de un report a un subreport. Estos datos me vienen de mi clase java y no se ninguna query. He podido hacerlo cn los parámetros per con los field no soy capaz!!! Alguien que sepa pr ahí?
Saludos
hola buen día
Quisiera saber como hacer un reporte que me imprima en los dos lados de la hoja (pag. delantera y pág. trasera) como si fuera un tipo tarjeta de registro.
SALUDOS
hola buen dia
Quisiera saber cómo hace un reporte que se imprima por los latos la hoja (por enfrete y por el reverso) para similar una tarjeta.
SALUDOS
Estimado
El tema de los sub reportes funciona bien. Pero quiero exportar cada subreporte en archivo excell y que cada sub reporte lo imprima en una hoja o sheet diferente. Usando la propiedad IS_ONE_PAGE_PER_SHEET.TRUE funciona pero si algún sub reporte tiene muchos datos y usa más de una página lo coloca en varios sheets, lo que requiero es que el resultado de cada sub reporte quede en un sheet diferente asi cada sub reporte tenga varias paginas. He intentando muchas configuraciones como usar esta propiedad IS_ONE_PAGE_PER_SHEET.TRUE en el reporte principal y con valor FALSE en los subreportes, pero no funciona. No se si me hago entender pero si has trabajado bastante con jasper posiblementre lo hayas solucionado.
una pregunta y si mi reporte solicita un parametro para una consulta y mi subreporte necesita el mismo valor del parametro pero para una consulta diferente como le hago
DOS CONSULTAS DIFERENTES PERO CON EL MISMO PARAMETRO????
Gracia por el tutorial, como hago en el caso que quiero validar si hay datos en el Subreport para que no lo muestre.
Buenas días. Tengo un informe maestro y dos subinformes. ¿Cómo y donde debo colocar los subinformes para que se vean correctamente?. Saludos.
una pregunta y si mi reporte solicita un parametro para una consulta y mi subreporte necesita el mismo valor del parametro pero para una consulta diferente como le hago
dos consultas diferentes pero con el mismo parametro????
Buenas, tengo una duda sobre como pasar los datos del report main al subreport mediante las condiciones if. Depende del valor que tenga el parámetro obtenido desde java quiero pasar al subreport el field obtenido desde la query sql o el parámetro obtenido desde java. Un saludo.
*****AYUDAAAAA*****
MI REPORTE PADRE PIDE UN PARAMETRO DIGAMOS –FOLIO–
Y MI SUBREPORTE (EL HIJO) PIDE IGUAL UN PARAMETRO EL CUAL ES EL MISMO VALOR Q SE DEBE DAR AL PADRE OSEA EL PARAMETRO ES –FOLIO–.
UNO ES PARA MOSTRAR DETALLES Y OTRO PARA OTRO LISTADO LA COSA ES Q NECESITO HACER EL REPORTE Y SUBREPORTE CON EL MISMO PARAMETRO. PERO MARCA ERROR, ACASO EL NOMBRE DEL PARAMETRO DEBE SER DIFERENTE AUNQ EL VALOR Q SE DEBA PASAR ES EL MISMO PARA LOS DOS??? EN JASPER REPORT ME EJECUTA BIEN PERO CUANDO LO MANDO A LLAMAR DESDE JAVA MARCA ERROR. NO SE POR QUE ALGUNA SOLUCIÓN??
Alex tengo el mismo problema que el tuyo, pudiste solucionar, si lo ha hecho me puede dar orientación por favor. Te dejo mi correo juliocesargimez@gmail.com
Cuando se compila el reporte padre, se genera un único archivo .jasper? o se necesitan tener los .jasper de los subreportes para poder usarlos?
Saludos, me parece un excelente tutorial.
A mi se me ha presentado un problema tengo un reporte padre y tres sub-reportes, de los cuales en la consulta dinamica no todos los reportes tienen datos, se me muestra el reporte padre y el primer sub-reporte con campos pero el segundo no, y el tercero si, el problema esta que al momento de imprimir el reporte hay un gran espacio donde tendría que ir el segundo reporte,
podrían ayudarme..
Hola buenas marco, resolviste ese problema? yo necesito algo similar
hola buen dia… gracias por el aporte de conocimiento, muy bueno … … … pero la busqueda del tesoro es como lo ejecuto desde codigo JAVA.. .. no hay nada en google 🙁
Research in english
Tengo un problema, al subir un .jrxml en jasperforge.org (jasperserver), me dice que «El Jrxml seleccionado no se puede validar».
El fichero lo he creado con la aplicación TIBCO Jaspersoft, sin embargo, los que he creado con iREPORT, sí que me deja validarlos.
¿Qué problema puede haber?