intive-FDV / DynamicJasper

Dynamic Reports using Jasper Reports
http://intive-fdv.github.io/DynamicJasper/
GNU Lesser General Public License v3.0
242 stars 127 forks source link

Multiple Tables in dynamicJasper #74

Open roger1891 opened 6 years ago

roger1891 commented 6 years ago

Greetings admin. I am experiencing some problems with implementing dynamicJasper when it comes to subreports. I am trying to create multiple tables into one report using subreport. However I can't figure it out. I keep getting errors. One of the errors I got recently is

Error: net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression : 
    Source text : new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource((java.util.Collection)$P{REPORT_PARAMETERS_MAP}.get( "cs" ) )

I alsotried following your how to instructions but I can't seem to figure it out.

Note: I get my Collections/data from 2 tables in my controller class which I use to populate the content of my tables. Please help. Thank you in advance.

This is my report class:

public class CustomersReportPrintReport {
    private final Collection<SalesData> customerlist = new ArrayList<>();
    private final Collection<SalesData> loanlist = new ArrayList<>();
    private final String fromDate;
    private final String toDate;
    SalesData salesData = new SalesData();
    HashMap params = new HashMap();
    JRBeanCollectionDataSource ds1 = new JRBeanCollectionDataSource(customerlist);
    JRBeanCollectionDataSource ds2 = new JRBeanCollectionDataSource(loanlist); 

    public CustomersReportPrintReport(Collection<SalesData> customerList, Collection<SalesData> loanList, LocalDate fromDate, LocalDate toDate) {
        //change date format
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MMMM dd, yyyy");
        String fromDateString = dtf.format(fromDate); 
        String toDateString = dtf.format(toDate);
        //assign variables
        this.customerlist.addAll(customerList);
        this.loanlist.addAll(loanList);
        this.fromDate = fromDateString;
        this.toDate = toDateString;
    }

    public JasperPrint getReport() throws ColumnBuilderException, JRException, ClassNotFoundException, Exception {
        Style headerStyle = createHeaderStyle();
        Style detailTextStyle = createDetailTextStyle();        
        Style detailNumberStyle = createDetailNumberStyle();  

        DynamicReport dynaReport = getReport(headerStyle, detailTextStyle,detailNumberStyle);
        //DynamicReport dynaReport2 = createHeaderSubreport(headerStyle, detailTextStyle,detailNumberStyle);

        //JasperPrint jp = DynamicJasperHelper.generateJasperPrint(dynaReport, new ClassicLayoutManager(), new JRBeanCollectionDataSource(customerlist));
        JasperReport jr = DynamicJasperHelper.generateJasperReport(dynaReport, new ClassicLayoutManager(), params, "cs");
        JasperPrint jp = JasperFillManager.fillReport(jr, params, ds1);

        return jp;        
    }

    private Style createHeaderStyle() {        
        StyleBuilder sb=new StyleBuilder(true);
        sb.setFont(Font.VERDANA_MEDIUM_BOLD);
        sb.setBorder(Border.THIN());
        sb.setBorderBottom(Border.PEN_2_POINT());
        sb.setBorderColor(Color.BLACK);
        sb.setBackgroundColor(Color.decode("#007cff"));
        sb.setTextColor(Color.WHITE);
        sb.setHorizontalAlign(HorizontalAlign.CENTER);
        sb.setVerticalAlign(VerticalAlign.MIDDLE);
        sb.setTransparency(Transparency.OPAQUE);        
        return sb.build();
    } 

    private Style createDetailTextStyle(){
        StyleBuilder sb=new StyleBuilder(true);
        sb.setFont(Font.VERDANA_MEDIUM);
        sb.setBorder(Border.DOTTED());        
        sb.setBorderColor(Color.BLACK);        
        sb.setTextColor(Color.BLACK);
        sb.setHorizontalAlign(HorizontalAlign.LEFT);
        sb.setVerticalAlign(VerticalAlign.MIDDLE);
        sb.setPaddingLeft(5);        
        return sb.build();
    }    

      private Style createDetailNumberStyle(){
        StyleBuilder sb=new StyleBuilder(true);
        sb.setFont(Font.VERDANA_MEDIUM);
        sb.setBorder(Border.DOTTED());        
        sb.setBorderColor(Color.BLACK);        
        sb.setTextColor(Color.BLACK);
        sb.setHorizontalAlign(HorizontalAlign.RIGHT);
        sb.setVerticalAlign(VerticalAlign.MIDDLE);
        sb.setPattern("#,##0.00");
        sb.setPaddingRight(5);
        return sb.build();
    }    

    private AbstractColumn createColumn(String property, Class type,
            String title, int width, Style headerStyle, Style detailStyle)
            throws ColumnBuilderException {
        AbstractColumn columnState = ColumnBuilder.getNew()
                .setColumnProperty(property, type.getName()).setTitle(
                        title).setWidth(Integer.valueOf(width))
                .setStyle(detailStyle).setHeaderStyle(headerStyle).build();
        return columnState;
    } 

