I have a simple text field in a subreport.
Goal: Apply "propertyExpression" for "Forecolor" only when the parameter "evenRow" is 1
Following does not work but I gave it a try...
<textField>
<reportElement key="" mode="Transparent" x="108" y="1" width="76" height="13">
<propertyExpression name="net.sf.jasperreports.style.forecolor">
<![CDATA[$P{evenRow} == 1 ? $P{colorZebra1_text} : ""]]>
</propertyExpression>
</reportElement>
<textElement><font fontName="SansSerif" size="8"/></textElement>
<textFieldExpression>"Text"</textFieldExpression>
</textField>
Context: The parent report calls this! subreport which contains the textfield multiple times (illustrated in attached image). Each time it is called the parent report sends the parameter "evenRow" as either 1 or 0...
//snipped from parent report to show that "evenRow" is 1 or 0
($V{REPORT_COUNT}.intValue() % 2 == 0 ? 1 : 0)
Question: How can I create a propertyExpression for the dynamic "Forecolor" that only comes to effect when my parameter "evenRow" is set to 1 ?
Note: I am aware I could use conditional styles -> The problem with styles in general is that they are never dynamic, i.e. I would have to create 1 style for every single color that 'could' be set ...and because the color can be set to whatever hex value this is not an option.
The concept of using net.sf.jasperreports.style.forecolor is working well with propertyExpression at practice.
Here is small template with parameters used at propertyExpression:
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Style forecolor" pageWidth="595" pageHeight="842" whenNoDataType="NoDataSection" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
<parameter name="color" class="java.lang.String">
<defaultValueExpression><![CDATA["#E3106B"]]></defaultValueExpression>
</parameter>
<parameter name="isApplyColor" class="java.lang.Boolean">
<defaultValueExpression><![CDATA[true]]></defaultValueExpression>
</parameter>
<parameter name="DEFAULT_COLOR" class="java.lang.String" >
<defaultValueExpression><![CDATA["#000000"]]></defaultValueExpression>
</parameter>
<title>
<band height="79" splitType="Stretch">
<textField>
<reportElement x="211" y="39" width="100" height="30" uuid="4af3eb91-2334-40fe-a77a-45378fe93210">
<propertyExpression name="net.sf.jasperreports.style.forecolor"><![CDATA[$P{isApplyColor} ? $P{color} : $P{DEFAULT_COLOR}]]></propertyExpression>
</reportElement>
<textFieldExpression><![CDATA["Text Field"]]></textFieldExpression>
</textField>
</band>
</title>
</jasperReport>
The output result generated at JSS looks like this:
I used "#000000" (black) as default color.
Looks like you need to check and fix the value of $P{evenRow}
I used subreport with parameters at propertyExpression like at first example. This report is using "external" parameter, but there is no difference - it is just a parameter
Subreport's jrxml:
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Subreport" pageWidth="595" pageHeight="842" whenNoDataType="NoDataSection" columnWidth="595" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0">
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
<parameter name="color" class="java.lang.String">
<defaultValueExpression><![CDATA["#E3106B"]]></defaultValueExpression>
</parameter>
<parameter name="DEFAULT_COLOR" class="java.lang.String">
<defaultValueExpression><![CDATA["#000000"]]></defaultValueExpression>
</parameter>
<parameter name="evenRow" class="java.lang.Integer"/>
<title>
<band height="20" splitType="Stretch">
<textField>
<reportElement x="130" y="0" width="100" height="20">
<property name="com.jaspersoft.studio.unit.height" value="pixel"/>
<propertyExpression name="net.sf.jasperreports.style.forecolor"><![CDATA[$P{evenRow} == 0 ? $P{color} : $P{DEFAULT_COLOR}]]></propertyExpression>
</reportElement>
<textFieldExpression><![CDATA["Text Field"]]></textFieldExpression>
</textField>
<textField>
<reportElement x="20" y="0" width="100" height="20"/>
<textFieldExpression><![CDATA["evenRow: " + $P{evenRow}]]></textFieldExpression>
</textField>
</band>
</title>
</jasperReport>
The 2nd textField is just for checking value of $P{evenRow}.
The design is very simple:
The main report is using this subreport
The jrxml of master report:
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Master" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="10 empty rows"/>
<detail>
<band height="20" splitType="Stretch">
<textField>
<reportElement x="0" y="0" width="100" height="20"/>
<textFieldExpression><![CDATA[$V{REPORT_COUNT}]]></textFieldExpression>
</textField>
<subreport>
<reportElement x="130" y="0" width="200" height="20"/>
<subreportParameter name="evenRow">
<subreportParameterExpression><![CDATA[($V{REPORT_COUNT} % 2 == 0 ? 1 : 0)]]></subreportParameterExpression>
</subreportParameter>
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.JREmptyDataSource()]]></dataSourceExpression>
<subreportExpression><![CDATA["Subreport.jasper"]]></subreportExpression>
</subreport>
</band>
</detail>
</jasperReport>
The textField is used for showing row number.
The desing looks like:
The output result at JSS: