Sunteți pe pagina 1din 261

See discussions, stats, and author profiles for this publication at: https://www.researchgate.

net/publication/320519029

Baze de date - o abordare Visual Foxpro

Book · January 2008

CITATION READS

1 192

2 authors:

Adrian Runceanu Mihaela Runceanu


University of Craiova Colegiul National "Ecaterina Teodoroiu"
26 PUBLICATIONS   22 CITATIONS    4 PUBLICATIONS   2 CITATIONS   

SEE PROFILE SEE PROFILE

All content following this page was uploaded by Adrian Runceanu on 20 October 2017.

The user has requested enhancement of the downloaded file.


Nici o parte din această carte nu poate fi reprodusă sub nici o formă sau
metodă fără acordul scris al autorului.
Aveţi drepturi de utiliza acestă carte doar pentru propria persoană.
Această carte digitală nu poate fi revândută sau dată către alte persoane.
Dacă doriţi să folosiți părți din această carte sunteți liber să o faceți doar
cu citarea corectă a cărții și precizarea linkului de unde ați accesat-o.
ADRIAN RUNCEANU MIHAELA RUNCEANU

BAZE DE DATE – O ABORDARE


VISUAL FOXPRO
Runceanu Adrian (n. 1968) este lector universitar la Universitatea
Constantin Brâncuşi din Târgu-Jiu, Facultatea de Inginerie, Catedra de Automatică şi
Informatică. Este absolvent al Facultăţii de Matematică-Informatică din cadrul
Universităţii din Craiova. A mai publicat: Bacalaureat la informatică. Noţiuni
recapitulative. Teze rezolvate şi probleme propuse (în colectiv), Editura L&S
Infomat, Bucureşti, 2001, Tehnici de programare - îndrumar de laborator, Editura
Academica Brâncuşi, Târgu-Jiu, 2002, Metode şi tehnici de programare. Limbajul
C++ - îndrumar de laborator, Editura Academica Brâncuşi, Târgu-Jiu, 2003,
Programarea şi utilizarea calculatoarelor, Editura Academica Brâncuşi, Târgu-Jiu,
Atestat la informatică, (în colaborare cu Mihaela Runceanu), Editura Axioma
Teomsnic, Târgu-Jiu, 2004, Internet şi Intranet. Teorie şi aplicaţii, Editura
Academica Brâncuşi, Târgu-Jiu, 2005, Programare orientată pe obiecte, Editura
Academica Brâncuşi, Târgu-Jiu, 2007, Baze de date – Visual Foxpro 6.0 – indrumar
de laborator, (în colaborare cu Marian Popescu), Editura Academica Brâncuşi, Târgu-
Jiu, 2007, Programare orientată pe obiecte-limbajul C++. Laborator, Editura
Academica Brâncuşi, Târgu-Jiu, 2008. Domeniile de cercetare sunt legate de baze de
date distribuite, programare Web şi programarea calculatoarelor.

Runceanu Mihaela (n. 1968) este profesor de informatică, gradul didactic I,


la Colegiul Naţional „Ecaterina Teodoroiu” Tg-Jiu. Este absolventă a facultăţii de
matematică şi informatică, Universitatea „Babeş-Bolyai”, Cluj-Napoca, licenţiată în
matematică (1992) şi informatică (1999). A mai publicat: Bacalaureat la informatică.
Noţiuni recapitulative. Teze rezolvate şi probleme propuse (în colectiv), Editura L&S
Infomat, Bucureşti, 2001, Culegere de probleme de informatică – variantele Pascal şi
C++ (în colaborare cu Carmen Negrea), Editura Donaris, 2003, Atestat la
informatică (în colaborare cu Adrian Runceanu), Editura Axioma Teomsnic, Târgu-
Jiu, 2004, Informatică, modele de rezolvare – bacalaureat 2008 (în colectiv),
Editura Little Lamb, 2008, Este remarcabilă activitatea de pregătire a elevilor pentru
performanţă, concretizată în premiile obţinute la faza naţională a olimpiadei de
informatică şi la concursurile de programare.

Referenţi ştiinţifici:

Prof.univ.dr.mat. Dogaru Octavian, Universitatea Constantin Brâncuşi din


Târgu-Jiu, Facultatea de Inginerie, Catedra de Automatică şi Informatică
Conf.univ.dr.ing. Grofu Florin, Universitatea Constantin Brâncuşi din Târgu-Jiu,
Facultatea de Inginerie, Catedra de Automatică şi Informatică
ADRIAN RUNCEANU
MIHAELA RUNCEANU

BAZE DE DATE –
O ABORDARE
VISUAL FOXPRO

Editura Academica Brâncuşi


ISBN 978-973-144-235-8
Descrierea CIP a Bibliotecii Naţionale a României
RUNCEANU, ADRIAN

Baze de date – o abordare Visual Foxpro / Adrian Runceanu,


Mihaela Runceanu – Târgu-Jiu: Academica Brâncuşi, 2009

Bibliogr.
ISBN 978-973-144-235-8

Coperta şi design:
Irina Gorea
irina.gorea@ymail.com
Baze de date – o abordare Visual Foxpro

Cuprins

Partea I. Noţiuni teoretice

Introducere 4
Capitolul 1. Sisteme de gestiune a bazelor de date 5
1.1. BAZE DE DATE. NOŢIUNI GENERALE 5
1.1.1. Sisteme de baze de date 5
1.1.2. Baze de date 6
1.1.3. Principalele concepte din teoria relaţională 8
1.2. Sisteme de gestiune a bazelor de date – Visual Foxpro 9
1.2.1. Caracteristici generale 9
1.2.2. Funcţiile SGBD-ului Visual Foxpro 12
Capitolul 2. SGBD-ul Visual Foxpro 13
2.1. Prezentarea sistemului Visual-Foxpro 13
2.2. Evoluţia sistemului Visual-Foxpro 14
2.3. Noutăţi Visual-Foxpro faţă de Foxpro 2.6 16
2.4. Lansarea. Meniul Visual-Foxpro 18
2.5. Comenzi pentru crearea şi modificarea structurii unei 22
tabele
2.5.1. Comanda CREATE 22
2.5.2. Comanda MODIFY STRUCTURE 22
2.5.3. Deschiderea şi închiderea unei tabele 23
2.5.4. Vizualizarea informaţiilor dintr-o tabelă 23
2.6. Tipuri de date 24
2.6.1. Tipurile de date numerice 25
2.6.2. Tipul şir de caractere 29
Capitolul 3. Căutare. Sortare. Actualizare 34
3.1. Căutare şi poziţionare 34
3.2. Sortare şi duplicare (copiere) 36
3.3. Comenzi de actualizare înregistrări 37
Capitolul 4. Indexare şi căutare rapidă 45

1
Baze de date

4.1. Indexare 45
4.2. Căutare 50
Capitolul 5. Prelucrări statistice şi financiare. Utilizarea câmpurilor 52
Memo şi General
5.1. Prelucrări statistice şi financiare. 52
5.2. Utilizarea câmpurilor Memo şi General 58
Capitolul 6. Programarea structurată în Visual-Foxpro 61
6.1. Comenzi specifice programelor 61
6.1.1. Crearea unui fişier text sau fişier program, 62
utilizând meniul System
6.1.2. Salvarea unui fişier de tip text sau de tip program 63
6.1.3. Deschiderea unui fişier existent 64
6.1.4. Crearea unui fişier text sau program utilizând o 64
comandă specifică
6.1.5. compilarea şi lansarea ăn execuşie a unui 65
program sursă
6.2. Comenzi pentru programarea structurată 66
6.2.1. Structura alternativă: IF ... ENDIF 66
6.2.2. Structura alternativă: DO …ENDCASE 68
6.2.3. Structura repetitivă cu test iniţial: 69
DOWHILE…ENDDO
6.2.4. Structura repetitivă cu număr cunoscut de paşi: 71
FOR…ENDFOR
6.2.5. Structura repetitivă: SCAN…ENDSCAN 72
6.2.6. Comanda CANCEL 73
6.2.7. Comanda SUSPEND 73
6.2.8. Comanda QUIT 73
Capitolul 7. Operaţii de actualizare a tabelelor 75
7.1. Comenzi pentru introducerea şi afişarea datelor 75
7.2. Programe de actualizare 78
Capitolul 8. Funcţii şi proceduri definite de utilizator. Ferestre. 84
8.1. Funcţii şi proceduri definite de utilizator. 84
8.2. Ferestre definite de utilizatorr. 87
Capitolul 9. Meniuri definite de utilizator 90
Capitolul 10. Limbajul SQL 99
Capitolul 11. Proiectarea vizuală a interogărilor 108

2
Visual Foxpro

Capitolul 12. Crearea formularelor 116


Capitolul 13. Crearea rapoartelor 128
Capitolul 14. Proiectarea vizuală a meniurilor şi a barelor de 135
instrumente

Partea II. Aplicaţii

Capitolul 1. Funcţiile SGBD-ului Visual Foxpro. Tipuri de fişiere 144


Visual Foxpro. Limitele SGBD-ului Visual Foxpro.
Capitolul 2. Actualizarea tabelelor prin comanda BROWSE. 157
Cautare şi pozitionare. Sortare şi duplicare(copiere).
Comenzi de actualizare.
Capitolul 3. Citirea informaţiilor de la tastatură şi memorarea lor în 164
variabile de memorie. Indexarea tabelelor, tipuri de
indecşi. Căutare şi poziţionare rapidă în tabele
indexate.
Capitolul 4. Prelucrări statistice şi financiare. 169
Capitolul 5. Programare structurată (clasică) în Visual Foxpro. 172
Capitolul 6. Programare structurată (clasică) în Visual Foxpro – 177
operaţii de actualizare înregistrări în tabele.
Capitolul 7. Funcţii şi proceduri utilizator. Ferestre. 186
Capitolul 8. Meniuri definite de către utilizator. 191
Capitolul 9. Limbajul SQL. 198
Capitolul 10. Probleme rezolvate şi probleme propuse. 209
Capitolul 11. Teste grilă rezolvate. Teste grilă propuse. 223
Bibliografie 252

3
Baze de date

Partea I. Noţiuni teoretice

Introducere

Având în vedere evoluţia generală a utilizării sistemelor electronice de


calcul şi în special a microcalculatoarelor, dintre care cele mai răspândite sunt
cele din familia IBM PC şi compatibile cu acestea, precum şi organizarea
datelor în baze de date, în lucrarea de faţă se tratează cel mai reprezentativ
Sistem de Gestiune a Bazelor de Date Relaţionale, FOXPRO, în varianta
VISUAL FOXPRO 6.0.

Dintre argumentele care justifică această alegere putem reţine:


- este Sistemul de Gestiune a
Bazelor de Date cu cea mai
mare arie de răspândire,
fiind utilizat de toate tipurile
şi dimensiunile de
întreprinderi;

- prin versiunile cele mai recente, este conceput să lucreze sub mediile
WINDOWS, MAC şi UNIX. Visual FOXPRO versiunea 6.0 poate fi
implementat pe microcalculatoare care necesită 6 MB RAM;

- poate fi utilizat atât pe staţii individuale, cât şi în reţea;

- dispune de un puternic limbaj propriu de descriere şi manipulare a


datelor; care găzduieşte un nucleu al limbajului SQL;

- aplicaţiile aflate în exploatare, elaborate de dBASE, pot fi trecute uşor


în FOXPRO, beneficiind astfel de facilităţile acestuia, printre care
trebuie amintită viteza mare de lucru.

4
Visual Foxpro

Însuşire cunoştinţelor privind organizarea datelor în baze de date


relaţionale şi a unui SGBD performant constituie instrumente necesare pentru
proiectare şi dezvoltarea aplicaţiilor informatice.

Capitolul 1
SISTEME DE GESTIUNE A BAZELOR DE DATE

1.1. BAZE DE DATE. NOŢIUNI GENERALE

Deoarece Visual FoxPro este un sistem de gestiune a bazelor de date


relaţionale, vom prezenta în continuare principalele concepte pe care un
utilizator trebuie să le cunoască în mod obligatoriu pentru a putea dezvolta
aplicaţii cu baze de date în VFP.

1.1.1. Sisteme de baze de date

Sistemul de Bază de Date (SBD) este un ansamblu de componente


corelate între ele, care contribuie la realizarea şi exploatarea unei aplicaţii cu
baze de date. Într-o accepţiune mai veche noţiunea de SBD se folosea ca
bancă de date.

Elementele care compun un sistem de bază de date sunt:

 componenta de date (baza de date - BD) se referă la modul de


memorare a datelor în colecţiile de date propriu-zise şi în alte fişiere
anexe;

 componenta de software (programele necesare stocării şi prelucrării


datelor în/din BD) este compusă din sistemul de gestiune a bazei de
date (SGBD), precum şi programele de aplicaţie aferente (dezvoltate,
în cea mai mare parte, în SGBD);

5
Baze de date

 componenta auxiliară contribuie la buna realizare şi utilizare a SBD.


Această componentă se referă la: procedurile manuale şi automate
utilizate, reglementările administrative şi juridice aferente, mijloacele
hardware necesare, personalul implicat.
Corelarea elementelor de mai sus este dată în mod sugestiv de
arhitectura unui SBD pe componente.
Datele sunt organizate în memoria externă în baze de date conform unui
model de date arborescent, reţea, relaţional, orientat pe obiecte).

Software-ul permite descrierea şi manipularea datelor cu ajutorul unui


SGBD în care se dezvoltă programele de aplicaţie.
Elementele auxiliare sunt utilizate atât în componenta de date cât şi în
cea de software şi ele contribuie la alcătuirea SBD.
Legăturile între componentele unui SBD se realizează prin intermediul
SGBD-ului. De asemenea, utilizatorii lucrează cu un SBD tot prin intermediul
SGBD-ului.

În concluzie, atunci când se dezvoltă o aplicaţie cu baze de date va


rezulta de fapt un sistem de baze de date, având în compunere toate cele trei
elemente date de arhitectura de mai sus.

1.1.2. Baze de date


Baza de date (BD) este una din componentele unui SBD, şi anume cea
referitoare la date.
Baza de date este un ansamblu de colecţii de date:
 organizat, pe niveluri de organizare a datelor in memoria externă;
 coerent, conform unor restricţii de integritate;
 structurat, conform unui model de date;
 cu o redundanţă minimă şi controlată, asigurată prîntr-o tehnică de
proiectare;
 accesibil mai multor utilizatori in timp util.

6
Visual Foxpro

Nivelurile de organizare a datelor în baze de date sunt:

 conceptual, dat de viziunea administratorului bazei de date;


 logic, dat de viziunea programatorului de aplicaţii;
 fizic, dat de viziunea inginerului de sistem.

Modelul de date este un ansamblu de concepte şi instrumente pentru


realizarea unei scheme conceptuale de bază de date. Această schemă permite
descrierea fenomenelor din lumea reală prin entităţi care au atribute şi valori,
împreună cu legăturile dintre entităţi.
Un model de date pentru baze de date are următoarele elemente
obligatorii:

 definirea structurii modelului, care presupune definirea obiectelor


(entităţilor) şi a caracteristicilor (atributelor) lor, precum şi definirea
legăturilor (asocierilor) între obiecte;
 operatorii, care acţionează asupra structurilor de date;
 regulile de integritate, care asigură corectitudinea datelor.

Modelele de date pentru baze de date pot fi de următoarele tipuri


(fundamentale): ierarhice, reţea, relaţionale, orientate obiect.
Modelul ierarhic. Datele sunt reprezentate după structura unui arbore.
Legăturile dintre date sunt ordonate unic, orice acces făcându-se prin vârful
ierarhiei (rădăcină).
Un subordonat nu poate avea decât un singur superior, iar un superior
poate avea oricâţi subordonaţi.
Modelul reţea. Datele sunt reprezentate prîntr-o mulţime de ierarhii
legate între ele. Un nod al reţelei poate avea oricâţi subordonaţi şi oricâţi
superiori. La un subordonat se poate ajunge pe mai multe căi.
Modelul relaţional. Datele sunt reprezentate sub forma unor tabele
(relaţii). Tabela este o submulţime a produsului cartezian a unor domenii de
valori. În tabelă sunt coloane (atribute-caracteristici) şi linii (tupluri-
înregistrări). Legăturile între tabele sunt logice, realizate prin valori.

7
Baze de date

Modelul orientat obiect. Structura de baza folosită este cea de clasă de


obiecte, definită prin abstractizarea entităţii fizice din lumea reală. Obiectele
sunt o colecţie de proprietăţi care se referă la aceeaşi entitate, împreună cu
operaţiile permise (metodele). Comunicarea între obiecte se face prin mesaje
(cereri de regăsire). Caracteristicile fundamentale ale obiectelor sunt:
încapsularea, polimorfismul, succesiunea.

1.1.3. Principalele concepte din teoria relaţională


Înainte de a începe să realizăm o aplicaţie cu baze de date relaţionale
trebuie să cunoaştem principalele concepte din teoria relaţională.
Acestea sunt absolut necesare, atât pentru analiza şi proiectarea bazei de date
relaţionale, cât şi pentru elaborarea programelor de aplicaţie într-un SGBD
relaţional ales. Prezentăm în continuare aceste concepte:
DOMENIUL reprezintă un ansamblu de valori, caracterizat printr-un
nume. Domeniul se poate defini explicit, prin enumerarea tuturor valorilor care
aparţin acestuia, sau implicit, prin precizarea proprietăţilor pe care le au
valorile domeniului respectiv.
RELAŢIA (tabela) reprezintă un subansamblu al produsului cartezian
dintre mai multe domenii caracterizat printr-un nume.
ATRIBUTUL este coloana unei relaţii caracterizate printr-un nume.
Fiecare atribut îşi ia valorile dintr-un domeniu. Mai multe atribute pot lua valori
din acelaşi domeniu.

TUPLUL este linia dîntr-o relaţie şi nu are nume. Valorile dintr-un tuplu
aparţin produsului cartezian dintre domeniile relaţiei.

SCHEMA RELAŢIEI este un ansamblu format din numele relaţiei (R)


urmat între paranteze rotunde de lista atributelor (Ai), pentru fiecare atribut
precizându-se domeniul asociat (Di):

R (A1: D1, A2: D2, . . ., An: Dn ),


unde nm sunt numere întregi.

8
Visual Foxpro

CHEIA este un atribut sau un ansamblu de atribute cu ajutorul căruia


se poate identifica un tuplu dîntr-o relaţie.
Cheia este primară, dacă identificarea este unică, adică există un
singur tuplu cu o anumită valoare pentru cheie.
Cheia este simplă, dacă este formată dintr-un singur atribut.
Cheia este compusă, dacă este formată dintr-un ansamblu de atribute.
Cheia este externă într-o relaţie R1 dacă ansamblul de atribute care o
defineşte ia valori din aceleaşi domenii ca şi cheia primară a unei alte relaţii R2,
şi dacă are rolul de a stabili o legătură (asociere) între cele două relaţii.

1.2. SISTEME DE GESTIUNE A BAZELOR DE DATE RELAŢIONALE


VISUAL FOX PRO

1.2.1. Caracteristici generale ale SGBD Visual FoxPro


FOXPRO este un Sistem de Gestiune a Bazelor de Date Relaţionale,
pentru microcalculatoare IBM-PC şi cele compatibile cu acestea.
Produsele elaborate după modelul conceptual relaţional au început cu
dBASE în versiunile II, III, III+, IV, aparţinând iniţial firmei Ashton Tate, iar în
prezent ale firmei Borland şi au continuat cu FOX în diferite versiuni concepute
de către firma Fox Software, ulterior achiziţionate de cea mai mare filială din
domeniul software-ului, Microsoft.
FoxPro încă de la primele versiuni 1.0 şi 2.0 s-a impus pe piaţa SGBD-
urilor pe PC. Cumpărarea şi dezvoltarea lui de către firma Microsoft a condus
la apariţia versiunilor 2.5 şi 2.6, care au determinat utilizarea pe scară largă la
proiectarea de aplicaţii în diverse domenii.

FoxPro în versiunile 2.5 şi 2.6 este conceput pentru a lucra fie sub
sistemele de operare DOS sau UNIX (în modul de lucru caracter), fie sub
WINDOWS sau MACINTOSH (în modul de lucru grafic).
Din concurenţa firmelor de soft Borland (cu produsele dBASE şi Para-
dox) Nantucket (cu produsul Clipper) şi Microsoft (cu produsul FoxPro) s-a

9
Baze de date

ajuns la versiunea FoxPro care oferă posibilitatea transferului de elemente


(ecrane, rapoarte, proiecte) între versiunile FoxPro care lucrează sub diferite
sisteme de operare.
Să amintim că principalele rivale în domeniul limbajelor de programare sunt
firmele Microsoft şi Borland. Referindu-ne la SGBD-uri, politica firmei
Microsoft de a dezvolta produsul FoxPro pe baza dBASE-ului, are ca scop
atragerea utilizatorilor care proiectează aplicaţii folosind SGBD-ul FoxPro.

FoxPro prin ultimele versiuni în varianta VISUAL FOXPRO este considerat


cel mai performant din familia amintită, datorită următoarelor caracteristici
principale:

 Dispune de tehnici de optimizare dintre care cea mai importantă este


tehnica Rushmore, prin care se realizează compresarea indecşilor,
efectul fiind reducerea dimensiunii fişierelor index până la 80%;

 Prin noile tehnologii de acces la date, Rushmore, creşte cu mult


viteza de prelucrare faţă de SGBD-urile dBASE4 şi PARADOX;

 Poate fi utilizat sub sistemele de operare Unix, Windows'95,'98 şi


Windows NT;

 Dispune de un limbaj procedural propriu foarte performant care


asigură descrierea şi manipularea datelor, ca şi de un nucleu al
limbajului neprocedural SQL (Stnucture Query Language). Aceste
limbaje se adresează profesioniştilor, asigurând utilizarea şi
dezvoltarea de programe de mare complexitate;

 Pentru a se adresa unei game largi de utilizatori sistemul FoxPro are


componente ce cuprind atât produse soft apelabile de la tastatură
cât şi cu ajutorul mouse-lui;

 Poate importa fişiere din EXCEL versiunile 3.0, 4.0 şi 5.0, PARADOX
versiunile 3.5 şi 4.0, Multiplan, Lotus şi Symphony;

 Dezvoltă programe structurate de cel mai înalt nivel (utilizând


comenzile pentru realizarea structurilor secvenţiale, alternative şi

10
Visual Foxpro

repetitive) şi modularizate (prin scrierea programelor sub formă de


proceduri);

 FoxPro, în funcţie de cerinţe, poate fi instalat în întregime sau numai


modulele necesare aplicaţiei;

 Se livrează pentru PC-uri pe 16 şi 32 biţi;

 Poate fi utilizat pe staţii de lucru individuale sau în reţea (avantajul


fiind - creşterea eficienţei de utilizare a resurselor sistemului;

 Simplifică accesul la fişierele de date din alte SGBD-uri compatibile


ODBC(Open Database Compatibility), cum sunt ACCESS, PARADOX,
DBASE, etc. fără a mai fi necesară o conversie a lor;

 Are peste 100 comenzi şi funcţii în plus faţă de SGBD-urile din


aceeaşi familie. Dintre acestea, de reţinut comanda BROWSE FOR;

 Asigură obţinerea unor viteze mari la executarea funcţiilor specifice


bazelor de date;

 Utilizează concepte ale programării orientate obiect, iar în versiunea


Visual FoxPro 6.0 permite elaborarea de programe orientate obiect;

 În modelul bazei de date s-a introdus conceptul de dicţionar (un


depozit central pentru stocarea informaţiilor despre tabelele de
date), care gestionează -nume lungi de câmpuri de date (128
caractere), valori prestabilite pentru acestea, reguli de validare şi
alte operaţii;

 Componenta PROJECT MANAGER (Gestionarul de proiecte) a fost


reproiectată pentru a gestiona fişierele aplicaţiilor după tipul lor,
precum şi pentru a compila şi executa module individuale;

 Oferă posibilităţi de utilizare în universul CLIENT/SERVER, prin care


programatorii transferă funcţiile aplicaţiilor cu baze de date de pe
staţiile de lucru către server, reducând astfel solicitările de resurse
într-o reţea de calculatoare;

11
Baze de date

 Utilizează o mulţime de "asistenţi" (wizards) pentru dezvoltarea


aplicaţiilor practice, prin crearea tuturor componentelor importante
ale acestora, reducând foarte mult timpul de proiectare a lor şi
permiţând crearea de prototipuri funcţionale;

 Oferă posibilitatea de a utiliza programe fără a dispune pe


calculatorul propriu de o versiune completă Visual FoxPro.

1.2.2. Funcţiile SGBD-ului Visual FoxPro


Principalele funcţii ale SGBD-ului Visual FoxPro sunt:
 Descrierea structurii tabelelor din cadrul bazei de date.

 Actualizarea bazei de date prin adăugare, modificare, ştergere de


înregistrări.

 Interogarea bazei de date utilizând atât limbajul propriu, cât şi


limbajul SQL.

 Asigurarea dialogului, sistem utilizator prîntr-o interfaţă dezvoltată


faţă de alte SGBD-uri.

 Utilizare tehnicilor avansate de regăsire, selectare şi grupare a


datelor.

12
Visual Foxpro

CAPITOLUL 2

SISTEMUL DE GESTIUNE A BAZELOR DE DATE VISUAL


FOXPRO 6.0

2.1. PREZENTAREA SISTEMULUI VISUAL FOXPRO

Componenţa unui sistem de bază de date care are rolul de a permite


descrierea şi manipularea datelor conform unui model de date este sistemul de
gestiune a bazelor de date (SGBD).

În momentul actual, în lume, cea mai mare parte a SGBD-urilor care se


utilizează sunt bazate pe modelul relaţional.

Visual FoxPro (VFP) este un SGBD relaţional cu limbaj propriu, care


suportă un nucleu extins din limbajul relaţional SQL (Structured Query
Larnguage). Versiunile "Visual" de FoxPro au însemnat un salt în ceea ce
priveşte tratarea obiectelor (programare vizuală), extinderea facilităţilor oferite
de generatoare şi extinderea nucleului SQL. Tendinţa impusă de firma
Microsoft (cea care a dezvoltat versiunile VFP) este de a evolua VFP de la un
SGBD minimal relaţional spre unul complet relaţional.

VFP este un sistem rapid, modularizat, flexibil, nu cere resurse de calcul


foarte mari, îmbină programarea procedurală (prin limbajul propriu foarte
puternic şi uşor) cu cea descriptivă (prin programarea vizuală).

Ca SGBD relaţional VFP este unul dintre cele mai utilizate atât în lume
cât şi în ţară noastră. El se recomandă pentru dezvoltarea aplicaţiilor cu baze
de date în instituţii şi întreprinderi mici şi mijlocii pe microcalculatoare ca staţii
de lucru individuale sau conectate in reţea locală (LAN - Local Area Network).

13
Baze de date

Faptul că VFP este unul dintre cele mai utilizate SGBD relaţionale este
demonstrat, printre altele de decizia Microsoft de a dezvolta acest produs în
mod continuu, în condiţiile în care firma avea deja un produs similar (ACCESS).

Prin facilităţile sale VFP este destinat tuturor categoriilor de utilizatori


care vor să lucreze cu aplicaţii cu baze de date. Astfel, utilizatorii
neinformaticieni au la dispoziţie o gamă largă de generatoare (pentru ecrane,
meniuri, rapoarte etc.), precum şi asistentul Wizard. De asemenea, utilizatorii
de specialitate (informaticienii) pot dezvolta programe (în limbajul propriu şi în
SQL) şi aplicaţii (prin componentele DESIGNER, APPL1CATlON etc.). În sfârşit,
administratorul bazei de date are la dispoziţie instrumente oferite de VFP
pentru asigurarea securităţii şi integrităţii datelor (drepturi de acces,
concurenţa la date, integritatea semantică a datelor etc.), pentru obţinerea
unor situaţii Statice, pentru refacerea bazei de date etc.

2.2. EVOLUŢIA SISTEMULUI VISUAL FOXPRO

La sfârşitul anilor '70, a apărut un produs software care îşi propunea să


rezolve problemele de gestiune ale unei firme mici pe microcalculatoare. Acest
produs se numea dBASE II şi era lansat de firma Ashton-Tate (ulterior preluat
de firma Borland). Momentul coincidea cu apariţia microcalculatoarelor şi a
SGBD-urilor relaţionale.

Pornind de la dBASE, firma Fox Software creează un produs numit


FoxBase, mult mai rapid decât părintele lui. Din dBASE au fost dezvoltate şi
alte produse similare, toate alcătuind gama dBASE. În anii '80, produsul
software Fox a fost dezvoltat ţinând cont de contextul informatic:

- expansiunea microcalculatoarelor pe cele două direcţii: IBM PC şi


Apple;

14
Visual Foxpro

- dezvoltarea în forţă a tot mai multe SGBD relaţionale (teoria


relaţională fusese finalizată în anii '70 şi acum se produceau SGBD-
uri1e aferente);
- căutarea unor soluţii informatice optime pentru firmele mici şi
mijlocii.
Ţinând cont de aspectele de mai sus, Fox a fost dezvoltat ca o soluţie
software care a pornit de la cerinţele beneficiarilor (firmele mici şi mijlocii)
privind gestionarea datelor pe microcalculatoare şi ţinând cont de teoria
relaţională. A rezultat un SGBD pseudorelaţional, dar deosebit de rapid, cu
instalare uşoară şi flexibilă, care cere resurse de calcul minime. Aceste facilităţi
au făcut din firma Fox Software unul dintre cei mai buni producători de
produse similare pe piaţa mondială.

În anul 1984, firma a dezvoltat produsul creând FoxPro V1.0 sub WS-
DOS. În 1991, apare FoxPro 2.0, care devenise lider autoritar al produselor de
acest gen. Versiunea 2.0 se distanţează de restul produselor de acest gen, ca
superioară, prin următoarele facilităţi: tehnica de optimizare Rushmore pentru
regăsire, tehnici de compresie a fişierelor de index (cu până la 80%), interfaţă
cu limbajul de programare universal C, instrumente şi interfeţe dintre cele mai
diverse, adăugarea unor noi elemente relaţionale (devine un SGBD minimal
relaţional).
În 1995, Microsoft lansează versiunea revoluţionară Visual FoxPro 3,
care a fost apoi urmată de versiunea 5, în 1997. Visual FoxPro 6, a fost
lansată în septembrie 1998 în cadrul pachetului Visual Studio 6.O. Acesta este
destinat specialiştilor şi conţine alături de Visual FoxPro şi alte produse tip
Visual: Basic, C++, Java ++, InterDev. Toate aceste produse, deci şi Visual
FoxPro 6, oferă compilări foarte rapide (optimizate), depanare eficientă şi
interactivă, HTML (Hyper Text Markup Language) ca interfaţă pentru aplicaţii
tip multimedia, interoperabilitate, simplitate şi compatibilitate în realizarea de
aplicaţii cu toate produsele din pachetele STUDIO şi OFFICE, dezvoltarea
aplicaţiilor în reţea în arhitecturi DNA (Distributed interNet Application)

15
Baze de date

structurată pe trei niveluri (date, procese, interfeţe utilizator), utilizarea unor


instrumente universale din tehnologia orientată pe obiecte (ADO - Active Data
Object, COM - Component Object Model).

2.3. NOUTĂŢI VISUAL FOXPRO FAŢĂ DE FOXPRO 2.X

Prin versiunile de Visual, firma Microsoft aduce FoxPro la statutul de


SGBD complet relaţional, producându-se un salt calitativ semnificativ. În acest
sens, prezentăm câteva noutăţi aduse de versiunile de Visual FoxPro faţă de
versiunile de FoxPro 2.x.
1. Adăugarea facilităţilor de programare orientă pe obiect la facilităţile
de programare procedurală (limbajul propriu) şi descriptivă (nucleul SQL)
existente deja.
În versiunile de Visual FoxPro există cea mai bună implementare a
tehnologiei orientate pe obiect din gama produselor xBASE.
2. Integrarea aplicaţiei în arhitectura client/server prin: actualizarea
viziunilor la distanţă, accesul la nivel de rând la distanţă etc.
3. Introducerea stilului de programare vizuală, care permite dezvoltarea
unor programe de interfeţe, scriind puţin cod sursă sau deloc.
4. Lucrul cu evenimente pe baze de date (modelul Evenimentelor
FoxPro) prin declanşatori (triggers).
5. Utilizarea explicită a noţiunii de dicţionar de date, care suportă
validarea regulilor (atât la nivel de câmp, cât şi de înregistrare) şi a
declanşatorilor (adăugare, modificare, ştergere).
6. Facilităţi de descriere şi prelucrare a obiectelor vizuale sau
nonvizuale, organizate în clase. Sunt implementate caracteristicile de bază ale
obiectelor: încapsularea, moştenirea.
7. Lucrul cu tehnologia ActiveX (ca succesor pentru OLE – Object
Linking & Embedding), care se referă la faptul că obiectele evoluate din
biblioteci pot fi dezvoltate prin moştenire în aplicaţii. Pornind de la controalele

16
Visual Foxpro

ActiveX existente deja în sistem se pot crea clase noi (începând cu VFP 5.0).
Tehnologia se încadrează în limbaje pentru scenarii (script) din generaţia a
treia de Internet, având rol de comunicare între aplicaţii la nivel de obiect.

8. Facilităţi noi şi eficiente de depanare interactivă (debugger).

9. Integrarea facilităţilor oferite VFP pentru baze de date cu facilităţile


oferite de alte produse Microsoft (cele din pachetele Visual Studio şi 0ffice).
În VFP 6.0 integrarea şi interoperabilitatea sunt noţiuni intens utilizate.

10. Facilităţi de dezvoltare pentru aplicaţii tip Internet (mult dezvoltate


în VFP 6.0).

11. Utilizarea pe scară largă a standardelor (COM – Component Object


Model, HTML – Hyper Text Markup Language, DNA - Distributed interNet
Application etc.).

12. Viteză, conectivitate, comunicare, flexibilitate sporite.

13. Restricţii de integritate noi: valoarea NULL, CHECK şi cele pe cheie


(PRIMARY, UNIQUE, REFERRENCES).

14. O parte dintre noţiunile "tip obiect" din FoxPro 2.x sunt tratate în
Visual FoxPro ca obiecte: buloanele, imaginile (Picture), OLE.

Comenzile de I/E standard (0... SAY/GET, READ) rămân, dar apar şi obiecte
noi similare (Text Box, Label etc.).

15. Tipuri noi de date: pentru data calendaristică (DateTime), pentru


date numerice (Cmrency, Double, Float, Integer, Numeric).

16. Aplicaţiile din 2.x pot fi rulate în VisuaIFoxPro cu foarte puţine


modificări sau deloc, putându-se face şi o conversie vizuală sau funcţională.

17. Lucrul explicit cu noţiunea de bază de date (CREATE DATABASE),


fişier de tip .DBC. Baza de date (tabelele, legăturile dintre ele, viziunile) poate
fi întreţinută cu Database Designer. Se menţin astfel automat restricţiile de
integritate (actualizarea automate pe legăturile existenţe Referentia( Integrity
Builder).

17
Baze de date

18. Lucrul în arhitectura WINDOWS DNA (Distributed interNet


Application), începând cu versiunea 6.

2.4. Lansarea SGBD-ului Visual Foxpro 6.0. Meniul sistem. Fereastra


de comenzi.

SGBD-ul Visual Foxpro 6.0 face parte din pachetul de aplicaţii Visual Studio
6.0 şi poate fi lansat în execuţie din meniul Programs, submeniul Visual Studio
6.0, aplicaţia Visual Foxpro 6.0. Odata lansat în execuţie, apărea fereastra
sistem, care are următoarele elemente:

 Meniul system – unde se află toate submeniurile ce pot fi folosite în


Foxpro

 Fereastra de comenzi - unde se introduce comenzile pe care Foxpro le


execută

 Zona de afişare – unde se afişează toate informaţiile dorite, după


execuţia comenzilor.

18
Visual Foxpro

Crearea tabelelor direct din meniul


system.
Pentru a crea în Visual Foxpro o tabelă
în care vom memora datele referitoare la
studenţii dîntr-o facultate, putem proceda
astfel:

 din meniul FILE al sistemului


alegem opţiunea NEW, iar din
fereastra de dialog afişata pe
ecran, selectăm butonul radio
Table.
 Acţionam butonul New file
 În fereastra apărută pe ecran vom specifica numele tabelei pe care
vrem să o creem şi locul unde va fi salvată aceasta (exemplu:
numele tabelei este STUDENTI.DBF, iar locul în
C:\STUDENTI\GRUPA116S1).

19
Baze de date

 După apariţia ferestrei, pe fiecare linie, vom introduce datele pe care le


considerăm necesare despre fiecare student. Mai exact fiecare linie a
acestei ferestre va descrie câte un câmp al tabelei. De exemplu:

o În coloana NAME vom introduce numele câmpului


o În coloana TYPE vom introduce tipul de date al câmpului
respectiv
o În coloana WIDTH şi eventual DECIMAL vom introduce
dimensiunea maximă a câmpului, eventual numărul de
zecimale (atunci când este vorba despre date numerice)
o În coloana INDEX vom specifica dacă este vorba despre un
câmp de tip index, adică dacâ pe baza informaţiilor ce vor fi
ulterior introduce în acest câmp, vom ordona informaţiile din
întreaga tabela
o În coloana NULL vom preciza dacă în câmpul respectiv va fi
permisă valoarea vidă.

20
Visual Foxpro

 După apăsarea butonului OK va apărea o fereastră de continuare, în


care se va alege dacă se vor introduce date în noua tabelă sau nu
(deocamdată).

 Dacă se alege varianta de introducere a informaţiilor în noua tabelă,


adică se apasă pe butonul Yes, atunci va apărea fereastra de
introducere de informaţii. Închiderea ferestrei, împreună cu salvarea
datelor introduce se va face folosind combinaţia de taste CTRL+W
(Window).
 Afişarea informaţiilor în zona de lucru se face prin intermediul comenzii
LIST.

21
Baze de date

2.5. Comenzi pentru crearea şi modificarea tabelelor

2.5.1. Pentru a crea o tabela, fără a utiliza meniul system, putem folosi
comanda:
CREATE <nume.DBF>

Pentru a creea baza de date STUDENTI.DBF, vom


Exemplu:
scrie în fereastra de comenzi, următoarea comandă:
CREATE STUDENTI.DBF
Paşii ce trebuiesc executaţi în continuare fiind aceeaşi cu cei prezentaţi mai
sus.

2.5.2. Pentru a modifica structura unei baze de date deja create, vom folosi
următoarea comandă:

MODIFY STRUCTURE
<nume_bd.DBF>
Exemplu: Pentru a modifica baza de date STUDENTI.DBF, vom
scrie în fereastra de comenzi, următoarea comandă:
MODIFY STRUCTURE STUDENTI.DBF
Efectul acestei comenzi va fi apariţia ferestrei iniţiale de introducere a
structurii bazei de date, cu ajutorul căreia putem să modificăm, să adăugăm
sau să ştergem câmpuri ale bazei de date. După introducerea modificărilor
dorite, în baza de date toate informaţiile vor fi modificate în funcţie de noua
structură.
Exemplu: Dacă dorim să introducem un nou câmp cu denumirea CNP (Cod
Numeric Personal), de tip Numeric, dimensiune maximă 13, vom adăuga acest
câmp la sfârşit, sau între câmpurile deja existente. Apoi, prîntr-o comandă de
editare şi modificare vom introduce noile informaţiile pentru fiecare
înregistrare a tabelei. Modificarea structurii tabelei poate duce la pierderea
informaţiilor din baza de date.

22
Visual Foxpro

2.5.3. Deschiderea şi închiderea unei tabele

Pentru a folosi a tabela trebuie, mai întâi să o deschidem în zona de lucru.


Acest lucru se face prin utilizarea comenzii USE:

USE <nume_bd. DBF>

Închiderea unei singure tabele se face prin utilizarea comenzii CLOSE ALL:
CLOSE ALL

2.5.4. Vizualizarea informaţiilor dîntr-o tabelă

Pentru a afişa informaţiile conţinute de o tabelă se pot utiliza comenzile LIST


şi DISPLAY.

LIST / DISPLAY [<lista_expresii>][<domeniu>]


[FOR <conditie>][OFF]

Dacă nu se foloseşte nici o clauză (toate fiind opţionale), atunci


comanda LIST va afişa conţinutul întregii tabele, iar DISPLAY, doar
înregistrarea curentă.
Clauza <lista_expresii> se foloseşte pentru a specifica câmpurile pe
care dorim să le afişam. Clauza OFF nu mai permite afişarea numărului
înregistrarii în faţa fiecarei linii a tabelului. Clauza <domeniu> poate avea
valorile:
ALL – specifică toate înregistrările tabelei
NEXT <n> - următoarele <n> înregistrări faţă de cel current
REST – toate înregistrările până la sfârşitul tabelei
RECORD <n> - selectează doar înregistrarea cu numărul <n>
Clauza FOR <condiţie> permite selectarea înregistrărilor care verifică
condiţia, pe domeniul indicat sau pe cel implicit.

23
Baze de date

Exemplu: În tabela STUDENTI.DBF, vrem să afişăm:

 Toate înregistrările
 Toate înregistrările fără numă înregistrării
 Doar câmpurile nume, prenume şi media
 Studenţii din doar din grupa 116A
În fereastra de comenzi, scriem în ordine următoarele comenzi:

USE STUDENTI.DBF
LIST && Comanda LIST are domeniul implicit ALL
GO TOP && Se pozitioneaza pe prima înregistrare
LIST OFF
GO TOP
LIST FIELDS NUME, PRENUME, MEDIA && clauza FIELDS specifica
denumirile câmpurilor dorite pentru afisare
GO TOP
LIST FOR GRUPA=’116A’ && valorile de tip character se scriu intre ’ ’

2.6. Tipuri de date

Numim tip de date o caracteristică ce stabileşte modul în care


informaţia este înregistrată pe suportul de memorare şi modul în care este
interpretată şi prelucrată. În Visual Foxpro sunt implementate următoarele
tipuri de date predefinite:
 tipul numeric
 tipul întreg (Integer)
 tipul numeric simplu (Numeric sau Float)
 tipul numeric dublu (Double)
 tipul monetar (Currency)
 tipul logic (Logical)
 tipul şir de caractere (Character)
 tipul de date pentru gestiunea timpului
 tipul de date calendaristică (Date)

24
Visual Foxpro

 tipul moment de timp (Date time)


 tipul Memo
 tipul General

2.6.1. Tipurile de date numerice

Se folosesc pentru a introduce şi ulterior a prelucra informaţii numerice.


Fiecare subtip se memorează pe 8 octeti, iar precizia calculelor poate fi de
până la 16 cifre zecimale.
Atunci când folosim date de tip întreg este important modul în care
evaluăm expresiile care conţin aceste date. Expresiile pot să aibă operanzi de
tip numeric ce pot fi: constante, variabile, câmpuri ale unor tabele sau funcţii
care returnează valori de tip numeric. Prezentăm în continuare operatorii care
pot fi folosiţi în expresii de tip numeric, împreună cu priorităţile lor:

Operator Semnificaţie
() paranteze pentru gruparea expresiilor
**, ^ ridicare la putere
*, /, % înmulţire, împărţire, modulo (restul împărţirii)
+, - adunare, scădere

Prioritatea în acest scade de sus în jos, iar pe acelaşi nivel de prioritate,


evaluarea se face de la stânga la dreapta, în ordinea apariţiei operatorilor în
cadrul expresiei.

Exemplu: Pentru expresia 15-4*(3^2)+21%4*2, se evaluează în


următorii paşi:
15-4*9+21%4*2
15-36+21%4*2
15-36+1*2
15-36+2
-21+2
-19

25
Baze de date

În afară de aceşti operatori se mai pot utiliza operatorii relaţionali:

Operator Semnificaţie
< mai mic
> mai mare
<= mai mic sau egal
>= mai mare sau egal
== egal cu
<>, !=, != diferit

Prezentăm în continuare funcţii care prelucrează date de tip numeric:

 Funcţia MOD() având sintaxa: MOD(<expN1>,<expN2>


)
returnează restul obţinut prin împărţirea expresiei numerice <expN1> la
expresia numerică <expN2>, rezultatul fiind tot o valoare numerică. In fapt
această funcţie efectuează aceeaşi cerintă ca şi operatorul %.

Exemplu: Afişăm pe ecran următorele expresii de tip numeric:

? MOD(46,3)
1
? MOD(25.0,5.0)
0
 Funcţia ABS() care returnează valoarea absolută a unui număr, are
următoarea sintaxă:
ABS(<expN>)

primeşte argumentul <expN> şi returnează o valoarea numerică ce reprezintă


valoarea absolută argumentului.

Exemplu:

?ABS(12.34)
12.34

26
Visual Foxpro

?ABS(-12.34)
12.34

 Funcţia SIGN() returnează semnul numărului transmis ca parametru:


Valorile returnate sunt:
1 dacă <expN> > 0;
SIGN(<expN>)
0 dacă <expN> = 0 sau
–1 dacă <expN> < 0.

Exemplu:

? SIGN(14)
1
? SIGN(-14)
-1
? SIGN(0)
0
 Funcţia INT() returnează partea întreagă a unei expresii numerice:

Exemplu: INT(<expN>)

?INT(45.89)
45
?INT(-8.34)
-8
x=12.34
?’Partea fractionara a numarului ’,x,’ este ’,x-INT(x)

 Funcţiile CEILING() şi FLOOR() se folosesc pentru a returna valoarea prin


aproximarea prin lipsă, respectiv adaus a unei expresii numerice date ca
parametru:

27
Baze de date

returnează cel mai apropriat număr


CEILING(<expN>
) întreg mai mare sau egal cu <expN>

FLOOR(<expN>) returnează cel mai apropriat număr


întreg mai mic sau egal cu <expN>
Exemplu:
?CEILING(48.43)
49
?CEILING(-5.35)
-5
?FLOOR(48.43)
48
?FLOOR(-5.35)
-6
 Funcţii matematice elementare şi funcţii trigonometrice:

EXP(<expN>)
returnează exponenţiala: ex

LOG(<expN>)
returnează logaritm natural: lnx

LOG10(<expN>)
returnează logaritm zecimal log(x)

SQRT(<expN>)
returnează radical din x

SIN(<expN>)
returnează sinus(x)

COS(<expN>)
returnează cosinus(x)

TAN(<expN>)
returnează tangenta de x

28
Visual Foxpro

2.6.2. Tipul şir de caractere

În şir de caractere reprezintă o mulţime ordonată de caractere care se


tratează ca un tot unitar. Într-un şir de caractere, ordinea acestora fiind
esenţială, fiecărui caracter i se va asocia un număr reprezentând poziţia
caracterului în şir:- primul caracter va avea poziţia 1, - al doilea caracter va
avea poziţia 2, ş.a.m.d. Numărul de caractere dintr-un şir reprezintă lungimea
şirului. Constantele de tip şir de caractere se scriu între apostrofuri simple sau
duble.
Exemplu: ‘Student’  “Student”
O expresie de tip şir de caractere este o combinaţie de operanzi şi
operatori şi care are ca rezultat tot un şir de caractere.
Operanzi pot fi:
- câmpuri de tip şir de caractere ale unei tabele
- funcţii care returnează şiruri de caractere
- variabile şi constante de tip şir de caractere
Operatori pot fi de două tipuri:

Operator Semnificaţie
+ operator de concatenare simplu
- operator de concatenare special

a) Operatorul de concatenare simplu alipeşte două şiruri de caractere:


Exemplu: “Facultatea ”+”de Automatică”  “Facultatea de Automatică”
b) Operatorul de concatenare special este la fel ca şi cel simplu, cu deosebirea
că spaţiile de la sfâşitul primului şir de caractere sunt trecute la sfârşitul celui
de-al doilea şir de caractere.
Exemplu:
“Universitatea ”+” Constantin Brâncuşi”  “Universitatea Constantin Brâncuşi”
Operatorii care se pot folosi pentru a prelucra date de tip şir de
caractere, sunt: Operator Semnificaţie
$ inclus în
< mai mic
29
> mai mare
<= mai mic sau egal
Baze de date

