Domanda

When printing the sub reports in Main Report.

I am using Jasper API for creating main report and adding the compiled sub report in the main report. Main report is compiling fine. But graphs are repeated the number of data in the data source.

If Data source (My data source is JRBeanCollectionDataSource) has 6 then it prints 2 set of 2 overlapping graph and 2 graphs below it

I am calling Sub reports from Group section of report Class to design Main report

public class JasperDesignForTemplate {
    public JasperDesign design() throws Exception {

        // set basic design for main report
        JasperDesign jasperDesign = new JasperDesign();
        jasperDesign.setName("simpleReport");
        jasperDesign.setPageWidth(595);
        jasperDesign.setPageHeight(842);
        jasperDesign.setColumnWidth(270);
        jasperDesign.setColumnSpacing(15);
        jasperDesign.setLeftMargin(20);
        jasperDesign.setRightMargin(20);
        jasperDesign.setTopMargin(30);
        jasperDesign.setBottomMargin(30);    

        //Parameters

        // field
        JRDesignField bar = new JRDesignField();
        bar.setName("bar");
        bar.setValueClass(java.util.List.class);
        jasperDesign.addField(bar);

        JRDesignField time = new JRDesignField();
        time.setName("time");
        time.setValueClass(java.util.List.class);
        jasperDesign.addField(time);

        JRDesignBand band = new JRDesignBand();

        //Group
        JRDesignGroup group = new JRDesignGroup();
        group.setName("Chart group");

        band = new JRDesignBand();
        band.setHeight(250);
        band.setSplitType(SplitTypeEnum.STRETCH);

        JRDesignSubreport jSubreport = new JRDesignSubreport(jasperDesign); 
        jSubreport.setUsingCache(false); 
        jSubreport.setRemoveLineWhenBlank(true); 
        jSubreport.setPrintRepeatedValues(false);

        JRDesignExpression expression = new JRDesignExpression();
        expression.setText("new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{time})");

        jSubreport.setDataSourceExpression(expression);

        expression = new JRDesignExpression(); 
        expression.setText("\"/path/to/TimeSeriesChartSubReport.jasper\"");

        jSubreport.setExpression(expression);
        band.addElement(jSubreport);

        ((JRDesignSection)group.getGroupHeaderSection()).addBand(band);
        jasperDesign.addGroup(group);

        JRDesignGroup Chartgroup = new JRDesignGroup();
        Chartgroup.setName("Chart group Chart");

        JRDesignBand chartband = new JRDesignBand();
        chartband.setHeight(250);
        chartband.setSplitType(SplitTypeEnum.STRETCH);

        JRDesignSubreport jSubreportChart = new JRDesignSubreport(jasperDesign); 
        jSubreportChart.setUsingCache(false); 
        jSubreportChart.setRemoveLineWhenBlank(true); 

        JRDesignExpression expressionChart = new JRDesignExpression();
        expressionChart.setText("new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{bar})");

        jSubreportChart.setDataSourceExpression(expressionChart);

        expressionChart = new JRDesignExpression(); 
        expressionChart.setText("\"/path/to/BarCharSubReport.jasper\"");

        jSubreportChart.setExpression(expressionChart);
        chartband.addElement(jSubreportChart);

        ((JRDesignSection)Chartgroup.getGroupHeaderSection()).addBand(chartband);
        jasperDesign.addGroup(Chartgroup);


        // title band
        band = new JRDesignBand();
        band.setHeight(20);
        band.setSplitType(SplitTypeEnum.STRETCH);

        JRDesignStaticText staticText = new JRDesignStaticText();
        staticText.setX(0);
        staticText.setY(0);
        staticText.setHeight(20);
        staticText.setWidth(550);
        staticText.setText("Report Name");
        staticText.setHorizontalAlignment(HorizontalAlignEnum.CENTER);
        staticText.setFontSize(15);
        band.addElement(staticText);
        jasperDesign.setTitle(band);
        // end of title band

        // page header band
        band = new JRDesignBand();
        band.setHeight(50);
        band.setSplitType(SplitTypeEnum.STRETCH);
        jasperDesign.setPageHeader(band);
        // end of page header band

        // column header band
        band = new JRDesignBand();
        band.setHeight(50);
        band.setSplitType(SplitTypeEnum.STRETCH);
        jasperDesign.setColumnHeader(band);
        // end of column header band

        //detail band
        band = new JRDesignBand();
        band.setHeight(20);
        ((JRDesignSection) jasperDesign.getDetailSection()).addBand(band);
        // end of detail band

        // column footer band
        band = new JRDesignBand();
        band.setHeight(20);
        jasperDesign.setColumnFooter(band);
        // end of column footer band

        // page footer band
        band = new JRDesignBand();
        band.setHeight(20);
        jasperDesign.setPageFooter(band);
        // end of page footer band

        // summary band
        band = new JRDesignBand();
        band.setHeight(20);
        jasperDesign.setSummary(band);
        // end of summary band

        return jasperDesign;
    }
}

