Documente Academic
Documente Profesional
Documente Cultură
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.
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):
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)
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