Sunteți pe pagina 1din 24

BAZE DE DATE – INTRODUCERE

Principalul domeniu de utilizare a calculatorului îl reprezintă cel al prelucrării


informaţiilor. Pe măsură ce societatea se dezvoltă cresc şi necesităţile de informare ale
acesteia, deci creşte şi volumul de informaţii ce trebuie prelucrate. Astfel apare problema
memorării acestor informaţii, a prelucrării lor în vederea obţinerii diverselor rezultate
solicitate. Acesta este tocmai domeniul în care este specializat FoxPro, domeniul bazelor
de date.
Datorită capacităţilor relativ mici ale memoriilor interne ale calculatoarelor, stocarea unor
volume mari de informaţie se face pe dispozitive de memorie externă, cum ar fi unităţile
de benzi, unităţile de disc, etc. Cele mai folosite sunt unităţile de disc, acestea ajungând
astăzi la capacităţi de memorare de ordinul GB, ce satisfac marea majoritate a
utilizatorilor.
Pe discuri, informaţiile sunt depozitate în fişiere. O bază de date reprezintă tocmai un
astfel de fişier, cu o anumită organizare ce permite accesul rapid şi complet la informaţiile
stocate în acesta.
Datorită asemănării dintre modul de organizare a unei baze de date şi cel al unui tabel,
vom folosi analogia dintre aceste două elemente în descrierea unei baze de date.
Să presupunem că am avea o agendă în care am înscris un număr de persoane, pentru
fiecare dintre acestea menţionând numele, prenumele numărul de telefon, data naşterii,
sexul, adresa. Acestea pot fi trecute într-un tabel de forma:

Nr. Nume Prenume Telefon Data naşterii Sex Adresa


1. Popescu Dumitru 321645 06/27/67 B Oneşti, Str.Oituz, Bl.11, Ap.33
2. Toma Daniela 324586 03/09/69 F Bucureşti, Str. Cuza Vodă, Nr.2
3. Axente Ionel ______ 12/02/72 B Timişoara, B-dul Revoluţiei Nr.49,
Sc.A, Et.1, Ap.4
4. Tudor Mihaela 132478 09/13/68 F Bacău, Str. Mărăşeşti Nr. 56

Corespunzător acestui tabel vom avea o bază de date în care:


capului de tabel îi va corespunde “structura”;
coloanele vor fi numite “câmpuri”;
• liniile se vor numi “înregistrări”.
La crearea unei baze de date trebuie specificată structura acesteia. Pentru a
specifica în mod univoc structura unei baze de date, trebuie indicate câmpurile
care o compun.
Fiecare câmp este caracterizat de:
numele asociat: ex. nume, prenume, telefon, etc.;
tipul de date ce se memorează în acel câmp: ex. numere, şiruri de caractere, date
calendaristice, etc.;
dimensiunea, respectiv numărul de caractere pe care este permisă scrierea datelor în
respectivul câmp.
Pentru a specifica o anumită înregistrare din baza de date, se foloseşte indicatorul de
înregistrări – o zonă de memorie care conţine numărul înregistrării cu care se lucrează în
momentul de faţă (înregistrare curentă). Acesta poate fi asociat ca o variabilă asociată
bazei de date şi care există atâta timp cât este deschisă baza de date. La un moment dat o
singură înregistrare este cea curentă, numărul ei fiind dat de indicatorul de înregistrări.
O imagine intuitivă a indicatorului de înregistrări este dată de următoarea figură:

1
bază de date
indicatorul de
înregistrări

înregistrări
nr. înregistrare
curentă

Indicatorul de înregistrări poate fi modificat prin comenzi FoxPro, acest lucru fiind
echivalent cu deplasarea săgeţii indicatorului de înregistrări în sus şi în jos, de-a lungul
bazei de date.
Pentru a folosi o bază de date (b.d.) aceasta trebuie mai întâi deschisă (se presupune că ea
există pe disc, a fost creată anterior). Deschiderea bazei de date presupune rezervarea în
memoria internă a calculatorului a unei zone rezervate în care FoxPro va memora toate
informaţiile necesare utilizării acestei baze de date (structura, numărul de înregistrări,
etc). Această zonă de memorie poartă denumirea de zonă de lucru (work area). FoxPro
poate manipula mai multe b.d. simultan, deci poate lucra cu mai multe zone de lucru, 25
la număr, în care se deschid b.d. respective. Asocierea b.d. la zonele de lucru este
controlata de către programator, acesta având la dispoziţie comenzi şi funcţii specializate
în acest scop.
După seschiderea unei b.d. (într-o zonă de lucru) se poate trece la lucrul cu aceasta, adică
vom putea:
să preluăm informaţii din b.d.;
să modificăm informaţiile deja existente;
să adăugăm noi informaţii;
să ştergem informaţiim din b.d., etc.
După terminarea lucrului cu b.d. urmează închiderea acesteia, constând în:
desfacerea legăturii dintre b.d. şi zona de lucru;
eliberarea memoriei alocate la deschidere (eliberarea zonei de lucru);
închiderea fişierului b.d., odată cu memorarea modificărilor efectuate de la deschidere
până în acest moment.
Acesta este pe scurt modul de lucru co o b.d. Pentru a putea lucra cu o bază de date
trebuie să înţelegem cum anume se realizează prelucrarea şi memorarea informaţiilor,
respectiv organizarea informaţiilor pe tipuri de date şi funcţiile specifice fiecărui tip de
date.

2
2. TIPURI DE DATE

Pentru a transmite calculatorului programul după care acesta urmează să prelucreze


informaţiile, se foloseşte un limbaj de programare. Acesta reprezintă ansamblul
codificărilor şi operaţiilor ce se execută într-un program, cât şi a regulilor de combinare a
acestora, în scopul transmiterii către calculator a programului după care acesta va
funcţiona.
Informaţiile prelucrate pe calculator vor fi numite date. Exemple de date: numerice, litere,
şiruri de litere, etc.
Un tip de date reprezintă o caracteristică a datelor care stabileşte ce operaţii se pot
executa asupra lor, modul de codificare a datelor în memoria calculatorului, semnificaţia
acestor date. Exemple de tipuri de date: numeric, logic, şir de caractere, etc.
În limbajul FoxPro vom avea următoarele tipuri de date:
tipul logic;
tipul numeric;
tipul şir de caractere;
tipul dată calendaristică;
tipul memo;
Aceste tipuri vor fi tratate pe rând, pentru fiecare preyentându-se:
modul de specificare a datelor de tipul respectiv;
operatori ce se aplică asupra acestor date;
comenzile şi funcţiile referitoare la datele de tipul respectiv.

2.1 TIPUL LOGIC


Este alcătuit din datele ce nu pot lua decât două valori: adevărat (TRUE) sau fals
(FALSE). Pentru a specifica valoarea adevărat a unei expresii de tip logic se foloseşte
construcţia .T. (de la TRUE) iar pentru valoarea fals se foloseşte .F. (de la FALSE).
O expresie de tip logic reprezintă o combinaţie de operanzi şi operatori. Operanzii pot fi:
câmpuri de tip logic;
funcţii care returnează valori de tip logic;
variabile de tip logic;
alte expresii logice.
Operatorii logici, în ordinea priorităţii de evaluare, sunt:
OPERATOR SEMNIFICAŢIE
() grupează expresiile logice
!, NOT negaţie logică
AND ŞI logic
OR SAU logic

De asemenea, rezultatul unei expresii care conţine operatori relaţionali este tot de tip
logic.
Exemplu:
? NOT(1=3)
.T.
? (1<=4)AND(5>3)
.T.
?6<3 OR 5*7=20

3
.F.

2.2.TIPUL NUMERIC

Operanzi numerici:
- câmpuri numerice ale b.d.
- variabile de tip numeric
- funcţii care returnează valori numerice
- constante numerice
Operatorii aritmetici care se aplica operanzilor numerici cu rezultat numeric:
OPERATOR SEMNIFICAŢIE
() grupează expresiile
**, ^ ridicare la putere
*, /, % înmulţire, împărţire, modulo(restul împărţirii)
+, - adunare scădere

