Sunteți pe pagina 1din 26

Initiere in Visual FOXPRO Autor: Eugen Maftei

www.cartiaz.ro – Carti si articole online gratuite de la A la Z

Initiere in Visual FOXPRO


Note de curs

Autor
Mat. Eugen Maftei

1
Initiere in Visual FOXPRO Autor: Eugen Maftei
www.cartiaz.ro – Carti si articole online gratuite de la A la Z

Organizarea datelor în Baze de Date (BD)


Introducere
Datele prelucrate cu ajutorul calculatorului sunt organizate, adică au o anumită
structură. Cele mai obişnuite forme de organizare a datelor sunt bazele de date. Există mai
multe definiţii pentru bazele de date. Pentru început vom accepta ideea că “o bază de date
este o colecţie de date structurate conform unui model de date şi care serveşte uneia sau mai
multor aplicaţii”. Un model de date este un set de noţiuni, concepte şi reguli pentru
structurarea şi prelucrarea datelor cu ajutorul calculatorului.
În istoria bazelor de date se cunosc mai multe modele de date:
- modelul ierarhic,
- modelul reţea,
- modelul relaţional,
- modelul obiectual.
Dacă modelul ierarhic şi reţea de organizare a bazelor de date reprezintă trecutul în
istoria bazelor de date, modelul relaţional face istoria prezentului, iar modelul obiectual bate
la uşa istoriei bazelor de date.
În continuare vor fi dezvoltate ideile de bază ale modelului relaţional.
Modelul relaţional (fundamentat de Dr. E.F.Codd în anul 1970) se bazează pe
prelucrările ramurii matematicii cunoscută sub numele de Algebra Relaţională. Aceste
prelucrări implică:
- o colecţie de obiecte numite relaţii (tabele),
- un set de operatori care acţionează asupra relaţiilor pentru a produce noi relaţii.
O relaţie poate fi văzută ca o tabelă (cu linii şi coloane) şi reprezentă forma principală
de organizare a datelor într-o bază de date de tip relaţional.

Organizarea datelor in tabele


Tabela (relaţia) este o colecţie de date cu o anumită structură, şi are un nume prin
care se identifică. Datele dintr-o tabelă sunt organizate în linii (înregistrari).
Liniile unei tabele sunt formate dintr-o succesiune de valori numerice sau nenumerice
- acelaşi număr de valori pentru fiecare linie. Valorile de pe o anumită coloană au aceeaşi
semnificaţie din lumea reală.
Să presupunem că avem o tabelă, cu numele SALARIATI, în care sunt stocate date
despre salariaţii unei organizaţii, după cum urmează:

110 Popescu Ion Bucuresti 20.04.1975 Director 3500 350 10


130 Ionescu Petre Cluj 05.10.1979 Cont.sef 3000 300 10
120 Georgescu Vasile Iasi 11.11.1969 Programator 3000 400 20
. . . . . . . . . . . .

Analizând datele din tabela SALARIATI se poate aprecia că:


- valorile de pe prima coloană au semnificaţia de Marcă Salariat
- valorile de pe a 2-a coloană au semnificaţia de Nume Salariat,
- valorile de pe a 3-a coloană au semnificaţia de Prenume Salariat,
- valorile de pe a 4-a coloană au semnificaţia de Locul de Naşterii,
- valorile de pe a 5-a coloană au seminificaţia de Data Naşterii,
- valorile de pe a 6-a coloană au semnificaţia de Funcţia,

2
Initiere in Visual FOXPRO Autor: Eugen Maftei
www.cartiaz.ro – Carti si articole online gratuite de la A la Z
- valorile de pe a 7-a coloană au semnificaţia de Salar,
- valorile de pe a 8-a coloană au semnificaţia de Spor,
- valorile de pe ultima coloană au semnificaţia de Cod Servici

Semnificaţia valorilor de pe o linie se exprimă prin noţiunea (conceptul) de


Câmp. Câmpul este cea mai mica unitate informaţională, identificabilă şi accesibilă,
utilizată în structurarea (organizarea) datelor. Mulţimea câmpurilor definesc structura
tabelei, iar valorile care formează o linie reprezintă valorile câmpurilor din structura
tabelei.
În general un câmp este caracterizat prin:
- nume (prin care se identifică şi se face referire),
- tipul câmpului, prin care se defineşte natura valorilor care se pot memora în
câmp (numerică, şir de caractere, dată calendaristică, etc.)
- lungime (dimensiune) câmp, care defineşte numărul maxim de caractere a
celei mai mari valori a câmpului,

Identificarea liniilor
Modelul relaţional permite identificarea liniilor dintr-o tabelă prin conceptual de cheie
primară (index primar). Cheia primară este formată dintr-un câmp sau grup de câmpuri a
cărui valori identifică în mod unic liniile într-o tabelă. Nu sunt admise două linii în tabelă
pentru care câmpul sau grupul de câmpuri declarat cheie primară (index primar) să aibă
aceeaşi valoare.

Organizarea tabelelor
Pentru a organiza o colecţie de date sub forma unei tabele, mai întâi trebuie să definim
structura tabelei. A defini structura a unei tabele înseamnă a specifica, cel puţin:
- numele tabelei,
- câmpurile tabelei, iar pentru fiecare câmp să se specifice:
. numele câmpului,
. tipul câmpului,
. lungimea câmpului,

În aceste condiţii structura tabelei SALARIATI ar putea fi definită în felul următor:


Nume tabelă: SALARIATI
Coloane: CODS N,3
NUMES C,10
PRENS C,15
LOCNAST C,12
DATAN D
FUNCTIA C,10
SALAR N,5
SPOR N,4
CODSERV N,2
După descrierea structurii unei tabele, tabela poate fi populată cu date (adică se pot
introduce linii în tabelă).

Atenţie. Faceţi diferenţa dintre stuctura unei tabele şi datele tabelei (aşa cum faceţi
deosebirea dintre proiectul unei case şi casa propriu-zisă).

3
Initiere in Visual FOXPRO Autor: Eugen Maftei
www.cartiaz.ro – Carti si articole online gratuite de la A la Z

