This dissertation has been submitted by a student. This is not an example of the work written by our professional dissertation writers.

1. Wstęp

1.1. Wprowadzanie

Jak wygląda sytuacja na rynku hotelarskim? Z roku na rok maleje liczba domów wycieczkowych, schronisk młodzieżowych, kempingów, ośrodków wczasowych i innych obiektów. To z jednej strony skutek narastającej konkurencji na rynku (w tym konkurencji ze strony hoteli). Patrząc jednak z drugiej strony zmieniają się oczekiwania klientów, którzy poszukują odpowiedniego standardu usług noclegowych jak i wypoczynkowych, a także możliwości doboru odpowiednich standardów w odpowiedniej cenie. W 2000 roku hotele stanowiły 11,8% wszystkich obiektów noclegowych w Polsce (motele: 1,5%, pensjonaty: 5,2%), natomiast analizując wykres zawarty na rysunku 1.1 widać, iż w 2007 roku hotele stanowiły już ponad 20% infrastruktury noclegowej w Polsce (motele: 1,6%, pensjonaty: ponad 10%). W połowie grudnia 2008 roku w Polsce funkcjonowało już niemal 1, 7 tys. hoteli. W ciągu półtora roku przybyło niemal 180 nowych obiektów. Statystyka wskazuje, że co trzy dni otwiera się w Polsce nowy hotel. Patrząc na powyższe zestawienie możemy jasno wywnioskować, iż rynek hotelarski rozwija się prężnie, co sprzyja oczywiście zapotrzebowaniu na dedykowane oprogramowanie.

Rysunek 1.1Wykres udziału obiektów noclegowych na rynku w latach 2000-2007

Źródło: http://biznes.gastrona.pl/art/article_8859.php

W dobie dzisiejszego Internetu prawie wszystkie usługi udostępniane są dla klienta drogą elektroniczną również rezerwacje pokoi hotelowych, ale nie tylko hotelowych również pensjonatów i domów letniskowych. Większość dużych hoteli używa drogich rozbudowanych aplikacji, których możliwości często nie wykorzystuje nawet w połowie mały pensjonat czy też dom letniskowy. Jednak główną przyczyną braku takiego oprogramowania są względy finansowe. Duże cztero lub pięciogwiazdkowe hotele są wstanie zakupić oprogramowanie od firm informatycznych, co jednak pozostaje nieco mniejszym na rynku?

Dlaczego więc nie stworzyć darmowego oprogramowania dla małych hoteli, pensjonatów, domów wczasowych, które nie posiadałoby zbędnych rozbudowanych systemów księgowych, lecz spełniało podstawowe elementy: e-recepcji, rezerwacji miejsc poprzez sieć Internet, prowadziło statystki, obliczało koszt pobytu?

1.2. Cel i zakres pracy

Celem mojej pracy jest zaprojektowanie aplikacji pomocnej w zarządzaniu recepcją hotelu lub pensjonatu, a także internetowego systemu rezerwacji miejsc w danym hotelu. Aplikacje pomogą w doborze najlepszych pokoi dla klientów usprawnią działanie hotelu, przyspieszą rezerwacje oraz obsługę gości

1.3. Struktura pracy

Struktura pracy jest następująca. W rozdziale 1 przedstawiono cel i zakres programowy pracy podkreślając zarazem istotę podjętego tematu. Rozdział 2 obejmuje zagadnienia teoretyczne związane z tematem baz danych, obiektowych języków programowania a także środowiska programistycznego Microsoft Visual Studio 2008. Rozdział 3 zawiera opis idei orz sposobu wykonania aplikacji desktopowej jak i internetowego systemu rezerwacji miejsc w danym hotelu. Sposób instalacji oraz podstawową obsługę całego systemu zaprezentowano w rozdziale 4. Ostatni rozdział pracy zawiera podsumowanie oraz wnioski nasuwające się po zrealizowaniu podjętego tematu.

2. Analiza zagadnienia

Rozdział ten poświęcony jest opisowi technologii zastosowanej przy projektowaniu systemu dedykowanego dla małego hotelu. Zawiera informacje dotyczące charakterystyki oraz podziału baz danych ze względu na typ i system zrządzania, przedstawia środowisko programistyczne oraz język, w którym wykonana została aplikacja. W rozdziale tym przedstawiono również podstawowe wiadomości o projektowaniu obiektowym oraz usługach internetowych.

2.1. Środowisko programistyczne

Projekt systemu rezerwacji wykonano w środowisku firmy Microsoft o nazwie Visual Studio 2008. Pozwala ono na tworzenie aplikacji metodą WYSIWG (ang. What You See Is What You Get), co znacznie przyspiesza prace programisty, który tworzy funkcje systemu wraz z jego interfejsem graficznym. Poniżej scharakteryzowano środowisko Visual Studio 2008 omawiając jego główne zalety.

Visual Studio 2008

Microsoft Visual Studio to zestaw narzędzi programistycznych, w którego skład wchodzą:

* Microsoft Visual C#;

* Microsoft Visual C++;

* Microsoft Visual Basic;

* Microsoft Visual J#;

* Microsoft Visual Web Developer (ASP.NET);

Używanie środowiska Microsoft Visual Studio pozwala na tworzenie samodzielnych aplikacji, a także aplikacji sieciowych, jak również serwisów internetowych (ASP.NET)

Visual Studio 2008 zawiera narzędzia wykorzystywane do tworzenia aplikacji i ich debugowania, a także kreatory graficzne umożliwiające tworzenia aplikacji wykorzystujących .NET Framework 3.5 (W najnowszej wersji). Środowisko to wyposażone jest również w komponenty bazodanowe i innowacyjne funkcje pozwalające na szybkie tworzenie aplikacji działających na wielu różnych platformach. Dzięki Visual Web Developer programista posiada wszelkie narzędzia do tworzenia internetowych serwisów i aplikacji opartych na technologii ASP.NET wykorzystujących system AJAX.

Do najważniejszych cech środowiska należą:

* Natychmiastowe opracowywanie aplikacji

* Efektywna praca grupowa

* Zastosowanie Microsoft.NET Framework 3.5

Rysunek 2.1 Okno środowiska Visual Studio 2008

2.2. NET Framework

.NET Framework (.NET) - jest platformą programistyczną obejmująca środowisko uruchomieniowe (Common Language Runtime - CLR) oraz biblioteki klas dla aplikacji. Technologia ta nie jest związana z żadnym konkretnym językiem programowania, a programy mogą być pisane w jednym z wielu języków: C++, C#, J#, Visual Basic .NET. Ten fakt daje olbrzymią swobodę programiście, który może wybrać dowolny z dostępnych w środowisku języków a .NET Framework zapewni zarządzanie różnymi elementami systemu: kodem aplikacji, pamięcią i zabezpieczeniami. W środowisku tym można tworzyć oprogramowanie działające po stronie serwera oraz pracujące na systemach, na które istnieje działająca implementacja tej platformy. Z racji jej pochodzenia najpełniej obsługiwane są systemy z rodziny Microsoft Windows, jednak powstają także jego niezależne wdrożenia, np. Mono i dotGNU.

Bloki składowe platformy.NET:

CLR (ang. Common Language Runtime) - jest to tak naprawdę maszyna wirtualna, która wykonuje kod wyrażony w Common Intermediate Language. Do zadań CLR należy kompilacja i wykonanie kodu, który zapisany jest w języku pośrednim CIL kod.

CTS (ang. Common Type System) jest to bazowy zbiór typów danych dla każdego języka zgodnego ze specyfikacją CLI. System CTS definiuje również zachowania typów gwarantując pełną zgodność ze środowiskiem CLR. CTS określa sposób deklarowania i tworzenia typów niestandardowych oraz mechanizm zarządzania cyklem życia instancji tych typów.

CLS (ang. Common Language Specification) określa, który podzbiór CLR powinny obsługiwać kompilatory, aby zapewnić kompatybilność z językami.NET.

Na rysunku 2.2 zaprezentowano szerzej architekturę platformy .NET

Rysunek 2.2 Architektura platformy.NET

2.3. Programowanie obiektowe

Jeden z paradygmatów programowania, który mówi o definiowaniu programów za pomocą obiektów. Obecnie jest to jedna z najpopularniejszych metod tworzenia oprogramowania stało się tak dlatego, iż metoda ta jest bardzo zbliżona do naszego sposobu postrzegania rzeczywistości. Aplikacja napisana obiektowo jest tak naprawdę grupą obiektów posiadających swoje metody - funkcje. Działanie programu oparte jest o wywoływanie poszczególnych metod z odpowiednich klas. Obiektowe podejście do tworzenia oprogramowania niesie ze sobą podstawowe założenia do których zaliczyć należy: dziedziczenie, enkapsulację, polimorfizm oraz abstrakcję.

* Dziedziczenie - jest to proces polegający na stworzeniu nowej klasy opartej na klasie już istniejącej. Mówiąc o dziedziczeniu trzeba zaznaczyć, iż w programowaniu obiektowym występuje również typ dziedziczenia, który wykorzystuje więcej niż jedną klasę istniejącą do stworzenia nowej dziedziczenie takie nazywamy dziedziczeniem wielobazowym i stosuje się je np. w języku C++.

* Enkapsulacja - inaczej mówiąc hermetyzacja polega na ukrywaniu danych lub metod pewnych obiektów w ten sposób aby modyfikacji na tych danych mogły dokonywać tylko metody zaprzyjaźnione. Hermetyzacja ma za zadanie ochronę tworzonego modelu od błędów oraz podzielenia go na mniejsze elementy. Ochrona wykonywana jest poprze zastosowanie odpowiedniej sekcji zależnej od tego co chcemy zabezpieczyć. Wyróżniamy trzy sekcje: prywatną, publiczną i chronioną ustanawiane przez „private”, „public”' i „protected”.

* Polimorfizm - Głównym założeniem polimorfizmu jest możliwość przypisywania konkretnych obiektów klas pochodnych do wskaźników na klasę bazową, nie w momencie kompilacji, lecz w trakcie działania programu.. Jeśli przypisanie odbywa się w czasie działania programu, to nazywa się to późnym wiązaniem lub wiązaniem dynamicznym. W niektórych językach programowania spotkać możemy bardziej statyczne rozwiązania polimorfizmu np. szablony i przeciążanie operatorów w C++.[1]

* Abstrakcja - o spełnieniu tego paradygmatu mówimy wtedy, kiedy napisana aplikacja posiada pewne klasy, które są jedynie wzorem dla innych klas. Klasy takie nazywamy klasami abstrakcyjnymi. Są to klasy, które posiadają co najmniej jedną metodę wirtualną reprezentantów pod postacią obiektów. Służy jedynie temu by dziedziczyć od niej pewien interfejs. Każda klasa dziedzicząca po klasie abstrakcyjnej, która sama nie chce stać się abstrakcyjną, musi posiadać implementację każdej z odziedziczonych metod czysto wirtualnych. Jeżeli nie posiada choćby jednej implementacji metody czysto wirtualnej, klasa taka sama staje się abstrakcyjną. Klasa, której wszystkie metody są czysto wirtualne nosi nazwę klasy czysto abstrakcyjnej.[2]

