2012-03-20 37 views
6

trong dự án Java của tôi Tôi có rất nhiều báo cáo JasperReports với các truy vấn SQL phức tạp, chứa rất nhiều tham số. Các báo cáo được sử dụng để tạo các tài liệu pdf chứa dữ liệu được truy vấn trả về, được nhóm và định dạng theo nhiều cách khác nhau.Xuất kết quả truy vấn JasperReports

Bây giờ tôi cũng có nhu cầu xuất trực tiếp kết quả truy vấn (ví dụ: ResultSet hoặc Bản đồ hoặc tệp csv hoặc tương tự ...). Có thể yêu cầu JasperReport chỉ thực hiện truy vấn và trả lại kết quả thay vì hiển thị trang pdf không?

(LƯU Ý: nó không giống như chọn định dạng đầu ra csv để hiển thị báo cáo, vì phương pháp này cố chuyển đổi thiết kế báo cáo thành tệp csv ... Thay vào đó, tôi chỉ muốn "sử dụng lại" truy vấn trong một báo cáo, cũng lợi dụng JR thông số quản lý, vv ...)

Đây là mã Java của tôi để tạo ra một tài liệu pdf từ một báo cáo:

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; 

tôi thấy có một lớp được gọi là JRJdbcQueryExecuter bên trong JasperReports ... Có thể gọi trực tiếp thay vì gọi fillReport, để có được ResultSet của truy vấn SQL được thực hiện?

Cảm ơn

+0

Tại sao bạn muốn sử dụng API JasperReports để giải quyết tác vụ này? –

+0

Như tôi đã nói trước đây, tôi có rất nhiều báo cáo chứa các truy vấn sql dài (với nhiều tham số) và tạo ra các kết xuất pdf phức tạp, nhóm dữ liệu lại với nhau, v.v .. Bây giờ tôi cũng phải trích xuất kết quả truy vấn cơ sở dữ liệu mà không cần xử lý, nhóm hoặc hiển thị bất kỳ loại nào. Nó giống như tôi tự sao chép truy vấn từ một báo cáo, tôi thay thế tất cả $ P {} bằng các giá trị thực, tôi dán nó vào trong một máy khách SQL, thực hiện nó và giải nén nó dưới dạng tệp csv. Tôi đang tìm một cách tự động để làm điều này bằng mã, lợi dụng việc quản lý các tham số JR và thu thập truy vấn được phân tích cú pháp và sẵn sàng thực hiện ... –

+0

Và mục đích của công việc này là gì? Bạn sẽ làm gì với ResultSet đã trả về? Chỉ cần thú vị ... –

Trả lời

7

Tôi muốn bắt đầu với điều này cảm thấy sai lầm và hacky, nhưng nó là có thể, trừ thực sự có JasperReports thực hiện truy vấn.

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

Lưu ý: Không có kiểm tra lỗi ở đây, và bạn nên thêm rằng. Cũng không chắc chắn nếu làm điều này là một ý tưởng tuyệt vời. Nó có thể là tốt hơn để di chuyển các truy vấn ra khỏi các báo cáo và vào mã java của bạn hoàn toàn. Sau đó, chỉ cần vượt qua trong ResultSet như một nguồn dữ liệu và bạn tốt để đi.

+0

Không hoạt động. QueryString vẫn bao gồm các tham số trong định dạng JR (ví dụ: $ P {PARAM_1}), không được phân tích cú pháp. Tôi đang tìm cách trích xuất truy vấn cuối cùng dưới dạng Chuỗi để thực thi theo cách thủ công hoặc một cách để chặn khoảnh khắc khi JR thực thi nó và nhận lại kết quả thay vì tiếp tục với việc hiển thị tài liệu ... –

+0

Bạn có chắc chắn về điều đó, khi tôi chạy nó các thông số được thay thế bằng '?' nhân vật. Điều gì về looping thông qua JRQueryChunks? Bạn có thể xây dựng lại truy vấn và tự thay thế các tham số bằng dấu chấm hỏi. –

+0

Ok, tôi đã thay đổi nó một chút và bây giờ nó hoạt động như một sự quyến rũ. Cảm ơn! :) –

Các vấn đề liên quan