I am using JasperReport and ireport in my JSF application to generate reports on the fly. This is what I am trying to achieve:-
My structure(read as HashMap/ArrayList) contains data that needs to be passed to the report so that the same is shown in report.
My report already contains a Datasource connection using which I am fetching some value from DB and populating it in report.
I am creating a subreport so that for data which needs to be passed from code I can use the subreport and embed this subreport inside the main report.
My problem is:- 1. I am unable to pass the collection(read as HashMap/ArrayList) to subreport to populate it with the data from my code.
I am absolutely sure there must be some way of passing the entire collection to the subreport in order to populate it and I have also tried creating a JavaBean datasource connection however while creating a connection it says Missing classpath entry.
I cannot bundle the respective classes inside a jar and put the jar in classpath since the values are constantly changing in the structure,....
Can anyone please guide me on how to create/pass a java bean datasource to the report so that data can be populated...
Kindly guide...
Updated portion:-
Java code for passing parameter to report and generating the report:-
public class TestDataSource
{
public static void main(String[] args)
{
try {
JasperDesign jasperDesign = JRXmlLoader.load("D:\\jasperReports\\subReportDataSource.jrxml");
JasperReport jasperReport =(JasperReport)JasperCompileManager.compileReport(jasperDesign);
Map<String,Object> parameters = new HashMap<String,Object>();
parameters.put ("Title",generateCollection());
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, new JRBeanCollectionDataSource(generateCollection()));
JasperViewer.viewReport(jasperPrint);
}catch(Exception e)
{
e.printStackTrace();
}
}
public static ArrayList<PersonBean> generateCollection()
{
ArrayList<PersonBean> arrlist=new ArrayList<PersonBean>();
arrlist.add(new PersonBean("A", 20));
arrlist.add(new PersonBean("B",30));
arrlist.add(new PersonBean("C",40));
arrlist.add(new PersonBean("D",50));
arrlist.add(new PersonBean("E",40));
arrlist.add(new PersonBean("F",60));
return arrlist;
}
}
Now I created a new report (Report)..Inside that I placed a sub-report(Sub-Report)..Configured the sub-report datasource to be new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{Title})
Connection Type:-Use a datasource connection type.
Now inside my Sub-Report I just placed two static fields as Name and Age. How do i Tell my report/Sub-Report to print value present as value in hashmap which is being passed.
Jaspersoft Studio provides a visual tool to map JavaBean attributes to report fields. To use it, open the query window, go to the tab JavaBean Data Source, insert the full class name of the bean you want to explore, and click Read attributes. The tab is populated with the attributes of the specified bean class.
A data source implementation that wraps a collection of JavaBean objects. It is common to access application data through object persistence layers like EJB, Hibernate, or JDO.
If you already have a DataSource then you can pass your List/Map thourgh the param Map when you're filling your report.
Map<String, Object> param = new HashMap<String, Object>();
param.put("SUB_DATA_SOURCE", yourList);
JasperFillManager.fillReport(jasperReport, param,
new JRBeanCollectionDataSource(yourMainListHere));
Doing that you have to create a parameter inside your MAIN report with the same name you have set in your param Map and also give to this a Type Class (List in my case).
Than you have to create your subreport element and set the Connection Type as "Use a datasource expression" and inside the "Data Source Expression" you set this:
new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{SUB_DATA_SOURCE})
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With