llamar un reporte (iReport) con subreportes desde una jsp
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
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
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.
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.