2012-03-20 23 views
6

私のJavaプロジェクトでは、多くのパラメータを含む複雑なSQLクエリを含むJasperReportsレポートがたくさんあります。レポートは、クエリによって返されたデータを含むpdfドキュメントを作成するために使用され、さまざまな方法でグループ化され、フォーマットされます。JasperReportsのクエリ結果をエクスポートする

ここでは、クエリ結果(例:ResultSet、Map、CSVファイルなど)を直接エクスポートする必要もあります。 JasperReportsにクエリのみを実行し、pdfページをレンダリングする代わりに結果を返すようにすることはできますか?

(注:レポートのデザインをcsvファイルに変換しようとするため、レポートのレンダリングにcsv出力形式を選択するのと同じではありません...代わりに、私は「再利用」したいレポート内のクエリは、JRのも活かし、パラメータ管理、等...)

これはレポートからPDF文書を生成するために、私のJavaコードです:JRJdbcQueryExecuterと呼ばれるクラスがあります私が見た

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; 

内部のJasperReports ... の代わりに直接呼び出すことはできますか0、実行されたSQLクエリのResultSetを取得するには?私は、これは間違っていると感じているハックが、それは可能であるが、マイナス実際にクエリを実行するのJasperReportsを持つことを始めたいと思い

おかげ

+0

なぜこのタスクを解決するためにJasperReports APIを使用しますか? –

+0

私は前に述べたように、長いSQLクエリ(多くのパラメータを含む)を含み、複雑なpdfレンダリング、データのグループ化などを含む多くのレポートを持っています。グループ化、またはレンダリングを行うことができます。レポートからクエリを手動でコピーするのと同じように、すべての$ P {}を実際の値に置き換え、SQLクライアントにペーストして実行し、csvファイルとして抽出します。私はコードでこれを行う自動方法を探していますJRパラメータ管理を利用し、クエリを解析し、実行の準備ができて取得します。 –

+0

そしてこの作品の目的は何ですか?あなたは返されたResultSetで何をしますか?ちょうど面白い... –

答えて

7

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(); 

注:あり、ここでチェックエラーがありません、あなたはそれを追加する必要があります。これを行うことが良い考えであるかどうかもわかりません。クエリーをレポートからJavaコード全体に移動する方が良いかもしれません。それから、ResultSetをデータソースとして渡すだけでよいです。

+0

動作しません。 queryStringにはまだ解析されていないJR形式のパラメータ(例:$ P {PARAM_1})が含まれています。 最終的なクエリーを手動で実行するためにStringとして抽出する方法、またはJRがそれを実行してドキュメントのレンダリングを続ける代わりに結果を取得する瞬間を傍受する方法を探しています。 –

+0

あなたはそれについて確信していますか?パラメータをどこで '?'文字。 JRQueryChunksをループするのはどうですか?クエリを再作成し、パラメータを疑問符で置き換えることができます。 –

+0

さて、少し変えましたが、今は魅力的です。ありがとう! :) –

関連する問題