Class to compile sub report and Fill and generate PDF

public class DynamicJasper {
    protected JasperPrint jp;
    protected JasperReport jr;
    protected Map params = new HashMap();
    private static String inputjrxml = "/path/to/Report.jrxml";
    private static String outputjasper = "/path/to/Report.jasper";
    private static String pdffile = "/path/to/Report.pdf";


    public static void main(String args[]) throws Exception{

        String inputTimeSubreport = "/path/to/TimeSeriesChartSubReport.jrxml";
        String outputTimeSubreport = "/path/to/TimeSeriesChartSubReport.jasper";

        String inputBarSubreport = "/path/to/BarCharSubReport.jrxml";
        String outputBarSubreport = "/path/to/BarCharSubReport.jasper";

        JasperCompileManager.compileReportToFile(inputTimeSubreport, outputTimeSubreport);
        JasperCompileManager.compileReportToFile(inputBarSubreport, outputBarSubreport);

        JasperDesignForTemplate templace = new JasperDesignForTemplate();
        JasperDesign design = templace.design();
        Collection<JRValidationFault> faults = JasperCompileManager.verifyDesign(design);
        JasperCompileManager.compileReportToFile(design, outputjasper);

        HashMap<String, Object> params = new HashMap<String, Object>();

        EventData data = new EventData();

        JRBeanCollectionDataSource beanList = new JRBeanCollectionDataSource(data.getEventData());
        JasperPrint jasperPrint = JasperFillManager.fillReport(outputjasper, params, beanList);
        JasperExportManager.exportReportToPdfStream(jasperPrint, new FileOutputStream(pdffile));
    }
}

List Data provider Beans

public class EventBean {
    private String field;
    private String count;
    private String pastcount;
    private List<TimeSeriesBean> time = new ArrayList<TimeSeriesBean>();

    public EventBean(){

    }

    public EventBean(String name, String count, String pastCount, List<TimeSeriesBean> time){
        this.field = name;
        this.count = count;
        this.time = time;
        this.pastcount = pastCount;
    }

    public String getField() {
        return field;
    }
    public void setName(String name) {
        this.field = name;
    }
    public String getCount() {
        return count;
    }
    public void setCount(String count) {
        this.count = count;
    }

    public List<TimeSeriesBean> getTime() {
        return time;
    }

    public void setTime(List<TimeSeriesBean> time) {
        this.time = time;
    }

    public void setField(String field) {
        this.field = field;
    }

    public String getPastcount() {
        return pastcount;
    }

    public void setPastcount(String pastcount) {
        this.pastcount = pastcount;
    }

}

public class TimeSeriesBean {
    private String count;
    private String timeStamp;

    public TimeSeriesBean(String count, String timeStamp) {
        this.count = count;
        this.timeStamp = timeStamp;
    }
    public TimeSeriesBean() {

    }
    public String getCount() {
        return count;
    }
    public void setCount(String count) {
        this.count = count;
    }
    public String getTimeStamp() {
        return timeStamp;
    }
    public void setTimeStamp(String timeStamp) {
        this.timeStamp = timeStamp;
    }


}

