Ígéretemhez híven ebben a részben nekilátunk az adatbázis-kezelő komponensek mélyebb megismeréséhez. Először az adatelérési komponenseket vesézzük ki, majd ezt követik az adat megjelenítési komponensek.

Adatelérési komponensek (Data Access Components)

Az adatelérési komponensek a Data Acces palettán találhatók. Ezek a Table, a Query és a StoredProcs. A Table komponens az adatbázis egy fizikai táblájának elérésére szolgál. (Mint tudjuk egy adatbázis általában több táblából áll, melyek között gyakran különféle relációk vannak. Ilyenkor több Table komponens használatára lehet szükség.) A Query komponenssel különféle SQL utasításokat adhatunk meg, és lekérdezéseket futtathatunk. A StoredProcs komponens tárolt eljárások futtatására alkalmas.

Mint már említettem, az adatelérési komponensek a TDataset osztály leszármazottai, így jó néhány közös örökölt tulajdonsággal (property), metódussal és eseménnyel (event) rendelkeznek, ezért az ezután tárgyaltak mindhárom adatelérési komponensre vonatkoznak.

Az adatelérési komponensek a Tdataset leszármazottai. (A TClientDataset-ről majd később)

Most lássuk a leggyakrabban használt közös tulajdonságok, metódusok, események listáját, utána pedig részletesebben megnézzük hogy mi mire is jó valójában.

Fontosabb közös tulajdonságok (property-k):

 
Property

 
Leírás

 
Active
Egy adathalmaz megnyitásra, zárására szolgál. Ha True, akkor van nyitva az adathalmaz, egyébként zárva.
Bof
Értéke True, ha a kurzor az adathalmaz elején van, egyébként False.
CachedUpdates
Ha True, akkor az adatbázison történő módosítások egy cache-ben maradnak a kliens gépen, és egy tranzakció keretében egyszerre lehet a módosításokat érvényesíteni. Ha False, akkor minden módosítás azonnal az adatbázisban is megtörténik.
CanModify
Azt jelzi, hogy módosítható-e az adathalmaz adata.
DataSource
Annak a DataSource komponensnek a neve, amely az adathalmazhoz kapcsolódik (már ha van ilyen).
DatabaseName
Az adatbázis neve, melyhez kapcsolódik a komponens. (lehet fizikai út, vagy alias)
Eof
Értéke True, ha a kurzor az adathalmaz végén van, egyébként False.
FieldCount
Az adathalmaz mezőinek számát adja.
Fields
Egy tömb, mely Tfield objektumokat tartalmaz.
Filter
Szűrési feltétel adható meg, az adathalmaz rekordjaira.
Filtered
Ha True, akkor csak a szűrési feltételnek megfelelő rekordok jelennek meg, a False akkor az összes rekord
FilterOptions
A szűrés tulajdonságainak beállítása. 
Found
Jelzi, ha egy keresés sikeres volt.
Modified
Jelzi, ha egy rekord módosítása megtörtént.
Name
A komponens neve.
RecNo
Az aktuális rekord számát adja vissza az adathalmazban.
RecordCount
Az adathalmaz összes rekordjának számát adja.
State
Az adathalmaz aktuális állapotát jelzi (pl. dsEdit, dsInsert stb)

Fontosabb közös metódusok (method):
 

