molnár roland - adatbázis-kezelő rendszerek fejlesztése delphi nyelven (2002, 32 oldal)
DESCRIPTION
Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)TRANSCRIPT
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 1/32
Molnár Roland
Adatbázis-kezelő rendszerek fejlesztése Delphinyelven
Bevezetés a Delphi-s adatbázis-kezelés rejtelmeibe
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 2/32
1
Tartalomjegyzék
Bevezetés.....................................................................................................................................3A munkához kapcsolódó gyakorlati feladatok .................................................... ................3
I.Az adatbázisokról......................................................................................................................4
Alapfogalmak, elvek ........................................................ ................................................... 4Adatbázis ............................................................... ..................................................... 4Adatbázis-kezel
ő
rendszer..........................................................................................4Adatmodellek alapelemei ...........................................................................................4
Az egyed..........................................................................................................4A rekordtípus...................................................................................................4A tulajdonság...................................................................................................4A kulcs.............................................................................................................4A kapcsolat......................................................................................................5
Adatmodell .................................................................................................................5A normálformák .........................................................................................................5
Első
normálforma (1NF) ............................................................ .....................5Második normálforma (2NF)...........................................................................5
Harmadik normálforma (3NF).........................................................................6Magasabb normálformák.................................................................................7
A lookup ................................................ ......................................................... ............7Törzsadattábla.............................................................................................................7SQL.............................................................................................................................7
Adatbázis-tervezés ..............................................................................................................7II.A Delphi adatbázis-kezel
ő
rendszere.......................................................................................8Alapok, BDE.......................................................................................................................8
Alias létrehozása, szerkesztése ............................................................................. ......9Tábla létrehozása, szerkesztése...................................................................................9SQL lekérdezés készítése .........................................................................................10
Komponensek....................................................................................................................10III.A Delphi adatbázis-kezel
ő
komponensei..............................................................................10
TDataSet, mindennek az alapja.........................................................................................10Data Access komponensek................................................................................................10
TDataSource.............................................................................................10
TTable ............................................................ ..........................................10
TQuery ................................................. .................................................... 11
TUpdateSQL ......................................................... ...................................12
TBatchMove.............................................................................................12Data Controls komponensek ..................................................... ........................................12
TDBGrid ..................................................................................................12
TDBNavigator..........................................................................................13
TDBText ..................................................................................................13
TDBEdit...................................................................................................13
TDBMemo ...............................................................................................13
TDBImage................................................................................................13
TDBListBox.............................................................................................13
TDBComboBox .......................................................................................13
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 3/32
2
TDBCheckBox.........................................................................................13
TDBRadioGroup .................................................... ..................................13
TDBLookupListBox.................................................................................13
TDBLookupComboBox...........................................................................14TDBRichEdit............................................................................................14
TDBCtrlGrid ......................................................... ...................................14
TDBChart.................................................................................................14Nyelvi problémák..............................................................................................................14TDataModule ..................................................... ............................................................. ..14
IV.Egy adatbázis-kezelő
alkalmazás elkészítése ............................................................. ..........15Tervezés .................................................... ............................................................. ...........15A DataModule...................................................................................................................15Az ablakok .......................................................... ............................................................. .16
Ablaktípusok.............................................................................................................17A f ő
képernyő
............................................................................................................18Táblamegjelenít
ő
ablakok.........................................................................................18Adatlapok..................................................................................................................20M
ű
veletvégző
ablakok..............................................................................................21Kimutatások..............................................................................................................22Folyamatkijelz
ő
k (ProgressBar -ok).........................................................................23Nyomtatás, riport......................................................................................................23Project.......................................................................................................................24
V.Egyéb problémák...................................................................................................................25Hibakezelés ................................................................. ...................................................... 25Hálózat használata Paradox rendszerrel............................................................................26Biztonsági problémák........................................................................................................27
Biztonsági mentés.....................................................................................................27Adatsérülések kezelése ................................................................. ............................27Telepít
ő
készítése..............................................................................................................28Készítsünk CD-t! ........................................................ .............................................. 30
VI.Lezárás .................................................................................................................................30Irodalomjegyzék........................................................................................................................31
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 4/32
3
Bevezetés
A Borland Delphi napjaink egyik legfejlettebb alkalmazás-fejlesztő
rendszere. Első
sorban adatbázis-rendszerek készítésére szánják, de gyakorlatilag bármilyen szoftvert el lehet készíteni vele. Mivel mindig isérdekelt a programozás és a modern technológia, autodidakta módon foglalkozni kezdtem vele (a f
ő
iskolaitanórákon az 1992-es dátumú Turbo Pascal 7.0 volt a „legújabb” fejleszt
ő
környezet, amellyel találkoztam).Kés
ő
bb már komolyabb alkalmazásokat is fejlesztettem Delphi-vel, így a számítástechnikának ez a területe lettaz, amivel a legtöbbet foglalkoztam. Rengeteg tapasztalatot gy
ű
jtöttem, amelyet mindig is szerettem volnamegosztani olyanokkal, akiknek szükségük van rá. Ezért választottam ezt a témát dolgozati témának. Én személyszerint a Delphi-vel való ismerkedésem idején szívesen forgattam volna egy ilyen munkát, elkerülve ezzelrengeteg bosszúságot és kísérletezést. Ezt a témát választva remélem, hogy ez a munka másokhoz is eljut, és
segítő
kezet nyújt mindazoknak, akik közelebbrő
l is meg szeretnének ismerkedni a Delphi-vel.Ez a dolgozat azoknak szól, akik most ismerkednek a Borland Delphi fejlesztő
eszközzel, és szeretnékmegtenni az els
ő
lépéseket az adatbázis-kezelő
rendszerek fejlesztése felé. Ez a dolgozat egy rövid, de lényegretör
ő
kalauz, mely végigvezet a kezdetektő
l egészen a telepítő
készítéséig minden nagyobb állomáson, amelyenegy adatbázis-kezel
ő
szoftver fejlesztése során át kell haladni. Célja nem az, hogy megmutassa, hogyan kellfejleszteni, hanem az, hogy megmutassa, hogyan lehet elkezdeni. „Minden kezdet nehéz” – hangzik a kopottmondás. Ezen a nehéz kezdeten igyekszik átsegíteni olvasóját. Végigolvasva, követve a tanácsokat már bátranhozzákezdhet a Kedves Olvasó a fejlesztéshez. Ne várjon azonban teljes kör
ű
leírást vagy magyarázatot, hiszenmindenr
ő
l részletes információ található a Delphi súgójában ( Help), és én nem azt kívántam magyarítani. Sokkalinkább egy átfogó segítséget szeretnék nyújtani, mindenhol utalva a Delphi Help-re.
Ahhoz, hogy e munka tanulmányozása eredményes legyen, a következő
dolgok szükségesek:- Id
ő
, hiszen ez nem megy egyik pillanatról a másikra.- Kísérletez
ő
kedv, mert programozni tanulni csak úgy lehet, ha kísérletezgetünk.
- Angoltudás, mivel a Delphi és a hozzá tartozó súgó angol nyelvű
, így a helyes használat érdekében legalábbminimális angoltudással és egy jó szótárral kell rendelkezni.- Számítógép és egy telepített Delphi 3, 4 vagy 5
A dolgozat írásakor Delphi 5-öt használtam, így elő
fordulhat, hogy a többi verzióban egy-két dologmáshogy és máshol van, de a lényeg mindegyiknél megegyezik.
A dolgozat felépítését tekintve az elmélettő
l halad a gyakorlat felé. Elő
ször adatbázis-kezelésialapfogalmakat ismertet, majd a Borland adatbázis-kezelésének elvi m
ű
ködését magyarázza, azután pedig rátéraz adatbázis-kezel
ő
rendszerek fejlesztésének lépéseire. Végül különböző
gyakorlati problémák megoldásáranyújt hasznos tanácsokat.
A dolgozatban sokat fogok hivatkozni a Delphi súgójára, a következő
képpen: ( Delphi Help: Témakör).Az itt megadott témakört beírva a Tárgymutató ablak keres
ő
sorába, megtaláljuk az oda vonatkozó bő
vebbleírást. Az irodalomjegyzékben szerepl
ő
irodalmakra a következő
képpen utalok: [jegyzékszám/oldalszám] (pl.:
[2/213] = Szelezsán János Adatbázisok c. könyvének 213. oldala).
A munkához kapcsolódó gyakorlati feladatok
Jelen munka készítése elő
tt már volt szerencsém adatbázis-kezelő
alkalmazásokat fejleszteni, így kellő
tapasztalatot szereztem a Delphi-s Paradox rendszerek mű
ködtetésérő
l, programozásáról. A dolgozatomban ezenmunkákról készült képerny
ő
képek (és egy-két helyen ezekbő
l kimásolt kódrészletek) találhatóak. Ezek a munkákazonban nem kapcsolódnak konkrétan a dolgozat tárgyához, hiszen általánosságban beszélek a feladatokról.Nem láttam tehát sok értelmét annak, hogy ezekkel b
ő
vebben foglalkozzak. A pontosság kedvéért azértszeretném közölni, milyen munkák ezek.
Az egyik feladat egy helyi rádió reklámadminisztrációjának számítógépesítése volt. Az adatbázisrendkívül egyszer
ű
, mindössze három f ő
- és négy altáblából áll. A három f ő
tábla közül az egyik a reklámokadatait tárolja (felvétel id
ő
pontja, hirdető
partner, hirdetésszervező
, futás kezdete, vége, darabszám, fizetés
dátuma, módja, a reklám szövege, típusa, stb.). A második táblában a hirdető
partnerek, a harmadikban ahirdetésszervező
k adatai vannak (név, cím, telefonszám, stb.). A négy altábla közül egy a reklámtípusokat, egy afizetésmódokat, egy a felhasználókat, egy pedig a felhasználói típusokat tárolja. A táblák között egyszer
ű
1:Nrelációk vannak.
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 5/32
4
A másik feladat ennél lényegesen bonyolultabb: egy étterem rendelés-, számla-, és raktárnyilvántartásátkellett megoldani. A rendszer két részb
ő
l áll: az éttermi program a rendelésekkel és a számlákkal foglalkozik, araktár program pedig a raktárkészlettel, és az éttermi program által regisztrált rendelések alapján (a sajátösszetev
ő
-adatbázist használva) a raktári tételek mennyiségének automatikus aktualizálásával. A rendszer kétadatbázist (étterem és raktár), és összesen 29 Paradox táblát tartalmaz. Az éttermi program az általa tárolthatalmas adatmennyiség (rendelések és számlák) ellenére megfelel
ő
sebességgel dolgozza fel az adatokat,köszönhet
ő
en annak, hogy a rendelések és számlák adatait két-két táblában is tárolja. Egyikben az aktuálisakat, amásikban a régebbieket, melyekkel a program csak zárás esetén foglalkozik. Érdekes feladat volt még aszámlanyomtatók kezelése, melyet úgy oldottam meg, hogy meghajtóprogram (driver ) nélkül m
ű
ködjön.Mindkét szoftver lehet
ő
vé teszi a hálózati használatot, mely igazán az étterem programnál volt nagykihívás, hiszen nagyobb forgalom idején egyszerre több számítógépen veszik föl a rendeléseket és adják ki aszámlákat, így rendkívül s
ű
rű
és nagy az adatmozgás.Az említett munkák készítése alatt szerzett tapasztalataim próbálom átadni ezen dolgozat keretein belül.
I. Az adatbázisokról
Alapfogalmak, elvek
Ebben a részben az adatbázisokkal kapcsolatos általános fogalmakkal ismerkedünk meg.
AdatbázisAmikor az ember adatbázis-kezel
ő
szoftverrel dolgozik, hajlamos azt hinni, hogy minden, amit azzalvégez, az adatbázis és adatbázis-kezelés. Ez azért van, mert nagyon sokan nincsenek tisztában az adatbázisfogalmával. Néhány adatfájl még önmagában nem adatbázis, csupán adattáblák halmaza. Ahhoz, hogyadatbázissá váljon, a táblák közötti kapcsolatokat is definiálni kell.
Gondoljunk például arra, hogy van két táblánk, az egyikben nevek, a másikban címek. Mindkettő
nekvan egy kód nev
ű
mező
je is. Ez a leírás önmagában még nem egy adatbázist határoz meg, csupán két, egymástólfüggetlen adattáblát írtunk le. A dolog akkor válik adatbázissá, ha kikötjük a következ
ő
t: a neveket és a címeket
tartalmazó táblában lév ő kód összekapcsolja a két táblát úgy, hogy egy, a neveket tároló táblában lév ő névhez azazonos kódú, a címeket tároló táblában lév
ő
cím tartozik. Ezzel definiáltuk az adatkapcsolatot.Az adatbázison tehát voltaképpen adatoknak kapcsolataikkal együtt való ábrázolását, tárolását
értjük. [2/13]
Adatbázis-kezelő rendszerAz adatbázis önmagában semmit nem ér. A felhasználó számára akkor válik értékké, ha megadunk
hozzá egy olyan szoftvert, amellyel az adatbázist kezelni tudja. Az ilyen szoftvert adatbázis-kezelő
rendszerneknevezzük. Az adatbázis-kezel
ő
rendszereknek két f ő
funkciója van: az adatdefiníció (az adatbázis szerkezeténekdefiniálása, a szerkezet feltöltése konkrét adatokkal, illetve ezek módosítása, törlése), valamint a lekérdezés(adatok visszakeresése, kimutatások készítése). [2/21]
Adatmodellek alapelemeiAz egyed
„Egyednek hívunk minden olyan dolgot (objektumot), ami minden más dologtól (objektumtól)megkülönböztethet
ő
, és amirő
l adatokat tárolunk.” [2/33]
A rekordtípus„Az adatbázis-kezel
ő
rendszerekben (…) az egyedtípust rekordtípusnak hívjuk. Ez a legkisebbcímezhet
ő
egység (ennél kisebb részeire nem lehet hivatkozni az adatbázisnak).” [2/34]
A tulajdonság„Az egyedeket tulajdonságokkal (attribútumokkal) írjuk le. A tulajdonság az egyed egy jellemz
ő
je, amimegadja, meghatározza az egyed egy részletét.” [2/35] A tulajdonság és az attribútum azonos jelentés
ű
fogalmak, és a továbbiakban felváltva használjukő
ket.
A kulcs
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 6/32
5
„Amennyiben egy tulajdonság vagy tulajdonságok egy csoportja egyértelmű
en meghatározza, hogy egyegyed melyik értékér
ő
l, elő
fordulásáról van szó (vagyis az egyedhalmaz melyik elemérő
l), akkor ezeketa tulajdonságokat együtt kulcsnak nevezzük” [2/36]
A kapcsolat„Kapcsolatnak nevezzük az egyedek közötti viszonyt.” [2/38] A kapcsolat fajtái:Egy-egy típusú kapcsolat (1:1 kapcsolat): olyan kapcsolat, ahol „az egyik egyedhalmaz mindegyikeleméhez a másik egyedhalmaznak pontosan egy eleme kapcsolódik (tehát a két egyedhalmaz
egymásba kölcsönösen egyértelmű en képezhet ő le).” [2/40]Egy-több típusú kapcsolat (1:N kapcsolat): „Azt mondjuk, hogy az A egyed és a B egyed között egy-több (1:N) kapcsolat van, ha az A egyedhalmaz mindegyik eleméhez a B egyedhalmaz több eleme istartozhat.” [2/40]Több-több típusú kapcsolat (N:M kapcsolat): „Több-több (jelben N:M) típusú kapcsolatnaknevezzük az A egyed és a B egyed közötti kapcsolatot, ha az A egyedhalmaz minden eleméhez a Begyedhalmaz több eleme tartozhat, és fordítva egy B-beli elemhez is több A-beli elemet rendelhetünkhozzá.”[2/41]
AdatmodellEzek után már definiálhatjuk, mi is az adatmodell: „Az adatmodell egyedek, tulajdonságok és
kapcsolatok halmaza, amely absztrakt módon tükrözi a valós objektumoknak, azok jellemző
inek
(tulajdonságainak) és viszonyainak (kapcsolatainak) elvont kategóriáit.” [2/48]
A normálformákAz adatbázisok bels
ő
szerkezetét ún. normálformák jellemzik. Ha egy adatbázis eleget tesz bizonyosfeltételeknek, akkor azt mondjuk, hogy egy adott normálformában van.
Első normálforma (1NF)„Egy R relációról azt mondjuk, hogy els
ő
normálformában van, ha minden sorában pontosan egyattribútumérték áll.” [2/87]Ez els
ő
hallásra lehet, hogy bonyolultnak hangzik, annál is inkább, hogy az adatbázis-kezelő
k csakolyan adatbázist fogadnak el, amely 1NF-ben van.Egy példával lehet a legjobban érzékeltetni, mit is jelent ez valójában:
NÉV SZAKKÉPZETTSÉGNagy Géza gépészmérnök, közgazdász, mű
szerészKiss János lakatosBíró Ödön fodrász, lakatos
A fenti táblázat nincs 1NF-ben, mert a SZAKKÉPZETTSÉG mező
ben néhol több érték is szerepelhet.Ezt úgy is lehetne ábrázolni, hogy minden egyes szakképzettséget külön sorba teszünk:
NÉV SZAKKÉPZETTSÉGNagy Géza gépészmérnök
közgazdászm
ű
szerészKiss János lakatosBíró Ödön fodrász
lakatos
Amennyiben ezt első
normálformára szeretnénk hozni, a legegyszerű
bb, ha a több attribútumértékettartalmazó sort annyi sorra bontjuk, amennyi az attribútumértékek száma:
NÉV SZAKKÉPZETTSÉGNagy Géza gépészmérnökNagy Géza közgazdászNagy Géza mű szerészKiss János lakatosBíró Ödön fodrászBíró Ödön lakatos
Így a táblázat már 1NF-ben van.
Második normálforma (2NF)
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 7/32
6
Egy reláció akkor van második normálformában, ha első
normálformában van, és minden nem-kulcstulajdonsága teljesen függ a kulcstól. [2/93]Nézzük pl. a következ
ő
, az elő
ző
nél kissé bonyolultabb, 1NF-ben lévő
táblát, ahol számlák adataittároljuk. A SZSZ a számlaszám, a TKOD a tételkód, a TNÉV a tételnév, az EÁR az egységár rövidítése.
ELADÁSSZSZ DÁTUM VEV Ő VEV Ő CÍM TKOD TNÉV DB EÁR ÁR234 2000.02.11. XYZ Kft Bp. Nagy út 10. 142 Kifli 5 20 100234 2000.02.11. XYZ Kft Bp. Nagy út 10. 264 Tej 3 40 120235 2000.02.20. UVT Kft Ózd, Híd út 3. 245 Kakaó 6 10 60235 2000.02.20. UVT Kft Ózd, Híd út 3. 142 Kifli 4 20 80
A kulcsot a számlaszám (SZSZ ) és a tételkód (TKOD) alkotják, hiszen ketten együtt egyértelmű
enmeghatároznak egy rekordot (ezeket d
ő
lt betű
vel jelöljük). A táblázat nincs 2NF-ben, mert vannakbenne olyan másodlagos attribútumok, amelyek nem az egész kulcstól, csak az azt alkotó egyesattribútumoktól függnek.A DÁTUM függ az SZSZ -t
ő
l, mert egy számlához egyazon dátum tartozik. Ez igaz a VEV Ő
-re, és aVEV
Ő
CÍM -re is. Hasonlóképpen belátható, hogy a TKOD is rendelkezik azzal a tulajdonsággal, hogytöbb másodlagos attribútumot egyedül is meghatároz (TNÉV , EÁR).A 2NF-re hozás egyszer
ű
mű
velet: a relációt több, 2NF-ben lévő
táblázatra bontjuk. A mi esetünkben ezkét táblát (ELADÁS1 és TÉTELEK ) fog eredményezni, és azoknak a kulcsai az ELADÁS táblánkkulcsának két attribútuma lesz:
ELADÁS1SZSZ DÁTUM VEV Ő VEV Ő CÍM TKOD DB ÁR234 2000.02.11. XYZ Kft Bp. Nagy út 10. 142 5 100234 2000.02.11. XYZ Kft Bp. Nagy út 10. 264 3 120235 2000.02.20. UVT Kft Ózd, Híd út 3. 245 6 60235 2000.02.20. UVT Kft Ózd, Híd út 3. 142 4 80
TÉTELEKTKOD TNÉV EÁR142 Kifli 20264 Tej 40
245 Kakaó 10
A két tábla közötti kapcsolatot a TKOD valósítja meg. Ezzel a relációt második normálformára hoztuk.
Harmadik normálforma (3NF)Egy reláció harmadik normálformában van, ha második normálformában van és egyetlen másodlagosattribútuma sem függ tranzitívan a kulcstól. [2/100]Egy C tulajdonság akkor függ tranzitívan az A kulcstól, ha meghatározza a kulcstól szintén függ
ő
Btulajdonság is. [3/224]Vegyük alapul az el
ő
bbi ELADÁS1, 2NF-ben lévő
táblát. A SZSZ meghatározza a VEV Ő
attribútumot,az pedig meghatározza a VEV
Ő
CÍM -et. Ez azt jelenti, hogy a VEV Ő
CÍM tranzitívan függ a SZSZ kulcstól, mivel azt meghatározza a nem kulcs VEV
Ő
tulajdonság is. A tábla tehát nincs 3NF-ben.Ahhoz, hogy 3NF-ben legyen, ugyanazt a m
ű
veletet kell elvégezni, mit az imént: föl kell bontanunk a
táblát. Itt azonban fel kell ismerni egy másodlagos kulcsot is: VEV Ő
. Ez lesz a két új tábla közöttikapcsolat.
ELADÁS2SZSZ DÁTUM VEV
Ő
TKOD DB ÁR234 2000.02.11. XYZ Kft 142 5 100234 2000.02.11. XYZ Kft 264 3 120235 2000.02.20. UVT Kft 245 6 60235 2000.02.20. UVT Kft 142 4 80
VEVŐ
KVEV Ő VEVŐ CÍMXYZ Kft Bp. Nagy út 10.UVT Kft Ózd, Híd út 3.
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 8/32
7
Így kiküszöböltük a tranzitív függő
sséget, a reláció 3NF-ben van. Természetesen a modellhez tartozikmég a TÉTELEK tábla is, de azt az el
ő
ző
példához képest változatlanul hagyjuk, hiszen az megfelel a3NF feltételeinek is.
Magasabb normálformákA harmadik normálforma a minimum, amit egy adatbázis tervezésnél be kell tartani. Ne gondoljuktehát, hogy ez a normalizálás csúcsa. Léteznek magasabb szint
ű
normálformák is (BCNF, 4. és 5. NF),ezek tárgyalása azonban kimerítené ezen dolgozat kereteit, ezért nem foglalkozunk velük.
A lookupEzzel a szóval sokat fogunk még találkozni a dolgozat folyamán. Angolul keresést , utánanézést jelent.Az adatbázis-kezel
ő
kben a táblák közötti kapcsolat megvalósítására használják. Segítségével az iméntipéldáinkban szerepl
ő
ELADÁS1 és TÉTELEK táblát összekapcsolhatjuk úgy, hogy a megjelenítettvégeredmény egy ELADÁS -hoz hasonló táblázat lesz, ahol a TNÉV és az EÁR ún. lookup mez
ő
k,amelyek valójában nincsenek a táblázatban, csupán az adatbázis-kezel
ő
helyezi odaő
ket, az általunkdefiniált kapcsolat alapján. Ez a kapcsolat a következ
ő
képpen néz ki: ELADÁS1.TKOD <==>TÉTELEK.TKÓD. Így a program a TKÓD alapján a TÉTELEK táblából gyakorlatilag „behúzza” azadatokat az ELADÁS1 táblába.Ezzel azonban korántsem merülnek ki a lookup által nyújtott lehet
ő
ségek. Táblázatunkban ugyanis nemmuszáj megjeleníteni a TKÓD mez
ő
t, így a felhasználó azt látja, hogy ha felvesz egy új számlát, a
VEV Ő
mező
nek ad értéket, holott valójában a TKÓD-ot manipulálja. Ezt azonban a rendszer ügyesenelrejti elő
le.Hasonlóképpen állíthatunk lookup kapcsolatot az ELADÁS2 és a VEV
Ő
K táblázatok között is, a VEV Ő
mező
alapján.Így az ELADÁS2, a VEV
Ő
K és a TÉTELEK (3NF-ben lévő
) táblák használatával megjeleníthetjük úgyaz adatbázist, hogy az ELADÁS (csupán 1NF-ben lév
ő
) táblát lássuk. Így nem veszítjük el anormalizálás által biztosított el
ő
nyöket, a felhasználó viszont egy helyen lát mindent, így neki nem kelltudnia, mi is az a normalizálás.
TörzsadattáblaA normalizálás folyamán keletkeznek olyan táblák, amelyek a többihez képest viszonylag állandónak
mondhatók (példánkban ilyen a TÉTELEK , ill. a VEV Ő
K tábla). Ezeket a táblák mindig valamilyen f ő
bb táblávalvannak kapcsolatban (itt: ELADÁS1, ill. ELADÁS2). Az ilyen táblákat törzsadattábláknak nevezzük. Atörzsadattáblák (értelemszerű en) törzsadatokat tartalmaznak. A törzsadatok manipulációját általában a programkarbantartó egységében vagy automatikusan szokták megoldani.
SQLAz SQL (Structured Query Language = Strukturált lekérdez
ő
nyelv) egy szabványosított (ISO 9075)adatbázis-kezel
ő
nyelv. Alapvető
en két része van: adatdefiníciós nyelv (DDL, Data Definition Language) ésadatmanipuláló nyelv (DML, Data Manipulation Language). A DDL segítségével táblákat hozhatunk létre,törölhetünk, stb., míg a DML-lel beszúrhatunk, szerkeszthetünk, törölhetünk, illetve lekérdezhetünk adatokat egyvagy több táblából.
A Delphi természetesen támogatja az SQL-t. Komponensein keresztül könnyen építhetünk bealkalmazásunkba SQL-utasításokat. Mivel ebben a munkában a Paradox rendszerekr
ő
l van első
sorban szó, azSQL-t b
ő
vebben nem tárgyaljuk.
Adatbázis-tervezés
Az elő
ző
részben megtudhattuk, hogyan kell az adatbázist egyszerű
síteni, normalizálni. A szabály tehátaz, hogy úgy kell megtervezni az adatbázist, hogy az legalább a harmadik normálforma követelményeinek elegettegyen. A gyakorlatban azonban ez nem mindig m
ű
ködik.Az általam készített éttermi alkalmazásban található például olyan eset, amikor a rendelés fejlécét és a
törzsét tartalmazó táblákban egyaránt szerepel az asztal kódja, holott elég lenne csupán a fejlécben tárolni, hiszenegy rendelés tételeihez csupán egy asztalkód tartozhat. Azért volt szükség ennek ellenére erre a megoldásra, merta számlázásnál asztalok szerint kell sz
ű
rni (mindig csak egy asztalhoz tartozó rendeléseket kell megjeleníteni), és jelent
ő
sen felgyorsította a mű
ködést az eredeti tervben nem szereplő
asztalkód mező
a rendelések törzsét tárolótáblában. A másik eset, amikor hasonló problémával találkoztam, a számlák rész- és végösszegének tárolása volt.Kénytelen voltam ugyanis eltárolni a bruttó árát is a számla tételeinek, illetve a számla bruttó végösszegét, pedig
ezeket egyértelmű en meg lehet határozni, mivel az adatbázis tartalmazza a tételek nettó árait és ÁFA-kulcsait, dekiszámításuk jelent
ő
sen lassította volna a mű
ködést. Mondhatnánk azt is, hogy a nettó árat sem kellene tárolni,hiszen azt is egyértelm
ű
en meghatározhatjuk, de gondolni kellett arra, mi történik, ha valaminek megváltozik azára. Ekkor ugyanis az eredeti modell szerint (amelyben még nem tároltam a számlák összegeit) a régebben
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 9/32
8
kiadott számlák összege is megváltozott, így hamis adatokat kaptunk. A végleges megoldással már nem jelentkezhet ez a probléma, hiszen a számla a kiadásának id
ő
pontjában aktuális árakat tartalmazza.Egy szó, mint száz, nem lehet agyon optimalizálni az adatbázist. Megfogalmazhatjuk tehát az adatbázis-
tervezés egyik legfontosabb titkát (amelyben Halassy Béla könyve is megerő
sített): „Sohasem szabad azadatszerkezetet egyszer
ű
síteni a programbonyolultság rovására.” [3/207]Azt természetesen mondani sem kell, hogy az adatbázis-tervezés két fontos szabálya: mindennek benne
kell lennie, amire szükség van, és semminek nem szabad benne lennie, amire nincs szükség. Hogy ismét HalassyBéla szavait idézzem: „Az a jó adatféle, ami nincs.” [3/155]. Mert ami nincs, azzal nem kell foglalkozni, nemfoglal helyet, nem vesz igénybe processzorid
ő
t, és nem kell fáradozni vele. Tehát fölösleges adatokatsemmiképpen ne tároljunk. Ami viszont kell, az kell. Ezek a kijelentések lehet, hogy triviálisnak hangzanak, defontosnak tartom leszögezni
ő
ket, mert sokszor nem tartjuk be ezeket, és késő
n ébredünk rá, hogy hibáztunk.Az adatbázis-tervezés bonyolult dolog. Rengeteget lehet hibázni, de a leggyakoribb hiba, ha nem
ismerjük eléggé a mű
ködési mechanizmusokat, azaz nem tudjuk, mire lesz szükség. Ezért nagyon fontos, hogyel
ő
tte tájékozódjunk, és a feladatot nagyon pontosan határozzuk meg. Ha megkérnek, hogy készítsünk egybizonyos alkalmazást, ne elégedjünk meg ennyivel, kérdezzük meg, hogyan kell m
ű
ködnie. Ezzel rengetegvesz
ő
dséget megspórolhatunk. Elmondható tehát az is, hogy az adatbázis-tervezés (de igaz ez aprogramtervezésre is) másik legfontosabb szabálya a minél pontosabb feladat-meghatározás.
II. A Delphi adatbázis-kezelő rendszere
Eddig az adatbázisokról általánosságban beszéltünk. Most áttérünk igazi témánkra, a Delphi-srendszerek fejlesztésére. Ehhez ismernünk kell a Delphi adatbázis-kezel
ő
rendszerének mű
ködési alapjait.
Alapok, BDE
A BDE a Borland Database Engine rövidítése, amely egy Windows alapú 32 bites adatbázis-motor.Feladata, hogy kapcsolatot teremtsen a fizikai adatbázis és az azt kezel
ő
alkalmazások között, és ezzelmegkönnyítse a Borland fejleszt
ő
rendszereit használó programozók munkáját. Leveszi vállunkról atáblaformátumok kezelését, és alapvet
ő
adatbázis-kezelő
rutinokat tartalmaz. A BDE a következő
adatbázisokattámogatja: dBASE, Paradox, Text, FoxPro, Access, InterBase, Oracle, Sybase, Microsoft SQL, ODBC(Microsoft Open Database Connectivity). A programozó ezek közül szabadon választhat, anélkül, hogymódosítaná programját. Minden formátumnak saját, független meghajtója (drivere) van. Ezeken kívül azonbanvannak megosztott szolgáltatások is, amelyeket minden driver használhat. Ilyen pl. a Buffer Manager (bufferkezel
ő
), a Sort Engine (rendező
motor), stb.A Delphi adatbázis-kezelése teljes mértékben a BDE motorra épül, a Delphi minden DB komponense
ezt használja az adatok közvetlen vagy közvetett eléréséhez. A komponensek a BDE API ( Application Program Interface) függvényeken keresztül m
ű
ködtetik a Database Engine-t. A BDE függvényei objektum-orientáltanépülnek fel, így azok elérése egyszer
ű
és strukturált.A Database Engine f
ő
bb részei a következő
k:- BDE mag ( BDE core): a rendszer magját képez
ő
.DLL fájlok tartoznak ide.- BDE API függvények: alapvet
ő
adatbázis-mű
veleteket tartalmazó függvénytár, mely tartalmaz adatbáziskezelésre, konfigurálásra, hibakezelésre, lekérdezésre, tranzakciókra használható függvényeket.
- Adatbázis meghajtók ( Database Drivers
): ide tartozik az öt standard meghajtó (Paradox, dBASE, FoxPro,Access, és Text).- Opcionális meghajtók (Optional Drivers): egyéb meghajtókat tartalmaz (InterBase, DB2, Informix, Oracle,
Sybase, Microsoft SQL Server).- Query motorok (Query Engines): az SQL (Structured Query Language – Strukturált lekérdez
ő
nyelv)motorok.
- BDE Administrator: a BDE beállításait végző
program ( BDEADMIN.EXE ).- Database Desktop: adatbázis fájlok kezelését végz
ő
segédprogram, mellyel egyszerű
en hozhatunk létre,tölthetünk ki, vagy módosíthatunk különféle formátumú táblákat. Ezen kívül SQL lekérdezéseket iskészíthetünk segítségével.
A BDE fontos szolgáltatása még az ún. alias-ok kezelése. Az alias-ok segítségével elnevezhetjükadatbázisunkat, hogy kés
ő
bb ezen a néven hivatkozzunk rá, annak fizikai helyétő
l függetlenül. Standardadatbázisoknál az alias gyakorlatilag egy egyszer
ű
mutató, ami egy adott könyvtárra mutat. SQL adatbázisoknál
viszont már egyéb információkat is tartalmaz (felhasználónév, jelszó, stb.).A BDE-nek rengeteg beállítási lehető
sége van, és általában az alapértelmezett beállítások nem felelnekmeg az igényeinknek. Telepítéskor ezért mindig célszer
ű
végignézni ezeket a beállításokat. Ezt a BDEAdministrator ( DBEADMIN.EXE ) programmal tehetjük meg. A beállítások közül megemlítünk néhány
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 10/32
9
fontosabbat. Ilyen pl. a Langdriver , amivel a nyelvet állíthatjuk be. Ilyet minden egyes driver beállításai közötttalálunk, mivel a driverekhez egyenként adhatjuk meg, milyen nyelvvel dolgozzanak. Ez a változóalapértelmezetten 'ascii' ANSI értékre van állítva. Ha magyar, ékezetes szövegeket is tárolunk azadatbázisunkban, célszer
ű
ezt HUN 852 DC értékre állítani. Mivel mi első
sorban a paradox rendszerekkelfoglalkozunk, ezért a Paradox driver beállításait nézzük meg. Itt a Langdriver változónak a Paradox HUN 852 DC értéket kell adni.
Ha hálózaton keresztül használunk paradox táblákat, két dologra kell odafigyelnünk. Az egyik a Net Dir . Ez a paradox hálózati kontroll fájl (PDOXUSRS.NET ) helyét határozza meg. Ez a fájl hangolja össze atáblákat hálózaton keresztül elér
ő
programokat. Fontos, hogy ha több számítógéprő
l használunk hálózatonkeresztül egy adatbázist, ezt a változót minden számítógépen be kell állítani úgy, hogy az ugyanoda mutasson.Célszer
ű
az adatbázist tároló számítógép egyik könyvtárát megadni. Csak akkor tudjuk egyszerre többszámítógépr
ő
l használni az adatbázisunkat, ha ezt a változót helyesen állítjuk be. A változónak mindigvalamelyik meghajtó, vagy megosztott könyvtár gyökerére kell mutatnia.
Másik fontos beállítás hálózati használat esetén a Local Share. Ezt a System/INIT beállítások közötttaláljuk. Ha egyszerre több programból szeretnénk elérni egy adatbázist, ezt igazra (TRUE ) kell állítani. Ha eztnem tesszük meg, az adatbázist a hálózaton keresztül elér
ő
programok nem tudják frissíteni az adatbázispillanatnyi változásait.
Alias létrehozása, szerkesztéseHa létrehozunk egy adatbázist, els
ő
dolgunk, hogy létrehozunk számára egy alias-t. Ezt többféleképpen
is megtehetjük: használhatjuk erre a BDE Administrator -t, a Database Desktop-ot, és az SQL Explorer -t is. Én azels
ő
t ajánlom, mert kezelése egyszerű
bb: az Object/New menüpontot kiválasztva meg kell adni az adatbázistípusát (mi Standard adatbázisokkal foglalkozunk), majd be kell írni az alias nevét, és ki kell tölteni a jobboldalon a Path mez
ő
t. Ezzel kész is az alias. Ha az SQL Explorer -t használjuk, az eljárás ugyanez. A Database Desktop esetében már másként kell eljárni: Tools/Alias Manager menüpont, az ablakon New gomb, megadjuk anevet és utat, majd a Keep New gombra kattintva elmentjük.
Ha ezek után ezzel az alias-szal szeretnénk dolgozni, egy valamit még érdemes megtenni: beállítani a Database Desktop munkakönyvtárának ezt az alias-t (File/Working Directory). Ez azért célszer
ű
, mert a Database Desktop mindig a munkakönyvtárát nyitja meg, ha a megnyitó vagy a ment
ő
ablakot használjuk.
Tábla létrehozása, szerkesztéseEzeket a m
ű
veleteket a Database Desktop-pal tudjuk elvégezni. Kattintsunk a File/New/Table…
menüpontra. Válasszuk ki a tábla típusát. Mivel ebben a munkában Paradox rendszerekkel foglalkozunk,válasszuk a Paradox 7 -et. A táblázat kitöltése nem bonyolult, viszont jobb oldalon találunk néhány opciót (alenyíló listából választhatjuk ki
ő
ket).A Validity Checks segítségével a kijelölt mez
ő
értékére vonatkozó beállításokat tehetjük meg. Ezekértelemszer
ű
en kitöltendő
k. Figyeljünk arra, hogy melyik mező
kre használjuk, illetve nem használjuk a Required Field opciót. Ha ez be van kapcsolva, a táblázatba nem lehet elmenteni rekordokat úgy, hogy ez a mez
ő
nincskitöltve. Ez akkor hasznos, ha a mez
ő
re mindenképp szükség van. Ha ugyanis elfelejtjük a programban kitölteni,azonnal hibaüzenetet kapunk. Az esetleges lefagyások miatti üresen való elmentést is megakadályozhatjuk enneksegítségével.
A Secondary Indexes segítségével manipulálhatjuk a másodlagos indexeket. Jó tudni, hogy akkorm
ű
ködik rendesen egy index, ha tulajdonságaiban be van jelölve a Maintained jelölő
négyzet. Ezt viszont csakakkor tudjuk bejelölni, ha van legalább egy els
ő
dleges indexünk (a mező
-táblázatban a Key oszlopban csillaglátható). A Maintained opció egyébként arra vonatkozik, hogy a BDE automatikusan frissítse-e a másodlagos
indexeket. Ha ez nincs bejelölve, manuálisan kell megoldanunk az újraindexelést.Ha valamilyen adatbázis-rendszert készítünk, elő
fordulhat, hogy ügyelnünk kell a biztonságra. Ezértajánlatos az adatbázis tábláit jelszóval védeni. Egy adatbázison belül célszer
ű
ugyanazt a jelszót használni. Ezt a jelszót nem szükséges a felhasználóknak tudni, mivel beépíthetjük a programunkba. Így csak azok a programoktudnak hozzáférni az adatbázishoz, amelyek ismerik ezt a jelszót. Az egyéb biztonsági intézkedéseket(felhasználók kezelése, azok eltér
ő
jogai, stb.) már a programunkon belül intézhetjük. A Paradox tábláklehet
ő
séget nyújtanak arra is, hogy több jelszót adjunk meg, és azokhoz különböző
jogokat rendeljünk ( AuxilaryPassword ). Ezt akkor érdemes csak használni, ha több program is hozzáférhet egy adatbázishoz, de mindegyikükmás-más jogosultságokkal. Ezt a problémát így a legegyszer
ű
bb lekezelni.Mint azt az imént említettem, fontos az is, hogy milyen nyelv
ű
a tábla. Ezt táblánként megadhatjuk(Table Language). A Database Desktop el
ő
ször mindig az alapértelmezett nyelvet állítja be a táblának (ezt a BDE Administrator -ban definiálhatjuk, lásd föntebb), de meg is változtathatjuk kedvünk szerint.
Ha már mindent beállítottunk, a Save As gombbal menthetjük a táblát.
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 11/32
10
SQL lekérdezés készítéseSQL lekérdezést a legegyszer
ű
bben a Database Desktop-pal készíthetünk (File/New/SQL file). Eztszerkeszthetjük, menthetjük, futtathatjuk. Ha egy Delphi programba szeretnénk SQL-t építeni, a lekérdezéstmindig célszer
ű
itt megírni és kipróbálni (az SQL-rő
l bő
vebben: Program files\Common files\Borland Shared\BDE\localsql.hlp).
Komponensek
A Delphi-ben az adatbázis-kezelést komponenseken keresztül valósíthatjuk meg. A komponenseketmozaikként egymáshoz illesztve alakítjuk ki a programunk szerkezetét. A komponensek biztosítják aprogramozó és a BDE közötti kapcsolatot. Alapvet
ő
mű
veleteket tartalmaznak, melyek felhasználásával könnyenvalósíthatjuk meg elképzeléseinket. Komponensek nélkül szinte elképzelhetetlen a munka, használatukkal nemkell tör
ő
dnünk a kezelt adatbázis típusával, formátumával, lényegesen emberközelibb programozást biztosítanak.
III. A Delphi adatbázis-kezelő komponensei
A Delphi adatbázis-kezelő
komponensei közül azokat a standard komponenseket vesszük sorra,amelyek a native táblák kezeléséhez szükségesek. Ezeket a standard komponenseket két részre osztva találjukmeg a Delphi eszköztárán: Data Access (adathozzáférés), és Data Controls (adatkontroll, adatvezérlés). Akomponensek leírásában nem a teljességre törekszem, hanem a lényegesebb dolgok kiemelésére. B
ő
vebbeketezekr
ő
l a Delphi Help-ben olvashatunk.
TDataSet, mindennek az alapja
A TDataSet osztály minden olyan komponens alap osztálya, amely sorokban és oszlopokban megjelenő
adatot reprezentál. Ez az osztály tartalmazza az alapvető
táblamanipulációs metódusokat, tulajdonságokat, stb.Munkánk során sokszor fogunk ezzel az osztállyal találkozni.
Data Access komponensek
Ide azok a komponensek tartoznak, amelyek segítségével megvalósítjuk az adathozzáférést, az adatbázisfájljaival való kapcsolatot, ezek a komponensek kapcsolják össze az adatokat az adatmegjelenít
ő
, manipulálóobjektumokkal.
TDataSourceEz a komponens teremt kapcsolatot az ún. DataSet komponensek és a vizuális adatmegjelenít
ő
(manipuláló) komponensek között. A DataSet komponensek azok a komponensek, amelyek valamilyenadathalmazt biztosítanak (TTable, TQurey). A komponens Dataset tulajdonságát kell a megfelel
ő
komponensre(Table-re vagy Query-re) állítani.
TTableA TTable segítségével beépíthetünk egy táblát a programba. A komponens a BDE-t használva
hozzáférést biztosít egy adatbázis-táblához. Ennek segítségével kezelhető
ek az adatok (navigáció, hozzáf ű
zés,módosítás, törlés, stb.).
Ha felhelyezünk egy ilyen komponenset a form-ra, az első
dolog, amit tennünk kell, a táblázatfájlnevének megadása. Ehhez el
ő
ször a DatabaseName-et kell megadnunk, amennyiben létrehoztunk azadatbázisunk részére alias-t. Ezt a TableName tulajdonság beállítása követi. A lenyíló listában megtalálhatjuk azadatbázisunk fájljait, vagy ha nem használunk alias-t, a program könyvtárában lév
ő
fájlokat.Az IndexName beállításával megadhatjuk az index nevét, de használhatjuk erre a célra az IndexDefs
vagy az IndexFieldNames tulajdonságokat is (bő
vebbekért ld. a súgót). Az indexeket természetesen futásidő
benis változtathatjuk, kivéve ha a CachedUpdates be van kapcsolva.
A CachedUpdates módot akkor használjuk, ha gyorsabb adathozzáférést szeretnénk megvalósítani,
illetve minimalizálni szeretnénk a hálózati forgalmat. Ha ez be van kapcsolva, a BDE a memóriában tárolja azadatokat, és azokat nem menti lemezre, egészen addig, amíg meg nem hívjuk az ApplyUpdates metódust. Tehátha ezt nem tesszük meg, a módosítások elvesznek. A CachedUpdates mód akkor is hasznos lehet, ha olyanalkalmazást készítünk, amiben fontos, hogy akár nagy mennyiség
ű
adatmódosítás is visszavonható legyen, ez a
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 12/32
11
legegyszerű
bb módja: ha vissza szeretnénk vonni a változásokat, csupán a CancelUpdates metódust kellmeghívnunk.
A tulajdonságok között találunk egy Active nevű
t. Ezzel már akár szerkesztő
módban is bekapcsolhatjuka táblát, de használhatjuk futásid
ő
ben az Open ill. a Close helyett is. Célszerű
azonban szerkesztő
módban nembekapcsolni, mert bizonyos esetekben megnehezítheti a munkánkat, hiszen ilyenkor lefoglalja az adatbázist, ígymás program (pl. Database Desktop) nem biztos, hogy hozzá tud férni.
A TTable eseményei között megtaláljuk a navigáció és az adathozzáférés összes eseményét, ezen kívülpedig hibakezelést is végezhetünk velük. Érdemes
ő
ket végignézni.Segítségükkel például egyszer
ű
en megoldhatjuk a törlésre való rákérdezést, illetve a törlésmegakadályozását bizonyos esetekben, stb.
A TTable metódusai (az egyszerű
bbek) már csekély angoltudással rendelkező
k számára is egyszerű
enmegjegyezhet
ő
k: törölni a Delete-tel, hozzáf ű
zni az Append -del kell, stb. (bő
vebbeket ld. Delphi Help: TTable).Fontos lehet, hogy a Table mez
ő
it magunk is megadhatjuk. Ha akarjuk, nem kerül bele minden mező
afizikai fájlból, de mi is adhatunk hozzá mez
ő
ket. Ezt a komponensre való dupla kattintással tehetjük meg alegegyszer
ű
bben. A megjelenő
ablak mű
veleteit a jobb gombbal való kattintással érhetjük el. Az Add all fieldsminden mez
ő
t behelyez, ami a fájlban található. Új mező
létrehozása esetén ( New field ) meg kell adnunk, hogyaz adatmez
ő
( Data field ), számolt mező
(Calculated field ), vagy Lookup (kereső
) mező
legyen. Számítottmez
ő
nél a tábla OnCalcFields eseményébe írhatjuk be a végzendő
számításokat (figyeljünk arra, hogy be legyenkapcsolva az AutoCalcFields, mely biztosítja, hogy a számolt mez
ő
ket automatikusan számoljuk). A Lookupmez
ő
arra szolgál, hogy más táblából ( DataSet ) keressünk ki egy rekord egy mező
jét ( Result field ), amelynek
valamely mező
je ( Lookup Keys) megegyezik a jelen tábla egy mező
jének aktuális értékével (Key field ). Ennekmegértéséhez itt egy egyszerű
példa:
Van két táblánk:Nevek (szemelykod, nev)Lakas (szkod, lakhely)A Table1-ben szeretnénk látni a neveket és a hozzá tartozó lakhelyet is.A Table1 forrása legyen a Nevek. A Table2 a Lakas táblát biztosítja.A hozzájuk tartozó DataSet-ek értelemszer
ű
en DataSet1, DataSet2.Adjuk hozzá a Table1 mez
ő
ihez mindet ( Add all fields). Majd hozzunk létre egy új mező
t. Válasszuk a Lookup field rádiógombot, majd töltsük ki a Lookup definition-t: Key Fields=szemelykod , DataSet=DataSet2, Lookup Keys=szkod , Result Field=lakhely.Az eredmény magáért beszél.
Ha a tábla mező
it hozzáadtuk a mező
listához, azokat kiválasztva szerkeszthetjükő
ket az Object Inspector segítségével. A rengeteg lehet
ő
ség közül egy hasznos dolgot emelnék ki, ez pedig a DisplayName,melyben azt a szöveget adhatjuk meg, amivel meg szeretnénk jeleníteni a rekordot. Ez azért hasznos, mertmez
ő
neveknek általában rövidítéseket használunk, de ezeket a felhasználónak nem kell tudnia. Ha ezt atulajdonságot beállítjuk, ezen túl az adatokat megjelenít
ő
komponensek ezt a nevet fogják kiírni.A táblában található adatokat a Filter tulajdonság segítségével sz
ű
rhetjük is (amennyiben a Filtered tulajdonság true). Ennek megvan a megfelel
ő
szintaktikája, amelyet a Help-ben a TBDEDataSet.Filter témaköralatt találjuk meg. Sz
ű
rés esetén a táblázatban csak a szű
rő
feltételnek eleget tevő
rekordok jelennek meg.
TQueryEz a komponens egy olyan DataSet -et épít be a programba, ami SQL kifejezésen alapul. Arra
használjuk, hogy SQL lekérdezéseket hajtsunk végre a segítségével. Azért hasznos ez a komponens, mert ezzelegyszerre több táblát is elérhetünk, illetve összekapcsolhatunk, valamint számításokat, rendezéseket,leválogatásokat is nagyon könnyen végezhetünk vele (az SQL nyelvb
ő
l adódóan).Itt is találunk a Table-höz hasonló tulajdonságokat és eseményeket. Ebb
ő
l is látszik, hogy csak abbankülönbözik a TTable-t
ő
l, hogy az adatforrása egy SQL lekérdezés. Természetesen a Query által visszaadottadatokat módosítani nem tudjuk, de magával a Query-vel végezhet
ő
k adatmódosító mű
veletek (Update, Delete,stb.), mivel ezeket az SQL nyelv lehet
ő
vé teszi. Ekkor a komponens nem ad vissza táblát. Az SQL lekérdezést akomponens SQL nev
ű
tulajdonságában adhatjuk meg. Ha lekérdezést írunk, és még nem érezzük magunkat eléggyakorlottnak, célszer
ű
a lekérdezést elő
ször a Database Desktop-pal elkészíteni, lefuttatni, és ha mű
ködik,utána átvinni a programunkba, így ugyanis egyszer
ű
bb a hibaellenő
rzés. Ha pedig valakinek nem tetszik a Delphi string-szerkeszt
ő
ablaka, a Code Editor gomb megnyomásával használhatja a normál kódszerkesztő
ablakot is. Ennek azért van elő
nye, mert itt az SQL parancsokat a Delphi felismeri, és kiemeli.A TTable-höz hasonlóan ennél a komponensnél is m
ű
ködik a filter .
Metódusai közül az ExecSQL nevű t említeném meg, mellyel lefuttathatjuk a lekérdezésünket.Természetesen a TTable-höz hasonlóan itt is m
ű
ködik az Open és a Close is.
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 13/32
12
TUpdateSQLHa már a Query-nél tartunk, érdemes megemlíteni a TUpdateSQL komponenset, amely kifejezetten
adatmódosításra szolgál. Itt külön törlő
( DeleteSQL), módosító ( ModifySQL) és hozzáf ű
ző
( InsertSQL) SQL-tadhatunk meg. Ezeket is az ExecSQL metódussal tudjuk futtatni, csak itt meg kell adnunk, hogy milyen módbanindítjuk el (törl
ő
, módosító, beszúró).
TBatchMoveEl
ő
fordulhat, hogy szükségünk van arra, hogy egy táblából bizonyos adatokat egy másik táblábamásoljunk. Erre kit
ű
nő
eszköz ez a komponens. Fontos, hogy forrásnak (Source) és célnak ( Destination) TTabletípust kell megadni, tehát az adott táblának léteznie kell a programban.
Minden ilyen esetben ajánlatos ezt a komponenset használni, mivel ezzel lehet a leggyorsabbanadatokat mozgatni. Még ha SQL-ben egyszer
ű
bbnek is tű
nik egy ilyen mű
velet (mondjuk egy Insert vagyUpdate), a gyakorlat azt mutatja, egy query lefuttatása nagyságrendekkel több id
ő
t vesz igénybe – ami kevésadatnál még nem érzékelhet
ő
, de minél több adat van, annál lassabb lehet egy ilyen lekérdezés. Ezzel akomponenssel ráadásul nem csak másolni, hanem törölni is lehet (a céltáblából törli azokat az adatokat, amelyekmegvannak a forrásban is).
Data Controls komponensek Ide az adatokat megjelenít
ő
, kontroláló vizuális komponensek tartoznak.
TDBGridEgyszer
ű
táblamegjelenítő
komponens. Egy TTable (vagy TQuery)objektum tartalmát jeleníti meg,standard formában (a táblázat oszlopai a mez
ő
k, sorai a rekordok). A tábla tartalmát szerkeszteni is tudjuk asegítségével (amennyiben a ReadOnly tulajdonsága false). A szerkesztés a standard táblázatkezel
ő
programokhoz hasonlóan történik (érdemes vele kísérletezni). Szerkesztésre való használatát azonban csakmódjával javaslom, mert amilyen kevés dolga van vele a programozónak, annál több bosszúságot okozhat ez akomponens. Ennek több oka is van. Egyrészt a felhasználók számára bizonyos esetekben bonyolultnak t
ű
nhet ezaz adatszerkesztési mód, másrészt a szerkesztést teljes egészében a komponens oldja meg, azaz nekünk nehezebb
dolgunk van, ha egyénileg szeretnénk megvalósítani ezeket. Használata ezért csak egyszerű
bb táblázatokszerkesztésére ajánlott. Kitű
nő
viszont arra, hogy összesített adatokat, lekérdezéseket (SQL), valamint listákat jelenítsünk meg vele. Ha szerkeszteni szeretnénk a tartalmát, célszer
ű
erre a célra külön ablakot (adatlapot)gyártani, ami megkönnyíti a szerkesztést (lásd: V. fejezet).
A komponens Options tulajdonságát kinyitva rengeteg beállítási lehető
séget találunk. Ezek közülnéhányat emelnék csak ki. A dgEditing tulajdonságot false-ra állítva kikapcsolhatjuk a szerkeszt
ő
módot, így azadatokat nem lehet módosítani. A dgRowSelect bekapcsolásával egyrészt automatikusan kikapcsoljuk aszerkesztést, másrészt engedélyezzük, hogy a táblázatnak mindig egy teljes sora legyen kijelölve. Ezzel azonbancsínján kell bánni, mert ha nem fér ki egyszerre a táblázat összes oszlopa, és tovább lapozunk a gördít
ő
sávon,hogy láthatóvá tegyük a többi oszlopot is, majd valamelyik sorra kattintunk, a táblázat automatikusan visszaállúgy, hogy az els
ő
oszlop lesz látható. Ez a jelenség csak a dgRowSelect bekapcsolt állapotánál jelentkezik, éssokszor kellemetlenségeket okoz. Figyeljünk arra is, hogy amennyiben a dbRowSelect be van kapcsolva, adbEditing-et nem tudjuk true-ra állítani. A dgIndicator a táblázat bal oldalán lév
ő
indikátor-oszlopot kapcsolja
be, illetve ki. Ez az indikátor sokszor hasznos, mert látjuk az aktuális rekordot, és annak állapotát (szerkesztett,beszúrt, stb.).Sokszor lehet arra szükség, hogy a táblázatból csak meghatározott mez
ő
ket jelenítsünk meg, illetvehogy csak meghatározottakat tudjunk szerkeszteni. Erre szolgál a DBGrid oszlopszerkeszt
ő
je (Column Editor ),amit a Columns tulajdonság gombjára kattintva érhetünk el (ezen kívül megnyithatjuk ezt az ablakot akomponensre való dupla kattintással, illetve a helyi menüjéb
ő
l is). Alapértelmezésben ez az ablak üres, tehát atáblázat minden mez
ő
t megjelenít, amit a hozzá tartozó Table tartalmaz. A helyi menübő
l (jobb gomb), illetve azablak eszköztárából is elérhet
ő
Add All Fields paranccsal azonban hozzáadhatjuk az összes mező
t, hogy aztánsaját kedvünk szerint szerkeszthessük azokat. Az ablak egy sorára kattintva az Object Inspector -banmegjelennek annak tulajdonságai, amelyek segítségével minden lényegi jellemz
ő
t beállíthatunk. Nagy táblázatokesetén például ajánlatos különböz
ő
színű
oszlopokat használni. Ha pedig valamelyik mező
re nincs szükségünk,egyszer
ű
en kitörölhetjük ebbő
l a listából.Van a komponensnek egy apró, ám néha elég zavaró hibája: a görget
ő
sávot nem hagyományos módon
kezeli. A csúszka mérete ugyanis mindig állandó, és nem követi a görgetést, mivel ha az első
elem az aktív, acsúszka legfelül van, ha az utolsó elemen állunk, akkor legalul, minden egyéb esetben pedig a sáv kellő
sközepén. S
ő
t, ha föl-le görgetünk, és az aljára illetve a tetejére lapozunk a táblázatban, a csúszka csak akkormozdul el a sáv aljára ill. tetejére, ha az els
ő
ill. utolsó elem az aktív, és észreveszi, hogy nem tud tovább
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 14/32
13
görgetni (EOF vagy BOF ). Ez a hiba jelentő
sen megnehezítheti a táblázatban való navigálást, mivel nem látjuk,hogy hol járunk benne.
TDBNavigatorEz egy egyszer
ű
komponens, mely csupán az alapvető
tábla-navigációs parancsok kiadására szolgál:lapozhatjuk vele adatainkat, szerkeszthetjük, elmenthetjük, törölhetjük (stb.)
ő
ket. A VisibleButtons tulajdonság
segítségével megadhatjuk, mely gombok legyenek láthatóak.
A következő
kben olyan komponensekrő
l lesz szó, amelyekhez hasonlók megtalálhatók a Standard komponensek között is. Ezért ezek használatát nem részletezem, csupán a standard változattól való eltérésekre ésaz adatbázis-kezel
ő
vonatkozásaira térek ki.
TDBTextA standard TLabel-höz hasonló statikus adatmegjelenít
ő
komponens, mely egy adatforrás egymez
ő
jének aktuális értékét jeleníti meg. Szerkesztésre nem használható. A DataSet és a DataField tulajdonságsegítségével adható meg a megjeleníteni kívánt mez
ő
forrása és neve.
TDBEditEnnek is megvan a standard párja, a TEdit , melyt
ő
l csupán annyiban tér el, hogy szövegét egy tábla egymez
ő
jének aktuális értékébő
l veszi, illetve szerkesztésénél ezt a mező
értéket módosítja. Hasonló a TDBText -hez.
TDBMemoMemo típusú mez
ő
k megjelenítésére szolgáló komponens. Használata ennek is triviális.
TDBImageSzintén egyszer
ű
komponens, amely a képeket tartalmazó mező
k megjelenítésére szolgál.
TDBListBoxEz egy olyan speciális ListBox, melynek elemei ( Items) egy adott tábla adott mez
ő
jének lehetségesértékeit tartalmazhatja. Az aktuális értéket – amennyiben az megtalálható a listában – automatikusan kijelöli. Azadott mez
ő
értékének szerkesztése úgy történik, hogy a listából (kattintással) kiválasztunk egy elemet, és az kerülbe új értékként a mez
ő
be. A lehetséges elemeket a TStrings típusú Items tulajdonságában adhatjuk meg.Akkor használjuk, ha egy mez
ő
nek csak adott értékei lehetnek, így a felhasználó semmiképpen nem tudmás értéket beállítani (pl. neme: férfi/n
ő
).
TDBComboBoxOlyan a TComboBox nev
ű
standard komponensbő
l készült lenyíló lista, mely az imént említettTDBListBox-hoz hasonlóan mű ködik, csak itt a lista a lenyitó gomb megnyomása után jelenik meg.
TDBCheckBoxLogikai (boolean) típusú adatmez
ő
k megjelenítésére és szerkesztésére szolgáló jelölő
négyzet.Használata ugyancsak triviális.
TDBRadioGroupA TDBListBox-al megegyez
ő
funkciókat lát el, rádiógombok használatával.
TDBLookupListBoxOlyan ListBox, amely lookup (keres
ő
, lásd: II. fejezet) mező
mű
ködtetésére szolgál. Egy tábla egymez
ő
jének értékét jeleníti, illetve szerkeszti. A lista elemeit a ListSource (TDataSet ) forrás ListField mező
jének
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 15/32
14
rekordjai alkotják. A KeyField tulajdonságba a ListSource azon mező
jét állítjuk be, amely alapján keresniakarunk a ListSource-ban. Természetesen a DataSource és a DataField a manipulálandó adat forrását és mez
ő
jétadja meg.
TDBLookupComboBoxA TDBLookupListBox-hoz hasonló, csak ennél lenyíló listából választhatunk értéket.
TDBRichEdit RichText szerkeszt
ő
, amely tartalmát memo típusú mező
ben tárolja. Olyan helyzetekben célszerű
használni, amikor szükség van a szövegek formázott tárolására (például ha olyan szövegeket tárolunk, melyeketesetleg nyomtatni is fogunk, és szükségünk van alapvet
ő
formázási lehető
ségekre), ugyanis ez a komponens (aszabvány RichText formátumot használva) formázással együtt kezeli a mez
ő
tartalmát (így hagyományosTDBMemo-val megjelenítve nem a kész szöveget, hanem annak forráskódját kapjuk).
TDBCtrlGridOlyan táblázat, amely egy adatforrás rekordjait jeleníti meg, szabad formájú elrendezésben. Ez azt
jelenti, hogy különböző
adatmanipuláló objektumokat helyezünk el a táblázat legfelső
sorába, amiket a programfutásakor a komponens megsokszoroz, és minden egyes sorban ugyanazzal a kiosztással megjeleníti a rekordokadatait. A táblázatra azonban csak bizonyos adatmanipuláló komponenseket helyezhetünk föl (például TDBEdit ,TDBListBox, stb.). a DataSource tulajdonságot a DBCtrlGrid -nek kell beállítani, a rajta lév
ő
objektumok DataSource nev
ű
tulajdonsága nem állítható.
TDBChartAdatbázison alapuló grafikon készítésére szánt komponens. Mivel használata, m
ű
ködése olyanszerteágazó, és sokrét
ű
, hogy talán egy külön munkát is megérne, nem foglalkozunk vele. Érdemes megtekintenidemóját, a Delphi könyvtárában a Demos\Teechart\teedemo.dpr fájlt megnyitva és futtatva.
Nyelvi problémák A Delphi adatbázis-kezelő
komponenseit használva hamar rábukkanunk az angol nyelvű
szövegekre,melyeket a komponensek m
ű
ködés közben jelenítenek meg. Például ha egy DBGrid -et vagy DBNavigator -thasználunk, és bekapcsolva hagyjuk a ConfirmDelete tulajdonságot, majd törölni próbálunk egy adatot, azonnalelénk ugrik a következ
ő
kérdés: „Delete Record?”. Ha tovább játszadozunk a komponensekkel, az esetlegeshibajelzéseket is angolul fogjuk megkapni. Ez egy magyaroknak szánt, magyar nyelv
ű
program esetében nemmutat jól, és – amennyiben a felhasználó nem tud angolul – különösen zavaró lehet.
„Mit tehetünk?” – hangzik a kérdés. A válasz egyszerű
, de nem kézenfekvő
: át kell írni az angolszövegeket magyarra. Hogy hol? A Delphi könyvtárában a Source\Vcl könyvtárban található egy dbconsts.pasnev
ű
fájl. Ebben csak a Db-komponensekkel kapcsolatos szövegek vannak definiálva, mint konstansok. Ezeketegyszer
ű
en át kell írni, és a nyelvi problémáink nagy része megoldódik, méghozzá örökre. (Célszerű
utána ezt azátszerkesztett fájlt biztonságos helyre is elmenteni.) Amennyiben még mindig van angol szöveg a programban, aDelphi 5-öt használóknak van még egy lehet
ő
sége: a Project\Languages menüpont, ahol némi ügyeskedés után
lefordíthatjuk a programban található összes string-et (b ő vebbeket ld. Delphi Help: languages: adding to a project ).
TDataModule
Ha már próbálkoztunk néhány bonyolultabb ablak összeállításával, láthatjuk, hogy a nem vizuálisadatkomponensek (mint például a TTable és társai) sok helyet foglalhatnak el a form-on. Ezt kiküszöbölend
ő
született a TDataModule komponens, mely egy olyan ablak, amelyen csak nem vizuális komponenseket lehetelhelyezni. El
ő
nye, hogy áttekinthető
bbé tudjuk tenni a programunkat, mivel ezen az ablakon bárhová tehetjük akomponenseket, és az ablak is bármekkora lehet, hiszen nem jelenik meg futás közben. Másik el
ő
nye, hogy haegy ablakra kiteszünk egy komponenset, annak lenyitjuk a DataSource tulajdonságát, a Delphi az aktuális form-on lév
ő
kön kívül felkínálja azokat az objektumokat is, amelyek a DataModule-on vannak.Delphi 5-öt használók még adat-diagrammot is készíthetnek a DataModule segítségével.
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 16/32
15
IV. Egy adatbázis-kezelő alkalmazás elkészítése
A továbbiakban arról lesz szó, milyen módszerekkel és feltételekkel készíthetünk adatbázis-kezelő
alkalmazásokat Delphi-ben.
Tervezés
A programok készítésének els ő és legfontosabb fázisa ez. Gondos tervezés nélkül nem szabad (ésigazán nem is lehet) elkezdeni egy fejlesztést. A program el
ő
ször mindig a fejlesztő
agyában születik meg, éscsak aztán kezd
ő
dik a kódolás. Félreértés azonban ne essék! A program gondos megtervezése nem azt jelenti,hogy sorról sorra megírjuk el
ő
re a kódot, hanem hogy átgondoljuk mű
ködési elvét, rendszerét. A gyakorlatimegvalósításon elég kódolás közben gondolkodni, mert ha jó a tervezés, nincs probléma vele. Csak akkorkezdjünk el programot tervezni, ha az adatbázis már gondosan megterveztük és elkészítettük. Annak ugyanisfüggetlennek kell lennie a programtól.
Fontos szempont programtervezésnél, hogy rendszere átlátható és könnyen bő
víthető
legyen. Mivel aDelphi objektumorientált fejleszt
ő
rendszer, nekünk is objektumorientáltan kell gondolkodnunk. Aprogramunknak jól kell illeszkednie az általa használt adatbázis felépítéséhez. Minden feladatot az elvárt módonkell megoldania. Fel kell készülni arra is, hogy az „éles” használat során hatalmas adatmennyiségekhalmozódhatnak föl, így mindenre meg kell keresnünk a legoptimálisabb megoldást. Gyakori hiba, ha a fejleszt
ő
nem gondol arra, hogy jóval több adat kerül majd az adatbázisba, mint amennyivel tesztelte. Az nem elég, ha a
tesztek során a program szép eredményeket produkál. Mindig el kell gondolkozni azon, nem lehet-e még jobban,még egyszer
ű
bben, még gyorsabban megoldani a feladatokat.Az ablakokat is érdemes el
ő
re megtervezni, így áttekinthető
bb lesz a programterv, és késő
bb isgyorsabban halad a munka. És persze a megrendel
ő
nek meg lehet mutatni ezeket a terveket, ami nem egy utolsószempont.
Ez a fejezet nem programot tervezni tanít, inkább segítő
kezet nyújt a tervezéshez és a kódoláshoz.
A DataModule
Ha túl vagyunk a tervezésen és az adatbázis létrehozásán, az új Project megnyitása után első
dolgunkegy új Data Module megnyitása (File/New/Data Module). Ebbe kerülnek bele aztán a táblák (TTable), és azSQL-ek (TQuery). Mindegyiknek be kell állítani a DatabaseName tulajdonságát, illetve a forrását (TableNameés SQL). Ha ezeket meg is szeretnénk jeleníteni, csatlakoztatnunk kell hozzájuk egy-egy DataSource-t (ki kell
helyezni ő ket, majd a DataSet tulajdonságukat a megfelelő értékre állítani).Ezek után be kell állítanunk a lookup kapcsolatokat.El kell döntenünk, hogy egy-egy táblát vagy Query-t mikor szeretnénk használni. Ha a program futása
során állandóan (vagy elég gyakran) szükségünk van rá, célszerű
ezt a program futásának kezdetén megnyitni(nem ajánlatos már szerkeszt
ő
módban megtenni ezt, az Active tulajdonság true-ra állításával, mert ez akés
ő
bbiekben problémákat okozhat). Ehhez érdemes a táblákat tartalmazó DataModule OnCreate eseményébehelyezni a megnyitási blokkot. A megnyitást mindig ajánlatos Try-blokkba tenni (ld. Delphi Help: Try...except statements; VI. fejezet). Így ha nem sikerül megnyitni valamelyik táblát, az esetleges hibákat az Except részbenle tudjuk kezelni. A legegyszer
ű
bb ilyen megnyitási blokk így néz ki:
Try
Table1.Open;
Table2.Open;
Query1.Open;//stb…
Except
ShowMessage(’Hiba! A táblák megnyitása meghiúsult.’);
Halt;
End ;
Használhatunk persze olyan táblákat és lekérdezéseket is, amelyeket csak néha, vagy egy adott modulmegnyitásakor kell megnyitnunk. Ekkor értelemszer
ű
en járjunk el, és a megfelelő
helyre helyezzük az Open-eket, hogy elkerüljük a fölösleges er
ő
forrás-pazarlást.Ha a táblákhoz jelszó is tartozik, a jelszavakat a Session.AddPassword metódus segítségével tárolhatjuk
el. Így a programunk tudni fogja a jelszót (vagy jelszavakat), és nem fog külön rákérdezni. Az AddPassword metódust mindig a megnyitás el
ő
tt kell meghívnunk.Ha még csak most kapizsgáljuk a Delphi adatbázis-kezelését, még nincs rá szükségünk, de kés
ő
bbfelmerül a kérdés: „Mi lesz, ha törl ő dik az alias, vagy olyan gépen indítjuk el a programunkat, ahol van BDE,elérhet
ő
az adatbázis is, de még nincs hozzá alias?” Ebben az esetben vagy kézzel hozzuk létre, vagy (és ez aszebb megoldás, hiszen ehhez a felhasználónak nem kell ismernie BDE Administrator -t) a programunkkal
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 17/32
16
végeztetjük el ezt a munkát. A megoldás alapesetben egyszerű
, le kell kérdezni, hogy létezik-e az adott alias, ésha nem, létre kell hozni. Ez addig jó, amíg a programunk indítási könyvtárához képest fix helyen található azadatbázis könyvtára (mondjuk a program könyvtárában van egy Database könyvtár). Használhatjuk azonban azadatbázist hálózaton keresztül is. Ekkor nem tudhatjuk, hol lapul az adatbázisunk. Ekkor bizony a vétlenfelhasználóval kell megkerestetnünk azt.
Ilyen problémák megoldására a következő
módszert ajánlom. Ha a programot és az adatbázist egyazonszámítógépre telepítjük, az adatbázis mindig legyen a program könyvtárában, például egy Database nev
ű
alkönyvtárban. Így ha nem létezik az alias, egyszerű
en létrehozzuk, és beállítjuk neki könyvtárként ezt akönyvtárat. Arra is fel kell azonban készülni, hogy az adatbázist egy másik számítógépen szeretnénk tárolni.Ilyenkor a programnak célszer
ű
megnéznie, létezik-e ez a bizonyos Database könyvtár. Ha nincs, akkorbizonyára valahol máshol kell lennie. Ekkor a legjobb, ha közöljük a felhasználóval, hogy nem tudjuk, hol azadatbázisa, és legyen szíves, mutassa meg nekünk. Ezt egy egyszer
ű
fájlmegnyitó ablakkal is megtehetjük. Ha ezmegvan, már létrehozhatjuk az alias-t. A figyelmes programozó az ekkor megadott könyvtár nevét eltárolhatjaegy fájlban, így ha legközelebb „elt
ű
nik” az alias, csak onnan kell kiolvasni annak helyét, nem kell afelhasználót nyaggatni ezzel.
Egyébként aggodalomra semmi ok, az alias-ok nem szoktak „csak úgy eltű
nni”. Ez a problémaáltalában a program els
ő
indításakor jelentkezik. Persze a program telepítő
jével (ld.: VI. fejezet) is létrehozhatjukaz alias-t, de tapasztalatom azt mutatja, hogy az ékezetes könyvtárnevekkel (ha az adatbázis elérési útjában vanékezet) vigyázni kell.
A probléma programon belüli megoldására itt egy egyszerű
példa (a DataModule OnCreate
eseményében):var ActDir:string; {az aktuális könyvtárat fogjuk ebben tárolni}
DBDir:string; {az adatbázis könyvtárát tároljuk ebben}
{…}
if not Session.IsAlias('En_Aliasom') then
begin
GetDir(0,ActDir); {Lekérjük az aktuális könyvtár nevét}
if DirectoryExists(ActDir+'\Database')
then DBDir:=ActDir+'\Database'
else
begin
Showmessage('_Hibaüzenet_');
Form1.OpenDialog1.Directory:=ActDir; {Az OpenDialog valamely
létező form-on kell, hogy legyen!}if not Form1.OpenDialog1.Execute then Halt {ha a felhasználó
mégsem-mel lépett ki, megszakítjuk a program futását}
DbDir:=Form1.OpenDialog1.Directory;
end ;
try
{Létrehozzuk az alias-t:}
Session.AddStandardAlias('EN_Aliasom', DbDir, 'PARADOX');
{Mentjük a BDE beállításait:}
Session.SaveConfigFile;
finally
Showmessage('Az adatbázis inicializálása befejező dött.');
end ;
ChDir(ActDir); {visszaállítjuk az aktuális könyvtárat}end ;
{…}
//Itt jöhet a táblák megnyitása...
Ha ezzel is kész vagyunk, a táblák egyes eseményeihez hozzá kell rendelnünk a saját eljárásainkat. Megkell adnunk, mi történjen, ha a felhasználó ki akar törölni egy adatot, vagy újat akar beszúrni, stb., azaz ki kelldolgozni a táblák eseményeit. F
ő
ként érinti ez a számított mező
ket, hiszen azok számítási algoritmusát a táblákOnCalcFields eseményében kell kifejteni. Hogy ezen felül mire van még szükség, azt a program milyensége és aprogramozó ízlése határozza meg.
Az ablakok
Az alkalmazások fejlesztése során nagy hangsúlyt kell fektetnünk az ablakok kialakítására, hiszen aprogramot a felhasználónak készítjük, és a felhasználók számára fontos a jó megjelenés és a könnyű
kezelhető
ség. Első
dleges szempont mindig a funkció. Mindennek a helyén kell lennie, és megfelelő
en, logikusankell m
ű
ködnie. Emellett azonban figyelnünk kell arra is, hogy fölösleges, zavaró dolgok ne kerüljenek a
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 18/32
17
képernyő
re. Csak azt jelenítsük meg, ami információ-tartalommal bír. A redundanciát lehető
leg kerüljük.Ablakunkat továbbá minél átláthatóbbá kell tennünk. A felhasználók azt szeretik, ha egy általuk is követhet
ő
,egyszer
ű
logika alapján épülnek fel a kezelő
felületek. Ez sokszor okoz fejtörést a fejlesztő
nek, mivelő
a belső
mű
ködése felő
l szemléli a programját. Akkor jó egy program, ha a felhasználónak nem szükséges tisztábanlennie a bels
ő
mű
ködéssel.Ha az ablak funkcionálisan megfelel
ő
felépítésű
, még nem biztos, hogy könnyen kezelhető
. Ehhezel
ő
ször is mindent jól láthatóvá és használható méretű
vé kell tennünk. Ez alatt első
sorban a betű
típust és méretet,valamint a gombok és egyéb objektumok nagyságát értem. A Windows által használt alapértelmezettbet
ű
típusnál ( MS Sans Serif 8 ) a 10-es méretű
Arial olvashatóbb, ezért célszerű
a form-unk létrehozása utánrögtön erre beállítani a form Font tulajdonságát. Ez a beállított érték lesz érvényes a form-ra kerül
ő
objektumokra is. Ha van a képernyő
n hely, a gombokat érdemes az alapértelmezetthez képest egy kissémegnagyítani.
Programunkat átláthatóbbá tehetjük továbbá azzal, ha a szabványos gombok (TButton) helyett TBitBtn-thasználunk, amelyre kis képeket lehet helyezni (Glyph), ezzel megkönnyítve a felismerésüket. Elegend
ő
képecskét találunk a Delphi képtárában, amelyet telepítéstő
l és verziótól függő
en a Delphi könyvtárán belül az Images\Buttons, vagy a Program files\Common Files\Borland Shared\Images\Buttons könyvárban keressük.
Találkozhatunk olyan esettel is, amikor a programot a megrendelő
érintő
képernyő
s monitoron szeretnéhasználni. Ekkor már tervezéskor figyelnünk kell az ablakokon található kezel
ő
k méretére, mert egy mármeglév
ő
ablakot átszabni úgy, hogy minden megfelelő
méretű
legyen, sokszor nagy vesző
dségekkel jár. Ha nemfér el minden szükséges funkció egy ablakban, akkor célszer
ű
azokat egymás után megjelenő
párbeszédablakokba helyezni. Ekkor figyeljünk arra, hogy logikusan, lépésrő
l lépésre haladjunk. Itt említemmeg, hogy azok az objektumok, amelyek rendelkezhetnek gördítő
sávval, a Windows gördítő
sáv-beállításaithasználják. Ez gyakran kicsinek bizonyul. Ebben az esetben célszer
ű
a felhasználót felszólítani, hogy amegfelel
ő
helyen tegye meg a szükséges beállításokat a Windows-ban. Ha erre felkészülünk, a programunkatcélszer
ű
nagy gördítő
sáv-mérettel is kipróbálnunk, hogy ne késő
bb érjen meglepetés.Létezik még egy er
ő
s buktató az ablakok tervezésében és kivitelezésében. Ez pedig a felbontás kérdése.Nem mindegy ugyanis, hogy milyen felbontásban tervezzük meg az ablakot, és hogy azt milyen felbontásbanfogják használni. Gyakori hiba, hogy valaki egy 1024x768 méret
ű
képernyő
n tervezi meg az ablakjait, de azt egy800x600-as képerny
ő
n fogják futtatni, és azon bizonyos dolgok kilógnak a képbő
l. De az ellenkező
je isel
ő
fordulhat, amikor egy kisebb felbontásra tervezett programot nagyobb felbontásban futtatunk, és hatalmasüres helyek jelennek meg az ablakok jobb szélén és alján. A problémára több megoldás is van. El
ő
ször iscélszer
ű
skálázható ablakokat készítenünk. Ekkor azt kell meghatározni, hogy melyik komponens melyikirányba legyen mozdítható. Erre rendelkezésünkre áll a komponensek Anchors tulajdonsága. Ennek négy logikai
típusú eleme van ( Left, Top, Right, Bottom), amelyekkel meghatározhatjuk, hogy a komponens az ablak melyikszéléhez legyen rögzített távolságra (célszerű
kísérletezni vele). Jól skálázhatóvá tehetjük alkalmazásunkat, hamegfelel
ő
en használjuk a komponensek Align tulajdonságát (ez nem minden komponensnek van, és nemösszekeverend
ő
az Alignment -tel). Ha pl. alClient -re állítjuk, a komponens kitölti a teljes területét az ablaknakvagy annak a panelnek, amelyre helyeztük. Érdemes egyébként TPanel-eket használni, objektumok egycsoportjának megjelenítésére, mert a segítségükkel csoportosíthatjuk a komponenseket, és a TPanel-nek is van Align tulajdonsága. Az Align tulajdonságot alLeft -re, alTop-ra, alBottom-ra vagy alRight -ra állítvaértelemszer
ű
en a megfelelő
oldalra zárva jelenik meg a komponens.Csúnya, de sokszor elkerülhetetlen megoldás, ha az ablak (form) automatikus görgetését ( AutoScroll)
használjuk ki. Bizonyos speciális szoftvereknél azonban nem érdemes ilyenekkel vesző
dni, hanem egyszerű
enmeg kell határozni egy felbontást, amelyben a program m
ű
ködik. Ha pedig a program elindításakor nemmegfelel
ő
a felbontás, figyelmeztetni kell errő
l a felhasználót (a kép méretét a Screen.Height, ill. a Screen.Widthtulajdonságok segítségével kérdezhetjük le a legegyszer
ű
bben).
AblaktípusokAlkalmazásunk tervezésénél figyelembe kell vennünk, hogy hogyan fogják használni. Két elrendezési
típus közül választhatunk. Az egyik a hagyományos (SDI) ablakok, amikor egy újonnan megnyíló ablak a többifölé rajzolódik, és esetleg váltogathatunk a megnyíló ablakok között. Ha ezt a megoldást használjuk, oda kellfigyelnünk arra, hogy a párbeszédablakok mögötti ablak ne legyen elérhet
ő
(az Enabled tulajdonsága legyen false, vagy nem a Show, hanem a ShowModal metódussal jelenítjük meg a párbeszédablakot).
Használhatjuk azonban az ún. MDI ablakokat is. Ezek elő
nye, hogy a gyermekablakok a szülő
ablakonbelül nyílnak meg (ezt a megoldást használják pl. a szövegszerkeszt
ő
k is). Ehhez állítsuk a f ő
ablak FormStyletulajdonságát fsMDIForm-ra, a gyermekablakokét pedig fsMDIChild -ra. MDI ablakokat használva a Windowsrengeteg lehet
ő
séget nyújt, így egyszerű
en készíthetünk ilyen alkalmazásokat (ld.: Delphi Help: MDI applications).
Szintén érdemes megfontolni, hogy az általunk készített program az egyedüli alkalmazás-e, amithasználni fognak a számítógépen. Ha igen, akkor hasznos lehet, ha a programot teljes képerny ő n futtatjuk,eltakarva ezzel a Windows tálcáját is (ehhez a WindowsState-et wsMaximized -re, a BorderStyle-t pedig bsNone-ra kell állítani). Így a felhasználó nem tud véletlenül rossz helyre kattintani, elindítva ezzel valamilyen nem
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 19/32
18
kívánatos alkalmazást. Ha viszont más szoftvereket is használnak egy idő
ben az általunk készítettel,mindenképpen adjunk arra lehet
ő
séget, hogy a programot minimalizálni lehessen, és futásakor el lehessen érni aStart menüt és a tálcát.
A főképernyőA szoftverek egyik legfontosabb eleme (vizuális szempontból), a programmodulok közötti összeköt
ő
kapocs, a f ő
képernyő
. Nem szabad tehát elhanyagolnunk ezt sem, a modulokhoz hasonlóan, körültekintő
en kell
bánnunk vele. A f ő képernyő milyensége első sorban attól függ, hogy alkalmazásunk hagyományos SDI, vagyMDI ablakokat használ.
Hagyományos ablakok esetén a hagyományos f ő
képernyő
-struktúra használata ajánlott. Ez azt jelenti,hogy a program különböz
ő
funkcióit a f ő
képernyő
n elhelyezett nyomógombokhoz rendeljük (ha túl sok ilyenfunkció van, használhatjuk azt a megoldást, amikor egy gombot lenyomva egy legördül
ő
menü [Popup Menu] jelenik meg). A gombok elhelyezkedése esztétikailag és logikailag is fontos, de lényegében a fejleszt
ő
ízlésehatározza meg milyenségét.
Ha MDI ablakokat használunk, a program funkcióit az ablak tetején, menüsorban, illetve eszköztár-sorban érdemes elhelyezni. Mindkett
ő
höz teljes támogatást nyújt a Windows. Megadhatunk pl. egy menüpontot(WindowMenu), amelybe a Windows automatikusan beírja a nyitva lév
ő
gyermekablakok listáját, és segítségévelkönnyedén át is válthatunk egy másikra.
Igényes fejlesztő
k szépíthetik az alkalmazásukat úgy is, hogy a f ő
képernyő
hátterébe valamilyen képethelyeznek el (ilyenkor a TImage nyújtja a segít
ő
kezet). Internetrő
l letölthető
komponensekkel a gombok teljes
átalakítását („textúrázását”) is meg lehet oldani. Minden csak ötletek kérdése. A felhasználók pedig szívesebbendolgoznak szép programokkal.
A többi ablak szépítését azonban nem kell túlzásba vinni, mert ez sokszor a használhatóság káráraválhat.
Egy hagyományos f ő
képernyő
, textúrázott gombokkal és háttérrel…
…és egy egyszer ű
bb elrendezésű
, lenyíló menüvel
Táblamegjelenítő ablakokMegszokott dolog, hogy ha adatbázisról beszélünk, rögtön összekapcsolt táblázatok sokaságáragondolunk. Adatbázis-kezel
ő
programok sokasága jeleníti meg táblázatban adatait. Ez azonban nem jelenti azt,hogy ez minden esetben jó. Csak akkor szükséges ilyen ablakokat alkalmazni, ha szükség van a rögzített adatok
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 20/32
19
sokaságának áttekintésére, összehasonlítására. (Tehát egy jegykiadó-nyomtató programban fölösleges az eddigfölvett jegyek listájának megjelenítése, hiszen visszamen
ő
leg csak bizonyos kimutatásokat, lekérdezéseketvégzünk, de a konkrét adathalmazra nincs szükségünk.)
Ezek után, ha úgy gondoljuk, hogy mégis szükségünk van táblázatra, azt inkább csakadatmegjelenítésre, és nem szerkesztésre ajánlatos használni. A táblázattal történ
ő
adatmegjelenítésnek van egynagy el
ő
nye: ha ügyesen csináljuk, a felhasználó egyszerű
en és gyorsan navigálhat, kereshet, rendezhet, szű
rhetbenne.
Egy általános táblázat-ablaknak a következő
részei lehetnek: (1) maga a táblázat, (2) a navigációs panel,(3) m
ű
veletvégző
panel, (4) szű
rő
panel, (5) információs sáv (státuszsor). Ezek közül természetesen nemkötelez
ő
mindnek szerepelni, és egyéb dolgot is megjeleníthetünk, igény szerint.A táblázatot (1) természetesen DBGrid -del valósítjuk meg (err
ő
l a komponensrő
l már szót ejtettünk aIV. fejezetben). Az els
ő
, amit meg kell tennünk vele, hogy testre szabjuk a megjelenítését az Options és aColumns tulajdonságok segítségével. Beállítjuk a megjelenítend
ő
mező
ket, esetleg azok színét, méretét, stb. ezekután gondolnunk kell az eseményeire. Gyorsbillenty
ű
ket definiálhatunk az OnKeyPress és az OnKeyDownesemény segítségével, és itt tudjuk megoldani a rendezés kérdését is. A leggyakoribb megoldás ugyanis egytáblázatban a rendezés beállítására, hogy amelyik oszlop fejlécére kattint a felhasználó, a szerint az oszlopszerint rendezzük az adatokat. Ehhez azonban tudni kell, hogy rendezni csak akkor tudunk, ha azt az adatokatbiztosító Table lehet
ő
vé teszi, azaz a definíciójában szerepel az adott mező
szerinti index (Query használataesetén a rendezési sorrendet csak a lekérdezés módosításával és újrafuttatással változtathatjuk meg).Amennyiben erre lehet
ő
ségünk van, a megoldás egyszerű
: a DBGrid OnTitleClick eseményében figyeljük, hogy
melyik oszlopra történt a kattintás, és az annak megfelelő
értékre állítjuk a tábla indexét. Érdemes még ilyenkora fejléc betű
típusát megváltoztatni (pl. félkövérre, vagy aláhúzottra), hogy könnyen látható legyen az aktuálisrendezés. Arra figyeljünk, hogy a lookup mez
ő
k szerint nem lehet rendezni. Így csak a kapcsolatot megvalósítókulcs szerint rendezhetünk (ami általában szám), és egyáltalán nem garantált, hogy ez meg fog felelni azízlésünknek. Megoldás lehet az, hogy SQL lekérdezéseket használunk, illetve ezeket vegyítjük a táblákkal.(Találkoztam már olyan megoldással, hogy a két legfontosabb lookup-mez
ő
höz tartozott egy-egy Query, és haazon mez
ő
k fejlécére kattintott a felhasználó, a tábla helyett a Query-t kapcsolta be a program a táblázatadatforrásául, a Query-t pedig minden adatmódosításnál újrafuttatta. Ez kissé lassúnak t
ű
nhet, de mindenképpencélravezet
ő
.).A navigációs panel (2) a másik dolog, amire szinte mindig szükség van. Szerepe akkor nagy, ha már
nagyon sok adatunk van a táblázatban, és gyorsan el szeretnénk jutni egy adott rekordhoz. Ami biztosan kell, aza táblázat els
ő
és utolsó rekordjára mozgató gomb (segítségünkre van a TDBNavigator ). A másik egy, akulcsmez
ő
khöz rendelt ugró-sáv. Ezt egy egyszerű
TEdit -tel és egy gombbal tudjuk megvalósítani. Ha a gombra
kattint a felhasználó, az adatbázisban megkeressük a begépelt szöveghez legközelebb eső
adatot(Table.FindNearest ). Fontos, hogy ezt csak kulcsmező
kkel tudjuk elvégezni. Nehezebb a dolgunk, ha egylookup-mez
ő
értékeit is bevesszük. Ekkor abban a táblában kell keresni, amelyikbő
l a lookup szedi a rekordokat,és a talált rekord kulcsértékét kell megkeresni a táblázatunkban.
Külön panelen illik elhelyezni azokat a gombokat, amelyekkel mű
veleteket végezhetünk (3). A háromalapvet
ő
mű
veletnek mindenképpen ott kell lennie (beszúrás, módosítás, törlés), de ide kerülhetnek a nyomtatás,sz
ű
rés és egyéb lekérdezések gombjai. Ha lehet, használjunk BitButton-okat (TBitBtn), és helyezzünk ki rájukkülönböz
ő
kis képeket. Bizonyos esetekben használhatunk szerkesztő
objektumokat is ( DBEdit, DBComboBox,stb.), ment
ő
és elvet ő
gombokkal kísérve.A sz
ű
rő
panelnek (4) nem muszáj mindig látszania, inkább egy gombbal ki-be kapcsolgathatjuk. Asz
ű
rő
t úgy kell elkészítenünk, hogy a lehető
legtöbb adatra tudjunk vele szű
rni. Itt is fontosnak tartommegemlíteni, hogy lookup típusú mez
ő
kre nem lehet szű
rni, ezt máshogy kell megoldanunk, például úgy, hogy alookup mez
ő
forrástáblájából minden adatot kilistázunk egy ComboBox-ba, és egy adott elem kiválasztásánál
rákeresünk arra a kapcsolt táblában, majd a talált mező
kulcsértéke szerint szű
rjük a táblázatunkat. AComboBox-ot normál szű
rő
knél is használhatjuk, de azt minden adatmódosítás esetén újra fel kell tölteni. AComboBox-ba elhelyezhetünk egy (mind) elemet is, melyet kiválasztva az adott mez
ő
re való szű
réstkikapcsoljuk. A mind -et azért kell zárójelbe tenni, mert a zárójelet rendezésnél a Windows el
ő
re helyezi, ígybiztosak lehetünk abban, hogy ez a felirat az els
ő
elemek között lesz (a rendezéshez be kell kapcsolni aComboBox-on az AutoSort -ot). Sz
ű
réshez ízlés szerint természetesen használhatunk Edit -et is, de vigyázzunk: haaz Edit OnChange eseményére (ez az esemény akkor hívódik meg, amikor változtatjuk az Edit tartalmát)változtatjuk a sz
ű
rő
feltételt, erő
sen lelassíthatjuk alkalmazásunkat azzal, hogy minden billentyű
leütésre hosszasm
ű
veleteket végzünk. Használjunk inkább frissítő
-gombot.A mai alkalmazásokban teljesen általánosnak mondható a státuszsorok (5) használata. Mi se
ódzkodjunk ilyeneket használni, ha másra nem, hát arra, hogy az egérmutató alatt lévő
objektumról adunk bennerövid leírást. Ezt úgy tehetjük meg, hogy az objektumok Hint („buborék-súgó”) tulajdonságába egy | jel után egyhosszabb leírást írunk, az Application.OnHint eljárásba pedig megadjuk, hogy
StatusBar.SimpleText:=Application.Hint. (Delphi 5-öt használók ezt az TApplicationEvents komponenssegítségével tehetik meg, a régebbi verziókban ezt kézzel kell hozzárendelni az eseményhez úgy, hogy készítünkegy saját eljárást, és egyenl
ő
vé tesszük az Application.OnHint értékével. Ld: Delphi Help: Hint, OnHint,
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 21/32
20
GetLongHint example.) Természetesen a státuszsorba kiírhatjuk az aktuális rekord állapotát, vagy bármi mást,amit a felhasználóval közölni akarunk (a TStatusBar használatáról ld. a Delphi Help: TStatusBar ).
A gyorsabb használhatóság érdekében nagy hangsúlyt kell fektetnünk a billentyű
kombinációkalkalmazására. Ide nem csak a gombokon lév
ő
aláhúzott karaktereket vehetjük be, hanem használhatjuk afunkcióbillenty
ű
ket is. Ebben az esetben az OnKeyDown eseményt használhatjuk.
Egy táblamegjelenít ő
ablak, szű
r ő
kkel
AdatlapokEgy rekord szerkesztésére legjobb eszköz az adatlap. Itt minden szükséges információ egy helyen van,
de mindig csak az aktuális rekordról kapunk információkat. Adatlapot a legegyszerű
bben úgy készíthetünk, hamegnyitjuk a megfelel
ő
tábla FieldsEditor ablakát, kijelöljük a szükséges mező
ket, majd egérrel ráhúzzuk az újablakra. A hatás: megjelennek a megfelel
ő
típusú, méretű
, megfelelő
en beállított szerkesztő
komponensek, amegfelel
ő
címkékkel ellátva. Ha ezek mellé kiteszünk egy DBNavigator -t, kész is az adatlapunk. Azigényesebbek persze saját gombokat is használhatnak. Néha célszer
ű
azt a cselt bevetni, hogy az adatlapmegjelenésekor nem szerkeszthet
ő
(hiába próbál a felhasználó valamit is módosítani), csak a szerkesztő
gombmegnyomása után. Ehhez az adatlaphoz tartozó DataSet AutoEdit tulajdonságát kell false-ra állítanunk.
Ennél nagyobb gondosságra is szükség van azonban, ha egy, a program törzsét képező
táblázat
adatlapját készítjük. Nem mindegy ugyanis a mez ő k sorrendje, elhelyezkedése. Ha például az adatlapnak léteziknyomtatott megfelel
ő
je is (amit ezen adatlap alapján töltenek ki, vagy fordítva), a számítógépen lévő
adatlap jó,ha a papíron lév
ő
nek a pontos mása. De ha nem is áll fenn ilyen helyzet, ismét gondoljunk arra, hogy ezt aprogramot a felhasználóknak írjuk, így az
ő
kényelmük a legfontosabb. Oda kell figyelni arra, hogy akomponensek sorrendje (Tab Order ) megfelel
ő
legyen, azaz a TAB billentyű
t nyomogatva milyen sorrendbenlépkedhetünk az adatlapon (ennek beállítása: a form vagy label kijelölése után Edit/Tab Order menüpont).Érdemes továbbá a mez
ő
khöz gyorsbillentyű
ket rendelni, hogy minél könnyebb legyen egy adott mező
hözugrani. Ehhez a címkék szerepét betölt
ő
label-ek feliratában (Caption) az & jellel meg kell jelölni a megfelelő
betű
ket (Az & jel utáni karaktert a Windows automatikusan aláhúzza), majd a FocusControl nevű
tulajdonságukban be kell állítani a hozzárendelt mező
t. Ha ezt megtettük, a felhasználó az aláhúzott betű
ALT billenty
ű
vel együtt történő
lenyomásával a FocusControl-ban megadott mező
be tud ugrani, és azt szerkeszteni.A lookup mez
ő
kre általában DBLookupComboBox-okat szokás használni az adatlapokon. Ennek az ahátránya, hogy csak a listában szerepl
ő
elemek közül választhatunk. Ez persze egyértelmű
en következik a lookup
mező mű ködéséb ő l – mondhatnánk. De a felhasználó nem tudja, mi az a lookup. Ez nem is róható föl ellene.Inkább a fejleszt
ő
nek kell megoldania, hogy ha nem szerepel egy elem a listában (törzsadattáblában), amire éppszükség lenne, akkor valamilyen módon fel lehessen venni úgy, hogy ne kelljen az adatlapot elhagyni. Alegegyszer
ű
bb, ha a lookupcombobox mellé helyezünk egy nyomógombot, amellyel elérhető
az adotttörzsadattábla ablaka, ahol módosíthatjuk a tartalmát. Másik megoldás, ha egy új elemet létrehozó gombothelyezünk ki, amely egy üres adatlapot jelenít meg. Ezt kitöltve a program fölveszi az elemet a törzsadattáblába,majd azt beírja a lookup mez
ő
be.Az adatlapok készítésekor gondolnunk kell arra, hogy minél automatikusabban m
ű
ködjenek. Egyrésztlétezhetnek alapértékei az egyes mez
ő
knek (pl. dátum esetén az aktuális dátum), másrészt elő
fordulhat, hogy egymez
ő
értékébő
l lehet következtetni egy másik mező
értékére is. Jó példa erre, hogy ha egy megrendelő
adatlapona partner kiválasztása után, ha annak van bankszámlaszáma, a fizetésmódnál a banki átutalást, ha pedig nincs,akkor a készpénzfizetést jelöli ki a program. Az ehhez hasonló módszerek hosszútávon jól beváltják a hozzájukf
ű
zött reményeket.
Egy igen hasznos és egyben látványos megoldás a „színváltós” mez ő objektumok használata. Ez azt jelenti, hogy a mez
ő
k színe az állapotuktól függ: más színe van, ha szerkeszthető
, ha csak olvasható; de ami alegfontosabb: más színe van, ha aktív (benne van a kurzor). Ez egy nagyon látványos, de legalább annyirahasznos lehet
ő
ség, amit a Delphi komponensek írói még nem fedeztek fel, de már jó pár alkalmazásban lehet
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 22/32
21
találkozni vele. Ha valaki ilyet szeretne használni a programjában, két dolgot tehet: vagy ír egy sajátkomponenst, ami tudja ezt a lehet
ő
séget, vagy pedig a programon belül kezeli le ezt a problémát. Az első
megoldás kicsit bonyolultnak tű
nik, de csak egyszer kell megtenni. A másodikat egyszerű
bb, de minden egyesprogramba külön bele kell építeni. Ha komponenst írunk, el
ő
ször tanulmányozzuk át a Delphi Help megfelelő
fejezeteit (Creating a new component ), csak aztán fogjunk bele. Ha ez már meg van, arra kell figyelni, hogy aszínváltást nem az onEnter , illetve onExit eljárásokba, hanem a
procedure CMEnter(var Message: TCMGotFocus); message CM_ENTER;
illetve a
procedure CMExit(var Message: TCMLostFocus); message CM_EXIT;
deklarációjú eljárásokba kell foglalni.Abban az esetben viszont, ha programon belül oldjuk meg, nem kell mást tenni, mint hogy a megfelel
ő
objektumok onEnter és onExit eseményében megadni a megfelelő
színeket. Egy eseménykezelő
persze egyszerretöbb objektumhoz is tartozhat, ekkor viszont célszer
ű
a következő
képpen megadni a színeket:
(Sender as TControl).Color:=SajatSzin;
Sorolhatnám még azon lehető
ségeket, amelyekkel szebbé és használhatóbbá tehető
egy alkalmazás.Minden csak a fejleszt
ő
fantáziáján és ötletességén múlik.
Egy adatlap, „színváltós” beviteli mező
kkelFigyeljük meg, hogy a kapcsolódó táblákba (hirdet
ő
neve, szervező
neve) közvetlenül vehetünk fel új rekordot az„Új hirdet ő ”, ill. az „Új szervez ő ” feliratú gombokkal. További érdekesség, hogy a reklám szövegét formázni is
lehet (RTF).
Műveletvégző ablakokEbbe a kategóriába sorolom azokat a párbeszédablakokat, amelyek nem egyszer
ű
adatbázis-manipulációt, hanem valamilyen összetettebb m
ű
veletet végeznek. Ezeket azért kell elkülönítenünk, mertfelépítésükben, m
ű
ködésükben teljesen másak, mint mondjuk az adatlapok. Ezeket az ablakokat általában arrakészítjük fel, hogy valamilyen (általában meghatározott) felhasználói m
ű
veletsorozatra valamilyenmeghatározott adatbázis-m
ű
veletsorozatot hajtson végre. Itt ne egy új név felvételére gondoljunk egytelefonkönyv-program keretein belül, hanem például egy éttermi rendszer fizetés-moduljára, ahol egy számláhoztöbb asztal, tetszés szerinti rendelései tartozhatnak.
Az ilyen feladatok elvégzésére három módszer kínálkozik. Az els ő , amikor egy ablakra rakjuk ki azösszes szükséges objektumot, melyekkel elvégezhet
ő
a mű
veletsor. Itt figyelni kell az átláthatóságra, és arra,hogy ne legyen az ablak zsúfolt. Ha nem elég nagy az ablak, és nem fér el rajta minden, akkor jöhet szóba amásodik lehet
ő
ség, az egymás után felbukkanó ablakok használata. Ezeknél fontos, hogy mindegyiken legyen
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 23/32
22
visszalépési lehető
ség ( Mégsem gomb). A harmadik módszer a legszebb, és manapság egyre nagyobb teret hódítmagának: a varázsló. Ennek persze csak akkor van értelme, ha szabadon oda-vissza lépkedhetünk benne, illetvebármikor kiléphetünk bel
ő
le. Nagyon fontos, hogy kerüljük a felesleges szövegeket és oldalakat (üdvözlő
oldal,elköszön
ő
oldal, stb., ld. legtöbb Microsoft varázsló), csak a lényegre figyeljünk. Jó, ha minden oldalon vanvalamilyen alapértelmezett beállítás (lehet ez az el
ő
ző
alkalommal használt érték), mert így még könnyebbenvégig lehet menni a varázslón. A Delphi sajnos varázsló komponenset nem tartalmaz, de nagyon egyszer
ű
enkészíthetünk magunknak egyet a TNotebook (Win 3.1 fül) segítségével, amely több lapból áll, és lapjaira bármitföltehetünk.
Rendelés az éttermi rendszerrel (m ű veletvégző ablak): a típusokra egyszer kattintva kiválaszthatjuk a baloldalonmegjelenítend
ő
tételeket, azokra egyszer kattintva pedig felvehetjük a rendelésbeő
ket.
KimutatásokAz adatbázis-kezel
ő
programok fontos részét képezik a kimutatások. Ezek alatt általában valamilyenszempontból csoportosított, valamilyen sz
ű
rő
vel ellátott, valamilyen rendezési elvet követő
adatmegjelenítéstértünk. A feladat bonyolultságától függ, hogy egy kimutatásnak hogyan kell kinéznie, mit kell megmutatnia. Aza jó kimutatás, amellyel minél több szempontból lehet adatokat csoportosítani. Kimutatások készítésénél szinteelkerülhetetlen az SQL-lekérdezések (Select -ek) használata. A lekérdezésekkel természetesen lehet számítottadatokat is megjeleníteni, összevonni, stb. (b
ő
vebbeket a Local SQL Guide-ban).Az SQL-lekérdezéseket használó kimutatások fontos jellemz
ő
je, hogy menet közben nem tudunk
változtatni a feltételeken (kivéve a szű
rő
ket), csak ha újrafuttatjuk a lekérdezést. Ezért célszerű
a feltételeket akimutatás megjelenítése elő
tt bekérni a felhasználótól, majd lefuttatni az SQL-eket, és aztán megjeleníteni azokeredményeit. Ezek után sem szabad azonban elfeledkezni a feltételekr
ő
l: érdemes azokat kijelezni a kimutatás-ablakban is. A kimutatás-ablak szerkezete tetsz
ő
leges lehet, de ha egyszerre több táblázatot jelenítünk meg, aztmindenképpen érdemes egy TPageControl megfelel
ő
en feliratozott lapjaira helyezni, hogy minél áttekinthető
bblegyen.
Gyakran használunk kapcsolt táblákat, amikor egy adat törzse egy táblában, az egyéb adatai (amelybő
ltöbb rekord is lehet) pedig egy másik táblában szerepelnek. Ekkor a legszebb megoldás, ha mindkét táblázatotmegjelenítjük, de úgy, hogy az egyik táblában egyszerre csak egy, a másik táblában kiválasztott elem részletei
jelenjenek meg. Ezt pedig a legegyszerű
bben úgy tehetjük meg, ha az egyik tábla MasterSource-át és MasterFields-ét a másik táblának megfelel
ő
DataSource-ra, illetve mező
jére állítjuk.
Ha pl. van két táblánk:
TableNevek(személykód, név) (DataSourceNevek)TableLakas(személykód, lakhely) (DataSourceLakas)(Egy személyhez több lakhely is tartozhat.)Ekkor a következ
ő
ket kell tennünk:
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 24/32
23
TableLakas.MasterSource:=DataSourceNevek;
TableLakas.IndexFields:=’személykód’;
TableLakas.MasterFields:=’személykód’;
Példa a kimutatásra: zárás az Étterem programmal
Folyamatkijelzők (ProgressBar -ok)El
ő
fordulhat, hogy a programunk olyan mű
veleteket végez, amelyek viszonylag idő
igényesek. Ekkornem túl jó, ha ezt csupán egy homokórás egérkurzorral jelezzük (ezt egyébként az Application.Cursor crHourGlass értékre állításával tehetjük meg), hanem folyamatkijelz
ő
ket (ProgressBar -okat) használunk. Így afelhasználó meg tudja ítélni, hogy mennyi van még hátra, és az is nyilvánvalóvá válik számára, hogy a programnem fagyott le, hanem dolgozik.
Erre a feladatra természetesen a TProgressBar komponens használható. A dolog egyszerű
:megszámoljuk hány m
ű
veletet végzünk, és azt megadjuk a ProgressBar -nak ( Max). Ezután minden mű
veletetkövet
ő
en léptetjük (StepIt ). Ha tudjuk, hogy a mű
veletek nem lesznek folyamatosak (a mű
veletek végrehajtásiideje között nagyok a különbségek), célszer
ű
a Smooth értéket kikapcsolva hagyni, így nem olyan feltű
nő
.Kalkulálhatunk azzal is, hogy egy hosszabb m
ű
velet után esetleg többet léptetünk egyszerre. Ami nagyon fontos,
hogy mindenképpen legyen valóság alapja a folyamatkijelző
nknek. Ha tehetjük, célszerű
szövegesen is közölni,hogy éppen mit csinál a program (ez hibakeresésnél is jól jöhet).Mindez azonban semmit nem ér, ha nem jelenik meg. Normális esetben ugyanis a Windows nem
dolgozza fel a komponenseknek küldött üzeneteket, miközben mi egy eljáráson belül mű
veleteket végzünk. Eztnekünk kell megtenni, az Application.ProcessMessages segítségével (ezt minden StepIt után be kell írnunk).Ezzel megoldódik a probléma. Természetesen máshol is alkalmazhatjuk a ProcessMessages metódust, aholzavaró, hogy sokáig nem frissülnek az ablakok.
Nyomtatás, riportGyakran van arra szükség, hogy amit az adatbázisunkban (vagy esetleg SQL lekérdezésünkben)
tárolunk, papíron is megjelenítsük. Erre a Delphi is lehető
séget nyújt a QuickReport komponenscsomagsegítségével (QReport fül). Az új riportot elhelyezhetjük a form-on, de létrehozhatjuk önálló ablakként is
(File/New/Report ). Használata nagyon egyszerű
: beállításait a jobb egérgombbal elérhető
menübő
l és az Object Inspector segítségével tehetjük meg. A riportra ezek után rápakolhatjuk a megfelelő
komponenseket a QReport eszköztárból. Használatukat a mellékelt példaprogramok segítségével könnyen megérthetjük (a Delphikönyvtárán belül a Demos/Quickrpt könyvtárban találjuk
ő
ket). A lényege az, hogy Band -eket kell elhelyeznünk,
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 25/32
24
amelyeknek különböző
típusai lehetnek ( BandType tulajdonság), majd ezekben helyezzük el az adatokatmegjelenít
ő
komponenseket (pl. QRDBText ). A komponenseket széleskörű
en konfigurálhatjuk, kényünk-kedvünk szerint.
Programunkon belül a QuickReport Preview metódusát meghívva nyomtatási képet mutathatunk meg.Ezt célszer
ű
alkalmazni, mert a felhasználók szeretik látni, mi fog a nyomtatott papírra kerülni. A Preview ablakhasználata egyszer
ű
, de célszerű
magyarítani a Delphi könyvtárán belül a Lib/qrprev.dfm fájl megnyitásával ésátírásával.
Egy QuickReport-tal készített nyomtatási kép
ProjectHa már mindennel kész vagyunk, nem árt, ha végignézzük a Project beállításait (Project/Options). A
Forms lapon beállíthatjuk, hogy melyik form legyen az alkalmazásunk f ő
formja ( Main Form), valamint hogymely formokat hozza létre automatikusan a program (amelyeket futásid
ő
ben, kézzel kívánunk létrehozni, azokattöröljük a listából). Az Application lapon megadhatjuk, mi legyen a program neve ( Application.Title, ez jelenikmeg a tálcán) és hogy mi legyen az ikonja ( Application.Icon). Bármennyire is lényegtelennek t
ű
nik, nagyhangsúlyt kell fektetnünk az alkalmazás ikonjának kiválasztására. A felhasználók ugyanis az alapján azonosítjáka programunkat, így annak utalnia kell funkciójára, vagy mindenképpen egyedinek, az általában használatosikonoktól eltér
ő
nek kell lennie. A Compiler oldalon a fordítóra vonatkozó beállításokat tehetjük meg. Végső
fordítás esetén (ha már teljesen kész vagyunk a programmal, és nem óhajtunk több hibakeresést végezni)célszer
ű
a Runtime errors és a Debugging panelen mindent kikapcsolni, ezzel is csökkentve a programer
ő
forrásigényét. Hasonló okokból érdemes bekapcsolni a Code generation-ban az Optimization-t. Még egy fülvan, ami érdekes számunkra, ez pedig a Version info. Itt a programnak azon tulajdonságait állíthatjuk be,amelyeket a Windowsban, az exe tulajdonság-lapján is megtekinthetünk. A mez
ő
ket kitöltve megadjuk averziószámot (a Build szám automatikus növelésére is van lehet
ő
ségünk), a szerző
t, a tulajdonost, stb.Ha már ezeken is túl vagyunk, jöhet az utolsó Build , majd a használat. Sok sikert!
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 26/32
25
V. Egyéb problémák
Hibakezelés
Ebben a részben a hibák kezelésének alapjaival ismerkedünk meg, hogy itt szerzett tudásunkatfelhasználhassuk az adatbázis-kezel
ő
rendszerek készítése során, hiszen egy adatbázis kezelése során rengeteg
hibalehető ség van, sokuk független attól, hogy a programot hogy írtuk meg.A Windows a hibakezelést ún. exception-ökkel oldja meg. (Az exception jelentése: kifogás, kivétel,
kivételes esemény, megszakítás. A magyar nyelvű
Windows-okban kivételnek fordítják, holott a kivételesesemény, vagy a megszakítás jobban illene rá.) Kivétel akkor jön létre, ha egy hiba, vagy egyéb eseménymegszakítja a program normál futását. A kivétel az irányítást egy kivétel-kezel
ő
nek (exception handler ) adja át,ami lehet
ő
séget ad arra, hogy elkülönítsük a program normál futását a hibakezeléstő
l. A kivétel információt (amiáltalában egy hibaüzenet) tud átvinni attól a ponttól, ahol el
ő
idézték, addig a pontig, ahol lekezelik. Ha egyalkalmazás használja a SysUtils unitot, minden futtatási hiba (runtime error ) automatikusan kivétellékonvertálódik. Olyan hibák, amelyek más esetben megszakítanák a program futását – mint pl. kevés memória,nullával való osztás, általános védelmi hiba – elfoghatók és kezelhet
ő
k. A kivételek is objektumok, ígyhasználatuk könnyen elsajátítható. (Delphi Help: Exceptions: Owerview)
Saját magunk is létrehozhatunk ilyen kivételeket, a raise kulcsszó segítségével. A legegyszerű
bben akövetkez
ő
példa alapján járhatunk el:
raise EMathError.Create(‘Hiba történt! Kutykurutty!’);
A hibák kezelése sem sokkal bonyolultabb ennél. A legegyszerű
bb, ha a problémás mű
veleteket ún. try-blokkba tesszük. Ez a következ
ő
képpen néz ki:
Try
X := Y/Z;
except
on EZeroDivide do HandleZeroDivide;
end ;
Az on után a hiba típusát (pontosabban a kivétel osztályának nevét) írjuk, a do után pedig meghívhatjuka kezel
ő
eljárásunkat.Ha azt szeretnénk, hogy a kritikus m
ű
velet után mindenképpen végrehajtódjanak bizonyos mű
veletek,
és csak azután keletkezzen kivétel, használhatjuk a try..finally szerkezetet is:
Reset(F);
try
{...} // fájlmű
veletek az F fájllal
finally
CloseFile(F);
end ;
A hibakezelésnek van még egy fontos része, ez pedig a komponensek hibaeseményei. Nevük általában akövetkez
ő
képpen néz ki: On*Error . Nevük utal mivoltukra, pl. a TTable OnDeleteError eseménye akkorkeletkezik, ha egy adat törlése meghiúsult. Ezek használatával rengeteg hibalehet
ő
séget kiszű
rhetünk,kezelhetünk. Ehhez jól kell tudnunk használni az Exit , az Abort , ill. a Halt eljárásokat.
Az Exit kilép az aktuális eljárásból. Ha a f ő
programban van, a program kilép, ha egy meghívotteljárásban van, visszaadja a vezérlést arra a pontra, ahol az eljárást meghívtuk. Akkor használjuk, ha olyan esetáll fenn, amely mellett az eljárás nem folytatható.
Az Abort megszakítja az aktuális folyamatot anélkül, hogy hibát generálna. Használatát a következő
példa jól mutatja:
procedure TForm1.Table1BeforePost(DataSet: TDataSet);
begin
if DBEdit1.Text = '' then
Abort;
end ;
Tehát a Table1 tábla mentés (Post ) elő
tt meghívott eseményében ( BeforePost ) megnézzük, hogy üresenhagyta-e a felhasználó a DBEdit1 által reprezentált mez
ő
t. Ha igen, az abort -tal megszakítjuk a mű
veletet, és ígynem engedélyezzük a mentést.
A Halt azonnal megállítja a program futását, és a paraméterként megadott hibakóddal kilép. Csak akkorhasználjuk, ha a program futtatása egyáltalán nem folytatható.
A fentiek ismeretében nyugodtan elkezdhetünk hibaelhárító, kezelő
programrészeket írni.
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 27/32
26
Hálózat használata Paradox rendszerrel
Gyakori feladat, hogy egy PARADOX adatbázist több számítógéprő
l szeretnénk egyszerre használni.Ehhez azonban még nem feltétlenül szükséges kliens-szerver alkalmazást készíteni, ha jól dolgozik az ember,megfelel
ő
platform erre a PARADOX is. Úgy kell tehát megtervezni az alkalmazásunkat, hogy ne okozzon nekigondot, ha vele egy id
ő
ben egy másik program is dolgozik az adatbázisán. A probléma látszólag ugyanaz, mintamikor egy számítógépen egyszerre futó több program éri el ugyanazt az adatbázis. Az erre való felkészítésazonban nem elég. Az adatbázis ugyanis másként viselkedik, ha a programok nem egyazon számítógépen futnak.
Első nek arra kell figyelnünk, hogy ha egy program szerkesztésre megnyitott egy adatot, azt egy másikprogram csak olvasásra tudja megnyitni. Ezért le kell kezelnünk azt az esetet, amikor a másik program ismegpróbálja szerkeszteni azt. Ennek a legegyszer
ű
bb módja, ha a táblák OnEditError eseményébe beírjuk akövetkez
ő
t: E.Message:= 'Nem sikerült megnyitni az adatot. Lehet, hogy egy másik felhasználó épp szerkeszti.'; .Ezzel azt érjük el, hogy hiba esetén a Delphi ezt az üzenetet fogja kiírni. A többivel nem kell foglalkoznunk,hiszen a Delphi automatikusan megszakítja a hibát okozó folyamatot.
Gyakori eset, hogy egy adatbázisban egy egyed azonosítására egy számértéket (kódot) használunk, amitminden egyes új egyed felvételekor eggyel növelünk. Ez a növelés pedig úgy történik, hogy az új egyed a kódjátúgy kapja meg, hogy a legnagyobb kódhoz hozzáadunk egyet. Ekkor azonban el
ő
fordulhat az, hogy két programegyszerre hoz létre egy-egy új egyedet (vagy az egyik megnyitja, de még nem menti, amikor a másik ismegnyitja). Így mindkét program azonos kóddal szeretné elmenteni az adatot, ami nem túl szerencsés (és nem islehet, ha ez a kód az egyedüli els
ő
dleges kulcs). Az ehhez hasonló esetek megoldására az tű
nik megfelelő
nek,hogy mihelyst létrehozzuk az új egyedet, megkapja a megfelel
ő
kulcsot (kódot), és rögvest mentjük is, majd újramegnyitjuk szerkesztésre. Így a felhasználó vagy a program korlátlan ideig „gondolkodhat” az adatok kitöltésén,az egyed helye biztosított az adatbázisban.
Fontos kérdés hálózat használata esetén a frissítés megvalósítása. Minden mű
velet elő
tt frissíteni, am
ű
veleteket követő
en pedig rögzíteni kell az adatokat. A programok ugyanis nem veszik „maguktól” észre aváltozásokat, amiket egy másik program okozott. Ezért célszer
ű
a táblák Refresh metódusát használni, mielő
ttvalamilyen m
ű
veletbe kezdünk. Mivel a BDE az adatokat a memóriában (bufferekben) tárolja, azok nem íródnakki rögtön a merevlemezre, így a változásokat csak az adott számítógépen futó programok érzékelhetik (mivelegyszerre csak egy BDE futhat, és az szolgálja ki az összes BDE-programot). Gondolnunk kell tehát arra, hogyegy esetleges meghibásodás vagy áramkimaradás esetén, továbbá ha egy másik számítógép szeretné az aktuálisadatokat lekérdezni, ez az elv nem követhet
ő
. Ezért minden mű
velet elvégzése után érdemes a bufferek tartalmáta merevlemezre írni a FlushBuffers metódus segítségével, ha pedig CacheUpdate módot használunk, az ApplyUpdates-el (a CacheUpdate üzemmódról a TTable-nél volt szó, a IV. fejzetben).
Ezeket betartani azonban még mindig csak fél siker. Ahhoz, hogy egyszerre több számítógépen futóprogramok (pontosabban BDE-k) megfelelő
módon kezelhessék az adatállományokat, a BDE megfelelő
beállításait is el kell végezni. A BDE ugyanis az adatbázis megnyitásakor annak könyvtárában ún. lock -fájlokat(paradox táblák használata esetén ez a paradox.lck és a pdoxusrs.lck ) helyez el. Ezekben tárolja azt, hogy melytábláknak mely rekordjait nyitották meg szerkesztésre, így azokhoz csak olvasási hozzáférést enged. Ahhozviszont, hogy egyszerre több program (BDE) a hálózaton keresztül elérje ezt az adatbázist, össze kell hangolniő
ket. Erre szolgál a pdoxusrs.net fájl, amit a BDE a neki beállított NET DIR változó értékének megfelelő
helyrehelyez el, illetve ott keresi. Ezért fontos, hogy az összes BDE egy helyen (a hálózat egyik megosztottkönyvtárában) keresse ezt a fájlt. Tehát minden számítógépen megfelel
ő
en kell beállítani a BDE Administrtator programban a Configuration/Drivers/Native/Paradox elem NET DIR paraméterét (azon a gépen, ahol az adatokvannak, a C:\ -t érdemes beállítani, a többi gépen pedig értelemszer
ű
en ezt a könyvtárat képviselő
hálózatimegosztás nevét). Ha a beállítások nem helyesek, a program leállhat azzal, hogy az adatbázist valaki máshasználja.
Ha már a BDE beállításainál tartunk, ismét megemlítem, hogy a sikeres hálózati mű
ködés érdekében aConfiguration/System/INIT/LOCAL SHARE változót TRUE -ra kell állítani, különben az adatokat nem tudjákfrissíteni a hálózaton keresztül az alkalmazások.
Ha olyan programot írunk, amely hálózaton, több példányban mű
ködik, gondolnunk kell arra, hogybizonyos m
ű
veletek kizárólagos megnyitást követelnek maguknak (ilyen pl. a tábla ürítése, az EmptyTable), azazekkor csak egy példányban futhat a programunk. A legjobb és legegyszer
ű
bb az, hogy a mű
velet elvégzése elő
ttközöljük a felhasználóval, hogy zárja be a többi alkalmazást. Ha pedig mégis hiba lép föl, még egyszerfigyelmeztetjük err
ő
l.A fentiekb
ő
l látszik, hogy a Paradox rendszereket nem arra találták ki, hogy egyszerre több százprogram férjen hozzá egy adatbázishoz. Néhány program viszont tökéletesen m
ű
ködik hálózatban, ha betartjuk aszabályokat. A tapasztalatom azt mutatja, hogy megfelel
ő
odafigyeléssel ezeket a hibalehető
ségeket ki lehetiktatni, és végeredményben egy jól használható alkalmazást kapunk.
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 28/32
27
Biztonsági problémák
Elő
fordulhat, hogy az adatbázis megsérül. Mit kell, mit lehet ilyenkor tenni? Milyen kilátásaink vannak,hogyan háríthatjuk el a hibát, és hogyan el
ő
zhetjük meg? Ezek a kérdések minden fejlesztő
t foglalkoztatnak.Ebben a részben megoldást keresünk rájuk.
Biztonsági mentés
A károk megelő zésének legegyszer ű bb módja, ha biztonsági másolatot készítünk adatainkról.Egyszer
ű
bb fájlsérüléseket kivédhetünk azzal, hogy az adott merevlemezre másoljuk le az adatokat. Biztosraazonban csak akkor mehetünk, ha ezt egy másik adathordozóra tesszük meg (történhetnek ugyanis olyan károk,amelyek a merevlemez adatainak teljes elvesztésével járnak együtt).
Biztonsági másolat készítésére rengeteg módszer kínálkozik. Elő
ször is el kell döntenünk, hogy errő
l mimagunk kívánunk gondoskodni, vagy rábízzuk a felhasználóra. Ha nem akarjuk a felhasználókat ilyenekkelterhelni, érdemes a programunkba épített automatizmussal megoldani. Persze az is megoldás, ha különprogramot készítünk erre a célra, amit a Windows Feladatütemez
ő
jével adott idő
szakonként futtatunk. Ehhezazonban már ismerni kell a Feladatütemez
ő
vezérlését, vagy a telepítés során kézzel be kell konfigurálni. Ha afelhasználóra bízzuk a dolgot, beépíthetjük a programunk karbantartó moduljába, vagy írhatunk rá különprogramot, amelynek parancsikonjára kattintva automatikusan lefut. A legrosszabb megoldás, ha nem teszünksemmit, hanem a felhasználóra bízzuk, hogy készítsen kézzel (valamilyen fájlkezel
ő
vel, Intéző
vel) másolatot azadatbázis fájljairól. Ez ugyan nem valami felhasználóbarát, de ha tudjuk, hogy a felhasználó képes erre, minden
további nélkül építhetünk rá.A biztonsági mentés kétféle lehet. Vagy mindig ugyanazokat a fájlokat írjuk felül az aktuális
adatbázissal, vagy minden alkalommal egy külön dátummal ellátott könyvtárba másoljuk azokat, lehető
vé téve,hogy egyszerre több biztonsági másolat is elérhet
ő
legyen. Arra kell ekkor figyelmet fordítanunk, hogy sokbiztonsági mentés mérete már elég jelent
ő
s lehet, és nem túl szerencsés ezzel terhelni a háttértárakat. Meg kelltehát oldanunk az elavult biztonsági mentések törlését is.
Ami nagyon fontos: nem nekünk érdekünk az adatok biztonságos tárolása és mentése, hanem afelhasználónak.
Ha már megoldottuk a biztonsági másolat készítését, már csak a visszatöltéssel kell törő
dnünk. Amásolatot ugyanis azért készítjük, hogy probléma esetén könnyen vissza lehessen tölteni azt az eredetiadatfájlokat felülírva.
A feladat programozása nem bonyolult, mindössze az adatbázis fájljait kell másolgatni a CopyFile(windows unit ) függvény segítségével. A dolog jelent
ő
sége ott van, hogy gondoltunk rá, és nem a felhasználónak
kell ezzel tör ő dnie.Azt, hogy milyen id
ő
közönként mentünk, attól tegyük függő
vé, hogy mennyire gyakran változik azadatbázis, és ezek a változások mennyire rekonstruálhatók.
Adatsérülések kezeléseAz adatsérülés általában úgy mutatkozik meg, hogy program indításakor, vagy futásakor valamilyen
hibaüzenetet kapunk a BDE-tő
l, amelyben hibás adatfájlokról, megnyithatatlan táblákról tájékoztat minket. Azesetek többségében a hiba javítható, mivel nem a táblák, csak a hozzájuk tartozó járulékos fájlok sérülnek.Ezeket a sérüléseket általában a program futásának váratlan megszakadása okozza, amely történhet a mihibánkból, de lehet a Windows hibája is. Hálózati használat esetén egy váratlan kapcsolatszakadás (érintkezésihiba, stb.) is okozhat ilyen hibát, ugyanúgy, mint az áramszünet.
Hogy jobban lássuk a helyzetet, tisztázzuk, milyen fájlok tartoznak egy Paradox alapú adattáblához. Az
első
a .db fájl, ami maga a tábla. Ha ez sérül, nem tudunk igazán mit kezdeni vele, a biztonsági mentéshez kellnyúlnunk.A többi, egy táblához tartozó fájlnak a pont el
ő
tti neve megegyezik a .db fájl pont elő
tti nevével.Ha használjuk a tábla Validity Checks (érvényesség vizsgálat) lehet
ő
ségét, automatikusan létrejön egy.VAL fájl, ami ezeket a beállításokat tárolja. Ha ez sérül meg, a 12036 kódú, .VAL file is out of date (.VAL fájlelavult) hibaüzenetet kapjuk, mikor megpróbáljuk megnyitni az adatállományt. Ezt úgy tudjuk kivédeni, haletöröljük. Ekkor azonban elvesztjük az imént említett lehet
ő
ségeket, így inkább újra kell gyártanunk ezt a fájlt(hogy hogyan, azt majd a kés
ő
bbiekben tisztázzuk).Az els
ő
dleges indexszel kapcsolatos információk a .PX fájlban tárolódnak. A többi, másodlagos index-információk a .GX? és a .GY? fájlokban vannak (a ? helyén szám, illetve bet
ű
található, attól függő
en, hogyhányadik az index). Ha ezek közül sérül valamelyik, a 8961-es kódú Corrupt table/index header (hibástábla/index fejléc) hibaüzenetet kapjuk. Ezen a problémán a tábla újraindexelésével lehet segíteni (ha nemállítunk be indexet a táblának, hibás index-állományokkal is megnyithatjuk).
Ahhoz, hogy az imént felsorolt hibákat ki tudjuk javítani, szükségünk van a táblák definícióira. Ezértazokat el kell tárolnunk a hibajavító programban. Ezt nagyon egyszer
ű
en úgy tehetjük meg, hogy létrehozzuk amegfelel
ő
táblákat (TTable), majd jobb egérgombbal kattintva, az Update Table Definition menüpontsegítségével beállítjuk a mez
ő
deklarációkat (amiket a tábla a FieldDefs tulajdonságában tárol) és az
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 29/32
28
indexdeklarációkat (ezek az IndexDefs-ben vannak). Ha mindezt elvégeztük, a Table-ök már ismerik a tábláinkstruktúráját, definícióját. Így már bármikor létrehozhatunk egy ennek megfelel
ő
, üres táblát, a CreateTablemetódus segítségével. Ezt a lehet
ő
séget használhatjuk fel a sérült fájlok javítására, a következő
képpen: hasérültnek találunk egy állományt (a .db fájl kivételével), letöröljük, majd egy SQL lekérdezésben megnyitjuk atáblát (a SELECT * FROM tábla.db lekérdezést használva), és meghívjuk a táblához tartozó Table CreateTablemetódusát. Ezzel létrejött egy új, üres tábla, amelynek struktúrája hibátlan, a tábla el
ő
ző
adatait pedigátmenetileg a Query-ben tároljuk. A következ
ő
lépés az adatok átmásolása a Query-bő
l a Table-be. Ezt akorábban szintén bemutatott TBatchMove segítségével végezhetjük el. Ha ezek után sem tudjuk megnyitni atáblát, sajnos nem tudunk rajta segíteni.
A tábláknak vannak olyan tulajdonságai is, amelyeket nem tudunk a TTable-ben eltárolni, és ezáltal aCreateTable metódussal létrehozott tábla sem tartalmazza. A leggyakoribb ilyen tulajdonság, amiveltalálkozunk, a jelszó. Ezért ezt magunknak kell megadni, a tábla létrehozása után. A dolog abból a szempontbólnem egyszer
ű
, hogy nincs meg a megfelelő
eljárás, amivel egy táblának jelszót állíthatnánk be. Némi keresgetésután azonban találunk egy példát, méghozzá a Borland Database Engine Online Reference-ben (megtalálható aStart menüben is, a Delphi-n belül a Help/Borland Database Engine menüben, valamit a BDE könyvtárában).Ha ebben az állományban rákeresünk az AddMasterPassword szóra, és a kiadott találatot megnyitva az oldalExample 4: Add a master password to a Paradox table alcímet visel
ő
részbő
l az eljárást kimásoljuk, máris vanegy saját jelszóhozzáadó rutinunk (ami egyébként a DbiDoRestructure nev
ű
BDE API függvényt használja).Sokszor nem elég az adatokat fizikailag ellen
ő
rizni. Hibás mű
ködés esetén ugyanis elő
fordulhatnakkitöltetlen mez
ő
k, amik rengeteg bosszúságot okozhatnak. Érdemes tehát a táblák tartalmát is ellenő
rizni, és
lehető
ség szerint a kellő
helyen beavatkozni. Hogy be lehet-e avatkozni, és ha igen, milyen módon, azt a konkrétfeladat illetve adatbázis határozza meg, ezért részletekbe nem bocsátkozunk.Egy szoftver fejlesztése során gondolnunk kell arra is, szükséges-e naplózni a m
ű
veleteket, és ha igen,ezt milyen módon oldjuk meg. A naplózás azért tölt be fontos szerepet egy szoftver m
ű
ködésében, mertsegítségével könnyen visszakereshet
ő
k a mű
veletek, és könnyebben megy a hibakeresés is (f ő
leg ha a hiba egyegyszer
ű
felhasználó „keze alatt” keletkezett, aki még a hibajelenséget, illetve a hibaüzenetet sem tudjafelidézni). A naplózás legegyszer
ű
bb módja, ha minden eseményt beírunk egy naplófájlba, dátummal, idő
velellátva. Használhatjuk például a TListBox-ot, melybe a Lines.Add metódussal beszúrhatunk egy sort, a Lines.SaveToFile-lal pedig egyszer
ű
en kimenthetjük tartalmát a paraméterben megadott fájlba.A várt adatforgalomtól függ
ő
en óránként, esetleg naponta megnyitunk egy újabb naplófájlt, és abbafolytatjuk a naplózást. Ha a fájljainknak txt kiterjesztést adunk, a Jegyzettömbbel könnyen megjeleníthet
ő
eklesznek. Ügyelnünk kell azonban arra, hogy az elavult naplófájlokat néha törölni kell, mert az egy könyvtárbantárolható fájlok száma a legtöbb Windows-os rendszerben véges (bármilyen kicsik is ezek a fájlok).
A biztonság kérdése nagyon fontos egy programnál, f ő
leg ha azt valaki üzemszerű
en használja, ésfontos adatokat tárol és kezel segítségével. A biztonsági intézkedések hosszútávon jelentenek elő
nyt, és beváltjáka hozzájuk f
ű
zött reményeket. Ezen védelmi mechanizmusok ellenére azonban nem engedhetjük megmagunknak azt a luxust, hogy kevésbé tör
ő
djünk a rendszerünk egyéb részeinek helyes, biztonságosm
ű
ködésével, hiszen ezeket a biztonsági intézkedéseket a program által okozott hibáknál nem igazán tudjukkihasználni.
Telepít ő készítése
Ha egy általunk készített programot felhasználás céljából más kezébe adjuk, gondoskodnunk kell egytelepít
ő
programról. Ez f ő
leg igaz azokra a programokra, amelyek használják a Borland Database Engine-t,mivel azt a számítógépekre külön telepíteni kell (persze ezt megtehetjük a Delphi telepít
ő
CD-jérő
l is, de az nemaz igazi). A Delphi programcsomag tartalmaz egy InstallShield Express nev
ű
programot, amellyel könnyen és
gyorsan készíthetünk komplett telepítő
készletet. Elő
nye a többi, Interneten fellelhető
ingyenes vagy olcsóbbtelepítő
-készítő
kkel szemben, hogy kifejezetten Delphi-hez készült, így támogatja a BDE-t. A program nemtartozik közvetlenül a Delphi-hez, a Delphi telepít
ő
CD-jérő
l, mint önálló programot tehetjük fölszámítógépünkre.
A programban, ha új telepítő
t készítünk, elő
ször meg kell adnunk annak nevét és helyét. Ha testreszabható telepít
ő
t (Custom Setup) szeretnénk készíteni, jelöljük be az Include a custom setup type jelöl
ő
négyzetet. A Create gomb megnyomása után megjelenő
Setup Checklist -ben különböző
opciókat találunk.Ezeken egyenként végig kell mennünk. A teljesség igénye nélkül most végignézzük a lehet
ő
ségeket.Set the Visual DesignAz App Info lapon a program általános jellemz
ő
it adhatjuk meg. Itt kell kiválasztanunk, melyik fájl aprogramunk futtatható állománya ( Application Executable). A Main Widow-ban a telepít
ő
hátterét, a Features-ben pedig az automatikus Uninstall-t kapcsolhatjuk be.
Specify InstallShield Objects for Delphi
Ebben a csoportban állíthatjuk be, milyen Delphi komponenseket telepítsen az általunk készítetttelepítő
. Számunkra a BDE a legfontosabb. Ezt meg is találjuk a General fülön belül. Kiválasztva egy beállítóvarázsló jelenik meg. Els
ő
lépésben a telepítendő
BDE komponenseket adhatjuk meg. Ha Full BDE Installation-t választunk, a teljes BDE belekerül a készletbe, de a Partial-lal mi adhatjuk meg ezeket a részeket. Ha Paradox
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 30/32
29
rendszerben dolgozunk, elég a Paradox Driver -t bejelölni. Ha használunk valami mást is (pl. SQL-t),értelemszer
ű
en azt is be kell jelölnünk. A következő
lapon alias-okat hozhatunk létre. Itt célszerű
megadni aprogram által használt alias-okat. Ezeknek a tulajdonságait kett
ő
vel arrébb be is állíthatjuk. Érdemes még akomponensek közül kiválasztani a BDE Control Panel File-t, melynek segítségével a Vezérl
ő
pultból is elérhető
a BDE Administrator program.Specify Components and FilesA telepít
ő
ben a fájlokat csoportosítjuk. Vannak programfájlok, adatbázisfájlok, súgófájlok, stb.,melyeket ilyen módon csoportba szervezünk, így telepítéskor könnyen kiválaszthatóak a szükséges részek. AGroups lapon létre kell hoznunk a használni kívánt csoportokat, és azokhoz hozzáadni a megfelel
ő
fájlokat. AComponents-ben megadhatjuk, hogy ezek a csoportok milyen komponenseken belül legyenek, a Setup Types-banpedig azt, hogy mely telepítési típus (Egyéni – Custom, Tipikus – Typical, Minimális – Compact ) hogyantartalmazza ezeket a komponenseket.
Select User Interface ComponentsA telepít
ő
nek megmondhatjuk, hogy milyen dialógus-ablakok jelenjenek meg a telepítés folyamán. Itthelyezhetjük el a felhasználói licenszszerz
ő
dést (Software Licence Agreement ), valamint az „olvass el”dokumentumot ( Readme Information), stb.
Specify Folders and IconsItt parancsikonokat hozhatunk létre a programunk különböz
ő
fájljairól, amit a telepítő
a megadott helyrelétrehoz majd.
Ha mindent beállítottunk, a Disk Builder segítségével létrehozhatjuk a telepítő
t. Ha kész, nincs más
hátra, mint lemezre másolni.
Az InstallShield
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 31/32
30
Készítsünk CD-t!Manapság egy telepít
ő
t CD-n illik kiadni. Emellett egyre nagyobb teret hódít az automatikus CD,amelyet a meghajtóba helyezve elindul egy héjprogram, amivel elindíthatjuk a CD-n lév
ő
telepítő
ket. Ilyettermészetesen mi is készíthetünk. Egy megfelel
ő
telepítő
-indító héjprogram megírása nem jelenthet gondot.Néhány felirat és gomb. De hogyan futtatunk programot? Sajnos a Delphi-ben nincs egyszer
ű
programfuttatórutin, ellenben a Delphi Demos\Doc\Filemanex könyvtárában található egy fmxutils.pas nev
ű
unit, melyet a Binkönyvtárba másolva, a programunk uses-listájába írva használatba is vehetünk. Ebben találunk egy ExecuteFile
függvényt, amellyel már könnyedén futtathatunk bármit (egyébként használhatnánk a ShellExecute APIfüggvényt is, de ez egyszer
ű
bb). Egy dologra viszont nagyon oda kell figyelni: ha automatikusan indul a CD-nlév
ő
héjprogram, nem biztos, hogy a Windows a CD gyökérkönyvtárából futtatja. Ezért a futtatni kívánt telepítő
fájlnevét célszerű
a héjprogram fájlnevébő
l kiszámítani. Kiváló eszköz erre a nulladik paraméter (ParamStr(0)).Ez ugyanis mindig a teljes fájlnév. Ebb
ő
l az ExtractFilePath függvénnyel kivesszük a könyvtárnevet, ígymegkapjuk a héjprogram könyvárát (a héjprogramot a CD gyökérkönyvtárában érdemes elhelyezni). Ebb
ő
l márkönnyen megvan a futtatni kívánt telepít
ő
teljes fájlneve.
ExecuteFile(ExtractFilePath(ParamStr(0))+ 'Telepítő
\Setup.exe',
'', ExtractFilePath(ParamStr(0)),0);
Így ez a következő
fájlt futtatja (ha a program helye D:\ ): D:\Telepít ő
\Setup.exe.Most már csak azt kell megoldani, hogy a héjprogramunk automatikusan induljon. A CD
gyökérkönyvtárában létre kell hozni egy autorun.inf nevű
állományt, amelynek a következő
sorokat kell
tartalmaznia:[autorun]
OPEN=Program.exe
Ha pedig ikont is szeretnénk (amit szintén a CD gyökerében helyezhetünk el):
ICON=Ikon.ico
vagy használhatjuk a programunk ikonját is:
ICON=Program.exe,0
A leírtak alapján már bárki elkezdhet telepítő
t készíteni. Egy jó tanács azonban elkél: Mindig próbáld kia telepít
ő
t, mielő
tt kiadod a kezedbő
l!
VI. Lezárás
Az adatbázis-kezelő
alkalmazások fejlesztésének rögös útján könnyű
elbukni. Az ember mindig a sajáttapasztalataiból (és f
ő
leg kárából) tanul a legjobban. Nincs olyan könyv vagy kiadvány, ami minden speciálisproblémával foglalkozna. Korunkban viszont egyre inkább a speciális, lokalizált, a felhasználó igényeire szabottrendszerekre van szükség. Az általános szoftverek ideje lejárt. Azokat már megírták mások (többek is). A maiprogramozóknak két lehet
ő
ségük van: vagy beolvadnak egy szoftvercégbe, és ott fejlesztik sokadmagukkal akülönböz
ő
általánosabbnak mondható alkalmazásokat, vagy egyéni vállalkozásba fognak, és speciális, egyediproblémák megoldására szakosodnak.
Zárásként nem áll szándékomban okoskodni, és elmondani, „miért jó ez a dolgozat” és „milyen
tanulságai vannak”. Ezt az Olvasóra bízom. Én csupán azt remélem, sikerült átadnom azt, amit szerettem volna.Remélem dolgozatom elérte célját, és a Kedves Olvasó talált benne olyat, ami a hasznára vált.
Köszönöm.
7/18/2019 Molnár Roland - Adatbázis-kezelő Rendszerek Fejlesztése Delphi Nyelven (2002, 32 Oldal)
http://slidepdf.com/reader/full/molnar-roland-adatbazis-kezelo-rendszerek-fejlesztese-delphi-nyelven 32/32
Irodalomjegyzék
1. Borland Delphi 5.0 Online Help (beleértve a BDE Help-et és a Win32 Programmers Reference-et is)2. Szelezsán János: Adatbázisok, LSI Oktatóközpont, Budapest3. Halassy Béla: Az adatbázistervezés alapjai és titkai, IDG Magyarországi Lapkiadó Kft., Budapest, 19944. Thomas Binzinger: Delphi, Kossuth Kiadó, 19985. Dr. Szabó László: A Delphi 2.0-ról röviden, oktatási segédlet, Miskolc, 20006. Marco Cantú: Delphi 3 mesteri szinten, I-II. kötet, Kiskapu Kiadó, Budapest, 19987. Gray Cornell: Delphi tippek és trükkök, Panem Kft., Budapest, 1997
Ajánlott Internet-címek:- Delphi Software Online: www.animare.hu/dso- Magyar Delphi levelez
ő
lista: www.szechenyi-nkzsa.sulinet.hu/delphi- Borland Magyarország: www.borland.hu- Borland Home Page: www.borland.com- Deplhi HomePage: www.borland.com/delphi/index.html- Deplhi Developer Support: www.borland.com/devsupport/delphi/