public class EventData {
    private List<EventBean> bar;

    private List<TimeSeriesBean> time;

    public List<EventBean> getBar() {
        return bar;
    }

    public void setBar(List<EventBean> bar) {
        this.bar = bar;
    }

    public List<TimeSeriesBean> getTime() {
        return time;
    }

    public void setTime(List<TimeSeriesBean> time) {
        this.time = time;
    }

    public List<EventData> getEventData(){
        ArrayList<EventData> dataArr = new ArrayList<EventData>();

        EventData data = new EventData();
        EventNameList dataList = new EventNameList();

        data.setBar(dataList.getDataBeanList());
        data.setTime(dataList.getSingleDataBeanList().get(0).getTime());

        dataArr.add(data);
        return dataArr;
    }
}


public class EventNameList {
    public ArrayList<EventBean> getSingleDataBeanList() {
        ArrayList<EventBean> list = new ArrayList<EventBean>();

        ArrayList<TimeSeriesBean> listTime = new ArrayList<TimeSeriesBean>();
        TimeSeriesBean tbean = new TimeSeriesBean("413","1375951800");
        TimeSeriesBean tbean1 = new TimeSeriesBean("425","1375952100");
        TimeSeriesBean tbean2 = new TimeSeriesBean("396","1375952820");
        TimeSeriesBean tbean3 = new TimeSeriesBean("400","1375953540");
        TimeSeriesBean tbean4 = new TimeSeriesBean("200","1375953440");
        TimeSeriesBean tbean5 = new TimeSeriesBean("1400","1375953999");
        listTime.add(tbean);
        listTime.add(tbean1);
        listTime.add(tbean2);
        listTime.add(tbean3);
        listTime.add(tbean4);
        listTime.add(tbean5);

        list.add(generate("Flow", "100", "800", listTime));

        return list;
    }

    public ArrayList<EventBean> getDataBeanList() {
        ArrayList<EventBean> list = new ArrayList<EventBean>();

        ArrayList<TimeSeriesBean> listTime = new ArrayList<TimeSeriesBean>();
        TimeSeriesBean tbean = new TimeSeriesBean("413","1375951800");
        TimeSeriesBean tbean1 = new TimeSeriesBean("425","1375952100");
        TimeSeriesBean tbean2 = new TimeSeriesBean("396","1375952820");
        TimeSeriesBean tbean3 = new TimeSeriesBean("400","1375953540");
        TimeSeriesBean tbean4 = new TimeSeriesBean("400","1375953440");
        TimeSeriesBean tbean5 = new TimeSeriesBean("400","1375953999");
        listTime.add(tbean);
        listTime.add(tbean1);
        listTime.add(tbean2);
        listTime.add(tbean3);
        listTime.add(tbean4);
        listTime.add(tbean5);

        list.add(generate("Flow", "100", "800", null));
        list.add(generate("Non flow", "200", "50", null));
        list.add(generate("Allow", "600", "400", null));
        list.add(generate("Deny", "50", "200", null));
        list.add(generate("Block", "150", "1200", null));
        list.add(generate("Access", "10", "0", null));

        return list;
    }

    private EventBean generate(String name, String country, String pastCount, List<TimeSeriesBean> time) {
        EventBean bean = new EventBean();
        bean.setName(name);
        bean.setCount(country);
        bean.setPastcount(pastCount);
        bean.setTime(time);
        return bean;
    }
}

Sub report JRXML for Time series graph

