# Verständnissfrage JasperReports / Java Obekte POJO?



## KEhlers (13. Aug 2008)

Hallo zusammen,

mir fehlt leider der nötige Ansatz um mit JasperReports loszulegen. Ich hoffe ihr könnt mir helfen.

Wir wollen unsere Reportingfunktion in unsere Java Applikation verbessern. Bisher wurden PDF oder HTML Reports von hand programmiert. Das soll jetzt mit Hilfe von JasperReports oder vielleicht Birt verbessert werden. Die Daten können sowohl aus einer Oracle Datenbank (was keine Probleme bereiten wird) aber auch aus einem Object (RECORD) der Java Applikation kommen. 

Die Frage ist jetzt wie und ob ich überhaupt in dem Report auf das Objekt zugreifen kann. In iReport wird das nicht gehen weil das Object auf Session Daten zugreift. In iReport müsste man also "blind" auf das Obejct zugreifen, etwa so: "CRECORD.getValue(parameter1, param...);". Ist es dann möglich bei dem Filling aus der Java Applikation (Wenn der Report getriggert wird), da wo die Session dann existiert, die Funktionen aufzurufen um an die Daten zu gelangen? 

Wenn ja wo instanziiere ich denn das Object, in dem Report? Der Ablauf ist mir leider noch absolut nicht schlüssig. Ich hoffe ihr könnte mir da ein bisschen auf die Sprünge helfen.

Danke 

Gruß


----------



## foobar (13. Aug 2008)

Ja, Jasperreports unterstützt Beandatasources.

Das ganze ist ziemlich simpel. Du gibst dem Report einfach eine Datasource mit das kann eine JdbcDatasource, eine Hibernateconnection aber auch einfach eine Liste von Beans sein:

data ist hier meine Liste von Beans:

```
JasperPrint print = JasperFillManager.fillReport(inComp, params, new JRBeanCollectionDataSource(data));
```

In Ireport legst du dann einfach eine neues Field an. Das Field ist eine Property deiner Bean auf das über den Getter zugegriffen wird. Du kannst dem Report aber auch einfach einen Parameter übergeben z.b. für den Titel, Footertext etc.
Guck dir mal die Beispiele im Ordner Samples von JasperReports an. Da siehste schon was man alles damit machen kann z.b. Crosstabs, Subereports und was weiß ich noch alles.


----------



## KEhlers (13. Aug 2008)

Danke foobar für deine Antwort



			
				foobar hat gesagt.:
			
		

> In Ireport legst du dann einfach eine neues Field an. Das Field ist eine Property deiner Bean auf das über den Getter zugegriffen wird.



Ich habe meine Problemstellung nicht ausreichend dargestellt. Das Problem ist, dass mein Object "Record" nicht selber die Daten als Attribute speichert sondern selbst über die Methoden wie z.B. getValue(...) anfragen an die Oracle Datenbank schickt um die Daten zu sammeln. 

Ich muss also tatsächlich die Funktionen getValue(...), getAttribute(...) aufrufen um über die Rückgabewerte an die Daten zu kommen. 

Ist das auch irgendwie umsetzbar?

Danke nochmal


----------



## KEhlers (13. Aug 2008)

vielleicht könnte ich mir eine wrapper Klasse schreiben die mir in einer hashmap die zurueckgegeben werte der Funktionsaufrufe abspeichert...

Aus dem Report wird zb "0;0;0;initials" gelesen und darauf wird getValue(0,0,0,initials) aufgerufen. Aber wie bringe ich ihn dazu die Funktion aufzurufen?

ich muss mir das mal ansehen ganz so firm bin ich in dem jetzt noch nicht. Könnte das irgendwie gehen?

edit: nunja wenn ich das richtig verstehe wird, wenn im report das Field "0;0;0;initials" gelesen wird die Methode get0;0;0;initials aufgerufen. Das bringt mich natuerlich nicht weiter, selbst wenn man den Namen so vergeben würde das es funktioniert. Ich kann ja nicht für jede Kombination aus Parametern eine neue Methode schreiben. Gibt es eine Möglichkeit den gettern einen Parameter mit zu übergeben?

Und noch eine Frage in iReport muss ich eine Factory Klasse angeben sonst funktioniert das ganze nicht. In meinem Fall brauche ich das aber gar nicht, kann ich das dann auch irgendwie weglassen?


----------



## foobar (13. Aug 2008)

Achso du willst keine Beans(Entities) an den Report  übergeben sondern Services(Geschäftslogik) oder DAOs. 
Das macht wenig Sinn. Ich würde dei Services aufrufen und dann das Ergebnis als die Collection von Beans an Jasper übergeben.
Damit haste eine saubere Trennung. Ansonsten kannste direkt eine Jdbc Connection oder eine Hibernatesession an Jasper übergeben.


----------



## KEhlers (15. Aug 2008)

Danke nochmal foobar, ich habe das Problem jetzt gelösst. Allerdings stehe ich jetzt vor dem nächsten. Ich würde gerne in meinem Report sowohl Beans als auch eine JDBC Connection als DataSource benutzten. Ich habe gelesen das ich dafür SubReports brauche und an den SubReport die 2te DatenSource weiterreichen soll.

Ich verstehe allerdings nicht wie das gehen soll. Denn an meinem Masterreport den ich mit runReportToPdfStream() befülle kann nur eine der Datenquellen weitergegeben werden. 

Wie geht das bloss?

Danke


----------



## KEhlers (15. Aug 2008)

hmm vielleicht habe ich es jetzt selber rasugefunden. Wird evtl. eine Connection in der Hashmap hinzugefügt um sie dem MasterReport mitzugeben der sie dann an den subreport weiterleitet?


----------



## foobar (16. Aug 2008)

Parameter die an den Subreport übergeben werden sollen, müssen zuerst an den Masterreport übergeben werden. Von dort aus werden die Parameter dann weiter gereicht.
Guck dir dazu mal die Beispiele an. Da kannste das ganze in Aktion erleben.
Um einen Subreport in einen Masterreport einzubinden gibt es mehrere Möglichkeiten. Ich kompiliere den Subreport immer schon vorher und übergebe den kompilierten Report als Parameter. Man kann aber auch nur einen Namen oder Pfad+Namen an den Masterreport übergeben.


----------



## KEhlers (18. Aug 2008)

Okay hab gerade mal kurz reingesehen und gleich im "subreport" sample gesehen wie der kompilierte Subreport als Parameter an den Masterreport gereicht wird. Danke soweit

Jetzt ergibt sich fuer mich aber noch eine weitere Frage.

Die Erzeugung der Reports soll bei mir aus einer Java Applikation geschehen. Wie könnte ich es geschickt anstellen, dass der Fill- und Erzeugungsprozess nicht jedesmal für einen neuen Report umprogrammiert werden muss. Jeder Report benötigt ja evtl. unterschiedliche Parameter für Subreports etc. und andere Data Sources. Gibt es für dieses Problem Ansätze? 

Es wäre toll wenn es vermeidbar ist, dass der Reportschreiber jedesmal auch den Java Code umschreiben bzw. anpassen muss.

Danke


----------



## foobar (18. Aug 2008)

Das wird sich nicht vermeiden lassen, da eine Änderung des Reports aus einer fachlichen Änderung entsteht z.b. eine zusätzliche Spalte im Report. D.h. du mußt sowieso den Code ändern, um dem Report diese Daten zugänglich zu machen. Wie sollte man das variabel halten?


----------

