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.
Narcis - danke dafür, aber es funktioniert nicht für mich - daher die Bitte um ein funktionierendes Beispiel. –
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. –
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