12 noiembrie luni

28

Click here to load reader

Upload: nastea-matvienco

Post on 22-Jun-2015

138 views

Category:

Technology


5 download

DESCRIPTION

Delphi

TRANSCRIPT

Page 1: 12 noiembrie luni

Clasa moştenitoare Forma cîmpurilor seturilor de dateTADTField Cîmp al tipului de date abstract (abstract Data

Type ) poate utilize anumite tipuri, create pe server-ele bazelor de date, Poate conţine massive, referinţe şi alte date.

TAAgregateField Cîmp compus. Permite combinarea diferitor tipuri de date a cîmpului setului de date.

TArrayField Cîmp de tip masiv. Conţine stul câmpurilor de acelaşi tip

TAutoIncField Camp, care automat îşi măreşte valoarea sa ( de tip AutoIncrement) Poate servi în calitate de contor al înregistrărilor setului de date. Diapazonul valorilor: de la -2 147 483 648 pînă 2 147 483 467. Aceast tip al câmpului de cele mai dese ori este utilizat în calitate de cheie primară.

TBCDField Câmp bianro-zecimal (Binary-Coded Decimal). În genereal se utilizează pentru păstrarea valorilo băneşti. De obicei aşa cîmă conţine valori zecimale. Deoarice Delphi anteriror nu susţinea propriul tip BCD, pentru lucru acesta câmă compilatorul utilizează tipul bănesc Currency din cauza cărui valoarea acestui cîmp este limitată de 20 simboluri.

TBLOField Acest cîmp conţine trimiteri către obiecte binare mari (Bunary Large Objects.) Acest tip al cîmpului este preecesor direct pentru următoarele tipuri ale cîmpurilor: TGraphicField, TMemoField.

TBooleanField Cîmp de tip logic. Poate avea valorile true sau false.

TBytesField COnsecutivitate de bites de lungime fixată.TCurrencyField Cîmp conţine valoare de tip băneşsc (positive sau

negative) de la 5,0x10-324 şi pănă la 1,7x10308 cu exactitatea de 15 semen de după virgulă.

TDataSetField Cîmpul asigură accesul cître setul de date introdus.TDataField Cîmpul conţine data.TDataTImeField Cîmpul conţine data şi timpul.TFloatField Acest cîmp conţine valorile reale. Ele se găsesc în

diapazonul de la 5,0x10-324 şi pănă la 1,7x10308 cu exactitatea de 15 semen de după virgulă.

TFMTBCDField Datele sînt prezentate în formă binaro-zecimalăTGraphicField Cîmp graphic.TGUIdField Cîmpul este predestinate pentru lucrul cu

identificatorii globali unici( Globally Uniqe Identifiers, GUIDs)

TIDispatchField Cîmpul conţine indicatori pe interfeţele Idispatch.TIntegerField Cîmp pentru păstrarea valorilor întregi cu semn de

Page 2: 12 noiembrie luni

32 biţi. Poate conţine valori în diapazonul dela -2 147 483 648 pînă la 2 147 483 647.

TLargeIntField Cîmpul valorilor întregi mari( 64 biţi)TMemoField Cîmp de tip Memo, serveşte pentru păstrarea

textului.TReferenceField Câmpul conţine referinţe sau indicatori pe alte

obiecte.TSmallIntField Cîmpul valorilor întregi mici (16 biţi). Permite

valori în dapazonul de la -32 768 pînă la 32 767.TSQLTimeStampField Conţine data despre dată şi timp în formatul

compatibil cu driver-ele dvExpress.TstringField Cîmp de tip şir de caractere. Se completează cu

şiruri de text simplu cu lungimea de pînă la 8192 de simboluri.

TTimeField Cîmp de tip timp.TVarBytesField Câmpul biţi-lor de dimensiune variabilă. Valoarea

lungimii se conţine în primii 2 biţi.TVariantField Câmp de tip variant.TwideStringField Câmpul şirurilor lungi.TWOrdFiled Cîmpul valorilor întregi fără semn (16 biţi ).

Diapazonul valorilor de la 0 la 65 535.

În continuare vom utilize termenul TField pentru notarea oricărui din obiectele, enumerate în tabelul 3.1.

Pentru a verifica, ce fel de tip are un cîmp concret al tabelului, vom utilize proprietatea DataType de tipul TFieldType. Ea poate primi valori, reprezentate în tabelul 3.3.

Tabelul 3.3

Valori DescriereaftUnknown Tip nedeterminatftString Câmpul simbolului sau al şirului ftaSmalInt Cîmp întreg de 16 biţiftInteger Cîmp întreg de 32 biţiftWord Cîmp întreg de 16 biţi fără semnftBoolean Cîmp logic ftFloat Cîmpul numerelor realeftCurrency Cîmpul valorilor băneştiftBCD Cîmpul valorilor binaro-zecimaleftDate Cîmpul dateiftTime Cîmul timpuluiftDataTime Câmpul datei şi timpuluiftBytes Cîmpul valorilor de tip bites de lungime fixatăftVarBytes Cîmpul valorilor de tip bites de lungime variabilăftAutoInc Câmpl care automat măreşte valoarea proprie

Page 3: 12 noiembrie luni

