Umíme to s Delphi, 18. díl – databáze v Delphi, pokračování

V minulém díle seriálu jsme si řekli několik obecných informací k problematice databází. Popsali jsme si základní databázové nástroje Delphi (Borland Database Engine a Database Desktop) a několik komponent z palety Data Access. Dnes se nejprve dozvíme, co se skrývá v paletě Data Controls a v závěru kapitoly krok za krokem vytvoříme kompletní databázovou aplikaci.
Komponenty Data Controls

Pomocí komponent palety Data Controls můžete zobrazit obsah databáze v komponentách Delphi, které dobře znáte. Většina komponent z této palety má totiž svého „nedatabázového dvojníka“, se kterým jsme se už setkali v předchozích dílech seriálu. Jediná komponenta, která nemá své „dvojče“, je DBNavigator, který slouží k navigování po databázi (přechod na další záznam, vložení záznamu, apod.). A tak například databázové komponentě DBEdit odpovídá „normální“ Edit, DBCheckBox – CheckBox, DBGrid – StringGrid apod.

Zobrazení ve formě tabulky – DBGrid

DBGrid zobrazuje údaje z tabulky ve formě mřížky (nebo chcete-li, také tabulky) na obrazovce. Důležité je, že údaje jsou „živé“, že je lze editovat a že při správné konstelaci vlastností komponent DataSource a Table (nebo Query) je tak možné změny přenášet přímo do fyzické databáze. Ukázku komponenty DBGrid si můžete prohlédnout na následujícím obrázku:.

Tuto komponentu je velmi vhodné kombinovat s komponentou DBNavigator, jako to děláme v našem příkladu v závěru této kapitoly.

Nejdůležitější vlastností je DataSource, ve které musíme přiřadit komponentě DBGrid příslušný zdroj dat.

Pokud chcete nastavit vzhled jednotlivých sloupců (např. změnit jejich záhlaví), použijte vlastnost Columns. Po kliknutí na tlačítko se třemi tečkami v Object Inspectoru (vedle názvu vlastnosti Columns) se otevře okno Editing DBGrid.Columns) - viz následující obrázek - ve kterém můžete jednak nastavit sloupce, které chcete zobrazit, a jednak změnit jejich vzhled. Můžete nastavit titulek, šířku apod. V Object Inspectoru se zobrazí vlastnosti pro každý sloupec zvlášť, vždy poté, co na některý název sloupce v tomto okně kliknete.

Velmi důležité je správné nastavení možností (Options). Tato vlastnost se skládá z 13 „podvlastností“, pomocí kterých nastavujete stav mřížky (např. dgEdit – uživatel může měnit údaje), chování mřížky (např. dgColumnResize – uživatel může myší měnit šířku sloupců), vzhled (např. ColLines, resp. RowLines – zobrazuje oddělovací čáry mezi sloupci, resp. řádky), apod.

DBGrid má také celou řadu událostí – např. OnCellClick (při kliknutí do buňky), OnTitleClick (při kliknutí na záhlaví – jméno – sloupce), OnColEnter (při přechodu do nové buňky) a další.

Navigace po tabulce – DBNavigator

DBNavigator je komponentou, která se používá ve spolupráci s jinými databázovými komponentami. DBNavigator sám o sobě nezobrazuje žádná data, nicméně umožňuje základní ovládání dalších komponent, které slouží k vypisování obsahu databáze.

V příkladu, který je uveden v závěru tohoto dílu, je použit DBNavigator spolu s mřížkou (DBGrid). Kromě „poskakování“ po záznamech databáze je možné použít DBNavigator také k vložení nového záznamu, k vymazání záznamu, k editaci apod. Navíc je možné zrušit změny, které zatím nebyly definitivně uloženy v databázi.

Nejdůležitější vlastností je DataSource, která specifikuje datový zdroj. Nastavíme-li stejný datový zdroj pro DBNavigator i pro „zobrazovací“ komponentu, např. DBGrid, zajistíme „spolupráci“ těchto dvou komponent. Ve vlastnosti VisibleButtons zvolíte, jaká tlačítka budou na navigátoru viditelná.

Další obrázek ukazuje DBNavigator v běžící databázové aplikaci:

