2012-04-04 10 views
8

मेरे पास एक स्टैंडअलोन एप्लिकेशन है, और इसके कर्तव्यों में से एक * .jrxml फ़ाइल का पथ लेना और संकलित करना है।जैस्पर रिपोर्ट्स: सब्रेपोर्ट्स को संकलित कैसे करें

मैं बिना किसी समस्या के यह कर सकता हूं जब तक कि एक सब्रेपोर्ट के साथ कोई रिपोर्ट नहीं आती है, जहां मास्टर का संकलन उसके किसी भी बच्चे को संकलित नहीं करता है, जिसके परिणामस्वरूप एक उप -पोर्ट * .jasper फ़ाइल बाद में ट्रैक के नीचे नहीं मिलती है।

वहाँ

1) JasperCompileManager स्वचालित रूप से subreports लेने के लिए सेट करने के लिए कोई तरीका है?

2) किसी जैस्परडिज़ाइन या जैस्पर रिपोर्ट ऑब्जेक्ट में निहित उप-रिपोर्टों के पथों की एक सूची प्राप्त करें?

मेरे पास jrxml फ़ाइलों तक कोई सीधी पहुंच नहीं है, इसलिए संकलन विधि के अनुरूप रिपोर्ट को संशोधित करना एक विकल्प नहीं है, न ही कोई मानक नामकरण योजना लागू कर रहा है ताकि अनुमान लगाया जा सके कि कौन से सबरेपोर्ट्स रिपोर्ट हैं।

यहाँ एक ऐसी ही समस्या है:

http://jasperforge.org/plugins/espforum/view.php?group_id=102&forumid=103&topicid=40683

जहां एक JRVisitor JRSubreport वस्तुओं की एक सूची उत्पादन किया जाता है, लेकिन वहाँ है कि यह कैसे उपयोग करने के लिए subreport करने के लिए एक रास्ता पाने के लिए की कोई स्पष्टीकरण नहीं है इसे संकलित करने के लिए और subreports के subreports के लिए रिकर्सिव रूप से देखने के लिए, और मैं इसे समझ नहीं सकता।

+0

मैं भी उत्तर सुनना चाहता हूं। मैंने सीधे उप रिपोर्ट की * .jasper फ़ाइल को लिंक समाप्त कर दिया, फिर इसे फ्लाई पर संकलित करें। :( –

+0

डिस्क पर फ़ाइलों को सहेजे बिना हल की गई समस्या: http://stackoverflow.com/questions/9785451/generate-jasper-report-with-subreport-from-java –

उत्तर

8

ठीक है, तो यह hackery का एक सा आवश्यक है, लेकिन मैं कुछ यह पता लगाने में सक्षम था ...

subreport.getExpression()। Gettext() में subreport विजेट बात की अभिव्यक्ति क्षेत्र देता है मास्टर रिपोर्ट, और एक स्ट्रिंग है कि इस

$P{SUBREPORT_DIR} + "/report_sub1.jasper" 

तो मैं यह अलग खींचने निम्नलिखित का उपयोग कर नाम प्राप्त करने में सक्षम था तरह दिखता है। यह आदर्श नहीं है, लेकिन इसे पकड़ना चाहिए।

JRElementsVisitor.visitReport(jasperReport, new JRVisitor(){ 

    // ** snip other overrides ** 

    @Override 
    public void visitSubreport(JRSubreport subreport){ 
    String expression = subreport.getExpression().getText().replace(".jasper", ".jrxml"); 
    StringTokenizer st = new StringTokenizer(expression, "\"/"); 
    String subreportName = null; 
    while(st.hasMoreTokens()) 
     subreportName = st.nextToken(); 
    compileReport(subreportName); 
    } 
} 

संपादित करें:

यहाँ मेरा पूरा compileReport विधि, प्रदर्शन कैसे रिकर्सिवली subreports आदि सही नहीं, लेकिन मेरे अनुप्रयोग के लिए काफी अच्छा के subreports संकलित करने के लिए है। सभी संकलित * .jasper फ़ाइलों को उसी स्थान पर डिस्क पर वापस सहेजा जाता है क्योंकि असम्पीडित * .jrxml फ़ाइलों को उठाया गया था, लेकिन यह बदलना मुश्किल नहीं होगा। संकलित मुख्य रिपोर्ट ऑब्जेक्ट वापस ले लिया जाता है जिसमें आप इसे चलाने या जो भी चलाना चाहते हैं।

याद रखें कि इस संपादन के समय यह कोड 9 महीने पुराना है, और जैस्पर रिपोर्ट के नए संस्करणों में अब इस तरह की चीज़ के लिए एक अंतर्निहित कार्य हो सकता है।

private static final String reportsPath = "someplace/nice/"; 
private ArrayList<String> completedSubReports = new ArrayList<String>(30); 
private Throwable   subReportException = null; 

/** 
* Recursively compile report and subreports 
*/ 
public JasperReport compileReport(String reportName) throws Throwable{ 
    JasperDesign jasperDesign = JRXmlLoader.load(reportsPath + reportName + ".jrxml"); 
    JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign); 
    JRSaver.saveObject(jasperReport, reportsPath + reportName + ".jasper"); 
    toLog("Saving compiled report to: " + reportsPath + reportName + ".jasper"); 
    //Compile sub reports 
    JRElementsVisitor.visitReport(jasperReport, new JRVisitor(){ 
    @Override 
    public void visitBreak(JRBreak breakElement){} 

    @Override 
    public void visitChart(JRChart chart){} 

    @Override 
    public void visitCrosstab(JRCrosstab crosstab){} 

    @Override 
    public void visitElementGroup(JRElementGroup elementGroup){} 

    @Override 
    public void visitEllipse(JREllipse ellipse){} 

    @Override 
    public void visitFrame(JRFrame frame){} 

    @Override 
    public void visitImage(JRImage image){} 

    @Override 
    public void visitLine(JRLine line){} 

    @Override 
    public void visitRectangle(JRRectangle rectangle){} 

    @Override 
    public void visitStaticText(JRStaticText staticText){} 

    @Override 
    public void visitSubreport(JRSubreport subreport){ 
     try{ 
     String expression = subreport.getExpression().getText().replace(".jasper", ""); 
     StringTokenizer st = new StringTokenizer(expression, "\"/"); 
     String subReportName = null; 
     while(st.hasMoreTokens()) 
      subReportName = st.nextToken(); 
     //Sometimes the same subreport can be used multiple times, but 
     //there is no need to compile multiple times 
     if(completedSubReports.contains(subReportName)) return; 
     completedSubReports.add(subReportName); 
     compileReport(subReportName); 
     } 
     catch(Throwable e){ 
     subReportException = e; 
     } 
    } 
    @Override 
    public void visitTextField(JRTextField textField){} 

    @Override 
    public void visitComponentElement(JRComponentElement componentElement){} 

    @Override 
    public void visitGenericElement(JRGenericElement element){} 
    }); 
    if(subReportException != null) throw new RuntimeException(subReportException); 
    return jasperReport; 
} 
+0

'compileReport() 'क्या करता है? subreports का संकलन संग्रहीत किया जाता है? डिस्क पर? – dzieciou

+0

@dzieciou ऊपर संपादित उत्तर देखें। – Numeron

+0

मुझे पता है कि इसमें लगभग 2 साल का है। लेकिन यह जवाब मेरे लिए आकर्षण की तरह काम करता था। धन्यवाद –

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