tutoriales de programacion java_ creación de reportes con jasperrepots y ireports - parte 7_...

17
Blog dedicado a temas de programación actuales usando el lenguaje de programación Java y las últimas versiones de sus APIs y Herram Tutoriales de Programacion Java Página principal Página de Concursos Tutoriales UPAO 2010 Presentaciones Capacitación SÁBADO, 18 DE ABRIL DE 2009 Creación de Reportes con JasperRepots y iReports Parte 7: Subreportes Visita la parte 1 de este tutorial: Reportes con Conexión a Bases de Datos Visita la parte 2 de este tutorial: Usando DataSources Personalizados Visita la parte 3 de este tutorial: Parámetros y Variables Visita la parte 4 de este tutorial: Reportes en aplicaciones web Visita la parte 5 de este tutorial: Gráficas en Reportes Visita la parte 6 de este tutorial: Grupos Los subreportes son una característica importante de una herramienta generadora de reportes. Permiten crear reportes más complejos y simplificar el trabajo de diseño. Los subreportes son muy útiles cuando se crea un reporte maestro de detalles o cuando la estructura de un solo reporte no es suficiente para describir la complejidad del documento de salida deseado. Un subreporte es solamente un reporte que ha sido incorporado a otro reporte. De hecho podemos tener subreportes dentro de otros subreportes. En este último tutorial de la serie de JasperReports y iReports veremos cómo crear subreportes haciendo uso de estas dos herramientas. Veremos dos ejemplos, el primero mostrará cómo hacer los subreportes mediante una conexión JDBC a la base de datos. El segundo mostrará como hacerlo con un DataSource propio. En ambos casos crearemos un reporte de alumnos de una escuela y subreportes de cada uno de los alumnos con la lista de materias que tiene cada uno (aunque por facilidad todos tendrán las mismas materias cuando hagamos el ejemplo con el DataSource propio). 1 Subreportes con conexión a base de datos Lo primero que haremos es generar una base de datos de prueba. Yo hare uso de MySql 5.1, pero pueden usar el manejador que más les guste. Creamos una base de datos llamada "pruebaReportes" y usamos el siguiente script para crear la tabla "alumnos": CREATE TABLE `alumnos` ( `ID` bigint(21) NOT NULL, `NOMBRE` varchar(100) NOT NULL, `CLAVE` varchar(100) NOT NULL, PRIMARY KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 después este para las materias: CREATE TABLE `materias` ( `ID` BIGINT(21) NOT NULL, `NOMBRE` VARCHAR(100) NOT NULL, PRIMARY KEY (`ID`) ) ENGINE=INNODB DEFAULT CHARSET=latin1 y finalmente esta será la tabla intermedia, o tabla de unión de las dos anteriores (ya que se generará una relación N:M entra ambas): CREATE TABLE `alumnos_materias` ( `ALUMNO_ID` BIGINT(21) NOT NULL, `MATERIA_ID` BIGINT(21) NOT NULL, PRIMARY KEY (`ALUMNO_ID`, `MATERIA_ID`), FOREIGN KEY (`ALUMNO_ID`) REFERENCES `alumnos` (`ID`), FOREIGN KEY (`MATERIA_ID`) REFERENCES `materias` (`ID`) ) ENGINE=INNODB DEFAULT CHARSET=latin1 DONACIONES JAVA TUTORIALES EN FACEBO Java Tutoriales A 24 386 personas les gusta Jav Plugin social de Facebook Me gusta Java Tutoriales añadido una foto 16 Me gusta · Se ha compartid Me gusta Comentar 13 de marzo 10 Más Siguiente blog»

Upload: ben-avraham

Post on 11-Nov-2015

14 views

Category:

Documents


6 download

DESCRIPTION

tip

TRANSCRIPT

  • 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").