Sunteți pe pagina 1din 29

Sistemul de gestiune a bazelor de date Visual FoxPro

BAZE DE DATE – LIMBAJ DE


PROGRAMARE
1.1. Generalităţi
Principalul domeniu de utilizare a calculatorului îl reprezintă cel al prelucrării de
date. Pe măsură ce societatea se dezvoltă cresc şi necesităţile de informare ale acesteia,
deci creşte volumul de date ce trebuie prelucrate. Apare astfel problema memorării
acestor date, a prelucrării lor în vederea obţinerii diverselor rezultate solicitate. Acesta
este tocmai domeniul în care este specializat FoxProW, domeniul bazelor de date.
Datorită capacităţilor relativ mici ale memoriilor interne ale calculatoarelor,
stocarea unor volume mari de date se face pe dispozitive de memorare externe, 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 Gigaocteţilor, 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 datele stocate în acesta.
O bază de date are o organizare tabelară, pe linii şi coloane având următoarele
corespondenţe :
- capului de tabel îi corespunde „structura bazei de date”;
- 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 ( printr-un nume asociat fiecărui câmp), cât şi caracteristicile acestora ( tipul de
date ce se memorează în acel câmp, lungimea câmpului etc.) .
Baze de date – Mediul FoxPro for Windows

Accesul la datele din bazele de date se face la nivel de înregistrare. La un moment


dat putem avea acces la o singură înregistrare a unei baze de date care se numeşte
”înregistrare curentă”. Aceasta este localizată prin „indicatorul de înregistrări”, ce
reprezintă o zonă de memorie care conţine numărul înregistrării curente. Acesta poate fi
considerat ca o variabilă de memorie asociată bazei de date şi care există atâta timp cât
este deschisă baza de date. La un moment dat o singură înregistrare a bazei de date este
cea curentă, numărul acesteia fiind dat de indicatorul de înregistrări.
O imagine intuitivă a indicatorului de înregistrări este dată în următoarea figură:

Indicatorul de înregistrări Baze de date


Nr. înregistrare
curentă
...

… Înregistrări
****************

Indicatorul de înregistrări poate fi modificat prin comenzi FoxProW, acest lucru


fiind echivalent cu deplasarea săgeţii indicatorului de înregistrări în sus şi în jos de-a
lungul bazei de date.
Să vedem, în continuare, cum decurge lucrul cu bazele de date. Pentru a folosi o
bază de date aceasta trebuie mai întâi deschisă ( se presupune că aceasta există pe disc,
adică a fost creată anterior).
Deschiderea bazei de date presupune
rezervarea în memoria internă a
calculatorului a unei zone de memorie în
care FoxProW va depozita toate
informaţiile necesare utilizării acestei baze
(cum ar fi structura, numărul de înregistrări
etc.). Această zonă de memorie poartă
numele de „zonă de lucru” ( în engleză

2
Baze de date – Mediul FoxPro for Windows

„work area”). FoxProW poate manipula mai multe baze de date simultan, deci acesta
dispune de mai multe zone de lucru, 225 la număr, în care se deschid bazele de date
respective. Asocierea bazelor de date în zonele de lucru este controlată de programator,
acesta având la dispoziţie comenzi şi funcţii specializate în acest scop.
După deschiderea unei baze de date( într-o zonă de lucru) se poate trece la lucrul
cu aceasta , adică vom putea :
- să preluăm date din baza de date;
- să modificăm date deja existente;
- să adăugăm noi date;
- să ştergem date din baza de date etc.
După terminarea lucrului cu baza de date urmează închiderea acesteia, operaţie ce
constă în :
- desfacerea legăturii dintre zona de lucru şi baza de date;
- eliberarea memoriei alocate la deschidere ( eliberarea zonei de lucru);
- închiderea fişierului bazei de date, memorând modificările efectuate
de la deschidere până în acest moment.
Acesta ar fi pe scurt modul de lucru cu o bază de date, urmând ca în continuare să
trecem la studiul efectiv al comenzilor şi funcţiilor ce realizează aceste operaţii.
1.2. Zone de lucru
Pentru manipularea bazelor de date, FoxProW foloseşte zonele de lucru 225 la
număr, în care acesta depune informaţiile necesare efectuării operaţiilor cu clauzele de
date respective.
Pentru identificarea zonelor de lucru se folosesc două metode:
- primele 10 zone de lucru se identifică prin litere de la A la J, adică
primele 10 litere din alfabet ;
- pentru toate celelalte zone de lucru putem folosi pentru identificare
numerele de la 1 la 225.
La un moment dat, din cele 225 zone de lucru ale FoxProW-ului, una singură
este curentă. Aceasta înseamnă că o anumită comandă, în interiorul căreia nu s-a
specificat explicit baza de date la care se referă, va acţiona asupra bazei de date deschisă
în zona de lucru curentă.

3
Baze de date – Mediul FoxPro for Windows

La pornirea FoxProW-ului zona de lucru curentă va fi zona A, sau 1. Aceasta se


poate schimba folosind comanda SELECT.
SELECT <expN> <expC>
În această comandă, <expN> reprezintă numărul zonei de lucru ce va fi activată,
adică va deveni zona de lucru curentă. Dacă <expN> este 0 se va selecta prima zonă de
lucru neocupată( în care nu s-a deschis nici o bază de date).
Exemplu

SELECT 1  zona curenta va fi zona 1


SELECT A  echivalenta cu prima comanda

Presupunem că în zona de lucru 2 avem deschisă baza de date DEBITE ; pentru


selectarea acestei zone putem folosi comenzile :
SELECT 2
SELECT B
SELECT debite
SELECT ’debite’
acestea fiind echivalente.
Pentru a afla care este zona de lucru curentă se foloseşte funcţia SELECT (0), aceasta
returnând numărul zonei de lucru curente sau numărul ultimei zone de lucru nefolosite.
Sintaxa comenzii este :
SELECT( [ 0 1 ] ) în care observăm că putem transmite funcţiei unul din doi
parametri, 0 sau 1, cu următoarea semnificaţie :
- incluzând 0 ca parametru funcţia returnează numărul-zonei de lucru
curente;
1 face ca funcţia să returneze numărul ultimei zone de lucru
-
nefolosite.
Comenzile SELECT ( ) şi SELECT (0) sunt echivalente.
Exemplu

? SELECT ( )  afiseaza zona de lucru curenta


1
? SELECT( 1)  afiseaza ultima zona de lucru nefolosită
225
SELECT SELECT ( ) +1
Note se selecteaza prima zona de lucru dupa cea curenta
? SELECT ( 0)
2

4
Baze de date – Mediul FoxPro for Windows

1.3. Crearea unei baze de date. Structura bazei de date


