|
Sortarea bazelor de date
Pentru situatiile practice, o tabela ordonata este mult mai folositoare. Ordonarea unei tabele presupune:
alegerea unui camp al tabelului drept criteriu de sortare;
alegerea ordinii sortarii: crescatoare sau descrescatoare.
Daca exista mai multe inregistrari pentru care campul-criteriu are aceeasi valoare, ordinea lor poate sa nu fie importanta, dar, de multe ori, se doreste ca inregistrarile cu aceeasi valoare a campului criteriu sa fie ordonate la randul lor dupa alt criteriu. De exemplu, la un examen de admitere, primul criteriu este nota obtinuta, iar al doilea, este numele concurentilor.
Dezavantajele sortarii:
- se creaza noi fisiere pe disc;
este costisitoare ca timp.
Avantajul sortarii: cautarea foarte rapida care se poate efectua intr-o tabela sortata.
Sortarea se poate face prin comanda SORT, sau prin meniu.
Cu aceasta comanda se creaza o noua tabela, care contine o parte din informatiile tabelei curente, sortate dupa criteriile indicate.
Sintaxa este:
Efectul este crearea unei noi tabele cu numele specificat. Daca numele nu include si o extensie, se adauga implicit extensia .DBF. In aceasta tabela, sunt copiate inregistrarile din tabela activa, in ordinea valorilor din campul <camp 1>, in ordine crescatoare. Inregistrarile pentru care <camp 1> are aceeasi valoare sunt la randul lor sortate dupa <camp 2> , etc.
Implicit, sortarea dupa fiecare din aceste campuri se face in ordine crescatoare. Modul de sortare se poate preciza pentru fiecare camp in parte, incluzand dupa numele sau una din optiunile "/A" (pentru sortare crescatoare) sau "/D" (pentru sortare descrescatoare).
Obs.: Pentru campurile de tip logic, se considera .F. <.T.
Nu se poate face sortare dupa camp memo.
Daca dorim ca o tabela sa fie sortata dupa un camp de tip caracter fara a se face distinctie intre literele mari si mici, vom adauga dupa campul respectiv optiunea "/C".
Clauze:
ASCENDING| DESCENDING determina ordinea de sortare pentru toate campurile-criteriu pentru care nu s-a specificat una din optiunile "/A" sau "/D". Ordinea implicita este ASCENDING;
FIELDS <lista de campuri> - din structura noii tabele vor face parte numai campurile specificate. Informatia din celelalte campuri nu este copiata in noua tabela. Numele din lista se separa prin virgula.
FIELDS LIKE<lista sabloane> - in noua tabela sunt copiate campurile ale caror nume se potriveste cu unul din sabloane.
FIELDS EXCEPT<lista sabloane> - in noua tabela sunt copiate toate campurile in afara de cele ale caror nume se potriveste cu unul din sabloane.
<Domeniu> - poate fi ALL, REST, NEXT <numar> sau RECORD <numar> si face ca in noua tabela creata sa fie copiate inregistrarile din domeniul specificat. Domeniul implicit este ALL- toate inregistrarile sunt sortate.
Exemplu:
Fie tabelul CLIENT (ccod, cnume, cprenume, coras, cadresa, ctelefon, cafaceri). Sa se sorteze descrescator dupa cifra de afaceri.
list
sort on cafaceri/D to fclient
use fclient
list
2) Putem utiliza meniul sistem pentru sortare, astfel:
se activeaza tabela;
submeniul DATABASES
optiunea SORT; apare o fereastra de dialog ( se completeaza nume campuri, ordinea, domeniul, se salveaza, iar in final OK)
Indexarea Bazelor De Date
Indexarea este posibilitatea de ordonare logica a unei baze de date permitand parcurgerea intr-o anumita ordine a inregistrarilor fisierului prin sistemul pointerilor. Indexarea presupune extragerea din fiecare inregistrare a fisierului de baza, a cheii clasamentului care determina ordinea. Aceasta cheie impreuna cu numarul logic al inregistrarii respective vor fi aranjate intr-un fisier index (simplu indexat, cu extensia .IDX). Un index este in esenta un tablou cu 2 coloane. O coloana se refera la inregistrarea din baza de date prin valorile date de cheie, iar cealalta coloana contine nr. inregistrarii ce da pozitia initiala in baza de date. Ca efect deci, un fisier index este o sortare virtuala a unei baze de date, in timp ce inregistrarile bazei de date raman neschimbate.
Exemplu:
Fisier initial:
1 Oprean
2 Dragomir
3 Albu
4 Tatomir
Fisier sortat dupa nume:
1 Albu
2 Dragomir
3 Oprean
Fisier indexat dupa nume:
3 Albu
2 Dragomir
1 Oprean
Modul de lucru cu o baza indexata este urmatorul:
1. mai intai se creaza fisierul index asociat bazei de date (indexarea bazei de date); se dau chei si criteriile de indexare;
2. daca se doreste utilizarea bazei de date indexate anterior, se deschide baza de date si o data cu ea se deschid si fisierele index asociate, fie automat de FoxPro, fie manual de utilizator.
3. Se realizeaza operatiile dorite asupra bazei de date (stergere, modificare, listare), inregistrarile fiind vazute in ordinea data de indexul activ. Modificarea continutului bazei de date implica actualizarea automata a fisierelor index deschise pentru baza de date respectiva.
4. Dupa ce se termina lucrul cu baza de date, aceasta se inchide impreuna cu fisierele index asociate.
Fisierele index asociate unei baze de date pot fi:
a. simplu indexate (index simple, cu extensia .IDX) ce contin un singur criteriu de ordonare;
b. multiplu indexate (index compuse, cu extensia .CDX), care memoreaza mai multe criterii de ordonare, dar unul singur fiind activ la un moment dat.
Obs.: Ordinea in care este accesata baza de date este data de fisierul index activ, iar daca acesta este un fisier compus de tag-ul activ din fisierul index respectiv.
Crearea unui fisier index pentru o baza dedate se realizeaza cu comanda:
Clauze:
FOR<conditie> creaza un index in care apar (ordonate dupa criteriul impus) numai inregistrarile care indeplinesc conditia ceruta. Restul inregistrarilor continua sa existe fizic in fisier si nu sunt nici marcate pentru stergere, dar ele nu mai sunt vizibile pana cand indexul curent nu este inchis sau sters.
ASCENDING|DESCENDING cere ca indexarea inregistrarilor sa se faca in ordine crescatoare, respectiv descrescatoare. Implicit, indexurile sunt construite in ordine crescatoare. Mai mult, indexurile de tip .IDX nu pot fi create in ordine descrescatoare. Ele pot fi folosite ulterior in ordine inversa prin comenzi de tipul SET INDEX si SET ORDER.
COMPACT Un index compact ocupa ceva mai mult loc pe disc dar accelereaza accesarea inregistrarilor. Indexurile .CDX sunt intotdeauna compacte, deci nu este necesara clauza.
UNIQUE Pentru cazul in care se produc valori duplicat pentru campul de indexare, FoxPro va construi intotdeauna indexuri secundare. Daca dorim un index primar, atunci se specifica aceasta clauza.
ADDITIVE permite crearea unui fisier index pentru o baza de date, in conditiile in care fisierele index deschise anterior raman deschise.
Fisierele compuse sunt de 2 tipuri:
structurale, deschise si asociate automat bazei de date odata cu deschiderea acesteia, folosind comanda USE. Ele au acelasi nume cu baza de date, au extensia .CDX si sunt create folosind clauza TAG fara OF.
nestructurale, nu sunt deschise automat cu baza de date. Au nume diferit de numele bazei si va fi specificat in clauza OF.
Odata cu deschiderea unei baze de date, se pot deschide si fisiere index asociate acestei baze (care anterior au fost create cu o comanda INDEX):
[INDEX <lista fisiere index>|?]
[ORDER [<expresie numerica>|<fisier.IDX>|[TAG]<nume tag>[of<fisier.CDX>]]]
[ASCENDING|.]...
Daca nu se da ORDER, atunci primul fisier index din lista va fi cel activ.
<expresie numerica> este numarul de ordine al fisierului index simplu sau al tagului. Numararea se face astfel:
- mai intai fisierele.IDX (in ordinea din lista)
apoi tagurile din fisierele structurale (in ordinea definirii lor)
apoi tagurile din fisierele nestructurale in ordinea aparitiei lor
Daca se doreste deschiderea unor fisiere index pentru baza de date activa (dupa ce aceasta a fost deschisa) se utilizeaza comanda:
SET INDEX TO
[<index file list> | ?]
[ORDER <expN> | <idx index file> | [TAG] <tag name> [OF <cdx file>]
[ASCENDING | DESCENDING]]
[ADDITIVE]
Se vor deschide toate fisierele din lista. Noua lista de fisiere index o va inlocui pe cea veche, daca nu se specifica clauza ADDITIVE.
Pentru a inchide toate indexurile, in afara de cel compus structural, vom da comanda:
SET INDEX TO
Pentru a schimba ordinea de accesare, pentru a selecta un anumit fisier sau tag activ utilizam:
SET ORDER TO
[<expN1> | <idx index file> | [TAG] <tag name> [OF <cdx file>]
[IN <expN2> | <expC>]
[ASCENDING | DESCENDING]]
[IN <expN2> | <expC>] permite activarea unui index dintr-o alta zona de lucru decat cea activa. Este posibila si folosirea de aliasuri in locul numarului zonei de lucru.
SET ORDER TO dezactiveaza toate indexurile, fara a le inchide.
Obs.: Pentru a vedea care index este activ la un moment dat:
LIST STATUS sau
DISPLAY STATUS
Pot apare situatii cand doua sau mai multe inregistrari corespund la aceeasi valoare a cheii de indexare.
SET UNIQUE ON|OFF - din multimea de inregistrari cu aceeasi valoare a cheii de indexare, va putea fi accesata numai prima dintre acestea.
CLOSE INDEX - inchide toate fisierele index din zona de lucru curenta, in afara celui structural.
Fisierele index pot fi inchise si cu CLOSE ALL,USE,CLOSE DATABASES.
Modificarea continutului unei baze de date determina actualizarea fisierelor index deschise pentru baza de date respectiva, dar cele care nu sunt deschise in momentul executarii modificarilor nu vor fi reactualizate, deci vor memora o stare anterioara a bazei de date. Apar astfel discrepante intre baza de date si fisierul index respectiv, care trebuie reactualizat cu noul continut al bazei de date, operatie care poarta numele de reindexare. Reindexarea este necesara si cand se modifica tipul indexarii (cu acces unic sau acces multiplu - SET UNIQUE). Comanda folosita este:
REINDEX [COMPACT]- determina reactualizarea tuturor fisierelor .IDX sau a tagurilor din .CDX deschise curent pentru baza de date activa.
Functii referitoare la indexarea bazelor de date:
NDX(), CDX()- dau numele fisierelor index deschise intr-o zona de lucru.
Functia TAG - intoarce numele unui index simplu sau al unei etichete dintr-un index compus.
Numele fisierului simplu indexat activ sau al tagului activ cu functia ORDER
? ORDER()
Ordinea de accesare a inregistrarilor unui fisier indexat este determinata de cheia de indexare. Cheia de indexare se poate afla cu functia KEY.
Comenzi referitoare la indexare
a) trecerea de la un fisier simplu indexat la u tag dintr-un fisier index compus cu:
COPY INDEXES <lista de fisiere index>|ALL [TO <fisier.CDX>]
(tagurile vor avea acelasi nume cu fisierul.IDX)
b) operatia inversa: transformare tag in fisier .IDX:
COPY TAG <nume tag> [of <fisier.CDX>] TO <fisier.IDX>
c) dupa b), tagul ramane totusi in lista de indecsi a bazei de date. Pentru a sterge tagul din fisierul compus:
DELETE TAG...
Obs.: Daca dintr-un fisier compus se sterg toate tagurile, fisierul este sters in intregime de pe disc.
d) cautarea unei inregistrari intr-o baza indexata se face cu:
comanda SEEK <expresie>; daca este gasita, pointerul se pozitioneaza pe ea, iar FOUND() ia valoarea .T.; altfel pointerul se pozitioneaza dupa ultima inregistrare.
functia SEEK(expresie,[<expN>|<expC>]) intoarce o valoare logica care este .T. daca este gasita o inregistrare (prima din ele) pentru care valoarea cheii de indexare este egala cu expresia (din argumentul functiei); prin al doilea argument al functiei, se specifica baza de date in care se face cautarea (prin zona de lucru sau alias).
Obs.: Functia SEEK inlocuieste combinatia: comanda SEEK si functia FOUND().
Indexarea prin meniu
a) utilizarea optiunii NEW: se creaza fisierul index prin optiunea NEW din meniul FILE; apare o fereastra de dialog din care se selecteaza optiunea INDEX (baza de date trebuie sa fie deschisa anterior); apare o fereastra de dialog (vezi b); apoi OK.
b) REINDEX din submeniul DATABASE
c) optiunea SETUP din submeniul DATABASE sau din fereastra VIEW.
Pentru crearea unui nou fisier index se alege ADD din zona INDEX din dialogul SETUP. Apare dialogul Open Index File; Daca de aici se selecteaza NEW apare fereastra de dialog INDEX.
Observatii:
1) Presupunem ca avem 2 campuri numerice cafaceri, cavere si dorim indexare dupa cafaceri si in interiorul ei dupa cavere.
use client
index on cafaceri+cavere to alfa
list
Sistemul aduna valorile din campurile cafaceri si cavere si apoi face indexarea, deci se obtine un rezultat eronet.
Operatorul "+" are un sens pentru campuri, valori numerice, si alt sens pentru caracter.
Rezolvarea problemei se face prin:
a) sort on cafaceri, cavere to gama
sau
b) index on str(cafaceri)+str(cavere) to delta
2) Litera mare este diferita de litera mica, prin urmare se pot folosi pentru cautari functiile:
UPPER - transforma literele mici in litere mari
LOWER -transforma literele mari in litere mici.