2.4. Język C#

C# jest obiektowym językiem programowania zaprojektowanym przez zespół pod kierunkiem Andersa Hejlsberga. Jest jednym z podstawowych języków wykorzystywanych przez platformę .NET

Do głównych cech języka możemy zaliczyć:

* obiektowość - kod programu jest zbiorem klas a hierarchia ich dziedziczenia opiera się na istnieniu jednej klasy nadrzędnej object (System.Object).

* automatyczne zwalnianie nie wykorzystywanej pamięci - język C# ułatwia zarządzanie pamięcią aplikacji dzięki garbage collector. To on zajmuje się oczyszczaniem pamięci zwalniając za tym programistę z konieczności pisania odpowiednich destruktorów.

* typy ogólne - mechanizm zbliżony swoją ogólnością do szablonów w C++, jednak tu typ ogólny jest przenoszony do modułu binarnego i możliwy jest do wykorzystania bez konieczności posiadania kodu źródłowego[3]

* „dynamiczne tworzenie kodu - biblioteki .NET umożliwiają dynamiczne tworzenie kodu w trakcie działania programu i włączanie go do kodu aktualnie wykonywanego. [4]

* bogata biblioteka klas BCL - umożliwiająca rozwijanie aplikacji konsolowych, okienkowych, bazodanowych, sieciowych, w architekturze rozproszonej oraz dynamicznych aplikacji internetowych (ASP.NET)”[5]

2.5. ASP.NET

ASP.NET jest technologią tworzenia dynamicznych stron internetowych, wykorzystującą środowisko uruchomieniowe CLR oraz platformę .NET Framework. Wywodzi się z technologii ASP która nie wykorzystywała olbrzymiego potencjału platformy .NET. Różnicę obu technologii zaprezentowano na rysunku 2.4.

ASP.NET pozwala na oddzielenie kodu aplikacji pisanego w oferowanych przez środowisko Visual Studio 2008 językach takich jak J#, C++ czy C#, od warstwy prezentacji, w której najczęściej wykorzystujemy język HTML, XHTML oraz kaskadowe arkusze stylów - CSS. Oddzielenie warstwy prezentacji od warstwy aplikacji zaprezentowano na rysunku 2.5. W najnowszej wersji oznaczonej numerem 2.0 twórcy wprowadzili wiele nowych elementów wspomagających tworzenie stron internetowych metodą WYSIWG. Technologia wyposażona jest w szereg gotowych obiektów z których najważniejsze to :

* Application - przechowująca wszelkie informacje o stanie aplikacji.

* Sessions - przechowuje informacje dotyczące jednego użytkownika, dostarcza informacji na temat każdego użytkownika odwiedzającego stronę. Poprzez jej wykorzystanie możemy stworzyć liczniki odwiedzin, aktualnie zalogowanych i niezalogowanych gościach oraz wiele, wiele innych przydatnych funkcji.

* Request - wykorzystywana do komunikacji przeglądarki z serwerem. Zawiera dane, które zostały wysłane np. przy użyciu formularza, pozwala na pobieranie danych z paska adresu metodą GET.

* Response - wysyła informacje tj. cookies i nagłówki, z powrotem do przeglądarki

Potęga tworzenia stron internetowych z wykorzystaniem technologii ASP.NET opiera się głównie na mnogości gotowych kontrolek dostarczonych w postaci prostego kodu HTML do przeglądarki odwiedzającego co nie wpływa na jej rodzaj. Podzielić można je na 4 główne grupy:

* Intrinsic controls - kontrolki tworzą elementy HTML tj. bloki, tabele, nagłówki czy paragrafy oferując przy tym możliwość utrzymania stanu.

* List controls - udostępniają możliwość tworzenia list. Przykładem mogą być kontrolki DataList i DataGrid.

* Rich controls - służą do tworzenia bardziej złożonych i rozbudowanych elementów HTML jak np. obiekt kalendarza.

* Validation controls - Niewidoczne kontrolki umożliwiające poprawne funkcjonowanie strony po stronie klienckiej oraz serwera. Zapewniają poprawność wprowadzanych przez odwiedzającego danych np. kontrolka RequiredFieldValidator która zabezpiecza aby pole nie pozostało puste.

Rysunek 2.3 Różnice między technologią ASP.NET i ASP.

Rysunek 2.4 Prezentacja oddzielenia warstwy prezentacji od warstwy aplikacji

Źródło : http://msdn.microsoft.com/pl-pl/netframework/cc511288.aspx

2.6. Bazy danych

Bazą danych nazywamy zbiór danych zapisanych w określony sposób w strukturach dających się łatwo przeszukiwać. Baza danych obejmuje zbiór informacji jak i komputerowy, który przeznaczony jest do gromadzenia i przetwarzania tych danych. Aplikację wspomagającą bazę danych często nazywa się Systemem Zarządzania Bazą Danych (ang. DataBase Management System, DBMS).

Obecnie bazy danych znajdują swoje zastosowanie prawie w każdej dziedzinie życia. Niemalże wszystkie firmy i instytucje zobligowane są gromadzić informacje na temat przeprowadzanych transakcji, pracowników czy też towaru. Wykorzystują do tego systemy bazodanowe tj. Oracle, MySQL, PostgreSQL, które w łatwy sposób umożliwiają sprawne i szybkie ich gromadzenie. Bazy danych znajdują również zastosowanie przy tworzeniu stron internetowych, (np: do gromadzenia danych o użytkownikach takich jak imię, nazwisko, email).

Bazy danych można podzielić według typu na:

1. Bazy proste:

* kartotekowe;

* hierarchiczne;

* sieciowe;

2. Bazy złożone:

* relacyjne;

* obiektowe;

* relacyjno-obiektowe;

* strumieniowe;

2.6.1 Bazy kartotekowe

Jest to najprostsza organizacja bazy danych złożona z jednej lub kilku tablic zawierających rekordy. Rekordy te muszą posiadać jednak identyczną strukturę pól. Bazy kartotekowe charakteryzują się tym, iż każda tabela jest osobnym dokumentem niemogącym współpracować z innymi tablicami. Ten typ bazy danych nieekonomicznie jednak nadaję się do zarządzania zasobami ze względu na późniejsze próby reorganizacji. Przykładem takiej bazy może być np.: zwykły spis danych osobowych, książek lub płyt.

2.6.2 Bazy hierarchiczne

Jest typem bazy danych, w której relacje między rekordami mają formę struktury drzewiastej. W modelu hierarchicznym wyróżnia się tylko jeden typ rekordu, który nazywa się rekordem głównym lub nadrzędnym stanowi on tzw. korzeń drzewa. Słabym punktem tego typu bazy danych jest niestety brak bezpośredniego dostępu do wszystkich danych. Zapewniony jest on tylko do rekordów głównych, pozostałe pola możemy przeglądać wyłącznie poprzez podanie nazw wszystkich rekordów będących poprzednikami szukanego rekordu.

Rysunek 2.5 Hierarchiczny model bazy danych

2.6.3 Bazy sieciowe

Sieciowe bazy danych (ang Network Database) rozwijają założenia modelu hierarchicznego pozwalając na to, aby każdy rekord mógł posiadać więcej niż jednego rodzica tworząc w ten sposób strukturę uogólnionego wykresu. Rysunek 2.4 na którym zaprezentowano sieciowy model bazy danych wykorzystuje zarówno rekordy jak i zbiory, których założeniem jest „określanie relacji jeden do wielu między rekordami, gdzie jeden rekord jest „właścicielem” zbioru zawierającego „członków” zbioru.”[6]. Wady modelu sieciowego przyczyniły się do rozwoju modelu relacyjnego jednak model ten uważany jest za jednego z przodków obiektowości w dziedzinie baz danych.

Rysunek 2.6 Schemat sieciowego modelu baz danych

2.6.4 Bazy relacyjne

Relacyjna baza danych (RDBMS ang. Relational Database Management Systems) jest to baza danych złożona z dwóch lub więcej tabel powiązanych ze sobą za pomocą relacji. Relacją nazywamy powiązania, między tabelami bazy danych odzwierciedlające różne zależności między danymi. Model relacyjny wykorzystuje zazwyczaj język SQL do operowania na danych, zakłada, iż wszystkie wartości danych powinny oparte być na prostych typach danych przedstawionych w formie dwuwymiarowych tabel, z których każda zawierać powinna zero lub więcej wierszy.

Relacyjny system bazodanowy pozwala na wyszukiwanie, wyświetlanie, sortowanie i porównywanie wartości z różnych kolumn jak i z różnych tabel umożliwiając przez to wiązanie danych i wykonywanie stosunkowo złożonych operacji opartych o algebrę relacji.

Rysunek 2.7 Relacyjny model bazy danych

Wyróżnia się 3 podstawowe typy relacji: jeden do jednego, jeden do wielu oraz wiele do wielu.

* Relacja jeden do jednego przedstawiona na rysunku 2.5 zakłada, że każdy rekord w tabeli A może mieć tylko jeden dopasowany rekord z tabeli B, i tak samo każdy rekord w tabeli B może mieć tylko jeden dopasowany rekord z tabeli A. Najczęściej stosowana jest ona do podziału tabeli z wieloma polami, oraz do przechowania informacji odnoszącej się tylko do podzbioru tabeli głównej.

Rysunek 2.8 Relacja jeden do jednego

* Relacja jeden do wielu jest najczęściej spotykanym typem relacji. Zakłada, iż rekord w tabeli A może mieć wiele dopasowanych do niego rekordów z tabeli B, ale rekord w tabeli B ma tylko jeden dopasowany rekord w tabeli A. Relację tą zaprezentowano na rysunku 2.8.

Rysunek 2.9 Relacja jeden do wielu

* Przedstawiona na rysunku 2.9 relacja wiele do wielu to relacja, w której rekord tabeli A może mieć wiele dopasowanych do niego rekordów z tabeli B i tak samo rekord w tabeli B może mieć wiele dopasowanych do niego rekordów z tabeli A. Realizuje się to dzięki utworzeniu trzeciej tabeli, tzw. tabeli łącza Relacja wiele do wielu jest definiowana, jako dwie relacje jeden do wielu z trzecią tabelą.

Analizując dogłębnie ten typ bazy danych można wyłonić problem braku identyfikacji wiersza poprzez jego pozycję. Sprawia to, iż model relacyjny wymaga obecności kolumny niepowtarzalnej w granicach całej tabeli. Kolumnę tą określa się, jako klucz podstawowy (ang. primary key).

