Źródła danych raportu

Źródła danych to kontener danych strukturalnych. Podczas generowania raportu silnik JasperReports pobiera dane ze źródeł danych. Dane można uzyskać z baz danych, plików XML, tablic obiektów i kolekcji obiektów. Jak widzieliśmy w rozdziale Raporty wypełnienia , metoda fillReportXXX () spodziewa się otrzymać źródło danych raportu, które musi wypełnić, w postacinet.sf.jasperreports.engine.JRDataSource obiekt lub a java.sql.Connection (gdy dane raportu znajdują się w relacyjnej bazie danych).

Interfejs JRDataSource ma tylko dwie metody, które należy zaimplementować -

  • public boolean next () rzuca JRException;

    • W czasie wypełniania raportu ta metoda jest wywoływana na obiekcie źródła danych przez silnik raportujący podczas iteracji po danych.

  • public Object getFieldValue (JRField jrField) zgłasza JRException;

    • Ta metoda zapewnia wartość dla każdego pola raportu w bieżącym rekordzie źródła danych.

Jedynym sposobem na pobranie danych ze źródła danych jest użycie pól raportu. Istnieje kilka domyślnych implementacji interfejsu JRDataSource, w zależności od sposobu pozyskiwania rekordów w źródle danych.

Implementacje źródła danych

Poniższa tabela podsumowuje źródła danych i klasy ich implementacji -

Źródło danych Klasa implementacji
JDBC net.sf.jasperreports.engine.JRResultSetDataSource
JavaBean net.sf.jasperreports.engine.data.JRBeanCollectionDataSource, net.sf.jasperreports.engine.data.JRBeanArrayDataSource
Oparte na mapie 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
Pusty net.sf.jasperreports.engine.JREmptyDataSource

Źródła danych JDBC

Klasa JRResultSetDataSourcecraps się java.sql.ResultSet obiekt. Jest to najczęściej używana implementacja źródła danych, gdy dane raportu są wyodrębniane z relacyjnej bazy danych. Jeśli zamiast tego do mechanizmu zostanie przekazany element java.sql.Connection , najpierw wykona pokrewne zapytanie i zapisze zwrócony obiekt java.sql.ResultSet w instancji JRResultSetDataSource.

Źródła danych JavaBean

Zajęcia JRBeanArrayDataSource i JRBeanCollectionDataSourcereprezentują implementacje, które mogą zawijać tablice i kolekcje obiektów JavaBean. Każdy obiekt w tablicy lub kolekcji będzie postrzegany jako jeden rekord w tego typu źródle danych. Odwzorowanie między określoną właściwością JavaBean a odpowiednim polem raportu odbywa się za pomocą konwencji nazewnictwa. Nazwa pola raportu musi być taka sama, jak nazwa właściwości JavaBean, jak określono w specyfikacjach JavaBeans.

We wszystkich przykładach tego samouczka używaliśmy JRBeanCollectionDataSource.

Źródła danych oparte na mapach

Klasy implementacji JRMapArrayDataSource i JRMapCollectionDataSourcesą przydatne, jeśli aplikacja nadrzędna już przechowuje dane raportowania dostępne w pamięci jako obiekty java.util.Map . Każdy obiekt Map w opakowanej tablicy lub kolekcji jest traktowany jako wirtualny rekord w źródle danych, a wartość każdego pola raportu jest wyodrębniana z mapy przy użyciu pola raportu nazwanego jako klucz.

Źródła danych TableModel

W wielu aplikacjach po stronie klienta dane są wyświetlane w formacie tabelarycznym. Częstym wymaganiem w wielu aplikacjach jest umożliwienie użytkownikowi wydrukowania tego formatu tabelarycznego jako raportu. Klasa realizacjiJRTableModelDataSourcesprawia, że ​​generowanie raportów z formatu tabelarycznego jest dla aplikacji Swing trywialne. Ta klasa opakowuje obiekt javax.swing.table.TableModel. Dostęp do kolumn w opakowanym obiekcie TableModel można uzyskać za pomocą ich nazw lub indeksów opartych na 0.

Źródła danych XML

Klasa JRXmlDataSourcejest implementacją źródła danych opartą na DOM, która używa wyrażeń XPath do wybierania danych z dokumentu XML. Rekordy w źródle danych XML są reprezentowane przez elementy węzłów wybrane za pomocą wyrażenia XPath. Wartości pól są pobierane z każdego rekordu przy użyciu wyrażenia XPath dostarczonego przez opis pola (element <fieldDescription> w JRXML).

XPath to język używany do nawigacji po atrybutach i elementach dokumentu XML. Więcej informacji o XPath można znaleźć pod adresemhttp://www.w3.org/TR/xpath.

Źródła danych CSV

JRCsvDataSourcereprezentuje implementację dla źródeł danych, które pobierają swoje dane z ustrukturyzowanych plików tekstowych; zwykle pliki CSV. Wartości pól są pobierane przy użyciu indeksu ich kolumn.

Źródła danych XLS

JRXlsDataSourcereprezentuje implementację dla źródeł danych, które pobierają dane z dokumentów programu Excel. Mapowanie pól raportu dla tej implementacji źródła danych jest również oparte na indeksie kolumny pola.

Puste źródła danych

Klasa JREmptyDataSource, symuluje źródło danych z określoną liczbą wirtualnych pustych rekordów. Jest używany przez narzędzia interfejsu użytkownika do oferowania podstawowych funkcji podglądu raportów lub w specjalnych szablonach raportów lub do celów testowania i debugowania.

Przewijalne źródła danych

Plik net.sf.jasperreports.engine.JRRewindableDataSourcerozszerza podstawowy interfejs JRDataSource . Dodaje tylko jedną metodę, o nazwie moveFirst (), do interfejsu. Ta metoda ma na celu przeniesienie kursora do pierwszego elementu w źródle danych.

Przewijalne źródła danych są przydatne podczas pracy z raportami podrzędnymi umieszczonymi wewnątrz pasma, którego nie można podzielić ze względu na ustawienie isSplitAllowed = "false", a na bieżącej stronie nie ma wystarczającej ilości miejsca na renderowanie raportu podrzędnego.

Wszystkie powyższe implementacje źródeł danych można przewijać, z wyjątkiem JRResultSetDataSource, ponieważ nie obsługuje cofania wskaźnika rekordu. Stanowi to problem tylko wtedy, gdy to źródło danych jest używane ręcznie do zawijania zestawu java.sql.ResultSet przed przekazaniem go do raportu podrzędnego. Nie ma problemu, jeśli zapytanie SQL znajduje się w szablonie raportu podrzędnego, ponieważ silnik wykona je ponownie po ponownym uruchomieniu raportu podrzędnego na następnej stronie.

Dostawcy źródeł danych

Biblioteka JasperReports ma interfejs net.sf.jasperreports.engine.JRDataSourceProvider. Pomaga to w tworzeniu i usuwaniu obiektów źródła danych. Podczas tworzenia szablonu raportu za pomocą narzędzi GUI potrzebne jest specjalne narzędzie do dostosowywania źródła danych raportu. JRDataSourceProvider to standardowy sposób podłączenia niestandardowych źródeł danych do narzędzia projektowego. Niestandardowa implementacja tego interfejsu powinna implementować następujące metody, które umożliwiają tworzenie i usuwanie obiektów źródła danych, a także metody wyświetlania dostępnych pól raportów w źródle danych, jeśli to możliwe -

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;