Operatorii relaţionali:
OPERATOR RELAŢIE
< mai mic decât
> mai mare decât
= egal cu
<>, #, != diferit de
<= mai mic sau egal cu
>= mai mare sau egal cu

FUNCŢII REFERITOARE LA SEMNUL DATELOR NUMERICE:


ABS(<exp N>) = valoarea absolută a argumentului (respectiv<exp N>)
SIGN(<expN>) = returneză semnul argumentului
+1 dacă <exp N> este >0
SIGN(<expN>) = 0 dacă <expN> este =0
-1 dacă <exp> este <0

FUNCŢII DE APROXIMARE

INT(<expN>)= partea întreagă a argumentului


CEILING(<expN>)= cel mai apropiat întreg mai mare sau egal cu
FLOOR(<expN>)= cel mai apropiat întreg mai mic sau egal cu
ROUND(<expN1, expN2>)=<expN1>= expresia de rotunjit, (<expN2>) reprezentând
numărul de zecimale care se vor păstra în rezultat.

FUNCŢII MATEMATICE ELEMENTARE


EXP(<expN>)= exponenţiala lui (<expN>);
LOG(<expN>)= logaritmul natural din (<expN>);
LOG10(<expN>)= (<expN>)= logaritmul zecimal din (<expN>);
SQRT(<expN>)= (<expN>)= radicalul de ordin 2 din (<expN>).

2. 3 TIPUL ŞIR DE CARACTERE

4
Un şir de caractere reprezintă o mulţime de caractere ordonată care se tratează ca un tot
unitar. Ordinea caracterelor în şir este esenţială şi ficărui caracter I se asiciază un număr
reprezentând poziţia caracterului în cadrul şirului (primul caracter va avea poziţia 1, al II-
lea caracter va avea poziţia 2, ş.a.m.d.). Numărul caracterelor dintr-un şir reprezintă
lungimea şirului. Un subşir al şirului dat reprezintă o porţiune din şir, începând de la o
poziţie specificată şi de lungime dată.
Constantele de tip şir de caractere se specifică prin mulţimea caracterelor care îl compun,
încadrată între apostrofuri simple sau duble (ex. ‘bună ziua!’ este acelaşi şir de caractere
ca şi “bună ziua!” dar este diferit de şirul “BUNĂ ZIUA!”). Nu sunt permise construcţii
de forma: ‘salut” sau “salut’. pentru a include un apostrof într-un şir, şirul va fi delinitat
de celălalt tip de apostrof (ex.: “şirul acesta conţine ‘ şi este un exemplu”).
Dacă lungimea şirului de caractere este 0 vorbim despre şirul vid sau şirul nul reprezentat
‘’prin sau “”. Dacă lungimea şirului este 1 vorbim despre caractere ex.: ‘1’ sau “a”.
Operatorii care se pot aplica şirurilor de caractere sunt:
- operatori de concatenare
- operatori de comparare sau relaţionali
Operatorul de concatenare simplu “+” face ca din două şiruri de caractere să se obţină un
al treilea, prin alipirea celui de al doilea şir la coada primului.
Operatorul de concatenare special “-“ face ca din două şiruri de caractere să se obţină un
al treilea prin alipirea celui de al doilea şir la coada primului, blancurile (spaţiile) de la
sfârşitul primului şir fiind trecute la sfârşitul şirului al doilea.
Exemplu:
“eu învăţ “+” FoxPro” = “eu învăţ FoxPro”
“eu învăţ “-” FoxPro” =”eu învăţ FoxPro ”

Operatori relaţionali:
OPERATOR RELAŢIE
$ inclus în
< mai mic decât
> mai mare decât
== identic cu
<>, #, != diferit de
<= mai mic sau egal cu
>= mai mare sau egal cu

Operatorii relaţionali au următoarea sintaxă:


<expc1> <operator> <expc 2>
Operatorul $ (inclus în) returnează adevărat dacă primul şir de caractere <expc 1> este
conţinut în cel de al doilea <expc 2>, altfel returnează fals.

FUNCŢII REFERITOARE LA ŞIRURILE DE CARACTERE


Funcţia CHR( )- returnează caracterul ASCII corespunzător codului numeric
transmis ca parametru.
Sintaxă: CHR(<expN>)
Exemplu:
?CHR(49) ?CHR(65)= =’A’
1 .T.
Funcţia ASC( )- returnează codul ASCII al primului caracter din şirul dat.
Sintaxă: ASC(<expC>)
Exemplu:

5
?ASC(“A”) ?ASC(“a”)= =ASC(‘alfa’)
65 .T.
Funcţia LEN( )- returnează lungimea şirului primit ca parametru.
Sintaxă: LEN(<expC>)
Exemplu:
?LEN(‘Bună ziua !’) ?LEN(‘baze’+’de date’)
11 13
Funcţia LOWER( )- transformă toate majusculele în litere mici, restul
caracterelor rămânând neschimbate.
Sintaxă: LOWER(<expC>)
Exemplu:
?LOWER(‘POpescu AliN’)
popescu alin
Funcţia UPPER( )- transformă toate literele mici în majuscule, restul caracterelor
rămânând neschimbate.
Sintaxă: UPPER(<expC>)
Exemplu:
?UPPER(‘POpescu AliN’)
POPESCU ALIN
Funcţia PROPER( )- transformă primul caracter în majusculă (dacă este literă),
restul caracterelor în litere mici.
Sintaxă: PROPER(<expC>)
Exemplu:
?PROPER(‘POPEsCu aliN’)
Popescu Alin

2.4 TIPUL DE DATĂ CALENDARISTICĂ


O constantă de tip dată calendaristică se specifică prin luna, ziua şi anul
corespunzător, separate prin caracterul / şi încadrate între paranteze acolade.
Data calendaristică vidă se specifică prin blancuri în poziţia zilei, lunii şi anului
sau printr-un blanc încadrat între paranteze acolade.
ex.: data_vidă { / / } sau data vidă { }
FoxPro tratează toate datele calendaristice invalide ca date calendaristice vide.
ex.: ? {03/33/99}= = { }
.T.
Adunarea unei zile la o dată calendaristică are ca efect avansarea datei cu o zi în
ordine calendaristică.
astfel: {02/28/99}+1 va fi egal cu {03/01/99}
sau ? {01/01/99}-1
12/31/98
Operatorii relaţionali se pot aplica şi datelor de tip dată calendaristică. O dată
calendaristică este este mai mare decât alta atunci când prima dintre acestea urmează
calendaristic celei de a doua.
Formatul de specificare a datelor calendaristice este controlat de comanda SET
DATE.
sintaxă:
SET DATE [TO] AMERICANANSIBRITISHFRENCHGERMAN
ITALIANJAPANUSAMDYDMYYMD

Formatul datei este dat de următorul tabel:

6
TIPUL DATEI FORMATUL
AMERICAN ll/zz/aa
ANSI aa/ll/zz
BRITISH zz/ll/aa
FRENCH zz/ll/aa
GERMAN zz/ll/aa
ITALIAN zz/ll/aa
JAPAN aa/ll/zz
USA ll/zz/aa
MDY ll/zz/aa
DMY zz/ll/aa
YMD aa/ll/zz

Comanda SET CENTURY stabileşte dacă anul va fi descris de două cifre


(respectiv an din secolul 20) sau patru cifre.
sintaxă: SET CENTURY ONOFF unde ON indică patru cifre pentru an iar OFF indică
două cifre pentru an.
Data curentă a sistemului se poate obţine folosind funcţia DATE ()
sintaxă: DATE()
ex: ?DATE()
01/23/99
SET CENTURY ON
?DATE()
01/23/99

FUNCŢII CARE LUCREAZĂ CU DATE CALENDARISTICE


