Delphi - Multi-tier alkalmazásfejlesztés MIDAS komponensekkel

Multi-tier 2. rész

forráskód letöltése
Mielőtt tovább haladhatnánk a MIDAS-szal történő alkalmazásfejlesztés rejtelmeinek bemutatásával, készítenünk kell egy SQL adatbázist, melyet a későbbi példákhoz használunk majd.

Ebben a cikkben ennek lehetőségeivel, eszközeivel ismerkedhetünk meg. A példáinkhoz azért van szükség SQL-adatbázisra, mert a későbbiekben tárgyalásra kerülő komponensek sok tulajdonsága kapcsolatban van az SQL (Structured Query Language) nyelvvel.
A példáinkhoz a Delphi-vel (Dephi4 Client/Server verzió, Delphi5 Enterprise verzió) együtt forgalmazott InterBase (verziószám a Delphi verziótól függ) SQL-szervert használjuk. Persze használható az InterBase 6-os verziója is, mely az internetről ingyenesen letölthető és használható. (www.interbase.com)

A példaadatbázisunk két adattáblát fog tartalmazni, úgy mint:

- SZEMELYEK tábla, ami egy személyi nyilvántartás, a szokásos személyi adatokat tartalmazza, valamint egyedi azonosítóként egy SZEMELYKOD nevű integer típusú mezőt.

- JELENTKEZES tábla, ami a személyi nyilvántartásban szereplő személyek jelentkezéseit tartalmazza különféle munkákra, egyedi megbízásokkal. Minden személyhez tetszőleges számú jelentkezés tartozhat.

(A táblák részletes leírását később, a példákon keresztül fogjuk tárgyalni.)

Először indítsuk el a Dephi programcsoportjának menüjében található SQL Explorer-t! Az InterBase szervernek ekkor már futnia kell. Ha nem fut, akkor az InterBase menüjéből indítsuk el az InterBase Server-t!