Asupra datelor unei tabele se pot efectua următoarele operaţii:


- introducerea (memorarea) de noi linii,
- ştergerea anumitor linii,
- modificarea liniilor, adică modificarea valorilor anumitor câmpuri de pe anumite
linii,
- citirea (regăsirea, localizarea) anumitor linii din tabelă în vederea prelucrării
datelor din aceste linii.

Asupra structurii unei tabele se pot face urmatoarele operaţii:


- introducerea de noi câmpuri,
- ştergerea unor câmpuri,
- modificarea caracteristicilor anumitor câmpuri,

Organizarea datelor în baze de date relaţionale


În modelul relaţional, o bază de date poate fi considerată “o colecţie de una sau mai
multe tabele dependente între ele, care servesc uneia sau mai multor aplicaţii”. Pentru a
înţelege mai bine noţiunea de baza de date să definim, mai întâi, "ce se înţelege prin tabele
dependendente?".
Fie 2 tabele T1 şi T2. Spunem ca tabelele T1 şi T2 sunt dependente sau în
corespondenţă, dacă oricărei linii din tabela T1 îi corespunde cel puţin o linie din tabela T2.
În acest caz, T1 reprezintă "tabela părinte", tabela T2 reprezintă "tabela copil", iar
dependenţa dintre aceste tabele este reprezentată prin diagrama din Figura 1.

Atenţie. UneleSGD-urii (ex. Visual FOXPRO) folosesc termenul de relaţie, probabil mai
sugestiv, în locul termenilor de corespondenţă sau dependenţă. În acest curs vor fi utilizaţi
termenii de corespondeţă sau dependenţă pentru a se evita confuzia cu termenul de relaţie
utilizat de E.F.Cod pentru tabelă. Dacă am utiliza termenul de relaţie am fi tentaţi, uneori, să
utilizăm expresia “relaţia dintre relaţii”.

Figura 1 Diagrama dependenţei a două tabele

Dacă oricărei linii din tabela T1 îi corespunde o singură linie din tabela T2 atunci
corespondenţa dintre cele doua tabele este tipul 1:1 (unu la unu) (Figura 2.A).

4
Initiere in Visual FOXPRO Autor: Eugen Maftei
www.cartiaz.ro – Carti si articole online gratuite de la A la Z
Dacă există linii din tabela T1 cărora le pot corespunde mai multe linii din tabela T2
atunci corespondenţa dintre cele doua tabele este de tipul 1:N (unu la mai mulţi sau 1 la N)
(Figura 2.B).

Figura 2 Dependenţe 1:1 şi 1:N

Definirea dependenţelor
Maniera cea utilizată pentru definirea dependenţelor dintre două tabele este aceea a
definirii unui câmp de legătură. Câmpul de legătură este format din una sau mai multe
câmpuri, care apar în structura ambelor tabele cu aceeaşi semnificaţie sau semnificaţii
echivalente în lumea reală. Unei linii părinte din tabela părinte îi va corespunde linia sau
liniile fiu din tabela copil, pentru care câmpul de legătură din liniile copil are aceeaşi valoare
cu câmpul de legătură din linia părinte.
Între tabele unei baze de date relaţională pot fi definite două categorii de dependenţe:
- dependenţe permanente,
- dependenţe temporare.

Dependenţele permanente
Dependenţele permanente au o durată mare de existenţă, chiar atât timp cât există baza
de date, dacă se doreşte. Rolul dependenţelor permanente este acela de a defini condiţii de
integritate referenţială, care au la bază principiul că "într-o tabelă copil nu trebuie să
existe nici o linie care să nu corespundă unei linii din tabela părinte" (nu sunt admişi copii
fără părinţi, adică copii orfani).
Condiţia de integritate referenţială permite existenţa de liniii în tabela părinte cărora
nu le corespund nici o linie în tebela copil. În general, în această situaţie se atribuie ca linie
copil o linie vidă.

Dependenţele temporare
Dependenţele temporare, după cum sugerează şi denumirea sunt cu caracter temporar.
O dependenţă temporară este definită pentru a simplifica prelucrările care implică date din
mai multe tabele dependente. Dependenţele temporare pot de tipul părinte/copil de tipul1:1
sau 1:N. În cazul dependenţelor de tipul părinte/copil între două tabele A şi B pot să apară
situaţii de genul:
- o prelucrare poate să ceară ca tabela A să fie părinte şi tabela B să fie copil,
- iar altă prelucrare să ceară tabela B părinte şi tabelă A copil.
Observaţie
În cazul mai multor tabele dependente între ele, indiferent de tipul dependenţei, pot să
apară următoarele situaţii:
5
Initiere in Visual FOXPRO Autor: Eugen Maftei
www.cartiaz.ro – Carti si articole online gratuite de la A la Z
- o tabelă să fie tată la mai multe tabele fiu,
- o tabelă să fie tabelă fiu pentru mai multe tabele tată,
- o tabelă să fie fiu în raport cu o tabelă şi să fie tată în raport cu altă tabelă.

Structura unei baze de date


Dacă la începuturile organizării datelor în baze de date, o bază de date conţinea numai
date, astăzi bazele de date permit ca pe lângă date să conţină şi alte tipuri de informaţii cum
ar fi cod de programe, forme, rapoarte, etc.. Din aceste motive o bază de date poate fi privită
ca un container în care pot fi stocate obiecte de diverse tipuri , gestionată de un instrument
software specializat, numit Sistem de Gestiune a Bazelor de Date (SGBD), care serveşte uneia
sau mai multor aplicaţii utilizator. Obiectele pot fi de tip:
- tabelă, vedere,
- cod program,
- formă , raport, etc..

O bază de date relaţională trebuie să respecte o serie de reguli, printre care:


- o bază de date relaţională apare ca o colecţie de tabele (relaţii),
- două tabele dintr-o bază de date nu pot avea acelaşi nume,
- într-o tabelă nu sunt admise duplicatele (doua linii identice),
- ordinea liniilor dintr-o tabelă este nesemnificativă,
- ordinea coloanelor dintr-o tabelă este nesemnificativă,
- valorile de pe coloane sunt atomice (nedecompozabile),
- liniile dintr-o tabelă pot fi identificate prin intermediul valorilor unei coloane sau a
mai multor coloane, care pot forma aşa numitele chei unice sau chei primare ,
- reducerea la maximum a redundanţelor,
- operaţiile asupra datelor din tabele se execută prin intermediul operatorilor
relaţionali,
- limbajul utilizat pentru regăsirea şi întreţinerea datelor este un limbaj ne-
procedural, prin care nu se cere utilizatorului să definească căile de acces la date
sau să cunoască structura fizică a datelor.

Rolul dependenţelor permanente între tabele


Dependenţele permanente sunt utilizate, în majoritatea bazelor de date relaţionale,
pentru definirea condiţiilor de integritate referenţială.
Dacă între două tabele s-a definit o dependenţă permanentă, părinte/copil, atunci
condiţia de integritate referenţială, definită pe tabele, afectează următoarele operaţii:
- Introducerea de noi linii în tabela copil. Orice linie nouă pentru tabela copil este
acceptată, dacă valoarea cîmpului de legătură se regăseşte printre valorile
campului de legătură din liniile tabelei părinte, ceea ce însemnă că pentru linia
copil din tabela copil există o linie părinte în tabela părinte. Dacă valoarea
câmpului de legătură nu se regăseşte printre valorile câmpului de legătură din
liniile tabelei părinte, linia nu este acceptată în tabela copil.
- Ştergerea de linii din tabela tată. Dacă unei linii parinte din tabela parinte nu-i
corespunde nici o linie copil în tabela copil, atunci linia din tabela parinte poate fi

6
Initiere in Visual FOXPRO Autor: Eugen Maftei
www.cartiaz.ro – Carti si articole online gratuite de la A la Z
ştearsă. Dacă unei linii parinte din tabela parinte îi corespunde cel puţin o linie
copil în tabela copil, atunci poate fi întreprinsă una din următoarele acţiuni:
. linia din tabela parinte nu se şterge,
. ştergerea liniei parinte este însoţită de ştergerea liniilor copil
corespunzătoare din tabela copil: are loc fenomenul de ştergerea în cascadă.
- Modificarea valorilor câmpului de legătură din tabela tată. Dacă unei linii
parinte din tabela parinte nu-i corespunde nici o linie copil în tabela copil, atunci
valoarea câmpului de legătură din linia părinte poate fi modificată. Dacă unei linii
părinte din tabela parinte îi corespunde cel puţin o linie copil în tabela copil, atunci
poate exista una din următoarele situaţii:
. nu se poate modifica valoarea câmpului de legătură din linia parinte,
. modificarea valorii câmpului de legătură din linia parinte este însoţită de
modificarea cu aceeaşi valoare a câmpului de legătură din liniile copil
corespunzătoare din tabela copil: are loc fenomenul de modificare în
cascadă.
- Modificarea valorilor câmpului de legătură din tabela copil. La modificarea
valorii câmpului de legătură dintr-o linie a tabelei copil poate să apară una din
situaţiile:
. dacă noua valoare a câmpuluii de legătură nu se regăseşte printre valorile
câmpului de legătură din liniile tabelei părinte, atunci noua valoare
nu este acceptată,
. dacă noua valoare a câmpului de legătură se regăseşte printre valorile
câmpului de legătură din liniile tabelei părinte, atunci noua valoare
este acceptată: deci linia copil îşi schimbă linia părinte.

Indexarea tabelelor
Citirea liniiilor dintr-o tabelă se poate face în două moduri:
- în mod secvenţial,
- în mod direct.
În citirea secvenţială pentru a citi linia cu numărul k trebuie citite cele k-1 linii
anterioare, adică altfel zis, liniile din tabelă se citesc una dupa alta în ordinea în care ele sunt
memorate în tabelă.
Prin citirea în mod direct o linie este localizată direct, fără a mai fi nevoie de citirea
altor linii din tabelă. Citirea în mod direct se bazează pe aşa numitele "criterii de selecţie",
care pot fi:
- numărul sau identificatorul intern al liniei în cadrul tabelei,
- valorile unei coloane sau a unui grup de coloane din structura tabelei.
Citirea în acces direct pe baza valorilor unui coloane sau a unui grup de coloane se
face prin tehnica indexării.

În ce constă tehnica indexarii?


O coloană sau un grup de coloane din structura tabelei sunt declarate "coloană
index", prescuratat "index" sau "coloană cheie", prescurtat "cheie". Pe baza coloanei
index, se crează o "tabelă index", care este formată din "înregistrări index".
În general, o înregistrare index este formată din două valori: valoarea indexului
(coloanei index) şi valoarea care reprezintă numărul sau identificatorul intern (adresa liniei) al
liniei corespunzătoare din tabelă (Figura. 4).

7
Initiere in Visual FOXPRO Autor: Eugen Maftei
www.cartiaz.ro – Carti si articole online gratuite de la A la Z

<valoare index> <id. linie>


Figura 4 Înregistrarea index
În tabela index, înregistrările index sunt memorate în ordinea crescătoare sau
descrescătoare a valorilor indexului (vezi exemplul din Figura 5).
Citirea în acces direct pe baza unui index, presupune faptul ca utilizatorul furnizează
valoarea indexului (coloanei index) iar sistemul citeşte înregistrarea index pentru care indexul
are valoarea indicată. În acest caz procesul de citire se desfaşoară în modul următor:
- mai întâi, se citeşte înregistrarea index din tabela de index, pentru care indexul are
valoarea indicată (există metode de citire directă a înregistrărilor index, favorizate de faptul ca
înregistrările index sunt ordonate după valoarea indexului),
- iar apoi, pe baza numărului sau identificatorului intern al liniei găsit în
înregistrarea index se citeste direct înregistrarea corespunzatoare din tabelă (vezi
Figura 5).
În unele situaţii indexarea este utilizată şi pentru citirea secvenţială. În acest caz, liniile
nu mai sunt citite secvenţial în ordinea în care sunt memorate în tabelă, care reprezintă
"ordinea fizică", ci în ordinea dată de înregistrările index din tabela de index, care reprezintă
"ordinea logică". În acest caz, indexarea în citirea secvenţială, oferă o ordonare a liniilor
dintr-o tabelă, fără ca liniile din tabelă să fie ordonate fizic. Citirea secvenţială a liniilor
tabelei din Figura 1.5 va furniza liniile din tabelă în ordinea: 2, 4, 1, 5, 3.

