Вопрос по java, jasper-reports, ireport – Отчеты Jasper: JRBeanCollectionDataSource не может быть преобразован в тип

6

Я строю диаграмму в iReports, и когда я компилирую в Eclipse, я получаю следующую ошибку:

net.sf.jasperreports.engine.JRException: Errors were encountered when compiling report expressions class file:
1. net.sf.jasperreports.engine.JRBeanCollectionDataSource cannot be resolved to a type
            value = new     net.sf.jasperreports.engine.JRBeanCollectionDataSource(((java.lang.String)field_chartData46xAxis.getValue())); //$JR_EXPR_ID=11$
                        
2. net.sf.jasperreports.engine.JRBeanCollectionDataSource cannot be resolved to a type
            value = new net.sf.jasperreports.engine.JRBeanCollectionDataSource(((java.lang.String)field_chartData46xAxis.getOldValue())); //$JR_EXPR_ID=11$
                        
3. net.sf.jasperreports.engine.JRBeanCollectionDataSource cannot be resolved to a type
            value = new net.sf.jasperreports.engine.JRBeanCollectionDataSource(((java.lang.String)field_chartData46xAxis.getValue())); //$JR_EXPR_ID=11$
                        3 errors

at net.sf.jasperreports.engine.design.JRAbstractCompiler.compileReport(JRAbstractCompiler.java:204)
at net.sf.jasperreports.engine.JasperCompileManager.compile(JasperCompileManager.java:240)
at net.sf.jasperreports.engine.JasperCompileManager.compile(JasperCompileManager.java:173)
at net.sf.jasperreports.engine.JasperCompileManager.compileReport(JasperCompileManager.java:448)
at org.reportprotojava.protosheet.Program.main(Program.java:122)

Я передаюArrayList изProtoReport (только один прямо сейчас, пока я тестирую) компилятору jasper.ProtoReport класс содержитChartData класс, который в свою очередь имеет дваArrayList типа Double, один для оси X и один для оси Y.

ОпределенияProtoReport,ChartData классы иосновная программа являются следующими (слегка сокращенными):

ProtoReport Учебный класс:

package org.reportprotojava.protosheet;

import java.util.ArrayList;

public class ProtoReport {


private String outputFileName;
private String title;
private String logoLocation;
private String paragraphText;
private ArrayList tableData;
private String picLocation;
private int[][] graphData;  //TODO decide how to store chart data
private ChartData chartData;
private String path;




//default constructor
public ProtoReport() {

    // Initialize object fields
    outputFileName = "PrototypeReport";
    title = "Prototype Report";
    paragraphText = "Default text";

    tableData = new ArrayList();
    chartData = new ChartData();

    //set path to working directory
    path = System.getProperty("user.dir");

    //default to assumed report location 
    //(ie same folder as .jrxml and .jasper files)
    logoLocation = path + "\\reports\\logo.jpg";
    picLocation = path + "\\reports\\pic.jpg";

}

ChartData Учебный класс:

package org.reportprotojava.protosheet;

import java.util.ArrayList;

public class ChartData {

private ArrayList xAxis;
private ArrayList yAxis;
/**
 * @param xAxis
 * @param yAxis
 */

//default constructor
public ChartData(){
    xAxis = new ArrayList();
    yAxis = new ArrayList();
}



//constructor
public ChartData(ArrayList xAxis, ArrayList yAxis) {
    super();
    this.xAxis = xAxis;
    this.yAxis = yAxis;
}

Основная программа

public class Program {

/**
 * @param args
 * 
 *Program runs our ProtoReport class and its supporting classes 
 * In the end we will have generated a .pdf from the 
 * previously defined .jrxml file
 */

//Generate some random data for the chart
public static ArrayList randomData(int size) {
    ArrayList arrayList = new ArrayList();
    double randNumber;

    for (int i = 0; i < size; i++) {
        randNumber = Math.random();
        arrayList.add(randNumber);
    }

    return arrayList;
}

public static void main(String[] args) {

    ArrayList listOfReports = new ArrayList();

    ProtoReport protoReport1 = new ProtoReport();
    ProtoReport protoReport2 = new ProtoReport();

 //Simple Fields and text
    protoReport1.setTitle("Example<br>Fact Sheet");

    protoReport1.setLogoLocation(protoReport1.getPath() + "\\reports\\logo.gif");

 ChartData chartData = new ChartData();
    chartData.setYAxis(randomData(20));
    for (Double i = (double) 0; i < chartData.getYAxis().size(); i++) {
        chartData.getXAxis().add(i);
    }

        protoReport1.setChartData(chartData);  
 String jrxmlLocation = protoReport1.getPath() 
                    + "\\reports\\ReportPrototype.jrxml";
    String outputFileName = protoReport1.getPath() 
            + "\\reports\\generated\\" + protoReport1.getOutputFileName() + ".pdf";

    listOfReports.add(protoReport1);

//and wrap the ArrayList in a JRBeanCollectionDataSource
    JRBeanCollectionDataSource beanBurritoWrap = new JRBeanCollectionDataSource(listOfReports);

    //build the jasper report
    JasperReport jasperReport;
    JasperPrint jasperPrint;
    HashMap hashMap = new HashMap();
    boolean reportCreated;

    try {

        jasperReport = JasperCompileManager.compileReport(jrxmlLocation);
        jasperPrint = JasperFillManager.fillReport(jasperReport, hashMap, beanBurritoWrap);
        JasperExportManager.exportReportToPdfFile(jasperPrint, outputFileName);
        reportCreated=true;
    }
    catch (JRException e) {
          e.printStackTrace();
          reportCreated=false;
    }

}

гуглил проблему и придумалэтот а такжеэтоти прочитайтераздел источника данных на jasper sourceforge но ни один из них не помог решить проблему, и ямы убедились, что ямы использовали

