Erfahrung mit JasperReports

Hmm, tja ich habe mcih mal ungesehen im Inet, aber leider auch nichts brauchbares gefunden. Das einzige was ich dir anbieten kann ist ein WorkAround.
Es ist moeglich ueber einen Parameter(mal wieder ;) ) abzufragen ob etwas dargestellt werden soll oder nicht, das geht uebr printWhenExpression, du erstellst dir dann einen Report in dem !beide! Logos an den Koordinaten sind an denen sie sein sollen, dann musst du halt Abfragen ob der Parameter(vom typ Boolean0gesetzt ist oder nicht
Code:
<parameter name="g" isForPrompting="false" class="java.lang.Boolean"/>
...
<image.......
<printWhenExpression><![CDATA[$P{g}]]></printWhenExpression>
</image>
dann wird das Bild nur angezeigt wenn der Parameter gsetzt ist. Das ist die einzige moeglickeit die mir im moment einfaellt..
mfg
 
Soweit ich gesehen habe, ist das die Standardmethode, mit der PrintWhenExpression zu arbeiten, wenn man eben verschiedene Anzeigen benötigt.

Was die Positionierungen angeht, gibt es FixRelativeToTop, Float und FixRelativeToBottom als Positionierungstyp.
 
Hallo Elmato,

ich wollte mich bedanken für deinen Tipp, werde ich demnächst wenn ich wieder in der Arbeit bin ausprobieren.

Zu ATha1 noch eine kurze Bemerkung. Die Positionierungstypen sind mir bekannt. Sie wirken aber nur
auf die Positionierung von oben von unten und vom nächsthöheren Element. Damit kann ich leider bei meinem Problem nichts anfangen. Aber die Idee von Elmato, könnte sich evtl. umsetzen lassen.

Viele Grüße

Marita Betz
 
Hallo Elmato,

ich bin gerade dabei dein WorkAround auszuprobieren, dabei sind mir aber doch einige Sachen noch nicht ganz klar.

Du hast ja geschrieben, dass ich die beiden Logos mit den unterschiedlichen Koordinaten im Report aufnehmen soll.

Da sehe ich aber noch Probleme

1,) Wie sollen diese denn unterschieden werden, Images haben ja leider keinen eindeutigen Namen. Oder kann man diesen doch irgendwie eindeutige Namen zuordnen?

2.) Wenn ich beide Logos im Report aufnehme sieht man ja beide Logos übereinander, nur etwas versetzt. Wie kann ich das verhindern? Ich will ja nur das Logo angezeigt bekommen welches
ich gerade brauche.

3. Auch ist mir noch nicht 100% klar was Du mit dem Parameter g willst. Du hast Ihn ja auf "isforPrompting="False" gesetzt. Das heißt doch, dass man da nichts eingeben kann, weil kein
Feld auf dem Bildschirm erscheint. Ist ja schon klar, weil es ja ein Boolean-Wert ist der entweder true oder false ist.

Aber mir ist einfach nicht klar, wie das Programm dann wissen soll, welches Logo
dann angezeigt werden soll. Irgendwie stehe ich da noch voll auf dem "Schlauch".

Diese <printWhenExpression><!CDATA[$P{g}]]></printWhenExpression>muss ich ja bei beiden Images setzen oder?

Irgendwie fehlt mir da noch eine Verbindung zwischen dem Text der erscheint und dem Logo welches angezeigt werden soll.

Leider wird man dass ja nicht in einer Variablen machen können so in der Art:

Wenn Titel weiblich dann Text Titel weiblich und Logo 1
ansonsten Titel männlich und Logo 2

Daran bin ich ja schon vorher gescheitert. Das ich die Verknüpfung zwischen Text und Bild in einer
Variablen nicht hinbekommen habe.

Ich hoffe Du hast alles einigermaßen verstanden, es ist immer schwierig so einen Sachverhalt zu beschreiben.

Vielleicht kannst Du noch ein wenig Licht ins Dunkel bringen.

Vielen herzlichen Dank für Deine Bemühungen.

Viele Grüße

Marita Betz
 
so ich hoffe ich verstehe dein Problem richtig, und ich denke ich habe eine Lösung.

Also allgemein den Imagepfad zu beeinflüssen (z.B. mit Parametern) scheint bei mir ohne Probleme zu funktionieren, dafür gibts die ImageExpression:

<imageExpression class="java.lang.String"><![CDATA[$P{BaseDir}+"/images/logo.gif"]]></imageExpression>

