Sunteți pe pagina 1din 17

14/4/2015

TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes
10

Ms Siguienteblog

TutorialesdeProgramacionJava
BlogdedicadoatemasdeprogramacinactualesusandoellenguajedeprogramacinJavaylasltimasversionesdesusAPIsyHerramientas.
Pginaprincipal

PginadeConcursos

TutorialesUPAO2010

PresentacionesCapacitacin

SBADO,18DEABRILDE2009

CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes
Visitalaparte1deestetutorial:ReportesconConexinaBasesdeDatos
Visitalaparte2deestetutorial:UsandoDataSourcesPersonalizados
Visitalaparte3deestetutorial:ParmetrosyVariables
Visitalaparte4deestetutorial:Reportesenaplicacionesweb
Visitalaparte5deestetutorial:GrficasenReportes
Visitalaparte6deestetutorial:Grupos
Lossubreportessonunacaractersticaimportantedeunaherramientageneradoradereportes.Permitencrearreportesmscomplejosy
simplificareltrabajodediseo.
Lossubreportessonmuytilescuandosecreaunreportemaestrodedetallesocuandolaestructuradeunsoloreportenoessuficiente
paradescribirlacomplejidaddeldocumentodesalidadeseado.

DONACIONES

JAVATUTORIALESENFACEBOOK

JavaTutoriales
Megusta

JavaTutorialesha
aadidounafotonueva.
13demarzo

Un subreporte es solamente un reporte que ha sido incorporado a otro reporte. De hecho podemos tener subreportes dentro de otros
subreportes.
EnesteltimotutorialdelaseriedeJasperReportsyiReportsveremoscmocrearsubreporteshaciendousodeestasdosherramientas.
Veremos dos ejemplos, el primero mostrar cmo hacer los subreportes mediante una conexin JDBC a la base de datos. El segundo
mostrarcomohacerloconunDataSourcepropio.
En ambos casos crearemos un reporte de alumnos de una escuela y subreportes de cada uno de los alumnos con la lista de materias
quetienecadauno(aunqueporfacilidadtodostendrnlasmismasmateriascuandohagamoselejemploconelDataSourcepropio).

16MegustaSehacompartido1vez

Megusta

1Subreportesconconexinabasededatos

Comentar

A24386personaslesgustaJavaTutoriales

Loprimeroqueharemosesgenerarunabasededatosdeprueba.YohareusodeMySql5.1,peropuedenusarelmanejadorquemsles
guste.Creamosunabasededatosllamada"pruebaReportes"yusamoselsiguientescriptparacrearlatabla"alumnos":

CREATETABLE`alumnos`(
`ID`bigint(21)NOTNULL,
`NOMBRE`varchar(100)NOTNULL,
`CLAVE`varchar(100)NOTNULL,
PRIMARYKEY(`ID`)
)ENGINE=InnoDBDEFAULTCHARSET=latin1

PluginsocialdeFacebook

despusesteparalasmaterias:

CREATETABLE`materias`(
`ID`BIGINT(21)NOTNULL,
`NOMBRE`VARCHAR(100)NOTNULL,
PRIMARYKEY(`ID`)
)ENGINE=INNODBDEFAULTCHARSET=latin1

yfinalmenteestaserlatablaintermedia,otabladeunindelasdosanteriores(yaquesegenerarunarelacinN:Mentraambas):

CREATETABLE`alumnos_materias`(
`ALUMNO_ID`BIGINT(21)NOTNULL,
`MATERIA_ID`BIGINT(21)NOTNULL,
PRIMARYKEY(`ALUMNO_ID`,`MATERIA_ID`),
FOREIGNKEY(`ALUMNO_ID`)REFERENCES`alumnos`(`ID`),
FOREIGNKEY(`MATERIA_ID`)REFERENCES`materias`(`ID`))ENGINE=INNODBDEFAULTCHARSET=latin1

http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html

1/27

14/4/2015

TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes
Ahoraquetenemoslastablasusaremoselsiguientescriptparallenarlas:

INSERTINTOalumnosVALUES(1,'Alumno1','00001')
INSERTINTOalumnosVALUES(2,'Alumno2','00002')
INSERTINTOalumnosVALUES(3,'Alumno3','00003')
INSERTINTOalumnosVALUES(4,'Alumno4','00004')
INSERTINTOalumnosVALUES(5,'Alumno5','00005')
INSERTINTOalumnosVALUES(6,'Alumno6','00006')
INSERTINTOalumnosVALUES(7,'Alumno7','00007')
INSERTINTOalumnosVALUES(8,'Alumno8','00008')
INSERTINTOalumnosVALUES(9,'Alumno9','00009')
INSERTINTOalumnosVALUES(10,'Alumno10','000010')