ftBloB Cîmp de tip BlobftMemo Cîmp de tip MemoftGraphic Cîmp de tip GraficftFmtMemo Cîmp de tip Memo, care conţine text formatatftParadoxOLE Cîmp de tip OLE pentru tabelel Paradox.ftDBaseOLE Cîmpt de tip OLE pentru tabelel dBaseftTypeBinary Cîmp binaryftCursor Cursor al proedurii păstrate OracleftFixedChar Cîmpul de simboluri de lungime fixatăftWideString Cîmpul al şirului lungftLargeInt Cîmpul al numărului întreg mareftADT Cîmpul datelor de tip abstract.ftArray Cîmp de tip masivftReference Cîmp ce conţine referinţe şi indicatori pe obiecteftDataSet Cîmp de tip TDataSetftOraBLOB Cîmp de tip BLOB în tabelul Oracle 8ftOraCLOB Cîmp de tip CLob în tabelul Oracle8 ftVariant Data tip necunoscut sau nedeterminatftInterFace Cîmp al referinţei pe interfeţe (IUnknown)ftIDispatch Cîmp al referinţeilor pe interfeţe (IDispatch)ftGUID Cîmp de tip GuidftTimeStamp Cîmp de tip dată şi tip, accesibil cu ajutorul

metodelor dbExpressftFMTBCD Cîmp valorilor binaro-zecilae care este prea mare

pentru ftBCD

Acum putem trece la examinarea particularităţilor seturilor de date Tabel şi Query.

3.2.4 Setul de date Table.

Setul de date Tabel este reprezentat în Delphi de component Table. Acest set de date în fiecare moment de timp poate fi legat numai cu un singur tabel al bazei de date.

Componenţa Table se recomnadă de utilizat pentru lucru cu bazele de date locale aşa cum Paradox sau dBase.

Vom examina proprietăţile de bază al setului de date Table . În tabelul 3.4 sunt reprezentate toate proprietăţile care sunt prezentate în fereastra inspectorului de obiecte.

Tabelul 3.4. Proprietăţile componentei Tabel.

Denumirea proprietăţii Tipul proprietăţii DescriereaACTIVE Boolean Determină dacă setul de date

este deschis sau nu.Dacă proprietatea are valoarea false, atunci setul de date este închis şi

Page 4: 12 noiembrie luni

datele nu sunt disponibile nici pentru utilizator nici pentru program. Dacă această proprietate are valoarea true, atunci asupra datelor pot fi aplicate diverse operaţii( modificare, adăugare, ştergere)

AUTOCALCFIELDS Boolean Determină cum se va realize lucru cu cîmpurile autocalculate. Dacă proprietatea are valoarea true, atunci valorile acestro cîmpuri se vor calcula automat în cazul deschiderii setului de date, trecerii setului de date în regim de redactee (dsEdit).

AUTOREFRESH Boolean Determină ordinea reînoiirii pe serverul bazei de date a componentelor vizuale pentru cîmpurile reflectate. Dacă valoarea proprietăţii este false(implicit) , atunci reînoirea automată va lipsi. Pentru reînnoirea datelor în acest caz programatorul apelează procedura Refresh. Dacă valoarea proprietăţii este true atunci reînnoirea se va realiza automat.

CACHEDUPDATES Boolean Stabilirea valorii proprietăţi în true permite modificări cache efectuate în baza de date. Cu toate acestea date se păstrează în memoria operativă şi pentru transferul lor în baza de date se aplică metoda ApplyUpdates. Pentru anularea modificărilor efectate se apelează medota CancelUpdates.Pentru curăţirea conţinutului cahe se utilizează metode COmmitUpdates.

CONSTRAINTS TCheckConstraints Determină limitle integrităţii la nivelul înregistrării care se aplică pe valorile cîmpurilor separate ale setului de date.

DATABASENAME String Determină numele bazei de date legate cu setul de date.

DEFAULTINDEX Boolean Determină dacă datele în tabel

Page 5: 12 noiembrie luni

vor fi sortate după cîmpul cheie primare al indicelui principal. Valoarea proprietăţiii implicit este true.

EXCLUSIVE Boolean Dacă valoarea proprietăţii este true atunci ale aplicaţii nu se vor putea adresa la setul de date déjà deschis (este utilizat numai pentru tabelele Paradox şi dBase) este obligator să închidem tabelul deschis la modificarea valorii acestei proprietăţi.

FIELDDEFS TFieldDefs Stabileşte setul cîmpurilor care detemrină setul de date. Permite ca din program în timpul execuţiei aplicaţiei să creăm tabele şi cîmpurile lor.

FILTER String Conţine textul filtrului current al setului de date. În componentele vizuale vor fi arătate numai acele date care corespund condiţiilor filtrului dat.

FILTRED Boolean Determină dacă vor fi luate în consideraţie valorile proprietăţii Filter epntru datele din componentele vizuale. În cazul valorii true, datele se vor filtra în corespundere cu proprietatea Filter, altfel- filtru va fi ignorant.

FILTEROPTIONS TFilterOptions Conţine două proporietăţi subordinate care determină dacă filtru este sensibil la registrul literelor şi dacă filtru se permite utilizarea simbolului “*” în calitate de indicator la orice număr de simboluri. Implicit aceste două proprietăţi au valoarea false.

INDEXDEFS TIndexDefs Conţine informaţia despre indicia tabelului

INDEXFIELDNAME String Conţine lista cîmpurilor tabelului care au fost ales în calitate de indexate.

INDEXFIELS Tstring Conţine denumirea a unuia sau cîtorva fişiere indiexate pentru tabelele de format dBase.

Page 6: 12 noiembrie luni

MASTERFIELDS String Determină unul sau cîteva cîmpuri ale tabelului principal(master table) pentru stabilirea legăturii cu cîmpurile corespunzătoare ale tabelului subordonat, adică pentru

