# Frage zu JasperReports und JRDataSource



## Haiko (25. Mai 2006)

Hallo, 
ich hoffe hier findet sich jemand, der sich ein wenig mit Jasperreports auskennt. Ich werde aus den Dokus nicth sonderlich schlau und finde auch im Netz keine großen Hilfen. Wenn ich die Jasperreports meine eigene Datasource übergeben will, wie kann ich dann auf die Felder in der *.jrxml Datei zugreifen ?


```
JasperReport jasperReport = JasperCompileManager.compileReport("Rechnung.jrxml");	
		 
		JasperPrint jasperPrint = JasperFillManager.fillReport
		            (jasperReport, map, new MeineEigeneDataSource());
		
		JasperExportManager.exportReportToPdfFile(jasperPrint,"RechnungOutput.pdf");
```

Und eine weitere Unklarheit: Brauche ich die HashMap noch zu übergeben, wenn ich eine eigene Datenquelle übergib oder reicht dann new HashMap() aus ?


Hoffentlich kann mir jemand helfen

MfG
HAiKo


----------



## Guest (25. Mai 2006)

Das Interface JRDataSource definiert zwei Callback Methoden, die vom FillManager aufgerufen werden.

boolean next() 
java.lang.Object getFieldValue(JRField jrField) 

Gibst du in "next()" true zurück, dann heisst es, dass es eine weitere Zeile gibt.
Die einzelnen Werte der Felder werden über "getFieldValue" abgefragt.
In JRField gibt es u.a. die Methode "getName()", um den Namen des Feldes 
abzufragen und "getValueClass()", um den geforderten Typen zu ermitteln.

Einfaches Beispiel (nicht getestet)
	
	
	
	





```
public class MyDataSource implements JRDataSource
{
  private Object personen[][] = {
    {"Bart", "Simpson"},
    {"Lisa", "Simpson"},
    {"Humer", "Simpson"}
  };
  int index = -1;

  public boolean next() 
  {
    return ++index<personen.length;
  }

  public Object getFieldValue(JRField field)
  {
    if(field.getName().equals("Vorname")) // ACHTUNG: case sensitive!
      return personen[index][0];
    else
      return personen[index][1];
  }
}
```
Das mit dem Map ist egal, hauptsache es ist nicht null.


----------



## Haiko (25. Mai 2006)

Na das ist ja schonmal super, hilft mir auf jeden fall weiter. jetzt nur noch ne kleinigkeit.

wie deklarier ich dann in der jrxml datei ein feld, dass zB dieses array ausgeben soll?


```
<textField>
	<reportElement
						x="240"
						y="0"
						width="240"
						height="10"
						key="textField"/>
					
					<textElement textAlignment="Right">
						<font reportFont="GeneralBold" />
					</textElement>
				<textFieldExpression   class="welche Klasse muss ich hier angeben">
<![CDATA[welcher Ausruck steht hier drin, wenn ich hier den Inhalt des Arrays ausgeben will]]></textFieldExpression>
				</textField>
```

Vielen Dank im voraus!

Gruß


----------



## Guest (25. Mai 2006)

Machst du das alles von Hand?  :shock: 
Hol dir iReport oder ähnliches. Damit lässt sich das Grundgerüst
etwas schneller generieren.

So ungefähr sollte die FieldExpression aussehen
	
	
	
	





```
<textFieldExpression class="java.lang.String"><![CDATA[$F{FELDNAME}]]></textFieldExpression>
```
Du kannst auch einen kompletten Ausdruck (Java Einzeiler) verwenden
z.B.:
	
	
	
	





```
<textFieldExpression class="java.lang.String"><![CDATA[new StringBuffer().appemd($F{FELDNAME1}).append("-").append($F{FELDNAME2}).toString()]]></textFieldExpression>
```


----------

