2012-03-20 13 views
6

nel mio progetto Java Ho un sacco di rapporti JasperReports con query SQL complesse, contenenti molti parametri. I report vengono utilizzati per produrre documenti pdf contenenti i dati restituiti dalla query, raggruppati e formattati in vari modi.Esporta i risultati delle query JasperReports

Ora ho anche la necessità di esportare direttamente il risultato della query (ad esempio un ResultSet o una mappa o un file csv o simile ...). È possibile chiedere a JasperReports di eseguire solo la query e restituire risultati invece di rendere la pagina pdf?

(NOTA: non è lo stesso di scegliere un formato di output csv per il rendering del report, perché questo metodo tenta di convertire la progettazione del report in un file CSV ... Invece, mi piacerebbe solo "riutilizzare" il interrogazione all'interno di un rapporto, anche approfittando della JR parametri di gestione, ecc ...)

Questo è il mio codice Java per la produzione di un documento PDF da un rapporto:

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; 

ho visto c'è una classe chiamata JRJdbcQueryExecuter all'interno di JasperReports ... È possibile chiamarlo direttamente invece di chiamare fillReport, per ottenere il ResultSet della query SQL eseguita?

Grazie

+0

Perché si desidera utilizzare l'API JasperReports per risolvere questo problema? –

+0

Come ho detto prima, ho molti report che contengono lunghe query SQL (con molti parametri) e producono rendering di PDF complessi, raggruppando dati, ecc. Ora devo anche estrarre i risultati della query del database, senza alcuna elaborazione, raggruppamento o rendering di qualsiasi tipo. È come se copi manualmente la query da un report, sostituisco tutto $ P {} con valori effettivi, lo incollo all'interno di un client SQL, lo eseguo ed estrai come file csv. Sto cercando un modo automatico per farlo in base al codice, sfruttando la gestione dei parametri JR e ottenendo la query analizzata e pronta per l'esecuzione ... –

+0

E qual è lo scopo di questo lavoro? Cosa farai con ResultSet restituito? Solo interessante ... –

risposta

7

Vorrei iniziare con che questo si sente male e hacky, ma è possibile, meno in realtà avendo JasperReports l'esecuzione della query.

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: Non v'è alcun controllo degli errori qui, e si dovrebbe aggiungere che. Inoltre non sono sicuro se farlo è una grande idea. Potrebbe essere meglio spostare le query dai report e nel codice java del tutto. Quindi passa il ResultSet come origine dati e sei pronto per partire.

+0

Non funziona. La queryString include ancora parametri nel formato JR (ad esempio $ P {PARAM_1}), non analizzati. Sto cercando un modo per estrarre la query finale come una stringa per eseguirla manualmente, o un modo per intercettare il momento in cui JR la esegue e ottenere i risultati invece di continuare con il rendering del documento ... –

+0

Ne sei sicuro, quando l'ho eseguito, i parametri sono stati sostituiti con "?" personaggi. Che ne pensi di fare il ciclo attraverso JRQueryChunks? È possibile ricostruire la query e sostituire personalmente i parametri con punti interrogativi. –

+0

Ok, l'ho cambiato un po 'e ora funziona come un incantesimo. Grazie! :) –

Problemi correlati