MASTERSOURCE TDataSource Stabileşte numele componentei sursei de date proprietatea DateSet al cărei detemină setul de date utilizat în calitate de tabel principal (master) la stabilirea legătruii “master-detail”.

NAME TComponentName Determină numele componentei setului de date .Implicit sunt atribuite Tabel1, Tabel2….

OBJECTVIEW Boolean Indică cum se păstrează obiectele cîmpulrilor în proprietatea fields: ierahic sau în serie

READONLY Boolean Fixează dacă pot fi modificate datele în tabel sau ele sunt accesibile numai pentru citire. Dacă valoarea proprietăţii este false (implicit) atunci modificarea datelor este permisă, altfel datele din tabel sunc accesibile numai pentru citire.

SESSIONNAME String Determină numele compoenentei session legate cu datele tabelului.

STOREDEFS Boolean Indică unde se păstrează definirea cîmpurilor şi indicilor. Dacă valoarea proprietăţii este true atunci definirea cîmpurilor şi indicilor va fi păstrată în modulul datelor sau în formă. În cazul false (implicit) informaţia se păstrează în fişierele bazei de date.

TABELNAME TFieldName Determină numele fişierului tabelului bazei de date care încapsulează obiectul. Condiţii de stabilire a acestei proprietăţi este atribuirea valorii false proprietăţii Active.

Page 7: 12 noiembrie luni

TABLETYPE TTabelType Determină structura tabelului utilizat în baza de date şi poate primi următoarele valori:ttDefault-tip tabelului se determină după extensia sa(*.db-Paradox, *.dbf- dBase, *.txt- ASCII); ttParadox-tabelul Paradox; ttDBase- tabelul dBase; ttFoxPro- tabelul FoxPro; ttASCII- tabelul cu date in format textuale, separate prin vrigula.

TAG Longint Nu are o destinaţie special. Se utilizează pentru păstrarea unui număr întreg, legat de component. Poate fi utilizat la discreţia programatorului .

UPDATEMODE TUpdateMode Determină criteriile de căutare a înregistrării reînnoite a bazei de date

3.3 Sursa de date

Surse de date (Data Source) reprezintă în sine un elemente intermediar, care se utilizează pentru legarea setului de date cu cumponentele vizuale. Se obţine ca un lanţ: „setul de date- sursa de date-componentele vizuale”. Pentru acesta în Delphi se utlizează componenta DataSource. Această componentă are 5 proprietăţi de bază,care sunt arătate în fereastra Inspectorul de Obiecte:

Tabelul 3.6. Proprietăţile componentei DataSource

Denumirea proprietăţii Tipul proprietăţii DescriereaAutoEdit Boolean Determină dacă setul de date poate să tereacă automat în

regim de modificare la încercarea de modificare a datelor de către utilzator. Implicit valoarea proprietăţii- true, adică aşa o trecere este permisă. În cazul dacă nu dorim să permitem o modificare întîmplătoare a datelor- stabilim valoarea acestei proprietăţi în false.

DataSet TdataSet Serveşte pentru indicarea setului de date, cu care este legată sursa de date. Remarcăm că componentele vizuale pentru legarea cu sursa de date utilizează proprietarea sa DataSource.

Enabled Boolean Determină, dacă componentele vizuale, legate cu această sursă de date, vor reflecta datele din setul de date( true-false)

Name TcomponentName Setează numele sursei de date. Implicit sursele de date

Page 8: 12 noiembrie luni

primesc numele DataSource1, DataSOurce2...Tag LongInt Nu are o destinaţie specială. Se aplică pentru păstrarea unui

număr intreg, legat cu componenta, la discreţia programatorului .

La modificarea datelor în setul de date are lor generarea evenimentului OnDataSoruce, de tipul TdataChangeEvent. Acest tip este descris în Delphi în felul următor:

Type TdataChangeEvent=procedure (Sender:Tobject; Field:TFIeld) of object;

Parametrul Field determină, valoarea cărui cîmp a fost modificată. Dacă datele au fost reînoite în cîteva cîmpuri, atunci parametrul va conţine valoarea nulă(nil).

În afară de evenimentul OnDataChange, la modificarea valorilor cîmpurilor înregistrării curente apare eventimentul OnUpdateData, de tipul TnotifyEvent. Aşa eveniment se realizează înaintea înscrierii datelor în baza de date. În aşa fel, el poate fi utilizat, de exemplu pentru confirmarea modificărilor introduse sau anularea lor.

Legătura dintre setul de date şi sursa datelor de obiecei se realizează la etapa proiectării aplicaţiei cu ajutorul Inspectorului de Obiecte. Delphi permite stabilirea sau ruperea acestei legături şi în procesul execuţiei aplicaţiei. La stabilirea noii legături componentele vizuale automat se conectează la noul se de date şi vor reflecta valorile acestuia.

Vom aduce un exemplu de stabilirea şi ruper ea legăturii:

DataSource1.DataSet:=Table1://stabilirea legătrui cu setul de date Table1.

DataSource1.DataSet:= nil;// atribuirea valorii vide propiretăţii DataSet rupe legătura cu setul de date

DataSource1.DataSet:=Query1;// stabilirea legăturii cu setul d edate Query1

În codul de mai sus am putut omite rîndul în care are lor atribuirea valoriii nule. Trecerea între seturile de date poate fi realizate fără o rupere prealabilă a legăruiii cu setul de date vechi.

5.2 Operaţii cu tabele.

Vom examina operaţiile de bază care pot fi efectuate cu tabelel bazei de date. Vom studia aceste operaii pe exemple de lucru cu componentele Table şi Query. Asupra tabele pot fi efectuate 4 operaţii de bază:

- Crearea tabelei;- Ştergerii tabelei;- Redenumirea tabelei;

Page 9: 12 noiembrie luni

- Stabilirea regimului de acces.

Noi deja ne-am învăţat să contruim tablele prin intermediul mijloacelor instrumentale, a aplicaţiei DataBase Desktop. Aici vom examina procesul dinamic de creare a tabelelor, adică în timpul execuţiei aplicaţeii.

Proceul dinamic de creare a tabelului se începe prin chemarea metodei setului de date, CreateTable. Această metodă crează un tabel vid pe care-l amplasează pe disc. Înainte de chemarea metodei trebuie să avem grijă de pregătirea datelor pe baza cărora va fi creat tabelul. Aceste date trebuie atribuite proprietăţilor corespunzătoare ale setului de date. Evident înainte de chemarea metodei CreateTable setul de date treubie închis( proprietatea Active=false).În afară de aceasta, trebuiesc stabilite valorile următoarelor proprietăţi DataBaseName, TableName, TableType, FieldDefs, IndexDefs, adică trebuie determinate calea cîtrte baza de date sau pseudonimul ei, denumirea noului tabel, tipul tabelului crea,t descrierea tuturor cîmpurilor tabelului şi descrierea cîmpurilor indexate ale tabelului. Vom examina procesul d adăugare a cîmpurilor.

Aşadar în proprietatea FieldDefs obligator trebuie să sfie determinat măcar un cîmp. Înainte de setarea noii valori a acestei proprietăţi, este necesar să curăţim valoarea precedentă, deoarice în ea se poate păstra informaţia despre cîmpurile altui tabel. Pentru aceasta putem utiliza metoda Clear.

Table1.FieldDefs.Clear;

Pentru a adăuga informaţia despre cîmpurile tabelului putem chema metoda Add:

Procedure Add(const Name:string; DateType:TfieldType; SizeWord; Required:Boolean);

În parametru Name trebuie să fie indicat numele cîmpului, iar în parametrul DataTypeI-tipul lui. Parametrul Size determină dimensiunea cîmpului. Dacă dimensiunea cîmpului nu poate fi setată( de exemplu în cazul cîmului Data/Time), atunci valoarea acestui parametru trebuie să fie egală cu zero. Ultimul parametru Required indică dacă cîmpul trebuie să conţină sau nu valori (true sau false).

Cu ajutorul proprietăţii IndexDefs în tabelul creat putem determina indicii. Adăugarea indicilor se realizează prin chemarea metodei Add. Remarcăm că într-un tabel deja creat putem şterge sau crea indicii prin intermediul metodelor AddIndex şi DeleteIndex.

Vom analiza un exemplu de creare a tabelului pe baza setului de date Table:

Procedure Tform1.Button1Clik(Sender:Tobject);

Begin

Table1.active:=false;// inchidem setul de date

{putem utiliya comnada Table1.Close}

Table1.DatabaseName:=’D: \Baza\Date’;// calea catre baza de date

Page 10: 12 noiembrie luni

Table1.tableName:=’MyTable’;//numele tab creat

Table1.tabletype:=ttParadox;//tipul tabelului –Paradox

//acum trecem la descrierea cimpurilor tabelului

Table1.fielddefs.clear;//curatim informatia precedent

//cream 3 cipuri: Number, Name, Tel.

Table1.FieldDefs.Add(‘Number’, ftAutoInc,0,true);

Table1.FieldDefs.Add(‘Name’,ftString’,35,true);

Table1.FieldDefs.Add(‘Tel’,ftInteger, 10,false);

//descrierea indicia tabelului.

Vom analiza un exeplu de permutare pe înregistrările setului de date:

Procedure TForm1.Button1Click(Sender:Tobject);

Var I:integer;

Begin

Table1.first;//permutarea cursorului pe prima inregistarea

For i:=1 to table1.Recordcountt do

Begin

//aici pot fi introduce careva actiuni

// de exemplu sumarea unui camp al tabelului

Tabelul1.next;

End;

End;

Page 11: 12 noiembrie luni

În exemplul analizat se realizează trecerea tuturor înregistrărilor a setului de date table1 şi după execuţia programului cursorului se va afla pe ultima înregistrare a setului de date.

Pentru a afla care de înregistrărilii în momentul de faţă este curentă, putem utiliza proprietatea RecNo a setului de date. Această proprietate conţine numărul înregistrării curente. Înscrierea în această proprietate a valorii nu este permisă.

Remarcă. Tabelele de tip aradox susţin trecerea la înregistrarea dorită prin intermediul stabilirii valorii necesare a proprietăţii RecNo.

Determinarea, se găseşte sau nu cursorul pe prima sau ultima înregistare a setului de date, se realizează prin citirea valorilor proprietăţilor BOF şi EOF. Aceste proprietăţi sunt de tipul Boolean.

Proprietatea BOF arată, se găseşte sau nu cursoul pe prima înregistare a setului de date. Dacă această proprietate are valoarea True, atunci cursoul se află pe prima înregistare.

Proprietatea EOF arată, se găseşte dau nu cursorul pe ultima înregistrare a setului de date. Dacă această proprietate are valoarea True, atunci cursorul se afltă pe ultima înregistare.

Remarcă.Proprietatea BOF şi EOF concomitent au valoarea True, atunci cînd setul de date este vid.

