2012-03-20 18 views
6

मेरी जावा प्रोजेक्ट में मेरे पास जटिल SQL क्वेरी के साथ बहुत सारे जैस्पर रिपोर्ट्स रिपोर्ट हैं, जिनमें बहुत से पैरामीटर हैं। रिपोर्ट का उपयोग पीडीएफ दस्तावेजों के उत्पादन के लिए किया जाता है जिसमें क्वेरी द्वारा लौटाए गए डेटा, समूहबद्ध और विभिन्न तरीकों से स्वरूपित किया जाता है।निर्यात जैस्पर रीपॉर्ट्स क्वेरी परिणाम

अब मुझे सीधे क्वेरी परिणाम निर्यात करने की आवश्यकता है (उदाहरण के लिए एक परिणामसेट, या एक मानचित्र या एक सीएसवी फ़ाइल, या इसी तरह ...)। क्या JasperReports को केवल क्वेरी निष्पादित करने और पीडीएफ पृष्ठ को प्रस्तुत करने के बजाय परिणाम लौटने के लिए पूछना संभव है?

(नोट: यह रिपोर्ट प्रतिपादन में एक सीएसवी आउटपुट प्रारूप चुनने जैसा नहीं है, क्योंकि यह विधि रिपोर्ट डिज़ाइन को एक csv फ़ाइल में कनवर्ट करने का प्रयास करती है ... इसके बजाय, मैं केवल "पुन: उपयोग" करना चाहता हूं एक रिपोर्ट के अंदर क्वेरी, जे आर का लाभ भी ले जा पैरामीटर प्रबंधन, आदि ...)

यह मेरा जावा एक रिपोर्ट से एक पीडीएफ दस्तावेज़ निर्माण करने के लिए कोड है:

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; 

मैंने देखा कि वहाँ एक वर्ग JRJdbcQueryExecuter कहा जाता है JasperReports के अंदर ... पर कॉल करने के बजाय इसे सीधे कॉल करना संभव है 0, निष्पादित SQL क्वेरी के परिणामसेट प्राप्त करने के लिए?

धन्यवाद

+0

आप इस कार्य को हल करने के लिए JasperReports API का उपयोग क्यों करना चाहते हैं? –

+0

जैसा कि मैंने पहले कहा था, मेरे पास बहुत सी रिपोर्टें हैं जिनमें लंबे एसक्यूएल प्रश्न (कई पैरामीटर के साथ) शामिल हैं और जटिल पीडीएफ प्रस्तुतिकरण, डेटा एकत्र करने, आदि का उत्पादन करते हैं .. अब मुझे किसी भी प्रोसेसिंग के बिना डेटाबेस क्वेरी परिणाम निकालना होगा, समूह, या किसी भी तरह का प्रतिपादन। ऐसा लगता है कि मैं मैन्युअल रूप से एक रिपोर्ट से क्वेरी की प्रतिलिपि बनाता हूं, मैं वास्तविक मूल्यों के साथ सभी $ पी {} को प्रतिस्थापित करता हूं, मैं इसे SQL क्लाइंट के अंदर पेस्ट करता हूं, इसे निष्पादित करता हूं और इसे एक सीएसवी फ़ाइल के रूप में निकाला जाता हूं। मैं कोड द्वारा ऐसा करने का एक स्वचालित तरीका ढूंढ रहा हूं, जेआर पैरामीटर प्रबंधन का लाभ उठा रहा हूं और निष्पादन के लिए तैयार क्वेरी प्राप्त कर रहा हूं ... –

+0

और इस काम का उद्देश्य क्या है? रिटर्न रिसेटसेट के साथ आप क्या करेंगे? बस दिलचस्प ... –

उत्तर

7

मैं के साथ इस गलत और hacky का मानना ​​है कि शुरू करना चाहते हैं, लेकिन यह संभव है, शून्य से क्वेरी को क्रियान्वित करने वास्तव में होने JasperReports।

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

नोट: यहाँ जाँच कोई त्रुटि नहीं है, और आप उस जोड़ना चाहिए। यह भी सुनिश्चित नहीं है कि ऐसा करना एक अच्छा विचार है। रिपोर्टों और प्रश्नों को अपने जावा कोड में पूरी तरह से ले जाने के लिए बेहतर हो सकता है। फिर बस डेटासेट के रूप में परिणामसेट में पास करें और आप जाने के लिए अच्छे हैं।

+0

काम नहीं करता है। क्वेरीस्ट्रिंग में अभी भी जेआर प्रारूप (जैसे $ पी {PARAM_1}) में पैरामीटर शामिल हैं, पार्स नहीं किया गया है। मैं इसे मैन्युअल रूप से निष्पादित करने के लिए अंतिम स्ट्रिंग को स्ट्रिंग के रूप में निकालने का तरीका ढूंढ रहा हूं, या जब जेआर इसे निष्पादित करता है तो उस क्षण को अवरुद्ध करने का तरीका ढूंढता है और दस्तावेज़ प्रतिपादन के साथ जारी रखने के बजाय परिणाम प्राप्त करता है ... –

+0

क्या आप इसके बारे में निश्चित हैं, जब मैंने इसे पैरामीटर चलाया जहां '?' के साथ प्रतिस्थापित किया गया वर्ण। JRQueryChunks के माध्यम से लूपिंग के बारे में क्या? आप क्वेरी को पुनर्निर्माण कर सकते हैं और पैरामीटर को प्रश्न चिह्नों के साथ प्रतिस्थापित कर सकते हैं। –

+0

ठीक है, मैंने इसे थोड़ा बदल दिया और अब यह एक आकर्षण की तरह काम करता है। धन्यवाद! :) –

संबंधित मुद्दे