# XML mit iReport und TableModelDataSource



## elmato (10. Mai 2005)

hi @all, 
ich brauche mal eure Hilfe, iReport ud Jasperreports treibt mich solangsam in den wahnsinn, ich moechte einen Report erstellen und die Daten kommen aus meiner JTable, nun brauche ich ja eine XML Datei um besagten report erstellen zu koennen, da ich leider nicht sehr viel Ahnung von XML habe dachte ich mir kannst du ja iReport benutzen. Doch leider funktioniert garnix, ich wollte nur einen kleinen Testreport erstellen mit folgendem code

```
public static JRTableModelDataSource getTableSource(){
		DeafultTableModell m = new DefaultTableModel(2, 2);
		m.setValueAt("hallo", 0,0);
		JRTableModelDataSource src = new JRTableModelDataSource(m);
		return src;
	}
```
laut Dokumentation von iReport muesste ich nun in der lage sein in iReport ein TextField zu erstellen und mit

```
$F{COLUMN_1}
```
auf die erste spalte zugreifen koennen. Die Verbindung zur Datasource besteht ist erfolgreich getestet worden, die aktive Verbindung steht auch doch sobald ich auf Report Compilieren gehe bekomme ich eine Exception 

```
et.sf.jasperreports.engine.JRException:Reportdesignnotvalid: 1.Fieldnotfound:COLUMN_1
```
kann mir jemand da weiterhelfen, was mache ich falsch? Die einzigste erklaerung die ich sonst noch habe ist, das alles Beispielcode den ich gefunden habe das AbstractTableModel benutzt und nicht DefaulttableModel, kann es daran liegen?


----------



## ATha1 (23. August 2005)

Es scheint als würde das Field COLUMN_1 nicht bekannt sein...

Wurde es denn deklariert?
Im iReport gibt es einen Button "Parameters" das ist der 4. von rechts gesehen nach der Prozentanzeige für den Zoom. Dort kann man im Tab Fields die Felder deklarieren.


----------



## satelite (27. Februar 2006)

elmato hat gesagt.:
			
		

> Die Verbindung zur Datasource besteht ist erfolgreich getestet worden, die aktive Verbindung steht auch doch sobald ich auf Report Compilieren gehe bekomme ich eine Exception ....



Hallo, 
könntest du bitte schreiben, wie die Verbindung auszusehen hat und wie die eingestellt werden muss? Ich kann leider keine Lösung finden!

Danke sehr


----------



## elmato (27. Februar 2006)

Hmm, ist jetzt schon eine ganze Weile her, da ich das letztemal mit iReport gearbeitet habe und leider habe ich es auch gerade nicht auf meinem Rechner aber ansich war es garnicht so schwer, du musst als Quelle die CustomDatasource auswählen und den package Pfad zu der Klasse angeben in welcher du die JasperReportsDataSourdce erstellst, dann noch die statische Methode (s.o.) angeben welche dir die DataSource zurückliefert und das wars schon fast. Um dann auf die Felder zugreiffen zu können musst du nur befolgen was ATha1 geschrieben hat und das war's dann auch schon.. melde dich wenn es nicht klappt ich lad mir das Teil dann mal runter...
viel Glück und Spass
elmato


----------



## ATha1 (27. Februar 2006)

satelite hat gesagt.:
			
		

> Hallo,
> könntest du bitte schreiben, wie die Verbindung auszusehen hat und wie die eingestellt werden muss? Ich kann leider keine Lösung finden!
> 
> Danke sehr



Kannst du dein Problem vielleicht näher beschreiben?

Wennst den Report befüllst gibst du eine DataSource bei den Parametern mit.

```
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperFile, parametersMap, datasource);
```
Die DataSource ist eine Klasse die das Interface JRDataSource implementiert.
Man kann also schön fein und einfach seine eigenen DataSources definieren.

Innerhalb des Report bist du durch diesen Aufruf automatisch mit der DataSource verbunden.
Wenn du nun Subreports verwendest musst du diesen natürlich auch eine DataSource zukommen lassen.

Dies kann eventuell über Parameter geschehen oder indem man sonst irgendwie mit den Fields herumtrickselt.

Ich habe beispielsweise bei meinen Größeren Reports eine MapDataSource geschrieben, die das JRDataSource Interface implementiert und im Konstruktor eine Map oder ein Map[] erwartet.

Und wenn ich einen Subreport habe, instanziere ich eine neue MapDataSource die ich mit einem aus den Fields ausgelesen Map oder Map[] erstelle.

Ich hab zum Beispiel einen Report der hat die Felder "Name" und im Subreport stehen dann Telefonnummern ausgelistet dann hat meine DataSource das Feld "Name" und "Telefonnummern" und wenn ich auf Telefonnummern zugreife (im Report als Object definiert) dann übergebe ich dieses Field dem Konstruktor der DataSource für den Subreport.

Also 

```
new MapDataSource( (java.util.Map[]) $F{Telefonnummern})
```
steht dann in der jrxml drinnen dort wo die DataSource für den Report angegeben wird.


----------



## satelite (22. März 2006)

Vielen Dank für eure Hilfe, endlich hat es geklappt!

und zwar folgendermaßen:

wenn ich ein report mit JasperReports erstellen will, als Designer iReport verwende
und als dataSource TableModel:

im iReport muss ich Felder definieren und beliebig hinzufügen:
$F{COLUMN_0}
$F{COLUMN_1}
$F{COLUMN_2}
...
die Zahlen stehen für die Spaltennummer.
sonst muss man keine datasources im iReport definieren...

und schließlich im java code:


```
private JasperReport jreportStream;
private JasperPrint jprint;
private JasperViewer jviewer;

...

jreportStream = JasperCompileManager.compileReport("reports/tmp/test.jrxml");
jprint = JasperFillManager.fillReport(jreportStream, parameters, new JRTableModelDataSource(model));
jviewer = new JasperViewer(jprint);
jviewer.setVisible(true);
```

cu


----------

