Aplicatii cu baze de date īn Delphi
6.1. Introducere
Utilizānd Borland Database Engine (BDE), Delphi ofera capabilitati de comunicare cu lumea SGBD-urilor gen: Paradox, dBase, Access, FoxPro, servere SQL,etc. folosind īn acest scop un protocol de lucru unitar.
Realizarea aplicatiilor Delphi care implica utilizarea intensa a bazelor de date presupune īnvatarea acestui protocol unitar cāt si a elementelor suport disponibile īn VCL pentru realizarea aplicatiilor cu baze de date.
Pentru cei interesati ar fi de spus faptul ca editia standard a kitt-ului Delphi 5, de exemplu, nu contine capabilitati de tip "database conectivity". Editia profesionala furnizeaza capabilitati de acces la fisiere Paradox, dBase (īn mod nativ), Access, FoxPro si fisiere īn format text ASCII, la care se adauga deschidere catre surse de date ODBC si Local Interbase.
Delphi Enterprise, consruit peste Delphi Profesional, are deschidere catre Interbase, Microsoft SQL Server, Oracle, Informix Dynamic Server, Sybase Adaptive Server, DB2.
Exista destui specialisti care lauda Delphi pentru abilitatea de a aduce usor īn aplicatiile utilizator date provenind din "pestrita" lume a SGBD-urilor. Exista si specialisti care manifesta retinere fata de aceasta "frenezie" a mediilor vizuale de programare de a lua īn stapānire, cu pretentii din ce īn ce mai mari, universul aplicatiilor puternic marcate de prezenta bazelor de date. Nu avem timp de consideratii pe marginea "suferintelor" niciuneia dintre categoriile de specialisti mai sus mentionate. Ceea ce vom face īn continuare va fi un lucru foarte precis:
-īnvatarea universului conceptual cu care se opereaza īn Delphi, īn procesul de realizare a aplicatiilor cu baze de date;
-exemplificarea si comentarea elementelor de sintaxa Object Pascal, esentiale pentrru realizarea aplicatiilor cu baze de date;
-Prezentarea, daca este cazul, a componentelor direct implicate īn lucrul cu baze de date.
6.2 Concepte īn lucrul cu baze de date īn Delphi.
Data fiind diversitatea tipurilor de fisiere (deci baze de date) cu care īncearca Delphi sa comunice, este de asteptat, pentru a se crea un cadru unitar de lucru cu 414g62e aceste fisiere(baze de date), sa se realizeze o abstractizare convenabila a acestei diversitati. Cea mai īnalta abstractizare Delphi a unei coletii de date o reprezinta conceptul de set de date (DataSet).
Fara a exagera cu formalizarea, un set de date este o colectie de linii de date, fiecare linie avānd mai multe coloane, fiecare coloana fiind omogena din punct de vedere al tipului.
Īn limbaj de specialitate, o coloana se mai numeste si cāmp iar o linie se mai numeste si īnregistrare. Putem spune ca setul de date abstractizeaza un procedeu de caracterizare informationala a unei realitati obiectuale sau de alta natura, ca o coletie de date structurate pe linii si coloane.
VCL Delphi īncapsuleaza un set de date īntr-o componenta abstracta numita TDataSet. TDataSet introduce multe dintre proprietatile si metodele necesare pentru manipularea si navigarea īntr-un set de date. Pentru mai multa rigoare, notiunile de baza cu care se opereaza īn lumea aplicatiilor Delphi orientate pe baze de date sunt:
-Setul de date: o colectie de īnregistrari; fiecare īnregistrare are mai multe cāmpuri. Fiecare cāmp poate contine un tip diferit de data (numar īntreg, sir de caractere, numar zecimal, obiect grafic, etc).
-Tabelul: un tip special de set de date (= un exemplu concret de set de date). Un tabel este, īn general, un fisier continānd īnregistrari care, fizic, sunt pastrate pe un suport de memorie externa. Tabelul este abstractizat functional de clasa TTable a VCL.
-Query: este, de asemenea un tip special de set de date. De fapt, un Query este un tabel pastrat īn memorie, generat de comenzi speciale care manipuleaza o anumita tabela sau o colectie de tabele. Obiectele Query sunt abstractizate īn VCL de clasa TQuery. O componenta TQuery va permite sa interogati baza de date sau orice alta sursa de date sub forma unei īntrebari precise (formalizate SQL - Structured Query Language) si sa primiti ca raspuns numai informatiile de care aveti nevoie (a se analiza ce se īntāmpla īn maniera clasica de interogare, īntr-o retea!).
-Database: desemneaza un director pe disc (daca este vorba de date non-server specifice Paradox, dBaze, etc.) sau o baza de date SQL īn cazul īn care se lucreaza cu un server SQL. VCL īncapsuleaza acest concept cu ajutorul clasei TDataBase.
-Index: defineste regulile care stau la baza ordonarii unei tabele. Clasa TTable contine proprietati ti si metode care folosesc la manipularea indecsilor.
De la o versiune la alta, arhitectura VCL relativa la lucrul cu baze de date a fost īmbunatatita, astfel īncāt un numar tot mai mare de tipuri de baze de date sa fie usor de folosit īn Delphi. Īn spatele acestui plus de potential, de la o versiune la alta, se afla BDE (Borland Database Engine). Radacina ierarhiei VCL de clase care modeleaza lucrul cu baze de date este ocupata de clasa TDataSet. TDataSet este o componenta care furnizeaza o reprezentare abstracta a īnregistrarilor si tipurilor de date. O serie de metode ale clasei TDataSet pot fi redefinite pentru a crea componente care comunica cu formate fizice de date particulare.
Pagina Data Acces a VCL contine componente care pot fi folosite pentru accesul si gestiunea BDE-DataSet-urilor.
VCL reprezinta, la interfata cu programatorul, dataset-urile, folosind 3 componente: TTable, TQuery si TStoredProc. Toate aceste componente sunt derivate direct din componenta TDBDataSet care este, la rāndul ei, derivata din TBDEDataSet, avānd ca stramos direct TDataSet.
Īn aceasta ierarhie:
-TDataSet este o componenta abstracta care īncapsuleaza capabilitatile de management, navigare si manipulare a dataset-urilor.
-TBDEDataSet este, de asemenea, o componenta abstracta care reprezinta un dataset specific BDE.
-TDBDataSet introduce concepte precum: database si sesiune BDE.
-TTable este o componenta care care reprezinta structura si datele continute īntr-o tabela a unei baze de date.
-TQuery este o componenta care reprezinta un set de date returnate īn urma unei īnterogari SQL.
-TStoredProc īncapsuleaza o procedura stocata pe un server SQL.
Deschiderea unui DataSet (Tabel)
Īnainte de a face orice alta operatie asupra unui tabel, trebuie, mai īntāi sa-l deschideti.
Deschiderea unui tabel se poate face cu un simplu apel al metodei Open():
Tabel1.Open;
ceea ce este echivalent cu setarea proprietatii Active a unui tabel la valoarea True.
Tabel1.Active:=True;
Odata ce ati deschis un tabel, sunteti liberi sa īl manipulati. Terminarea lucrului cu un tabel īnseamna un apel de tipul:
Tabel1.Close;
sau
Tabel1.Active:=false;
TDataSet furnizeaza o serie de metode simple pentru operatiile fundamentale necesare pentru navigarea īntr-un tabel.
First() - pozitionare pe prima īnregistrare a tabelului.
Last() - pozitionare pe ultima īnregistrare a tabelului.
Next() - pozitionare pe urmatoarea īnregistrare īn tabel, īn raport cu pointerul curent;
Prior() - pozitionare pe precedenta īnregistrare īn tabel, in raport cu pointerul curent.
MoveBy() - deplaseaza pointerul de īnregistrare īnainte sau īnapoi cu un numar de īnregistrari, indicat prin parametrul pozitiv sau negativ al metodei.
TDataSet are proprietatile booleene BOF si EOF, care indica daca īnregistrarea curenta este prima sau ultima relativ la tabelul asociat. Este plauzibil urmatorul cod:
Table1.First;
while not Table1.EOF do
begin
Tabel1.Next;
end;
Semnele de carte permit salvarea pozitiei curente din tabel astfel ca, ulterior se poate reveni rapid īn aceeasi pozitie. Manevrarea semnelor de carte este doar o problema de setare/consultare a unei proprietati.
var
BM:TbookMarkStr;
Begin
BM:=Table1.BookMark;
Table1.BookMark:=BM;
Delphi permite accesul la cāmpurile unui tabel cu ajutorul obiectelor de tip TField si al descendentilor acestui tip. Programatorul poate citi si seta valoarea unui cīmp al īnregistrarii curente, dar poate si sa modifice comportamentul cāmpului prin modificarea proprietatilor lui.
Īn Delphi, se pot accesa foarte usor cāmpurile unui tabel. TDataSet are o proprietate array implicita, numita FieldValues[ ] care returneaza valoarea unui cāmp particular ca o valoare de tip Variant. Deoarece FieldValues[ ] este o proprietate array implicita, nu este necesar sa specificati numele proprietatii pentru a accesa array-ul. De exemplu, īn codul:
var
S:string;
S:=Table1['Nume Client'];
valoarea cāmpului 'Nume Client' al īnregistrarii curente este asignata variabilei S.
O consecinta imediata a mecanismului ilustrat de codul de mai sus este posibilitatea de a pastra valorile mai multor cāmpuri īntr-un tablou variant. Īn Delphi, unit-ul System declara mai multe functii cu ajutorul carora pot fi manipulate tablourile Variant.
Astfel avem:
function VarArrayCreate (const Bounds: array of integer; varType: integer): variant;
Functia creeaza un tablou variant ale carui limite sunt specificate de Bounds iar tipul elementelor este specificat de paramatrul varType. Constanta Bounds este un vector care trebuie sa aiba un numar par de elemente, deoarece pentru fiecare dimensiune trebuie specificata limita inferioara si limita superioara. VarType este una din valorile asociate tipurilor recunoscute ca variant mai putin varArray, varByRef, varString. Pentru a crea un vector de string-uri se poate folosi codul de tip varOleStr. Daca varType este varVariant atunci elementele vectorului sunt variant care pot contine la rāndul lor alte tipuri variant.
function VarArrayOf (const Values:array of variant):variant;
Functia este folosita pentru a crea un vector unidimensional avānd tipul de baza variant iar valorile care populeaza vectorul sunt specificate īn Values.
function VarArrayDimCount (const A:variant):integer;
Returneaza numarul de dimensiuni ale unui tablou variant. Īn cazul īn care A nu este un tablou variant se returneaza 0.
function VarArrayHighBound (const A:variant;Dim:integer):integer;
Returneaza limita superioara a dimensiunii Dim a unui tablou variant. Prima dimensiune este 1, a doua dimensiune este 2, etc.
function VarArrayLowBound (const A:variant;Dim:integer):integer;
Returneaza limita inferioara a unei dimensiuni. Utilizānd potentialul unui tablou variant, este plauzibil urmatorul cod:
const
Sir=' %s are functia %s si are salariul %f ';
var
VarArr:variant;
F:double;
begin
VarArr:=VarArrayCreate([0,2],var Variant);
VarArr:=Table1['Nume;Functia;Salariul '];
F:=VarArr[2];
ShowMessage(Format(Sir,[VarArr[0],VarArr[1],F));
end;
Delphi 1 a introdus o tehnica de acces la valorile cāmpului unui tabel, bazata pe proprietatea array Fields[], sau pe functia FieldsByName() si pe asocierea unui obiect TField cu un tabel.
Fields[] este un tablou zero-bazat, ceea ce īnseamna ca Fields[0] returneaza un obiect reprezentānd primul cāmp logic al īnregistrarii curente si asa mai departe.
FieldsByName() accepta un parametru string care specifica numele unui cāmp al unei tabele.
Dat un obiect TField, puteti regasi sau asigna valoarea unui cāmp folosind una din proprietatile TField.
Proprietate |
Valoare returnata |
AsBoolean AsFloat AsInteger AsString AsDataTime Value |
Boolean Double Longint String TDataTime Variant |
Deci este plauzibil codul:
var
S:string;
S:=Table1.Fields[0].AsString;
Daca doriti sa cunoasteti tipul unui cāmp, consultati proprietatea DataType a obiectului TField, care indica tipul de date raportat la tabela bazei de date (indiferent de tipul Object Pascal corespunzator). Proprietatea DataType este de tip TFieldType iar TFieldType are definitie de genul:
type
TFieldType=(ftUnknown, ftString, ftSmallint, ftInteger, ftWord, ftBoolean, ftFloat, ftCurrency, ftBCD,ftDate, ftTime, ftDateTime, ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFirstMemo, ftParadoxOLE, ftDBazeOle, ftTypedBinary, ftCursor, ftFixedChar, ftWideString,...)
Pentru a gasi numele unui cāmp se poate folosi proprietatea FieldName a unui obiect TField. Astfel, putem avea:
var
S:string;
begin
S:=Table1.Fields[0].FieldName;
end;
De asemenea, se poate obtine numarul unui cāmp al carui nume se cunoaste cu ajutorul proprietatii FieldNo, astfel:
var
I:integer;
begin
I:=Table1.FieldsByName('Name').FieldNo;
end;
Exista trei pasi īn editarea unuia sau a mai multor cāmpuri ale īnregistrarii curente:
Apelarea metodei Edit() a unui DataSet pentru a trece un DataSet īn modul Edit.
Asignarea noilor valori cāmpurilor alese printr-o astfel de operatie.
Validarea schimbarilor efectuate asupra DataSet-ului, sau prin apelul metodei Post() sau prin trecerea la o noua īnregistrare, ceea ce valideaza automat rezultatul editarii.
Table1.Edit;
Table1['Nume']:= 'Corneliu Vadim';
Table1.Post;
De remarcat si proprietatea CanModify, care returneaza True daca DataSet-ul poate fi editat.
Unui DataSet i se pot insera sau adauga īnregistrari si astfel:
1.Apelati una din metodele Insert() sau Append() ale DataSet-ului pentru a comuta īn modul insert sau append.
2.Atribuiti valori cāmpurilor.
3.Validarea unei īnregistrari īn DataSet prin apelul metodei Post() sau prin trecerea la o noua īnregistrare, care forteaza validarea.
Daca dintr-un anume motiv, adaugarile sau modificarile facute, dar nevalidate, trebuie abandonate, acest lucru este posibil prin apelul metodei Cancel(), ca mai jos:
Table1.Edit;
Table1['Nume']:= 'Corneliu Vadim';
Table1.Cancel;
Apelul metodei Cancel invalideaza schimbarile operate asupra ultimei īnregistrari, scoate DataSet-ul din modul Edit, Append sau Insert si īl aduce īnapoi la modul Browse. Pentru a sterge o īnregistrare a unui dataset, se foloseste metoda Delete() astfel:
Table1.Last;
Table1.Delete;
pentru a sterge ultima īnregistrare din dataset.
Delphi ofera un mare grad de control si flexibilitate asupra cāmpurilor unui DataSet, prin intermediul Editorului de cāmpuri.
Cu ajutorul editorului de cāmpuri, care poate fi activat din meniul derulant asociat unui DataSet (de cele mai multe ori tabel) se pot efectua urmatoarele operatii:
1.Adaugarea unui cāmp nou (prin stergerea unui cāmp existent, pastrarea numelui lui si schimbarea tipului).
2.Definirea unui cāmp calculat (calculated field).
3.Definirea unui cāmp de tip lookup, ale carui valori se obtin prin relationarea tabelei la care se adauga cāmpul lookup cu o alta tabela.
Pasii de parcurs pentru adaugarea unui astfel de cāmp sunt:
1.Activare editor cāmpuri.
2.Selectare cāmpuri DataSet.
3.stergerea cāmpului al carui tip dorim sa-l modificam
4.Activare fereastra de dialog new fields din meniul derulant asociat editorului de
cāmpuri.
5.Completare nume cāmp īn caseta de editare Name asociata. Acest nume trebuie
sa coincida cu numele cāmpului sters.
6.Selectare tip si, eventual completarea informatiei de lungime.
7.Activare buton Data īn grupul de radio butoane Field Type.
8.OK. īn fereastra New fields.
Efectele sunt imediate daca DataSet-ul este asociat cu o componenta browser
Cu ajutorul editorului de cāmpuri puteti adauga cāmpuri calculate unui dataset. Protocolul de adaugare a unui astfel de cāmp este urmatorul:
1.Activare fereastra de dialog New Field.
2.Introducerea unui nume pentru cāmpul calculat īn caseta de editare Name. Se
va evita introducerea unui nume de cāmp deja existent īn DataSet-ul contextual.
3.Selectare tip din caseta combo box asociata tipului.
4.Introducere informatie de lungime, daca este cazul.
5.Activati butonul Calculated īn grupul de radio butoane Field Type.
6.Selectati OK.
Noul cāmp este automat adaugat īn lista cāmpurilor persistente ale editorului de
cāmpuri.
7.Adaugati codul care calculeaza valorile pentru cāmpul calculat. Acest cod se
asociaza evenimentului OnCalcFields al DataSet-ului.
De remarcat, totodata, ca pentru a edita proprietatile sau evenimentele asociate unui cāmp, selectati numele cāmpului īn lista editorului de cāmpuri si, va puteti folosi de inspectorul de obiecte, ca de obicei.
Definirea unui cāmp lookup
Adaugarea la lista de cāmpuri a unui dataset a unui cāmp lookup echivaleaza cu adaugarea unui cāmp ale carui valori sunt obtinute prin relationare cu un alt dataset.
Lucrul cu cāmpuri BLOB
Un cāmp BLOB (Binary Large Object) este un cāmp capabil sa contina o cantitate nedeteminata de date. Cel mai adesea, cāmpurile BLOB sunt utile pentru pastrarea unei cantitati mari de text, imagini grafice sau fluxuri de date, precum obiectele OLE.
VCL Delphi include un descendent al tipului TField, numit TBlobField, care īncapsuleaza un cāmp BLOB.
TBlobField are o proprietate BlobType de tip TBlobType, care indica ce tip de data este pastrat īn cāmpul BLOB. TBlobType este definit īn unit-ul DB astfel:
TBlobType=ftBlob..ftOraClob;
Toate tipurile de cāmpuri asociate definitiei de mai sus sunt:
Tip cāmp |
Tipul de data |
ftBlob ftMemo ftGraphic ftFmtMemo ftParadoxOle ftDbase Ole ftTypedBinary |
Data fara tip sau definita de utilizator Text Bitmap Windows memo formatat Paradox object OLE Paradox object OLE DBase |
DataSet-ul abstractizeaza de cele mai multe ori un tabel. Īn momentul īn care un dataset se cupleaza la o tabela (īn urma unei operatii de tip Open(), DataSet-ul se comporta ca un flux īn care adaugam īnregistrari, din care stergem īnregistrari sau īn care modificam īnregistrari. Din diverse motive, continutul DataSet-ului trebuie pus de acord, din cānd īn cānd cu continutul tabelei asociate.
Īn acest scop se foloseste metoda Refresh().
De multe ori este necesar sa stim daca un tabel este īn unul dintre modurile Edit, Append, Insert, sau chiar daca este activat. Astfel de informatii se pot obtine consultānd proprietatea State a DateSet-ului.
Proprietatea State este de tip TDataSetState si poate avea una din valorile:
dsBrowse Dataset-ul este īn mod Browse (normal).
dsCalcFields A fost apelat evenimentul OnCalcFields si un calcul de valoare
īnregistrare este īn derulare.
dsEdit DataSet-ul este īn Edit mod. Acesta īnseamna ca metoda Edit a
fost apelata, dar īnregistrarea editata nu a fost īnca operata efectiv (ceea ce se
īntāmpla la aplicarea metodei Post sau la trecerea la o noua īnregistrare.).
dsInactive DataSet-ul este īnchis.
dsInsert DataSet-ul este īn modul Insert
dsSetKey DataSet-ul este īn SetKey mod, ceea ce īnseamna ca a fost
apelata metoda SetKey, dar īnca nu s-a facut un apel de tip GotoKey().
dsNewValue DataSet-ul este īntr-o stare temporara, caracterizata prin faptul ca
este accesata proprietatea NewValue a DataSet-ului.
dsOldValue DataSet-ul este īntr-o stare temporara, caracterizata prin faptul ca
este accesata proprietatea OldValue.
dsCurValue DataSet-ul este īntr-o stare temporara, ca la dsOldValue
dsFilter DataSet-ul este asociat, īn stare curenta, cu procesarea unui
filtru.
Filtrele permit programatorilor sa efectueze cautari sau filtrari asociate cu un DataSet, utilizānd numai cod Object Pascal. Principalul avantaj al utilizarii filtrelor consta īn faptul ca nu sunt necesare fisiere index sau alte pregatiri ale DataSet-urilor de acest gen.
Filtrele pot fi mai lente decāt cautarea bazata pe indexare, dar sunt īnca mult folosite īn o serie de aplicatii, fie si numai din motive de simplificare a portarii unei aplicatii.
Una dintre cele mai obisnuite utilizari ale mecanismului Delphi de filtrare este de a limita vizibilitatea DataSet-ului la un numar de īnregistrari care īndeplinesc o anumita conditie. Aceasta filtrare se obtine, relativ simplu astfel:
Asignarea unei proceduri evenimentului OnFilterRecord al DataSet-ului. Īnauntrul acestei proceduri trebuie scris cod care accepta īnregistrari pe baza valorilor unuia sau mai multor cāmpuri.
Setarea proprietatii Filtered la valoarea True.
Exemplu de procedura asignata evenimentului OnFilterRecord:
procedure TForm1.Table1Filterrecord(DataSet:TDataSet; var Accept:Boolean);
var
FieldVal:String;
begin
FieldVal:=DataSet['Compania'];
Accept:=FieldVal[1]='S';
end;
In acest cod s-a definit un filtru care permite prelucrarea doar a īnregistrarilor din tabela pentru care cāmpul "Compania" īncepe cu "S".
TDataSet dispune de metodele FindFirst(), FindNext(), FindPrior() si FindLast() care īntrebuinteaza handlerul evenimentului OnFilterRecord al unui DataSet pentru a permite pozitionarea pe prima īnregistrare, urmatoarea īnregistrare, precedenta īnregistrare, respectiv, ultima īnregistrare care īndeplineste o conditie specificata īn termeni de filtre.
Pozitionarea pe o īnregistrare (Cautarea unei īnregistrari)
Filtrele nu sunt folositoare doar pentru a specifica o anumita perspectiva asupra unui DataSet; ele sunt folosite si pentru a cauta īnregistrari ale unui DataSet utilizānd valori ale unuia sau mai multor cāmpuri. Metoda furnizata de DataSet īn acest scop este Locate().
Definitia metodei este:
function Locate(const KeyFields:string; const KeyValue:Variant; Options: TLocateOptions): boolean;
-KeyFields- indica numele cāmpului(cāmpurilor) dupa care se face cautarea;
-KeyValues- indica valoarea(valorile) cāmpului(cāmpurilor) cautate;
-Options- permite personnalizarea tipului de cautare;
TLocateOptions este un tip set definit īn unit-ul DB astfel:
.
.
type
TLocateOption = (loCaseInsensitive, loPartialKey);
TLocateOptions = set of TLocateOption;
.
.
loCaseInsensitive - cautarea nu este sensibila la case.
loPartialKey - valoarea continuta īn KeyValues este valida chiar si īn calitate de
subsir al unei valori de tip cāmp.
Locate() returneaza True daca a gasit o īnregistrare. De exemplu, pentru a gasi prima aparitie a valorii 'Corneliu' īn cāmpul Nume al tabelei Table1, folosim sintaxa:
.
.
Table1.Locate('Nume','Corneliu',[lopartialKey]);
.
.
Prezentam, īn continuare, proprietatile si metodele comune ale tipului TTable si modul de utilizare a acestora.
Cautarea īnregistrarilor
Daca aveti nevoie sa cautati īnregistrari īntr-un tabel, VCL furnizeaza cāteva metode de ajutor īn acest caz
Daca lucrati cu tabele dBase sau Paradox, Delphi presupune ca tabelele sunt indexate dupa cāmpurile implicate īn procesul de cautare. Īn deosebi īn cazul tabelelor SQL, performanta procesului de cautare va avea de suferit daca fisierele īn care cautam nu sunt indexate.
Pentru cautare putem folosi:
tehnica FindKey()
sau
tehnica SetKey()..GotoKey().
Metoda FindKey() permite cautarea unei īnregistrari dupa unul sau mai multe cāmpuri cheie. FindKey() accepta ca parametru un vector de constante (reprezentānd criteriul de cautare) si returneaza True īn caz de reusita a procesului de cautare. Exemplu:
if not Table1.FindKey([123,'Ionescu Victor'])
then MessageBeep(0);
.
.
Codul de mai sus determina pozitionarea īn DataSet pe īnregistrarea pentru care primul cāmp-index are valoarea 123 iar al doilea cāmp-index are valoarea 'Ionescu Victor'.
SetKey()..GotoKey()
Apelarea metodei SetKey() trece tabelul īntr-un mod care pregateste cāmpurile lui pentru a fi īncarcate cu valori reprezentānd criterii de cautare. Odata ce criteriul de cautare a fost stabilit se foloseste metoda GotoKey() pentrua face o cautare top-down a unei īnregistrari specificate īn criteriul de cautare. Īn varianta SetKey()..GotoKey() exemplul precedent se scrie:
.
.
with Table1 do
begin
SetKey;
Fields[0].AsInteger:=123;
Fields[1].AsString:='Ionescu Victor';
if not GotoKey then MessageBeep(0);
end;
.
.
|