Rysunek 2.10 Relacja wiele do wielu

2.6.5 Bazy obiektowe

W bazach obiektowych dane przechowywane są, jako klasy, co pozwala programiście operować na jej obiektach tak jak na obiektach/zmiennych programu. Typ ten nie wymaga od niego znajomości z zakresu języka SQL oraz znajomości w dziedzinie baz danych. Warto jednak zaznaczyć, iż nie istnieje żadna ogólnie przyjęta metoda projektowania baz obiektowych oraz nie ma też jednolitej terminologii w tej dziedzinie.

Na rysunku 2.10 przedstawiono schemat działania obiektowych bazy danych. Zapewniają one programistom dziedziczenie zarówno strukturalne: potomek dziedziczy strukturę danych jak i behawioralne: potomek dziedziczy metody i operatory. Nie są jednak pozbawione wad, z których najważniejsze to: powiązanie z jednym językiem programowania, słaba obsługa przeszukiwania danych, brak powszechnie zaakceptowanego języka zapytań trudny dostęp do fizycznych danych oraz małe możliwości optymalizacji pracy serwera.

Rysunek 2.11 Schemat działania obiektowego modelu bazy danych

Źródło : www.icie.com.pl/APSIN/m_iv.doc

2.6.6 Bazy relacyjno-obiektowe

Bazy relacyjno-obiektowe (ang. Object-relational Database Management System ORDBMS) są najnowszym osiągnięciem w rozwoju architektur baz danych. Systemy te łączą w sobie rozwiązania sprawdzone z systemów relacyjnych (takie jak architektura klient/serwer, mechanizmy buforowania i indeksowania, przetwarzanie transakcji, czy optymalizacja zapytań) wraz z rozwiązaniami najnowszymi zaczerpniętymi z modelu obiektowego. Podobnie jak w bazach relacyjnych reprezentacja danych opiera się o relacje zawiera jednak możliwość definiowania nowych typów, dziedziczenie typów, referencyjny typ danych, hierarchie zbiorów, składowanie kodu procedur. Do najważniejszych rozwiązań tego typu baz danych zaliczyć można m.in. Oracle i DB2.

Wybór odpowiedniego modelu bzy danych jest jednym z pierwszych kroków projektowania aplikacji bazodanowej. Obecnie na rynku rozwijane są głównie dwa modele: relacyjny i obiektowy. Do przedstawionej aplikacji zdecydowano się zastosować relacyjny typ bazy danych przemawia, bowiem za nim: stabilna pozycja na rynku, optymalizacja zapytań, „dojrzałość” systemów realizujących a także wiedza o niedopracowaniu i niestabilności standardów w zakresie modelu obiektowego,

Główne niekomercyjne systemy zarządzania relacyjnymi bazami danych:

* MySQL;

* PostgreSQL;

* SQLite

MySQL

System zarządzania relacyjnymi bazami danych, który na początku 2008 roku wykupiony został przez Sun Microsystems. Cechują go wieloplatformowość oraz mnogość obsługiwanych mechanizmów bazodanowych w których znaleźć możemy m.in.: MyISAM, MEMORY, InnoDB BerkeleyDB, MERGE, FEDERATED, CSV, ARCHIVE. Ważną zaletą tego systemu jest również licencja GPL, na której jest on udostępniany, co pozwala nam na wykorzystanie bazy danych wszędzie poza celami komercyjnymi. DO zalet MySQL należy również dołączyć jego niezawodność bardzo dużą wydajność i szybkość obsługi. W najnowszej wersji tego systemu zarządzania bazą danych wprowadzono m.in. W wersji 5 dodano m.in.: procedury składowane, wyzwalacze, perspektywy, kursory, partycjonowanie tabel, harmonogram zadań.

PostgreSQL

Początek rozwijania tego systemu określany jest na rok 1973. W roku tym na Uniwersytecie Kalifornijskim prace nad relacyjnymi bazami danych rozpoczęli dr Michael Stonebraker wraz z Eugene Wong. Początkowo nazywany był jako Ingres aby po 12 latach ewoluować poprzez wyposażenie w język zapytań POSTQUEL i zmienić nazwe na Postgres. Po latach dodano do systemu interpreter języka SQL i zmieniono jego nazwę na PostgreSQL. System ten oddaje użytkownikowi możliwości pisania procedur składniowych w językach takich ja PL/pgSQL, obsługę indeksów, wyzwalaczy, transakcji - wykorzystując mechanizm MVCC. Ponadto PostgreSQL pozwala tworzyć obiekty bazodanowe takie jak indeksy, operatory, agregaty, konwersje rzutowania. System bazodanowy wyposażono również w mechanizm pozwalający na definiowanie nowych typów danych.

SQLite

SQLite należy wraz z MySQL i PostgreSQL do grupy najlepszych wolno dostępnych systemów zarządzania relacyjnymi bazami danych. Stworzony w roku 2000 przez Richarda Hippa zawiera w sobie system zarządzania relacyjnymi bazami danych jak i bibliotekę implementującą wykonaną w języku C. Takie rozwiązanie implementacyjne oceniane jest za bardzo korzystne ze względu na brak konieczności uruchamiania osobnego procesu RDBMS jak to jest np. w systemie MySQL. Do innowacji tego systemu należy przede wszystkim sposób przechowywania bazy danych. SQLite realizuje to za pomocą B-drzew przechowywanych na dysku twardym w postaci jednego pliku, ale możliwe jest również „przechowywanie baz danych w pamięci RAM komputera, co znacznie przyspiesza działanie.” [7] Do najważniejszych cech systemu należy obsługa zapytań zagnieżdżone, widoków, kluczy obcych, transakcji wyzwalaczy (nie w pełni) oraz definiowanie własnych funkcji.

Do realizacji przedstawionego w pracy systemu zarządzania mały hotelem wykorzystano bazę danych MySQL ze względu na jej wysoką wydajność, szybkość niezawodność oraz zgodność ze standardem SQL2003.

3. Realizacja systemu rezerwacji hotelowej

Rozdział ten poświęcony został określeniu wymagań sprzętowych i systemowych oraz wyszczególnieniu założeń projektowych dotyczących projektowanej aplikacji. Zawiera opis i strukturę wykorzystanej w niniejszym projekcie bazie danych jak również przebieg i sposób implementacji systemu. Ze względu na różnice w projektowaniu w rozdziale wyszczególniono etapy projektowania aplikacji dedykowanej dla recepcji jak również część poświęconą modułowi internetowemu.

3.1. Określenie wymagań programowych i sprzętowych
3.1.1 Moduł recepcji

Wymagania systemowe dla aplikacji desktopowej to zainstalowana platforma Windows XP, Vista lub Windows 7 oraz dodatkowo biblioteka .NET Framework w wersji 3.5. Jeśli aplikacja ma korzystać z zewnętrznej bazy danych wymagane jest połączenie z serwerem, na którym będzie się ona znajdować, w przeciwnym razie niezbędne jest zainstalowanie MySQL Server w wersji 5.0 lub wyższej.

Wymagania sprzętowe to komputer klasy Pentium III lub wyższej z procesorem 433MHz, 128 MB pamięci operacyjnej RAM i przestrzeni dyskowej przestrzeni dyskowej 100MB.

3.1.1 Moduł internetowy

Wymagania stawiane stronie internetowej uwarunkowane są również od sposobu udostępniania jej klientowi. Jeśli strona ma znajdować się na lokalnym serwerze musi mieć on zainstalowane oprogramowanie IIS (ang. Internet Information Services). Innym sposobem publikacji strony jest wykupienie serwera u dowolnego usługodawcy, który oferuje hosting stron wykonanych w technologii ASP.NET 3.5. Aby przeglądać zasoby zawarte w aplikacji internetowej wymagana jest przeglądarka internetowa oraz zainstalowany .NET Framework w wersji 3.5.

3.2. Założenia projektowe

Aplikacja powinna udostępniać każdemu odbiorcy korzystającemu z oprogramowania możliwość utworzenia odpowiedniej struktury bazy danych, która przechowywać będzie informację o właściwościach jego hotelu. System powinien być intuicyjny jak również posiadać przejrzysty interfejs, w którym będzie można odczytać stan aktualnego zakwaterowania. Ponadto powinien umożliwiać użytkownikom wgląd w terminarz i historię rezerwacji poszczególnych pokoi.

Kolejnym założeniem systemu jest jego bezpieczeństwo i niezawodność. Aplikacja musi posiadać moduł umożliwiający wykonywanie, a także przywracanie kopii zapasowych, ponieważ odbiorca takiego oprogramowania musi mieć pewność, iż w razie niepożądanych awarii może w łatwy sposób przywrócić ostatni stan meldunków oraz wszelkie niezbędne informacje dotyczące swojego hotelu. Pod pojęciem bezpieczeństwa systemu rozumie się również jego ochronę przed dostępem osób niepożądanych, a także bezpieczeństwo informacji przechowywanej w bazie danych, dlatego system powinien wykorzystywać moduł bezpiecznego logowania z wykorzystaniem szyfrowania hasła. Ma to zapewnić zniwelowanie możliwości podszywania się pod innego recepcjonistę. Ponadto, system musi być odporny na błędy ludzkie, a ewentualne pomyłki dokonane przez personel hotelu muszą być możliwe do zlokalizowania i poprawy. Dlatego każde działanie pracownika powinno być monitorowane. Aplikacja musi posiadać system pozwalający na dokonywanie rezerwacji bezpośrednio z witryny internetowej, a rezerwacje te są automatycznie rejestrowane i widziane w aplikacji przeznaczonej dla recepcji hotelowej. Konieczne jest, aby system ten działał na każdej sprecyzowanej przez użytkownika rozdzielczości oraz na każdej przeglądarce internetowej.

Kolejnym założeniem projektowym jest udostępnienie odpowiednich praw w systemie dla poszczególnych użytkowników. Chodzi o możliwość personalizowania praw dla osób mniej lub więcej doświadczonych w obsłudze. System musi posiadać również możliwość wyboru świadczonych usług w zależności od potrzeb, jak również negocjacji cen, sezonowych obniżek oraz pakietów rodzinnych. Klient w zależności od kondycji finansowej ma wtedy możliwość wyboru pokoju o określonym standardzie spełniającym jednocześnie jego oczekiwania. Wzbogacenie systemu o statystyki rezerwacji pokoi, z podziałem na ich typ, staję się aspektem niezbędnym, jeśli aplikacja ma być pomocna w zarządzaniu strategią inwestycyjną usług hotelowych nastawioną na rozwój w przyszłości.

3.3. Schemat i opis struktury bazy danych

