# JasperReports/IReport



## MScalli (17. März 2009)

Hi Leutz.
Ich habe einen Report mit IReport erstellt und will eine Zeile nur dann anzeigen wenn mein feld ($F{kart_menge10) NICHT 0 ist.
Dieses kommt aus einer Datenbank und ist vom Typ BigDecimal.
eigentlich sollte es doch so gehen.. also diesen Code bei "Drucken wenn Ausdruck"
einfügen. Aber das will einfach nicht.. 
kann mir irgendwer helfen

so gehts nicht

```
( $F{kart_menge10}==new BigDecimal(0) ? Boolean.FALSE : Boolean.TRUE )
```

so auch nicht

```
( $F{kart_menge10}==BigDecimal.ZERO ? Boolean.FALSE : Boolean.TRUE )
```

heisst wenn das Feld vom Typ BigDecimal 0 oder 0.00(<-- das ist glaub mein Problem) ist FALSE zurück geben, sonst TRUE.


----------



## takidoso (17. März 2009)

Mal eine Frage von welchem Typ ist denn Dein Feld?
ist es ein String dann müstest Du es vermutlich umwandeln in BigDecimal.
ist es schon ein BigDecimal... dann würde ich es mal mit *BigDecimal.compareTo(BigDecimal nummer)* versuchen.

Grüße und gutes Gelingen

Takidoso

Nachtrag: vielleicht hilft Dir ja auch schon die equals-Mehtode weiter


----------



## MScalli (18. März 2009)

Das Feld das ich vergleichen will ist ein BigDecimal.
Und ich will einfach abfragen ob der wert 0 ist.
Aber irgendwie geht das nicht.
0 nimmt er gar nicht und bei 0.00 komme ich nicht auf das gewünschte ergebnis.
heist ob jetzt 1.23 oder 0.00 drin steht er liefert immer das selbe zurück.

ich müsste eigentlich nur TRUE zurück liefern wenn die Zahl 0.00 ist.
nur das erweist sich schwerer als man denkt


----------



## jeipack (18. März 2009)

Hi
Wieso 0.00 und nicht 0.0? Haben die BigDecimals in dem Feld $F{kart_menge10} die Auflösung von zwei Dezimalstellen?

Hast du takidosos Vorschlag (compareTo) ausprobiert? Scheint das einzig Wahre zu sein:


> compareTo
> 
> public int compareTo(BigDecimal val)
> 
> ...



Das hier klappt bei mir:

```
System.out.println(new BigDecimal(-0.0).compareTo(new BigDecimal(0.00))==0? "true": "false");
```

Gruss


----------



## takidoso (18. März 2009)

MScalli hat gesagt.:


> Das Feld das ich vergleichen will ist ein BigDecimal.
> Und ich will einfach abfragen ob der wert 0 ist.
> Aber irgendwie geht das nicht.
> 0 nimmt er gar nicht und bei 0.00 komme ich nicht auf das gewünschte ergebnis.
> ...



hast Du es denn schon mit meinem obigem Vorschlag experimentiert? Benutze nicht den Operator == sondern die Routine *equals *oder die Routine *compareTo *
Der Grund warum es mit dem == Operator nicht geht ist, dass Du damit die Identität der Objekte abfragst (genauso wie bei Strings) daher benötigst Du hier eine der dafür vorgesehenen Vergleichsroutinenen!


----------



## MScalli (18. März 2009)

o mann.. endlich.. vielen vielen dank leutz.

so gehts

```
new Boolean(($F{kart_menge10}.compareTo(new BigDecimal(0.00))==0 ? "false": "true"))
```

aber mal ne Frage. WIe oder wo lässt du dir das im IReport mit System.out.println() anzeigen... wenn ich das könnte hätte ich warscheinlich net soviel Probs^^

und warum man false und true als String zurück gibt ist mir ehrlich gesagt nicht ganz klar!
Na Ok.. bei IReport ist mir ehrlich gesagt fast nichts wirklich klar


----------



## jeipack (18. März 2009)

lol
Das habe ich natürlich nicht in iReport gemacht.
In iReport ist

```
($F{kart_menge10}.compareTo(new BigDecimal(0.00))==0 ? Boolean.FALSE : Boolean.TRUE)
```
natürlich sinnvoller 
Sonst hast du da noch einen cast von String zu Boolean. Unnötiger Overhead.

Dachte das wäre klar ^^

Gruss


----------



## takidoso (18. März 2009)

MScalli hat gesagt.:


> o mann.. endlich.. vielen vielen dank leutz.
> 
> so gehts
> 
> ...



Das ist weniger eine Frage von IReports, mehr eine Frage von Java. Der Konstruktor für Boolean bietet die Möglichkeit auch mit den Strings "true" und "false"  zu arbeiten. Bedeutet aber wie schon von jeipack erwähnt einen gewissen Overhead und sollte besser nur dann verwendet werden, wenn es nicht anders geht.
Schau doch mal in die Sourcen der Klasse Boolean nach, dann siehst Du auch warum sowohl Deine als auch jeipacks Lösung geht und warum jeipacks optimierter ist.
BTW: Jeipack hat in seinem 1. Vorschlag keinen Code in IReport bzw JasperReport integriert, sondern sein Beispiel geht von reinem Java aus.


----------



## MScalli (18. März 2009)

Ich tu mich sehr sehr schwer mit IReport.

mit Boolean.FALSE wollt ich es schon zu beginn machen 
Wie gasagt, mit java komm ich ziemlich gut klar, aber im IReport abfragen oder bedingungen zu formulieren ist ne Sache für sich^^

Dann markier ich den Thread mal als erledigt und sag noch mal vielen dank euch zweien das ihr euch auch noch die Zeit genommen habt mir das zu erklären 

gruss
MScalli


----------



## jeipack (18. März 2009)

MScalli hat gesagt.:


> aber im IReport abfragen oder bedingungen zu formulieren ist ne Sache für sich^^


Ich weiss ganz genau was du meinst! Ich hab mich auch schon todgeärgert 


MScalli hat gesagt.:


> und sag noch mal vielen dank euch zweien das ihr euch auch noch die Zeit genommen habt mir das zu erklären


Über Renomee würden wir uns beide natürlich ganz doll freuen 

Gruss


----------



## MScalli (20. März 2009)

o mann.. jetzt muss ich diesen Thread noch mal aufmachen 
kann mir einer dabei helfen
ich hab ein Feld vom Typ BigDecimal.. in diesem steht entweder 
0.00
1,00
oder 2,00 drin

um das zu testen will ich einfach den wert zurück geben.. ich hab das mal so im IReport gemacht, aber es kommen bei 2 sätzen fehlerhafte ergebnisse..
mein code (im IReport)

```
($F{a_pe_vk}.compareTo(new BigDecimal(0.00))==0 ? new BigDecimal(0.00) : 
  ($F{a_pe_vk}.compareTo(new BigDecimal(1.00))==1 ? new BigDecimal(1.00) : 
    ($F{a_pe_vk}.compareTo(new BigDecimal(2.00))==2 ? new BigDecimal(2.00) : new BigDecimal(111.00)
    )
  ) 
)
```

heisst ich schau zuerst.. steht 0 drin
ja :0,00 zurück geben 
nein: schauen ob 1 drin steht
   ja: 1,00 zurück geben
   nein: schauen ob 2 drin steht
       ja: 2,00 zurück geben
       nein 111,00 zurück geben

ich bekomme leider je nach menge der sätze verschiedene werte..
hab ich da nen hund drin? Ich verstehs echt bald nicht mehr..

übrigens die Zahlen die ich zurück gebe sind frei erfunden.. einfach um zu sehen was passiert
plz HELP 

gruss
MScalli


----------



## jeipack (20. März 2009)

Hi

Schau dir die Doku zu compareTo mal genau an. Vorallem den Rückgabewert:


> Returns:
> -1, 0 or 1 as this BigDecimal is numerically less than, equal to, or greater than val.


Das heisst: wenns gleich sind kommt 0 zurück. Wenn der zu vergleichende Wert kleiner ist kommt -1 zurück wenn er grösser ist kommt 1 zurück.

Heisst für dich:

```
($F{a_pe_vk}.compareTo(new BigDecimal(0.00))==0 ? new BigDecimal(0.00) : 
  ($F{a_pe_vk}.compareTo(new BigDecimal(1.00))==0 ? new BigDecimal(1.00) : 
    ($F{a_pe_vk}.compareTo(new BigDecimal(2.00))==0 ? new BigDecimal(2.00) : new BigDecimal(111.00)
    )
  ) 
)
```
Ahja und 0.0*0* ist nicht nötig. 0.0 reicht.


Gruss


----------



## MScalli (20. März 2009)

Noch 1 winzige Frage.. Wo finde ich diese Doku 
(hab mir jetzt das Buch besorgt.. was ein wälzer)
O mann.. du glaubst gar nicht wie lange ich da schon rum mache^^

vielen dank noch mal 

gruss
MScalli


----------



## jaws278 (20. März 2009)

Grüße die Herren

Als ich wieder mal verkrampft das Web auf der Suche nach "kostenloser" Hilfe durchforstet habe stosse ich auf dieses Forum.
Und was vernehmen meine tränenden Augen: 
DA GIBTS JA JEMANDEN DER SICH MIT iReport AUSKENNT 

Langer Rede kurzer Sinn, ich hab zwar den Report perfekt erstellt aber aus einer java Applikation bring ich ihn nicht zum Laufen.
Natürlich hab ich mir schon die ToDo's rein gezogen, aber offensichtlich stimmt was nicht mit meiner Weisheit!

Das ist mein Versuch:

 try{
              JasperDesign jasperDesign = JRXmlLoader.load(reportFile);
              JasperReport jasperReport =  JasperCompileManager.compileReport(jasperDesign); *Hier zerlegt es ihn!*
              String url = "jdbc:mysql://localhost/xxxxxxxxxxxxx";
              String usr = "xxxxx";
              String pass = "xxxxxx";
              Class.forName("com.mysql.jdbc.Driver").newInstance();
              java.sql.Connection conn = java.sql.DriverManager.getConnection(url,usr,pass);
              System.out.println("Datenbank ist verbunden");
              JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null,conn);
              JasperViewer.viewReport(jasperPrint);
        }catch(Exception ex) {
              String connectMsg = "Could not create the report " + ex.getMessage() + " " + ex.getLocalizedMessage();
              System.out.println(connectMsg);
        }


