Home - Rasfoiesc.com
Educatie Sanatate Inginerie Business Familie Hobby Legal
Doar rabdarea si perseverenta in invatare aduce rezultate bune.stiinta, numere naturale, teoreme, multimi, calcule, ecuatii, sisteme




Biologie Chimie Didactica Fizica Geografie Informatica
Istorie Literatura Matematica Psihologie

Foxpro


Index » educatie » » informatica » Foxpro
» Ordonarea datelor din tabela


Ordonarea datelor din tabela


Ordonarea datelor din tabela

    Gasirea unei carti intr-o biblioteca ce contine cateva sute de mii de volume ar fi practic imposibila daca lucrarile nu ar fi ordonate dupa un anumit criteriu, de cele mai multe ori in ordine alfabetica sau a numerelor autorilor. Sau ce ar insemna gasirea numarului de telefon al unei persoane intr-o carte de telefon ce nu ar fi ordonata alfabetic. Desi calculatorul realizeaza cautarea secventiala a unor date mult mai repede decat ar face-o omul, totusi viteza de cautare este insuficienta in multe aplicatii care lucreaza cu un volum mare de date.

Astfel ca ordonarea datelor din tabele reprezinta o operatie deosebita de importanta in lucrul cu bazele de date. Din acest motiv, tehnicile de ordonare s-au diversificat si imbunatatit substantial de-a lungul timpului, un criteriu important de apreciere a SGBD-urilor moderne fiind acela al facilitatilor de ordonare a datelor din tabele.



In cazul bazelor dedate,in care lucrul se realizeaza la nivel se inregistrare, ordonarea unei table inseamna asezarea inregistrarilor sale intr-o anumita ordine, dupa un criteriu de ordonare. Aceasta ordine a inregistrarilor nu trebuie sa fie neaparat cea fizica, existenta in fisier, ci poate fi una aparenta. Principiul indecsilor face ca o tabela sa fie vazuta de utilizator ca fiind ordonata, cu toate ca ea nu este asa in fisier. Lucrul acesta este realizat prin intermediul unui fisier intermediar (fisierul index) care actioneaza ca un "filtru" asupra tabelei.

O tabela este ordonata dupa un anumit criteriu dupa fiecare inregistrare a acesteia respecta criteriul dat, in raport cu inregistrarile anterioare si posterioare. Compararea unei inregistrari ale unei tabele se reduce de fapt la compararea a doua valori ale unei expresii, fiecare valoare corespunzand uni inregistrari de comparat, expresia fiind specifica 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 (pentru ca ea contine campuri ale tabelei, al caror continut difera de la inregistrare la inregistrare).

O tabela este ordonata crescator (ascendent) sau descrescator (descendent), daca fiecare inregistrare din aceasta este mai mare, respectiv mai mica decat inregistrarea anterioara.

Conform cu celle prezentate mai sus, si in FoxPro exista doua metode de ordonare a unei tabele si anume:

  • ordonarea fizica a tabelei, realizata prin schimbarea intre ele a inregistrarilor, dupa un anumit algoritm, pana cand acestea sunt in ordinea dorita. In acest caz se obtine o noua tabela care contine aceleasi inregistrari ca si cea de la care s-a pornit, dar in ordinea dorita;
  • indexarea tabelei, aceasta insemnand crearea unui fisier special, care cuprinde informatii cu privire la ordinea inregistrarilor in tabela. Si in acest caz se obtine un fisier nou, fisierul index, dar acesta nu contine inregistrarile tabelei, ci memoreaza numai ordinea acestora.

1 Sortarea tabelelor

Sortarea unei tabele reprezinta operatia prin care inregistrarile acesteia sunt asezate intr-o anumita ordine, dupa un anumit criteriu.

Sortarea este o metoda de ordonare fizica, deoarece inregistrarile tabelei sun mutate efectiv in noile pozitii. In urma sortarii unei tabele rezulta alta, care contine aceleasi inregistrari, dar in ordinea dorita.

Comanda de sortare este SORT. Ea este urmata de clauza TO, prin care se precizeaza numele fisierului nou creat. Criteriul de ordonare poate fi un camp sau o lista de campuri ale tabelei. In cazul unui singur camp, sortarea se va face in ordinea crescatoare a valorilor din acest camp (cand dupa camp se introduce constructia /A) sau in ordine descrescatoare a acestor valori (cand campul este urmat de /D).

Se ordoneaza tabela MISCMAT.DBF (pentru memorarea miscarilor de materiale ale unui depozit) dupa codul materialului, in ordine crescatoare. Structura tabelei este urmatoarea:

Denumire camp

Tip camp

Lungime

Semnificatie

COD MAT

Character

Codul materialului

DENMAT

Character

Denumirea materialului

CALITATE

Numeric

Calitatea

COD FURN

Character

Codul furnizorului

DENFURN

Character

Denumirea furnizorului

CODFISC

Numeric

Codul fiscal al furnizorului

CANTITATE

Numeric

Calitatea

PRTUNIT

Numeric

Pretul unitar

Noua tabela va purta numele MISC_S.DBF.

USE miscmat

LIST

SORT TO misc_s ON codmat /A

USE misc_s

LIST
USE

Daca un singur criteriu de ordonare nu este de ajuns, se vor folosi mai multe. Acest lucru se realizeaza prin precizarea in clauza ON a comenzii SORT a doua sau mai multe campuri, separate prin virgula. Campurile pot fi urmate de /A sau /D, pentru a indica tipul criteriului respectiv, crescator sau descrescator.

In cazul folosirii mai multor criterii de sortare(deci mai multe campuri in;ista), ordonare se va face tinandu-se seama mai intai de primul criteriu. Numai in cazul a doua valori egale ale primului camp se va lua in considerarea cel de-al doilea criteriu, reprezentat de cel de-al doilea camp din lista. Daca lista contine trei campuri, cel de-al treilea va fi folosit numai daca primele doua au condus la valori egale, s.a.m.d.

Sa se obtina, din tabela MISCMAT.BDF, lista miscarilor de material pe furnizori, in ordinea inversa a cantitatii.

USE miscmat

LIST

SORT TO misc_s ON codfurn /A, cantitatea /D

USE misc_s

LIST
USE

Clauzele ASCENDING si DESCENDING, daca sunt prezente in comanda, determina stabilirea tipului implicit de sortare pentru toate campurile care alcatuiesc cheia de sortare. Ele sunt similare clauzelor /A si/D, numai ca se refera la toate campurile din lista. In lipa acestor clauze, ordinea implicita este crescatoare, deci ASCENDING. Clauzele asociate campurilor, /A si /D, au prioritate fata de clauzele ASCENDING si DESCENDING.

Comanda SORT poate contine clauze referitoare la domeniul inergistrarilor, prin care se va realiza o selectie a inergistrarilor introduse in procesul de sortare si deci in tabela destinatie. Un alt tip de selectie se poate realiza prin clauza FIELDS, care fiind urmata de o lista de campuri ale tabelei sortate, determina copierea in noua tabela doar a campurilor precizate.

Sa se sorteze tabela MISCMAT.DBF dupa codul materialului si pretul de achizitie, in tabela finala scriindu-se doar materialele de calitatea 1.

USE miscmat

LIST

SORT TO misc_s ON codmat /A, pret /A FOR calitatea=1

USE misc_s

LIST
USE

Doua tehnici de sortare sunt implementate in general in SGBD-uri: cea fizica, reprezentata de sortare, si cea logica, adica indexarea. Sortarea este realizata in FoxPro prin comanda SORT. Aceasta permite specificarea uneia sau mai multor criterii de ordonare si a inergistrarilor si campurilor ce urmeaza a fi copiate in noua tabela sortata.

2 Indexarea tabelelor

O alta tehnica de ordonare a unei tabele este indexarea

Indexarea reprezinta o metoda prin care o tabela neordonata este vazuta ca o tabela ordonata dupa un anumit criteriu, fara ca d.p.d.v. fizic, ordinea inergistrarilor din tabela sa se schimbe.

Prin urmare, indexarea este o metoda logica de ordonare, deoarece ordinea fizica a inergistrarilor tabelei de baza nu se modifica. Este afectat doar modul in care inregistrarile tabelei sunt "vazute" de catre utilizator. Operatia de indexare este echivalenta cu o "filtrare:, in sensul ca tabela este vazuta altfel decat este, adica ordonata.

Indexarea unei ambele presupune crearea unui fisier nou, numit "fisier index asociat tabelei", in care se memoreaza doar ordinea inergistrarilor, nu tot continutul. Accesul la o anumita inregistrare se face prin intermediul fisierului index.

Sa luam urmatorul exemplu: o tabela in care avem incarcate 7 materiale, cu cantitatea si valoarea acestora:


MATERIAL.CDX

Valoare

Pozitie

3

9

16

42

78

MATERIAL.DBF

Material

Cantitae

Valoare

Ciment

Tigla

Lopeti

Nisip

Caramida

Tabla

pietris