Význam jednotlivých tlačítek (zleva) je následující:

  • Přechod na první záznam
  • Přechod na předchozí záznam
  • Přechod na následující záznam
  • Přechod na poslední záznam
  • Přidat záznam
  • Smazat záznam
  • Přejít do režimu oprav (na obrázku momentálně nepřístupné)
  • Potvrdit změny a uložit do databáze
  • Zrušit změny
  • Refresh data

Zobrazení logické informace z databáze – DBCheckBox

DBCheckBox bude naším reprezentantem pro ostatní databázové komponenty. Představte si, že v databázi existují sloupce, které zobrazují položky výhradně logického typu (tedy dvouhodnotové, např. ženatý/svobodný, apod.). V takovém případě je vhodné zobrazit je pomocí komponenty DBCheckBox.

Vlastnost DataSource je stejná jako u všech předchozích komponent, specifikuje komponentu sloužící jako datový zdroj. Ve vlastnosti DataField se nastavuje datové pole, které se má „svázat“ s DBCheckBoxem, tedy název některého ze sloupců tabulky.

Při procházení tabulkou se zobrazuje políčko zaškrtnuté nebo nezaškrtnuté, podle hodnoty příslušného sloupce v aktuálním záznamu a podle nastavení vlastností ValueChecked a ValueUnchecked.

Příklad vytvoření databázové aplikace

Nyní uzrál čas, abychom si předvedli, jak vytvořit databázovou aplikaci, a to zcela „ze zelené louky“. Začneme vytvořením databázového Aliasu pomocí BDE, pokračovat budeme vlastním vytvořením jednoduché databáze pomocí nástroje Database Desktop a skončíme ve vlastním Delphi navržením uživatelského rozhraní aplikace.

Vytvoření nového Aliasu pomocí BDE

V této podkapitole popíšeme způsob vytvoření nového Aliasu v BDE. Popis se bude týkat verze 5.01 nástroje BDE (ale ve starších verzích se nebude příliš lišit).

1. Spusťte nástroj BDE Administrator (měl by být nainstalován ve stejné složce nabídky Start). Na disku by se měl tento nástroj nacházet v adresáři Borland Shared\BDE\BDEadmin.exe. Spuštěný BDE Administrator ukazuje obrázek:

2. Nový Alias vytvoříte tak, že kliknete kdekoliv v BDE Administratoru pravým tlačítkem myši a z kontextového menu vyberte New… Objeví se pole určené pro výběr jména ovladače databáze. Buď vyberte z rozbalovacího seznamu některé jiné jméno, nebo ponechte hodnotu Standard (viz obrázek):

3. Stiskněte OK a na místo, kde bliká kurzor, napište jméno Aliasu. My zvolíme Alias „Nová databáze“. Na pravé straně BDE Administratoru vidíme vlastnosti vytvořeného Aliasu.

4. Ještě je třeba nastavit cestu k adresáři, který bude Aliasem označován. Klikněte do pravé části BDE Administratoru a v poli Path vyberte (nebo napište) cestu k souboru, který bude následně obsahovat databázi (my zvolíme „C:\NovaDB“, viz obrázek). Nezapomeňte na disku vytvořit tento adresář!

Tím je Alias vytvořen. Můžete ukončit BDE Administrator (potvrďte změny). Pokračovat budeme spuštěním databázového systému Database Desktop.

Vytvoření databáze pomocí nástroje Database Desktop

Následující popis se bude týkat systému Database Desktop verze 7.0.

1. Spusťte Database Desktop. Měl by být nainstalován v adresáři Database Desktop\dbd32.exe a měl by jít spustit ze stejné složky v nabídce Start, jako vlastní Delphi. Spuštěný Database Desktop je na následujícím obrázku:

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

3. Stiskněte OK. Otevře se okno Create Paradox 7 Table: (Untitled). Zde se navrhuje vlastní tabulka (my budeme vytvářet jen jednu tabulku, přestože reálné databáze se zpravidla skládají z většího počtu tabulek). Návrh tabulky bude spočívat v zapisování jmen sloupců a nastavování jejich typů. Výsledek je na dalším obrázku.

Typ A znamená Alfanumerický a číslo 20 značí maximální možnou délku tohoto údaje. Typ N je číselný a L logický. Hvězdička ve sloupci Key u pole Cislo znamená, že toto pole bude primárním klíčem tabulky (bližší popis viz publikace či www stránky zabývající se databázemi).