Corespunzător celor două metode de transmitere a comenzilor utilizatorului către
FoxProW prin meniuri şi prin instrucţiuni în fereastra de comenzi, există două metode de
creare a unei baze de date : în mod interactiv, prin intermediul meniurilor, şi direct,
printr-o comandă complexă introdusă în fereastra de comenzi.
Comanda CREATE, cu sintaxa :
CREATE [<fişier> ?]
determină deschiderea unor ferestre în care utilizatorul specifică în mod interactiv
caracteristicile noii baze de date care se va crea .
<fişier > reprezintă numele fişierului bazei de date ce va fi creat. Dacă pentru acest fişier
nu se specifică nici o extensie, FoxProW asociază automat extensia .DBF.
Dacă nu se specifică numele fişierului, sau dacă se specifică parametrul ?, pe ecran
apare o fereastră în care se va introduce numele noii baze de date .
Cea de-a doua metodă de creare a unei baze de date este reprezentată de comanda
CREATE TABLE:
CREATE TABLE DBF <nume_dbf>
( <nume_câmp1> <tip> [(<precizie> [ ,<scală> ] )
[ , <nume_câmp2>… ] ]) FROM ARRAY <masiv>
în care :
-<nume_dbf> reprezintă numele bazei de date de creat ( eventual incluzând şi calea ).
Poate fi o expresie nume;
-<nume_câmp1>,<nume_câmp2>, …reprezintă numele câmpurilor structurii bazei de
date. Pot fii expresii nume;
-<tip>, o singură literă , reprezintă tipul câmpului , lista tipului fiind dată în tabelul
următor;
-lăţimea câmpului este specificată prin <precizie>, numai când aceasta este dată de
utilizator , ca în tabelul următor;
-<scală> reprezintă numărul de zecimale în cazul câmpurilor de tip „numeric” şi „float”.
<tip> <precizie> <scală> Descriere
C n - Şir de caractere de lungime n
D - - Dată calendaristică
F n d Real, de lăţime n, cu d zecimale

5
Baze de date – Mediul FoxPro for Windows

L - - logic
M - - memo
N n d Numeric, de lăţime n, cu d zecimale
G - - General
P - - Imagine

Clauza FROM ARRAY se introduce pentru ca structura bazei de date să fie


preluată din masivul <masiv>, ce conţine <numele>, <tipul>, <precizia> şi <scala>
pentru fiecare câmp. Masivul din care se copiază structura bazei de date poate fi format
folosind funcţia AFIELDS ( ).

1.4. Deschiderea şi închiderea unei baze de date


Să presupunem că am creat anterior una sau mai multe baze de date ( de ex. MFIXE).
Pentru lucrul cu acestea este necesară mai întâi deschiderea lor în zone de lucru ale
FoxProW-ului . Acest lucru se realizează folosind comanda USE.
USE [<fişier> ?]
[IN <zonă de lucru >]
[AGAIN]
[INDEX <lista fisiere index> ?
[ORDER [<expN> fisier index . idx>
[TAG] <nume etichetă> [OF <fisier index . idx > ]
[ASCENDING DESCENDING ] ] ] ]
[ALIAS <alias>]
[SHARE]
[NOUPDATE]
<fişier > reprezintă fişierul bazei de date ce va fi deschisă , căruia , dacă nu i se specifică
nici o extensie , i se va atribui implicit expresia DBF. Dacă nu se specifică nici <fişier>,
nici ?, atunci comanda are ca efect închiderea bazei de date din zona de lucru curentă .
Dacă în locul acestui fişier se specifică ? fişierul bazei de date ce va fi deschisă v-a
fi selectat interactiv, într-o fereastră de dialog .
Implicit baza de date specificată va fi deschisă în zona de lucru curentă. De
asemenea, închiderea unei baze de date se referă la zona de lucru curentă. Pentru a ne
referi la altă zonă de lucru decât cea curentă se foloseşte clauza IN, specificând prin
<zonă de lucru> această zonă .
În FoxProW există posibilitatea deschiderii unei baze de date în mai multe zone de
lucru. În acest scop se foloseşte clauza AGAIN ( tradus prin „din nou”). Această clauză

6
Baze de date – Mediul FoxPro for Windows

trebuie introdusă în comandă când se deschide o bază de date care a mai fost deschisă
anterior şi în altă zonă de lucru .
Observaţie : dacă la deschiderea unei baze de date în zona de lucru există deschisă
anterior o altă bază de date , cea veche este închisă automat înainte de deschiderea celei
noi.
Clauza NOUPDATE se introduce pentru a proteja baza de date la scriere, adică
pentru a nu permite modificarea acesteia (nici conţinutul şi nici structura nu se poate
modifica ).Baza de date poate fi totuşi vizualizată (atât conţinutul cât şi structura) fără a i
se aduce schimbări.
Exemplu

SELECT a
USE mfixe NOUPDATE
NOTE se deschide baza de date mfixe în zona a doar ;
pentru citire
USE se închide baza de date
În sintaxa comenzii mai există patru clauze:
-INDEX – se referă la „indexarea bazei de date”
-SHARE şi EXCLUSIVE- folosite la lucrul în reţea cu baza de date ;
-ALIAS- se referă la aliasul atribuit de utilizator bazei de date
Închiderea bazelor de date se poate realiza şi cu comenzile CLOSE ALL şi CLOSE
DATABASE, dar acestea pe lângă bazele de date închid şi alte fişiere, ferestre, deci
trebuie utilizate cu atenţie. CLOSE ALL, cu sintaxa :
CLOSE ALL
închide toate fişierele deschise, deci şi bazele de date din toate zonele de lucru, şi
selectează zona de lucru 1. De asemenea CLOSE ALL închide şi unele ferestre.
Comanda CLOSE DATABASE, având sintaxa :
CLOSE DATABASE
închide toate bazele de date şi selectează zona de lucru 1. Şi această comandă închide, pe
lângă bazele de date şi alte fişiere ( cum ar fi fişierele index de ex.) .
Pentru a obţine informaţii despre zonele de lucru ale FoxProW-ului şi bazele de
date deschise în acestea se vor folosi două funcţii USED ( ) şi DBF ( ). Prima dintre
acestea este USED ( ), ne informează dacă o zonă de lucru este liberă sau este ocupată de
o bază de date. Cu o sintaxă de forma :

7
Baze de date – Mediul FoxPro for Windows

USED ( [< expN> <expC> ] )


în care <expN> sau <expC>, specifică zona de lucru despre care dorim informaţii (sau
prin aliasul corespunzător) , această comandă returnează o valoare logică astfel:
.T. (adevărat), dacă în zona de lucru respectivă este deschisă o bază de date ;
.F. (fals), dacă zona de lucru este liberă .
Dacă nu se specifică o zonă de lucru, funcţia se referă la zona de lucru curentă .
Dacă se specifică un alias, funcţia returnează adevărat, dacă o bază de date cu acest
alias este deschisă într-una din zonele de lucru ale FoxProW-ului .
Pentru a afla ce bază de date este deschisă într-o anumită zonă de lucru se foloseşte
funcţia DBF ( ) :
DBF ( [ <expC> < expN> ] )
Aceasta returnează un şir de caractere ce conţine numele bazei de date deschisă într-
o zonă de lucru sau care are un anumit alias. <expC> reprezintă aliasul de testat, iar
<expN> reprezintă numărul zonei de lucru la care funcţia se referă.
Dacă nu este deschisă nici o bază de date în zona de lucru specificată va fi returnat
şirul vid. În cazul când nu există nici o bază de date cu aliasul specificat se va afişa
mesajul „Alias not found”(Alias negăsit).
Exemplu