Vom examina un exemplu simplu de utilizare a metodelor şi proprietăţiilor menţionate mai sus. Pentru început vom crea un tabel de tip Paradox cu ajutorul programului Database Descktop. Vom determina 5 cîmpuri: Nr, Nume, Adresa, Telefon , Salariu,conform fig.5.7. În afară de aceasta, vom adăuga 2 cîmpuri indexate Adresa şi Nume cu ajutorul butonului Define (Determină).

Vom vrea un dosar nou C:\MyDataBase si vom păstra în el tabelul cu numele MyTable cu ajutorul butonului Save As .

Acuma vom amplasa pe Form1 în mediul Delphi următoarele componente:

- Datasource1 de pe pagina DataAccess- Table1 de pe pag BDE - DBGrid1 de pe pagina Data Controls

Vom stabili următoarele proprietăţi pentru componenta în fereasta inspectorului de obiecete:

- Pentru componenta Table1: proprietăţile DataBaseName îi vom atribui valoarea „C:\MyDatabase” , proprietatii TableName ii vom atribui valoarea „MyTable”, proprietatii Active- true;

- Pentru componenta DataSource: DataSet- table1- Pentru componenta DBGrid1 proprietatii DataSource ii vom atribui valoarea DataSource1.

Page 12: 12 noiembrie luni

În aşa mod, noi am legat toate 3 componente între ele. Acum putem lansa aplicaţia cu ajutorul butonului F9 şi completa setul nostru vid de date în modul cum este arătat. Pentru completarea cîmpurilor vide ete de ajuns să exectuăm un click pe câmpul necesar şi să culegem valorile.

Acum vom adăuga butoanele Button1 şi Button2 de pe pagina Standard, care vor permite să trecem pe înregistrări înainte şi înapoi cu cîte o înregistrare. Proprietăţii Caption a primului button îi vom atribui valoarea „Înainte”, iar acelleaşi prioprietăţi a butonului 2 valoarea „Înapoi”. Acum a rămas să includem codul precedent înregistrarea a setului de date. La aceasta vom lua în consideraţie atingerea cursorului a primei sau aultimei înregistrări a setului de date şi deconecatarea butonuui respectiv.

În listingul care urmează se conţine codul de prelucrarea a evenimentului apăsării butoanelor 1 şi 2 cu comentarii:

Procedure TForm1.Button1.Click(Sender:TObject);

Begin

// daca butonul “Inapoi” este deconecta, atunci el trebuie conectat

If button2.enabled=false then button2.enbled=true;

//Daca nu s- a ajuns la utlima inregitrare, vom trece laurmoatarea

If not table1.EOF then Table1.Next;

//daca s- a ajuns la ultima inregitrare, com deconecta butonul “inainte”

If table1.EOF then button1.enabled:=false;

End;

Procedure TForm1.Button2Click(Sender:TObject);

Begin

//daca butonul “ Inainte” este deconectare atunci el tre conecat

If button1.enabled:=false then button2.enabled:=true;

//daca nu s-a ajuns la prima inregistare, vom trece la precedenta

If not table1.BOF then Table1.Prior:

//daca s-au ajuns la prima inregistare vom deconecta butonul “Inapoi”

If table1.BOF then Button2. Enabled:=false;

End;

Page 13: 12 noiembrie luni

În aşa fel la executarea codului din listingul de mai sus şi la încercarea de a trece la înregistarea care „se afla” după ultima sau înainte de prima, se vor deconecta butoanele respective. În fig 5.11 este arătată imaginea frmei cu butonul „Înainte” deconectat după încercarea de trecele la înregistrarea, care urmează după ultima.

Remarca. Acelaşi efect poate fi atins, amplasînd pe formă în locul butoanelor „Înainte” şi „Înapoi” compoenta DBNavigatori.

Vom adăuga acum pe foră încă un buton Button3 şi cîmpul textual Edit1. Vom atribui proprietăţii Caption a butonului Button3 valoarea „Suma”. Vom curăţi valoarea proprietăţii Text a cîmpului Edit1. Acum vom scrie codul de prelucarea a evenimentului de apăsare a butonului Button3, la execuţia căruia se vor suma valorile tuturor înregistrărilor cămpului Salariu şi suma primită va fi extrasă în componenta Edit1.

Procedure Tform1.Button3.Click(Sender:Tobject);

Var i:integer;//var pentru ciclu

Suma:real://in aceasta variabila se va calcula suma

Begin

Suma:=0;//anul[m valoarea sumei

Table1.first;// mut[m cursorul pe prima inregistrare //ciclu de la prima inregistrare pina la ultima

For i:=1 to table1.RecordCount do

Begin

// adunam valoarea cimpului Salariu a inregistrariii curente in val Suma

Suma:=Suma+Table1.FieldByName(’Salariu’).AsFloat;

Table1. Next;//ne mutam p e urmatarele inregistrari

End;

//extagem valoarea Sumei in cimpul Edit1

Edit1.Text:=FloattoStr(Suma);

Table1.first;//mut[m cursorul pe prima inregistare

End;

Permutarea pe marcaje se utilizează pentru trecerea pe o anumită înregistare a setului de date.

Page 14: 12 noiembrie luni

Marcajele reprezintă prin sinte nişte marchere a înregistrărilor. Ele se aseamănă cu marcajele, care le includem în carte, pentru a continua lectura de la pagina necesară. Marcajele au tipul Tbookmark, care nu este nimic altceva, decît indicator (Pointe), cu ajutorul căruia ne putem referi la anumite obiecte. În cazul nostru în calitate de aceste obiecte servesc înregistrările setului de date.

