HOW-TO Add Subreports (fast way)

Useful examples:

Test Download PDF
Creates a single Subreport
Creates a single Subreport
Creates a single PDF that concatenates 3 reports
Creates a report that contains a subreport, and the subrerport contains a subreport too

An easy way to add subreport is through the DynamicReportBuilder class (which internally uses SubReportBuilder, but makes it even easier) The SubReportBuilder class has much more options to setup a subreport, the quick methods added to the DynamicReportBuilder covers what we consider the most common scenarios, but for specific configurations SubReportBuilder should be used.

Look at the example bellow

DynamicReport drHeaderSubreport = createHeaderSubreport();

drb.addSubreportInGroupHeader(2, drHeaderSubreport, new ClassicLayoutManager(),
                , DJConstants.DATA_SOURCE_TYPE_COLLECTION);

drb.addField("statistics", List.class.getName());

The first call to the builder is:

 .addSubreportInGroupHeader( <group number>, <dynamicReport>, <LayOutManager>
                          ,  <path to the data source>, <origin of the data source>, <type of the data source>)

group number: Subreports are placed in the header or footers of a group. This parameter defines which group

dynamicReport: A DynamicReport object to use as a subreport. In this example we create it in the call to createHeaderSubreport()

LayOutManager: Since the subreport is going to be a DynamicReport, a LayOutManager is needed

path to the data source: A string that points to the data source.

origin of the data source: A constant from DJConstants class which can be: SUBREPORT_DATA_SOURCE_ORIGIN_FIELD or SUBREPORT_DATA_SOURCE_ORIGIN_PARAMETER, it just tells the subreport where to look for the data source (the parameters map, or if its a property of the current row)

For example, if path to the data source is “subreportDatasource” and origin of the data source is SUBREPORT_DATA_SOURCE_ORIGIN_PARAMETER, then it will look in the parameters map for an object under the key of “subreportDatasource”, on the other hand if we pass SUBREPORT_DATA_SOURCE_ORIGIN_FIELD, in the current row, there must be a property with the name “subreportDatasource” that returns an object of the type DATA_SOURCE_TYPE_<XXX>

type of the data source: A constant from DJConstants class, all types constants has a name like DATA_SOURCE_TYPE_<XXX>, where <XXX> represents the type. Most known types are java.sql.ResultSet, Collection, Array, Xml, etc.

An overloaded way of this method also lets you pass the following:

SubreportParameter[] params An array of parameters (in parent report) to make available in child report.

boolean startInNewPage tells the DJ to make the sub report to start in a new page.

The 2nd call is:

 drb.addField("statistics", List.class.getName());

Because in this example, the origin is DJConstants.SUBREPORT_DATA_SOURCE_ORIGIN_FIELD, there must be such a field in the reports datasource. That is why, registering the field is necessary.

This is a example of a report with 2 different subreports

no images were found

Fork me on GitHub