SELECT a
USE mfixe
? DBF (’ mfixe’)
C:\FOXPROW \MFIXE.DBF
? DBF (’a’)
C:\FOXPROW \MFIXE.DBF
? DBF (1)
C:\FOXPROW\MFIXE.DBF
? DBF (2) = = ’’
.T.
USE.

8
Baze de date – Mediul FoxPro for Windows

1.5. Aliasul unei baze de date


Identificarea unei baze de date se face fie prin intermediul zonei de lucru în care
aceasta a fost deschisă, fie prin aliasul bazei de date respective. La deschiderea unei baze
de date acesteia i se atribuie un nume, prin care ea se identifică în comenzile şi funcţiile
folosite în continuare, pentru acest nume folosind denumirea de „alias”. Atribuirea
aliasului unei baze de date se face fie de programator, fie de FoxProW, în cazul în care
programatorul nu a făcut acest lucru. Utilizatorul poate atribui un alias unei baze de date
specificând în comanda USE clauza ALIAS cu sintaxa:
USE

[ ALIAS <alias> ]
în care <alias> reprezintă aliasul ce se atribuie bazei de date .
Dacă programatorul nu specifică explicit un alias în comanda USE, atunci FoxProW
preia această sarcină atribuind automat bazei de date un alias, după anumite reguli ce se
vor discuta în continuare.
Aliasul implicit pe care FoxProW îl atribuie automat unei baze de date, la deschiderea
sa este , numele fişierului de date fără extensie.
Există şi excepţii de la regula anterioară, când unei baze de date i se atribuie un alias
diferit de numele fişierului acesteia, şi anume când baza de date a mai fost deschisă
anterior într-o altă zonă de lucru( când se foloseşte comanda USE cu clauza AGAIN). În
această situaţie, dacă programatorul nu specifică un alias, prin clauza ALIAS a comenzii
USE , FoxProW atribuie bazei de date un alias astfel :
-în primele 10 zone de lucru, pentru bazele de date se atribuie un alias dintre literele
de la A la J;
-în zonele de lucru de la 11 la 225 se atribuie aliasul W11-W225, în funcţie de zona
de lucru .
De asemenea FoxProW preia sarcina atribuirii aliasului unei baze de date şi în
cazul unui conflict ca de ex când se încearcă atribuirea aceluiaşi alias la două baze de
date distincte.

9
Baze de date – Mediul FoxPro for Windows

1.6. Manipularea structurii unei baze de date


La începutul acestui capitol am văzut cum se creează o bază de date prin
specificarea structurii acesteia, folosind comanda CREATE. Deseori în lucrul cu bazele
de date apare necesitatea modificării structurii unei baze de date adică adăugarea unor
câmpuri, ştergerea altora , modificarea caracteristicilor câmpurilor bazei de date. Pentru a
modifica structura unei baze de date, în cazul în care este nevoie folosim:
Comanda MODIFY STRUCTURE
MODIFY STRUCTURE
Forma tabelei înainte de apelarea şi după apelarea comenzii MODIFY STRUCTURE

realizează modificarea structurii bazei de date active prin deschiderea unei ferestre de
dialog, aceeaşi ca la crearea bazei de date, unde se pot realiza modificările dorite.
După efectuarea modificărilor, FoxProW copiază conţinutul bazei de date vechi în
baza nouă de date, cu modificările respective, operaţie transparentă pentru utilizator.
Vizualizarea structurii unei baze de date se face cu comenzile DISPLAY
STRUCTURE sau LIST STRUCTURE .
DISPLAY STRUCTURE [ IN <expN> <expC>]
[TO PRINTER [ PROMPT] TO FILE <fişier>]
[NOCONSOLE]

LIST STRUCTURE [IN <expN> <expC>]


[TO PRINTER [ PROMPT] TO FILE <fişier>]
[NOCONSOLE]
Comenzile sunt asemănătoare, singura deosebire fiind aceea că prima face pauză
după umplerea unui ecran cu informaţii, pe când cea de-a doua nu face pauză pe ecran
derulându-se continuu toate informaţiile până la sfârşit .

10
Baze de date – Mediul FoxPro for Windows

<expN> sau <expC> modifică zona de lucru, respectiv baza de date, la care se referă
comanda. În mod implicit afişarea se face pe ecran. Dacă se specifică opţiunea
NOCONSOLE, afişarea pe ecran este inhibată. În paralel cu afişarea pe ecran, dacă
aceasta nu este inhibată, se pot trimite aceleaşi informaţii şi la imprimantă în cazul
folosirii clauzei TO PRINTER, şi în fişierul <fişier> în cazul utilizării TO FILE. Cele
două clauze TO PRINTER şi TO FILE, se exclud reciproc.
Un alt mod de a crea o bază de date îl reprezintă comanda COPY STRUCTURE
care creează o bază de date nouă, cu aceeaşi structură (sau asemănătoare)cu a celei
deschise în zona de lucru curentă . Sintaxa comenzii este :
COPY STRUCTURE TO <fişier>
[FIELDS <listă câmpuri>]
[ [WITH CDX [ WITH ] PRODUCTION] ]
unde <fişier> reprezintă fişierul noii baze de date. Clauza FIELDS are ca efect copierea
în baza nouă de date doar a câmpurilor specificate în lista de câmpuri care urmează
clauzei .
Mai există o modalitate de transmitere a unei structuri a bazei de date şi anume,
printr-o bază de date intermediară, în care se încarcă structura de copiat. Comanda
folosită este COPY STRUCTURE EXTENDED, cu următoarea sintaxă:
COPY STRUCTURE EXTENDED TO <fişier>
[FIELDS <listă câmpuri > ]
Structura bazei de date se copiază în înregistrările unei noi baze de date <fişier> care
are o structură fixă formată din patru câmpuri :
-FIELD_ NAME ( nume câmp ), de tip şir de caractere, în care se depozitează numele
câmpurilor structurii;
-FIELD _TYPE ( tip câmp ), tot de tip şir de caractere, de lungime 1, în care se
depozitează un caracter ce corespunde tipului structurii (C-şir de caractere, N- numeric,
F-real, D-dată calendaristică, L –logic , M- memo, G-general, P- imagine);
-FIELD_LEN (lungime câmp), de tip numeric care memorează lăţimea(lungimea)
fiecărui câmp al structurii;
-FIELD_DEC (poziţii zecimale câmp), de tip numeric, în care se depozitează numărul de
poziţii zecimale când este cazul .

11
Baze de date – Mediul FoxPro for Windows

FIELD _NAME FIELD _TYPE FIELD_LEN FIELD_DEC