Method
Leirás
Append
Létrehoz egy üres rekordot és az adatbázis végéhez fűzi.
AppendRecord
Létrehoz egy üres rekordot és azt feltölti az átadott értékekkel.
Cancel
Egy rekord editálásánál lehet érvényteleníteni a módosításokat.
ClearFields
Törli az adott rekord összes mezőjének értékét. 
Close
Az adathalmaz lezárása.
Delete
Törli az aktuális rekordot.
DisableControls
Letiltja az adatelérési és az adat-megjelenítés komponens közötti kapcsolatot.
Edit
Engedélyezi az aktuális rekord editálását.
EnableControls
Engedélyezi az adatelérési és adat-megjelenítési komponens közötti kapcsolatot.
FieldByName
A megadott mezőnév Tfield komponensére hivatkozhatunk a segítségével.
FindFirst
Megkeresi a szűrési feltételnek megfelelő első rekordot.
FindNext
Megkeresi a szűrési feltételnek megfelelő következő rekordot.
FindLast
Megkeresi a szűrési feltételnek megfelelő utolsó rekordot.
FindPrior
Megkeresi azt a megelőző rekordot, amely megfelel az aktuális szűrési feltételnek.
First
A kurzort az adathalmaz első rekordjára állítja.
FreeBookmark
Könyvjelző létrehozásakor lefoglalt memória felszabadítására szolgál.
GetBookmark
Az aktuális rekordon elhelyez egy könyvjelzőt.
GetFieldNames
Visszaadja egy adathalmaz mezőinek nevét egy string-listában.
GotoBookmark
A megadott könyvjelző által jelölt rekordra ugrik.
Insert
Beszúr egy rekordot az adathalmazba, az aktuális pozícióban.
InsertRecord
Beszúr egy rekordot és feltölti az átadott értékekkel.
Last
Az adathalmaz utolsó rekordjára ugrik.
Locate
Keresést valósít meg. Ha van találat, a feltételnek eleget tevő rekord lesz az aktuális.
Lookup
Keresés, amely a keresett értéket adja vissza, a rekordmutató nem mozdul el.
MoveBy
A rekordmutatót az aktuális pozícióból megadott értékkel elmozgatja.
Next
A rekordmutatót a következő rekordra viszi.
Open
Megnyit egy adathalmazt.
Post
Editálás után ezzel a metódussal lehet az adatok módosítását véglegesíteni.
Prior
A rekordmutatót a megelőző rekordra viszi.
Refresh
Az adathalmaz által reprezentált adatokat frissíti az adatbázisból.
SetFields
Egy adathalmaz egy rekordjának összes mezőjét egyszerre lehet módosítani a metódus segítségével.

Fontosabb közös események (events):
 

Event
Leirás
AfterCancel
Rekord editálásakor Cancel után hívódik meg.
AfterClose
Adathalmaz zárása után generálódik.
AfterDelete
Rekord törlése után generálódik.
AfterEdit
Rekord editálása után generálódik.
AfterInsert
Rekord beszúrása után generálódik.
AfterOpen
Adathalmaz megnyitása után generálódik.
AfterPost
Egy rekord módosításának Post-olása után generálódik.
BeforeCancel
Rekord editálásakor Cancel előtt hívódik meg.
BeforeClose
Adathalmaz lezárása előtt generálódik.
BeforeDelete
Rekord törlése előtt generálódik.
BeforeEdit
Azelőtt generálódik, mielőtt egy adathalmaz editálható állapotba kerülne.
BeforeInsert
Rekord beszúrása előtt generálódik.
BeforeOpen
Azelőtt generálódik, mielőtt egy adathalmaz megnyitott állapotba kerül.
BeforePost
A Post metódus meghívása előtt generálódik.
OnCalcFields
Egy mező számításakor generálódik. (ide kell elhelyezni a képletet, ami a számított mező értékét számolja)
OnDeleteError
Egy rekord törlésének hibájakor generálódik.
OnEditError
Akkor generálódik, ha editálásnál valami hiba lép fel.
OnFilterRecord
Adathalmazok szűrésére használjuk.
OnNewRecord
Egy új rekord felvitelekor generálódik.
OnPostError
Akkor generálódik, ha a Post metódus meghívásakor hiba lép fel.
OnUpdateError
Akkor generálódik, ha akkor lép fel hiba, miközben a Cached Updates-el adatokat töltünk fel az adatbázisba.
OnUpdateRecord
Akkor generálódik, amikor a Cached Updates egy rekordot módosít.

Adathalmazok állapotai

Egy adathalmaz mindig egy adott állapotban van. Az aktuális állapotot az határozza meg, hogy éppen "mi történik" az adathalmazzal. Az alapeset az, amikor egy adathalmaz nincs megnyitva, vagyis dsInactive állapotban van. Megnyitás után dsBrowse állapotba kerül. Insert vagy Append hatására, (amikor egy új rekordot veszünk fel az adathalmazba) a dsInsert állapotot veszi fel. Az Edit metódus meghívásakor pedig (amikor egy rekordot módosítunk) a dsEdit lesz az adathalmaz állapota. A dsInsert
vagy dsEdit állapotból a Post, Cancel vagy Delete metódussal térhetünk vissza dsBrowse állapotba. Az éppen aktuális állapotot a State property tartalmazza.

