Report Data Sources

Le origini dati sono contenitori di dati strutturati. Durante la generazione del report, il motore JasperReports ottiene i dati dalle origini dati. I dati possono essere ottenuti da database, file XML, array di oggetti e raccolte di oggetti. Abbiamo visto nel capitolo Filling Reports , il metodo fillReportXXX () prevede di ricevere una sorgente dati del report, che deve compilare, sotto forma dinet.sf.jasperreports.engine.JRDataSource oggetto o a java.sql.Connection (quando i dati del report si trovano in un database relazionale).

L'interfaccia JRDataSource ha solo due metodi, che dovrebbero essere implementati:

  • public boolean next () genera JRException;

    • Al momento del riempimento del report, questo metodo viene richiamato sull'oggetto origine dati dal motore di report durante l'iterazione dei dati.

  • public Object getFieldValue (JRField jrField) genera JRException;

    • Questo metodo fornisce il valore per ogni campo del report nel record dell'origine dati corrente.

L'unico modo per recuperare i dati dall'origine dati è utilizzare i campi del report. Esistono diverse implementazioni predefinite dell'interfaccia JRDataSource, a seconda del modo in cui vengono acquisiti i record nell'origine dati.

Implementazioni dell'origine dati

La tabella riportata di seguito riassume le origini dati e le loro classi di implementazione:

Fonte di dati Classe di implementazione
JDBC net.sf.jasperreports.engine.JRResultSetDataSource
JavaBean net.sf.jasperreports.engine.data.JRBeanCollectionDataSource, net.sf.jasperreports.engine.data.JRBeanArrayDataSource
Basato su mappa net.sf.jasperreports.engine.data.JRMapArrayDataSource, net.sf.jasperreports.engine.data.JRMapCollectionDataSource
TableModel net.sf.jasperreports.engine.data.JRTableModelDataSource
XML net.sf.jasperreports.engine.data.JRXmlDataSource
CSV net.sf.jasperreports.engine.data.JRCsvDataSource
XLS net.sf.jasperreports.engine.data.JRXlsDataSource
Vuoto net.sf.jasperreports.engine.JREmptyDataSource

Origini dati JDBC

Classe JRResultSetDataSourcecraps un oggetto java.sql.ResultSet . Si tratta delle implementazioni dell'origine dati più comunemente utilizzate quando i dati del report vengono estratti da un database relazionale. Se invece un java.sql.Connection viene passato al motore, esegue prima la query correlata e memorizza l' oggetto java.sql.ResultSet restituito in un'istanza JRResultSetDataSource.

Origini dati JavaBean

Classi JRBeanArrayDataSource e JRBeanCollectionDataSourcerappresentano implementazioni che possono avvolgere array e raccolte di oggetti JavaBean. Ogni oggetto all'interno dell'array o della raccolta verrà visto come un record in questo tipo di origine dati. La mappatura tra una particolare proprietà JavaBean e il campo del report corrispondente viene effettuata mediante convenzioni di denominazione. Il nome del campo del report deve essere uguale al nome della proprietà JavaBean come specificato dalle specifiche JavaBeans.

In tutti gli esempi di questo tutorial, abbiamo utilizzato JRBeanCollectionDataSource.

Origini dati basate su mappe

Le classi di implementazione JRMapArrayDataSource e JRMapCollectionDataSourcesono utili se l'applicazione padre memorizza già i dati di reporting disponibili in memoria come oggetti java.util.Map . Ogni oggetto Map nella matrice o nella raccolta racchiusa è considerato un record virtuale nell'origine dati e il valore di ogni campo del report viene estratto dalla mappa utilizzando il campo del report denominato come chiave.

Origini dati TableModel

In molte applicazioni lato client, i dati vengono visualizzati in formato tabulare. Un requisito comune in molte applicazioni è consentire all'utente di stampare questo formato tabulare come report. Classe di implementazioneJRTableModelDataSourcerende il compito di generare report dal formato tabulare banale per le applicazioni Swing. Questa classe racchiude un oggetto javax.swing.table.TableModel. È possibile accedere alle colonne nell'oggetto TableModel avvolto in base al nome o agli indici basati su 0.

Origini dati XML

Classe JRXmlDataSourceè un'implementazione dell'origine dati basata su DOM, che utilizza espressioni XPath per selezionare i dati dal documento XML. I record nell'origine dati XML sono rappresentati da elementi del nodo selezionati tramite l'espressione XPath. I valori dei campi vengono recuperati da ogni record utilizzando l'espressione XPath fornita dalla descrizione del campo (elemento <fieldDescription> in JRXML).

XPath è un linguaggio utilizzato per navigare tra gli attributi e gli elementi di un documento XML. Ulteriori informazioni su XPath sono disponibili all'indirizzohttp://www.w3.org/TR/xpath.

Origini dati CSV

JRCsvDataSourcerappresenta un'implementazione per sorgenti dati, che recuperano i propri dati da file di testo strutturato; di solito CSV. I valori dei campi vengono recuperati utilizzando il loro indice di colonna.

Origini dati XLS

JRXlsDataSourcerappresenta un'implementazione per le origini dati, che recuperano i propri dati da documenti Excel. Anche la mappatura dei campi del report per questa implementazione dell'origine dati si basa sull'indice della colonna del campo.

Origini dati vuote

La classe JREmptyDataSource, simula un'origine dati con un determinato numero di record vuoti virtuali all'interno. Viene utilizzato dagli strumenti dell'interfaccia utente per offrire funzionalità di anteprima di report di base o in modelli di report speciali o per scopi di test e debug.

Origini dati riavvolgibili

Il net.sf.jasperreports.engine.JRRewindableDataSourceestende l' interfaccia JRDataSource di base . Aggiunge un solo metodo, chiamato moveFirst (), all'interfaccia. Questo metodo ha lo scopo di spostare il cursore sul primo elemento nell'origine dati.

Le origini dati riavvolgibili sono utili quando si lavora con rapporti secondari inseriti in una banda che non può essere divisa a causa dell'impostazione isSplitAllowed = "false" e non c'è abbastanza spazio sulla pagina corrente per il rendering del rapporto secondario.

Tutte le implementazioni di origine dati di cui sopra sono riavvolgibili ad eccezione di JRResultSetDataSource, poiché non supporta lo spostamento indietro del puntatore del record. Ciò pone un problema solo se questa origine dati viene utilizzata manualmente per eseguire il wrapping di un java.sql.ResultSet prima di passarlo al report secondario. Non ci sono problemi, se la query SQL risiede nel modello di sottoreport, poiché il motore la eseguirà nuovamente quando si riavvia il sottoreport nella pagina successiva.

Fornitori di origini dati

La libreria JasperReports ha un'interfaccia net.sf.jasperreports.engine.JRDataSourceProvider. Ciò aiuta nella creazione e nell'eliminazione degli oggetti dell'origine dati. Quando si crea un modello di report utilizzando gli strumenti della GUI, è necessario uno strumento speciale per personalizzare l'origine dati del report. JRDataSourceProvider è il modo standard per collegare origini dati personalizzate a uno strumento di progettazione. Un'implementazione personalizzata di questa interfaccia dovrebbe implementare i seguenti metodi che consentono la creazione e l'eliminazione di oggetti dell'origine dati e anche metodi per elencare i campi del report disponibili all'interno dell'origine dati, se possibile:

public boolean supportsGetFieldsOperation();

public JRField[] getFields(JasperReport report)
   throws JRException, UnsupportedOperationException;

public JRDataSource create(JasperReport report) throws JRException;

public void dispose(JRDataSource dataSource) throws JRException;