( nume câmp) ( tip câmp) (lungime câmp) (poziţii zecimale câmp)
1 Cod C 10 -
2 Denumire C 30 -
3 Valoare N 10 0
4 Amortizare N 10 0
5 Loc_folos M 10 -
6 Stare L 1 -
7 Data_inst D 8 -
8 Tip C 1 -
deci câmpurile structurii devin înregistrări în noua bază de date. Conţinutul acestor
înregistrări se poate modifica, se pot şterge sau se pot adăuga înregistrări, modificându-se
astfel structura codificată în această bază de date.
Când se foloseşte comanda FIELDS, numai câmpurile din <lista câmpuri > vor
genera înregistrări în baza de date nou creată.
Trecerea inversă, din înregistrările bazei de date în structura unei noi baze de date se
face cu comanda CREATE FROM :
CREATE [<fişier 1> ] FROM [ <fişier2>]
<fişier 2> este o bază de date ce memorează în înregistrările sale o structură, în modul
descris la comanda anterioară. Acest fişier s-a creat anterior, fie cu o comandă COPY
STRUCTURE EXTENDED, fie manual.
<fişier 1> este baza de date ce se va crea şi va avea structura codificată în <fişier 2>.
Noua bază de date va deveni activă.
Dacă în comandă nu se specifică unul din cele două fişiere, sau ambele, se vor
deschide ferestre de dialog prin care FoxProW interoghează utilizatorul asupra fişierelor
ce se vor folosi.
Mai există o modalitate de copiere a structurii unei baze de date, prin intermediul
unui masiv folosind funcţia AFIELDS ( ) şi comanda CREATE TABLE cu clauza
FROM ARRAY .
Funcţia AFIELDS ( ) :
AFIELDS ( < masiv> )
copiază structura bazei de date într-un masiv transmis ca parametru, <masiv> . Acest
masiv reprezintă analogul bazei de date intermediare folosită la comanda COPY
STRUCTURE EXTENDED. Funcţia returnează o valoare numerică precizând numărul
de câmpuri ale structurii. Dacă masivul nu există FoxProW va crea unul şi va depozita

12
Baze de date – Mediul FoxPro for Windows

structura în acesta. Masivul creat va fi bidimensional, prima dimensiune fiind egală cu


numărul câmpurilor, i-ar cea de-a doua va fi egală cu 4, corespunzător celor 4 tipuri de
informaţii necesare codificării unui câmp. Semnificaţia şi codificarea informaţiilor
referitoare la un câmp este aceeaşi cu cea de la comanda COPY STRUCTURE
EXTENDED. Primul indice al masivului va indexa după câmpurile structurii, iar cel de al
doilea după informaţiile despre fiecare câmp ( nume, tip, lăţime, zecimale).

1.7. Manipularea câmpurilor unei baze de date


În acest paragraf vom studia trei funcţii şi o comandă FoxProW referitoare la
manipularea câmpurilor unei baze de date şi anume: SET FIELDS, FIELD ( ) , FSIZE ( )
şi FCOUNT ( ) .
Accesul la câmpurile unei baze de date este controlat de comanda SET FIELDS:
SET FIELDS ON OFF
SET FIELDS TO[ [ <câmp 1> [ <câmp 2 >… ] ] ALL ]
Dacă SET FIELDS este ON, pot fi accesate doar câmpurile care sunt prezentate în
lista de câmpuri a comenzii SET FIELDS TO. Dacă SET FIELDS este OFF se permite
accesul la toate câmpurile bazei de date. Starea implicită este OFF.
<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 poate fi accesat
în cazul SET FIELDS ON .
Comanda se referă la baza de date activă .
Exemplu

CLOSE ALL
USE mfixe
? FSIZE ( ’denumire’)
NOTE afişează latimea celui de-al 2-lea camp;
al bazei de date
30
USE
Vom da acum un exemplu de simulare a comenzii LIST STRUCTURE (DISPLAY
STRUCTURE) folosind şi funcţiile prezentate în acest paragraf.

13
Baze de date – Mediul FoxPro for Windows
Exemplu

CLOSE ALL
USE mfixe
? ’Structura bazei de date :’ ‚DBF ( )
? ’camp’, ’nume’, ’latime’
total = 0
FOR i =1 TO FCOUNT ( )
? i, FIELD(i), TYPE( ) , FSIZE ( FIELD (i) )
total = total + FSIZE ( FIELD(i))
ENDFOR
? ’** Total **’ ‚ total +1
USE

1.8. Domeniul înregistrărilor


Există comenzi FoxProW care acţionează asupra mai multor înregistrări ale unei
baze de date. Selectarea acestora se face specificând în comandă condiţia de selecţie, cu
ajutorul căreia din mulţimea totală a înregistrărilor se aleg doar acelea care respectă
condiţia respectivă. Mulţimea înregistrărilor selectate formează „domeniul înregistrărilor”
la care se referă comanda. Domeniul înregistrărilor se specifică prin clauzele
<domeniu>, FOR şi WHILE, incluse opţional în comanda respectivă .
Clauza <domeniu> se va înlocui cu una din următoarele construcţii, în funcţie de
necesităţi:
- ALL selectează toate înregistrările din baza de date ;
- 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 bazei de date ;
Clauza FOR („Pentru”), cu 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 („Cât timp”), având sintaxa :
WHILE <expL>

14
Baze de date – Mediul FoxPro for Windows

este asemănătoare clauzei FOR, selectarea înregistrărilor făcându-se în funcţie de


expresia logică <expL>(pentru valoarea adevărat a acesteia ). Spre deosebire de clauza
FOR care, după găsirea unei înregistrări ce nu respectă condiţia <expL>, continuă
testarea celorlalte, clauza WHILE întrerupe testarea înregistrărilor când găseşte o
înregistrare ce nu respectă condiţia dată.
Dacă se specifică ambele clauze, FOR şi WHILE, prima care contează este clauza
WHILE. Folosind clauza FOR viteza de preluare creşte foarte mult, de aceea se
recomandă folosirea acesteia, oricând este posibil.
Observaţie: în expresia logică din clauza FOR şi WHILE, trebuie să intervină o
mărime ce variază, în funcţie de înregistrare.
Aceasta trebuie să depindă fie de numărul înregistrării, fie de conţinutul acesteia .

1.9. 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 baza de date:
- adăugarea de înregistrări noi la sfârşitul bazei de date ;

- introducerea de înregistrări noi în interiorul bazei de date.


Prima metodă se realizează cu comenzile FoxProW APPEND, APPEND FROM şi
APPEND FROM ARRAY pe care le vom studia în cele ce urmează.
Aceste trei comenzi se utilizează cu acelaşi scop, ele diferind prin sursa datelor
care se introduc în baza de date şi anume :
- la comanda APPEND datele sunt furnizate de utilizator, în mod interactiv
(excepţie făcând clauza BLANK);
-comanda APPEND FROM se foloseşte când datele sunt luate dintr-o altă
bază de date sau un alt fişier;.
-comanda APPEND FROM ARRAY preia datele dintr-un masiv şi le
introduce în baza de date. Comanda APPEND adaugă înregistrări la
sfârşitul bazei de date deschisă în zona de lucru curentă şi are următoarea sintaxă :
APPEND [ BLANK]

15
Baze de date – Mediul FoxPro for Windows

