I have generated a report (with JasperReport). My problem that the chart repeats, I have one chart and the report contains 22 pages! What is the problem?
This is my 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="report2" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<property name="ireport.zoom" value="1.0"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="0"/>
<subDataset name="New Dataset 1">
<parameter name="SQL" class="java.lang.String"/>
<parameter name="Titre" class="java.lang.String">
<defaultValueExpression><![CDATA[]]></defaultValueExpression>
</parameter>
<queryString>
<![CDATA[$P!{SQL}]]>
</queryString>
<field name="nb" class="java.lang.Long"/>
<field name="champ1" class="java.lang.String"/>
<field name="champ2" class="java.lang.String"/>
</subDataset>
<parameter name="SQL" class="java.lang.String">
<defaultValueExpression><![CDATA[]]></defaultValueExpression>
</parameter>
<parameter name="Titre" class="java.lang.String"/>
<queryString>
<![CDATA[select id from jiraissue]]>
</queryString>
<field name="id" class="java.math.BigDecimal"/>
<background>
<band splitType="Stretch"/>
</background>
<title>
<band height="46" splitType="Stretch">
<textField>
<reportElement x="89" y="15" width="180" height="20"/>
<textElement/>
<textFieldExpression class="java.lang.String"><![CDATA[$P{Titre}]]></textFieldExpression>
</textField>
</band>
</title>
<pageHeader>
<band height="35" splitType="Stretch"/>
</pageHeader>
<columnHeader>
<band height="13" splitType="Stretch"/>
</columnHeader>
<detail>
<band height="185" splitType="Stretch">
<stackedBar3DChart>
<chart>
<reportElement x="57" y="16" width="420" height="165"/>
<chartTitle/>
<chartSubtitle/>
<chartLegend/>
</chart>
<categoryDataset>
<dataset>
<datasetRun subDataset="New Dataset 1">
<datasetParameter name="SQL">
<datasetParameterExpression><![CDATA[$P{SQL}]]></datasetParameterExpression>
</datasetParameter>
<connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
</datasetRun>
</dataset>
<categorySeries>
<seriesExpression><![CDATA[$F{champ2}]]></seriesExpression>
<categoryExpression><![CDATA[$F{champ1}]]></categoryExpression>
<valueExpression><![CDATA[$F{nb}]]></valueExpression>
</categorySeries>
</categoryDataset>
<bar3DPlot>
<plot/>
<itemLabel color="#000000" backgroundColor="#FFFFFF"/>
<categoryAxisFormat>
<axisFormat>
<labelFont/>
<tickLabelFont/>
</axisFormat>
</categoryAxisFormat>
<valueAxisFormat>
<axisFormat>
<labelFont/>
<tickLabelFont/>
</axisFormat>
</valueAxisFormat>
</bar3DPlot>
</stackedBar3DChart>
</band>
</detail>
<columnFooter>
<band height="24" splitType="Stretch"/>
</columnFooter>
<pageFooter>
<band height="20" splitType="Stretch"/>
</pageFooter>
<summary>
<band height="22" splitType="Stretch"/>
</summary>
Update
I have solved the problem by moving the chart to the summary part :)
In Jasper Report, everything you place in the detail band is repeated number of times it appears in the source.
If you want to show anything (not only chart) just once, avoid the detail band.
For example, you can place it in the summary section.
Update: As others pointed, I have extended my answer a little bit.
I also had face with the same problem like this before. It is because your data will be looped which causes such redundant of data. What you need to do is go to 'Print when expression' in properties and set your variable report count to 1. This is how it looks, $V{REPORT_COUNT}==1. It will display only once in your report.
I use $V{PAGE_NUMBER} == 1 as value of 'Print when expression' so it is forced to appear only on first page.
Related
I have 2 groups, both will show the same 2 records (from the sql output) but grouped differently and shows different fields.
Output:
The 2nd result of group 1 is between the results of group 2. This is how Jaspersoft works.
But does someone have an idea how to keep the group results with eachother?
Group 1: result 1
Group 1: result 2
Group 2: result 1
Group 2: result 2
Any help or tips are appreciated.
[1]https://i.stack.imgur.com/509cP.jpg
Jrxml
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.2.2.final using JasperReports Library version 4.7.0 -->
<!-- 2017-08-11T16:19:29 -->
<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="Blank_A4_3" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="a75576f0-e223-4e8a-8d52-67936178ea31">
<property name="com.jaspersoft.studio.data.sql.tables" value=""/>
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="test"/>
<queryString>
<![CDATA[]]>
</queryString>
<field name="from_name" class="java.lang.String"/>
<field name="from_name2" class="java.lang.String"/>
<field name="undgcode" class="java.lang.String"/>
<field name="product_item_id" class="java.lang.String"/>
<group name="Group1">
<groupExpression><![CDATA[$F{product_item_id}]]></groupExpression>
<groupHeader>
<band height="50" splitType="Prevent">
<textField>
<reportElement isPrintRepeatedValues="false" x="40" y="10" width="220" height="30" uuid="ce52a200-b3dd-4b9b-bee4-30cc9db15aa5"/>
<textFieldExpression><![CDATA[$F{from_name}]]></textFieldExpression>
</textField>
</band>
</groupHeader>
</group>
<group name="Group2" keepTogether="true">
<groupExpression><![CDATA[$F{undgcode}]]></groupExpression>
<groupHeader>
<band height="64">
<staticText>
<reportElement x="140" y="10" width="100" height="30" uuid="28d2e565-98d6-4714-8420-81a3819ab46a"/>
<text><![CDATA[Static Text]]></text>
</staticText>
</band>
</groupHeader>
<groupFooter>
<band height="50" splitType="Prevent">
<textField>
<reportElement isPrintRepeatedValues="false" x="40" y="10" width="220" height="30" uuid="857197bd-e4b6-404b-a527-19e63dd02a94">
<property name="com.jaspersoft.studio.unit.x" value="pixel"/>
</reportElement>
<textFieldExpression><![CDATA[$F{from_name2}]]></textFieldExpression>
</textField>
</band>
</groupFooter>
</group>
<background>
<band splitType="Stretch"/>
</background>
<title>
<band height="79" splitType="Stretch"/>
</title>
<pageHeader>
<band height="35" splitType="Stretch"/>
</pageHeader>
<columnHeader>
<band height="61" splitType="Stretch"/>
</columnHeader>
<columnFooter>
<band height="45" splitType="Stretch"/>
</columnFooter>
<pageFooter>
<band height="54" splitType="Stretch"/>
</pageFooter>
<summary>
<band height="42" splitType="Stretch"/>
</summary>
</jasperReport>
I have a report that using a parameter to determine the report title. It is displaying null when there is no data. I've tried changing the variable $V{reportName} Evaluation Time, but no luck. Can anybody help me?
Thanks.
PS: It is using mssql data adapter and the current querystring does not return any row. To return rows, change 2=1 to 1=1.
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 5.6.1.final using JasperReports Library version 5.6.1 -->
<!-- 2017-05-02T07:59:20 -->
<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="Evaluate" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="a736ce53-7e76-4194-9086-96d2270a6250">
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="SYDPC1744-EXPRESSR2"/>
<parameter name="ReportType" class="java.lang.String">
<defaultValueExpression><![CDATA["B"]]></defaultValueExpression>
</parameter>
<queryString language="SQL">
<![CDATA[select Col1 from (values (1),(2)) as a(Col1) where 2=1]]>
</queryString>
<field name="Col1" class="java.lang.Integer"/>
<variable name="ReportName" class="java.lang.String">
<variableExpression><![CDATA[$P{ReportType}.equals("A")? $V{reportTitleA}:$V{reportTitleB}]]></variableExpression>
</variable>
<variable name="reportTitleA" class="java.lang.String">
<variableExpression><![CDATA["Report A"]]></variableExpression>
</variable>
<variable name="reportTitleB" class="java.lang.String">
<variableExpression><![CDATA["Report Other"]]></variableExpression>
</variable>
<pageHeader>
<band height="49" splitType="Stretch">
<textField evaluationTime="Report">
<reportElement x="0" y="0" width="390" height="20" uuid="98c519b9-7350-4cd6-a71e-f2fb1c0e7b80"/>
<textFieldExpression><![CDATA[$V{ReportName}]]></textFieldExpression>
</textField>
</band>
</pageHeader>
<columnHeader>
<band height="14" splitType="Stretch"/>
</columnHeader>
<detail>
<band height="15" splitType="Stretch">
<property name="local_mesure_unitheight" value="pixel"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/>
<textField>
<reportElement x="0" y="0" width="100" height="14" uuid="82ab5741-1138-4173-88f5-42ef07a6cb9f">
<property name="local_mesure_unitheight" value="pixel"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textFieldExpression><![CDATA[$F{Col1}]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
Your problem was setting the <textFieldExpression>
and not the <initialValueExpression>.
The <textFieldExpression> is used for calculation. Only use it for calculation!
The <initialValueExpression> is used for your initial value of this variable.
When there is no data jasperreports won't go through the calculation expression as there is no way, you could calculate using no data at all.
So just use the initial value expression...
Chaning the evaluation time of the element has no benefits at all in this case, so you can just skip it.
Also keep in mind, that by using a good order for your variables you can avoid many errors.
Here is the working code (excerpt):
<variable name="reportTitleA" class="java.lang.String">
<initialValueExpression><![CDATA["Report A"]]></initialValueExpression>
</variable>
<variable name="reportTitleB" class="java.lang.String">
<initialValueExpression><![CDATA["Report Other"]]></initialValueExpression>
</variable>
<variable name="ReportName" class="java.lang.String">
<initialValueExpression><![CDATA[$P{ReportType}.equals("A")? $V{reportTitleA}:$V{reportTitleB}]]></initialValueExpression>
</variable>
<pageHeader>
<band height="49" splitType="Stretch">
<textField>
<reportElement x="0" y="0" width="390" height="20" uuid="98c519b9-7350-4cd6-a71e-f2fb1c0e7b80"/>
<textFieldExpression><![CDATA[$V{ReportName}]]></textFieldExpression>
</textField>
</band>
</pageHeader>
I am new in Jasper/ I report. I am trying to create a report that access or gets its data from the java class. I have been trying to use JRBeanDataSource with no luck. I want the report to be dynamic in code without using i-report. I tried designing a report from i report but i cant seem to make the report compile. here is the error
Compiling to file... E:\Program Files (x86)\Jaspersoft\iReport-5.0.1\ireport\projects\report1.jasper
net.sf.jasperreports.engine.design.JRValidationException: Report design not valid : 1. Parameter not found : name 2. Parameter not found : surname at net.sf.jasperreports.engine.design.JRAbstractCompiler.verifyDesign(JRAbstractCompiler.java:271) at net.sf.jasperreports.engine.design.JRAbstractCompiler.compileReport(JRAbstractCompiler.java:153) at net.sf.jasperreports.engine.JasperCompileManager.compile(JasperCompileManager.java:240) at net.sf.jasperreports.engine.JasperCompileManager.compileToFile(JasperCompileManager.java:156) at net.sf.jasperreports.engine.JasperCompileManager.compileReportToFile(JasperCompileManager.java:439) at com.jaspersoft.ireport.designer.compiler.IReportCompiler.run(IReportCompiler.java:528) at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:572) at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:997)
Compilation running time: 60!
The report XML is
<?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="report1" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" whenResourceMissingType="Empty" uuid="a686c2f8-36e1-48f1-8894-8324c9f5d041">
<property name="ireport.zoom" value="1.4641000000000006"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="24"/>
<background>
<band splitType="Stretch"/>
</background>
<title>
<band height="79" splitType="Stretch"/>
</title>
<pageHeader>
<band height="35" splitType="Stretch"/>
</pageHeader>
<columnHeader>
<band height="61" splitType="Stretch"/>
</columnHeader>
<detail>
<band height="125" splitType="Stretch">
<textField>
<reportElement uuid="b1370c0a-6fd1-44ec-af9a-f4edba088c48" x="97" y="21" width="100" height="20"/>
<textElement/>
<textFieldExpression><![CDATA[$P{name}]]></textFieldExpression>
</textField>
<textField>
<reportElement uuid="06c14f56-9416-4d14-a6d3-7f5dbfa6d701" x="97" y="59" width="100" height="20"/>
<textElement/>
<textFieldExpression><![CDATA[$P{surname}]]></textFieldExpression>
</textField>
</band>
</detail>
<columnFooter>
<band height="45" splitType="Stretch"/>
</columnFooter>
<pageFooter>
<band height="54" splitType="Stretch"/>
</pageFooter>
<summary>
<band height="42" splitType="Stretch"/>
</summary>
</jasperReport>
can some one help with this?
You refer in the report to 2 parameter expressions: $P{name}, $P{surname}.
These have not been defined.
In order to make your report executable you'd need to add definitions for these parameters, e.g.
..
<property name="ireport.y" value="24"/>
<parameter name="name" class="java.lang.String" />
<parameter name="surname" class="java.lang.String" />
<background>
..
If name and surname shall not be filled by parameters but by your datasource you'd need to register them as fields and refer to them as such.
..
<property name="ireport.y" value="24"/>
<field name="name" class="java.lang.String" />
<field name="surname" class="java.lang.String" />
<background>
..
in the text fields you refer to them as $F{name}, $F{surname}
Hi every one I am using iReports for generating one of the reports and stuck at one place.
The situation is like this:
I am using one sub report in my main report and i want to return a variable (float) back to the main report from sub report after the query has been executed. And i'm just getting null values back to main report i have wasted 2 days googling and searching but problem is still there..
bellow is my dummy code of my JRXMLS (perfectly same) and snaps...
Main Report 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="anuj" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<property name="ireport.zoom" value="1.0"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="0"/>
<parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
<defaultValueExpression><![CDATA["/home/anuj/Reports/"]]></defaultValueExpression>
</parameter>
<queryString language="SQL">
<![CDATA[select * from "SensorType"]]>
</queryString>
<field name="SensorTypeId" class="java.lang.Integer"/>
<field name="SensorTypeName" class="java.lang.String"/>
<variable name="A" class="java.lang.Integer" resetType="None" calculation="System"/>
<background>
<band splitType="Stretch"/>
</background>
<title>
<band splitType="Stretch"/>
</title>
<pageHeader>
<band splitType="Stretch"/>
</pageHeader>
<columnHeader>
<band splitType="Stretch"/>
</columnHeader>
<detail>
<band height="23" splitType="Stretch">
<textField>
<reportElement x="71" y="3" width="100" height="20"/>
<textElement/>
<textFieldExpression><![CDATA[$F{SensorTypeId}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="202" y="3" width="112" height="20"/>
<textElement/>
<textFieldExpression><![CDATA[$F{SensorTypeName}]]></textFieldExpression>
</textField>
</band>
</detail>
<columnFooter>
<band height="5" splitType="Stretch"/>
</columnFooter>
<pageFooter>
<band height="1" splitType="Stretch"/>
</pageFooter>
<summary>
<band height="42" splitType="Stretch">
<subreport>
<reportElement x="183" y="16" width="257" height="26"/>
<connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
<returnValue subreportVariable="A" toVariable="A"/>
<subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "anuj_subreport1.jasper"]]></subreportExpression>
</subreport>
<textField>
<reportElement x="71" y="22" width="100" height="20"/>
<textElement/>
<textFieldExpression><![CDATA[$V{A}]]></textFieldExpression>
</textField>
</band>
</summary>
</jasperReport>
Sub Report 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="anuj_subreport1" language="groovy" pageWidth="555" pageHeight="802" columnWidth="555" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0">
<property name="ireport.zoom" value="1.0"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="149"/>
<queryString>
<![CDATA[select Sum("SensorTypeId") from "SensorType";]]>
</queryString>
<field name="sum" class="java.lang.Long"/>
<variable name="A" class="java.lang.Integer" resetType="None" calculation="System">
<variableExpression><![CDATA[$F{sum}]]></variableExpression>
</variable>
<background>
<band splitType="Stretch"/>
</background>
<title>
<band height="79" splitType="Stretch">
<staticText>
<reportElement x="169" y="59" width="100" height="20"/>
<textElement/>
<text><![CDATA[sum]]></text>
</staticText>
<textField>
<reportElement x="216" y="59" width="100" height="20"/>
<textElement/>
<textFieldExpression><![CDATA[$F{sum}]]></textFieldExpression>
</textField>
</band>
</title>
<pageHeader>
<band height="35" splitType="Stretch"/>
</pageHeader>
<columnHeader>
<band height="61" splitType="Stretch"/>
</columnHeader>
<detail>
<band height="125" splitType="Stretch"/>
</detail>
<columnFooter>
<band height="45" splitType="Stretch"/>
</columnFooter>
<pageFooter>
<band height="54" splitType="Stretch"/>
</pageFooter>
<summary>
<band height="42" splitType="Stretch"/>
</summary>
</jasperReport>
Thanks in advance..
Although the question is already answered, I would like to highlight the importance of having calculation="System" on the variable in the Main Report (the report calling the SubReport).
I wasted a lot of time before figuring this out...
In the dummy-code for Main Report JRXML above, the variable "A" correctly has calculation="System". NB: The answer by #GenericJon covers the variable in the SubReport.
In the subreport variable, you have calculation=System. This should be used when you are calculating the variable yourself using a scriptlet. You do not have an appropriate scriptlet attached to the report, so the variable is never being calculated.
You probably want to change the variable definition so that it is calculated at the start of the subreport, something like this:
<variable name="A" class="java.lang.Integer" resetType="Report" calculation="Nothing">
<variableExpression><![CDATA[$F{sum}]]></variableExpression>
</variable>
resetType="Report" will never reset the variable while the report is running.
calculation="Nothing" will evaluate the variableExpression for every row in the dataset.
These attributes could be omitted though, as they are the default values used. You should then find that the variable is initialised correctly.
From the JasperReports Ultimate Guide:
The value coming from the subreport is available only when the whole band containing the subreport is printed. If you need to print this value using a textfield placed in the same band as your subreport, set the evaluation time of the textfield to Band
i am agree with #bubba_hego99, the calculation type as below:
system no caculation, just set as system, or valued as other operator.
nothing no calulation, just set the variable.
sum execute sum($Feild("A")).
....
The detail you want to know other caculation, you should be to see the ireport document.
Note, in earlier versions of JasperReports:
When using a subreport returnValue, the variable returned must not be in the same band as the subreport itself.
The affectation is done I think at the end of the rendering of the band.
So add another band and use your variable inside.
I'm trying to find out how to use a string collection as a datasource in JasperReports.
I guess I found the solution, but I can't get this to work, can anyone assist me?
set as datasource the special data source JREmptyDatasource( $F{my_collection}.size() )
This creates an empty data set with the same size of records as the collection.
Pass the $F{my_collection} as parameter to the sub dataset (using the data set run of the List).
To print the current element of the collection:
$P{my_collection_param}.get( $V{REPORT_COUNT} )
<?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="report1" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<property name="ireport.zoom" value="1.0"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="0"/>
<subDataset name="dataset1">
<parameter name="my_collection_param" class="java.util.Collection" isForPrompting="false">
<defaultValueExpression><![CDATA[$P{my_collection}]]></defaultValueExpression>
</parameter>
</subDataset>
<parameter name="my_collection" class="java.util.Collection">
<defaultValueExpression><![CDATA["anna"]]></defaultValueExpression>
</parameter>
<field name="my_collection" class="java.util.Collection">
<fieldDescription><![CDATA[]]></fieldDescription>
</field>
<background>
<band splitType="Stretch"/>
</background>
<title>
<band height="79" splitType="Stretch"/>
</title>
<pageHeader>
<band height="35" splitType="Stretch"/>
</pageHeader>
<columnHeader>
<band height="61" splitType="Stretch"/>
</columnHeader>
<detail>
<band height="125" splitType="Stretch">
<componentElement>
<reportElement x="51" y="30" width="400" height="50"/>
<jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Vertical">
<datasetRun subDataset="dataset1">
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.JREmptyDataSource($F{my_collection}.size())]]></dataSourceExpression>
</datasetRun>
<jr:listContents height="50" width="0">
<textField>
<reportElement x="159" y="24" width="100" height="20"/>
<textElement/>
<textFieldExpression class="java.lang.String"><![CDATA[$P{my_collection_param}.get( $V{REPORT_COUNT} )]]></textFieldExpression>
</textField>
</jr:listContents>
</jr:list>
</componentElement>
</band>
</detail>
<columnFooter>
<band height="45" splitType="Stretch"/>
</columnFooter>
<pageFooter>
<band height="54" splitType="Stretch"/>
</pageFooter>
<summary>
<band height="42" splitType="Stretch"/>
</summary>
I guess your hack of using JREmptyDataSource is good by definition, if it works.
But you'll find that things are lot easier if you use this instead:
new net.sf.jasperreports.engine.data.JRMapCollectionDataSource($P{my_collection_param})