|
Ordonarea unei baze de date
O baza de date este ordonata dupa un anumit criteriu daca fiecare inregistrare a acesteia respecta criteriul dat, in raport cu inregistrarile anterioare si posterioare. Compararea a doua inregistrari ale unei baze de date se reduce de fapt la compararea a doua valori ale unei expresii, fiecare valoare corespunzand unei inregistrari de comparat, expresia fiind specificata criteriului de ordonare. Astfel, compararea a doua inregistrari se reduce la compararea valorilor expresiei respective.
Expresia poarta numele de cheie de ordonare, valoarea ei diferind de la inregistrare la inregistrare.
O tabela este ordonata crescator sau descrescator daca fiecare inregistrare din aceasta este mai mare, respectiv mai mica decat inregistrarea anterioara.
In FOXPRO exista doua metode de ordonare a unei baze de date :
ordonarea propriu-zisa(sortarea) a bazei de date, prin schimbarea intre ele a inregistrarilor, dupa un anumit algoritm, pana cand acestea sunt in ordinea dorita. Astfel se obtine o noua baza de date care contine aceleasi inregistrari ca si cea de la care s-a pornit, dar in ordinea dorita.
indexarea unei baze de date, aceasta insemnand crearea unui nou fisier, care contine informatii cu privire la ordinea inregistrarilor bazei de date. Si in acest caz se obtine un nou fisier, fisier index, dar acesta nu contine inregistrarile bazei de date, ci memoreaza numai ordinea acestora.
Se realizeaza cu comanda SORT, care are urmatoarea sintaxa:
SORTTO < fisier > ON < camp1 > [ /A | /D ] [ /C ]
,< camp2 > [ /A | /D ] [ /C ] ..]
[ ASCENDING | DESCENDING ]
[< domeniu > ] [ FOR < expl1 > ] [ WHILE < expl2 > ]
[ FIELDS < lista campuri >]
Comanda sorteaza baza de date activa, creand o noua BD, in care sunt depuse inregistrarile selectate in ordinea specificata. Baza de date noua va contine campurile specificate la clauza FIELDS sau toate campurile, in cazul cand aceasta clauza lipseste. Noua BD va purta numele < fisier >, la care FOXPRO adauga extensia .dbf, in cazul cand nu se specifica explicit o extensie.
Cheia de ordonare este data de campurile < camp1 >, < camp2 >, . specificate dupa clauza ON a comenzii. Clauzele /A si /D sunt asociate campului dupa care acestea urmeaza, specificand tipul de ordonare pentru campul respectiv: A crescator si D descrescator.
Clauza /C se foloseste dupa campurile de tip sir de caractere pentru a face compararea acestor campuri insensibila la tipul literelor, majuscule sau litere mici (a este egal A, b cu B si asa mai departe). Implicit, tipul literelor este luat in seama la comparatie.
Pentru specificarea a doua clauze dupa un camp (Asi C sau D si C) se folosesc constructiile AC si DC, in functie de ordinea dorita.
Clauzele ASCENDING si DESCENDING sunt similare clauzelor /A si /D, numai ca se refera la toate campurile din lista. In lipsa acestor clauze, ordinea implicita este crescatoare, deci ASCENDING. Clauzele asociate campurilor, /A si /D, au prioritate fata de clauzele ASCENDING si DESCENDING.
< domeniu >, FOR si WHILE selecteaza inregistrarile ce se vor ordona si vor fi trecute in noua BD.
Exemplu : Se ordoneaza baza de date AGENDA.dbf, cheia de ordonare fiind nume, iar ordinea crescatoare. Noua baza de date va purta numele agenda_s.dbf.
use agenda
sort to agenda_s on nume/AC
use agenda_s
list
use
Sa se obtina din baza de date agenda, lista tuturor persoanelor de sex feminin,in ordine crescatoare a varstei.
Use agenda
Sort to agenda_f on data_nas A for sex="F"
Use agenda_f
List
Use
Indexarea unei BD presupune crearea unui fisier nou, numit fisier index asociat, in care se memoreaza ordinea inregistrarilor din BD. Accesul la o anumita inregistrare se face prin intermediul fisierului index.
Sa luam urmatorul exemplu: o baza de date agenda.dbf in care avem incarcat 4 inregistrari
agenda.dbf
Nr
Nume
Prenume
Agenda.idx
1
2
3
4
Toma
Dumitru
Petrescu
Vlad
Alexandru
Mihai
Ioana
Iulian
2
3
1
4
Indexarea acestei BD, dupa nume in ordinea alfabetica presupune crearea fisierului agenda.idx in care se vor memora pozitiile inregistrarilor din BD, in ordinea dorita. Accesul la inregistrari se face prin intermediul fisierului index asociat.
Fisierul index ce pot fi asociate unei BD pot fi de doua tipuri :
fisiere index simple (cu extensia .idx), care contin o singura cheie de ordonare
fisiere index compuse(cu extensia .cdx), care memoreaza mai multe chei de ordonare , numite etichete, una singura fiind activa la un moment dat si anume eticheta activa.
O BD poate avea mai multe fisiere index asociate, dar numai unul singur va fi activ la un moment dat, acesta fiind numit fisierul index activ.
Crearea unui fisier index pentru o baza de date se realizeaza cu comanda INDEX, ce are urmatoarea sintaxa:
INDEX ON < expr > TO < fisier.idx > | TAG < nume eticheta >
Cheia de indexare va fi specificata prin expresia < expr >, aceasta continand campuri ale BD active.
Fisierul index creat se va transmite prin < fisier.idx > in cazul unui fisier index simplu si prin < fisier.cdx > in cazul unui fisier index compus. Extensia implicita pentru primul tip de fisier este .idx iar pentru al doilea tip este .cdx.
Exemplu: crearea unui fisier index simplu
use agenda
index on nume to agenda_n
list
use
crearea unui fisier index compus
use agenda
index on data_nas tag data_nas
list
use
O data cu deschiderea unei BD, se pot deschide si o serie de fisiere index asociate BD, incluzand clauza INDEX in comanda USE.
Exemplu : use agenda index agenda_n
sau
use agenda order tag data_nas
Se face cu comanda SEEK.
cauta in baza de date activa, indexata (neaparat) prima inregistrare pentru care cheia de indexare ia valoarea < expr >.
Daca este gasita o asemenea inregistrare, indicatorul de inregistrari se va pozitiona pe aceasta, functia FOUND() va returna valoarea .T. iar functia EOF() va returna valoarea .F. .
Daca nu este gasita, indicatorul de inregistrari se va pozitiona dupa ultima inregistrare, FOUND() va returna valoarea fals, iar EOF() va returna valoarea adevarat.
Exemplu
close all
use agenda index agenda_n
seek ´Popescu´
?found()
?eof()
display
use
Comanda numara inregistrarile din domeniul specificat prin < domeniu >, FOR si WHILE (domeniul implicit este ALL), depunand rezultatul in variabila < variabila >, care va fi creata in cazul cand nu exista.
Exemplu : Se vor numara baieti din baze de date agenda.dbf (sex=M)
close all
use agenda
count for sex="M" to nrbaieti
?nrbaieti
use
Comanda SUM
Realizeaza sumarea unor campuri numerice ale BD, din inregistrarile selectate.
Sintaxa : SUM [< lista expresii >][< domeniu >][FOR < expl1 >]
[WHILE < expl2 >][TO < lista variabile >]
< lista expresii >= este formata din expresii care contin campuri numerice ale bazei de date, valorile acestor expresii urmand sa fie insumate, pentru toate inregistrarile selectate prin < domeniu >,FOR si WHILE. Daca lista lipseste, se vor insuma toate campurile numerice ale BD.
Rezultatele obtinute vor fi depuse in variabilele respective din < lista variabile >.
Exemplu : Sa presupunem ca avem o BD in care memoram pentru fiecare persoana ce datorii are de dat si ce datorii are de primit. Baza de date pe care o vom numi DATORIE.dbf , are urmatoarea structura :
NUME C(10)
PRENUME C(20)
DATORAT N(22)
PRIMIT N(22)
Pentru a afla ce suma au de dat si ce suma au de primit vom folosi urmatoarea secventa de instructiuni .
use datorie
sum datorat to dat_d
sum primit to prim_p
?"Datoria este de : " , dat_d
?"Au de primit : " , prim_p
use
Comanda LOCATE
Sintaxa : LOCATE FOR <expl1> < domeniu > WHILE < expl2 >
Comanda cauta prima inregistrare care respecta conditia <expl1> in tabela activa. Domeniul inregistrarilor care se testeaza este dat de clauzele < domeniu > si WHILE, cel implicit fiind ALL.
In caz de reusia, adica la gasirea unei inregistrari care respecta conditia <expl1>, indicatorul de inregistrari se va pozitiona pe inregistrarea respectiva, functia FOUND() va returna valoarea .T., iar functia EOF() va returna valoarea .F.. In caz contrar, indicatorul de inregistrari va fi pozitionat dupa ultima inregistrare (numarul total de inregistrari + 1), FOUND() va returna fals, iar EOF() va returna valoarea adevarat.
Intr-o tabela pot exista mai multe inregistrari ce respecta o conditie data. Prima dintre acestea va fi gasita folosind comanda LOCATE, iar urmatoarele vor fi gasite prin intermediul comenzii CONTINUE.
Sintaxa : CONTINUE
Comanda gaseste urmatoarea inregistrare care respecta conditia specificata in ultima comanda LOCATE aplicata tabelei active. Testarea reusitei sau nereusitei cautarii se face ca la comanda LOCATE, cu ajutorul functiilor RECNO(), FOUND() si EOF().
Ex: Sa se gaseasca primele doua persoane de sex feminin din tabela agenda.
Close all
Use agenda
Locate for sex="F"
?FOUND()
?EOF()
?RECNO()
CONTINUE
?FOUND()
?EOF()
?RECNO()
close all