Fără clauza BLANK comanda determină deschiderea unei ferestre de editare în care
utilizatorul poate introduce, câmp cu câmp, datele înregistrării ce se va adăuga.
Saltul la câmpul următor se realizează fie prin apăsarea tastei Enter, fie când
câmpul se completează în întregime. După introducerea ultimului câmp se sare la
următoarea înregistrare ce se va adăuga. Pentru a edita un câmp de tip memo, când
cursorul se află în câmpul respectiv, se apasă combinaţia Ctrl+ PageDown, după care se
intră într-o fereastră de editare a câmpului memo. Ieşirea cu salvare din această fereastră
se face cu combinaţia de taste Ctrl + Enter. Terminarea introducerii tuturor înregistrărilor
se realizează acţionând Ctrl + Enter, fereastra de editare închizându-se după aceasta .
Cea de-a doua metodă de adăugare a unei înregistrări noi la o bază de date o
reprezintă inserarea înregistrării în interiorul bazei de date folosind comanda INSERT.
Comanda INSERT are următoarea sintaxă:
INSERT [ BEFORE] [BLANK]
şi are ca efect inserarea unei înregistrări noi, după înregistrarea curentă. Dacă se
specifică clauza BLANK se adaugă o înregistrare blank, astfel se deschide o fereastră de
editare pentru introducerea interactivă a conţinutului noii înregistrări. Clauza BEFORE
determină adăugarea unei înregistrări noi înaintea înregistrării curente astfel :

INSERT BEFORE

Înregistrare nouă Înregistrare curentă

INSERT

Exemplu

USE mfixe_n
GOTO 2   se pozitionează indicatorul de ;
inregistrări pe inregistrarea 2
INSERT BEFORE   se insereaza o noua inregistrare;
in pozitia 2
LIST
USE

16
Baze de date – Mediul FoxPro for Windows

1.10. Modificarea conţinutului unei baze de date


Modificarea datelor stocate într-o bază de date se realizează cu comenzile
CHANGE, EDIT, BROWSE şi REPLACE, ce vor fi prezentate în acest paragraf.
Primele trei comenzi nu modifică propriu-zis conţinutul bazei de date ci deschid o
fereastră de editare în care utilizatorul va modifica datele din baza de date în mod
interactiv.
Comenzile CHANGE şi EDIT sunt identice, ele diferind faţă de comanda
BROWSE doar prin modul de organizare pe ecran a ferestrei corespunzătoare. Astfel la
comenzile CHANGE şi EDIT câmpurile în cadrul unei înregistrări sunt aşezate unele sub
altele, pe când la comanda BROWSE acestea se află unele lângă altele. La toate trei
comenzile, în ferestrele corespunzătoare, înregistrările sunt aşezate unele sub altele.
Ieşirea din fereastra de editare Change şi salvarea modificărilor se face folosind
combinaţia de taste Ctrl+End .
Comanda CHANGE (sau EDIT) permite editarea conţinutului unei baze de date
într-o fereastră de editare. Sintaxa comenzii este :
CHANGE EDIT
[FIELDS <listă câmpuri > ]
[<domeniul>] [FOR <expL1>] [WHILE <expL2]
[FONT <expC1>[, expN1>]]
[STYLE <expC2>]
[FREEZE <câmp>]
[KEY <expr1> [, <expr2>]]
[LAST] [LEDIT] [REDIT] [LPARTITION]
[NOAPPEND] [NOCLEAR] [NODELETE]
[NOEDIT NOMODIFY]
[NOLINK] [NOMENU] [NOOPTIMIZE] [NORMAL] [NOWAIT]
[PARTITION <expN2> ]
[PREFERENCE <expC3> ]
[REST ] [SAVE]
[TIMEOUT <expN3>]
[TITLE <expC4>]
[VALID [: F] <expL3> [ERROR <expC5]]
[WHEN <expL4>]
[WIDTH <expN3>]
[ [ WINDOW] <nume fereastră 1 >]
[IN [WINDOW] <nume fereastră 2> IN SCREEN]]
[COLOR SCHEME <expN5>]
COLOR <listă perechi de culori> ]

17
Baze de date – Mediul FoxPro for Windows

Clauza FIELDS are ca efect afişarea spre editare doar a câmpurilor specificate în
<listă câmpuri> în ordinea apariţiei lor pe listă. Dacă această clauză lipseşte, sunt afişate
spre editare toate câmpurile bazei de date.
Această listă reprezintă o înşiruire de câmpuri ale unei baze de date sau calculate,
separate prin virgulă, având următoarea sintaxă:
<câmp 1> [ :R]
[ :V= <expr 1> [: F] [ :E = <expC>] ]
[ :P= <expC>]
[ :B= <expr2>, <expr3> [:F] ]
[:H=<expC3>]
[:W=<expL1> ]
[, <câmp 2> [ :R] …]

în lista de câmpuri pot fi incluse şi câmpuri ale unei baze de date deschisă într-o altă zonă
de lucru decât cea curentă.
Câmpurile calculate reprezintă câmpuri din fereastra de editare, create prin evaluarea
unei expresii şi afişate în fereastra respectivă ca un câmp de sine stătător. Aceste câmpuri
se pot doar vizualiza, dar nu se pot modifica. Sintaxa de definiţie a unui câmp calculat
este :
Exemplu <nume câmp calculat > = <expr>

Având baza de date MFIXE, vom deschide o fereastră de editare în care vom afişa
doar câmpurile COD, VECHIME, STARE. Primul şi ultimul sunt câmpuri simple ale
bazei de date, VECHIME fiind un câmp calculat în funcţie de data instalării (câmpul
DATA_INST din baza de date ) şi data curentă.
CLOSE ALL
USE mfixe
CHANGE FIELDS cod, vechime = (DATE ( ) – data_inst) / 365, stare
USE
În sintaxă observăm posibilitatea ataşării fiecărui câmp, a uneia sau mai multor opţiuni.
:R- câmpul se poate vizualiza nu şi modifica;
:V= <expr1> permite validarea câmpului introdus.
:F- se foloseşte pentru a forţa evaluarea expresiei <expr1>, şi deci validarea chiar şi
atunci când se trece cu cursorul prin câmp fără modificarea conţinutului acestuia .

18
Baze de date – Mediul FoxPro for Windows

:E= <expC1> se foloseşte pentru ca mesajul afişat în caz de eroare să fie altul decât cel
implicit, şi anume <expC1>.
:B= <expr2>, <expr3> se foloseşte pentru a specifica intervalul în care trebuie să se afle
valoarea din câmp pentru editare, <expr2> reprezintă limita inferioară, iar
<expr3>reprezintă limita superioară .
:P=<expC2> se poate specifica cod PICTURE, care va fi prezentat la comanda GET.
:H=<expC3> numele câmpului ce se afişează la partea superioară a ferestrei de editare va
fi înlocuit cu <expC3>;
:W=<expL1> se permite intrarea în editarea câmpului doar dacă expresia
logică<expL1>este evaluată la valoarea .T.;
Clauza FREEZE se foloseşte pentru a selecta spre modificare un singur câmp, şi
anume <câmp> restul fiind afişate în fereastra de editare fără a se permite editarea lor.
Clauza KEY se foloseşte pe baze de date indexate pentru limitarea mulţimii
înregistrărilor afişate în fereastra Change, la cele pentru care valoarea cheii de indexare
se află în intervalul ( <expr1>, <expr2>).
Clauza NOAPPEND, prezentă în comanda CHANGE, opreşte utilizatorul de a
adăuga înregistrări noi la baza de date, din fereastra de editare.
Clauza NOEDIT şi NOMODIFY sunt două clauze care se exclud şi care nu permit
modificarea înregistrărilor bazei de date, ci vor permite doar vizualizarea acestora .
Atenţie ! –ieşirea din fereastra de editare cu combinaţia de taste Ctrl+End salvează
configuraţia ferestrei, iar ieşirea cu combinaţia de taste Ctrl+Q nu realizează această
salvare.
Clauza PREFERENCE determină salvarea atributelor ferestrei de editare Change în
fişierul de resurse FoxProW sub numele dat prin şirul de caractere <expC3>.
Partiţionarea ferestrei de editare Change se realizează cu ajutorul clauzei LPARTITION
cursorul va fi poziţionat iniţial în primul câmp al partiţiei din partea stângă.
Clauza NOWAIT este disponibilă numai în interiorul unui program, adică nu se
poate introduce când comanda este dată în mod interpretativ în fereastra de comenzi.
Folosind clauza TIMEOUT, programatorul specifică prin expresia numerică ce urmează
clauzei numărul de secunde cât FoxProW va aştepta pentru introducerea datelor în
fereastra de editare.

