Documente Academic
Documente Profesional
Documente Cultură
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
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 DE APROXIMARE
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
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
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
SATURDAY 2
1 IANUARY
Funcţia YEAR() returnează anul ca valoare numerică
Ex.: ?YEAR(DATE()-30)
1989
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 ONOFF 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).
[..]
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>
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.
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ă.
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
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.
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
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:
INSERT
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
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.
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.
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.
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.
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
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>]
[ASCENDINGDESCENDING]]]]
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>]
[ASCENDINGDESCENDING]][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>]
[ASCENDINGDESCENDING]
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
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