INSERTINTOmateriasVALUES(1,'Matematicas')
INSERTINTOmateriasVALUES(2,'Fisica')
INSERTINTOmateriasVALUES(3,'Quimica')
INSERTINTOmateriasVALUES(4,'Biologia')
INSERTINTOmateriasVALUES(5,'Historia')
INSERTINTOmateriasVALUES(6,'Geografia')

INSERTINTOalumnos_materiasVALUES(1,1)
INSERTINTOalumnos_materiasVALUES(1,3)
INSERTINTOalumnos_materiasVALUES(1,5)
INSERTINTOalumnos_materiasVALUES(2,1)
INSERTINTOalumnos_materiasVALUES(2,2)
INSERTINTOalumnos_materiasVALUES(2,3)
INSERTINTOalumnos_materiasVALUES(3,2)
INSERTINTOalumnos_materiasVALUES(3,4)
INSERTINTOalumnos_materiasVALUES(3,6)
INSERTINTOalumnos_materiasVALUES(4,4)
INSERTINTOalumnos_materiasVALUES(4,5)
INSERTINTOalumnos_materiasVALUES(4,6)

SEGUIDORES

Participarenestesitio
GoogleFriendConnect

Miembros(195) Ms

INSERTINTOalumnos_materiasVALUES(5,1)
INSERTINTOalumnos_materiasVALUES(5,4)
INSERTINTOalumnos_materiasVALUES(5,5)
INSERTINTOalumnos_materiasVALUES(6,2)
INSERTINTOalumnos_materiasVALUES(6,5)
INSERTINTOalumnos_materiasVALUES(6,6)
Yaeresmiembro?Iniciarsesin

INSERTINTOalumnos_materiasVALUES(7,1)
INSERTINTOalumnos_materiasVALUES(7,3)
INSERTINTOalumnos_materiasVALUES(7,5)

ARCHIVODELBLOG

2015(1)

INSERTINTOalumnos_materiasVALUES(8,1)
INSERTINTOalumnos_materiasVALUES(8,2)
INSERTINTOalumnos_materiasVALUES(8,3)
INSERTINTOalumnos_materiasVALUES(9,2)
INSERTINTOalumnos_materiasVALUES(9,4)
INSERTINTOalumnos_materiasVALUES(9,6)
INSERTINTOalumnos_materiasVALUES(10,4)
INSERTINTOalumnos_materiasVALUES(10,5)
INSERTINTOalumnos_materiasVALUES(10,6)

2013(1)
2012(2)
2011(11)
2010(10)
2009(22)
septiembre(2)
agosto(2)
julio(1)
junio(3)
mayo(2)
abril(5)