Liebe Anhänger des iReports, tut ein gutes Werk und helft den Unwissenden
Ich komm erst gar nicht zum Connect der DB!

Version: iReport nb 3.1.4
Eingebundene libs: 
commons-beanutils-1.7.jar
commons-digester-1.7.jar
jasperreports-3.1.4.jar
commons-collections-2.1.jar
commons-logging-1.1.jar

Imports:
import net.sf.jasperreports.view.JasperViewer;
import net.sf.jasperreports.engine.xml.JRXmlLoader;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.JasperReport;

Ergebnis:
_Could not create the report Error compiling report java source files : E:\Work\BierBoerse09\Bier_Boerse\classic_1237571800281_37932.java  Error compiling report java source files : E:\Work\BierBoerse09\Bier_Boerse\classic_1237571800281_37932.java _


----------



## MScalli (22. März 2009)

Also wenn du nichts vom Prgramm übergeben musst reicht es so



```
try{
			JasperReport jasperReport = JasperCompileManager.compileReport("K:\\Temp\\Test.jrxml"); //<-- hier den Pfad der jrxml angeben
			JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, getConnection());
			
			JasperViewer.viewReport(jasperPrint);
			
		}catch(Exception ex) {
			String connectMsg = "Could not create the report " + ex.getMessage() + " " + ex.getLocalizedMessage();
			System.out.println(connectMsg);
		}
```

