Generowanie raportów
1
1. Wprowadzenie
●
przykładowy problem,
●
podstawowe własności narzędzi raportujących.
2. JasperReports
●
struktura raportu,
●
parametry, zmienne i pola,
●
generowanie raportu (API).
3. iReport
Wprowadzenie
2
Informacje zgromadzone w bazie danych są przede wszystkim wykorzystywane do
tworzenia analiz i raportów. Bezpośrednia analiza wyników zapytania SQL może
być trudna, szczególnie dla osób nie związanych zawodowo z obsługą baz danych.
Aby przedstawić wyniki w formie akceptowalnej dla tych osób używa się narzędzi
służących do generowania raportów.
Narzędzia przeznaczone do tworzenia raportów:
http://207.178.67.98/java/readerschoice2004/frameliveupdate.cfm?BType=19
Wprowadzenie
3
zamowienia
zamowienia
id_zamowienia
data_zakupu
...
id_kontrahenta
towary
id_towaru
ilosc
cena
id_zamowienia
kontrahenci
kontrahenci
id_kontrahenta
nazwa
adres
...
Wprowadzenie
4
Przykładowe raporty:
1. Wartość sprzedaży w zadanym okresie:
SELECT SUM(t.ilosc*t.cena) FROM towary t
JOIN zamowienia z ON t.id_zamowienia=z.id_zamowienia
WHERE z.data<'...' AND z.data<'...'
2. Bestsellery:
SELECT t.id_towaru, SUM(t.ilosc) FROM towary t
JOIN zamowienia z ON t.id_zamowienia=z.id_zamowienia
WHERE z.data<'...' AND z.data<'...'
GROUP BY t.id_towaru LIMIT ...
Wprowadzenie
5
3. Najlepsi klienci:
SELECT k.nazwa, SUM(t.ilosc*t.wartosc) FROM zamowienia z
JOIN towary t ON t.id_zamowienia=z.id_zamowienia
JOIN kontrahenci k ON k.kontrahent_id=z.kontrahent_id
WHERE z.data<'...' AND z.data<'...'
GROUP BY k.kontrahent_id LIMIT ...
Wprowadzenie
6
Narzędzie do generowania raportów powinno umożliwiać:
●
stworzenie raportu na bazie zapytania SQL,
●
eksport raportu do popularnych formatów danych (pdf, html, excel, csv, ...),
●
obsługę zewnętrznych parametrów sterujących raprtem.
Istnieje wiele narzędzi służących do przygotowania raportów. Wśród darmowych na
wyróżnienie zasługuje JasperReports http://jasperreports.sourceforge.net/.
Wprowadzenie
7
JasperReports
8
Podstawowe cechy JasperReports:
1. Samodzielna biblioteka w Javie, do wykorzystania we własnych programach.
2. Możliwość tworzenia podraportów.
3. Eksport raportów do formatów: PDF, XML, HTML, CSV, XLS, RTF, TXT.
4. Wykresy.
5. Obsługa lokalizacji.
7. Skalowalność – brak wewnętrznych ograniczeń na rozmiar raportu.
8. Rozszerzalność.
9. Dostępność narzędzi wspomagających.
10. Współpraca z wieloma mechanizmami dostępu do danych: JDBC, EJB, POJO,
Hibernate, XML.
JasperReports
9
Struktura dokumentu XML:
<?xml version="1.0"?>
<!DOCTYPE jasperReport
PUBLIC "-//JasperReports//DTD Report Design//EN"
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport name="bestsellery" ... >
...
</jasperReport>
Parametry
10
Parametry przekazywane z zewnątrz:
<parameter name="Pdate_from" isForPrompting="false"
class="java.lang.String">
<defaultValueExpression>
<![CDATA[""]]>
</defaultValueExpression>
</parameter>
...
<parameter name="Plimit" isForPrompting="false">
<defaultValueExpression>
<![CDATA["10"]]>
</defaultValueExpression>
</parameter>
Dostęp do parametru uzyskuje się stosując konstrukcję:
$P{nazwa}
.
Wbudowane parametry
11
Wbudowane parametry (wybrane):
REPORT_PARAMETERS_MAP
– mapa wszystkich parametrów (
java.util.Map
).
REPORT_CONNECTION
– połączenie z bazą danych (
java.sql.Connection
).
REPORT_DATA_SOURCE
– źródło danych (
JRDataSource
).
REPORT_LOCALE
– lokalizacja (
java.util.Locale
).
REPORT_RESOURCE_BUNDLE
– zlokalizowane komunikaty
(
java.util.ResourceBundle
).
REPORT_CLASS_LOADER
- obiekt używany podczas wypełniania raportu do
ładowania zasobów takich jak obrazki, fonty, podraporty
(
java.lang.ClassLoader
).
IS_IGNORE_PAGINATION
– jeśli ustawiony na
java.lang.Boolean.TRUE
raport
nie będzie dzielony na strony.
Pola
12
Pola - atrybutów otrzymane w wyniku zapytania:
<field name="id_towaru" class="java.lang.Integer"/>
<field name="suma" class="java.lang.Double"/>
Dostęp do pola uzyskuje się stosując konstrukcję:
$F{nazwa}
.
Zmienne
13
Dodatkowe wewnęytrzne zmienne raportu:
<variable name="Vlp" class="java.lang.Integer"
resetType="Report" calculation="Nothing">
<variableExpression>
<![CDATA[
new java.lang.Integer($V{Vlp}.intValue() +1)
]]>
</variableExpression>
<initialValueExpression>
<![CDATA[
new java.lang.Integer(0)
]]>
</initialValueExpression>
</variable>
Dostęp do zmiennej uzyskuje się stosując konstrukcję:
$V{nazwa}
.
Zapytanie SQL
14
Zapytanie SQL przekazuje się następująco:
<queryString>
<![CDATA[SELECT t.id_towaru, SUM(t.ilosc) AS suma
FROM towary t
JOIN zamowienia z ON t.id_zamowienia=z.id_zamowienia
WHERE z.data<'$P!{Pdate_from}'
AND z.data<'$P!{Pdate_to}'
GROUP BY t.id_towaru LIMIT $P!{Plimit}]]>
</queryString>
Jeśli parametr ma zostać użyty w zapytaniu SQL powinien być przekazany przez
$P
!
{parametr}
.
Sekcje raportu
15
Raport składa się z następujących sekcji:
●
background
– tło raportu,
●
title
– nagłówek raportu,
●
pageHeader
– nagłówek strony raportu,
●
columnHeader
– nagłówek tabeli (nazwy atrybutów),
●
groupHeader
– nagłówek grupy danych,
●
detail
– zawartość raportu – sekcja jest powtarzana dla każdego rekordu danych,
●
GroupFooter
– stopka grupy,
●
ColumnFoter
– stopka tabeli,
●
PageFooter
– stopka strony,
●
LastPageFooter
– stopka ostatniej strony,
●
Summary
- podsumowanie.
Sekcje raportu
16
Przykładowa sekcja:
<pageHeader>
<band height="30">
<rectangle>
<reportElement x="0" y="0" width="555"
height="25"/>
<graphicElement/>
</rectangle>
<staticText>
<reportElement x="0" y="0" width="555"
height="25"/>
<textElement textAlignment="Center">
<font fontName="Helvetica" size="18"/>
</textElement>
<text>Bastsellery</text>
</staticText>
</band>
</pageHeader>
Sekcje raportu
17
Sekcja detail:
<detail>
<band height="20" isSplitAllowed="true" >
<textField isStretchWithOverflow="true">
<reportElement x="40" y="0" width="60"
height="15"/>
<box/>
<textElement/>
</textField>
<textFieldExpression class="java.lang.Integer">
<![CDATA[$V{Vlp})]]>
</textFieldExpression>
...
</detail>
Korzystanie z raportu
18
Przygotowany dokument XML opisujący raport należy zapisać w pliku
(z rozszerzeniem jrxml).
Aby wygenerować raport należy go:
●
skompilować,
●
wypełnić,
●
wyświetlić na ekranie (lub wyeksportować do pliku).
Kompilacja raportu
19
Do kompilacji raportu służą metody statyczne klasy:
net.sf.jasperreports.engine.JasperCompileManager
.
np.
JasperCompileManager compileReportToFile("besteller.jrxml",
"bestseller.jasper");
lub
JasperReport jr = compileReport("besteller.jrxml");
pełna nazwa klasy
JasperReport
to:
net.sf.jasperreports.engine.JasperReport
Wypełnienie raportu
20
Jeśli skompilowany raport jest w pliku najpierw należy go załadować:
Klasa:
net.sf.jasperreports.engine.util.JRLoader
. Przykład:
JasperReport jr = (JasperReport)
JRLoader.loadObject("bestseller.jasper");
Wypełnienie raportu:
JasperPrint jp = JasperFillManager.fillReport(jr, map, con);
map
– mapa parametrów (
java.util.Map
),
con
– połączenie z bazą danych (
java.sql.Connection
).
Wyświetlenie raportu
21
Wypełniony raport (
net.sf.jasperreports.engine.JasperPrint
) można
wyświetlić:
JasperViewer.viewReport(jp, false);
lub wyeksportować, np:
net.sf.jasperreports.engine.JasperExportManager.
exportReportToPdfFile(jp, "bestseller.pdf");
Narzędzia współpracujące z JasperReports
22
Istnieje wiele narzędzi służących do graficznego projektowania raportów zgodnych z
JasperReports http://jasperreports.sourceforge.net/gui.tools.html. Najintensywniej
rozwijane to:
●
iReport (http://ireport.sourceforge.net) – graficzny interfejs do JasperReports
●
JasperAssistant (http://www.jasperassistant.com) – plugin do Eclipse (komercyjny)
iReport
23
Podsumowanie
24
JasperReports to intensywnie rozwijane narzędzie służące do tworzenia raportów.
Korzystanie z niego ułatwia wiele narzędzi wspomagających graficzne
projektowanie raportów.