2016-04-02 7 views
-1

Ich habe hier und Jasper gereinigt und kann kein herunterladbares, funktionierendes Beispiel für die Verwendung einer XML-Subdatasource finden. Ich verstehe die Probleme in Bezug auf die Besetzung und so, aber ich kenne Jasper nicht genug, um zu wissen, was ich falsch mache, mit verschiedenen Notizen überall. Also, wenn ich hatte XML, das aussah ...Auf der Suche nach einem Arbeitsbeispiel von JasperStudio xml subdatasource

<a> 
    <b> 
    <c> 
     <d> 
     <e> 
    </c> 
    <f> 
</a> 

ich leicht einen übergeordneten Bericht über/a, die b und f liefert machen kann. Aber alle meine Versuche, einen Unterbericht mit subdatasource (on/a/c) zu erstellen, sind fehlgeschlagen. Wenn jemand ein solches hat, das ziemlich einfach ist und funktioniert, wäre es sehr zu schätzen, weil ich ernsthaft kein funktionierendes Beispiel im Web finden kann - selbst der Jasper 6.2-Beispielcode wurde mit einem anderen Mechanismus erstellt.

Antwort

2

Um eine SubDataSource an einen Unterbericht zu übergeben, müssen Sie einen Datenquellenausdruck hinzufügen.

Dieser Ausdruck ist in der Regel ein Aufruf an eine der API-Methoden des JRXmlDataSource: dataSource([...]) oder subDataSource([...]) wie hier im javadoc beschrieben: http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/data/JRXmlDataSource.html#method_summary

Sie bearbeiten/Datenquelle Expression hinzufügen können entweder manuell oder mit Hilfe von JasperSoft Studio (JSS). In beiden Fällen wird angenommen, dass Sie bereits über Knoten vom Typ "a" aus Ihrem XML-Code iterieren.

Wenn mit JSS arbeiten, bearbeiten Sie einfach die Subreport Eigenschaft „Expression Datenquelle“ mit diesem Ausdruck:

((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}) 
.subDataSource("/c") 

Der Ausdruck kann kürzer sein, wenn Sie im Bericht des erweiterten Eigenschaften die Klasse in Ihrem Bericht zu importieren, in der Regel auf diesem Weg: Misc> Importe

Wenn Sie wählen, um dies manuell zu tun, dann sollten Sie so etwas wie dies in Ihrem JRXML haben:

<jasperReport ...> 
    <import value="net.sf.jasperreports.engine.data.JRXmlDataSource"/> 
    ... 

    <subreport> 
    <reportElement .../> 
    <dataSourceExpression><![CDATA[ 
     ((JRXmlDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("/c") 
    ]]></dataSourceExpression> 
    <subreportExpression><![CDATA["path/to/subreport"]]></subreportExpression> 
    </subreport> 

    ... 
</jasperReport> 

Mit ein paar Änderungen können Sie das Beispiel JasperReports xmldatasource mit einer Unterdatenquelle arbeiten lassen:

Schritt # 1. Stellen Sie sicher, dass CustomersReport.jrxml enthält nur diesen Code für das subreport Teil:

<subreport> 
     <reportElement isPrintRepeatedValues="false" x="5" y="25" width="507" height="20" isRemoveLineWhenBlank="true" backcolor="#FFCC99" uuid="e7de82f1-2e1c-4459-bef3-307e57903e0b"/> 
     <dataSourceExpression><![CDATA[ 
     ((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).dataSource("/Northwind/Orders[CustomerID='" + $F{CustomerID} + "']") 
     ]]></dataSourceExpression> 
     <subreportExpression><![CDATA["OrdersReport.jasper"]]></subreportExpression> 
</subreport> 

Schritt # 2. In OrdersReport.jrxml sicher:

  • Sie die CustomerID Parameter entfernen
  • Ihre XPath-Abfrage wie folgt aussieht: <queryString language="xPath"><![CDATA[Orders]]></queryString>

Wichtiger Hinweis: In diesem Fall habe ich die dataSource(expr) Methode die JRXmlDataSource, weil die Kunden und Bestellungen Geschwister in der XML-Datei sind. Wenn Bestellungen pro Kunde (verschachtelt in Kunden) gewesen wären, hätte ich wahrscheinlich den subDataSource("Orders") Ansatz verwendet.

+0

Narcis - danke dafür, aber es funktioniert nicht für mich - daher die Bitte um ein funktionierendes Beispiel. –

+0

Eine Verwirrung, die ich habe ist, dass die Dokumentation impliziert, dass die SubDataSource-Referenz (in meinem Fall) "booking/customer" sein sollte, aber es sagt auch, dass es auf dem aktuellen XML-Knoten basiert, der ein Buchungsknoten ist "Kunde" (für Ihr Beispiel), aber wenn das der Fall wäre, warum müsste es mit [booking_id = für Ihren allerletzten Satz qualifiziert werden. –

+0

Sie haben Recht, ich habe einige Verwirrung mit meiner Antwort eingeführt. Ich habe einige kleinere Klarstellungen hinzugefügt und die subDataSource-API-Aufrufe für die Antwort und das Beispiel korrigiert. Vielen Dank – Narcis

Verwandte Themen