Funcţia CDOW (<expD>) returnează ziua din cadrul săptămânii în care cade
această dată ca şir de caractere reprezentând numele zilei din cadrul săptămânii.
Funcţia DOW (<expD>) returneză ziua din cadrul săptămânii în care cade această
dată ca număr reprezentând a câta zi din săptămână. (1 pentru luni, 2 pentru marţi, etc.)
Ex.: ?CDOW(DATE()) ?DOW({01/12/1999})

SATURDAY 2

Funcţia CMONTH(<expD>) returnează un şir de caractere reprezentând numele


lunii corespunzătoare datei (Ianuary, February, etc.).
Funcţia MONTH(<expD>) returnează un număr reprezentând a câta lună din
cadrul anului.
Ex.: ?MONTH(date()) ?CMONTH({01/12/1999})

1 IANUARY
Funcţia YEAR() returnează anul ca valoare numerică
Ex.: ?YEAR(DATE()-30)
1989

FUNCŢII CARE LUCREAZĂ CU ORA SISTEMULUI


Funcţia TIME([<expN>]) care returnează ora sistemului.
Ex.: ?TIME()

7
15:12:25
?TIME(0)
15:13:24.75
Funcţia SYS(2) returnează numărul de secunde care au trecut de la ora 0.
Ex.: ?TIME()
15:16:03
?SYS(2)
55000
Funcţia SECONDS() returnează numărul de secunde şi numărul de milisecunde
care au trecut de la ora 0.
Ex.: ?TIME()
15:19:52
?SYS(2)
55191
?SECONDS()
55191.863
Ceasul sistemului poate fi afişat în permanenţă pe ecran cu ajutorul comenzilor
SET CLOCK ONOFF unde ON face ca ceasul să fie afişat în permanenţă pe ecran sau
SET CLOCK TO [<rând>,<coloană>] folosită pentru a specifica poziţia pe ecran unde
se doreşte afişarea.
Ex.: SET CLOCK ON
SET CLOCK TO 1,70
vor determina afişarea în permanenţă a cesului în partea din dreapta sus a ecranului (linia
1 coloana 70).

3. CREAREA UNEI BAZE DE DATE

Pentru a crea o bază de date se foloseşte comanda CREATE.


sintaxă: CREATE [<fişier>?]
unde <fişier> este numele fişierului în care vrem să păstrăm baza de date. Dacă nu
se specifică o altă extensie, implicit se asociază extensia dbf (data base file). Dacă nu se
specifică numele fişierului sau se foloseşte parametrul ? pe ecran se deschide o fereastră
unde se va introduce numele b.d.

Enter the name of the new file

[..]
foxhelp.dbf DRIVE D
foxuser.dbf
install.dbf
DIRECTORY FOXPRO

[ ] All files
<<Create>>
<Cancel>
UNTITLED

8
După specificarea numelui bazei de date se activează declanşatorul implicit
<Create> după care se intră în fereastra de specificare a structurii.

Structure: Untitled
Name Type Width Dec Field

<Insert>

<Delete>

<<OK>>
<Cancel>

FIELDS: 0 LENGTH: 1 AVIABLE: 3999

În dreptunghiul trasat cu linie simplă se va specifica structura b.d. astfel:


- în coloana Name se vor introduce numele câmpurilor care alcătuiesc b.d.
- în coloana Type se vor introduce tipul câmpului, respectiv tipul datelor ce vor
putea fi memorate în acest câmp (Character, Numeric, Float, Date, Logical,
Memo, Picture).
- în coloana Width se stabileăte numărul de caractere ocupate de câmpul
respectiv în b.d. Dimensiunea câmpului se stabileşte de către utilizator doar în
cazul câmpurilor de tip Chatacter, Numeric, Float, în ultimile două situaţii
lăţime câmpului include şi punctul zecimal şi partea fracţionară.
- în coloana Dec se stabileăte numărul de zecimale de după virgulă (punctul
zecimal) şi are sens doar în cazul câmpurilor de tip Numeric şi Float.
Pe ultima linie a ferestrei sunt afişate informaţii cu privire la structura existentă:
- numărul de câmpuri (Fields)
- numărul de caractere ocupate de o înregistrare (Length)
- suma lăţimilor câmpurilor +1
- numărul de caractere disponibile (Aviable) ştiind că lungimea maximă a unei
înregistrări este de 4000.

Exerciţiu: Să se creeze b.d. agenda.dbf cu câmpurile:


• nume – şir de maxim 20 de caractere
• prenume – şir de maxim 20 de caractere
• data naşterii – dată calendaristică
• sex – logic
• nr. telefon – numeric
• adresă – şir de maxim 40 de caractere

9
ZONE DE LUCRU
Pentru manipularea b.d. FoxPro foloseşte zonele de lucru (maxim 25) în care
depune informaţiile necesare operaţiilor efectuate cu b.d. respective. La un moment dat o
singură b.d. este curentă, implicit zona de lucru curentă va fi 1 sau A, pentru identificarea
zonelor de lucru folosindu-se numerele de la 1 la 25 sau litere de la A la J (pentru primele
10 zone de lucru).
Schimbarea zonei de lucru curente se face cu comanda SELECT.
sintaxa: SELECT <expN><expC>
unde <expN> reprezintă numărul zonei de lucru ce va fi activată. Dacă <expN>
este 0 atunci se va selecta prima zonă de lucru neocupată.
<expC> caractere A, B, …
Pentru a afla care este zona de lucru curentă se foloseşte funcţia SELECT().
sintaxă: SELECT ([0])
Parametrul 0 determină funcţia să returneze numărul zonei de lucru curente.
Parametrul 0 determină funcţia să returneze numărul ultimei zone de lucru nefolosite.

4. MANIPULAREA STRUCTURII UNEI BAZE DE DATE

Pentru a realiza modificarea structurii unei baze de date se foloseşte comanda


MODIFY STRUCTURE.
sintaxa: MODIFY STRUCTURE sau MODI STRU
Această comandă deschide o fereastră de dialog, aceeaşi ca la crearea b.d. unde se
realizează modificările dorite. Dacă în zona de lucru curentă avem deschisă o b.d., atunci
comanda se referă la aceasta. În caz contrar apare o fereastră de dialog în care utilizatorul
selectează b.d. căreia îi va modifica structura.
Vizualizarea conţinutului unei b.d. se realizează cu comenzile DISPLAY
STRUCTURE sau LIST STRUCTURE.
sintaxa:
DISPLAY STRUCTURE [IN<expN><expC>]
[TO PRINTERTO FILE <fişier>]
[NONCONSOLE]
LIST STRUCTURE [IN<expN><expC>]
[TO PRINTERTO FILE <fişier>]
[NONCONSOLE]
deosebirea dintre cele două comenzi este că prima (DISPLAY) face pauză după umplerea
unui ecran cu informaţii, la cea de-a doua (LIST) afişarea făcându-se cu defilare.
<expN> sau <expC> specifică zona de lucru, respectiv b.d. la care se referă
comanda. În cazul în care apare opţiunea NONCONSOLE afişarea pe ecran (implicită)
este inhibată. În paralel cu afişarea pe ecran informaţiile pot fi trimise la imprimantă
(clauza TO PRINTER) sau în fişier <fişier> (clauza TO FILE).
Un alt mod de a crea o b.d. îl reprezintă comanda COPY STRUCTURE – care
carează o b.d. nouă cu aceeaşi structură (sau asemănătoare) cu a celei deschise în zona de
lucru curentă.
sintaxa: COPY STRUCTURE TO <fişier>
[FIELDS<lista de câmpuri>]
unde <fişier> reprezintă fişierul noii b.d. Clauza FIELDS are ca efect copierea în
noua b.d. doar a câmpurilor specificate în lista de câmpuri ce urmează clauza.

10
Exerciţiu: Să se modifice structura b.d. agenda.dbf astfel încât noua b.d. să conţină
încă un câmp şi anume înălţime (exprimată în metri, centimetri) numeric cu lăţime 5 din
care 2 partea zecimală.

5. DESCHIDEREA ŞI ÎNCHIDEREA UNEI BAZE DE DATE