so wird dir der Bericht im Viewer angezeigt!!


----------



## jaws278 (22. März 2009)

Man oh man, wenns so einfach wäre.
Ich hatte schon gehofft.
Aber leider wars wirkungslos!
Ich hab keine Ahnung wieso es ihn jedes mal auf die gleiche Art zerlegt!

Gibts eine Möglichkeit die libs zu Debuggen, um Einzelheiten raus zu bokommen was ihm den Schluckauf beschert!


----------



## MScalli (23. März 2009)

@ jeipack. 
Ich hab es jetzt so gemacht und es funktioniert einwandfrei.
Vielen Dank noch mal 

gruss
MScalli


----------



## takidoso (23. März 2009)

jaws278 hat gesagt.:


> Man oh man, wenns so einfach wäre.
> Ich hatte schon gehofft.
> Aber leider wars wirkungslos!
> Ich hab keine Ahnung wieso es ihn jedes mal auf die gleiche Art zerlegt!
> ...


Vielleicht ist es einfacher, wenn Du genau sagst woran es scheitet,  z.B. eine Exception bekommst, oder ähnliches wäre es nicht schlecht sie hier mal zu posten.
Denn wenn es bei einem funktioniert bei dem anderen nicht, könnte es entweder an der Umgebung oder an dem konkreten Report liegen.

Auf die Gefahr, dass ich jetzt ein wenig klugschieße habe ich manchmal das Gefühl, dass IReport- JasperReport- und eigetnlich Java-Belange  gern in diesem Thread verwechselt werden.
Das ursprüngliche Problem mit dem Vergleichen der Zahlen, war ein reines Java-Belang, hatte weder mit Jasper- noch miti IReport was zu tun. Das Problem den Report nicht in Deinem Programm aufrufen zu können ist noch näher zu untersuchen ob es ein Umgebungsproblem, oder ein Problem des erzeugten Reports ist, Wenn es kein Umgebungsproblem sein soltle, könnte es an einen kaputten Report handeln, also ein Bug in IReport sein, oder eine Lücke in JasperReport sein. IReport ist nämlich nur eine Oberfläche um JasperReport-Konforme XMLs für Reports zu erstellen.


----------



## takidoso (23. März 2009)

MScalli hat gesagt.:


> Noch 1 winzige Frage.. Wo finde ich diese Doku
> (hab mir jetzt das Buch besorgt.. was ein wälzer)
> O mann.. du glaubst gar nicht wie lange ich da schon rum mache^^
> 
> ...