4. Stiskněte Save As… Otevře se dialogové okno 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 Databaze, viz obrázek):

5. Stiskněte Uložit a ukončete Database Desktop. Databáze (tabulka) je vytvořena.

Vytvoření návrhu aplikace v Delphi

V Delphi vytvořte novou aplikaci (File – New Application).

1. Na formulář (Name = frmHlavni) umístěte následující komponenty: DataSource (dsEmaily), Table (Table), DBGrid (DBGrid), DBNavigator (DBNavigator) a Button (btnKonec).

2. Nyní nastavte vlastnosti jednotlivých komponent takto: komponenta Table:

  • DatabaseName – klikněte na rozbalovací seznam vedle této vlastnosti v Object Inspectoru a vyberte náš vytvořený Alias: Nová databáze.
  • TableName – klikněte na rozbalovací seznam vedle této vlastnosti v Object Inspectoru a vyberte jedinou přístupnou tabulku: Databaze.db.
  • Active – True. Tím bude zajištěno, že v tabulce budou „živá data“ už v době návrhu.
3. komponenta DataSource: vlastnost Dataset = Table

4. komponenta DBGrid: vlastnost DataSource = dsEmaily

5. komponenta DBNavigator: vlastnost DataSource = dsEmaily

6. Ve vlastnosti Column komponenty DBGrid nastavte vzhled sloupců tabulky. Klikněte na tlačítko se třemi tečkami u vlastnosti Column komponenty DBGrid, otevře se okno Editing DBGrid.Columns. Pokud nevidíte názvy sloupců, klikněte na tlačítko Add All Fields. Objeví se seznam sloupců. Pak postupně klikejte na jednotlivé názvy a v Object Inspectoru nastavujte vlastnosti. Budeme chtít například zcela skrýt sloupec Cislo (identifikační číslo osoby běžného uživatele vůbec nezajímá), proto mu nastavíme Visible = False. U ostatních sloupců upravíme titulek (vlastnost Title.Caption), šířku (Width) a případně barvu (Title.Color).

7. Zbývá ošetřit událost OnClick komponenty btnKonec:   Application.Terminate;

8. Aplikace je vytvořena. Všimněte si, že s výjimkou event handleru OnClick tlačítka btnKonec jsme dosud nenapsali ani jedinou řádku kódu, přesto je program plně funkční. Aplikaci uložte, spusťte a zkuste si pracovat s databází - zadávat do tabulky nové položky, pohybovat se v tabulce pomocí DBNavigatoru, mazat záznamy apod. Následující obrázek ukazuje běžící aplikaci, do které právě přidáváme nový záznam:

9. Abychom si jednoduše demonstrovali způsob práce s komponentou Query, trochu naši aplikaci vylepšíme. Přidejte na formulář komponentu Query a nastavte jí vlastnost Database Name = Nová databáze.

10. Dále přidejte na formulář jedno tlačítko (Name = btnSerad, Caption = Seřaď). Ošetříme jeho událost OnClick, event handler bude následující:

procedure TfrmHlavni.btnSeradClick(Sender: TObject);
begin
  dsEmaily.Dataset := Query;
  Query.SQL.Clear;
  Query.SQL.Add(`SELECT * FROM Databaze ORDER BY Prijmeni`);
  Query.Open;
end;

11. Uložte aplikaci, přeložte, spusťte. Na začátku by se měly zobrazovat údaje zcela stejně jako v předchozím případě. Zkuste kliknout na tlačítko Seřaď. Údaje se seřadí abecedně podle příjmení.

Poznámky k příkladu

Na tomto jednoduchém příkladu je vidět základní schéma práce s databázemi v Delphi. Komponenty Table a Query reprezentují základní způsob „dobývání“ dat z fyzických tabulek (databází).

Tím, že jsme přidali do aplikace komponentu Query, jsme si otevřeli možnost pracovat s databází prostřednictvím příkazů jazyka SQL. Je třeba si uvědomit, že tuto možnost máme i přesto, že nejde o „SQL – databázi“.

Vysvětleme si podrobně kód ošetřující událost OnClick tlačítka btnSerad.

