Search code examples
jasper-reportssubreport

The subreport repeats itself in Detail band


I am new to JasperReports, basically I want to put a subreport in a mainreport.

The problem is that I put the subreport in the Detail band, so when I query a database that has multiple data the subreport will always repeat itself multiple times when I output the report to a pdf. I want a report that doesn't repeat itself regardless of how many data I have in the database that I connect with.

I have searched the Internet and the solutions is to add:

new Boolean($V{REPORT_COUNT}.intValue()==1)

in the print when expression attribute of the subreport, that does solve a part of my problem due to the fact that now my subreport only prints once but it still leaves some blank pages after my subreport is displayed.

So I assume it is still repeating itself but just doesn't print the data because of the expression that I added , people say that the nature of the detail band is supposed to work that way and that I shouldn't put the subreport in the detail band, but if I put it in some other band I get this error:

Error filling print... Subreport overflowed on a band that does not support overflow.

The error above will happen if I have a lot of data to the extent that it may take up more than a page.

How do I remove those blank pages? If I am not asking to put it in a detail band then what should I do? or what solutions are there?


Solution

  • The Detail band will be generated as many times as the number of records you have in your main dataSet(populated by the top-level query).

    If you want to keep the subreport in the Detail band, which is normal by the way, you can do one of these things:

    • either have a dummy query that returns only one record, so that the Detail band generates only once. Then, pass the report connection to your subreport. You may have done that already. This way you can run your query independently of the main report.
    • or leave the report as-is and add your printWhen expression ($V{REPORT_COUNT}.intValue()==1) directly on the Detail band, not on the subreport. Please note that this is just an ugly hack that may affect the report performance. Your main query still returns a lot of data that you don't use so you should consider the other options.

    If you can move the subreport out of the Detail band, place it in a band that allows overflow like Title or Summary band. Then:

    • have your main dataSet's query empty so that no Detail band gets generated
    • set whenNoDataType="AllSectionsNoDetail" at the report level(in the <jasperReport> tag) so that all the other sections except the Detail get generated
    • exactly as in the first option above, pass the report connection to your subreport and work from there