Fig. 5 Tabelă index

Indecşii asociaţi unei tabele se pot defini: fie la definirea structurii tabelei, fie ulterior
în mod explicit prin comenzi dedicate. Pentru o tabelă pot fi definiţi, în general, oricâţi
indecşi dorim, dar aspectele legate de performanţă cer ca numărul acestora să fie redus (cel
mult 2 sau 3 indecşi pentru o tabelă).

Tipuri de indecşi
În practica structurării tabelelor există următoarele tipuri (categorii) de chei (indecşi):
- chei candidate (indecşi candidaţi), pentru care nu există două linii în care cheia
să aibă aceeaşi valoare: pot fi definiţi mai multe chei candidaţi pentru o tabelă,
- cheie primară (indecşi primar), pentru care nu există două linii în care cheia să
aibă aceeaşi valoare: într-o tabelă poate fi definită o singură cheie primară,

8
Initiere in Visual FOXPRO Autor: Eugen Maftei
www.cartiaz.ro – Carti si articole online gratuite de la A la Z
- chei normale (indecşi normali), care admit existenţa a două sau mai multe linii în
care cheia să aibă aceeaşi valoare: pot fi definiţi mai multe chei normale pentru o
tabelă

Sisteme de Gestiune a Bazelor de Date (SGBD)


Funcţiile unui SGBD
Pentru lucrul cu baze de date există instrumente software specializate numite generic
Sisteme de Gestiune a Bazelor de Date (SGBD). Piaţa software-lui este bogată în SGBD-
uri care au diverse denumiri, cum ar fi:
Visual FOXPRO, PARADOX, ACCESS, SQL-Server, Oracle, SYBASE etc.
Un SGBD pune la dispoziţia utilizatorilor o gamă largă de funcţii care asigură :
- Funcţiile de bază ale SGBD-ului, cum ar fi:
. crearea şi modificarea structurii bazei de date şi a obiectelor BD,
. introducerea, ştergerea sau modificarea datelor din tabelele bazei de date,
. citirea datelor din tabelele bazei de date în vederea prelucrării lor.
- Facilităţi pentru dezvoltarea de aplicaţii utilizator (crearea şi execuţia de aplicaţii
utilizator cu meniuri, forme, rapoarte, etc.).

Lucrul cu baza de date


În primul rând trebuie să ştiţi, că dacă doriţi să lucraţi în aplicaţiile dumneavoastră cu
baze de date gestionate de un anumit SGBD, trebuie să achiziţionaţi acel SGBD, după care să-
l instalaţi pe calculatorul dumneavoastră, sau pe un calculator din reţeaua de calculatoare unde
lucraţi. Modul de instalare al unui SGBD depinde de SGBD şi de sistemul de operare sub care
veţi lucra.
Din punct de vedere al numărului de utilizatori care pot accesa în acelaşi timp datele
bazei de date, există:
- SGBD-uri cu baze de date locale, la care accesul la baza de date este permis
numai pentru un utilizator,
- SGBD-uri cu baze de date partajate, la care accesul la baza de date este permis
mai multor utilizatori.
SGBD-urile de astăzi nu mai lucrează cu bază de date locală, ci cu bază de date
partajată între utilizatorii unei reţele de calculatoare.
Accesul partajat la o bază de date se bazează pe aşa numita tehnologie client-server.

9
Initiere in Visual FOXPRO Autor: Eugen Maftei
www.cartiaz.ro – Carti si articole online gratuite de la A la Z
În tehnologia client-server, baza de date este memorată pe discurile unui calculator din
reţea şi reprezintă baza de date server.
Clientul este orice utilizator, eventual de pe alt calculator din reţea, care doreşte să
lucreze cu baza de date. Clientul este reprezentat printr-o aplicaţie utilizator sau printr-o
componentă a SGBD-ului.

Figura 8 Tehnologia Client/Server

10
Initiere in Visual FOXPRO Autor: Eugen Maftei
www.cartiaz.ro – Carti si articole online gratuite de la A la Z

Introducere in Visual FOXPRO


Visual FOXPRO este un SGBD relational al firmei MicroSoft. El ofera toate facilitatile recunoscute
pentru un SGBD modern.

Lansare in executie V.Foxpro


Dublu-clic pe pictograma

Mod lucru in V.Foxpro


• Interactiv (Limbaj De Programare)
• Asistat (meniului, ferestrelor de dialog, asistentilor)
• Prin programe (comenzi stocate intr-un fisier text)

Limbajul V Foxpro
Este format din comenzi. Fiecare c-da este formata din cuvinte:
• Cheie
• Utilizator

Cuvintele sunt organizate in clauze


• Numai din cuvointe cheie
• Numai din cuvinte utilizator
• Combinati de cuvinte cheie si utilizator

Exista clauze
• Optionale
• Obligatorii

Se descrie o c-da, se descriu:

11
Initiere in Visual FOXPRO Autor: Eugen Maftei
www.cartiaz.ro – Carti si articole online gratuite de la A la Z
• Functia
• Sintaxa
• Comentarii
• Exemple

Metalimbajul Utilizat in sintaxe

• Cuv cheie se scriu cu majuscule


• Cuv utilizator se scriu cu litere mici
• Cuv se separa printr-un spatiu sau alt separator descris in sintaxa
• [clauza optionala]
• {clauza1 | clauza2| …}
• [clauza optionala]… sau {clauza1 | clauza2| …}…

Sintaxa generala a comenzilor

Verb-comanda [clauze]

Variabilele de mediu de lucru V.Fox


• nume
• valori

Setarea variabilelor de mediu


