Exploatarea unui tabel consta în:
Operatii de actualizare (adaugarea unei noi înregistrari, stergerea unei înregistrari sau modificarea valorilor unor câmpuri din înregistrari).
Operatii de consultare (interogare) prin care se pot obtine informatii din tabel. Aceste operatii presupun si operatii de cautare a anumitor înregistrari (trebuie sa precizeze criteriul de cautare si modul de afisare a informatiilor).
Exploatarea unui tabel se poate face:
Secvential, adica în ordinea fizica a înregistrarilor (ordinea în care au fost scrise în tabel).
În acces direct, adica în ordinea logica a înregistrarilor (ordinea data de valoarea crescatoare sau descrescatoare a unui câmp din tabel). Ordonarea logica se face prin crearea unui fisier numit fisier de index care memoreaza ordinea logica a înregistrarilor.
Sortarea este operatia de ordonare fizica a înregistrarilor dintr-un tabel. Prin aceasta operatie se creeaza un nou tabel în care înregistrarile sunt scrise conform criteriului de ordonare precizat.
Indexarea este operatia de ordonare logica a înregistrarilor dintr-un tabel. Prin aceasta operatie se creeaza un fisier special asociat tabelului, numit fisier de index, care se exploateaza împreuna cu tabelul. El are doua câmpuri: unul care contine valoarea câmpului folosit pentru indexare (care determina ordonarea) numit si cheie de indexare si un câmp cu numarul înregistrarii din tabel în care se gaseste câmpul.
Indiferent de modul în care este exploatat tabelul, algoritmul de exploatare cuprinde urmatorii pasi: deschiderea tabelului, prelucrarea si închiderea.
Tabelul este memorat într-un fisier de date care are acelasi nume ca si tabelul si extensia .dbf. Pentru a putea prelucra înregistrarile dintr-un tabel, trebui deschis fisierul care îl contine.
use <nume_fisier>
Dupa ce s-au terminat de prelucrat înregistrarile din tabel, fisierul trebuie închis.
Operatiile puse la dispozitie de Visual FoxPro pentru administrarea datelor dintr-un tabel al bazei de date pot fi grupate astfel:
Crearea unui tabel
crearea structurii tabelului,
manipularea structurii tabelului;
Exploatarea unui tabel în acces secvential
localizarea înregistrarilor prin parcurgere secventiala a înregistrarilor din tabel,
actualizarea tabelului,
controlarea accesului la înregistrari,
consultarea tabelului;
Exploatarea unui tabel în acces direct
crearea si administrarea fisierelor index,
localizarea înregistrarilor dupa valoarea unei chei.
1.1 Crearea tabelului
Un tabel poate fi creat în interiorul unei baze de date ca tabel al bazei de date sau în afara ei ca tabel liber.
Crearea unui tabel se face în doua etape:
crearea structurii tabelului,
introducerea datelor în tabel, conform structurii definite.
La definirea structurii tabelului poate fi definit si indexul structural
compus (poate contine mai multe chei de indexare numite etichete index -tag). Extensia sa este .cdx. Este actualizat automat dupa fiecare operatie de actualizare a tabelului. Indecsii pot fi:
Primary - cheia primara. Se poate folosi numai în cazul în care tabelul se gaseste într-o baza de date. Numai un singur index poate fi folosit pentru cheia primara.
Candidate - cheia candidat. Este o cheie care poate deveni cheie primara deoarece nu contine valori duplicate si nici valori nule. si ea este utila numai in baza de date.
Unique - cheia unica. Este o cheie care se considera ca nu contine valori duplicate. Daca exista doua înregistrari cu aceeasi valoare a cheii unice, va fi vizibila logic numai prima dintre ele, chiar daca fizic exista amândoua.
Regular - cheia obisnuita.
Folosind indexarea puteti:
sa ordonati înregistrarile afisate în tabel,
sa ordonati valorile duble introduse într-un câmp,
sa definiti relatii între tabele.
Crearea structurii tabelului
Prin definirea structurii:
interactiv - structura se defineste prin intermediul controalelor din fereastra document a generatorului de tabele Table Designer; deschiderea ferestrei:
create<nume_tabel>
folosind limbajul de comanda
create table <nume_tabel> (<nume_câmp1> <tip1> (<latime1> [,<poz_zec1>] <nume_câmp2> <tip2> (<latime2> [,<poz_zec2>] ..]
unde <nume_tabel> este numele tabelului care se creeaza si a carui structura se defineste prin precizarea pentru fiecare câmp a numelui sau, a tipului, a dimensiunii si a numarului de pozitii din partea fractionara.
Prin preluarea structurii dintr-un alt tabel:
dintr-un tabel de structura. Tabelul de structura este un tabel în care se pastreaza structura unui alt tabel(proprietatile câmpurilor)
create <nume_tabel1> from <nume_tabel2>
unde <nume_tabel1> este numele tabelului a carui structura se creeaza prin preluarea structurii din tabelul de structura care are numele <nume_tabel2>.
dintr-un tabel deschis.
copy structure to <nume_tabel> [fields <lista_nume_câmpuri>]
unde <nume_tabel> este numele tabelului care se creeaza si a carui structura se preia din tabelul deschis în acel moment; se pot prelua toate câmpurile sau numai câmpurile precizate în lista clauzei fields.
Manipularea structurii tabelului
Afisarea structurii tabelului
display | list structure [to printer | to file <nume_fisier>] [no console]
deosebirea dintre cele doua comenzi consta în modul în care se face afisarea, display structure afiseaza în regim paginat (dupa fiecare pagina se asteapta confirmarea utilizatorului pentru a continua afisarea), iar comanda list structure deruleaza pe ecran toata informatia.
Implicit afisarea se face pe ecran, explicit se poate face la imprimanta sa într-un fisier, sau numai la unul dintre acestea, îmbinându-se iesirea catre ecran (adverbul no console).
Modificarea structurii tabelului
Se poate modifica structura unui tabel deschis în prealabil folosind comanda:
modify structure
Se deschide caseta de dialog Table Designer si se pot face urmatoarele modificari:
inserare de câmpuri noi,
stergere de câmpuri,
modificarea caracteristicilor unui câmp.
Copierea structurii tabelului
Se poate copia structura tabelului deschis:
într-un tabel de structura. Acest tabel are o structura predefinita. El contine 11 câmpuri, ctte un câmp pentru fiecare proprietate a câmpului.
copy to <nume_tabel> structure extended
unde <nume_tabel> este numele tabelului în care se va pastra structura.
într-un tabel precizat prin <nume_tabel> Pot fi copiate toate câmpurile din structura sau numai o parte din ele.
copy structure to <nume_tabel> [fields <lista_nume_câmpuri>]
Manipularea si controlarea câmpurilor dintr-un tabel
controlul accesului la câmpuri poate fi activat (on) sau inhibat (off) cu comanda:
set fields on|off
Valoarea implicita este off.
se pot preciza câmpurile la care utilizatorul poate avea acces:
set fields to [<lista_câmpuri> | all]
numele câmpului dintr-o pozitie precizata se obtine cu functia field(<n>), unde <n> este numarul de ordine al câmpului;
numarul de câmpuri din tabel se obtine cu functia fcount();
lungimea unui câmp din tabel se obtine cu functia fsize(<nume_câmp>);
dimensiunea înregistrarii din tabel se obtine cu functia recsize().
1.2 Pozitionarea pe o înregistrare din tabel
La un moment dat exista o singura înregistrare care poate fi prelucrata. Ea se numeste înregistrarea curenta. Numarul înregistrarii curente se pastreaza în contorul de înregistrare. El se mai numeste indicator de înregistrare sau pointer de înregistrare.
1.2.1 Pozitionarea dupa numarul înregistrarii
comanda goto sau go pozitioneaza pointerul de înregistrare pe o anumita înregistrare din tabel, precizata prin numarul sau.
goto | go <n> | top |bottom
unde <n> reprezinta numarul înregistrarii, top prima înregistrare, iar bottom ultima înregistrare.
comanda skip pozitioneaza pointerul de înregistrare peste un anumit numar de înregistrari, relativ fata de înregistrarea curenta.
skip[<n>]
Daca n>0 se face saltul peste n înregistrari înainte, daca n<0 se face saltul înapoi. În cazul în care n lipseste, saltul se face la înregistrarea urmatoare.
1.2.2 Pozitionarea dupa un criteriu logic de cautare
comanda locate pozitioneaza pointerul de înregistrare pe o înregistrare care îndeplineste conditia specificata
locate for <cond_1> [<domeniu>] [while <cond_2>]
Daca nu se gaseste nici o înregistrare care sa îndeplineasca conditia de la clauza for, pointerul va fi pozitionat dupa ultima înregistrare, marcajul eof. Domeniul de actiune implicit al comenzii este all, explicit comanda putând actiona pe anumite înregistrari precizate de <domeniu>sau prin clauza while.
comanda continue continua procesul de cautare definit de ultima comanda locate. Comanda continue se foloseste numai împreuna cu comanda locate.
1.2.3 Controlarea pozitionarii în tabel
Prin intermediul functiilor se pot obtine informatii despre înregistrarile din tabel:
reccount() - numarul de înregistrari din tabel;
recno() - numarul înregistrarii curente;
eof() - furnizeaza un rezultat logic .T. daca pointerul este pozitionat pe ultima înregistrare din tabel;
bof() - furnizeaza un rezultat logic .T. daca pointerul este pozitionat pe prima înregistrare din tabel;
found() - furnizeaza un rezultat logic .T. daca a avut succes operatia de cautare.
1.3 Actualizarea tabelului
Presupune trei tipuri de operatii:
adaugarea de noi înregistrari,
stergerea unei înregistrari,
modificarea câmpurilor dintr-o înregistrare.
1.3.1. Adaugarea de noi înregistrari
de la tastatura
append - se deschide o fereastra de editare de tip Edit. La sfârsitul fisierului este adaugata o înregistrare vida, care se completeaza. Operatia de adaugare se termina când se închide fereastra.
prin adaugarea unei înregistrari vide
append blank - la sfârsitul tabelului se adauga o înregistrare vida ce urmeaza a fi completata ulterior.
dintr-un alt tabel
append from<nume_tabel>[fields <lista_câmpuri>][for<cond>]
Adauga înregistrarile din tabelul <nume_tabel> sau numai anumite câmpuri, precizate la clauza fields. Clauza for permitând de asemenea adaugarea înregistrarilor care îndeplinesc conditia <cond>.
insert [before][blank]
Implicit se insereaza o înregistrare vida dupa înregistrarea curenta si se deschide fereastra de editare pentru a completa valorile câmpurilor. Explicit, inserarea se poate face înaintea înregistrarii curente, folosind clauza before, sau se poate insera numai o înregistrare vida folosind clauza blank.
1.3.2. stergerea înregistrarilor
stergerea logica - nu înseamna eliminarea lor fizica, ci numai marcarea pentru stergere.
delete [domeniu] [for <cond_1>] [while <cond_2>]
Implicit este stearsa logic înregistrarea curenta. Explicit poate fi sters logic un grup de înregistrari precizat prin <domeniu> sau clauzele for sau while.
refacerea înregistrarilor sterse logic
recall [domeniu] [for <cond_1>] [while <cond_2>]
stergerea fizica - eliminarea fizica din tabel a înregistrarilor marcate logic pentru stergere.
pack
stergerea fizica a tuturor înregistrarilor - elimina toate înregistrarile, pastrând numai structura tabelului.
zap
Controlarea operatiei de stergere se poate face prin:
comanda care stabileste cum pot fi folosite înregistrarile sterse logic:
set deleted on off
unde on înseamna ca înregistrarile sterse logic nu pot fi folosite de comenzile care au în sintaxa clauzele for si while.
functia care testeaza daca înregistrarea curenta este marcata logic pentru stergere:
deleted
1.3.3. Modificarea înregistrarilor
prin valori precizate
replace<camp_1>with<expr_1>[additive] [,<camp_2> with <expr_2>[additive].][<domeniu>] [for <cond_1>] [while <cond_2>]
interactiv, de la tastatura
browse | edit[fields<lista_campuri>] [<domeniu>] [for<cond_1>][while<cond_2>][font<nume_font> [, <n>]] [style<nume_stil>] [freeze<nume_camp>] [last|noinit] [noappend] [nodelete] [noedit|nomodify] [title <nume_t>] [normal] [partition <m>] [lpartition] [nolink] [ledit] [redit] [valid][f] <cond_3> [error<mesaj>]] [when<cond_4>] [width <p>]
1.3.4. Controlarea accesului la înregistrari
Pentru a putea exploata un tabel în acces direct, trebuzie organizat astfel încât sa aveti acces direct la o înregistrare în functie de valoarea unui câmp sau a unor câmpuri care vor forma cheia de acces. Solutia este de ordonare logica a înregistrarilor prin intermediul fisierelor index.
Visual FoxPro permite crearea a doua tipuri de fisiere de index:
index simplu care contine o singura cheie de indexare într-un fisier
index compus care contine mai multe chei de indexare într-un fisier
Crearea unui index
Daca indexul compus structural se creaza împreuna cu tabelul, ceilalti indecsi se creaza dupa ce a fost creat tabelul, prin comanda:
index on <expresie_index> to <nume_fisier.idx> | tag <nume_eticheta> [for <cond_1>] [ascending | descending]
Deschiderea unui index
În afara de indexul compus, care se deschide automat la deschiderea tabelului, ceilalti indecsi trebuie deschisi fie prin optiunea Open - File, fie folosind una din comenzile:
la deschiderea tabelului
use <nume_tabel> index <lista_fisiere.inx>
order <nume_fisier.idx>|tag <nume_eticheta> of <nume_fisier.cdx>
[ascending|descending]
dupa deschiderea tabelului
set index to <lista_fisiere.idx>[ascending|descending][additive]
order <nume_fisier>| tag <nume_eticheta> of <nume_fisier.cdx>
|