2008.09_Lazarus – łatwy dostęp do danych_[Programowanie].pdf

(942 KB) Pobierz
439032868 UNPDF
Programowanie
Bazy danych/Lazarus
dostęp do danych
Marek Sawerwain
Uruchomienie serwera bazy danych w systemie Linux w większości dystrybucji sprowadza się do
instalacji odpowiednich pakietów. Po tym fakcie zazwyczaj serwer uruchamia się samodzielnie i mamy
gotowy system z uruchomionym serwerem baz danych.
kacji, która korzysta z bazy danych. Problem jest
ten dość ważny jeśli chcemy napisać typowy pro-
gram, a nie aplikację sieciową. Wśród głównych
środowisk pracy, czyli GNOME oraz KDE zostały wprowa-
dzone pakiety wspierające tworzenie aplikacji baz danych.
Jednakże oprócz tych pakietów dostępne jest jeszcze bar-
dzo interesujące środowisko, a mianowicie program Laza-
rus, czyli darmowy odpowiednik środowiska Delphi. Warto
poznać to środowisko, np. poprzez próbę utworzenia bardzo
prostej bazy danych, aby zorientować się, co oferuje Lazarus
na obecnym etapie rozwoju.
Pierwsza wymieniona zakładka zawiera komponenty GUI
przeznaczone do prezentacji (wizualizacji) danych, czyli m.
in. różnego rodzaju pola edycyjne, a także komponent o na-
zwie DBGrid , który potrai wyświetlić całą tabelę. Dostępna
jest kontrolka kalendarza do wyświetlania pola daty. Istnie-
je również komponent do wyświetlania danych graicznych,
który jest bardzo przydatny jeśli nasza baza danych oferuje
np. dostęp do zdjęć, np. towarów.
Druga zakładka o nazwie Data Access zawiera aktual-
nie pięć komponentów, przy czym dla nas najważniejszy jest
komponent o nazwie DataSource . Pośredniczy on pomiędzy
kontrolkami GUI a kontrolkami bezpośredniego dostępu do
danych, które znajdują się w trzeciej wymienionej zakład-
ce: SQLdb . Obecnie mamy dwanaście komponentów dostę-
pu do danych. Dzielą się one na dwie grupy. Pierwsze o na-
zwach TSQLQuery , TSQLTransaction , TSQLScript są odpo-
wiedzialne za odbieranie danych m. in. z zapytania napisane-
go w języku SQL. Samo zapytanie jest umieszczane w pierw-
szej wymienionej kontrolce o nazwie TSQLQuery . Pozostałe
kontrolki, np. TOracleConnection bądź TMySQL50Connec-
tion zgodnie ze swoimi nazwami są wykorzystywane do na-
wiązania połączenia z bazy danych. W naszym projekcie na-
Dostępne komponenty
do obsługi baz danych
Po uruchomieniu Lazarusa, zobaczymy kilkanaście zakła-
dek z wieloma dostępnymi komponentami. Kolejne odsło-
ny Lazarusa przynoszą coraz to nowe komponenty, co świad-
czy o rozwoju całego środowiska. Nas najbardziej interesu-
ją komponenty związane z bazami danych. W obecnej wersji
0.9.25 (wersja beta, z połowy czerwca 2008) dostępne są trzy
zakładki: Data Controls , Data Access oraz trzecia SQLdb .
42
wrzesień 2008
Lazarus – łatwy
Z upełnie innym problemem jest opracowanie apli-
439032868.049.png 439032868.051.png 439032868.052.png
 
