Pass a variable from table to parent report - jasper-reports

I have one child table inside report.. Inside that table I have a variable that I want to use in parent report. Is it possible to pass it from table up to parent report?
Thank you

You can pass the final value of a table subdataset variable back to the main report. The value is returned at the end of each table instantiation.
The report JRXML would look something like the following. You can use a different calculation type if you want to sum/aggregate the returned value in the main report.
<subDataset name="TableDataset">
<variable name="SubdatasetVariable" class="java.lang.Integer" ../>
</subDataset>
<variable name="AVariable" class="java.lang.Integer" calculation="System"/>
<jr:table >
<datasetRun subDataset="TableDataset">
<returnValue fromVariable="SubdatasetVariable" toVariable="AVariable" calculation="Nothing"/>
..

Related

Subreport with return value gives exception "System is not facet valid with enumeration"

I'm getting an exception during compile in Jaspersoft Studio 6.4.0.
How do I address this?
I've created a report containing a subreport from which I want to return a value. To do that, I have:
Created a variable in the subreport called, "logTotal", set to the
value of another variable, which is a summation calculated in the
report. No reset type, no calculation function.
Created a variable in the main report with the same name and type.
No reset type, no calculation function.
In the main report, created a subreport return value link
between the two variables with calculation type, "System."
On compile, I'm seeing the following exception:
net.sf.jasperreports.engine.JRException: org.xml.sax.SAXParseException; lineNumber: 454; columnNumber: 91; cvc-enumeration-valid:
Value 'System' is not facet-valid with respect to enumeration '[Nothing, Count, DistinctCount, Sum, Average, Lowest, Highest, StandardDeviation, Variance, First]'. It must be a value from the enumeration.
I can choose the "System" choice from a
If I use other choices ("No calculation function," "First," "Average," etc.),
the subreport returns null.
Main Report:
<variable name="logTotal" class="java.math.BigDecimal" resetType="None"/>
...
<subreport>
<reportElement positionType="Float" x="0" y="60" width="572" height="40" uuid="d3ec84fb-528f-41f5-8b54-26112fd95b50"/>
<subreportParameter name="loadList">
<subreportParameterExpression><![CDATA[$P{loadList}]]></subreportParameterExpression>
</subreportParameter>
<connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
<returnValue subreportVariable="logTotal" toVariable="logTotal" calculation="System"/>
<subreportExpression><![CDATA["scaling/reports/ScaleSummary_Logs.jasper"]]></subreportExpression>
</subreport>
Subreport:
<variable name="price4" class="java.math.BigDecimal" calculation="Sum">
<variableExpression><![CDATA[$F{price}]]></variableExpression>
</variable>
<variable name="logTotal" class="java.math.BigDecimal" resetType="None">
<variableExpression><![CDATA[$V{price4}]]></variableExpression>
</variable>
It seems that the exception is the result of a mismatch between what JS Studio permits and what this particular compiler (not sure whether JSS uses the compiler I installed (6.4.1) or one that it installs) allows.
Obviously, the solution is to ensure that the compiler being used is compatible.

Get first letter of first and last row in Jasper Reports table

