Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating/Passing Java bean Datasource in JasperReport

I am using JasperReport and ireport in my JSF application to generate reports on the fly. This is what I am trying to achieve:-

  1. My structure(read as HashMap/ArrayList) contains data that needs to be passed to the report so that the same is shown in report.

  2. My report already contains a Datasource connection using which I am fetching some value from DB and populating it in report.

  3. 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.

like image 733
AngelsandDemons Avatar asked Jul 17 '12 07:07

AngelsandDemons


People also ask

How do you use data source in Jasper report?

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.

What is Jrbeancollectiondatasource?

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.


1 Answers

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})
like image 182
Diego Urenia Avatar answered Sep 17 '22 15:09

Diego Urenia