Umíme to s Delphi: 78. díl – databázová aplikace v BDE

Před týdnem jsme si zodpověděli poslední nejdůležitější teoretické otázky týkající se tvorby databázových aplikací v Delphi. Dnes konečně přijde na řadu praxe. V prvním prakticky zaměřeném databázovém článku společně vytvoříme a patřičně zdokonalíme databázovou aplikaci pomocí BDE. A začneme – jak je naším zvykem – od úplné nuly.
Ještě předtím, než se pustíme do tvorby aplikace, bych rád předešel protestům v diskusním fóru: uvědomuji si, že BDE dnes již není optimální cestou vývoje databázové aplikace. Mezi důvody jeho zařazení do dnešního dílu však patří jednoduchost, transparentnost, historický význam, kompletnost a názornost. Všechny čtenáře ujišťuji, že další databázové platformy budou záhy následovat.

Registrace databázového aliasu v BDE

Vytvoříme databázi týkající se kuchařů a jídel, kterou jsme teoreticky popisovali před 14 dny. Přestože přístup k databázím je v mnoha ohledech velmi podobný bez ohledu na zvolenou platformu, budeme se zabývat jednotlivými případy odděleně. Je zřejmé, že tento postup bude fungovat jen pro vrstvu fyzického přístupu k datům a pro vrstvu Dataset, neboť datový zdroj a uživatelské rozhraní je již na platformě nezávislé.

Podotýkám pro jistotu hned v úvodu, že BDE již dnes není příliš progresivní variantou, nicméně pro jednoduchost začneme s ním. V dalších částech seriálu přijdou na řadu i další databázové možnosti Delphi.

1. Spustíme BDE Administrator a zaregistrujeme nový alias. Vybereme Object – New a zvolíme třeba Standard.

2. Napíšeme název aliasu: Kuchyn. Nezapomeňte vyplnit také cestu k databázovému souboru. Připomínám, že tyto činnosti již známe ze 17. a 18. dílu. Obrázek:

Klepněte pro větší obrázek

3. Uložíme změny a ukončíme BDE Administrator a spustíme klientský program Database Desktop. Jen si shrneme, co jsem zatím učinili: nic, pouze jsme definovali přezdívku databáze, která ještě neexistuje. Abychom nemuseli vytvářet databázi v nějakém SŘDB, můžeme využití jednoduchý Database Desktop, což je jakýsi klientský program pro vytváření databází ve více formátech (pro více SŘBD). Vzhledem k přímému přístupu BDE k databázovým souborům některých SŘBD tak můžeme pracovat s databází Paradox, aniž bychom tuto databázi měli nebo kdy viděli.

Vytvoření databáze v klientském programu Database Desktop

1. Spustíme Database Desktop (měl by být opět instalován s Delphi a měl by jít spustit pomocí Start – stejná_složka_z_níž_spouštíme_Delphi) a vytvoříme postupně všechny tři databázové tabulky.

2. V hlavním menu zvolte File – New – Table a v dialogu Create Table vyberte typ databáze, který chcete vytvořit. My ponecháme například databázi Paradox 7 (viz obrázek):

Klepněte pro větší obrázek

3. Stiskněte OK. Otevře se okno Create Paradox 7 Table: (Untitled). Zde se navrhuje vlastní tabulka. Je možné vytvořit vždy pouze jednu tabulku, proto bude nutné postup dvakrát opakovat. Návrh tabulky bude spočívat v zapisování jmen sloupců a nastavování jejich typů. Výsledek pro tabulku JIDLA je na obr8yku. Typ A znamená Alfanumerický a číslo 200 značí maximální možnou délku tohoto údaje. Typ N je číselný a + je autoinkrement. Hvězdička ve sloupci Key u pole idjidla znamená, že toto pole bude primárním klíčem tabulky (bližší popis viz předchozí díly seriálu).

Klepněte pro větší obrázek

4. Stiskněte Save As… Otevře se dialog SaveDialog. V poli Alias vyberte náš vytvořený Alias – tedy Nová databáze, v poli Název souboru napište jméno souboru, který chcete vytvořit (a který bude obsahovat vytvořenou tabulku, my jsme zvolili název jidla, viz obrázek):

Klepněte pro větší obrázek

5. Stiskněte Uložit. Tabulka je vytvořena.

6. Nyní opakujte kroky 2 – 5 také pro další dvě tabulky: KUCHARI a UMI_VARIT. Uvedeme zde pro názornost pouze obrázky (připomínám, že struktura tabulek je uvedena v 76. dílu tohoto seriálu). Následující tabulka obsahuje údaje o kuchařích a jmenuje se KUCHARI:

Klepněte pro větší obrázek

Následující tabulka existuje kvůli vazbě M:N a jmenuje se UMI_VARIT:

Klepněte pro větší obrázek

Naplnění databáze daty v klientském programu Database Desktop

Pro naplnění tabulek daty bychom mohli použít celou řadu metod, ale zůstaneme u té nejjednodušší: vložíme data prostřednictvím našeho oblíbeného nástroje Database Desktop.

1. V Database Desktop zvolte File – Open – Table, zvolte příslušný alias a vyberte první ze souborů, tedy jidla. Otevře se velké okno a v něm vyplňte jednotlivé údaje tak, aby se alespoň vzdáleně podobaly následujícímu obrázku. Pokud jste při vytváření tabulky zvolili pro pole idjidla typ autoinkrement, mělo by se toto pole vyplňovat automaticky. Pro editaci je nutné nejprve stisknout F9.

Klepněte pro větší obrázek

2. Po vyplnění údajů normálně tabulku zavřete, změny se automaticky uloží. Stejně postupujte i pro další dvě tabulky a naplňte je daty takto:

Tabulka KUCHARI

ID kuchaře Jméno Plat
1 Franta 15000
2 Josef 15000
3 Standa 10000
4 Pepa 5000

Tabulka UMI_UVARIT

ID kuchare ID jidla
1 1
1 2
1 3
2 2
2 4
2 5
3 2
3 5
4 6
4 7

Návrh aplikace v Delphi: základní verze

Tím je databáze o třech tabulkách vytvořena. Nyní si konečně můžeme spustit Delphi a vrhnout se na vytváření databázové aplikace.

V 75. dílu seriálu jsme rozdělili architekturu databázových aplikací do 4 vrstev. Zároveň jsme si ale řekli, že při použití BDE nemusíme používat komponentu z první vrstvy (pro fyzický přístup k datům). Proto se dnešní aplikace redukuje na tři vrstvy, které musíme obhospodařit. Pro nevizuální (databázové) komponenty použijeme datový modul (viz též 75. díl), abychom striktně dodržovali oddělení uživatelského rozhraní (vizuálních komponent) od nevizuální realizace databázové komunikace.

1. Vytvořte novou aplikaci.

2. Vytvořte nový datový modul: File – New – Data Module.

3. Do datového modulu nyní umístíme komponenty ze všech tří vrstev: Query ze záložky BDE a DataSource ze záložky DataAccess.

4. Na formulář umístěte komponentu DBGrid ze záložky DataControls, DBNavigator z téže palety a Button z palety Standard.

5. Nyní už zbývá jen velmi málo: nastavit správné hodnoty vlastností. Začneme od nejspodnější vrstvy, tedy od komponenty Query (která vystupuje jako Dataset). Pro komponentu Query nastavíme vlastnost DatabaseName na Kuchyn (tato hodnota by se měla objevit v rozbalovacím seznamu v Object Inspectoru. Pokud se tam neobjeví, udělali jste chybu při registraci databázového aliasu v BDE). Pak je nutné zapsat do vlastnosti SQL nějaký dotaz. Proto do vlastnosti SQL zadejte:

SELECT * FROM kuchari

Teprve potom můžeme nastavit vlastnost Active na True.

6. Pak nastavíme komponenty z druhé vrstvy (Datasource). Vlastnost Dataset nastavíme na Query1. Zkontrolujte, zda Enabled je nastaveno na True.

7. Poslední maličkost spočívá ve „svázání“ komponent uživatelského rozhraní s datovým zdrojem. Protože však komponenta Datasource není na formuláři, ale je součástí datového modulu, musíme nejprve datový modul vložit do modulu formuláře. Pokud jste jej nepřejmenovali, nazývá se stále Uni2, proto do sekce Uses modulu formuláře přidejte Uni2.

8. Pak je již bezproblémové nastavit v Object Inspectoru vlastnost DataSource komponenty DBGrid (a tutéž vlastnost komponenty DBNavigator) na DataModule2.DataSource1.

9. Prakticky ihned se v komponentě DBGrid objeví „živá data“, konkrétně výsledek našeho dotazu.

10. Pokusíme se zformulovat několik rozsáhlejších dotazů a postupně je zkoušet vložit do komponenty Query (do její vlastnosti SQL). První dotaz by měl vrátit jména všech kuchařů, kteří umí vařit rizoto:

SELECT jmeno FROM KUCHARI, JIDLA, UMIVARIT
WHERE jidlo=`rizoto` AND UMIVARIT.idkuchare = KUCHARI.idkuchare
AND UMIVARIT.idjidla = JIDLA.idjidla