    private DynamicReport getReport(Style headerStyle, Style detailTextStyle, Style detailNumStyle) throws ColumnBuilderException, ClassNotFoundException, Exception {

        DynamicReportBuilder report=new DynamicReportBuilder();

        //make sure column name (1st parameter) is the same with variables from model classes

        StyleBuilder titleStyle=new StyleBuilder(true);
        titleStyle.setHorizontalAlign(HorizontalAlign.CENTER);
        titleStyle.setFont(new Font(20, Font._FONT_GEORGIA, true));

        StyleBuilder subTitleStyle=new StyleBuilder(true);
        subTitleStyle.setHorizontalAlign(HorizontalAlign.CENTER);
        subTitleStyle.setFont(new Font(Font.MEDIUM, Font._FONT_GEORGIA, true));

        //set header
        report.setTitle("Customer Sales Details Report");
        report.setTitleStyle(titleStyle.build());
        report.setSubtitle("(" + fromDate + " - " + toDate + ")");
        report.setSubtitleStyle(subTitleStyle.build());
        report.setUseFullPageWidth(true);

        //set page number
        report.addAutoText(AutoText.AUTOTEXT_PAGE_X_SLASH_Y, AutoText.POSITION_FOOTER, AutoText.ALIGNMENT_RIGHT);
        //set created on date
        //report.addAutoText(AutoText.AUTOTEXT_CREATED_ON, AutoText.POSITION_FOOTER, AutoText.ALIGNMENT_LEFT,AutoText.PATTERN_DATE_DATE_TIME);
        report.addAutoText("Created on " + getDateTime(), AutoText.POSITION_FOOTER, AutoText.ALIGMENT_LEFT, 250);        
        //page orientation
        report.setPageSizeAndOrientation(Page.Page_A4_Landscape());

        report.addConcatenatedReport(createSubreport1(headerStyle, detailTextStyle, detailNumStyle), new ClassicLayoutManager(), "cs",
                DJConstants.DATA_SOURCE_ORIGIN_PARAMETER, DJConstants.DATA_SOURCE_TYPE_COLLECTION,false);
        report.addConcatenatedReport(createSubreport2(headerStyle, detailTextStyle, detailNumStyle), "ll",
        DJConstants.DATA_SOURCE_ORIGIN_PARAMETER, DJConstants.DATA_SOURCE_TYPE_COLLECTION,true);

        params.put("cs", ds1);
        params.put("ll", ds2);

        return report.build();
    } 

    private DynamicReport createSubreport1(Style headerStyle, Style detailTextStyle, Style detailNumStyle) throws Exception {
        DynamicReportBuilder report=new DynamicReportBuilder();

        //make sure column name (1st parameter) is the same with variables from model classes
        AbstractColumn columnDate = createColumn("date", String.class,"Date of Orders", 30, headerStyle, detailTextStyle);
        AbstractColumn columnInventName = createColumn("inventName", String.class,"Product Ordered", 30, headerStyle, detailTextStyle);        
        AbstractColumn columnQuantity = createColumn("quantity", Integer.class,"Quantity", 30, headerStyle, detailNumStyle);
        AbstractColumn columnAmountPaid = createColumn("amountPaid", Double.class,"Amount Paid", 30, headerStyle, detailNumStyle); 
        report.addColumn(columnDate)
        .addColumn(columnInventName)
        .addColumn(columnQuantity)
        .addColumn(columnAmountPaid);    

        report.setUseFullPageWidth(true);
        report.setWhenNoDataNoPages();
        report.setTitle("Sub Report 1");

        return report.build();
    }

    private JasperReport createSubreport2(Style headerStyle, Style detailTextStyle, Style detailNumStyle) throws Exception {
        DynamicReportBuilder report=new DynamicReportBuilder();
        DynamicReport dr;
        //make sure column name (1st parameter) is the same with variables from model classes
        AbstractColumn columnDate = createColumn("date", String.class,"Date", 30, headerStyle, detailTextStyle);
        AbstractColumn columnPrice = createColumn("price", Double.class,"Outstanding Balance", 30, headerStyle, detailNumStyle);    
        report.addColumn(columnDate)
        .addColumn(columnPrice);    

        report.setUseFullPageWidth(true);
        report.setWhenNoDataNoPages();
        report.setTitle("Sub Report 1");

        dr = report.build();

        return DynamicJasperHelper.generateJasperReport(dr, new ClassicLayoutManager(), null);
    }

    private String getYear() {
       DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy");  
       LocalDateTime now = LocalDateTime.now();
       String date = dtf.format(now);
       return date;
    }

    private String getMonth() {
       DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MMMM");  
       LocalDateTime now = LocalDateTime.now();
       String date = dtf.format(now);
       return date;
    } 

    private String getDateTime() {
       DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEEE MMMM dd, yyyy (hh:mm)");  
       LocalDateTime now = LocalDateTime.now();
       String date = dtf.format(now);
       return date;    
    }      
}

This is my controller class:

private void printAction(ActionEvent event) throws JRException, Exception {  
    if (fromDate.getValue() != null && toDate.getValue() != null) {
        LocalDate fromDt = fromDate.getValue();
        LocalDate toDt = toDate.getValue();   

        CustomersReportPrintReport report = new CustomersReportPrintReport(customerTable.getItems(), loanTable.getItems(), fromDt, toDt);
        try {
            JasperPrint jp = report.getReport();
            JasperViewer jasperViewer = new JasperViewer(jp, false);
            jasperViewer.setVisible(true);

        } catch (JRException | ColumnBuilderException | ClassNotFoundException ex) {
            System.out.println("Error: " + ex);
        }
    }
}