Pentru lucrul cu b.d. create anterior este necesară deschiderea lor în zone de lucru
ale FoxPro. Acest lucru se relizează folosind comanda USE
sintaxa: USE [<fişier>?]
[în <zona de lucru>]
[AGAIN]
unde <fişier> este fişierul b.d. ce va fi deschisă. Dacă nu se specifică nici <fişier> şi nici ?
atunci comanda are ca efect închiderea b.d. din zona de lucru curentă. Dacă în locul
fişierului apare ? fişierul b.d. ce va fi deschisă va fi obţinut printr-o fereastră de dialog.
În cazul în care clauza îi lipseşte deschiderea b.d. se va face în zona de lucru
curentă, altfel zona de lucru în care se va deschide b.d. va fi cea specificată în clauza in.
În cazul în care se doreşte deschiderea unei b.d. de mai multe ori în zone de lucru
diferite se foloseşte clauza AGAIN.
Dacă la deschiderea unei b.d. în zona de lucru există o altă b.d., cea veche este
închisă automat înainte de deschiderea celei noi.
Închiderea bazelor de date se poate realiza şi cu comenzile CLOSE ALL şi
CLOSE DATABASE.
sintaxa:CLOSE ALL
- închide toate fişierele din toate zonele de lucru şi selectează zona de lucru 1
CLOSE DATABASE
- închide toate bazele de date şi selectează zona de lucru 1.
Pentru a obţine informaţii despre zonele de lucru şi b.d. deschise în ele se vor
folosi două funcţii: USED() şi DBF().
sintaxa: USED([<expN><expC>])
unde <expN> sau <expC> specifică zona de lucru despre care dorim să aflăm
informaţii.
Această funcţie returneaza o valoare logica astfel:
• .T. dacă în zona de lucru este deschisă o b.d.
• .F. dacă zona de lucru este liberă
Dacă nu se specifică o zonă de lucru, funcţia se referă la zona de lucru curentă.
Pentru a afla ce b.d. este dechisă într-o anumită zonă de lucru se foloseşte funcţia
DBF(). Aceasta returnează un şir de caractere ce conţine numele b.d. deschisă într-o zonă
de lucru.
sintaxa: DBF([<expN])
unde <expN> reprezintă numărul zonei de lucru la care funcţia se referă. Dacă nu
este deschisă nici o b.d. în zona de lucru specificată, atunci va fi returnat şirul vid.
exerciţiu: Să se deschidă b.d. agenda.dbf în două zone de lucru (1 şi 2) şi să se închidă
b.d. din zona 1.
USE AGENDA
USE AGENDAIN 2 AGAIN
? DBF(2)
AGENDA.DBF
SELECT 1
USE

11
6. DOMENIUL ÎNREGISTRĂRILOR

6.1 CLAUZELE DE DOMENIU


Există comenzi care acţionează asupra mai multor înregistrări ale unei b.d.
Selectarea acestora se face specificând în comandă condiţia de selectare. Mulţimea
înregistrărilor care respectă condiţia formează domeniul înregistrărilor la care se referă
comanda respectivă. Domeniul înregistrărilor se specifică prin clauzele <domeniu>, FOR
şi WHILE incluse opţional în comandă.
Clauza <domeniu> se va înlocui cu una din următoarele construcţii:
• ALL selectează toate înregistrările din b.d.
• NEXT <expN> se referă la următoarele <expN> înregistrări, începând
de la înregistrarea curentă inclusiv;
• RECORD <expN> acţionează numai asupra înregistrării cu numărul
<expN>;
• REST selectează înregistrările începând de la cea curentă inclusiv şi
până la sfârşitul b.d.
Clauza FOR:
Sintaxa: FOR <expL>
se foloseşte pentru selectarea înregistrărilor în funcţie de o condiţie logică
<expL>. Se selectează acele înregistrări pentru care <expL> este adevărată.
Clauza WHILE:
Sintaxa: WHILE <expL>
selectează înregistrările în funcţie de condiţia logică <expL>. Se selectează acele
înregistrări pentru care <expL> este adevărată. Spre deosebire de clauza FOR care după
găsirea unei înregistrări care nu respectă condiţia continuă cu testarea celorlalte, clauza
WHILE întrerupe testarea înregistrărilor când găseşte o înregistrare ce nu respectă
condiţia dată.
Dacă se folosesc ambele clauze FOR şi WHILE, prima care contează este clauza
WHILE.
În expresia logică din clauza FOR şi WHILE, trebuie să apară o mărime care să
varieze în funcţie de înregistrare. Aceasta trebuie să depindă fie de numărul de
înregistrare, fie de conţinutul acesteia.
Exerciţiu: Să se afişeze toate înregistrările al căror nume începe cu o literă de după litera
P.

6.2 INDICATORUL DE ÎNREGISTRĂRI


Indicatorul de înregistrări este asociat unei b.d. la deschidere şi este şters la
închiderea b.d. La deschiderea b.d. indicatorul de înregistrări va indica spre prima
înregistrare (spre înregistrarea 1), dacă ea există.
Aflarea înregistrării curente dintr-o b.d. (deci a conţinutului indicatorului de
înregistrări) se face folosind funcţia RECNO( ).
Sintaxa: RECNO([<expN>])
Funcţia returnează un rezultat numeric reprezentând numărul înregistrării curente
din b.d. deschisă în zona de lucru <expN>. Dacă <expN> lipseşte atunci funcţia se referă
la b.d. activă.
Exemplu: USE AGENDA
?RECNO( )
1
LIST NEXT 2

12
?RECNO( )
2
Schimbarea înregistrării curente se realizează cu ajutorul cumenzilor: GOTO,
SKIP.
Comanda GO sau GOTO poziţionează indicatorul de înregistrări pe o anumită
înregistrare dintr-o b.d. (GO şi GOTO sunt identice).
Sintaxa: GO | GOTO [RECORD] <expN1> [în <expN2>]
GO | GOTO TOP | BOTTOM [IN <expN2>]
Prima formă are ca efect poziţionarea indicatorului de înregistrări di b.d. sau din
zona de lucru <expN2> pe înregistrarea cu numărul <expN1>.Absenţa clauzei IN
determină referirea la b.d. activă.
Clauza RECORD este opţională, prezenţa ei neavând nici un efect; ea se introduce
pentru claritatea programului.
Forma a doua a comenzii se foloseşte pentru poziţionarea indicatorului de
înregistrări la extremele b.d. (la începutul sau sfârşitul acesteia).
Clauza TOP se foloseşte pentru poziţionarea pe prima înregistrare, pe când
BOTTOM determină poziţionarea pe ultima înregistrare a b.d.
Următoarele comenzi sunt echivalente:
GO 1
GOTO 1
GO RECORD 1
GO TOP
GOTO TOP IN SELECTED( )
Un alt tip de deplasare cu indicatorul de înregistrări este realizat cu ajutorul
comenzii SKIP. Aceasta mută indicatorul de înregistrări peste un număr de înregistrări
relativ la înregistrarea curentă.
Sintaxa: SKIP [<expN1> | | <expN2>]
unde <expN1> reprezintă numărul de înregistrări peste care se sare (cu indicatorul
de înregistrări). Acesta poate fi atât un număr pozitiv (se sare spre o înregistrare cu un
număr de înregistrare mai mare), cât şi negativ (se sare spre o înregistrare anterioară celei
curente). <expN2> specifică zona de lucru în care este deschisă b.d.
Dacă se sare peste ultima înregistrare a b.d., indicatorul de înregistrări va conţine
numărul de înregistrări din b.d.+1, iar funcţia EOF( ) va returna valoarea .T.; în cazul
saltului înaintea primei înregistrări funcţia BOF( ) va returna valoarea .T.
Următoarele comenzi sunt echivalente:
SKIP
SKIP 1
SKIP IN SELECT( )
GOTO RECORD RECNO( )+1
Funcţiile EOF( ) şi BOF( )
Sintaxa: EOF( [<expN>] )
BOF( [<expN>] )
testează dacă indicatorul de înregistrări se află la sfârşitul, respectiv la începutul
b.d. active sau a celei specificate ca parametru.
Numărul de înregistrări dintr-o b.d. este dat de funcţia RECCOUNT( ).
Sintaxă: RECCOUNT( [<expN>] )
Exemplu: USE AGENDA
?RECNO( )
1
SKIP 3