Először Alias-t (álnevet) kell készítenünk az új adatbázis számára. Ehhez az SQL Explorer-ben kattintsunk a baloldali ablak Databases-fülére (kiindulási helyzet az Explorer indulásakor), és az Object legördülő menüben válasszuk ki a New... parancsot. Ekkor megjelenik a New Database Alias -párbeszédablak. Itt a Database Driver Name -ComboBox-ból válasszuk ki az INTRBASE-t, majd nyomjuk meg az Ok-gombot. A baloldali ablak listájában (Databases) megjelenik az új adatbázis, INTRBASE1-néven (ha még nincs ilyenünk!), a jobboldali (Definition) ablakban pedig látható lesz az új adatbázis definíciója. A nevet javítsuk ki DBPelda-ra, majd válasszuk ki az Object legördülő menüben az Apply parancsot, és a megjelenő párbeszédablakban nyomjuk meg az Ok gombot. Az Object menüből indítsuk el az ISQL... parancsot. (Az ISQL az InterBase programcsoport menüjéből is elindítható, az InterBase Windows ISQL menüpont kiválasztásával.
A File menü Run an ISQL Script... (Interbase 6: Query - Load Script menüpont, majd Query - Execute menüpont) parancsával futtassuk le az SQLscript\ könyvtárban található pelda.sql szkript-et.
Ez létrehozza a Szemely.gdb nevű adatbázist. A Save output to a file - kérdésre válaszoljunk nemmel, mert most nem file-ba kérjük a művelet eredményét, hanem az ISQL alsó ablakában jelenik meg a létrehozott adatbázis forráskódja.

(Amennyiben az adatbázist nem a pelda.sql szkript-ben megadott D:\Dso\0249\Midas02\ könyvtárban akarjuk létrehozni, akkor egy szövegszerkesztő segítségével írjuk át a "create DATABASE" és "connect DATABASE" kezdetű sorokban szereplő elérési utakat a használni kívántra! Természetesen ebben az esetben az adatbázis definíciójánál is ezt az elérési utat kell megadni, ahogy a következőben látjuk majd.)

Ha ezzel végeztünk, akkor zárjuk be az ISQL-programot, az SQL Explorer baloldali listájában jelöljük ki az előzőleg létrehozott DBPelda alias nevet, majd a jobboldali (Definition) táblázatban módosítsuk a következőket:

- Kattintsunk a SERVER NAME sorra, majd nyomjuk meg a megjelenő ellipszis-gombot, és a megjelenő fájllistából válasszuk ki a Szemely.gdb-t. Ezzel biztosítjuk az alias név kapcsolatát a fizikai adatbázissal.
Amennyiben hálózati környezetben dolgozunk, akkor ezt a jellemzőt ki kell egészítenünk az adatbázis-szerver gépének nevével, ugyanis az adatbázis-szerver és a később elkészített COM-szerver (középső réteg) fizikailag külön gépen is elhelyezkedhetnek.

- A USER NAME -et írjuk át SYSDBA-ra. (Ez az InterBase adatbázisok default felhasználói neve.)

Az Object menü Apply parancsával mentsük le a változtatásokat.

Ez után nyissuk meg az adatbázisunkat úgy, hogy a baloldali listában kattintsunk a DBPelda melletti '+' jelre. A megjelenő párbeszédablakban a Password-höz írjuk be a jelszót: masterkey.
Ha mindent rendben elvégeztünk a fent leírtak alapján, akkor az adatbázisunk sikeresen megnyílt, és az SQL Explorer-rel lekérdezhetjük jellemzőit, beállításait stb., és szerkeszthetjük adatait. Ennek a cikknek nem célja az SQL Explorer működésének teljes bemutatása. Az eddig leírtak elégségesek ahhoz, hogy mintaadatbázisunk működjön, és a később leírt példaprogramokkal kezelni tudjuk.

Lássuk viszont pár mondatban a lefuttatott SQL-szkript néhány jellemzőjét:

Az alábbi sorok a DOMAIN-definíciókat tartalmazzák:
/* Domain definitions */
CREATE DOMAIN DNEV AS VARCHAR(25) NOT NULL;
CREATE DOMAIN DNEME AS CHAR(1)
         check (value in('f','n','F', 'N'));
CREATE DOMAIN DMAIDATUM AS DATE NOT NULL;
A domain-ek a felhasználó által definiált adatbázisszintű típusok, hasonlóan pl. a Pascal Type szóval bevezetett típusaihoz.


A következő sorok a táblák definícióit tartalmazzák:
/* Table: JELENTKEZES, Owner: SYSDBA */
CREATE TABLE JELENTKEZES (SZEMELYKOD INTEGER NOT NULL,
        DATUM DMAIDATUM,
        FELADAT VARCHAR(25) NOT NULL,
PRIMARY KEY (SZEMELYKOD, DATUM));

/* Table: SZEMELYEK, Owner: SYSDBA */
CREATE TABLE SZEMELYEK (SZEMELYKOD INTEGER NOT NULL,
        NEV DNEV,
        HELYSEG VARCHAR(25),
        UTCAHAZ VARCHAR(30),
        NEME DNEME,
        KORA INTEGER NOT NULL,
        FOGLALKOZAS VARCHAR(30),
PRIMARY KEY (SZEMELYKOD));
Mint látjuk, a táblák létrehozásánál felhasználtuk az előzőleg definiált domain-eket is.

Mivel egy személyhez tetszőleges számú jelentkezés tartozhat, ezért szükségünk van egy hivatkozási integritási kapcsolat megadására a két tábla között:
ALTER TABLE JELENTKEZES ADD FOREIGN KEY 
(SZEMELYKOD) REFERENCES SZEMELYEK(SZEMELYKOD);
A SZEMELYEK táblában a SZEMELYKOD mezőt integer-ként deklaráltuk, mert az InterBase-ben nincs autoincrement típus.
Hogy a személykódot mégis automatikusan generálja az adatbázis, ezért készítettünk neki egy generátort:
CREATE GENERATOR G_SZEMELYKOD;
Ez egy olyan változó, amelynek kezdőértéket is adhatunk, jelen esetben nem adtunk, ezért a kezdőérték 0.
Hogy a generátor értéke minden új rekord felvitelénél eggyel nőjön, a SZEMELYEK tábla számára készítettünk egy triggert, amely a SZEMELYEK táblába való minden új rekord beszúrása előtt lefut, és ezt sehonnan sem lehet kikerülni, mert mint az első cikkben már említésre került, a triggerek részei az adatbázisnak, működésüket kívülről nem lehet befolyásolni!
A trigger lefutását egy táblaszintű esemény indítja el, jelen példánkban az új rekord beszúrása a táblába (ACTIVE BEFORE INSERT). A triggerbe beépítésre került még egy másik elvégzendő feladat is: mint fentebb a DNEME domain-nél láttuk, a NEM-nél csak két érték, az 'F' (férfi) és az 'N' (nő) fogadható el. Az esetleges kisbetűvel beírt nem-kódokat a trigger még a táblába való felvitel előtt nagybetűssé alakítja. Az eseménykezelőkben minden mezőnek két értéke érhető el: az old.mezőnév a régi - változtatás előtti -, a new.mezőnév pedig a változtatás utáni értéket jelenti.

A triggerünk tehát a következő:
CREATE TRIGGER T_SZEMELYEK FOR SZEMELYEK                       
ACTIVE BEFORE INSERT POSITION 0 
as
begin
     new.Neme = upper(new.neme);
     new.szemelykod = gen_id(g_szemelykod, 1);
end

Multi-tier cikksorozat