Remarcă.Indicator în caz general se numeşte variabilă, în care se păstrează adresa altei varabile în memoria operativă a compului.

Evident, că înainte de ultilizarea marcajului, el trebuie creat. Procesul de creare al marcajului este destul de simplu. Pentru aceasta în Delphi există o metodă specială- GetBookmark, de tipul Tbookmark. Apelarea acestei metode duce la crearea marcajului pe înregistarea curentă a setului de date.

Deoarice metoda GetBookmark reprezintă prin sine o funcţie, care returnează valoarea de tipul Tbookmark,înainte de apelarea ei trebuie să definim variabila de tipul Tbookmark şi să stabilim marcajul în această variabilă

Procedure Tform1.Button1Click(Sender:Tobject);

Var z:Tbookmark;

Begin

Table1.first;//trecem pe prima înregistrare a setului de date

Table1.next;//trece pe a 2 înregistrare a setulu ide date

Z:=table1.getbookmark;// stabilim marcajul

End;

Pentru trecerea pe marcajul existent se aplică metoda GotoBookmark. În calitate de parametru al acesteia metode se ulitizează variabila de tipul Tbookmark. Dacă marcajul nu a fost creat anterior şi valoarea parametrului este egală cu nil, atnci cursourl va rămîine pe loc.

Ştergerea marcajului se realizează pirn intermediul apelării metodei FreeBookmark. Parametrul meodei este variabila de tipul Tbookmark, ce conţine indicatorul pe marcaj. Apelarea resetează valoarea acesteia în nil şi eliberează resursele ocupate de ea. Dacă după ştergerea marcajului veţi încerca să treceţi pe el sau să-l ştergeţi repetat, va fi generată o situaţie de excepţie.

Pentru a afla, există sau nu marcajul , putem apela metoda BookmarrkValid. Această metodă reprezintă prin sine o funcţie, în calitate de parametru al căreia figurează variabila de tipul Tbookmark. Funcţia returnează valoarea true, dacă marcajul a fost găsit şi false dacă nu .

5.5 Filtre

Î nprocesul de lucru cu datele deseori apare necesitate de selectare a înregistrărilor, care satisfac cîteva criterii. Ppentru aceasta asupra seturilor de date se aplică filtrele.

Page 15: 12 noiembrie luni

Filtru- este un set de restricţii pentru înregistrări, care vor fi selectate în setul de date.

Procesul de setare al filtrului se numeşte filtrarea înregistrărilor. Mediul Delphi permite să filtrăm înregistrările sau după expresie dau supă a diapazon.

Implicait sau arătate toate întregistrările setului de date, adică filtrul nu se utilizează.

Filtrarea după expresie limitează setul de date prin înregistrări, care satisfac expresiilor, înscrise în filtru. Aceasta formă a filtrării este aplicabilă la orice cîmpuri, inclusiv şi la cele neindexate.

Remarcă.Filtrarea după expresie efectivă în cazul, cînd setul de date conţine un număr nu prea mare de înregistrări, deoarice la filtrare se vizează consecutiv toate înregistrările setului de date.

Pentru setarea expresiei fisltrului se utilizeză proprietatea Filter a setului de date. În componentţa acesteia expresi pot intra:

- Operaţiile aritmetice, aşa că adunarea, scăderea, înmulţirea şi împărţirea, marcate prin simbolurile *,/.+,-;

- Semnele operaşiilor logice And, OR, NOT.- Nume a cîmpurilor tabelului. Dacă în interioriul numelui cîmpului se conţine lacune el se înclude

în paranteze pătrate, de exemplu [Tel Number].- Paranteze rotunde pentru determinarea ordinii de efectuarea a operaţiilor aritmetice şi logice- Simboluri, adică valori setate, de exemplu şir, simbol şsau număr- Operaţiile de comparare >,<,>=,><=,<>.

Vom aduce cîteva exemple de setare a filtrului:

Number>10 and number< 20

Nume=’Ion’

Salariu< 2000

Primul filtru va selecta înregistrările ce se găsesc între a 10 şi a 20 înregistrare (numeber) a setului de date. Al 2-lea va lăsa în setul de date înregistrările pentru persoanele ce poartă numele (Nume) Iona. Al 3-lea caz noi vom vedea înregistrările numai pentru acei colaboratori la care salariu va constitui o sumă mai mică de 2000.

După stabilirea filtrului în proprietatea Filter el nu va fi activ pînă cînd proprietăţiii Filtred nu-i va fi atribuită valoarea True. Pentru deconectarea filtării este de ajuns să resetăm valoarea proprietăţii Filtred în False.

Proprietatea FiltreOptions a setului de date permite să setăm parametrii filtrării. Valoare se combină din 2 parametri:

- foCaseInsensitive- la setarea filtrului să nu se ia în consideraţie registrul literelor. Adică, de exemplu, pnetru filtru Nume=’Ion’ vor fi selecatate înregistrările „ion” , „ION” şi altele.

Page 16: 12 noiembrie luni

- foNoPartilaCOmpare- verificarea la o corespundere totală a valorii cîmpului filtrului. Se utilizeză pentru căutarea riguroasă. Dacă dorim să efectuăm o filtrare a înregistrărilor după o coincidenţă parţială a filtrelor, vom deconecta acest parametru. În acest caz putem înlocui simbolurile absente prin simbolul steluţi (*). În rezultatul setăriii filtrului Nume=’I*’ vor fi selecatate toate inregistrarile, numele persoanelor care incepe cu litera ‘I’.

Implicit ambii paramteri sunt deconecta’i.