Operatorul ‘$’ returnează valoarea adevărat dacă primul şir de caractere


este inclus(conţinut) în cel de-al doilea şir de caractere,
Exemplu: altfel returnează fals.

Expresia “calcul” $ ”calculator” este adevărată, expresia “calcule” $ ”calculator”


este falsă.
Compararea a două şiruri de caractere se face la nivel de cod ASCII pentru
fiecare caracter din cele două şiruri.

Prezentăm în continuare funcţii care prelucrează date de tip şir de


caractere:
 Funcţia CHR() returnează caracterul ASCII corespunzător parametrului:

Exemplu: CHR(<expN>)

?CHR(49)
1
?CHR(65)==’A’
.T.

 Funcţia ASC() este inversă, ca efect, cu CHR(), deoarece returnează codul


ASCII al caracterului dat ca <expN>:
ASC(<expN>)

Exemplu:

30
Visual Foxpro

?ASC(‘A’)
65
?ASC(‘salt’)==ASC(‘student’)
.T.

Observaţie: Funcţiile CHR şi ASC sunt funcţii care au acţiuni inverse. Astfel se
pot scrie următoarele expresii:
Exemplu:
?’A’==CHR(ASC(‘A’))
.T.
?65==ASC(CHR(65))
.T.

Funcţii referitoare la subşirurile de caractere

Un subşir al unui şir este o porţiune din şirul dat, începând de la o


poziţie specifictă şi având o lungime dată. Cu ajutorul acestor funcţii se pot:
- extrage subşiruri dintr-un şir
- testa inclusiuni ale unui şîr în alt şir
- număra apariţiile unui şir în alt şir
-
 Funcţia SUBSTR() extrage un subşir dintr-un şir dat:

SUBSTR(<expC>,<expN1>[,<expN2>])

unde <expC> reprezintă şirul (expresia) din care se extrage subşirul


<expN1> precizează poziţia de unde începe subşirul de extras
<expN2> reprezintă numărul de caractere ce se extrag (adică lungimea
subşirului)

31
Baze de date

Dacă <expN2> lipseşte, atunci subşirul se întinde până la sfârşitul şirului dat.

Exemplu:

?SUBSTR(‘VISUAL’,2,3)
ISU
?SUBSTR(‘SGBD VISUAL FOXPRO’,6)
VISUAL FOXPRO

 Funcţiile LEFT() şi RIGHT() au ca efect tot extragerea unui subşir dintr-un


şir dat ca parametru.

LEFT(<expC>,<expN>) RIGHT(<expC>,<expN>)

Unde : <expC> reprezintă şirul de caractere de unde se extrage subşirul


<expN> reprezintă lungimea subşirului extras

Exemplu:

?LEFT(‘BAZE DE DATE’,4)
BAZE
?RIGHT(‘BAZE DE DATE’,4)
DATE

Se poate crea un şir din alt şir prin repetarea şirului dat de un număr de ori
specificat – folosind funcţiile REPLICATE() şi SPACE():

 Funcţia REPLICATE() returnează un şir de caractere obţinut prin repetarea


şirului <expC> de <expN> ori:

32
Visual Foxpro

REPLICATE(<expC>,<expN>)
Exemplu:

?REPLICATE(‘R ’,6)
RRRRRR

 Funcţia SPACE() returnează un şir de spaţii de lungime dată de <expN>:

Exemplu: SPACE(<expN>)

?SPACE(6)  cu ?REPLICATE(‘ ’,6)

‘ ‘
Alte funcţii care prelucrează şiruri de caractere:

Funcţie Semnificaţie
LEN(<expC>) returnează lungimea şirului dat ca parametru
ISALPHA(<expC>) returnează adevărat dacă şirul de caractere
începe cu un caracter de tip alfabetic, altfel fals
ISDIGIT(<expC>) returnează adevărat dacă şirul de caractere
începe cu o cifră, altfel fals
ISLOWER(<expC>) returnează adevărat dacă şirul de caractere
începe cu o literă mică, altfel fals
ISUPPER(<expC>) returnează adevărat dacă şirul de caractere
începe cu o literă mare, altfel fals
LOWER(expC) transformă toate majusculele în litere mici, restul
caracterelor rămânând neschimbate
UPPER(expC) transformă toate literele mici, în litere mari, restul
caracterelor rămânând neschimbate
PROPER(<expC>) transformă primul caracter dintr-un cuvânt în
majusculă (literă), iar restul în litere mici
LIKE(<expC1>,<expC2>) caută dacă expresia <expC1> se află în
<expC2>, dacă se află returnează adevărat, altfel
fals

33
Baze de date

Capitolul 3

Căutare. Sortare. Actualizare.

3.1. Căutare şi pozitionare

Informaţiile într-o tabelă a unei baze de date pot fi cautate şi/sau localizate
în mod secvenţial (dacă informaţiile nu sunt ordonate) sau într-un mod mai
rapid pe baza unui index (atunci când tabela este indexată). Prezentăm în
continuare câteva comenzi şi funcţii de poziţionare pe anumite înregistrări:

LOCATE FOR <conditie>


[<domeniu>]
Folosind această comandă ne putem poziţiona pe prima înregistrare care
îndeplineşte condiţia specificată în condiţia dată. Căutarea se face într-un
domeniu dat, implicit fiind ALL.

Se consideră tabela PERSONAL.DBF cu următoarele


Exemplu:
câmpuri: Marca N(4), Nume C(20), Prenume C(15),
Functie C(15), Salariu N(8), Sectie N(2), Data_n D(8).

Se cere să se poziţioneze cursorul de înregistrare pe prima înregistrare care


îndeplineşte condiţia Student din Grupa 116a.

LOCATE FOR GRUPA=’116a’

CONTINUE

Folosind această comandă, numai după comanda anterioară, se poate


poziţiona cursorul pe următoarea înregistrare care îndeplineşte condiţia
specificată în comanda LOCATE.

Functia LOOKUP(<câmp1>,<expresie>,<câmp2>)

34
Visual Foxpro

Folosind această funcţie putem afişa pe ecran valoarea câmpului <câmp1>


din prima înregistrare găsită în care valoarea câmpului <câmp2> este egală cu
expresia dată <expresie>.

Exemplu: Să se găsească numele primului student care face


parte din grupa 116b

?LOOKUP(NUME,’116b’,GRUPA)
POPESCU
Functia FOUND()

Este o funcţie de tip logic care returnează valoarea .T. dacă înregistrarea
dorită a fost găsită, sau .F. în caz contrar.

Functiile EOF() şi BOF()


Funcţiile EOF() (EOF=End Of File) şi BOF() (Bottom Of File) returnează
valorile .T. dacă cursorul de înregistrare este poziţionat pe ultima înregistrare
sau pe prima, şi valoarea .F. în caz contrar.

GOTO <n>
GO BOTTOM/TOP
Comanda GOTO poziţionează fizic cursorul de înregistrare, pe înregistrarea
cu numărul de ordine <nr>. Folosind BOTTOM sau TOP, se poate face
poziţionarea pe înregistrarea de la începutul tabelei sau pe înregistrarea de la
sfârşitul ei.
SKIP [+/-] <nr>

Comanda SKIP face saltul, de la înregistrarea curentă, peste <nr>


înregistrări, aflate înainte de cea curentă (dacă folosim ‘–‘), sau aflate după
înregistrarea curentă (dacă folosim ‘+’).

Functia RECNO()

Funcţia RECNO() returnează numărul înregistrării curente.

35
Baze de date

3.2. Sortare şi duplicare(copiere)

Sortarea înregistrărilor dîntr-o tabelă se poate efectua folosind


comanda SORT TO, care are următoarea sintaxă:

SORT TO <nume_fisier.DBF> ON <câmp> [/A]


[/D] [/C] [ASCENDING / DESCENDING] [FIELDS
<lista_câmpuri>] [<domeniu>] [FOR <conditie>]
[…]
Comanda SORT TO fără nici o clauză are ca efect ordonarea (sortarea)
crescătoare a informaţiilor din tabela dată după valorile din câmpul
specificat. Sortarea creează, de fapt, o nouă tabelă în care înregistrările
sunt în ordinea dorită.

Exemplu: Folosind tabela STUDENT.DBF să se sorteze în


ordine alfabetică toţi studenţii:
USE STUDENTI.DBF && deschidem baza de date dorita
LIST && comanda LIST are domeniul implicit
ALL

SORT TO STUD1.DBF ON NUME


USE && inchidem baza de date curenta
USE STUD1.DBF && deschidem noua baza
LIST && afisam informatiile din aceasta tabela

Folosind clauzele [/A] [/D] sau [/C] se poate specifica pentru fiecare
câmp în parte sensul ordonării: [/A] = crescător, [/D] = descrescător sau
[/C] = se foloseşte atunci când nu ne interesează tipul literei (litera mare
sau litera mica).
Clauzele ASCENDING / DESCENDING se folosesc pentru toată tabela,
având tot semnificaţia de sortarea crescătoare / descrescătoare.
Celelalte clauze au aceeaşi semnificaţie ca şi alte comenzi prezentate
anterior.

36
Visual Foxpro

Copierea informaţiilor dîntr-o tabelă se poate face folosind comanda


COPY TO, care are sintaxa următoare:

COPY TO <nume_fisier.DBF> [FIELDS


<lista_câmpuri>] [<domeniu>] [FOR <conditie>]
[…]

Comanda COPY TO fără nici o clauză are ca efect duplicarea (copierea)


tabelei curente, cu toate câmpurile şi toate înregistrările sale.

Folosind tabela STUDENT.DBF să se copieze într-o


Exemplu:
altă tabelă numită STUD2.DBF toţi studenţii:

USE STUDENTI.DBF && deschidem baza de date dorita


LIST && comanda LIST are domeniul implicit ALL

COPY TO STUD2.DBF
USE && inchidem baza de date curenta
USE STUD2.DBF && deschidem noua baza
LIST && afisam informatiile din aceasta baza

Clauzele au aceeaşi semnificaţie ca şi pentru alte comenzi prezentate


anterior.

3.3. Comenzi de actualizare înregistrări

 Adăugarea înregistrărilor: APPEND, APPEND FROM, INSERT


 Modificarea înregistrărilor: REPLACE
 Ştergerea înregistrărilor: DELETE, RECALL, PACK, ZAP

37
Baze de date

3.3.1.Adăugarea înregistrărilor: comanda APPEND

Pentru a adăuga înregistrări într-o tabela a unei baze de date, se pot utiliza
mai multe comenzi în funcţie de anume dorim să efectuăm. Astfel, se pot
adăuga interactiv noi înregistrări (folosind comanda BROWSE), se pot adăuga
date dintr-un masiv (tablou aflat în memorie), se pot adăuga date dîntr-o altă
tabela Foxpro, sau dintr-un alt tip de fişier (Excel, Text, etc). Deocamdată
prezentăm doar trei astfel de modaliaţi de adăugare:

APPEND [BLANK]

Comanda APPEND – fără clauza BLANK - determină deschiderea unei


ferestre de editare în care utilizatorul poate introduce, câmp cu câmp
informaţiile înregistrării ce se va adăuga. Folosind clauza BLANK, comanda
APPEND are ca effect adăugarea unei noi înregistrări vide, urmând ca
informaţia utilă să fie introdusă în tabela ulterior, folosind alte comenzi Foxpro.

APPEND FROM <nume_fisier.DBF>


[FOR <conditie>]
[FIELDS <lista_câmpuri>] […]
Comanda APPEND FROM adăuga datele dîntr-o altă tabelă. Implicit va
adăuga toate câmpurile. Folosind clauza FIELDS se vor prelua doar acele
câmpuri specificate în <lista_câmpuri>.
Folosind clauza FOR se vor prelua doar anumite înregistrări, specificate în
<condiţie>.
Tabela STUD2.DBF creată prin copiere din tabela
Exemplu:
STUDENT.DBF, se poate adăuga la tabela
STUDENT.DBF.

38
Visual Foxpro

USE STUDENTI.DBF && deschidem baza de date dorita


LIST && comanda LIST are domeniul implicit ALL

COPY TO STUD2.DBF
APPEND FROM STUD2
LIST && afisam informatiile din baza STUDENT

Cea de a treia modalitate de a adăuga o noua înregistrare într-o b.d. este


inserarea în interiorul b.d. folosind comanda INSERT:

INSERT [BEFORE] [BLANK]

Efectul acestei comenzi constă în inserarea unei înregistrări după cea


curentă, dacă nu se foloseşte nici o clauză, prin apariţia unei ferestre de
editare la fel ca la comanda APPEND.

Dacă se folosete clauza BLANK atunci se adăuga o înregistrare vida. Dacă


se foloseşte clauza BEFORE se adăugă o nouă înregistrare înaintea înregistrării
curente.

Exemplu:

USE agenda.DBF && deschidem baza de date dorita


LIST && comanda LIST are domeniul implicit ALL

GOTO 2 && ne pozitionam pe inreg. cu numarul 2


INSERT BEFORE && se insereaza o noua inreg. pe pozitia 2
LIST && afisam informatiile din baza agenda

3.3.2. Modificarea înregistrărilor: comanda REPLACE

Spre deosebire de comanda BROWSE, care permite modificarea


interactivă a informaţiilor dîntr-o bază de date, prin deschiderea unei ferestre
de modificare, comanda REPLACE, modifică conţinutul unei bază de date prin

39
Baze de date

actualizarea efectivă cu ajutorul câmpurilor bază de date. Sintaxa comenzii


REPLACE este următoarea:

REPLACE <câmp1> WITH <expresie1> [, <câmp2> with


<expresie2>, . . . ] [FOR <conditie>] […]

Cu ajutorul acestei comenzi se modifică automat vechea valoare din câmpul


<câmp1> cu valoarea rezultată în urma evaluării expresiei <expresie1>,
vechea valoarea din <câmp2> cu <expresie2>, ş.a.m.d.
Clauzele <domeniu> şi FOR specifica înregistrările la care se referă
comanda REPLACE; domeniul implicit este înregistrarea curentă.

Exemplu: Fie bază de date PERSONAL.DBF cu informaţii despre


angajaţii unei societăţi. Să se adauge o nouă înregistare
la sfârşitul bază de date şi să se completeze cu un anumit conţinut.

USE personal.DBF && deschidem baza de date dorita


LIST && comanda LIST are domeniul implicit ALL

APPEND BLANK && adăugam o inreg. vida


REPLACE marca WITH 2000, nume WITH ‘Iliescu’, prenume WITH
‘Vasile’, functie WITH ‘sef’, salariu WITH ‘7800000’, sectie WITH 3,
data_n WITH 03/03/44
LIST && afisam informatiile din baza personal
USE && inchidem b.d. curenta

3.3.3. Ştergerea înregistrărilor: comanda DELETE

În afară de modificare şi adăugare, ştergerea este cea de-a treia operaţie


importantă în lucrul cu bazele de date. Ştergerea unei înregistrări dîntr-o bază
de date se poate realiza la două nivele, astfel:
 La nivel logic, când înregistrarea nu este ştearsă propriu-zis din bază de
date, ci este marcată pentru ştergere. Există comenzi şi funcţii Foxpro

40
Visual Foxpro

care, înainte de accesarea unei înregistrări testează marcajul de ştergere


al acesteia şi, - în funcţie, de el – consideră înregistrarea absentă sau
prezentă în baza de date.
 La nivel fizic, când înregistrarea este ştearsă fizic din baza de date, apoi
nu va mai fi acces la ea deloc.

Marcarea pentru ştergere a uneia sau mai multor înregistrări se poate


face cu comanda DELETE, care are următoarea sintaxa:

DELETE [<domeniu>] [FOR <conditie>]


[…]
Accesul la înregistrările marcate pentru ştergere este controlat de comanda:

SET DELETED ON | OFF


- când se alege opţiunea ON, înregistrările marcate pentru ştergere nu
vor fi accesibile celorlalte comenzi;
- când se alege opţiunea OFF, înregistrările sunt accesibile indiferent de
marcajul de ştergere.

Folosind baza de date PERSONAL.DBF, să se execute


Exemplu:
ştergerea înregistrărilor cu numărul de ordine par.

USE personal.DBF && deschidem baza de date dorita


LIST && comanda LIST are domeniul implicit ALL

SET DELETED OFF


DELETE FOR MOD(RECNO(),2)=0
&& marcam pentru stergere inreg. cu nr. par
LIST
&& toate inreg. din b.d. sunt afisate; cele sterse avand marcajul de
stergere in dreptul lor (un asterisc)
GOTO 2
DISPLAY
&& inreg. este afisata chiar dacă este marcata pentru stergere
USE

41
Baze de date

În cadrul unui program, testarea marcajului de ştergere a unei


înregistrări se face cu funcţia DELETED() care returnează o valoare logică de
true (adevarat), dacă înregistrarea curentă este marcată pentru ştergere sau
false (fals) în caz contrar.

DELETED ([<expresieC> |<expresieN>])

În cazul în care funcţia se referă la o altă bază de date, decât cea


activă, acesta este specificată prin alias-ul său (<expresieC>) sau prin zona de
lucru în care este deschisă (<expresieN>).

Exemplu: Tot în baza de date PERSONAL.DBF, vom marca pentru


ştergere înregistrarea cu numărul de ordine 2 şi vom
testa marcajul său, şi apoi vom testa marcajul înregistrării cu numărul de
ordine 5.
USE personal.DBF && deschidem baza de date dorita
LIST && comanda LIST are domeniul implicit ALL

SET DELETED OFF


DELETE RECORD 2 && marcam pentru stergere inreg. cu nr. 2
GOTO 2 && ne pozitionam pe inreg. cu nr. 2
?DELETED()
.T. && obtinem valoarea de adevar .T. (true)
GOTO 5 && ne pozitionam pe inreg. cu nr. 5
?DELETED()
.F. && obtinem valoarea de adevar .F. (false)
USE

O înregistrare marcată pentru ştergere nu este ştearsă fizic din baza de


date, de aceea eliminând marcajul de ştergere, înregistrarea se reface, ea
putând fi accesibilă astfel pentru toate comenzile scrise ulterior refacerii sale.

Înlăturarea marcajului de ştergere se face folosind comanda RECALL,


care are următoarea sintaxă:

RECALL [<domeniu>] [FOR <conditie>] […]

42
Visual Foxpro

Înregistrările selectate prin clauzele <domeniu> şi FOR vor fi refăcute,


adică li se va înlătura marcajul de ştergere. Domeniul implicit – la fel ca şi în
cazul comenzii DELETE - este înregistrarea curentă.

Exemplu:

USE personal.DBF && deschidem baza de date dorita


LIST && comanda LIST are domeniul implicit ALL

DELETE FOR RECNO()<=3 && marcam pentru stergere primele 3 inreg.


LIST
RECALL ALL && sunt refacute toate inreg., celenemarcate nefiind
afectate

LIST
USE

Pentru ştergerea la nivel fizic a înregistrărilor din baza de date avem la


dispoziţie două comenzi: PACK şi ZAP.
Comanda PACK are următoarea sintaxă: PACK […]
şi realizează ştergerea fizică a tuturor înregistrărilor marcate pentru ştergere
din baza de date.
Observaţie: După aplicarea comenzii PACK asupra unei baze de date
înregistrările şterse nu mai pot fi refăcute, ştergerile fiind permanente.

Exemplu:

USE personal.DBF && deschidem baza de date dorita


LIST && comanda LIST are domeniul implicit ALL

DELETE RECORD 5 && marcam pentru stergere inreg. cu nr. 5


PACK && se sterge fizic inreg. cu nr. 5
LIST
USE

43
Baze de date

Comanda ZAP: ZAP


şterge fizic toate înregistrările din bazele de date active, fiind echivalentă cu
secvenţa de instrucţiuni:
DELETE ALL
PACK
Observaţie: La fel ca şi comanda PACK, înregistrările şterse cu comanda
ZAP nu mai pot fi refăcute. Ori de câte ori se doreşte golirea totală a unei
baze de date este recomandată folosirea comenzii ZAP care este mult rapidă
decât secvenţa anterioară de comenzi.

44
Visual Foxpro

Capitolul 4
Indexare şi căutare rapidă

4.1. Indexarea tabelelor. Tipuri de indecşi.

Cea de-a doua metoda de ordonare a unei tabele o reprezintă indexarea


acesteia, care presupune crearea unui nou fişier, numit fişier index, în care se
memorează ordinea înregistrărilor din tabelă. Astfel nu se obţine un nou fişier
de tip DBF care să aibă toate înregistrările tabelei iniţiale dar în ordinea dorită,
ci un fişier de tip index, mult mai mic ca dimensiune şi care conţine adresele
înregistrărilor în ordinea dorită.

Considerăm tabela PERSONAL.DBF cu următoarele înregistrări, şi pe


care o indexăm după câmpul Marca, în ordine crescătoare:
Fişier index
Nr. Marca Nume Prenume Salariu
Inreg.
#

1 1003 Achim Ion 3500000 Nr. Valoare


Inreg. câmp
# indexat
2 1001 Golu Vasile 2780000 2 1001
3 1002
3 1002 Badea Ilie 4200000 1 1003

Astfel accesul la înregistrările afalte în tabela PERSONAL va avea loc prin


intermediul fişierului index nou creat. De exemplu dacă dorim afişarea celei
de-a treia înregistrare a tabelei PERSONAL, atunci Foxpro citeşte valorea
memorata în poziţia a treia a fişierului index şi anume valorea 1003 şi o
tratează ca poziţia înregistrării respective din tabelă.

45
Baze de date

Indecşii se memorează în fişiere de tip index şi care au aceeaşi


denumire cu tabela iniţială, dar au extensia CDX. Aceste fişiere se deschid şi
de închid automat cu tabela pe baza căreia au fost create. La o singură tabela
pot fi create mai multe fişiere de tip index, fiecare având un anumit câmp de
index sau o expresie formată din mai multe câmpuri. De precizat totuşi că
numai un index este activ la un moment dat şi astfel el determin modalitatea
de parcurgere a înregistrărilor din tabela indexată.

Există mai multe tipuri de indecşi:


 Regular index – este folosit pentru a selecta ordinea de parcurgere din
câmpurile non-cheie
 Unique index – este folosit pentru a selecta ordinea de parcurgere
bazata pe prima aparitie a valorii în câmpul specificat
 Candidate index - este folosit în tabelele care au deja fixat indexul
primar dar care doresc verificarea valorilor unice şi in alt câmp decât cel
specificat de câmpul cheie.
 Primary index – este folosit in contextual unei tabele incluse într-o bază
de date şi asigură introducerea valorilor unice pentru cheia
înregistrărilor. O tabelă are un singur index primar.

Comanda pentru crearea unui index are următoarea sintaxă:

INDEX ON <expresie> TAG <tag> [UNIQUE]


[DESCENDING/ASCENDING] [FOR <conditie>]

Cheia de ordonare, sau mai exact cheia de indexare, va fi specificată


prin <expresie> care poate conţine câmpuri ale tabelei mai puţin câmpuri de
tip memo.
Clauza [UNIQUE] stabileşte un index de tip unique.

46
Visual Foxpro

Clauza FOR <conditie> se foloseşte atunci când se doreşte că numai


anumite înregistrări ce respectă condiţia <conditie> să fie accesate prin
intermediul fişierului index.
Clauzele ASCENDING şi DESCENDING se folosesc pentru a specifica
modul de ordonare a tabelei asociată fişierului index.

Exemplu:

USE STUDENTI.DBF && deschidem baza de date dorita


LIST && comanda LIST are domeniul implicit ALL

INDEX ON NUME TAG NUME


LIST && afisam informatiile din aceasta baza
INDEX ON MEDIA TAG MEDIA
LIST

Pentru a putea folosi o tabelă indexată după un anumit criteriu, trebuie


să o deschidem după indexul respectiv. Pentru aceasta, putem folosi, comanda
USE, cu următoarea sintaxă:

USE <nume_tabela> ORDER <tag>


Pentru ştergerea unui index se foloseşte comanda:

DELETE TAG <tag>

Fie tabela PERSONAL.DBF, şi dorim ordonarea


Exemplu:
dupa o expresie de ordonare formată din două
câmpuri (de exemplu: sectie şi nume), atunci vom creea un index prin
transformarea câmpului de tip numeric Sectie, într-un câmp de tip character,
prin folosirea funcţiei STR.

47
Baze de date

USE PERSONAL.DBF && deschidem baza de date dorita


LIST && comanda LIST are domeniul implicit ALL

INDEX ON STR(SECTIE)+NUME TAG P


USE PERSONAL TAG P
LIST
INDEX ON SECTIE TAG SEC UNIQUE
LIST
&& afiseaza primele inreg. din tabela care indeplinesc cerinta din
index

Definirea vizuală a indecşilor

Indecşii pot fi stabiliţi


atunci când creem tabela. În
plus dacă expresia de
indexare conţine doar un
câmp, atunci indexul se
poate defini în primul tab al
ferestrei (FIELDS), în timp ce
definim descrierea câmpului
respective. Dacă exepresia
de indexare conţine mai
multe câmpuri, sau variabile sau constante, atunci se foloseşte tab-ul
INDEXES, în care putem uşor construi această expresie de indexare cu ajutorul
Expression Builder.
În constructorul Table Designer, care apare atunci când creem o tabelă,
se pot stabili că anumite câmpuri să fie indexate. Acest lucru se realizează, în
tab-ul FIELDS, la definirea fiecărui câmp în parte se poate stabili, în opţiunea
INDEX, criteriul de ordonare a valorilor din câmpul respectiv (ASCENDING,
adică un fanion “” sau DESCENDING adică un fanion “”).

48
Visual Foxpro

În tab-ul
INDEXES, se poate
observa că a apărut
automat indexul
nume şi ordinea de
indexare “”.

Prezentăam în continuare elementele care descriu fiecare eticheta index


scrisa în tabela respectivă.

 Order stabileşte sensul ordonării, şi anume crescător sau descrescător


 Name stabileşte numele etichetei index (în exemplu nume)
 Type stabileşte tipul indexului, care poate fi unul din cele patru tipuri
prezentate mai sus
 Expression, stabileşte în ce constă cheia de indexare, dacă este
compusă dintr-un singur câmp (cazul exemplului), sau dacă este o
expresie compusă, construită pe baza mai multor câmpuri ale tabelei.

49
Baze de date

Pentru acest caz se poate folosi constructorul de expresii care se


acţionează prin apăsarea butonului din dreapta coloanei respective
 Filter, este un filtru care restrânge accesul la înregistrările tabelei, pe
baza unor criterii stabilite de utilizator. La fel ca la expresii se poate
porni constructorul de filter din butonul dreapta.

4.2. Căutarea şi poziţionarea într-o tabelă indexată

Căutarea unei anumite înregistrări într-o tabelă indexată se face cu


comanda SEEK, care are următoarea sintaxă:

SEEK <expresie>

Efectul acestei comenzi este de a găsi prima înregistrare pentru care


cheia de indexare are valoarea data de <expresie>. Dacă a găsit o asemenea
înregistrare, atunci funcţia FOUND(), care se poate folosi după aceasta
comandă va returna valoarea de adevar .T., în caz contrar .F.

Exemplu: Să se caute în tabela PERSONAL.DBF, indexată


după câmpul MARCA, înregistrarea care are in câmpul
MARCA valoarea 1111. Dacă se gaseşte, să se afişeze valoarea de adevăr .T.
sau dacă nu o găseşte valoarea de adevăr .F. şi în plus să se afişeze numărul
înregistrării respective.
USE PERSONAL.DBF && deschidem baza de date dorita
LIST && comanda LIST are domeniul implicit ALL

INDEX ON MARCA TAG MAR


USE PERSONAL TAG MAR
LIST
SEEK 1111
?FOUND()
.T.
?RECNO()
2

50
Visual Foxpro

Se mai poate folosi şi funcţia SEEK(), care are următoarea sintaxă:

SEEK(<expresie>)

Această funcţie returnează valoarea logic true care reprezintă rezultatul


căutării unei înregistrări într-o tabelă indexată. Se va cauta prima înregistrare
pentru care cheia de indexare egala cu <expresie>.

51
Baze de date

Capitolul 5
Prelucrări statistice şi financiare.
Utilizarea câmpurilor de tip Memo şi General

5.1. Prelucrări statistice şi financiare

Informaţiile care se reţin în tabelele unei baze de date se pot prelucra


ulterior, în scopul aflării unor valori statistice, prin utilizarea unor comenzi şi
funcţii specifice acestor acţiuni:
 Numărare: COUNT
 Însumare: SUM
 Media aritmetică: AVERAGE
 Totalizare: TOTAL
 Calcule diverse: CALCULATE
 Comanda COUNT numără înregistrările din domeniul specificat şi are
următoarea sintaxă:

COUNT [<domeniu>] [FOR <conditie>]


[TO <variabila>]

Domeniul implicit este ALL. Se pot selecta numai înregistrările care


îndeplinesc condiţia specificată în FOR <conditie>. Eventual rezultatul
numărării se poate reţine în variabila specifică în clauza TO <variabila>, care
va fi create în cazul în care nu există.