 new net.sf.jasperreports.engine.JRBeanCollectionDataSource($F{chartData.xAxis})

в моем выражении источника данных диаграммы (и обновил его, когда я изменяю имена полей), и поля установлены вСписок введите в свойствах iReport.

Вот мой.jrxml







    


    






    
        
            
            
                
            
            
        
        
            
            
        
        
            
            
        
        
            
                
                
                
                
            
            
                
                    
                        
                    
                
            
            
                
            
        
    


    
        
            
        
    

В iReports I 'мы пробовали:

-Создание и именование полейProtoReport.ChartData.xAxis а такжеProtoReport.ChartData.yAxis под полямиа также поля подChartData источник я добавил

-Переименование полей вChartData.xAxis а такжеChartData.yAxis

-Переименование полей вchartData.xAxis а такжеchartData.yAxis

-Просто используя поля в поле

-Просто используя поля в ChartData - Поля

Все дают мне ошибку. Любые идеи, что яя делаю неправильно?

Дополнительный вопрос:

- В таком виде моя диаграмма, скорее всего, будет давать только точки данных xAxis. Как я могу использовать содержимое одногоArrayList для оси X и другой для оси Y? т.е. мойXAxis а такжеYAxis поля вChartData объект.

-TherandomData () метод, который я объявил ранееглавный не будет работать, пока я не объявилстатический, это почему?

редактировать

Чтобы сформулировать мой вопрос более четко: как я могу назвать свои поля, настроить источники данных и настроить наборы данных для решения этой проблемы?

Я следую учебному пособию, указанному в комментариях (извините за не гиперссылку; как новый пользователь я 'я уже использовал все мои гиперссылки) и вносил в него изменения для своих нужд, но его структура данных более проста, чем у меня и у меня »Я хотел бы научиться работать с более сложными объектами и наборами данных в отчетах Jasper.

Учебное пособиеэтот eljaydub

Ваш Ответ

1   ответ
14

<!--[CDATA[new net.sf.jasperreports.engine.JRBeanCollectionDataSource($F{chartData.xAxis})]]-->

Это происходит из автозаполнения iReports 4.7.0 при выбореИспользовать выражение источника данных подСоединение / источник данных exp в области сведений выражение по умолчанию из iReports:

 new net.sf.jasperreports.engine.JREmptyDataSource(1)

Но это выражение неверно, потому что.данные пропал, отсутствует. Следует читать:

 new net.sf.jasperreports.engine.data.JREmptyDataSource(1)

а потом я изменилJREmptyDataSource (1) вJRBeanCollectionDataSource ($ F {chartData}) конечно

Это исправляет ошибку времени компиляции, а затем мне пришлось реорганизовать и переопределить мои списки и POJO 'с тем, чтобы я мог легко получить доступ к парам точек данных в моемСписок изChartData объекты. По сути, это означало, что вместо одного объекта ChartData с двумя списками двойников (один для оси X и один для оси Y) у меня теперь есть список объектов ChartData, каждый из которых имеет только одну точку XY. Кажется, сейчас это хорошо работает.

Похожие вопросы