Do projektu aplikacji użyto jednej relacyjnej bazy danych MySQL, która zawiera 5 tabel. Po instalacji systemu przeznaczonego dla recepcji administrator zobligowany jest do stworzenia bazy danych. Umożliwia to oprogramowanie MySQL Query Browser, w którym należy utworzyć nową bazę o nazwie testowa. Tabele użyte w projekcie, które przedstawiono na rysunku 2.1 utworzone zostały automatycznie poprzez aplikację w module „Stwórz Bazę Hotelu”. Po poprawnym wypełnieniu wszystkich wymaganych pól tworzone są poszczególne tabele takie jak: Hotel, Kopia Zapasowa, Recepcjoniści, Pokoje, Rezerwacje.

Tabela Hotel zawiera następujące rekordy:

Id, które jest kluczem głównym tabeli przechowuje dane typu int oraz posiada wartość auto increment;

Nazwa_Hotelu posłuży między innymi do informowania klienta, w którym hotelu próbuje zarezerwować pokój poprzez sieć Internet;

Tabela Backup powstała z myślą o bezpieczeństwie systemu i wykonywaniu kopii zapasowych. Utworzono w niej następujące pola:

Id_Backup, które jest kluczem głównym typu int;

Co_Ile - pole typu int przechowujące liczbę dni, po których ma być wykonywania kopia bezpieczeństwa;

Data_Ostatniej rekord typu varchar gdyż przechowuje tylko dane dotyczące daty w przeciwieństwie do typu datetime, który poszerza tą informację również o godzinę;

Godzina - pole typu varchar ograniczone do 5 znaków przystosowane do przechowywania wartości godziny, o której planowane jest wykonanie kopii zapasowej;

Sciezka - pole typu text utworzone do określenia docelowej lokalizacji przechowywania wykonanej kopii bezpieczeństwa;

schemat bazy danych

Rysunek 3.1 Schemat struktury bazy danych

Tabela Pokoje pozwala na scharakteryzowanie standardów wyposażenia pokoi oraz ich ilości na przestrzeni całego hotelu. Użytkownik aplikacji może samodzielnie określić zasobność danego pokoju ( np. Internet, kablówka itp.).

* Id_Pokoju - pole typu int będące kluczem głównym tabeli Pokoje. Posiada właściwość auto increment, która zwiększa index zawsze, kiedy dodawany jest kolejny pokój;

* Numer_Pokoju - rekord przechowujący numer danego pokoju w postaci zmiennej typu INT;

* Iluosobowy - pole określające czy pokój dedykowany jest dla jednej czy większej ilości lokatorów.

* Cena - rekord typu double, powstał w celu przechowywania ceny za pobyt gościa liczonej na podstawie iloczynu ceny dobowej pokoju i liczby dni pobytu.

Pozostałe pola w tabeli Pokoje są polami typu boolean, który przyjmuje tylko dwie wartości prawda i fałsz. Pola służą do określenia właściwości wyposażenia pokoju, czyli między innymi czy pokój posiada łazienkę, kablówkę, dostęp do sieci Internet itp.;

System zakłada podział na użytkowników, którzy po zalogowaniu będą posiadali nadane przez administratora prawa do wykonywania określonych działań. Aby zrealizować taki moduł wykorzystano kolejną tabelę Recepcjoniści, która przechowuje następujące pola:

* Id - pole będące kluczem głównym tabeli Recepcjoniści przechowującym wartości typu int,

* Imie - przechowuje imię recepcjonisty w postaci zmiennej typu varchar ograniczone do 45 znaków,

* Nazwisko - przechowuje nazwisko recepcjonisty w postaci zmiennej typu varchar ograniczone do 45 znaków,

* Login - przechowuje login recepcjonisty w postaci zmiennej typu varchar ograniczone do 45 znaków,

* Haslo - przechowuje hasło recepcjonisty w postaci zmiennej typu varchar ograniczone do 45 znaków,

* Pozostałe pola utworzone w bazie danych są typu boolean. Określają prawo lub odmowę na wykonywanie np. kopii bezpieczeństwa czy też wgląd w statystyki hotelu.

Najważniejszą tabelą w bazie danych jest tabela Rezerwacje, której zadaniem jest przechowywanie informacji teleadresowych klienta a także wszystkich pozostałych niezbędnych do rezerwacji danych. Tabela przechowuje niżej wymienione pola:

* Id_Rezerwacji - Klucz główny tabeli przechowuje dane typu, int posiada właściwość auto increment,

* Data_Rozpoczęcia - rekord typu datetime przechowujący datę zameldowania klienta,

* Data_Zakończenia - rekord typu datetime przechowujący datę wymeldowania klienta,

* Forma_Płatności - pole typu varchar ograniczone do 45 znaków określające formę zapłaty za pokój, jaką wybrał klient,

* Koszt_Pobytu - rekord przechowujący koszt całkowity pobytu gościa wyrażony za pomocą zmiennej typu double,

* Id_Recepcjonisty - rekord typu int, który przechowuje określa, który recepcjonista przeprowadził proces rezerwacji pokoju. Rekord ten może przyjmować wartość null jeśli rezerwacja została wykonana przez Internet;

* Id_Pokoju - pole typu int przechowuje numer porządkowy pokoju, który wybrał klient;

W bazie danych zdefiniowane zostały dwie relacje typu jeden do wielu. Relacje te mają na celu określenie sposobu poprawnego łączenia powiązanych danych w logiczną całość.

* Relacja określająca Id_Recepcjonisty w tabeli Rezerwacje;

* Relacja określająca Id_Pokoju w tabeli Rezerwacje;

3.4. Opis implementacji systemu przeznaczonego dla recepcji
3.4.1 Moduł Logowania

Pierwszym etapem implementacji aplikacji było stworzenie modułu logowania do systemu. Zostały one wdrożone przy pomocy komponentów Textbox i MaskedTextbox, w których użytkownik określa swój login i hasło. Po wciśnięciu przycisku zaloguj aplikacja szyfruje wprowadzone hasło i łączy się do bazy danych w celu porównania wprowadzonych informacji z tymi zapisanymi w bazie. Łączenie do bazy danych z aplikacji realizowane jest poprzez dołączoną do projektu bibliotekę MySQL Connector NET w wersji 6.1.2. Aby aplikacja mogła nawiązywać połączenia z bazą danych MySQL niezbędne jest również dodanie referencji do projektu oraz dopisanie linijki using MySql.Data.MySqlClient w przestrzeni nazw w klasie połączeniowej zaprezentowanej w przykładzie pierwszym.

Przykład 1. Implementacja klasy wykonującej połączenie i operacje Query, NonQuery na bazie danych:

using System;

using System.Collections.Generic;

using System.Collections;

using System.Linq;

using System.Text;

using MySql.Data.MySqlClient;

using System.Windows.Forms;

namespace WindowsFormsApplication1

{

public class Operacja_na_Bazie

{

MySqlConnection polaczenie = new MySqlConnection("SERVER=localhost;" + "DATABASE=testowa;" + "UID=root;" + "PASSWORD=proba;");

public void Non_Query(string polecenie_bazy)

{

MySqlCommand command = new MySqlCommand(polecenie_bazy,polaczenie);

try

{

polaczenie.Open();

command.ExecuteNonQuery();

}

catch (MySqlException e)

{

MessageBox.Show(e.ToString());

}

finally

{

polaczenie.Close();

}

}

public ArrayList Query(string polecenie)

{

ArrayList wiersze = new ArrayList();

MySqlConnection connection = polaczenie;

MySqlCommand command = connection.CreateCommand();

MySqlDataReader Reader;

command.CommandText = polecenie;

connection.Open();

Reader = command.ExecuteReader();

int j = -1;

while (Reader.Read())

{

ArrayList pola = new ArrayList();

j++;

for (int i = 0; i < Reader.FieldCount; i++)

{

pola.Add(Reader.GetValue(i).ToString());

}

wiersze.Add(pola);

}

connection.Close();

return wiersze;

}

}

}

Po poprawnym połączeniu do bazy aplikacja porównuje zaszyfrowane hasła, jeśli są identycznej postaci użytkownik zostaje zalogowany do systemu a informacje o jego prawach są pobierane z bazy. Zmienne dotyczące praw użytkownika służą do przyznawania i odbierania dostępu do poszczególnych pozycji w komponencie MenuStrip. Komponent ten przetwarza wszystkie wartości zmiennych i blokuje dostęp do pozycji, których wartość ustawiona jest na false

Pierwsze logowanie do systemu przeprowadzane jest jednak w inny sposób. Z założeń wynika, iż użytkownik tworzy wszelkie tabele w bazie danych poprzez aplikację. Przy pierwszym uruchomieniu nie ma jeszcze stworzonych tabel, więc logowanie musi odbywać się za pomocą, tzw. danych domyślnych. W momencie uruchomienia aplikacji sprawdzane jest czy baza danych zawiera tabele Recepcjoniści poprzez zapytanie do bazy: „show tables like, `Recepcjonisci`”, jeżeli polecenie to nie zwróci żadnych danych aplikacja wykonuje inny blok poleceń, w którym daje możliwość zalogowania się do systemu dzięki użyciu standardowego loginu: admin i hasła: 1234, a zaraz po zalogowaniu informuje użytkownika o potrzebie przeprowadzenia pierwszej konfiguracji.

3.4.2 Moduł tworzący model struktury hotelowej

Jednym z najważniejszych modułów systemu recepcji jest moduł tworzący tabele w bazie danych. Musi on być intuicyjny i czytelny. Dlatego formularz oddający użytkownikowi te funkcje w pierwszym kroku został ograniczony do podania tylko dwóch informacji. Początkowo zawiera on tylko trzy elementy są nimi dwa pola zaimplementowane dzięki komponentom Textbox oraz jeden przycisk. Pola mają za zadanie odczyt informacji o nazwie hotelu oraz liczbie pokoi. Wiedząc, iż nazwa hotelu nie powinna zawierać cyfr a liczba pokoi innych znaków poza cyframi postanowiono zabezpieczyć możliwość wprowadzania niepożądanych ciągów. Zabezpieczenie te opiera się na przypisaniu funkcji KeyPress dla określonych pól Textbox. Przedstawiona funkcja zatrzymuje wprowadzanie znaku, po czym dokonuje sprawdzenia czy wpisany symbol nie jest literą lub znakiem interpunkcyjnym. Jeśli operacja iloczynu logicznego jest prawdą aplikacja odblokowuje możliwość wprowadzenia kolejnego znaku poprzez zmianę wartości Handled dla komponentu Textbox na false. W przeciwnym razie system pokazuje użytkownikowi komunikat informujący go o błędzie, jaki popełnił. Funkcja KeyPress wykonywana jest za każdym razem, kiedy użytkownik wprowadzi pojedynczy symbol w polu Textbox.

Przykład 2. Implementacja funkcji KeyPress blokującej litery i znaki interpunkcyjne:

private void textBox3_KeyPress(object sender, KeyPressEventArgs e)

{

e.Handled = true;

if ((!char.IsLetter(e.KeyChar)) && (!char.IsPunctuation(e.KeyChar)))

{

e.Handled = false;

}

else

{

MessageBox.Show("Możliwość wprowadzania tylko cyfr");

}

Po wprowadzeniu danych dotyczących hotelu aplikacja generuje pola, które grupowane są w listy. Pola te dają możliwość wprowadzenia użytkownikowi danych dotyczących cen oraz właściwości pokojów. Po uzupełnieniu wszystkich informacji system tworzy odpowiednie tabele w bazie i uzupełnia dwie z nich: hotel i pokoje o dane wprowadzone przez użytkownika.

3.4.3 Moduł zrządzania recepcjonistami

Kolejnym etapem implementacji systemu było umożliwienie dodawania, usuwania, modyfikacji jak i nadawania praw dla recepcjonistów. Tylko użytkownik mający prawo dostępu do tego modułu może zarządzać użytkownikami aplikacji. Oparto go na komponencie ListBox, który ma za zadanie wyświetlanie wszelkich informacji na temat utworzonych już wcześniej kont. Do określenia danych użytkownika wykorzystano komponent Textbox, natomiast do przyznania praw recepcjoniście użyto wbudowanego obiektu typu ComboBox. Pozwala on na proste zdefiniowanie uprawnień lub ich braku do korzystania z określonych modułów. Po sprawdzeniu czy wszystkie pola tekstowe zostały uzupełnione aplikacja szyfruje hasło i umieszcza dane w bazie.

Formularz umożliwiający modyfikację recepcjonisty wymaga od użytkownika podania stosownego numeru identyfikacyjnego, które celowo uwidocznione jest w komponencie Listbox. Jeżeli wprowadzony numer recepcjonisty znajduje się w bazie system pobierze wszystkie informacje i umieści w odpowiednich polach tekstowych typu Textbox, dzięki czemu użytkownik może bezzwłocznie rozpocząć edycję. Po dokonaniu wszystkich przewidzianych zmian informacje modyfikowane są w bazie poprzez instrukcje Update będącą poleceniem języka SQL. W przypadku kiedy podane id recepcjonisty jest błędne aplikacja przy użyciu metody MessageBox informuje użytkownika o błędzie.

Funkcja usuwająca recepcjonistę działa w sposób analogiczny jedyną różnicą jest zmiana wykorzystywanej instrukcji na delete from `recepcjoniści` where id =`zmienna`

3.4.4 Bezpieczeństwo systemu - metoda szyfrująca

Odpowiedzialna za szyfrowanie haseł jest metoda Rijndael zwana również metodą AES (ang. Advanced Encryption Standard). Do wykorzystania algorytmu potrzebne są dwa 32 bitowe ciągi znaków i cyfr oraz jeden 16 bitowy. Ponadto należy określić algorytm haszujący, iterację, po której hasło zostanie utworzone, oraz rozmiar klucza, który chcemy uzyskać.

Algorytm pobiera dwa 32 bitowe ciągi znaków (w naszym przypadku mogą one zawierać tylko znaki ASCII) i konwertuje je na tablice bajtów. W kolejnym kroku na tablicę bajtów zamieniany jest wprowadzony ciąg znaków oraz tworzone jest hasło, które posłuży do wyprowadzenia klucza. Hasło te generowane jest w dwóch iteracjach wykorzystując dwa 32bitowe ciągi i metodę haszującą SHA-1. Po uzyskaniu klucza definiowany jest strumień pamięci, która zostanie użyta do przechowywania zaszyfrowanych danych. Po zakończeniu szyfrowania pamięć zostaje zwolniona, a zaszyfrowaną tablicę bajtów konwertuję się do postaci zmiennej string, zwracaną przez funkcję.

Przykład 3. Implementacja metody szyfrującej Rijndael wraz z przykładem wykorzystania

public static string EncryptText(

string plainText,string passPhrase,string saltValue,string hashAlgorithm,int passwordIterations,string initVector,int keySize)

{

//Tworzenie dwóch tablic bajtów z 32bitowych ciągów cyfr i liter

byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);

byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);

//Utworzenie tablicy bajtów z podanego ciągu znaków.

byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);

//Wygenerowanie hasła

PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase,saltValueBytes,hashAlgorithm,passwordIterations);

//Użycie hasła do wygenerowania pseudolosowej tablicy bajtów

byte[] keyBytes = password.GetBytes(keySize / 8);

RijndaelManaged symmetricKey = new RijndaelManaged(); symmetricKey.Mode = CipherMode.CBC;

ICryptoTransform encryptor = symmetricKey.CreateEncryptor(

keyBytes,initVectorBytes);

//Definicja strumienia pamięci

MemoryStream memoryStream = new MemoryStream();

CryptoStream cryptoStream = new CryptoStream(memoryStream,encryptor,CryptoStreamMode.Write);

// Start szyfrowania

cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);

// Zakończenie szyfrowania

cryptoStream.FlushFinalBlock();

//Konwersja strumienia pamieci na tablice bajtów

byte[] cipherTextBytes = memoryStream.ToArray();

// Zamknięcie strumieni

memoryStream.Close();

cryptoStream.Close();

// Konwersja z tablicy bajtów na zmienna string

string cipherText = Convert.ToBase64String(cipherTextBytes); return cipherText;

}

Przykład 4. Użycie metody szyfrującej:

string haslo = EncryptText(textBox4.Text,"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1", "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb","SHA1",2,"poiuytrewqlkjhgf,256);
3.4.5 Moduł obsługi i zarządzania pokojami

Podstawowym elementem aplikacji jest moduł pokazujący stan zameldowania łączący pośrednio moduł aplikacji desktopowej i internetowej. System po zalogowaniu użytkownika pobiera informacje o ilości pokoi oraz ich numery z bazy danych a następnie tworzy i umieszcza przyciski na komponencie Panel. Dbając o czytelność aplikacji zdecydowano się na kolorowanie odpowiednich stanów pokoi. Wykorzystując podstawowy składnik Visual Studio, jakim jest Timer aplikacja łączy się z bazą danych, co 1s dokonując pobrania informacji dotyczących rezerwacji dla wszystkich pokoi. Jeżeli użytkownik dokonał rezerwacji internetowej recepcjonista zostanie o tym poinformowany przez system poprzez zmianę koloru guzika odzwierciedlającego numer wybranego pokoju.

Możliwości dokonania, zmiany, usunięcia i przeglądu rezerwacji dostępne są dla każdego recepcjonisty po kliknięciu w przycisk odpowiadający określonemu pokojowi. Wszystkie przyciski posiadają swoją nazwę w postaci "Pokój" + numer oraz sparametryzowaną funkcję mającą za zadanie wywołanie nowego formularza. Parametrem metody jest zmienna określająca numer pokoju, którego dane chcemy uzyskać. Przekazanie tej informacji do nowo otwartego okna aplikacji jest niezbędne do pobrania wszelkich danych i wykonania dalszych instrukcji, gdyż nowy formularz dotyczy tylko operacji na wybranym pokoju. Po poprawnym przesłaniu zmiennej nowo otwarta klasa dodaje komponent TabControl z zakładkami: „Informacje o pokoju”, „Zarezerwuj”, ”Modyfikuj Rezerwacje”, „Usuń Rezerwacje”, „Terminarz”. Kolejny krok aplikacji to wywołanie metody, która pobiera z bazy danych wszystkie informacje na temat wybranego pokoju jak również dokonanych dla niego rezerwacji. Aby przyspieszyć działanie systemu przewidziano sparametryzowanie generowania wyników dodawanych do komponentów ListView. Metoda ta zapewnia obsługę trzech zakładek:

* Rezerwacje oraz Usuń Rezerwacje - gdzie pobierane są wszystkie informacje na temat rezerwacji wykonanych dla tego pokoju.

* Modyfikuj Rezerwacje - gdzie pobierane są tylko rezerwacje, które jeszcze trwają. Chodzi tutaj o możliwość ewentualnego skrócenia lub wydłużenia pobytu, jeśli terminarz pokoju na to pozwala.

Parametrem funkcji jest komponent ListView, do którego pobierane są pożądane informacje. Działanie metody polega na wybraniu określonego polecenia SQL zależnie od parametru wejściowego funkcji.

Zakładka Zarezerwuj oddaje recepcjoniście możliwość zameldowania potencjalnego klienta w wybranym przez niego pokoju. Formularz wykorzystuje komponenty TextBox, ComboBox, DateTimePicker oraz Label. Kontrolki Textbox wykorzystywane są w celu podania danych teleadresowych klienta, a komponent ComboBox idealnie sprawdza się, kiedy umożliwiamy użytkownikowi wybór odpowiedzi spośród tych przewidzianych przez aplikację. Dlatego wykorzystano go do opisania kraju, z którego pochodzi klient oraz wybranej przez niego formy płatności. Dzięki właściwościom ComboBox.AutoCompleteMode = SuggestAppend i ComboBox.AutoCompleteSource = ListItems aplikacja wprowadza propozycje końcowe państw znajdujących się na liście ListItems. Możliwy jest jednocześnie bezpośredni wybór kraju z rozwijanej listy tego komponentu. Kontrolki DateTimePicker wprowadzono, aby daty wybrane przez klienta zapisywane były do bazy danych w odpowiednim formacie. Realizowane jest to poprzez ustawienie właściwości data.CustomFormat = "yyyy-MM-dd 12:00:00”. DateTimePicker przyspiesza jednocześnie wybór dat z rozwijanej tabeli bez konieczności ich wpisywania. Moduł rezerwujący przewiduje również szybką metodę wyszukania klienta w archiwum i wstawienie jego danych do rezerwacji umożliwiając jednocześnie ich ewentualną edycję. Metoda ta wykorzystuje funkcje IndexOf, dzięki której możliwe jest przeszukiwanie archiwum po wielu kryteriach zaprezentowano to w przykładzie nr 5.

Po uzupełnieniu lub wstawieniu informacji z archiwum aplikacja sprawdza czy wszystkie pola zostały wypełnione i łączy się z bazą danych w celu sprawdzenia dostępności wybranego pokoju. Wykonywanie sprawdzenia realizowane jest poprzez odpowiednie zapytanie do bazy danych zaprezentowane w przykładzie 6.

Przykład 5. Implementacja wyszukiwania klienta przy użyciu metody IndexOf

private void filtruj_rezerwacje(object sender, System.EventArgs e)

{

ArrayList lista_wszystkich_zamowien = new ArrayList();

for (int i = 0; i < lista.Count; i++)

{

ArrayList wiersz = (ArrayList)lista[i];

ArrayList lista_zamowien = new ArrayList();

lista_zamowien.Add((string)wiersz[1]);

lista_zamowien.Add((string)wiersz[2]);

lista_zamowien.Add((string)wiersz[3]);

lista_zamowien.Add((string)wiersz[4]);

lista_wszystkich_zamowien.Add(lista_zamowien);

}

dataGridView1.Rows.Clear();

for (int i = 0; i < lista_wszystkich_zamowien.Count; i++)

{

ArrayList wiersz = (ArrayList)lista_wszystkich_zamowien[i];

bool prawidlowy = true;

for (int j = 0; j < wiersz.Count; j++)

{

string komorka = (string)wiersz[j];

TextBox pole = (TextBox)lista_pol[j];

if ((pole.Text != "" && komorka.IndexOf(pole.Text) != 0))

{

prawidlowy = false;

break;

}

}

if (prawidlowy == true)

{

ArrayList list = (ArrayList)lista[i];

dataGridView1.Rows.Add(list.ToArray());

}

}

}

Przykład 6. Polecenie SQL wykonujące sprawdzenie dostępności pokoju w wybranym terminie.

polecenie = "SELECT * FROM rezerwacje where (nr_pokoju='" + (numerpobierania) + "') and ((('"+ dateTimePicker1.Text.Trim() + "'>=data1) and ('" + dateTimePicker1.Text.Trim() + "'<data2)) or (('" + dateTimePicker2.Text.Trim() + "'>data1) and ('" + dateTimePicker2.Text.Trim() + "'<=data2)))";

Jeśli zapytanie nie zwróci żadnych danych, świadczy to o możliwości rezerwacji danego pokoju. W tym przypadku kolejnym krokiem jest obliczenie należności za pobyt klienta. System pobiera z bazy danych cenę pokoju za dobę, oblicza czas pobytu na podstawie różnicy wybranych dat i mnoży je otrzymując w ten sposób należność. Ostatnim krokiem jest umieszczenie wszystkich danych w bazie za pomocą instrukcji Insert.

Aby możliwe było zaplanowanie wizyty potencjalnego klienta oddano użytkownikowi również możliwość sprawdzenia przyszłych jak i przeszłych rezerwacji za pomocą terminarza. Oparty został on na dodatkowym komponencie MPK_Calendar ze względu na ubogość konfiguracji wbudowanego elementu, jakim jest MonthCalendar. Wykorzystanie kontrolki MPK_Calendar umożliwiło zaznaczanie kolorem czerwonym dat, w którym pokój jest lub był zajęty, a kolorem zielonym okres, w który pokój pozostawał wolny. Po wybraniu zakładki terminarza system pobiera z bazy danych daty rozpoczęcia i zakończenia rezerwacji dla danego pokoju przekształca je do odpowiedniego formatu grupując w listy, które umieszcza w zbiorze BoldedDates.

Przykład 7. Implementacja terminarza

ArrayList listadat;

Operacja_na_Bazie operacja = new Operacja_na_Bazie();

listadat = operacja.Query("Select data1,data2 from rezerwacje where nr_pokoju='" + numerpobierania + "'");

List<DateTime> listazawierajacadatetime = new List<DateTime>();

List<DateTime> listazawierajacawszystkiedatetime = new List<DateTime>();

for (int i = 0; i < listadat.Count; i++)

{

ArrayList wiersz_dat = (ArrayList)listadat[i];

for (int j = 0; j < wiersz_dat.Count; j++)

{

string datka = wiersz_dat[j].ToString();

string[] wytnij = datka.Split('-');

int rok, miesiac, dzien;

rok = Convert.ToInt32(wytnij[0]);

miesiac = Convert.ToInt32(wytnij[1]);

string[] wytnijdzien = wytnij[2].Split(' ');

dzien = Convert.ToInt32(wytnijdzien[0]);

DateTime dat = new System.DateTime(rok, miesiac, dzien, 0, 0, 0, 0);

listazawierajacadatetime.Add(dat);

listazawierajacawszystkiedatetime.Add(dat);

}

TimeSpan roznica = listazawierajacadatetime[1].Subtract(listazawierajacadatetime[0]);

double rozniczka = roznica.TotalDays;

int iledat = Convert.ToInt32(rozniczka);

for (int k = 1; k < iledat; k++)

{

DateTime data_pomiedzy = (listazawierajacadatetime[0].AddDays(k));

listazawierajacawszystkiedatetime.Add(data_pomiedzy);

}

listazawierajacadatetime.Clear();

}

mpK_Calendar1.BoldedDates = listazawierajacawszystkiedatetime.ToArray();

}