Dann ist das Logo halt immer an der selben Position.

Weil du aber 2 Logos hast an unterschiedlichen Positionen musst du dann 2 mal ein Image einfügen, und dann mit der PrintWhenExpression bei beiden abfragen.
Natürlich schließt die eine Expression die andere aus...

Und der Parameter muss ja auch nicht notwendigerweise ein Boolean sein.
Und wenn du die Geschlechterinfo eh aus der Datenbank bekommst, dann kannst das doch auch mit einem Feld anstatt eines Parameters machen...

Ich denke so solltest du dein Problem lösen können oder?
 
Hallo an alle,

ich wollte mich nochmal für die Hilfe bedanken.

Inzwischen ist unser Problem gelöst.

Viele Grüße

Marita Betz
 
Hallo,

ich sehe Ihr beschäftigt euch auch mit iReport. :p

Ich hab da auch ein Porblem mit dem Datum:

Ich möchte einen Report generieren, bei dem das Startdatum als Parameter übergeben werden soll. Aber irgendwie klappt es nicht so wie ich will, eigentlich klappts garnicht.

Ich hab folgede SQL-Anweisung "DT_XANTRAGSDATUM_57EA5290 >= '$P!{DATUM}')".

Bekomme aber immer den gleichen Fehler:

Compiling to file... .\Abfrage1.jasper -> C:\Programme\JasperSoft\iReport-1.2.2\Abfrage1.java
Errors compiling .\Abfrage1.jasper!
it.businesslogic.ireport.ReportClassLoader@e19358 net.sf.jasperreports.engine.JRException:Errorswereencounteredwhencompilingreportexpressionsclassfile: 1.Syntaxerrorontoken".05",?expected value=(java.sql.Timestamp)(09.01.0500:00); <-> 2.Syntaxerrorontoken".05",?expected value=(java.sql.Timestamp)(09.01.0500:00); <-> 3.Syntaxerrorontoken".05",?expected value=(java.sql.Timestamp)(09.01.0500:00); <-> 3errors atnet.sf.jasperreports.engine.design.JRAbstractCompiler.compileReport(JRAbstractCompiler.java:193) atnet.sf.jasperreports.engine.design.JRDefaultCompiler.compileReport(JRDefaultCompiler.java:104) atnet.sf.jasperreports.engine.JasperCompileManager.compileReportToFile(JasperCompileManager.java:127) atnet.sf.jasperreports.engine.JasperCompileManager.compileReportToFile(JasperCompileManager.java:109) atit.businesslogic.ireport.IReportCompiler.run(IReportCompiler.java:473) atjava.lang.Thread.run(UnknownSource)

Wenn ich anstatt dem Parameter mit einem Datum arbeite z.B '09.01.05 00:00'
funktioniert es erst dann, wenn ich den von mir eingefügten Parameter aus der Parameterliste lösche.
:mad:

Wenn mir jemand von Euch ein ein Beispiel für das Anlegen von einem Parameter posten könnte, wäre ich sehr dankbar.

Gruß

Alex
 
Alex02 hat gesagt.:
Ich hab folgede SQL-Anweisung "DT_XANTRAGSDATUM_57EA5290 >= '$P!{DATUM}')".

Also da ist nach dem $P ein Rufzeichen (!) zuviel...
aber gut das könnte jetzt ein einfacher Tippfehler sein.

Ich glaube du hast ein anderes Problem, du willst ein Datum innerhalb der Datenbank mit einem Date Objekt vergleichen...
also eigentlich wird das dann einen Fehler geben...
du müsstest das entweder auf ein Date Format der DB bringen (z.B. bei Oracle die to_date Funktion).

Alex02 hat gesagt.:
Wenn ich anstatt dem Parameter mit einem Datum arbeite z.B '09.01.05 00:00'
funktioniert es erst dann, wenn ich den von mir eingefügten Parameter aus der Parameterliste lösche.
:mad:

? das klingt sehr ungewöhnlich...
Denn eigentlich sollte es vollkommen egal sein, ob du einen Parameter verwendest oder nicht.
Das gleiche gilt für Fields oder Variablen.
Übrigens wie meinst du das mit einem Datum arbeiten?

mfg
ATha1
 
Hallo ATha1,

mein SQL-Befehl sieht folgendermaßen aus:
Select *
From DATAGROUPB2DADD8D
Where DATAGROUPB2DADD8D.DT_XANTRAGSDATUM_57EA5290 >= $P{DATUM}

