|
FISA DE LUCRU "INDEXAREA, OPERATII CU TABELE INDEXATE"
Indexarea este o metoda de accesare rapida a continutului unei tabele, fara a duplica datele intr-o alta tabela. Indexarea presupune un set de pointeri ordonati logic prin valoarea unei chei.
Exemplu: ELEVI.DBF (nume,pren,clasa,absn)
Parcurgerea ordonata dupa nume se poate face prin construirea unui index care sa retina numarul inregistrarii din tabela si criteriul "nume". Liniile acestui index sunt ordonate dupa valorile cheii. Solicitarea de a accesa tabela ELEVI prin cheia "nume" va impune parcurgerea indexului. Pentru fiecare linie din index pointer-ul ajunge la articolul cu datele propriu-zise.
Indexarea realizeaza o legatura logica intre index si fisierul de date prin numarul articolului. Se observa in desenul alaturat:
|
Nume |
Pren |
Cls |
Absn |
1 |
Popescu |
Teodor |
11b |
5 |
2 |
Albulet |
George |
11a |
4 |
3 |
Stan |
Anca |
11c |
0 |
4 |
Marin |
Corina |
11a |
6 |
5 |
Popescu |
Angela |
11b |
7 |
|
Cheie |
2 |
11a |
4 |
11a |
5 |
11b |
1 |
11b |
3 |
11c |
|
Cheie |
2 |
Albulet |
4 |
Marin |
5 |
Popescu |
1 |
Popescu |
3 |
Stan |
Indecsii pot fi depusi in fisiere index (.CDX) asociate tabelei, au acelasi nume si se deschid/inchid odata cu tabela, orice operatie de actualizare asupra acesteia reflectandu-se automat si asupra tuturor indecsilor membri. Se mai numesc fisiere index structurale.
O tabela paote avea mai multi indecsi dar numai unul este, la un moment dat, activ si determina criteriul de parcurgere.
Tipuri de indecsi:
Crearea unui index
INDEX ON<exp> TAG <tag> [UNIQUE] [DESCENDING] [ASCENDING] [FOR<cond>]
Comanda INDEX permite crearea unui reper index cu numele <nume-tag>. Reperul se depune in fisierul structurat asociat tabelei. Criteriul de indexare este dat de expresia din clauza ON<exp>. Clauzele A/D pot indica sensul ordonarii, implicit fiind cel crescator.
Exemplu: fie tabela ELEVI.DBF cu urmatorul continut
|
Nume |
Prenume |
Clasa |
Absn |
Admis |
Data_n |
1 |
Popescu |
Teodor |
11b |
5 |
.T. |
11/11/94 |
2 |
Albulet |
George |
11a |
4 |
.T. |
09/09/95 |
3 |
Stan |
Anca |
11c |
0 |
.T. |
07/11/95 |
4 |
Marin |
Corina |
11a |
6 |
.F. |
08/09/95 |
5 |
Popescu |
Angela |
11b |
7 |
.F. |
09/09/95 |
index on clasa tag clasa unique | creare tag clasa in fisierul structural elevi.cdx
list | se permite accesul la primul articol al fiecarei clase
Activarea si precizarea indexului principal
SET ORDER TO TAG <tag> USE <bd> ORDER <tag>
Exemplu: use elevi order nume && activ este tag-ul nume din Elevi.cdx
set order to tag unu&& activ este tag-ul nume din Elevi.cdx
set order to 0 && se considera tabela neordonata
Stergerea unui index
Comanda DELETE TAG <tag> se foloseste pentru stergerea unui reper.
Exemplu: delete tag nume
Definirea vizuala a indecsilor
Realizarea interactiva a indecsilor pentru o tabela presupune deschiderea ferestrei Table Designer ( care se deschide cu comanda Modify Structure ).
Cautare rapida si pozitionare in tabela indexata
Una dintre functiile importante ale unei baze de date (SGBD - Sistem de Gestiune a Bazelor de Date) este accesarea rapida a tabelei. Conditia impusa este ca tabela sa fie indexata dupa expresia de cautare.
1.Comanda FIND <expC>| '<expC>' - cauta in tabela printre valorile de indexare prima valoare care este egala cu <expC> de cautare. Expresia de cautare este o constanta si trebuie incadrata obligatoriu de delimitatorii de sir daca espresia de cautare incepe cu spatii.
2.Comanda SEEK <exp> - cauta in tabela activa prima valoare a cheii de indexare care este egala cu expresia de cautare. Cautarea de opreste la primul articol din tabela care are cheia de indexare egala cu valoarea expresiei, daca o astfel de inregistrare exista. In cazul in care cautarea nu a avut succes se muta pointerul de fisier pe EOF sau pe BOF In functie de modul de setare a calculatorului - cu comanda SET NEAR ON | OFF - care determina unde se va situa pointerul dupa cautarea cu SEEK fara succes: pentru ON se pozitioneaza pe BOF, pentru OFF (implicit) se pozitioneaza pe EOF.
Exemplu : efectul comenzii SET NEAR ON/OFF
use elevi
index on cls tag cls
set near off
seek '12B' &&cautati o valoare care nu exista
?found()
.F. &&se afiseaza false pentru cautare esuata
set near on
seek '12A' &&cautati o valoare care exista
?recno() && va afisa numarul inregistrarii unde a gasit valoarea cautata
display nume && va afisa numele elevului cautat
3.Functiile de test asupra succesului sau insuccesului cautarii sunt:
FOUND() care intoarce .T. daca articolul s-a gasit;
EOF() care intoarce .T. daca articolul cautat nu s-a gasit
4.Functia de cautare SEEK (<exp>[,<nr-zona>/<alias>]) - cauta prima inregistrare pentru care cheia de indexare este egala cu <exp>. Daca se gaseste, functia intoarce .T. iar indicatorul de inregistrari se va pozitiona pe inregistrarea gasita; altfel intoarce .F. si pointerul de fisier va fi pozitionat dupa ultimul articol. Cautarea se realizeaza in fisierul identificat prin <alias> sau numarul zonei in care este deschis.
ExempluL1: pentru tabela ELEVI.DBF
use elevi order nume
find 'popescu' && se cauta persoana cu numele Popescu
?found() && functia FOUND va intoarce .T.
var='popescu' && se poate face cautarea cu o variabila var
find var && dar se apeleaza la macrosubstitutie
?recno() && functia va intoarce numarul curent al inregistrarii cautate
var='popescu' &&alta metoda de cautare - cu seek
seek var
?found()
brow
ExempluL2: efectul comenzii SET EXACT ON/OFF - comanda se foloseste pentru compararea a 2 siruri de caractere de lungimi diferite. Argumentul ON cere specificarea a sirului de caractere integral pentru cautarea unei inregistrari, iar argumentul OFF (implicit) cere specificarea primelor caractere sin sirul cautat
set exact on
seek 'popescu'
set exact off &&asigura cautarea cu o parte a cheii de indexare
seek 'pop '
Exercitiu: Fie tabela MECIURI.dbf care retine toate meciurile din campionat.
|
cod |
e1 |
e2 |
localitate |
data_desf |
ora |
1 |
|
Dinamo |
Farul |
Constanta |
08.09.05 |
10 |
2 |
|
Poli |
Corvinul |
Iasi |
08.09.05 |
15 |
3 |
|
Rapid |
Dinamo |
Bucuresti |
15.09.05 |
10 |
4 |
|
Steaua |
Rapid |
Bucxuresti |
15.09.05 |
15 |
Cerinta:completati 'codul' fiecarui meci cu o informatie care sa identifice pozitia meciului in programul competitional, cronologic, pentru aceeasi data, in ordinea alfabetica a locului de desfasurare si, daca sunt meciuri in aceeasi zi, in acelasi loc, le vom aranja in functie de ora.
use meciuri
sort on data_desf,localitate, ora to man
use man
replace all cod with recno()
list
use
erase meciuri.dbf
rename man.dbf to meciuri.dbf
Concatenarea fisierelor. Comanda JOIN
Crearea unui nou fisier prin preluarea structurii si a continutului din 2 tabele de date existente se realizeaza prin comanda:
JOIN WITH <alias> TO <fis.dbf> FOR <cond> [FIELDS <lista_campuri> /LIKE <sablon> /EXCEPT <sablon>]
Comanda permite concatenarea a 2 fisiere cu generarea altuia precizat in clauza TO <fis.dbf> . Un fisier este deschis in zona de lucru curenta si este numit fisier principal. Celalalt fisier este specificat in clauza WITH prin aliasul lui si este fisier secundar. Comanda se executa astfel:
se parcurge in intregime fisierul principal, pentru fiecare articol al acestuia se verifica intreg fisierul secundar;
daca conditia specificata in clauza FOR este indeplinita atunci se va genera un articol nou in tabela destinatie.
ExempluL: Fie o tabela cu personalul unei unitati si o alta cu toti abonatii telefonici din Braila. Se doreste crearea altei tabele cu datele personale a ale salariatilor firmei avand si numarul lor de telefon. Secventa de comenzi este:
select 1
use pers alias a
select 2
use telefon alias b
select 1
join with b to rez for a->nume=b->nume
use rez
list
PERS.DBF
|
nume |
adresa |
1 |
popa |
braila |
2 |
baciu |
iasi |
3 |
albu |
cluj |
4 |
david |
arad |
REZ.DBF
|
Nume |
Telefon |
Adresa |
1 |
Popa |
111111 |
Braila |
2 |
Baciu |
333333 |
Iasi |
3 |
Albu |
222222 |
Cluj |
TEL.DBF
|
nume |
telefon |
1 |
popa |
111111 |
2 |
albu |
222222 |
3 |
baciu |
333333 |
4 |
rosca |
444444 |