• asistat
• prin comenzi SET cu sintaxa

SET numevar TO valoare

Exemplu
Setarea directorului implicit de stocare si regasire a fisierelor create cu VFP

Crearea unei bazei de date VFP

Crearea unei tabele in BD

Creati tabela SALARIATI cu structura descrisa anterior


Creati Tabela SERVICII cu urmatoarea structura
Codserv N,2
Denserv C,12

12
Initiere in Visual FOXPRO Autor: Eugen Maftei
www.cartiaz.ro – Carti si articole online gratuite de la A la Z
Cheltuieli N,7
Sef C,20

Ca sa putem stabili o relatie permanenta intre 2 tabele, trebuie ca:


• tabela parinte sa fie indexata dupa campul de legatura (index primar sau
candidat)
• tabela copil sa fie indexata dupa campul de legatura (orice index)

Cum definim relatia?


D&D (Drag and Drop) de la cheia camp de legatura din tabela
parinte (cheaia CODSERV din SERVICII) la cheia camp de legatura din
tabela copil (cheaia CODSERV din SALARIATI).

Comenzi Visual FOXPRO (Sintaxe prescurtate)


Comanda CREATE DATABASE
Creaza o baza de date V.FOXPRO

Sintaxa
CREATE DATABASE numebd

Comanda OPEN DATABASE


Deschide o bază de date.

Syntaxa

OPEN DATABASE [numefis ] [{EXCLUSIVE | SHARED}] [NOUPDATE]

În numefis puteţi specifica şi calea directorului unde este stocat fişierul BD.
Dacă omiteţi numele bazei de date, atunci VFP afişează o fereastră de dialog pentru a
selecta fişierul bazei de date pentru deschidere.

Starii variabilei de mediu EXCLUSIVE:


• ON, atunci deschiderea este exclusive
• OFF, atunci deschiderea este partajat

13
Initiere in Visual FOXPRO Autor: Eugen Maftei
www.cartiaz.ro – Carti si articole online gratuite de la A la Z
Baza de date curentă
Mai multe baze de date pot fi deschise la un momen dat, dar numai una poate fi BD
curentă. O serie de comenzi (ADD TABLE, MODIFY DATABASE, etc.) sau funcţii
operează pe baza de date curentă.
O bază de date poate fi făcută curentă:
• Prin comanda SET DATABASE TO
• Prin alegerea ei din lista expandabilă, din trusa standard a lui VFP

Comanda SET DATABASE TO are sintaxa:

SET DATABASE TO [numebd]

Unde numebd este numele unei BD deschisă, care se doreşte să devină curentă
SET DATABASE TO face ca nici obază de date să nu fie curentă.
Exemple
CREATE DATABASE bdc1
CREATE DATABASE bdc2
SET DATABASE TO bdc1
CREATE tabela1
CLOSE TABLES
REMOVE TABLE tabela1
SET DATABASE TO bdc2
ADD TABLE tabela1
Deschiderea tabelelor
Zone de lucru în VFP
Pentru deschiderea tabelelor VFP utilizează nişte zone de memorie internă numite
zone de lucru. O tabelă se deschide într-o zonă de lucru, iar într-o zonă de lucru nu se
dechide decât o singură tabelă. În zona de lucru sunt memorate informaţii despre tabela
deschisă în zonă. Zonele de lucru sunt identificate printr-un număr (1,2,3, …), iar
primele 10 zone de lucru mai pot fi identificate printr-un alias de forma A, B, C, …, J. Pot
fi cel mult 32767 zone de lucru.

La un moment dat o singură zonă este zonă de lucru curentă sau zonă de lucru
activă. Când o zonă de lucru este curentă, atunci tabela deschisă în ea este tabelă curentă.
Unele comenzi lucrează pe tabela curentă, sau au ca bază de lucru tabela curentă.

Comanda SELECT
Activează o zonă de lucru.

Sintaxa

SELECT {idzonă | aliastabelă}

Comanda USE
Deschide sau închide o tabelă.

14
Initiere in Visual FOXPRO Autor: Eugen Maftei
www.cartiaz.ro – Carti si articole online gratuite de la A la Z

Sintaxa
USE [ [numebd.]numetabelă [IN idzona] [ALIAS aliastabelă]
[{EXCLUSIVE | SHARED}] [NOUPDATE] ]
Comanda USE fără nici o clauză, închide tabela curentă.

Aliasul tabelei sau aliasul zonei de lucru (pentru primele 10 zone de lucru) sunt necesare la referirea
campurilor dintr-o tabela care nu este tabela curenta, dupa sintaxa:
aliastabela.numecamp
aliaszona.numecamp

Despre indexare
Când un câmp sau o combinaţie de campuri este declarată câmp index sau câmp cheie este generată o
tabelă numită tabela de index (pe scurt index), care este formata din inregistrări index. Câmpul sau combinaţia
de câmpuri index, reprezintă aşa numita expresie index.

O inregistrare index este formata din dou valori

Valoare expresie index


Numarul inregistrarii
Inregistrarile index sunt stocate în index. în ordinea ascendă sau descendentă a
valorilor expresiei index.

Tabela index Tabela


A 3 (1) … B ……
B 1 (2) … D ……
C 5 (3) … A ……
D 2 (4) … E …….
E 4 (5) … C …….

Stocarea unui index (tabelă index) se poate face:


• Într-un fişier mono-index (cu orice nume şi extensia .IDX)
• În fişierul multi-index structurat care are acelasi nume cu numele tabelei, dar cu extensia .CDX
• Într-un fişier multi-index utilizator, cu orice nume şi extensia .CDX

Observaţie
Noi vom lucra cu indecsi stocati in fisierul multi-index structurat.
Fişierul multi-index structurat se deschide automat când se deschide tabela.

Utilitatea indecşilor
• Definirea dependentelor permanente
• Definirea dependentelor temporare
• Citirea directă a înregistrărilor
• Citirea secvenţială a înregistrărilor

Ordinea înregistrarilor dintr-o tabelă poate fi:


• Ordine fizică, care corespunde ordinii de stocare a înregistrărilor în tabelă.
• Ordinea logică, care corespunde ordinii dată de un index.

De cele mai multe ori, pentru ca un index să fie utilizat într-o prelucrare trebuie ca el să fie făcut index
activ sau index master.

15
Initiere in Visual FOXPRO Autor: Eugen Maftei
www.cartiaz.ro – Carti si articole online gratuite de la A la Z

Comanda INDEX
Crează un index pentru tabela curentă

Sintaxa de creare a unui index stocat în fişierul multi-index structurat

INDEX ON expresie TO TAG numeindex


[FOR cond_sel_înr_ind] [{ASCENDING | DESCENDING}]
[{UNIQUE | CANDIDATE}]
Dacă nu este specificată ordonarea, implicit este ASCENDING.
Dacă nu este specificat tipul indexului, atunci, implicit, el este regular (normal)

Comanda SET ORDER TO


Activează un index sau face un index, index master.

Sintaxa

SET ORDER TO [ [TAG] numeindex ] [IN {idzona | aliastab}]


SET ORDER TO anulează indexul master.

Comanda CLOSE
Închide diverse tipuri de fişiere.

Sintaxa

CLOSE {ALL | DATABASES [ALL] | TABLES [ALL] }

Comanda APPEND
Adaugă una sau mai multe înregistrări la sfârşitul unei tabele.

Sintaxa

APPEND [BLANK] [IN { idzonă | aliastabelă} ]

Setari Data calendaristica


SET CENTURY ON | OFF
SET DATE { AMERICAN | ANSI | BRITISH | FRENCH | GERMAN
| ITALIAN | JAPAN | TAIWAN | USA | MDY | DMY | YMD }
Semnificatii
AMERICAN mm/dd/yy
ANSI yy.mm.dd

16
Initiere in Visual FOXPRO Autor: Eugen Maftei
www.cartiaz.ro – Carti si articole online gratuite de la A la Z
BRITISH/FRENCH dd/mm/yy
GERMAN dd.mm.yy
ITALIAN dd-mm-yy
JAPAN yy/mm/dd
TAIWAN yy/mm/dd
USA mm-dd-yy
MDY mm/dd/yy
DMY dd/mm/yy
YMD yy/mm/dd

Exemplu: SET DATE BRITISH

Comenzile ? si ??
Evaluează o expresie şi afişează rezultatul evaluării

Sintaxa
{ ? | ?? } Expresie
Unde expresie este o expresie validă VFP.

? Expresie execută retur-de-car înainte de afişarea rezultatului evaluării expresiei.

?? Expresie nu execută un retur-de-car înainte de afişarea rezultatului evaluării expresiei.

Datele cu care lucreaza V.FOXPRO

• Tabele, inregistrari, campuri, valori de campuri


• Constante
• Variabile
• Functii
• Expresii
Constante
Marimi care nu-si modifica valoarea in timp

Numerice: 2, -3.14

Sir de caractere:
‘ABC123’ sau “ABC123” sau “abc123”

Data calendaristica si timp:


Format: {^aaaa/ll/zz} {^aaaa/ll/zz hh:mm:ss}
Exemplu {^2012/01/01} {^2012/01/01 14:50:30}

Logice: .T. sau .F.

Variabile
Marimi care isi schimba valoarea in timp. Au nume si ocupa un spatiu de memorie RAM.
Pot fi de tip:
• Numeric,

17
Initiere in Visual FOXPRO Autor: Eugen Maftei
www.cartiaz.ro – Carti si articole online gratuite de la A la Z
• Sir de caractere
• Data calendaristica
• Logice

Functii
Functiile sunt subprograme ce executa anumite prelucrari si returneaza o valoare.
Unor functii li se pot transmite date pe care aceastea le prelucreaza. Transmiterea de date se face prin
asa numitii parametrii ai functiei.
Apelul functiei:

numefct([parametri])
Tipuri de functii:
• Numerice,
• Sir de caractere
• Data-timp
• Logice
• De conversie

Functia DATE() returneaza data din sistemul de calcul.

Expresii
O expresie este o succesiune de operanzi si operatori care respecta anumite reguli.
Operanzi definesc datele
Operatorii definesc operatiile care se executa asupra operanzilor

Tipuri de expresii
• Numerice
• Sir de caractere
• Data/timp
• Relationale
• Logice

Expresii Numerice
• Operanzi numerici (campuri, constante, variabile,functii)
• Operatori aritmetici
Operatori Numerici

Operator Actiune Exemplu


() Groupare in subexpresii ?(4-3) * (12/2)
**, ^ Ridicare la putere ? 3 ** 2 ?3^2
*, / Inmultire si impartire ?2*7 ? 14 / 7
% Modulo (restul) ? 15 % 4
+, - Adunarea si scaderea ? 4 + 15

18
Initiere in Visual FOXPRO Autor: Eugen Maftei
www.cartiaz.ro – Carti si articole online gratuite de la A la Z

Expresiile sir de caractere


O expresie de tip sir de caractere este formata din:
• Operatorii de concatenare +, -.
• Operanzi de tip sir de caractere

Operator Action
Exemple
+ Concatenare obisnuita.
?‘Popescu ‘+’Vasile’
- Concatenare cu eliminarea spatiilor din dreapta primului operand.
?‘Popescu ‘-’Vasile’

Expresiile Data/timp
Este formata din
• Operanzi data/timp sau numerici
• Operatorii + sau –

Operator Actiune Code


+ Addition datacal+nr  Datacal

– Subtraction datacal-nr  Datacal


datacal1-datacal2  Nrzile

?Date( )+1000
?{^2012/01/01}-date()
Expresiile relationale

Este formata din


• 2 operanzi de acelasi tip
• legati printr/un operator de comparare (relational)
O expresie relationala are una din valorile .T. sau .F.
Relational Operators
Operator Action Code
< mai mic ? 23 < 54
> mai mare ?1>2
= egal ? ‘ABC’ =’abc’
<>, #, !=diferit ? .T. <> .F.
<= mai mic egal cu ? {^1993/01/01} <= {^1992/01/01}
>= mai mare egal cu ? 32 >= 32.5
$ inclus in ?‘pop’$’prtopopescu’