Considerăm tabela PERSONAL.DBF şi dorim să aflăm


Exemplu:
numărul tuturor angajaţilor din secţia 3.

USE PERSONAL.DBF && deschidem baza de date dorita


LIST && comanda LIST are domeniul implicit ALL
52
COUNT FOR SECTIA=3 TO nr
?”In sectia 3 exista ”,nr,” angajati”
Visual Foxpro

 Un alt tip de calcul care se poate efectua asupra înregistrărilor dintr-o


tabela este însumarea unor câmpuri numerice. Acest lucru se poate
efectua utilizând comanda SUM, care are urmatomărea sintaxă:

SUM [<lista expresii>] [<domeniu>]


[FOR <conditie>]
[TO <variabila> | TO ARRAY <masiv>]

Comanda permite însumarea valorilor numerice din câmpurile specificate în


<lista expresii>, sau din toate câmpurile de tip numeric din tabelă, deoarece
domeniul implicit este ALL. Dacă se foloseşte clauza FOR <conditie> se vor
însuma valorile numerice doar din înregistrările care îndeplinesc condiţia dată,
dacă se doreşte reţinerea valorilor calculate se poate utiliza clauza TO
<variabila> | TO ARRAY <masiv>, pentru a le reţine într-o variabilă simplă
sau într-o variabilă de tip tablou (vector sau masiv).

Considerăm tabela PERSONAL.DBF şi dorim să aflăm


Exemplu:
suma valorilor din câmpul salariu doar pentru angajaţii
din secţia 1.

USE PERSONAL.DBF && deschidem baza de date dorita


LIST && comanda LIST are domeniul implicit ALL

SUM SALARIU FOR SECTIA=1 TO suma


?”In sectia 1 avem un total al salariilor egal cu ”,suma
USE

 Pentru a calcula valorile medii ale unor expresii de tip numeric, putem
folosi comanda AVERAGE, care are următoarea sintaxă:

AVERAGE [<lista expresii>] [<domeniu>]


[FOR <conditie>] 53
[TO <variabila> | TO ARRAY <masiv>]
Baze de date

Comanda permite calculul mediei aritmetice a valorilor numerice din


câmpurile specificate în <lista expresii>, sau din toate câmpurile de tip
numeric din tabelă, deoarece domeniul implicit este ALL. Dacă se foloseşte
clauza FOR <conditie> se vor însuma valorile numerice doar din înregistrările
care îndeplinesc condiţia dată, dacă se doreşte reţinerea valorilor calculate se
poate utiliza clauza TO <variabila> | TO ARRAY <masiv>, pentru a le reţine
într-o variabilă simplă sau într-o variabilă de tip tablou (vector sau masiv).

Considerăm tabela PERSONAL.DBF şi dorim să aflăm


Exemplu:
salariul mediu doar pentru angajatii din secţia 2.

USE PERSONAL.DBF && deschidem baza de date dorita


LIST && comanda LIST are domeniul implicit ALL

AVERAGE SALARIU FOR SECTIA=2 TO media


?”In sectia 2 avem un salariu mediu egal cu ”,media
USE

 Comanda CALCULATE se foloseşte pentru diferite calcule financiare şi


stastistice, având următoarea sintaxă:

CALCULATE [<lista expresii>] [<domeniu>] [FOR


<conditie>] [TO <variabila> | TO ARRAY <masiv>]

Spre deosebire de comenzile SUM şi AVERAGE care executau numai un


anumit calcul la un moment dat, această comandă poate efectua mai multe
tipuri de calcule în funcţie de conţinutul expresiilor din <lista expresii>. Astfel,
în alcătuirea unei expresii din aceasta listă pot intra următoarele funcţii:

54
Visual Foxpro

1. AVG(<expN>) – se foloseşte pentru determinarea valorii medii a


expresiei <expN> ce poate conţine câmpuri de tip numeric ale tabelei
active
2. CNT() – se foloseşte pentru numărarea înregistrărilor din tabela activă
3. SUM(<expN>) – se foloseşte pentru însumarea valorilor din expresia
<expN> ce poate conţine câmpuri de tip numeric ale tabelei active
4. MAX(<exp>) – se foloseşte pentru determinarea celei mai mari valori
a expresiei <exp>, ce poate fi de tip C = Character, N = Numeric sau D
= Date.
5. MIN(<exp>) – are aceeaşi acţiune ca şi MAX(), doar că determină
cea mai mică valoare a expresiei <exp>.

Fie tabela PERSONAL.DBF, în care avem informaţii


Exemplu:
despre angajaţii unei societăţi. Dorim să aflăm câţi
angajaţi au salariul cel mai mai mare se află în secţia 3.

USE PERSONAL.DBF && deschidem baza de date dorita


LIST && comanda LIST are domeniul implicit ALL

CALCULATE MAX(SALARIU) TO M FOR SECTIA=3


CALCULATE CNT() TO numar FOR SECTIA =3 AND SALARIU=M
?”In sectia 3 sunt ”,numar,” angajati cu un salariu maxim”

 Comanda TOTAL realizează o nouă tabelă cu un nume ales de utilizator


cu aceeaşi structură ca a tabelei active şi are următoarea sintaxă:

TOTAL ON <cheie> TO <nume.DBF> [FIELDS


<lista_câmpuri>] [<domeniu>] [FOR <conditie>]

Efectul acestei comenzi constă în parcurgerea tuturor înregistrărilor


tabelei curente şi pentru fiecare grup de înregistrări (tabela trebuie indexată
anterior folosirii acestei comenzi, pentru a creea astfel de grupuri), care au
acceaşi valoare a expresiei <cheie> se adăuga în tabela nou creată

55
Baze de date

<nume.DBF> câte o înregistrare. Înregistrarea are cheia unică a grupului şi


conţine suma valorilor din câmpurile specificate în clauza FIELDS
<lista_câmpuri>(sau toate câmpurile dacă lipseşte această clauză).

Fie tabela STUDENT.DBF în care dorim să aflăm


Exemplu:
totalul numerelor matricole şi a mediilor studenţii pentru
fiecare grupa în parte. Pentru aceasta mai întâi, indexăm tabela după câmpul
dorit şi anume GRUPA, iar apoi creem prin comanda TOTAL o nouă tabelă cu
numele TOT.DBF care conţine câmpurile GRUPA, MATRICOL şi MEDIA, în care
pentru fiecare grupa în parte, avem în câmpurile Matricol şi Media suma
valorilor lor.

USE STUDENTL.DBF && deschidem baza de date dorita


LIST && comanda LIST are domeniul implicit ALL

INDEX ON GRUPA TAG GRUPA


TOTAL ON GRUPA TO TOT.DBF FIELDS MATRICOL,MEDIA
USE && inchidem tabela STUDENT
USE TOT && deschidem tabela nou create TOT
LIST && afisam informatiile

 Calcule financiare se pot efectua cu ajutorul a trei funcţii specializate


pentru astfel de operaţii. Acestea sunt funcţiile FV(), PV() şi
PAYMENT().

 Funcţia FV() cu următoarea sintaxa:

FV(<expN1>,<expN2>,<expN3>)
Calculează valoarea viitoare a unei depuneri regulate <expN1> cu o
creştere constantă în cadrul unei investiţii, cu o dobândă fixă <expN2> pe o
perioada dată <expN3>.

Să presupunem că am deschis un cont la o bancă


Exemplu:
ce practică o dobândă de 1% lunar. Suma lunara pe

56
Visual Foxpro

care dorim să o depunem este de 300000 unităţi monetare. Ne interesează ce


suma vom avea în cont după 36 de luni:

?FV(300000, 0.01, 36)


12923063.51

 Funcţia PV() cu următoarea sintaxă:

PV(<expN1>,<expN2>,<expN3>)

Calculează valoarea la zi a unei investiţii constituite printr-un vărsământ


regulat cu o sumă constantă <expN1>, de-a lungul unui număr de perioade
date <expN3> şi când se practică o dobândă fixată <expN2>.

Exemplu: Să presupunem că avem un cont la o bancă care


practică o rată a dobânzii de 1% lunar. Ne interesează
ce suma am putea acoperi din acest cont în 4 ani plătind lunar câte 400000
lei. Deci 400000 este suma fixă ce se scoate din cont regulat (lunar); 0.01 este
dobânda băncii, 48 este numărul de luni:

?PV(400000, 0.01, 48)


15189583.80
 Funcţia PAYMENT() cu următoarea sintaxă:

PAYMENT(<expN1>,<expN2>,<expN3>)

Calculează mărimea rambursărilor constante efectuate la intervale


regulate care permit amortizarea unei sume <expN1>, cu o dobândă fixă
<expN2>, pe un număr dat de perioade <expN3>.

Exemplu: Să presupunem că avem de returnat un împrumut de


50.000.000 de unităţi monetare. Ce sumă vom plăti
lunar pentru ca în 2 ani să se achite împrumutul ? Ştim că depunerile noastre
lunare se adăugă într-un cont la o banc care acordă o dobândă lunară de 1%:

57
?PAYMENT(50000000, 0.01, 24)
2353673.61
Baze de date

5.2. Utilizarea câmpurilor Memo şi General

5.2.1. Câmpul Memo

Acest tip de date se foloseşte în principal când avem de memorat informaţii


diferite atât din punct de vedere al dimensiunii acestora cât şi din punctul de
vedere al datele memorate. De exemplu, pentru a reţine adresa personală a
unui angajat trebuie să reţinem şiruri de caractere de lungimi diferite. Chiar
dacă am dimensiona acel câmp (să zicem ADRESA) la maxim 255 de
caractere, tot nu am rezolva problema, deoarece pentru unele persoane nu ar
fi suficient spaţiu, iar pentru altele ar fi prea mult.

Pentru a rezolva acest aspect, se poate utiliza tip de date MEMO, care
reţine toate aceste informaţii într-un fişier separat, care este poarta acelaşi
nume cu al tabelei respectice (şi are extensia .FPT) şi care asociază fiecarei
înregistrări un spaţiu se memorie special. Acest fişier de deschide automat cu
tabela căruia îi este asociat.

De exemplu, la tabela STUDENTI.DBF, putem adăuga un câmp de adresa


de tip MEMO, după ce dăm comanda MODIFY STRUCTURE şi alegem din
lista de tipuri de date oferite de Visual Foxpro, tipul de date Memo.

58
Visual Foxpro

Apoi cu comanda
BROWSE, putem
adăuga informaţii în
tabela respective,
observând că toate
înregistrările au iniţial
în dreptul câmpului
ADRESA, scris
“memo”, iar după
introducerea datelor pe
rând în fiecare
înregistrare în parte, vor avea scris “Memo”.
Introducerea informaţiilor în câmpul de tip memo se face utilizând
combinaţia de taste CTRL+Home, în dreptul fiecărei înregistrări, după aceasta
apare o fereastră în care putem introduce valorile dorite, iar salvarea
informaţiilor dorite se efectuează prin închiderea ferestrei cu combinaţia de
taste CTRL+W (sau CTRL+End).
Comenzi specifice:

59
Baze de date

 Comanda MODIFY MEMO se foloseşte pentru a modifica unul sau mai


multe câmpuri de tip memo. Are următoarea sintaxă:

MODIFY MEMO <lista câmpuri>

Efectul acestei comenzi este deschiderea unei ferestre de editare pentru


fiecare câmp de tip memo din lista de câmpuri specificată.

 Comanda APPEND MEMO se foloseşte pentru introducerea datelor dintr-


un fisier text în câmpul memo specificat. Are următoarea sintaxă:

APPEND MEMO <câmp memo>


FROM <fisier> [OVERWRITE]

Clauza OVERWRITE este necesară atunci când dorim suprascrierea


fişierului text peste vechiul conţinut al câmpului memo. Implicit operaţia este
de adăugare.

 Comanda COPY MEMO se foloseşte pentru extragerea dintr-un câmp


memo a informaţiilor într-un fişier text. Are următoarea sintaxă:

COPY MEMO <câmp memo> TO


<fisier.TXT> [ADDITIVE]

Implicit operaţia este de suprascriere. Dacă dorim ca vechiul continut să nu


se piardă trebuie folosită clauza ADDITIVE.

5.2.2. Câmpul General

În Visual Foxpro se pot introduce ca informaţii obiecte de tip grafice, texte,


imagini, tabele, sunete, etc. Acestea pot fi stocate în câmpuri de tip General.
Astfel se pot lega sau încorpora aceste tipuri de informaţii. În ambele situaţii
între baza de date se stabileşte o legătura care permite apelarea directă din

60
Visual Foxpro

Visual Foxpro a aplicaţiei în momentul în care se doreşte editarea obiectului


respectiv.
Introducerea unui obiect în câmpul General se face prin comanda:

APPEND GENERAL <câmp> FROM <fisier> [LINK]


[…]
Comanda încorporează în câmpul General <câmp> al înregistrării curente o
copie a fişierului <fisier>. Folosind clauza LINK fişierul va fi legat la baza de
date. Fişierul care se va folosi <fişier> trebuie specificat complet, adică nume
plus extensie.

În tabela STUDENTI.DBF am introdus câmpul POZA


Exemplu:
de tip General, în care putem adăuga o fotografie de
tip fişier imagine (de exemplu cu extensia .JPG).

APPEND GENERAL poza FROM


‘c:\studenti\foto1.jpg’ LINK

61
Baze de date

Capitolul 6
Programare structurată (clasică) în Visual Foxpro

6.1. Comenzi specifice programelor

Sistemul de gestiune a bazelor de date Visual Foxpro are în componenţă un


editor de texte propriu (asemănător cu cel de la limbajele de programare
PASCAL sau C), care permite introducerea şi modificarea textelor şi a
programelor.

Editorul de texte este operaţional în cadrul ferestrelor de editare a fişierelor


text sau a programelor, a câmpurilor memo din structura tabelelor, a ferestrei
de comandă.
În mod asemănător cu editoarele de texte prezente în componenţa unor
limbaje de programare, şi în cazul Visual Foxpro, putem creea, modifica,
compila sau executa un fişier de tip program (sau de tip text - care totuşi nu
se complezează sau nu se execută), prin acţionarea unor opţiuni din meniul
System, sau prin introducerea unor comenzi specifice, în fereastra de comenzi.

Vom prezenta pe rând fiecare din


aceste modalităţi de lucru:

6.1.1. Crearea unui fişier text sau


fişier program, utilizând meniul
System
Din meniul FILE se alege opţiunea
NEW. Apare fereastra de dialog NEW din
care se alege opţiunea TextFile pentru a

62
Visual Foxpro

edita un fişier text, sau opţiunea Program pentru a edita un fişier de tip
program. În momentul alegerii primei opţiuni va aparea pe ecran o fereastră
de editare cu numele File1, sau cu numele Program1, în cazul alegerii celei
de-a doua opţiuni. Automat, se va scrie de către sistemul Foxpro, în fereastra
de comenzi, o comandă specifică fiecărei operaţii în parte (MODIFY FILE sau
MODIFY COMMAND, comenzi pe care le vom detalia la punctul următor).

Acesta este un exemplu de afişare în cazul în care dorim editarea unui fişier
de tip program.

6.1.2. Salvarea unui fişier de tip text sau de tip program

Memorarea informaţiilor din fişierul nou creat se poate face prin alegerea
opţiunii Save As tot din meniul FILE, care va determina apariţia unei ferestre
de dialog, în care se va alege numele dorit pentru fişierul respectiv. Pentru a
salva un fişier de tip text se va folosi extensia .TXT, respectiv extensia .PRG
pentru un fişier de tip program. După salvarea fişierului, acesta se poate
închide cu ajutorul opţiunii Close, tot din meniul FILE, sau folosind
combinaţia de taste CTRL+W.

63
Baze de date

6.1.3. Deschiderea unui fişier existent

Tot din meniul FILE se alege opţiunea Open, care va deschide fereastra
de dialog Open File din care se poate alege opţiunea Program pentru un
program sursă sau opţiunea File pentru un fişier text.

6.1.4. Crearea unui fişier text sau program utilizând o comandă


specifică

Se poate folosi (aşa cum am amintit şi mai sus), o comandă specifică


pentru lucrul cu fişiere, şi anume comanda MODIFY COMMAND/FILE, care
are următoarea sintaxă:

MODIFY COMMAND/FILE <nume_fisier>


[NOEDIT][NOWAIT][…]

Clauza NOEDIT se foloseşte pentru vizualizarea programului în fereastra


de editare, fără a fi permisă modificarea lui.
Clauza NOWAIT se foloseşte pentru executarea programului şi după
afişarea ferestrei de editare (în mod normal execuţia este întreruptă în
momentul activării editorului de texte şi reluată după închiderea editorului).
Dacă nu se foloseşte nici o clauză, se deschide o fereastră de editare cu
numele ales de utilizator în <nume_fisier>, salvarea datelor introduse
făcându-se prin combinaţia de taste CTRL+W, şi rezultatul va fi un fişier cu
extensia .PRG (dacă s-a dat comanda MODIFY COMMAND
<nume_fisier>), sau cu extensia .TXT (dacă s-a dat comanda MODIFY
FILE <nume_fisier>).

64
Visual Foxpro

6.1.5. Compilarea şi lansarea în execuţie a unui program sursă

Pentru a putea executa un program, acesta trebuie mai întâi compilat prin
alegerea opţiunii COMPILE din meniul PROGRAM, operaţie în urma căreia
rezultă un program în cod obiect cu extensia .FXP. Dacă la compilare rezultă
erori, acestea trebuie înlăturate şi programul recompilat.

Programul în cod obiect este lansat în execuţie, prin alegerea opţiunii DO


din acelaşi meniul PROGRAM, sau prin scrierea comenzii DO, în fereastra de
comenzi.
Comanda DO are urmatoărea sintaxă:

DO <program/procedura> [WITH
<lista_de_parametrii>][IN <nume_fisier>]

Clauza WITH <lista_de_parametrii> se foloseşte pentru a specifica o


lista de expresii, variabile de memorie, tabele, câmpuri, constante, etc., ce se
transmit unei proceduri apelate <program/procedura>.

Clauza IN <nume_fisier> permite executarea unei proceduri dintr-un


program specificat.
Observaţie: Vom trata la punctele următoarele aspectele legate de
proceduri. Deocamdată, ne rezumăm la programe sursă.
Dacă nu se foloseşte nici o clauză, atunci sistemul Visual Foxpro, va căuta
pe rând fişierele: cu extensia .EXE (fişiere executabile), cu extensia .APP
(fişiere de tip aplicaţie), cu extensia .FXP (fişiere compilate) sau cu extensia
.PRG (fişiere program sursă).

65
Baze de date

6.2. Comenzi pentru programarea structurată

Pentru a scrie programe sursă, în sistemul Visual Foxpro, putem folosi


comenzi, pe care le încadrăm în fişiere de tip .PRG şi care efectuează
prelucrari în funcţie de verificarea unor condiţii ce trebuiesc îndeplinite, iar alte
ori trebuie repetate unele comenzi pentru obţinerea tuturor rezultatelor dorite
prin prelucrarea câmpurilor bazelor de date.

Astfel, se pot folosi, următoarele structuri, comenzi sau funcţii:

 structura alternativă simplă: IF…ENDIF


 funcţia: IIF()
 structura alternativă compusă: DO CASE…ENDCASE
 structura repetitivă cu test iniţial: DO WHILE…ENDDO
 structura repetitivă cu număr cunoscut de paşi: FOR…ENDFOR
 structura repetitivă: SCAN…ENDSCAN
 comanda CANCEL
 comanda SUSPEND
 comanda QUIT

6.2.1. Structura alternativă: IF…ENDIF

Comanda IF…ENDIF are următoarea sintaxă:

IF <conditie>
<instructiuni_1>
[ELSE
<instructiuni_2>]
ENDIF

66
Visual Foxpro

Comanda IF…ENDIF permite ramnificarea programului în funcţie de


valoarea de adevăr a condiţiei <conditie>. Dacă <conditie> este adevarată,
atunci se va executa setul de instrucţiuni (comenzi) <instructiuni_1>, în caz
contrar se va executa setul de instrucţiuni (comenzi) <instructiuni_2>. Se
poate observa că setul de instrucţiuni (comenzi) <instructiuni_2> poate să
lipsească, dacă nu se foloseşte clauza ELSE, caz în care, dacă condiţia
specificată nu este îndeplinită, se va continua programul prin execuţia
următoarelor comenzi scrise după ENDIF.

Exemplu: Să presupunem că dorim să afişăm pe ecran un anumit


mesaj, dacă o variabilă este pozitivă sau alt mesaj, în
caz contrar.

IF a>0
?” Variabila ”,a,” este pozitiva”
ELSE
?”Variabila ”,a,” nu este pozitiva”
ENDIF

Exemplu: Dacă dorim să comparăm între ele două variabile a şi b


şi să afişăm care din ele este mai mare, sau dacă sunt
egale, putem proceda astfel:

IF a>b
?” Variabila ”,a,” este mai mare decat variabila ”,b
ELSE
IF a=b
?”Cele doua variabile sunt egale”
ELSE
?”Variabila ”,b,” este mai mare decat variabila ”,a
ENDIF
ENDIF
Funcţia IIF()

67
Baze de date

Are un efect asemănător cu cel al comenzii IF … ENDIF şi anume de


selecţie între două variante posibile. Sintaxa funcţiei este următoarea:

IIF(<conditie>,<valoare_1>, <valoare_2>)

Efectul funcţiei constă în evaluarea condiţiei <conditie>, şi returnarea


valorii <valoare_1> în cazul în care condiţia specificată este adevarată, sau în
returnarea valorii <valoarea_2> în cazul în care condiţia este falsă.
Compararea a două variabile se poate face astfel:
Exemplu:

IIF( a>b, ” Variabila ”,a,” este mai mare”, ;


”Variabila ”,b,” este mai mare sau sunt egale”)
Sau:

IIF( a>b, ” Variabila ”,a,” este mai mare ”, ;


IIF(a=b,”Variabilele sunt egale ”,”Variabila ”,b,” este
mai ; mare”) )

6.2.2. Structura alternativă: DO CASE … ENDCASE

Atunci când dorim să executăm o anumită comandă (instrucţiune), aleasă


din mai multe variante, putem
DO CASE
folosi comanda DO CASE … CASE <conditie_1>
ENDCASE, care are următoarea <instructiuni_1>
sintaxă: CASE <conditie_2>
<instructiuni_2>
...
CASE <conditie_n>
<instructiuni_n>
[OTHERWISE
<instructiuni>]
ENDCASE

68
Visual Foxpro

Comanda va determina execuţia instrucţiunii pentru care este îndeplinită


condiţia specificată în linia CASE (dacă condiţia respectivă este adevarată).
Execuţia comenzii decurge în modul următor: se evaluează prima condiţie şi,
dacă este adevarată, atunci se execută <instructiuni_1>. Dacă este falsă,
atunci se trece la evaluarea următoarei condiţii. După găsirea primei condiţii
îndeplinite şi executarea instrucţiunii respective, execuţia comenzii DO CASE
… ENDCASE se încheie, programul continuând cu prima comanda după
ENDCASE.

Dacă nici una din condiţii nu ar fost îndeplinit, atunci apar două situaţii:

 când nu există clauza OTHERWISE, execuţia comenzii se încheie

 când există clauza OTHERWISE, se execută instrucţiunea respectivă,


după care se trece la comenziile aflate după ENDCASE.

Exemplu: x=10
DO CASE
CASE x=1
?”Avem valoarea 1”
CASE x=5
?”Avem valoarea 5”
CASE x=10
?”Avem valoarea 10”
OTHERWISE
?”Avem o valoare negativa”
ENDCASE

6.2.3. Structura repetitivă cu test iniţial: DO WHILE … ENDDO

DO WHILE <conditie>
Comanda DO WHILE…ENDDO are <instructiuni>
următoarea sintaxă: [LOOP]
[EXIT]
ENDDO

69
Baze de date

Această comandă determină execuţia repetată a grupului de instrucţiuni


(comenzi) <instructiuni>, cât timp condiţia specificată <conditie> este
adevarată.
Dacă se foloseşte clauza LOOP atunci se ignoră restul de comenzi care
urmează după această clauză şi se reevaluaează condiţia <conditie>.
Dacă se foloseşte clauza EXIT, atunci se determină ieşirea forţată din
structura repetitivă, indiferent de valoarea condiţiei logice <conditie>.
Dacă dorim să calculăm produsul primelor 5 numere
Exemplu:
naturale, putem proceda astfel:

produs=1
i=1
DO WHILE i<=5
produs=produs*i
i=i+1
ENDDO
?”Produsul primelor 5 numere naturale este”, produs

Dacă dorim să verificăm dacă un număr citit de la


Exemplu:
tastatură este sau nu prim, putem proceda astfel:

INPUT “dati n = ” TO n
prim=.T.
i=2
DO WHILE i<=CEILING(n/2)
IF MOD(n,i)=0
prim=.F.
ENDIF
i=i+1
ENDDO
IF prim=.T.
?”numarul “,n,” este prim”
ELSE
?”numarul ”,n,” nu este prim”
ENDIF

70
Visual Foxpro

6.2.4. Structura repetitivă cu număr cunoscut de paşi : FOR …


ENDFOR

Comanda FOR … ENDFOR are următoarea sintaxă:

FOR <var>=<expN1> TO <expN2> [STEP <expN3>]


<instructiuni>
[LOOP]
[EXIT]
ENDFOR|NEXT

Unde <var> numără execuţiile setului de comenzi <instructiuni>, aflate


între FOR şi ENDFOR (sau până la clauza EXIT dacă se utilizează). Variabila
pleacă de la o valoare iniţială precizată prin <expN1> până la o valoare finală
precizată prin <expN2>, pasul specificat <expN3>. Dacă nu se utilizează
clauza STEP, atunci se atribuie automat pasul 1. La fiecare început de ciclu,
<var> se compară cu valoarea finală <expN2>. Dacă este mai mică sau egală
se execută secvenţa de comenzi din corpul structurii repetitive, iar în caz
contrar se trece la prima comandă de după ENDFOR.

Clauza EXIT determină ieşirea forţată din structura repetitivă şi


continuarea execuţiei programului cu prima comandă de după ENDFOR.

Clauza LOOP determină saltul peste următoarele comenzi din


structură, aflate după LOOP şi până la ENDFOR, incrementarea sau
decrementarea variabilei şi trecerea la o nouă executare a grupului de
comenzi, dacă se respectă condiţia din structura repetitivă.

71
Baze de date

Calculul sumei numerelor de la 1 la 10, mai


Exemplu: puţin valoarea 5.

suma=0 suma=0
FOR i=1 TO 10 FOR i=1 TO 10
suma=suma+1  IF i=5
IF i=5 LOOP
EXIT ENDIF
ENDIF suma=suma+1
ENDFOR ENDFOR

6.2.5. Structura repetitivă: SCAN … ENDSCAN

Este asemănătoare ca funcţionare cu comanda FOR … ENDFOR, dar


este specializată în lucrul cu bazele de date. Are următoarea sintaxă:

SCAN
[<domeniu>] [FOR <conditie1>] [WHILE
<conditie2>]
<instructiuni>
[LOOP]
[EXIT]
ENDSCAN

Aceasta comandă realizează parcurgerea bazei de date şi executarea


grupului de instrucţiuni (comenzi), pentru fiecare înregistrare care aparţine
domeniului specificat prin <domeniu>, FOR sau WHILE.
Observaţie: Comanda SCAN … ENDSCAN este echivalentă cu
comanda FOR … ENDFOR şi cu comanda DO WHILE … ENDDO.

72
Visual Foxpro

FOR i=1 TO
SCAN ca efect
RECCOUNT()
<comenzi>
 GOTO i
ENDSCAN
<comenzi>
ENDFOR

DO WHILE NOT
EOF()
<comenzi>
SKIP
ENDDO

2.6.6. Comanda CANCEL

Determină abandonarea execuţiei unui program, controlul fiind redat


ferestrei de comandă. Sintaxa este următoarea: CANCEL

2.6.7. Comanda SUSPEND

Determină suspendarea execuţiei programului în curs, cu posibilitatea de


reluare. Are următoarea sintaxă:
SUSPEND

2.6.8. Comanda QUIT

Determina încetarea execuţiei unui program şi ieşirea din mediul de


programare Visual Foxpro. Are următoarea sintaxă:
QUIT

Exemplu: Să se scrie o secvenţa de comenzi care să ofere citirea


de la tastatură a unei opţiuni şi pe baza acesteia să
suspende execuţia unui program, astfel:

73
Baze de date

“Doriti iesire in MS-DOS/Visual Foxpro/Suspend? [D/F/S]”

INPUT “Doriti iesire in MS-DOS/Visual Foxpro/Suspend?


[D/F/S]” TO optiune
DO CASE
CASE optiune=’D’
QUIT
CASE optiune=’F’
CANCEL
CASE optiune=’S’
SUSPEND
ENDCASE

74
Visual Foxpro

Capitolul 7
Operaţii de actualizare a tabelelor

7.1. Comenzi pentru introducerea şi afişarea datelor

Cea mai folosită metodă pentru operaţiile de intrare / ieşire este un grup
de comenzi:
@ - SAY - GET - READ

Modul lor de lucru este următorul:


- cu comanda SAY se afşează date pe ecranul monitorului, la coordonate
specificate
- cu comanda GET se stabilesc porţiuni de ecran unde vor fi introduce
valori de către utilizatori
- citirea propriu-zisă a datelor respective se va face cu ajutorul comenzii
READ.
De menţionat că fereastra standard Foxpro are 45 de linii şi 125 de
coloane, începând din colţul din stânga-sus:
0 Y

0,0 0,125

X 45,0 45,125

7.1.1. Comanda SAY are următoarea sintaxă:

@ <linie, coloana> SAY <expresie>


[PICTURE <expC1>] […]

75
Baze de date

Efectul acestei comenzi este să afişeze pe ecran valoarea expresiei


<expresie>, în poziţia dată de <linie, coloana>
Clauza PICTURE specifică formatul sub care se editează variabila
respective. Cele mai utilizate formate sunt:
A – permite introducerea unui caracter alfabetic
X – permite introducerea oricărui caracter (litera, cifra sau alt caracter)
9 – permite introducerea de cifre în câmpuri numerice
. – precizează poziţia punctului zecimal
! – converteşte literele mici în litere mari

7.1.2. Comanda GET are următoarea sintaxă:

@ <linie, coloana> GET <variabila> [PICTURE


<expC1>] [MESSAGE <expC2>] [RANGE <expN1>|
<,expN2>] [VALID <expL1> | <expN3>] [COLOR]

Observaţie: Înainte de comanda GET, variabila a cărei valoare se va citi


trebuie să existe în memorie, deci trebuie create anterior.

Exemplu:

nume=’ ‘ && tipul variabilei este sir de caractere


CLEAR
@10,10 SAY ‘Introduceti numele dumneavoastra ’ GET
nume
READ
CLEAR
?’Salut ’,nume,’!’

Clauza PICTURE poate avea şi alte formate.


Clauza RANGE – permite editarea variabilei cu valori cuprinse între două limite
date de <expN1> şi <expN2>.

76
Visual Foxpro

Clauza VALID – permite acceptarea valorii respective numai dacă este


îndeplinită condiţia specificată.
Introduceţi de la tastatură o valoare pentru variabila
Exemplu: MMARCA cu validarea valorii şi limita între 1000 şi 2000.
Apoi afişaţi ce a-ţi introdus.

MMARCA=0
@5,20 SAY “Introduceti marca ” GET MMARCA RANGE
1000,2000 ERROR “A-TI GRESIT (tastati valori intre 1000 şi
2000)” PICTURE “9999”
READ
?MMARCA

7.1.3. Comanda TEXT … ENDTEXT

Afişează mai multe linii de text delimitate de cuvintele TEXT şi


ENDTEXT. Această comandă se utilizează în programe, cu specificarea textului
pe ecran (dacă anterior se scrie comanda SET CONSOLE ON) sau cu
specificarea textului la imprimantă (dacă anterior se scrie comanda SET
PRINTER ON).
TEXT
Sintaxa comenzii este următoarea: <linii de text>
ENDTEXT
Exemplu:

SET CONSOLE ON
TEXT
================================
UNIVERSITATEA “CONSTANTIN BRANCUSI”
FACULTATEA DE INGINERIE
SECTIA DE AUTOMATICA
================================
ENDTEXT

77
Baze de date

7.2. Programe de actualizare

Într-o bază de date, programele de actualizare a înregistrărilor sunt


esenţiale pentru buna întreţinere a informaţiilor gestionate în acea bază de
date. Astfel, se concept programe care au în vedere câteva operaţii specifice:
≈ Adăugare – introducerea unei noi înregistrări în baza de date, cu
verificare, pentru a nu se adăuga o înregistrare cu un număr de cod
deja existent
≈ Modificare – modificare uneri înregistrări existente
≈ Ştergere – ştergerea logică şi eventual fizică a unei înregistrări date
≈ Vizualizarea informaţiilor dintr-o bază de date
≈ Alte operaţii specifice bazei de date respective

Prezentam în continuare o aplicaţie rezolvată:

Se consideră tabela STOCURI.DBF, cu următoarea structură: Cod_prod


N(5), Den_prod C(20), Stoc N(8), Um C(5), unde Um reprezintă unitate de
masură. Tabela va fi indexată la creare pe câmpul Cod_prod. Se cere se
realizeze următoarele operaţii de actualizare:
 adăugarea unui nou produs
 modificarea unui produs existent în tabelă
 ştergerea unui produs
 vizualizarea conţinutului tabelei

În funcţie de alegerea unei opţiuni dintr-


Problemă rezolvată
un meniu dat, se execută operaţia
selectată. Astfel:

78
Visual Foxpro

 Adăugare – se citeşte codul unui produs şi se caută în baza de date.


Dacă nu este găsit, atunci se citesc informaţiile care trebuie depuse în
baza de date şi se adăugă acestea la sfârşitul bazei de date. Dacă este
găsit, atunci se presupune că se realizează o intrare în stoc. Se citeşte
cantitatea şi se adăugă la stocul deja existent.
 Modificare – se citeşte codul unui produs şi se caută în baza de date.
Dacă nu este găsit, atunci se dă un mesaj corespunzător. Dacă este
găsit, atunci se afişează valorile tuturor câmpurilor existente din baza de
date şi apoi se citesc noile valori ale câmpurilor care vor fi asociate
codului respectiv.
 Ştergere – se citeşte codul unui produs şi se caută în baza de date.
Dacă nu este găsit, atunci se dă un mesaj corespunzător. Dacă este
găsit, atunci sunt afişate valorile celorlalte câmpuri ale bazei de date
pentru înregistrarea al cărui cod de produs a fost citit, iar utilizatorul
hotărăşte dacă el şterge sau nu.
 Vizualizare – se afişează conţinutul bazei de date făcându-se o pauză
după fiecare ecran plin de informaţii.
 Terminare – întrerupe execuţia programului şi se întoarce în mediul
Visual Foxpro.

set talk off


clear
store space(1) to optiune
do while .T.
@1,30 say "A - Adăugare"
@2,30 say "M - Modificare"
@3,30 say "S - Stergere"
@4,30 say "V - Vizualizare"
@5,30 say "T - Terminare"
@6,30 say "Introduceti optiunea dumneavoastra: " get optiune
function "!"
read
do case
case optiune="A"
&& operatia de adăugare

79
Baze de date

clear
use stocuri order cod_prod
opt='D'
do while upper(opt)='D'
clear
store 0 to vcod_prod,vcant
store space(20) to vden_prod
store space(5) to vum
@10,10 say "Dati codul produsului care urmeaza sa
fie adăugat " get vcod_prod picture "99999"
read
seek vcod_prod
if not found()
@15,10 say "Dati denumirea produsului " get
vden_prod function "!"
@16,10 say "Dati cantitatea " get vcant
picture "999999999"
@17,10 say "Dati unitatea de masura " get
vum function "!"
read
append blank
replace cod_prod with vcod_prod, den_prod
with vden_prod, stoc with vcant, um with vum
else
@20,10 say " Produsul deja exista, vom
adăuga cantitatea "
@21,10 say "Dati cantitatea " get vcant picture
"999999999"
read
replace stoc with stoc+vcant
endif
opt=space(1)
@40,15 say "Doriti sa continuati? [D/N]" get opt
function "!"
read
enddo
use
case optiune="M"
&& operatia de modificare
clear
use stocuri order cod_prod
opt='D'
do while upper(opt)='D'
clear
store 0 to vcod_prod

80
Visual Foxpro

@10,10 say "Dati codul produsului pe care doriti sa-l


modificati " get vcod_prod pict "99999"
read
seek vcod_prod
if not found()
@15,10 say "Produsul nu exista in tabela"
wait "apasa o tasta pentru continuare"
else
@21,25 say "denumire "
@21,45 say den_prod
@22,25 say "stoc "
@22,45 say stoc
@23,25 say "um "
@23,45 say um

store space(20) to vden_prod


store space(5) to vum
store 0 to vstoc
@33,10 say "Introduceti noile valori: "
@34,10 say "Dati denumirea produsului " get
vden_prod
@35,10 say "Dati stocul " get vstoc
@36,10 say "Dati unitatea de masura " get
vum
read
replace den_prod with vden_prod, stoc with
vstoc, um with vum
endif
@40,15 say "Doriti sa continuati? [D/N]" get opt
function "!"
read
enddo
use
case optiune="S"
clear
&& operatia de stergere
use stocuri order cod_prod
opt="D"
do while upper(opt)="D"
clear
store 0 to vcod_prod
@10,10 say "Dati codul produsului pe care doriti sa-l
stergeti " get vcod_prod pict "99999"
read
seek vcod_prod

81
Baze de date

if not found()
@15,10 say "Produsul nu exista in tabela"
wait "apasa o tasta pentru continuare"
else
@21,25 say "denumire "
@21,45 say den_prod
@22,25 say "stoc "
@22,45 say stoc
@23,25 say "um "
@23,45 say um
store space(1) to opt1
@30,10 say "Doriti sa stergeti? [D/N]" get
opt1 function "!"
read
if upper(opt1)="D"
delete
endif
endif
store space(1) to opt
@40,15 say "Doriti sa continuati? [D/N]" get opt
function "!"
read
enddo
use
case optiune="V"
clear
&& operatia de vizualizare
use stocuri order cod_prod
@15,10 say "====== LISTA STOCURI ========="
@16,10 say "---------------------------------------------------"
@17,10 say "| COD | DENUMIRE | STOC | UNITATE |"
@18,10 say "| PRODUS | PRODUS | | DE MASURA |"
@19,10 say "--------------------------------------------------"
go top
k=20
do while not eof()
@k,15 say cod_prod picture "99999"
@k,35 say den_prod picture
"XXXXXXXXXXXXXXXXXXXX"
@k,50 say stoc picture "999999999"
@k,55 say um picture "XXXXX"
k=k+1
if k>40
wait "Pentru continuare apasati o tasta"
k=20