(das ist nur mal kurz zusammengefasst, ich hab da ca. 8 joins)
Ich habs mittlerweile auch zum Laufen bekommen, mit der Parameterdeklaration:

Name: DATUM
Parameter Class Type:java.util.Date
Default value expression: new Date(1,9,2005)

Das schein syntaktisch zu .

Das Problem jedoch ist, dass er alle Eintrage aus der DB (SQL-Server) ausliest.

Die Felder, die ich mit dem Paramter vergleiche sind vom Typ "Timestamp".

Wenn ich mir das Datum über folgenden Befehl:
Date datum;
System.out.println(datum = new Date(1,9,2005) );

rausgeben lasse, bekomme ich dieses Ergebnis:

Thu Mar 28 00:00:00 CET 1907
:mad: :mad:


Hast Du möglicherweise einen Lösungsvorschlag

Und noch eine Frage:

Ich möchte disen Report später über eine java.class komplett kompilieren und ausgeben (pdf und xls).
Ohne Parameter stellt es kein Problem dar, bei pdf auch mit. Weisst Du, wie ich Parameter an xls übergeben kann
Irgendwie mit :
Map inhalt = new HashMap ();
Date datum = new Date(1,9,2005);
inhalt.put("$P{DATUM}",datum); ?


Gruß

Alex
 
Zuletzt bearbeitet:
Alex02 hat gesagt.:
mein SQL-Befehl sieht folgendermaßen aus:
Select *
From DATAGROUPB2DADD8D
Where DATAGROUPB2DADD8D.DT_XANTRAGSDATUM_57EA5290 >= $P{DATUM}

(das ist nur mal kurz zusammengefasst, ich hab da ca. 8 joins)
Ich habs mittlerweile auch zum Laufen bekommen, mit der Parameterdeklaration:

Name: DATUM
Parameter Class Type:java.util.Date
Default value expression: new Date(1,9,2005)

Das schein syntaktisch zu .

Das Problem jedoch ist, dass er alle Eintrage aus der DB (SQL-Server) ausliest.

Schon klar... vielleicht solltest du einfach alljene selektieren die du auslesen willst.
Ich weiß gar nicht ob das JasperReports das mittlerweile zuordnen kann, in welche Felder das dann kommt (ich verwendet immer eine JRDataSource zum lesen von Daten).

Sonst musst du halt ohne dem Stern arbeiten...
und wenn dir die Bezeichnungen nicht passen sollten das AS Schlüsselwort in der Query verwenden.

Also statt select * from ...
select xyz as field_xyz from ...
und du hast dann ein Field welches field_xyz lautet.

Der Typ wird natürlich auch passen müssen.
Also kein Integer, wenns ein String ist, und so Sachen...


Alex02 hat gesagt.:
Die Felder, die ich mit dem Paramter vergleiche sind vom Typ "Timestamp".

Wenn ich mir das Datum über folgenden Befehl:
Date datum;
System.out.println(datum = new Date(1,9,2005) );

rausgeben lasse, bekomme ich dieses Ergebnis:

Thu Mar 28 00:00:00 CET 1907
:mad: :mad:

Hast Du möglicherweise einen Lösungsvorschlag

Und noch eine Frage:

Ich weiß nicht genau wie der Timestamp abgesetzt wird, jedoch wie machst du denn sonst die Queries?
also wie machst du sonst deine Queries mit denen du auf den Timestamp selektierst?
Gibst du da einen Zahlenwert an?
Ich verwendet wenn ich Datum Werte verwende für Oracle die Funktion to_date(...). Ich kann aber nicht sagen ob es diese Funktion auch bei deiner Datenbank gibt.
Ansonsten übergib statt dem Date Field einen String, und der String muss das Format haben wie er in der Query benötigt wird...

Alex02 hat gesagt.:
Ich möchte disen Report später über eine java.class komplett kompilieren und ausgeben (pdf und xls).
Ohne Parameter stellt es kein Problem dar, bei pdf auch mit. Weisst Du, wie ich Parameter an xls übergeben kann
Irgendwie mit :
Map inhalt = new HashMap ();
Date datum = new Date(1,9,2005);
inhalt.put("$P{DATUM}",datum); ?