19
Initiere in Visual FOXPRO Autor: Eugen Maftei
www.cartiaz.ro – Carti si articole online gratuite de la A la Z

operad1$operand2

? 'escu' $ 'popescu' are valoarea .T.


? 'dan' $ ‘davidescu’ are valoarea .F.

Expresii logice

O expresie logica este formata din una sau mai multe expresii relationale
legate prin operatorii logici: NOT, AND sau OR.

Operator Action Code


() grupare subexpresii cVar AND (cVar2 AND cVAR3)
NOT negare logica IF NOT cVarA = cVarB
IF ! nVar1 = nVar2
AND AND logic (SI) lVar0 AND lVar9
OR OR logic (SAU) lVarX OR lVarY

NOT .T. .F.


.F. .T.

AND .T. .F.


.T. .T. .F.
.F. .F. .F.

OR .T. .F.
.T. .T. .T.
.F. .T. .F.

Comenzile DISPLAY şi LIST


Afişează valori de câmpuri sau expresii din înregistrările tabelei curente.

20
Initiere in Visual FOXPRO Autor: Eugen Maftei
www.cartiaz.ro – Carti si articole online gratuite de la A la Z
Sintaxa

{ DISPLAY | LIST } [listă_câmpuri_expresii] [domeniu]


[FOR expr_sel] [OFF] [NOCONSOLE]
[{TO PRINTER [PROMPT] | TO FILE numefis_ies}]
Comentarii

listă_câmpuri_expresii este listă de câmpuri şi/sau expresii, separate prin virgulă, a căror valori se doresc a se
afişa. Dacă nu este specificată sunt afişate valorile tuturor câmpurilor din tabela curentă.

Conţinutul câmpului memo nu este afişat decât în cazul în care este specificat explicit în listă. Dimensiunea de
afişare a câmpurilor memo este determinată de parametrul MEMOWIDTH.

domeniu specifică mulţimea de înregistrări din tabela curentă pe care va lucra comanda. Clauza domeniu
poate avea una din valorile:
• ALL,
• NEXT nr_înregistrari,
• RECORD nr_înregistrare,
• REST.

Exemple
LIST NUMES, PRENS, SALAR+SPOR OFF for codserv=10 AND SALAR>1000
LIST NUMES, PRENS, SALAR+SPOR OFF for ‘escu’$numes
LIST NUMES, PRENS, (DATE()-datanast)/365 TO FILE FISSAL
LIST RECORD 2

Ştergerea de înregistrări
Ştergerea înregistrărilor dintr-o tabelă se face în doi paşi:
- Ştergerea logică sau marcarea înregistrărilor pentru ştergere.
- Ştergerea fizică.

Comanda DELETE
Marchează anumite înregistrări pentru ştergere.

Sintaxa

DELETE [domeniu] [FOR exprlog] [IN {idzona | aliastab}]

Domeniu:
• ALL
• RECORD nr
• REST
• NEXT nr
21
Initiere in Visual FOXPRO Autor: Eugen Maftei
www.cartiaz.ro – Carti si articole online gratuite de la A la Z

Dacă domeniu nu este specificat, comanda lucrează pe înregistrarea curentă.

Functia DELETED()
( )
Funcţia DELETED [IN {idzona | aliastab}] returnează valoarea .T. dacă înregistrarea este marcată
pentru ştergere şi valoarea .F. dacă înregistrarea nu este marcată pentru ştergere.

Exemplu pentru afişarea înregistrărilor marcate pentru ştergere


LIST FOR DELETED()

Comanda PACK
Şterge fizic înregistrările marcate pentru ştergere din tabela curentă.

Sintaxa

PACK

Comanda RECALL
Anulează marcatorul de înregistrare ştearsă logic pentru anumite înregistrări şterse fizic din tabela
curentă.

Sintaxa

RECALL [domeniu] [FOR exprsel]

Dacă domeniu nu este specificat , implicit este înregistrarea curentă.

Comanda ZAP
Sterge fizic toate inregistrarile dintr-o tabela.

Sintaxa

ZAP [IN {idzona | aliastab}]


Dacă variabila SAFETY este pe ON, atunci Visual FoxPro întreabă dacă doriţi să ştergeţi
înregistrările tabelei currente.

Modificare înregistrări
Modificarea înregistrărilor dintr-o tabelă, adică modificarea valorilor anumitor câmpuri din anumite
înregistrări, se poate face:
• Interactiv (prin c-zile BROWSE sau EDIT)
• Automat pe baza unor expresii (prin c-da REPLACE )
Comenzile BROWSE şi EDIT
Permit afişarea şi modificarea, introducerea şi ştergerea interactvă a înregistrărilor din tabela curentă.

Sintaxa

22
Initiere in Visual FOXPRO Autor: Eugen Maftei
www.cartiaz.ro – Carti si articole online gratuite de la A la Z

{ BROWSE | EDIT } [FIELDS listă_câmpuri]


[FOR expr_sel] [FREEZE numecâmp]
[NOAPPEND] [NODELETE] [{NOEDIT | NOMODIFY}]
[TITLE titlu]

listă_câmpuri poate fi o listă de:


• câmpuri din structura tabelei curente sau a unor tabele în relaţie cu tabela curentă,
• câmpuri calculate,
separate prin virgulă.

Un câmp din listă poate fi urmat de opţiunile:

[:R] [:H = constantasircar]


Unde :R defineşte câmp Read-Only
:H defineşte un titlu pentru coloană.

Câmpuri calculate (Calculated Fields…)


Un câmp calculat este un câmp Read-Only, a cărui valoare se calculează pe baza unei expresii valide
VFP.

nume_camp_calculat = expresie
Exemplu

BROWSE FIELDS numes:H=’Nume salariat’, prens:R:H=’Prenume salariat’


,castig=salar+spor:H=’Total castig’

Expr_sel din clauza FOR este o expresie logica. Vor fi afisate date numai din inregistrarile pentru
care expresia este adevarata.
Prin clauza FREEZE puteti specifica campul pe care sa fie pozitionat, tot
timpul, cursorul de editare.