Hi,
diese Doku zu compareTo findest Du im Java. Wenn Du Eclispe verwendest, kannst Du es sogar im ToolTipText sehen und falls die Doku länger ist als das Fensterchen, kannst Du mit F2 den gesammten Text sehen und scrollen. Alternativ dazu kannst Du auch einfach die Java-Dok notfalls auch im Internet googeln.

Mal noch eine andere Frage, Dein Vergleich ob etwas einem BigDecimal mit wret irgendwas entspricht und dann DeinZuweisen des selben BigDezimal-Wertes, verstehe ich vom Sinn her nicht. Das sieht für mich so aus, als ob Du sagtest wenn 2 2 ist übergebe eine neues 2, ist aus Sicht irgendwie redundant und nicht sher von Nutzen.
Kann es sein, dass Du eigetnlich das Zahlenformat in dem der BigDezimal representiert wird versuchtst zu ändern?


----------



## jeipack (23. März 2009)

takidoso hat gesagt.:


> Auf die Gefahr, dass ich jetzt ein wenig klugschieße habe ich manchmal das Gefühl, dass IReport- JasperReport- und eigetnlich Java-Belange  gern in diesem Thread verwechselt werden.



Ja da hast du vollkommen recht und das geschiet nicht nur hier. Aber vielfach ist es gar nicht so einfach heraus zu finden wo genau das Problem liegt.. Resp ist es ja schon ein Teil der Lösung wenn man weiss wo das Problem liegt 

@jaws278: Du kannst den Report erst gar nicht kompilieren, richtig? Also der Compiler müsste eigentlich Errors ausgeben. Wenn er das nicht macht versuche mal den Report direkt in iReport zu compilieren (Im Menu Build -> Kompilieren). Sollte etwas beim Kompilieren nicht klappen wird dir dann der Fehler ausgegeben, kannst du uns den mal posten?

@MScalli: Mit der Doku meine ich die normale JavaDoc. Ist z.B. bei Eclipse schon direkt verlinkt (Wenn du über einer Klasse bist einfach F1 drücken und dann Javadoc for "xy" anklicken. 
Oder online bei Sun: http://java.sun.com/javase/6/docs/api/
Allerdings google ich immer nach "Klassenname" java und lande dann meistens automatisch auf der obigen Doku.


Gruss


----------



## jaws278 (27. März 2009)

jeipack hat gesagt.:


> @jaws278: Du kannst den Report erst gar nicht kompilieren, richtig? Also der Compiler müsste eigentlich Errors ausgeben. Wenn er das nicht macht versuche mal den Report direkt in iReport zu compilieren (Im Menu Build -> Kompilieren). Sollte etwas beim Kompilieren nicht klappen wird dir dann der Fehler ausgegeben, kannst du uns den mal posten?



Du hast so ziemlich zu 100% mein Problem beschrieben!!
Kompilieren lässt sich der report! (Hab massig *.jasper files rum liegen)
Dass der Reportgenerater in der Syntax vom XML File was verdreht hat , hatte ich mir auch schon gedacht und habe auf den verdacht hin einen absolut einfach gestrickten Report gebastelt a la  _select  * from ..._.
Formatierung praktisch nicht vorhanden!
Das Ergebnis war das selbe wie wie beim komplexen Report.
Ich würde jetzt einmal sagen, dass momentan keiner Report läuft, egal welcher Natur?

Die Exception die ich bekomme sagt absolut gar nichts aus. 

_Error compiling report java source files : 
E:\Work\xxxxxxxx\xxxxxxxxxxx\test46jrxml_1238179976281_956994.java   
_

So und jetzt ist guter Rat teuer!
Ach übrigens, ich bin durchaus des Java mächtig! 


Der Saft des Java sei mit euch, Danke

Chris


----------



## jaws278 (29. März 2009)

Hallo, ich bins wieder mal!

Nachdem ich ja ziemlich ratlos war, was iReport betroffen hat, oder besser gesagt die Antwort von JasperReport auf meinen generierten *.jrxml File, hab ich kurzer Hand weiter reduziert.
Nachdem ich dann ganz einfach den Report File nur mehr ins Basis Verzeichnis rein kopiert hatte, ist das Ding auf einmal gelaufen.

Meine Erkenntnis daraus ist, dass es wohl Probleme mit packages gibt, denn, wenn er den File nicht findet wirft er sehr wohl eine FileNotFoundException!
Sollte also bei jemanden der *.jrxml File nicht generierbar sein, einfach mal versuchen
das Ding ins Basis Verzeichnis zu kopieren.

Übrigens die Exception sagt absolut gar nix aus! 
Da fischt der Benutzer der lib im Trüben!

CU

Chris


----------