Nezapomeňte opět nastavit vlastnost Active komponenty Query na True, neboť změnou vlastnosti SQL se automaticky nastaví na False. Pokud jste naplnili tabulky daty podle výše uvedených instrukcí, měl by být jediný výsledek předchozího dotazu – jméno franta.

Další dotaz by měl vrátit všechna jídla, která umí Franta:

SELECT jidlo FROM KUCHARI, JIDLA, UMIVARIT
WHERE jmeno=`franta` AND UMIVARIT.idkuchare = KUCHARI.idkuchare
AND UMIVARIT.idjidla = JIDLA.idjidla;

Výsledek je na následujícím obrázku. Všimněte si, že vše funguje již v době návrhu, není nutné aplikaci ani překládat:

Klepněte pro větší obrázek

Další dotaz, který vyzkoušíme vypíše jména všech kuchařů, kteří berou víc než 10000 Kč a přitom umí vařit jídla levnější než 50 Kč:

SELECT jmeno FROM KUCHARI, JIDLA, UMIVARIT
WHERE plat > 10000 AND cena < 50 AND UMIVARIT.idkuchare = KUCHARI.idkuchare
AND UMIVARIT.idjidla = JIDLA.idjidla;

Výsledkem dotazu jsou jména Franta a Josef. Vyzkoušíme poslední dotaz. Jeho výsledkem by měla být průměrná mzda kuchařů, kteří umí připravit kuřecí prso:

SELECT avg(plat) FROM KUCHARI, JIDLA, UMIVARIT
WHERE jidlo = `kureci prso` AND UMIVARIT.idkuchare = KUCHARI.idkuchare
AND UMIVARIT.idjidla = JIDLA.idjidla;

Výsledkem je částka 12500 Kč.

Rozšiřujeme aplikaci

Protože o databázích by bylo možné popsat několik knih a stejně by nebylo možné popsat vše, nezbývá, než se nyní jen stručně podívat na případná rozšíření, zajímavé alternativy a možnosti, jak vylepšovat databázové aplikace.

Nejprve připomeňme, že pokud se nám nechce spisovat databázové dotazy, můžeme použít namísto komponenty Query komponentu Table a přistupovat jejím prostřednictvím přímo k vybrané tabulce. Pomocí vlastností komponenty Table můžeme nastavovat nejrůznější parametry; jedná se vlastně o jakési vytváření dotazu pomocí Object Inspectoru. Pravdou však zůstává, že vždy můžeme pracovat pouze s jednou tabulkou. Asi nemá smysl zdůrazňovat, že v aplikaci můžeme mít více komponent Table i Query zároveň a každou z nich mít připravenu pro konkrétní použití.

Zajímá-li vás efektivita aplikací, může pro vás být zajímavá následující poznámka: obecně platí, že komponenta Query je rychlejší pro SQL databáze a komponenta Table naopak pro lokální databáze (tabulky). Pravdou ovšem je, že to nelze prohlásit za svatou pravdu, neboť se můžete dostat do situace, v níž bude situace přesně opačná.

Zajímavou komponentou je také StoredProc, s jejíž pomocí je možné spouštět uložené procedury. Uložená procedura je programový kód (program) definovaný nikoliv v rámci aplikace (klienta), ale na straně databázového serveru. Tuto uloženou proceduru je možné spustit a výsledky získat ve formě tabulky. Komponenta StoredProc náleží tedy na vrstvu datových sad. Nemá asi smysl podotýkat, že v databázi, kterou jsme vytvořili pomocí Database Desktop, není možné vytvořit uloženou proceduru, na to bychom potřebovali lepší systém řízení báze dat, například Interbase (obecně se musí jednat o server SQL). Věřím, že budeme mít příležitost si uloženou proceduru předvést v některém z příštích dílů.

Komponenta Table má celou řadu zajímavých vlastností, jimiž se bohužel nemůžeme podrobně zabývat. Pomocí vlastnosti Filter je možné získat pouze údaje splňující určitou podmínku. Kdybychom např. chtěli pomocí komponenty Table vypsat pouze kuchaře s platem nižším než 12000, mohli bychom vložit do vlastnosti Filter následující podmínku:

plat < 12000

Kromě toho bychom museli nastavit vlastnost Filtered na True. V rámci komponenty Table je možné nastavit i různé rozsahy. Dodejme však, že pokud potřebujeme omezit výběr několika podmínkami, je vždy obvykle použít přímo komponentu Query, protože Table stejně interně vytváří dotaz, ale nemáme nad ním absolutně žádnou kontrolu.

Při procházení tabulky můžeme dále využívat zajímavé metody GotoKey, FindKey, GotoNearest, FindNearest apod.