Comanda REPLACE
Actualizează valorile unor câmpuri din anumite înregistrări pe baza valorilor anumitor expresii.

Sintaxa

REPLACE numecamp1 WITH expresie1 [ADDITIVE]


[, numecamp2 WITH expresie2 [ADDITIVE]] ...
[domeniu] [FOR condselinr]

Numecamp1, numecamp2, … sunt numele câmpurilor a căror valori se vor modifica


cu valorile expresiilor expresie1, expresie2, … .

Domeniu dacă nu este specificat este înregistrarea curentă.

23
Initiere in Visual FOXPRO Autor: Eugen Maftei
www.cartiaz.ro – Carti si articole online gratuite de la A la Z
ADDITIVE adaugă valoarea la sfârşitul valorii existente pentru câmpul memo.

Citirea înregistrărilor
Citirea înregistrărilor dintr-o tabelă se poate face:
- direct (pe baza numărului de înregistrare sau a unui index),
- secvenţial.

Comanda GOTO (GO)


Citeşte o înregistrare dintr-o tabelă pe baza numărului de înregistrare. Înregistrarea
citită devine înregistrare curentă în tabelă.

Sintaxa

GOTO [RECORD] nrinr [IN {idzona | aliastab}]


– Sau –

GOTO { TOP | BOTTOM} [IN {idzona | aliastab}]

Comanda SEEK
Citeşte în mod direct prima înregistrare dintr-o tabelă pentru care un index are o
valoare precizată. Înregistrare citită devine înregistrare curentă

Sintaxa

SEEK val_expr_ind [ORDER [TAG] numeind ]


[IN {idzona | aliastab}]

Dacă SEEK găseşte o înregistrare, atunci:


• RECNO( ) returnează numărul înregistrării citite
• FOUND( ) returnează Adevărat (.T.),
• EOF( ) returnează Fals (.F.).
Dacă SEEK nu găseşte nici o înregistrare, atunci:
• RECNO( ) returnează numărul de înregistrării din tabelă plus 1
• FOUND( ) returnează False (.F.),
• EOF( ) returnează Adevărat (.T.).

Comanda LOCATE
Citeşte secvenţial prima înregistrare din tabela curentă care îndeplineşte o condiţie specificată în
comandă. Înregistrarea citită devine înregistrare curentă.

Sintaxa

24
Initiere in Visual FOXPRO Autor: Eugen Maftei
www.cartiaz.ro – Carti si articole online gratuite de la A la Z
LOCATE FOR cond_citire [domeniu]

Dacă LOCATE găseşte o înregistrare, atunci:


• RECNO( ) returnează numărul înregistrării citite
• FOUND( ) returnează Adevărat (.T.),
• EOF( ) returnează Fals (.F.).
Dacă LOCATE nu găseşte nici o înregistrare, atunci:
• RECNO( ) returnează numărul de înregistrării din tabelă plus 1
• FOUND( ) returnează False (.F.),
• EOF( ) returnează Adevărat (.T.).

După ce LOCATE găseşte înregistrarea puteţi executa o comandă CONTINUE


pentru a citi următoarea înregistrare care îndeplineşte condiţia din LOCATE.

Comanda CONTINUE
Comanda CONTINUE citeşte următoarea înregistrare care îndeplineşte condiţia din
ultima comandă LOCATE executată. . Înregistrarea citită devine înregistrare curentă.

Sintaxa
CONTINUE

Comanda SKIP
Citeşte o înregistare printr-un salt înainte sau înapoi cu un număr de înregistrări dintr-
o tabelă. Înregistrarea citită devine înregistrare curentă.

Sintaxa

SKIP [nr_salt_inr] [IN {idzona | aliastab}]


Comentarii

Nr_sal_inr specifică numărul de înregistrări sărite faţă de înregistrarea curentă, dintr-o


tabelă, până la înregistrarea citită:
- Dacă valoarea este pozitivă, saltul se face spre sfârşitul tabelei (înainte),
- Dacă valoarea este negativă, saltul se face spre începutul tabelei (înapoi).

Dacă nr_sal_inr nu este specificat, atunci este 1 (unu).


Dacă înregistrarea curentă este ultima înregistrare din tabelă, atunci un SKIP înainte determină
ca:
- RECNO( ) să returneze o valoare cu 1 mai mare decât numărul înregistrărilor din tabelă,
- EOF( ) să returneze Adevărat (.T.),

Dacă înregistrarea curentă este prima înregistrare din tabelă, atunci un SKIP -1 determină ca:
- RECNO( ) să returneze valoare 1,
- BOF( ) să returneze Adevărat (.T.),

Observaţie
25
Initiere in Visual FOXPRO Autor: Eugen Maftei
www.cartiaz.ro – Carti si articole online gratuite de la A la Z
Dacă tabela pe care lucrează comenzile GO TOP, GO BOTTOM,
LOCATE, CONTINUE şi SKIP sunt controlate de un index master, atunci
aceste comenzi respectă secvenţa (ordinea) înregistrărilor dată de indexul
master.

Relatii temporare intre tabele


Cerinte
• Toate tabelele trebuie sa fie deschise in zone de lucru diferite
• Tabelele trebuie sa fie indexate dupa campul de legatura si indexul
respectiv trebuie sa fie index master
• Tabela parinte trebuie sa fie tabela curenta

Pentru Relatia de tipul 1:1 scrieti o comanda SET RELATION cu urmatoarea


sintaxa:

SET RELATION TO
[campleg1_tata INTO {idzonafiu1 | aliastabfiu1}]
[campleg2_tata INTO {idzonafiu2 | aliastabfiu2}] . . .
[ADDITIVE]

Pentru Relatia de tipul 1: Pentru Relatia de tipul 1:1 scrieti o comanda SET
RELATION cu urmatoarea sintaxa:
scrieti o comanda SET RELATION cu urmatoarea sintaxa:

SET SKIP TO [aliasfiu1 [, aliasfiu2] ...

26