Indexarea acestei tabele, dupa valoare, in ordine crescatoare, presupune crearea fisierului MATERIAL.CDX in care se vor memora pozitiile inergistrarilor din tabela, in ordinea dorita. Accesul la inregistrari se face prin intermediul fisierului index asociat.

Astfel, daca dorim afisarea inregistrarii a treia din tabela MATERIAL.DBF, SGBD-ul citeste valoarea memorata in pozitia a treia a fisierului index, adica 6, si o trateaza ca pe tabela MATERIAL.DBF. observam ca ordinea fizica a inergistrarilor din tabela nu s-au modificat.

In exemplul prezentat s-a folosit o reprezentare intuitiva, pentru a inlesni intelegerea notiunii de indexare. In realitate SGBD-u foloseste mecanisme mai complexe de accesare, care, insa, principal sunt asemanatoare cu cel prezentat.

In versiunile mai noi ale SGBD-urilor, intr-un fisier index pot fi incorporate mai multe criterii de ordonare. Fiecare dintre acestea sunt identificate prin cate o eticheta index.

Modul de lucru cu o tabela indexata este urmatorul:

  • mai intai trebuie creat fisierul index asociat tabelei, ocazie cu care se specifica si criteriile de ordonare dorite pentru tabela. Aceasta etapa poarta numele de indexarea tabelei;
  • ulterior, se doreste folosirea tabelei indexate, aceasta se deschide (folosind comanda USE de exemplu) si o data cu ea se deschid si fisierele index asociate, fie automat de catre SGBD, fie manual de catre utilizator;
  • se pot apoi realiza operatiile dorite asupra tabelei inregistrarile fiind vazute de ordinea data de fisierul index activ sau eticheta index activa. Modificarea continutului tabelei determina actualizarea automata a fisierului index deschis pentru tabela respectiva, ordinea inergistrarilor fiind de asemenea actualizata;
  • dupa ce se termina lucrul cu tabela aceasta se inchide si, o data cu ea se inchid si fisierele index asociate la deschidere.

Fisierele index ce pot fi asociate unei tabele pot fi de doua tipuri:

  • fisiere index simple (cu extensia .IDX) ce contin un singur criteriu de ordonare
  • fisiere index compuse (cu extensia .CDX) care memoreaza mai multe criterii de ordonare, unul singur fiind activ la un moment dat (criteriu de ordonare activ avand asociat eticheta activa).

Fisierele compuse sunt la randul lor de doua tipuri:

structurale - sunt deschise si asociate automat tabelei o data cu deschiderea acesteia, folosindu-se comanda USE. Acestea au acelasi nume cu tabela, extensia fiind CDX, si sunt create folosindu-se clauza TAG, fara introducerea unui nume de fisier index cu clauza OFF;

nestructurale - ce nu sunt deschise automat o data cu deschiderea tabelei. Ele poarta un alt nume decat al tabelei si trebuie apreciat explicit in comenzi.

O tabela poate avea mai multe fisiere index asociate, dar numai unul singur va fi activ la un moment dat, acesta fiind numit fisierul index activ. Ordinea in care este accesata tabela este dat de fisierul index activ, iar daca acesta este compus de eticheta activa din fisierul index respectiv.

Dintre tipurile de fisiere index prezentate se recomanda, in general, folosirea fisierelor index compuse structurale, acestea fiind cele mai performante. Indexarea unei tabele deci crearea pentru aceasta a uni fisier index se realizeaza cu comanda index. Clauza ON a acestei comenzi foloseste la precizarea expresiei de indexare. Aceasta reprezinta o expresie de orice tip in functie de care se realizeaza ordonare inergistrarilor. De cele mai multe ori, expresia de indexare contine unul sau mai multe campuri ale tabelei respective, in functie de care se va face ordonarea. Observam ca, spre deosebire de sortare cand se putem preciza mai multe criterii de ordonare, in cazul indexarii se poate specifica o singura expresie. Aceasta insa poate fi o expresie compusa, care sa contina mai multe campuri ale tabelei, ceea ce face ca indexare sa fie mai elastica si mai cuprinzatoare decat sortarea. De exemplu, efectul sortarii dupa mai multe campuri se poate obtine prin indexare folosind o expresie de indexare alcatuita prin sumarea campurilor respective, cu conversiile de tip necesare (observam aici necesitatea conversiilor de tip).

Numele fisierului creat va fi specificat in clauza TO a comenzii INDEX. Daca se doreste crearea unei etichete index,aceasta se va specifica in clauza TAG a comenzi INDEX, care poate fi insotita de numele fisierului index in care va fi introdusa eticheta , precedat de clauza OFF:

INDEX . TO<FISIER>

Sau