19
Baze de date – Mediul FoxPro for Windows

Clauza SAVE este folosită pentru a păstra fereastra de editare pe ecran şi după
ieşirea din comanda CHANGE. Această clauză este disponibilă doar în programele
FoxProW, neputându-se introduce în fereastra de comenzi .
Clauza WIDTH este folosită pentru a limita numărul de caractere afişate pentru un
câmp. Nu este afectată lăţimea câmpului în baza de date.
Spre deosebire de fereastra de editare CHANGE, unde câmpurile sunt afişate unul
sub altul în cadrul aceleiaşi înregistrări, în fereastra de editare Browse aceste câmpuri
sunt aşezate pe orizontală, unul lângă altul.
Sintaxa comenzii BROWSE este următoarea :
BROWSE
[FIELD3 <listă câmpuri>]
[FONT <expC1> [, <expN1> ] ]
[STYLE <expC2>]
[FOR <expL1>]
[FORMAT]
[FREEZE <câmp>]
[KEY <expr1> [ , <expr2>]]
[LAST]
[LEDIT] [REDIT]
[LOCK <expN2>]
[LPARTITION]
[NOAPPEND] [NOCLEAR] [NODELETE]
[NOEDIT NOMODIFY]
[NOLGRID ] [NORGRID]
[NOLINK] [NOMENU] [ NOOPTIMIZE]
[NOREFRESH] [NORMAL] [NOWAIT]
[PARTITION <expN3>]
[PREFERENCE <expC3>]
[REST ] [SAVE]
[TIMEOUT <expN4>]
[TITLE <expC4>]
[VALID [:F] <expL2> [ERROR <expC5>] ]
[WHEN <expL3>]
[WIDTH <expN5>]
[ [WINDOW] <nume fereastră 1>]
[IN [WINDOW] <nume fereastră2> IN SCREEN] ]
[COLOR <listă perechi culori>
COLOR SCHEME <expN6> ]

Clauza LEDIT prezentă în comanda BROWSE face ca partiţia stângă să fie afişată în
format Change, iar prezenţa clauzei REDIT are acelaşi efect asupra partiţiei drepte.

20
Baze de date – Mediul FoxPro for Windows

Clauza LOCK este urmată de o expresie numerică ce reprezintă numărul de câmpuri ce


vor fi plasate în partiţia stângă a ferestrei de editare Browse.
Clauza FORMAT se referă la preluarea formatului de afişare a câmpurilor din fereastra
Browse dintr-un fişier de format .
Clauza REFRESH se referă la reîmprospătarea ferestrei de editare Browse fiind
necesară la lucrul în reţeaua cu baza de date.
Modificarea conţinutului unei baze de date se poate face şi cu comanda REPLACE
care, spre deosebire de cele trei anterioare, nu deschide o fereastră în care utilizatorul
introduce noile valori ale câmpurilor bazelor de date ci realizează propriu-zis actualizarea
bazei de date cu datele precizate în comandă.
Sintaxa comenzii este următoarea:
REPLACE
<câmp1> WITH <expr1> [ADDITIVE]
[, <câmp2> WITH <expr2> [ADDITIVE] …]
[<domeniu>] [FOR <expL1>] [WHILE <expL2>]
[NOOPTIMIZE]
Comanda înlocuieşte vechea valoare din câmpul <câmp1>cu valoarea rezultată în
urma evaluării expresiei <expr1>, vechea valoare din câmpul <câmp 2> cu valoarea
expresiei <expr2> şi aşa mai departe.
În cazul câmpurilor memo specificând clauza ADDITIVE, vechea valoare nu este
înlocuită cu cea nouă ci se va realiza adăugarea noului conţinut la sfârşitul celui vechi.
<domeniu> , FOR şi WHILE specifică domeniul înregistrărilor la care se referă comanda
REPLACE, domeniul implicit fiind înregistrarea curentă.

21
Baze de date – Mediul FoxPro for Windows

1.11. Vizualizarea conţinutului unei baze de date


După crearea unei baze de date şi încărcarea acesteia cu date, apare necesitatea
vizualizării datelor memorate, adică a conţinutului bazei de date. Afişarea acestor date se
poate face pe ecran, l-a imprimantă, sau într-un fişier de pe disc, folosind comenzile LIST
şi DISPLAY.
Comanda DISPLAY afişează conţinutul bazei de date din zona de lucru curentă :
DISPLAY [ [ FIELDS] <listă câmpuri>]
[ <domeniu> ] [FOR <expL1] [WHILE <expL2]
[OFF]
[TO PRINTER [PROMPT] TO FILE <fişier>]
[NOCONSOLE]
[NOOPTIMIZE]
Afişarea datelor se face în următorul format:
-prima linie reprezintă lista câmpurilor, identificate prin numele acestora;
-următoarele linii reprezintă înregistrări din baza de date ;
Exemplu

USE mfixe
DISPLAY ALL
USE
Clauza FIELDS se foloseşte cu scopul de a afişa doar câmpurile specificate în <listă
câmpuri> în ordinea apariţiei lor în această listă.
<domeniu>, FOR şi WHILE determină domeniul înregistrărilor ce vor fi afişate cu
comanda DISPLAY.
Prezenţa clauzei OFF în format determină dispariţia din formatul de afişare a
coloanei 0 reprezentând numărul de ordine al înregistrărilor din baza de date.
Clauza NOCONSOLE este utilizată când se afişează la imprimantă sau într-un fişier
pe disc şi nu se doreşte modificarea conţinutului ecranului.
Comanda LIST este asemănătoare cu DISPLAY(are aceeaşi sintaxă cu aceleaşi
semnificaţii ale clauzelor), cu următoarele diferenţe ;
-domeniul implicit al înregistrărilor pentru comanda DISPLAY este NEXT 1( adică
înregistrarea curentă ) pe când cel al comenzii LIST este ALL( toate înregistrările)
-comanda DISPLAY are ca efect afişarea conţinutului bazei de date, ecran cu ecran,
trecerea de la un ecran la altul făcându-se după apăsarea unei taste. La comanda LIST
afişarea este continuă, pauza dintre ecrane lipsind ;