A következő ábra a lehetséges állapotokat és azokat a metódusokat tartalmazza, amelyek ezeket az állapotokat kiváltják.

Adathalmaz nyitása, zárása, adathalmazon belüli pozicionálás

Egy adathalmazt megnyitni az Open metódussal vagy az Active property True-ra váltásával lehet, a lezárására pedig a Close metódus vagy az Active property False-ra állítása szolgál. Lehetőség van már tervezési időben megnyitni egy adathalmazt, és így annak tartalma már a program írása közben látható lesz.

Egy adathalmaz esetén a rekordmutató mindig egy, az éppen aktuális rekordra mutat. A program futása során mindig csak az éppen aktuális, a rekordmutató által kijelölt rekordon tudunk különböző műveleteket végezni. (pl. kiolvasni az értékét, adatot felvinni a rekordba, törölni azt stb.) A rekordmutató mozgatására több különböző metódus létezik. Ezek a következők:

First: a rekordmutatót az első rekordra viszi
Last: a rekordmutatót az utolsó rekordra viszi
Next: a rekordmutatót a következő rekordra viszi
Prior: a rekordmutatót a megelőző rekordra viszi
MoveBy: a rekordmutatót megadott értékkel elmozgatja az aktuális pozícióból

A következő kis programrészlet egy adathalmaz ciklikus feldolgozására ad példát. Először a tábla legelső rekordjára ugrik, majd egyesével lépkedve minden egyes rekord ERTEK mezőjét 5-re állítja. Ezt addig folytatja, míg el nem fogy az összes rekord.

With Table1 Do

   Begin
      First;    {Rekordmutató pozicionálása az első rekordra}
While not EOF Do
      Begin
       Edit;  {Az adathalmaz dsEdit módba állitása}
       FieldByName('ERTEK').AsInteger:=5; {Az értékadás az ERTEK mező-nek}
       Post;  {A módositások elmentése}
       Next;   {Ugrás a következő rekordra}
      End;
   End;

Adathalmaz mezői

Egy adathalmaz minden mezőjéhez tartozik egy Tfield objektum. Ezen objektum segítségével a mező számos tulajdonsága beállítható, pl. az hogy merre legyen igazítva a mezőben az érték (Alignment), vagy hogy mi jelenjen meg a mező neveként (Displaylabel) stb. Alapesetben, ha megnyitunk egy adathalmazt, akkor automatikusan létrejön minden mezőhöz az őt reprezentáló Tfield objektum. Ha azonban meg szeretnénk változtatni egy mező néhány tulajdonságát, vagy egy adathalmazból nincs szükség az összes mezőre, akkor használjuk a Field Editort, amivel ún. prezisztens mezőket hozhatunk létre.

Mezőobjektumok

A mezőobjektumok a Tfield osztály leszármazottai. Azt, hogy egy mezőhöz milyen mezőobjektum tartozik, a mező típusa határozza meg. Pl. karakteres mezőhöz TstringField, numerikushoz TintegerField stb. tartozhat. Egy mezőre többféleképpen lehet hivatkozni, a hozzá tartozó mezőobjektum segítségével, mégpedig a következőképpen:

A mezőnév alapján a FieldValues property vagy a FieldByName metódus segítségével

Pl.:

Table1.FieldValues['VAROS']:='Budapest';
Table1.FieldByName('VAROS').Value:='Szeged';

A Fields tömb segítségével

Pl.: Table1.Fields[0].Value:=152;

A mezőobjektum neve alapján (a mezőobjektum neve az adathalmaz és a mező nevéből képződik)

Pl.: Table1NAME.Value:='Jonny';

Mezőobjektumok fontosabb tulajdonságai:
 