INDEX . TO TAG<eticheta index> OFF<fisier index>

Daca pentru tabela activa au mai fost create anterior si alte etichete index, celelalte etichete vor fi sterse inainte de crearea celei noi . Daca se doreste adaugarea noii etichete index la cele deja existente, se va folosii clauza ADDITIVE. Ordinea DESCENDING, implicit considerandu-se prima dintre variante.

Odata cu indexarea unei tabele se poate specifica si o conditie de filtrare, cu ajutorul careia se poate impune o conditie ce trebuie respectata de toate inregistrarile disponibile. Conditia se precizeaza cu ajutorul clauzei FOR.

In fine, o ultima facilitate oferita de clauza INDEX, este aceeasi care prevede accesul unic la inregistrarile tabelei. Daca o comanda se include UNIQE, dintr-un grup de inregistrari care corespund aceleasi valori a cheii de indexare numai prima va fii accesibila, restul fiind "ascunse" utilizatorului.

Crearea unui fisier index simplu pentru tabela MISCMAT.DBF

USE miscmat

NOTE se creaza fisierul index simplu ,misc_f.idx'

INDEX ON codfurn TO misc_f

LIST &&inregistrarile sunt ordonate dupa campul ,codfurn'

USE

Indexarea unei tabele folosind un fisier index compus structural, in care se vor introduce 3 etichete, corespunzatoare ordonarii dupa campurile tabelei:

USE miscmat

INDEX ON codmat TAG tecodmat

NOTE &&nu s-a specificat fisierul index deoarece acesta este cel structural.

INDEX ON cantitate TAG tecantit FOR calitatea = 1

NOTE &&vor fi dispunibile in ordinea valorilor numai materialele de calitatea 1

INDEX ON pretunit TAG tepret DESCENDENT

USE

Odata cu deschiderea unei tabele se pot deschide si o serie de fisiere index asociate , incluzandu-se in comanda USE clauza INDEX, urmata de fisierele index respective. Lista care urmeaza clauzei INDEX trebuie sa contina numai fisiere index ce au fost create anterior cu o comanda index. Fisierele din lista vor fi separate prin virgula.

Clauza ORDER a comenzii USE stabileste fisierul index simplu ce va deveni activ sau eticheta dintr-un fisier index compus ce va deveni activa, astfel:

USE . INDEX . ORDER<fisier index simplu>

sau

USE . INDEX . ;

ORDER TAG<eticheta index> OF <fisier index compus>

Clauzele ASCENDING si DESCENDING specifica ordinea crescatoare sau descrescatoare folosita pentru ordonarea inergistrarilor.

Se deschide tabela MISCMAT si odata cu ea o serie de fisiere index create in exemplele precedente.

CLOSE ALL

USE miscmat INDEX misc_f.idx,miscmat.cdx;

ORDER TAG tcodmat

NOTE eticheta ,tcodmat' din miscmat.cdx va fi cea activa, adica; ordonare dupa material

LIST

USE

USE miscmat INDEX misc_f.idx, miscmat.cdx;

ORDER misc_f

NOTE se selecteaza ca activ primul fisier index;

(cel simplu), cheia de indexare fiind campul codfurn

LIST

USE

USE miscmat ORDER TAG tcantit

NOTE se selecteaza eticheta ,tcantit' din fisierul;

Index compus structural miscmat.cdx

LIST

USE

Pentru o singura tabela pot fi deschise la un moment dat mai multe fisiere index, continand eventual mai multe etichete index. Dar numai una dintre acestea poate da ordinea inergistrarilor, aceasta num indu-se eticheta index activa (sau fisier index activ). Pentru a selecta alt fisier index activ sau alta eticheta index activa dupa deschiderea unei tabele, vom folosi comanda SET ORDER. In clauza TO a acestei comenzi se specifica noua eticheta index activa, sau noul fisier index activ.

SET ORDER TO <fisier index simplu>

sau

SET ORDER TO TAG <nume eticheta> [OF<fisier index compus>]

Pentru specificarea fisierului index simplu activ sau a etichetei active, se foloseste aceeasi metoda ca si la comenzile USE . INDEX si SET INDEX

CLOSE ALL

USE miscmat

SET ORDER TO tpret

LIST

USE

