Documente noi - cercetari, esee, comentariu, compunere, document
Documente categorii

Ordonarea unei baze de date

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.

Sortarea tabelelor

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

list

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 BD

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

Cautarea unei anumite inregistrari intr-o BD indexata

Se face cu comanda SEEK.

Sintaxa : SEEK < expr >

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

Extragerea unor informatii din BD

Comanda COUNT

Sintaxa: COUNT [< domeniu >][FOR < expl1 >][WHILE < expl2 >]

TO [< variabila >]

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