# JasperReport Hintergrundfarbe wertabhängig ändern



## Thomas220 (25. Dez 2016)

Hallo zusammen, ich wünsche allen Lesern denen es etwas bedeutet ein frohes Weihnachtsfest.
Nun zu meinem Problem, bei dem ich schon fast am Verzweifeln bin. Nicht nur, dass ich es einfach nicht (reproduzierbar) hinbekomme, sondern, weil ich nun schon fast eine Woche an der Lösung arbeite.
Die Hintergrundfarbe eines Textfeldes soll sich, ja nach Wert der Variable, die im Textfeld dargestellt wird, ändern. Wert kleiner oder gleich dem Vergleichswert - grün, Wert größer als Vergleichswert - rot (im vorliegenden Code sind es grün und pink, daran nicht stören).
Nachdem ich gelernt habe, dass man in Java zwei BigDecimal nicht einfach mit >, <, = oder so vergleichen kann, sondern über compareTo geht, frage ich mich jetzt, was noch falsch ist.
Hier der Code für die Farbänderung:

```
<style name="ColoredField1">
        <conditionalStyle>
            <conditionExpression><![CDATA[($F{DiffAnteil108}.compareTo(new BigDecimal(3.8)) == 0)]]></conditionExpression>
            <style mode="Opaque" forecolor="#000000" backcolor="#51FC57"/>
        </conditionalStyle>
        <conditionalStyle>
            <conditionExpression><![CDATA[($F{DiffAnteil108}.compareTo(new BigDecimal(3.8)) == -1)]]></conditionExpression>
            <style mode="Opaque" forecolor="#000000" backcolor="#FF0FF0"/>
        </conditionalStyle>
    </style>
```
Also nach meinem Verständnis müsste sich die Farbe, egal wie der Wert für $F{DiffAnteil108} auch ist, entweder in grün oder pink ändern. Tut er aber nicht.
Folgenden Code habe ich auch schon probiert:

```
<style name="ColoredField1">
        <conditionalStyle>
            <conditionExpression><![CDATA[$F{DiffAnteil108}.compareTo(new BigDecimal(3.8)) == 0]]></conditionExpression>
            <style mode="Opaque" forecolor="#000000" backcolor="#51FC57"/>
        </conditionalStyle>
        <conditionalStyle>
            <conditionExpression><![CDATA[$F{DiffAnteil108}.compareTo(new BigDecimal(3.8)) == -1]]></conditionExpression>
            <style mode="Opaque" forecolor="#000000" backcolor="#51FC57"/>
        </conditionalStyle>
        <conditionalStyle>
            <conditionExpression><![CDATA[$F{DiffAnteil108}.compareTo(new BigDecimal(3.8)) == 1]]></conditionExpression>
            <style mode="Opaque" forecolor="#000000" backcolor="#FF0FF0"/>
        </conditionalStyle>
    </style>
```
Funktioniert ebenfalls nicht.
Da ich auf dem Gebiet Java ein absoluter Neuling bin, weiß ich auch nicht, ob das Java, welches im JasperReport verwendet wird, ein "normales" Java ist. Ich bin nämlich ob der verschiedenen Interpretationen von "compareTo" etwas verwirrt.
Einmal steht als Erläuterung hier http://www.java-forum.org/thema/die-compareto-methode.62607/
Gibt zurück: den Wert 0, wenn der Argument-String mit diesem String identisch ist; einen Wert kleiner als 0, wenn dieser String lexikographisch kleiner ist als der Argument-String; und einen Wert größer als 0, wenn dieser String lexikographisch größer als der Argument-String ist.​Und hier http://docs.oracle.com/javase/1.5.0...gDecimal.html#compareTo(java.math.BigDecimal)
steht:
*Returns:*
-1, 0, or 1 as this BigDecimal is numerically less than, equal to, or greater than val.​Gehe jetzt davon aus, dass es einen Unterschied zwischen dem Vergleich (compare) von Strings und bei Dezimalzahlen gibt.
Der Wert der Variable ist aktuell kleiner als 3.8. Dem Feld wurde als Style "ColoredField1" zugewiesen. Das Feld ist als BigDecimal deklariert.
Würde auch gern Bilder dazu einfügen, weiß aber nicht wie es geht, da ich keine Bilder im Internet habe, sondern nur lokal auf meinem Rechner.

Was mache ich falsch?
Vielen Dank
Thomas
​


----------



## Wurstkopp (25. Dez 2016)