I am using JasperSoft Studio in Eclipse to generate a signup sheet for a church. The page header has the label of what last names will be on the page. So page 1 will have A-D, if the page starts with an A, and ends with a D.
This is turning out to be very complicated for such an easy task. I just want to read what the last_name field is in the first and last row of every page, take the first letter of it, and then stick it in the header.
Any ideas are welcome, I am stumped.
To get the first and last value of a field in a page you use variables with resetType and set the correct evalutationTime on the textField (You will need to use 2 textField aligning them correctly one next to the other)
This example will show how to get the first and last value of the field $F{Last_Name} on every page
First value of a field in the page
The resetType on your variable will be resetType="None"
<variable name="firstValueOnPage" class="java.lang.String" resetType="None">
<variableExpression><![CDATA[$F{Last_Name}]]></variableExpression>
</variable>
and in the textField, use the variable with evalution="Now" (that is default so no tag needed)
<textField>
<reportElement x="30" y="19" width="100" height="20" uuid="e6421031-6db7-4fd9-995f-94cef2eb3621"/>
<textFieldExpression><![CDATA[$V{firstValueOnPage}]]></textFieldExpression>
</textField>
Last value of a field in the page
The resetType of your variable is resetType="Page"
<variable name="lastValueOnPage" class="java.lang.String" resetType="Page">
<variableExpression><![CDATA[$F{Last_Name}]]></variableExpression>
</variable>
and in the textField use the variable evaluationTime="Page"
<textField evaluationTime="Page">
<reportElement x="170" y="19" width="100" height="20" uuid="9100baa5-0095-4dc3-ac79-2cd87562a92d"/>
<textFieldExpression><![CDATA[$V{lastValueOnPage}]]></textFieldExpression>
</textField>
To get only the first char of first and last value I see that you have already figured it out, but to complete the answer the textFieldExpression would be
<textFieldExpression><![CDATA[($V{firstValueOnPage}!=null&&$V{firstValueOnPage}.length()>0)?String.valueOf($V{firstValueOnPage}.charAt(0)).toUpperCase():""]]></textFieldExpression>
Now just put the two textField's next to each other (align them correctly) and you will have the desired result.
Some additional information to learn more about resetType and evalutationTime (from jasper report api 6.2.0)
resetType
None - The variable is incremented with every record during the iteration through the data source
Report - The variable never gets incremented during the report filling process.
Page - The variable is incremented with each new page.
Column - The variable is incremented with each new column.
Group - The variable is incremented every time the group specified by the incrementGroup attributes breaks
EvalutationTime
Auto Evaluation time indicating that each variable participating in
the expression should be evaluated at a time decided by the engine.
Band The element will be evaluated at band end.
Column A constant specifying that an expression should be evaluated after each column is filled.
Group A constant specifying that an expression should be evaluated after each group break.
Master Used for elements that are evaluated at the moment the master report ends.
Now A constant specifying that an expression should be evaluated at the exact moment in the filling process when it is encountered.
Page A constant specifying that an expression should be evaluated after each page is filled.
Report A constant specifying that an expression should be evaluated at the end of the filling process.
Report is ordered by Last_Name therefore we can use calculation Lowest and Highest
define variables:
<variable name="lowestFirstLetter" class="java.lang.String" resetType="Page" calculation="Lowest">
<variableExpression><![CDATA[$F{Last_Name}.substring(0,1)]]></variableExpression>
</variable>
<variable name="highestFirstLetter" class="java.lang.String" resetType="Page" calculation="Highest">
<variableExpression><![CDATA[$F{Last_Name}.substring(0,1)]]></variableExpression>
</variable>
and put textFields with evaluationTime="Page" into PageHeader band
<pageHeader>
<band height="35" splitType="Stretch">
<textField evaluationTime="Page">
<reportElement x="80" y="15" width="100" height="20" uuid="72af3431-eb3d-4f40-993b-4f0733e779cd"/>
<textFieldExpression><![CDATA[$V{lowestFirstLetter}]]></textFieldExpression>
</textField>
<textField evaluationTime="Page">
<reportElement x="260" y="15" width="150" height="20" uuid="0452517b-5066-4f8a-af6b-f941f1d3c1cb"/>
<textFieldExpression><![CDATA[$V{highestFirstLetter}]]></textFieldExpression>
</textField>
</band>
</pageHeader>
Good luck

Grouping by parameter value in jasper

Well, I don't know, maybe I'm missing something, but I've been trying to group data in a jasper report, but so far the grouping appears only if the group expression is a field. Is it possible to group data by parameter value instead of field value? i.e., something like
<groupExpression><[!CDATA[$P{some_param}]]></groupExpression>
instead of
<groupExpression><[!CDATA[$F{some_field}]]></groupExpression>
in the .jrxml file?
Is it possible to group data by parameter value instead of field value?
Yes, it is, just like you mentioned. You would have no syntax errors and the report would be generated.
The problem is that it may not bring what you're expecting. The group bands are usually printed every time the "groupExpression" changes. So basically this parameter needs to be associated with something that will change during the report generation (for example, filling a parameter of a subreport with a field in way that this subreport uses this paramater as a group expression). And of course, it needs to be associated with something that makes sense and bring you the desirable behavior.
You can have something like this in your subreport:
...
<parameter name="START" class="java.util.Date"/>
<parameter name="END" class="java.util.Date"/>
...
And something like this in a detail band of your "super" report:
<subreport>
<reportElement x="0" y="10" width="555" height="200" uuid="ac2c99da-f595-4498-a518-2bfb1f31b73c"/>
<subreportParameter name="START">
<subreportParameterExpression><![CDATA[$F{start}]]></subreportParameterExpression>
</subreportParameter>
<subreportParameter name="END">
<subreportParameterExpression><![CDATA[$F{end}]]></subreportParameterExpression>
</subreportParameter>
...
</subreport>
Just notice I'm assuming the fields $F{end} and $F{start} are also "java.util.Date" objects.