Ya con los datos listos procedemos a crear el proyecto en NetBeans ("File > New Project... > Java > Java
Application").ConloquesecrearunaclaseMainqueaparecerennuestroeditor.
PorelmomentodejaremosaselproyectodeNetBeansyprocederemosacrearlaplantilladenuestroreportedesdeiReport.
Comoenestaocasintenemosunabasededatos,usaremosel"ReportWizard",porloquevamosalmen"Archivo>New..
>ReportWizard".Conestoseabrirelwizardde7pasosqueexpliquenelprimertutorial.
Elpaso2(enelqueempiezaelwizard)nospidedarunnombrealarchivodelreporteyunaubicacin.Denleelnombrequegusten(enmi
caso"reporteMaestro.jrxml")yguardenloenlacarpetarazdelproyectodeNetBeansqueacabamosdecrear.

InstalacindeunServidordeDesar
Parte1...

CreacindeReportesconJasperRe
yiReports...

CreacindeReportesconJasperRe
yiReports...

CreacindeReportesconJasperRe
yiReports...

CreacindeReportesconJasperRe
yiReports...
marzo(2)

Presionamoselbotn"Siguiente>"parairlapaso3.AqudebenosseleccionarelDataSourcequeseusarparagenerarelreporte.

http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html

febrero(2)

2/27

14/4/2015

TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes
Siyatienencreadoeldatasourceparalabasededatos"pruebaReportes"puedenseleccionarlaaqui.Sinonosepreocupen,estees
elmomentoparacrearlo.

enero(3)

Paracreareldatasourcequeusaremoshacelosclickenelbotn"New":

Esto abrir una ventana en la que tendremos que seleccionar el tipo de Datasource que queremos usar. En nuestro caso ser un
"DatabaseJDBCconnection"(laprimeropcin).

DATOSPERSONALES

Alex

Presionamos el botn "Next >". En la siguiente pantalla debemos darle un nombre y algunos parmetros al datasource, como la
direccindelservidoryelnombredelabasededatos.

Programador Java con algunos ao


experiencia en mltiples poyectos y
mltiples APIs y herramientas deseos
compartir experiencias con el rest
programadores.
Vertodomiperfil

Paraprobarquelaconexinpuedeestablecerse,haganclickenelbotn"Test"y,sitodoestpabien,debeaparecerunmensajecomoel
siguiente:

Siobtuvieronelmensajeanteriorhaganclicken"Aceptar"yposteriormenteenelbotn"Save"paraguardareldatasource.
Veremos que en la ventana del paso 3 del "ReportWizard" ahora tenemos un textarea que nos indica que debemos introducir un

http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html

3/27

14/4/2015

TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes
query. Pueden usar el query designer si gustan (haciendo click en el botn "DesignQuery") para crear la query que usaremos para
obtenertodoslosdatosdelatabla"alumnos"(solodeesatabla).Alfinallaquerydebesermsomenosas:

SELECT
alumnos.`ID`ASalumnos_ID,
alumnos.`NOMBRE`ASalumnos_NOMBRE,
alumnos.`CLAVE`ASalumnos_CLAVE
FROM
`alumnos`alumnos

Hacemos click en el botn "Siguiente >" para ir al paso 4. En este paso tendremos que seleccionar los campos, de los que
acabamosdeseleccionar,quequeremosmostrarenelreporte.Enestecasosoloqueremosmostrarelnombreylaclavedelalumno(el
idlousaremoscomounelementoauxiliarparaobtenerlosdatosdelsubreporte,porloqueesnecesarioquetambinloreleccionemos).
Porloqueseleccionamostodosloscampos:

Presionamoselbotn"Siguiente>".Enelpaso5podemosseleccionaruncamposobreelquequeramoscrearungrupo.Nosotrosno
queremos crear ninguno, por lo que dejamos todo como est y presionamos el botn "Siguiente >" para ir al paso 6 en el que
seleccionaremosellayoutdelreporte.Laopcinpordefecto("ColumnarLayout")estabien,porloqueladejamosyhacemosclicken
"Siguiente>"parairalpasofinalenelquenosfelicitarnporhabercreadoexitosamentenuestroreporte^^!.

Ahorapodemoshacerclickenelbotn"Finalizar"paraveraparecerlaplantilladenuestroreporte,enlapestaa"Designer",elcual
debeversedelasiguienteforma:

Modificaremoslostextosestticosparaqueconcuerdenunpocomsconeltipodereportequequeremoslograr.Tambineliminaremos
lasetiquetayeltextoquemuestranelvalordeidyaque,comodijimoshaceunmomento,nonosinteresamostrarlo:

http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html

4/27

14/4/2015

TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes

Sigeneramoslavistapreviadelreporteveremoslosiguiente:

Noeselmejorreporteperoesunprincipio^^.Ahoraprocederemosaagregarelsubreporte.Estesubreportemostrarlasmateriasalas
queestainscritocadaunodelosalumnos.
Para esto arrastramos el elemento "Subreport" desde los "ReportElements" y lo colocamos en la banda details, justo debajo de
loscamposdetexto:

Alhacerestoseabrirlaventanadel"SubreportWizard"queeslaquenosguiarenelprocesodelacreacindelsubreporte:

El primer paso consiste en indicar si nuestro subreporte ser un reporte nuevo, uno existente, o si solo queremos crear el elemento
subrepote. Nosotros crearemos un nuevo reporte (que es el que mostrar las materias a las que est inscrito cada alumno), as que
dejamosseleccionadalaprimeraopcin("Createanewreport")yhacemosclickenelbotn"Siguiente>".
En el paso 2 se nos preguntara qu datasource usaremos para este reporte. Nosotros usaremos el datasource creado hace unos
momentos(queenmicasosellamaba"PruebaReportes").Seleccionamosesteenelmendesplegable,conlosquenosaparecer
untextareaparaquecoloquemosunaquery. Pueden usar el query designer si gustan para obtener una query que seleccione todos los
campos de las tablas "alumnos_materias" y "materias" y haga un join entre estas (que obtenga las materias que tiene cada
alumno).Laqueryfinalquedadelasiguienteforma:

SELECT
alumnos_materias.`ALUMNO_ID`ASalumnos_materias_ALUMNO_ID,
alumnos_materias.`MATERIA_ID`ASalumnos_materias_MATERIA_ID,
materias.`ID`ASmaterias_ID,
materias.`NOMBRE`ASmaterias_NOMBRE
FROM
`materias`materiasINNERJOIN`alumnos_materias`alumnos_materiasONmaterias.`ID`=alumnos_materi
as.`MATERIA_ID`

http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html

5/27

14/4/2015

TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes

Presionamos el botn "Siguiente >" para ir al paso 3, en el que se nos preguntar qu campos de los regresados por la consulta
queremosmostrarenelreporte(oenestecasoenelsubreporte).Anosotrossolonosinteresamostrarloscamposquetienenquever
conlamateria,porloquesoloseleccionamosloscampos"materias_NOMBRE"y"materias_ID":

Presionamosenbotn"Siguiente>" para ir al paso 4. En este paso podemos elegir si queremos crear un grupo, como nosotros no
queremoscrearninguno,simplementedejamostodocomoestyvolvemosapresionarelbotn"Siguiente>".
Enelpaso5podemoselegirellayoutdelreporte.Pudenseleccionarelquequieran.Enmicasodejarlaopcinpordefault("Columnar
Layout")ypresionamoselbotn"Siguiente>".
Enelpaso6podemosdarleunnombeyunaubicacinalsubreporte.Yolellamar"subreporteMaterias.jrxml"yloguardarenel
mismo directorio que el "reporteMaestro.jrxml" (en la carpeta raz del proyecto de NetBeans). Tambin podemos ejegir si
queremos guardar la ruta del subreporte (para que el reporte maestro sepa donde buscarlo) como un parmetro llamado
$P{SUBREPORT_DIR},ocomounarutaabsolutaesttica.Lomejoreselegirestultimayaquemodificaremoslarutaparaquebusque
el subreporte en en el mismo directorio que el reporte maestro. As si los movemos de un directorio a otro, solo tendremos que
preocuparnosdellevarnoslosdosjuntos.

Presionamosunavezmselbotn"Siguiente>"parairalultimopaso.
Enelpasofinal(elpaso7)debemosseleccionarcmolepasaremoseldatasourcealsubreportedesdeelreportemaestro.Tenemos5
opciones:
Usarlamismaconexinqueelreportemaestro
Usarotraconexin
UsarunaexpresindeunJRDataSource
Usarundatasourcevacio
Nousarconexinodatasourcealguno
Nosotrosseleccionamoslaprimeraopcinyaquequeremosqueelsubreporteuselamismaconexinqueelreportemaestro:

http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html

6/27

14/4/2015

TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes

presionamoselbotn"Finalizar"paramostrarelsubreporte:

Modificamos un poco el diseo del reporte para que se vea bien al mostrarlo dentro del reporte maestro (cambiamos unos textos,
eliminamos otros, y eliminamos la banda "PageFooter", tambin agregamos una lnea en la banda "Summary" para identificar en el
reportefinalcuandoterminelalistadematerias):

Ahora agregamos un nuevo parmetro al subreporte (click derecho en el nodo "Parameters" del panel "Report Inspector" y
seleccionamos"AadirParameter")llamadoalumnos_IDdetipojava.lang.Long.

Lo siguiente que haremos es el primero de los dos trucos para generar subreportes en base a una conexin con base de datos:
hacemosclicksobrelaventanadeldesigner,perofueradelreporteparaqueenelpaneldepropiedadesaparezcanlaspropiedadesdel
"subreporteMaterias".Unavezenestepanelbuscamoslapropiedad"QueryText"delaseccin"More...":

Hacemosclickenelbotn"..."paraqueseabraunaventanaquecontieneeltextodelaconsultaquecreamosalcrearelsubreporte.
Agregamoselfinaldelaconsultalosiguiente:
ANDalumnos_materias.`ALUMNO_ID`=$P{alumnos_ID}

http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html

7/27

14/4/2015

TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes

Conestolograremosqueelsubreportesegeneresoloconlasmateriasquecorrespondanalalumnoconelidqueleindiquemos(locual
haremosenunmomentoyquedehechoeselsegundosecreto).
Presionamoselbotn"OK"paraguardarlaconsulta.
Para terminar guardamos el subreporte y cambiamos a la vista "Preview" para compilar el reporte y generar el archivo
"subreporteMaterias.jasper".Elpreviewdebeversemsomenosas:

Ahora podemos regresar al reporteMaestro, el cual debe verse as (despus de ajustar el tamao y la posicin del componente
subreporte):

Seleccionamoselelementosubreporteyenelpaneldepropiedadesbuscamoselelemento"SubreportExpression" de la seccin
"SubreportProperties".Eliminamoslarutaabsolutaydejamossoloelnombredelreporte("subreporteMaterias.jasper"):

Ahora viene el segundo de los secretos para le generacin de los subreportes usando conexin a base de datos. Seleccionamos el
componente del subreporte y buscamos en panel de propiedades y buscamos la propiedad "Parameters" de la seccin "Subreport
Properties":

http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html

8/27

14/4/2015

TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes
Hacemos click en el botn "..." con lo que se abrir una ventana que nos permite agregar parmetros que sern pasados del reporte
maestroalsubreporte.
Si recuerdan nosotros indicamos en el subreporte que queremos que muesre las materias en las que est inscrito un alumno con un
particular. Pues bien es aqu en donde pasamos ese dato, el id del alumno del que se estn mostrando los datos. Este parametro nos
permitirpasarleelvaloralparmetro"alumnos_ID"queagregamosenelsubreporte.
Presionamoselbotn"Add"yagregamoscomonombredelparmetro"alumnos_ID"ycomovalor"$F{alumnos_ID}":

Presionamos"OK"enambasventanasylisto,yatenemosnuestroreportemaestroconsubreportes^^.
Ahoraguardamoselreporteycambiamosalavistade"Preview".Ahoradebemosveralgocomolosiguiente:

ConestoterminamoslapartequecorrespondeaiReportypodemosregresaralNetBeans.
SilorecuerdandejamoslaclaseMainvacia,ahoraprocederemosallenarlaconelcdigoparagenerarelreporte.
Recuerdenqueloprimeroquedebemoshaceresagregaralnodo"Libraries"delpanel"Projects"labiblioteca"JasperReports"
que creamos en el primer tutorial de la serie, el jar "commonslogging1.1.1.jar", y el jar "mysqlconnectorjava5.1.7
bin.jar"queeseldriverdelabasededatos.
Unavezquetenemosesto,escribimoselsiguientecdifoenelmtodomaindelaclaseMain:

Class.forName("com.mysql.jdbc.Driver")
Connectionconexion=DriverManager.getConnection("jdbc:mysql://localhost:3306/pruebareportes",
"user","pass")
JasperReportreporte=(JasperReport)JRLoader.loadObject("reporteMaestro.jasper")
JasperPrintjasperPrint=JasperFillManager.fillReport(reporte,null,conexion)
JRExporterexporter=newJRPdfExporter()
exporter.setParameter(JRExporterParameter.JASPER_PRINT,jasperPrint)
exporter.setParameter(JRExporterParameter.OUTPUT_FILE,newjava.io.File("reportePDF.pdf"))
exporter.exportReport()

Laexplicacindeestecdigoestenelprimertutorialdeestaserie.
Alejecutarlosecrearelarchivo"reportePDF.pdf"eneldirectoriorazdelproyecto.Siabrimoselarchivoveremosmsomenoslo
siguiente:

http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html

9/27

14/4/2015

TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes

Con lo que comprobamos que el reporte, junto con su subreporte, se ha generado correctamente ^^. Ahora veremos cmo hacer esto
mismousandounDataSourcepropio.

2Subreportescondatasourcespropios
Para hacer un subreporte con un datasource propio tambin es necesario conocer un par de secretos, los cuales revelar un unos
momentos.
LoprimeroqueharemosescrearunnuevoproyectoenNetBeans("File>NewProject...>Java>JavaApplication").
ConloquesecrearunaclaseMainqueaparecerennuestroeditor.
Recuerdenquetambindebemosagregaralnodo"Libraries"delpanel"Projects"labiblioteca"JasperReports"quecreamosen
elprimertutorialdelaserieyeljar"commonslogging1.1.1.jar"
Crearemoslasclasesquemantendrnlosdatosquemostraremosenelreporte("Alumno"y"Materia").Laclase"Alumno"tendrsolo
losatributos"id","clave"y"nombre"(consuscorrespondientessettersygetters):

publicclassAlumno
{
privateintid
privateStringclave
privateStringnombre
publicAlumno()
{
}
publicAlumno(intid,Stringclave,Stringnombre)
{
this.id=id
this.clave=clave
this.nombre=nombre
}
publicStringgetClave()
{
returnclave
}
publicvoidsetClave(Stringclave)
{
this.clave=clave
}
publicintgetId()
{
returnid
}
publicvoidsetId(intid)
{
this.id=id
}
publicStringgetNombre()
{
returnnombre

http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html

10/27

14/4/2015

TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes
}
publicvoidsetNombre(Stringnombre)
{
this.nombre=nombre
}
}

Laclase"Materia"tendrlosatributos"id"y"nombre":

publicclassMateria
{
privateintid
privateStringnombre
publicMateria()
{
}
publicMateria(intid,Stringnombre)
{
this.id=id
this.nombre=nombre
}
publicintgetId()
{
returnid
}
publicvoidsetId(intid)
{
this.id=id
}
publicStringgetNombre()
{
returnnombre
}
publicvoidsetNombre(Stringnombre)
{
this.nombre=nombre
}
}

An falta agregar algunas cosas a la clase "Alumno", pero dejaremos este proyecto a un lado por el momento mientras creamos la
plantilladenuestroreportedesdeiReport.
Abrimos el iReport y creamos un nuevo reporte vacio (men Archivo > New... > Empty report). Asignamos al reporte un
nombre(queenmicasoser"reporteMaestroDS.jrxml")yloguardamosenlarazdelproyectodeNetBeans.Hacemosclickenel
botn"Finalizar"conloqueveremosaparecerlaplantillavaciadentrodelavista"Designer".
Agregamos un par de fields (clave y nombre), y unos textos estticos para que este reporte maestro sea similar al anterior (elimin
algunasbandasparaqueelreporteseveamsclaro):

Agregamosunfieldadicionalllamado"materiasDS"detipo"net.sf.jasperreports.engine.JRDataSource".Comoestetipo
noapareceenelcomboparaseleccindetipodelfielddebemosescribirloenlaventanaqueseabrealpresionarelbotn"..." junto
aestecombobox:

http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html

11/27

14/4/2015

TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes

EstefieldserelquediraJasperReportsquedebellamaralgettercorrespondientedelaclaseAlumnoquecrearemosmsadelante
parapreguntaraculesmateriasestinscrito(quedarclarocuandoescribamoselcdigoJava).
Ahoraagregamosarrastramoselelemento"Subreport"delos"ReportElements"alabanda"Details":

Alhacerestoseabrirlaventana"Subreportwizard".Comoahoranousaremosunaconexinnonecesitamosunquery,entonces
notodoslospasosaplican.
Enelprimerpasoseleccionamossiqueremoscrearunnuevoreportequeservirdesubreporte,usarunreporteexistente,osolocrearun
elementosubreporte.Seleccionamoslaprimeraopcion("Createanewreport")ypresionamoselbotn"Siguiente>".
En el paso 2 debemos seleccionar un datasource. Nosotros seleccionaremos el "Empty datasource". Presionamos el botn
"Siguiente>" para ir al paso 3, en el que debemos seleccionar los fields que queremos agregar al subreporte. Como nosotros no
estamosusandounaconexin,notenemosfieldsparaseleccionar,asquesimplementepresionamoselbotn"Siguiente>".
Enelpaso4podemosescogercrearungrupo,aquipasalomismoqueenelpaso3asqueseguimosadelante.
En el paso 5 seleccionamos un layout para el subreporte. Pueden seleccionar el que quieran, yo usar el "Columnar Layout".
Presionamoselbotn"Siguiente>".
Vamos al paso 6. Aqu le damos una ubicacin y un nombre al proyecto. Le dar de nombre "subreporteMateriasDS.jrxml". Lo
guardamosenelmismodirectorioqueel"reporteMaestroDS.jrxml".Ademsindicamosquequeremosquelarutadelsubreportese
almaceneenunareferenciaestticaabsoluta("Useastaticabsolutepathreference"):

Pulsamoselbotn"Siguiente>"parairalltimopaso.
En el paso 7 debemos indicar cmo queremos pasar los datos del reporte maestro al subreporte. En este caso queremos usar una
"JRDatasource expression" (la tercer opcin), seleccionamos esta opcin y agregamos la expresin creada anteriormente
("$F{materiasDS}"),queserlaquenospermitaconectarelreporteconelsubreporte:

http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html

12/27

14/4/2015

TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes
Presionamoselbotn"Finalizar"conloqueaprecerelsubreporteenlavistadediseo:

Agregamosdosfields:unoparaelidentificadordelamateria(detipojava.lang.Integer),yunoparaelnombredelamateria(de
tipojava.lang.String):

Ahoraarreglamosunpocoeldiseodelsubreporteparaqueseveamejor:eliminamoslapgina"PageFooter", agregamos los fields


queacabamosdecrearalabanda"Detail",yarreglamosunpocoelttulo.Tambinagregamosunalneaenlabanda"Summary" para
sabercuandoterminaelsubreporte:

Guardamoselreporteycambiamosalavistapreviewparacompilarelsubreporte.Enlavistadepreviewdeberianveralgoasi(recuerden
seleccionarquequierenusarel"Emptydatasource"):

AhoraregresemosalreporteMaestro,elcualdebeverseas(despusdeajustareltamaoylaposicindelcomponentesubreporte):

Seleccionamoselelementosubreporteyenelpaneldepropiedadesbuscamoselelemento"SubreportExpression" de la seccin
"SubreportProperties".Eliminamoslarutaabsolutaydejamossoloelnombredelreporte("subreporteMateriasDS.jasper"):

http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html

13/27

14/4/2015

TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes

Esto es todo lo que se necestita hacer para generar el reporte, as que cambiaremos a la vista "Preview" para compilar el reporte.
Debenveralgoasi:

AhoraregresamosalproyectodeNetBeans.
Hace unos momentos creamos dos clases: "Alumno" y "Materia" y dijimos que an les faltaba algo: falta crear la relacin entre un
objeto alumno y las materias que tiene. Para esto agregaremos un atributo de tipo java.util.List a la clase "Alumno" que
mantendr la lista de materias a las que est inscrito el alumno (con sus correspondientes getters y setters). Adems agregaremos un
mtodoauxiliarquenospermitiragregarlasmateriasdeunaformamssimple:

privateListmaterias=newArrayList()
publicListgetMaterias()
{
returnmaterias
}
publicvoidsetMaterias(Listmaterias)
{
this.materias=materias
}
publicvoidaddMateria(Materiamateria)
{
this.materias.add(materia)
}

Ahora viene el segundo secreto para crear subreportes con datasource propios: si lo recuerdan, en el reporteMaestro agregamos un
parmetrollamado"materiasDS"detipo"net.sf.jasperreports.engine.JRDataSource".Espormediodeesteparmetroque
elreportemaestropreguntaacadaunodelosalumnosconculesmateriasestrelacionado(aculesestinscrito)parapodergenerar
elsubreporte.
Es el alumno el encargado de regresar esta informacin a JasperReports por medio de un getter, que debe estr formado siguiente el
patrn de getters como si tuviera un atributo llamado "materiasDS" de tipo "net.sf.jasperreports.engine.JRDataSource".
Porloqueelmtodoserdelasiguienteforma:

publicJRDataSourcegetMateriasDS(){
{
returnnewJRBeanCollectionDataSource(materias)
}
Elcdigocompletodelaclase"Alumno"quedadelasiguienteforma:

importjava.util.ArrayList
importjava.util.List
importnet.sf.jasperreports.engine.JRDataSource
importnet.sf.jasperreports.engine.data.JRBeanCollectionDataSource

http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html

14/27

14/4/2015

TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes
/**
*@authorAlex
*/
publicclassAlumno
{
privateintid
privateStringclave
privateStringnombre
privateListmaterias=newArrayList()
publicAlumno()
{
}
publicAlumno(intid,Stringclave,Stringnombre)
{
this.id=id
this.clave=clave
this.nombre=nombre
}
publicStringgetClave()
{
returnclave
}
publicvoidsetClave(Stringclave)
{
this.clave=clave
}
publicintgetId()
{
returnid
}
publicvoidsetId(intid)
{
this.id=id
}
publicStringgetNombre()
{
returnnombre
}
publicvoidsetNombre(Stringnombre)
{
this.nombre=nombre
}
publicListgetMaterias()
{
returnmaterias
}
publicvoidsetMaterias(Listmaterias)
{
this.materias=materias
}
publicvoidaddMateria(Materiamateria)
{
this.materias.add(materia)
}

publicJRDataSourcegetMateriasDS()
{
returnnewJRBeanCollectionDataSource(materias)
}
}

Esteestodoelcambioquenecesitalaclase"Alumno"paraquenuestrossubreportessegenerenexitosamente.

http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html

15/27

14/4/2015

TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes
Ahoraregresaremosalaclase"Main".Aquiagregaremos2ciclosfor,unoquecrearlasinstanciasde"Alumno" y las agregar a la
lista que posteriormente pararemos como DataSource y JasperReports, y un ciclo interno que crear instancias de "Materia" y las
relacionarconlosalumnos(todoslosalumnostendrnlasmismastresmateriasenestecaso).Loscliclosquednas(listaAlumnos
esunobjetoListquemantendrlosobjetosAlumno):

for(inti=1i<=5i++)
{
Alumnoalumno=newAlumno(i,"0000"+i,"Alumno"+i)
listaAlumnos.add(alumno)
for(intj=1j<=3j++)
{
alumno.addMateria(newMateria(j,"Materia"+j))
}
}

ElrestodelaclaseMaineselquehemosestadoviendoalolargodelaseriedetutorialesyqueestexplicadodetalladamenteenel
segundotutorial.ElcdigocompletodeMaineselsiguiente(omitiendolosimports):

publicclassMain
{
publicstaticvoidmain(String[]args)throwsException
{
ListlistaAlumnos=newArrayList()
for(inti=1i<=5i++)
{
Alumnoalumno=newAlumno(i,"0000"+i,"Alumno"+i)
listaAlumnos.add(alumno)
for(intj=1j<=3j++)
{
alumno.addMateria(newMateria(j,"Materia"+j))
}
}
JasperReportreporte=(JasperReport)JRLoader.loadObject("reporteMaestroDS.jasper")
JasperPrintjasperPrint=JasperFillManager.fillReport(reporte,null,newJRBeanCollectionDa
taSource(listaAlumnos))

JRExporterexporter=newJRPdfExporter()
exporter.setParameter(JRExporterParameter.JASPER_PRINT,jasperPrint)
exporter.setParameter(JRExporterParameter.OUTPUT_FILE,newFile("reporteMaestroDS.pdf"))

exporter.exportReport()
}
}

Esto generar un archivo llamado "reporteMaestroDS.pdf" en el directrio raz del proyecto de NetBeans. El archivo tendr el
siguientecontenido:

http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html

16/27

14/4/2015

TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes

Conloquecomprobamosqueelreportemaestrojuntoconsussubreportessehacreadocorrectamente^^.
Bien, esta es el ltimo tutorial de la serie de JasperReports. Tal vez haga algunos otros post referentes a JasperReports, pero sern
apartedelaserie.Esperoquetodolesseadeutilidad.
Noolvidendejarsusdudas,comentariosysugerencias.
Saludos.
Visitalaparte1deestetutorial:ReportesconConexinaBasesdeDatos
Visitalaparte2deestetutorial:UsandoDataSourcesPersonalizados
Visitalaparte3deestetutorial:ParmetrosyVariables
Visitalaparte4deestetutorial:Reportesenaplicacionesweb
Visitalaparte5deestetutorial:GrficasenReportes
Visitalaparte6deestetutorial:Grupos
PublicadoporAlexen20:00
Reacciones:

divertido (0)

interesante (0)

increible (1)

no me gusta (0)

+10 Recomendar esto en Google


Etiquetas:ireports,jasperreports,java,subreportes

45comentarios:
Annimo 18demayode2009,8:21
Buensimblog,loseguirdecerca.Ygraciasporcompartirinformacion
Responder

Annimo 18demayode2009,9:52
Quetalcomoestsmuchasgraciasporestemanualestmuybienexplicado,peroquisierapreguntartealgo,seguelmanualpasoa
pasotengounreporteenelqueelreportemaestrosellenacondatosdedostablasyelsubreportedeunaterceratabla,peroaldarel
parametroalgunasvecesmedicequeeldocumentonotienepginasyalgunasvecesmesalelosiguiente:
Errorfillingprint...Unknowncolumnname:Folio
net.sf.jasperreports.engine.JRException:
Unknown
column
name
:
Folio

at
net.sf.jasperreports.engine.JRResultSetDataSource.getColumnIndex(JRResultSetDataSource.java:359)

at
net.sf.jasperreports.engine.JRResultSetDataSource.getFieldValue(JRResultSetDataSource.java:116)

at
net.sf.jasperreports.engine.fill.JRFillDataset.setOldValues(JRFillDataset.java:807)

at
net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:771)

at
net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1413)

at
net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:111)

at
net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:899)

at
net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:802)

at
net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:63)

at
net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:421)

at
net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:251)

at
com.jaspersoft.ireport.designer.compiler.IReportCompiler.run(IReportCompiler.java:896)

at
org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:561)
atorg.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:986)
Printnotfilled.TrytouseanEmptyDataSource...
Podrasayudarme?MeurgeesparamitrabajoGracias
Responder

ProgramadorJava 18demayode2009,10:01
Hola,antesquenadamuchasgraciasportuscomentarios.
Encuantoatududaestopuededeberseaquelaconsultaqueestesrealizand(yaseaenelreportemaestrooenelsubreporte)noestpe
regresando el valor que pasa a la propiedad "Parameters" de la seccin "Subreport Properties" (que supongo que se llama "Folio").

http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html

17/27