# JasperReport - SubReport wird nicht angezeigt



## y0dA (9. Jul 2008)

Hi!
Ich benutze iReport 2.0.5 sowie jasperreports-2.0.4.jar.

Was möchte ich mit JasperReports machen: Es soll ein Report erstellt werden (A) welcher wiederum 1:n Reports (B) enthalten kann. Gedacht habe ich es mir so dass ich im Detailbereich mehr oder weniger über eine Liste von B iterieren lasse - dies soll dann mit einem SubReport realisiert werden.

Mein aktuelles Problem ist jedoch dass ich nicht mal einen einfachen SubReport zusammenbringe, sprich es wird mir kein SubReport angezeigt.

Folgende Vorgehensweise meinerseits:
+) HauptBericht erstellt (nur statischer Text bzw mit Hilfe Von Parametern realisiert) --> A
+) Neuen Bericht erstellt --> B
-) Hierbei (B) habe ich dann die Ränder (oben,unten,links,rechts) auf 0 gesetzt (unter Bearbeiten-->Reporteigenschaften-->Seitenrand).
+)Danach im Hauptbericht (A) einen SubReport im Bereich *Detail* erstellt und hierbei auf den vorhin angelegten Bericht (B) verwiesen.
+)Daraufhin habe ich den Parameter, welcher den kompilierten SubReport (B) beinhaltet, wie folgt erstellt:
  Parametername: BSubReport
  Parameter Klassen Typ: net.sf.jasperreports.engine.JasperReport
+) Danach im Hauptbericht(A) auf den SubReport mit der r.M. geklickt und Eigenschaften ausgewählt. Hier dann folgendes eingetragen:
Ergebnisklasse Unterreport: net.sf.jasperreports.engine.JasperReport
Ausdruck für Unterreport: $P{BSubReport}

Weiters übergebe ich hier auch einen Parameter vom Haupt- zum SubReport:
SubReport Parameter Name: DruckParameterObjekt
Ausdruck für Defaultwert: $P{DruckParameterObjekt}  --> Diesen Parameter gibt es im HauptReport und wird dort auch benutzt.
+) Danach habe ich im SubReport in mehreren Bereichen (u.a. Detail) versucht die Werte aus DruckParameterObjekt auszulesen, jedoch wird selbst der statische Text im Subreport nicht angezeigt.

Weitere vorgenommene Einstellungen:
+) Im HauptReport: Reporteigenschaften-->Mehr--> Wenn keine Daten: Keine Seiten
+) Im SubReport: Reporteigenschaften-->Mehr--> Alle Abschnitte außer Detail.

Kann mir jemand helfen? Warum sehe ich keinen SubReport 

Hier noch die relevanten Zeilen aus der Java-Main-Methode:

```
final String hauptReport = "D:\\projects\\agwr2\\AGWR2Config\\config\\drucken\\AdresseDruck.jrxml";
		final String subReport= "D:\\projects\\agwr2\\AGWR2Config\\config\\drucken\\GebaeudeDruck.jrxml";

		ArrayList<IGebaeudeTO> reportData = new ArrayList<IGebaeudeTO>();
		reportData.add(gebaeudeTO);
		JRDataSource ds = new JRBeanCollectionDataSource(reportData);

		InputStream isHaupt = null;
		InputStream isGebaeude = null;

		try {
			isHaupt = JRLoader.getFileInputStream(hauptReport );
			isSub = JRLoader.getFileInputStream(subReport);
		} catch (JRException e1) {
			e1.printStackTrace();
		}

		JasperPrint jasperPrint = null;

		try {
			JasperReport compiledReportGebaeude = JasperCompileManager
					.compileReport(isSub);

			JasperReport compiledReportAdresse = JasperCompileManager
					.compileReport(isHaupt );

			Map<String, Object> reportParameters = new HashMap<String, Object>();
			reportParameters.put("AdresseDruckParameterObjekt", adrTO);
			reportParameters.put("GebaeudeSubReport",
					compiledReportGebaeude);

			jasperPrint = JasperFillManager.fillReport(compiledReportAdresse,
					reportParameters, ds);
		} catch (Exception e) {
			e.printStackTrace();
		}

		JasperViewer.viewReport(jasperPrint);
```


