În FoxPro exista doua categorii de baze de date:
secventiala - articolele sun 222f51c t in ordinea introducerii lor, pentru a cauta un articol care satisface o conditie se va parcurge intreaga baza de date.
indexata - unei baze de date i se adauga o tabela de index in care apar informatii cu privire la ordinea inregistrarilor bazei de date (pointeri spre articole din BD originala ordonati in ordinea crescatoare, descrescatoare a unei chei). Pentru a cauta un articol care satisface o conditie se va parcurge baza de date in ordinea tabelei de index, fara a parcurge intreaga baza de date. Înlantuirea bazei de date bazata pe campuri cu acelasi nume e posibila.
Se folosesc de regula daca cautarea nu trebuie sa fie rapida, se face rar si pentru baze de date cu numar mic de inregistrari. In FoxPro aceasta problema se rezolva cu ajutorul comenzii LOCATE ce are urmatoarea sintaxa:
LOCATE FOR <expL1> [<domeniu>] [WHILE <expL2>]
Comanda realizeaza o cautare secventiala a bazei de date curente, testand fiecare inregistrare care respecta conditia <expL1>. Domeniul inregistrarilor care se testeaza este dat de clauzele <domeniu> si WHILE, domeniul implicit fiind ALL.
In cazul in care s-a gasit o inregistrare care respecta conditia <expL1>, aceea inregistrare devine curenta, functia FOUND() va returna valoarea .T. iar functia EOF() va returna valoarea .F.
In caz contrar, indicatorul de inregistrari se va pozitiona dupa ultima inregistrare, functia FOUND() va returna .F. iar functia EOF() va returna .T.
Intr-o baza de date pot exista mai multe inregistrari ce respecta o conditie data. Prima dintre acestea va fi gasita folosind comanda LOCATE. Urmatoarele vor fi gasite folosind comanda CONTINUE, ce are sintaxa:
CONTINUE
comanda cauta urmatoarea inregistrare care corespunde conditiei specificate de ultima comanda LOCATE aplicata bazei de date active.
Cautarea se termina la gasirea unei inregistrari care corespunde conditiei sau la atingerea sfarsitului de baza de date sau de domeniu.
Combinatia LOCATE, CONTINUE se foloseste la aplicarea mai multor comenzi unor inregistrari care satisfac o conditie.
Exemplu:
LOCATE FOR bursa > 10000
DISPLAY
DELETE
CONTINUE
Un alt mod de cautare intr-o baza de date, este realizat cu functia LOOKUP(), ce are urmatoarea sintaxa:
LOOKUP( <camp1>, <expr>, <camp2> [,<expC>])
in care:
<camp1> - este campul al carui valoare va fi returnat de functie.
<expr> - specifica expresia de cautat in baze de date.
<camp2> - se foloseste pentru a realiza cautarea expresiei numai in acest camp.
Functia cauta intr-o baza de date prima aparitie a unei expresii date. În caz de reusita indicatorul de inregistrari se pozitioneaza pe inregistrarea in care a fost gasita expresia, functia returnand un anumit camp al inregistrari respective, in caz contrar indicatorul de inregistrari se va pozitiona dupa ultima inregistrare din baza de date.
Cautarea unei anumite inregistrari intr-o baza de date indexata se face cu comanda SEEK sau functia SEEK().
Comanda SEEK, are sintaxa:
SEEK <expr>
cauta in baza de date activa, indexata (neaparat) prima inregistrare pentru care cheia de indexare ia valoarea lui <expr>. Daca este gasita o asemenea inregistrare, indicatorul de inregistrari se va pozitiona pe aceasta, functia FOUND() va returna .T. iar functia EOF() va returna .F. Functia SEEK() are sintaxa:
SEEK(<expr>, [<expN> | <expC>])
returneaza o valoare logica, ca rezultat al cautarii unei inregistrari intr-o baza de date indexata.
Prin <expN> sau <expC> se specifica baza de date in care se face cautarea , daca aceasta este diferita de cea activa.
În FoxPro exista doua metode de ordonare a unei baze de date si anume:
- ordonarea propriu-zisa a bazei de date, prin schimbarea , intre ele a inregistrarilor, dupa un anumit algoritm.
- indexarea unei baze de date, aceasta inseamna crearea unui nou fisier care contine informatiile cu privire la ordinea inregistrarilor bazei de date.
Se realizeaza cu comanda SORT, ce are urmatoarea sintaxa:
SORT TO <fisier> ON <camp1> [/A | /D] [/C]
[, <camp2> [/A | /D] [/C] ]
[ASCENDING | DESCENDING]
[<domeniu>] [FOR <expL1>] [WHILE <expL2>]
[FIELDS <lista de campuri>]
Comanda sorteaza baza de date activa creand o noua baza de date, in care sunt depuse inregistrarile selectate in ordinea specificata.
FIELDS <lista de campuri> - specifica lista de campuri ce va contine noua baza de date sortata.
<fisier> - numele noi baze de date.
<camp1>, <camp2> - specifica cheia de ordonare
/A | /D - specifica tipul de ordonare /A crescator si /D descrescator.
/C - folosita pentru campurile de tip sir de caracter (insensibila la litere mari sau mici).
Exemplu: Sa se ordoneze baza de date agenda.dbf, in ordine crescatoare dupa nume.
USE agenda
LIST
SORT TO agenda_s ON nume /AC
USE agenga_s
LIST
USE
Cea de-a doua metoda de ordonare a unei baze de date o reprezinta indexarea acesteia. Indexarea unei baze de date presupune crearea unui nou fisier, numit fisier index asociat, in care se memoreaza ordinea inregistrarilor din baza de date. Accesul la o inregistrare se face prin intermediul fisierului index.
Fisierele index ce pot fi asociate unei baze de date pot fi de urmatoarele 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 baza de date poate avea mai multe fisiere index asociate, dar numai unul singur va fi activ la un moment dat. Cheia de indexare este un camp din baza de date sau expresie de campuri (camp concatenat), exceptie facand : campuri logice, memo sau orice combinatie a lor. Numele unei chei de indexare poate avea lungimea maxim de 10 caractere, trebuie sa inceapa cu o litera
Crearea unui fisier index pentru o baza de date se realizeaza cu comanda INDEX, ce are urmatoarea sintaxa:
INDEX ON <exp_cheie>
TO <fisier.idx> | TAG <nume_eticheta> [ OF <nume_ fisier.cdx>]
[FOR <expL>]
[UNIQUE]
[COMPACT]
[ASCENDING | DESCENDING]
[ADDITIVE]
Comanda creeaza un fisier index (.idx) sau o tabela index (tag) intr-un fisier .cdx si desemneaza indexul ca index principal.
[UNIQUE] - dintre inregistrarile cu aceeasi valoare a cheii de indexare se poate accesa doar prima dintre acestea.
[ASCENDING | DESCENDING] - precizeaza ordinea de sortare
[COMPACT] - are ca efect crearea unui fisier index simplu compact
Un fisier index compus poate contine mai multe chei de indexare fiecare corespunzand unui criteriu de ordonare a bazei de date. Fisierele compuse sunt de doua tipuri:
- structurale - sunt deschise si asociate automat bazei de date odata cu deschiderea acesteia folosind comanda USE. Acestea au acelasi nume ca si baza de date, extensia fiind .CDX si sunt create folosind clauza TAG, fara introducerea unui nume de fisier index cu clauza OF.
-nestructurala - ce nu sunt deschise automat odata cu deschiderea bazei de date. Ele poarta alt nume decat al bazei de date, numele specificat in clauza OF <fisier.cdx>.
Exemplu:
Crearea unui fisier index simplu:
USE agenda
INDEX ON nume TO agenda_n
LIST && inregistrarile sunt in ordinea campului nume
USE
Crearea unui fisier index compus nestructurat:
USE agenda
INDEX ON nascut TAG data_n OF agenda_d
&& se creaza eticheta data_n in fisierul index compus nestructurat agenda_d.cdx
LIST
USE
Crearea unui fisier index compus structural in care se va introduce cinci etichete
USE agenda
INDEX ON nume TAG nume
INDEX ON prenume TAG prenume
INDEX ON nascut TAG nascut
INDEX ON sex TAG sex
INDEX ON telefon TAG telefon DESCENGING
LIST
USE
Odata cu deschiderea bazei de date, se pot deschide si o serie de fisiere index asociate bazei de date, incluzand clauza INDEX in comanda USE. Sintaxa comenzii este:
USE [<fisier> | ?]
[INDEX <lista fisiere index> | ?
[ORDER [<expN> | <fisier.idx> | [TAG] <nume eticheta>
[OF <fisier.cdx>]
[ASCENDING | DESCENDING]]]]
unde:
<fisier> - numele bazei de date ce se va deschide
<lista fisiere index> - fisierele index ce vor fi deschise odata cu baza de date.
Clauza ORDER determina fisierul index simplu ce va deveni activ sau eticheta dintr-un fisier index compus ce va deveni activa.
ORDER <expN> - expresia numerca <expN> reprezinta numarul de ordine al fisierului index simplu sau al etichetei din fisierul index compus.
ORDER <fisier.idx> - specifica ce fisier index simplu va deveni activ.
ORDER [[TAG] <nume eticheta> [OF <fisier.cdx>]] -specifica eticheta ce va deveni activa din fisierul index compus structural sau nestructural.
Exemplu:
CLOSE ALL
USE agenda INDEX agenda_n.idx, agenda_d.cdx,; agenda.cdx ORDER agenda_n
&& se selecteaza ca activ primul fisier index
LIST
USE
USE agenda INDEX agenda ORDER TAG telefon
&& se selecteaza eticheta telefon din fisierul index compus structural agenda.cdx
LIST
USE
Daca se doreste deschiderea unor fisiere index pentru baza de date curenta (dupa ce aceasta a fost deschisa ) se foloseste comanda SET INDEX cu urmatoarea sintaxa:
SET INDEX TO [<lista nume fis idx, cdx> | ? ]
[ORDER <expN> | <nume fis.idx>
| TAG <nume eticheta> [OF <nume fis.cdx>]
[ASCENDING | DESCENDING]] [ADITIVE]
Se vor deschide toate fisierele specificate in <lista nume fis idx, cdx> . Clauza ORDER are aceeasi semnificatie ca la comanda USE.
SET INDEX TO, fara clauze va inchide toate fisierele index din zona curenta, exceptie facand fisierul index structural al bazei de date.
Pentru a schimba ordinea inregistrarilor, deci pentru a selecta alt fisier index sau alta eticheta, vom folosi comanda SET ORDER, care are urmatoarea sintaxa:
SET ORDER TO
[<expN> | <fisier.idx> | [TAG ] <nume eticheta> ]
[OF <fisier.cdx>] [IN <expN2> | <expC> ]
Clauza IN se foloseste atunci cand comanda SET ORDER se refera la alta baza de date decat cea activa, cu aliasul <expC> sau din zona de lucru <expN2>.
Pot aparea situatii cand doua sau mai multe inregistrari corespund la aceeasi valoare a cheii de indexare, in acest caz se foloseste comanda SET UNIQUE cu urmatoare sintaxa:
SET UNIQUE ON | OFF
unde:
- optiunea ON - orice inregistrare pentru care valoarea cheii de indexare este egala cu cea a unei inregistrari precedente, nu va inclusa in fisierul index.
- optiunea OFF - care este si implicita , toate inregistrarile vor fi incluse in fisierul index indiferent de valoarea cheii
Închiderea fisierelor index se face prin comanda CLOSE INDEX cu sintaxa:
CLOSE INDEX
Comanda inchide toate fisierele index deschise in zona de lucru activa, in afara celui structural.
Alte comenzii care inchid fisierele index sunt:
CLOSE ALL - inchide si toate fisierele index din toate zonele de lucru
CLOSE DATABASES
USE
Trecerea de la un fisier index simplu la o eticheta dintr-un fisier index compus se realizeaza cu comanda COPY INDEX, care are urmatoarea sintaxa:
COPY INDEXES <lista fisiere index> | ALL
[TO <fisiere.cdx>]
Comanda transforma toate fisierele index simple prezente in lista <lista fisiere index> sau toate fisierele index simple deschise in zona de lucru curenta, daca se specifica clauza ALL, in etichete ale fisierului index structural sau ale fisierului index compus <fisier.cdx> in cazul cand se introduce clauza OF.
Operatia inversa, adica transformarea unei etichete a unui fisier index compus (.cdx), structural sau nestructural, intr-un fisier index simplu (.idx) este realizata de comanda COPY TAG, cu urmatoarea sintaxa:
COPY TAG <nume eticheta>[ OF <fisier.cdx>]
TO <fisier.idx>
Pentru stergerea etichetei din fisierul index compus folosim comanda DELETE TAG, cu urmatoarea sintaxa:
DELETE TAG <nume eticheta1> [OF <fisier1.cdx>]
[, <nume eticheta2> [OF <fisier2.cdx>]]
DELETE TAG ALL [OF <fisier.cdx>]
Comanda sterge etichetele <nume eticheta1>, <nume eticheta2>, , din fisierele index compuse deschise in zona de lucru curenta. Stergerea tuturor etichetelor dintr-un fisier index compus se poate realiza folosind clauza ALL.
Daca dintr-un fisier index compus se sterg toate etichetele, atunci fisierul este sters in intregime de pe disc.
Extragerea de informatii dintr-o baza de date se face folosind urmatoarele comenzi:
1. AVERAGE [<lista expN>]
[<domeniu>][FOR <cond>][WHILE <cond>]
[TO <lista var> | TO ARRAY <nume tablou>]
calculeaza media aritmetica a valorilor expresiilor din <lista expN>, pentru inregistrarile selectate prin <domeniu>, FOR si WHILE, sau daca acestea lipsesc pentru toate inregistrarile din baza de date curenta.
<lista var> contine variabilele in care se vor depune mediile aritmetice iar <nume tablou> reprezinta un masiv unidimensional ce poate inlocui lista de variabile.
2. CALCULATE [<lista expresii>]
[<domeniu>] [FOR <cond>][WHILE <cond>]
[TO <lista var> | TO ARRAY <nume tablou>]
calculeaza functiile statistice , financiare specificate in <lista expresii> acestea pot fi: AVG(<expN>)
CNT()
MIN(<expN>)
MAX(<expN>)
STD(<expN>)
SUM(<expN>)
VAR(<expN>)
3. COUNT [<domeniu>][FOR <condL1>][WHILE <condL2>]
[TO <variabila>]
numara inregistrarile din baza de date activa sau din domeniu, subdomeniu specificat de clauzele FOR si WHILE, depunand rezultatul in variabila <variabila>.
Exemplu:
CLOSE ALL
USE agenda
COUNT FOR sex =.T> nrb
? 'In baza de date avem ' , nrb, ' baieti'
USE
4. SUM [<lista expN>]
[<domeniu>][FOR <cond>][WHILE <cond>]
[TO <lista var>| TO ARRAY <nume tablou>]
insumeaza toate campurile numerice pentru toate inregistrarile din baza de date curenta daca nu se folosesc clauzele <domeniu>, FOR, WHILE si afiseaza rezultatul pe ecran.
|