<?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="ProductReport" columnCount="2" pageWidth="325" pageHeight="842" whenNoDataType="NoDataSection" columnWidth="160" columnSpacing="5" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0">
    <field name="count" class="java.lang.String"/>
    <field name="timeStamp" class="java.lang.String"/>
    <group name="TimeSeriesGroup">
        <groupExpression><![CDATA[$F{count}]]></groupExpression>
        <groupHeader>
            <band height="250">
                <timeSeriesChart>
                    <chart evaluationTime="Report">
                        <reportElement x="0" y="25" width="550" height="175"/>
                        <chartTitle/>
                        <chartSubtitle/>
                        <chartLegend/>
                    </chart>
                    <timeSeriesDataset timePeriod="Minute">
                        <dataset incrementType="None"/>
                        <timeSeries>
                            <seriesExpression><![CDATA["Count"]]></seriesExpression>
                            <timePeriodExpression><![CDATA[new Date(Long.valueOf($F{timeStamp})*1000)]]></timePeriodExpression>
                            <valueExpression><![CDATA[Integer.valueOf($F{count})]]></valueExpression>
                        </timeSeries>
                    </timeSeriesDataset>
                    <timeSeriesPlot isShowLines="true" isShowShapes="false">
                        <plot/>
                        <timeAxisFormat>
                            <axisFormat>
                                <labelFont/>
                                <tickLabelFont/>
                            </axisFormat>
                        </timeAxisFormat>
                        <valueAxisFormat>
                            <axisFormat>
                                <labelFont/>
                                <tickLabelFont/>
                            </axisFormat>
                        </valueAxisFormat>
                    </timeSeriesPlot>
                </timeSeriesChart> 
            </band>
        </groupHeader>
        <groupFooter>
            <band/>
        </groupFooter>
    </group>
</jasperReport>

Sub report JRXML for Bar chart

<?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="ProductReport" columnCount="2" pageWidth="325" pageHeight="842" whenNoDataType="NoDataSection" columnWidth="160" columnSpacing="5" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0">
    <field name="count" class="java.lang.String"/>
    <field name="field" class="java.lang.String"/>
    <field name="pastcount" class="java.lang.String"/>
    <group name="BarChartGroup">
        <groupExpression><![CDATA[$F{count}]]></groupExpression>
        <groupHeader>
            <band height="250">
                <bar3DChart>
                    <chart evaluationTime="Report">
                        <reportElement x="0" y="0"  width="555" height="233" isRemoveLineWhenBlank="true"/>                 
                        <chartTitle/>
                        <chartSubtitle/>
                        <chartLegend position="Right"/>
                    </chart>
                    <categoryDataset>
            <dataset incrementType="None"/>
            <categorySeries>
                <seriesExpression><![CDATA["This month"]]></seriesExpression>
              <categoryExpression><![CDATA[$F{field}]]></categoryExpression>
              <valueExpression><![CDATA[Integer.valueOf($F{count})]]></valueExpression>
            </categorySeries>
                        <categorySeries>
                <seriesExpression><![CDATA["Last month"]]></seriesExpression>
              <categoryExpression><![CDATA[$F{field}]]></categoryExpression>
              <valueExpression><![CDATA[Integer.valueOf($F{pastcount})]]></valueExpression>
            </categorySeries>
                    </categoryDataset>
                    <bar3DPlot>
                        <plot/>
                        <itemLabel/>
                        <categoryAxisFormat>
                            <axisFormat/>
                        </categoryAxisFormat>
                        <valueAxisFormat>
                            <axisFormat/>
                        </valueAxisFormat>
                    </bar3DPlot>
                </bar3DChart>
            </band>
        </groupHeader>
        <groupFooter>
            <band/>
        </groupFooter>
    </group>
</jasperReport>

Page 1 of generated Report 2 Set of Overlapping time series graphs 2 Set of overlapping graphs Page 2 of generated Report 2 individual time series graphs 2 separate graphs Page 3 of Generate Report 2 Set of overlapping Bar graphs 2 Set of overlapping Bar graphs Page 4 of Generated Report 2 Set of individual bar graphs 2 individual bar graphs

È stato utile?

Soluzione

Remove group expression $F{count} from

<groupExpression><![CDATA[$F{count}]]></groupExpression>

If this does not work then remove the whole group expression line from both main and subreport.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top