----------



## foobar (9. Jul 2008)

Im Template nennst du den Parameter $P{BSubReport} und im Javacode nennst du den Subreportparameter "GebaeudeSubReport". Das kommt mir spanisch vor.


----------



## y0dA (9. Jul 2008)

Ja weil ich das ganze auf Dummy-Values geändert habe bzw wohl doch nur teilweise.

Mittlerweile habe ich es aber geschafft den SubReport anzuzeigen --> Vorder- und Hintergrund waren im SubReport transparent...

Aber könnten wir vllt nochmal auf mein Hauptproblem zu sprechen kommen, vllt hat ja jemand eine Idee:

Also ich habe eine Liste von Gebäuden und diese hat eine 0:n Beziehung zu einer Adresse - also eine Adresse kann 0 bis n Gebäude haben. Hierfür dachte ich mir dass ich den Detail-Bereich des Hauptreports benutze um die 0 : n Gebäude zu drucken.

Interessant wäre hierbei aber folgendes: Ist es möglich mittels den Javaklassen des JR mehrere Reports nacheinander zu erstellen und bspw in einer Collection halten und am Ende dann alle zammstöpseln und ausdrucken?


----------



## foobar (9. Jul 2008)

Ja, das geht. Ein JasperPrint ist einfach nur ein Container für eine Liste. Du kannst dir daraus die JasperPages holen und daraus ein neues JasperPrint erstellen.


----------



## y0dA (9. Jul 2008)

Und bezüglich Seitenzahlen gibts da auch keine Probleme?

Wie kann ich die JasperPrint Objekte mergen? mit iText?

Also bisher mache ich es ja so :

```
JasperViewer.viewReport(jasperPrint);
```
und jasperPrint ist hierbei ein Bericht.

Wie stelle ich das gleiche für mehrere an?
Eben mit iText?
Kannst du mir vllt meine Suche mit Hinweisen verkürzen? bzw eventuell ein kurzes Bsp zeigen? 

**EDIT**
Eigentlich dürfte eh alles klar sein - habe deinen Text nicht gscheit gelesen, werde oben genanntes morgen dann testen - danke.


----------



## foobar (10. Jul 2008)

http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/JasperPrint.html#getPages()
http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/JasperPrint.html#addPage(net.sf.jasperreports.engine.JRPrintPage)


----------



## y0dA (10. Jul 2008)

Hi!
Habs gerade wie folgt versucht:


```
//........
                //..........
                InputStream isStrasse = null;
		InputStream isAdresse = null;
				
		try {
			isStrasse = JRLoader.getFileInputStream(strasseDruck);
			isAdresse = JRLoader.getFileInputStream(adresseDruck);
		} catch (JRException e1) {
			e1.printStackTrace();
		}

		Map<String, Object> reportParametersStrasse = new HashMap<String, Object>();
		reportParametersStrasse.put("DruckParameterObjekt", param);

		Map<String, Object> reportParametersAdresse = new HashMap<String, Object>();
		reportParametersAdresse.put("AdresseDruckParameterObjekt", adrTO);
		
		JasperPrint strassePrint = null;
		JasperPrint adressePrint = null;
		
		try {
			JasperReport compiledReportAdresse = JasperCompileManager
			.compileReport(isAdresse);			
			JasperReport compiledReportStrasse = JasperCompileManager
					.compileReport(isStrasse);
			adressePrint = JasperFillManager.fillReport(compiledReportAdresse,
					reportParametersStrasse);
			strassePrint = JasperFillManager.fillReport(compiledReportStrasse,
					reportParametersStrasse);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		//JasperViewer.viewReport(adressePrint); hier werden die beiden Berichte noch mit Inhalt angezeigt
		//JasperViewer.viewReport(strassePrint);
		
		List<JRPrintPage> adresseSeiten = adressePrint.getPages();
		List<JRPrintPage> strasseSeiten = strassePrint.getPages();
		
		JasperPrint merged = new JasperPrint();
		for (JRPrintPage page : adresseSeiten) {			
			merged.addPage(page);
		}
		for (JRPrintPage page : strasseSeiten) {
			merged.addPage(page);
		}
		JasperViewer.viewReport(merged);
```