13
?RECNO( )
4
GO TOP
?RECNO( )
1
SKIP –2
?BOF( )
.T.

7. VIZUALIZAREA CONŢINUTULUI UNEI BAZE DE DATE

Afişarea conţinutului b.d. se poate face pe ecran, la imprimantă sau într-un fişier
de pe disc folosind comenzile LIST şi DISPLAY.
Sintaxa: DISPLAY[ [FIELDS] <lista de câmpuri>]
[<domeniu>] [FOR <expL1>] [WHILE <expL2>]
[OFF]
[TO PRINTER | TO FILE <fişier>]
[NOCONSOLE]
Afişarea informaţiilor se face în următorul format:
- prima linie reprezintă lista câmpurilor identificate prin numele acestora;
- următoarele linii reprezintă înregistrări din b.d., în cadrul cărora câmpurile sunt
afişate unul lângă altul.
Pe prima poziţie se afişează numărul de ordine al înregistrării în b.d.
Clauza FIELDS se foloseşte cu scopul de a afişa doar câmpurile specificate în
<lista de câmpuri>, în ordinea apariţiei lor în această listă. Absenţa acestei clauze
determină afişarea tuturor câmpurilor b.d., în ordinea în care apar acestea în structura b.d.
<domeniu>, FOR, WHILE determină domeniul înregistrărilor ce vor fi afişate.
Dacă aceste clauze lipsesc se va afişa doar înregistrarea curentă, acesta fiind domeniul
implicit al înregistrărilor, pentru comanda DISPLAY.
Prezenţa clauzei OFF determină dispariţia din formatul de afişare a coloanei 0 (nu
se mai afişează numărul de ordine).
Prezenţa clauzei NONCONSOLE opreşte afişarea pe ecran.
Se poate face afişarea şi la imprimantă, dacă se foloseşte clauza TO PRINTER,
sau în fişierul <fişier>, dacă se foloseşte clauza TO FILE.
Comanda LIST este asemănătoare cu DISPLAY (are aceeaşi sintaxă, cu aceleaşi
semnificaţii ale clauzelor) cu următoarele diferenţe:
• comanda DISPLAY afişează doar înregistrarea curentă, pe când comanda LIST
afişează toate înregistrările;
• comanda DISPLAY are ca efect afişarea conţinutului b.d. ecran cu ecran, trecerea de
la un ecran la altul făcându-se după apăsarea unei taste, la comanda LIST afişarea se
face cu defilare, pauza dintre ecrane lipsind;
• LIST nu afişeaza înregistrările marcate pentru ştergere când avem SET DELETED
ON, pe când DISPLAY le afişează şi pe acestea. Pentru ca denumirile câmpurilor să
nu mai apară la afişare, se foloseşte comanda
SET HEADING ON|OFF
unde ON determină afişarea antetului iar OFF determină inhibarea afişării. Opţiunea
implicită este ON.
Exemplu:
USE AGENDA

14
LIST
GO TO 3
LIST REST
GO TOP
DIS PLAY
DISPLAY NEXT 3
LIST ALL FOR NUME >”P”
DISPLAY FIELDS NUME, PRENUME

8. ADĂUGAREA DE ÎNREGISTRĂRI LA O BAZĂ DE DATE

Adăugarea de înregistrări se poate face în două moduri, în funcţie de poziţia pe