La crearea unui fisier index sau a unei etichete index pentru tabela, fiecarei inregistrari ii va corespunde o valoare a cheii de indexare. Pot aparea situatii cand doua sau mai multe inregistrari corespund aceleasi valori a cheii de indexare, aparand astfel problema accesului la inregistrarile ce au aceeasi valoare a cheii de indexare cu o inregistrare anterioara. In acest caz se foloseste comanda SET UNIQUE. Ea poate contine doua clauze, On sau OFF. Cand este prezenta prima dintre clauze, orice inregistrare pentru care valoarea cheii de indexare este egala cu cea a unei inregistrari precedente nu va fi inclusa in fisierul index. Deci, din multimea de inregistrari cu aceeasi valoare a cheii de indexare va putea fi accesata numai prima, cea care apare in fisierul index. In cazul celei de-a doua clauze, OFF, care este varianta implicita, vor putea fi accesate toate inregistrarile, indiferent de valoarea cheii de indexare.

Starea lui UNIQUE va fi memorata in fisierul index respectiv, neputandu-se trece la alta stare decat prin indexare. Cu alte cuvinte, avand o tabela indexata cu UNIQUE ON, pentru a o indexa cu UNIQUE OFF fisierul indexat trebuie reconstruit.

Inchiderea fisierelor index se face folosind comanda CLOSE INDEX. Aceasta comanda inchide toate fisierele index deschise in zona de lucru curenta, in afara celei structural. Fisierele index vor fi inchise, de asemenea, cu comenzile CLOSE ALL, USE,CLOSE DATABASE. Comanda CLOSE ALL inchide, pe langa alte tipuri de fisiere, si toate fisierele index deschise in zonele de lucru. De asemenea, la inchiderea unei baze de date prin comanda USE sau CLOSE DATABASE, vor fi inchise si fisierele index deschise pentru tabelele respective.

O problema deosebita care apare la folosirea tabelelor indexate este cea a regasirii datelor in tabela. Cautarea secventiala (inregistrare dupa inregistrare) data de comanda LOCATE, poate fi inlocuita la tabelele indexate cu o comanda mai performanta, din punctul de vedere al vitezei de regasire. Comanda este SEEK, existand si o functie echivalenta cu acelasi nume (SEEK ()). Comanda determina cautarea rapida in tabela activa a primei inregistrari a carei valoare a cheii de indexare este egala cu valoarea rezultata din evaluarea expresiei inclusa in comanda. Evident, tabela trebuie sa fie indexata.

Daca este gasita o asemenea inregistrare, indicatorul de inregistrari se va pozitiona pe aceasta, functia FOUND ( ) va returna valoarea adevarat (.T.), iar functia EOF ( ) va returna valoarea fals (.F.). in caz contrar, indicatorul de inregistrari se va pozitiona dupa ultima inregistrare, FOUND ( ) va returna valoarea fals (.F.), iar EOF ( ) va returna valoarea adevart (.T.).

CLOSE ALL

USE miscmat ORDER tcodmat

SEEK ,caramizi'

? FOUND ()

.T.

? EOF ()

.F.

? RECNO ()

DISPLAY

USE

Functia echivalenta cu comanda SEEK este evident SEEK ( ). Ea returneaza o valoare logica, in functie de rezultatul cautarii unei inregistrari intr-o tabela indexata. Se va cauta prima inregistrare pentru care valoarea cheii de indexare este egala cu valoarea trimisa functiei ca parametru. Daca procesul de cautare se termina cu succes, functia va returna valoarea adevarat, iar indicatorul de inregistrari se va pozitiona pe inregistrarea gasita. In caz contrar, functia va returna valoarea fals, indicatorul de inregistrari pozitionandu-se dupa ultima inregistrare a tabelei.

Functia SEEK ( ) inlocuieste combinatia dintre comanda SEEK si functia FOUND ( ).

USE miscmat ORDER tcantit

? SEEK (1 400 000)

.T.

? RECNO ()

453

USE

O alta problema legata de tabelele indexate este cea a comenzilor care opereaza cu ordinea logica a inergistrarilor. Un exemplu este comanda SKIP, care realizeaza un salt la o inregistrare ulterioara sau una anterioara, in functie de valoarea numerica ce insoteste comanda. Prin aceasta comanda se trece la cea de-a n-a inregistrare care urmeaza inregistrarii curente, in ordine logica( data de eticheta index activa), nu cea fizica.

indexarea reprezinta una dintre cele mai performante si raspandite tehnici de ordonare si accesare a datelor din tabele. O tabela indexata este "vazuta" in ordinea dorita, fara ca tabela sa aiba inregistrarile in ordinea respectiva. Cautarea datelor dintr-o tabela indexata se face mult mai rapid decat in cazul aceleiasi tabele neindexate. Pentru acesta se foloseste comanda SEEK sau functia cu acelasi nume.





Politica de confidentialitate





Copyright © 2024 - Toate drepturile rezervate