Implementacja modułu raportowania systemu
Transkrypt
Implementacja modułu raportowania systemu
Państwowa Wyższa Szkoła Zawodowa w Tarnowie Instytut Politechniczny Kierunek: INFORMATYKA Specjalność: Informatyka stosowana Specjalizacja: Informatyka w telekomunikacji Sławomir Węc PRACA INŻYNIERSKA Implementacja modułu raportowania systemu ornitologicznego Opiekun pracy: dr inż. Robert Wielgat Tarnów, 2011 Praca inżynierska – Węc S. W tym miejscu pragnę gorąco podziękować Panu dr inż. Robertowi Wielgatowi, opiekunowi mojej pracy oraz mgr inż. Tomaszowi Potempie za życzliwość i udzieloną pomoc. Wskazówki, cenne rady, które przyczyniły się do powstania ostatecznej wersji niniejszej pracy. 1 Implementacja modułu raportowania systemu ornitologicznego Spis treści 1 Wstęp .............................................................................................................................4 1.1 2 Cel ...........................................................................................................................5 Narzędzia i technologie...................................................................................................6 2.1 JavaServer Pages....................................................................................................6 2.2 Java .........................................................................................................................7 2.3 JasperReports.........................................................................................................8 2.3.1 JasperServer ......................................................................................................9 2.3.2 iReport ..............................................................................................................9 2.4 Structured Query Language ................................................................................13 3 2.5 Środowisko IDE....................................................................................................14 2.6 Serwer WWW.......................................................................................................15 2.6.1 Serwer Apache ................................................................................................15 2.6.2 Konfiguracja ...................................................................................................16 Baza Danych.................................................................................................................18 3.1 PostgreSQL...........................................................................................................18 3.1.1 Zalety systemu PostgreSQL.............................................................................19 3.2 Narzędzia do współpracy z bazą ..........................................................................19 3.3 4 5 Schemat bazy danych ...........................................................................................19 Dane raportów ..............................................................................................................21 4.1 Przykładowe formularze MTO............................................................................21 4.2 Raport o współpracownikach: .............................................................................26 4.3 Raport obserwacji: ...............................................................................................27 Opis stworzonego interfejsu..........................................................................................29 5.1 Interfejs użytkownika...........................................................................................29 5.1.1 Struktura katalogów ........................................................................................30 5.2 Opis wybranych fragmentów kodu......................................................................32 6 7 5.2.1 Widok .............................................................................................................32 5.2.2 Pobieranie parametrów z formularza. ..............................................................34 5.2.3 Połączenie z bazą danych. ...............................................................................35 5.2.4 Zapisywanie raportu w formie pliku PDF ........................................................36 Raporty.........................................................................................................................38 6.1 Szablony................................................................................................................39 6.2 Zapytania SQL .....................................................................................................42 Format XML.................................................................................................................44 7.1 Struktura dokumentu XML.................................................................................45 7.2 Parametry .............................................................................................................46 7.3 Zapytanie SQL .....................................................................................................46 7.4 Pola........................................................................................................................46 2 Praca inżynierska – Węc S. 7.5 Zmienne ................................................................................................................46 7.6 Podraport..............................................................................................................47 8 Podsumowanie..............................................................................................................48 9 Bibliografia...................................................................................................................49 3 Implementacja modułu raportowania systemu ornitologicznego 1 Wstęp Ochrona środowiska naturalnego ma coraz większe znaczenie dla człowieka. Bardzo ważnym składnikiem otaczającego nas środowiska są ptaki. Człowiek z pewnością ma prawo do korzystania z bogactw przyrody, ale coraz częściej są one nadmiernie eksploatowane, co degraduje środowisko, a tym samym podstawy życia samego człowieka. Wiele jest sposobów na zahamowanie procesów wyniszczających naszą przyrodę. Jedną z nich jest na pewno ocena różnorodności biologicznej środowiska. Badanie naturalnych i wywołanych przez człowieka zmian zróżnicowania genetycznego, gatunkowego, a także zróżnicowania siedlisk oraz ekologicznych konsekwencji tych zmian pomagają w ochronie rzadkich i zanikających gatunków zwierząt, w szczególności ptaków. Ptaki zawsze znaczyły bardzo wiele dla człowieka, w swych początkach były dla niego źródłem pokarmu, a niektóre gatunki do dziś są nieodzowne w naszej gospodarce. W chwili obecnej jednak większość gatunków pełni rolę obiektów badań naukowych dla człowieka. Dzięki tym zwierzętom możemy łatwo zaobserwować niekorzystne zmiany w środowisku zarówno fauny jak i flory, poprzez określanie ich liczebności na danym obszarze. Wiele gatunków już wyginęło lub są na skraju wyginięcia, do czego doprowadził rozwój cywilizacyjny człowieka. Dlatego też stworzono Czerwoną Księgę, w której znajdują sie wszystkie zagrożone gatunki. Została ona opracowana przez Międzynarodową Unię Ochrony Przyrody i Jej Zasobów (IUCNInternational Union for Conserwation of Nature and Natural Resources). Tak więc, obserwacje ornitologiczne pozwalają określić stan degradacji środowiska. Wpływ pojedynczych osób na ochronę ptaków jest nie wielki, gdyż przeważnie kończy sie na zimowym ich dokarmianiu i wywieszaniu skrzynek lęgowych. Większe możliwości mają organizacje społeczne jaką jest Małopolskie Towarzystwo Ornitologiczne (MTO), które zrzeszają ornitologów amatorów jak i osoby które zajmują sie tym zawodowo oraz grupy pasjonatów i miłośników ptaków. Wszelkie obserwacje, badania i informacje członkowie MTO zamieszczają na papierowych formularzach, co jest bardzo czasochłonne i trudne do analizy. Dlatego też powstał innowacyjny pomysł, aby w sposób elektroniczny uzupełnić zbieranie i magazynowanie danych, a także w późniejszym czasie całkowicie zastąpić rejestrację danych na papierowych formularzach. Przedmiotem projektu jest stworzenie modułu systemu 4 Praca inżynierska – Węc S. raportowania, którego implementacje oparto na funkcjonalności bazy danych jak i formularzy MTO. W pracy wykorzystano wybrane przykłady raportów i formularzy. 1.1 Cel Głównym celem tego projektu jest stworzenie sytemu raportowania, do którego dostęp będą mieli nie tylko zawodowi ornitolodzy, ale wszyscy członkowie MTO. Ponadto raporty są doskonałym sposobem na kontrolowanie własnej pracy przez ornitologów na rzecz Towarzystwa, poprzez możliwość sprawdzenia i wydrukowania dokonanych przez siebie obserwacji oraz możliwość znalezienia jakiejkolwiek nieścisłości w prowadzonych danych. Innym, równie ważnym celem powstania tego projektu jest usprawnienie pracy pracownikom MTO, zwłaszcza przy wyszukiwaniu potrzebnych danych w bazie czy nawet przy organizacji wielu akcji obserwacyjnych. 5 Implementacja modułu raportowania systemu ornitologicznego 2 Narzędzia i technologie 2.1 JavaServer Pages JSP (ang. JavaServer Pages) to technologia umożliwiająca projektowanie dynamicznych stron WWW. Technologia ta została dodana do narzędzi z grupy Java Enterprise Edition pod koniec 1999 roku. W JSP strony są tworzone w formatach HTML, XHTML, DHTML oraz XML z wykorzystaniem języka Java, wplecionego w kod HTML danej strony. Strona JSP w procesie translacji zostaje zamieniona na serwlet. Każdorazowe wywołanie w przeglądarce strony JSP jest wykonywane przez skompilowany serwlet. Stosując prekompilację (kompilacje wstępną) już podczas startu aplikacji wszystkie strony JSP zostaną przetłumaczone na serwlety. Rys.1. Proces wykonywania pliku JSP. Tłumaczenie (b) następuje jeśli plik JSP (a) jest nowy lub dokonaliśmy zmian, jeśli nie to tłumaczenie jest pomijane . 6 Praca inżynierska – Węc S. W JSP rozróżnia się następujące elementy: treść statyczna - czyli czysty kod HTML, jest on przepisywany bez zmian do generowanego dokumentu dyrektywy JSP – informacje, które nadzorują proces generowania dokumentu skryplety - kod w języku Java, który jest odpowiedzialny za proces generowania dokumentu akcje JSP - tagi XML wywołujące określone metody na serwerze. 2.2 Java Java jest obiektowym językiem programowania. Napisane w tym języku programy mogą być uruchamiane na komputerach z różnymi systemami operacyjnymi, jak również na telefonach komórkowych oraz w aplikacjach internetowych. Warunkiem jest instalacja Wirtualnej maszyny Javy w danym środowisku. Przenośność to właśnie jedna z charakterystycznych cech języka Java. Java została stworzona przez grupę roboczą pod kierunkiem Jamesa Goslinga z firmy Sun Microsystems. Programy źródłowe napisane w języku Java są następnie kompilowane do postaci wykonywanej przez maszynę wirtualną, czyli kodu bajtowego. Podstawowe pomysły zostały zaczerpnięte z języka Smalltalk, jak na przykład zwalnianie zajętej pamięci oraz maszyna wirtualna. Natomiast duża część składni i słów kluczowych została zapożyczona z języka C i C++. Java często jest mylona z językiem JavaScript, a jedyną cechą, która je łączy jest składnia podstawowych instrukcji. Najważniejsze założenia języka Java to : Obiektowość Javy W przeciwieństwie do języka C++, Java jest silnie ukierunkowana na obiektowość. Wszelkie dane i akcje na nich podejmowane są pogrupowane w klasy obiektów. O obiekcie można myśleć jako o samoistnej części programu, która może przyjmować określone stany i ma określone zachowania, które mogą zmieniać te stany bądź przesyłać dane do innych obiektów. Wyjątkiem od całkowitej obiektowości są typy proste (int, float itp.). 7 Implementacja modułu raportowania systemu ornitologicznego Niezależność od architektury Tą niezależność Java uzyskuje poprzez to, iż kod źródłowy napisany przez programistę w Javie zostaje następnie skompilowany do neutralnych pod względem architektury formatu plików obiektowych. Skompilowany kod może być wykonywany niezależnie od systemu operacyjnego i procesora. Kompilator Javy potrafi to uczynić ponieważ generuje zestaw instrukcji, które nie mają nic wspólnego z konkretną architekturą komputera. Instrukcje są natomiast zaprojektowane w ten sposób, aby były łatwe do zinterpretowania na każdej maszynie i aby można było przełożyć je na język maszynowy w czasie rzeczywistym. Jednak z uwagi na to, że kod pośredni jest interpretowany, taki program jest wolniejszy niż kompilowany bezpośrednio do kodu maszynowego. Z tego względu maszynę wirtualną często uzupełnia się o kompilator Just-in-Time. Istnieją również niezależne od Suna kompilatory Javy czyli GNU Compiler Collection o nazwie GCJ. W rezultacie powstaje szybszy kod, ale można go uruchamiać na jednej tylko platformie, a więc nie jest przenośny. 2.3 JasperReports JasperReports jest to narzędzie raportujące Javy typu open source (otwarte oprogramowanie), które umożliwia wyświetlenie na ekranie, drukowanie raportu lub jego eksportowanie do różnych dokumentów w formatach takich jak: HTML, PDF, Excel, Word czy OpenOffice. Ma możliwość zastosowania w aplikacjach Java, w tym Java EE lub aplikacjach sieci Web, do generowania dynamicznej zawartości. Odczytuje także instrukcje z pliku XML lub Jaspis. JasperReports to biblioteka klas Javy, która może zostać wbudowana w dowolną aplikację Java, ponieważ jest realizowana w 100% w kodzie Javy, aby bez problemu można ją było umieścić w aplikacji. Dzięki standardom definicja raportu w XML pozwala użytkownikom na tworzenie raportów o dowolnej długości i złożoności. 8 Praca inżynierska – Węc S. Najważniejsze z funkcji JasperReports to: Możliwość eksportowania raportów do różnorodnych formatów. Korzystanie z wielu źródeł danych takich jak: JDBC, CALS Table Models, JavaBeans, EJBQL, XML, Hibernate. Skrypty napisane w Javie mogą towarzyszyć w definicji raportu. Możliwość generowania podraportów. Elastyczny układ raportu. Możliwość generowania znaków wodnych. 2.3.1 JasperServer JasperServer jest systemem opartym o technologię JEE, to także platforma dla raportów oraz analiz OLAP. Pozwala tworzyć raporty ad hoc (tylko dla wersji Professional), a także uruchamiać zarówno raporty statyczne jak i interaktywne analizy OAP. Przy jej pomocy administrator może także nimi zarządzać. Na serwerze użytkownik może stworzyć nowy raport ad hoc. Użytkownicy nie muszą wnikać w sposoby opisu połączeń do bazy danych, ponieważ konfiguracja dostępu do danych dla tych raportów jest wcześniej przygotowana i udostępniona przez administratorów. Tworząc nowy raport wybieramy opcję „Utwórz raport”, a następnie z listy zapisanych tematów lub dziedzin wybieramy odpowiadające dla naszego raportu pozycje i wskazujemy typ raportu. Przed przystąpieniem do projektowania można także podać parametry. Tworzenie raportu jest bardzo proste polega na przeciąganiu list i pól na obszar raportu, przy czym na obszarze tym pola same dostosowują się do siebie tak, aby jak najbardziej ułatwić to użytkownikowi. Wyświetlane są także od razu po przeciągnięciu dane w tych polach. Z poziomu serwera JasperServer można także publikować zwykłe raporty, zapisane w stosowanym przez JasperReports formacie JRXML. Mogą to być szablony utworzone ręcznie w edytorze XML, za pomocą narzędzia iReport, czy też innego lecz publikować je może tylko administrator. 2.3.2 iReport Kluczowym punktem w interfejsie JasperReports jest iReport, jest to program do projektowania raportów, który daje użytkownikowi całkowitą kontrolę nad treścią jak i 9 Implementacja modułu raportowania systemu ornitologicznego również nad wyglądem każdego raportu. Pliki stworzone przez iReport zawierają wszystkie potrzebne informacje konfiguracyjne oraz takie jak na przykład zapytania SQL, które służą do przejęcia danych oraz określenia parametrów wejściowych. Pliki Jasper maja możliwość włączenia ich do aplikacji Java przy użyciu JasperReports API i w ten sposób łączyć się ze źródłem danych i generować raporty, a jeśli jest potrzeba pobierać parametry wejściowe, które mogą posłużyć na przykład do filtrowania rekordów w bazie. Następnie raport można wyeksportować do każdego obsługiwanego formatu (np. PDF). Wszystkie te operacje można bezpośrednio wykonać w iReport. Przy projektowaniu bardziej złożonych raportów iReport jest nieodzowny. Tworzy on w sposób wizualny definicje JRXML, potrafi też sprawdzić czy ta definicja jest bez błędów obsługiwana przez bibliotekę JasperReport oraz uruchomić raport. iReport posiada kreator, którym szybko utworzymy szablon raportu, co jest dość przydatne i pozwala na szybsze przejście wstępnych czasochłonnych kroków, a także wybór określonego stylu. Można też tworzyć ręcznie szablon od zera. Rys.2. Okno główne iReport. 10 Praca inżynierska – Węc S. Służy do tego ekran, na którym mamy do dyspozycji: Główną płaszczyznę szablonu, podzieloną na poziome sekcje (bands) odpowiadające częściom raportu o różnej powtarzalności: o „title” - jej zawartość jest drukowana tylko raz na początku raportu o „pageHeader” – jej zawartość pojawia się na każdej stronie o columnHeader” – sekcja pojawia się na każdej stronie pod nagłówkiem strony (nagłówek kolumn) o “detail” – sekcja ta pojawia się tyle razy, ile wyników zwróciło zapytanie SQL o “columnFooter” –stopka kolumny pojawia się pod kolumną na każdej stronie tuż pod sekcją “detail” o “pageFooter” – stopka strony pojawia się na każdej stronie na samym jej dole o “lastPageFooter” - sekcja stopki ostatniej strony raportu (jeśli ta sekcja ma wysokość większą niż zero, to zastępuje sekcje „pageFooter” na ostatniej stronie raportu) o “summary” - sekcja podsumowania umieszczona jest na końcu raportu pod ostatnim wierszem w sekcji „detail” i przed „columnFooter” i „pageFooter”. Taki podział występuje w wielu narzędziach do projektowania szablonów i wydaje się trywialny, lecz do bardziej skomplikowanych szablonów można zawsze umieścić na układzie jeden lub więcej podraportów i to znacznie zwiększa jego możliwości. Podraporty umożliwiają pobieranie danych z innych tabel. Tworzy się je w taki sam sposób jak zwykły raport. Po utworzeniu podraportu podłączamy go do głównego raportu. W tym celu należy z głównego menu wybrać narzędzie podraport i w taki sam sposób jak wszystkie inne pola umieścić podraport na głównym raporcie. Następnie w kreatorze wpisuje się zapytanie SQL dla naszego podraportu i wybieramy pola, które znajdą się w naszym podraporcie. Później jest wybierana ścieżka dla pliku naszego podraportu: czy ma być ona podana przez parametr i może być wtedy zapisany dowolnie na dysku, czy też bardziej statycznie w tym samym folderze co główny raport. W oknie właściwości dostępne są poza zakładkami Common i All jeszcze dwie Subreport i Subreport (Other). W zakładce Subreport w polu „Connection Data /Source Expression” należy wybrać „użyj połączenia” i poniżej w 11 Implementacja modułu raportowania systemu ornitologicznego pole wpisać $P{REPORT_CONNECTION}. Zakładka „Subreport Parameters” na zakładce Subreport (Other) służy do przekazania parametrów zmiennych i wartości pól pobranych z bazy do podraportu. Aby dodać przekazywanie nowej wartości należy kliknąć nowy i w pojawiające się okno wpisać nazwę parametru w podraporcie (w utworzonym podraporcie musi znajdować się parametr o takiej samej nazwie) i wyrażenie określające przekazywaną wartość. W zależności od tego w jakiej sekcji umieścimy podraport pojawi się on jeden lub więcej razy. Jeśli zostanie umieszczony w sekcji „detail” to przy każdym zwracanym wierszu z głównego zapytania zostaną przekazane do podraportu aktualne zmienne i zostanie wygenerowany nowy podraport i umieszczony na głównym raporcie. Podobnie będzie miało miejsce z podraportem umieszczonym w nagłówku lub stopce grupy(jeśli grupa będzie się zmieniała). Dla pozostałych sekcji podraport wykona się tylko raz i raz zostanie wyświetlony. Plik z podraportem powinien być umieszczony w katalogu głównym programu iReport lub powinna być podana do niego pełna ścieżka dostępu w parametrze. Okno pokazujące aktualnie otwarte pliki szablonów. iReport pozwala pracować z wieloma szablonami jednocześnie. Okno struktury dokumentu. Pokazuje ono strukturę w postaci drzewa, w podziale na poszczególne sekcje. Są to wszystkie parametry, pola danych, zmienne i elementy układu szablonu. Oczywiście jak można się tego spodziewać, po zaznaczeniu elementu w drzewie struktury, zostaje on jednocześnie zaznaczony na układzie. Niestety nie da się przeciągać elementów w ramach samego drzewa, co, choć niesie ze sobą różne problemy do rozstrzygnięcia, jest dość naturalne i byłoby wygodne. Paletę właściwości zaznaczonego obiektu. Okno bibliotek zawierające stosowane najczęściej wyrażenia, takie jak liczba stron, czy aktualna data. Na samej górze ekranu, pod menu, znajdują się paski narzędzi, które ułatwiają formatowanie elementów układu. Wybierać można spośród wszystkich możliwości dosuwania, centrowania, dostosowywania rozmiaru, zmiany odstępów pomiędzy poszczególnymi polami. Dzięki temu nie traci się czasu na próby osiągnięcia dostatecznej precyzji ruchów myszy, a na koniec, na żmudne kopiowanie wartości współrzędnych w oknie właściwości. W iReport działają również takie standardowe funkcje jak wybór wielu 12 Praca inżynierska – Węc S. elementów poprzez zaznaczenie myszą całego obszaru, przesuwanie elementów przy pomocy kursorów. iReport jest bardzo zintegrowany z Javą, gdyż dla każdego pola danych, nawet wtedy, gdy źródłem jest zapytanie SQL, musi zostać określona klasa tego pola, parametru czy zmiennej. Oczywiście same źródła danych i zapytanie mogą być także definiowane poprzez kod Javy i to na wiele sposobów. Dla samych tylko źródeł bazodanowych JDBC oprócz SQL można zdecydować się na HQL (język zapytań używany w Hibernate) i EJBQL. Źródłami danych mogą być też JavaBeans, Hibernate, Hibernate wraz ze Spring, własny interfejs JRDataSourceProvider i inne. Konieczność użycia kodu Javy, może doprowadzić w projektach do braku separacji warstwy generowania raportów dla danego systemu od samego kodu tego systemu. Konieczność częstej pracy z kodem może prowadzić też do wniosku, że tak naprawdę używanie takiego narzędzia jak iReport wcale nie jest wygodne, bo oznacza pracę w dwóch środowiskach: IDE Javy i iReport. Niezależnie od rozważań na temat separacji raportowania w aplikacji, należy uznać, że iReport jest narzędziem zapewniającym wszystko, co niezbędne do stworzenia szablonu raportu, a w dodatku stabilnym i nie stwarzającym problemów. 2.4 Structured Query Language SQL (ang. Structured Query Language) jest strukturalnym językiem zapytań używanym do tworzenia, modyfikowania baz danych oraz do umieszczania i pobierania informacji z bazy. Język SQL jest językiem deklaratywnym. Decyzję o sposobie przechowywania i pobrania danych pozostawia się systemowi zarządzania bazą danych (DBMS). SQL został standardem w komunikacji z serwerami relacyjnych baz danych. Język ten stał się bardzo popularny we współczesnych systemach relacyjnych baz danych, a powstał on w IBM w latach 70. Z technicznego punktu widzenia SQL jest podjęzykiem danych, gdyż nie może służyć do tworzenia kompletnych programów a jedynie do komunikowania się z bazą danych. Wyróżnia się trzy formy SQL : Interakcyjny - służy do bezpośredniego pobierania lub wprowadzania danych do bazy. 13 Implementacja modułu raportowania systemu ornitologicznego Statyczny - pisany jest razem z aplikacją w której jest używany podczas jej działania i nie ulega zmianom. Dynamiczny - generowany jest w trakcie działania aplikacji, jeśli wcześniej nie było możliwości określenia treści potrzebnych zapytań. Używanie SQL polega na zadawaniu pytań do bazy danych. Wyróżnia się trzy główne podzbiory zapytań : DML (język manipulacji danymi) - służy do wykonywania operacji na danych DDL (język definicji danych) - służy do operowania na strukturach bazy DCL (język kontroli nad danymi) - służy do nadawania uprawnień bazodanowych W SQL zdarzają się sytuacje nadużyć w przypadku tworzenia zapytań z wykorzystaniem parametrów pochodzących z zewnątrz aplikacji, ponieważ jest to język interpretowany. Dlatego zadaniem autora aplikacji jest też zadbanie o sprawdzanie poprawności, czyli walidację danych wejściowych stanowiących część zapytania, gdyż ktoś może być w stanie dopisać do zapytania jakieś komendy. 2.5 Środowisko IDE IDE, czyli zintegrowane środowisko programistyczne, którego głównym celem jest przyśpieszenie budowy aplikacji. Najczęściej wykorzystywanymi aplikacjami tego typu są NetBeans firmy Sun i Eclipse firmy IBM. Obydwie aplikacje pierwotnie powstały dla języka Java, ale z biegiem czasu dodano wsparcie dla innych języków w tym PHP. Eclipse ma wiele pożytecznych cech, ale odznacza się także powolnym działaniem. NetBeans ma możliwość doinstalowania wtyczki iReport i to właśnie ten system posłużył do stworzenia aplikacji. NetBeans jest projektem typu "open source" o coraz większej popularności i stale wzrastającej społeczności użytkowników. O wielkim sukcesie NetBeans świadczy fakt, że z projektem tym współpracuje już prawie 100 firm na całym świecie. Projekt NetBeans został uruchomiony w czerwcu 2000 roku przez firmę Sun Microsystems będącą od tej pory głównym jego sponsorem. 14 Praca inżynierska – Węc S. Na Rys.3. Widok okna głównego IDE NetBeans. 2.6 Serwer WWW Serwerem obsługującym aplikacje jest Apache. Jest to najpopularniejszy i zarazem darmowy system dostępny dla wielu systemów operacyjnych (m.in. UNIX, GNU/Linux, BSD, Mac OS X, Microsoft Windows). 2.6.1 Serwer Apache Apache jest najszerzej stosowanym serwerem HTTP w Internecie. W maju 2006 jego udział wśród serwerów wynosił prawie 65%. W połączeniu z interpreterem języka skryptowego PHP i bazą danych MySQL, Apache stanowi jedno z najczęściej spotykanych środowisk w firmach oferujących miejsce na serwerach sieciowych. Najważniejsze cechy serwera i obsługiwane moduły wielowątkowość skalowalność bezpieczeństwo 15 Implementacja modułu raportowania systemu ornitologicznego kontrola dostępu/uwierzytelnianie: mod_access CGI proxy typu HTTP, FTP, CONNECT: mod_proxy* SSI: mod_include Content-Negotation: mod_negotation moduł URL-Rewriting: mod_rewrite SSL: mod_ssl możliwość osadzania interpreterów języków skryptowych, np. mod perl, mod_php czy mod_python 2.6.2 Konfiguracja Najnowsze wersje serwera Apache posiadają interfejs graficzny GUI. Program Apache parsuje plik konfiguracyjny httpd.conf (oraz inne zdefiniowane przez użytkownika, bądź sam program). Plik konfiguracyjny dystrybucji Apache z serii 2.0 zawiera sekcje: Global Environment środowisko serwera podstawowe parametry sieciowe lista dołączanych modułów 'Main' server configuration położenie dokumentów połączenie aliasy określenie dostępu do zasobów formaty i położenie dzienników serwera moduły CGI opcje automatycznego indeksowania katalogów Content Negotation (ang. negocjacja treści) własne dokumenty błędów serwera (dyrektywy ErrorDocument) konfiguracja modułu mod_proxy 16 Praca inżynierska – Węc S. Virtual Hosts odwrotny DNS lista i konfiguracja ewentualnych hostów wirtualnych obsługiwanych przez maszynę Niektóre większe moduły (np. mod_SSL) mogą posiadać własne sekcje w pliku httpd.conf bądź oddzielny plik dla własnych ustawień. Aby zmiany dokonane w plikach konfiguracyjnych zostały uwzględnione, konieczne jest zrestartowanie procesu serwera. 17 Implementacja modułu raportowania systemu ornitologicznego 3 Baza Danych Baza danych na potrzeby MTO została stworzona przez studentów poprzednich roczników. Została ona stworzona w PostgreSQL, wybór tego sytemu bazodanowego miał na celu jak największą zgodność ze standardem SQL oraz zachowaniu niskich wymagań sprzętowych. 3.1 PostgreSQL Rys.4. Logo PostgreSQL PostgreSQL jest jednym z czołowych darmowych systemów zarządzania relacyjnymi bazami danych. Jedna z mocnych stron systemu PostgreSQL wywodzi się z jego architektury. Tak jak komercyjne bazy danych, PostgreSQL można wykorzystywać w środowisku klientserwer. Ma to wiele zalet zarówno z punktu widzenia użytkowników, jak i programistów. Sercem instalacji PostgreSQL jest proces serwera bazy danych. Aplikacje, które chcą uzyskać dostęp do danych przechowywanych w bazie, muszą wykonać operacje poprzez proces bazy danych. Nie mają one możliwości uzyskania dostępu do danych bezpośrednio, nawet jeżeli działają na tym samym komputerze, co proces serwera. To rozdzielenie pomiędzy klientem a serwerem pozwala na dystrybucję aplikacji. Do oddzielenia klientów od serwerów można wykorzystać sieć i opracować aplikację-klienta w środowisku, które odpowiada użytkownikom. Na przykład można zaimplementować bazę danych w systemie UNIX i stworzyć program-klienta, który działa w środowisku Miscrosoft Windows. 18 Praca inżynierska – Węc S. 3.1.1 Zalety systemu PostgreSQL Do ogromnych zalet tego systemu należą: Obsługa wielu typów indeksów Mechanizm wyzwalaczy przyłączanych do tabel lub do widoku. Mechanizm MVCC zarządzający transakcjami Możliwość pisania funkcji w różnych językach programowania Widoki modyfikujące realizowane za pomocą reguł Możliwość wykorzystania rzadko spotykanych typów danych Możliwość tworzenia większości obiektów bazodanowych m.in.: indeksy, agregaty 3.2 Narzędzia do współpracy z bazą Programy, używane do współpracy z bazą danych w projekcie to : pgAdmin phpPgAdmin - administracja za pomocą przeglądarki internetowej Toad Data Modeler - projekt bazy danych, pozwala użytkownikom narzędzia do wizualnego przeglądania bazy. Baza danych, z której generujemy raporty, została stworzona na podstawie przeanalizowania formularzy MTO tak samo jak raporty. Baza danych jest bardzo złożona, gdyż ma dostarczać bardzo szczegółowych danych i dlatego mamy 111 tabel połączonymi 141 relacjami. 3.3 Schemat bazy danych Widok schematu całej bazy z programu Toad Data Modeler: 19 Implementacja modułu raportowania systemu ornitologicznego 20 Praca inżynierska – Węc S. 4 Dane raportów Specyfikacja wymagań została oparta na formularzach używanych przez MTO. Raporty zostały zbudowane po przeanalizowaniu odpowiednich pól w prezentowanych formularzach. Najważniejszymi formularzami były zestawienia obserwacji, na których notuje się listy stwierdzonych gatunków z podaniem odpowiedniej kategorii i rangi oraz lokalizacji. 4.1 Przykładowe formularze MTO Rys.5. Zestawienie obserwacji sezon jesienno – zimowy str.1 21 Implementacja modułu raportowania systemu ornitologicznego Rys.6. Zestawienie obserwacji sezon jesienno – zimowy str.2 22 Praca inżynierska – Węc S. Rys.7. Karta współpracownika. 23 Implementacja modułu raportowania systemu ornitologicznego Rys.8. Zestawienie obserwacji sezon wiosenno-letni str.1 24 Praca inżynierska – Węc S. Rys.9. Zestawienie obserwacji sezon wiosenno – letni str.2 25 Implementacja modułu raportowania systemu ornitologicznego Moduł raportowania w aplikacji będzie pobierał parametry z formularza stosownie do generowanego raportu, który zostanie utworzony w formacie pliku PDF. Dzięki takiej wyszukiwarce użytkownik będzie mógł skonkretyzować jakich danych szuka. Przykładowe parametry, dzięki którym wyszukiwarka będzie uściślała obszar danych dla konkretnego raportu jak i dane jakie maja być wyświetlane w tychże raportach są następujące: 4.2 Raport o współpracownikach: Wyszukiwarka: Województwo; Gmina; Nazwisko; Imię; Rok urodzenia; Miejscowość; Data przystąpienia do MTO; Data rezygnacji z członkowstwa w MTO; Płeć; Zawartość raportu: Nazwisko; Imię; Datę urodzenia; Datę rejestracji w projekcie; Datę rezygnacji w projekcie; Adres: o Województwo; o Powiat; o Gmina; o Ulica; o Numer domu; o Kod pocztowy; 26 Praca inżynierska – Węc S. Dane kontaktowe: o Numer telefonu; o Strona WWW; o E-mail; Skąd się dowiedział/a o działalności MTO; Model posiadanej lornetki; Powiększenie lornetki Zawód wyuczony; Zawód wykonywany; 4.3 Raport obserwacji: Wyszukiwarka: Data rozpoczęcia ekspedycji; Data zakończenia ekspedycji; Województwo; Gmina; Typ siedliska; Gatunek; Zawartość raportu: Województwo; Numer jednostki fizjograficznej; Rok; Numer powierzchni atlasowej; Nazwisko obserwatora; Imię obserwatora; Data rozpoczęcia wyprawy; Data zakończenia wyprawy; Godzina rozpoczęcia wyprawy; Godzina zakończenia wyprawy; Obserwowany gatunek; 27 Implementacja modułu raportowania systemu ornitologicznego Ranga obserwacji; Kategorie obserwacji; Czas i datę rozpoczęcia obserwacji; Czas i datę zakończenia obserwacji; Typ siedliska; Nazwa miejsca obserwacji; Koordynaty GPS miejsca obserwacji; 28 Praca inżynierska – Węc S. 5 Opis stworzonego interfejsu 5.1 Interfejs użytkownika Implementacji interfejsu użytkownika dokonano w technologii JSP i Java. Model stron został napisany w języku Java, a następnie dzięki serwletowi, który jest sercem aplikacji zostaje wyświetlony według widoku zapisanym w pliku JSP. Rys.10. Przykładowy widok. Wyszukiwanie współpracowników MTO Moduł przeglądarki raportowania internetowej, stąd jest brak aplikacją obsługiwaną konieczności z poziomu instalowania zwykłej odpowiedniego 29 Implementacja modułu raportowania systemu ornitologicznego oprogramowania. Dzięki takiemu rozwiązaniu jest możliwość podglądu informacji zawartych w bazie o każdej porze. Na Rys.11 mamy zaprezentowany kolejny formularz pomagający użytkownikowi w wygenerowaniu raportu zawierającego dane, które go interesują, poprzez zawężenie ilości danych zwracanych przez raport. Rys.11. Widok formularza raportu obserwacji. 5.1.1 Struktura katalogów Struktura plików jest uzależniona od środowiska IDE. Dzieli się ona na: Web Pages – w tym katalogu znajduje się wszystkie pliki dotyczące widoku stron Images – katalog, w którym znajdują się obrazy aplikacji META – INF – przechowuje pliki konfiguracyjne 30 Praca inżynierska – Węc S. WEB –INF – przechowuje pliki jsp Css –katalog zawierający style raport.jsp – plik startowy aplikacji Source Packages –katalog zawiera klasy aplikacji w odpowiednich pakietach, co ułatwia ich importowanie Inne – pakiet zawierający takie klasy jak np. connect, MojRaport Modele – w tym pakiecie znajdują się modele stron Serwety – pakiet dla serwletów Libraries – katalog z własnymi bibliotekami wykorzystywanymi w aplikacji Configuration Files – katalog zawierający wszytkie pliki konfiguracyjne Rys.12. Struktura plików w Netbeans. 31 Implementacja modułu raportowania systemu ornitologicznego 5.2 Opis wybranych fragmentów kodu 5.2.1 Widok Kodu opisujący sposób wyświetlania modelu strony w jsp. <%@page contentType="text/html" pageEncoding="Iso-8859-2"%> <%@ page import="inne.*" %> <%@ page import="modele.M_Raport.*" %> <%@ page import="java.util.*" %> <jsp:useBean id="obsRaport" class="modele.M_Raport" scope="request"/> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Iso-8859-2"> <link rel="stylesheet" href="css/style.css" type="text/css" /> <title>Raporty</title> </head> <body> <div id="container"> <% List<String> listaParam = obsRaport.pobierzRaport(); Iterator<String> it = listaParam.iterator(); String domyslna = "raport_" + String.valueOf(obsRaport.getNrRaport()); String nazwa; %> <center> <img src="Images/logo.JPG" alt="ban"/> <h2>Wybierz raport jaki chcesz wygenerowac:</h2> <form action="raport" method="get" enctype="text/plain;charset=iso-8859-2"> <%for (int i = 0, nr = 1; i < obsRaport.rozmiar(); i++, nr++) {%> <h4> <input type="radio" name="nazwa" onclick="this.form.submit()" value="<%=nr%>" <%= obsRaport.zaznaczony(i)%> /><%=obsRaport.pobierzNazwe(i)%> </h4> <%}%> </form> <br><br> 32 Praca inżynierska – Węc S. <form action="raport" method="post" enctype="text/plain;charset=iso-8859-2"> <TABLE cellSpacing="0" cellPadding="0" border="2" bgcolor="#F2EBDF" > <TR height="40" bgcolor="red"> <TH colspan="2" ><h4><%=obsRaport.pobierzNazwe()%></h4></TH> </TR> <% int i = 0; while (it.hasNext()) { nazwa = it.next(); if (obsRaport.data(i++)) { %> <TR> <TD width="150"><%=nazwa%></TD> <TD> <select id="<%=nazwa + "_dzien"%>" name="<%=nazwa + "_dzien"%>"> <%=obsRaport.generujHtmlDzien()%> </select> <select id="<%=nazwa + "_miesiac"%>" name="<%=nazwa + "_miesiac"%>"> <%=obsRaport.generujHtmlMisiac()%> </select> <select id="<%=nazwa + "_rok"%>" name="<%=nazwa + "_rok"%>"> <%=obsRaport.generujHtmlRok()%> </select> </TD> </TR <%} else {%> <TR> <TD width="100"><%=nazwa%></TD> <TD ><INPUT type="text" name="<%=nazwa%>" value="" /> </TD> </TR> <%} }%> <TR> <TD >Nazwa Pliku:</TD> <TD ><INPUT type="text" name="nazwaPliku" value="<%=domyslna%>"/> </TD> </TR> <TR height="25" bgcolor="#B89F7D"> 33 Implementacja modułu raportowania systemu ornitologicznego <TD colspan="3" ><center><INPUT type="submit" value="Pobierz"></center></TD> </TR> </TABLE> <INPUT type="hidden" name="raport" value="<%=obsRaport.szablon()%>" /> </form> </center> </div> </body> </html> 5.2.2 Pobieranie parametrów z formularza. Fragment kodu odpowiedzialny za pobranie parametrów z formularza metodą doPost oraz zamiana wartości parametru jeśli jest null. @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("Iso-8859-2"); HashMap parametry = new HashMap(); Enumeration names = request.getParameterNames(); parametry.put("nazwa","%"); M_Raport rap = (M_Raport)request.getAttribute("obsRaport"); HashMap rok_ur_od = new HashMap(); HashMap rok_ur_do = new HashMap(); HashMap data_czl_od = new HashMap(); HashMap data_czl_do= new HashMap(); HashMap start_ek = new HashMap(); HashMap end_ek = new HashMap(); while (names.hasMoreElements()) { String name = (String) names.nextElement(); String wartosc = request.getParameter(name); if(wartosc == null || wartosc.trim().isEmpty()) wartosc ="%"; 34 Praca inżynierska – Węc S. 5.2.3 Połączenie z bazą danych. Klasa odpowiedzialna za połączenie z bazą danych. package inne; import java.sql.*; public class Connect { private String driver = "org.postgresql.Driver"; private String host = "193.193.92.204:5432"; private String dbname = "ornitolog_test_2"; private String user = "postgres"; private String url = "jdbc:postgresql://" + host + "/" + dbname; private String pass = "birdsmondc300d"; private Connection connection; public Connect () { connection = makeConnection(); } public Connection getConnection(){ return(connection); } public void close() { try { connection.close(); } catch (SQLException sqle) { System.err.println("Blad przy zamykaniu polaczenia: " + sqle); } } private Connection makeConnection(){ try { Class.forName(driver); Connection connection = DriverManager.getConnection(url, user, pass); return(connection); } 35 Implementacja modułu raportowania systemu ornitologicznego catch(ClassNotFoundException cnfe) { System.err.println("Blad ladowania sterownika: " + cnfe); return(null); } catch(SQLException sqle) { System.err.println("Blad przy nawiązywaniu polaczenia: " + sqle); return(null); } } } 5.2.4 Zapisywanie raportu w formie pliku PDF Poniższy kod jest odpowiedzialny za wczytanie szablonu raportu, jego kompilacje za pomocą klasy „net.sf.jasperreports.engine.JasperCompileManager”, a następnie przekazanie parametrów do raportu poprzez klasę „net.sf.jasperreports.engine.JasperFillManager” i jego wyeksportowanie do pliku PDF klasą „net.sf.jasperreports.engine.JasperExportManager”. package inne; import java.util.HashMap; import java.sql.Connection; import net.sf.jasperreports.engine.*; public class MojRaport { private String sciezka = "c:/ireports/"; private String szablon = sciezka + "szablon/"; private String wynik = sciezka + "pdf/"; private HashMap parametry; private Connection con; public MojRaport (HashMap parametry, Connection con) { this.con = con; this.parametry = parametry; szablon += parametry.get("raport") + ".jrxml"; } public String pdf (String nazwa) { String nazwaPliku = nazwa + ".pdf"; String zapisany = wynik + nazwaPliku; JasperReport jasperDesign = null; JasperPrint jasperPrint = null; try { 36 Praca inżynierska – Węc S. System.out.println("Sciezka do szablonu:" + szablon); jasperDesign = JasperCompileManager.compileReport(szablon); } catch (JRException e){ System.out.println("Error JR :: IREPORTS:Raport:CreatePdf :: (RJ): bład kompilacji raportu" + e.toString()); System.out.println("-nie odnaleziono szablonu"); return null; } try { jasperPrint = JasperFillManager.fillReport(jasperDesign, parametry, con); } catch (JRException e){ System.out.println("Error JR :: IREPORTS:Raport:CreatePdf :: (RJ): bład wypełnienia raportu" + e.toString()); } try { JasperExportManager.exportReportToPdfFile(jasperPrint, zapisany); } catch (JRException e){ System.out.println("Error JR :: IREPORTS:Raport:CreatePdf :: (RJ): bład exportu raportu do pdf" + e.toString()); } return nazwaPliku; } public Connection zwolnijPolaczenie() { Connection temp = con; con = null; return temp; } } 37 Implementacja modułu raportowania systemu ornitologicznego 6 Raporty Rys.13. Widok wygenerowanego raportu. Zaprojektowanie raportów w taki sposób, aby spełniały swoje zadanie umożliwiając łatwą ich obsługę przez użytkownika, zajęło dużą część ogółu czasu poświęconego na pracę nad projektem. Wynikło to ze względu na założenie, iż moduł raportowania ma dostarczać bardzo szczegółowych danych z bazy, która jest bardzo złożona, cały czas poprawiana i udoskonalana, aby jak najlepiej odzwierciedlała specyfikacje MTO, przez co koncepcja 38 Praca inżynierska – Węc S. raportów od początków ich istnienia zmieniała się niejednokrotnie. Głównym problemem, który towarzyszył tworzeniu raportów był fakt, iż taka duża ilość szczegółowych danych z formularzy ornitologów i obserwatorów została rozbita na wiele tabel o różnych relacjach, co utrudniało dostęp do niektórych danych. W niniejszym rozdziale zostały przedstawione raporty, te ważniejsze opisane oraz przedstawione problemy i sposoby ich rozwiązania. 6.1 Szablony Poniżej przedstawiono szablon raportu o współpracownikach. Wszystkie pola zostały umieszczone w sekcji detail, aby raport był jak najlepiej czytelny przy takiej ilości zwracanych danych oraz w razie zwracania większej ilości osób w jednym raporcie. Rys.14. Obraz szablonu z programu iReport. 39 Implementacja modułu raportowania systemu ornitologicznego Na Rys.15 jest przedstawiony jeden z bardziej złożonych szablonów, a na Rys.17 mamy wygenerowany już gotowy raport. Ten raport jest bardziej rozbudowany, gdyż składa się z większej ilości danych, jednego prostego podtaportu oraz drugiego bardziej złożonego aniżeli wcześniej przedstawiony. Raport korzysta z większej ilości tabel, używa zmiennych do obliczania sumy gatunków oraz do liczenia wypraw, przekazuje również parametry do podraportu, który zwraca też dodatkowo zmienną. Rys.15. Szablon raportu zestawienia obserwacji. Rys.16. Szablon podraportu zestawienia obserwacji. 40 Praca inżynierska – Węc S. Rys.17. Raport zestawienia obserwacji. 41 Implementacja modułu raportowania systemu ornitologicznego 6.2 Zapytania SQL Poniżej przedstawione są zapytania SQL do bazy danych, które zostały użyte do wygenerowania tych raportów. Zapytanie SQL do raportu o współpracownikach. SELECT bw.last_name AS Nazwisko, bw.first_name AS Imie, bw.membership_begin AS Czlonkowstwo_od, bw.membership_end AS Czlonkowstwo_do, bw.date_of_birth AS data_ur, ad.street AS Ulica, ad.number AS Nr_domu, ad.postal_code AS Kod_pocztowy, p.province_name AS Wojewodztwo, c.county_name AS Powiat, cm.commune_name AS Gmina, bw.phone AS Telefon, bw.website AS WWW, bw.e_mail AS Email, bw.information_source AS Skad_sie_dowiedzial, bw.profession AS Zawod_wyuczony, bw.practised_profession AS Zawod_wykonywany, bw.birdwatcher_pk AS fk FROM birdwatcher_t bw JOIN province_t p ON bw.province_fk = p.province_pk JOIN commune_t cm ON bw.commune_fk = cm.commune_pk JOIN address_t ad ON bw.address_fk = ad.address_pk JOIN county_t c ON bw.county_fk = c.county_pk WHERE p.province_name ILIKE $P{Województwo} AND cm.commune_name ILIKE $P{Gmina} AND bw.first_name ILIKE $P{Imię} AND ((bw.date_of_birth >= CAST($P{Data_urodzenia_od} AS DATE)) AND (bw.date_of_birth <= CAST($P{Data_urodzenia_do} AS DATE))) AND ad.locality ILIKE $P{Miejscowość} AND ((bw.membership_begin >= CAST($P{Data_czlonkostwa_od} AS DATE)) AND (bw.membership_end <= CAST($P{Data_czlonkostwa_do} AS DATE))) AND bw.gender ILIKE $P{Płeć} ORDER By Nazwisko, Imie Podraport: Select eq.model AS model, bin.zoom AS zomm, eq.manufacturer AS marka, eq.type 42 Praca inżynierska – Węc S. from birdwatcher_equipment_t be JOIN equipment_t eq ON be.equipment_fk = eq.equipment_uk JOIN binoculars_t bin ON be.equipment_fk = bin.equipment_uk where be.birdwatcher_fk = $P{fk} Zapytania SQL do raportu o obserwacjach. SELECT bw.last_name AS Nazwisko, bw.first_name AS Imie, p.province_name As wojewodztwo, e.start_date As data_roz, e.end_date As data_zak, e.start_time As czas_roz, e.end_time As czas_zak, e.start_date AS rok, e.expedition_pk As fk from birdwatcher_t bw JOIN expedition_birdwatcher_t ebw ON bw.birdwatcher_pk = ebw.birdwatcher_fk JOIN expedition_t e ON ebw.expedition_fk = e.expedition_pk JOIN province_t p ON p.province_pk = e.province_fk JOIN commune_t com ON com.commune_pk = e.commune_fk Where e.start_date >= CAST ( $P{start_ekspedycji} AS DATE) AND e.end_date <= CAST ($P{end_ekspedycji} AS DATE) AND p.province_name ILIKE $P{Województwo} AND com.commune_name ILIKE $P{Gmina} ORDER BY rok Pierwszy podraport: Select ph.physiographic_unit As nr_j_fizjograficznej, a.atlas_unit As nr_powierzchni From expedition_physiographic_unit_t eph JOIN physiographic_unit_t ph ON eph.physiographic_unit_pk = ph.physiographic_unit_pk, expedition_atlas_unit_t ea JOIN atlas_unit_t a ON a.atlas_unit_pk = ea.atlas_unit_fk where eph.expedition_pk = $P{fk} AND ea.expedition_fk = $P{fk} 43 Implementacja modułu raportowania systemu ornitologicznego Drugi podraport: select op.observation_point As punkt_obserwacji, op.gps_h AS gps_h, op.gps_v As gps_v, oc.observation_category AS kategoria, oc.rank_pk AS ranga, s.polish_name As gatunek, hp.value AS typ_siedliska, o.start_date AS start_ob, o.end_date AS end_ob, o.start_time AS czas_od, o.end_time AS czas_do, hc.category_name AS category from expedition_observation_t eo JOIN observation_t o ON o.observation_pk = eo.observation_fk JOIN observation_point_t op ON o.observation_point_fk = op.observation_point_pk JOIN observation_category_t oc ON o.observation_category_fk = oc.observation_category_pk JOIN species_t s ON o.species_fk = s.species_pk JOIN habitat_t h ON op.habitat_fk = h.habitat_pk JOIN habitat_parameter_habitat_t hph ON h.habitat_pk = hph.habitat_pk JOIN habitat_parameter_t hp ON hph.parameter_pk = hp.parameter_pk JOIN habitat_category_t hc ON hp.category_fk = hc.category_pk where eo.expedition_fk = $P{fk} AND s.polish_name ILIKE $P{Gatunek} AND hc.category_name ILIKE $P{Typ_siedliska} ORDER BY start_ob 7 Format XML W tym rozdziale zostały umieszczone najciekawsze fragmenty raportów w uniwersalnym języku formalnym przeznaczonym do reprezentowania różnych danych w strukturalizowany sposób. XML, bo o nim mowa jest niezależny od platformy, dzięki temu umożliwia bezproblemowy przepływ dokumentów między różnymi systemami, co przyczyniło sie do popularności tego języka. 44 Praca inżynierska – Węc S. 7.1 Struktura dokumentu XML <?xml version="1.0" encoding="ISO-8859-2" ?> <!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"> <jasperReport name="s2" ...<group name="Group" > <groupExpression><![CDATA[]]></groupExpression> <groupHeader> </groupHeader> <groupFooter> </groupFooter> </group> <background> </background> <title> <band height="132" isSplitAllowed="true" > </band> </title> <pageHeader> </pageHeader> <columnHeader> </columnHeader> <detail> <band height="247" isSplitAllowed="true" > </band> </detail> <columnFooter> <band height="2" isSplitAllowed="true" > </band> </columnFooter> <pageFooter> </pageFooter> <summary> </summary> </jasperReport> 45 Implementacja modułu raportowania systemu ornitologicznego 7.2 Parametry Parametry przekazywane z zewnątrz: <parameter name="start_ekspedycji" isForPrompting="true" class="java.lang.String"/> <parameter name="Województwo" isForPrompting="true" class="java.lang.String"/> Dostęp do parametru uzyskuje sie poprzez konstrukcję $P{nazwa}, przykładowo może to być $P{start_ekspedycji} 7.3 Zapytanie SQL Zapytanie SQl przekazuje sie następująco: <queryString><![CDATA[SELECT bw.last_name AS Nazwisko, bw.first_name AS Imie, ... > </queryString> 7.4 Pola Pola danych otrzymywanych w wyniku zapytania: <field name="nazwisko" class="java.lang.String"/> <field name="imie" class="java.lang.String"/> Dostęp do pola uzyskuje się stosując $F{nazwa}, w tym przypadku będzie to $F{nazwisko}. 7.5 Zmienne Dodatkowa zmienna. <variable name="suma" class="java.lang.Integer" resetType="None" calculation="Nothing"> </variable> Do pola można odwołać się stosując $V{nazwa}. 46 Praca inżynierska – Węc S. 7.6 Podraport Jak można zauważyć na dołączonym poniżej fragmencie kodu, podraporty w bardzo prosty sposób można umieścić w raporcie głównym. Wynika to z tego, iż są one niczym innym jak innymi raportami, które zagnieżdża się we właściwych sekcjach raportu. <subreport isUsingCache="true"> <reportElement <subreportParameter name="fk"> <subreportParameterExpression><![CDATA[$F{fk}]]></subreportParameterExpression> </subreportParameter> <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]> </connectionExpression> <returnValue subreportVariable="REPORT_COUNT" toVariable="suma"/> <subreportExpression class="java.lang.String"><![CDATA["C:\\ireports\\szablon\\s2_subreport1.jasper"]]> </subreportExpression> </subreport> 47 Implementacja modułu raportowania systemu ornitologicznego 8 Podsumowanie Stworzony projekt ograniczył sie do poprawnego zaprojektowania dynamicznych raportów oraz utworzenia przykładowych formularzy ich obsługujących. Informacje Małopolskiego Towarzystwa Ornitologicznego, które będą przechowywane w bazie danych są złożone i różnorodne, więc duża część czasu nad pracą została poświecona na analizę i zaprojektowanie elastycznych raportów, które będą dostarczać dużą ilość potrzebnych informacji zawartych w bazie danych. Raporty niejednokrotnie zmieniały swoją postać ze względu na to, iż dane jakie miały dostarczać nie były nigdy wcześniej ustalane oraz baza była wciąż udoskonalana i przebudowywana w celu gromadzenia większej ilości szczegółowych danych. Otrzymane w ten sposób raporty są kompleksowe, czyli przewidziano w nich wszystkie pola, których użytkownik może potrzebować, a zarazem projekt stał sie podstawą dla dalszych prac nad docelową kompletną aplikacją dla Małopolskiego Towarzystwa Ornitologicznego. 48 Praca inżynierska – Węc S. 9 Bibliografia JasperReports for Java Developers. David R. Heffelfinger, 2006 Java, podstawy. Cay S. Horstmann, Gary Cornell, Helion, 2008 Java Servlet i Java Server Pages. Marty Hall, 2002 SQL. Od podstaw. Paul Wilton, John Colby, Helion, 2007 NetBeans Docs & Support: http://www.netbeans.org/kb/index.html JasperReports Docs: http://jasperforge.org/website/jasperreportswebsite/trunk/documentation.html?header= project&target=jasperreports http://www.wikipedia.org/ 49