Jasper subdataset parameter incrementing unexpectedly

I have a Jasper report with a Pie Chart that is being drawn at the group_footer for my group "contract". The contract group is returning two rows at this time and I am using the contract id which are integers 1 and 3. When I print the contract id in the group_footer, it prints 1 and then 3 as expected. However, when I try and pass the same contract id into a datasetrun for the Pie Chart in the very same group_footer, the value being passed into the parameter is 3 for both charts (I am viewing the SQL using statement logging on the db server). I can not figure out how it's sending the second value "3" both times. As I mentioned, the contract id prints on the report right next to the chart as "1" the first item in the group.
Here is my subDataset with the parameter "currentContractId":
<subDataset name="age_stats" uuid="44847f01-474b-4228-96e9-ea5ab992f67b">
<property name="....data.defaultdataadapter" value="database"/>
<parameter name="currentContractId" class="...Integer" isForPrompting="false"/>
<queryString>
<![CDATA[SELECT * FROM table WHERE column = $P{currentContractId}]]>
</queryString>
<field name="age" class="java.lang.String"/>
<field name="count" class="java.lang.Long"/>
</subDataset>
Here is the chart datasetrun where I am trying to pass the field "id" into the "currentContractId" parameter for my subDataset above:
<pieDataset maxCount="6">
<dataset>
<datasetRun subDataset="age_stats" uuid="75d14f7c-f94e-4749-860f-ea95c2134e9c">
<datasetParameter name="currentContractId">
<datasetParameterExpression><![CDATA[$F{id}]]></datasetParameterExpression>
</datasetParameter>
</datasetRun>
</dataset>
</pieDataset>
I am happy to provide the full jrxml to anyone who thinks it would be helpful.
I found the problem. Aside from the options in the chart dataset wizard, there is a seperate option under the chart properties called "Evaluation Time". I set the Evaluation Time option to my Group "contract" and the problem was resolved.

Accessing/importing user defined classes in jrxml

Have anyone tried to import user defined classes in jasper report (.jrxml file)?
I want to use some (user defined) Util class inside my jasper report to cook some bean attributes. I am using Javabean datasource
Please let me know if you need further clarification.
syntax to import class is
<import value="java.util.HashMap"/>
I want to use
<import value="mypackage.MyUtil" />
....
....
<field name="myVar" class="java.lang.String">
<fieldDescription><![CDATA[MyUtil.cook(myData)]]>
</fieldDescription>
</field>
The simple definition for MyUtil.java could be
package mypackage;
public class MyUtil
{
public static String cook(String data)
{
return data + "_cooked";
}
}
I think I should have tried sufficiently before asking this.
There is nothing extra needed apart from
There are two sections in jrxml:
1. Defining fields from javabean source
2. Using fields defined in step 1. to populate values in detail band
I was trying to cook the value of javabean members even before they are used to create fields
So, jasper was trying to parse that 'expression' as javabean member.
Following is wrong
<field name="myVar" class="java.lang.String">
<fieldDescription><![CDATA[MyUtil.cook(myData)]]>
</fieldDescription>
</field>
When I used the Util class on field value, it worked.
<textField>
<reportElement x="200" y="0" width="100" height="13"/>
<textElement/>
<textFieldExpression class="java.lang.String">
<![CDATA[MyUtil.cook($F{myVar})]]>
</textFieldExpression>
</textField>
Thanks
Nayn
You have to set the classpath in your iReport. It depends on its version, but is generally under Settings/Classpath