Property
Leírás
Alignment
Mező tartalmának igazítása megjelenítési komponensen belül.
ConstraintErrorMessage
Ha a CustomConstraint jellemzőbe írt feltétel nem teljesül, az ide írt szöveg jelenik meg. Pl. "Csak 'I' vagy 'N' irható be!"
CustomConstraint
Csak az itt megadott feltételnek megfelelő értékek írhatók be a mezőbe (mezőszintű ellenőrzés).
DefaulExpression
Alapértelmezett érték adható meg egy új mező felvitelekor. Tehát ha egy új rekordot viszünk fel az adathalmazba, és nem adunk neki értéket a mezőnek, akkor az itt beállított értéket veszi fel a mező.
DisplayFormat
Megjelenítéskor formátum adható meg. Pl.: "0 db" esetén a nulla helyére behelyettesíti az aktuális mezőértéket, és mindig utána írja a "db" szót.
DisplayLabel
A mező címkéje. Ez jelenik meg például DBGrid-ben a fejlécként.
DisplayWidth
A mező szélessége.
EditMask
Bemeneti-maszk editáláskor.
EditFormat
Editáláskor formátum adható meg. Pl.: "0 db" esetén a nulla helyére behelyettesíti az aktuális mezőértéket, és mindig utána írja a "db" szót.
FieldName
A mező táblabeli neve.
IsNull
Le lehet kérdezni, hogy egy mező üres-e
MinValue
Számok esetén a mező megengedett értékének alsó határa adható meg vele.
MaxValue
Számok esetén a mező megengedett értékének felső határa adható meg vele.
Name
A mezőobjektum neve.
ReadOnly
Ha True, akkor csak olvasható, nem szerkeszthető a mező
Requied
Ha True, akkor új rekord felvétele esetén az adott mezőt nem lehet üresen hagyni, mindig értéket kell kapnia.
Value
Egy mező értékét olvashatjuk ki, vagy írhatjuk a property-n keresztül.
Visible
A mező láthatóságát állíthatjuk be vele.

Field Editor

Egy adatelérési komponensen kettőt kattintva, vagy jobb gombot nyomva és a Field Editor menüt választva jelenik meg a mezőszerkesztő. Ez alapesetben üres. Újabb jobb gomb hatására bejön egy menü, ahol mezőket adhatunk az adathalmazhoz, törölhetünk belőle, származtatott mezőket hozhatunk létre, és különféle editálásra nyílik lehetőségünk. A mezőszerkesztőben lévő mezők közül tetszőlegeset kiválasztva, az Object Inspektorban megjelennek az adott mezőhöz tartozó Tfield objektum tulajdonságai, eseményei, amiket ezután tetszés szerint beállíthatunk a megfelelő értékekre.

Származtatott mezők

Két féle származtatott mezőt hozhatunk létre.
 

  1. Lookup Fields (Kikeresett mezők) Olyan mező, amelynek értékét egy másik táblából keressük ki. Pl. adott egy árucikkeket tartalmazó tábla, amelyben egy kétbetűs azonosító jelzi az adott árucikkhez tartózó szállítót, és van egy másik tábla, amely csak a szállítókat tartalmazza. Ekkor az azonosító alapján a program mindig kikeresi a megfelelő árucikkhez az adott szállító szükséges adatait. (pl név, cím stb.)
  2. Calculated Fields (Számított mező) Értéke nem szerepel a táblában, a program meglévő mezők értékeiből fogja kiszámolni. Pl. ha megvan a nettó ár és az áfa, akkor fölösleges a bruttó árat tárolni, csak fölöslegesen növelnénk a tábla méretét redundanciát okozva, mert azt ki lehet számolni az előző kettőből.
Lookup Fields (Kikeresett mezők) létrehozása

Kikeresett mezőt a Field Editorral hozhatunk létre. Két táblára lesz szükségünk, az egyik az alaptábla, amelyben létrehozzuk az új mezőt, a másik, amelyikből származtatjuk a létrehozott mező értékeit. Ehhez a Delphi-hez adott példa táblákat használjuk fel. Indítsunk egy új projectet, és tegyünk két Table, egy DataSource és egy DBGrid komponenset a Form-ra. A DatabaseName legyen a DBDEMOS, az egyik táblát irányítsuk az items.db-re, a másikat a parts.db-re. Az items tábla mezőit jelenítsük meg a rácsban. Ehhez a DataSource komponens DataSet property-ét állítsuk az items.db-re irányított táblára, a DBGrid DataSource property-ét az adatforrás komponensre. Mindkét táblát állítsuk aktívra, ekkor a rácsban meg kell jelennie az items táblának. Az items táblában létrehozunk egy számított mezőt, ami a parts táblából a leírást (description mező) tartalmazza. Ehhez kattintsunk duplán az items táblára irányított table komponensre, hogy bejöjjön a mezőszerkesztő. Itt jobb gombot nyomva, bejön egy menü, ahol válasszuk az Add Fields menüt, és adjuk az összes mezőt az adathalmazhoz. Ha ez megvan, újabb jobb gomb után válasszuk a New Field menüt.