22
Baze de date – Mediul FoxPro for Windows

-LIST nu afişează înregistrările marcate pentru ştergere în cazul SET DELETED


ON, pe când DISPLAY le afişează pe acestea
Observaţie: comanda LIST este echivalentă, din punct de vedere al domeniului
înregistrărilor, cu DISPLAY ALL, iar comanda DISPLAY este echivalentă cu comanda
LIST NEXT 1.
Am văzut că formatul comenzilor LIST şi DISPLAY conţine pe prima linie un antet
reprezentând denumirile câmpurilor afişate. Pentru ca acest antet să nu apară în formatul
de afişare se foloseşte comanda SET HEADING:
SET HEADING ON OFF
unde ON determină afişarea antetului, iar OFF determină inhibarea afişării acestuia.
Opţiunea implicită este ON.
Exemplu

USE mfixe
SET HEADING ON
LIST   se afiseaza un antet
SET HEADING OFF
LIST   se afiseaza fara antet
USE

1.12. Indicatorul de înregistrări


Reprezintă o locaţie de memorie asociată unei baze de date la deschidere în care
este memorat numărul înregistrării curente. Indicatorul de înregistrări este specific unei
baze de date, deschisă într-o zonă de lucru deci vom avea atâtea indicatoare de
înregistrării, câte zone de lucru sunt ocupate cu baze de date.
Indicatorul de înregistrări conţine numărul înregistrării curente într-o bază de date
având la un moment dat o singură înregistrare curentă.
Există o mulţime de comenzi şi funcţii care se referă la anumite înregistrări din baza
de date, identificarea acestora făcându-se prin înregistrarea curentă .
Astfel comanda :
DISPLAY NEXT 2
afişează următoarele două înregistrări din baza de date activă (deschisă în zona de
lucru)începând de la înregistrarea curentă inclusiv. Domeniul înregistrărilor se specifică
prin patru clauze, ALL, RECORD, NEXT şi REST, dintre care ultimele două au ca punct
de referinţă înregistrarea curentă.

23
Baze de date – Mediul FoxPro for Windows

Aflarea înregistrării curente dintr-o bază de date deci a conţinutului indicatorului de


înregistrări se face folosind funcţia RECNO ( ) :
RECNO ( [ <expN> <expC>] )
Următoarele două comenzi sunt echivalente:
DISPLAY NEXT 1 şi DISPLAY RECORD RECNO ( )
Schimbarea înregistrării curente nu se poate realiza direct printr-o instrucţiune de
atribuire ci se realizează prin intermediul unor comenzi FoxProW, cum ar fi GOTO ,
SKIP etc. Comanda GO sau GOTO poziţionează indicatorul de înregistrări pe o anumită
înregistrare dintr-o bază de date. Sintaxa comenzii este următoarea :
GO GOTO [RECORD] <expN1> [IN <expN2> IN <expC> ]
GO GOTO TOP BOTTOM [ IN <expN2> IN < expC> ]
Prima fereastră are ca efect poziţionarea indicatorului de înregistrări din baza de
date cu aliasul <expC> sau din zona de lucru <expN2> pe înregistrare cu numărul
<expN1>. Absenţa clauzei IN determină referirea la baza de date activă.
Clauza RECORD este opţională prezenţa ei neavând nici un efect. Aceasta se
introduce pentru claritatea programului.
Clauza TOP se foloseşte pentru poziţionarea pe prima înregistrare a indicatorului.
Clauza BOTTOM determină poziţionarea pe ultima înregistrarea a indicatorului.
Un alt tip de deplasare cu indicatorul de înregistrări, de-a lungul bazei de date este
realizat cu ajutorul comenzii SKIP. Aceasta mută indicatorul peste un număr de
înregistrări relativ la înregistrarea curentă.
Sintaxa comenzii este:
SKIP [<expN1> ] [IN <expN2> ] IN <expC> ]

în care <expN1>reprezintă numărul de înregistrări peste care se sare, acesta poate fi atât
pozitiv cât şi negativ.
Dacă se sare peste ultima înregistrare a bazei de date indicatorul de înregistrări va
conţine numărul de înregistrări plus 1, iar funcţia EOF ( ) va returna valoarea .T. în cazul
saltului înaintea primei înregistrări funcţia BOF ( ) va returna valoarea .T.
<expN2> sau <expC> specifică baza de date la care se referă funcţia, prin zona de lucru
în care este deschisă (<expN2>) sau prin aliasul corespunzător (<expC> ).
Comanda SKIP este echivalentă cu SKIP 1.
Funcţiile BOF ( ) şi EOF ( ) au sintaxele:

24
Baze de date – Mediul FoxPro for Windows

BOF ( [ <expN> <expC>] )


EOF ( [<expN> <expC>] )
Numărul de înregistrări dint-o bază de date este returnat de funcţia RECCOUNT ( ) :
RECCOUNT ( [<expN> <expC>] )
iar dimensiunea unei înregistrări se obţine folosind funcţia RECSIZE ( ), care are
sintaxa : RECSIZE ( [<expN> <expC>] )
Dacă nu se specifică o altă bază de date ultimele două funcţii prezentate se referă la
baza de date activă .

1.13. Ştergerea înregistrărilor dintr-o bază de date


Alături de adăugare şi modificare, ştergerea reprezintă una din principalele operaţii
în lucrul cu bazele de date. Ştergerea unei înregistrări dintr-o bază de date se poate realiza
la două nivele şi anume :
-la nivel logic, când înregistrarea nu este propriu-zis ştearsă din baza de date ci ea este
marcată într-un anumit mod indicând astfel această stare a înregistrării.
-la nivel fizic, când înregistrarea este ştearsă efectiv din baza de date, ea neputând fi în
nici un fel accesată sau refăcută.
Marcarea pentru ştergere a uneia sau mai multor înregistrări se face cu ajutorul
comenzii DELETE :
DELETE
[ <domeniu>] [FOR <expL1>] [WHILE <expL2>]
[ NOOPTIMIZE]
<domeniu>, FOR şi 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, care are următoarea sintaxă:
SET DELETED ON OFF
În interiorul unui program testarea marcajului de ştergere al unei înregistrări se face
cu funcţia DELETED ( ). Aceasta returnează valoarea logică adevărat, dacă înregistrarea
curentă este marcată pentru ştergere, astfel funcţia returnează valoarea fals. Sintaxa
funcţiei este :
DELETED ( [ <expC> <expN>] )
Înlăturarea marcajului de ştergere se realizează cu comanda RECALL, ce are
aceeaşi sintaxă cu comanda DELETE, adică :

25
Baze de date – Mediul FoxPro for Windows

