Delphi - Database methoden en events
1.TTable methoden, properties en
events
1.1 Navigeren door een dataset
1.2 Zoeken in een dataset
1.3 Het muteren van een dataset
1.4 Het beperken van het aantal records d.m.v. filteren
1.5 TTable events
2.
TQuery methoden, properties en events
2.1
Het instellen van een TQuery
Met Delphi kan je, zonder ook maar één regel te programmeren toch nog
vrij ingewikkelde database applicaties schrijven.
In de Object Repository van Delphi kan je zelfs binnen 5 minuten een database
applicatie maken m.b.v. een wizard,
niet alleen eenvoudige applicaties met één tabel, maar ook applicatie's met
gekoppelde tabellen. (Master-Detail).
Voor de echt zware applicatie's heb je object pascal nodig.
Dit paper bespreekt veel voorkomende methods en events van de diverse componenten,
zoals besproken in de vorige
paper van de tutorial, beginnend bij het TTable component.
1. TTable methoden, properties en events
Het TTable component is een belangrijk database component, en communiceert met
de fysiek tabel op schijf.
1.1 Navigeren door een dataset
Voordat er in een dataset genavigeerd kan worden moet deze eerst geopend worden middels de
method Open.
Table1.Open; Deze methode set de active property true. Middels de methode close kan een
dataset gesloten worden.
Met navigeren door een dataset bedoelen we het verplaatsen van de zogenaamde cursor.
De cursor wijst altijd het actieve record aan.
Middels ondergaande methods kan door een tabel genavigeerd worden :
Navigatie methoden |
||
| Methode | Functie | In code |
| First | Verplaatst de cursor naar het eerste record van de tabel | Table1.First; |
| Last | Verplaatst de cursor naar het laatste record van de tabel | Table1.Last; |
| Next | Verplaatst de cursor naar het volgende record in de tabel | Table1.Next; |
| Prior | Verplaatst de cursor naar het vorige record in de tabel | Table1.Prior; |
| MoveBy(x) | Verplaatst de cursor x positie's in de tabel (zowel + als -) | Table1.MoveBy(4); |
Bovenstaande methode benaderen de records op een indirecte manier, m.a.w. van te
voren weet je nooit exact welk record je
te zien krijgt. In de volgende paragraaf worden de methods besproken waarmee
gericht gezocht kan worden op bepaalde
records in een dataset.
Zoek methoden |
||
| Methode | Functie | Opmerking |
| SetKey | Zet een tabel in de zoekmodus voor het zoeken op een geindexeerd veld. | SetKey
wordt gebruikt in combinatie met GotoKey, GotoNearest, FindKey en FindNearest. (Zie
voorbeeld) Al deze methods werken op basis van een index veld. Zowel primary als secundary indexes. GotoNearest, Findnearest zijn procedures die altijd ietst vinden. GotoKey en Findkey zijn functie's dit True of False retourneren. |
| GotoKey | Verplaatst de cursor naar het gespecificeerde record | |
| GotoNearest | Als GotoKey maar dan naar de het record die het meest lijkt op de gezochte tekst. | |
| FindKey | Verplaatst de cursor naar het gespecificeerde record | |
| FindNearest | Als FindKey maar dan naar de het record die het meest lijkt op de gezochte tekst. | |
| Locate | Verplaatst de cursor naar een gespecificeerd record op basis van de opgegeven velden en waarden. | Deze functie werkt op alle velden, geindexeerd of niet. |
Voor we enkele voorbeelden over zoeken zien moeten we eerst nog kijken hoe een
waarde van een record-veld bekeken kan worden.
Zoals reeds eerder besproken kunnen individuele velden benaderd worden middels
methods van het type TField.
De velden in de lijst Fields kunnen benadert worden middels hun indexnummer alsware
het een array.
De indexnummers worden bepaald tijdens de uitvoer van het programma en kunnen op de
volgende manier gebruikt worden
om het veld uit te lezen : Label1.Caption : = Table1.Fields[0].value;
Het op deze manier benaderen van een tabel is niet erg handig, het is handiger om
de tabel te benaderen middels
hun veld- of kolomnaam. Dit kan met behulp van de method FieldByName.
De TTable Methode FieldByName geeft de waarde van een veld als type TField.
Onderstaande code toont hoe de verschillende
zoekmethoden werken :
Het uitlezen van een veldwaarde :
Table1.Open;//Open the dataset by setting the active property to true
aText := Table1.FieldByName('Name').AsString;
Table1.Close;
Zoeken met SetKey, GotoKey, FindKey, GotoNearest, FindNearest in Table1: With Table1 do
Begin
SetKey;
FieldByName('NAME').AsString := EditSearch.Text;//Search for this text
Zoek met GotoKey :
If GotoKey then
LabelResult.Caption := 'Found!';
else
LabelResult.Caption := 'Not found!' + FieldByName('NAME').AsString;
Zoek met FindKey :
If FindKey([EditSearch.Text]) then
LabelResult.Caption := 'Found!;
else
LabelResult.Caption := 'Not found!' + FieldByName('NAME').AsString;
Zoek met GotoNearest/FindNearest : FindNearest([EditSearch.Text]); {of GotoNearest; both find always something}
LabelResultaat.Caption := 'Found!' + FieldByName('NAME').AsString;
end; Zoek met Locate : if Locate('Name;Description;', VarArrayOf(['Borland', 'A nice tool']),
[loPartialKey]) then
LabelResultaat.Caption := 'Found!, cursor has moved to this record ' + FieldByName('NAME').AsString;
|
1.3 Het muteren van een dataset
Hieronder tref je de belangrijkste methoden waarmee de tabel bewerkt, of nieuwe records toegevoegd / verwijderd kunnen worden :
Bewerkingsmethoden |
||
| Methode | Functie | In code |
| Edit | Zet de tabel in de 'edit' mode | Table1.Edit; |
| Insert | Voegt een nieuw record aan de tabel toe | Table1.Insert; |
| Post | Schrijft wijzigingen in tabel naar schijf | Table1.Post; |
| Cancel | Breekt een edit/insert aktie af | Table1.Cancel; |
| Delete | Verwijdert het actieve record | Table1.Delete; |
Hieronder enkele code voorbeelden m.b.t tot het bewerken van een tabel :
Het toevoegen van een nieuw record :
With Table1 do
Begin
Insert; //Set the table in the insert mode
FieldByName('NAME').AsString := 'Delphi 4.0';//Fill in the values
FieldByName('STUDY').AsBoolean := True;
Post;
end;
Het Editten van een record : With Table1 do
Begin
Edit;//Set the table in the edit mode
FieldByName('NAME').AsString := 'Delphi 5.0';//Fill in the values
Post;
end;
|
De methode edit en insert zetten de database in een andere mode. Er bestaan
verschillende modes.
Middels de property State (Table1.State) kan je bepalen in wat voor mode de tabel
zich bevindt.
property State: TDataSetState;
De belangrijkste states van een dataset zijn hieronder opgenoemd :
Dataset states |
|
| State | Betekenis |
| dsInactive | Dataset is niet actief en er kunnen geen waarden getoond worden. |
| dsBrowse | Standard state wanneer er door de records gebrowsed wordt. |
| dsInsert | Er is een nieuw record ingevoegd (Insert) en de waarden zijn nog niet gepost. |
| dsEdit | De dataset is middels methode Edit in de edit state gebracht, data kan gewijzigd worden. |
| dsSetKey | Er kan gezocht worden. (Setkey) |
| dsCalcFields | Een OnCalcFields event wordt uitgevoerd. |
| dsFilter | Een OnFilterRecord event wordt uitgevoerd. Data kan niet gewijzigd worden. |
Naast deze states zijn er nog enkele 'interne' states welke door Delphi zelf gebruikt worden. (Zie Delphi Help)
Het gebruik van state property : If Table1.State in [dsEdit,dsInsert] then Table1.Post; |
1.4 Het beperken van het aantal records d.m.v.
filteren
Middels filteren kan het aantal records in een dataset beperkt worden.
Voor filteren zijn twee properties aanwezig te weten :
Filteren van een dataset properties |
|
| Property | Betekenis |
| Filter | Is een string waarmee de dataset gefiltered kan worden Bijv. Name = 'Delphi' (VeldNaam = waarde) |
| Filtered | Boolean waarmee het filter aan en uitgezet kan worden. |
De property Filter kan gebruikt worden om eenvoudige filters te zetten zoals
AANTAL > 100 etc.
Een andere manier is om een OnFilterRecord event te schrijven, waarmee
ingewikkelderde filters kunnen worden gemaakt.
Dit kan op de volgende manier :
Het filteren van een dataset mbv OnFilterRecord :
procedure TForm1.Table1FilterRecord(DataSet: TDataSet;
var Accept: Boolean);
begin
Accept := Table1.FieldByName('CATEGORY').AsString = 'Prog';
end; //Shows alle records with field Category's value 'Prog'
|
Omdat filteren record voor record geschiedt is dit niet erg snel. Vooral bij
applicaties die hun data over een netwerk moeten benaderen
kan dit de performance van de applicatie verminderen. Het is dan verstandiger om
met queries te gaan werken. (Hierover later meer)
TTable kent vele events. Het is ondoenlijk om deze hier allemaal te
bespreken. De meeste TTable events hebben betrekking op de methods
waarmee de tabel bewerkt kan worden. Hieronder een overzicht van enkele veel gebruikte
events en hun toepassing :
(Voor een overzicht van alle events zie de Delphi help file)
TTable Events |
||
| Methode | Events ( BeforeEvent - ExecutingMethode - AfterEvent) | Opmerking |
| Edit | BeforeEdit - Edit - AfterEdit | De before events starten voordat de dataset in de betreffende state komt. De After events starten nadat de dataset in de betreffende state is gekomen. Bijv. het invullen van standaard waarden van een record na een insert zou kunnen gebeuren in de AfterInsert event. |
| Insert | BeforeInsert - Insert - AfterInsert | |
| Post | BeforePost - Post - AfterPost | |
| Cancel | BeforeCancel - Cancel - AfterCancel | |
| Delete | BeforeDelete - Delete - AfterDelete | |
Probeer ze uit om de werking van deze events te doorgronden.
2. TQuery methoden, properties en events
Met het TQuery component kunnen SQL - query's op een TTable losgelaten worden.
Met de Structured Query Language (SQL) query's kan
je bijvoorbeeld een dataset efficiënt filteren op bepaalde waarden.
2.1 Het instellen van een TQuery (zie ook vorige
paper)
Een TQuery component lijkt erg veel op een TTable component, met dit verschil
dat een TQuery component een TTable component (de dataset) als
bron heeft, en dat middels SQL een bepaalde record range getoond kan worden.
Hieronder een overzicht van enkele properties, en waar ze voor gebruikt
kunnen worden :
TQuery properties |
|
| Property | Betekenis |
| DataBaseName | De database die als bron dient. |
| DataSource | De datasource die verbonden is met de dataset die als bron voor de query dient. |
| Params | Bevat een parameter lijst welke in de SQL code gebruikt kan worden. |
| SQL | Is van het type TStrings en bevat de SQL syntax. |
De Params property bevat een lijst met parameters die zich in de SQL property
bevinden. Deze parameters worden aangegeven middels de dubbelpunt
voor de parameter.
TQuery SQL property voorbeel :
With Query1.SQL do
begin
Add('SELECT * FROM Table');
Add('WHERE');
Add('NAME = :aParam'); // of NAME = 'Delphi'
end;
Een waarde aan de parameter toekennen in code :
Query1.ParamByName('aParam').AsString := 'Delphi';
Query1.Open;
|
Params geeft de mogelijkheid om nog flexibeler Query's te bouwen.
De method Close sluit de query.
Het resultaat van de query kan getoond worden door de normal dataware componenten
zoals een DBGrid. De component Query1 dient
hier voor als dataset ingesteld te worden op een Datasource die dient als bron voor
de DBGrid. (Zie ook vorige paper)
Nogmaals het overzicht :

Tot slot :
Het database gedeelte van Delphi is enorm groot. Met dit paper hebben we een klein
stukje hiervan belicht.
In het slot paper van deze tutorial gaan we een kleine applicatie bouwen.
Klik hier voor het volgende paper in deze tutorial : Delphi - database applicaties bouwen