Programowanie
Bazy danych/Lazarus
turalnie będziemy korzystać z kontrolki TMy-
SQL50Connection , bo za serwer danych wy-
bieramy MySQL 5.0.
mularzami). Pierwszym oknem jest formularz
o nazwie MainWin , który widzimy tuż po uru-
chomieniu naszego programu. Pozostałe czte-
ry okna oferują nam dostęp do danych. Okno o
nazwie TabelaKlientowForm zgodnie ze swo-
ją nazwą, oferuje dostęp do tabeli klientów. Po-
dobnie okna TabelaTowarowForm oraz Lista-
ZamowienForm . Czwarte okno służy do skła-
dania zamówień i nosi nazwę Zamowienia-
Form .
Wszystkie okna zapisane są w oddzielnych
modulach, które identycznie jak w Pascalu/
Delphi irmy Borland nazwane się unitami .
W naszym programie istnieje jeszcze moduł,
gdzie zgromadzone są wszystkie komponen-
ty dostępu do bazy danych. Choć poszczegól-
ne kontrolki dostępu do danych można umiesz-
czać bezpośrednio na okna, to takie rozwiąza-
nie, gdzie wszystkie elementy obsługi danych
zostały zgromadzone w jednym miejscu, wpro-
wadza większy porządek do kodu.
Wszystkie te uwagi warto spróbować
przedstawić jako schemat, podobny do sche-
matu z Rysunku 1. Protoplasta Lazarusa, czy-
li środowisko Delphi, oferuje nawet narzędzia
UML, które pozwolą podobny schemat opraco-
wać szybciej i lepiej. Na razie Lazaurs nie ofe-
ruje podobnego narzędzia, ale kod źródłowy
całości projektu można przeglądać za pomocą
narzędzia Code browser .
Oprócz poszczególnych plików źródło-
wych uzupełnieniem jest jeszcze plik projektu.
Właściwie to istnieją dwa pliki pełniące tą ro-
lę. Pierwszy to plik o rozszerzeniu lpi . Zawiera
on informacje niezbędne dla środowiska, drugi
plik o rozszerzeniu lpr , to kod źródłowy w Pas-
calu odpowiedzialny za utworzenie formularzy
oraz uruchomienie aplikacji.
Przykładowa baza danych
Jeśli nie mamy bazy danych, którą można wy-
korzystać do testów, musimy ją utworzyć. Li-
sting 1. zawiera polecenia SQL dla MySQL,
które tworzą prostą bazę składającą się z trzech
tabel. Mamy tabelę klienci , gdzie naturalnie
zgodnie z nazwą znajdują się informacje o
klientach. W przypadku naszej testowej bazy
mamy tylko trzy pola: id , imię oraz nazwisko .
Druga tabela, towary , również zawiera
ograniczoną liczbę pól: id , nazwa , cena oraz
ilość . Podobnie jak trzecia tabela, zamówienia ,
gdzie mamy cztery pola: pierwsze id oraz iden-
tyikatory kupującego oraz towaru oraz datę
złożenia zamówienia.
Choć wymienione tabele to tylko namiastka
bazy danych, dla naszego celu – poznania możli-
wości pakietu Lazarus – nadają się znakomicie.
Podstawowe operacje na oknach
Lazarus to narzędzie typu RAD (ang. Rapid
Application Developed ), gdzie za pomocą my-
szy bez konieczności pisania kodu źródłowego
możemy utworzyć interfejs użytkownika. Waż-
nym elementem jest Object Inspector , czyli
okno dialogowe, gdzie podczas projektowania
interfejsu wyświetlane są właściwości kontro-
lek, np. kolor przycisku, ale też wiele innych,
np. parametry połączenia z bazą danych.
W przypadku okien najważniejsze są dla
nas dwie czynności: wyświetlenie okna oraz
jego zamknięcie. Jeśli chcemy zamknąć okno
Aplikacja testowa
Nasza aplikacja testowa składa się z pięciu
okien (w dalszej części będą też nazywane for-
�����
����
���������������
�������������
������������
���������
Rysunek 1. Schemat naszej aplikacji
www.lpmagazine.org
43
439032868.001.png 439032868.002.png 439032868.003.png 439032868.004.png 439032868.005.png 439032868.006.png 439032868.007.png 439032868.008.png 439032868.009.png 439032868.010.png 439032868.011.png 439032868.012.png 439032868.013.png 439032868.014.png 439032868.015.png 439032868.016.png 439032868.017.png 439032868.018.png 439032868.019.png 439032868.020.png 439032868.021.png 439032868.022.png 439032868.023.png 439032868.024.png 439032868.025.png 439032868.026.png
Programowanie
Bazy danych/Lazarus
główne, co w efekcie doprowadzi do zakończe-
nia pracy całego programu, to dla przycisku w
obsłudze zdarzenia OnClick (wystarczy klik-
nąć na wybrany przycisk dwa razy ) należy do-
pisać wywołanie metody Close .
Natomiast otwarcie okna w tzw. trybie mo-
dalnym, czyli nie będzie można przełączyć się
na inne okno, jest bardzo proste – korzystamy z
metody ShowModal :
nazwa, ZamowieniaForm , to nazwa zmiennej
reprezentującej formularz do zamówień.
skania połączenia to naturalnie komponent o
nazwie TMySQL50Connection . Po umieszcze-
niu tego komponentu w module danych nale-
ży naturalnie uzupełnić podstawowe własno-
ści. Pierwsza to adres maszyny, na której znaj-
duje się serwer – w przypadku testów, gdy ser-
wer jest uruchomiony lokalnie, wpisujemy ad-
res 127.0.0.1 do własności HostName . Istotna
jest też nazwa bazy danych, z której korzy-
stamy, czyli w naszym przypadku do własno-
ści DatabaseName wpisujemy np. db_test_1 .
Istotne dla połączenia są także pola UserName
oraz Password . Po wypełnieniu pól z pozio-
mu inspektora obiektów można uzyskać połą-
czenie zmieniając wartość pola Connected z
False na True . Jeśli wszystkie informacje by-
ły wypełnione poprawnie, uzyskamy połącze-
nie z bazą danych.
W praktyce pola te są wypełniane z pozio-
mu aplikacji, np. przez własne okno dialogowe,
toteż uzupełnienie tych pól przedstawia się np.
następująco: (Listing 4.)
Kolejny etap to umieszczenie kontrolki o
nazwie TSQLQuery . Pierwsze pole, jakie uzu-
pełniamy w inspektorze to pole Database . Na-
leży wybrać bądź wpisać nazwę kontrolki TMy-
SQL50Connection . Połączenie powinno być
aktywne, ponieważ w tym momencie trzeba
uzupełnić własność SQL, gdzie podajemy treść
zapytania – w naszym przypadku zapytanie jest
bardzo proste:
Dostęp do tabeli klienci
W Lazarusie sposób dostępu do danych jest
dość klarowny. Podstawowym obiektem jest
obiekt reprezentujący połączenie, następnie
pojawia się obiekt zapytania, obiekt źródła da-
nych i ostatecznie na końcu tego krótkiego łań-
cucha mamy kontrolkę GUI, gdzie dane może-
my wyświetlić.
Ponieważ nasza baza danych jest umiesz-
czona na serwerze MySQL, dlatego pierw-
szy komponent jaki jest niezbędny do uzy-
uzamowienia.ZamowieniaForm.ShowModal;
Bardzo ważne są zastosowane nazwy: pierw-
sza, u zamowienia, to nazwa modułu. Druga
Listing 1. Polecenia SQL tworzące naszą testową bazę danych w systemie MySQL
CREATE TABLE `db_test_1`.`klienci` (
`id` int ( 10 ) unsigned NOT NULL auto_increment,
`imie` varchar ( 20 ) NOT NULL ,
`nazwisko` varchar ( 45 ) NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `db_test_1`.`towary` (
`id` int ( 10 ) unsigned NOT NULL auto_increment,
`nazwa` varchar ( 45 ) NOT NULL ,
`cena` decimal ( 10,0 ) NOT NULL ,
`ilosc` int ( 10 ) unsigned NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `db_test_1`.`zamowienie` (
`id` int ( 10 ) unsigned NOT NULL auto_increment,
`kupujacy` int ( 10 ) unsigned NOT NULL ,
`towar` int ( 10 ) unsigned NOT NULL ,
`data` datetime NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
select id, imie, nazwisko
from klienci;
W tym momencie warto spróbować uaktywnić
dane poprzez zmianę wartości Active w kon-
trolce zapytania na wartość True . Jeśli zapyta-
nie w SQL nie posiada żadnych błędów, kon-
trolka stanie się aktywna. Aby zobaczyć dane
w tabeli należy jeszcze dodać komponent o na-
zwie TDataSource . We własności DataSet te-
go komponentu wybieramy nazwę kontrolki z
zapytaniem.
W ten sposób zawartość tabeli Klienci
może zostać przedstawiona za pomocą kon-
trolek z zakładki DataControls . Dobrze do te-
go celu nadaje się komponent DBGrid , który
dane z tabeli zaprezentuje w postaci tabelki.
Po umieszczeniu tego komponentu w formu-
larzu należy wpisać (lub wybrać) do własno-
ści DataSource nazwę komponentu DataSo-
Na płycie CD/DVD
Rysunek 2. Aplikacja testowa na warsztacie
Na płycie CD/DVD znajdują się wykorzy-
stywane biblioteki, kod źródłowy programu
oraz wszystkie listingi z artykułu.
44
wrzesień 2008
439032868.027.png 439032868.028.png 439032868.029.png 439032868.030.png 439032868.031.png
 
Programowanie
Bazy danych/Lazarus
urce . Ponieważ w naszym programie wszyst-
kie komponenty dostępu danych zostały zgro-
madzone w module o nazwie udatamodule , to
trzeba ten moduł dołączyć do modułu okna.
Problem ten sprowadza się tylko do dopisania
jednej linii kodu:
który dokona odświeżenia zawartości kontrol-
ki DBGrid :
złożone zamówienia. Dodatkowo budując za-
pytanie korzystamy z trzech tabel. Treść zapy-
tania przedstawia Listing 2.
Zablokowanie edycji tabeli, wbrew pozo-
rom, jest bardzo łatwe: w kontrolce zapytania
zmieniamy własność ReadOnly na True . Od te-
go momentu nie będzie można dopisywać no-
wych rekordów.
Kontrolki zapytań mają jeszcze jedną
ciekawą funkcjonalność. Jeśli na ikonie ak-
tywnej kontroli klikniemy prawym przyci-
skiem myszy, to wyświetli się menu kon-
udatamodule.DataMod.KlienciQuery.Acti
ve:=false;
udatamodule.DataMod.KlienciQuery.Acti
ve:=true;
uses udatamodule;
Lista zamówień i własności pól
Analogicznie postępujemy w przypadku tabe-
li towary . Natomiast okno z listą zamówień nie
pozwala na edycję danych, wyświetlamy tylko
Wymienioną linię kodu dopisujemy po słowie
implementation w module utabelaklientow
(podobnie postąpimy w przypadku pozostałych
okien). Od tego momentu kontrolki bazodano-
we uzyskają dostęp do źródeł danych.
W ramach uzupełnienia trzeba dodać, że
w przypadku baz SQL należy jeszcze dodać
komponent transakcji, wykorzystywany przez
kontrolki zapytań. Warto także dodać, że za-
letą kontroli zapytań jest możliwość budo-
wania zapytania z kilku tabel. Choć pojawia-
ją się w takim przypadku problemy z aktuali-
zacją danych.
W przypadku naszego zapytania korzysta
ono tylko z jednej tabeli, więc aktualizacja nie
sprawia problemów. Jednak trzeba pamiętać, że
podczas edycji tabeli DBGrid jeśli użytkownik
zmieni wartości pól bądź dopisze nowy rekord,
to zmiany te nie są natychmiast wprowadzane
do bazy danych. Stanie się dopiero w momen-
cie wywołania metody ApplyUpdates z obiek-
tu zapytania. Dlatego w oknie klientów, istnie-
je przycisk o nazwie Aktualizacja danych oraz
dodatkowo po kliknięciu na przycisk O.K. ,
przed zamknięciem okna również wywołuje-
my tę metodę:
Instalacja środowiska Lazarus
Niektóre dystrybucje jak np. Ubuntu oferują Lazarusa w swoim zbiorze pakietów, jednak
zazwyczaj jest to starsza wersja. Dlatego warto pokusić się o instalację wersji testowych.
Trzeba także zadbać aby dostępne były biblioteki GTK +, niestety w starszej wersji 1.2.XX.
Jak na razie autorzy Lazarusa ciągle nie wykorzystują nowszych wersji GTK +. Ze strony La-
zarusa należy więc ściągnąć najnowsze wersje testowe. Dla dystrybucji 32. bitowych ścią-
gamy następujące pliki:
fpc–src–2.2.2rc1–20080616.i386.rpm
fpc–2.2.2rc1–20080616.i386.rpm
lazarus–0.9.25–20080616.i386.rpm
Naturalnie pliki będą mogą się różnić wersją oraz datą. Instalacja wymaga pakietu rpm , a
odpowiednie polecenie przedstawia się następująco:
rpm –i –nodeps fpc–src–2.2.2rc1–20080616.i386.rpm
Opcja –nodeps jest niezbędna np. w Ubuntu, ponieważ w tej dystrybucji podstawowym na-
rzędziem do pakietów jest dpkg , a program rpm będzie zgłaszał błąd, że brakuje praktycz-
nie jakiegokolwiek pakietu. Jednakże zazwyczaj nie ma problemów i Lazarus instaluje się
i pracuje bez większych kłopotów.
DataMod.KlienciQuery.ApplyUpdates;
Warto też zadbać o odświeżanie danych w kon-
trolach. Służy do tego metoda Refresh wywo-
łana z kontroli DBGrid :
KlientTable.Refresh;
Dobrym sposobem (dość często najlep-
szym) jest również ponowna aktywacja źró-
dła danych. Przed wyświetleniem okna z ta-
belą klientów warto dopisać następujący kod,
Listing 2. Zapytanie SQL, które generuję listę
złożonych zamówień
select k.imie, k.nazwisko,t.name,
t.cena,z.data
from zamowienia z,klienci k,towary
t
where z.kupujacy = k.id and z.towar
= t.id;
Rysunek 3. Tworzenie tabeli klienci w programie MySQL Administrator
www.lpmagazine.org
45
439032868.032.png 439032868.033.png 439032868.034.png 439032868.035.png 439032868.036.png 439032868.037.png 439032868.038.png 439032868.039.png 439032868.040.png 439032868.041.png 439032868.042.png 439032868.043.png 439032868.044.png 439032868.045.png
 
Programowanie
Bazy danych/Lazarus
Listing 3. Wystawanie nowego zamówienia
tekstowe, gdzie pierwszą opcją do wyboru
powinno być Edit Fields (można też klik-
nąć dwukrotnie na ikonę kontrolki zapyta-
nia). Jeśli uruchomimy po raz pierwszy tę
opcję okno, które się pojawi będzie puste,
jednak wystarczy ponownie wywołać okno
menu kontekstowego prawym przyciskiem.
Tym razem wyświetlone menu będzie zawie-
rać opcję Add Fields , za pomocą której do-
damy istniejące pola. Istnieje nawet możli-
wość tworzenia pól dynamicznych, jednakże
nas interesują dodatkowe własności poszcze-
gólnych pól. Jeśli dodaliśmy wszystkie pola,
wybierzmy dla przykładu pole imie . Może-
my zmienić etykietę, jaka jest wyświetlana
w kontrolce DBGrid , wystarczy tylko do wła-
sności DisplayLabel wpisać ciąg Imię . W
tym miejscu można także ograniczyć liczbę
wyświetlanych znaków DisplayWidth a tak-
że z pomocą własności LookupDataSet , Lo-
okupKeyFields , LookupResultField utwo-
rzyć słownik dla danego pola. Inaczej mó-
wiąc, podczas edycji tego pola, użytkownik
będzie miał możliwość wyboru wartości ze
wcześniej przygotowanej listy.
Takie rozwiązanie upraszcza konigura-
cję komponentu DBGrid , bo choć kontrolka
DBGrid posiada możliwość oddzielonego kon-
igurowania poszczególnych kolumn, to przy-
gotowanie opisu pól już w kontrolce zapyta-
nia oznacza, że dane te będą wykorzystywane
samodzielnie przez DBGrid i nie będzie trzeba
oddzielnie dla każdej kontrolki ustalać tych sa-
mych parametrów.
procedure TZamowieniaForm.NewOrderBTNClick ( Sender : TObject );
var
t : integer ;
begin
DataMod.ZamowieniaQuery.Insert ;
DataMod.ZamowieniaQuery.FieldByName ( 'kupujacy' ) . AsInteger := klient_id ;
DataMod.ZamowieniaQuery.FieldByName ( 'towar' ) . AsInteger := towar_id ;
DataMod.ZamowieniaQuery.FieldByName ( 'data' ) . AsDateTime := Now ;
DataMod.ZamowieniaQuery.Post ;
DataMod.ZamowieniaQuery.ApplyUpdates ;
if DataMod.TowaryQuery.Locate ( 'id' , towar_id , []) = true then
begin
t := DataMod.TowaryQuery.FieldByName ( 'ilosc' ) . AsInteger ;
DataMod.TowaryQuery.Edit ;
DataMod.TowaryQuery.FieldByName ( 'ilosc' ) . AsInteger := t
StrToInt ( CountEDT.Text );
DataMod.TowaryQuery.Post ;
DataMod.TowaryQuery.ApplyUpdates ;
end ;
SpisTowarow.DataSource.DataSet.Refresh ;
end ;
Rysunek 4. Testowanie zamówień
Składanie zamówień
Odczytanie danych i wyświetlenie ich za po-
mocą konkretnych kontrolek nie jest trudne.
Jedyny problem to API komponetów. Jed-
nakże nazwy poszczególnych metod są ja-
sne, dostępny jest kod źródłowy całej biblio-
teki, a samo edytor podpowiada nazwy me-
tod oraz ich parametry. Naszym zadaniem
jest wpisanie do bazy nowych informacji o
zamówieniu.
W oknie znajdują się dwie tabele. Jedna
wyświetla informacje o klientach, natomiast
druga wyświetla dostępne towary. Oprócz
tych dwóch tabel dostępne są także dodatko-
we kontrolki DBText , w których wyświetla-
my identyikator i raz jeszcze imię oraz na-
zwisko. W ten sposób, jeśli użytkownik wy-
bierze jeden z wierszy, w tych komponen-
tach pojawi się identyikator oraz imię i na-
zwisko wybranej osoby. Podobnie w przy-
padku towaru.
Złożenie zamówienia polega na tym, że
użytkownik z tabel musi wybrać osobę i to-
war, który dana osoba chce zamówić, po
46
wrzesień 2008
439032868.046.png 439032868.047.png 439032868.048.png 439032868.050.png
 
Zgłoś jeśli naruszono regulamin