Filtrarea după diapazon va selecta înregistrările, valoarea cîmpurilor ale cărora va nimeri în diapazonul setat. Aşa o formă a filtrării se realizează numai după cîmpurile indexate, ceea ce în mod esenţial accelearează procesul. Indicele cîmpului , după care se va realiza filtrarea trebuie să fie stabilit ca sindice curent în proprietatea IndexName sau IndexFieldNames. În cazul , în care indicele curente nu este stabilit, implicit se va utiliza indicele pricipal.

Pentru indicarea hotraului de sus şi de jos a diapazonului se aplică metodele SetRangeStart şi SetRnageEnd. Aceste metode nu au paramteri.

Pentru modificarea hotarelor stabilite anterior ale diapazonului putem utiliza metodele EditRangeStart şi EditRangeEnd.

Pentru a conecta filrarea după diapazon este necesar să chemăm metoda ApplyRange. Pentru deconectarea filtrării se aplică metoda CancelRange.

Valorile de hotar ale diapazonului pot fi atît incluse în diapazon, cît şi excluse din el. Pentru determinarea acestuia fapt se utilizează proprietatea KeyExclusive. Dacă proprietatea are valoarea true, atunci înregistrările de hotar în setul de date nu nimicesc, în caz contrar – nimices. Proprietatea trebuie stabilită separat pentru hotarul de sus şi de jos al diapazonul în dată după chemarea metodei de stabilire sa de redactare a hotarului.

Vom aduce un exemplu de setare a diapazonului :

Table1.SetRangeStart;

Table1.KeyExclusive:=true;

Table1.FieldByName(“Name”).Asstring:=’P’;

Table1.SetRangeEnd;

Table1.FieldByName(“Name”).AsString:=’Z’;

Table1.ApplyRange;

