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-
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
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
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
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
Plik z chomika:
SOLARIX33
Inne pliki z tego folderu:
2006.01_Koder plików w formacie OGG_[Programowanie].pdf
(722 KB)
2007.06_Piękno fraktali_[Programowanie].pdf
(1778 KB)
2008.11_GanttProject_[Programowanie].pdf
(1014 KB)
2007.04_USB Device Explorer_[Programowanie].pdf
(1134 KB)
2006.09_QT, PyQT – szybkie tworzenie baz danych_[Programowanie].pdf
(1319 KB)
Inne foldery tego chomika:
Administracja
Aktualnosci
Audio
Bazy Danych
Bezpieczenstwo
Zgłoś jeśli
naruszono regulamin