Ezután a következő dolgokat állítsuk be:

Számított mező típusa - Field Type: LookUp

Neve -Name: Leírás
Típusa -Type: String
Mérete -Size: 40
Kapcsolódó mező az alaptáblából - Key Fields: PartNo
Kapcsolódó mező a keresőtáblából - LookUp Keys: PartNo
A keresőtábla neve - Dataset: annak a Table komponensnek a neve, melyet a parts táblára állítottunk
A mező neve, amelynek az értékére szükség van - Resul Field: Description

Ha ezzel megvagyunk, OK gombot nyomva, máris meg kell hogy jelenjen a rácsban egy új, Leírás nevű mező.

Calculated Fields (Számitott mezők létrehozása)

Számított mező létrehozásához a mezőszerkesztőben a New Field menüpontban a Field Type Calculated legyen. Ezen kívül még a mező nevét és típusát kell megadnunk. Az új mező kiszámításának képletét a tábla OnCalcFields eseményjellemzőjébe kell beírni.

Kezdjünk egy új projectet. Tegyünk a form-ra egy Table, egy DataSource, és egy DBGrid komponenst. A DatabaseName legyen a DBDEMOS, a TableName most a clients.dbf. Az előbbihez hasonló módon jelenítsük meg a rácsban a table tartalmát. A mezőszerkesztőben a Field Type legyen Calculated, a neve pedig NEV. A Table OnCalcField eseményébe írjuk be a következő kis kódot:

   Dataset.FieldByName('NEV').AsString:=
      Dataset.FieldByNAme('FIRST_NAME').AsString+
         ' '+Dataset.FieldByNAme('LAST_NAME').AsString;
 

Ha mindent jól csináltunk, akkor miközben futtatjuk a programot a rácsban meg kell jelennie egy NEV mezőnek, ami a teljes nevet állítja elő egy számított mezőben a kereszt és a vezetéknév alapján.

Rekordokon végzett műveletek

Rekord szerkesztése

Egy rekord nem minden esetben szerkeszthető. Ha pl. egy táblát csak olvashatóként nyitottunk meg, vagy egy másik felhasználó zárolta előlünk az adott rekordot, akkor azt nem tudjuk szerkeszteni. Erről a CanModify property értékének megvizsgálásával győződhetünk meg. Ha a Canmodify property True, akkor szerkeszthető számunkra a rekord. Ahhoz hogy egy rekordot szerkeszthessünk, az adathalmazt dsEdit állapotba kell állítanunk az Edit metódus segítségével. Módosításaink elmentésére a Post metódus szolgál. Ha nem hívjuk meg a Post metódust, de átlépünk egy másik rekordra akkor is elmentődnek a módosítások. Ha valamilyen okból mégse akarjuk megtartani az új értékeket, akkor a Cancel metódus hatására megszakad az aktuális editálás és a rekord mezői megtartják régi értéküket. A SetField metódus segítségével az aktuális rekord összes mezője egyszerre módosítható.

Rekord Törlése

Egy rekord törlésére a Delete metódus szolgál. Pl. a Table1.Delete hatására törlődik az adatbázis tábla aktuális rekordja.

Új rekord felvitele

Új rekord felvitelére az append, appendrecord, insert, insertrecord metódusok szolgálnak. Az append egy új üres rekordot fűz az adathalmaz végéhez, az insert pedig a rekordmutató aktuális pozíciójába szúr be egy üres rekordot. Az appendrecord-ot és az insertrecordot használva megadhatók az új rekord mezőinek értéki is.

Új rekord felvitele Apend-det használva

With Table1 Do
Begin
Append;
FieldByName('NEV').AsString:= Edit1.Text;
FieldByName('CÍM').AsString:= Edit2.Text;
Post;
End;

Új rekord felvitele InsertRecordot használva

Table1.InsertRecord('Groszman','János',null, null, null);