care o va ocupa noua înregistrare în b.d.:
• adăgarea de înregistrări noi la sfârşitul b.d.;
• introducerea de înregistrări noi în interiorul b.d.
Comanda APPEND adaugă înregistrări la sfârşitul b.d. deschise în zona de lucru
curentă.
sintaxa: APPEND [BLANK]
Comanda APPEND fără clauza BLANK determină deschiderea unei ferestre de
edtiare în care utilizatorul poate introduce câmp cu câmp informaţiile înregistrării
(înregistrărilor) ce se vor adăga. Terminarea introducerii tuturor înregistrărilor se
realizează apăsând simultan tastele Ctrl şi End, fereastra de editare închizându-se după
aceasta.
O formă deosebită a comenzii APPEND se obţine folosind clauza BLANK.
Comanda APPEND BLANK are ca efect adăugarea unei noi “înregistrări blank” la
sfârşitul b.d., urmând ca informaţia utilă să se încarce mai târziu, prin alte comenzi.
Înregistrarea “blank” este înregistrarea în care toate câmpurile sunt inţializate cu spaţii
(CHR(#”)).
Adăugarea de înregistrări la sfârşitul unei b.d. când conţinutul este preluat dintr-un
alt fişier se relizează cu comanda APPEND FROM care are următoarea sintaxă:
APPEND FROM <fişier>
[FIELDS <lista câmpuri>]
[FOR <expL>]
unde <fişier> reprezintă numele fişierului din care se preiau înregistrările ce se
vor adăuga la bza de date. Dacă nu se specifică numele fişierului, trebuie specificată
clauza ?, astfel se oferă utilizatorului posibilitatea alegerii fişierului printr-o fereastră de
dialog.
Dacă se doreşte ca baza de date <fişier> să se preia doar anumite câmpuri, se va
include clauza FIELDS, în care <lista câmpuri> reprezintă lista câmpurilor ce se vor
copia, separate prin virgulă.
Pentru a se prelua din fişier doar anumite înregistrări, se va specifica domeniul
acestora prin clauza FOR.
ex.: USE agenda
APPEND
APPEND BLANK
COPY STRU TO ag1 FIELDS nume, prenume
USE
USE ag1
APPEND FROM agenda FOR nume <”d”

15
Cea de-a doua metodă de adăugare a unei înregistrări noi la o b.d. o reprezinta
inserarea înregistrării în interiorul b.d. folosind comanda INSERT.
sintaxa: INSERT [BEFORE][BLANK]
are ca efect inserarea unei înregistrări noi, după înregistrarea curentă.
Dacă se specifică clauza BLANK se adaugă o înregistrare blank, altfel se intră
într-o fereastră de editare de noi înregistrări asemănătoare ferestrei de la comanda
APPEND.
Clauza BEFORE determină adăugarea unei înregistrări noi înaintea înregistrării
curente, astfel:

ÎNREGISTRARE NOUĂ Înregistrare curentă

INSERT

9. MODIFICAREA CONŢINUTULUI UNEI BAZE DE DATE

Modificarea informaţiilor stocate într-o b.d. se realizează cu ajutorul comenzilor


CHANGE, EDIT, BROWSE, şi REPLACE. Primele trei comenzi nu modifică propriu-
zis conţinutul b.d. ci deschid o fereastră de editare în care utilizatorul va modifica
informaţiile din b.d. Comenzile CHANGE şi EDIT sunt identice, ele diferă de comanda
BROWSE doar prin modul de organizare pe ecran a ferestrei corespunzătoare.
sintaxa:CHANGE|EDIT
[FIELDS<lista câmpurilor>]
[<domeniu>][FOR<expL1][WHILE<expL2>]
[FREEZE <câmp>]
[NOAPPEND][NOCLEAR][NODELETE]
[NOEDIT][NOMODIFY]
[VALID[:F]<exp1>[ERROR<expC1>]]
[WHEN<expL1>]
WIDTH<expN1>]
Ieşirea din fereastra de editare şi salvarea modificărilor se face folosind combinaţia de
taste Ctr=?+End. Dacă nu se doreşte salvarea se va folosi ieşirea cu tastele Ctrl+Q.
Clauza FIELDS are ca efect afişarea spre meditare doar a câmpurilor specificate în <listă
câmpuri>, în ordinea apatiţiei lor în listă.
<domeniu>, FOR, WHILE specifică domeniul înregistrărilor ce vor fi accesibile spre
editare. Clauza FREEZE se foloseşte pentru a selecta pentru modificare un singur câmp,
restul fiind doar afişate în fereastra de editare, fără a permite modificarea lor. Clauza
NOAPPEND opreşte utilizatorul de a adăuga noi înregistrări din fereastra de editare.
Clauza NODELETE nu permite ştergerea înregistrărilor din b.d. NOEDIT şi
NOMODIFY se exclud reciproc, nu permit utilizatorului modificarea înregistrărilor, ci
doar vizualizarea acestora, dar nu presupun protecţie la ştergere. Clauza [VALID [F:]
<exp1>[ERROR<expC1>>]] permite validarea înregistrării după modificare. Astfel, după
ce iese din editarea înregistrării se evaluează <exp1> ca fiind .T. dacă datele introduse

16
sunt corecte, altfel aceasta se consideră .F., fişându-se mesajul de eroare <expC1> dacă
clauza ERROR apare, sau mesajul implicit de eroare altfel. :F forţează evaluarea <exp1>
chiar dacă nu s-au modificat valorile din înregistrare, ci doar s-a trecut prin ea.
Clauza WHEN perminte intrarea în editare doar dacă <expL1> este evaluată ca .T.
Clauza WIDTH limitează numărul de caractere afişate, fără a efectua lăţimea câmpului în
b.d.
Comanda BROWSE
Sintaxa: BROWSE
[FIELDS <lista câmpuri>]
[FOR <expL1>]
[FREEZE]
[NOAPPEND] [NOCLEAR] [NODELETE]
[NOEDIT] [NOMODIFY]
[VALID [:F] <exp1>[ERROR<expC1>]]
[WHEN<expL1>]
[WIDTH<expN1>]
Semnificaţia clauzelor este aceeaşi ca la comanda CHANGE.
Modificarea conţinutului unei b.d. se poate face şi cu comanda REPLACE, însă
aceasta nu deschide o fereastră de editare, ci realizează prupiu-zis actualizarea b.d. cu
datele precizate prin comandă.
Sintaxa: REPLACE <câmp1> WITH <expr1>
[,<câmp2> WITH <expr2>…]
[<domeniu>] [FOR<expL1>] [WHILE<expL2>]
Comanda înlocuieşte vechea valoare din câmpul <câmp1> cu valoarea rezultată din
evaluarea expresiei <expr1> ,valoarea din <câmp2> cu <expr2> etc.
Pentru câmpuri numerice, dacă nu se reuşeşte încadrarea valorii expresiei în câmpul
respectiv, acesta va fi umplut cu asterixuri.
<domeniu> FOR, WHILE specifică domeniul înregistrărilor la care se referă comanda,
domeniul implicit fiind înregistrarea curentă.
Exemplu: USE agenda
REPLACE nume WITH UPPER (nume), prenumeWITH PROPER
(prenume) ALL
BROWSE FIELDS nume, prenume FOR nr_telefon>320000

10. ŞTERGEREA ÎNREGISTRĂRILOR DINTR-O BAZĂ DE DATE

Ştergerea unei înregistrări se poate realiza la două nivele şi anume:


• la nivel logic – înregistrarea nu este propriu-zis ştearsă, ci ea este marcată pentru
ştergere, anumite comenzi şi funcţii considerând aceste înregistrări absente di fişierul b.d.,
existând însă posibilitatea ca informaţia conţinută în înregistrare să poată fi recuperată;
• la nivel fizic – înregistrarea este ştearsă efectiv din b.d., ea nemaiputând fi recuperată.
Marcarea pentru ştergere a uneia sau a mai multor înregistrări se realizează cu
ajutorul comenzii DELETE.
Sintaxa: DELETE
[<domeniu>] [FOR <expL1>] [WHILE <expL2>]
unde <domeniu>,FOR, WHILE identifică înregistrările ce vor fi marcate pentru ştergere.
Domeniul implicit al comenzii DELETE este înregistrarea curentă.
Accesul la înregistrările marcate pentru ştergere este controlat de comanda SET
DELETED.

17
Sintaxa: SET DELETED ON | OFF
unde opţiunea ON determină ca în înregistrările marcate pentru ştergere să nu poată fi
folosită de comenzile care folosesc domeniul înregistrărilor. Starea iniţială este OFF.
Comenzile care accţionează asupra unei singure înregistrări sau care au ca domeniu
implicit înregistrarea curentă nu sunt afectate de această comandă.
În interiorul unui program marcajul de ştergere a unei înregistrări se face cu
funcţia DELETED( ). Aceasta returnează valoarea logică .T. dacă înregistrarea curentă
este marcată pentru ştergere.
Sintaxa: DELETED( [<expN>] )
unde <expN> reprezintă zona de lucru în care este deschisă b.d. în cazul în care funcţia se
referă la altă b.d. decât cea activă.
Înlăturarea marcajului pentru ştergere se realizează cu comanda RECALL; după
ce marcajul a fost îndepărtat înregistrarea devine accesibilă pentru toate comenzile.
Sintaxa: RECALL[<domeniul>] [FOR<expL1>] [WHILE<expL2>]
Înregistrările care nu sunt marcate pentru ştergere nu sunt afectate de această
comandă; domeniul implicit al comenzii RECALL este înregistrarea curentă.
Pentru ştergerea la nivel fizic se foloseşte comanda PACK.
Sintaxa: PACK
Comanda realizează ştergerea fizică a tuturor înregistrărilor marcate pentru ştergere din
b.d.
După aplicarea comenzii PACK asupra unei b.d. înregistrările nu mai pot fi făcute.
Ştergerile sunt permanente.
O altă comandă cu privire la ştergerea înregistrărilor din b.d. este comanda ZAP.
Sintaxa:ZAP
Comanda şterge fizic toate înregistrările din b.d. activă, fiind echivalentă cu secvenţa de
instrucţiuni
DELETE ALL
PACK
Diferenţa constă în faptul ca ZAP este mai rapidă.
După aplicarea comenzii ZAP asupra unei b.d. înregistrările nu mai pot fi refăcute.
Ştergerile sunt permanente.

11. MANIPULAREA CÂMPURILOR UNEI BAZE DE DATE

Accesul la câmpurile unei b.d. este controlat de comanda SET FIELDS.


Sintaxa: SET FIELDS ON | OFF
SET FIELDS TO [[<câmp1>[<câmp2>…]] | ALL]
unde <câmp1>,<câmp2>,… reprezintă lista câmpurilor ce pot fi accesate în cazul SET
FIELDS ON. SET FIELDS TO ALL permite accesul la toate câmpurile, chiar dacă
starea lui SET FIELDS este ON. SET FIELDS TO face ca lista câmpurilor să fie vidă,
deci nici un câmp nu va putea fi accesat în cazul SET FIELDS ON.
Pentru a se reveni la accesul tuturor câmpurilor se introduce una dintre comenzile:
SET FIELDS TO ALL sau
SET FIELDS OFF
Numărul câmpurilor dintr-o b.d. este dat de funcţia FCOUNT ( [<expN>] ) unde
<expN> reprezintă zona de lucru în care este deschisă b.d. (dacă nu se specifică, se
consideră că funcţia se referă la b.d. deschisă în zona de lucru curentă). Dacă în zona de
lucru specificată nu este deschisă nici o b.d. funcţia va returna valoarea 0.

18
Funcţia FIELDS( ) returnează numele unui câmp dintr-o b.d., identificat prin
numărul câmpului în cadrul structurii b.d.
Sintaxa: FIELDS(<expN1>[,<expN2>] )
unde <expN1> specifică numărul câmpului, iar <expN2> identifică zona de lucru în care
se află b.d. (dacă nu se specifică, funcţia se referă la zona de lucru curentă). Funcţia
returnează un şir de caractere conţinând numele c’mpului specificat, scri cu majuscule. În
cazul în care numărul de ordine al câmpului specificat este mai mare decât numărul total
de câmpuri al b.d., funcţia va returna şirul vid de caractere.
Funcţia FSIZE( ) returnează mărimea unui câmp al unei b.d., specificat prin
numele său.
Sintaxa: FSIZE (<expC1>[,<expN>] )
unde <expC1> este un şir de caractere ce reprezintă numele câmpului, <expN> specifică
zona de lucru. Rezultatul este de tip numeric.

12. ACCESUL LA ÎNREGISTRĂRI

În afară de controlul asupra înregistrărilor exercitat cu ajutorul comenzilor de


ştergere, mai există o metodă de control a accesului la informaţiile din înregistrări.
Această metodă este dată de comanda SET FILTER.
Sintaxa: SET FILTER TO[<expL>]
Comanda determină ca în b.d. să apară doar înregistrările care îndeplinesc condiţia
<expL>.
SET FILTER TO fără condiţie face ca toate înregistrările din b.d. să poată fi
accesate.
Pentru a afla condiţia condiţia de accesare a înregistrărilor (expresia filtru) se foloseşte
funcţia FILTER.
Sintaxa: FILTER(<expN>)
unde <expN> specifică zona de lucru în care este deschisă b.d.
Rezultatul funcţiei este un şir de caractere reprezenrând expresia filtru stabilită de
comanda SET FILTER.
Exemplu: SET FILTER TO data_naşterii>{03/02/1981}
LIST

13. CĂUTAREA ÎNREGISTRĂRILOR ÎNTR-O BAZĂ DE DATE

În cazul în care dorim să găsim o înregistrare care să satisfacă anumite condiţii,


putem folosi comanda LOCATE.
Sintaxa: LOCATE FOR<expL1>
[<domeniu>] [WHILE<expL2>]
Comanda caută prima înregistrare care respectă condiţia <expL1> în b.d. activă.
Domeniul înregistrărilor care se testează este dat de clauzele <domeniu> şi WHILE,
domeniul implicit fiind ALL. În caz de reuşită, adică la găsirea unei înregistrări care
respectă condiţia <expL1>, indicatorul de înregistrări se poziţionează pe înregistrarea
respectivă, funcţia FOUND ( ) va returna valoarea .T. iar funcţia EOF( ) va returna
valoarea .F. În caz contrar, indicatorul de înregistrări va fi poziţionat după ultima
înregistrare (numărul total de înregistrări+1), FOUND( ) va returna .F. iar EOF( ) va
returna .T.

19
Într-o b.d. pot exista mai multe înregistrări care respectă o condiţie dată. Prima
dintre acestea va fi găsită folosind comanda LOCATE, următoarele vor fi găsite folosind
comanda CONTINUE.
Sintaxa: CONTINUE
Comanda găseşte următoarea înregistrare care respectă condiţiile specificate în ultima
comandă LOCATE aplicată b.d. active.
Testarea reuşitei sau nereuşitei căutării se face cu funcţiile RECNO( ), FOUND( )
şi EOF( ).
Funcţia FOUND( )
Sintaxa: FOUND( [<expN>] )
este folosită pentru testarea rezultatului unei căutări în b.d. (eventual specificată prin zona
de lucru <expN>). Ea returnează .T. dacă s-a găsit o înregistrare şi .F. dacă nu s-a găsit
nici o înregistrare care să satisfacă condiţiile impuse de LOCATE.

14. ORDONAREA UNEI BAZE DE DATE

O b.d. este ordonată după un anumit vriteriu, dacă fiecare înregistrare a acesteia
respectă criteriu dat, în raport cu celelalte înregistrări. Criteriu de comparaţie între două
înregistrări este format dintr-un operator relaţional mai mic (<) sau mai mare (>) care se
aplică la două valori ale unei expresii, fiecare corespunzând uneia dintre înregistrările de
comparat. Astfel, compararea a două înregistrări se reduce la compararea valorilor
expresiei respective.
Expresia poartă numele de cheie de ordonare.
În FoxPro există două metode de ordonare a unei b.d. şi anume:
• ordonarea propriu-zisă a b.d. prin schimbarea între ele a înregistrărilor, după un
anumit logaritm, până când acestea sunt în ordinea dorită. În acest caz se obţine o
nouă b.d. care conţine aceleaşi înregistrări ca şi cea de la care s-a pornit, dar în
ordinea dorită;
• indexarea unei b.d., aceasta crearea unui nou fişier care conţine informaţii cu privire
la ordinea înregistrărilor în b.d. Şi în acest caz se obţine un fişier nou, fişierul index,
dar acesta nu conţine înregistrările b.d., ci numai memorează ordinea acestora.

14.1 SORTAREA BAZELOR DE DATE


Sortarea bayelor de date se realiyeayă cu comanda SORT.
sintaxa: SORT TO <fişier> ON <câmp>[/A|/D][/C]…]
[,<câmp>[/A|/D][/C]…]
[ASCENDING|DESCENDING]
[<domeniu>] [FOR<expL1>] [WHILE<expL2>]
[FIELDS <lista cîmpuri>]
Comanda sortează b.d. activă creind o nouă b.d. în care sunt depuse înregistrările
selectate în ordinea specificată. Baza de date nouă va conţine câmpurile specificate la
clauza FIELDS, sau toate câmpurile, în cazul în care această clauză lipseşte. Noua b.d. va
purta numele <fişier>, la care se adaugă în mod implicit extensia .dbf (dacă nu se
specifică explicit alta).
Cheia de ordonare este dată de câmpurile <câmp1>, <câmp2>, … specificate după
clauza ON. Clauzele /A şi /D sunt asociate câmpului după care acestea urmează şi
specifică tipul de ordonare pentru câmpul respectiv: A – crescător şi D – descrescător.
Dacă toate câmpurile din listă sunt egale pentru cele două înregistrări care se compară, se
păstrează ordinea iniţială din b.d.