dsEmaily.Dataset := Query;

Tato řádka přiřadí komponentě DataSource jiný dataset. V návrhu aplikace jsme této komponentě „přiřkli“ tabulku Table, nyní toto nastavení měníme na Query.

Query.SQL.Clear;

Nejprve je nutné „vyčistit“ vlastnost SQL. Pokud by v ní byly některé příkazy z předchozích akcí (což v našem případě nehrozí, pravda), došlo by pravděpodobně k chybě, protože dalším příkazem do vlastnosti SQL přidáme další příkaz:

Query.SQL.Add(`SELECT * FROM Databaze ORDER BY Prijmeni`);

Do vlastnosti SQL jsme přidali příkaz uvedený v apostrofech. Protože SQL je typu TStrings, platí pro ni všechny metody tohoto typu. Příkaz SELECT je základním a nejčastěji používaným SQL příkazem; jeho funkcí je (zjednodušeně řečeno) získání dat z tabulky (v našem případě chceme vybrat všechny sloupce <) z tabulky Databaze). Doplněním o klauzuli ORDER BY říkáme, že chceme získané záznamy seřadit podle příjmení.

Query.Open;

Zavoláním metody Open teprve provedeme SQL příkaz, neboť v předchozí řádce jsme jej pouze přiřadili do vlastnosti SQL. Pro provedení příkazu SELECT se používá metoda Open, pro provedení jiných příkazů metoda ExecSQL.

Všimněte si, že jakmile začnete pracovat s výsledkem dotazu místo s vlastní tabulkou (kliknutím na Seřaď), ztrácíte možnost editace záznamů. Je to způsobeno tím, že při práci s Table jsou v mřížce zobrazeny přímo údaje z fyzické tabulky, chtělo by se říci „jedna k jedné“. Jakmile provedete příkaz SQL (a tedy zobrazíte seřazené záznamy), už nepracujete s vlastní tabulkou, ale pouze s výsledkem dotazu – tedy z tabulky byly vybrány údaje, byly nějak upraveny (v našem případě seřazeny) a pak byly vypsány.

Aby bylo možné editovat výsledek dotazu, musí být splněno několik podmínek. Tyto podmínky se navíc liší v závislosti na tom, pracujeme-li s lokální databází nebo s databází umístěnou na SQL Serveru. Jedna z podmínek (pro oba typy databází) však zní: příkaz SQL nesmí obsahovat třídicí kritérium (tedy ORDER BY).

Můžete si zkusit zrušit v dotazu sekci ORDER BY:

  Query.SQL.Add(`SELECT * FROM Databaze`);

Pokud ještě navíc nastavíte vlastnost RequestLive komponenty Query na True, bude editace možná i ve výsledku dotazu.

Zdrojový kód modulu

Následuje zdrojový kód hlavního modulu databázové aplikace (Hlavni.pas). Vidíte, že je skutečně neuvěřitelně krátký a že kromě příkazu pro ukončení aplikace (oblíbené Application.Terminate :-)) a páce s komponentou Query jsme k vytvoření plně funkční aplikace nemuseli napsat jedinou řádku programového kódu.

unit Hlavni;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, DBCtrls, Grids, DBGrids, Db, DBTables;

type
  TfrmHlavni = class(TForm)
    dsEmaily: TDataSource;
    Table: TTable;
    DBGrid: TDBGrid;
    DBNavigator: TDBNavigator;
    btnKonec: TButton;
    Query: TQuery;
    btnSerad: TButton;
    procedure btnKonecClick(Sender: TObject);
    procedure btnSeradClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmHlavni: TfrmHlavni;

implementation

{$R *.DFM}

procedure TfrmHlavni.btnKonecClick(Sender: TObject);
begin
  Application.Terminate;
end;

procedure TfrmHlavni.btnSeradClick(Sender: TObject);
begin
  dsEmaily.Dataset := Query;
  Query.SQL.Clear;
  Query.SQL.Add(`SELECT * FROM Databaze ORDER BY Prijmeni`);
  Query.Open;
end;

end.

Diskuze (6) Další článek: Poprvé za patnáct let klesly prodeje počítačů

Témata článku: , , , , , , , , , , , , , , , , , , , , , , , , ,