3.4.6 Moduł kopii bezpieczeństwa

System uwzględnia mechanizmy wykonywania i przywracania kopii bezpieczeństwa. Funkcja wykonywania kopii może zostać zautomatyzowana poprzez opcję Zaplanuj Kopię Zapasową. Formularz realizujący tą metodę wymaga podania przez użytkownika podstawowych danych dotyczących: lokalizacji przechowywania kopii zapasowej, okresu realizacji jak i jej godziny. Wybór ścieżki systemowej zrealizowany został dzięki kontrolce FolderBrowserDialog, która pozwala użytkownikowi na proste przeglądanie, wybieranie oraz tworzenie folderów. Po wybraniu lokalizacji przez użytkownika ścieżka kopiowana jest do komponentu TextBox, co pozwala na jej proste zredagowanie. Kontrolka ComboBox służy do wyboru okresu czasu, po którym wykonywana będzie kopia. System przewiduje codzienną, co tygodniową oraz co miesięczną kopię zapasową. Po wprowadzeniu przez użytkownika godziny realizacji system umieszcza dane w bazie. Pobierając, co sekundę stan zameldowania aplikacja sprawdza również czy umieszczony w bazie okres realizacji kopii nie jest zgodny z bieżącą datą. Jeśli porównanie to jest prawdziwe system wykonuje kopię bezpieczeństwa poprzez zapytanie do bazy danych zwracające informacje, które zapisywane do plików tekstowych. Po zapisie plików system pobiera i umieszcza w bazie aktualną datę, co umożliwia powtórne obliczenie terminu realizacji kopii bezpieczeństwa. Metodę zaprezentowano w przykładzie 8.

Odzyskanie zapisanej kopii bezpieczeństwa oparte o przykład nr 9 wymaga wybrania przez użytkownika plików testowych z kopią zapasową. W ten sposób system przywraca tylko te dane, które zostały utracone nie zmieniając przy tym informacji w pozostałych tabelach bazy. Do wyboru plików posłużono się komponentem OpenFileDialog, którego właściwość Filter zdefiniowano, jako „Pliki tekstowe (*.txt)|*.txt|Wszytskie pliki (*.*)|*.*”. Wymusza to na kontrolce domyślne pokazanie plików z rozszerzeniem *.txt. Po wyborze odpowiednich plików aplikacja sprawdza ich poprawność i przywraca wskazane tabele z kopii zapasowej poprzez polecenie SQL

Przykład 8. Implementacja wykonania automatycznej kopii zapasowej

//Obliczanie czy pobrane daty się zgadzają

DateTime data = new DateTime(Convert.ToInt16(rok), Convert.ToInt16(miesiac), Convert.ToInt16(dzien), 0, 0, 0);

data = data.AddHours(godziny);

data = data.AddMinutes(minuty);

data = data.AddDays(co_ile);

DateTime data2 = data;

data2 = data2.AddDays(-co_ile);

if ((DateTime.Now.ToString() == data.ToString()) || (DateTime.Now.ToString() == data2.ToString()))

{

string nowasciezka = sciezka.Replace("/", "\\\\");

DateTime datawykonania = data;

datawykonania = datawykonania.AddDays(-co_ile);

string poprzednia = datawykonania.ToString();

string[] odetnijgodzine = poprzednia.Split(' ');

DateTime nastepna = DateTime.Today;

//Przeprowadzenie backupu

Operacja_na_Bazie operacja = new Operacja_na_Bazie();

operacja.Non_Query("SELECT * INTO OUTFILE '" + nowasciezka + "\\\\" + "hotel" + odetnijgodzine[0] + ".txt" + "' FROM hotel");

operacja.Non_Query("SELECT * INTO OUTFILE '" + nowasciezka + "\\\\" + "backup" + odetnijgodzine[0] + ".txt" + "' FROM backup");

operacja.Non_Query ("SELECT * INTO OUTFILE '" + nowasciezka + "\\\\" + "recepcjonisci" + odetnijgodzine[0] + ".txt" + "' FROM recepcjonisci");

operacja.Non_Query ("SELECT * INTO OUTFILE '" + nowasciezka + "\\\\" + "rezerwacje" + odetnijgodzine[0] + ".txt" + "' FROM rezerwacje");

operacja.Non_Query ("SELECT * INTO OUTFILE '" + nowasciezka + "\\\\" + "pokoje" + odetnijgodzine[0] + ".txt" + "' FROM pokoje");

//Zapis nowej daty

operacja.Non_Query ("Update backup set data_ostatniej='" + nastepna.ToString() + "';");

MessageBox.Show("Wykonano zaplanowany backup bazy danych");

}

Przykład 9. Implementacja przywracania kopii bezpieczeństwa

private void przywroc()