20
Clauza /C se foloseşte pentru câmpurile de tip şir de caractere pentru a face
compararea acestor câmpuri insensibilă la tipul literelor (majuscule sau minuscule).
Implicit, tipul literelor este luat în consideraţie.
Pentru specificarea a două clauze după un câmp, se folosesc construcţiile /AC
sau /DC.
Clauzele ASCENDING şi DESCENDING sunt similare clauzelor /A şi /D, numai
că se referă la toate câmpurile din listă. În lipsa lor, ordinea implicită este ASCENDING
(crescătoare). Clauzele asociate câmpurilor (/A, /D) au prioritate faţă de clauzele
ASCENDING şi DESCENDING.
<domeniu>, FOR şi WHILE selectează înregistrările ce se vor ordona şi vor fi
trecute în noua b.d.
Exemplu:
USE agenda
SORT TO ag_ord ON nume /ac, prenume /dc
USE ag_ord IN 2
SELECT 2
LIST

14.2 INDEXAREA BAZELOR DE DATE


Indexarea unei b.d. presupune crearea unui fişier nou, numit fişier index asociat,
în care se înregistreayă ordinea înregistrărilor din b.d. Accesul la o anumită întrgistrare se
face prin intermediul fişierului index.
Fişierele index ce pot fi asociate unei b.d. pot fi de următoarele două tipuri:
• fişiere index simple (cu extensia .IDX), care conţin o singură cheie de ordonare;
• fişiere index compuse (cu extensia .CDX), care memorează mai multe chei de
ordonare, numite etichete, una singură fiind activă la un moment dat şi anume eticheta
activă.
O b.d. poate avea mai multe fişiere index asociate, dar numai unul singur va fi
activ la un moment dat, acesta fiind numit fişierul index activ. Ordinea în care este
această b.d. este dată de fişierul index activ, iar dacă acesta este compus, de eticheta
activă din fişierul index respectiv.
Crearea unui fişier index este executată de comanda INDEX.
sintaxa: INDEX ON <expr> TO <fişier.idx>TAG <nume etichetă> [OF <fişier.cdx>]
[FOR<expL>]
[ASCENDINGDESCENDING]
[UNIQUE]
[ADDITIVE]
Cheia de ordonare (acum se numeşte cheie de indexare) este specificată prin
<expr>, aceasta conţinând câmpuri ale b.d. active.
Un fişier index compus poate conţine mai multe chei de indexare, fiecare
corespunzând unui criteriu de ordonare a b.d. Fiecare criteriu este identificat prin eticheta
asociată, ce se specifică în interiorul comenzii index prin clauza TAG, unde <nume
etichetă> reprezintă numele etichetei respective.
Fişierele compuse sunt, la rândul lor de două tipuri:
• structurale – sunt deschise şi asociate automat b.d. odată cu deschiderea acesteia
folosind comanda USE. Acestea au aceleaşi nume cu b.d., extensia fiind .CDX şi sunt
create folosind clauza TAG, fără introducerea unui nume de fişier index cu clauza OF:
• nestructurale – nu sunt deschise automat odată cu dechiderea b.d. Ele poartă alt nume
decât cel al b.d., numele specificat în clauza OF: <fişier.cdx>.