Dup[ execuţia programului din listingul de mai sus setul de date va conţine înregistrări cu nume care vor începe cu litera P pînă la Z. Indicele după cîmpu Nume trebuie să fie curent. În acest exemplu sunt setate ambele hotare ale diapazonului. Dacă unul din hotare nu se indice, atunci diapazonul va fi deschis. De exemplu, dacă a fost setat hotarul de jos(EditRnageStart), iar cel de sus

Page 17: 12 noiembrie luni

–nu, atunci vor fi evidenţiate înregistrările de la hotarul de jos pînă la valoarea maximă adimisibilă. În aşa fel de listingul de mai sus putem execlude 2 rînduri care sînt în plus, ce stabilesc hotarul de sus. Atunci vom obţine următorul cod:

Table1.SetRangeStart;

Table1.KeyExclusie:=true;

Table1.FieldByName(“Name”). Asstring:=’P’;

Table1.Fieldbyname(‘Salariu’).AsFloat:=2500;

Table1. ApplyRange;

În acest caz vor fi filtrate înregistările, în care numle colaboratorilor, salariul cărora este mai mare de 2500 de lei , începe cu litera de la P pînă la Z.

Desigur în calitate de indice curent trebuie să fie stabilit indicele, construit după 2 cîmpuri: Name şi Salariu. Dacă indicele curent după car ea fost realizată filtrarea setului de date a fosst modificat, atunci va mai înceta să mai funcţioneze.

5.6.Căutarea

În afară de filtrarea înregistrărilor, ce corespund căruiva criteriu, uneori este necesar să găsim o înregostrare concrtă. Căutarea înregistrării este foarte asemănătoare cu filtrarea, dar diferă prin faptul, că conţinutul setului de date la căutarea rămîine neschimbat, pur şi simplu se realizează trecerea la înregistrarea, ce satisface criteriul de căutaref.

În procesul de căutare a înregistrărilor( mai ales în tamelel mari ) foarte important este prezenţa indicelui la cîmpurile după care va fi efectuată căutarea. În primul rînd,acesta accelerează prelucrarea datelor. În al 2-lea rînd, unele metode de căutare lucrează numai cu cîmpurile indexate.

La căutarea înregistrărilor după valoarea cîmpurilor se utilizează metodele Locate şi Looku. Pentru aceste metode pot fi utilizate cîmpuri neindexate .

Metoda Locate este descrisă în felul următor:

Function Locate(const KeyFileds: String; cosnt KeyValues: Variant; Options:TlocateOptions):Boolean;

Metoda căutată înregistarea, care corespunde valorilor setate ale cîmpurilor. Parametrul KeyFields determină numele cîmpurilor, după care se va realiza căutarea. Cîmpurile se separă prin punct şi virgulă. În parametrul KeyValues se indică valorile acestor cîmpuri. Parametrul Options permite să stabilim criterii suplimentare de căutare:

- LoCaseInsensitive- nu se ia în consideraţie registrul literelor.- LoPartialKey- se ia în cosidereaţie o coincidenţă parţială a valorilor.

Page 18: 12 noiembrie luni

Remarcă. Dacă aţi stabilit valoarea LoPartialKey a parametrului Options, atunci Delphi automat va adăuga în el valoarea LoCaseInsesitive.

Vom aduce un exemplu de căutare după valoarea cîmpului:

Table1.Locate(“Salariu”,3512,[]);

În acest exemplu va fi realiazată căutarea înregistrării, valoarea cîmpului Salariu al căruia va fi egală cu 35122. Remarcăm, că-n exermplu precedent noi nici de cum nu analizăm rezultatul căutării. Prin urmare, dacă înregistarea căutării a fost găsită va fi realizată trecerea pe acestă înregistrare. În caz contrar nu se va realiza nicio acţiune. Funcţia Locate reutrnează valoarea true, dacă înregistrarea a fost găsită şi false- în caz contrar. Vom prezenta un exemplu, care arată utilizarea valorii returnate de fncţia Locate:

If Table1.locate(“Salariu”,3512,[])=false then MessageDlg(“Inregistarea nu a fost gasita, ntInformation[mbok],0);

Dacă înregistarea nu va fi găsită, va apărea o fereastră cu informaţia despre faptul că înregistrarea nu a fost găsită.

Exemplu de căutare a înregistrărilor după cîteva cîmpuri:

Table1.Locate(‘Nume, Adresa’, VarArrayOF(‘[‘,’M’],[LoCaseInsesitive,LoPartialKey]);

În acest caz căutarera se realizază după cîmpurile, ce conţin Numele şi Adresa. Va fi găsită prima înregitrare, valoarea cîmpului Name al cărueia începe cu litera I sau i, iar valoarea cîmpului adresa- cu litara M sau m.

Atrageţi atenţia la faptul că aici parametrul KeyValues este masiv, în care se conţin ambele valori. Valorile trebuie să fie separate prin virgulă şi incluse în pranteze pătrare.. Pentru setarea tipului masiv vom utiliza funcţia VarArrayOf.

În afară de metoda Locate, la căutarea înregistrărilor se aplică şi metoda Lookup:

Function Lookup(const KeyField:String; cosnt KeyValues:Variant; const RezultFields:String): Variant;

Parametrul KeyFields şi KeyValues se iniţializeză la fel ca şi metoda Locate. Metoda Lookup se aseamnă cu metoda Loceate. Dar există 2 deosebiri:

- Metoda Lookup- efectuează căutarea lo corespundere exactă a valrilor, inidcate în parametri-- Metoda Look up nu trece cursoul pe înregistrarea găsită, ci citeşte valorile cîmpurilor

înregistrării găsite.

Pentru obţinerea valorilor cîmpurilor a înregistrării găsite trebuie să indicăm denumirile necesare ale cîmpurilor în parametrul ResultFields. Valoarea doar a acestor cîmpuri va fi citită din înregistrarea găsită. Ordinea cîmpurilor în parametru nu are importanţă. În cazul căutării

Page 19: 12 noiembrie luni

reuşite, metoda Lookup returnează în calitate de rezultat valoarea de tip Variant. Dacă lista ResultFields este doar un singur element, atunci va fi returnată valoarea de tip Variant. Dacă însă lista conţine cîteva cîmpuri, la ieşire vom obţine un masiv de tip Variant. Dacă însă lista conţine cîteva cîmpuri, la ieşire vom obţine un masiv de tip Variant, ce va conţine atîtrea elemente, cîte au fost enumerate în parametrul ResultFields.

Metoda Lookup returnează valoarea Null la o căutare nereuşită.

În afară de cele 2 metode expuse mai sus, pentru căutarea înregistrărilor, în Delăphi mai există încă cîteva metode, ce permit să efectuăm căutarea după câmpuri indexate. Toate aceste metode putem convenţional să le divizăm în 2 grupe:

- Metode de căutare a înregistrării la o coincidenţă exactă a valorilor(FindKey, SetKey, EditKey şi GotoKey);

- Metode de căutare, ce permit coincidenţa parţială a valorilor( FindNearest, SetNeareast, EditNearest, GotoNearest)

Metode FindKey(KeyValues: array of const):Boolean;

Această metodă realizează căutarea înregistrării în setul de date la care valoarea cîmpurilor totalmente coincide cu valorile, indicate în parametrul KeyValues. Lista cîmpurilor nu se setează, deoarice se iau cîmpurile, setate de indicel curent. În cazul căutării cu succes, metoda returnează valoarea true şi permută cursorul pe înregistrarea găsită. În caz contrar returnează valoarea false.

În locul metodei FindKey putem apela concomitent 3 metode : SetKey, EditKey, GotoKey. Această metodă este asemănătoare cu metodele examintate mai sus SetRangeStart, Edit Range Start şi ApplyRage pentru filtarea setului de date .

Vom aduce un exemplu de utilizare a acestor metode:

Table1.indexFieldName:=’Nume’; //stabilitm indicele current

Table1.Setkey;

Table1.FieldByName(‘Nume’).Asstring:=’Petru’;

Table1.GotoKey;

Aici se realizază căutarea înregistrării după cîmpul Nume, valoarea căruia este egală cu Petru, Metoda FindNearest se aseamănă cu metoda FindKey, cu deosebire,c ă căutarea se realizează după o coincidere parţială a valorilor cîmpurilor indexate. Căutarea prin intermediul metodei FindeNearest permanent se realizează cu succes şi permtă cursorul pe înregistrare, care în cea mai mare măsură satisface criteriul de căutare.

Page 20: 12 noiembrie luni

În locul metodei FindNearest putem utiliza combinaţia metodelor SetNearest, EditNearest şi GotoNearest. Lucru cu aceste metode nu diferă prin nimic de combinaţia examinată ami sus SetKey, EditKey, şi GotoKey.

Iată un exemplu simplu de căutare a înregistrării prin intermediul metodei FindeNearest:

Table1.IndexFieldNames:=’Nume’;

Table1.FindNearest:=([‘B’]);

În acest caz, cursorul va fi permutat pe înregistarea, cîmpul Nume al căreia conţine valoarea, ce începe cu litera B. Dacă aşa înregistrare nu-i va fi găsită înregistaraea , valoarea cîmpului Nume al căreia începe cu cea mai aproapiată de B literă.