{

if ((textBox1.Text == "") && (textBox2.Text == "") && (textBox3.Text == "") && (textBox4.Text == "") && (textBox5.Text == ""))

{

MessageBox.Show("Proszę wybrać chociaż jeden plik do przywrócenia");

}

else

{

if (textBox1.Text != "")

{

string sciezka = textBox1.Text.Replace("\\", "\\\\");

Operacja_na_Bazie operacja = new Operacja_na_Bazie();

operacja.Non_Query("delete from hotel");

operacja.Non_Query("LOAD DATA INFILE '" + sciezka + "' INTO TABLE hotel;");

MessageBox.Show("Przywrócono tabele hotel");

}

//Przywracanie kolejnych plików jeśli zostały wybrane

}

3.4.7 Moduł generujący statystyki

Organizowanie przez właściciela hotelu okresowych obniżek cenowych oraz promocji wymaga analizy rezerwacji w określonych terminach, jak również danych statystycznych dotyczących kosztów rezerwacyjnych, najchętniej wybieranych form płatności czy też typu najczęściej rezerwowanych pokoi. Do implementacji statystyk wykorzystano bibliotekę ZedGraph umożliwiającą generowanie słupkowych, kołowych oraz liniowych wykresów. Moduł opiera się na dziedziczonym formularzu, który ujednolica oddany użytkownikowi interfejs, przyspieszając jednocześnie działanie i tworzenie aplikacji. Formularz wykorzystuje dwa komponenty DateTimePicker przewidziane do ustalenia okresu, w którym znajdują się najpotrzebniejsze użytkownikowi informacje. Po wyborze dat aplikacja łączy się z bazą pobierając dane zależne od typu generowanych statystyk dodając je do list. Metoda generująca wykres wymaga podania parametru. którym jest komponent ZedGraphControl. Kontrolka ta odpowiada za rozmiar i położenie generowanego wykresu na formularzu. Kolejnym krokiem implementacji metody było stworzenie par punktów nanoszonych na wykres. W zaprezentowanej implementacji oś x reprezentuje daty rezerwacji a oś y ilość ich wystąpień. Założono, iż najlepszym typem wykresu jest typ słupkowy z dodatkowo naniesioną linią trendu. Do stworzenia tego rodzaju wykresu posłużyły obiekty BarItem oraz LineItem wraz ze sprecyzowanymi właściwościami takimi jak kolor czy lista par punktów. Ostatnim krokiem implementacyjnym było stworzenie komponentu Label, którego zadaniem stało się obliczenie całkowitej ilości wystąpień rezerwacji w wybranym przez użytkownika okresie.

Przykład 10. Implementacja statystyk określających ilość rezerwacji w czasie:

protected virtual void CreateGraph1(ZedGraphControl zgc)

{

GraphPane myPane = zgc.GraphPane;

// Ustalenie tytułów

myPane.Title.Text = "Wykres ilości rezerwacji w czasie";

myPane.XAxis.Title.Text = "Dni";

myPane.YAxis.Title.Text = "Ilość Rezerwacji";

double x,y;

PointPairList list1 = new PointPairList();

for (int i = 0; i <=liczba_dni ; i++)

{

//x to daty y to ilosc rezerwacji w danym terminie pobrany z

bazy danych

x = (double)new XDate(daty[i]);

y = pobrane_informacje[i];

list1.Add(x, y);

}

BarItem myBar = myPane.AddBar("Rezerwacje",list1, Color.Red);

myPane.YAxis.Scale.MinorStep = 1.0;

myPane.XAxis.Scale.MinorStep = 1.0;

myPane.XAxis.Type = AxisType.Date;

//Linia trendu kolor czerwony punkty jako gwiazdy

LineItem myCurve2 = myPane.AddCurve("",

list1, Color.Red, SymbolType.Star);

zgc.AxisChange();

calkowita = new System.Windows.Forms.Label();

calkowita.Size = new Size(ClientRectangle.Width + 200, ClientRectangle.Height + 20);

calkowita.Text = "Całkowita ilosc rezerwacji w wybranym czasie = " + calkowita_ilosc_rezerwacji.ToString();

calkowita.Location = new Point(ClientRectangle.Width - 515, ClientRectangle.Height - 40);

Font czcionka = new Font("Tahoma", 12);

calkowita.Font = czcionka;

this.Controls.Add(calkowita);

}

3.5. Opis implementacji aplikacji internetowej

Aplikację internetową zaimplementowano z myślą o dokonywaniu rezerwacji hotelowej poprzez sieć Internet. Dzieli się ona na 4 główne moduły, w których użytkownik określa datę, wybiera pokój oraz uzupełnia swoje dane teleadresowe. Aplikacja wykorzystuje kaskadowe arkusze stylów pozwalające na bardziej elastyczne zarządzanie wyglądem strony internetowej, jak również komponenty oparte o technologię Ajax.

3.5.1 Moduł informacyjny

Głównym zadaniem modułu jest przybliżenie sylwetki hotelu, w którym potencjalny klient dokonywał będzie rezerwacji pokoju. Oparty został on o formularz, na którym dodano bloki div zaczerpnięte z biblioteki Web.UI.HtmlControls.HtmlGenericControl. Wygląd, rozmiar jak i formatowanie bloków div sprezyowane zostało w arkuszu stylów dołączonym do aplikacji poprzez polecenie:

<link href="StyleSheet1.css" rel="stylesheet" type="text/css"/>

Moduł ten wykorzystuje specjalnie zaimplementowaną klasę połączeniową do wymiany informacji z bazą danych zaprezentowaną w przykładzie 11. Do formularza dołączono metodę Page_Load, która po wczytaniu strony w przeglądarce wywołuje połączenie z bazą w celu pobrania informacji o nazwie hotelu. Pobrane informacje przekazywane są do komponentu, Label który odpowiada za wyświetlanie pobranych informacji na stronie internetowej.

Przykład 11. Implementacja połączenia z bazą danych w ASP.NET

public partial class _Default : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

string thisrow = "";

Polacznie_z_Baza polacznie_z_baza = new Polacznie_z_Baza();

thisrow = polacznie_z_baza.Query("SELECT nazwa_hotelu FROM hotel where id_hotelu='1'");

Label1.Text ="Hotel " + thisrow;

}

}

3.5.2 Moduł wyboru daty

Zadaniem tego mudułu jest udostępnienie użytkownikowi jak najłatwiejszej metody sprecyzowania czasu trwania pobytu w hotelu. Wykorzystuje on dodatkowe komponenty oparte o technologię Ajax. Aby dołączone biblioteki wspierane były przez serwer IIS niebędne jest dołaczenie ich do projektu orz umiejscowienie w katalogu bin aplikacji. Wszystkie kontrolki oparte o technologię Ajax wymagają umieszczenia na stronie internetowej komponentu, ScriptManager, którego zadaniem jest zarządzanie bibliotekami ASP.NET AJAX jak również częściowe renderowanie stron. Dołączenie do modułu kontrolki BasicDatePicker pozwala na szybkie oraz dokładne sprecyzowanie daty przyjazdu i wyjazdu klienta dzięki wykorzystaniu rozwijanej tabeli zawierającej kalendarz. Zabepiecznie mające na celu wyeliminowanie błędu jakim jest podanie późniejszej daty przyjazdu niż odjazdu, czy też wybór tych samych dat zaimplementowane zostało dzięki ustawieniu dwóch komponentów DateRangeValidator i przypisaniu im właściwości ControlToValidate na odpowiednie kontrolki BasicDatePicker. Dodatkowo określono minimalne daty możliwe do wyboru

DateRangeValidator1.MinimumDate = DateTime.Now;

DateRangeValidator2.MinimumDat= BDPLite1.SelectedDate.AddDays(1);

Po zatwierdzeniu wybranych przez użytkownika dat aplikacja sprawdza ich poprawność, przekształca do odpowiedniego formatu i przekazuje do kolejnego modułu poprzez metodę Page.Response.Redirect()

Implementacja modułu wyboru daty:

protected void Page_Load(object sender, EventArgs e)

{

string thisrow = "";

Polacznie_z_Baza polacznie_z_baza1 = new Polacznie_z_Baza();

thisrow = polacznie_z_baza1.Query("SELECT nazwa_hotelu FROM hotel where id_hotelu='1'");

Label2.Text = "Rezerwacja - Hotel " + thisrow;

DateRangeValidator1.MinimumDate = DateTime.Now;

DateRangeValidator2.MinimumDate = BDPLite1.SelectedDate.AddDays(1);

}

protected void Button1_Click1(object sender, EventArgs e)

{

//Sprawdza czy daty nie są puste

if (BDPLite1.IsNull || BDPLite2.IsNull)

{}

else

{

DateRangeValidator1.Validate();

DateRangeValidator2.Validate();

//JEżeli wybrane daty są prawidłowe

if ((DateRangeValidator1.IsValid == true) && (DateRangeValidator2.IsValid == true))

{

string[] wytnij = BDPLite1.SelectedDate.ToString().Split(' ');

string[] wytnij1 = BDPLite2.SelectedDate.ToString().Split(' ');

Page.Response.Redirect("Pokoje.aspx?data1=" + wytnij[0] + "&data2=" + wytnij1[0]);

}

}

}

3.5.3 Moduł wyboru pokoju

Zadaniem strony Pokoje jest pobranie dat wybranych przez klienta w poprzednim module oraz umożliwienie woboru wolnego pokoju. Realizowane jest to dzięki metodzie Request, która pobiera metodą POST wartości zmiennych data1 i data2. Kolejnym zadaniem aplikacji jest pobranie listy wolnych pokoi w obrębie zdefiniowanych dat. Wykonywane jest to poprzez odpowiednie zapytanie do bazy danych: SELECT * FROM rezerwacje where (id_pokoju='"+i+"') and ((('" + data1a + "'>=data1) and ('" + data1a + "'<data2)) or (('" + data2a + "'>data1) and ('" + data2a + "'<=data2))) "

Jeśli licznik pobranych rekordów równy jest 0 ozncza to że w hotelu nie ma wolnych pokoi w terminie określonym przez klienta. W przeciwnym razie generowane są guziki których ilośc odpowiada wartości licznika. Implementację dodawania przycisków przeprowadzono dzięki metodzie Atributte.Add, która pozwala na dynamiczną zmianę parametrów graficznych ustawionych w kaskadowym arkuszu stylów. Każdy z przycisków posiada metodę PostBackURL dzięki której przekierowuje użytkownika do nowego modułu pobierając informacje o wybranym pokoju w postaci jego ID.

Implementacja wyboru pokoju :

protected void Page_Load(object sender, EventArgs e)