82
Visual Foxpro

@6,1 clear to 24,79


endif
skip
enddo
use
case optiune="T"
EXIT
otherwise
?"A-ti ales o optiune gresita"
loop
endcase
enddo

83
Baze de date

Capitolul 8
Functii şi proceduri definite de utilizator.
Ferestre.

8.1. Funcţii şi proceduri definite de către utilizator

O funcţie definită de către utilizator (UDF = User Defined Function),


reprezintă un grup independent de instrucţiuni (comenzi), care primeşte un
set de parametri de la programul apelant şi returnează acestuia o valoare
ca rezultat al prelucrărilor asupra parametrilor transmişi.

O procedură definită de utilizator, reprezintă un grup de instrucţiuni ce


primeşte de la programul apelant un grup de parametrii, realizează anumite
prelucrări, după care se revine în programul apelant.

Diferenţa dintre o funcţie şi o procedura, constă în faptul că funcţia


definită de către utilizator, poate intra în componenţa unei expresii, ca
operand, la fel ca şi toate funcţiile standard ale Visual Foxpro, pe când
procedura nu are această proprietate.

8.1.1. Definirea unei funcţii se poate face astfel:

FUNCTION <nume_functie>
[PARAMETERS
<lista_parametri_formali>]

<comenzi>

RETURN <expresie>
[ENDFUNC]

84
Visual Foxpro

Întoarcerea rezultatului în programul apelant se face cu ajutorul


comenzii RETURN <expresie>.
Apelul funcţiei se face, la fel ca la funcţiile standard, prin folosirea numelui
funcţiei respective în cadrul unei expresii.

Să se calculeze Cnk, cu ajutorul formulei: Cnk =


Exemplu:
n!/(k!*(n-k)!).

n=6
k=3
combin=FACT(n)/(FACT(k)*FACT(n-k))
FUNCTION FACT
PARAMETERS n
F=1
FOR i=1 TO n
F=F*i
ENDFOR
RETURN F

8.1.2. Definirea unei proceduri se poate face astfel:

PROCEDURE <nume_procedura>
[PARAMETERS
<lista_parametri_formali>]

<comenzi>

[ENDPROC]
Comunicarea între procedura şi programul apelant se face prin
intermediul parametrilor. Apelul unei proceduri se face cu ajutorul comenzii:

DO nume_procedura [WITH
<lista_parametri_efectivi>]

85
Baze de date

Întoarcerea dintr-o procedură, în programul apelant se face cu ajutorul


comenzii RETURN.

Exemplu: Să se calculeze şi să se afişeze primele 10 valori ale


şirului lui Fibonacci. Şirul lui Fibonacci este construit
conform relaţiei de recurenţă:
f1=1, f2=1, fn=fn-1+fn-2, pentru n>2.

CLEAR
n=0
@5,10 SAY "DATI NUMARUL N= " GET N
READ
DO FIBO WITH N
WAIT "Sfarsit program "

PROCEDURE FIBO
PARAMETERS N
a=1
@10,10 SAY "primul termen "
@11,10 SAY a
b=1
@12,10 SAY "al doilea termen "
@13,10 SAY b
i=3
j=14
DO WHILE i<=N
c=a+b
@j,10 SAY "termenul "
@j+1,10 SAY c
i=i+1
j=j+2
a=b
b=c
&& wait
ENDDO
WAIT "apasati o tasta pentru terminare"
RETURN

86
Visual Foxpro

8.2. Ferestre definite de către utilizator

În limbajul Visual Foxpro se pot defini şi utiliza zone de afişare a datelor


(numite ferestre), care pot fi folosite apoi în cadrul programelor utilizator.
Reamintim, modul în care este împărţit ecranul, şi anume în 45 de linii şi
125 de coloane, începând din colţul din stânga-sus:
0 Y

0,0 0,125

X 45,0 45,125
Modul de lucru cu ferestrele utilizator este următorul:
 se definesc ferestrele cu ajutorul comenzii DEFINE WINDOW şi se
precizeaza şi dimensiunile şi poziţia pe ecran
 ferestrele se afişează pe ecran cu ajutorul comenzilor ACTIVATE
WINDOW sau SHOW WINDOW
 ferestrele se îinlătură de pe ecran cu ajutorul comenzilor DEACTIVATE
WINDOW sau HIDE WINDOW
 pentru înlăturarea ferestrelor din memorie şi implicit de pe ecran, se pot
folosi comenzile CLEAR WINDOW şi RELEASE WINDOW.

8.2.1. Sintaxa comenzii DEFINE WINDOW este următoarea:

DEFINE WINDOW <nume_fereastra>


FROM <linie1>, <coloana1> TO
<linie2>,<coloana2>
[FOOTER <expC1>]
[TITLE <exprC2>]

87
Baze de date

8.2.2. Afişarea pe ecran se face cu ajutorul comenzii:

ACTIVATE WINDOW <nume_fereastra>

8.2.3. Înlăturarea ferestrei de pe ecran se face cu ajutorul comenzii:

DEACTIVATE WINDOW <nume_fereastra>

Exemplu:

DEFINE WINDOW f1 FROM 5,10 TO 20,70;


TITLE “Fereastra de exemplificare”;
FOOTER “Antet inferior”
ACTIVATE WINDOW f1
CLEAR

Considerăm tabela PERSONAL.DBF. Să


Problemă rezolvată
se scrie un program care să execute
două acţiuni:

1) defineşte o fereastră în care va lista pe secţii persoanele în ordine


descrescătoare după data naşterii
2) defineşte o altă fereastră în care se va afişa:

- salariul mediu pe sectia 2


- total salarii pe sectia 2
- numarul persoanelor din sectia 2

88
Visual Foxpro

CLEAR
SET TALK OFF
USE PERSONAL
&& definim fereastra pentru punctul 1)
DEFINE WINDOW f1 FROM 2,2 TO 20,120
&& definim fereastra pentru punctul 2)
DEFINE WINDOW f2 FROM 30,2 TO 40,120
&& activam fereastra f1
ACTIVATE WINDOW f1
?"Lista persoanelor descrescator dupa data nasterii"
SORT TO PERSORT ON SECTIA, DATA_N /D
USE
USE PERSORT
LIST
WAIT "apasa o tasta pentru continuare"
DEACTIVATE WINDOW f1
USE

&& activam fereastra f2


ACTIVATE WINDOW f2
USE PERSONAL
AVERAGE SALARIU FOR SECTIA=2 TO SALMED
SUM SALARIU FOR SECTIA=2 TO TOTSAL
COUNT FOR SECTIA=2 TO NRPERS
?"Salariul mediu pe sectia 2 este : "
?? SALMED
?"Total salarii pe sectia 2 : "
??TOTSAL
?"Numar persoane din sectia 2: "
??NRPERS
WAIT "apasati o tasta pentru continuare"
DEACTIVATE WINDOW f2
USE

89
Baze de date

Capitolul 9
Meniuri definite de utilizator

Meniul reprezintă un element Visual Foxpro prin care se oferă


utilizatorului posibilitatea selectării unei anumite opţiuni dintr-o mulţime finită
de opţiuni posibile, afişat pe ecran, urmând ca, în funcţie de selectarea făcută,
să se declanşeze anumite acţiuni, corespunzătoare opţiunii alese.
Exemplul cel mai cunoscut de meniu este cel al meniului Visual Foxpro,
care se numeşte meniul system.
Un meniu este format dîntr-o bară a meniului şi mai multe
submeniuri. Bara meniului conţine mai multe opţiuni numite opţiuni bară,
fiecăreia dintre acestea putându-i-se ataşa un submeniu, care la rândul lui
este format din opţiuni.

Exemplu: Prezentăm în continuare, meniul system al Visual Foxpro.


bara meniului

opţiune
bara

opţiune
submeniu

90
Visual Foxpro

Pentru a putea construi meniuri asemănătoare meniului system, trebuie


să cunoaştem câteva comenzi specifice lucrului cu meniurile definite de către
utilizator.

9.1. Comanda DEFINE MENU care are următoarea sintaxa:

DEFINE MENU <nume_meniu>


[MESSAGE <exprC>] […]

Clauza MESSAGE determina afişarea şirului de caractere <exprC> pe ultima


linie a ecranului, în centrul acesteia. Clauza este influenţată de comanda SET
MESSAGE.

9.2. Comanda DEFINE PAD care are următoarea sintaxă:

DEFINE PAD <optiune_bara> OF <nume_meniu>


PROMPT <expC1>
[AT <linie,coloana>]
[KEY <eticheta_tasta> [, <expC2>]]
[MESSAGE <exprC>] […]

Această comandă permite definirea opţiunilor bară care vor aparţine


barei de meniu definite prin DEFINE MENU.
Clauza AT determină poziţia de pe ecran sau în fereastra în care va fi
afişată opţiunea bară respectivă. Când această clauză lipseşte, afişarea
opţiunilor bara se va face începând cu linia 0, coloana 0, una dupa alta, pe
direcţie orizontală.
Clauza KEY foloseşte pentru definirea unei căi directe de selectare a
opţiunii bară respective. Calea directă de selectare va fi o combinaţie de taste

91
Baze de date

– alese prin <eticheta_tasta> - cu ajutorul cărora se determină selectarea


opţiunii respective.

Clauza MESSAGE este aceeaşi cu cea de la comanda DEFINE MENU.

9.3. Submeniurile (sau meniurile verticale) se definesc folosind comanda


DEFINE POPUP care are următoarea sintaxă:

DEFINE POPUP <nume_submeniu>


[FROM <linie1,coloana1>]
[TO <linie2,coloana2>]
[MESSAGE <exprC>] […]

Numele submeniului va fi <nume_submeniu>. Poziţia acestuia pe ecran


este dată de clauza FROM în care <linie1, coloana1> reprezintă colţul din
stânga-sus al submeniului, iar clauza TO în care <linie2, coloana2> reprezintă
colţul din dreapta-jos. Dacă prima specificare lipseşte, submeniul va fi plasat în
colţul din stânga-sus al ecranului, sau ferestrei, la poziţia 0,0. La fel dacă cea
de-a doua clauză lipseşte, Visual Foxpro va determina automat dimensiunea
submeniului.

9.4. Pentru definirea opţiunilor unui submeniu (meniu vertical) definit anterior
cu o comandă DEFINE POPUP, se va folosi comanda DEFINE BAR, care
are următoarea sintaxă:

DEFINE BAR <expN> | <nume_optiune_sistem>


OF <nume_submeniu> PROMPT <expC1>
[KEY <eticheta_tasta> [, <expC2>]]
[MESSAGE <exprC3>] […]

92
Visual Foxpro

Comenzile DEFINE PAD şi DEFINE BAR sunt asemănătoare. Pentru


fiecare opţiune a unui meniu vertical se va introduce câte o comandă DEFINE
BAR. În cadrul acestei comenzi, referirea la o opţiune se face prin <expN>,
aceasta desemnând opţiunea cu numărul de ordine <expN> a meniului
vertical cu numele <nume_submeniu>. Prin clauza PROMPT se specifica
textul care va fi afişat pe poziţia opţiunii în meniul vertical respectiv. În şirul de
caractere <expC1> ce desemnează textul respectiv se pot introduce:
 combinaţiile ‘\<’ pentru desemnarea unei taste directe de selectare
 ‘\’ pentru a indica o opţiune dezactivată
În cadrul comenzii DEFINE BAR se poate introduce – în clauza
PROMPT – un şir de caractere de forma ‘\-‘ care desemnează faptul că pe
poziţia opţiunii respective se va introduce o linie de separare a opţiunilor.
Clauzele KEY şi MESSAGE funcţionează la fel ca la comanda DEFINE
PAD.

Exemplu: Definim următorul meniu vertical:

DEFINE POPUP culori FROM 0,10 TO 15,25


DEFINE BAR 1 OF culori PROMPT ‘Al\<bastru’
DEFINE BAR 2 OF culori PROMPT ‘\<Verde’ SKIP
DEFINE BAR 3 OF culori PROMPT ‘\<Rosu’
DEFINE BAR 4 OF culori PROMPT ‘\-’
DEFINE BAR 5 OF culori PROMPT ‘\<Negru’
DEFINE BAR 6 OF culori PROMPT ‘\<Alb’ SKIP
DEFINE BAR 7 OF culori PROMPT ‘\<Galben’
ACTIVATE POPUP culori
CLEAR MENU

93
Baze de date

La execuţie va apărea pe ecran, începând cu poziţie 0,10, următorul meniu


vertical:

Observaţie:

a) Se vede că fiecare
litera care a fost
precedată de
combinaţia ‘\<’ apărea
ca fiind subliniată şi
opţiunea respectivă se
poate selecta prin
combinaţia de taste CTRL+litera respectivă.

b) Opţiunile cu denumirile Verde, respectiv Alb, au, la definire clauza SKIP,


şi deci efectul este ca ele apar scrise cu gri şi nu pot fi folosite
(deocamdată).

9.5. Definirea unei bare de meniu sau a unui meniu vertical, nu este suficientă
pentru a lucra cu aceste elemente. Mai trebuie să fie şi activate aceste
meniuri, cu ajutorul unor comenzi specializate.

Această comandă afişează şi activează bara (meniul orizontal) cu numele


<nume_meniu>.

ACTIVATE MENU <nume_meniu>

Analog acestei comenzi, mai există şi comanda de activare a unui submeniu


(meniu vertical):

ACTIVATE POPUP <nume_submeniu>

94
Visual Foxpro

9.6. Comanda de dezactivare a unui menu orizontal este:

DEACTIVATE MENU <lista_meniuri_orizontale> | ALL

Această comandă permite dezactivarea şi ştergerea meniului de pe ecran


dar nu şi din memorie.

Dezactivarea unui meniu vertical se poate face prin:

 comanda DEACTIVATE POPUP


 acţionarea tastei ESC
 activarea unui alt meniu

9.7. Comanda ON PAD asociază un meniu vertical (sau un alt meniu


orizontal) la o opţiune dintr-un meniu orizontal dat:

ON PAD <nume_optiune> OF
<nume_meniu_orizontal_1>
[ACTIVATE POPUP <nume_meniu_vertical> |
ACTIVATE MENU <nume_meniu_orizontal_2> ]

9.8. Comanda ON SELECTION PAD asociază o acţiune la o opţiune a unui


meniu orizontal pentru ca la selecţia acestei opţiuni să fie executată o
comandă specifică sau un program specific:

ON SELECTION PAD <nume_optiune> OF


<nume_meniu_orizontal> [<comanda>]

Unde <comanda> poate să fie o comandă Visual Foxpro sau o


instrucţiune DO <program.>
Observaţie:
Comanda ON PAD nu are sens dacă s-a utilizat ON SELECTION PAD
pentru a asocia un mesaj sau un program la o opţiune de meniu orizontal.

95
Baze de date

9.9. Comanda ON SELECTION POPUP specifica o comandă sau un program


care să se execute atunci când este selecţionată o opţiune dintr-un meniu
vertical:

ON SELECTION POPUP <nume_optiune> OF


<nume_meniu_vertical> | ALL [<comanda>]

Să se construiască următorul meniu


Problemă rezolvată
orizontal care să aibă anumite opţiuni ca
submeniuri verticale:

Soluţie:

SET TALK OFF


CLEAR
&& definim meniul orizontal principal
DEFINE MENU EXEMPLU
DEFINE PAD P1 OF EXEMPLU PROMPT '\<Actualizari' AT 2,2
DEFINE PAD P2 OF EXEMPLU PROMPT '\<Rapoarte' AT 2,36
DEFINE PAD P3 OF EXEMPLU PROMPT '\<Iesire program' AT 2,55

96
Visual Foxpro

&& definim meniurile verticale cu optiunile fiecaruia in parte


DEFINE POPUP act
DEFINE BAR 1 OF act PROMPT '\<Adăugari'
DEFINE BAR 2 OF act PROMPT '\<Modificari'
DEFINE BAR 3 OF act PROMPT '\<Stergeri'
DEFINE POPUP rap
DEFINE BAR 1 OF rap PROMPT '\< Listare ecran '
DEFINE BAR 2 OF rap PROMPT '\============='
DEFINE BAR 3 OF rap PROMPT '\<Listare imprimanta'
DEFINE POPUP exit
DEFINE BAR 1 OF exit PROMPT '\<Iesire FoxPro'
DEFINE BAR 2 OF exit PROMPT '\**************'
DEFINE BAR 3 OF exit PROMPT '\< Iesire Dos '

&& pentru fiecare optiune a meniului orizontal EXEMPLU activam


meniul
&& vertical corespunzator
ON PAD P1 OF EXEMPLU ACTIVATE POPUP act
ON PAD P2 OF EXEMPLU ACTIVATE POPUP rap
ON PAD P3 OF EXEMPLU ACTIVATE POPUP exit

&& pentru fiecare meniu vertical asociem o comanda sau un


program
&&care se va executa la selectarea meniului respectiv
ON SELECTION POPUP act DO Pact
ON SELECTION POPUP rap DO Prap
ON SELECTION POPUP exit DO Pexit

&& activam meniul orizontal


ACTIVATE MENU EXEMPLU

&& pentru fiecare optiune a unui meniu vertical asociem o comanda


FOXPRO, folosind
&& functia BAR() - care intoarce numarul optiunii curente din meniul
vertical respectiv
PROCEDURE Pact
DO CASE
CASE BAR()=1
DO adaug
CASE BAR()=2
DO modif
CASE BAR()=3
DO sterg
ENDCASE

97
Baze de date

RETURN

PROCEDURE Prap
DO CASE
CASE BAR()=1
DO lista1
CASE BAR()=3
DO lista2
ENDCASE
RETURN

PROCEDURE Pexit
DO CASE
CASE BAR()=1
CLEAR
DEACTIVATE MENU
CANCEL
CASE BAR()=3
QUIT
ENDCASE
RETURN

98
Visual Foxpro

Capitolul 10
Limbajul SQL

Modelul relaţional a introdus nu numai o nouă organizare a datelor într-


o bază de date sub forma de tabel ci şi noi modalităţi de interogare a
informaţiilor.
Astfel, s-au introdus limbaje de manipulare a datelor – numite limbaje
de interogare, neprocedurale (caracteristică specifică altor modele de
reprezentare a bazelor de date).
Caracteristica principală a unui limbaj de interogare este faptul că oferă
posibilitatea utilizatorului (care nu trebuie să fie programator), să-şi definească
datele ce trebuie extrase, iar sarcina căutarii şi extragerii lor revenind exclusiv
SGBD-ului (Sistemului de Gestiune a Bazelor de Date).

10.1. Limbajul SQL ( STRUCTURED QUERY LANGUAGE = limbaj


structurat de interogare )

Proiectanţii limbajului SQL au considerat că beneficiarii acestui limbaj vor fi


doar simpli utilizatori şi nu specialişti în calculatoare. Ei au urmărit două
obiective:
 SQL trebuia să fie folosit de către persoane care ştiau foarte puţin
despre proiectarea şi implementarea bazelor de date
 SQL trebuia sa fie intuitiv şi natural în utilizare, asemănă limbii vorbite
Pentru a atinge aceste scopuri, proiectanţii au creat un limbaj asemănător
limbajului natural (limba engleză) care este folosit pentru descrierea datelor
dorite şi nu a paşilor necesari obţinerii acestora.

99
Baze de date

SQL nu este un limbaj procedural; utilizatorul nu trebuie să ştie neapărat


cum sunt asociate bazele de date pentru a putea obţine listele cu datele
necesare. El solicită datele descriindu-le corect, în sintaxa SQL, iar sistemul se
îngrijeşte să le extragă.
Filosofia de bază SQL este aceea că toate accesele la date se fac în mod
declarativ:
- interogarea
- modificarea
- inserarea
- ştergerea
- definirea constrângerilor de integritate

SQL întrebuinţează relativ puţine comenzi într-un mod flexibil. In parte


această flexibilitate este indusă de numărul mare de opţiuni din sintaza
comenzii SELECT. Dar trebuie să amintim că nu toate operaţiile legate de
accesul la date pot fi scrise în SQL.
SQL este încadrat de unele publicaţii ca aparţinând generaţ 4 de limbaje. Nu
conţine totuşi comenzi pentru codificarea structurilor alternative şi/sau
repetitive şi nici facilităţi de lucru cu obiecte vizuale, specifice formularelor de
introducere a datelor. Din acest punct de vedere poate fi referit ca sub-limbaj
orientat pe lucrul cu bazele de date.

SQL s-a impus ca standard industrial, dintre mai multe astfel de propuneri
(1986, ANSI, ISO). Toate SGBD-urile comerciale (ORACLE, DB2, Informix,
Sybase, Tandem) implementează mici variaţii ale acestui standard. Avantajul
constă în faptul că utilizatorii finali pot interoga o bază oarecare dacă are
implementat SQL, fără a cunoaşte limbajul propriu SGBD.

100
Visual Foxpro

10.2. Comenzi SQL

Comenzi pentru definirea datelor: CREATE TABLE şi ALTER TABLE


Comanda pentru interogarea tabelelor: SELECT
Comanda pentru adăugarea de linii în tabele: INSERT.

10.2.1. Comanda CREATE TABLE

Se foloseşte pentru a specifica o nouă relaţie (tabela) prin atriibuirea unui


nume şi specificarea atributelor sale împreună cu constrângerile (restricţiile)
sale.
Atributele se specifică primele; fiecare atribut are un nume, un tip de date
ataşat de utilizator, care specifică domeniul de valori şi posibil unele
constrângeri.
Cheia primară sau străină, integritatea entităţii şi constrângerile integrităţii
referenţiale sunt apoi specificate.
Sintaxa comenzii CREATE TABLE este:

CREATE TABLE <nume_fisier.DBF> (<lista_definitii>)

unde o definiţie din lista_definiţii este de forma: <nume_câmp>


<tip>[([<lungime>],<zecimale>)].

Considerăm tabela STUDENT.DBF, în care vom


Exemplu:
avea informaţ referitoare la studenţii dîntr-o facultate.
Structura acestei tabele este:
NUME Character 20
PRENUME Character 20
GRUPA Character 4
DATA_N Date 8

101
Baze de date

CNP Numeric 13
ADRESA Memo 4
CAMIN Logical 1
MEDIA Numeric 5 2

Comanda de creare a unei astfel de tabele este următoarea:

CREATE TABLE STUDENT.DBF (NUME C(20), PRENUME C(20), GRUPA C(4),


DATA_N D, CNP C(13), ADRESA M, CAMIN L, MEDIA N(5,2))

Pentru fiecare definiţie de atribut (câmp) se poate specifica valoarea


NOT NULL care semnifică faptul că valorile pentru acel atribut care ar putea fi
cheie primară a tabelei, nu pot să lipsească niciodată. In plus, se mai poate
defini o valoare implicită, utilizând clauza DEFAULT <valoare>, care se
adaugă la fiecare linie a tabelei în coloana respectivă.

10.2.2. Comanda ALTER TABLE

Se foloseşte pentru a modifica/schimba definiţia unei tabele. Acţiunile


posibile ale acestei comenzi includ:
- adăugări şi ştergeri de coloane (atribute)
- schimbări de definiţii de coloane
- ştergeri de constrângeri ale tabelei

Exemplu1:
Pentru a adăuga un atribut care să reţină informaţia referitoare la anul
de studiu în care se află studentul, în tabela STUDENT, se poate utiliza
comanda ALTER TABLE, astfel:
ALTER TABLE STUDENT ADD AN C(2)

102
Visual Foxpro

După aceasta, cu comanda Browse trebuie să introducem câte o valoare


în câmpul AN.

Exemplu2:
Pentru a şterge o coloană, folosim clauza DROP urmată de numele
coloanei respective:

ALTER TABLE STUDENT DROP AN

10.3. Interogari în SQL

SQL are o comandă de bază, pentru obţinerea de informaţii din baza de


date – comanda SELECT. Sintaza acestei comenzi este destul de complexă,
deoarece conţine multe opţiuni şi clauze.

 Interogari SQL simple

Forma de bază a comenzii SELECT este compusă din trei clauze: SELECT,
FROM şi WHERE, astfel:

SELECT <lista_de_atribute>
FROM <lista_de_tabele>
WHERE <conditie>

unde
<lista_de_atribute> este o listă de atribute (câmpuri) ale căror valori se
obţin prin interogare
<lista_de_tabele> este o listă de nume de tabele necesare în procesul
de interogare

103
Baze de date

<condiţie> este o expresie booleană de căutare ce identifică liniile ce


vor fi obţinute prin interogare.

Prezentam in continuare cateva exemple efectuate asupra tabelei


PERSONAL, care are urmatoarea structura: MARCA N(4), NUME C(25),
PRENUME C(30), SECTIA N(2), SALARIU N(8), FUNCTIE C(15), VECHIME N(2).

Exemplu: Sa se selecteze toate câmpurile şi toate înregistrările :

SELECT *.* ;
FROM PERSONAL

Exemplu: Sa se selecteze câmpurile din tabela PERSONAL, care


sunt specificate in lista de câmpuri :

SELECT MARCA, NUME, PRENUME, SALARIU;


FROM PERSONAL

Exemplu: Folosind clauza DISTINCT se pot elimina valorile


duplicate, sa se selecteze functiile aflate in tabela data :

SELECT DISTINCT FUNCTIA;


FROM PERSONAL

Sa se selecteze înregistrările care se refera la sectia 2


Exemplu:
(pentru aceasta se foloseste clauza WHERE) :

SELECT *;
FROM PERSONAL;
WHERE SECTIA=2

104
Visual Foxpro

Exemplu: Sa se selecteze înregistrările in care se afla angajatii din


sectia 3 şi care au salariul egal cu 2500000 de lei :

SELECT *;
FROM PERSONAL;
WHERE SECTIA=3 AND SALARIU=2500000

Sa se selecteze toti angajatii care au functii de ‘ECON’


Exemplu:
sau ‘ING’, care lucreaza in sectia 5 :

SELECT *;
FROM PERSONAL;
WHERE (FUNCTIA=’ECON’ OR FUNCTIA=’ING’) AND
SECTIA=2

Exemplu: Sa se afiseze toti economistii din sectia 7 care au


salariul >=3400000 :

SELECT *;
FROM PERSONAL;
WHERE FUNCTIA=’ECON’ AND SECTIA=7 AND
SALARIU>=3400000

Sa se afiseze numel, prenumele şi sectia pentru


Exemplu:
angajatii care au salariul intre 2300000 şi 5700000. Se
foloseste operatorul BETWEEN care permite selectarea înregistrărilor care
contin valori intr-un interval specificat :

SELECT NUME, PRENUME, SALARIU;


FROM PERSONAL;
WHERE SALARIU BETWEEN 2300000 AND 5700000

105
Baze de date

Sa se listeze înregistrările din tabela PERSONAL in


Exemplu:
ordinea crescatoare dupa câmpul MARCA. Clauza
ORDER BY realizeaza ordonarea rezultatului selectiei pe unul sau mai multe
câmpuri:
SELECT *;
FROM PERSONAL;
ORDER BY MARCA

Sa se afiseze salariul minim, salariul maxim şi salariul


Exemplu:
mediu pe fiecare sectie:

SELECT SECTIA, MIN(SALARIU), MAX(SALARIU), AVG(SALRIU)

Exemplu: Sa se calculeze totalul salariilor din tabela PERSONAL :

SELECT SUM(SALARIU);
FROM PERSONAL

Se cere sa se totalizeze salariile pe fiecare sectie in


Exemplu:
parte :

SELECT SECTIA, SUM(SALARIU);


FROM PERSONAL GROUP BY SECTIA

Limbajul SQL permite formularea de cereri de date din baza de date.


Acest lucru se poate realiza deoarece clauza WHERE poate contine o alta
cerere (numita subcerere):

106
Visual Foxpro

Sa se listeze toti angajatii care au aceeasi functie cu cel


Exemplu:
care are numele de ‘Grigorescu’ :

SELECT NUME, PRENUME, FUNCTIE;


FROM PERSONAL;
WHERE FUNCTIE=;
( SELECT FUNCTIA;
FROM PERSONAL;
WHERE NUME=’Grigorescu’)

Sa se afiseze numele, prenumele, functia şi salariul


Exemplu:
pentru angajatii care au aceeasi functie şi salariu cu
angajatul care are numele ‘Badea’ :
SELECT NUME, FUNCTIE,
SALARIU;
FROM PERSONAL;
WHERE FUNCTIE IN;
( SELECT FUNCTIE;
FROM PERSONAL;
WHERE NUME=’Badea’ );
AND SALARIU IN ;
( SELECT SALARIU;
FROM PERSONAL;
WHERE NUME=’Badea’ )

107
Baze de date

Capitolul 11
Proiectarea vizuala a interogărilor

11.1. Crearea interogărilor

O interogare se poate crea cu meniul sau utilizând gestionarul de


proiecte. Ea are la bază una sau mai multe tabele:
Dacă se apelează la meniu din fereastra NEW, ce apare după selectarea
submeniului FILE * NEW..., se alege opţiunea QUERY. Dacă se apelează la
gestionarul de proiecte, după selectarea obiectului Query din cadrul bazei de
date, se activează butonul New. În ambele cazuri avem posibilitate să alegem
modul în care dorim crearea unei interogări noi cu ajutorul Wizard - ului
("asistentului") sau în mod direct.
Dacă se utilizează "asistentul" (WIZARD) fereastra de dialog care va apare
este următoarea:

Fereastra Wizard Selection

Acest mod de lucru pune la dispoziţia utilizatorului trei opţiuni:

11.1.1 CROSS-TAB WIZARD - este o încrucişare ce reprezintă


rezultatul unei interogări speciale, care ne oferă posibilitatea analizei relaţiei

108
Visual Foxpro

dintre un câmp al tabelei şi alte câmpuri de date ale aceluiaşi tabel. Dacă se
optează pentru această opţiune paşii ce trebuiesc parcurşi sunt următorii:
 în prima fereastră se selectează tabela şi câmpurile ce dorim a fi
folosite în interogarea încrucişată. Nu pot fi selectate câmpuri decât
dîntr-o singură tabelă şi trebuie alese minim trei. Se acţionează
butonul NEXT pentru a trece la pasul doi;
 în a doua fereastră se va specifica modalitatea de afişare a câmpurilor
pe coloană, pe rând, respectiv ceea ce dorim să avem în interiorul
acestui tabel cu dublă ieşire. Se acţionează butonul NEXT pentru a
trece la pasul următor;
 în a treia fereastră de dialog se va specifica ce dorim să, facem cu
informaţiile existente în interiorul tabelului cu dublă ieşire în cazul în
care există duplicate pe câmpurile din ROW sau COLUMN (SUM,
MIN, MAX, AVERAGE, COUNT). De asemenea putem opta pentru
afişarea sau nu a unui grad de subtotal (subtotalul apare pe coloana
din dreapta). Se acţionează butonul NEXT pentru a trece la pasul
următor;
 în a patra fereastră se stabileşte modul de salvare a interogării
respective. Se acţionează butonul FINIS pentru a putea salva
interogarea în directorul în care dorim să apară.

11.1.2. GRAPH WIZARD - oferă posibilitatea ca rezultatul interogării


să fie afişat prin intermediul unui grafic. Paşii ce trebuie parcurşi pentru,
realizarea unei astfel de interogări sunt:
 în prima fereastră se selectează tabela şi câmpurile ce dorim a fi
folosite în interogare. Nu pot fi selectate câmpuri decât dîntr-o
singură tabelă şi obligatoriu unul să fie de tip numeric. Se acţionează
butonul NEXT pentru a trece la pasul doi;
 în a doua fereastră se precizează câmpurile necesare pentru axa Ox şi
axa Oy. Se acţionează butonul NEXT pentru a trece la pasul următor;

109
Baze de date

 în a treia fereastră se alege tipul graficului. Se acţionează butonul


NEXT pentru a trece la pasul următor;

 în a patra fereastra se introduce titlul graficului şi modul de salvare.


Se acţionează butonul FINIS pentru a salva graficul respectiv în
directorul precizat de utilizator.

11.1.3. QUERY WIZARD - pentru crearea unei astfel de interogări


parcurgem următorii paşi:

 în prima fereastră se vor selecta tabelele sau vederile (VIEWS) şi


câmpurile ce sunt utilizate în cadrul interogării respective. La
selectarea unei tabele câmpurile componente sunt afişate în fereastra
Available Fields. Selectarea câmpurilor se face fie utilizând
butoanele, fie dublu clic stânga cu mouse-ul pe câmpul respectiv.
Câmpurile selectate vor apare în fereastra Selected Fields. Pot fi
selectate mai multe câmpuri din diferite tabele. Se acţionează butonul
NEXT pentru a trece la pasul următor;

 în fereastra a doua se stabilesc relaţiile dintre tabele sau vederi.


Trebuie să avem stabilite relaţii între toate tabelele selectate ale căror
câmpuri intră în interogare, altfel se va face un produs cartezian al
înregistrărilor din tabelele respective. Adăugarea unei relaţii se face
acţionând butonul ADD. Renunţarea la o relaţie se face executând
clic pe butonul REMOVE având în prealabil selectată relaţia ce dorim
a fi ştearsă. Relaţiile rămase se vor observa în caseta multilinie
aferentă. Se acţionează butonul NEXT pentru a trece la pasul
următor;

 în fereastra a treia alegem acele înregistrări care vor fi luate în


considerare la realizarea interogării astfel: Only matching rows -
doar înregistrările care se potrivesc; All rows from this table -
toate înregistrările din tabela specificată; All rows from both tables

110
Visual Foxpro

- toate înregistrările din ambele tabele. Se acţionează butonul NEXT


pentru a trece la următoarea fereastră;
 în fereastra a patra se specifică filtrele asupra înregistrărilor pentru a
reduce numărul acelora care vor fi luate în calcul la realizarea
interogării. Putem avea şi două filtre prin utilizarea conectorilor logici
AND (ce returnează numai înregistrările întâlnite în ambele criterii
specificate) şi OR (ce returnează înregistrările întâlnite în oricare din
criteriile specificate). Se acţionează butonul NEXT pentru a trece la
fereastra următoare;
 în fereastra a cincea se specifică modalitatea de afişare a
înregistrărilor pe baza câmpurilor index ale tabelelor respective
existând două opţiuni Ascending (crescător) şi Descending
(descrescător). Se acţionează butonul NEXT pentru a trece la pasul
următor;
 în fereastra a şasea, de asemenea, putem restricţiona înregistrările ce
dorim a fi afişate în rezultatul interogării. Această restricţionare ţine
seama de cele făcute anterior pe baza filtrelor. De asemenea putem
afişa şi un top al înregistrărilor (primele 6, de exemplu). Putem
previzualiza rezultatul interogării (PREVIEW). Se acţionează butonul
NEXT pentru a trece la pasul final;
 în ultima fereastră se specifică modalitatea de salvare a interogării,
respective. Putem previzualiza din nou rezultatul interogării
(PREVIEW). Se acţionează butonul FINIS pentru a salva
interogarea. Apelarea la crearea unei interogări în mod direct (NEW
FILE) ne va conduce la următoarele ferestre de dialog.

111
Baze de date

Fereastra Add Table or View

Fereastra Query Designer

Fereastra Add Table or View ne ajută la selectarea tabelelor sau


vederilor ce dorim a fi incluse în cadrul interogării. Selectarea tabelei sau
vederii dorite şi acţionarea butonului ADD va determina apariţia tabelei sau
vederii respective în fereastra de sus (QUERY DESIGNER).
Elementele caracteristice ale ferestrei Query Designer sunt:
- Panoul de sus care afişează tabelele şi vederile utilizate în cadrul
interogării. Fiecare tabelă este reprezentată prîntr-o fereastră redimensionabilă
unde sunt cuprinse câmpurile tabelei şi indexul acesteia. De asemenea, se
poate observa şi linia care uneşte câmpurile dintre tabele.
- Fields
 Available Fields - listează toate câmpurile existente în tabelele
utilizate la crearea interogării. Se specifică prima dată tabela, apoi
separată de punct, denumirea câmpului din tabela respectivă;
 Functions and Expression - specifică o funcţie sau o expresie cum
ar fi SUM sau COUNT, etc. Acestea pot fi scrise direct în caseta

112
Visual Foxpro

respectivă sau create cu ajutorul ferestrei Expression Builder. Altfel


spus avem posibilitatea însumării valorilor unui câmp, numărării
cuplurilor, calculării mediei aritmetice a valorilor unui câmp, stabilirii
valorii minime şi maxime dintre valorile unui câmp;
 Selected Fields - lista câmpurilor care apar în rezultatul interogării.
Pentru a adăuga un câmp în această casetă se execută dublu-clic pe
câmpul respectiv, fie se activează butonul ADD. De asemenea, avem
posibilitatea fie renunţării la un anumit câmp prin selectarea acestuia
şi activarea butonului Remove. Dacă dorim ca toate câmpurile din
caseta Available Fileds să facă parte din rezultatul interogării atunci
este mai convenabilă utilizarea butonului ADD ALL, iar dacă vrem să
renunţăm la toate câmpurile atunci utilizăm butonul Remove All;
- Join - specifică condiţiile de compunere pentru înregistrările comune
dintre două sau mai multe tabele sau vederi;
 Type - tipul compunerii - Inner Join, Left Outer Join, Right
Outer Join, Full Join şi None (nu specifică tipul compunerii);
 Field Name - permite alegerea câmpului ce este folosit la stabilirea
condiţiilor de compunere;
 No - dacă este bifat înseamnă că inversează condiţiile, excluzând
înregistrările stabilite prin condiţii;
 Criteria - specifică tipul comparării;
 Value - permite specificarea altor tabele şi câmpuri la stabilirea
condiţiilor de compunere;
 Logical - adaugă o condiţie AND sau OR la lista condiţiilor de
compunere;
 Insert Button - permite inserarea unei noi condiţii de compunere
vide;
 Remove Button - oferă posibilitatea renunţării la o anumită condiţie;
- Filter - permite specificarea condiţiilor pentru selectarea înregistrărilor
ce dorim a fi afişate în rezultatul interogării;

113
Baze de date

- Order By -- stabileşte ordinea de afişare a înregistrărilor rezultate;


- Group By - permite căutarea în funcţie de un grup de câmpuri;
 Having - permite căutarea unor înregistrări care îndeplinesc o
