tutoriales de programacion java_ creación de reportes con jasperrepots y ireports - parte 7_...
DESCRIPTION
tipTRANSCRIPT
-
14/4/2015 TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes
http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html 1/27
BlogdedicadoatemasdeprogramacinactualesusandoellenguajedeprogramacinJavaylasltimasversionesdesusAPIsyHerramientas.
TutorialesdeProgramacionJava
Pginaprincipal PginadeConcursos TutorialesUPAO2010 PresentacionesCapacitacin
SBADO,18DEABRILDE2009
CreacindeReportesconJasperRepotsyiReportsParte7:SubreportesVisitalaparte1deestetutorial:ReportesconConexinaBasesdeDatosVisitalaparte2deestetutorial:UsandoDataSourcesPersonalizadosVisitalaparte3deestetutorial:ParmetrosyVariablesVisitalaparte4deestetutorial:ReportesenaplicacioneswebVisitalaparte5deestetutorial:GrficasenReportesVisitalaparte6deestetutorial:Grupos
Lossubreportessonunacaractersticaimportantedeunaherramientageneradoradereportes.Permitencrearreportesmscomplejosysimplificareltrabajodediseo.
Lossubreportessonmuytilescuandosecreaunreportemaestrodedetallesocuandolaestructuradeunsoloreportenoessuficienteparadescribirlacomplejidaddeldocumentodesalidadeseado.
Un subreporte es solamente un reporte que ha sido incorporado a otro reporte.De hecho podemos tener subreportes dentro de otrossubreportes.
EnesteltimotutorialdelaseriedeJasperReportsyiReportsveremoscmocrearsubreporteshaciendousodeestasdosherramientas.Veremosdosejemplos,elprimeromostrarcmohacer lossubreportesmedianteunaconexinJDBCa labasededatos.ElsegundomostrarcomohacerloconunDataSourcepropio.
Enamboscasoscrearemosunreportedealumnosdeunaescuelaysubreportesdecadaunode losalumnoscon la listademateriasquetienecadauno(aunqueporfacilidadtodostendrnlasmismasmateriascuandohagamoselejemploconelDataSourcepropio).
1Subreportesconconexinabasededatos
Loprimeroqueharemosesgenerarunabasededatosdeprueba.YohareusodeMySql5.1,peropuedenusarelmanejadorquemslesguste.Creamosunabasededatosllamada"pruebaReportes"yusamoselsiguientescriptparacrearlatabla"alumnos":
CREATETABLE`alumnos`(`ID`bigint(21)NOTNULL,`NOMBRE`varchar(100)NOTNULL,`CLAVE`varchar(100)NOTNULL,PRIMARYKEY(`ID`))ENGINE=InnoDBDEFAULTCHARSET=latin1
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
DONACIONES
JAVATUTORIALESENFACEBOOK
JavaTutoriales
A24386personaslesgustaJavaTutoriales
PluginsocialdeFacebook
Megusta
JavaTutorialeshaaadidounafotonueva.
16MegustaSehacompartido1vez
Megusta Comentar
13demarzo
10 Ms Siguienteblog
-
14/4/2015 TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes
http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html 2/27
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)
INSERTINTOalumnos_materiasVALUES(5,1)INSERTINTOalumnos_materiasVALUES(5,4)INSERTINTOalumnos_materiasVALUES(5,5)
INSERTINTOalumnos_materiasVALUES(6,2)INSERTINTOalumnos_materiasVALUES(6,5)INSERTINTOalumnos_materiasVALUES(6,6)
INSERTINTOalumnos_materiasVALUES(7,1)INSERTINTOalumnos_materiasVALUES(7,3)INSERTINTOalumnos_materiasVALUES(7,5)
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)
Ya con los datos listos procedemos a crear el proyecto en NetBeans ("File > New Project... > Java > JavaApplication").ConloquesecrearunaclaseMainqueaparecerennuestroeditor.
PorelmomentodejaremosaselproyectodeNetBeansyprocederemosacrearlaplantilladenuestroreportedesdeiReport.
Comoenestaocasintenemosunabasededatos,usaremosel"ReportWizard",porloquevamosalmen"Archivo>New..>ReportWizard".Conestoseabrirelwizardde7pasosqueexpliquenelprimertutorial.
Elpaso2(enelqueempiezaelwizard)nospidedarunnombrealarchivodelreporteyunaubicacin.Denleelnombrequegusten(enmicaso"reporteMaestro.jrxml")yguardenloenlacarpetarazdelproyectodeNetBeansqueacabamosdecrear.
Presionamoselbotn"Siguiente>"parairlapaso3.AqudebenosseleccionarelDataSourcequeseusarparagenerarelreporte.
ParticiparenestesitioGoogleFriendConnect
Miembros(195) Ms
Yaeresmiembro?Iniciarsesin
SEGUIDORES
2015(1)
2013(1)
2012(2)
2011(11)
2010(10)
2009(22)septiembre(2)
agosto(2)
julio(1)
junio(3)
mayo(2)
abril(5)InstalacindeunServidordeDesarrollo
Parte1...
CreacindeReportesconJasperRepotsyiReports...
CreacindeReportesconJasperRepotsyiReports...
CreacindeReportesconJasperRepotsyiReports...
CreacindeReportesconJasperRepotsyiReports...
marzo(2)
febrero(2)
ARCHIVODELBLOG
-
14/4/2015 TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes
http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html 3/27
Siyatienencreadoeldatasourceparalabasededatos"pruebaReportes"puedenseleccionarlaaqui.Sinonosepreocupen,esteeselmomentoparacrearlo.
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).
Presionamos el botn "Next>". En la siguiente pantalla debemos darle un nombre y algunos parmetros al datasource, como ladireccindelservidoryelnombredelabasededatos.
Paraprobarquelaconexinpuedeestablecerse,haganclickenelbotn"Test"y,sitodoestpabien,debeaparecerunmensajecomoelsiguiente:
Siobtuvieronelmensajeanteriorhaganclicken"Aceptar"yposteriormenteenelbotn"Save"paraguardareldatasource.
Veremosqueen la ventanadel paso3 del "ReportWizard" ahora tenemos un textarea que nos indica que debemos introducir un
enero(3)
Alex
Programador Java con algunos aos deexperiencia en mltiples poyectos y conmltiples APIs y herramientas deseoso decompartir experiencias con el resto deprogramadores.
Vertodomiperfil
DATOSPERSONALES
-
14/4/2015 TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes
http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html 4/27
query.Puedenusarelquerydesignersigustan(haciendoclickenelbotn"DesignQuery")paracrear laqueryqueusaremosparaobtenertodoslosdatosdelatabla"alumnos"(solodeesatabla).Alfinallaquerydebesermsomenosas:
SELECTalumnos.`ID`ASalumnos_ID,alumnos.`NOMBRE`ASalumnos_NOMBRE,alumnos.`CLAVE`ASalumnos_CLAVEFROM`alumnos`alumnos
Hacemos click en el botn "Siguiente>" para ir al paso 4. En este paso tendremos que seleccionar los campos, de los queacabamosdeseleccionar,quequeremosmostrarenelreporte.Enestecasosoloqueremosmostrarelnombreylaclavedelalumno(elidlousaremoscomounelementoauxiliarparaobtenerlosdatosdelsubreporte,porloqueesnecesarioquetambinloreleccionemos).Porloqueseleccionamostodosloscampos:
Presionamoselbotn"Siguiente>".Enelpaso5podemosseleccionaruncamposobreelquequeramoscrearungrupo.Nosotrosnoqueremos crear ninguno, por lo que dejamos todo como est y presionamos el botn "Siguiente>" para ir al paso 6 en el queseleccionaremosellayoutdelreporte.Laopcinpordefecto("ColumnarLayout")estabien,porloqueladejamosyhacemosclicken"Siguiente>"parairalpasofinalenelquenosfelicitarnporhabercreadoexitosamentenuestroreporte^^!.
Ahorapodemoshacerclickenelbotn"Finalizar"paraveraparecerlaplantilladenuestroreporte,enlapestaa"Designer",elcualdebeversedelasiguienteforma:
Modificaremoslostextosestticosparaqueconcuerdenunpocomsconeltipodereportequequeremoslograr.Tambineliminaremoslasetiquetayeltextoquemuestranelvalordeidyaque,comodijimoshaceunmomento,nonosinteresamostrarlo:
-
14/4/2015 TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes
http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html 5/27
Sigeneramoslavistapreviadelreporteveremoslosiguiente:
Noeselmejorreporteperoesunprincipio^^.Ahoraprocederemosaagregarelsubreporte.Estesubreportemostrarlasmateriasalasqueestainscritocadaunodelosalumnos.
Paraestoarrastramoselelemento"Subreport"desde los"ReportElements"y locolocamosen labandadetails, justodebajodeloscamposdetexto:
Alhacerestoseabrirlaventanadel"SubreportWizard"queeslaquenosguiarenelprocesodelacreacindelsubreporte:
El primer paso consiste en indicar si nuestro subreporte ser un reporte nuevo, uno existente, o si solo queremos crear el elementosubrepote.Nosotros crearemos un nuevo reporte (que es el quemostrar lasmaterias a las que est inscrito cada alumno), as quedejamosseleccionadalaprimeraopcin("Createanewreport")yhacemosclickenelbotn"Siguiente>".
En el paso 2 se nos preguntara qu datasource usaremos para este reporte. Nosotros usaremos el datasource creado hace unosmomentos(queenmicasosellamaba"PruebaReportes").Seleccionamosesteenelmendesplegable,conlosquenosapareceruntextareaparaquecoloquemosunaquery.Puedenusarelquerydesignersigustanparaobtenerunaqueryqueseleccionetodos loscampos de las tablas "alumnos_materias" y "materias" y haga un join entre estas (que obtenga las materias que tiene cadaalumno).Laqueryfinalquedadelasiguienteforma:
SELECTalumnos_materias.`ALUMNO_ID`ASalumnos_materias_ALUMNO_ID,alumnos_materias.`MATERIA_ID`ASalumnos_materias_MATERIA_ID,materias.`ID`ASmaterias_ID,materias.`NOMBRE`ASmaterias_NOMBREFROM`materias`materiasINNERJOIN`alumnos_materias`alumnos_materiasONmaterias.`ID`=alumnos_materias.`MATERIA_ID`
-
14/4/2015 TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes
http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html 6/27
Presionamos el botn "Siguiente>" para ir al paso 3, en el que se nos preguntar qu campos de los regresados por la consultaqueremosmostrarenelreporte(oenestecasoenelsubreporte).Anosotrossolonosinteresamostrar loscamposquetienenqueverconlamateria,porloquesoloseleccionamosloscampos"materias_NOMBRE"y"materias_ID":
Presionamosenbotn"Siguiente>"para iralpaso4.Enestepasopodemoselegirsiqueremoscrearungrupo,comonosotrosnoqueremoscrearninguno,simplementedejamostodocomoestyvolvemosapresionarelbotn"Siguiente>".
Enelpaso5podemoselegirellayoutdelreporte.Pudenseleccionarelquequieran.Enmicasodejarlaopcinpordefault("ColumnarLayout")ypresionamoselbotn"Siguiente>".
Enelpaso6podemosdarleunnombeyunaubicacinalsubreporte.Yolellamar"subreporteMaterias.jrxml"yloguardarenelmismo directorio que el "reporteMaestro.jrxml" (en la carpeta raz del proyecto de NetBeans). Tambin podemos ejegir siqueremos guardar la ruta del subreporte (para que el reporte maestro sepa donde buscarlo) como un parmetro llamado$P{SUBREPORT_DIR},ocomounarutaabsolutaesttica.Lomejoreselegirestultimayaquemodificaremoslarutaparaquebusqueel subreporte en en el mismo directorio que el reporte maestro. As si los movemos de un directorio a otro, solo tendremos quepreocuparnosdellevarnoslosdosjuntos.
Presionamosunavezmselbotn"Siguiente>"parairalultimopaso.
Enelpasofinal(elpaso7)debemosseleccionarcmolepasaremoseldatasourcealsubreportedesdeelreportemaestro.Tenemos5opciones:
UsarlamismaconexinqueelreportemaestroUsarotraconexinUsarunaexpresindeunJRDataSourceUsarundatasourcevacioNousarconexinodatasourcealguno
Nosotrosseleccionamoslaprimeraopcinyaquequeremosqueelsubreporteuselamismaconexinqueelreportemaestro:
-
14/4/2015 TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes
http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html 7/27
presionamoselbotn"Finalizar"paramostrarelsubreporte:
Modificamos un poco el diseo del reporte para que se vea bien al mostrarlo dentro del reporte maestro (cambiamos unos textos,eliminamosotros,yeliminamos labanda"PageFooter", tambinagregamosuna lneaen labanda"Summary"para identificarenelreportefinalcuandoterminelalistadematerias):
Ahora agregamos un nuevo parmetro al subreporte (click derecho en el nodo "Parameters" del panel "Report Inspector" yseleccionamos"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}
-
14/4/2015 TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes
http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html 8/27
Conestolograremosqueelsubreportesegeneresoloconlasmateriasquecorrespondanalalumnoconelidqueleindiquemos(locualharemosenunmomentoyquedehechoeselsegundosecreto).
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 componentesubreporte):
Seleccionamoselelementosubreporteyenelpaneldepropiedadesbuscamoselelemento"SubreportExpression"de laseccin"SubreportProperties".Eliminamoslarutaabsolutaydejamossoloelnombredelreporte("subreporteMaterias.jasper"):
Ahoravieneelsegundode lossecretos para le generacin de los subreportes usando conexin a base de datos.Seleccionamoselcomponentedelsubreporteybuscamosenpaneldepropiedadesybuscamos lapropiedad"Parameters"de laseccin "SubreportProperties":
-
14/4/2015 TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes
http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html 9/27
Hacemosclickenelbotn"..."con loqueseabrirunaventanaquenospermiteagregarparmetrosquesernpasadosdel reportemaestroalsubreporte.
Si recuerdan nosotros indicamos en el subreporte que queremos quemuesre lasmaterias en las que est inscrito un alumno con unparticular.Puesbienesaquendondepasamosesedato,el iddelalumnodelqueseestnmostrando losdatos.Esteparametronospermitirpasarleelvaloralparmetro"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"quecreamosenel primer tutorial de la serie, el jar "commonslogging1.1.1.jar", y el jar "mysqlconnectorjava5.1.7bin.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.Siabrimoselarchivoveremosmsomenoslosiguiente:
-
14/4/2015 TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes
http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html 10/27
Con loquecomprobamosqueel reporte, juntoconsusubreporte,sehageneradocorrectamente^^.AhoraveremoscmohacerestomismousandounDataSourcepropio.
2Subreportescondatasourcespropios
Para hacer un subreporte con un datasource propio tambin es necesario conocer un par de secretos, los cuales revelar un unosmomentos.
LoprimeroqueharemosescrearunnuevoproyectoenNetBeans("File>NewProject...>Java>JavaApplication").ConloquesecrearunaclaseMainqueaparecerennuestroeditor.
Recuerdenquetambindebemosagregaralnodo"Libraries"delpanel"Projects"labiblioteca"JasperReports"quecreamosenelprimertutorialdelaserieyeljar"commonslogging1.1.1.jar"
Crearemoslasclasesquemantendrnlosdatosquemostraremosenelreporte("Alumno"y"Materia").Laclase"Alumno"tendrsololosatributos"id","clave"y"nombre"(consuscorrespondientessettersygetters):
publicclassAlumno{privateintidprivateStringclaveprivateStringnombre
publicAlumno(){}
publicAlumno(intid,Stringclave,Stringnombre){this.id=idthis.clave=clavethis.nombre=nombre}
publicStringgetClave(){returnclave}
publicvoidsetClave(Stringclave){this.clave=clave}
publicintgetId(){returnid}
publicvoidsetId(intid){this.id=id}
publicStringgetNombre(){returnnombre
-
14/4/2015 TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes
http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html 11/27
}
publicvoidsetNombre(Stringnombre){this.nombre=nombre}}
Laclase"Materia"tendrlosatributos"id"y"nombre":
publicclassMateria{privateintidprivateStringnombre
publicMateria(){}
publicMateria(intid,Stringnombre){this.id=idthis.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 elmomentomientras creamos laplantilladenuestroreportedesdeiReport.
Abrimosel iReport y creamosunnuevo reporte vacio (menArchivo>New...>Emptyreport). Asignamos al reporte unnombre(queenmicasoser"reporteMaestroDS.jrxml")yloguardamosenlarazdelproyectodeNetBeans.Hacemosclickenelbotn"Finalizar"conloqueveremosaparecerlaplantillavaciadentrodelavista"Designer".
Agregamosunparde fields (claveynombre), yunos textosestticosparaqueeste reportemaestroseasimilaralanterior (eliminalgunasbandasparaqueelreporteseveamsclaro):
Agregamosunfieldadicionalllamado"materiasDS"detipo"net.sf.jasperreports.engine.JRDataSource".Comoestetiponoapareceenelcomboparaseleccindetipodelfielddebemosescribirloenlaventanaqueseabrealpresionarelbotn"..." juntoaestecombobox:
-
14/4/2015 TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes
http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html 12/27
EstefieldserelquediraJasperReportsquedebellamaralgettercorrespondientedelaclaseAlumnoquecrearemosmsadelanteparapreguntaraculesmateriasestinscrito(quedarclarocuandoescribamoselcdigoJava).
Ahoraagregamosarrastramoselelemento"Subreport"delos"ReportElements"alabanda"Details":
Alhacerestoseabrirlaventana"Subreportwizard".Comoahoranousaremosunaconexinnonecesitamosunquery,entoncesnotodoslospasosaplican.
Enelprimerpasoseleccionamossiqueremoscrearunnuevoreportequeservirdesubreporte,usarunreporteexistente,osolocrearunelementosubreporte.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.Comonosotros noestamosusandounaconexin,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>".
Vamosalpaso6.Aqu ledamosunaubicacinyunnombrealproyecto.Ledardenombre"subreporteMateriasDS.jrxml". Loguardamosenelmismodirectorioqueel"reporteMaestroDS.jrxml".Ademsindicamosquequeremosquelarutadelsubreportesealmaceneenunareferenciaestticaabsoluta("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:
-
14/4/2015 TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes
http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html 13/27
Presionamoselbotn"Finalizar"conloqueaprecerelsubreporteenlavistadediseo:
Agregamosdosfields:unoparaelidentificadordelamateria(detipojava.lang.Integer),yunoparaelnombredelamateria(detipojava.lang.String):
Ahoraarreglamosunpocoeldiseodelsubreporteparaqueseveamejor:eliminamoslapgina"PageFooter",agregamos los fieldsqueacabamosdecrearalabanda"Detail",yarreglamosunpocoelttulo.Tambinagregamosunalneaenlabanda"Summary"parasabercuandoterminaelsubreporte:
Guardamoselreporteycambiamosalavistapreviewparacompilarelsubreporte.Enlavistadepreviewdeberianveralgoasi(recuerdenseleccionarquequierenusarel"Emptydatasource"):
AhoraregresemosalreporteMaestro,elcualdebeverseas(despusdeajustareltamaoylaposicindelcomponentesubreporte):
Seleccionamoselelementosubreporteyenelpaneldepropiedadesbuscamoselelemento"SubreportExpression"de laseccin"SubreportProperties".Eliminamoslarutaabsolutaydejamossoloelnombredelreporte("subreporteMateriasDS.jasper"):
-
14/4/2015 TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes
http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html 14/27
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.
Haceunosmomentoscreamosdosclases: "Alumno"y"Materia" ydijimosquean les faltabaalgo: faltacrear la relacinentreunobjeto alumno y las materias que tiene. Para esto agregaremos un atributo de tipo java.util.List a la clase "Alumno" quemantendr la listademateriasa lasqueest inscritoelalumno(consuscorrespondientesgettersysetters).Ademsagregaremosunmtodoauxiliarquenospermitiragregarlasmateriasdeunaformamssimple:
privateListmaterias=newArrayList()
publicListgetMaterias(){returnmaterias}
publicvoidsetMaterias(Listmaterias){this.materias=materias}
publicvoidaddMateria(Materiamateria){this.materias.add(materia)}
Ahoravieneelsegundosecreto para crear subreportes condatasourcepropios: si lo recuerdan,enel reporteMaestro agregamosunparmetrollamado"materiasDS"detipo"net.sf.jasperreports.engine.JRDataSource".Espormediodeesteparmetroqueelreportemaestropreguntaacadaunodelosalumnosconculesmateriasestrelacionado(aculesestinscrito)parapodergenerarelsubreporte.
Eselalumnoelencargadode regresaresta informacinaJasperReportspormediodeungetter,quedebeestr formadosiguienteelpatrn 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.ArrayListimportjava.util.Listimportnet.sf.jasperreports.engine.JRDataSourceimportnet.sf.jasperreports.engine.data.JRBeanCollectionDataSource
-
14/4/2015 TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes
http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html 15/27
/***@authorAlex*/
publicclassAlumno{privateintidprivateStringclaveprivateStringnombreprivateListmaterias=newArrayList()
publicAlumno(){}
publicAlumno(intid,Stringclave,Stringnombre){this.id=idthis.clave=clavethis.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.
-
14/4/2015 TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes
http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html 16/27
Ahoraregresaremosalaclase"Main".Aquiagregaremos2ciclosfor,unoquecrearlasinstanciasde"Alumno"y lasagregara lalistaqueposteriormentepararemoscomoDataSourceyJasperReports, y un ciclo internoquecrear instanciasde "Materia" y lasrelacionarconlosalumnos(todoslosalumnostendrnlasmismastresmateriasenestecaso).Loscliclosquednas(listaAlumnosesunobjetoListquemantendrlosobjetosAlumno):
for(inti=1i
-
14/4/2015 TutorialesdeProgramacionJava:CreacindeReportesconJasperRepotsyiReportsParte7:Subreportes
http://www.javatutoriales.com/2009/04/creaciondereportesconjasperrepotsy_18.html 17/27
PublicadoporAlexen20:00
Reacciones: divertido (0) interesante (0) increible (1) no me gusta (0)
Etiquetas:ireports,jasperreports,java,subreportes
Conloquecomprobamosqueelreportemaestrojuntoconsussubreportessehacreadocorrectamente^^.
Bien, estaesel ltimo tutorial de la serie de JasperReports.Tal vezhagaalgunosotrospost referentesa JasperReports, pero sernapartedelaserie.Esperoquetodolesseadeutilidad.
Noolvidendejarsusdudas,comentariosysugerencias.
Saludos.
Visitalaparte1deestetutorial:ReportesconConexinaBasesdeDatosVisitalaparte2deestetutorial:UsandoDataSourcesPersonalizadosVisitalaparte3deestetutorial:ParmetrosyVariablesVisitalaparte4deestetutorial:ReportesenaplicacioneswebVisitalaparte5deestetutorial:GrficasenReportesVisitalaparte6deestetutorial:Grupos
+10 Recomendar esto en Google
45comentarios:
Annimo 18demayode2009,8:21
Buensimblog,loseguirdecerca.Ygraciasporcompartirinformacion
Responder
Annimo 18demayode2009,9:52
Quetalcomoestsmuchasgraciasporestemanualestmuybienexplicado,peroquisierapreguntartealgo,seguelmanualpasoapasotengounreporteenelqueelreportemaestrosellenacondatosdedostablasyelsubreportedeunaterceratabla,peroaldarelparametroalgunasvecesmedicequeeldocumentonotienepginasyalgunasvecesmesalelosiguiente:Errorfillingprint...Unknowncolumnname:Folionet.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)noestperegresando el valor que pasa a la propiedad "Parameters" de la seccin "SubreportProperties" (que supongo que se llama "Folio").