{

string thisrow = "";

Polacznie_z_Baza polacznie_z_baza1 = new Polacznie_z_Baza();

thisrow = polacznie_z_baza1.Query("SELECT nazwa_hotelu FROM hotel where id_hotelu='1'");

Label2.Text = "Rezerwacja - Hotel " + thisrow;

string data1a = Request["data1"] +" 12:00:00";

string data2a = Request["data2"] +" 12:00:00";

System.Web.UI.HtmlControls.HtmlGenericControl content_kartka = new System.Web.UI.HtmlControls.HtmlGenericControl("DIV");

content_kartka.ID = "content_kartka2";

Panel1.Controls.Add(content_kartka);

string wynik;

Polacznie_z_Baza polaczenie = new Polacznie_z_Baza();

wynik = polaczenie.Query("Select ilosc_pokoi from hotel");

int ile_pokoi = Convert.ToInt32(wynik);

int licznik=0;

for (int i = 0; i < ile_pokoi; i++)

{

string wynik1="";;

Polacznie_z_Baza polaczenie1 = new Polacznie_z_Baza();

wynik1 = polaczenie1.Query("SELECT * FROM rezerwacje where (id_pokoju='"+i+"') and ((('" + data1a + "'>=data1) and ('" + data1a + "'<data2)) or (('" + data2a + "'>data1) and ('" + data2a + "'<=data2))) ");

if (wynik1 == "")

{

Button proba = new Button();

proba.Attributes.Add("style", "position:relative; top:40px; left:0px; width:40px; height:50px; background-image:url('room.png');background-repeat:no-repeat;");

proba.ID = "proba" + i.ToString();

proba.PostBackUrl = "Dane.aspx?id=" + i.ToString()+"&data1="+data1a+"&data2="+data2a;

content_kartka.Controls.Add(proba);

licznik++;

}

}

if (licznik == 0)

{

Label niema_wolnych = new Label();

niema_wolnych.Text = "Przepraszamy w wybranym terminie nie ma wolnych pokoi";

niema_wolnych.ID = "niemawolnych";

content_kartka.Controls.Add(niema_wolnych);

}

3.5.4 Moduł określający dane teleadresowe klienta

Moduł ten ma zadanie określenie danych teleadresowych klienta, które po zweryfikowaniu zapisane zostaną do bazy wraz z parametrami rezerwacji okreslonymi podczas całego procesu rezerwacji. Po odczytaniu wartości zmiennych poprzez metodę Request na formularz główny dodane zostają dwa bloki div. W pierwszym bloku użytkownik może zweryfikować wszystkie właściwości pokoju który wybrał natomiast drugi blok służy do wypełnienia danych klienta bez których rezerwacja byłaby niemożliwa. Blok dostarczający wszelkich informcji o pokoju oparty został o komponent Label, którego właściwość Text przyjmuje wartość danych pobranych z bazy. Drugi blok zbudowany jest z komponentów Label i Textbox w które należy wpisać swoje dane teleadresowe. Uzględniono tutaj również zabezpieczenie przed wpisem błędnych danych jak i pozostawienia któregoś z pól niewypełnionego.

Aby zabezpieczyć pola Textbox przed wpisywaniem błednych danych posłużono się komponentem RegularExpressionValidator, którego zadaniem jest porównanie wprowadzonego tekstu z wyrażeniem regularnym ustawionym w właściwości ValidationExpression kontrolki. Jeżeli wiemy, że email rezerwującego musi składać się z nazwy użytkownika znaku @ i domeny, w której posiada on konto ustawiono odpowiednie wyrażenie regularne: ValidationExpression = „\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+) *”, które powstrzyma aplikację przed zapisem błędnych danych do bazy. Kontrola wypełnienia wszystkich pól zrealizowana została dzięki kontrolce, RequiredFieldValidator, który wyświetli odpowiedni komunikat, jeśli użytkownik pominie jedno z wymaganych pól. Po naciśnięciu przycisku aplikacja pobiera wszystkie informacje dotyczące rezerwacji i zapisuje je w odpowiednich rekordach baz danych informując przy tym użytkownika o poprawnym procesie rezerwacji.

4. Aplikacja

W rozdziale tym omówiono sposób posługiwania się systemem obsługi małego hotelu. Opisano przewodnik po aplikacji przeznaczonej do recepcji jak również pokazano poprawny przebieg rezerwacji dokonywanej z sieci Internet. Rodział ten porusza również zagadnienia związane z dalszą możliwością rozwoju aplikcaji, instalacji systemu oraz pierwszym jego uruchomieniem.

4.1. Instalacja oraz pierwsze uruchomienie aplikacji

Opis procesu instalcji dostosowany został do systemu wykorzystującego lokalną bazę danych. Dlatego najpierw należy zainstalować Aplikację MySQL Server 5.0 i aplikację pomocną w konfigurowaniu bazy danych MySQL Query Browser, którą znajdziemy w pakiecie MySQL GUI Tools. Pola użytkownik i hasło powinny zostać wypełnione jako „root” i „proba”. Kolejnym krokiem jest stworzenie bazy danych naszego hotelu. Dzięki MySQL Query Browser logujemy się do MySQL Server i klikając w prawe menu prawym przyciskiem myszki wybieramy opcję „Utwórz nową bazę danych”. W pole „Nazwa Bazy” należy wpisać „testowa”. Następnie należy uruchomić instalator systemu zarządzania recepcją, po pomyślnie zakończonym procesie instalacji system jest gotowy do pracy.

Pierwsze uruchomienie wymaga od użytkownika znajomości loginu: „admin” i i hasła: „1234”. Po zalogowaniu do systemu należy niezwłocznie utworzyć konto recepcjonisty poprzez opcję „Zarządzanie => Recepcjoniści”, a następnie utworzyć tabele w bazie danych poprzez opcję „Zarządzanie => Stwórz bazę hotelu”. Po wykonaniu tych czynności wylogować tymczasowego użytkownika.

4.2. Przewodnik po aplikacji desktopowej

Na rysunku 4.1 przedstawiono pierwszy krok po instalacji systemu którym jest logowanie się do aplikacji. Pierwsze logowanie odbywa się poprzez tymczasowy login i haslo.

Login: admin Haslo: 1234.

Rysunek 4.1 Moduł odpowiedzialny za pierwsze logowanie do systemu

Rysunek 4.2 Moduł tworzenia modelu struktury hotelowej

Na rysunku 4.2 przedstawiono moduł odpowiedzialny za odwzorowanie struktury pokojów w hotelu i opis ich własności. Po poprwnym uzupełnieniu informacji aplikacja informuje użytkownika o stworzeniu w bazie danych wszystkich wymaganych tabel.

Rysunek 4.3 Moduł zarządzania recepcjonistami.

Rysunek 4.3 przedstawia proces dodawania recepcjonisty i nadawania mu praw dostępu. Wymagane jest utworzenie chociaż jednego recepcjonisty który posiadać będzie wszytskie prawa.

Rysunek 4.4 Moduł zarządzania hotelem.

Na rysunku 4.4 zaprezentowano moduł pozwalający na wyświetlenie wszystkich informacji o pokojach. Jego głównym zadaniem jest pokazywanie aktualnego stan zameldowania, dostęp do menu aplikacji jak również wgląd w szczegóły poszczególnych pokoi.

Rysunek 4.5 Moduł zarządzania hotelem - rezerwacja nowego klienta

Rysunek 4.5 pokazuje proces rezerwacji wybranego pokoju dla klienta, który nie korzystał wcześniej z usług hetelu.

Rysunek 4.6 Moduł zarządzania hotelem - terminarz pokoju

Rysunek 4.6 obrazuje wykorzystanie terminarza. Umożliwia on wgląd w przyszłe, aktualne i przeszłe obciążenie danego pokoju.

Na rysunku 4.7 przedstawiono wgląd w archiwum jak i możliwość jego przeszukiwania ze względu na różne kryteria.

Rysunek 4.7 Moduł przeglądu rezerwacji - Archiwum

Rysunek 4.8 Moduł planowania automatycznej kopii zapasowej.

Na rysunku 4.8 zaprezentowano klasę odpowiadającą z planowanie wykonania automatycznej kopii zapasowej. Po uzupełnieniu danych i zapisaniu ich do bazy system poszerza swoje działanie o sprawdzanie daty w celu wykonania zaplanowej kopii.

Moduł zaprezenotwany na rysunku 4.9 obrazuje możliwość generowania przez system wykresów statystycznych dotyczących m.in. wybieranej formy płatności w czasie.

Rysunek 4.9 Moduł statystyki - wykres wybieranych form płatności.

4.3. Przewodnik po aplikacji webowej

Na rysunku 4.10 przedstawiono moduł informacyjny aplikacji webowej, który obrazuje sylwetkę hotelu oraz udostępnia możliwość przekierowania do modułu rezerwacji

Rysunek 4.10 Moduł informacyjny aplikacji webowej.

Rysunek 4.11 Moduł wyboru daty przyjazdu i wyjazdu gościa.

Rysunek 4.11 przedstawia sposób reazlizaji wyboru okresu rezerwcji przez klienta. Po wprowadzeniu dat użytkownik przekierowywywny jest do modułu wyboru dostepnych w hotelu pokoi który przedstwiono na rysnunku 4.12

Rysunek 4.12 Moduł wyboru pokoju.

Rysunek 4.13 ukazuje finalizację procesu rezerwcji w którym klient zobligowany jest do podania swoich danych teleadresowych. Po zaakceptowaniu wszystkich informacji system informuje rezerwującego o pomyślnym zakończeniu procesu lub wyświetla stosowny komunikat o błędzie rysunek 4.14

Rysunek 4.13 Moduł pobierający dane klienta

Rysunek 4.14 Moduł informujący o pozytywnym lub negatywnym wyniku procesu rezerwacji

4.4. Możliwości dalszego rozwoju aplikacji

Przedstawiony powyżej system zarządzania małym hotelem nie jest oczywiście systemem zamkniętym. Planowane jest jego wzbogacenie o moduły:

* Współpracy z drukarkami fiskalnymi co pozwoliłoby na komputeryzację obiektów hotelowych. Umożliwiłoby to realizację wydruku paragonów fiskalnych, tworzenie raportów dobowych i okresowych.

* Wglądu w obecność gości w pokojach, pozostawionych wiadomości, konieczności budzenia itp.

* Zawansowanej wyszukiwarki pokoi przeznaczonej dla aplikacji webowej, dzięki której klient będzie mógł sprezycować właściwości pokoju który chce zarezerwować.

* Klasy parametryzującej połączenie do bazy dzięki której odbiorca systemu mógłby sam określić czy baza ma być przechowywana lokalnie czy na zewnętrznym serwerze.

5. Podsumowanie

[1]http://pl.wikipedia.org/wiki/Programowanie_obiektowe#Podstawowe_za.C5.82o.C5.BCenia_paradygmatu_obiektowego

[2] http://www.zgapa.pl/zgapedia/Klasa_abstrakcyjna.html

[3] http://pl.wikipedia.org/wiki/C_Sharp

[4] http://pl.wikipedia.org/wiki/C_Sharp

[5] http://pl.wikipedia.org/wiki/C_Sharp

[6] http://pl.wikipedia.org/wiki/Sieciowe_bazy_danych

[7] http://pl.wikipedia.org/wiki/SQLite

Writing Services

Essay Writing
Service

Find out how the very best essay writing service can help you accomplish more and achieve higher marks today.

Assignment Writing Service

From complicated assignments to tricky tasks, our experts can tackle virtually any question thrown at them.

Dissertation Writing Service

A dissertation (also known as a thesis or research project) is probably the most important piece of work for any student! From full dissertations to individual chapters, we’re on hand to support you.

Coursework Writing Service

Our expert qualified writers can help you get your coursework right first time, every time.

Dissertation Proposal Service

The first step to completing a dissertation is to create a proposal that talks about what you wish to do. Our experts can design suitable methodologies - perfect to help you get started with a dissertation.

Report Writing
Service

Reports for any audience. Perfectly structured, professionally written, and tailored to suit your exact requirements.

Essay Skeleton Answer Service

If you’re just looking for some help to get started on an essay, our outline service provides you with a perfect essay plan.

Marking & Proofreading Service

Not sure if your work is hitting the mark? Struggling to get feedback from your lecturer? Our premium marking service was created just for you - get the feedback you deserve now.

Exam Revision
Service

Exams can be one of the most stressful experiences you’ll ever have! Revision is key, and we’re here to help. With custom created revision notes and exam answers, you’ll never feel underprepared again.