Cuando creamos reportes en iReport que son un poco complicadas o reportes personalizados, osea, tratando de evitar el clásico reporte de tabla, debemos utilizar subreportes para dividir el trabajo y no complicarnos la existencia 🙂
En este tutorial veremos una forma de crear estos subreportes muy fácilmente.
Necesitamos:
La base de datos que utilizaremos es la siguiente :
El código SQL es:
-- -- Estructura de tabla para la tabla 'estudiante' -- CREATE TABLE estudiante ( dni varchar(12) NOT NULL, nombre varchar(32) default NULL, email varchar(32) default NULL, celular varchar(12) default NULL, PRIMARY KEY (dni) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- -- Volcar la base de datos para la tabla 'estudiante' -- INSERT INTO estudiante VALUES ('EST-00000001', 'Fernando Coco Cuadrado ', 'fernando2@yahoo.es', '080043332112'); INSERT INTO estudiante VALUES ('EST-00000002', 'Tomas Turbado ', 'loco_ton@mixmail.com', '800-33333-98'); INSERT INTO estudiante VALUES ('EST-00000003', 'Ramona Ponte Alegre ', 'triste_esta@gmail.com', '500-3223-122'); INSERT INTO estudiante VALUES ('EST-00000004', 'Pascual Conejo Enamorado ', 'conejo_rabioso@hotmail.com', '500-3333-001'); INSERT INTO estudiante VALUES ('EST-00000005', 'Miren Amiano ', 'elcochinote@facebook.com', '500-33-12199'); -- -------------------------------------------------------- -- -- Estructura de tabla para la tabla 'materia' -- CREATE TABLE materia ( codigo varchar(7) NOT NULL, nombre varchar(32) default NULL, curso varchar(12) default NULL, horario varchar(32) default NULL, PRIMARY KEY (codigo) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- -- Volcar la base de datos para la tabla 'materia' -- INSERT INTO materia VALUES ('SIS-009', 'Introducción a la programación', 'A1', 'Miércoles de 06:00 a 09:00'); INSERT INTO materia VALUES ('TEL-500', 'Teleinformática', 'B32', 'Jueves de 18:00 a 19:00'); INSERT INTO materia VALUES ('SIS-200', 'Linux', 'B12', 'Lunes de 14:00 a 16:00'); INSERT INTO materia VALUES ('SIS-234', 'Metodologías de la Información', 'C32', 'Martes de 16:00 a 18:00'); INSERT INTO materia VALUES ('MAT-280', 'Estadística Descriptiva', 'C15', 'Viernes de 09:00 a 11:00'); INSERT INTO materia VALUES ('FIS-200', 'Física Básica IV', 'LAB-02', 'Viernes de 14:00 a 17:00'); -- -------------------------------------------------------- -- -- Estructura de tabla para la tabla 'matricula' -- CREATE TABLE matricula ( dni varchar(12) NOT NULL, idmateria varchar(7) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- -- Volcar la base de datos para la tabla 'matricula' -- INSERT INTO matricula VALUES ('EST-00000001', 'FIS-200'); INSERT INTO matricula VALUES ('EST-00000001', 'TEL-500'); INSERT INTO matricula VALUES ('EST-00000001', 'SIS-009'); INSERT INTO matricula VALUES ('EST-00000002', 'SIS-200'); INSERT INTO matricula VALUES ('EST-00000002', 'FIS-200'); INSERT INTO matricula VALUES ('EST-00000003', 'MAT-280'); INSERT INTO matricula VALUES ('EST-00000003', 'SIS-009'); INSERT INTO matricula VALUES ('EST-00000003', 'TEL-500'); INSERT INTO matricula VALUES ('EST-00000003', 'SIS-200'); INSERT INTO matricula VALUES ('EST-00000004', 'SIS-234'); INSERT INTO matricula VALUES ('EST-00000005', 'TEL-500'); INSERT INTO matricula VALUES ('EST-00000001', 'SIS-234');
Creando los reportes y subreportes.
Lo primero que haremos sera crear el reporte principal o reporte que llamaremos PADRE
1. Abre el iReport y crea un archivo nuevo.
2. En este reporte solo cargaremos los registros de los estudiantes sin parámetros de entrada, el SQL es:
SELECT dni , nombre , email , celular FROM estudiante
3. Ahora debemos diseñar el reporte y añadir los TextField de la siguiente manera :
OJO: dejamos un espacio en blanco debajo de nuestros textfield, en ese lugar colocaremos el subreporte.
Si ejecutamos ahora el reporte padre, nos muestra los registros de estudiantes
Si todo bien hasta aquí, continuamos con el subreporte.
Subreporte.
Hay varias maneras de agregar un subreporte, nosotros utilizaremos un reporte desde otro archivo *.jasper.
1. Crea un nuevo archivo vacío y llámalo como HIJO.
2. Debes quitar los margenes del reporte para que no nos estorben cuando lo insertemos en el reporte padre. Para hacer esto ve a menú FORMATO -> REMOVER MARGENES DE REPORTE.
3. Crea un parámetro de entrada que llamaras dni.
4. La instrucción SQL que utilizaremos es:
SELECT codigo , nombre , curso , horario FROM matricula INNER JOIN materia ON idmateria=codigo WHERE dni=$P{dni}
5. Crea el reporte como si se tratara de cualquier otro reporte. Añade los TextField y dale formato.
5. Compila el reporte y comprueba que este todo bien.
UNIENDO TODO
1. Ve al reporte PADRE y en la paleta busca SUBREPORT, en versiones actuales el icono es distinto, no importa, la cosa es que diga SUBREPORT 🙂
2. arrastra este objeto al diseñador de reporte, aparece una nueva ventana, debes elegir la opción «USAR UN REPORTE EXISTENTE», busca y selecciona el archivo «hijo.jasper» , presiona siguiente.
3. En la siguiente ventana te muestra diferentes opciones de conexión, elige la primera, «USAR LA MISMA CONEXIÓN…» . siguiente.
4. En en esta ventana te pregunta por los parámetros que se utilizan en el subreporte, nosotros solo utilizamos un parámetro de entrada llamado DNI, este parámetro debemos asignarle un valor del reporte padre que lógicamente es el DNI del estudiante, entonces lo buscamos y seleccionamos.
5. En el último paso, te pregunta de donde buscara el archivo JASPER. Nosotros colocaremos el archivo JASPER PADRE y el archivo JASPER HIJO, en la misma carpeta, entonces seleccionamos la opción «USE A STATIC ABSOLUTE PATH REFERENCE» . Presiona el botón Terminar.
6. Acomoda el subreporte en el diseñador de reporte.
7. ejecuta el PREVIEW y si no tienes errores, debes ver algo como esto:
o.O es todo
Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.
Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye
Enjoy! :)
Las aplicaciones con IA (Inteligencia Artificial) son cada vez más comunes y se encuentran en diferentes dispositivos de...
El problema dice asi: Se desea contar los segundos que se presiona un JButton en un formulario. Solución: Para resolver...
Los procedimientos almacenados de MySQL , en postgreSQL se llaman funciones, pueden crearse desde consola, pero es mucho...
Song Maker es el nuevo experimento de Google Chrome Music Lab que permite al usuario crear música desde el navegador a t...
JTree cuenta con métodos que nos permiten cambiar los iconos de cada nodo según su estado, sin embargo a veces esto no e...
Utilizando pygame para hacer gráficos en python, se muestra a continuación un sencillo ejemplo de cómo utilizar esta lib...
Los comentarios estan cerrados
Si trabajas con redes sociales (RRSS) a continuación te muestro tres herramintas gratuitas que te ayudaran a la hora de...
Por lo general se usan transacciones a nivel base de datos y posteriormente se llaman estos a través de procedimientos a...
En este post, aprenderemos como conectar Visual Basic 6 con SQL Server, abrir una tabla, leer su contenido y mostrar est...
Lo que veremos en este post es la configuración del driver para PHP de SQL Server que ha creado Microsoft el cual permit...
Buenas noches, disculpa y si quiero mandar varios parametros al subreporte desde java como seria, Gracias. Mi reporte envia parametros al reporte maestro como al subreporte.
hola migo, saludos, sabes tengo una duda con respecto al ejemplo de subreportes. resulta que logre hacer el reporte principal y un subreporte, todo bian hasta ahi, lo mando allamar desde mi aplicaicon java, pero cuando llevo mi aplicacion a otra maquina ya no funciona, solo se muestra el reporte principal y no el sub reporte, por que pasa esto, gracias, si pudieras darme una idea te lo agradeceria.
y por lo demas pues es uno de los mejores sitio donde he etado. saludos….
en el paso 3, como hago si quiero usar otra conexion ????
Hago todos los pasos que has indicado. El problema que tengo es que cuando lo llevo
al cliente me sale un error que dice «File to connect database». le he sacado el subreporte al reporte princiapl y funciona correctamente. Quiero creer que no se le está pasando la conexión al subreporte y he probado cambiar varias cositas y sigue sin funcionar. Tienes alguna idea de que puede ser?
Gracias por el Aporte, me ayudo mucho.
hola tengo una consulta, tengo reportes y subreportes que se ejecutan sin problema en algunas versiones de windows 7, pero en windows 8 me sale un error al cargar el subreporte, cual seria la mejor forma de direccionar los subreportes al reporte padre?
Buenas noches, excelente tutorial, seria tan amable, tengo una pregunta; si quisiera mostrar cada subconsulta en el excel por paginas independientes, como podria hacerlo?, gracias.
Me gusto mucho tu post aprendi mucho y aclare muchas dudas , pero , me surgieron otras y es como puedo crear un parametro de entrada a mi reporte
se agrade viejo 🙂 ya hay un post sobre parámetros de entrada
Hola buenas compi, el manual es muy útil y muestra paso a paso como conseguir el subreporte dentro de un reporte.
Cuando genero el reporte padre, obtengo el espacio de donde va colocado en reporte hijo pero sin ningún dato.
He de pasarle el parámetro en la clase java para que rellene y así muestre datos?
Donde me habré despistado … ???
Gracias !
Hola mouse, una consulta. Tengo mi reporte con sub reporte funcionando.. Pero cuando llamo muchos subreportes en un solo reporte (300) demora en mostrar el reporte. Alguna sugerencia? Te agradezco.
se sobrecarga, trata de optimizar tu consulta ¿en vedad necesitas tantos subreportes?
hola necesito tu ayuda…. tengo un reporte con subreporte. mi subreporte tiene una consulta que se genera a partir de un parametro y mi reporte igual una consulta y recibe 1 parametro. el problema es… como le hago ya que es el mismo parametro tanto para el reporte como el subreporte… solo que son consulttas diferentes
y si en la lista que me muestra el reporte yo quisiera enumerar mi listado como le hago??? hay alguna opcion en jasper report q permita nooo sé usar un label y se vaya enumerando conforme a los valores q se mostraran???
solo quiero enumerar los resultados como le hago??