anumită condiţie;
 Miscellaneous - oferă posibilitatea stabilirii unui top sau a afişării
tuturor înregistrărilor, precum şi a renunţării la valorile duplicate
atunci când se afişează rezultatul.
Lansarea în execuţie a unei interogări se face alegând din submeniul
QUERY (apare numai atunci când suntem într-o interogare) opţiunea RUN
QUERY sau alegând semnul exclamării ( ! ) de pe bara cu instrumente (care
devine activ numai atunci când suntem într-o interogare).
De asemenea, rezultatul unei interogări poate fi dirijat către o altă
destinaţie în afară de fereastra Browse care este implicită. Astfel, alegând din
submeniul Query, opţiunea Query Destination se va deschide o nouă
casetă de dialog numită Query Destination, aşa cum rezultă din figura
următoare:

Fereastra Query Destination

În cadrul acestei ferestre distingem mai multe butoane:


 Browse - afişează rezultatul interogării într-o fereastră Browse
pentru examinare şi redactare;
 Cursor - salvează rezultatul într-un cursor. Cursorul este un fişier
temporar care rămâne deschis până în momentul închiderii forţate. În

114
Visual Foxpro

acest fişier nu avem posibilitatea înlocuirii; adăugării sau eliminării


unor înregistrări;
 Table - salvează rezultatul interogării într-un tabel.
 Graph - face ca rezultatul interogării să fie disponibil pentru utilizarea
lui cu Microsoft Graph;
 Screen - afişează rezultatul interogării pe ecran în fereastra activă
sau intr-un fişier text sau la imprimantă;
 Raport,- trimite rezultatul interogării într-un fişier de tip raport sau
într-un fişier text sau la imprimantă;
 Label - trimite rezultatul interogării într-un fişier de tip label sau într-
un fişier text sau la imprimantă ca opţiuni secundare.

115
Baze de date

Capitolul 12
Crearea formularelor

Formularele sunt de mai multe tipuri:


 pentru procesarea tranzacţiilor - sunt acele formulare care adaugă noi
înregistrări în tabelă sau le modifică pe cele existente;
 pentru fundamentarea deciziilor - sunt acele formulare care furnizează
diverse informaţii în scopul luării deciziilor.
Formularele pot fi create cu ajutorul meniului sistem, cu gestionarul de
proiecte, sau cu ajutorul butonului Autoform Wizard de pe bare cu
instrumente ce devine activ numai dacă suntem într-un gestionar de proiecte
poziţionaţi pe tabela respectivă, sistemul cerându-ne doar numele
formularului.
La crearea formularelor cu ajutorul meniului sistem se procedează
astfel: din submeniul File se alege opţiunea New, iar din caseta de dialog ce
se deschide, se acţionează butonul Form. Există două posibilităţi: crearea di-
rectă a unui formular sau utilizarea asistentului Wizard.
Dacă se apelează la gestionarul de proiecte după selectarea obiectului
Form, se activează butonul New, iar apoi se alege varianta dorită.
Alegând ca modalitate de
lucru Wizard-ul, fereastra de dialog
ce se va deschide este următoarea
figura:

Fereastra Wizard Selection

116
Visual Foxpro

În cadrul acestei ferestre avem două moduri de creare a formularelor:


primul creează un formular pe baza unei singure tabele, iar cel de-al doilea
creează un formular pe baza mai multor tabele, adică un formular "unu-la-mai-
mulţi".
Dacă optăm pentru primul mod de lucru (Form Wizard) trebuie parcurşi
următorii paşi:

 în prima fereastră de dialog trebuie să se precizeze numele tabelei


din care se vor prelua câmpurile (dacă există o bază de date deschisă
tabelele cuprinse în cadrul acelei baze de date vor fi afişate în caseta
Database and Table, iar dacă nu se utilizează bază de date, atunci
trebuie să activăm cele trei puncte (...) din dreptul casetei
respective). La selectarea unei tabele câmpurile ce o compun apar
afişate în caseta Available Fileds. De asemenea, trebuie precizate
acele câmpuri care vor face parte efectiv din cadrul formularului
(dacă este un formular doar de adăugare este recomandat să se
selecteze toate câmpurile) prin mutarea acestora din caseta Available
Fileds în caseta Selected Fileds fie prin utilizarea butoanelor existente
între cele două casete amintite mai sus, fie prin executarea unui
dublu-clic pe câmpul respectiv. Se activează apoi butonul Next
pentru a trece la pasul următor ;
 a doua fereastră de dialog oferă posibilitatea alegerii modelului
(Style) de formular pe care îl dorim. Totodată se pot preciza butoane
de control pe formular, precum şi modalitatea acestora de afişare (cu
text sau cu o pictură reprezentativă). Se acţionează apoi butonul
Next pentru a trece la pasul următor;
 în a treia fereastră de dialog trebuie să se specifice câmpul după care
se face sortarea. Putem folosi şi câmpurile index în cadrul sortării. Se
activează apoi butonul Next pentru a trece la pasul următor;

117
Baze de date

 a

p
a
t
r
a
Formularul Elevi

fereastră de dialog oferă posibilitatea salvării formularului sub diferite


forme. Se activează apoi butonul Finish pentru salva formularul.
După parcurgerea acestor paşi, formularul creat pe exemplu de
tabelă din aplicaţie arată astfel:

Al doilea mod de lucru pentru crearea unui formular este acela de ,,unu-
la-mai-mulţi". Acesta creează un formular ce aşează înregistrările "părinte"
individuale şi a tuturor fiilor acestora. Câmpurile tabelei "părinte" apar de
obicei în partea de sus, iar cele ale tabelei "copil" în partea de jos a
formularului.

Pentru realizarea unui astfel de formular se parcurg paşii următori:

 în prima fereastră de dialog se va preciza tabela "părinte" ce se


utilizează la crearea formularului, precum şi câmpurile pe care dorim
a le afişa în cadrul formularului. Se acţionează butonul Next pentru a
trece la pasul următor;

 a doua fereastră de dialog ne oferă posibilitatea specificării tabelei


"copil", precum şi câmpurile acesteia. Se acţionează butonul Next
pentru a trece la pasul următor;

118
Visual Foxpro

 stabilirea relaţiei între tabela părinte şi tabela "copil", precum şi


câmpurile pe care dorim a le afişa în cadrul formularului. Se
acţionează butonul Next pentru a trece la pasul următor;

 în fereastra a treia se va stabili o relaţie între cele două tabele. Se


acţionează butonul Next pentru a trece la pasul următor;

 în a patra fereastră se va alege formatul (stilul) formularului. Se


acţionează butonul Next pentru a trece la pasul următor;

 în a cincea se va preciza câmpul sau câmpurile după care se va face


sortarea;

a şasea fereastră oferă posibilitatea stabilirii titlului formularului şi salvarea


acestuia.

Putem previzualiza formularul dacă activăm butonul Preview. Se


acţionează butonul Finish pentru a salva formularul respectiv.

Dacă se optează însă pentru crearea formularului în mod direct (New


file) (nu cu ajutorul asistentului), atunci fereastra de dialog ce se va deschide
(Form Designer) va arăta astfel:

Fereastra Form Designer

119
Baze de date

Deoarece într-un formular trebuie incluse câmpuri din una sau mai
multe tabele, atunci se procedează astfel: din submeniul View se va alege
opţiunea Data Environment, apoi după selectare va apare caseta de dialog
Data Environment sub următoarea formă (alături va avea caseta de dialog Add
Table or View):

Fereastra Data Environment

În cadrul acestei ferestre de dialog selectăm tabela sau tabelele ce


dorim a fi incluse în formular prin apăsarea butonului Add pe tabela dorită,
după care în mod obligatoriu trebuie să închidem fereastra Add Table or View.
In partea stângă va apărea tabela respectivă.
Pentru a include în corpul formularului câmpurile tabelelor respective,
prin tehnica Drag and Drop mutăm câmpurile din fereastra Data Environment
în fereastra Form Designer. Dacă dorim ca toate câmpurile să facă parte din
formular este suficient să selectăm atributul Fields din fereastra Data Envi-
ronment şi să-1 plasăm în Form Designer.
Ştergerea anumitor câmpuri din corpul formularului se face selectând
câmpul respectiv, iar apoi se apasă tasta DELETE.
Adăugarea de noi câmpuri în formular implică activarea ferestrei Data
Environment şi reluarea procedeului amintit mai sus.

120
Visual Foxpro

Odată cu activarea formularului apar două noi bare cu instrumente şi


anume Form Designer şi Form Control.
Bara cu instrumente Form Designer se prezintă ca în figura:

Bara cu instrumente From Designer

Butoanele existente pe această bară de instrumente sunt următoarele


(în ordine):
 Set Tab Order - schimbă între modul Design şi modul Tab Order
numerotând obiectele, pentru a şti care este ordinea de introducere a
datelor atunci când se lansează în execuţie formularul. Acest buton
este activ numai atunci când în formular se află mai multe obiecte ;
 Data Environment - afişează fereastra Data Environment;
 Properties Window - afişează o fereastră ce reflectă setările
pentru obiectul curent;
 Code Window - afişează fereastra COD pentru obiectul selectat,
pentru a edita codul obiectului respectiv;
 Form Controls Toolbar - afişează sau ascunde bara cu instrumente
Form Controls şi permite alegerea diferitelor obiecte pe care dorim să
le includem în formular;
 Color Patette Toolbar - afişează sau ascunde bara cu instrumente
Color Palette şi oferă posibilitatea colorării fundalului formularului şi
obiectelor; precum şi stabilirea culorii textului;
 Layout Toolbar - afişează sau ascunde bara cu instrumente Layout
Toolbar şi permite aranjarea în formular a diferitelor obiecte utilizate;
 Quick Form... - lansează în execuţie Form Builder-ul care permite
adăugarea de noi câmpuri în formular, precum şi stabilirea unui
anumit stil pentru controalele respective;

121
Baze de date

 Auto Format - lansează AutoForrnat Builder-ul. Pentru a putea


selecta acest buton trebuie obligatoriu să fie selectat cel puţin un
obiect.

Bara de instrumente Form Control este prezentată astfel:

Bară cu instrumente Form Control

Butoanele conţinute de această bară de instrumente sunt, în ordine,


următoarele:

 Select Objects - redimensionează şi mută controalele. După


crearea

 unui control butonul Select Objects este automat selectat cu excepţia


situaţiei în care butonul Button Lock este şi el selectat; ,

 View Classes - permite selectarea şi afişarea diferitelor biblioteci de


clase în cadrul barei de instrumente Forms Controls, precum şi
adăugarea anumitor biblioteci de clase;

 Label - creează un control Label, utilizat pentru textul pe care dorim


să-1 afişăm în formular, fără ca utilizatorii să-1 poată modifica. De
exemplu un text pe care dorim să-1 afişăm deasupra unui grafic;

122
Visual Foxpro

 Text Box - creează un control Text Box care permite utilizatorului,


ca la lansarea în execuţie a formularului, să adauge sau să modifice
un text. Textul poate fi introdus pe o singură linie;

 Edit Box - creează un control Edit Box care permite utilizatorului, la


lansarea în execuţie a formularului, să adauge sau să modifice un
text. Textul poate fi introdus pe mai multe linii;

 Command Button - creează un control numit Buton de comandă


utilizat la executarea în exterior a unei comenzi;

 Command Group - creează un control Command Group ce conţine


două sau mai multe butoane de control cu ajutorul cărora se poate
dirija aplicaţia;

 Option Group - creează un control Option Group, utilizat la afişarea


mai

 multor opţiuni dintre care utilizatorul poate să selecteze numai una;

 Check Box - creează un control Check Box (casetă de validare),


care oferă posibilitatea utilizatorului să aleagă între o condiţie
adevărată sau falsă, sau să afişeze mai multe opţiuni din care să
poată selecta una sau mai multe;

 Combo Box - creează un control Combo Box (casetă combinată) ce


permite utilizatorului să aleagă dîntr-o lista derulantă anumite valori
sau să introducă de la tastatură o anumită valoare, dar care să
existe în listă. Lista respectivă se afişează apăsând pe săgeata din
stânga Combo Box-ului;

 List Box -creează un control List Box, utilizată la afişarea unei liste
din care utilizatorul poate selecta o anumită înregistrare. Lista poate
conţine valori din mai multe câmpuri ale diferitelor tabele utilizate la
realizarea formularului. De menţionat, că aceste informaţii sunt
afişate în acelaşi timp;

123
Baze de date

 Spinner - creează un control Spinner (casetă de modificare


valorică), utilizat pentru incrementarea sau decrementarea unei valori
întregi;
 Grid - creează un control Grid, pentru afişarea datelor într-o formă
tip foaie de lucru Excel;
 Image - afişează o imagine grafică în formular;
 Timer - utilizat pentru planificarea evenimentelor şi pentru stabilirea
intervalelor dintre ele. Nu se observă atunci când lansăm în execuţie
formularul;
 PageFrame - creează un control PageFrame (cadru de pagină)
utilizat
 pentru afişarea mai multor pagini în cadrul aceluiaşi formular;
 OLE Container Control - creează un control OLE Container, care
acceptă adăugarea de obiecte OLE în cadrul aplicaţiei respective;
 OLE Bound Control - permite legarea şi înglobarea obiectelor în
câmpul general al tabelului;
 Line - este utilizată la trasarea diferitelor stiluri de linii în cadrul
formularului;
 Shape - permite includerea în formular a unor figuri geometrice
(cercuri, dreptunghiuri, pătrate, dreptunghiuri rectangulare, pătrate
rotunde, etc.);
 Container - plasează un obiect într-un container.
 Separator - pune spaţii între elementele de control;
 HyperLink - oferă posibilitatea transmiterii datelor pe Internet prin
specificare adreselor respective, precum şi a aducerii diferitelor
informaţii de pe Internet sau chiar publicarea formularului respectiv
pe Internet;
 Builder Lock - dacă este selectat deschide un constructor pentru
orice obiect nou adăugat în formular;

124
Visual Foxpro

 Button Lock - acceptă adăugarea în cadrul aceluiaşi formular a mai


multor controale de acelaşi tip, fără a fi necesar să se reactiveze
butonul controlului respectiv din bara cu instrumente.

După selectarea butonului dorit şi deplasarea mouse-ului pe suprafaţa


formularului, acesta se va transforma într-o cruce, semnificând faptul că
putem trasa obiectul respectiv în cadrul formularului.

Un alt element important în cadrul unui formular îl constituie fereastra


Properties ce se prezintă aşa cum rezultă din figura următoare.

Fereastra Properites

Fereastra Properties, după cum se poate observa este alcătuită din cinci
cadre de pagină (All, Data, Methods, Layout şi Other).
În cadrul acesteia se definesc proprietăţile globale ale formularului cum
ar fi: culoare fundalului, dimensiunea formularului, culoarea şi mărimea
obiectelor, titlul formularului, diferitele evenimente ce caracterizează un obiect,
metodele utilizate în cadrul formularului respectiv, poziţia formularului pe
ecran, etc. Pentru a afişa proprietăţile unui anumit obiect, acesta trebuie în
prealabil selectat.

125
Baze de date

În cadrul acestei ferestre se disting patru elemente şi anume:


- partea de sus, în care se specifică tipul obiectului selectat (în cazul nostru
"Commandl"). Dacă se activează săgeata din dreapta "Combo Box-ului", se

Tipul obiectului

va afişa o listă ce cuprinde toate obiectele existente în formular. Acest


element se prezintă ca în figura următoare (obiectul selectat este un buton
de comandă):
- sub acest prim element din fereastra Properties se pot observa cele
cinci cadre de pagină:
 All - afişează toate proprietăţile, evenimentele şi metodele obiectului
selectat;
 Data - afişează proprietăţile asociate obiectului selectat, precum şi
datele afişate sau manipulate cu acest obiect;
 Method-afişează metodele şi evenimentele asociate obiectului
selectat;
 Layout - afişează toate proprietăţile obiectului selectat cu privire la
poziţia acestuia, culoarea textului scris pe acesta, mărimea obiectului,
etc.;
 Other - afişează diverse proprietăţi despre obiectul selectat, precum
şi unele proprietăţi definite de utilizator.
- un alt element este caseta pentru setarea unor proprietăţi, cum ar fi
numele unui buton. În cadrul acestei casete se pot scrie şi expresii complexe,
prin selectarea butonului fx existent în partea stângă, atunci când anumite
proprietăţi permit acest lucru.

Caseta pentru setarea unor proprietăţi

126
Visual Foxpro

Lista proprietăţilor şi a valorilor aferente

-
- cel de-al patrulea element este reprezentat de o listă a proprietăţilor. Aceste
două coloane afişează toate proprietăţile obiectului selectat în momentul
activării acestei ferestre (Properties). Pe coloana din stânga nu se pot face
modificări, iar pe coloana din dreapta, valorile proprietăţilor ce sunt deja
afişate, pot fi schimbate în timpul proiectării formularului, acestea devenind
setări curente. De menţionat este şi faptul că unele proprietăţi sunt deja
predefinite, utilizatorul alegând din valorile posibile pe cea corespunzătoare.

127
Baze de date

Capitolul 13
Crearea rapoartelor

Unul din marile avantaje ale SGBD-ului Visual FoxPro îl constituie


generarea de rapoarte succesive.
Un raport se poate crea cu meniul, cu ajutorul gestionarului de proiecte,
sau cu butonul AutoReport Wizard de pe bara cu instrumente (devenit activ
după poziţionarea pe o anumită tabelă din cadrul unei baze de date).
Dacă se apelează la AutoReport Wizard de pe bara cu instrumente,
atunci utilizatorului i se va cere doar numele raportului pentru salvarea
acestuia, generându-se în mod automat un raport.
Utilizându-se meniul sistem, paşii ce trebuiesc parcurşi sunt următorii:
- se selectează din submeniul File, opţiunea New, iar din fereastra de
dialog, ce se va deschide se va alege butonul radio Report,
apăsându-se apoi pe butonul New file;
- avem două posibilităţi de creare a unui raport, fie utilizând asistentul
(Wizard), fie crearea în mod direct.
Dacă se apelează la gestionarul de proiecte, se va selecta obiectul
Report, apăsându-se apoi butonul New. Avem astfel, posibilitatea alegerii

Fereastra New Raport

128
Visual Foxpro

aceloraşi metode de creare a unui raport.


Dacă se optează pentru folosirea Wizard-ului, fereastra de dialog apare
aşa cum rezultă din figura următoare:

Fereastra Wizard Selection

După cum se poate observa există două opţiuni: One-to-many Report


Wizard şi Report Wizard.
Alegând prima opţiune trebuie să se parcurgă următorii paşi:
- Se vor selecta câmpurile din tabela "părinte" de unde dorim să
afişăm date în raport. Se activează butonul Next pentru a trece la
pasul următor;
- Se vor selecta câmpurile din tabela "copil" de unde dorim afişarea în
raport. Se activează butonul Next pentru a trece la pasul următor;
- Se stabilesc relaţiile între tabelele alese mai sus ca făcând parte din
raport. Se activează butonul Next pentru a trece la pasul următor;
- Se stabileşte ordinea de afişare a rezultatului raportului. Se activează
butonul Next pentru a trece la pasul următor;
- Se alege stilul raportului şi modul lui de afişare (Portrait sau
Landscape). De asemenea, putem stabili gradele de total prin

129
Baze de date

activarea butonului Summary Options. Se activează butonul Next


pentru a trece la pasul următor;
Se stabileşte modalitatea de salvare a raportului. Totodată, putem
specifica titlu raportului şi previzualizarea rezultatelor raportului. Se activează
butonul Finish pentru a salva raportul.
Dacă se alege cea de-a doua opţiune din cadrul ferestrei Wizard Selec-
tion, se va avea în vedere faptul că în cadrul acestui raport nu va fi luată în
discuţie decât o singură tabelă.
Paşii ce trebuiesc parcurşi sunt:
- Se va selecta tabela a1e cărei câmpuri dorim să le afişăm în raport;
- Se selectează stilul raportului;
- Se selectează orientarea pe pagină a raportului, numărul coloanelor
de pe pagină, precum şi modul de afişare a câmpurilor (pe orizontală
sau pe verticală);
- Se precizează ordinea de afişare a câmpurilor în cadrul raportului;
- Se alege modalitatea de salvare a raportului. Totodată, putem
specifica titlu raportului şi previzualiza rezultatele raportului. Se
activează butonul Finiş pentru a salva raportul.
După executarea paşilor de mai sus raportul obţinut apare ca în figura

Situaţia rezultatelor finale

130
Visual Foxpro

următoare:
Optând în continuare pentru crearea unui raport ce nu are la bază un
asistent (Wizard), adică o creare în mod direct, va trebui să definim fereastra
de dialog ce va apare după activarea butonului New Report. Pe ecran va
apare o fereastră aşa cum rezultă din figura:

Fereastra Report Designer

Elementele caracteristice ale acestei ferestre sunt:


 Page Header - cuprinde atât date fixe cât şi variabile cum ar fi, data
raportului, titlul, etc.;
 Detail - este o suprafaţă a raportului care conţine una sau mai multe
linii pentru fiecare înregistrare dîntr-o tabelă de listat. Altfel spus
această zonă este corpul propriu-zis al raportului;
 Page Footer - cuprinde date care sunt de regulă afişate în josul
paginii, cum ar fi de exemplu numărul de pagină.
În cadrul acestei ferestre mai pot fi adăugate încă două zone de lucru.
Afişarea acestora se realizează cu meniul sistem, selectând din submeniul
Report (ce devine activ numai când suntem în modul de lucru Report

131
Baze de date

Wizard), opţiunea Title/Summary, respectiv Title Band şi Summary Band.


Astfel, în banda Title vor fi introduse informaţii ce vor fi afişate numai la
începutul raportului, iar în banda Summary vor fi introduse informaţii vor fi
afişate numai la sfârşitul raportului.
Pentru adăugarea informaţiilor în raport (mai exact în banda Detail) se
va selecta din submeniul View, opţiunea Data Environment (fereastră
cunoscută de la formulare).
Utilizând aceleaşi procedee de mutare a câmpurilor de la formulare,
poziţionăm câmpurile dorite în zona de lucru Detail.

Bara cu instrumente Report Designer este următoarea:

Bară cu instrumente Report Designer

Elementele existente pe această bară, în ordine, sunt următoarele:


 Data Grouping - afişează caseta de dialog Data Grouping care ne
permite gruparea datelor şi specificarea proprietăţilor lor;
 Data Environment - afişează fereastra Data Environment;
 Report Controls Toolbar - afişează bara cu instrumente Report
Controls;
 Color Palette Toolbar - afişează sau ascunde bara cu instrumente
Color Palette ce oferă posibilitatea colorării atât a fundalului
raportului, cât şi al obiectelor, precum şi stabilirea culorii textului;
 Layout Toolbar - afişează sau ascunde bara cu instrumente Layout
Toolbar ce permite aranjarea în raport a diferitelor obiecte utilizate.
Un a1t instrument util în cadrul rapoartelor îl constituie bara cu
instrumente, Report Controls, care apare aşa cum rezultă din figura.

132
Visual Foxpro

Caracteristicile acestor butoane sunt următoarele (în ordine):

Bară cu instrumente report Controls

 Select Object - redimensionează sau mută un obiect selectat. După


crearea unui control, acest buton este automat selectat dacă butonul
Button Lock nu este apăsat;
 Label - creează un control Label, utilizat pentru textul pe care dorim
să-1 afişăm în formular, fără ca utilizatorii să-1 poată modifica. De
exemplu un text pe care dorim să-1 afişăm deasupra unui grafic;
 Field - inserează un câmp, utilizat la afişarea variabilelor de memorie
sau a altor expresii;
 Line - este utilizată la trasarea diferitelor stiluri de linii în cadrul
raportului;
 Rectangle - permite trasarea dreptunghiurilor în cadrul raportului;
 Rounded Rectangle - trasează diferite figuri geometrice ce au
colţurile rotunjite;
 Picture/OLE Bound Control - permite afişarea unei picturi sau
conţinutul unui câmp;
 Button Lock - acceptă adăugarea în cadrul aceluiaşi raport a mai
multor controale de acelaşi tip, fără a fi necesar să se reactiveze
butonul controlului respectiv din bara cu instrumente.

133
Baze de date

În urma efectuării operaţiilor prezentate mai sus, pe un exemplu de


tabelă din aplicaţie, fereastra Report Designer se prezintă aşa cum este în
figura următoare:

Fereastra Report Designer

134
Visual Foxpro

Capitolul 14
Proiectarea vizuală a meniurilor şi a barelor de
instrumente

Meniurile şi barele de instrumente pun la dispoziţia utilizatorilor o


metodă structurală şi accesibilă de lucru cu comenzile şi instrumentele
aplicaţiilor efectuate. Planificarea şi proiectarea corespunzătoare a
meniurilor şi a barelor de instrumente constituie o garanţie că principalele
funcţionalităţi ale aplicaţiei vor fi valorificate
Capitolul de faţă tratează următoarele subiecte:
 Utilizarea meniurilor în cadrul aplicaţiilor;
 Crearea unor bare de instrumente personalizate;
 Testarea şi depanarea unui sistem de meniuri;
 Personalizarea unui sistem de meniuri.

14.1. Utilizarea meniurilor în cadrul aplicaţiilor


Dacă meniurile sunt bine proiectate, utilizatorii încep să înţeleagă
aplicaţia, dezvoltând un model mental bazat numai pe organizarea meniurilor
şi a conţinutului acestora. Cu ajutorul Proiectantului de Meniuri (Menu
Designer) din Visual FoxPro, se pot crea meniuri care îmbunătăţesc calitatea
aplicaţiilor.
Fiecare segment al unei aplicaţii Visual FoxPro poate avea propriul
sistem, sau set de meniuri. Secţiunile care urmează arat cum poate fi creat un
sistem de meniuri, dar nu explică modul de integrare a acestuia în contextul
aplicaţiei.
 Secţiunile care urmează prezintă:
 Crearea unui sistem de meniuri
 Planificarea unui sistem de meniuri

135
Baze de date

 Crearea de meniuri, meniuri contextuale, articole de meniu şi


submeniuri
 Atribuirea unor sarcini specifice sistemului de meniuri

14.2.Crearea unui sistem de meniuri


Cea mai mare parte a procesului de creare a unui sistem de meniuri se
desfăşoară în fereastra Proiectantului de Meniuri (Menu Designer), în cadrul
căreia creaţi efectiv meniurile, submeniurile şi opţiunile de meniu.

14.3.Proiectantul de Meniuri

Crearea unui sistem de meniuri comportă mai mulţi paşi. Indiferent de


mărimea aplicaţiei şi de complexitatea meniurilor pe care vreţi să le folosiţi,
procedaţi astfel:
 Planificarea şi proiectarea sistemului.
 Alegerea meniurilor necesare, unde vor apărea acestea în cadrul
interfeţei, care dintre ele vor avea submeniuri ş.a.m.d.
 Crearea meniurile şi submeniurile.
 Cu ajutorul Proiectantului de Meniuri (Menu Designer), definirea
titlurile meniurilor, ale articolelor de meniu şi ale submeniurilor.

136
Visual Foxpro

 Atribuirea anumite sarcini sistemului, astfel încât acesta să facă exact


ceea ce este necesar. Specificarea sarcinilor ce revin meniurilor, cum
ar fi afişarea unor formulare şi casete de dialog. Suplimentar,
inserarea codului de iniţializare şi codului de activare. Codul de
iniţializare este executat înainte de definirea sistemului de meniuri şi
poate cuprinde instrucţiuni pentru deschiderea fişierelor, pentru
declararea unor variabile sau pentru plasarea sistemului de meniuri
într-o stivă de unde poate fi preluat ulterior. Codul de activare este
executat după codul de definire a meniurilor, activând sau
dezactivând meniurile şi articolele acestora.
 Generarea programul pentru meniuri.
 Rularea programul în vederea testării sistemului.

14.4. Planificarea unui sistem de meniuri

Utilitatea unei aplicaţii depinde şi de calitatea sistemului de meniuri.


Atunci când se proiectează sistemul de meniuri, se ţine cont de următoarele
recomandări:
 Organizarea sistemul în funcţie de operaţiile pe care le vor executa
utilizatorii, nu în funcţie de ierarhia programelor aplicaţiei. Utilizatorii
îşi construiesc un model mental al structurii aplicaţiei prin simpla
examinare a meniurilor şi a articolelor de meniu. Pentru a proiecta
eficient aceste meniuri şi articole de meniu, trebuie să se cunoască
aşteptările utilizatorilor şi modul în care ei vor lucra cu meniurile.
 Se atribuie fiecărui meniu un titlu sugestiv.
 Se organizează articolele de meniu în funcţie de frecvenţa cu care
vor fi folosite, de ordinea lor logică sau alfabetică. Dacă nu se poate
anticipa frecvenţa utilizării şi nici să se stabilească o ordine logică,
organizează articolele de meniu alfabetic. Ordinea alfabetică este
eficientă îndeosebi când meniul cuprinde mai mult de opt articole.

137
Baze de date

Având atâtea articole de meniu în faţa ochilor, utilizatorul va pierde


timp cu căutarea; ordinea alfabetică simplifică acest proces
 Introducerea liniilor de separaţie între grupurile logice de articole de
meniu.
 Limitarea articolele dintr-un meniu la cele care pot fi afişate într-un
singur ecran.
 Dacă acest lucru nu este posibil, se creează submeniuri pentru unele
articole de meniu.
 Pentru fiecare meniu şi articol de meniu, se stabilesc taste de acces
şi de comandă rapidă. De exemplu, pentru meniul File, tastele de
acces ar putea fi ALT+F.
 Se folosesc cuvinte care să descrie clar articolele de meniu.
 Se folosesc pentru articolele de meniu atât litere mari, cât şi litere
mici.

14.5. Crearea meniurilor, a articolelor de meniu şi a submeniurilor

După ce s-a planificat sistemul de meniuri, acesta se poate crea cu


ajutorul Proiectantului de Meniuri (Menu Designer). Acesta ajută la creaţi
meniurilor, meniurilor contextuale, articolelor de meniu, submeniurilor ale
articolelor de meniu, liniilor de separaţie între grupuri de articole de meniu
înrudite s.a.m.d.

14.5.1. Crearea meniurilor


Meniurile pot fi create prin personalizarea sistemului de meniuri din
Visual FoxPro sau prin generarea propriului sistem de meniuri. Pentru a porni
de la sistemul de meniuri existent în Visual FoxPro, foloseşte opţiunea Quick
Menu.
Se creează un sistem de meniuri cu ajutorul opţiunii Quick Menu

138
Visual Foxpro

1. Din cadrul Gestionarului de Proiecte (Project Manager),se selectează


fişa Other, apoi Menu şi, în fine, New.

2. Se selecteazaMenu, în acest moment, va apărea Proiectantul de


Meniuri (Menu Designer).

3. Din meniul Menu, se alega Quick Menu.

Proiectantul de Meniuri oferă informaţii despre meniurile principale din


Visual FoxPro.

Sistem de meniuri creat cu ajutorul opţiunii Quick Menu

Se personalizează sistemul de meniuri prin adăugarea sau modificarea


articolelor de meniu. De exemplu, se introduce un meniu Customer înaintea
meniului Help selectând butonul de mutare asociat meniului Help, alegând
butonul Insert şi scriind Customer în coloana Prompt. Rezultatul arată astfel:

139
Baze de date

14.5.2. Un sistem de meniuri personalizat

Buton de mutare

Înainte de a se utiliza un meniu în cadrul aplicaţiei, acesta trebuie generat.

14.6. Generarea unui meniu

Din cadrul meniului Menu, se selecteaza Generate.

Visual FoxPro cere salvarea sistemul de meniuri într-un fişier cu extensia


.mnx. Acest fişier este o tabelă care va păstra toate informaţiile referitoare la
sistemul de meniuri. După salvarea sistemului de meniuri, Visual FoxPro
solicită numele unui fişier de ieşire cu extensia .mpr. Acest fişier va conţine
programul meniului generat.

14.7. Atribuirea unor sarcini specifice sistemului de meniuri

Atunci când se creează un sistem de meniuri, trebuie să se ia în


considerare uşurinţa accesului la sistem şi să atribuie meniurilor sarcini
specifice. Meniurile şi articolele de meniu trebuie să îndeplinească anumite
operaţii, cum ar fi afişarea unor formulare, bare de instrumente şi a altor
meniuri. De asemenea, ar trebui definite o serie de taste de acces rapid la
sistemul de meniuri. În plus, se pot adăuga taste de comandă rapidă şi activa

140
Visual Foxpro

sau dezactiva articolele de meniu pentru a avea mai mult control asupra
sistemului.

14.8. Atribuirea unor taste de acces rapid


Meniurile bine proiectate au asociate taste de acces rapid la
funcţionalităţile lor. Tasta de acces este reprezentată de o literă subliniată în
titlul meniului sau al articolului de meniu. De exemplu, meniul File din Visual
FoxPro foloseşte litera "F" pe post de tastă de acces rapid.
Dacă nu se atribuie o tastă de acces rapid unui titlu de meniu sau unui
articol de meniu, Visual FoxPro desemnează automat prima literă a titlului ca
tastă de acces rapid.

14.9. Meniuri cu taste de acces rapid

Se specifica tasta de acces rapid pentru un meniu sau un articol de


meniu
 Se introduce\< în stânga literei ce trebuie desemnata ca tastă de
acces rapid.

Stabilirea tastelor de comandă rapidă


În afară de tastele de acces rapid, se pot stabili taste de comandă
rapidă pentru meniuri şi articole de meniu. La fel ca tastele de acces rapid,
tastele de comandă rapidă permit selectarea unui meniu sau a unui articol de
meniu ţinând apăsată o tastă în momentul apăsări alteia. Diferenţa între
tastele de acces rapid şi tastele de comandă rapidă constă în faptul că tastele
de comandă rapidă permit selectarea unui articol de meniu fără a mai afişa
meniul. Tastele de comandă rapidă pentru articolele de meniu Visual FoxPro

141
Baze de date

sunt combinaţii ale tastelor CTRL sau ALT cu alte taste. De exemplu, se poate
crea un nou fişier Visual FoxPro apăsând tastele CTRL+N.
Pentru a specifica o tastă de comandă rapidă pentru un meniu sau un
articol de meniu se efectuează paşii:
1. În cadrul coloanei Prompt, se selectează titlul meniului sau al
articolului de meniu.
2. În cadrul coloanei Options, se selectează butonul care afişează
caseta de dialog Prompt Options
3. În cadrul casetei Key Label, se apasă o combinaţie de taste pentru a
crea un set de taste de comandă rapidă. Dacă un articol de meniu nu
are asociată o tastă de comandă rapidă, Visual FoxPro afişează
mesajul "(press the key)" în cadrul casetei Key Label.
4. În caseta Key Text, se adaugă textul care trebuie să apară lângă
articolul de meniu. În mod implicit, Visual FoxPro repetă tastele de
comandă rapidă din caseta Key Label în caseta Key Text. Cu toate
acestea, textul din caseta Key Text poate fi modificat dacă se doreşte
ca aplicaţia să afişeze un alt text. De pildă, dacă atât Key Label cât şi
Key Text sunt CTRL+R, valoarea Key Text poate fi modificată în ^R.

14.10 Atribuirea unor sarcini specifice meniurilor şi articolelor


de meniu
Când se selectează un meniu sau un articol de meniu, acestea trebuie
să îndeplinească o sarcină, cum ar fi afişarea unui formular, a unei bare de
instrumente sau a unui alt sistem de meniuri. Pentru a îndeplini o sarcină, un
meniu sau un articol de meniu trebuie să execute o comandă Visual FoxPro.
Comanda poate fi cuprinsă într-o linie de cod sau poate fi un apel de
procedură.
Îndeplinirea sarcinilor cu ajutorul comenzilor
Pentru a îndeplini o sarcină, un meniu sau un articol de meniu trebuie să
aibă asociată o comandă. Aceasta poate fi orice comandă Visual FoxPro,

142
Visual Foxpro

inclusiv un apel al programului existent pe cale sau o procedură definită de


opţiunea Cleanup din cadrul casetei de dialog
Pentru a atribui o comandă unui meniu sau unui articol de meniu se
efectuează paşi:
1. În cadrul coloanei Prompt, se selectează titlul meniului sau al
articolului de meniu dorit.
2. În cadrul casetei Result, se selectează Command.
3. În dreapta casetei Result, introduceţi comanda corespunzătoare.

Atribuirea unei comenzi pentru un meniu

Introduceţi comanda

Afişarea formularelor şi a casetelor de dialog


Un formular sau o casetă de dialog compilate pot fi afişate dintr-un
meniu sau dintr-un articol de meniu prin apelarea cu o comandă sau cu o
procedură. De exemplu, pentru a afişa un formular numit "Orders", se
foloseşte comanda care urmează:
DO FORM Orders

143
Baze de date

Partea II. Aplicaţii

Capitolul 1.
Funcţiile SGBD-ului Visual Foxpro. Tipuri de fişiere Visual
Foxpro. Limitele SGBD-ului Visual Foxpro.

Funcţiile SGBD-ului Visual Foxpro:

1. Descrierea structurii tablelor din cadrul bazei de date


2. Actualizarea bazei de date prin:
a. Adăugare de înregistrări
b. Modificare de înregistrări
c. Ştergere de înregistrări
3. Interogarea bazei de date utlizând atât un limbaj propriu, cât şi limbajul
SQL
4. Asigurarea dialogului sistem-utilizator printr-o interfaţă dezvoltată faţă
de alte SGBD-uri
5. Utilizarea tehnicilor avansate de regăsire, selectare şi grupare a datelor

Tipuri de fişiere Visual Foxpro

 Baza de date - .DBC – pentru tabele de date


 Baza de date – .DCT – pentru fişiere memo
 Baza de date - .DCX – pentru fişiere index
 Tabela - .DBF
 Fişier index simplu - .IDX
 Fişier index compus - .CDX

144
Visual Foxpro

 Fişier ecran - .SCX


 Fişier format generat - .FRT
 Fişier format compilat - .PRX
 Fişier vedere - .VUE
 Fişier text ASCII - .TXT
 Fişier salvarea variabile memorie - . MEM
 Fişier de tip memo - .FPT
 Fişier ecran memo - .SCT
 Fişier raport - .FRX
 Fişier raport memo - .FRT
 Fişier program - .PRG
 Fişier program compilat- .PRG
 Fişier program executabil - .EXE
 Fişier backup - .BAK
 Fişier meniu - .MNT
 Fişier program meniu generat - .MPR
 Fişier program meniu compilat - .MPX
 Fişier proiect - .PJX
 Fişier erori - .ERR
 Fişier aplicaţie generală - .APP
 Fişier document raport - .DOC