1. Hast du dem Feld mal erfolgreich einen normalen Style hinterlegt? Vielleicht werden die Werte ja anderweitig wieder überschrieben.
2. Mach mal nur eine Conditional Expression wo du nur *true* reinschreibst und schau ob das funktioniert.

Je nach verhalten kannst du aus dem Ergebnis Fehlerquellen ausschließen oder genauer bestimmen. Falls du beide Proben ohne Probleme hinbekommst solltest du dir vielleicht dein Feld noch mal genauer anschauen. Ggf. steht zur Evalution Time ja "null" in der Variable?


----------



## Thomas220 (26. Dez 2016)

Hallo Wurstkopp, vielen Dank für das Interesse.
Mal sehen, was funktioniert.


> 1. Hast du dem Feld mal erfolgreich einen normalen Style hinterlegt? Vielleicht werden die Werte ja anderweitig wieder überschrieben.


Also wenn Du damit meinst, dass ich bei "Appearance" --> "Color" --> "Backcolor" eine feste Farbe hinterlegen soll, das habe ich getan. "Gelb". Damit ich erkennen kann, ob sich was ändert. Bleibt "Gelb", egal wie der Wert ist. Meinst Du das oder etwas anderes?



> 2. Mach mal nur eine Conditional Expression wo du nur *true* reinschreibst und schau ob das funktioniert.


Dafür sind meine Kenntnisse zu gering. Was meinst Du damit konkret? Also wo und wie macht man das? Im Java-Code oder in den Feldeinstellungen des JasperReports?

Danke.
Thomas


----------



## Thomas220 (26. Dez 2016)

Hallo Wurstkopp,
nun habe ich was ausprobiert, worauf mich Deine Anmerkung


> Vielleicht werden die Werte ja anderweitig wieder überschrieben.


brachte.

Dieser Code hier enthielt noch einen zusätzlichen Eintrag:

```
textField>
                <reportElement style="ColoredField1" x="120" y="176" width="50" height="21" uuid="7841de7f-0cfc-416e-b3b3-ebc4b4127331">
                    <property name="com.jaspersoft.studio.unit.width" value="pixel"/>
                    <property name="com.jaspersoft.studio.unit.height" value="pixel"/>
                    <property name="com.jaspersoft.studio.unit.x" value="pixel"/>
                    <property name="com.jaspersoft.studio.unit.y" value="pixel"/>
                </reportElement>
                <box>
                    <pen lineWidth="1.0" lineStyle="Dotted"/>
                    <topPen lineWidth="1.0" lineStyle="Dotted"/>
                    <leftPen lineWidth="1.0" lineStyle="Dotted"/>
                    <bottomPen lineWidth="1.0" lineStyle="Dotted"/>
                    <rightPen lineWidth="1.0" lineStyle="Dotted"/>
                </box>
                <textElement textAlignment="Center" verticalAlignment="Middle">
                    <font isBold="true"/>
                </textElement>
                <textFieldExpression><![CDATA[$F{DiffAnteil108}]]></textFieldExpression>
            </textField>
```

In der ersten Zeile vor "uuid..." stand der Eintrag "backcolor=#12AB34" oder so.
Nachdem ich diesen Eintrag löschte, funktioniert das nun wieder mit den Farben.
Aber das ist doch sicherlich ein Bug im JasperReport. Oder?
Denn wie ich weiter oben schrieb, war das Problem, dass ich 





> es einfach nicht (reproduzierbar) hinbekomme...


 Denn es hat schon mal funktioniert. Nachdem ich aber die Einstellungen soweit korrigieren wollte, dass es eben ROT bzw. GRÜN wird, klappte es nicht mehr (???).
In diesem Zusammenhang habe ich noch eine Frage:
Wenn ich im JasperReport auf dem Reiter "Source" etwas ändere, dann kann ich den Report nicht einfach speichern.
Manchmal ist es so, dass das Diskettensymbol "ausgegraut" ist. Dann muss ich über "Save as" gehen und den Report überschreiben.
Manchmal ist das Diskettensymbol nicht "ausgegraut". Große Falle: Drücke ich nun auf das Diskettensymbol, dann werden die Änderungen, die ich im Sourcecode vorgenommen habe, entfernt.

Liegt hier ein Bedienfehler meinerseits vor? Oder ein Bug im JasperReport?
Kann ich mir fast nicht vorstellen. Ist ja elemetar, im Sourcecode zu arbeiten.

Vielen Dank.
Thomas


----------