Ha egy rekord egy mezőjét nem akarjuk feltölteni értékkel, akkor az érték helyett írjunk null-t az adott mező helyére.

Keresés az adathalmazban

A következő metódusok szolgálnak keresésre:

Locate

Ha van találat, akkor logikai igaz értéket ad vissza a metódus, és az első a keresési feltételnek eleget tevő rekordra áll a rekordmutató. Indexelt és index nélküli mezőkre is kereshetünk a segítségével. Két keresési opció beállítása lehetséges, az egyik hogy megkülönböztesse-e a kis és nagybetűket (loCaseInSensitive), illetve, hogy csak teljes egyezés esetén jelezzen találatot, vagy részleges egyezés esetén is (loPartialKey). Arra is lehetőség van, hogy egyszerre több mezőre adjunk keresési feltételt.

Példák a Locate használatára:

With Table1 Do Begin If  Locate('LAST_NAME','László',[loCaseInSensitive]) Then   {a LAST_NAME mezőben keressük a László nevet,     nem különböztetjük meg a kis és nagybetűket}       Begin       {Találat esetén itt dolgozhatjuk fel a rekordot.}       End       Else ShowMessage('Nincs találat!');

Keresés két feltétellel:

With Table1 Do
Begin
If  Locate('LAST_NAME;FIRST_NAME', VarArrayOf(['Szabina','Kis']),[loCaseInSensitive]) Then
{Mivel két értéket kell átadnunk, a VarArrayOf függvénnyel létrehozunk egy Variant tömböt.
      Begin
      {Találat esetén itt dolgozhatjuk fel a rekordot}
      End
      Else ShowMessage('Nincs találat!');

LookUp

A LookUp nem mozgatja el a rekordmutatót, hanem a keresett mező értékét adja vissza, egyébként úgy működik mint a Locate.

Lakhely:=Table1.LookUp('LAST_NAME','Anita','City');

{Kikeressük, hogy hol lakik az Anita nevű barátnőnk}

FindKey

Ez a metódus csak a Table komponensnél használható. Az aktuális index oszlopában keres a megadott feltétel szerint. A Locate-hez hasonlóan találat esetén a rekordmutatót az adott rekordra mozgatja és logikai igaz értékkel tér vissza.

With Table1 Do Begin If FindKey(['Pécs']) Then       Begin       {Találat esetén itt dolgozhatjuk fel a rekordot}       End       Else ShowMessage('Nincs találat!');

FindNearest

Ez a metódus is csak a Table komponensnél használható. Hozzávetőleges keresést végez az aktuálisan indexelt oszlopban. Mindig van találat, hiszen ha nincs is meg a pontos kifejezés, az ahhoz legközelebbi rekordra áll.

With Table1 Do Begin If FindNearest(['Pécs']) Then       Begin       {Találat esetén itt dolgozhatjuk fel a rekordot}       End       Else ShowMessage('Nincs találat!');

Adathalamazok szűrése

Ha egy adathalmaz tartalmát valamilyen szempont szerint le kell szűkítenünk, pl. csak a Pécs lakhelyűeket akarjuk megjeleníteni a barátainkat tartalmazó adathalmazból, akkor szűrést kell alkalmaznunk. Erre Delphiben két féle lehetőségünk van. Vagy a Filter property segítségével, vagy pedig az OnFilterRecord eseményjellemző felhasználásával.

Ha a Filter property-t használjuk, akkor meg kell adni azt a kifejezést, ami alapján szűrjük az adathalmazt, és a Filtered jellemzőt true-ra kell állítani.

A következő operátorokat használhatjuk:

 
Operátor
Jelentése
<
Kisebb mint
>
Nagyobb mint
=
Egyenlő
<>
Nem egyenlő
>=
Nagyobb vagy egyenlő
<=
Kisebb vagy egyenlő
AND, OR, NOT
Logikai operátorok

Egy pár példa filter kifejezésre:

  VAROS = 'Pécs'   VAROS = 'Pécs' and DATUM < '1/1/99'   VAROS = 'Pécs' and DATUM > '1/1/99'   VAROS = 'P*'

Ahhoz, hogy a szűrési feltételünk életbe lépjen, a Filtered property-t ne felejtsük True-ra állítani.

Lehetőség van arra, hogy bizonyos beállításokkal befolyásoljuk a szűrés folyamatát. Erre az FilterOption property kell felhasználnunk. A foCaseInSensitive hatására a szűrés folyamán nem lesznek megkülönböztetve a kis és nagybetűk. Ha a FilterOptions halmaznak eleme a foNoPartialCompare is, akkor ha a feltételben * karaktert használunk, az joker karakterként fog funkcionálni, egyébként sima * karakternek számit.

A másik lehetőség, hogy adathalmazunkat szűrjük, az OnFilterRecord eseményjellemző használata.

Az OnFilterRecord eseményjellemzőt használva lehetőség nyílik arra, hogy egy rekordon belül különböző mezőértékeket hasonlítunk össze. Az eseményjellemzőt használva vigyázni kell arra, hogy ne végezzünk olyan műveletet, ami az esemény ismételt bekövetkezéséhez vezetne.

Példa az OnFilterRecord használatára:

procedure TForm1.Table1FilterRecord(DataSet: TDataSet;     var Accept: Boolean);   var     Ertek : Integer;   begin     Ertek := Table1.FieldByName(`CustNo').Value;     Accept := (Ertek = 1384);   end;

Ahhoz, hogy ez a módszer működjön, szintén igazra kell állítani a Filtered property-t.

Ha egy szűrt adathalmazban akarunk keresni, akkor használhatóak a következő metódusok:

FindFirst - az első szűrési feltételnek megfelelő rekordot keresi
FindNext - a soron következő szűrési feltételnek megfelelő rekordot keresi
FindPrior - a megelőző szűrési feltételnek megfelelő rekordot keresi
FindLast - az utolsó szűrési feltételnek megfelelő rekordot keresi

A Table komponens

A Table komponens használata a legegyszerűbb és leggyorsabb módja egy adatbázis egy táblájának elérésének. A komponens gyakorlatilag az adatbázis egy fizikai tábláját reprezentálja. A Table komponens a TdataSet osztály leszármazottja, de számos olyan új tulajdonsággal és metódussal rendelkezik, amivel az ős nem.

Ahhoz, hogy egy táblához kapcsolódjunk, a következő dolgokat kell tennünk:

  1. Be kell állítani a DatabaseName tulajdonságban az adatbázis aliasát, vagy lokális adatbázisok esetén annak az elérési útját
  2. A TableName tulajdonságban be kell állítani annak a táblának a nevét, amelyet a komponens reprezentál az adatbázisból.
  3. Az Active property-t True-ra kell állítani.
Fontosabb tulajdonságok:

 
Property
Leirás
Exclusive
Az adatbázis zárolása, ha True akkor másik alkalmazás nem férhet hozzá a tábla adataihoz.
IndexDefs
Információt tartalmaz a tábla indexeiről.
IndexFieldCount
Az adott indexkulcsban lévő mezők számát adja.
IndexFieldNames
Az indexben szereplő mezők felsorolása
IndexFields
Tfield típusú tömb, egy index mezőiről tartalmaz információkat.
IndexName
Egy létező index nevének megadására szolgál. (az itt beállított index szerinti lesz a rendezettség)
MasterFields
Master-detail kapcsolatban itt kell beállítani a kapcsolatot felépítő mezőket.
MasterSource
Master-detail kapcsolatban, ha ez a tábla egy segédtábla, akkor ebben a property-ben kell beállítani azt az adatforrást, ami a főtáblára van állítva.
ReadOnly
Ha True, a tábla nem szerkeszthető, csak olvasható.
TableName
A fizikai tábla neve, amit a komponens reprezentál.
TableType
Tábla típusa (pl. Paradox, dBASE).

Fontosabb metódusok:
 

Metódus
Leirás
AddIndex
Új indexet hoz létre a táblához.
BatchMove
Rekordok másolása egy másik táblából ebbe a táblába.
CreateTable
Tábla létrehozása.
DeleteIndex
Töröl egy indexet.
DeleteTable
Törli a táblát.
EmptyTable
Törli a tábla összes rekordját
GetIndexNames
Lista az adathalmaz indexeiről.
GotoKey
Megadott kulcs szerinti rekordra mozgatja a rekordmutatót.
GotoNearest
A kurzort a kulcshoz legközelebbi rekordra mozgatja.
LockTable
A tábla zárolása.
RenameTable
Tábla átnevezése.
SetKey
Engedélyezi kulcs beállítását az adathalmazhoz.
UnlockTable
Megszünteti a tábla zárolását.

Master-detail kapcsolat

Tegyük fel, hogy van egy megrendeléseket tartalmazó táblánk, amelynek egy-egy rekordja tartalmaz egy rendelési azonosítót, a teljesítés dátumát, a rendelés összértékét, a megrendelő nevét stb. Egy megrendelésnek ugyebár vannak tételei is, ezeket érdemes egy külön táblában eltárolni. Ennek a külön táblának egy-egy rekordja tartalmazza egy adott árucikk adatait, és azt a rendelési azonosítót, ami a fő táblában is megtalálható, ugyanis ezen azonosító alapján tudunk kapcsolatot létesíteni a két tábla között. Tehát a segédtáblában annyiszor szerepel a rendelési azonosító, ahány különböző árucikket rendelünk. Ez egy a többhöz kapcsolat a két tábla között. A master-detail kapcsolatban gyakorlatilag a főtáblából vett azonosító alapján szűrjük a melléktáblát, és csak a feltételnek megfelelő rekordok jelennek meg belőle. Ahhoz, hogy a kapcsolatot létre tudjuk hozni, a segédtábla kapcsolódó mezőjének indexeltnek kell lennie.

A most következő példában az egyik tábla az ügyfeleinket, a másik a hozzájuk tartozó rendeléseket tartalmazza.
 

  • Kezdjünk egy új projectet
  • Tegyünk egy Table komponenst a Form-ra és állítsuk be a következő tulajdonságokat:
  • Name: MasterTable
    DatabaseName: DBDEMOS
    TableName: customer.db
    Active: True
  • Tegyünk egy DataSource komponenst a Formra, neve legyen MasterSource, a Dataset pedig MasterTable
  • Most egy DBGrid, és egy DBNavigator komponens következik (a Data Controls palettán találjuk őket), a DataSource property legyen a MasterSource.
  • Tegyünk egy újabb Table komponenst a Form-ra a következő tulajdonságokkal:
  • Name: DetailTable
    DatabaseName: DBDEMOS
    TableName: orders.db
    Active: True
  • Újabb Datasource komponens következik, a neve legyen DetailSource, a DataSet pedig DetailTable.
  • Még egy DBGrid komponens van hátra, amit állítsunk a DetailTable-ra. (a DataSource property-t állítsuk a DetaliSource komponensre)
  • Ha idáig mindent jól csináltunk, akkor az egyik rácsban a customer.db tábla tartalma jelent meg (ez tartalmazza az ügyfeleink adatait), a másikban az orders.db tábla tartalma (ez pedig az ügyfeleink rendeléseit). Most létre kell hoznunk a két tábla között a kapcsolatot, hogy a rendelések táblából (orders.db) csak az aktuális ügyfél rendelései jelenjenek meg, ne pedig az összes. A kapcsolatot mindig a segédtábla felől kezdeményezzük. Ehhez, a DetailTable komponensen kattintsunk a MasterSource propety-re és állítsuk be a MasterSource adatforrás komponenst.
  • a ez megvan, még a MasterField property beállítására van szükség. Kattintsunk a MasterField tulajdonságra, ekkor bejön a Field Link Designer. Itt az Available Indexes legördülő menüben válasszuk a CustNo indexet (hiszen a CustNo lesz a kapcsolódó mező). Ezután a Detail Fields és a Master Fields listában válasszuk a CustNo mezőket, majd nyomjuk meg az Add gombot. Ekkor a Joined Fields ablakban már látható is a két mező közötti kapcsolat. Ezt követően Ok gombot nyomva, máris létrejött a kapcsolat a két tábla között
Munkánk eredményének valahogy így kell kinéznie:

Látható, hogy a második táblában csak azok a megrendelések jelennek meg, melyeknek az ügyfél azonosítója megegyezik a főtáblában lévő, aktuális rekordhoz tartozó ügyfél azonosítóval.

A következő részt egy példával kezdjük, amiben igyekszem minél többet bemutatni a fentebb tárgyalt lehetőségek közül.