Limitele SGBD-ului Visual Foxpro

 1 bilion de înregistrări într-o tabelă


 65000 octeţi pe înregistrare
 255 câmpuri pe înregistrare
 254 caractere pe fiecare înregistrare
 20 caractere pentru fiecare câmp de tip numeric
 8 caractere pentru fiecare câmp de tip data calendaristică

145
Baze de date

 1 caracter pentru fiecare câmp de tip logic


 32767 zone de lucru
 tablouri cu două dimensiuni
 număr nelimitat de linii într-un program sursă
 25 de ferestre BROWSE deschise simultan

Meniul sistem are următoarele opţiuni:

Submeniul File conţine următoarele opţiuni:

Optiune din Efect


meniu
New . . . Se deschide o fereastra de dialog, care ofera cateva
optiuni cu ajutorul carora se pot crea diferite fisiere:
fisiere de tip proiect ; fisiere de tip baze de date ;fisiere
de tip tabela; fisiere de tip interogare ; fisiere de tip
views; fisiere de tip formular ; fisiere de tip program;
fisiere de tip rapoarte ; fisiere de tip etichete ; fisiere de

146
Visual Foxpro

tip clase; fisiere de tip meniu;


fisiere de tip text
Open . . . Se deschide o fereastra de dialog care permite
deschiderea orcarui tip de fisier şi care se afla pe
calculator sau in retea
Close Inchide fereastra activa
Save Deschide o fereastra de dialog pentru a salva informatiile
din fisierul curent, sau salveaza modificarile efectuate
pana in acel moment
Save as . . . Se foloseste pentru crearea unei copii a fisierului curent
sub o alta denumire specificata de utilizator
Save as HTML Salveaza fisierul sub format HTML
...
Revert Anuleaza toate modificarile efectuate in fisierul curent.
Este asemanatoare cu comanda UNDO, dar spre
deosebire de aceasta anuleaza toate modificarile
Import . . . Importa in Visual Foxpro, un fisier cocntruit cu o alta
aplicatie
Export . . . Exporta un fisier al Visual Foxpro intr-un alt format (de
exemplu: Microsoft Excel, Lotus 1-2-3, Dbase, etc.)
Page setup . . Formateaza paginele documentului şi stabileste
. configurarea imprimantei pentru acel fisier
Print preview Prezinta fisierul într-o fereastra, exact asa cum va aparea
la imprimanta
Print . . . Listeaza fisierul curent
Send . . . Permite trmiterea unui e-mail
Exit Inchide aplicatia Visual Foxpro. Este echivalenta cu
comanda QUIT ce poate fi efectuata in fereastra de
comenzi

147
Baze de date

Submeniul Edit contine urmatoarele optiuni:

Optiune din Efect


meniu
Undo Anuleaza un numar nelimitat de schimbari facute in
sesiunea de editare curenta. Schimbarile facute dupa
ultima salvare, pe durata aceleiasi sesiuni de lucru, sunt
ireversibile.
Redo Este efectul invers al optiunii Undo (reface ceea ce a fost
anulat cu Undo)
Cut Muta textul selectat sau obiectul din documentul current
sil il plaseaza in Clipboard
Copy Efectueaza o copiere a unui text selectat anterior sau a
unui obiect, plasandu-l in Clipboard

148
Visual Foxpro

Paste Copiaza continutul din Clipboard in locul unde este plasat


cursorul in acel moment

Paste Special . Este folosit la inserarea obiectelor OLE dîntr-o alta


.. aplicatie intr-un câmp general.

Clear Sterge textul selectat fara copierea lui in Clipboard

Select All Selecteaza toate obiectele din fereastra cuirenta. Aceasta


optiune este utilizata in modul de lucru Form Designer şi
Raport Designer pentru a muta sau a formata toate
obiectele in acelasi timp

Find . . . Afiseaza caseta de dialog “Find” care este utilizata la


localizarea unui text intr-un fisier. Aceasta optiune ofera
posibilitatea cautarii unui text fara a face diferentieri intre
litere mari şi mici, de la inceputul documentului pana la
sfarsit şi invers.

Find Again Permite reluarea cautarii de unde a ramas pozitionat


cursorul pentru acelasi cuvant care indeplineste aceleasi
conditii de cautare

Replace . . . Afiseaza caseta de dialog “Replace” care este utlizata la


localizarea şi inlocuirea textului respectiv in fisierul curent.

Go to line . . . Permite deplasarea la o anumita linie intr-un fisier


program

Insert Object . Similar cu Paste Special, exceptand cazul cand nu este


.. preluat un obiect deja existent şi cand este memorat in
Clipboard.

Object . . . Permite selectarea unui obiect

Links . . . Deschide fisierele legate intre ele şi este capabil sa


editeze legaturile

Properties . . . Afiseaza caseta de dialog “Edit properties” ce permite


definirea unor optiuni de ditare, de salvare şi de scriere

149
Baze de date

cum ar fi : alinierea textului, numarul se spatii intr-un


Tab, fontul cu care dorim sa editam, precum şi culoarea
cuvintelor rezervate SGDB-ului Visual Foxpro.

Submeniul View contine doar submeniul Toolbars(instrumente) care are


urmatoarele optiuni:

Submeniul Format
contine urmatoarele optiuni
care apar atunci cand se
apeleaza o optiune din modul
de lucru Designers (editarea
unui program, realizarea unui
formular sau a unui raport,
etc.):

150
Visual Foxpro

Optiune din Efect


meniu
Font . . . Permite selectarea fontului şi a caracteristicilor acestuia,
in cadrul editarii unui program
Enlarge Font Permite marirea fontului utilizat in fereastra curenta
Reduce Font Permite reducerea fontului utilizat in fereastra curenta
Single Space Seteaza un singur spatiu intre randurile de text prezente
in fereastra activa
1 ½ Space Seteaza o linie şi jumatate ca spatiu intre randurile de text
prezente in fereastra activa
Double Space Seteaza doua linii ca spatiu intre randurile de text
prezente in fereastra activa
Indent Adăuga un numar de spatii inaintea liniei curente sau a
liniilor selectate din cadrul ferestrei active
Unindent Este efectul invers a optiunii Indent
Comment Transforma linia curenta sau cele selectate in comentarii,
fiind ignorate la lansarea in executie a programului
Uncomment Anuleaza efectul optiunii Comment
Align Deschide optiunile de aliniere a obiectelor selctate atunci
cand se luicreaza cu formulare şi rapoarte
Size Deschide optiunile de stabilire a marimii obiectelor
selectate din cadrul formularelor şi a rapoartelor
Horizontal Furnizeaza optiuni de ajustare a spatiului, pe orizontala,
Spancing intre obiectele selectate
Vertical Furnizeaza optiuni de ajustare a spatiului, pe verticala,
Spacing intre obiectele selectate
Bring to Front Muta obiectele selectate inaintea obiectelor dintr-un
formular sau raport
Send to Back Muta obiectele selectate in spatele obiectelor dintr-un

151
Baze de date

formular sau raport

Group Grupeaza o selectie de obiecte dintr-un formular într-o


entitate, avand astfel posibilitatea prelucrarii simultate a
acestora

Ungroup Este efectul invers al optiunii Group

Snap to Grid Atunci cand dorim sa mutam obiectele din cadrul unui
formular sau raport, coltul din stanga sus al acestora se
repozitioneaza in cea mai apropriata intersectie a retelei
dupa eliberarea butonului de mouse

Set Grid Scale Stabileste distanta dintre liniile orizontale şi verticale din
cadrul unui formular sau raport

Text Aligment Permite alinierea textului din interiorul obiectului selectat

Fill Defineste un model de umplere pentru forme. Este activa


numai in cadrul raportelor in sectiunea Detail

Pen Stabileste grosimea şi stilul liniei pentru forme. Este activa


numai in cadru unui raport in sectiunea Detail

Mode Stabileste dacă background-ul unui obiect este opac sau


transparent

Submeniul Tools
contine urmatoarele
optiuni:

152
Visual Foxpro

Optiune din Efect


meniu

Wizards Listeaza şi permite accesul la asistentii Visual Fozpro care


creeaza tabele, formulare, rapoarte, interogari, etichete,
etc.

Spelling . . . Permite verificarea ortografica a canpurilor text şi memo

Macros . . . Defineste şi intretine macrocomenzile asociate tastaturii

Class Browser Examineaza continutul oricarei clase pentru vizualizarea


proprietatilor şi metodelor ei sau codul actual utilizxat la
crearea obiectului

Beautify . . . Specific fisierelor de tip program, ofera posibilitatea unei


vizualizari mai clare a textului respective facand
diferentieri intre cuvintele cheie şi restul cuvintelor din
text. Are efect asupra intregului document.

Debugger Deschide fereastra Debugger. Aceasta aduce imbunatatiri


ferestrelor Debud şi Trace adăugand şi fereste pentru
supravegherea variabilelor locale, apelarii stivelor,
urmaririi evenimentelor şi analiza corelatiilor pe durata
testarii programului respectiv

Options . . . Permite accesul la optiunile de configurare ale SGBD


Visual Foxpro (View, Regional, Genral, Data, etc.)

Submeniul Programs contine


urmatoarele optiuni:

153
Baze de date

Optiune din Efect


meniu

Do . . . Lanseaza in executie programul selectat din caseta de


dialog ce se activeaza

Cancel Anuleaza executia programului curent

Resume Reia executia programului curent din starea in care a fost


suspendata aceasta executie

Suspend Opreste executia programului curent, dar nu il elimina din


memorie

Compile . . . Comverteste fisierul sursa in cod obiect

Run Lanseaza in executie programul curent (apare sub forma


Do nume.prg)

Submeniul Window
contine urmatoarele
optiuni:

Optiune din Efect


meniu

Arrange All Aranjeaza ferestrele deschise sub forma unor


dreptunghiuri adiacente pe intreaga suprafata a ecranului

Hide Ascunde fereastra activa, insa nu o elimina din memorie

154
Visual Foxpro

Clear Sterge textul din spatiul de lucru al unei aplicatii in


momentul lansarii ei inexecutie sau din fereastra de iesire
curenta şi anume fereastra Command
Cycle Trece de la o fereastra activa la alta, activand-o pe ultima
Command Activeaza fereastra de comanda şi o afiseaza deasupra
Window celorlalte
Data Session Activeaza fereastra Data Session şi o afiseaza deasupra
celorlalte. Aceasta fereasta serveste ca instrument de
evaluare pentru monitorizarile tabelelor care sunt deschise
in fiecare ddin cele 32767 zone de lucru

Submeniul Help
contine urmatoarele
optiuni:

Optiune din Efect


meniu
Contents Afiseaza informatii de asistenta prin intermediul unui format
de structura
Technical Furnizeaza o lista de resurse Microsoft disponibile pentru
Support obtinerea de informatii suplimentare de asistenta.
About Afiseaza ecranul copyright dedicat produsului, care contine
Microsoft şi informatii despre posesorul licentei, data versiunii,
Visual Foxpro numele fisierului de resurse, direcorul prestabilit şi

155
Baze de date

... indicativul produsului (ID)

156
Visual Foxpro

Capitolul 2

Actualizarea tabelelor prin comanda BROWSE.

Căutare şi pozitionare. Sortare şi duplicare(copiere).

Comenzi de actualizare.

1. Actualizarea tabelelor prin comanda BROWSE

Pentru a actualiza datele introduse într-o tabelă, se poate folosi o


comandă, ce permite modificarea interactivă a informaţiilor prin apariţia unei
ferestre de modificare. Aceasta comandă se numeşte BROWSE şi are
următoarea sintaxă:

BROWSE [FIELDS <câmp1>] [LOCK <nr>] [<domeniu>] [FOR


<conditie>] [FREEZE <nume_câmp>] [NOAPPEND] [NOMENU]
[NOEDIT] [NODELETE]

 Clauza FIELDS permite specificarea câmpurilor care vor forma coloanele


tabelului; dacă lipseşte se vor afişa toate coloanele tabelului, în ordinea
în care apar ele în tabel.

 Clauza <domeniu> permite selectarea liniilor care vor fi afişate

 Clauza FOR <condiţie> permite de asemenea selectarea liniilor care vor


fi afişate

 Clauza LOCK <nr> permite îngheţarea pe ecran a primelor <nr>


coloane (câmpuri) în timpul defilării tabloului BROWSE spre stânga sau
spre dreapta

 Clauza FREEZE <nume_câmp> permite menţinerea cursorului pe o


singură coloană

157
Baze de date

 Clauza NOAPPEND interzice adăugarea de noi articole în tabel; în lipsa


acestei clauze se pot adăuga, pe rând noi linii(înregistrări) în tabel, prin
combinaţia de taste CTRL+Y
 Clauza NODELETE împiedică ştergerea accidentală de articole
 Clauza NOEDIT interzice editarea articolelor

Considerăm tabela STUDENT.DBF (Matricol N(4),


Exemplu: Nume C(20), Prenume C(20), Cnp C(13), Grupa C(4),
Media N(5,2)). Să se efectueze următoarele operaţii:

- să se afişeze toţi studenţii înghetând primele trei coloane


- să se afişeze numai numele şi grupa studentilor, precum şi media
fiecăruia
- să se afişeze numai studenţii din grupa 116a
- să se afişeze primii 15 studenţi, fixând pentru modificare câmpul media
Pentru aceste cerinţe se pot introduce următoarele comenzi:

BROWSE LOCK 3

BROWSE FIELDS NUME,GRUPA,MEDIA

BROWSE FOR GRUPA=’116a’

BROWSE NEXT 15 FREEZE MEDIA

Odată cu comanda BROWSE, pe ecran, mai exact în meniul sistemului


apare un nou meniu numit TABLE, cu următoarele opţiuni:

158
Visual Foxpro

o Opţiunea Properties deschide un ecran de dialog care permite


utilizatorului să filtreze datele, să selecteze câmpurile, sî precizeze
câmpul index activ, etc.
o Opţiunea Go to Record permite
poziţionarea pe o anumită înregistrare
dată prin numărul ei sau prin căutare cu
Locate
o Opţiunea Append New Record
adăugă o nouă înregistrare
o Opţiunea Toggle Deletion Mark
marchează pentru ştergere înregistrarea
curentă
o Opţiunea Append Records permite
compunerea comenzii APPEND FROM
o Opţiunea Delete Records deschide
ecranul pentru ştergerea înregistrărilor
o Opţiunea Recall Records permite anularea marcajelor de ştergere
o Opţiunea Remove Records ştergerea efectivă a înregistrărilor marcate
o Opţiunea Replace Field deschide ecranul pentru compunerea comenzii
REPLACE
o Opţiunea Size Field permite modificarea interactivă a dimensiunii
câmpului pe care este cursorul (cu butonul stâng al mouse-ului se
schimbă mărimea acestuia)
o Opţiunea Move Field permite schimbarea ordinii coloanelor
o Opţiunea Resize Partitions permite afişarea tabelei în două partiţii.

159
Baze de date

Să se construiască tabela ELEVI.DBF cu următoarele


Problema 1
câmpuri:
Nr_matricol N(4), Nume C(15), Prenume C(15), Clasa C(4), Absente N(2),
Nota1 N(2), Nota2 N(2), Nota3 N(2), Media N(5,2).

- să se introducă cel putin 10 înregistrări în tabelă


- folosind comanda BROWSE să se execute următoarele cerinţe:
 modificaţi interactiv datele din câmpul Absente
 afişati numai elevii din clasa a 9A
 afişati numai numele, clasa şi media elevilor care nu au nici o
absenţă
 poziţionati-vă numai pe câmpul media şi efectuaţi modificări

2. Cautare şi pozitionare

 Considerăm tabela STUDENT.DBF (Matricol N(4), Nume C(20), Prenume


C(20), Cnp C(13), Grupa C(4), Media N(5,2)). Să se afişeze prima, ultima şi
penultima înregistrare din tabela STUDENT.DBF.
Rezolvare: USE STUDENT
GO TOP
DISPLAY
GO BOTTOM
DISPLAY
SKIP –1
DISPLAY

 Să se poziţioneze pointerul după 4 înregistrări din poziţia curentă şi să


afişeze numărul înregistrării.
USE STUDENT
Rezolvare: SKIP 4
?RECNO()

160
Visual Foxpro

 Să se afişeze a 5-a înregistrare din tabela STUDENT, apoi să se afişeze


următoarea şi anterioara.
Rezolvare: USE STUDENT
GO 5
DISPLAY
SKIP –1
DISPLAY
SKIP +2
DISPLAY

3. Sortare şi duplicare

 Să se sorteze tabela STUDENT după câmpul GRUPA/descrescător şi după


câmpul MEDIA/crescător, numai studenţii care au codul numeric personal
>=1212121212121.
Rezolvare:

USE STUDENT
SORT TO STUD1 ON GRUPA/D, MEDIA/A FOR CNP >=
‘1212121212121’
USE
USE STUD1
BROWSE

Considerăm tabela CARTI cu următoarea structură: COTA C(7), AUTOR


C(30), TITLU C(50), PRET N(9), AN_AP N(4), NRBUC N(3), EDITURA C(30), în
care vom introduce cel puţin 20 de înregistrări.
 Să se creeze o tabelă CSORT cu cărţile ordonate crescător dupa an apariţie
şi preţ.
USE CARTE
Rezolvare: SORT TO CSORT ON AN_AP, PRET
USE
USE CSORT
BROWSE

161
Baze de date

 Să se sorteze tabela CARTE după autor/descrescător, titlu/crescător, numai


pentru cărţile din editura “TEORA”.
Rezolvare:
USE CARTE
SORT TO CSORT1 ON AUTOR/CD,
TITLU/CA FOR EDITUTA=”TEORA”
USE
USE CSORT1
BROWSE

4. Comenzi de actualizare

Considerăm tabela CLIENTI cu următoarea structură : CODC N(5),


DENC C(30), STR C(20), NR N(3), LOC N(20), TEL N(7), CONT C(30), în care
vom introduce cel puţin 20 de înregistrări.
 Să se scrie secvenţa de comenzi care permite modificarea câmpurilor codc
şi loc pentru codc=111
Rezolvare:
USE CLIENTI
BROWSE FIELDS CODC, LOC FOR CODC=111

Considerăm tabela PERSONAL.DBF.


 Să se scrie secvenţa de comenzi pentru creşterea salariului cu 15% pentru
angajaţii din secţia 2.

USE PERSONAL
Rezolvare: REPLACE ALL SALARIU WITH SALARIU +
SALARIU*10/100 FOR SECTIA=2
LIST

 Să se şteargă fizic toţi angajaţii care au salariul <=2500000.


USE PERSONAL
DELETE ALL FOR SALARIU <= 2500000
PACK
LIST

162
Visual Foxpro

Să se rezolve următoarea problemă:


Problema
Să se construiască tabela ANGAJATI.DBF cu
următoarele câmpuri:
COD N(4), NUME C(15),PRENUME C(15), NUMAR_BULETIN C(8), SALARIU
N(8), FUNCTIE C(12), DATA_N D(8), NR_COPII N(2), ALOCATIA N(7),
COSTUL_ORA_NOAPTE N(7), NUMAR_NOPTI N(2), RETINERI N(7),
REST_PLATA N(8), SPOR_NOAPTE N(6). Se cer:
 să se introducă cel putin 20 înregistrări în tabelă
 să se afişeze persoanele care lucrează în societate
 care sunt persoanele fără copii în funcţii de administraţie?
 alocaţia de stat pentru copii se calculează ca o sumă fixă înmulţită cu
numărul de copii. Treceţi în baza de date alocaţia.
 modificaţi salariul prin majorare cu 15% la toţi lucrătorii în funcţii de
contabilitate, cu 30% la cei în funcţii de administraţie
 treceţi codul unei persoane ca fiind chiar numărul articolului current
 să se afişeze pentru fiecare persoană suma de primit, ştiind că reţinerile
se scad, iar sporurile şi alocaţia se adună la salariu
 treceţi sporul de noapte ca fiind calculat după formula: spor noapte =
salariu/zi*nr. nopti *0.17
 să se afişeze persoanele care au rest de plată <=0
 toate persoanele care lucrează în funcţii de administraţie, au copii şi
sunt în vârstă de peste 60 ani, se vor pensiona (marcare ştergere)
 se vor afişa posturile vacante după pensionarea personalului
 afişati care este numele persoanei care are codul 4
 înaintea persoanei (cu codul 4) inseraşi o înregistrare vidă apoi
completaţi cu date
 completaţi acelaşi salariu cu al primei persoane la toate celelalte care au
acceaţi funcţie

Observatie: În câmpul FUNCTIE se introduc doar valorile „administraţie”,


„contabilitate”, „producţie” şi „vânzări”.

163
Baze de date

Capitolul 3
Citirea informaţiilor de la tastatură şi memorarea lor în
variabile de memorie.
Indexarea tabelelor, tipuri de indecşi.
Căutare şi poziţionare rapidă în tabele indexate.

1. Citirea informaţiilor de la tastatură şi memorarea lor în variabile


de memorie

Citirea informaţiilor de la tastatură se poate efectua prin următoarele


comenzi:
1. Comanda INPUT cu următoarea sintaxă:

INPUT [<mesaj>] TO <variabila>

Funcţionarea acestei comenzi constă în afişarea opţională a unui mesaj


(scris între ghilimele), şi memorarea informaţiei date de la tastatura în
variabila cu numele specificat.
Exemplu: Pentru a putea citi valoarea 10 de la tastatură şi a o memora în
variabila n, procedăm astfel:

INPUT “Dati n= ” TO n
?n &&afisam valoarea memorata in n

Dacă vrem să memorăm informaîii de tip şir de caractere, trebuie să le


introducem între ghilimele.
Exemplu:

INPUT “Dati numele ” TO nume


?nume &&afisam valoarea memorata in nume

164
Visual Foxpro

2. Comanda ACCEPT, se utilizează exclusiv pentru memorarea variabilelor de


tip şir de caractere, astfel încât nu mai este necesară folosirea ghilimelelor la
introducerea de la tastatură. Sintaxa comenzii ACCEPT este:

ACCEPT [<mesaj>] TO <variabila>

Exemplu:

ACCEPT “Dati numele ” TO nume


?nume &&afisam valoarea memorata in nume

2. Indexarea tabelelor

 Considerăm tabela STUDENT.DBF (Matricol N(4), Nume C(20), Prenume


C(20), Cnp C(13), Grupa C(4), Media N(5,2)). Să se indexeze tabela după
câmpul compus Matricol şi Nume. Să se afişeze tabela indexată.
Rezolvare:

USE STUDENT
INDEX ON STR(MATRICOL)+NUME TAG INDEX1
LIST

 Considerăm tabela MECIURI.DBF cu următoarea structură: Cod N(3),


Echipa1 C(12), Echipa2 C(12) , Localitate C(15), Data D(8), Ora N(2). Să se
completeze codul fiecărui meci cu o informaţie care să conţină numărul
înregistrării respective, iar informaţiile din tabelă să apară în ordine
alfabetică după localitatea unde se desfăşoară meciurile.
Rezolvare:
USE MECIURI
INDEX ON LOCALITATE TAG LOC
REPLACE ALL COD WITH RECNO()
LIST

165
Baze de date

 Considerăm tabela PRODUSE.DBF cu următoarea structură: Cod N(5),


Denumire C(15), Cantitate N(5), UM C(3), Pret N(7), Furnizor C(15). Să se
indexeze această tabelă după o cheie compusă formată din două câmpuri
Denumire şi Cod, fără a permite existenţa dublurilor.
Rezolvare:

USE PRODUSE
INDEX ON DENUMIRE+STR(COD,5) TO INDEX2 UNIQUE
LIST

3. Căutare şi pozitionare rapidă în tabele indexate

Considerăm tabela CARTE cu următoarea structură: COTA C(7), AUTOR


C(30), TITLU C(50), PRET N(9), AN_AP N(4), NRBUC N(3), EDITURA C(30), în
care vom introduce cel puţin 20 de înregistrări.

 Să se afişeze indexate după titlu toate cărţile care au apărut în perioada


1990-2000.
Rezolvare:

USE CARTE
INDEX ON RTRIM(TITLU) TAG TITLU FOR
BETWEEN(AN_AP,1990,2000)
LIST

 Să se afişeze indexate după preţ şi an apariţie toate cărtile care aparţin


editurii L&S Infomat.
Rezolvare:

USE CARTE
INDEX ON STR(PRET)+STR(AN_AP,4) TAG INDEX1 FOR
UPPER(EDITURA)=”L&S INFORMAT”
LIST

166
Visual Foxpro

Să se construiască tabela CONTRACTE.DBF


Problema 1
create la data de 1 noiembrie 2002 cu toate
contractele încheiate de o societate comercială cu diverşi furnizori
pentru livrarea produselor necesare producţiei sale.Tabela are
următoarea structură:
NRC N(5), DATA D(8), FURNIZOR C(20), PRODUS C(10), CANT N(10,2), PRET
N(10), TERM_LIVR D(8). , ONORAT L(1).Unde NRC = număr contract, DATA =
data semnării contractului, TERM_LIVR = termenul de livrare, ONORAT =
arată dacă contractul a fost sau nu onorat.
Se cer:
 să se introducă cel puţin 20 înregistrări în tabelă
 să se afişeze toate contractele încheiate cu “SC COSTICA SRL” anul trecut
 aflaţi care este valoarea fiecărui contract (presupunând că pe un contract
este un singur produs) al furnizorului X (citit de la tastatură)
 aflaţi contractele cu termenul de livrare depăşit
 afişati ultimele 5 înregistrări din tabelă
 aflaţi câte contracte are furnizorul X (citit de la tastatură)
 aflaţi dacă există vreun contract cu furnizorul X. Dacă da, afişaţi numărul şi
data acestui contract. Cum am putea afla şi următorul contract al aceluiaşi
furnizor?
 să se indexeze descrescător înregistările tabelei după data contractelor
 să se identifice rapid toate contractele onorate până la data de 1 ianuarie
2004

Se consideră tabela REVISTE.DBF care are


Problema 2
structură: Nume_r C(25), Cod_r N(3), Pret N(7),
Nr_luni N(2), Valoare N(20).
1. Să se introducă minim 10 înregistrări în tabelă;

167
Baze de date

2. Să se completeze câmpul Valoare (care iniţial era vid) cu expresia


corespunzătoare pentru fiecare înregistrare din tabelă;
3. Să se afişeze lista revistelor care au codul cuprins între 130 şi 150, după
numărul de apariţii lunare (se presupune că există în tabelă astfel de
înregistrări);
4. Să se adauge o nouă revistă în tabelă.

Se consideră tabela OLIMPIADA.DBF care


Problema 3
are structura: Nume C(25), Judet C(10), Scoala
C(20), Clasa C(4), Punctaj1 N(3), Punctaj2 N(3), Total N(6) în care se
gestionează rezultatele obţinute de elevi la faza naţională a unei olimpiade.
Câmpurile Punctaj1 şi Punctaj2 reprezintă punctele obţinute de elevi la cele
două probe ale olimpiadei şi nu depăşesc 100 de puncte fiecare.
1. Să se introducă minim 10 înregistrări în tabelă;
2. Să se afişeze în ordine alfabetică, pe clase, toţi elevii participanţi (nume,
judeţ);
3. Să se completeze câmpul Total (care iniţial era vid) cu suma dintre
punctajele obţinute de fiecare elev în parte şi să se afişeze pe clase
clasamentul, în ordinea descrescătoare a punctajului total (nume, puncte,
judeţ).
4. Să se modifice punctajele unui elev al cărui nume este citit de la tastatură.

168
Visual Foxpro

Capitolul 4
Prelucrări statistice şi financiare.

1. Prelucrări statistice şi financiare

O societate comercială înregistrează repartiţia


Exemplu: produselor date spre vânzare la diferite magazine
în tabela REPART.DBF cu următoarea structură
(Data D(8), Cod N(3), Nume C(12), Pret N(8), Grupa C(2), Mag N(1), Cant
N(8)). Magazinele sunt codificate numeric de la 1 la 5. Grupele de produse
sunt codificate pe două caractere, de exemplu: “te”=textile, “al”=alimente,
“el”=electrice, ş.a.m.d. Se consideră că vom introduce câteva înregistrări
asemănătoare cu cele de mai jos:

Se cer următoarele:

 să se afişeze câte produse distincte comercializează societatea

USE REPART.DBF
INDEX ON NUME TAG NUME
COUNT TO NR
?”NUMARUL DE PRODUSE DISTINCTE ESTE ”,NR

 să se calculeze pentru fiecare cod-produs cantitatea totală repartizată în


întreaga perioadă de evidenţă

169
Baze de date

INDEX ON COD TAG COD &&indexam dupa cod


TOTAL ON COD TO TOT.DBF FIELDS CANT
USE
USE TOT
LIST

 să se calculeze pentru fiecare magazin din subordine valoarea produselor


repartizate

INDEX ON MAGAZIN TAG MAGAZIN &&indexam dupa magazin


TOTAL ON MAGAZIN TO TOT.DBF FIELDS PRET,CANT
USE
USE TOT
LIST

 să se afle cel mai scump produs

INDEX ON STR(PRET)+NUME TAG X UNIQUE


&&indexam dupa pret şi numele produsului
X=PRET
&&retinem cea mai mare valoare
LIST NUME FOR PRET=X
&&afisam doar numele produselor care au pretul egal cu variabila X

Considerăm tabela CARTE cu următoarea


Exemplu: structură : COTA C(7), AUTOR C(30), TITLU
C(50), PRET N(9), AN_AP N(4), NRBUC N(3),
EDITURA C(30), în care vom introduce cel puţin 10 de înregistrări.

 să se afiseze valoarea medie, valoarea minimă şi valoarea maximă a


cărţilor, folosind comanda CALCULATE

CALCULATE AVG(PRET*NRBUC), MIN(PRET*NRBUC),


MAX(PRET*NRBUC) TO medie,, minim, maxim
?”Valoarea medie este ”,medie
?”Valoarea minima este ”,minim
?”Valoarea maxima este ”,maxim

170
Visual Foxpro

 să se afişeze valoarea totalp a cărţilor

SUM (PRET*NRBUC) TO total


?”Valoarea totala este ”,total

 să se calculeze numărul cărţilor apărute de la 1 ianuarie 2000 la editura


“TEORA”

COUNT FOR AN_AP>={01/01/00} AND


EDITURA=”TEORA” TO numar
?”Numarul cartilor aparute dupa 1 ian. 2000 la editura
Teora este ”, numar

Se consideră o tabelă numită VANZARI.DBF în


Problema
care se ţine evidenţa la mai multe magazine ale
aceleiaşi societăţi comerciale “SC COSTICA SRL”. Tabela are următoarea
structură: Data D(8), Cod_magazin N(2), Cod_raion C(5), Cod_produs C(12),
Um C(3), Cantitate N(5).
Să se efectueze următoarele calcule:
 câte raioane au vândut azi produsul x?
 cantitatea totală din produsul x vândută astăzi
 la câte magazine se găsesc raioane de papetărie (cod_raion=2)?
 numărul total de magazine al societaţii şi numărul de raioane distincte
 totalul cantităţii vândute din produsul x în fiecare magazin
 valoarea totală a vânzarilor pe lista raioane (fiecare raion o singură dată,
chiar dacă el aparţine la magazine diferite)
 valoarea medie a vânzarilor pe magazine
 care este produsul vândut cel mai scump şi unde s-a vândut el?
 care sunt cele 3 magazine fruntaşe (au avut cele mai mari vânzări în
perioada ultimei luni)?

171
Baze de date

Capitolul 5
Programare structurată (clasică) în Visual Foxpro

Exemplu: Se consideră tabela PERSONAL.DBF.

a) Se cere să se afişeze pentru fiecare angajat numele şi salariul initial şi apoi


salariul mărit cu 10%.

Rezolvare: Se construieşte un program sursă Visual Foxpro cu următorul


conţinut.
use personal
set talk off
clear
scan
?"salariul initial este ",SALARIU," "
??"pentru persoana ",NUME
?"Salariul indexat este ",SALARIU*0.1+SALARIU
endscan
wait ‘apasa o tasta pentru terminare’
use

b) Se cere să se afişeze numai acei angajaţi care au salariul între 1000000 şi


2500000. Pentru aceştia să se afişeze numele, salariul şi funcţia.
Rezolvare: Se construieşte un program sursă Visual Foxpro cu următorul
conţinut.
use personal
set talk off
clear
scan
if salariu>=1000000 and salariu<=2500000
?nume+' '+str(salariu,8)+' '+functie
endif
endscan
wait ‘apasa o tasta pentru terminare’
use

172
Visual Foxpro

c) Se cere să se modifice prin majorare cu 20% a valorii din câmpul MARCA,


pentru toţi angajaţii care au salariul mai mare de 3000000.
Rezolvare: Se construieşte un program sursă Visual Foxpro cu următorul
conţinut.

use personal
set talk off
clear
do while not eof()
if salariu>=3000000
replace marca with marca+marca*0.2
endif
skip
enddo
list
wait 'apasa o tasta pentru terminare '
use
d) Să se scrie un program cu ajutorul căruia să se localizeze persoana cu
MARCA 1234, iar în cazul când este gasită să modifice salariul indexându-l cu
15%, iar prenumele să devină "ION"; în cazul în care nu se gaseşte să se
afişeze un mesaj de avertisment "Lipsa MARCA în tabelă". Să se afişeze
conţinutul tabelei înainte şi după modificare.
Rezolvare: USE PERSONAL
SET TALK OFF
LIST
WAIT 'TABELA INAINTE DE MODIFICARE'
SCAN
LOCATE FOR MARCA=1234
IF FOUND()
REPLACE SALARIU WITH SALARIU+SALARIU*15/100
REPLACE PRENUME WITH 'ION'
DISPLAY
WAIT
ELSE
WAIT 'LIPSA MARCA IN TABELA'
ENDIF
ENDSCAN
LIST
WAIT 'TABELA DUPA MODIFICARE'
USE

173
Baze de date

Se consideră baza de date PERSOANE.DBF cu


Exemplu: următoarea structură: COD N(3), NUME C(15),
PRENUME C(15), ADRESA C(20), ORAS C(10). Să
se introducă minim 5 articole în baza de date.
Să se scrie un program cu ajutorul căruia să se şteargă datele despre o
anumită persoană citindu-i numele de la tastatură. Ştergerea se va executa
doar dacă numele persoanei există deja, în cazul în care nu există se va afişa
un mesaj "Persoana cu acest nume nu există". Să se listeze conţinutul bazei
de date înainte şi după ştergere.

Rezolvare:

use PERSOANE
set talk off
clear
list
wait
input “Introduceti numele persoanei care se sterge ” to num
for i=1 to reccount()
goto i
if nume=num
delete
pack
list
wait ‘apasa o tasta pentru continuare’
else
wait 'persoana cu acest nume NU exista '
endif
endfor
use

Exemplu: Se consideră tabela STUDENTI.DBF cu


urmatoarea structură: Nume C(20), Prenume
C(15), Nota1 N(2), Nota2 N(2), Nota3 N(2), Nota4 N(2), Nota5 N(2), Nota6
N(2), Media N(5,2), în care numai primele 8 câmpuri conţin informaţii, câmpul
Media fiind iniţial vid. Să se scrie un program care să calculeze următoarele:

a) afişarea studenţilor în ordinea descrescătoare a mediilor

174
Visual Foxpro

b) marcarea studenţilor care au picat un examen (una din cele şase note să
fie <5.00)
c) afişarea separată a studenţilor (nume, prenume şi medie) care au trecut
sesiunea şi a celor restanţieri.

set talk off


clear
use studenti
&& punctul a)
?"Studentii in ordinea descrescatoare a mediilor"
do while not eof()
x=(nota1+nota2+nota3+nota4+nota5+nota6)/6
replace media with x
skip
enddo
sort to stud1.dbf on media/d
use
use stud1
list fields nume,prenume,media
use
wait "apasa o tasta pentru trecerea la punctul urmator"

&& punctul b)
use studenti
?"Lista studentilor restantieri"
delete all for (nota1<5.00) or (nota2<5.00) or (nota3<5.00) or (nota4<5.00)
or (nota5<5.00) or (nota6<5.00)
list fields nume,prenume,nota1,nota2,nota3,nota4,nota5,nota6 for
(nota1<5.00) or (nota2<5.00) or (nota3<5.00) or (nota4<5.00) or
(nota5<5.00) or (nota6<5.00)
wait "apasa o tasta pentru trecerea la punctul urmator"

&& punctul c)
?"Lista studentilor admisi"
use studenti
list fields nume,prenume,media for media>=5.00
wait "apasa o tasta"
?"Lista studentilor restantieri"
scan
if media<5.00
display fields nume,prenume,media
endif
endscan
wait"apasa o tasta pentru terminare"
use

175
Baze de date

Probleme propuse:

Problema 1 Să se construiască tabela care conţine datele


referitoare la rezultatele unei sesiuni de examene.
Numele tabelei este SESIUNE.DBF şi are următoarea structură: Nume C(20),
Grupa C(4), Media N(5,2).
a) să se afişeze primii trei şi ultimii trei studenţi, în ordinea mediilor, din
facultate
b) ştiind că studentul x (citit de la tastatură) are media greşită, să se
remedieze greşeala
c) să se şteargă din tabelă studenţii care nu au promovat sesiunea

Fie tabela PRODUSE.DBF cu următoarea structură:


Problema 2
Cod_produs N(5), Cod_magazin N(5), Cantitate
N(5), Pret N(5), cu produsele vândute la o societate comercială:
a) care este cantitatea totală din produsul x (citit de la tastatură)?
b) câte magazine are societatea respectivă?
c) afişaţi valoarea totală a vânzărilor pentru fiecare magazin.

Fie tabela AGENDA.DBF cu următoarele câmpuri:


Problema 3 Nume C(20), Prenume C(15), Adresa M(10),
Telefon N(10).
a) afişaţi numărul de persoane din tabelă care au acelaşi nume cu cel
precizat de utilizator de la tastatură
b) localizaţi persoana cu numele şi prenumele precizate de utilizator şi
afişaăi numărul ei de telefon. Dacă persoana respectivă nu există afişaţi
un mesaj corespunzător
c) ordonaţi tabela după câmpurile nume şi prenume.

176
Visual Foxpro

Capitolul 6
Programare structurată (clasică) în Visual Foxpro – operaţii
de actualizare înregistrări în tabele

Exemplu 1: Se consideră tabela STOCURI.DBF, cu următoarea