Das Resultat sollten 2 Seiten sein, auf der ersten Seite der Bericht für Adressen und auf der zweiten für Strassen. Der JasperViewer wird auch geöffnet und ich bekomme 2 Seiten, nur ohne Inhalt - es ist auf den beiden Seiten nur ein kleines Quadrat mit Schatten zu sehen.


----------



## foobar (10. Jul 2008)

Hmm, sieht soweit korrekt aus. Häng die Seiten der Strasse doch mal an den JasperPrint adresseSeiten an anstatt ein neues JasperPrint Objekt zu erstellen.


----------



## y0dA (10. Jul 2008)

foobar hat gesagt.:
			
		

> Häng die Seiten der Strasse doch mal an den JasperPrint adresseSeiten an anstatt ein neues JasperPrint Objekt zu erstellen.



Wie darf ich das verstehen?

Kann es sein, dass die Styles und ähnliches vllt bei meinem "merged" Objekt fehlen?


----------



## foobar (10. Jul 2008)

```
for (JRPrintPage page : strasseSeiten) 
      {
         adresseSeiten.addPage(page);
      }
      JasperViewer.viewReport(adresseSeiten);
```


----------



## y0dA (10. Jul 2008)

foobar hat gesagt.:
			
		

> ```
> for (JRPrintPage page : strasseSeiten)
> {
> adresseSeiten.addPage(page);
> ...



Habe ich schon versucht:

```
adresseSeiten.addAll(strassePrint.getPages());
```

Ich habe mir die Objekte noch angesehen und festgestellt, dass im merged Objekt folgende Einträge von adresse/strasse fehlen:

```
originList
stylesList
stylesMap
```


----------



## y0dA (10. Jul 2008)

Ok hab das Problem behoben, folgendes macht glücklich:

```
merged.setPageHeight(Integer.valueOf(842));
merged.setPageWidth(Integer.valueOf(595));
```

Das erklärt auch das kleine Quadrat im Bericht bisher, ich hatte einfach keine Höhe/Breite angegeben.

danke für die Hilfe.


----------



## foobar (10. Jul 2008)

Man lernt nie aus.


----------



## y0dA (10. Jul 2008)

Was mich nun noch interessiert ist wie ich nun die Seitenzahlen korrekt anzeige. Im Moment wird folgendes angezeigt:

Seite 1 des Berichts = Adresse --> angezeigt wird: Seite 1 von 1
Seite 2 des Berichts = Strasse --> angezeigt wird: Seite 1 von 1

Gibts hier auch eine Möglichkeit dies zu beheben?


Und noch was:

Also mittlerweile sieht mein Code so aus: (ich füge dem adressePrint einfach die Pages von Strasse hinzu):

```
InputStream isStrasse = null;
		InputStream isAdresse = null;

		try {
			isStrasse = JRLoader.getFileInputStream(strasseDruck);
			isAdresse = JRLoader.getFileInputStream(adresseDruck);
		} catch (JRException e1) {
			e1.printStackTrace();
		}

		Map<String, Object> reportParametersStrasse = new HashMap<String, Object>();
		reportParametersStrasse.put("DruckParameterObjekt", param);

		Map<String, Object> reportParametersAdresse = new HashMap<String, Object>();
		reportParametersAdresse.put("AdresseDruckParameterObjekt", adrTO);

		JasperPrint strassePrint = null;
		JasperPrint adressePrint = null;

		try {
			JasperReport compiledReportAdresse = JasperCompileManager
					.compileReport(isAdresse);
			JasperReport compiledReportStrasse = JasperCompileManager
					.compileReport(isStrasse);
			adressePrint = JasperFillManager.fillReport(compiledReportAdresse,
					reportParametersStrasse);
			strassePrint = JasperFillManager.fillReport(compiledReportStrasse,
					reportParametersStrasse);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		List<JRPrintPage> strasseSeiten = strassePrint.getPages();
		for (JRPrintPage page : strasseSeiten) {
			adressePrint.addPage(page);
		}
```

Hierbei würde mich dann noch interessieren wie ich bspw mit den JROrigin Werten von Strasse umgehen soll, sprich ob ich die auch im adressePring benötige oder nicht. Leider habe ich keine Vorstellung für die JROrigin Objekte stehen.


----------