21
Clauza FOR determină ca numai înregistrările care respectă <expL> să poată fi
accesate prin fişierul index respectiv. ASCENDINDG sau DESCENDING se folosesc
pentru a preciza modul de ordonare a b.d., asociat fişierului index.
Clauza UNIQUE – dacă avem două sau mai multe înregistrări cu aceeaşi cheie de
indexare, determină accesul doar la prima înregistrare şi blocarea accesului la celelalte.
Clauza ADDITIVE – dacă fişierul index compus există, eticheta specificată va fi
adăugată la celelalte etichete ale fişierului index.
Odată cu deschiderea b.d. se pot deschide şi o serie de fişiere index asociate b.d.,
incluzând clauza INDEX în comanda USE.
sintaxa: USE [<fişier>?] …
[INDEX <lista fişierelor index>?]
[ORDER[<expN><fişier.idx>[TAG]<nume etichetă>[OF <fişier.cdx>]
[ASCENDINGDESCENDING]]]]
La deschiderea b.d. <fişier> se vor deschide şi fişierele index din <lista fişiere
index>, care trebuie să fie deja create. În specificarea acestor fişiere nu trebuie inclusă ţi
extensia; dacă nu există pericol de confuzie, fişierele vor fi separate prin virgulă. Dcaă se
înlocuieşte lista de fişiere cu ? se va afişa o ferestră de dialog de unde utilizatorul poate
selecta aceste fişiere. Dacă nu se specifică clauza ORDER, primul fişier index din listă va
fi cel activ. Dacă acesta este fişier index compus, înregistrările vor fi accesate în ordinea
fizică din b.d.
Clauza ORDER determină fişierul index simplu ce va deveni activ sau eticheta
dintr-un fişier index compus ce va deveni activă astfel:
• prin ORDER<expN>, unde expresia numerică reprezintă numărul de ordine al
fişierului index simplu sau al teichetei din fişierul index compus. Numărarea se face
astfel: mai întâi se numără fişierele index simple, în ordinea în care apar în listă, apoi
se numără etichetele de la fişierul index structural, în ordinea definirii acestora iar
ultimile se vor număra etichetele, în ordinea definirii lor, din fişierele index compuse,
în ordinea apariţiei acestora în listă. Dacă <expN> este 0 se va folosi ordinea fizică a
înregistrărilor din b.d.;
• prin ORDER <fişier.idx>, unde fişierul index simplu <fişier.idx> va deveni activ;
• prin ORDER [[TAG<nume etichetă>][OF<fişier.cdx>]], în care eticheta cu numele
<nume etichetă> din fişierul index structural sau oricare alt fişier index compus va
deveni activă. Dacă se doreşte selectarea unei etichete dintr-un fişier index compus
nestructural şi există o etichetă cu acelaşi nume în fişierul index structural, atunci se
va folosi şi clauza OF, în care <fişier.cdx> reprezintă fişierul în care găsim eticheta
respectivă.
Clauzele ASCENDIN şi DESCENDING specifică ordinea crescătoare sau
descrescătoare folosită pentru ordonarea înregistrărilor.
Dacă se doreşte deschiderea unor fişiere pentru b.d. curentă după ce aceasta a fost
deschisă, se foloseşte comanda SET INDEX.
sintaxa: SET INDEX TO[<lista fişiere index>?]
[OEDER<expN><fişier.idx>TAG<nume etichetă>[OF<fişier.cdx>]
[ASCENDINGDESCENDING]][ADITIVE]
Se vor deschide toate fişierele index specificate în <lista fişiere index> sau
selectate din fereastra de dialog deschisă de ?.
Noua listă de fişiere o va înlocui pe cea veche, dacă nu se specifică clauza
ADDITIVE. În prezenţa acesteia, noua listă se adaugă la cea veche.
Forma SET INDEX TO închide toate fişierele index din zona de lucru curentă,
excepţie făcînd fişierul index structurat.

22
Având deschise mai multe fişiere index simple sau compuse, pentru a selecta alt
fişier index activ sau altă etichetă activă se foloseşte comanda SET ORDER.
sintaxa: SER ORDER TO
[<expN1><fişier.idx>[TAG]<nume etichetă>[OF<fişier.cdx>]
[IN<expN2>]
[ASCENDINGDESCENDING]
Clauza IN se foloseşte atunci când comanda se foloseşte la altă b.d. decât cea
activă, aflată în zona de lucru <expN2>.
Închiderea fişierelor index se face folosind comanda CLOSE INDEX, care
închide toate fişierele index deschise în zona de lucru curentă, în afara celui structural
sau:
CLOSE ALL, USE, CLOSE DATABASES.
Exemplu:
USE agenda
INDEX ON nume TO agenda1 && crează fişierul agenda1 – fişierul index simplu cu
cheia de indexare nume.
Fişier index compus structurat cu cheile de indexare nume, prenume, număr de telefon
INDEX ON nume TAG nume
INDEX ON prenume TAG prenume
INDEX ON număr de telefon TAG număr de telefon
SET ORDER TO 3 && stabileşte indexul activ ca fiind prenumele

15. EXTRAGEREA INFORMAŢIILOR STATISTICE DIN BAZA DE DATE

Să presupunem că avem b.d. agenda.dbf în care am stocat informaţii referitoare la


persoanele cunoscute (nume, prenume, data naşterii, sexul, numărul de telefon, adresa,
etc.). La 1 martie dorim să oferim mărţişoare tuturor fetelor cunoscute, aşadar ne
interesează numărul de fete. Aceasta se poate rezolva simplu, cu ajutorul comenzii
COUNT.
sintaxa: COUNT [<domeniu>][FOR<expL1>][WHILE<expL2>][TO<variabilă>]
Comanda numără înregistrările din domeniul specificat prin <domeniu>, FOR şi
WHILE (domeniul implicit fiind ALL) şi depune rezultatul în variabila <variabilă>, care
va fi creată în cazul în care nu există.
Exemplu:
CLOSE ALL
USE agenda
COUNT FOR sex=.T. TO nrbăieţi
?’ÎN BAZA DE DATE AVEM’, nrbăieţi, ‘BAIETI’
ÎN BAZA DE DATE AVEM 3 BĂIEŢI
USE

Un alt tip de calcul ce se poate efectua asupra unei b.d. este sumarea unor câmpuri
numerice ale b.d. cu comanda SUM.
sintaxa: SUM[<lista expresii>]
[<domeniu>][FOR<expL1>][WHILE<expL2>]
[TO<lista variabile>]
<lista expresii> este formată din expresii care conţin câmpuri numerice ale b.d.
Valorile acestor expresii sunt sumate pentru toate înregistrările selectate prin <domeniu>,

23
FOR şi WHILE. Dacă lista lipseşte, se vor suma toate câmpurile numerice ale b.d.
Rezultatele obţinute vor fi depuse în variabilele respective din <lista variabile>.
O comandă asemănătoare cu SUM este AVERAGE.
sintaxa: AVERAGE [<lista expresii>]
[<domeniu>][FOR<expL1>][WHILE<expL2>]
[TO<listă variabile>]
AVERAGE calculează media aritmetică a valorilor expresiilor din <lista expresii>.

24

S-ar putea să vă placă și