RECALL
[ <domeniu > ] [ FOR <expL1>] [WHILE <expL2>]
[NOOPTIMIZE]
Până acum am prezentat ştergerea logică a înregistrărilor, adică marcarea lor pentru
ştergere. Pentru ca o înregistrare să fie eliminată fizic din baza de date aceasta trebuie
ştearsă la nivel fizic. Pentru ştergerea la nivel fizic se foloseşte comanda PACK :
PACK [MEMO] [DBF]
Ea realizează ştergerea fizică a tuturor înregistrărilor marcate pentru ştergere din
baza de date activă.
Atenţie ! :după aplicarea comenzii PACK asupra unei baze de date, înregistrările nu mai
pot fi refăcute; ştergerile sunt permanente. Comanda PACK poate fi întreruptă prin
acţionarea tastei ESCAPE, baza de date originală fiind refăcută.
O altă comandă cu privire la ştergerea înregistrărilor din baza de date este comanda
ZAP, cu sintaxa :
ZAP
Comanda şterge fizic toate înregistrările din baza de date activă fiind echivalentă cu
secvenţa de instrucţiuni:
DELETE ALL
PACK
Ori de câte ori se doreşte golirea totală a unei baze de date este recomandată
folosirea comenzii ZAP, care este mult mai rapidă decât secvenţa anterioară de
instrucţiuni.
Atenţie!:- ca şi la comanda PACK, înregistrările şterse cu comanda ZAP nu mai pot fi
refăcute adică ştergerea este fizică.
Înainte de execuţia comenzii, dacă opţiunea SAFETY este SET ON se va mai afişa un
mesaj de ştergere a confirmărilor.

26
Baze de date – Mediul FoxPro for Windows

1.14. Accesul la înregistrări


Pe lângă cele două metode de ştergere, a înregistrărilor, logică şi fizică , mai există
o metodă de control a accesului la înregistrările unei baze de date. Această metodă este
situată ca putere de control al accesului la înregistrări între cele două metode prezentate
anterior. Spre deosebire de ştergerea fizică a unei înregistrări această metodă nu elimină
fizic înregistrarea ci doar blochează accesul la ea. Deci din acest punct de vedere metoda
este mai slabă decât ştergerea fizică.
Comparând metoda cu ştergerea logică a unei înregistrări, constatăm că aceasta este
mai puternică decât ştergerea logică. Astfel pe când o înregistrare marcată pentru ştergere
poate fi accesată de unele comenzi sau funcţii FoxProW (cum ar fi LIST), blocarea
accesului la înregistrare folosind această metodă este valabilă pentru toate comenzile şi
funcţiile FoxProW care accesează baza de date.
Metoda aceasta de control a accesului este implementată prin comanda SET
FILTER, ce are următoarea sintaxă:
SET FILTER TO [<expL>]
Ca efect al comenzii, în baza de date vor apărea doar înregistrările care îndeplinesc
condiţia <expL>.
SET FILTER TO fără condiţie, face ca toate înregistrările din baza de date să poată fi
accesate.
O altă caracteristică importantă a acestei metode de control al accesului la înregistrările
unei baze de date este aceea că accesibilitatea unei înregistrări este dependentă de
conţinutul său. Vor putea fi accesate doar înregistrările care conţin în câmpul STARE
valoarea logică .T.
Pentru a afla condiţia de accesare a înregistrărilor (expresia filtru) se foloseşte funcţia
FILTER ( ) :
FILTER ( [<expN> <expC>] )
<expN> sau <expC> specifică baza de date la care se referă funcţia, prin aliasul acesteia
respectiv prin zona de lucru în care baza de date a fost deschisă .
Rezultatul este de tip şir de caractere, reprezentând expresia filtru folosită la accesarea
înregistrărilor şi stabilită cu comanda SET FILTER (’<expL>’).

27
Baze de date – Mediul FoxPro for Windows

Exemplu Se va deschide baza de date MFIXE. În zona de lucru 1 vom avea


mijloacele fixe în folosinţă, iar în zona de lucru 2, celelalte mijloace fixe.
CLOSE ALLSELECT 1
USE mfixe
SELECT 2
USE mfixe AGAIN
SET FILTER TO stare = .f.
LIST   se afiseaza doar mijloacele fixe care nu;
sunt în folosinta
? FILTER ( )
STARE = .F.
SELECT 1
SET FILTER TO stare = .t.
LIST   se afiseaza doar mijloacele fixe in ;
folosinta
? FILTER ( )
STARE =.T.
CLOSE ALL

1.15. Căutarea înregistrărilor într-o bază de date


Aflarea valorii unui anumit mijloc fix presupune mai întâi găsirea mijlocului fix
respectiv, urmată de citirea valorii din coloana VALOARE. Identificarea unui mijloc fix
după datele specifice presupune căutarea într-un tabel a acelui mijloc fix care corespunde
datelor respective. Acestea sunt probleme practice în care intervine căutarea unei anumite
poziţii într-o listă, în funcţie de o condiţie ce trebuie îndeplinită.
În FoxProW această problemă se rezolvă cu ajutorul comenzii LOCATE:
LOCATE FOR <expL1>
[<domeniu>] [WHILE <expL2>]
[NOOPTIMIZE] ]
Comanda caută prima înregistrare care respectă condiţia <expL1> în baza de date
activă. Domeniul înregistrărilor care se testează este dat de clauzele <domeniu> şi
WHILE cel 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 va poziţiona 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 (nr total de înregistrări + 1 ), FOUND( ) va returna fals, iar EOF( ) va
returna adevărat.

28
Baze de date – Mediul FoxPro for Windows

Într-o bază de date pot exista mai multe înregistrări ce respectă condiţia dată. Prima
dintre acestea va fi găsită folosind LOCATE: Următoarele vor fi găsite prin intermediul
comenzii CONTINUE :
CONTINUE
Comanda găseşte următoarea înregistrare care respectă condiţia specificată în
ultima comandă LOCATE aplicată bazei de date active. Testarea reuşitei sau nereuşitei
căutării se face ca la comanda LOCATE, cu ajutorul funcţiilor RECNO ( ) , FOUND( ),
şi EOF.
Un alt tip de căutare într-o bază de date este realizat cu funcţia LOOKUP( ) .
Aceasta caută într-o bază de date prima apariţie a unei expresii date. În caz de
reuşită indicatorul de înregistrări se poziţionează pe înregistrarea în care a fost găsită
expresia, funcţia returnând valoarea unui anumit câmp al înregistrării respective. În caz
de nereuşită indicatorul de înregistrări se poziţionează după ultima înregistrare a bazei de
date, iar funcţia va returna şirul vid.
Sintaxa funcţiei este:
LOOKUP (<câmp 1>, <expr1>, <câmp2> [, <expC>] )
în care ;
<câmp1> reprezintă câmpul a cărei valoare va fi returnată de funcţie, în caz de căutare
terminată cu succes;
<expr> specifică expresia de căutat în baza de date;
<câmp2> se foloseşte pentru a realiza căutarea expresiei numai în acest câmp;
<expC> este utilizată pentru baze de date indexate;
Rezultatul este de tip şir de caractere, numeric, logic sau dată calendaristică, în funcţie de
tipul câmpului returnat.
Exemplu Să se afişeze numele primului mijloc fix din baza de date MFIXE.

CLOSE ALL
USE mfixe
LIST
? LOOKUP (denumire, .F., stare)
? RECNO ( )
? ? denumire
3 Autocamion M100
USE

29

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