Also prinzipiell wird bei Jasper unterschieden zwischen Kompilierung und Generierung (Füllen des Reportkompilats).
Die Kompilierung wandelt deine JRXML Datei in eine JASPER Datei um, die eigentlich nichts anderes als eine binäre Javaklasse (Classfile) ist.
Die Kompilierung muss nur einmal gemacht werden. Bei der Kompilierung werden die statischen Teile etc. für den Report vorbereitet.

Das Füllen (die eigentliche Generierung) passiert dann mit der Angabe des JASPER Files, den Parameter (du hast recht, es ist eine Map die übergeben wird) und einer DataSource (Interface JRDataSource) oder einer Connection (wenn man eine SQL Abfrage innerhalb des Reports verwendet).

So wie sieht das ganze in Java Code aus:
Code:
	/**
	 * Kompiliert einen Report und liefert das File mit dem kompilierten JasperReport.
	 *
	 * @param xmlFile Report XML File
	 * @return JasperReport File (.jasper Endung)
	 */
	public File compileReport(File xmlFile) {
		try {
			String jasperFileName = JasperCompileManager.compileReportToFile(xmlFile.getPath());
			return new File(jasperFileName);
		} catch (Exception e) {
			e.printStackTrace(System.err);
			return null;
		}
	}

	/**
	 * Generiert ein PDF File aus einem bereits kompilierten JasperReport File.
	 * Die Daten für den Report werden aus der Parameter Map und der Datenbank Connection bezogen.
	 *
	 * @param jasperFile JasperReport File (.jasper Endung)
	 * @param parameters Parameter Map
	 * @param connection Verbindung zu einer Datenbank
	 * @return PDF File
	 */
	public File generatePDF(File jasperFile, Map parameters, Connection connection) {
		try {
			String pdfFile = JasperRunManager.runReportToPdfFile(jasperFile.getPath(),
			        parameters,
			        connection);
			return new File(pdfFile);
		} catch (Exception e) {
			e.printStackTrace(System.err);
			return null;
		}

	/**
	 * Generiert aus einem bereits kompilierten JasperReport File die dazugehörigen PDF Daten.
	 * Die Daten f?r den Report werden aus der Parameter Map und der JRDataSource bezogen.
	 *
	 * @param jasperFile JasperReport File (.jasper Endung)
	 * @param parameters Parameter Map
	 * @param datasource JRDataSource mit Daten f?r den Report
	 * @return Byte Array gefüllt mit den PDF Daten
	 */
	public byte[] generatePDFBytes(File jasperFile, Map parameters, JRDataSource datasource) {
		try {
			byte[] data = JasperRunManager.runReportToPdf(jasperFile.getPath(),
			        parameters,
			        datasource);
			return data;
		} catch (Exception e) {
			e.printStackTrace(System.err);
			return null;
		}
	}

	/**
	 * Generiert ein XLS (Excel) File aus einem bereits kompilierten JasperReport File.
	 * Die Daten für den Report werden aus der Parameter Map und der JRDataSource bezogen.
	 *
	 * @param jasperFile JasperReport File (.jasper Endung)
	 * @param parameters Parameter Map
	 * @param datasource JRDataSource mit Daten für den Report
	 * @return XLS Bytes
	 */
	public byte[] generateXLSBytes(File jasperFile, Map parameters, JRDataSource datasource) {
		if (!systemInitialized) {
			logger.error("ReportGenerator is not initialized!");
			return null;
		}
		try {
			ByteArrayOutputStream outputStream = new ByteArrayOutputStream(1024 * 32);

			JasperPrint jasperPrint = JasperFillManager.fillReport(jasperFile.getPath(), parameters, datasource);
			JExcelApiExporter exporter = new JExcelApiExporter();

			exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
			exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outputStream);
			exporter.setParameter(JExcelApiExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.TRUE);

			exporter.exportReport();

			return outputStream.toByteArray();
		} catch (Exception e) {
			e.printStackTrace(System.err);
			return null;
		}
	}

so das waren ein paar Beispiele...
es ist so, dass die Parameter Map einfach als Key den Namen des Parameters hat, und Value ist der Wert oder Objekt des Parameters...

also:
Code:
Map parameterMap = new HashMap();
parameterMap.put("MeinParameterName", new Double(2.5)); // Parameter "MeinParameterName" <=> $P{MeinParameterName}

Probier das mal, und schau dir mal die JavaDoc Doku von JaserReports an, es gibt nämlich noch weitere Methoden um Reports zu erzeugen...

mfg
ATha1
 

Neue Beiträge

Zurück