structura: Cod_prod N(5), Den_prod C(20), Stoc N(8), Um
C(5), unde Um reprezintă unitate de masură. Tabela va fi indexată la creare
pe câmpul Cod_prod. Se cere să se realizeze următoarele operaţii de
actualizare:
 Adăugarea unui nou produs
 Modificarea unui produs existent în tabelă
 Ştergerea unui produs
 Vizualizarea conţinutului tabelei

Rezolvare:
În funcţie de alegerea unei opţiuni dintr-un meniu dat, se execută operaţia
selectată. Astfel:
 Operaţia de adăugare - se citeşte codul unui produs şi se caută
acesta în tabelă. Dacă nu se gaseşte, atunci se citesc informaţiile care
trebuie depuse în tabelă şi se adăugă acestea la sfârşitul tabelei. Dacă
este găsit, atunci se presupune că se realizează o intrare în stoc, astfel
se citeşte doar cantitatea şi se adăugă la stocul deja existent.
 Operaţia de modificare – se citeşte codul unui produs şi se caută în
tabelă. Dacă nu este găsit, atunci se afişeaza un mesaj corespunzător.
Dacă este găsit, atunci se afişeaza valorile tuturor câmpurilor existente
în tabelă şi apoi se citesc noile valori ale câmpurilor care vor fi asociate
codului respectiv.

177
Baze de date

 Operaţia de ştergere - se citeşte codul unui produs şi se caută în


tabelă. Dacă nu este găsit, atunci se afişează un mesaj corespunzător.
Dacă este găsit, atunci se afişează valorile celorlate câmpuri ale tabelei
pentru înregistrarea al cărui cod de produs a fost citit, iar utilizatorul
hotărăşte dacă îl şterge sau nu.
 Operaţia de vizualizare – se afişează conţinutul tabelei făcându-se o
pauză după fiecare ecran plin de informaţii
 Terminarea programului şi întoarcerea în mediul Visual Foxpro.

Codul sursă al programului:


set talk off
clear
store space(1) to optiune
do while .T.
@1,30 say "A - Adăugare"
@2,30 say "M - Modificare"
@3,30 say "S - Stergere"
@4,30 say "V - Vizualizare"
@5,30 say "T - Terminare"
@6,30 say "Introduceti optiunea dumneavoastra: " get optiune
function "!"
read
do case
case optiune="A"
&& operatia de adăugare
clear
use stocuri order cod_prod
opt='D'
do while upper(opt)='D'
clear
store 0 to vcod_prod,vcant
store space(20) to vden_prod
store space(5) to vum
@10,10 say "Dati codul produsului care urmeaza sa
fie adăugat " get vcod_prod picture "99999"
read
seek vcod_prod
if not found()
@15,10 say "Dati denumirea produsului " get
vden_prod function "!"

178
Visual Foxpro

@16,10 say "Dati cantitatea " get vcant


picture "999999999"
@17,10 say "Dati unitatea de masura " get
vum function "!"
read
append blank
replace cod_prod with vcod_prod, den_prod
with vden_prod, stoc with vcant, um with vum
else
@20,10 say " Produsul deja exista, vom
adăuga cantitatea "
@21,10 say "Dati cantitatea " get vcant picture
"999999999"
read
replace stoc with stoc+vcant
endif
opt=space(1)
@40,15 say "Doriti sa continuati? [D/N]" get opt
function "!"
read
enddo
use
case optiune="M"
&& operatia de modificare
clear
use stocuri order cod_prod
opt='D'
do while upper(opt)='D'
clear
store 0 to vcod_prod
@10,10 say "Dati codul produsului pe care doriti sa-l
modificati " get vcod_prod pict "99999"
read
seek vcod_prod
if not found()
@15,10 say "Produsul nu exista in tabela"
wait "apasa o tasta pentru continuare"
else
@21,25 say "denumire "
@21,45 say den_prod
@22,25 say "stoc "
@22,45 say stoc
@23,25 say "um "
@23,45 say um

179
Baze de date

store space(20) to vden_prod


store space(5) to vum
store 0 to vstoc
@33,10 say "Introduceti noile valori: "
@34,10 say "Dati denumirea produsului " get
vden_prod
@35,10 say "Dati stocul " get vstoc
@36,10 say "Dati unitatea de masura " get
vum
read
replace den_prod with vden_prod, stoc with
vstoc, um with vum
endif
@40,15 say "Doriti sa continuati? [D/N]" get opt
function "!"
read
enddo
use
case optiune="S"
clear
&& operatia de stergere
use stocuri order cod_prod
opt="D"
do while upper(opt)="D"
clear
store 0 to vcod_prod
@10,10 say "Dati codul produsului pe care doriti sa-l
stergeti " get vcod_prod pict "99999"
read
seek vcod_prod
if not found()
@15,10 say "Produsul nu exista in tabela"
wait "apasa o tasta pentru continuare"
else
@21,25 say "denumire "
@21,45 say den_prod
@22,25 say "stoc "
@22,45 say stoc
@23,25 say "um "
@23,45 say um
store space(1) to opt1
@30,10 say "Doriti sa stergeti? [D/N]" get
opt1 function "!"
read
if upper(opt1)="D"

180
Visual Foxpro

delete
endif
endif
store space(1) to opt
@40,15 say "Doriti sa continuati? [D/N]" get opt
function "!"
read
enddo
use
case optiune="V"
clear
&& operatia de vizualizare
use stocuri order cod_prod
@15,10 say "==== LISTA STOCURI ============"
@16,10 say "--------------------------------------------------"
@17,10 say "|COD |DENUMIRE | STOC | UNITATE |"
@18,10 say "| PRODUS | PRODUS | | DE MASURA |"
@19,10 say "--------------------------------------------------"
go top
k=20
do while not eof()
@k,15 say cod_prod picture "99999"
@k,35 say den_prod picture
"XXXXXXXXXXXXXXXXXXXX"
@k,50 say stoc picture "999999999"
@k,55 say um picture "XXXXX"
k=k+1
if k>40
wait "Pentru continuare apasati o tasta"
k=20
@6,1 clear to 24,79
endif
skip
enddo
use
case optiune="T"
EXIT
otherwise
?"A-ti ales o optiune gresita"
loop
endcase
enddo

181
Baze de date

Exemplu 2:
Se consideră tabela STUDENTI.DBF, cu următoarea
structură: GRUPA C(4), NUME C(20), PRENUME C(20), N_ALGEBRA N(2),
N_BAZE N(2), N_ANALIZA N(2), N_TS N(2), N_LIMBAJE N(2), MEDIA N(5,2)
unde N_ALGEBRA reprezintă nota la algebră, N_BAZE reprezintă nota la baze
de date, N_ANALIZA reprezintă nota la analiză matematică, N_TS reprezintă
nota la teoria sistemelor, iar N_LIMBAJE reprezintă nota la limbaje de
programare. Iniţial table este vidă. Câmpul MEDIA se calculează pe baza
notelor la cele cinci materii. Se cere să se realizeze următoarele operaţii de
actualizare:
 Introducerea informaţiilor în tabelă, prin program
 Adăugarea unui nou student la cerere
 Vizualizarea conţinutului tabelei

Rezolvare:
clear
set talk off
USE STUDENTI

&& Introducerea informaţiilor în tabelă, prin program

nr=0
@10,10 say "Dati numarul de studenti care vreti sa-i introduceti " get
nr
read
for i=1 to nr
vgrupa=space(4)
vnume=space(20)
vprenume=space(20)
valgebra=0
vbaze=0
vanaliza=0
vts=0
vlimbaje=0
@11,10 say "Grupa " get vgrupa
@12,10 say "Numele " get vnume
@13,10 say "Prenumele " get vprenume

182
Visual Foxpro

@14,10 say "Nota la algebra " get valgebra


@15,10 say "Nota la baze de date " get vbaze
@16,10 say "Nota la analiza matematica " get vanaliza
@17,10 say "Nota la teoria sistemelor " get vts
@18,10 say "Nota la limbaje de programare " get vlimbaje
read
append blank
replace grupa with vgrupa, nume with vnume, prenume with
vprenume, n_algebra with valgebra, n_baze with vbaze, n_analiza
with vanaliza, n_ts with vts, n_limbaje with vlimbaje
endfor

&& Adăugarea unui nou student la cerere


clear
index on nume tag nume
opt='D'
do while upper(opt)='D'
clear
vnume=space(20)
@10,10 say "Dati numele studentului care urmeaza a fi
adăugat " get vnume
read
seek vnume
if not found()
vgrupa=space(4)
vprenume=space(20)
valgebra=0
vbaze=0
vanaliza=0
vts=0
vlimbaje=0
@11,10 say "Grupa " get vgrupa
@13,10 say "Prenumele " get vprenume
@15,10 say "Nota la algebra " get
valgebra
@17,10 say "Nota la baze de date " get
vbaze
@19,10 say "Nota la analiza matematica "
get vanaliza
@21,10 say "Nota la teoria sistemelor "
get vts
@23,10 say "Nota la limbaje de
programare " get vlimbaje
read
append blank

183
Baze de date

replace grupa with vgrupa, nume with


vnume, prenume with vprenume, n_algebra with valgebra, n_baze
with vbaze, n_analiza with vanaliza, n_ts with vts, n_limbaje with
vlimbaje
else
@27,10 say " Studentul deja exista "
wait
endif
opt=space(1)
@40,15 say "Doriti sa continuati? [D/N]" get opt
function "!"
read
enddo
use

&& Vizualizarea conţinutului tabelei


clear
@10,10 say "Lista studentilor "
use STUDENTI
do while not eof()
?" "+grupa+" "+nume+" "+prenume+" " +
str(n_algebra,2)+ "" + str(n_baze,2)
+""+str(n_analiza,2)+""+str(n_ts,2)+""+str(n_limbaje,2)+""+str(
media,2,2)
skip
enddo
wait
use

Probleme propuse:

Problema 1 Se consideră tabela CASA_SCHIMB.DBF care conţine


informaţii despre evidenţa unei case de schimb valutar.
Tabela are următoarea structură: COD N(4), OPERATIUNE C(12), TIP_VALUTA
C(15), SUMA N(6), CURS N(5), VALOARE N(15). Să se scrie un program care
să efectueze următoarele operaţii specifice:

184
Visual Foxpro

 Cumpărare valută
 Vânzare valută
 Total încasări

Se consideră tabela MEDICAMENTE.DBF care conţine


Problema 2
informaţii despre evidenţa medicamentelor dîntr-o
farmacie. Tabela are următoarea structură: COD N(5), DENUMIRE C(25), UM
C(5), CANTITATE C(7), PRET N(9), VALOARE N(25). Să se scrie un program
care să efectueze următoarele operaţii specifice:

 Adăugarea unui nou medicament, cu denumire introdusă de la


tastatură, dacă acel medicament nu este în tabelă, sau suplimentarea
stocului existent în cazul în care medicamentul este în tabelă;
 Modificarea preţului unui medicament a cărei denumire se citeşte de la
tastatură;
 Afişarea tuturor medicamentelor aflate la un moment în tabelă.

Se consideră tabela LOCATARI.DBF care conţine


Problema 3
informaţii despre evidenţa medicamentelor dintr-o
farmacie. Tabela are următoarea structură: Nume C(20), Prenume C(15),
Nr_apart N(2), Statut C(10), Nr_pers N(2), Suprafata N(6,2). Câmpul Statut
reprezintă starea apartamentului din punct de vedere al ocupării sale, adicî
dacă este sau nu ocupat de locatari (are sau nu propietari), astfel valorile care
vor fi reţinute în acest câmp sunt: ‘Ocupat’ sau ‘Neocupat’. Să se scrie un
program care să efectueze următoarele operaţii specifice:
 Să se mute o persoană într-un apartament care se verifică în prealabil
dacă este neocupat;
 Să se elibereze un apartament, specificând numele persoanei care se
mută.

185
Baze de date

Capitolul 7
Funcţii şi proceduri utilizator. Ferestre.

Problemă rezolvată Se consideră tabela CARTI.DBF, cu


următoarea structură: TITLU C(25), AUTOR
C(25), AN_APAR D(8). Se cere:
 să se adauge o nouă carte în tabelă
 să se elimine cărţile unui autor al cărui an de apariţie îl citim de
tastatură

Soluţie:

set talk off


clear
define window f1 from 1,1 to 45,120 title "BIBLIOTECA"
activate window f1
use carti
opt=0
do while opt <>3
@20,20 say "Apasati 1 - pentru adăugare"
@22,20 say "Apasati 2 - pentru eliminare"
@24,20 say "Apasati 3 - pentru iesire din program"
@30,20 get opt
read
do case
case opt=1
do ADĂUGARE
case opt=2
do ELIMINARE
case opt =3
do IESIRE
endcase
clear
enddo

186
Visual Foxpro

deactivate window f1

procedure ADĂUGARE
clear
append blank
@30,20 say "Titlu: " get titlu
@35,20 say "Autor " get autor
@40,20 say "An aparitie" get an_apar
read
return

procedure ELIMINARE
clear
an={//}
@40,20 say "Dati anul " get an
read
delete for an_apar=an
pack
return

procedure IESIRE
clear
use
set talk on
clear all
cancel
return

Să se calculeze cel mai mare divizor a


Problemă rezolvată
două numere naturale citite de la tastatură.
(Se va folosi algoritmul lui Euclid prin scăderi repetate)

Soluţie:

set talk off


clear
define window f1 from 10,10 to 35,100 title “CMMDC”
activate window f1
nr1=0
nr2=0

187
Baze de date

@22,20 say "Dati primul numar " get nr1


@24,20 say "Dati al doilea numar " get nr2
read
d=cmmdc(nr1,nr2)
@30,20 say "C.m.m.d.c. este "
@30,40 say d
deactivate window f1

function cmmdc
parameters a,b

do while a<>b
if a>b
a=a-b
else
if a<b
b=b-a
endif
endif
enddo
return a

Se consideră tabela TRANZAC.DBF cu


Problemă rezolvată
următoarea structură: NUME C(20),
FEL_TRANZ C(10) (se introduc valori ‘depunere’ sau ‘restituire’ ),
SUMA_TRANZ N(9). Să se realizeze operaţii de depunere/restituire ştiind că,
pentru restituiri, în banca trebuie să existe de 10 ori suma cerută pentru
restituire.

Soluţie:

set talk off


clear
use tranzac
define window f from 10,10 to 40,100 title “TRANZATII”
activate window f
vsuma=0
vtranz=space(10)
vnume=space(20)
@20,10 say "Dati numele " get vnume

188
Visual Foxpro

@22,10 say "Felul tranzactiei " get vtranz


@24,10 say "Dati suma " get vsuma picture "999999999"
read
do case
case vtranz="depunere"
do DEPUNERE
case vtranz="restituie"
do RETITUIRE
endcase
deactivate window f
use

procedure DEPUNERE
append blank
replace nume with vnume, fel_tranz with vtranz, suma_tranz
with vsuma
return

procedure RESTITUIRE
if vsuma*10>SUMA()
@20,20 say "suma nu poate fi restituita"
else
append blank
replace nume with vnume, fel_tranz with vtranz,
suma_tranz with vsuma
endif
return

function SUMA
sum(suma_tranz) to x for fel_tranz="depunere"
sum(suma_tranz) to y for fel_tranz="restituire"
return x-y

Probleme propuse:

Se consideră tabela HOTEL.DBF cu următoarea


Problema 1
structură: NRCAMERA N(2), PRIMAZI D(8), NR_ZILE
N(2), CATEGORIE N(1), LIBER L(1). Informaţiile prezente în această tabelă
sunt: NRCAMERA – numărul camerei, PRIMAZI – prima zi de închiriere,
NRZILE – numărul de zile în care va fi camera închiriată, CATEGORIE –

189
Baze de date

categoria camerei, LIBER – câmp care arată dacă camera este sau nu liberă.
Camerele pot fi de trei categorii: 1,2 sau 3. Să se afişeze, pentru un turist care
a venit, toate camerele libere corespunzătoare fiecărei categorii, iar în cazul în
care nu există să se spună pe ce dată se eliberează prima cameră.

Evidenţa elevilor unui liceu este ţinută în tabela


Problema 2
ELEV.DBF care are următoarea structură: NUME
C(20), CLASA C(5), MED_SEM1 N(5,2), MED_SEM2 N(5,2). Să se scrie câte un
subprogram pentru următoarele cerinţe:
 afişarea elevulor premianţi pentru o anumită clasă
 afişarea elevilor corigenţi pentru o anumită clasă

190
Visual Foxpro

Capitolul 8
Meniuri definite de către utilizator

Să se construiască pe ecran un meniu care să


Exemplu 1:
respecte următoarele cerinţe:

 să apară un text explicativ cu denumirea FISIERELE pe linia 1,


coloana 2
 să apară un meniu orizontal, din care să putem selecta următoarele
tabele: PRODUSE.DBF. BENEF.DBF respectiv CONTRAC.DBF, pe linia 4
 un text explicativ cu denumirea FEREASTRA DE DEFILARE pe linia 5
 o fereastră, de la linia 6, coloana 50 la linia 16, coloana 79 pe
videoinvers, în care se va răsfoi fişierul selectat în meniul orizontal de mai
sus
 un meniu vertical între linia 17, coloana 10 şi linia 23, coloana 40
pentru selectarea operaţiilor de actualizare (procedurile respective vor fi
vide)

Soluţie:

m2='D'
set status off
set talk off
do while m2 $ 'Dd'
clear
m1=0
&& meniu orizontal
@1,2 say "FISIERELE: "
DEFINE MENU men1 BAR AT LINE 4
DEFINE PAD pad1 OF men1 PROMPT "1 - produse"

191
Baze de date

DEFINE PAD pad2 OF men1 PROMPT "2 - beneficiari"


DEFINE PAD pad3 OF men1 PROMPT "3 - contracte"
DEFINE PAD pad4 OF men1 PROMPT "4 - iesire"
ON SELECTION MENU men1 DO select_meniu

ACTIVATE MENU men1


DEACTIVATE MENU men1
SHOW MENU men1

&& fereastra de defilare


@5,50 say "FEREASTRA DE DEFILARE" color /i
define window f1 from 6,50 to 16,79 color /i
activate window f1
if m1=0
browse
endif
deactivate window f1
show window f1

&& meniu vertical


DEFINE POPUP pop1 FROM 17,10 TO 23,40
DEFINE BAR 1 OF pop1 PROMPT "1 - Adăugare"
DEFINE BAR 2 OF pop1 PROMPT "2 - Modificare"
DEFINE BAR 3 OF pop1 PROMPT "3 - Stergere"
DEFINE BAR 4 OF pop1 PROMPT "4 - Iesire"
ON SELECTION POPUP pop1 DO select_popup
ACTIVATE POPUP pop1
SHOW POPUP pop1
@24,2 say "Reluati? (d/n) " get m2
read
enddo

close all
deactivate menu men1
deactivate popup pop1
deactivate window f1

procedure select_meniu
use
do case
case PAD()="pad1"
USE PRODUSE
case PAD()="pad2"
USE BENEF
case PAD()="pad3"

192
Visual Foxpro

USE CONTRAC
case PAD()="pad4"
m1=1
endcase
return

procedure select_popup
do case
case BAR() = 1
do adaug
case BAR() = 2
do modif
case BAR() = 3
do sterg
case BAR() = 4
DEACTIVATE POPUP pop1
endcase
return

procedure adaug
procedure modif
procedure sterg

return

Exemplu 2: Să se construiască meniul următor:

2,5

Raport1 Raport2

Raport3 Raport4

Soluţie:

set talk off


clear
m=0
do while m=0
clear

193
Baze de date

@2,5 to 9,23
@3,6 to 5,22
@6,6 to 8,22
@4,14 say "|"
@7,14 say "|"
@4,7 PROMPT "Raport1"
@4,15 PROMPT "Raport2"
@7,7 PROMPT "Raport3"
@7,15 PROMPT "Raport4"
MENU TO m1
DO CASE
CASE m1=1
CASE m1=2
CASE m1=3
CASE m1=4
m=1
ENDCASE
enddo

Exemplu 3: Să se construiască meniul următor:

MENIU PRINCIPAL DESERT

Hamburger Ketchup Savarina

Mustar Inghetata

Maioneza Papanasi

Pizza Italiana

Masline

Siciliana

pepperoni

194
Visual Foxpro

Soluţie:

define window f1 from 10,0 to 13,45


define menu meniu
define pad pad1 of meniu prompt "\<MENIU PRINCIPAL" key alt+m
define pad pad2 of meniu prompt "\<DESERT" key alt+d
on pad pad1 of meniu activate popup meniu_princ
on pad pad2 of meniu activate popup desert

define popup meniu_princ margin message 'avem burger şi pizza'


define bar 1 of meniu_princ prompt "\<Hamburger"
define bar 2 of meniu_princ prompt "\<Pizza"
on bar 1 of meniu_princ activate popup burger
on bar 2 of meniu_princ activate popup pizza

define popup burger


define bar 1 of burger prompt "\<Ketchup"
define bar 2 of burger prompt "\<Mustar"
define bar 3 of burger prompt "M\<aioneza"

define popup pizza margin message "Ce fel de pizza doriti?"


define bar 1 of pizza prompt "\<Italiana"
define bar 2 of pizza prompt "\<Masline"
define bar 3 of pizza prompt "\<Siciliana"
define bar 4 of pizza prompt "\<Pepperoni"

define popup desert margin message "Lista se deserturi"


define bar 1 of desert prompt "\<Savarina"
define bar 2 of desert prompt "\<Inghetata"
define bar 3 of desert prompt "\<Papanasi"

on selection popup all do alegere

activate menu meniu

procedure alegere
activate window f1
clear
do case
case popup()="burger"
@0,0 say "Comanda: "+popup()

195
Baze de date

@1,0 say "S-a comandat un burger cu


"+lower(prompt())
case popup()="pizza"
@0,0 say "Comanda: "+popup()
@1,0 say "S-a comandat pizza cu
"+lower(prompt())
case popup()="masline"
@0,0 say "Comanda: "+popup()
@1,0 say "S-a comandat pizza cu
"+lower(prompt()) + "masline"
case popup()="desert"
@0,0 say "Comanda: "+popup()
@1,0 say "S-a comandat "+lower(prompt())
endcase
wait window
deactivate window f1
return

Probleme propuse:

Problema 1
Să se construiască meniul următor:
1,2

lista1

lista2

lista3

Problema 2 Să se construaiscă meniul următor:

20,20

adăugare stergere

modificare iesire

196
Visual Foxpro

Să se construiască sistemul de meniuri după


Problema 3
modelul alăturat:
 meniul orizontal principal, pe linia 12; acesta va rămâne tot timpul pe
ecran
 la apelul opţiunii Actualizare apare pe ecran submeniul vertical începând
cu linia 16; în acest submeniu apelul unei opţiuni se va face prin
tastarea literei subliniate
 la apelul opţiunii Help apare pe ecran o fereastră (între punctele 20,50 şi
30,75) în care se va afişa textul “Opţiunea nu este activă”.

Consultare Actualizare Help Terminare

Adăugare 20,50

Modificare
Optiunea nu
este activa
Stergere
30,75

Iesire

197
Baze de date

Capitolul 9
Limbajul SQL

Considerăm o tabelă cu denumirea ANGAJATI.DBF şi una cu denumirea


SECTII.DBF care conţin informaţii despre angajaţii unei firme şi
departamentele şi secţiile firmei respective.
 Structura tabelei ANGAJATI.DBF este următoarea MARCA N(4),
NUME C(20), PRENUME C(25), FUNCTIE C(10), SECTIA N(2),
SALARIU N(10), NR_DEPT N(2).

Aplicaţia va conţine un meniu cu trei submeniuri :

1. Submeniul Actualizări

2. Submeniul Interogări

198
Visual Foxpro

3. Submeniul Ieşire

Opţiunea Adăugari

Opţiunea Modificări

199
Baze de date

Opţiunea Ştergeri

Opţiunea Interogare1

Opţiunea
Interogare2

200
Visual Foxpro

Opţiunea Interogare3

Opţiunea Interogare4

201
Baze de date

Opţiunea Interogare5

Opţiunea Interogare6

202
Visual Foxpro

Opţiunea Interogare7

Opţiunea Interogare8

203
Baze de date

Codul sursă al aplicaţiei este :

SET TALK OFF


use angajati.dbf
CLEAR
&& definim meniul orizontal principal
DEFINE MENU EXEMPLU
DEFINE PAD P1 OF EXEMPLU PROMPT '\<Actualizari' AT
2,2
DEFINE PAD P2 OF EXEMPLU PROMPT '\<Interogari' AT
2,36
DEFINE PAD P3 OF EXEMPLU PROMPT '\<Iesire program'
AT 2,55

&& definim meniurile verticale cu optiunile fiecaruia in parte


DEFINE POPUP act
DEFINE BAR 1 OF act PROMPT '\<Adăugari'
DEFINE BAR 2 OF act PROMPT '\<Modificari'
DEFINE BAR 3 OF act PROMPT '\<Stergeri'
DEFINE POPUP interog
DEFINE BAR 1 OF interog PROMPT '\<interogare_1'
DEFINE BAR 2 OF interog PROMPT '\<interogare_2'
DEFINE BAR 3 OF interog PROMPT '\<interogare_3'
DEFINE BAR 4 OF interog PROMPT '\<interogare_4'
DEFINE BAR 5 OF interog PROMPT '\<interogare_5'
DEFINE BAR 6 OF interog PROMPT '\<interogare_6'

DEFINE BAR 7 OF interog PROMPT '\<interogare_7'


DEFINE BAR 8 OF interog PROMPT '\<interogare_8'
DEFINE POPUP iesire
DEFINE BAR 1 OF iesire PROMPT '\<Iesire FoxPro'
DEFINE BAR 2 OF iesire PROMPT '\=============='
DEFINE BAR 3 OF iesire PROMPT '\<Iesire Dos '

&& pentru fiecare optiune a meniului orizontal EXEMPLU activam


meniul
&& vertical corespunzator
ON PAD P1 OF EXEMPLU ACTIVATE POPUP act
ON PAD P2 OF EXEMPLU ACTIVATE POPUP interog
ON PAD P3 OF EXEMPLU ACTIVATE POPUP iesire

204
Visual Foxpro

&& pentru fiecare meniu vertical asociem o comanda sau un


program
&&care se va executa la selectarea meniului respectiv
ON SELECTION POPUP act DO Pact
ON SELECTION POPUP interog DO Pinterog
ON SELECTION POPUP iesire DO Piesire

&& activam meniul orizontal


ACTIVATE MENU EXEMPLU

&& pentru fiecare optiune a unui meniu vertical asociem o


comanda
&& FOXPRO, folosind functia BAR() - care intoarce numarul optiunii
&& curente din meniul vertical respectiv

PROCEDURE Pact
DO CASE
CASE BAR()=1
DO adaug
CASE BAR()=2
DO modif
CASE BAR()=3
DO sterg
ENDCASE
RETURN

PROCEDURE Pinterog
DO CASE
CASE BAR()=1
&& interogare salariu intre 1000000 şi 2000000
SELECT nume, sectia, salariu
FROM angajati
WHERE salariu BETWEEN 1000000 AND 2000000
CASE BAR()=2
&& interogare
use
use sectii
SELECT sectia, n_sectie
FROM sectii ORDER BY nr_dept
use
CASE BAR()=3
&& interogare
use angajati
SELECT * FROM angajati
WHERE nr_dept IN (1,2) ORDER BY nume

205
Baze de date

CASE BAR()=4
&& interogare
SELECT nume, salariu
FROM angajati
WHERE functie = 'inginer' AND nr_dept = 2
CASE BAR()=5
&& interogare
SELECT nume, salariu
FROM angajati
WHERE nume LIKE '%POP%' OR nume LIKE '%ION%'
CASE BAR()=6
&& Afisati lista angajatilor şi salariile marite cu 15%
SELECT nr_dept, nume, round(salariu*1.15,2) sal_nou
FROM angajati
CASE BAR()=7
&& Gasiti salariul minim, salariul maxim şi salariul mediu
al tuturor angajatilor
SELECT MAX(salariu), MIN(salariu), AVG(salariu)
FROM angajati
CASE BAR()=8
&& Afisati salariul mediu pentru fiecare tip de functie
SELECT functie, AVG(salariu) AVERAGE
FROM angajati
GROUP BY functie
ENDCASE
RETURN

PROCEDURE Piesire
DO CASE
CASE BAR()=1
CLEAR
DEACTIVATE MENU
CANCEL
CASE BAR()=3
QUIT
ENDCASE
RETURN

&& -------------------------------------
procedure adaug
&& adăugarea a mai multor înregistrări noi
set status off
clear
&& indexam tabela dupa câmpul MARCA ca sa putem accesa rapid
fiecare înregistrare

206
Visual Foxpro

index on marca tag marca


vmarca=0
vnume=space(10)
vpren=space(10)
vfunc=space(10)
vsal=0
vsect=0
vdept=0
optiune="D"
@2,2 say "Program de adăugare"
do while optiune="D"
&& se citeste o înregistrare care eventual va fi adăugata
@5,25 say "dati marca care va fi adăugata " get vmarca pict
"9999"
read
seek vmarca
if found()
wait "înregistrarea cu aceasta marca deja exista"
else
@10,25 say "dati numele persoanei " get vnume
@11,25 say "dati prenumele persoanei " get vpren
@12,25 say "dati functia " get vfunc
@13,25 say "dati salariu " get vsal
@14,25 say "dati sectia " get vsect
@15,25 say "dati numarul departamentului " get vdept
read
append blank
replace marca with vmarca
replace nume with vnume
replace prenume with vpren
replace functie with vfunc
replace salariu with vsal
replace sectia with vsect
replace nr_dept with vdept
@17,25 say "Mai doriti adăugare? [D/N] " get optiune
read
if optiune="N"
cancel
endif
endif
clear
enddo
return

207
Baze de date

&& -------------------------------------
procedure modif
browse
return

&& -------------------------------------
procedure sterg
&& stergerea unei înregistrări
set status off
clear
&& indexam tabela dupa câmpul MARCA ca sa putem accesa rapid
fiecare înregistrare
index on marca tag marca
vmarca=0
optiune="D"
@2,2 say "Program de stergere"
do while optiune="D"
&& se citeste o înregistrare care eventual va fi stearsa
@5,25 say "dati marca care va fi stearsa " get vmarca pict
"9999"
read
seek vmarca
if found()
delete
pack
wait "înregistrarea a fost stearsa!"
else
wait "înregistrarea nu exista in tabela!"
@27,25 say "Mai doriti stergere? [D/N] " get optiune
read
if optiune="N"
cancel
endif
endif
enddo
return

208
Visual Foxpro

Capitolul 10
Probleme rezolvate şi probleme propuse

1. PROBLEME REZOLVATE

Problema 1 Să se încarce şi să se valideze informaţiile, în


tabela AUTO.DBF care are următoarea structură:
NRAUTO C(6,), MARCA C(15), CAPCIL N(4). Criteriile de validare sunt:
600<=CAPCIL<=2400, NRAUTO să înceapă cu “G”. Macheta de încărcare a
datelor se construieşte începând de la coordonatele 3,3 şi are forma
următoare:

==========MACHETA==========
* NRAUTO:
* MARCA AUTO:
* CAPACITATE CILINDRU:
==========================

REZOLVARE :

SET TALK OFF


CLEAR
USE AUTO
optiune=’d’
INDEX ON NRAUTO TO AUTO1
DO WHILE LOWER(optiune)=’d’
clear
vnr=replicate(6,’ ‘)
vmarca=replicate(15,’ ‘)
vcap=0

209
Baze de date

@3,3 say “========== MACHETA ============”


@4,3 say “ * NRAUTO:” get vnr valid
substr(vnr,1,1)=’G’ message ‘prima litera G’
@5,4 say “ *MARCA AUTO:” get vmarca
@6,5 say “ *CAPACITATE CILINDRU:” get vcap picture
‘999999’ range 600,2400 message ‘intre 600 şi 2400’
@7,65 say “=”+replicate(25,’=’)
read
seek vnr
if found()
wait “numar auto existent deja!!!!!!”
else
append blank
replace nrauto with vnr, marca with vmarca, capcil
with vcap
endif
@20,2 say “Continuati incarcarea? (d/n)” get optiune
read
enddo
close all

Să se realizeze un program care să simuleze o


Problema 2
agendă electronică de telefoane. Se va folosi o
tabelă numită AGENDA.DBF care să conţină următoarele câmpuri: NUME
C(20), PRENUME C(20), ADRESA C(40), NRTEL C(11), DATA_NAS D(8), ORAS
C(20).
În această aplicaţie se vor construi următoarele meniuri :
1. Un meniu principal de tip popup care să conţină opţiunile :
ACTUALIZARI, MODIFICARI, CAUTARI şi EXIT.
2. La alegerea opţiunii CAUTARII se deschide un al doilea meniu de tip
popup cu opţiunile NUME, PRENUME, ADRESA, DATA NASTERII şi Nr.
TELEFON, semnificând criteriile de căutare a persoanelor din agenda
dată.

210
Visual Foxpro

3. La alegerea opţiunii EXIT se deschide un al treilea meniu popup cu


opţiunile: PARASIREA FOXPRO-ULUI şi PARASIREA PROGRAMULUI,
semnificând modalităţile de închidere a aplicaţiei date.

REZOLVARE :

211
Baze de date

define window f1 from 1,1 to 50,120 title 'PROGRAM' double shadow


activate window f1
clear
text

******************************************************
* *
* AGENDA DE TELEFON *
* PROGRAMUL SIMULEAZA O AGENDA ELECTRONICA DE TELEFOANE
* *
* *
******************************************************

APASATI O TASTA PENTRU CONTINUARE!

2004
endtext
wait' '
deactivate window f1

set talk off


close all
set printer off
clear
defi popup meniu_vertical from 0,65
defi bar 1 of de prompt " ACTUALIZARI "
defi bar 2 of de prompt " MODIFICARI "
defi bar 3 of de prompt " CAUTARI "
defi bar 4 of de prompt " EXIT "
ON SELECTION popup meniu_vertical do proc_meniu
activate popup de

procedure proc_meniu
do case
case bar()=1
do p_actu
case bar()=2
do p_modi
case bar()=3
do p_caut
case bar()=4
do p_exit
endcase

212
Visual Foxpro

retu

&&========================================
proc p_actu
CLEAR
use agenda
@ 1,1 to 11,52 double
store " " to a_nume, a_prenume, a_adresa,
a_nr_tel, a_data, A_ORAS
@ 3,2 SAY " NUME " get a_nume picture "!!!!!!!!!!!!!!!!!!!!"
@ 4,2 say " PRENUME " get a_prenume picture "!!!!!!!!!!!!!!!!!!!!"
@ 5,2 say " ADRESA " get a_adresa picture
"STR.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
@ 6,2 say " Nr TELEFON " get a_nr_tel picture "999/9999999"
@ 7,2 say " DATA NASTERII " get a_data picture "99/99/9999"
@ 8,2 SAY " ORASUL " GET A_ORAS PICTURE "!!!!!!!!!!!!!!!!!!!!"
read
@ 10,2 say " DORITI SALVAREA DATELOR PE DISC "
define popup act from 7,35
defi bar 1 of act prompt " YES "
defi bar 2 of act prompt " NO "
on selec popup act do act
acti popup act
retu

&&========================================
procedure act
use agenda
do case
case bar()=1
n=reccount()
a_datan=ctod(a_data)
if a_datan > date() .or. val(left (a_data,2)) > 31 .or.
val(substr(a_data,4,2)) > 12
@ 10,2 say " IMPOSIBIL "
wait ""
clear
deact popup
endif
i=1
do while i<=n
if a_nume=nume .and. a_prenume = prenume .and. a_datan =
data_nas
@ 10,2 say " ACEASTA DATA MAI EXISTA IN ACESTA BAZA DE
DATE "

213
Baze de date

wait ""
clear
deacti popup
endif
go i
i=i+1
enddo
go bottom
append blank
replace nume with a_nume
replace prenume with a_prenume
replace adresa with a_adresa
replace nrtel with a_nr_tel
replace data_nas with a_datan
REplace oras with a_oras
do sort
deac popup
case bar()=2
clear
deacti popup
endcase
return

&&========================================
proc p_modi
USE AGenda
browse
do sort
return

&&========================================
proc p_caut
clear
defi popup caut from 0,0
defi bar 1 of caut prompt " NUME "
DEfi bar 2 of caut prompt " PRENUME "
defi bar 3 of caut prompt " ADRESA "
defi bar 4 of caut prompt " DATA NASTERII "
defi bar 5 of caut prompt " Nr. TELEFON "
on selec popup caut do caut1
activate popup caut
retur

&&========================================
proc caut1

214
Visual Foxpro

do case
case bar()=1
do nume
case bar()=2
do prenume
case bar()=3
do adresa
case bar()=4
do data_nase
case bar()=5
do nr
endcase
return

&&========================================
proc nume
use agenda
clear
@ 10,0 say " CALCULATORUL CAUTA TOATE PERSOANELE CU
NUMELE INTRODUS DE D-VOASTRA "
NUM1=" "
?
?
@ 12,2 SAY " INTRODUCETI NUMELE " GET num1 PICTURE
"!!!!!!!!!!!!!!!!!!!!"
READ
n=reccount()
clear
i=0
wqw=1
z=0
q=0
k=0
define window ert from 10,10 to 32,100 panel color g+/bg
activate wind ert
do while i<n
i=i+1
go i
if k/6=int(k/6) .AND. K<>0
wait "APASATI O TASTA PENTRU PAGINA URMATOARE DE
INREGISTRARI"
clear
k=0
Q=0
endif

215
Baze de date

if nume=num1
do scc
endif
enddo
wait "APASATI O TASTA PENTRU A CONTINUA"
CLEAR WIND
DEACT WIND ERT
clear
if z=0
@ 11,1 say " NU S-A GASIT NICI O PERSOANA CU NUMELE
INTRODUS DE D-VOASTRA"
wait ""
ENDIF
clear
deactivate popup
return

&&========================================
proc sort
clear
use agenda
!del aged.dbf
sort to aged on nume /a,prenume /a
use
!del agenda.dbf
use aged
sort to agenda on nume /a ,prenume /a
close all
retu

&&========================================
PROC scc
@ 0,30 say " GASITI "
@ 2+q,3 get nume
@ 3+q,3 get prenume
@ 2+q,30 get adresa
@ 3+q,30 get data_nas
@ 3+q,50 get nrtel
@ 2+q,0 get wqw picture "99"
@ 4+q,30 get oras picture "!!!!!!!!!!!!!!!!!!!!"
k=k+1
q=q+3
wqw=wqw+1
z=z+1
retu

216
Visual Foxpro

&&========================================
proc prenume
use agenda
clear
@ 10,0 say " CALCULATORUL CAUTA TOATE PERSOANELE CU
PRENUMELE INTRODUS DE D-VOASTRA"
pren1=" "
@ 12,2 say " INTRODUCETI PRENUMELE " GET PREN1 picture
"!!!!!!!!!!!!!!!!!!!!"
read
n=reccount()
clear
i=0
q=0
k=0
wqw=1
z=0
define window zxc from 10,10 to 32,100 panel color g+/bg
acti wind zxc
go top
do while i<n
i=i+1
goto i
if k/6=int(k/6) .and. k<>0
wait "APASATI O TASTA PENTRU PAGINA URMATOARE"
CLEAR
k=0
Q=0
endif
if pren1=prenume
do scc
endif
enddo
wait "APASA O TASTA PENTRU A CONTINUA "
CLEAR WIND
deactivate wind zxc
clear
if z=0
@ 11,1 say "NU S-A GASIT NICI O PERSOANA CU PRENUMELE
INTRODUS DE D-VOASTRA"
wait ""
ENDIF
clear
deact popup

217
Baze de date

retu
&&========================================
proc adresa
use agenda
clear
@ 10,0 say " CALCULATORUL CAUTA PERSOANELE CARE LOCUIESC
PE STRADA INTRODUSA DE D-VOASTRA "
ADRESA1=" "
@ 12,2 say " INTRODUCETI NUMELE STRAZII " GET ADRESA1
PICTURE "!!!!!!!!!!!!!!!!!!!!"
READ
n=reccount()
qu=" "
ss=" "
clear
ww=1
do while ww<=20
if substr (adresa1,ww,1)=" "
ss=substr(adresa1,1,ww-1)
exit
endif
ww=ww+1
enddo
i=0
q=0
k=0
wqw=1
z=0
define window mnb from 10,10 to 32,100 panel color g+/bg
acti wind mnb
do while i<n
i=i+1
go i
if k/5=int(k/5) .and. k<>0
wait " APASATI O TASTA PENTRU PAGINA URMATOARE "
CLEAR
k=0
Q=0
endif
qq=5
ass=upper(adresa)
do while qq<=20
if substr(ass,qq,1)=" "
qu=substr(ass,5,qq-5)
exit

218
Visual Foxpro

endif
qq=qq+1
enddo
if ss=qu .and. len(qu)=len(ss)
do scc
endif
enddo
wait " APASA O TASTA PENTRU A CONTINUA "
CLEAR WIND
deac wind mnb
clear
if z=0
@ 11,1 say " NU S-A GASIT NICI O PERSOANA CU NUMELE STRAZII
INTRODUS DE D-VOASTRA"
WAIT ""
ENDIF
clear
deact popup
retu

&&========================================
proc data_nase
use agenda
clear
@ 10,0 say " CALCULATORUL VA CAUTA TOATE PERSOANELE CU
DATA DE NASTERE INTRODUSA DE D-VOASTRA"
DATA=" "
@ 12,2 SAY "INTRODUCETI DATA DE NASTERE "GET DATA PICTURE
"99/99/9999"
READ
N=reccount()
clear
i=0
q=0
k=0
wqw=1
z=0
define window asd from 10,10 to 32,100 panel color g+/bg
acti wind asd
do while i<n
i=i+1
go i
if k/5=int(k/5) .and. k<>0
wait " APASATI O TASTA PENTRU PAGINA URMATOARE "
CLEAR

219
Baze de date

K=0
endif
qaz=DTOC(data_NAS)
if data=QAZ
do scc
endif
enddo
wait " APASA O TASTA PENTRU A CONTINUA "
CLEAR
DEACT WIND ASD
CLEAR
IF Z=0
@ 11,1 SAY " NU S-A GASIT NICI O PERSOANA CU DATA DE NASTERE
INTRODUSA DE D-VOASTRA"
WAIT ""
CLEAR
ENDIF
DEACT POPUP
RETU

&&========================================
PROC NR
use agenda
clear
@ 10,0 say " CALCULATORUL CAUTA TOATE PERSOANELE CARE AU
NR. DE TELEFON INTRODUS DE D-VOASTRA"
NR=" "
@ 12,2 SAY " INTRODUCETI NUMARUL " GET NR PICTURE
"999/9999999"
READ
N=RECCOUNT()
CLEAR
I=0
Q=0
K=0
WQW=1
Z=0
define window wsx from 10,10 to 32,100 panel color g+/bg
ACTI WIND WSX
DO WHILE I<N
I=I+1
GO I
IF K/5=INT(K/5) .AND. K<>0
WAIT " APASA O TASTA PENTRU PAGINA URMATOARE "
CLEAR

220
Visual Foxpro

K=0
ENDIF
IF NR=NRTEL
DO SCC
ENDIF
ENDDO
WAIT " APASA O TASTA PENTRU A CONTINUA "
CLEAR
DEACT WIND WSX
CLEAR
IF Z=0
@ 11,1 SAY " NU S-A GASIT NICI O PERSOANA CU NR DE TELEFON
INTRODUS DE D-VOASTRA"
WAIT ""
CLEAR
ENDIF
DEACT POPUP
RETU

&&========================================
PROC P_EXIT
CLEAR
CLOSE ALL
DEFI POPUP Y FROM 10,50
DEFI BAR 1 OF Y PROMPT " PARASIREA FOXPRO-ULUI "
DEFI BAR 2 OF Y PROMPT " PARASIREA PROGRAMULUI "
ON SELECT POPUP Y DO EW
ACTI POPUP Y
DEACT POPUP
RETU

&&========================================
PROC EW
DO CASE
CASE BAR()=1
QUIT
CASE BAR()=2
DEACT POPUP
ENDCASE
RETURN

221
Baze de date

2. PROBLEME PROPUSE

Problema 1 Se consideră o tabelă cu numele


GEOGRAFIE.DBF care să reţină informaţii cu
caracter geografic şi care să aibă următoarea structură: CONTINENT C(15),
TARA C(15), CAPITALA C(10), SUPRAFATA N(10), NR_LOC N(10).
Se cere să se calculeze următoarele:

 Care este capitala unei anumite ţări, al cărui nume se citeşte


de la tastatură;
 În ce continent se află ţările cu cel mai mare şi cel mai mic
număr de locuitori ?
 Să se afle numele ţării, continentului, capitalei ţării cu cea mai
mare suprafaţă.

Problema 2 Fie tabela AGENDA.DBF cu următoarea


structură: NUME C(20), PRENUME C(20),
ADRESA C(30), TELEFON N(10).

Se cer următoarele :
 Să se afişeze numărul de persoane care au acelaşi nume cu cel
precizat de utilizător de la tastatură;
 Să se afişeze numele şi prenumele persoanei al cărui număr de
telefon este citit de utilizător de la tastatură;
 Să se ordoneze tabela după câmpurile nume şi prenume

222
Visual Foxpro

Capitolul 11
Teste grilă rezolvate. Teste grilă propuse.

1. Teste grilă rezolvate.


1. Pentru a modifica o structura a unei tabele creată anterior se foloseşte
comandă :
a) CREATE TABLE
b) MODIFY TABLE
c) MODIFY STRUCTURE
d) ALTER DATABASE
e) MODIFY DATABASE
Răspuns: c)
2. Pentru a afişa structura unei tabele, fără a o actualiza, se foloseşte
comanda:
a) DISPLAY STRUCTURE
b) LIST STRUCTURE
c) DISPLAY DATABASE
d) MODIFY DATABASE
e) nu se poate
Răspuns: b)
3. Se dă comanda : CREATE STUDENTI
Care afirmaţii sunt adevarate ?
a) creează fişierul STUDENTI.DBF
b) creează fişierele STDENTI.DBF şi STUDENTI.IDX
c) creează tabela STUDENTI
d) creează tabela STUDENTI şi se pot încarca, opţional, date în ea
e) este o comandă greşită.
Răspuns: d)

