2009-11-20 15 views
10

Sto creando un semplice programma di reportage usando java e iReport (da jasper), che dovrebbe creare un report in pdf che mostra i PC con il loro indirizzo IP, la loro posizione, se è inattivo o no al momento (gestito da un altro sistema) e un elenco di progetti a cui è attualmente collegato (gestito anche altrove).Come si stampa un elenco di stringhe contenute in un altro elenco in iReport?

sto usando iReport per questa materia, e hanno creato una collezione di classe di generazione manichino come segue:

public class PCReports { 

    public static java.util.Collection PC_collection; 
    public static java.util.Collection generateCollection() { 

     PC_collection = new ArrayList<PCLineDTO>(); 
     PCLineDTO line = new PCLineDTO(); 
     line.setIP("192.168.1.1"); 
     line.setLab("location"); 
     line.setActive(true); 
     line.addProjectName("project1"); 
     line.addProjectName("project2"); 
     line.addProjectName("project3"); 
     PC_collection.add(line); 

     line = new PCLineDTO(); 
     line.setIp("192.168.1.2"); 
     line.setLab("location2"); 
     line.setActive(false); 
     line.addProjectName("project1"); 
     line.addProjectName("project2"); 
     PC_collection.add(line); 

     return PC_collection; 
    } 
} 

La classe entità in questo caso essere:

public class PCLineDTO { 
    private String ip; 
    private String lab; 
    private Boolean active; 
    private ArrayList<String> projects; 
} 

Dopo qualche ricerca in giro Internet, ho trovato a way to do something similar, usando i sottoreport.

Il fatto è che non so come stampare una raccolta di stringhe passate come origine dati a questo sottoreport.

Negli esempi che ho trovato su internet, per ogni elemento della collezione maestro, i sottoreport sono state approvate una collezione di oggetti -con i propri metodi getter per ogni Attribute- invece di un insieme di stringhe come è il caso qui. In tali casi, si accede i valori avevano bisogno di utilizzare tramite la sintassi iReport, che non era in grado di utilizzare, per esempio:

$F{project} 

Poiché iReport ricerca un metodo getProject contenuto all'interno oggetti ricevuti, ma in questo caso è un semplice oggetto String (senza un metodo getProject, per così dire).

+0

Che versione di JasperReport/iReport stai usando? – medopal

+0

@medopal: Per fortuna, l'ultimo (al momento di questo post: 3.6.1). –

risposta

17

Utilizzare un sottoreport o un sottodatato.

Passare il sottoreport una collezione origine dati

JRBeanCollectionDataSource($F{Projects}) 

Poi nel nuovo sottoreport creare un nuovo campo chiamato "_this" esattamente, questo significa che il fagiolo nella collezione passata è uguale al valore che voglio

Per maggiori informazioni, consultare il codice sorgente della classe qui: JRAbstractBeanDataSource

Nota: questo è disponibile in JasperReport 3.0.0 non sono sicuro se esiste nella build precedente S. Spero che questo aiuti

Aggiornamento: appena controllato lo SVN, sembra che questa funzionalità è implementata in JasperReports 2.0.0

+1

Grazie, felice che sia stato d'aiuto. Solo una nota a margine, quando si ha a che fare con Jasper o qualsiasi altro progetto open source, tendo a estrarre il codice sorgente e collegarlo alla libreria in Eclipse. In questo modo è più facile scavare dentro. Buona fortuna – medopal

+0

Ho trovato dettagli complementari qui: http://community.jaspersoft.com/questions/533552/solved-problem-passing-datasource-subreport –

3

Interessante. Penso che faresti meglio ad usare l'Elenco e poi definire getName() nella classe Project. Quindi nel sottoreport definire una variabile "nome". Funzionerà in questo modo e ti consentirà di aggiungere facilmente ulteriori informazioni, come durata del progetto, team lead, ecc.

+0

Grazie per la risposta. Ho preso in considerazione questo e potrebbe effettivamente implementarlo in questo modo, se le cose arrivassero a questo. Tuttavia, con rammarico (e per mia stessa ammissione), altre parti del programma stanno usando questa lista di stringhe, e si chiedeva se ci fosse un modo per aggirare il problema e il compito incline agli errori di cercare e sostituire dove è stato usato. –

0

Come dice Bozho, nel caso in cui proyects era una serie di oggetto complesso si dovrebbe fare riferimento a esso come un campo di tipo java.util.Collection e quindi passarlo al sottoreport interno nello stesso modo indicato da medopal. E non mettere il campo _THIS.

0

Per elaborare questo senza usare _THIS: diciamo che un bean java ha un elenco di subBeans e questo subBean ha un formato complesso e vogliamo stampare ogni subBean in un modo personalizzato. Cito un esempio in cui l'elemento dataset secondario è al livello relazione e la componentElement è nel dettaglio banda:

<subDataset name="ListOfSubBeans" uuid="66c86e41-c565-4f18-bccf-1a1b2a567585"> 
    <field name="subBeanField_1" class="java.lang.String"> 
     <fieldDescription><![CDATA[subBeanField_1]]></fieldDescription> 
    </field> 
</subDataset> 

... 

     <componentElement> 
      <reportElement x="780" y="0" width="100" height="30" uuid="f73864b9-46dd-4adb-8dad-a6bd8dfae64e"> 
       <property name="net.sf.jasperreports.export.headertoolbar.table.name" value=""/> 
      </reportElement> 
      <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="ListOfSubBeans" uuid="a8dd1c2b-3ac0-4ffa-b9d0-08e4890e199a"> 
        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{listOfSubBeans})]]></dataSourceExpression> 
       </datasetRun> 
       <jr:listContents height="30" width="100"> 
        <textField> 
         <reportElement x="0" y="0" width="100" height="30" uuid="61700c18-6bb9-45da-a235-b76b9f76a2ea"/> 
         <textFieldExpression><![CDATA[$F{subBeanField_1}]]></textFieldExpression> 
        </textField> 
       </jr:listContents> 
      </jr:list> 
     </componentElement> 

... 

Così, l'insieme di dati padrone ha dichiarato che il fagiolo principale ha una variabile membro che è una lista: listOfSubBeans . Questo java.util.List viene utilizzato per alimentare l'origine dati di jr:list, mentre i campi di jr:list vengono dichiarati utilizzando un subDataset chiamato ListOfSubBeans (prestare attenzione alla distinzione tra maiuscole e minuscole).

Problemi correlati