2012-03-20 21 views
6

en mi proyecto Java Tengo muchos informes JasperReports con consultas SQL complejas, que contienen muchos parámetros. Los informes se utilizan para producir documentos en formato PDF que contienen los datos devueltos por la consulta, agrupados y formateados de varias maneras.Exportar JasperInforma los resultados de la consulta

Ahora también tengo la necesidad de exportar directamente el resultado de la consulta (por ejemplo, un ResultSet, o un mapa o un archivo csv, o similar ...). ¿Es posible pedir a JasperReports que ejecute solo la consulta y devuelva resultados en lugar de mostrar la página en pdf?

(NOTA: no es lo mismo que elegir un formato de salida csv para la representación del informe, porque este método intenta convertir el diseño del informe en un archivo csv ... En cambio, me gustaría solo "reutilizar" el consulta dentro de un informe, aprovechando también JR parámetros de gestión, etc ...)

Este es mi código Java para producir un documento PDF a partir de un informe:

JasperReport report = (JasperReport) JRLoader.loadObject(inStream); 
JasperPrint jasperprint = JasperFillManager.fillReport(report, params, conn); 
JRAbstractExporter exporter = new JRPdfExporter(); 
exporter.exportReport(); 
ByteArrayOutputStream os = (ByteArrayOutputStream) exporter.getParameter(JRExporterParameter.OUTPUT_STREAM); 
byte[] formattedReportBytes = os.toByteArray(); 
return formattedReportBytes; 

vi que hay una clase llamada JRJdbcQueryExecuter dentro de JasperReports ... ¿Es posible llamarlo directamente en lugar de llamar al fillReport, para obtener el ResultSet de la consulta SQL ejecutada?

Gracias

+0

¿Por qué quieres utilizar la API JasperReports para resolver esta tarea? –

+0

Como dije antes, tengo muchos informes que contienen largas consultas SQL (con muchos parámetros) y producen representaciones complejas de PDF, agrupan datos, etc. Ahora también tengo que extraer los resultados de la consulta de la base de datos, sin ningún procesamiento, agrupación o representación de cualquier tipo. Es como copiar manualmente la consulta de un informe, sustituyo todos $ P {} con valores reales, lo pego dentro de un cliente SQL, lo ejecuto y lo extraigo como un archivo csv. Estoy buscando una forma automática de hacer esto por código, aprovechando la administración de parámetros JR y obteniendo la consulta analizada y lista para su ejecución ... –

+0

¿Y cuál es el propósito de este trabajo? ¿Qué vas a hacer con ResultSet devuelto? Simplemente interesante ... –

Respuesta

7

me gustaría comenzar con que esto se siente mal y hacky, pero es posible, menos realidad que tienen JasperReports ejecutar la consulta.

JasperReport report = (JasperReport) JRLoader.loadObject(inStream); 

//this is the actual query in the report 
JRQuery query = report.getMainDataSet().getQuery; 

//once here you get the entire sql string, this will have any parameters replaced with 
//the '?' character 
String queryString = query.getText(); 

//now start building your prepared statement, I am assuming you already have your 
//connection in the conn variable 
PrepararedStatment statement = con.prepareStatement(queryString); 

//almost there, need to set the parameters 
//the sql query is broke up into chunks inside the JRQuery. The chunks have types 
//that are either text, parameter, or parameter clause. We care about parameter, 
//not sure what parameter clause would be to be honest 
int index = 0; //this is the index to set the parameter at in the statement 
for (JRQueryChunk chunk : query.getChunks()){ 
    if (chunk.getType() == JRQueryChunk .TYPE_PARAMETER){ 
     statement.setObject(index, params.get(chunk.getText())); 
     index = index + 1; 
    } 
} 
//then execute the query 
ResultSet results = statement.executeQuery(); 

Nota: No hay ninguna comprobación de errores aquí, y usted debe añadir que. Además, no estoy seguro si hacer esto es una gran idea. Sería mejor mover las consultas de los informes y en su código de Java por completo. Luego simplemente pase el ResultSet como fuente de datos y estará listo para continuar.

+0

No funciona. QueryString aún incluye parámetros en el formato JR (por ejemplo, $ P {PARAM_1}), no analizados. Estoy buscando una manera de extraer la consulta final como una cadena para ejecutarla manualmente, o una forma de interceptar el momento en que JR lo ejecuta y obtener los resultados en lugar de continuar con la representación del documento ... –

+0

¿Estás seguro de eso, cuando lo ejecuté los parámetros fueron reemplazados por '?' caracteres. ¿Qué pasa con el bucle a través de JRQueryChunks? Puede reconstruir la consulta y reemplazar los parámetros usted mismo con signos de interrogación. –

+0

Ok, lo cambié un poco y ahora funciona como un encanto. ¡Gracias! :) –

Cuestiones relacionadas