USE STUDENTI
MODIFY STRUCTURE
223
Baze de date

4. Se dă secvenţa de comenzi :
Care afirmaţii sunt adevărate ?
a) se poate actualiza structura tabelei STUDENTI
b) este greşită comanda MODIFY STRUCTURE
c) creeaza şi poate doar modifica structura tabelei STUDENTI
d) doar modifica câmpuri în tabela STUDENTI
e) modifică datele din tabela curentă
Răspuns: a)
5. Comenzile utilizate pentru accesul direct după cheie sunt :
a) SEEK
b) FIND
c) GOTO
d) LOCATE şi CONTINUE
e) SKIP
Răspunsuri: a) şi b)
6. Comanda USE se foloseşte pentru :
a) a deschide o tabelă
b) a deschide indecşii asociaţi tabelei
c) a deschide o vedere
d) a închide tabela deschisă anterior
e) a deschide o bază de date
Răspunsuri: a), b), c) şi d)
7. Comanda GOTO se foloseşte pentru regăsirea înregistrărilor :
a) secvenţial
b) direct după cheie
c) după numărul de realizare a înregistrării
d) dinamic
e) direct după cheie şi după numărul de realizare a înregistrărilor
Răspuns: c)

224
Visual Foxpro

USE STUDENTI
8. Spuneţi care este efectul execuţiei
INDEX ON MATRICOL
următoarelor comenzi : TO STUD
m1=101
SEEK m1
DISPLAY
CONTINUE
DISPLAY

a) acces secvenţial la toate înregistrările pentru care “MATRICOL” este


101
b) acces direct la o înregistrare pentru care “MATRICOL” are valoarea
“m1”
c) afişează înregistrarea pentru care “MATRICOL” este 101
d) are o comandă greşită
e) acces secvenţial la două înregistrări din STUDENTI
Răspuns: a)
9. Pentru a modifica datele dintr-o înregistrare se foloseşte comanda :
a) BROWSE
b) CHANGE
c) REPLACE
d) MODIFY STRUCTURE
e) EDIT
Răspuns: a), b), c) şi e)
10. Pentru a şterge logic o înregistrare dintr-o tabelă se foloseşte comanda :
a) DELETE
b) PACK
c) ZAP
d) DELETE FILE
e) DELETE ALL
Răspuns: a)

225
Baze de date

11. Pentru a şterge fizic o înregistrare dintr-o tabelă se foloseşte comanda :


a) DELETE
b) PACK
c) ZAP
d) DELETE FILE
e) DELETE ALL
Răspuns: b) şi c)
12. Pentru a şterge fizic toate înregistrările dintr-o tabelă se poate folosi
comanda (sau comenzile) :
a) DELETE ALL + PACK
b) ZAP
c) RECALL
d) PACK
e) DELETE FILE
Răspuns: a) şi b)

USE STUDENTI
13. Se consideră următoarea secvenţă de comenzi : GO 3
Care din afirmaţii este adevărată ? APPEND BLANK
a) adăugă un număr de înregistrări dorit de utilizator
b) adăugă o înregistrare după cea curentă
c) adăugă o înregistrare la sfârşitul tabelei curente
d) adăugă o înregistrare după cea cu numărul de ordine 3
e) adăugă 3 întregistrări
Răspuns: c)
14. Se consideră următoarea secvenţă de comenzi :

USE STUDENTI
DISPLAY
REPLACE RECORD 3 FOR MATRICOL=123 PRENUME WITH
“COSTEL“
DISPLAY

226
Visual Foxpro

Care afirmaţii sunt adevărate?


a) modifică în primele 3 înregistrări “MATRICOL” şi “PRENUME” cu
“COSTEL”
b) modifică înregistrarea a treia dacă “MATRICOL” este 123
c) modifică trei înregistrări
d) conţine o comandă greşită
e) şterge logic a treia înregistrare
Răspuns: b)
15. În următorul exemplu comanda EXIT DO WHILE .T.
determină : IF EOF()
EXIT
ENDIF
IF MEDIA<=7.50
SKIP
LOOP
ENDIF
nr=nr+1
SKIP
ENDDO

a) ieşirea din structura IF...ENDIF şi execuţia următorului IF...ENDIF


b) ieşirea din structura IF…ENDIF, se sare peste cea de a doua structura
IF…ENDIF şi se execută următoarele comenzi
c) ieşirea din structura IF…ENDIF şi execuţia comenzii LOOP
d) ieşirea din structura DO WHILE...ENDDO
e) nu face nimic
Răspuns: d)
16. Un program sursă se editează cu comanda :
a) DO
b) MODIFY STRUCTURE
c) MODIFY COMMAND
d) EDIT
e) COMPILE

227
Baze de date

Răspuns: c)
17. Să se specifice care din structurile de mai jos este o structură repetitivă :
a) IF...ENDIF
b) DO CASE...ENDCASE
c) DO WHILE…ENDDO
d) FOR…ENDFOR
e) SCAN…ENDSCAN
Răspuns: c), d) şi e)

a=10
18. Se consideră următoarea secvenţă de b=a**2
program : IF b<101
? 10
Ce valori se afişează ?
ELSE
a) 100 IF b>101
b) 111 ? 111
c) nu se afişează nimic
ELSE
?b
d) 10 ENDIF
e) b ENDIF

a=0
Răspuns: d)
@10,10 SAY “a = ” GET a
19. Ce va afişa următoarea READ
secvenţă de program, dacă IF a = 10
? a+1
de la tastatura se dă
ELSE
valoarea 123 ? IF a=124
a) 122 @20,10 SAY “Orice valoare”
b) 124 ELSE
IF a > 234
c) 234
?a
d) Orice valoare ELSE
e) 123 ? a-1
ENDIF
Răspuns: a)
ENDIF
ENDIF

228
Visual Foxpro

20. Ce se va afişa după execuţia următoarei secvenţe de program ?


a) 20,20
a=2
b) conţine o comandă greşită b=20
c) 2,20 DO WHILE a<b
a=a+2
d) 20,2
ENDDO
e) 20,22 ?b,”,”,a
Răspuns: a)

229
Baze de date

2. Teste grilă propuse


1. În următorul exemplu comanda EXIT determină:
DO WHILE .T.
IF EOF()
EXIT
ENDIF
IF pret<20000
SKIP
LOOP
ENDIF
stoc=stoc-1
SKIP
ENDDO
a. ieşirea din structura IF...ENDIF şi execuţia următorului IF...ENDIF
b. ieşirea din structura DO WHILE...ENDDO
c. ieşirea din structura IF..ENDIF, se sare peste cea de a doua structura
IF...ENDIF şi se execută următoarele comenzi.
d. ieşirea din structura IF....ENDIF şi execuţia comenzii LOOP
e. nu face nimic

2. Ce afişează următorul exemplu:


CLEAR
FOR var =1 TO10
?var
ENDFOR
a. un şir de numere de la 1 la 10
b. şirul de caractere “var" de 10 ori
c. nimic
d. numărul 1 de 10 ori

230
Visual Foxpro

e. numărul 10

3. Un program sursă se editează cu comanda:


a. MODIFY COMMAND
b. MODIFY STRUCTURE
c. DO
d. EDIT
e. COMPILE

4. Structura IF. ENDIF este:


a. structura secvenţială
b. structura alternativă simplă
c. structura alternativă multiplă
d. structura repetitivă
e. structura de parcurgere secvenţială a unei tabele

5. Pentru a forţa terminarea execuţiei unui program se foloseşte următoarea


comandă:
a. CANCEL
b. QUIT
c. RESUME
d. EXIT
e. RETURN

6. Să se specifice care din structurile de mai jos este o structură repetitivă:


a. IF ..... ENDIF
b. DO CASE ..... ENDCASE
c. DO WHILE ...... ENDDO
d FOR ...... ENDFOR
e. SCAN . . . . ENDSCAN

231
Baze de date

7. Exemplu următor :
STORE ‘&X’ TO X
? &X
a. afişează pe ecran “&&X”
b. afişează pe ecran "&X"
c. generează un mesaj de eroare. & nu se foloseşte în comanda STORE
d. generează un mesaj de eroare. O variabilă nu poate fi referită
recursiv într-o macrosubstituţie
e. afişează pe ecran “X"

8. Care din următoarele afirmaţii sunt adevărate pentru Visual FoxPro:


a. are structura repetitivă de program
b. are structura alternativă de program
c. are doar structurile secvenţială şi alternativă de program
d. are structura secvenţială de program
e. are doar structurile secvenţială şi repetitivă de program

9. Care din următoarele afirmaţii sunt adevărate pentru Visual FoxPro:

a. permite, în fereastra de comandă, doar structurile secvenţială şi


alternativă
b. permite, în fereastra de comandă, toate structurile fundamentale de
program
c. nu permite, în fereastra de comandă, structurile repetitive de program
d. nu permite nici una dintre structurile fundamentale de program
e. permite structurile secvenţială, alternativă, repetitivă de program

10. Se da secvenţa:
SET TALK OFF

232
Visual Foxpro

m1=0
STORE1.2 Tom1,m2,m3
m2 = 'IBM'
?m1,m2, m3
Care afirmaţii sunt adevărate ?
a. afişează valoarea 0 pentru m1
b. afişează valoarea 2 pentru m2
c. conţine o comandă greşită
d. afişează valorile 1 şi 2 pentru m3
e. afişează şirul "m1, m2, m3"

11. Se dă secvenţa:
SET TALK OFF
m1=0
STORE 1.1 TO m1,m2,m3
m3=’DELL’
? m1,m2,m3

Care afirmaţii sunt adevărate ?


a. la afişare, variabila m1 este de tip logic
b. la afişare variabila m2 este de tip logic
c. la afişare, variabila m3 este de tip şir de caractere
d. conţine o comandă greşită
e. la afişare, se scrie câte o variabilă pe un rând

12. Se dă secvenţa de program:


SET TALK OFF
m1 =22
m2 = 'HP'
x3=m1 **2 + VAL(m2)

233
Baze de date

DISPLAY MEMORY LIKE m*


?m1,m2
@ 10,10 SAY ‘x3='
Care afirmaţii sunt adevărate ?
a. afişează conţinutul tuturor variabilelor definite
b. defineşte variabila x3 de tip real
c. conţine o eroare
d. foloseşte două funcţii de sistem
e. afişează, din memorie, toate variabilele

13. Se dă secvenţa de program:


SET TALK OFF
m=8
m1=m**2
IF m1<100
?8
ELSE
IF m1 > 100
? 108
ELSE
?m1
ENDIF
ENDIF

Ce valori se afişează ?
a. 64
b. 108
c. nu se afişează nimic
d. 8
e. m1

234
Visual Foxpro

14. Ce va afişa secvenţa de program:

SET TALK OFF


m=0
@ 6,6 SAY 'm=' GET m
READ
IF m = 1
?m + 1
ELSE
IF m = 22
@ 20,2 SAY 'nimic'
ELSE
IF m > 50
?m
ELSE
?m-1
ENDIF
ENDIF
ENDIF
dacă se încarcă de la tastatură valoarea 23 ?
a. 22
b. 24
c. 23
d. nimic
e. 50

15. Ce va afişa secvenţa de program :

235
Baze de date

SET TALK OFF


STORE 1 TO m1,m2
m2 = ‘DELL’
m2 = SPACE (11)
@ 5, 5 GET m2
READ
DO CASE
CASE m1 =1
?1
CASE m2 = 2
? m1+1
CASE m3 = 3
? m2
OTHERWISE
@10,2 SAY ‘EROARE’
ENDCASE
Dacă se încarcă de la tastatură valoarea 2 ?

a. DELL
b. 2
c. 11
d. EROARE
e. 3

16. Ce va afişa secvenţa de program:


SET TALK OFF
STORE 0 TO m1,m2,m3
@ 5,5 SAY ‘m1 = ’ GET m1
READ
m3 = m1 * m2 +2

236
Visual Foxpro

m2 = ‘OK’
DO CASE
CASE m3 = 1
m2 = m1 -1
CASE m3 = 2
m2 = ‘dell’
CASE m3 = 3
m2 = m3 * 3
CASE m3 = 4
m2 = .T.
ENDCASE
Dacă se introduce de la tastatură valoarea 22 ?

a. .T.
b. 1
c. dell
d. 9
e. OK

17. Ce realizează următoarea secvenţă de program ?


cod = SPACE(4)
nume= REPLICATE(’ ’,10)
@5,5 SAY ’ Cod : ’ GET cod
READ
@10,5 SAY ’ Nume : ’ GET nume
READ
a. încarcă un set de date de la tastatură
b. este greşită pentru că sunt două comenzi READ
c. defineşte şi descrie atributele unei tabele
d. este greşită pentru că nu există DO WHILE

237
Baze de date

e. defineşte un meniu

18. Comanda @5,x SAY y, unde x şi y sunt variabile întregi diferite de cinci:
a. este o comandă de intrare standard
b. scrie o valoare începând din coloana cinci
c. este o comandă de ieşire standard
d. este o comandă de citire stantard
e. este greşită pentru că apare x şi y

19. Se dă următoarea secvenţă de program:


DO CASE
CASE x=1
@10,10 SAY ‘eroare sintaxa’
CASE x=2
CASE x=3
@10,10 SAY ‘valoare buna’
OTHERWISE
@10,10 SAY ‘se va relua procedura’
ENDCASE
Care afirmaţii sunt adevarate ?
a. realizează o structură ciclică
b. este greşită pentru că are CASE vid
c. este greşită pentru că are OTHERWISE
d. este greşită pentru că nu are READ
e. realizează o structură alternativă

20. Comanda @10,5 SAY ‘OK!’:


a. este o comandă de intrare standard
b. este o comandă de intrare standard
c. afişează un text pe linia 10

238
Visual Foxpro

d. este greşită pentru că nu este urmată de READ


e. citeşte un text de pe linia 10

21. Pentru a afişa o fereastră se foloseşte comanda:


a. DEFINE WINDOW
b. ACTIVATE WINDOW
c. DEACTIVATE WINDOW
d. SHOW WINDOW
e. HIDE WINDOW

22. Pentru a crea un meniu orizontal se foloseşte comanda:


a. DEFINE MENU
b. DEFINE POPUP
c. DEFINE PAD
d. DEFINE BAR
e. CREATE MENU

23. Se dă următoarea secvenţă de program:


m1=0
@10,10 SAY ‘Valoarea intreaga’ GET m1
READ
DO p1
?’Inregistrarea = ’, RECNO()
PROCEDURE p1
DO CASE
CASE m1=1
GO TOP
CASE m1=2
GO BOTTOM
ENDCASE

239
Baze de date

RETURN
Care afirmaţii sunt adevărate ?
a. este greşită pentru că procedura este plasată după apel
b. este greşită pentru că nu este apelată bine
c. este greşită pentru că o structura tip CASE nu poate apare într-o procedură
d. este gresită pentru că variabila ‘m1’ se utilizează în procedură şi nu este
definită în ea
e. este greşită o comandă GO

24. Se dă următoarea secvenţă de program:


m=0
@10,10 SAY ‘m : ’ GET m
READ
DO p1
PROCEDURE p1
IF m=2
?’CORECT’
ELSE
?’EROARE’
ENDIF
RETURN
Care afirmaţii sunt adevărate ?
a. procedura trebuie obligatoriu plasată înainte de comanda de apel
b. după apelul procedurii este obligatorie încă o comandă
c. este greşită comanda de citire a datelor
d. este greşită procedura
e. este greşită revenirea din procedură

25. Se dă următoarea secvenţa de program:


m1=10

240
Visual Foxpro

m2=2
DO p2
?’Terminat’
PROC p2
DO p2
m1=m1/m2
PROC p2
m2=m1/m2
PROC p3
m3=22
DO p1
m3=m3+m2
RETURN
Care afirmaţii sunt adevărate ?
a. procedura ‘p1’ trebuie situată după procedura ‘p3’
b. imbricarea comenzilor de apel se face pe mai multe niveluri
c. variabila ‘m2’ este paramentru de intrare în procedura ‘p3’
d. variabilele ‘m1’ şi ‘m3’ sunt ambele parametri de intrare în procedura ‘p1’
e. este greşita secvenţa

26. Se dă urmatoarea secvenţă de program:


m1=2
DO p1
?’Ok’
PROC p1
PUBLIC m2
m2=m1**2
DO p2
PROC p2
m3=m2+m1

241
Baze de date

RETU
Care afirmaţii sunt adevărate ?
a. procedura ‘p1’ este greşită pentru că nu are RETURN
b. procedura ‘p2’ este greşită pentru că foloseşte variabila ‘m2’ pe care nu a
definit-o
c. procedura ‘p2’ este greşită pentru că foloseşte variabila ‘m3’ pe care nu a
definit-o
d. comanda PUBLIC nu există în FoxPro
e. secvenţa este un program modularizat

27. Se dă următoarea secvenţă de program:


optiune=”D”
DO WHILE optiune $ “D/d”
CLEAR
@5,5 PROMPT ‘Actualizare’
@6,5 PROMPT ‘Afisare’
@7,5 PROMPT ‘Terminare’
MENU TO m1
DO CASE
CASE m1=1
DO a
CASE m1=3
optiune=’N’
ENDCASE
ENDDO
PROC a
Care afirmaţii sunt adevărate ?
a. realizează un meniu orizontal
b. realizează un meniu vertical
c. este greşită structura CASE pentru că nu tastează m1=2

242
Visual Foxpro

d. este greşită procedura ‘a’ pentru că nu are RETURN


e. este greşită secvenţa pentru că nu este definită variabila ‘m1’

28. Se dă următoarea secvenţă de program:


optiune=”d”
DO WHILE LOWER(optiune)=’d’
CLEAR
@5,1 TO10,50
@6,1 PROMPT ‘Linia 1’ MESSAGE ‘Lista studenti’
@7,1 PROMPT ‘Linia 2’ MESSAGE ‘Lista profesori’
@8,1 PROMPT ‘Terminare’
MENU TO m1
DO CASE
CASE m1=1
CASE m1=2
CASE m1=3
optiune=’n’
ENDCASE
ENDDO
Care afirmaţii sunt adevărate ?
a. realizează un meniu vertical
b. afişează mesaje explicative pe linia 20 pe ecran
c. permite lucrul cu meniul atâta timp cât doreşte utilizatorul
d. la selectarea primelor două opţiuni din meniu nu se execută nici o
procedură
e. selectarea unei opţiuni se poate face cu tastele săgeţi şi apoi cu tasta
ENTER

29. Se dă următoarea secvenţă de program:


CLEAR

243
Baze de date

DEFINE POPUP POP1 FROM 5,5 MESSAGE ‘Meniu pricipal’


DEFINE BAR 1 OF POP1 PROMPT ‘VIZUALIZARE’
DEFINE BAR 2 OF POP1 PROMPT ‘A\<CTUALIZARE’
DEFINE BAR 3 OF POP1 PROMPT ‘TERMINARE’
ON SELECTION BAR 1 OF POP1 DO a
ON SELECTION BAR 2 OF POP1 DO v
ON SELECTION BAR 3 OF POP1 DO DEAC POPUP POP1
ACTI POPUP POP1
SHOW POPUP POP1
DEAC POPUP POP1
?’TERMINAT OK’
PROC v
@20,10 SAY ‘vizualizare inactiva’
PROC a
@20,10 SAY ‘actualizare inactiva’
RETURN

Care afirmaţii sunt adevărate ?


a. realizează un meniu vertical
b. realizează un meniu orizontal
c. selectarea opţiunii 1 se face tastând litera V
d. selectarea opţiunii 2 se face tastând litera A
e. selectarea opţiunii 3 se face tastând litera T

30. Se dă următoarea secvenţă de program:


CLEAR
DEFINE MENU men1 BAR AT LINE 10
DEFINE PAD p1 OF men1 PROMPT ‘VIZ’
DEFINE PAD p2 OF men1 PROMPT ‘ACT’
DEFINE PAD p3 OF men1 PROMPT ‘SFARSIT’

244
Visual Foxpro

ON SELE MENU men1 DO s


ACTI MENU men1
DEAC MENU men1
PROC s
DO CASE
CASE PAD()=’P1’
CASE PAD()=’P2’
CASE PAD()=’P3’
ENDCASE
RETURN

Care afirmaţii sunt adevărate ?


a. structura CASE este eronată
b. trebuia o singură comandă DEFINE PAD pentru toate opţiunile meniului
c. la o execuţie a programului se poate apela o singură opţiune din meniu
d. opţiunea ACT se găselte pe linia 21 pe ecran
e. meniul are trei opţiuni

31. Se dă următoarea secvenţă de program:


CLEAR
DEFI WIND f1 FROM 5,5 TO 15,35 TITLE ‘Rasfoire’
SHADOW
ACTI WIND f1
USE studenti
BROW
DEAC WIND f1
Care afirmaţtii sunt adevărate ?
a. realizează un meniu vertical
b. realizează un meniu orizontal
c. realizează o fereastră

245
Baze de date

d. se poate vizualiza tabela ‘studenti’


e. la terminarea execuţiei cursorul nu revine în fereastra de comandă

32. Se dă următoarea secvenţă de program:


CLEAR
DEFINE WINDOW f FROM 5,5 TO 20,99
ACTIVE WINDOW f
@1,2 SAY “Mesaj”
WAIT ‘Apasati orice:’
DEAC WIND ALL
Care afirmaţii sunt adevărate ?
a. se afişează un mesaj pe linia unu de pe ecran
b. se afişează un mesaj pe linia trei de pe ecran
c. se afişează un mesaj pe linia trei din fereastră
d. se citeşte un mesaj pe linia unu din fereastră
e. o comandă este greşită

33. Afişarea structurii unei tabele se face prin comanda:


a. LIST
b. DISPLAY STRUCTURE
c. LIST STRUCTURE
d. COPY STRUCTURE
e. nu se poate

34. Pentru a redenumi un atribut dintr-o tabelă se foloseşte comanda :


a. MODIFY STRUCTURE
b. ALTER TABLE
c. ALTER DATABASE
d. MODIFY DATABASE
e. nu se poate

246
Visual Foxpro

35. În fereastra de dialog ‘Structure’, pentru o tabelă, se poate încărca :


a. numele câmpurilor
b. lungimea câmpurilor
c. valoare pentru câmpuri
d. o înregistrare
e. tipul câmpurilor

36. Se dă secvenţa :
USE STUDENTI
MODI STRU
Care afirmaţii sunt adevărate?
a. se pot modifica şi adăuga attribute din/în tabela STUDENTI
b. se poate şterge un câmp din tabela STUDENTI
c. se poate modifica numele tabelei STUDENTI
d. se poate modifica numele unui câmp din tabela STUDENTI
e. conţine o comandă greşită

37. Pentru a închide tabela ’STUDENTI’


a. se foloseşte comanda USE STUDENTI
b. se foloseşte comanda USE
c. se foloseşte comanda CLOSE ALL
d. se foloseşte comanda CLOSE DATABASES
e. se deschide o altă tabelă în zona in care este deschisă tabela STUDENTI

38. O tabelă care conţine un atribut de tip ‘memo’ se salvează :


a. într-un fişier de tip (.dbf)
b. într-un fişier de tip (.fpt)
c. într-un fişier de tip (.idx)
d. într-un fişier de tip (.prg)

247
Baze de date

e. atributul memo se salvează într-un fişier (.fpt) şi tabela într-un fişier de tip
(.dbf)

39. Accesul secvenîial la datele dintr-o tabelă se face prin comanda :


a. SEEK
b. FIND
c. GOTO
d. LOCATE
e. CONTINUE

40. Comanda CLOSE se foloseşte pentru a închide :


a. baza de date
b. tabelele
c. indecşii
d. fereastra de comandă
e. fereastra HELP

41. Fereastra de comandă se închide :


a. prin comanda CLOSE
b. nu se închide
c. la închiderea sesiunii de lucru
d. prin comanda SELECT
e. prin comanda CLOSE WINDOW

42. Posibilitatea de a obţine înregistrări ordonate dintr-o tabelă este realizată


prin comanda :
a. SORT
b. INDEX
c. SELECT cu clauza ORDER
d. SET INDEX

248
Visual Foxpro

e. SET ORDER

43. Efectul secvenţei :


USE STUDENTI
GO 3
SKIP
DISPLAY
a. poziţionează pointerul pe înregistrări din ‘STUDENTI’
b. afişează prima înregistrare din ‘STUDENTI’
c. poziţionează pointerul pe ultima înregistrare din ‘STUDENTI’
d. afişează înregistrarea curentă
e. afişează înregsitrarea a patra din ‘STUDENTI’

44. Efectul secvenţei:


USE STUDENTI
LOCATE FOR COD=22
DISPLAY
LOCATE FOR COD=22
DISPLAY
Este:
a. afişează prima înregistrare pentru care ‘cod’ este 22
b. afişează prima şi a doua înregistrare pentru care ‘cod’ este 22
c. acces direct la o înregistrare pentru care ‘cod’ este 22
d. accesează două înregistrări diferite din ‘STUDENTI’
e. acces secvenţial la o înregistrare pentru care ‘cod’ este 22

45. Pentru a adăuga o înregistrare ‘goală’ (vidă) într-o tabelă se foloseşte


comanda:
a. APPEND BLANK
b. APPEND

249
Baze de date

c. INSERT
d. REPLACE
e. UPDATE

46. Pentru a adăuga o înregistrare la sfârşitul unei tabele se foloseşte:


a. INSERT-SQL
b. APPEND
c. REPLACE
d. UPDATE
e. RECALL

47. Se dă secvenţa :
USE STUDENTI
GO 3
APPEND BLANK
Care afirmaţii sunt adevărate ?
a. adaugă o înregistrare la sfârşitul tabelei curente
b. adaugă un numar de înregistrări dorit de utilizator
c. adaugă o înregistrare după cea curentă
d. adaugă o înregistrare după cea cu numărul de ordine 3
e. adaugă o înregistrare vidă

48. Se da secvenţa :
USE STUDENTI
SKIP 2
APPEND
DISPLAY
Care afirmaţii sunt adevărate ?
a. conţine o comandă greşită

250
Visual Foxpro

b. adaugă la sfârşitul tabelei curente un număr de înregistrări dorit de


utilizator
c. afişează înregistrarea curentă
d. adaugă înregistrări după cea cu numărul de ordine 2
e. adaugă înregistrări după cea curentă

49. Se dă secvenţa :
USE STUDENTI
DISPLAY
REPLACE RECORD 3 FOR cod=22 GRUPA WITH ‘112A’
Care afirmaţii sunt adevărate ?
a. modifică în primele 3 înregistrări ‘cod’ cu 22 şi ‘grupa’ cu 112A
b. modifică înregistrarea a treia dacă cod=22
c. modifică trei înregistrări
d. conţine o comandă greşită
e. şterge logic a treia înregistrare

50. Se dă secvenţa :
USE STUDENTI
PACK
DELETE NEXT 2
GO TOP
LIST
Care afirmaţii sunt adevărate ?
a. şterge fizic primele două înregistrări
b. şterge logic şi fizic doar a doua înregistrare
c. şterge fizic doar a doua înregistrare
d. şterge logic doar a doua înregistrare
e. şterge logic primele două înregistrări

251
Baze de date

Bibliografie

[1.] Informatică – varianta Visual Foxpro – Mariana Panţîru, Ionuţ


Panţîru, Irina-Ioana Panţîru, Editura L&S InfoMat, Bucureşti, 2002.
[2.] Aplicaţii cu baze de date în Visual Foxpro – culegere de probleme
– Mariana Panţîru, Ionuţ Panţîru, Irina-Ioana Panţîru, Editura L&S Soft,
Bucureşti, 2004.
[3.] Modelarea bazelor de date – Ileana Popescu, Editura Tehnică,
Bucureţti, 2001.
[4.] Teste şi probleme de programare în Visual Foxpro şi Oracle –
Manole Velicanu, Ion Lungu, Mihaela Muntean, Editura Petrion, Bucureşti,
2000.
[5.] Visual Foxpro 5.0 – Paul Petruş, Editura Promedia Plus, Cluj-Napoca,
1998.
[6.] Limbajul de programare Visual Foxpro 6.0 – Marcel Andrei
Homorodean, Simona Petrescu, Editura Niculescu, Bucureşti, 2002.
[7.] Foxpro – Gabriel şi Mihai Dima, Editura Teora, Bucureşti, 1993.
[8.] Foxpro pentru programatori – Leon Ţâmbulea, Editura Promedia Plus,
Cluj-Napoca, 1996.
[9.] Sistemul Foxpro – Ion Lungu, Nely Muşat, Mihaela Nicolae, Manole
Velicanu, Ion Teodor, Attila Barta, Editura All, Bucureşti, 1993.
[10.] Baze de date şi gestiunea tranzacţiilor – Robert Dollinger, Editura
Albastră, Cluj-Napoca, 2001.
[11.] Teoria generală a bazelor de date – Ioan Despi, Reisz Robert,
Gheorghe Petrov, Aurel Stepan, Editura Mirton, Timişoara, 2000.
[12.] Baze de date – organizare, proiectare şi implementare – Ion
Lungu, Constanţa Bodea, Georgeta Bădescu, Cristina Ioniţă, Editura All
Educaţional, Bucureşti, 1995.

252
Visual Foxpro

[13.] Sisteme de gestiune a bazelor de date – Visual Foxpro – Tamaş


Ilie, Popa Gheorghe, Berbec Florentina, Vrîncianu Marinela, Glăvan Nicolae,
Editura Cison, Bucureşti, 2001.
[14.] Baze de date şi aplicaţii – Costin Pribeanu, Editura Matrixrom,
Bucureşti, 2000.
[15.] Principles of distributed database systems – M. Tamer Orzu,
Patrick Valduriez, Prentice Hall, N.J. 1999.
[16.] Baze de date : Visual Foxpro 6.0 – indrumar de laborator –
Marian Popescu, Adrian Runceanu, Editura Academica Brancusi Targu-Jiu,
2007, ISBN 978-973-144-008-8.

253
Baze de date

Soluţii

1. b 26. e.
2. a. 27. b.
3. a 28. a.,b.,c.,d.,e.
4. b 29. a.
5. a 30. c. si e.
6. c,d,e 31. c. si d.
7. d 32. nici un răspuns corect
8. a,b,d 33. b. si c.
9. c,e 34. a, c, d
10. nici una 35. a, b, e
11. d 36. a, b, d
12. b 37. b, c, d, e
13. d 38. e
14. a 39. d, e
15. nici un răspuns corect 40. a, b, c
16. c 41. c
17. a. 42. a, b, c
18. c. 43. e
19. e. 44. a, e
20. nici un răspuns corect 45. a
21. b. si d. 46. a, b
22. a. si e. 47. a, e
23. nici un răspuns corect 48. b, c
24. c. 49. b
25. b. si c. 50. e

254

View publication stats

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