Zajímavá možnost související s komponentou Query je použití tzv. parametrických dotazů. Parametrický dotaz vypadá takto:

select plat from kuchari where jmeno=:jmeno

Pak např. vložíme do aplikace komponentu Button a ošetříme klepnutí na toto tlačítko takto:

procedure TForm1.Button1Click(Sender: TObject);
begin
  datamodule2.Query2.Params[0].Value := `franta`;
  datamodule2.Query2.active:=true;
end;

Pak po klepnutí na tlačítko (samozřejmě za běhu) dojde k nahrazení parametru :jmeno hodnotou franta a výsledkem dotazu bude frantův plat.

V souvislosti s parametrickými dotazy je nutné zmínit také mechanismus tzv. přípravy dotazů. Pokud víme, že budeme některý dotaz (byť parametrický) používat víckrát, je vhodné zavolat nad ním metodu Prepare. BDE nebo SQL server totiž nejprve musí přečíst text dotazu a rozhodnout, jakým způsobem jej bude zpracovávat. Pokud dotaz připravíme, engine jej nemusí zpracovávat vždy znovu, čímž se ušetří prostředky a vzroste efektivita.

Na závěr

Z předchozích odstavců je zřejmé, že i když BDE není žádným módním výstřelkem, můžeme si s ním (a především s databázovou aplikací „nad ním“) důkladně vyhrát.

Diskuze (5) Další článek: IBM čelí miliardové žalobě kvůli Linuxu

Témata článku: Software, Programování, Uložená data, Select, Komponenta, Zajímavé jméno, Jediný výsledek, Databázová aplikace, Plat, Nová databáze, Uložení, Předchozí odstavec, Paradox, Historický význam, Nová přezdívka, Velké okno, From, Díl, Uživatelské jméno, Následující aplikace


Určitě si přečtěte

Osudová havárie Concordu: Před 18 lety přišel konec nadzvukových dopravních letadel

Osudová havárie Concordu: Před 18 lety přišel konec nadzvukových dopravních letadel

** Concorde byl nejrychlejším dopravním letadlem ** Atlantik dokázal přeletět za cca 3 až 3,5 hodiny ** Před osmnácti lety tragická havárie provoz těchto letadel prakticky ukončila

David Polesný, Jiří Černý | 38

Sex a rozmnožování při mezihvězdné cestě: Kolik lidí je potřeba pro let k Proximě Centauri?

Sex a rozmnožování při mezihvězdné cestě: Kolik lidí je potřeba pro let k Proximě Centauri?

** Vědci spočítali, jak velká by musela být posádka pro vícegenerační let k nejbližší hvězdné soustavě ** Proxima Centauri se nachází 4,3 světelných let od nás ** Za současných technologií bychom k ní letěli 6300 let

Petr Kubala | 58

Intel má 50 let! Připomeňte si 6 klíčových milníků v historii firmy

Intel má 50 let! Připomeňte si 6 klíčových milníků v historii firmy

** Firma Intel byla založena přesně před 50 lety ** Intel začínal jako výrobce pamětí ** Dnes je největším výrobcem procesorů pro osobní počítače

David Polesný, Pavel Tronner | 10

Xiaomi Yeelight: Wi-Fi LED žárovka za pár stovek, kterou můžete ovládat i hlasem

Xiaomi Yeelight: Wi-Fi LED žárovka za pár stovek, kterou můžete ovládat i hlasem

** Na eBayi aspol. ji koupíte za čtyři stovky ** Má Wi-Fi a povedenou appku ** Spojíte ji s Googlem, Amazonem, IFTTT i vlastním systémem

Jakub Čížek | 41

USB-C už mělo být všude, ale není. Tak kde to vázne?

USB-C už mělo být všude, ale není. Tak kde to vázne?

** Konektor USB-C byl představen už před čtyřmi roky ** Praktické univesrzální rozhraní však stále není rozšířeno ** Výrobcům hardwaru se do změny moc nechce

David Polesný, Vladislav Kluska | 87

15 věcí, které umí Windows 10, ale možná o nich vůbec nevíte

15 věcí, které umí Windows 10, ale možná o nich vůbec nevíte

** Systém Windows 10 umí spoustu užitečných drobností ** O mnoha praktických funkcích pravděpodobně ani nevíte ** Poznejte užitečné tipy, které se vám mohou hodit každý den

Vladislav Kluska | 39


Aktuální číslo časopisu Computer

Jak mobily určují svoji polohu?

Velký test notebooků pro studenty

Nejlepší reproduktory na párty

Služby a aplikace pro výuku angličtiny