llamar un reporte (iReport) con subreportes desde una jsp

Santiago
27 de Febrero del 2006
Tengo un reporte maestro que llama a dos subreportes. Y quiero abrir el reporte completo desde una jsp.
Cuando ejecuto esto, me muestra s贸lo el archivo maestro.
Este es el c贸digo:

ResourceBundle recurso = (ResourceBundle)session.getAttribute("recurso");
BaseDatos baseDatos = new BaseDatos();
Connection conn = baseDatos.conectar();
Integer id = new Integer(request.getParameter("id"));

System.setProperty(
"jasper.reports.compile.class.path",
application.getRealPath("/WEB-INF/lib/jasperreports-0.6.0.jar") +
System.getProperty("path.separator") +
application.getRealPath("/WEB-INF/classes/")
);

System.setProperty(
"jasper.reports.compile.temp",
application.getRealPath("/reportes/iReport/")
);

JasperCompileManager.compileReportToFile(application.getRealPath("/reportes/iReport/Negociacion_prueba.jrxml"));

//---

File reportFile = new File(application.getRealPath("/reportes/iReport/Negociacion_prueba.jasper"));
String sub1 = (String) application.getRealPath("/reportes/iReport/Productos.jasper");

Map parameters = new HashMap(); //en parameters hay q meterle todos los campos q muestra el reporte
parameters.put("idNegociacion",id);
parameters.put("localizacion_subreporte", sub1);

byte[] bytes = JasperRunManager.runReportToPdf(reportFile.getPath(), parameters, conn);

response.setContentType("application/pdf");
response.setContentLength(bytes.length);
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes, 0, bytes.length);
ouputStream.flush();
ouputStream.close();

Muchas Gracias


antonio
27 de Febrero del 2006
Me parece que lo que est谩s teniendo es un problema de conexi贸n en el subreporte. Si dices que solo te muestra el reporte maestro pero no el subreporte, lo que me parece es que no le est谩s pasando una conexi贸n al subreporte.

El subreporte es como el reporte, necesita de una conexi贸n o un datasource a la hora de rellenarse.

La conexi贸n o el datasource seg煤n sea, no se establece en el jrxml ni en el jasper, se establece a la hora de rellenar el reporte.

Con el ireport lo establecemos de manera facil y podemos cambiarlas mediantes "Fuentes de datos>Conexiones/Fuentes de datos"

Esta conexi贸n se establece mediante un parametro REPORT_CONNECTION que tienen todos los reportes y que puede ser de tipo Connection o Datasource.

Cuando creamos un subreporte, lo m谩s normal es pasarle la misma conexi贸n que la empleada para rellenar el reporte maestro. (Siempre que vayamos a utilizar la misma conexi贸n a BBDD claro)

Esto es muy sencillo, solo hay que ir a las propiedades del subreporte y en la pesta帽a Subreport, le indicamos "Use connection expression" (por lo menos en mi caso que le paso la conexi贸n).

De esta manera se rellenara como:
$P{REPORT_CONNECTION}

Es decir le pasar谩 al subreporte el parametro REPORT_CONNECTION que recibe el parametro maestro.

Este REPORT_CONNECTION se rellenar谩 mediante la conexi贸n que tengamos seleccionada cuando pulsemos el boton de "Report using a connection" (el boton verde con base de datos).

A la hora de que funcione en la aplicacion deberemos pasarle la conexi贸n de igual modo que la configuramos en el iReport, ya que no se guardan datos de la conexi贸n en el jrxml, ni en el jasper. La conexi贸n es un dato que se establece en el momento de rellenado del reporte nada m谩s.


Espero te sirva de ayuda. ;) un saludo.