La progettazione di Report non valido. Campo non trovato Jasper Report

Im cercando di creare una base jasper report con JRBeanCollectionDataSource. Lì im avendo un elenco di oggetti all’interno di javabean.

public class Course {

    private int id;
    private List<Student> students;
}

Studente oggetto sembra

public class Student {

    private String name;
    private int id;
}

Voglio stampare i dati degli studenti all’interno della mia relazione. Questo è come il mio jrxml sembra

 <subDataset name="dataset1" uuid="09015d96-ad5a-4fed-aa9e-19d25e02e205">
 <field name="students" class="java.util.List">
  <fieldDescription><![CDATA[students]]></fieldDescription>
 </field>
</subDataset>

<field name="id" class="java.lang.Integer"/>
<field name="students" class="java.util.List"/>
<field name="name" class="java.lang.String"/>

<componentElement>
                <reportElement x="200" y="0" width="400" height="20"/>
                <jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Vertical">
                    <datasetRun subDataset="dataset1">
                        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{students})]]></dataSourceExpression>
                    </datasetRun>
                    <jr:listContents height="20" width="400">
                        <textField>
                            <reportElement x="0" y="0" width="100" height="20"/>
                            <box leftPadding="10">
                                <topPen lineWidth="1.0"/>
                                <leftPen lineWidth="1.0"/>
                                <bottomPen lineWidth="1.0"/>
                                <rightPen lineWidth="1.0"/>
                            </box>
                            <textElement/>
                            <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
                        </textField>

                    </jr:listContents>
                </jr:list>
            </componentElement>

Ma quando ho eseguito questa im ottenendo

net.sf.jasperreports.engine.design.JRValidationException: Report design not valid : 
     1. Field not found : name
Report design not valid : 
     1. Field not found : name

Im un principiante a jasper report qualcuno può per favore dirmi che cosa sto facendo di sbagliato qui. Grazie

Si può suggerire a me il buon tutorial per jasper report
tutorialspoint.com/jasper_reports questo è un bene.

OriginaleL’autore Dilantha | 2015-06-20

3 risposte

  1. 5

    È necessario definire i campi prima di utilizzarlo.

    Nel jrxml, si dispone di tre campi definiti students in subDataSet, id e students. Ma non lo hai definito name e utilizzando nel vostro jrxml e, per questo motivo sono sempre di questa eccezione.

    Provare la definizione di name, come

    <field name="name" class="java.lang.String"/>
    Grazie per la risposta. Ho definito l’attributo name in jrxml. ancora ricevendo lo stesso errore 🙁
    Grazie per i tuoi consigli! Solo per completezza: In iReport è inoltre necessario aggiungere campi – li troverete nella Relazione di ispezione.

    OriginaleL’autore user1690588

  2. 1

    Provare con un sottoreport. Ho lanciato il tuo esempio nel mio database locale, senza alcun problema.

    Questa è la mia lista di oggetti student:

    private List<Student> getList(){
        List<Student> students = new ArrayList<Student>();
        Connection con = ....; //Retrieve your connection the way you want
        ResultSet rs = con.createStatement().executeQuery("select name, id from students order by id");
        while (rs.next()){
            students.add(new Student(rs.getString(1), rs.getInt(2)));
        }
        con.close();
        return students;
    }

    Questo è come ho passato il mio JRBeanCollectionDataSource oggetto dal mio programma Java:

    Map<String, Object> params = new HashMap<String, Object>();
    params.put("SUBREPORT_DATASOURCE", new JRBeanCollectionDataSource(getList()));
    
    String jasperPath = "....."; //where you have your compiled jasper report file
    JasperPrint jasperPrint = JasperFillManager.fillReport(jasperPath, params, new JREmptyDataSource(1));

    Questo è il xlm report principale “reportStudent.jrxml”:

        <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="reportStudent" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
        <property name="ireport.zoom" value="1.0"/>
        <property name="ireport.x" value="0"/>
        <property name="ireport.y" value="0"/>
        <parameter name="SUBREPORT_DATASOURCE" class="net.sf.jasperreports.engine.JRDataSource" isForPrompting="false">
            <defaultValueExpression><![CDATA[]]></defaultValueExpression>
        </parameter>
        <background>
            <band splitType="Stretch"/>
        </background>
        <detail>
            <band height="125" splitType="Stretch">
                <subreport>
                    <reportElement x="0" y="0" width="555" height="125"/>
                    <dataSourceExpression><![CDATA[$P{SUBREPORT_DATASOURCE}]]></dataSourceExpression>
                    <subreportExpression><![CDATA["./reportStudent_subreport1.jasper"]]></subreportExpression>
                </subreport>
            </band>
        </detail>
    </jasperReport>

    E questo è quello per il sottoreport “reportStudent_subreport1.jrxml”:

    <?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="reportStudent_subreport1" language="groovy" pageWidth="555" pageHeight="802" columnWidth="555" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0">
        <property name="ireport.zoom" value="1.771561000000001"/>
        <property name="ireport.x" value="0"/>
        <property name="ireport.y" value="0"/>
        <field name="id" class="java.lang.String"/>
        <field name="name" class="java.lang.String"/>
        <background>
            <band splitType="Stretch"/>
        </background>
        <columnHeader>
            <band height="20" splitType="Stretch">
                <staticText>
                    <reportElement x="66" y="0" width="100" height="20"/>
                    <textElement/>
                    <text><![CDATA[id]]></text>
                </staticText>
                <staticText>
                    <reportElement x="212" y="0" width="100" height="20"/>
                    <textElement/>
                    <text><![CDATA[name]]></text>
                </staticText>
            </band>
        </columnHeader>
        <detail>
            <band height="20" splitType="Stretch">
                <textField>
                    <reportElement x="66" y="0" width="100" height="20"/>
                    <textElement/>
                    <textFieldExpression><![CDATA[$F{id}]]></textFieldExpression>
                </textField>
                <textField>
                    <reportElement x="212" y="0" width="100" height="20"/>
                    <textElement/>
                    <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
                </textField>
            </band>
        </detail>
    </jasperReport>

    Questo è solo un elenco di studenti. Si può scorrere all’interno del report principale e stampa il tuo corso id e studenti sottoreport nel dettaglio banda con un po ‘ di modifiche. Speranza che aiuta ad iniziare con.

    È possibile fare questo senza l’utilizzo di un sottoreport ?
    Si potrebbe inserire una tabella o tabella a campi incrociati nella sezione dettaglio e stampare il vostro elenco di studenti. È necessario configurare i parametri necessari per mandarli a quel tavolo/tabella a campi incrociati. Pensare che la banda di dettaglio viene stampato una volta che un oggetto nel JRBeanCollectionDataSource (un Corso nel tuo caso)

    OriginaleL’autore Turbero

  3. 1

    Fonte del problema. nome attributo deve definiti all’interno del subdataset. Altrimenti non funzionerà

    <subDataset name="dataset1" uuid="09015d96-ad5a-4fed-aa9e-19d25e02e205">
         <field name="name" class="java.lang.String"/>
    </subDataset>

    OriginaleL’autore Dilantha

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *