iReport e report complessi

iReport e report complessi

Qualche tempo fa, abbiamo visto come usare iReport per realizzare file jasper da utilizzare con java per produrre le nostre stampe in formato pdf.

Proviamo ora a vedere qualcosa di più complicato…
Se si avessero difficoltà a seguire il presente articolo, si raccomanda la lettura del precedente.

Ammettiamo di dover produrre una stampa come la seguente (in cui ogni tabella può essere lunga a piacimento):
iReport: esempio di stampa

e che i nostri dati siano contenuti in un file XML come ad esempio questo:

<?xml version="1.0" encoding="UTF-8"?>
<stampaIntervento data="15-15-2025" img="D:\workspace\flex3\ProgrammiTriennali\assets\LogoLomb.gif">
  <datiIntervento>
    <dato>
      <localizzazione>00140 - Localita 1</localizzazione>
     <descrizione>Descrizione molto lunga per fare andare a capoil campo. Funziona bene</descrizione>
    </dato>
   <dato>
      <localizzazione>00141 - Localita 2</localizzazione>
     <descrizione>Quattro chiacchiere</descrizione>
    </dato>
   <dato>
      <localizzazione>00142 - Localita 3</localizzazione>
     <descrizione>Cinque chiacchiere</descrizione>
   </dato>
 </datiIntervento>
 <datiFinanziamento>
   <finanziamento>
     <tipo>Tipo di finanziamento molto lungo! Va a capo se scrivo cose troppo lunghe?</tipo>
     <ianno>12.500</ianno>
     <iianno>25.000</iianno>
     <iiianno>100.0000</iiianno>
   </finanziamento>
    <finanziamento>
     <tipo>Tipo di finanziamento 2</tipo>
      <ianno>120.500</ianno>
      <iianno>250.000</iianno>
      <iiianno>1.000.0000</iiianno>
   </finanziamento>
  </datiFinanziamento>
</stampaIntervento>

Come possiamo procedere?
Iniziamo…

  1. Creiamo un nuovo report
  2. Scegliamo il template (orizzontale, verticale, ecc.)
  3. Creaimo una sorgente dati (datasuorce) di tipo xml per il report padre. Ricordiamo che per farlo ci basta cliccare sul bottone mostrato nella figura qui sotto e premere “New” nella schermata che comparirà.iReport - Nuovo datasourceDopo aver premuto “New” ci troveremo di fronte l’elenco di tutti i possibili datasource; noi scegliamo “XML file datasource” facendo attenzione a tenere spuntata la voce “Usa l’espressione report XPath quando riempi il report”, come mostrato nella figura che segue. Chiamiamo questa sorgente dati “Intervento”
  4. xmlDataSource

  5. Apriamo il nuovo report in visualizzazione XML ed eliminiamo l’attributo “language” dal tag jasperReport
  6. Torniamo nel Designer, facciamo clik col dx sul nome del report e apriamo “l’Edit Query”. Scegliamo XPath come linguaggio e diamo “/” come query
  7. Aggiungiamo TUTTI i campi di cui vogliamo avere il valore nel nostro report (come visto nello scorso articolo, ci basta selezionarli sulla dx e trascinarli in basso). Fatto tutto, premiamo “OK”
  8. Siamo tornati nel Designer; clicchiamo col dx sulla voce “Detail 1” (nel Report Inspector) e scegliamo “Add Another Detail Band” (questa operazione deve essere ripetuta per ogni sezione del nostro report; nel nostro caso abbiamo 3 sezioni del documento (Dati, Finanziamenti, Immobili) e quindi dobbiamo creare 3 sezioni di tipo Detail)

Ci siamo?
Ora nella sezione di iReport “Detail 1” aggiungiamo il testo statico “DATI” e una “Table Component”. Questa componente racchiude il “segreto” per realizzare quello che vogliamo senza usare i subreport…
Seguiamo i seguenti passi:

  1. Scegliamo come sorgente dati “Intervento” e sistemiamo la tabella nella prima sezione Detail
  2. A questo punto click con dx su “New Dataset 1” e scegliamo “Edit Query”. Impostiamo XPath come linguaggio e “/stampaIntervento/datiIntervento/dato” come query
  3. Sulla destra, trasciniamo “localizzazione” e “descrizione” in basso e premiamo “OK”
  4. Ora editiamo la tabella e trasciniamo i campi presenti in “New Dataset 1/Campi” nelle colonne in cui vogliamo vengano visualizzati
  5. iReport Query Editor

  6. Torniamo nel Designer del report, facciamo click col dx sulla tabella e scegliamo “Edit table datasource”
  7. Scegliamo “New Dataset 1” come Sub dataset, “Usa espressione Datasource”
    e poi aggiungiamo questa stringa in basso:

    ((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("/stampaIntervento/datiIntervento/dato")

new Dataset iReport
Due parole sul passo 6.
Questa stringa comunica alla tabella di usare il data source del report padre ($P{REPORT_DATA_SOURCE}). Gli dice poi che tale datasource è di tipo JRXmlDataSource; infine recupera da tale data source (che alla fine è il nostro file xml) il sottoinsieme dei dati che ci interessano.

Il procedimento da 1 a 6 dovrà essere ripetuto per ogni sezione del documento.
Eseguiamo.

4 commenti

I commenti sono chiusi.