SGBD Visual Foxpro
SGBD Visual Foxpro
SGBD Visual Foxpro
Identificarea şi
clasificarea unor tipuri
de structuri de date
Dupå ce veÆi parcurge acest
În anii precedenÆi de studiu, aÆi învåÆat cå un calculator
capitol trebuie så çtiÆi: este o unealtå electronicå ce vå poate ajuta så prelucraÆi
informaÆia. InformaÆia prelucratå poate fi formatå din
1. Cum folosiÆi datele pentru a texte, numere, imagini sau sunete. Ea este påstratå pe
prelucra informaÆiile. diferite medii de memorare, în diferite formate, sub
2. Ce tipuri de date puteÆi folosi.
formå de date. Açadar, orice rezolvare de problemå
3. Cum puteÆi organiza datele
sub formå de colecÆii de date.
începe prin definirea datelor, continuå cu prelucrarea lor
4. Ce colecÆii de date puteÆi folosi (de exemplu atribuirea de valori) çi se terminå fie cu
în procesul de prelucrare a afiçarea valorii lor, fie cu stocarea lor pe un mediu de
datelor. memorare în vederea prelucrårii lor ulterior.
5. Ce este o bazå de date çi cum
AÆi mai învåÆat cå un calculator nu çtie så prelucreze
sunt organizate datele într-o
bazå de date.
decât çiruri de cifre binare care pot fi modelate fizic prin
6. Ce operaÆii puteÆi executa impulsuri de curent, cu douå niveluri de tensiune ce co-
pentru a obÆine informaÆii în respund celor douå cifre binare 0 çi 1. Prin urmare, date-
le vor fi codificåri binare ale informaÆiei existente în exte-
urma prelucrårii datelor dintr-o
bazå de date. riorul calculatorului. Fiecårui tip de informaÆie îi cores-
punde un anumit mod de stocare în mediul de memora-
re, adicå un anumit tip de datå. Tipul datei determinå atât operaÆiile care se pot executa cu
acele date, cât çi modul în care sunt reprezentate pe mediul de memorare. Astfel, fiecare
caracter dintr-un çir de caractere va fi reprezentat sub forma unui grup de 8 cifre binare
corespunzåtoare codului ASCII asociat caracterului, iar asupra datelor de acest tip se pot
aplica numai operatorul de concatenare çi operatorii relaÆionali. Açadar, datele (data) sunt
çiruri de biÆi care sunt prelucrate de calculator. Data este o resurså la dispoziÆia
programatorului çi orice limbaj de programare permite folosirea mai multor tipuri de date.
Indiferent de tipul de date ales, reprezentarea datei în memoria calculatorului (fie internå,
fie externå) se face printr-un çir de biÆi. Pentru a realiza aceastå reprezentare sunt imple-
mentaÆi algoritmi de codificare care asigurå corespondenÆa dintre tipul de datå çi çirul
de biÆi atât la scrierea datelor, cât çi la citirea lor. Tipul de datå ales de cåtre programator
influenÆeazå calitatea programului deoarece el determinå dimensiunea zonei de memorie
4 Informatică
Structuri de date
Structurile de date create în memoria internå sunt temporare dar permit o vitezå de
prelucrare mult mai mare decât a celor organizate în memorie externå. Pe de altå parte,
structurile de date organizate în memoria externå sunt permanente çi permit stocarea çi
prelucrarea unei cantitåÆi mari de date.
Identificarea Ñi clasificarea unor tipuri de structuri de date 5
1. Baza de date
Principalele probleme pe care le implicå înså o colecÆie de date formatå dintr-un ansam-
blu de fiçiere de date sunt:
9 RedundanÆa datelor. RedundanÆa reprezintå o proprietate a unei colecÆii de date çi
se referå la faptul cå unele componente ale colecÆiei sunt memorate de mai multe
ori pe suportul de memorare. Date care reprezintå aceeaçi informaÆie pot så aparå
în fiçiere de date diferite, de multe ori cu formate de reprezentare diferite. Folosind
mai multe copii ale aceloraçi date se consumå inutil suport de memorare. Pe lângå
acest dezavantaj, mai existå çi alte dezavantaje: se consumå timpi suplimentari cu
actualizarea datelor, deoarece se actualizeazå de mai multe ori acelaçi set de date
(actualizarea se face în fiecare fiçier de date în care setul de date apare), actualizarea
datelor în toate fiçierele de date este un proces dificil (fiecare posesor al unui fiçier de
date trebuie så fie informat de schimbårile survenite) çi nu pot fi controlate erorile
apårute în procesul de actualizare a datelor.
9 Actualizarea fiçierelor çi påstrarea integritåÆii datelor. Actualizarea datelor trebuie
så se facå în toate fiçierele în care apar. Dacå se omite un singur fiçier, nu mai este
asiguratå integritatea datelor, iar rapoartele obÆinute cu aceste date vor conÆine
informaÆii greçite.
9 DependenÆa programelor de fiçierele de date. Pentru exploatarea çi întreÆinerea
fiecårui fiçier de date, programatorii vor scrie câte un program. Orice modificare în
structura fiçierului de date va avea ca efect modificarea programului de aplicaÆie. În
plus, în loc så se scrie un singur program pentru o colecÆie de date unicå, se scriu mai
multe programe, câte unul pentru fiecare colecÆie. Efectul este creçterea costurilor
plåtite de cåtre organizaÆie pentru programele care trebuie så-i furnizeze informaÆiile
din fiçierele de date.
Ansamblurile independente de date erau folosite în general în folosul unui singur depar-
tament al organizaÆiei çi mai puÆin în folosul întregii organizaÆii. SoluÆia care poate rezolva
aceastå problemå este reunirea datelor într-o colecÆie unicå numitå baza de date. În
acest mod, organizaÆia îçi poate exercita controlul asupra tuturor datelor.
Controlul se executå prin intermediul administratorului bazei de date (database
administrator - DBA) care este o poziÆie în cadrul administraÆiei (ocupatå de una sau mai
multe persoane) ce are ca atribuÆie stabilirea datelor care sunt necesare în cadrul
organizaÆiei sau la nivelul fiecårui departament. Administratorul bazei de date mai poate
så stabileascå çi modul în care se executå accesul la date, adicå så hotårascå pentru
fiecare persoanå din organizaÆie setul de date din colecÆia de date la care are acces. Pe
parcursul exploatårii bazei de date, el poate så hotårascå modificarea structurii bazei de
date în funcÆie de noile cerinÆe ale utilizatorilor.
6 Informatică
RelaÆii cu
Resurse clienÆii Aprovizi-
umane Salarizare ProducÆie onare
Marketing
Produse Stocuri
AngajaÆi Salarii
Vânzåri Catalog
produse
Furnizori
ClienÆi Comenzi
Deoarece datele companiei se gåsesc în mai multe fiçiere de date independente, apar
urmåtoarele dezavantaje:
1. Departamentele nu pot folosi în comun datele de care au nevoie. Între fiçierele cu
date ale departamentelor nu existå posibilitatea de comunicare, iar departamentele nu
pot folosi în comun aceste date. De exemplu, dacå angajaÆii implicaÆi în vânzåri sunt
plåtiÆi în funcÆie de coeficientul vânzårilor lunare çi nu conform unui salariu tarifar,
informaÆiile necesare calculårii drepturilor salariale ale acestor persoane se gåsesc în
fiçierul Vânzåri. La acest fiçier nu are acces funcÆionarul din departamentul Salarizare
care are nevoie de ele pentru a calcula salariul lunar al angajaÆilor ce se ocupå cu
vânzarea produselor. Aceasta înseamnå cå o persoanå din departamentul Marketing
va extrage din fiçierul Vânzåri o listå cu angajaÆii implicaÆi în vânzåri în luna respectivå
çi cu volumul valoric al vânzårilor fiecåruia dintre ei. La rândul såu, persoana din
departamentul Salarizare va trebui så actualizeze fiçierul Salarii pe baza listei primite.
2. Ansamblul de fiçiere de date are o redundanÆå foarte mare. ColecÆia de fiçiere de
date are o redundanÆå mare deoarece foarte multe din date sunt duplicate, fiind
memorate în mai multe fiçiere de date. De exemplu, unele informaÆii despre angajaÆi
sunt memorate çi în fiçierul Salarii aflat în întreÆinerea compartimentului Salarizare,
dar çi în fiçierul AngajaÆi aflat în întreÆinerea compartimentului Resurse umane sau
unele informaÆii despre produsele realizate pot så aparå atât în fiçierul Produse aflat
în întreÆinerea compartimentului ProducÆie, cât çi în fiçierul Catalog_produse aflat în
întreÆinerea compartimentului Marketing.
3. Orice miçcare în cadrul companiei necesitå intervenÆia în mai multe fiçiere de
date. De exemplu, datele despre un client pot så aparå atât în fiçierul ClienÆi, cât çi în
fiçierul Vânzåri. Dacå un client îçi schimbå adresa, modificarea trebuie fåcutå în ambele
fiçiere. Deci, o persoanå din cadrul companiei trebuie så aibå grijå så informeze cele
douå persoane care se ocupå de actualizarea celor douå fiçiere din cele douå
departamente ca så facå aceste modificåri. Aceasta înseamnå cå la nivelul companiei
ar trebui så existe o persoanå care så aibå cunoçtinÆe despre toate aceste fiçiere de
date, de structura lor çi de toate schimbårile care apar în cadrul companiei çi care pot
afecta aceste date. Aceastå persoanå ar trebui så informeze, atunci când este cazul,
departamentele care trebuie så-çi actualizeze datele, ce date trebuie så actualizeze çi
cu ce valori, altfel nu ar mai putea fi asiguratå integritatea datelor. DeficienÆe pot så
aparå chiar dacå aceastå persoanå informeazå corect departamentele. Persoana care
face modificåri într-un fiçier de date poate så scrie greçit o valoare, astfel încât la nivelul
companiei, aceeaçi datå va avea valori diferite, în fiçiere diferite.
SoluÆia este reunirea acestor fiçiere de date într-o singurå colecÆie de date: baza de
date. În aceastå colecÆie pot fi eliminate datele duplicate (de exemplu informaÆiile des-pre
un client care apar çi în fiçierul ClienÆi çi în fiçierul Vânzåri çi în fiçierul Comenzi),
micçorându-se foarte mult redundanÆa datelor. Deoarece datele se vor gåsi o singurå
datå, în aceeaçi colecÆie, actualizarea lor se poate face mult mai uçor, asigurându-se
astfel integritatea datelor. În plus, angajaÆii unui departament pot avea acces çi la datele
produse de un alt departament.
Principala problemå care apare în acest caz este ca angajaÆii unui departament så aibå
acces numai la datele care le sunt strict necesare çi nu la toate datele companiei. De
exemplu, persoana care se ocupå de corespondenÆå trebuie så aibå acces numai la
8 Informatică
adresele angajaÆilor, ale clienÆilor çi ale furnizorilor pentru a putea expedia cores-
pondenÆa, nu çi la alte date despre aceçtia: salariile angajaÆilor, conturile bancare ale
clienÆilor, facturile emise cåtre clienÆi çi alte tranzacÆii financiare fåcute de companie.
Açadar, principalul avantaj al bazelor de date îl reprezintå partajarea datelor unei
organizaÆii între membrii ei, iar principalul dezavantaj este necesitatea controlårii
accesului la datele importante din colecÆie.
ConsideraÆi cå çcoala voastrå este o organizaÆie formatå din mai multe compartimente.
AnalizaÆi activitatea din çcoala voastrå çi puneÆi în evidenÆå fiçierele de date care pot fi
folosite pentru a Æine evidenÆa activitåÆilor care au loc la nivelul çcolii çi la nivelul fiecårei
clase. AråtaÆi care sunt deficienÆele acestei colecÆii de
fiçiere de date.
Baza de date (database) este o colecÆie de fiçiere çi înregistråri legate între ele.
Pentru a permite accesul diferenÆiat la datele din colecÆia de date, se poate defini o
schemå generalå a bazei de date care descrie întreaga colecÆie de date çi diferite
scheme parÆiale care descriu seturile de date din colecÆie la care pot avea acces anumiÆi
utilizatori sau anumite grupuri de utilizatori.
Açadar, avantajele folosirii bazelor de date în locul fiçierelor de date sunt:
9 Partajarea informaÆiilor. Spre deosebire de datele din fiçierele de date la care au
acces numai utilizatorii care le-au creat çi le întreÆin, la datele din baza de date pot
avea acces toÆi membrii unei organizaÆii, care îçi vor partaja datele din baza de date.
Pot fi create aplicaÆii noi care så foloseascå datele din mai multe colecÆii de date çi
care så furnizeze informaÆii noi folosind tot ansamblul de date. În acest mod, fiecare
utilizator are senzaÆia cå este beneficiarul unic al colecÆiei de date.
Identificarea Ñi clasificarea unor tipuri de structuri de date 9
nevoie de ele. În plus, baza de date poate fi reorganizatå (pot fi regrupate câmpurile din
înregistråri) pentru a face faÆå cerinÆelor unui nou utilizator, fårå a fi afectaÆi vechii utili-
zatori. Eliminarea unor entitåÆi din baza de date poate afecta înså utilizatorii care fac
referiri la acele entitåÆi.
Software-ul de aplicaÆie
Prezintå imaginea datelor într-o formå accesibilå utilizatorului çi permite personalizarea
sistemului de gestiune a bazelor de date folosit. Rolul såu este de a prezenta informaÆia
în mod interactiv, în termeni specifici aplicaÆiei, prin intermediul unei interfeÆe. Nu are
rolul de a gestiona datele. AplicaÆia poate comunica cu utilizatorul fie printr-un sistem de
întrebåri çi råspunsuri, fie prin intermediul unor formulare completate de cåtre utilizator.
Software-ul de aplicaÆie poate fi conceput fie de programatori, în cazul bazelor de date
mari, distribuite pe mai multe calculatoare ale organizaÆiei, fie chiar de unii utilizatori ai
bazei de date, în cazul bazelor de date mici, organizate pe microcalculatoare.
Bazå de date
Sistem de gestiune
a bazelor de date
Software de aplicaÆii
Utilizator
Identificarea Ñi clasificarea unor tipuri de structuri de date 11
9 Programele de aplicaÆii sunt uçor de scris deoarece ele descriu datele folosind
modelul conceptual al bazei de date (numele entitåÆilor care formeazå baza de date)
çi nu structura fizicå a datelor înregistrate pe suportul de memorare.
Sistemul de gestiune a bazelor de date furnizeazå instrumentele necesare pentru
manipularea datelor, dintre care cele mai importante sunt:
9 cåutarea uneia sau a mai multor entitåÆi care îndeplinesc anumite criterii,
9 sortarea în diferite moduri a diferitelor entitåÆi din baza de date,
9 generarea unor raporte folosind datele stocate în baza de date,
9 generarea unor formulare pentru introducerea çi validarea datelor.
Baza de date
Reprezintå un model de organizare a datelor oferit de sistemul de gestiune a bazelor de
date folosit. În cazul fiçierelor de date existå douå niveluri de organizare a datelor: nivelul
logic care constå în descrierea structurii de câmpuri de cåtre programator çi nivelul fizic
care constå în metodele de înregistrare çi regåsire a datelor la nivelul suportului de date. În
cazul bazelor de date, pentru asigurarea independenÆei datelor, organizarea trebuie så se
facå pe cel puÆin trei niveluri:
Nivelul extern
(modelul extern) Nivelul
conceptual
vizualizårile (modelul Nivelul intern
conceptual) (modelul intern)
descrierea bazei
de date baza de date
fizicå
Utilizatori
Calculator
Sistemul e gestiune a
bazelor de date
9 Nivelul intern sau baza de date fizicå este reprezentat de colecÆia de fiçiere înregis-
trate pe suportul de memorare, fiçiere care conÆin datele propriu-zise dar çi informaÆiile
suplimentare, necesare accesului la datele din baza de date.
9 Nivelul conceptual reprezintå descrierea unitåÆilor logice din care este formatå baza
de date çi a legåturilor dintre ele. Tot în modelul conceptual sunt specificate constrân-
gerile aplicate asupra datelor, care determinå restricÆii ale operaÆiilor de actualizare.
Ele sunt necesare pentru a asigura integritatea datelor.
9 Nivelul extern reprezintå modelul extern cu care opereazå utilizatorul bazei de date.
Acesta este format din unitåÆile logice de la nivelul conceptual cu care opereazå un
utilizator sau un grup de utilizatori. Pentru modelul extern se mai foloseçte çi termenul
de vizualizare (view) sau tabel virtual, deoarece se defineçte pe baza unei expresii
Identificarea Ñi clasificarea unor tipuri de structuri de date 13
relaÆionale aplicate câmpurilor din tabelele reale ale bazei de date. Vizualizarea
påstreazå numai schema prin care este definitå, nu çi datele propriu-zise, pe care le
preia din tabelele reale de fiecare datå când este folositå. Cea mai importantå utilitate
a unei vizualizåri este aceea cå prin intermediul ei se poate controla accesul unui grup
de utilizatori la baza de date. Deoarece utilizatorul are acces la baza de date nu prin
modelul conceptual, ci prin vizualizåri, acestea pot så ascundå unui utilizator acele
unitåÆi logice la care nu are drept de acces. Vizualizårile pot så controleze çi operaÆiile
pe care le poate executa cu unitåÆile logice: unele vizualizåri îi permit så actualizeze
unele unitåÆi logice, altele îi permit numai så le consulte. De exemplu, dacå se
construieçte o bazå de date a companiei, în tabelul AngajaÆi este înregistratå data
naçterii pentru fiecare angajat. Dacå o anumitå categorie de utilizatori (de exemplu
personalul din compartimentul Resurse Umane) doreçte o listå cu angajaÆii dintr-un
compartiment çi vârsta lor, nu se recomandå înregistrarea vârstei ca unitate logicå în
modelul conceptual deoarece ar trebui actualizatå zi de zi. Cel mai simplu este så se
creeze o vizualizare pentru aceastå categorie de utilizatori în care se defineçte
entitatea vârstå. Aceastå entitate se calculeazå ca diferenÆå dintre data curentå
furnizatå de sistem çi data naçterii înregistratå într-unul din tabelele bazei de date.
În baza de date aveÆi un tabel cu notele elevilor, care are urmåtoarele câmpuri: codul ele-
vului, disciplina, data notårii, nota. Pentru a afla mediile semestriale ale elevilor dintr-o
claså la fiecare disciplinå, ce soluÆie se poate alege: så se creeze un tabel cu mediile
elevilor (care så aibå urmåtoarea structurå: codul elevului, codul disciplinei, media) sau
så se creeze o vizualizare cu aceeaçi structurå?
Modelul de date oferå instrumentele necesare interpretårii datelor din colecÆia de date.
El este format din douå componente:
9 un set de reguli pentru organizarea çi structurarea datelor,
9 un set de reguli care definesc operaÆiile pentru manipularea datelor.
Se pot folosi mai multe modele pentru organizarea bazelor de date.
plecare Bucureçti
210 211
numår zbor
Ionescu Alexandru Cålin Mircea Andronescu Ana
pasager
Un exemplu de astfel de organizare este baza de date a produselor care se executå într-o
fabricå. Fiecare produs este format din mai multe ansambluri, iar fiecare ansamblu este
format din mai multe piese. Fiecare pieså poate intra în componenÆa mai multor ansam-
Identificarea Ñi clasificarea unor tipuri de structuri de date 15
bluri, iar fiecare ansamblu poate intra în componenÆa mai multor produse. În acest
exemplu se poate observa cå organizarea de tip reÆea este mai flexibilå çi în multe cazuri
mai eficientå decât cea ierarhicå.
Baze de date relaÆionale (relational database). Cel mai flexibil model de organizare îl
reprezintå bazele de date relaÆionale, în care nu existå o cale de acces ierarhizatå la o
anumitå datå. Baza de date este formatå din mai multe tabele, fiecare dintre ele fiind
format din linii çi coloane. Un tabel este numit o relaÆie.
elevi absenÆe
identif. elev nume prenume ... adresa identif. datå identif. identif.
elev absenÆå disciplinå profesor
discipline profesori
identif. nume ........... identif. nume .............
disciplinå profesor
Så construim o bazå de date a çcolii. Så consideråm tabelul elevi care conÆine date despre
elevii çcolii: identificatorul elevului, numele, prenumele, data naçterii, numårul de telefon çi
adresa. Un alt tabel, absenÆe, conÆine date despre absenÆele elevilor din toatå çcoala:
identificatorul elevului, data absenÆei, identificatorul disciplinei çi identificatorul profesorului.
Aceste douå tabele sunt legate printr-un câmp comun numit câmp cheie. În acest caz,
câmpul cheie este identificatorul elevului. Aceasta înseamnå cå între tabelul elevi çi tabelul
absenÆe s-a stabilit o relaÆie prin intermediul unui câmp cheie care conÆine o informaÆie
comunå ambelor tabele çi anume identificatorul elevului. În tabelul profesori se påstreazå
date despre profesorii din çcoalå: nume, prenume, discipline la care predau, grad didactic,
adreså, numår telefon etc. Tabelul profesori se leagå de tabelul absenÆe prin câmpul cheie
identificatorul profesorului. În tabelul discipline se påstreazå date despre disciplinele predate
în çcoalå: nume, profilul clasei çi anul de studiu, numårul de ore etc. Tabelul discipline se
leagå de tabelul absenÆe prin câmpul cheie identificatorul disciplinei. Aceste patru tabele
formeazå împreunå o bazå de date relaÆionalå (relational database). Baza de date a çcolii
mai poate fi completatå çi cu alte tabele ca de exemplu, tabelul cu date despre pårinÆii elevilor
(pårinÆi) care se va lega de tabelul elevi prin câmpul cheie identificatorul elevului, tabelul cu
date despre notele elevilor (note) care se va lega de tabelul elevi prin câmpul cheie
identificatorul elevului, de tabelul profesori prin câmpul cheie identificatorul profesorului çi de
tabelul discipline prin câmpul cheie identificatorul disciplinei, tabelul cu date despre clase
(clase) care conÆine date despre clasele din çcoalå (identificator claså, an de studiu,
identificatorul profesorului diriginte) care se va lega de tabelul elevi prin câmpul cheie
identificatorul clasei, iar de tabelul profesori prin câmpul cheie identificatorul profesorului etc.
16 Informatică
Fiecare rând din tabel în care se gåsesc informaÆii despre un elev corespunde unei
înregistråri de date. Fiecare coloanå cu informaÆii corespunde unui câmp (de exemplu,
coloana adreså). Capul de tabel (antetul tabelului) defineçte structura tabelului çi se mai
numeçte çi înregistrare de structurå. Datele sunt înregistrate în baza de date prin
intermediul structurii definite în înregistrarea de structurå. La crearea unui tabel trebuie
definitå mai întâi structura tabelului (capul de tabel), adicå trebuie precizate câmpurile
care o compun, cât çi caracteristicile acestora.
Tabelul permite gruparea unor date înrudite çi poate fi privit ca o colecÆie de câmpuri.
Pentru fiecare câmp sunt descrise datele care vor fi memorate în el. Descrierea se face
prin tipul datelor, dimensiunea lor çi alte proprietåÆi. Ele definesc implicit domeniul de
definiÆie al datelor memorate în câmp. Dacå domeniul datelor este inclus în domeniul
implicit de definiÆie, se pot defini condiÆii de validare a datelor care så controleze
corectitudinea datelor introduse sau modificate. De exemplu, datele dintr-un câmp sunt
numere întregi cuprinse între 1.000 çi 30.000. Se va alege tipul întreg, ca domeniu implicit
al datelor, dar se vor preciza condiÆii de validare suplimentare care så oblige utilizatorul
så introducå în acest câmp numai date întregi pozitive din domeniul 1.000 ÷ 30.000.
Antetul tabelului (capul de tabel) poate fi privit ca o descriere a structurii tabelului:
ansamblul de câmpuri çi descrierea lor. În teoria bazelor de date relaÆionale tabelele se
mai numesc çi relaÆii, fiecare coloanå din tabel care corespunde unui câmp se mai
numeçte çi atributul relaÆiei, iar fiecare rând din tabel care conÆine câte o valoare pentru
fiecare câmp se mai numeçte çi tuplu. Tuplul corespunde înregistrårii din fiçierul de
date. Într-un tabel al unei baze de date relaÆionale nu pot exista înregistråri identice.
Tabelele bazei de date sunt organizate apoi într-o structurå arborescentå determinatå de
relaÆia dintre tabele.
Schema generalå a unei baze de date relaÆionale este formatå din ansamblul
tabelelor çi al legåturilor dintre ele.
Putem stabili urmåtoarea analogie între un fiçier de date çi o bazå de date:
Coloane = Câmpuri
Tabelele
Baza de date relaÆionalå
Integritatea referenÆialå
Este specificå relaÆiilor dintre tabelele bazei de date. Ea înseamnå o colecÆie de reguli çi
restricÆii impuse tabelelor între care s-au stabilit relaÆii. Astfel, a asigura integritatea
referenÆialå înseamnå ca atunci când se fac modificåri ale valorii unui câmp dintr-un
tabel så nu fie afectatå relaÆia dintre tabele. Aceastå problemå apare în cazul
câmpurilor care fac parte dintr-o cheie primarå sau secundarå. Ele trebuie så respecte
condiÆia de integritate referenÆialå.
9 Tabelul Produse în care sunt påstrate date despre produsele realizate: codul
produsului, denumirea produsului, unitatea de måsurå, cantitatea, data la care a fost
realizat produsul, preÆul de fabricaÆie etc.
9 Tabelul Catalog_produse în care sunt påstrate date despre produsele oferite de
companie: codul produsului, denumirea produsului, descrierea produsului, unitatea de
måsurå, preÆul etc.
În aceste tabele apar mai multe câmpuri de tip: cod produs, cod angajat, cod client sau
cod furnizor. Ele se folosesc pentru a identifica unic înregistrårile din tabele.
Pentru aceste tabele pot fi definite diferite chei de identificare. De exemplu, pentru
tabelul AngajaÆi se poate folosi pentru cheie câmpul cod_angajat sau
cod_numeric_personal deoarece ele identificå unic un angajat din tabel. Câmpurile
nume_prenume, funcÆie sau departament nu pot fi folosite pentru cheia de identificare
pentru cå ele nu pot identifica unic înregistrårile din tabel (angajaÆii) deoarece pot exista
mai mulÆi angajaÆi care au acelaçi nume çi prenume sau care au aceeaçi funcÆie ori
lucreazå în acelaçi departament. Câmpurile cod_angajat çi cod_numeric_personal nu
pot forma împreunå o cheie de identificare deoarece cheia presupune numårul minim de
câmpuri necesar identificårii, iar în acest exemplu, fiecare câmp în parte este suficient
pentru identificarea angajatului.
Pentru tabelul Stocuri sunt necesare douå câmpuri pentru a obÆine cheia de identificare
a unei înregistråri: cod_material çi cod_depozit, deoarece fiecare dintre aceste câmpuri
luate separat nu pot identifica unic o înregistrare din tabel: existå mai multe câmpuri
cod_material cu aceeaçi valoare, câte unul pentru fiecare depozit în care se gåseçte în
stoc acel material çi mai multe câmpuri cod_depozit cu aceeaçi valoare, câte unul pentru
fiecare material care existå în acel depozit.
Dacå în tabelul ClienÆi câmpul cod_client este cheie primarå deoarece el identificå unic
un client, în tabelul Comenzi el va fi cheie secundarå çi va permite stabilirea unei relaÆii
între tabelul ClienÆi çi tabelul Comenzi. Pentru a fi îndeplinitå condiÆia de integritate refe-
renÆialå, nu trebuie så existe nici o comandå în tabelul Comenzi care så nu corespundå
unui client din tabelul ClienÆi.
Furnizori
Între tabelele bazei de date ale companiei se vor stabili mai multe legåturi. De exemplu,
între tabelul Catalog_produse çi tabelul Produse sau între tabelul Catalog_produse çi
tabelul Vânzåri prin intermediul cheii cod_produs.
Baza de date poate conÆine:
9 Tabele corelate. Sunt tabele între care se stabilesc legåturi. De exemplu, între
tabelele ClienÆi çi Comenzi existå o legåturå realizatå prin intermediul codului clientului
care a emis comanda (cheia cod_client).
9 Tabele necorelate. Sunt tabele între care nu se stabilesc legåturi. De exemplu, între
tabelele Stocuri çi Salarii nu existå nici un fel de legåturå. În acest caz tabelele se
folosesc pentru a separa date diferite între ele.
RelaÆia
Este o legåturå dintre un câmp sau o combinaÆie de câmpuri dintr-un tabel (cheia
primarå) çi câmpurile corespunzåtoare dintr-un alt tabel (cheia secundarå). Existå mai
multe tipuri de relaÆii:
1. Una-la-una (one-to-one). Înseamnå cå o înregistrare din primul tabel este legatå la o
singurå înregistrare din al doilea tabel. Este posibil çi cazul în care o înregistrare din
primul tabel nu este legatå cu nici o înregistrare din al doilea tabel.
Aceastå relaÆie este similarå cu un tabel care conÆine ambele tabele. Se folosesc înså
douå tabele din urmåtoarele motive:
9 Un tabel unic ar fi un tabel foarte Tabelul A Tabelul B
mare, cu o structurå care poate
depåçi numårul maxim de câmpuri a1 b1
acceptat de sistemul de gestiune a
bazelor de date (de exemplu, 255 a2 b2
de câmpuri în Visual FoxPro). a3 b3
9 Numårul de câmpuri din înregis-
a4 b4
trårile tabelului nu sunt fixe (unele
înregistråri au nevoie de mai multe a5
câmpuri decât alte înregistråri).
9 Dacå se lucreazå într-o reÆea de calculatoare, se preferå ca anumite câmpuri din tabel
så se påstreze pe calculatorul local çi nu pe serverul de fiçiere.
9 Un grup de date dintr-un tabel sunt legate de un tabel, iar un alt grup de date din tabel
sunt legate de un alt tabel sau nu sunt legate de nici un tabel.
24 Informatică
9 Asupra unui grup de date din tabel se executå un anumit gen de operaÆii, iar asupra
altui grup de date din tabel se executå alt gen de operaÆii.
De exemplu, relaÆia stabilitå între tabelele Salarii çi AngajaÆi este de una-la-una deoarece
unui angajat îi corespunde un singur salariu, iar un salariu corespunde unui singur angajat.
Legåtura între cele douå tabele se face prin intermediul câmpului cod_angajat. Chiar dacå
cele douå tabele ar putea fi reunite într-unul singur, nu se recomandå acest lucru deoarece
asupra acestor date nu se executå acelaçi gen de operaÆii în cadrul organizaÆiei. Datele din
tabelul AgajaÆi sunt folosite de departamentul Personal atunci când trebuie luate decizii refe-
ritoare la angajaÆii companiei. Acest tabel conÆine datele generale ale fiecårui angajat care
sunt necesare atunci când trebuie promovat, penalizat, disponibilizat sau când trebuie loca-
lizat (adreså, telefon) pentru a i se transmite o anumitå informaÆie. Datele din tabelul Salarii
sunt folosite de departamentul Salarizare atunci când trebuie calculate drepturile salariale ale
fiecårui angajat sau datoriile companiei cåtre bugetul statului çi cåtre asiguråri, legate de
angajaÆii såi. Acest tabel conÆine informaÆii necesare pentru calculul lunar al salariului fiecårui
angajat.
2. Una-la-mai-multe (one-to-many). Tabelul A Tabelul B
Înseamnå cå o înregistrare din pri-
mul tabel poate fi legatå cu mai a1 b1
multe înregistråri din al doilea tabel.
b2
Este cel mai råspândit tip de relaÆie.
Primul tabel trebuie så aibå un câmp b3
cheie primarå, iar al doilea tabel a2 b4
trebuie så conÆinå un câmp similar, prin
care så se poatå identifica înregistrarea
din primul tabel de care este legatå înregistrarea din al doilea tabel. Un exemplu de
relaÆie una la mai multe este cea stabilitå între tabelul ClienÆi çi tabelul Comenzi. Unui
client îi corespund mai multe comenzi, dar o comandå poate fi emiså de cåtre un singur
client. Câmpul cheie folosit pentru legåturå este cod_client.
3. Mai-multe-la-mai-multe (many-to-many). Înseamnå cå o înregistrare din primul tabel
poate fi legatå de mai multe înregistråri din al doilea tabel, çi invers, o înregistrare din
cel de-al doilea tabel poate fi legatå de una sau mai multe înregistråri din primul tabel.
De exemplu, între tabelul Vânzåtori çi
tabelul Produse poate fi stabilitå o rela- Tabelul A Tabelul B
Æie de mai-multe-la-mai-multe: un an-
gajat comercial poate vinde mai multe
a1 b1
produse, iar un produs este vândut de
mai mulÆi angajaÆi comerciali. RelaÆia a2 b2
mai-multe-la-mai-multe poate fi des-
a3 b3
compuså în douå relaÆii una-la-mai-
multe. În acest caz se construieçte un a4 b4
tabel suplimentar care så realizeze
aceastå descompunere. De exemplu, în
baza de date Çcoala pot fi definite un tabel Elevi cu elevii din çcoalå çi un alt tabel Discipline
cu disciplinele predate în çcoalå. Fiecårei înregistråri din tabelul Elevi îi corespund mai multe
înregistråri în tabelul Discipline (un elev studiazå mai multe discipline) çi fiecårei înregistråri
Identificarea Ñi clasificarea unor tipuri de structuri de date 25
din tabelul Discipline îi corespund mai multe înregistråri în tabelul Elevi (o disciplinå este
studiatå de mai mulÆi elevi). Aceastå relaÆie se poate descompune în douå relaÆii una-la-mai-
multe prin crearea unui tabel suplimentar Încadråri care så conÆinå înregistråri cu douå câm-
puri: cod_elev çi cod_disciplinå. RelaÆiile vor fi de una-la-mai-multe între tabelul Elevi çi
tabelul Încadråri (unui elev îi corespund mai multe încadråri, câte una pentru fiecare disciplinå
pe care o studiazå) çi între tabelul Discipline çi tabelul Încadråri (unei discipline îi corespund
mai multe încadråri, câte una pentru fiecare elev care o studiazå).
împiedicå vizualizarea datelor din tabele cu ajutorul altor aplicaÆii care pot så citeascå
texte (procesoare de texte, editoare de texte etc.). Singura metodå prin care se poate
împiedica vizualizarea datelor este cea de criptare a datelor.
Interogarea (query) sau cererea de înregistråri este un proces prin care se extrag din
baza de date çi sunt prezentate în vederea utilizårii acele înregistråri care satisfac
anumite criterii.
Interogare
Sistemul de
Terminal gestiune a
bazelor de date
9 Stabilirea volumului mediu de co-
menzi într-o perioadå de timp pen-
tru un anumit produs.
9 Stabilirea produsului care a fost
Identificarea DicÆionarul
cel mai bine vândut într-o anumitå
cererii de date de date
perioadå de timp.
9 Afiçarea pentru fiecare produs a
cantitåÆii maxime vândute într-o
anumitå perioadå de timp.
9 Afiçarea listei de materiale care
au stocul 0. Determinarea Limbajul de
9 Afiçarea listei de materiale care locaÆiilor în baza manipulare
sunt sub stocul de siguranÆå de date a datelor
admis pentru a asigura fluxul
producÆiei.
Råspuns
Terminal Baza de date
9 Afiçarea listei cu clienÆii care au comandat produse care nu existå în acest moment în
stoc (numele clientului, numele persoanei de contact çi numårul de telefon).
9 Afiçarea unei liste cu clienÆii care nu au avut comenzi într-o perioadå de timp precizatå.
9 Afiçarea unitåÆilor vândute pentru fiecare produs într-o perioadå de timp.
9 Afiçarea informaÆiilor despre un client identificat dupå numårul såu de cod sau dupå nume.
SQL (Structured Query Language - limbaj structurat de interogare) este cel mai råspân-
dit limbaj de interogare a bazelor de date relaÆionale. Este un limbaj standardizat care a
fost creat special pentru a putea fi folosit la interogarea, actualizarea çi gestionarea baze-
lor de date. InstrucÆiunile SQL descriu operaÆiile relaÆionale între tabele, ca de exemplu
Select, Project çi Join. Limbajul SQL nu opereazå cu datele propriu-zise (variabile de
memorie çi câmpuri) ci cu relaÆiile dintre tabele. Limbajul SQL poate fi folosit împreunå cu
un limbaj gazdå sau în unele cazuri este inclus în limbajul gazdå (cum este de exemplu
limbajul gazdå al sistemului de gestiune a bazelor de date FoxPro). Limbajul SQL este
deosebit de un limbaj procedural (aça cum sunt limbajele Pascal, C, Basic etc.). Limbajul
procedural duce la construirea unor programe prin care i se aratå calculatorului ce
trebuie så facå în conformitate cu algoritmul de rezolvare a problemei, descris prin in-
strucÆiuni (prin care i se spune calculatorului pas cu pas ce trebuie så execute). Pe baza
acestor programe, calculatorul executå instrucÆiune dupå instrucÆiune respectând cele trei
tipuri de structuri de control: secvenÆialå, alternativå çi repetitivå. Limbajul SQL este un
limbaj de rezultate: el îi spune calculatorului ce doreçte utilizatorul så obÆinå çi nu ce
acÆiuni trebuie så efectueze ca så obÆinå acele rezultate. Elementul fundamental al
Identificarea Ñi clasificarea unor tipuri de structuri de date 29
oricårei interogåri SQL este cuvântul cheie Select cu care începe fiecare instrucÆiune
SQL folositå pentru interogarea bazei de date.
De exemplu, sistemul de gestiune a bazelor de date relaÆionale FoxPro are implementat
un limbaj propriu specializat, dar înÆelege çi limbajul SQL.
În cadrul acestui proces sunt identificate datele care trebuie separate în tabele mai mici çi
modul în care va fi asiguratå legåtura între ele. Prin aceastå operaÆie se simplificå o
înregistrare de mari dimensiuni în mai multe tabele legate între ele. Nu trebuie alocate
câmpuri pentru datele derivate sau calculate (cum este de exemplu vârsta unei
persoane, dacå existå deja un câmp în care este înregistratå data naçterii).
Pe de altå parte, dacå o bazå de date relaÆionalå conÆine foarte multe tabele, exploatarea
sa va necesita un timp mai mare de prelucrare, deoarece o interogare a bazei de date va
avea ca efect parcurgerea mai multor tabele. De aceea, procesul de divizare a tabelului
iniÆial în mai multe tabele trebuie så se opreascå la un moment dat.
AÆi våzut cå elementul principal care defineçte o bazå de date este schema tabelelor,
adicå tabelele care fac parte din baza de date: numele tabelului çi structura de câmpuri a
tabelului. Problema proiectårii unei baze de date constå de fapt în modul în care grupåm
datele sub formå de câmpuri în tabele pentru a reuçi så modelåm cât mai eficient colecÆia
de date pentru a putea råspunde întrebårilor formulate în cadrul organizaÆiei. De aceea, în
procesul de proiectare a bazelor de date trebuie avutå în vedere dependenÆa datelor,
adicå legåturile care existå între câmpurile unui tabel sau între câmpurile unor tabele
diferite. DependenÆele cele mai influente sunt dependenÆa funcÆionalå çi dependenÆa
multivaloricå.
DependenÆa funcÆionalå se referå la faptul cå un câmp al unui tabel depinde de un alt
câmp al unui tabel, adicå se spune cå un câmp x depinde funcÆional de un câmp y dacå
çi numai dacå pentru o valoare a câmpului x corespunde o singurå valoare a câmpului y.
De exemplu, în tabela ClienÆi câmpul cod_client este dependent funcÆional de câmpul
adreså_client deoarece fiecårui client al companiei îi corespunde o singurå adreså. O
astfel de constrângere aplicatå bazei de date face înså imposibilå înregistrarea în baza
30 Informatică
de date a unui client care are douå adrese. Prin eliminarea dependenÆelor funcÆionale se
micçoreazå redundanÆa datelor çi anomaliile care pot så aparå atunci când se adaugå çi
se çterg înregistråri sau atunci când se modificå valoarea câmpurilor. Principala cale prin
care se pot elimina dependeÆele funcÆionale din cadrul tabelelor este descompunerea lor
în tabele din ce în ce mai simple.
DependenÆa multivaloricå se referå la faptul cå valoarea unui câmp x poate forma câte
o înregistrare cu toate combinaÆiile posibile ale valorilor câmpurilor y çi z - cu toate
perechile de valori (y,z) din produsul cartezian al mulÆimilor Y çi Z, mulÆimi care specificå
domeniul de definiÆie al câmpurilor y çi z pentru valoarea câmpului x. De exemplu, pentru
obÆinerea unui atestat, o mulÆime Y de elevi trebuie så fie îndrumatå de o mulÆime Z de
profesori, fiind posibilå pentru acelaçi tip de atestat orice combinaÆie de elev-profesor din
cele douå mulÆimi. Tabelul format din cele trei câmpuri: tip_atestat, nume_elev,
nume_profesor conÆine dependenÆe multivalorice. Pentru a elimina anomaliile de
exploatare a unei baze de date, într-un tabel trebuie så existe o singurå dependenÆå
multivaloare, adicå trebuie descompus tabelul astfel încât så fie respectatå aceastå
condiÆie. În acest caz se obÆin trei tabele: Atestat_elevi (conÆine câmpurile tip_atestat,
nume_elev, adicå atribuiri prin care se poate afla ce atestat va susÆine fiecare elev),
Atestat_profesori (conÆine câmpurile tip_atestat, nume_profesor, adicå atribuiri prin care
se poate afla ce atestat poate îndruma fiecare profesor) çi Atestat (conÆine câmpurile
nume_elev, nume_profesor, adicå atribuiri prin care se poate afla ce profesor îndrumå
fiecare elev pentru atestat).
Toate aceste dependenÆe care existå în cadrul unui tabel pot genera diferite anomalii în
timpul executårii operaÆiilor de actualizare a bazei de date, anomalii care sunt generate în
special din cauza redundanÆei datelor. Pentru a evita aceste anomalii trebuie înlocuit
tabelul care le genereazå cu alte tabele în care dependenÆele sunt supuse unor restricÆii.
Formele echivalente astfel obÆinute se numesc forme normale.
Existå cinci niveluri de normalizare: primele trei acÆioneazå asupra dependenÆelor
funcÆionale çi ultimele douå asupra dependenÆelor multivalorice. De obicei baza de date
se gândeçte iniÆial sub forma unui singur tabel, dupå care tabelul respectiv se
normalizeazå trecându-l prin cele cinci forme normale.
Deoarece în proiectarea unei baze de date primele trei forme sunt cele mai des întâlnite,
în continuare vor fi prezentate numai acestea, pentru a înÆelege ce înseamnå procesul de
normalizare a bazei de date.
Prima formå normalå
Aducerea unei baze de date la prima formå normalå înseamnå eliminarea câmpurilor
compuse çi a câmpurilor repetitive.
De exemplu, så consideråm cå tabelul AngajaÆi_tot conÆine, pe lângå informaÆiile generale
despre un angajat, çi informaÆiile necesare pentru a urmåri istoricul evoluÆiei unui angajat în
posturile companiei. Înseamnå cå pentru fiecare angajat trebuie så existe urmåtoarele date:
cod_angajat, nume_prenume, cod_numeric, adreså, telefon, studii, data_naçterii,
data_angajårii, funcÆie1, departament1, data_iniÆalå1, data_finalå1, motiv_schimbare1, func-
Æie2, departament2, data_iniÆalå2, data_finalå2, motiv_schimbare2, funcÆie3, departament3,
data_iniÆalå3, data_finalå3, motiv_schimbare3 etc. Toate aceste date pot furniza informaÆii
particulare despre angajat (data naçterii, codul numeric personal, adresa, telefonul) çi modul
Identificarea Ñi clasificarea unor tipuri de structuri de date 31
în care a evoluat profesional în cadrul companiei (funcÆia, departamentul, data la care a fost
angajat în funcÆie, data la care a fost schimbat din funcÆie çi motivul: promovare, retrogradare
din cauza absenÆelor nemotivate, retrogradare din cauza incompetenÆei etc.). Se observå cå
pentru acelaçi angajat existå mai multe ansambluri de câmpuri (funcÆie, departament,
data_iniÆalå, data_finalå, motiv_schimbare), în cazul în care a ocupat mai multe posturi în
cadrul companiei, câte un ansamblu pentru fiecare post ocupat. Vom numi post acest ansam-
blu de câmpuri. Numårul de repetåri ale ansamblului post pentru un angajat nu poate fi preci-
zat. Unii angajaÆi au ocupat aceeaçi funcÆie de la angajare, alÆii çi-au schimbat funcÆia de cinci
ori. Deci existå mai multe câmpuri compuse post cu aceeaçi semnificaÆie pentru informaÆia pe
care o reprezintå (funcÆie, perioada ocupårii funcÆiei çi motivul schimbårii funcÆiei).
Fiecare înregistrare conÆine informaÆii generale despre salariat çi informaÆii despre un post
ocupat. Pentru un salariat pot exista mai multe înregistråri, câte una pentru fiecare post
ocupat.
acelaçi angajat, câte una pentru fiecare schimbare de funcÆie. Câmpul schimbare_funcÆie va
înregistra cronologic a câta schimbare de funcÆie reprezintå înregistrarea.
Se observå cå în tabelul AngajaÆi, pentru funcÆie çi pentru departament existå un singur
câmp care nu poate identifica unic aceste date deoarece sunt dependente de çirul de
caractere introdus de la tastaturå (persoane diferite pot scrie diferit acelaçi nume de
funcÆie sau acelaçi nume de departament). Din aceastå cauzå se atribuie fiecårei funcÆii
un cod numeric unic cod_funcÆie çi fiecårui departament un cod numeric unic
cod_departament. În acest mod câmpurile funcÆie çi departament vor deveni câmpuri
compuse fiecare din câte douå câmpuri elementare. Câmpul compus funcÆie poate fi
descompus în câmpurile elementare cod_funcÆie çi denumire_funcÆie, iar câmpul compus
departament poate fi descompus în câmpurile elementare cod_departament çi
denumire_departament. În acest mod vor apårea douå noi tabele: tabelul FuncÆii care
conÆine câmpurile cod_funcÆie, denumire_funcÆie çi tabelul Departamente care conÆine
câmpurile cod_departament, denumire_departament.
În acest caz tabelul AngajaÆii va fi format din: cod_angajat, nume_prenume,
cod_numeric, adreså, telefon, studii, data_naçterii, data_angajårii, schimbare_funcÆie,
cod_funcÆie, cod_departament, data_iniÆalå, data_finalå, motiv_schimbare. Între tabelul
Angajat çi tabelul FuncÆii va exista o legåturå prin intermediul câmpului cod_funcÆie care
este cheie primarå în tabelul FuncÆii çi cheie secundarå în tabelul Angajat. Între tabelul
AngajaÆi çi tabelul Departamente va exista o legåturå prin intermediul câmpului
cod_departament care este cheie primarå în tabelul Departamente çi cheie secundarå în
tabelul AngajaÆi.
(cheia primarå a tabelului) se va diviza acest tabel în douå tabele: Angajat care conÆine
câmpurile cod_angajat, nume_prenume, cod_numeric, adreså, telefon, studii,
data_naçterii, data_angajårii çi FuncÆii_angajat care conÆine câmpurile cod_angajat,
cod_funcÆie, cod_departament, data_iniÆalå, data_finalå, motiv_schimbare. În tabelul
FuncÆii_angajat cheia primarå (cea care identificå unic o înregistrare) este formatå din
câmpurile cod_angajat, cod_funcÆie çi cod_departament. Acest tabel este legat de mai
multe tabele: Angajat (legåtura între cele douå tabele va fi fåcutå prin câmpul
cod_angajat), FuncÆii (prin cheia cod_funcÆie care este cheie primarå în tabelul FuncÆii çi
cheie secundarå în tabelul Angajat) çi Departamente (prin cheia cod_departament care
este cheie primarå în tabelul Departamente çi cheie secundarå în tabelul Angajat).
În acest caz, documentul ce leagå toate aceste informaÆii este factura care påstreazå
urma tranzacÆiei comerciale. În ea se gåsesc date generale despre tranzacÆie
(numårul_facturii, data_facturii), dar çi date despre angajatul care a negociat tranzacÆia
(denumire_vânzåtor, cod vânzåtor), date despre client (persoana care a cumpårat
produsele, identificatå prin cod_client, denumire_client, cod_fiscal, adreså etc.) çi date
despre fiecare produs vândut (numår_produs_facturå, cod_produs, denumire_produs,
unitate, preÆ_unitar, cantitate, valoare_cantitate1). Se observå cå în cadrul unei facturi,
produsul vândut depinde de clientul care l-a cumpårat (care plåteçte toatå factura), care
la rândul såu depinde de vânzåtorul cu care a negociat achiziÆionarea produselor. Pentru
a elimina aceste dependenÆe funcÆionale tranzitive: produs→ client→ vânzåtor din datele
furnizate de o facturå, vor fi construite mai multe tabele: tabelul Facturå care conÆine date
generale despre facturå (numår_facturå, datå, serie), tabelul Vânzåtor care conÆine date
despre tranzacÆiile efectuate de angajaÆii comerciali ai companiei çi care sunt necesare
pentru salarizarea lor (numår_facturå, cod_angajat_vânzåtor), tabelul Cumpåråtor care
conÆine date pentru identificarea clientului implicat în tranzacÆie (numår_facturå,
cod_client), presupunând cå existå deja tabelul ClienÆi care furnizeazå informaÆii
complete depre fiecare client obiçnuit al companiei (nume, cod fiscal, adreså etc.), tabelul
Produs_vândut care identificå produsul vândut prin facturå çi care conÆine date pentru
identificarea fiecårui produs vândut (numår_facturå, cod_produs, cantitate), presupunând
cå existå deja tabelul Catalog_produse care furnizeazå informaÆii complete despre
fiecare produs vândut de companie (denumire, cod, unitate de måsurå, preÆ unitar etc.).
Facturå
(document)
ConsideraÆi cå çcoala voastrå este o organizaÆie care trebuie informatizatå, iar colecÆia de
date pe care o veÆi folosi va fi de tipul unei baze de date relaÆionale. Analiza voastrå
trebuie så porneascå de la entitatea Elev. VeÆi identifica toate datele caracteristice unui
elev, atât din punct de vedere al datelor personale (numår matricol, nume çi prenume,
iniÆiala tatålui, datele despre pårinÆi, adresa, numårul de telefon), cât çi din punct de
vedere al situaÆiei çcolare (anul de studiu, clasa, profilul clasei, profesorul diriginte,
profesorul pe care îl are la fiecare disciplinå, disciplinele pe care le studiazå în acest an
çcolar, notele çi absenÆele la fiecare disciplinå, pe fiecare semestru, media la fiecare
1
Pentru a simplifica analiza, s-au eliminat din structura unei facturi toate datele referitoare la TVA.
Identificarea Ñi clasificarea unor tipuri de structuri de date 35
În urmåtorul exemplu, pentru proiectarea unei baze de date s-a pornit de la lista cu co-
menzile clienÆilor. Trecând prin mai multe forme normale s-au obÆinut tabelele: Comenzi,
ClienÆi, Produse_comandate. IdentificaÆi formele normale prin care a trecut tabelul iniÆial.
Etapa 1. Se construieçte tabelul Total_comenzi care conÆine urmåtoarele câmpuri:
numår_comandå, datå_comandå, nume_client, adreså_client çi 6 câmpuri compuse
produs_comandat. Câmpul compus este format din câmpurile denumire_produs,
unitate_måsurå, cantitate, preÆ_unitar, valoare. Fiecare înregistrare reprezintå o
comandå. Câmpul numår_comandå poate identifica unic o înregistrare.
Etapa 2. Se construieçte tabelul Comenzi care conÆine urmåtoarele câmpuri:
numår_comandå, datå_comandå, nume_client, adreså_client, denumire_produs,
unitate_måsurå, cantitate, preÆ_unitar, valoare. Pentru fiecare comandå vor fi mai multe
înregistråri, câte una pentru fiecare podus din comandå. Câmpul numår_comandå çi
denumire_produs identificå unic o înregistrare.
Etapa 3. Pentru a uçura identificarea unui produs se atribuie acestuia un cod_produs. Se
construieçte tabelul Catalog_produse care conÆine urmåtoarele câmpuri: cod_produs,
denumire_produs, unitate_måsurå, preÆ_unitar. Fiecare produs din catalog va fi identificat
unic prin câmpul cod_produs. În tabelul Comenzi vor råmâne câmpurile:
numår_comandå, datå_comandå, nume_client, adreså_client, cod_produs, cantitate,
valoare. Înregistrårile vor fi identificate unic prin cheia formatå din douå câmpuri
numår_comandå çi cod_produs.
Etapa 4. Din tabelul Comenzi se construiesc douå tabele: tabelul Comanda çi tabelul
Produse. Tabelul Comanda conÆine câmpurile: numår_comandå, datå_comandå,
nume_client, adreså_client, valoare. Pentru fiecare comandå va fi o singurå înregistrare
identificatå unic prin câmpul numår_comandå. Tabelul Produse conÆine câmpurile:
numår_comandå, cod_produs, nume_client, adreså_client, cantitate, valoare. Pentru
fiecare comandå vor exista mai multe înregistråri. Înregistrårile vor fi identificate unic prin
cheia formatå din douå câmpuri: numår_comandå çi cod_produs.
Etapa 5. Din tabelul Comanda se construiesc douå tabele: tabelul Comenzi çi tabelul
ClienÆi. Tabelul Comenzi conÆine câmpurile: numår_comandå, datå_comandå, cod_client,
valoare. Pentru fiecare comandå va fi o singurå înregistrare identificatå unic prin câmpul
numår_comandå. Tabelul ClienÆi conÆine câmpurile: cod_client, nume_client,
adreså_client. Pentru fiecare client va fi o singurå înregistrare. Înregistrårile vor fi
identificate unic prin câmpul: cod_client.
36 Informatică
2
Operatorul relaÆional Select nu trebuie confundat cu comanda SQL Select.
Identificarea Ñi clasificarea unor tipuri de structuri de date 37
De exemplu, putem considera ca tabel surså tabelul AngajaÆi. Prin operaÆia select se pot
crea noi tabele:
9 Tabelul Nou1. ConÆine o singurå înregistrare corespunzåtoare unui angajat care are
un anumit cod numeric personal:
Select from AngajaÆi where Cod_num=1020260403456
9 Tabelul Nou2. ConÆine mai multe înregistråri care corespund angajaÆilor din departa-
mentul Salarizare:
Select from AngajaÆi where Departament='Salarizare'
9 Tabelul Nou3. ConÆine mai multe înregistråri care corespund angajaÆilor care au
funcÆia de casier:
Select from AngajaÆi where FuncÆia='Casier'
2. ProiecÆia (Project). Operatorul se aplicå pe un tabel surså din care creeazå un tabel
nou ce va conÆine numai câmpurile specificate din tabloul surså.
AngajaÆi
Cod-a Nume_prenume Cod_num Departament FuncÆia
1111 Ionescu Maria 2030361403457 Marketing Casier
1112 Popescu Ion 1020260403456 Marketing Vânzator
1113 Andronescu Ana 2040469402458 Salarizare Casier
1114 Ene Magda 2050570403453 Salarizare Contabil
Nou4
Project Nume_prenume, Cod_num from AngajaÆi
Nume_prenume Cod_num
Ionescu Maria 2030361403457
Popescu Ion 1020260403456
Andronescu Ana 2040469402458
Ene Magda 2050570403453
Nou5
Project Nume_prenume, Departament from AngajaÆi
Nume_prenume Departament
Ionescu Maria Marketing
Popescu Ion Marketing
Andronescu Ana Salarizare
Ene Magda Salarizare
De exemplu, putem considera ca tabel surså tabelul AngajaÆi. Prin operaÆia project se
pot crea noi tabele:
9 Tabelul Nou4. ConÆine douå câmpuri: Nume_prenume çi Cod_num:
Project Nume_prenume, Cod_num from AngajaÆi
9 Tabelul Nou5. ConÆine douå câmpuri: Nume_prenume çi Departament:
Project Nume_prenume, Departament from AngajaÆi
3. Compunerea (Join). Operatorul se aplicå pe douå tabele surså din care creeazå un
tabel nou astfel: din produsul cartezian al celor douå tabele se påstreazå numai înre-
gistrårile care îndeplinesc o anumitå condiÆie.
38 Informatică
Tabel A Tabel B
Câmpuri → C1 C2 C3 Câmpuri → C4 C5
RA1 1 a x RB1 1 m
RA2 2 b y RB2 2 n
↑ Rândurile tabelului A RB3 3 p
↑ Rândurile tabelului B
Operatorii din algebra relaÆionalå pot fi folosiÆi pentru a formula diferite interogåri. De
exemplu, în baza de date a organizaÆiei:
9 Lista cu numele angajaÆilor din toate departamentele care au funcÆia 'casier'. În tabelul
AngajaÆi se executå o operaÆie de selecÆie:
Select from AngajaÆi where FuncÆie='casier'
Identificarea Ñi clasificarea unor tipuri de structuri de date 39
çi se obÆine tabelul Casieri care conÆine toÆi angajaÆii care au funcÆia de casier. Apoi pe
tabelul astfel obÆinut se aplicå operaÆia de proiecÆie:
Project Nume_prenume, Departament from Casieri
çi se obÆine în tabelul Casieri_departamente informaÆia doritå (lista cu numele persoa-
nelor çi departamentul în care lucreazå).
9 Lista cu numele furnizorului, numele çi numårul de telefon al persoanei de contact
pentru materialele care sunt sub stocul de siguranÆå, pentru a se putea comanda
aceste materiale. În tabelul Stocuri se executå o operaÆie de selecÆie:
Select from Stocuri where stoc<=stoc_sig
çi se obÆine tabelul SiguranÆå care conÆine toate materialele care sunt sub stocul de
siguranÆå. Apoi pe tabelul astfel obÆinut se aplicå operaÆia de proiecÆie:
Project cod_material, denumire from SiguranÆå
çi se obÆine tabelul Comenzi_materiale. Se compun tabelele Furnizori çi
Comenzi_materiale cu operaÆia
Join Furnizori and Comenzi_materiale where
furnizori.cod_material = comenzi_materiale. cod_material
çi se obÆine tabelul Comanda. Apoi pe tabelul astfel obÆinut se aplicå operaÆia de proiecÆie
Project denumire, den_furnizor, nume_pers, telefon from Comanda
çi se obÆine tabelul Comanda_furnizori care conÆine denumirea furnizorului, numele
persoanei de contact, numårul de telefon çi denumirea materialului pentru materialele
care sunt sub stocul de siguranÆå. Se poate verifica prin telefon dacå furnizorul poate
primi comanda de livrare pentru materialele care sunt sub stocul de siguranÆå.
Tabelul A conÆine informaÆii generale despre angajaÆi: nume angajat, adreså, numår de
telefon. Tabelul B conÆine informaÆii despre ocuparea posturilor de cåtre angajaÆi: nume
angajat, nume funcÆie, departament, data iniÆialå, data finalå. Ce operaÆii relaÆionale
trebuie så executaÆi ca så obÆineÆi informaÆiile:
a) Ce angajaÆi au ocupat postul X?
b) Ce angajaÆi au lucrat în departamentul X?
c) Ce posturi a ocupat angajatul X çi în ce departamente?
d) Ce adrese au angajaÆii care au ocupat postul X din departamentul Y?
40 Informatică
În afara limbajelor care au la bazå algebra relaÆionalå (care folosesc interogåri exprimate
prin operatori relaÆionali specifici aça cum este limbajul SQL), mai existå çi limbaje care
se bazeazå pe calculul relaÆional (care exprimå interogårile prin intermediul condiÆiilor
pe care trebuie så le îndeplineascå mulÆimea înregistrårilor care corespund cererii). Din
aceastå categorie face parte limbajul QBE (Query By Example - Interogare prin
exemple) care este standardul prin care pot fi formulate interactiv interogårile bazei de
date folosind calculul relaÆional. De obicei limbajul QBE pune la dispoziÆia utilizatorului o
interfaÆå prin intermediul cåreia utilizatorul îçi poate asambla interogarea, incluzând
operatori pentru calculul:
9 sumei valorilor unui câmp din tabel - sum,
9 mediei aritmetice a valorilor unui câmp din tabel - avg,
9 celei mai mari valori a unui câmp din tabel - max,
9 celei mai mici valori a unui câmp din tabel - min,
9 numårului de înregistråri dintr-un tabel - cnt.
În sistemul de gestiune a bazelor de date Visual FoxPro interogårile se pot construi prin
intermediul interfeÆei folosind interogarea prin exemple (QBE). În culise, aceste
comenzi sunt transformate în instrucÆiuni SQL.
# ÎncercaÆi:
Ce concluzie trageÆi? ReproiectaÆi cea de-a doua bazå de date astfel încât så poatå
råspunde la aceste întrebåri.
M iniproiect. Baza de date a unei çcoli este formatå din urmåtoarele tabele:
Clase: cod_claså, profil_claså.
Discipline: cod_disciplinå, denumire_disciplinå.
Profesori: cod_profesor, nume_profesor, adreså, telefon.
Elevi: cod_elev, cod_claså, nume_elev, adreså, telefon.
PårinÆi: cod_elev, nume_pårinte, tip_pårinte, telefon.
Note: cod_elev, cod_disciplinå, datå, notå.
AbsenÆe: cod_elev, cod_disciplinå, datå.
Identificarea Ñi clasificarea unor tipuri de structuri de date 43
AråtaÆi corespondenÆele:
Prima grupå (1 ÷ 10) vå prezintå mai mulÆi termeni. A doua grupå (a ÷ j) vå prezintå afirmaÆii sau
definiÆii posibile pentru aceçti termeni. LegaÆi corespunzåtor obiectele din prima grupå cu
obiectele din a doua grupå:
1. baza de date 6. administratorul bazei de date
2. înregistrarea 7. sistemul de gestiune a bazelor de date
3. schema 8. relaÆia una-la-mai-multe
4. redundanÆa datelor 9. independenÆa datelor
5. dicÆionarul de date 10. modelul relaÆional de baze de date
a. ConÆine toate informaÆiile despre entitåÆile memorate în baza de date.
b. Cel mai popular model de baze de date folosit pe microcalculatoare.
c. Instrument software care faciliteazå crearea çi întreÆinerea bazelor de date.
d. O persoanå sau un grup de persoane care coordoneazå çi controleazå toate
activitåÆile legate de baza de date a unei organizaÆii.
e. O colecÆie de fiçiere çi înregistråri legate între ele.
f. Unul dintre cele mai mari avantaje ale folosirii bazelor de date.
g. O colecÆie de câmpuri care sunt legate logic.
h. Descrierea întregii colecÆii de date din baza de date.
i. Una dintre proprietåÆile datelor care creeazå deficienÆe mari colecÆiilor de fiçiere de
date.
j. O înregistrare din primul tabel poate fi legatå de mai multe înregistråri din al doilea
tabel.
Adevårat/Fals:
1. Un avantaj al folosirii fiçierelor de date este partajarea datelor între mai mulÆi utilizatori.
2. Un avantaj al folosirii bazelor de date este asigurarea integritåÆii datelor.
3. DicÆionarul de date descrie structura datelor din baza de date.
44 Informatică
R åspunsuri:
AråtaÆi corespondenÆele: 1-e; 2-g; 3-h; 4-i; 5-a; 6-d; 7-c; 8-j; 9-f; 10-b.
Adevårat/Fals: 1-F; 2-A; 3-A; 4-F; 5-A; 6-A; 7-F; 8-F; 9-F; 10-F.
CompletaÆi: 1- cheie de identificare; 2-înregistråri, fiçiere; 3- schema parÆialå; 4- condus; 5- legåtura;
6-incluså în; 7-simplificare, divizarea; 8-redundanÆa.
AlegeÆi råspunsurile corecte: 1-a,b,d; 2-b,c; 3-b,d; 4-b; 5-a; 6-a,d; 7-c; 8-a; 9-b.
CondiÆiile sunt:
a) E := alfa <> " " and alfa <> "," and fa <> "."
46 Informatică
3
Numele unei variabile de memorie sau al unui câmp.
Identificarea Ñi clasificarea unor tipuri de structuri de date 47
pentru reprezentarea numårului (un caracter pentru semnul minus folosit de numerele
negative, numårul de cifre pentru partea întreagå, numårul de cifre pentru partea zecimalå
çi un caracter pentru punctul folosit ca separator între partea întreagå çi partea zecimalå) çi
numårul de caractere folosite numai pentru partea zecimalå. Deoarece numårul maxim de
octeÆi este 20 (deci numårul maxim de caractere folosite pentru numår este 20), acest
subtip poate fi folosit pentru reprezentarea cu precizie scåzutå a numerelor raÆionale mici.
Subtipul double (dublu) poate fi folosit çi el pentru numerele reale. Reprezentarea
numårului pe suportul de memorare se face în virgulå mobilå, dublå precizie (o metodå
optimå de reprezentare a numerelor reale) çi are o lungime fixå de 8 octeÆi. Acest subtip
poate fi folosit pentru reprezentarea cu precizie måritå (pânå la 15 cifre zecimale) a
4
numerelor reale foarte mari (pânå la ordinul 10308) . Deoarece lungimea sa este fixå,
pentru o bunå gestionare a spaÆiului de memorare nu se recomandå folosirea acestui
subtip pentru numere reale mici cu precizie scåzutå.
Subtipul integer (întreg) poate fi folosit numai pentru numerele întregi. Reprezentarea
numårului pe suportul de memorare se face în binar pe o lungime fixå de 4 octeÆi,
folosindu-se un bit pentru semn çi 31 de biÆi pentru numår. Deoarece 231 - 1 este egal cu
2147483647, domeniul de definiÆie al acestui subtip este [-2147483648, 2147483647].
Subtipul currency (monetar) poate fi folosit pentru memorarea valorilor numerice
exprimate în unitåÆi monetare. Înaintea numårului se introduce simbolul monetar ($).
Poate fi folosit pentru date reale, cu o precizie de maxim 4 cifre zecimale çi cu valori
cuprinse aproximativ în domeniul [-9×1014, 9×1014] . Este specific domeniului contabil,
5
4
Mai exact, numere din intervalul [-1,79769313486232×10308 ÷ 1,79769313486232×10308]
5
Mai exact, numere din intervalul [-922337203685477,5808 ÷ 922337203685477,5807]
6
Pentru operaÆia modulo prin care se calculeazå restul împårÆirii unui operand de tip numeric
întreg la un al doilea operand de tip numeric întreg.
7
Variante ale operatorului diferit.
48 Informatică
un octet, prin codul såu ASCII. Lungimea maximå a çirului de caractere este 254 de
caractere. Lungimea çirului de caractere dintr-un câmp este fixå pentru întregul tabel çi
poate fi stabilitå de cåtre utilizator pânå la maxim 254 de caractere. Lungimea çirului de
caractere dintr-o variabilå de memorie este variabilå, în funcÆie de valoarea atribuitå datei.
Pentru constanta çir de caractere se pot folosi ambele tipuri de delimitatori: apostrof
('Caracter') çi ghilimele ("Caracter").
Operatorii de concatenare care pot fi aplicaÆi pe datele de tip çir de caractere sunt:
C = {+,-}
Operatorul + se numeçte operator de concatenare simplu, iar operatorul - se nu-
meçte operator de concatenare special. Deosebirea dintre operatorul de concatenare
simplu çi operatorul de concatenare special este aceea cå cel de-al doilea operator mutå
spaÆiile de la sfârçitul primului çir de caractere la sfârçitul çirului de caractere concatenat.
De exemplu:
Operatorii relaÆionali care pot fi aplicaÆi pe datele de tip çir de caractere sunt:
D = {+, -}
Dacå notåm cu a primul operand, cu b al doilea operand çi cu c rezultatul, aceçti
operatori se aplicå astfel:
50 Informatică
T = {+, -}
Dacå notåm cu a primul operand, cu b al doilea operand çi cu c rezultatul, aceçti
operatori se aplicå astfel:
8
Tip datå calendaristicå.
9
Tip întreg.
10
Parantezele [ ] semnificå faptul cå este opÆional conÆinutul lor.
11
Tip timp calendaristic;
Identificarea Ñi clasificarea unor tipuri de structuri de date 51
Ò formatul
Ò masca de introducere
Ò eticheta
Ò valoarea implicitå
Ò regula de validare
Ò textul regulii de validare
Ò indexarea
Ò valoarea nulå
Adresarea indirectå
Unele comenzi sau funcÆii Visual FoxPro cer så li se furnizeze un nume, cum ar fi:
numele unui fiçier bazå de date, numele unui câmp, numele unui alias, numele unui fiçier
index, numele unei variabile de memorie, numele unui tablou de memorie etc. Folosind
adresarea indirectå, numele poate fi furnizat prin intermediul unei variabile de memorie
sau al unui tablou de memorie, astfel încât så se poatå generaliza comanda.
Pentru adresarea indirectå se poate folosi macrosubstituÆia: se memoreazå numele
într-o variabilå de memorie, dupå care poate fi substituit într-o comandå sau într-o funcÆie
prin numele variabilei de memorie sau al elementului de tablou, precedat de semnul &
(ampersand):
&<nume_variabilå_de memorie>
sau
&<nume_variabilå_de memorie>.<x>
unde <x> este o expresie de tip çir de caractere. În acest caz, çirul de caractere x va fi
concatenat cu numele memorat în variabila de memorie.
Pentru adresarea indirectå se mai poate folosi çi expresia nume: se memoreazå
numele într-o variabilå de memorie dupå care poate fi substituit într-o comandå sau într-o
funcÆie prin numele variabilei de memorie sau al elementului de tablou, închis între
paranteze rotunde:
(<nume_variabilå_de memorie>)
EvaluaÆi expresii
VeÆi evalua mai multe tipuri de expresii folosind aplicaÆia Visual FoxPro. În expresii veÆi
folosi çi variabile de memorie.
DeschideÆi fereastra aplicaÆiei Visual FoxPro. În fereastra aplicaÆiei este deschiså o
fereastrå document care are numele Command. Aceasta este fereastra de comenzi în
care puteÆi så editaÆi diferite comenzi.
Pentru început veÆi scrie diferite comenzi pentru evaluarea unor expresii. Pentru a cere
evaluarea unei expresii veÆi scrie înaintea ei semnul ? care semnificå operaÆia de
afiçare. Rezultatul evaluårii va fi afiçat în spaÆiul liber al ferestrei de aplicaÆie.
1. EvaluaÆi expresia:
a+b b +d a+c
E= + +
c c + a (a + b )3
a=1
b=2
c=3
d=4
AtribuiÆi variabilei de memorie e valoarea expresiei. ScrieÆi pe un rând operaÆia de
atribuire çi apåsaÆi la sfârçit tasta Enter.
e=(a+b)/c + (b+d)/(c+a)+(a+c)/((a+b)**3)
AfiçaÆi valoarea variabilei de memorie e. ScrieÆi pe un rând comanda çi apåsaÆi la
sfârçit tasta Enter:
?e
În fereastra aplicaÆiei va fi afiçatå valoarea 2.65.
? ⇒ afiçeazå
x=50 ? {02/10/01}+2
e=(x>0 and x<=10) or x=30 02/12/01
?e ? {01/01/01}-10
.F. 12/22/00
? not e ? {01/01/01}-{12/22/00}
.T. 10
x=5 9. FolosiÆi macrosubstituÆia. MemoraÆi
e=(x>0 and x<=10) or x=30
în variabila a valoarea 1 çi în varia-
?e
bila b numele variabilei a.
.T.
? not e a=1
.F. b=’a’
?b
6. ConcatenaÆi douå çiruri de carac-
a
tere 'Ion ' çi 'Maria ': ?a
a='Ion ' 1
b='Maria ' ? &b
? a + b + '!' 1
Ion Maria !
MacrosubstituÆia &b afiçeazå conÆinutul
? a - b + '!'
variabilei a al cårei nume este memorat
IonMaria !
în variabila b, adicå valoarea 1.
7. ComparaÆi douå çiruri de caractere:
10. FolosiÆi macrosubstituÆia. MemoraÆi
a='123' în variabila a valoarea alfa:
b='12 '
? a<b a=’alfa’
.F. alfa1=’Caldura ’
? a=b alfa2=’mare ’
56 Informatică
# ÎncercaÆi:
Adevårat/Fals:
1. Visual FoxPro acceptå pentru numere întregi subtipul longinteger.
2. Operatorul relaÆional != folosit în Visual FoxPro se numeçte operatorul „diferit“.
3. Operatorul relaÆional $ se foloseçte pentru a verifica dacå valoarea unei expresii este
cuprinså între douå valori v1 çi v2.
4. Subtipul memo poate fi folosit în Visual FoxPro pentru çiruri de caractere care au o
lungime mai mare de 254 de caractere.
5. Subtipul datetime se reprezintå în Visual FoxPro pe 16 octeÆi.
6. Valoarea nulå este o proprietate a câmpului care controleazå dacå într-un câmp nu
s-a introdus nici o datå.
7. Câmpurile care în Visual FoxPro au tipul general pot fi câmpuri cheie.
8. MacrosubstituÆia este o metodå folositå pentru a defini proprietatea unui câmp.
CompletaÆi:
1. Operatorul $ folosit în Visual FoxPro se numeçte ………………… çi se aplicå pe
date de tip .......................................
2. Subtipul Date poate fi folosit pentru a reprezenta date calendaristice cuprinse între
..................... çi ..................
3. Operatorii care pot fi folosiÆi pentru subtipul Datetime sunt: ................
4. În Visual FoxPro constanta de tip datå calendaristicå se delimiteazå folosind
caracterele ........
5. Expresia nume se foloseçte pentru ...........................
AlegeÆi råspunsul corect:
1. Dacå trebuie så memoraÆi într-un câmp al unei baze de date Visual FoxPro media generalå
a unui elev, veÆi alege un câmp numeric cu subtipul:
a) simplu b) dublu c) monetar
2. Dacå folosiÆi subtipul numeric simplu pe 4 octeÆi pentru reprezentarea unui numår întreg
într-o bazå de date Visual FoxPro, valoarea maximå pe care o veÆi putea reprezenta
este:
Identificarea Ñi clasificarea unor tipuri de structuri de date 57
a) 24 -1 b) 9999 c) 2147483646
3. Rezultatul expresiei 3^2*35%5**2 este:
a) 0.00 b) 15.00 c) 3.00
4. Reprezentarea subtipului float folosit pentru câmpurile numerice din Visual FoxPro are
lungimea de:
a) 1 octet b) 20 octeÆi c) cuprinså între 1 octet çi 20 de octeÆi
5. Reprezentarea subtipului integer folosit pentru câmpurile numerice din Visual FoxPro
are lungimea de:
a) 4 octeÆi b) 8 octeÆi c) 16 octeÆi
6. Operatorul folosit în Visual FoxPro pentru operaÆia modulo este :
a) MOD b) \ c) %
7. În Visual FoxPro numårul maxim de caractere dintr-un çir de caractere este:
a) 254 b) 255 c) 256
8. În Visual FoxPro rezultatul evaluårii expresiei 12 + {08/15/01} - {07/15/01} = 43 este:
a) .T. b) .F. c) eroare
9. În Visual FoxPro operatorul ! este un operator:
a) relaÆional b) logic c) de concatenare
RåspundeÆi:
1. Ce subtipuri numerice se folosesc pentru câmpurile din Visual FoxPro?
2. În Visual FoxPro ce operatori relaÆionali se folosesc în plus pentru datele de tip çir de
caractere faÆå de cele de tip numeric?
3. Ce operatori de concatenare se folosesc în Visual FoxPro? Care este deosebirea
dintre ei?
4. Pentru ce tip de date a fost implementat subtipul memo? În ce caz se recomandå
folosirea lui?
5. Ce subtipuri de date se folosesc în Visual FoxPro pentru gestionarea timpului?
6. Pentru ce se foloseçte tipul de date general în Visual FoxPro?
7. Ce este valoarea nulå a unui câmp?
8. Care sunt proprietåÆile câmpurilor dintr-o bazå de date?
9. Ce este regula de validare? La câte niveluri se poate aplica?
R åspunsuri:
Adevårat/Fals: 1-F; 2-A; 3-F; 4-A; 5-F; 6-A; 7-F; 8-F.
CompletaÆi: 1-inclus în, çiruri de caractere; 2-1 ianuarie 100, 31 decembrie 9999; 3-+,-; 4-{ };
5-adresarea indirectå.
AlegeÆi råspunsul corect: 1) a; 2) b; 3) b; 4) c; 5) a; 6) c; 7) a; 8) a; 9) b.
Capitolul 2
Utilizarea unor
instrumente de
prelucrare a datelor
Baza de date relaÆionalå este un instrument
Dupå ce veÆi parcurge acest capitol
complex de organizare a datelor. Ea este forma-
trebuie så çtiÆi:
1.
tå nu numai din datele care reprezintå informaÆia
Så lucraÆi cu interfaÆa unei aplicaÆii
propriu-ziså (datele din tabele), dar çi de multe
specifiå pentru gestiunea bazelor de
date. date ajutåtoare necesare pentru descrierea struc-
2. Så creaÆi o bazå de date definind turii tabelelor çi a relaÆiilor dintre tabele, pentru
tabelele çi relaÆiile dintre ele. regåsirea çi interpretarea datelor, astfel încât så
3. Så executaÆi prin intermediul vå poatå oferi acces la o mare cantitate de infor-
interfeÆei operaÆii specifice gestiunii
maÆii care så vå ajute så luaÆi decizii. Pentru ad-
bazelor de date relaÆionale: actua-
ministrarea ei este necesar un software speci-
lizarea (adåugarea, çtergerea çi alizat numit sistem de gestiune a bazelor de
modificarea înregistrårilor), sortarea,
date. Termenul de bazå de date se referå la mo-
consultarea, cåutarea, sortarea.
delul de organizare a datelor pe suportul de me-
4. Så obÆineÆi informaÆii din baza de
morare, iar termenul de gestiune se referå la
date sub formå de rapoarte, intero-
gåri çi vizualizåri. acÆiunea de stocare çi prelucrare a acestor date.
Deja aÆi putut vedea ce tipuri de date se folosesc
într-un sistem de gestiune a bazelor de date. Acesta a fost primul pas pentru a înÆelege
complexitatea unui sistem de gestiune a bazelor de date.
Orice sistem de gestiune a bazelor de date trebuie så asigure urmåtoarele funcÆii
elementare:
9 definirea bazei de date,
9 actualizarea datelor din baza de date prin:
adåugarea de noi înregistråri,
çtergerea unor înregistråri,
modificarea valorii unor câmpuri din înregistråri;
9 interogarea bazei de date (extragerea informaÆiilor din baza de date).
La aceste funcÆii elementare, pe måsura dezvoltårii sistemelor de gestiune a bazelor de
date s-au mai adåugat çi alte funcÆii, dintre care cele mai importante sunt:
9 generarea formularelor de ecran pentru introducerea datelor,
9 generarea rapoartelor,
Utilizarea unor instrumente de prelucrare a datelor 59
9 Permite o adaptare uçoarå la lucrul cu mai mulÆi utilizatori, fårå så necesite imple-
mentarea unei variante speciale pentru lucrul în reÆea.
9 Are implementat conceptul de colecÆie de date definitå ca un depozit cu informaÆii
despre tabele, care permite folosirea numelor lungi pentru tabele çi pentru câmpuri çi
implementarea integritåÆii referenÆiale direct în tabelele bazei de date în loc så fie
descriså în programele de aplicaÆie.
9 Permite comunicarea çi cu alte aplicaÆii folosind mecanisme DDE, cum este de
exemplu, comunicarea cu aplicaÆia Excel. Orice modificare fåcutå într-o foaie de
calcul Excel se va reflecta çi în tabelul bazei de date FoxPro.
9 Are implementat protocolul OLE care permite schimbul de date între aplicaÆii dife-
rite. AplicaÆiile FoxPro sunt aplicaÆii client çi în ele pot fi legate çi încapsulate diferite
obiecte produse de aplicaÆiile server: texte, sunete, imagini, foi de calcul.
9 Permite importul çi exportul diferitelor tipuri de date påstrate în diferite formate de
fiçiere: Access, dBase, Paradox, Oracle, Excel etc.
9 Dispune de un limbaj procedural puternic ce permite descrierea datelor çi a aplica-
Æiilor pe baza modelului programårii structurate, în care orice algoritm de rezolvare a
unei probleme poate fi descris cu ajutorul a trei structuri de control: liniarå, alternativå,
repetitivå.
9 Are implementat pentru interogarea bazei de date, pe lângå limbajul propriu, atât limbajul
de interogare de tip SQL, cât çi limbajul de tip QBE (interogarea prin exemple,
exemplele fiind create interactiv prin diferite obiecte puse la dispoziÆie de interfaÆå). Aceste
limbaje uçureazå folosirea sistemului de cåtre utilizatorii neinformaticieni.
9 Începând cu versiunea 3.0, în limbajul FoxPro este implementat çi modelul programårii
orientate pe obiecte. Dacå în programarea clasicå datele çi programele care le pre-
lucrau erau separate, în programarea orientatå pe obiecte programul este definit ca un
obiect care înglobeazå atât ansamblul de date, cât çi algoritmii care prelucreazå aceste
date. În cadrul algoritmilor se foloseçte în continuare modelul programårii structurate.
9 Limbajul de programare propriu sistemului de gestiune a bazelor de date FoxPro are
implementat çi modelul programårii conduse de evenimente. În cadrul acestui model,
programul este considerat un ansamblu de proceduri care nu se executå într-o ordine
descriså de programator, ci numai atunci când apar în sistem anumite evenimente. Un
exemplu de astfel de eveniment este apåsarea unei combinaÆii de taste, care se poate
produce în orice moment în sistem çi nu la momente determinate de programator.
9 Permite programarea vizualå a aplicaÆiilor. Acest tip de proiectare oferå programatori-
lor posibilitatea de a realiza mai simplu aplicaÆii de exploatare a bazelor de date,
deoarece ei nu mai sunt obligaÆi så precizeze cum trebuie realizatå aplicaÆia (så
descrie algoritmul de rezolvare a problemei), ci ce trebuie så realizeze aplicaÆia.
Pentru aceasta, FoxPro pune la dispoziÆia utilizatorilor diferite instrumente vizuale
numite generatoare sau constructori. Acestea sunt programe care permit
proiectarea interactivå a bazelor de date, a interogårilor, a rapoartelor, a elementelor
de interfaÆå (formulare de introducere a datelor, meniuri, ferestre), a aplicaÆiilor çi a
proiectelor. În plus, utilizatorul poate apela çi la procedurile asistent (wizard) care îl
îndrumå interactiv, pas cu pas în construirea acestor elemente. Elementul va fi realizat
pe baza datelor furnizate de cåtre programator în cadrul dialogului interactiv.
9 Are o vitezå de lucru foarte mare, deoarece foloseçte o tehnologie specialå denumitå
tehnologie Rushmore care reduce timpul de acces la date prin optimizarea interogårilor.
Utilizarea unor instrumente de prelucrare a datelor 61
InterfaÆa graficå
InterfaÆa graficå este de tip MDI (interfaÆå cu mai multe documente), adicå în fereastra
aplicaÆiei pot fi deschise mai multe ferestre document. Ea este compatibilå cu interfaÆa de
tip Microsoft Office (meniurile, barele de instrumente, scurtåturile de la tastaturå).
Fereastra aplicaÆiei prezintå un sistem de meniuri care pun la dispoziÆia utilizatorului
marea majoritate a comenzilor care formeazå limbajul de comandå. În general, opÆiunea
de meniu reprezintå verbul comenzii, iar adverbele sunt precizate prin intermediul
controalelor din caseta de dialog. Comenzile, în funcÆie de modul în care pot acÆiona, sunt
grupate în meniuri. Astfel:
Titlurile meniurilor Barele cu instrumente
9 Edit conÆine opÆiuni pentru editarea textelor: operaÆii de selectare, operaÆii de copiere
(Cut, Copy, Paste), operaÆii de cåutare çi înlocuire (Find çi Replace), inserarea sau
legarea obiectelor.
9 View conÆine opÆiuni pentru modificarea obiectelor afiçate în fereastra aplicaÆiei. Cea
mai importantå opÆiune este Toolbars... care vå permite så alegeÆi barele cu
instrumente care vor fi afiçate.
9 Format conÆine opÆiuni pentru formatarea textelor afiçate în ferestrele document ale
aplicaÆiei (fontul, dimensiunea çi stilul caracterelor, indentarea çi spaÆiul dintre liniile
paragrafelor).
9 Tools conÆine opÆiuni prin care puteÆi alege diferite instrumente: proceduri asistent,
editorul de macrocomenzi, ferestrele pentru depanarea programului (Debug) sau
pentru executarea pas cu pas a programului (Trace).
9 Program conÆine opÆiuni pentru compilarea çi executarea programelor.
9 Window conÆine opÆiuni pentru operaÆii cu ferestrele document: aranjarea ferestrelor
(Arrange All), ascunderea ferestrei active (Hide), çtergerea ferestrei active (Clear),
comutarea între ferestre (Cycle), deschiderea ferestrei de comenzi (Command
Window), deschiderea ferestrei pentru vizualizarea tabelelor din baza de date
deschiså çi a legåturilor dintre tabele (View Window).
9 Help conÆine opÆiuni pentru asigurarea asistenÆei utilizatorului.
Sistemul de meniuri este dependent de context. În funcÆie de operaÆiile care se executå,
mai pot så aparå meniurile:
Titlul meniului Database este afiçat în bara de meniuri numai dacå în fereastra aplicaÆiei
este deschiså o fereastrå document de tip bazå de date în care sunt afiçate tabelele
bazei de date çi relaÆiile dintre ele.
Utilizarea unor instrumente de prelucrare a datelor 63
9 Table conÆine opÆiuni pentru manipularea înregistrårilor din tabel: adåugarea de noi
înregistråri - Append New Record çi Append Records..., marcarea pentru çtergere a
înregistrårilor (çtergerea logicå) - Delete, refacerea înregistrårilor çterse logic - Recall¸
çtergerea fizicå a înregistrårilor marcate pentru çtergere - Remove Deleted Records,
poziÆionarea pe o înregistrare din tabel - Go to Record..., înlocuirea valorilor unor
câmpuri cu alte valori - Replace Field..., actualizarea indexului tabelului pentru a
reflecta situaÆia actualå - Rebuild Indexes etc. Meniul mai conÆine çi opÆiuni pentru
stabilirea proprietåÆilor tabelului (Properties...) çi pentru alegerea fontului, a
dimensiunii çi a stilului caracterelor cu care se afiçeazå datele din tabel (Font...) etc.
9 Database conÆine opÆiuni pentru manipularea tabelelor din baza de date: crearea unui
tabel nou çi adåugarea lui la baza de date - New Table, adåugarea unui tabel la baza
de date - Add Table, crearea unei noi vizualizåri çi adåugarea ei la baza de date -
New Local View, modificarea structurii tabelului selectat din baza de date - Modify,
afiçarea conÆinutului tabelului selectat din baza de date într-o fereastrå de editare -
Browse, înlåturarea unui tabel din baze de date - Remove, actualizarea indexului
tabelului selectat din baza de date - Rebuild Table Indexes, çtergerea fizicå a
înregistrårilor marcate logic pentru çtergere din tabelul selectat din baza de date -
Remove Deleted Records..., editarea relaÆiei selectate dintre douå tabele ale bazei
de date - Edit Relationship...¸ deschiderea ferestrei generatorului pentru integritatea
referenÆialå a bazei de date - Referential Integrity... etc.
Titlul meniului Table este afiçat în bara de meniuri numai dacå în fereastra aplicaÆiei
este deschiså o fereastrå document de tip tabel al bazei de date.
64 Informatică
Bara de stare furnizeazå informaÆii despre obiectul focalizat (titlu de meniu, opÆiune de
meniu, buton din bara cu instrumente etc.), despre programul care se executå (numele
programului) sau despre tabelul bazei de date selectat. În acest ultim caz, furnizeazå
informaÆii despre identificatorul tabelului (<nume_bazå_date> ! <nume tabel>) çi aliasul
tabelului, despre numårul înregistrårii curente x din numårul total de înregistråri y. Afiçarea
se face sub forma <x>/<y>. Aceste informaÆii sunt afiçate în partea stângå a barei de stare:
Limbajul de comandå
Comenzile vor fi editate în fereastra Command. Fiecare comandå se scrie pe un rând.
Terminarea unei comenzi se marcheazå prin acÆionarea tastei Enter. AcÆionarea acestei
taste semnificå faptul cå interpretorul de comenzi poate prelua aceastå comandå så o
analizeze, så o decodifice çi så o lanseze în execuÆie.
Comanda este o succesiune de caractere organizate conform sintaxei limbajului, prin
care i se cere calculatorului så execute o acÆiune. Sintaxa se referå la structura liniei de
comandå. Linia de comandå are urmåtoarea sintaxå:
verb listå adverbe Enter
For <x>
Schemele logice descriu modul în care clauzele For
çi While definesc domeniul înregistrårilor.
BOF
While <x>
înregistrarea
nu
curentå
Not EOF
sfârçit
da
nu da
Not EOF nu x=.T.
and
x=.T. sfârçit
For <x>
Schemele logice descriu modul în care clauzele For
çi While definesc domeniul înregistrårilor.
BOF
While <x>
înregistrarea
nu
curentå
Not EOF
sfârçit
da
nu da
Not EOF nu x=.T.
and
x=.T. sfârçit
memorat în fiçier. În plus, de fiecare datå când se doreçte executarea acelor comenzi, ele nu
vor mai fi scrise, ci lansate direct în execuÆie din fiçierul de comenzi.
Pentru crearea unui fiçier de comenzi se deschide fereastra editorului de texte folosind
comanda:
Modify command <nume_fiçier>
În fereastra de editare veÆi scrie comenzile, câte una pe fiecare rând, aça cum le scriaÆi çi
în fereastra de comenzi. OperaÆiile pentru editare (selectare, copiere sau mutare text se-
lectat, cåutare sau cåutare cu înlocuire a unui çir de caractere, anularea ultimei operaÆii)
sunt operaÆiile obiçnuite ale unui editor de texte Windows. Comenzile pentru aceste
operaÆii se gåsesc sub formå de opÆiuni în meniul Edit. Dupå ce aÆi scris comenzile,
salvaÆi fiçierul cu opÆiunea Save∈File. Pentru închiderea ferestrei de editare puteÆi folosi
scurtåturile: Ctrl+W pentru închiderea cu salvare sau Esc pentru închiderea fårå salvare.
LansaÆi în execuÆie programul cu comanda:
Do <nume_fiçier>
Aceastå formå se foloseçte pentru parametrii care pot lua o valoare dintr-un domeniu de
mai multe valori. Ei vor fi precizaÆi prin valoare. De exemplu:
Set Default to <cale_director>
Schimbå directorul curent în cel precizat prin <cale_director>.
Set Clock to [<x>,<y>]
Controleazå parametrul Clock care reprezintå poziÆia afiçårii ceasului pe ecran. Ea
poate fi precizatå prin coordonatele <x> - numårul rândului çi <y> - numårul coloa-
nei. PoziÆia implicitå de afiçare este colÆul din dreapta sus al spaÆiului de lucru din
fereastra de aplicaÆie Visual FoxPro.
Set Hours to [12/24]
Controleazå parametrul Hours care reprezintå formatul de afiçare al orei. El poate
considera ziua ca fiind formatå din douå grupe de 12 ore (cu precizarea am sau
pm) sau dintr-un grup de 24 de ore. Valoarea implicitå este 12.
Set Path to <listå_cåi_director>
Permite stabilirea unei liste de cåutare; aceastå listå conÆine mai multe cåi de
director în care se va cåuta fiçierul precizat în comandå, dacå nu va fi gåsit în
directorul curent.
Pentru a vizualiza starea parametrilor care pot fi stabiliÆi prin comenzi Set, folosiÆi comanda:
Display status
ObÆineÆi informaÆii despre starea unui parametru care poate fi stabilit prin comenzi Set
folosind funcÆia:
Set (<nume parametru>[,1|2])
Numele parametrului se scrie ca un çir de caractere. Dacå numele parametrului este folosit
cu ambele forme ale comenzii Set (cum este de exemplu parametrul Clock), el reprezintå doi
parametri cu semnificaÆie diferitå. În acest caz se foloseçte 1 sau 2 pentru a afla informaÆii
despre fiecare parametru.
# ÎncercaÆi:
Adevårat/Fals:
1. Meniul Database conÆine opÆiuni pentru manipularea tabelelor din baza de date.
2. Într-o comandå puteÆi preciza grupul de înregistråri care începe cu înregistrarea
curentå çi se terminå cu ultima înregistrare folosind cuvântul cheie Next.
3. În general, adverbele dintr-o comandå pot fi scrise în orice ordine.
4. Verbul comenzii poate fi prescurtat la primele patru caractere.
5. Configurarea mediului de lucru Visual FoxPro se poate face prin ansamblul de
comenzi Set.
6. Folosind comanda Display status afiçaÆi informaÆii despre starea monitorului.
7. Numårul de zecimale dintr-un numår îl stabiliÆi cu comanda Set Fixed.
8. Formularul prin intermediul cåruia puteÆi så modificaÆi interactiv parametrii sistemului
este de tip fereastrå document.
CompletaÆi:
1. InformaÆiile despre activarea/dezactivarea tastelor comutator se gåsesc în .............…
2. Fereastra folositå pentru editarea comenzilor se numeçte ..................................
3. Fereastra generatorului de tabele ale bazei de date se numeçte .................................
4. Cuvântul cheie prin care puteÆi preciza într-o comandå un grup de n înregistråri,
începând cu înregistrarea curentå este ......................
5. Pentru redirectarea ieçirii unei comenzi la imprimantå folosiÆi clauza .....................
6. Comanda prin care cereÆi så aflaÆi informaÆii despre operaÆia de çtergere a fiçierelor
Erase este ................................
7. Formularul prin intermediul cåruia puteÆi så administraÆi fiçierele este de tip ................
............................. çi se numeçte ....................................
8. Autodocumentarea declançatå prin acÆionarea butonului Help dintr-o casetå de dia-
log se numeçte help ............................... de context.
AlegeÆi råspunsul corect:
1. Meniul Table conÆine opÆiuni pentru:
a) crearea çi formatarea tabelelor
Utilizarea unor instrumente de prelucrare a datelor 79
R åspunsuri:
Adevårat/Fals: 1-A; 2-F; 3-A; 4-A; 5-A; 6-F; 7-F; 8-F.
CompletaÆi: 1- bara de stare; 2-Command; 3-Database Designer; 4-Next; 5-To Print; 6-Help Erase;
7-caseta de dialog, Filer; 8-dependent.
AlegeÆi råspunsul corect: 1-b; 2-c; 3-c; 4-c; 5-b; 6-b; 7-b; 8-b.
80 Informatică
Tipuri de date
Logical General
Întreg
Pentru prelucrarea datelor elementare
Monetar (variabile de memorie sau câmpuri) puteÆi
Real folosi, pe lângå operatorii specifici
tipului de datå, çi funcÆiile. Acestea pot
Currency fi grupate dupå tipul datelor care sunt
Integer folosite ca argumente (parametri de
intrare sau date de intrare prelucrate de
Float Double funcÆie).
a + 1- a − 1
× (2 − a )
a + 1+ a − 1
pentru a=4. ScrieÆi comenzile:
a=4
e=((sqrt(a+1)-sqrt(a-1))/ (sqrt(a+1)+sqrt(a-1)))*(2-a)
?e
-0.25 (rezultatul afiçat)
2. EvaluaÆi expresia:
x2 − 1
pentru x=3.
x=3
e=sqrt(sqrt(sqrt(x^2-1)))
?e
1.30
? exp(0) 1.00
1 ? sin(dtor(90))
? exp(1) 1.00
2.72 ? asin(1)
? log(1) 1.57
0.00 ? rtod(asin(1))
? log(exp(5)) 90.00
5.00 ? tan(pi()/4)
? exp(log(5)) 1.00
5.00 ? rtod(atan(1))
? log10(1000) 45.00
3.00 ? rtod(atan(-1))
? log10(1000^2) -45.00
6.00 ? rtod(asin(-1))
-90.00
8. EvaluaÆi funcÆii trigonometrice folo- ? rtod(acos(-1))
sind funcÆiile: sin(), cos(), tan(), asin(), 180.00
acos(), atan(), pi(), rtod(), dtor(): ? rtod(asin(sqrt(2)/2))
? sin(pi()/2) 45.00
Alltrim(), Padc()
5. Transformarea unui çir de caractere se poate face prin douå tipuri de operaÆii.
a. transformarea din litere mari în litere mici çi invers: Lower(), Upper(), Proper()
b. înlocuirea unor caractere cu alte caractere: Chrtran(), Strtran(), Stuff()
Utilizarea unor instrumente de prelucrarea datelor 87
n
y - subçirul cu care se înlocuieçte
m
Left(x,n)
Substr(x,m,n) Right(x,n)
decodare ? at ('nr', a)
16
6. ExecutaÆi operaÆii cu subçiruri de ? at ('Nr', a)
caractere folosind funcÆiile: left(), 0
right(), substr(), at(), rat(), atc(): ? atc ('Nr', a)
x= 'Marea Neagra' 16
y='untdelemn' ? rat('nr', a)
? left (x,5) 16
Marea a='Ala Bala Portocala'
? right (x,6) ? at ('la',a,1)
Neagra 2
? left(y,3) ? at ('la',a,2)
unt 7
? substr(y,4,2) ? at ('la',a,3)
de 17
? right(y,4) ? rat ('la',a,3)
lemn 2
? left(y,3)=substr(y,1,3) ? occurs('co','cocor')
.T. 2
? substr(y,len(y)-4+1,4) = right(y,4) ? occurs('la',a)
.T. 3
a='str. Iezerului nr. 32'
Val()
tip numeric tip çir de caractere
Str()
Ctod()
tip datå calendaristicå tip çir de caractere
Dtoc(), Dtos()
Ctot()
tip datå pentru timp tip çir de caractere
Ttoc()
Dtot()
tip datå pentru timp tip datå calendaristicå
Ttod()
?y 02/03/01 00:00:00
07/04/01 set hour to 12
?x>y ? dtot(b)
.T. 02/03/01 12:00:00 AM
x=dtos(d1)
?x 4. ConvertiÆi çir de caractere ⇔ mo-
20010308 ment de timp folosind funcÆiile: ctot(),
y=dtos(d2) ttoc():
?y a=datetime()
20010407 ?a
?x>y 02/03/01 04:52:12 PM
.F. b = ttoc(a)
3. ConvertiÆi data calendaristicå ⇔ mo- ?b
ment de timp folosind funcÆiile: dtot(), 02/03/01 04:52:12 PM
?type('b')
ttod():
C
a=datetime() c=ctot(b)
? ttod(a) ?c
02/03/01 02/03/01 04:52:12 PM
b=date() ?type('c')
? dtot(b) T
3 . C o m e n z i p e nt r u v a r i a b i l e d e m e m o r i e
ÇtiÆi cå o variabilå de memorie reprezintå o zonå de memorie cåreia i se atribuie un nume
çi în care se poate memora valoarea unei date elementare de un anumit tip. Referirea la
variabila de memorie se face prin numele såu.
98 Informatică
PuteÆi obÆine informaÆii complexe despre un grup de variabile de memorie (nume, dacå
1
sunt publice - public sau particulare - private, tip, valoare) folosind comenzile List
Memory çi Display Memory:
1
O variabilå publicå sau globalå poate fi folositå de orice subprogram al aplicaÆiei, iar o variabilå
particularå sau localå poate fi folositå numai în subprogramul în care a fost creatå. Toate
variabilele create în fereastra de comenzi sunt publice.
100 Informatică
4. TestaÆi urmåtoarea secvenÆå de instrucÆiuni pentru mai multe valori ale variabilelor a,
b çi c, definite astfel: (a,b,c)∈ {(2,3,4), (2,3,3), (3,3,3), (2,1,4)}.
input 'a= ' to a
input 'b= ' to b
input 'c= ' to c
b1='Nu este triunghi'
b2='Triunghi oarecare'
b3='Triunghi echilateral'
b4='Triunghi isoscel'
c1=a+b>c and b+c>a and c+a>b
c2= a=b and b=c
c3= a=b or a=c or b=c
? iif(c1, iif(c2, b3, iif(c3 b4,b2)),b1)
Ce realizeazå aceastå secvenÆå de comenzi? ScrieÆi secvenÆa de comenzi într-un fiçier
de tip program executabil cu numele alfa. FolosiÆi comanda:
modify command alfa
ExecutaÆi programul pentru fiecare valoare a tripletului (a,b,c) din mulÆimea de definiÆie.
Pentru executarea programului folosiÆi comanda:
do alfa
5. TestaÆi urmåtoarea secvenÆå de instrucÆiuni pentru mai multe valori ale variabilelor a,
b çi c, definite astfel: (a,b,c)∈ {(2,3,4), (5,3,4), (2,3,3), (2,1,4)}
input 'a= ' to a
input 'b= ' to b
input 'c= ' to c
x=a^2
y=b^2
z=c^2
b1='nu este triunghi'
b2='triunghi dreptunghic'
b3='triunghi ascutitunghic'
b4='triunghi optuzunghic'
c1=a+b>c and b+c>a and c+a>b
c2=x+y=z or y+z=x or z+x=y
c3=x+y>z and y+z>x and z+x>y
c4=x+y<z or y+z<x or z+x<y
? iif(c1, iif( c2,b2, iif(c3,b3, iif(c4,b4,''))),b1)
Ce realizeazå aceastå secvenÆå de comenzi? ScrieÆi secvenÆa de comenzi într-un fiçier
de tip program executabil cu numele beta. FolosiÆi comanda:
modify command beta
ExecutaÆi programul pentru fiecare valoare a tripletului (a,b,c) din mulÆimea de definiÆie.
Pentru executarea programului folosiÆi comanda:
do beta
ÎnlocuiÆi ultima comandå din program cu comanda:
? iif(c1, iif( c2,b2, iif(c3,b3,b4)),b1)
ReluaÆi execuÆia programului modificat pentru fiecare valoare a tripletului (a,b,c) din
mulÆimea de definiÆie. Ce constataÆi?
102 Informatică
# ÎncercaÆi:
AråtaÆi corespondenÆele:
Se evalueazå funcÆia:
?iif(inlist(n,1,2,3,4,5,6), iif(2**n=a,'1 octet', iif(2**n=b, ' 2 octeti',
iif(2**n=c, '8 octeti', 'incorect'))), 'incorect')
unde a=8, b=16, c=64. LegaÆi prin linii fiecare element din coloana n de elementul
corespunzåtor din coloana Afiçeazå:
n: Afiçeazå:
1
2 a 1 octet
3
4 b 2 octeÆi
5
6 c 8 octeÆi
7
8 d incorect
Adevårat/Fals:
1. FuncÆia isdigit('123') furnizeazå rezultatul adevårat.
2. Pentru a afiça çirul de caractere 12345 din numårul întreg 12345 folosiÆi funcÆia
str(12345,5,0).
3. Rezultatul funcÆiei max(day(d)+2,month(d)+5) este 7 pentru valoarea {02/04/01} a
variabilei de memorie d afiçatå în formatul american.
4. FuncÆia prin care convertiÆi un caracter în codul såu ASCII se numeçte val.
5. EliminaÆi spaÆiile din stânga unui çir de caractere cu funcÆia left().
6. FuncÆia at() înlocuieçte într-un çir de caractere un subçir cu un alt subçir.
7. FuncÆia floor() se foloseçte pentru aproximarea unui numår.
8. Comanda ?? se foloseçte pentru a afiça la imprimantå un çir de caractere.
CompletaÆi:
1. FuncÆia mod(10,5) furnizeazå rezultatul …………
2. FuncÆia len(padc(5,'alfa')) afiçeazå valoarea ......
3. FuncÆia occurs('a','calamar') afiçeazå rezultatul ...............
4. FuncÆia prin care convertiÆi un numår într-un çir de caractere se numeçte ........
5. Pentru a extrage n caractere dintr-un çir de caractere folosiÆi funcÆia ..............
6. FuncÆia str() cu care puteÆi så obÆineÆi çirul de caractere 123 din numårul 123.45 este ....
7. Pentru a obÆine valoarea numericå 23 din çirul de caractere .1234 veÆi folosi funcÆiile: ......
8. Pentru a obÆine valoarea 23 din numårul 1234 veÆi folosi funcÆiile .............
AlegeÆi råspunsurile corecte:
1. FuncÆia ceiling(-3.5) afiçeazå:
a) -3 b) -4 c) 4
2. FuncÆia round(3.5) afiçeazå:
a) 3 b) 4 c) eroare
Utilizarea unor instrumente de prelucrare a datelor 103
11. Ce funcÆie puteÆi folosi pentru a testa dacå valoarea unei date aparÆine unui interval?
Dar pentru a testa dacå aparÆine unei mulÆimi de valori?
12. Ce funcÆie puteÆi folosi pentru a descrie o structurå alternativå?
13. ScrieÆi funcÆiile prin care puteÆi så realizaÆi urmåtoarele transformåri de cuvinte:
cor ⇒ color
covor ⇒ cotor ⇒ color ⇒ cosor ⇒ cosar
covor ⇒ cotor ⇒ motor ⇒ mosor
calculator ⇒ calator ⇒ abator ⇒ abatere
14. ScrieÆi funcÆiile prin care descompuneÆi în cuvintele componente urmåtoarele cuvinte
compuse çi expresii: viÆa de vie, Spitalul de UrgenÆå, Delta Dunårii çi cocoçul de munte.
15. Trebuie så çtergeÆi un grup de variabile de memorie. Ce operaÆie veÆi folosi dacå puteÆi så
descrieÆi grupul printr-un çablon? Ce operaÆie veÆi folosi dacå nu puteÆi så descrieÆi grupul
printr-un çablon?
R åspunsuri:
AråtaÆi corespondenÆele: 1-d; 2-d; 3-a; 4-b; 5-d; 6-c; 7-d; 8-d.
Adevårat/Fals: 1-A; 2-A; 3-A; 4-F; 5-F; 6-F; 7-A; 8-F.
CompletaÆi: 1-0; 2-5; 3-3; 4-str(); 5-substr(); 6-str(123.45,3); 7-int(val(substr('.1234',3,2)));
8-int(val(substr(str(1234,4),2,2)))
AlegeÆi råspunsurile corecte: 1-a; 2-c; 3-a; 4-a; 5-c;6-b; 7-b; 8-c; 9-b; 10-b; 11-c;12-b,c; 13-b; 14-a,b,c.
R åspunsuri:
1) a1=0 | a2=space(0) | a3={ / / } | a4=.F. | ? empty(a1) | ? empty(a2) | ? empty(a3) |
? empty(a4) | ? type('a1'), a1 | ? type('a2'), a2 | ? type('a3'), a3 | ? type('a4'), a4
2) ? a1 | ? a2 | ? a3 | ? a4 3) ?type('seconds()')
4) a1=seconds() | a2=replicate('*1!',10) | a3=date() | a4=((75/5+5)*5=(40-6+2*8)*2)
? type('a1'), a1 | ? type('a2'), a2 | ? type('a3'), a3 | ? type('a4'), a4 | set date to british | ?a3
5) ?dtoc(Date())+' '+replicate('*',10)+' Buna ziua '+replicate('*',10)+' '+time()
6) b1=a1 | b2=a2 | b3=a3 | b4=a4
7) ?int(b1) | ?floor(b1) | ?ceiling(b1) | ?b1-int(b1) sau ?mod(b1,int(b1))
8) b1=a1 | b2=a2 | b3=a3 | b4=a4 | z='a' | a1='Uf! ' | a2='Am ' | a3='terminat ' | a4='o ' |
a5='saptamana ' | a6='obositoare' | ?&z.1+&z.2+&z.3+&z.4+&z.5+&z.6 |
w=&z.1+&z.2+&z.3+&z.4+&z.5+&z.6
9) ?w+'!!!'+replicate(chr(7),5)
10) ?proper(w)+'!!!' | ?lower(w)+'!!!' | ?upper(w)+'!!!' |
?left(lower(w),4)+substr(proper(w),8,9)+right(upper(w),10)
11) ?at('oa',w) | ?rat('oa',w) 12) ?dow(date())| ?cdow(date())
13) dif={31/12/01}-date() | ?dif | spt=int(dif/7) | ?spt | zile=mod(dif,7) | ?zile |
?str(spt,2)+' saptamani si '+str(zile,1)+' zile' |
?str(spt,2)+' saptamani si '+str(zile,1)+iif(zile=1,' zi',' zile')
14) ?padc(time(),18,'=') | ?padl(padr(time(),13,'='),18,'=') | ?replicate('=',5)+time()+replicate('=',5) |
?'====='+time()+'====='
15) t=space(5)+time()+space(5) | ? t | ? len(t)
16) ?alltrim(t) sau ?ltrim(rtrim(t)) | u=alltrim(t) | ?len(u) | ?len(t) | ?len(u)=len(t) | ?len(t)>len(u)
17) ?chrtran('copac','o','a') sau ?strtran('copac','o','a') |
?strtran('capac','ap','op') sau ?stuff('capac',2,1,'o')
18) CreaÆi fiçierul cu programul folosind comanda modify command timp.
ScrieÆi în fereastra de editare urmåtoarele comenzi:
input 'timp executie piesa ' to x nr_ore=nr_tot_ore%24
input 'numar piese executate ' to n ? 'timpul necesar executarii pieselor este
t=x*n de:'
nr_min=t%60 ? nr_zile, 'zile', nr_ore, 'ore', nr_min,
nr_tot_ore=int(t/60) 'minute'
nr_zile=int(nr_tot_ore/24)
SalvaÆi comenzile scrise. LansaÆi în execuÆie programul cu comanda do timp. IntroduceÆi valori
pentru x çi n (de exemplu 50 de minute çi 100 de piese).
19) display memory | nu se gåsesc çi variabilele de memorie create în program, deoarece la termina-
rea execuÆiei programului, zona de memorie alocatå lui se elibereazå, inclusiv zona ocupatå de
variabilele de memorie create de el. Efectul este pierderea valorii acestor variabile de memorie.
20) release a1, b2, u | display memory 21) release all like b? | display memory
22) release all except t | display memory 23) clear memory | display memory
Utilizarea unor instrumente de prelucrare a datelor 107
Cåutarea unei înregistråri dupå valoarea unui câmp se face mult mai rapid atunci când
înregistrårile sunt ordonate dupå acel câmp, deoarece în cazul unei structuri ordonate se pot
folosi diferiÆi algoritmi de cåutare. De exemplu, pentru a gåsi înregistrarea care îndeplineçte
condiÆia a=34 (valoarea câmpului a este 34), în cazul unei parcurgeri secvenÆiale se vor
executa 8 operaÆii de verificare, câte una pentru fiecare înregistrare. În cazul ordonårii
structurii se poate folosi, de exemplu, algoritmul de înjumåtåÆire a intervalului. Cåutarea se
108 Informatică
va face în fiçierul index folosind acest algoritm. Se împarte fiçierul în douå: în prima jumåtate
se vor gåsi înregistrårile pentru care a∈[10,34], iar în a doua jumåtate se vor gåsi înregistrårile
pentru care a∈[40,90]. Se verificå çi se vede cå valoarea 34 a câmpului a aparÆine primului
interval. Se împarte çi acest interval în douå: în prima jumåtate se vor gåsi înregistrårile pentru
care a∈[10,12], iar în a doua jumåtate se vor gåsi înregistrårile pentru care a∈[23,34]. Se
verificå çi se vede cå valoarea 34 a câmpului a aparÆine celui de-al doilea interval. Se împarte
çi acest interval în douå: în prima jumåtate se va gåsi o singurå valoare (23), iar în a doua
jumåtate se va gåsi o singurå valoare (34), care este valoarea cåutatå. Pentru aceastå
valoare, în index existå numårul înregistrårii: 8. Se poziÆioneazå în tabel pointerul de
înregistrare direct pe înregistrarea 8. În acest caz s-au executat numai trei operaÆii de
verificare (de apartenenÆå a valorii câmpului a la un interval).
Start
Indiferent de modul în care este exploatat tabelul, algoritmul de exploatare
cuprinde urmåtorii paçi: deschiderea tabelului, prelucrarea çi închiderea.
Open
Tabelul este memorat într-un fiçier de date care are acelaçi nume ca çi
tabelul çi extensia .dbf. Pentru a se putea prelucra înregistrårile dintr-un
tabel, trebuie deschis fiçierul în care acesta este påstrat. Prin operaÆia de Prelucrare
deschidere i se alocå o zonå de memorie internå în care urmeazå så fie
transferate de pe disc înregistrårile care vor fi prelucrate. Deschiderea Close
fiçierului se face fie folosind opÆiunea de meniu Open...∈File, fie prin
intermediul comenzii:
use <nume_fiçier> Stop
Dupå ce aÆi prelucrat înregistrårile din tabel trebuie închis fiçierul. Prin
operaÆia de închidere se elibereazå zona de memorie internå alocatå fiçierului. Închiderea
fiçierului se face prin intermediul comenzii:
use
Mai puteÆi så închideÆi tabelul din fereastra View (pe care o deschideÆi cu opÆiunea View
Window∈Window). SelectaÆi numele tabelului çi executaÆi clic pe declançatorul Close.
OperaÆiile puse la dispoziÆie de Visual FoxPro pentru administrarea datelor dintr-un tabel
al bazei de date pot fi grupate astfel:
1. Crearea unui tabel care cuprinde operaÆii pentru:
9 crearea structurii tabelului,
9 manipularea structurii tabelului;
2. Exploatarea unui tabel în acces secvenÆial care cuprinde operaÆii pentru:
9 localizarea înregistrårilor prin parcurgere secvenÆialå a înregistrårilor din tabel,
9 actualizarea tabelului,
9 controlarea accesului la înregistråri,
9 consultarea tabelului;
3. Exploatarea unui tabel în acces direct care cuprinde operaÆii pentru:
9 crearea çi administrarea fiçierelor index,
9 localizarea înregistrårilor dupå valoarea unei chei.
ObservaÆie:
Toate comenzile au un domeniu implicit de acÆiune. Domeniul implicit de acÆiune poate
fi schimbat prin explicitarea cu adverbele care sunt scrise între parantezele påtrate [ ].
Utilizarea unor instrumente de prelucrare a datelor 109
adåugate din aceste fiçiere la noua structurå de tabel. PuteÆi så påstraÆi çi vechea versi-
une, redenumind fiçierele nume.bak cu nume_nou.dbf çi nume.tbk cu nume_nou.fpt.
Mai puteÆi så deschideÆi caseta de dialog çi din fereastra View. SelectaÆi numele tabelului
çi executaÆi clic pe declançatorul Properties.... În caseta de dialog Work Area
Properties executaÆi clic pe declançatorul Modify....
3. Copierea structurii tabelului:
PuteÆi så copiaÆi structura tabelului deschis:
9 Într-un tabel de structurå. Acest tabel are o structurå predefinitå. El conÆine 11
câmpuri, câte un câmp pentru fiecare proprietate a câmpului (de exemplu,
field_name pentru numele câmpului, field_type pentru tipul câmpului, field_len
pentru lungimea câmpului, field_dec pentru numårul de poziÆii ale pårÆii fracÆionare,
field_null pentru a stabili dacå se acceptå valoarea null în câmp, field_defa pentru
valoare implicitå a câmpului etc.). În tabel existå câte o înregistrare pentru fiecare
câmp (açadar, va avea atâtea înregistråri, câte câmpuri are tabelul pentru care
påstreazå structura). Sintaxa comenzii este:
copy to <nume_tabel> structure extended
unde <nume_tabel> este numele tabelului în care se va påstra structura.
9 Într-un tabel precizat prin <nume_tabel>. Pot fi copiate toate câmpurile din
structurå sau numai o parte din ele. Sintaxa comenzii este:
copy structure to <nume_tabel> [fields <listå_nume_câmpuri>]
ObservaÆie:
Pentru a vedea ce conÆin tabelele în care au fost copiate structurile, trebuie så le deschideÆi.
ObservaÆie:
Dacå într-o comandå nu se specificå numele unui tabel, înseamnå cå ea se referå la
tabelul deschis. De exemplu, comenzile list structure, modify structure etc.
4.1.3. Manipularea çi controlarea câmpurilor dintr-un tabel
Câmpurile dintr-un tabel pot fi manipulate çi controlate prin intermediul comenzilor Set çi
al funcÆiilor.
1. Prin intermediul comenzilor set se poate controla accesul la câmpuri:
9 Controlul accesului la câmpuri poate fi activat (on) sau inhibat (off) cu comanda:
set fields on|off
Valoarea implicitå este off.
9 Se pot preciza câmpurile la care poate avea acces utilizatorul cu comanda:
set fields to [<listå_câmpuri> | all]
De exemplu:
a. Se poate preciza cå utilizatorul are acces la toate câmpurile:
set fields to all
sau
set fields off
b. Se poate preciza cå utilizatorul are acces numai la câmpurile nume çi pren:
set fields to nume, pren
c. Se poate preciza cå utilizatorul nu are acces la nici un câmp:
set fields to
112 Informatică
Obiectul: realizarea bazei de date a unei companii care oferå servicii de consultanÆå.
Scopul bazei de date: gestionarea serviciilor de consultanÆå asigurate clienÆilor de cåtre
angajaÆii companiei.
Utilizarea unor instrumente de prelucrare a datelor 113
CerinÆe:
9 Fiecare angajat al companiei are o persoanå din cadrul companiei care îi monito-
rizeazå çi îi supervizeazå activitatea.
9 Atunci când un client solicitå pentru prima datå serviciile acestei companii, i se
repartizeazå un angajat care så se ocupe de el. De obicei angajatul se întâlneçte cu
clientul pânå când i se rezolvå problema.
9 În cadrul primei discuÆii, angajatul stabileçte obiectivele consultanÆei, termenele çi
costul estimativ. Aceste date se pot modifica pe parcursul desfåçurårii consultanÆei.
Toate aceste modificåri trebuie påstrate în baza de date.
9 Pentru fiecare çedinÆå de consultanÆå trebuie så se påstreze date despre modul în
care serviciile prestate de angajat îndeplinesc obiectivele consultanÆei, în conformitate
cu termenele stabilite. Pentru fiecare çedinÆå se vor înregistra urmåtoarele date: data
çedinÆei, angajatul cu care s-a întâlnit clientul, durata çedinÆei, suma facturatå pentru
çedinÆå, rezumatul modului în care a decurs întâlnirea.
9 Costul unui serviciu de consultanÆå este în funcÆie de ore. Tariful orar depinde de
angajatul care s-a ocupat de client: cu cât acesta are mai multå experienÆå, cu atât
tariful este mai mare. Pentru fiecare çedinÆå de consultanÆå se emite o notå de platå.
9 Totalul sumelor facturate prin notele de platå trebuie så fie comparate cu valoarea
estimatå pentru costul consultanÆei.
9 Unii clienÆi sunt întâmplåtori, alÆii devin permanenÆi, solicitând frecvent diferite servicii
de consultanÆå. Compania poate derula la un moment dat douå sau mai multe
contracte de consultanÆå cu acelaçi client. Pentru fiecare contract se va Æine o
evidenÆå separatå a notelor de platå.
9 Pe lângå notele de platå, baza de date trebuie så furnizeze un raport lunar al activi-
tåÆilor cu fiecare client.
9 Un angajat al companiei are mai mulÆi clienÆi, iar un client poate lucra cu mai mulÆi
angajaÆi ai companiei.
Pentru a putea råspunde la toate aceste cerinÆe, baza de date va fi formatå din urmåtoa-
13
rele tabele :
Tabelul AngajaÆi care va trebui så conÆinå urmåtoarele date (sub formå de câmpuri):
9 Identificatorul angajatului (id_ang, I). Este un numår care identificå unic angajatul çi
este folosit pentru cheia primarå.
9 Numele angajatului (nume, C, 20). Deoarece pot så aparå cåutåri în tabel çi dupå
numele angajatului, acest câmp va fi cheie de indexare împreunå cu câmpul prenume.
9 Preumele angajatului (pren, C, 20).
9 Tip angajat (tip_ang, C, 1). Acesta este un cod care foloseçte un singur caracter prin
care se identificå tipul angajatului: permanent cu normå întreagå (a), permanent cu
jumåtate de normå (b), temporar cu normå întreagå (c), temporar cu jumåtate de
normå (d), colaborator cu ora (e) sau cu angajamentul terminat (f).
13
În descrierea structurii de date a tabelelor se vor folosi pentru tipul datelor: I - integer, F - float, C
- character, M - memo, D - date, T - DateTime, L - logic. În cazul în care lungimea câmpului nu este
determinatå de tipul datelor, se va preciza çi lungimea câmpului. De exemplu, nume,C,20
înseamnå câmpul nume este de tip Character çi are lungimea 20.
114 Informatică
9 Identificatorul superiorului (id_sup, I). Este un numår care identificå angajatul cåruia îi
este subordonat. Trebuie så fie de acelaçi tip ca çi câmpul identificatorul angajatului.
deoarece superiorul este çi el angajat al companiei.
9 Data naçterii (data_n, D). Este data naçterii angajatului.
9 Data angajårii (data_a, D). Este data angajårii.
9 Data încetårii angajårii (data_i, D). Este data de la care angajatul nu mai face parte
din firmå (demisie, demitere, restrângere de activitate, pensionare etc.). El va fi
påstrat în continuare în evidenÆele companiei.
9 Tariful orar (tarif, I). Este tariful perceput clientului pentru o orå de consultanÆå
asiguratå (prestatå) de angajat.
9 Adresa angajatului (adresa, M). Deoarece adresa este un çir de caractere cu lungime
care poate varia foarte mult de la un angajat la altul, pentru a nu se risipi spaÆiul de
memorie se va folosi câmpul de tip Memo.
9 Localitatea (loc, C, 15). Deoarece compania are sucursale çi birouri de reprezentanÆå
în mai multe localitåÆi, çi angajaÆii pot avea domiciliile în mai multe localitåÆi.
9 Codul judeÆului (c_jud, C, 2). Pentru judeÆ se înregistreazå numai codul. Separat, în
tabelul JudeÆe vor fi înregistrate çi numele judeÆelor.
9 Codul poçtal (cp, C, 5). Este codul poçtal al adresei angajatului.
9 Telefonul fix (tel_f, C, 9). Este numårul telefonului fix al angajatului.
9 Telefonul mobil (tel_m, C, 9). Este numårul telefonului mobil al angajatului.
9 ObservaÆii (obs, M). ConÆine informaÆii biografice ale angajatului sau referitoare la
activitatea lui în cadrul companiei.
Tabelul ClienÆi care va trebui så conÆinå urmåtoarele date (sub formå de câmpuri):
9 Identificatorul clientului (id_cl, I). Este un numår care identificå unic clientul çi este fo-
losit pentru cheia primarå. Este de acelaçi tip ca çi câmpul id_ang din tabelul AngajaÆi.
9 Numele clientului (nume, C, 20). Deoarece pot så aparå cåutåri în tabel çi dupå
numele clientului, acest câmp va fi cheie de indexare. Este de acelaçi tip ca çi câmpul
nume din tabelul AngajaÆi.
9 Prenumele clientului (pren, C, 20). Este de acelaçi tip ca çi câmpul pren din tabelul AngajaÆi.
9 Tip client (Tip_cl, L). Câmpul va avea valoarea .T. în cazul unui client curent (are un
contract de consultanÆå în derulare).
9 Identificatorul angajatului (id_ang, I). Este un numår care identificå angajatul atribuit
clientului så se ocupe de el. Este de acelaçi tip ca çi câmpul id_ang din tabelul AngajaÆi.
9 Data intrårii (data_i, D). Este data de la care a devenit clientul companiei de consultanÆå.
9 Adresa clientului (adresa, M). Este adresa clientului. Este de acelaçi tip ca çi câmpul
adresa din tabelul AngajaÆi.
9 Localitatea clientului (loc, C, 15). Este localitatea de rezidenÆå a clientului. Este de
acelaçi tip ca çi câmpul loc din tabelul AngajaÆi.
9 Codul judeÆului (c_jud, C, 2). Este codul judeÆului de rezidenÆå al clientului. Este de
acelaçi tip ca çi câmpul c_jud din tabelul AngajaÆi.
9 Codul poçtal (cp, C, 5). Este codul poçtal al adresei clientului. Este de acelaçi tip ca çi
câmpul cp din tabelul AngajaÆi.
9 Fax (fax, C, 9). Este numårul de fax al clientului.
9 Telefonul fix (tel_f, C, 9). Este numårul telefonului fix al clientului. Este de acelaçi tip
ca çi câmpul tel_f din tabelul AngajaÆi.
9 Telefon mobil (tel_m, C, 9). Este numårul telefonului mobil al clientului. Este de
acelaçi tip ca çi câmpul tel_m din tabelul AngajaÆi.
Utilizarea unor instrumente de prelucrare a datelor 115
9 ObservaÆii (obs, M). ConÆine scurte informaÆii despre client çi relaÆiile sale cu
compania de consultanÆå.
Tabelul JudeÆe care va trebui så conÆinå urmåtoarele date (sub formå de câmpuri):
9 Codul judeÆului (c_jud, C, 2). Este folosit pentru cheia secundarå.
9 Numele judeÆului (n_jud, C, 15).
Un angajat poate så aibå mai mulÆi clienÆi, iar de un client se pot ocupa mai mulÆi
angajaÆi. Açadar, între tabelele AngajaÆi çi ClienÆi, tipul de relaÆie este de mai-multe-la-
mai-multe. Din aceastå cauzå trebuie creat un tabel intermediar Contracte, care Æine
evidenÆa contractelor de consultanÆå:
9 Identificatorul contractului (id_cont, I). Este un numår unic folosit pentru identificarea
contracului de consultanÆå.
9 Identificatorul clientului (id_cl, I) care beneficiazå de contractul de consultanÆå.
9 Tipul contractului (tip_c, C, 1). Este un cod atribuit contractului care defineçte
categoria de consultanÆå: instruire, proiectare etc.
9 ObservaÆii (obs_c, C, 254). ConÆine o scurtå descriere a contractului de consultanÆå.
9 Data începerii (data_i, D). Este data la care începe derularea contractului de consultanÆå.
9 Terminat (term_c, L). Are valoarea .T. dacå s-a încheiat consultanÆa.
Deoarece estimårile se modificå pe parcursul derulårii contractului (vor fi mai multe esti-
måri pentru acelaçi contract) çi deoarece se doreçte påstrarea unui istoric al acestor esti-
måri, ele vor fi înregistrate într-un tabel separat Estimåri care are urmåtoarea structurå:
9 Identificatorul contractului (id_cont, I). Este identificatorul contractului pentru care se
face estimarea. El va fi o cheie secundarå, propagatå din tabelul Contracte.
9 Numårul estimårii (nr_est, I). Reprezintå a câta estimare este pentru acelaçi contract.
9 Identificatorul angajatului (id_ang, I). Este identificatorul angajatului care a fåcut estimarea.
9 Obiectivul estimårii (obiectiv, C, 254). Este descrierea obiectivelor pentru aceastå
estimare a derulårii contractului. Descrierea trebuie så se facå precis çi concis.
9 Termene (term, I). Este numårul estimativ de çedinÆe în care se va derula contractul.
9 Cost estimat (cost_e, I). Este costul estimativ al contractului de consultanÆå.
9 Data estimåriii (data_e, D). Este data la care s-a fåcut estimarea.
9 Data terminårii (data_t, D). Este data estimatå pentru terminarea contractului de consultanÆå.
Dar fiecare contract de consultanÆå se desfåçoarå pe parcursul mai multor çedinÆe de
consultanÆå. Din aceastå cauzå trebuie creat un tabel intermediar ÇedinÆe care så Æinå
evidenÆa acestora çi care are urmåtoarea structurå:
9 Numårul çedinÆei (nr_s, I). Este un numår unic atribuit çedinÆei çi este folosit ca o cheie
primarå a tabelului care ajutå la identificarea unei înregistråri din tabel (a unei çedinÆe).
9 Identificatorul contractului (id_cont, I). Este identificatorul contractului pentru care se desfå-
çoarå çedinÆa de consultanÆå. Va fi o cheie secundarå propagatå din tabelul Contracte.
9 Identificatorul angajatului (id_ang, I) care s-a ocupat de aceastå çedinÆå de consultanÆå.
9 Data çedinÆei (data_s, D).
9 Durata çedinÆei (timp_s, I). Este timpul în care s-a derulat çedinÆa. Se måsoarå în minute.
9 Costul çedinÆei (cost_s, I). Se calculeazå ca produs între duratå çi tariful angajatului.
9 Rezumat (rez_s, C, 254). Este un rezumat scurt al çedinÆei, care va fi tipårit pe notele
de platå ale clientului.
9 ObservaÆii (obs_s, M). Sunt observaÆii despre modul în care a decurs çedinÆa. Sunt
folosite numai în interiorul companiei.
116 Informatică
Açadar, tabelul Contracte leagå între ele toate çedinÆele prestate pentru o consultanÆå,
iar tabelul ÇedinÆe leagå între ei clientul çi angajatul care au participat la acea çedinÆå.
Pentru serviciile prestate, compania încaseazå bani de la client. Clientul nu plåteçte o singurå
datå valoarea finalå a contractului de consultanÆå. El va face mai multe plåÆi pe parcursul de-
rulårii contractului. Din aceastå cauzå, încasarea nu va fi înregistratå în tabelul Contracte.
Clientul nu plåteçte nici la fiecare çedinÆå. Din aceastå cauzå, încasarea nu va fi înregistratå
nici în tabelul ÇedinÆe. Clientul poate så aibå cu compania mai multe contracte de consul-
tanÆå. Din aceastå cauzå, încasarea nu va fi înregistratå nici în tabelul ClienÆi. Va trebui creat
un tabel separat, tabelul Încasåri, cu urmåtoarea structurå:
9 Numårul încasårii (nr_i, I). Este un numår unic atribuit încasårii. El este folosit ca o cheie
primarå a tabelului çi ajutå la identificarea unei înregistråri din tabel (a unei încasåri).
9 Identificatorul contractului (id_cont, I). Este identificatorul contractului pentru care se
face încasarea. El va fi o cheie secundarå propagatå din tabelul Contracte.
9 Data plåÆii (data_p, D).
9 Modul plåÆii (mod_p, C,50). Se foloseçte pentru a descrie modul în care s-a fåcut plata:
numerar (chitanÆa încasårii), ordin de platå (bancå, numår), filå cec (bancå, numår) etc.
9 Valoare (valoare, I). Este valoarea încasårii çi reprezintå o parte din valoarea totalå a
consultanÆei.
9 ObservaÆii (obs_i, C, 254). Sunt detalii referitoare la obiectivul plåÆilor.
Între aceste tabele s-au stabilit urmåtoarele relaÆii:
AngajaÆi ClienÆi
JudeÆe
Contracte
Comutatoare:
Insert - insereazå
un câmp deasupra
câmpului selectat;
Delete - çterge
câmpul selectat;
Bara de stare afiçeazå informaÆii despre tabel: identificatorul tabelului, numårul de înregistråri - Records
(are valoarea 0 pentru cå nu s-au introdus date), numårul de câmpuri definite - Fields (s-au definit 16) çi
lungimea înregistrårii în octeÆi - Length (reprezintå suma lungimilor tuturor câmpurilor) .
DefiniÆi un index structural pentru acest tabel, câmpul de indexare fiind câmpurile
nume çi prenume (înregistrårile vor fi aranjate logic în ordinea alfabeticå a numelui çi
118 Informatică
prenumelui; adicå, atunci când numele este acelaçi, vor fi aranjate în ordinea
alfabeticå a prenumelui). ExecutaÆi clic pe secÆiunea Index.
În grila derulantå scrieÆi în caseta Name numele etichetei index: Nume. În stânga
acestei casete de text se gåseçte butonul cu sågeatå. Sågeata indicå ordinea de
aranjare: crescåtor ↑ sau descrescåtor ↓. VerificaÆi ca simbolul så corespundå
ordonårii crescåtoare. Dacå este necesar, schimbaÆi ordinea executând clic pe buton.
PuteÆi alege din lista ascunså Type tipul de index: Primary, Candidate, Unique sau
Regular (cheia obiçnuitå). AlegeÆi pentru acest index valoarea Regular.
Comutatoare:
Insert - insereazå un
index deasupra indexului
Tipul de index ales ScrieÆi expresia cheii de selectat;
este Regular. indexare: nume+prenume. Delete - çterge indexul
selectat;
Butonul Move care vå permite så mutaÆi un rând
care defineçte un index.
Dupå ce aÆi definit toatå structura tabelului, o salvaÆi acÆionând declançatorul Ok. Se
deschide caseta de dialog prin care sunteÆi întrebaÆi dacå vreÆi så introduceÆi date:
Input data records now? ExecutaÆi clic pe declançatorul Yes. Se deschide o fereas-
trå de editare a tabelului, de tip browse. ScrieÆi cinci înregistråri:
100, Popescu, Andrei, a, 100, 300000, 02/03/1960, 04/08/1995, / / , Str. Morilor nr. 50
sector 2, Bucuresti, B, 23451, 014567890, 092111111,
101, Andronescu, Ana, a, 100, 280000, 09/05/1958, 09/15/1996, / / , Str. Cuza Voda nr.
20 sector 1, Bucuresti, B, 23456, 012345678, 092122222,
102, Ionescu Maria, a, 100, 280000, 03/01/1961, 03/15/1998, / / , Str. Zorilor nr. 23 sector
4, Bucuresti, B, 34561, 012346789, 093189467,
200, Petrescu Radu, a, 200, 280000, 03/08/1964, 06/15/1998, / / , Soseaua
Mangalia nr. 34, Constanta, Ct, 34512, 041123123, 092134567,
201, Popescu Mihai, a, 200, 250000, 01/01/1965, 09/15/1998, / / , Str. Lujerului
nr. 56, Constanta, Ct, 34562, 041237893, 092341561,
ÎnchideÆi apoi fereastra de editare.
AflaÆi cum se numeçte câmpul din poziÆia 10 folosind funcÆia (råspunsul este cp):
?field(10)
AflaÆi ce dimensiune are înregistrarea folosind funcÆia (råspunsul este 126):
?recsize()
ÎnchideÆi tabelul folosind comanda use.
9 dintr-un alt tabel - se realizeazå fie prin intermediul opÆiunii de meniu Append
Records...∈Table, fie prin intermediul comenzii:
append from <nume_tabel> [fields <listå_câmpuri>] [for <cond>]
unde <nume_tabel> este numele tabelului din care se adaugå înregistråri. Implicit se
adaugå toate înregistrårile çi toate câmpurile din tabel, dar se poate explicita numai
adåugarea anumitor câmpuri (câmpurile precizate în lista de câmpuri a clauzei fields)
çi/sau numai a anumitor înregistråri (cele care îndeplinesc condiÆia precizatå prin
expresia <cond> a clauzei for).
2. Prin inserarea în interiorul tabelului:
9 OperaÆia se realizeazå prin comanda:
insert [before] [blank]
Implicit se insereazå o înregistrare vidå dupå înregistrarea curentå çi se deschide
fereastra de editare pentru a completa valorile câmpurilor. Explicit, inserarea se
poate face înaintea înregistrårii curente, folosind clauza before, sau se poate
insera numai o înregistrare vidå folosind clauza blank.
4.3.2. Çtergerea înregistrårilor
Se poate face prin urmåtoarele operaÆii:
9 Çtergerea logicå. OperaÆia de çtergere logicå nu înseamnå eliminarea fizicå a înregistråri-
lor din tabel, ci numai marcarea lor pentru çtergere. Înregistrårile çterse logic pot fi refå-
cute. OperaÆia se realizeazå fie prin intermediul opÆiunii de meniu Delete Records...∈
Table, fie prin intermediul comenzii:
delete [<domeniu>] [for <cond_1>] [while <cond_2>]
Implicit este çtearså logic înregistrarea curentå. Explicit poate fi çters logic un grup de
înregistråri precizat prin <domeniu> sau clauzele for sau while.
9 Refacerea înregistrårilor çterse logic. OperaÆia înlåturå marcajele pentru çtergere logi-
cå. Se realizeazå fie prin intermediul opÆiunii de meniu Recall Records...∈Table, fie prin
intermediul comenzii:
recall [<domeniu>] [for <cond_1>] [while <cond_2>]
Implicit sunt refåcute toate înregistrårile marcate logic pentru çtergere. Explicit poate fi
refåcut un grup de înregistråri precizat prin <domeniu> sau clauzele for sau while.
9 Çtergerea fizicå. OperaÆia de çtergere fizicå înseamnå eliminarea fizicå din tabel a
înregistrårilor marcate logic pentru çtergere. Înregistrårile çterse fizic nu mai pot fi refåcute.
OperaÆia se realizeazå fie prin intermediul opÆiunii de meniu Remove Deleted Records∈
Table, fie prin intermediul comenzii:
pack
9 Çtergerea fizicå a tuturor înregistrårilor. OperaÆia de çtergere fizicå a tuturor înregistrå-
rilor înseamnå eliminarea fizicå din tabel a tuturor înregistrårilor de date çi påstrarea numai
a structurii tabelului. Se realizeazå prin intermediul comenzii:
zap
Aceastå operaÆie este echivalentå cu douå operaÆii delete all çi pack.
În fereastra de editare puteÆi så marcaÆi logic pentru çtergere sau så anulaÆi marcajul cu
opÆiunea Toggle Deletion Mark∈Table sau folosind scurtåtura Ctrl+T. OpÆiunea are
Utilizarea unor instrumente de prelucrare a datelor 125
efectul unui comutator. Dacå înregistrarea nu este marcatå, o marcheazå, çi invers, dacå
este marcatå, îi anuleazå marcajul.
Controlarea operaÆiei de çtergere se face prin:
9 Comanda care stabileçte cum pot fi folosite înregistrårile çterse logic:
set deleted on | off
unde on înseamnå cå înregistrårile çterse logic nu pot fi folosite de comenzile care au
în sintaxå clauzele for çi while, iar off (implicit) înseamnå cå înregistrårile çterse logic
pot fi folosite de toate comenzile.
9 FuncÆia care testeazå dacå înregistrarea curentå este marcatå logic pentru çtergere
(valoarea .T. înseamnå cå a fost marcatå pentru çtergere):
deleted()
4.3.3. Modificarea înregistrårilor
Modificarea valorii câmpurilor din înregistråri se poate face:
9 prin valori precizate: Se poate folosi comanda replace care are sintaxa:
replace <câmp_1> with <expr_1> [additive] [,<câmp_2> with <expr_2>[additive]...]
[<domeniu>] [for <cond_1>] [while <cond_2>]
Se înlocuieçte valoarea din câmpul <câmp_1> cu valoarea obÆinutå în urma evaluårii
expresiei <expr_1>, valoarea din câmpul <câmp_2> cu valoarea obÆinutå în urma eva-
luårii expresiei <expr_2> etc. Implicit, înlocuirea se face numai în înregistrarea
curentå. Explicit, înlocuirea se poate face într-un grup de înregistråri precizat prin
<domeniu> sau clauzele for sau while.
9 interactiv, de la tastaturå: Se pot folosi comenzile edit sau browse care deschid
fereastra de editare.
Comenzile browse çi edit au urmåtoarea sintaxå:
browse | edit [fields <listå_câmpuri>] [<domeniu>] [for <cond_1>] [while <cond_2>]
[font <nume_font> [,<n>]] [style <nume_stil>] [freeze <nume_câmp>]
[last| noinit ] [noappend] [nodelete] [noedit | nomodify] [title <nume_t>] [normal]
[partition <m>] [lpartition] [nolink] [ledit] [redit]
[valid [f] <cond_3> [error <mesaj>]] [when <cond_4>] [width <p>]
Clauzele din comandå au urmåtoarea semnificaÆie:
9 fields - permite afiçarea numai a câmpurilor precizate în <listå_câmpuri>. Lista de
câmpuri poate conÆine nume de câmpuri din tablou sau câmpuri calculate. Separarea
în listå se face prin virgulå. Fiecårui câmp i se poate asocia o opÆiune. OpÆiunile sunt:
:R - câmpul poate fi vizualizat dar nu poate fi modificat;
:V = <cond> - câmpul introdus este evaluat prin expresia logicå <cond>. Dacå
valoarea expresiei este T., data din câmp este corectå, altfel se afiçeazå un
mesaj de eroare.
:F - se verificå o regulå de validare atunci când trece cursorul prin câmp (fårå
modificare). OpÆiunea se poate folosi împreunå cu opÆiunea :V.
:E= <mesaj> - Mesajul de eroare standard produs de introducerea unei valori
invalide în câmp poate fi modificat cu mesajul <mesaj> de tip çir de carac-
tere. OpÆiunea se poate folosi împreunå cu opÆiunea :V.
126 Informatică
AdåugaÆi înregistråri:
use angajati Se deschide tabelul AngajaÆi care conÆine deja cinci înregistråri.
append Se deschide fereastra de editare. AdåugaÆi cinci înregistråri.
use judete Se deschide tabelul JudeÆe care nu conÆine înregistråri.
append AdåugaÆi numai înregistrarea pentru Bucureçti.
browse fields c_jud:v=isalpha(left(c_jud,1)) and isalpha(right(c_jud,1))
:e='cod gresit':h='cod judet', n_jud:h='nume_judet'
ExecutaÆi clic pe opÆiunea Append Mode ∈View (puteÆi så adåugaÆi
înregistråri çi în fereastra de editare de tip Browse). AdåugaÆi restul în-
registrårilor în fereastra Browse. VerificaÆi mesajele de eroare care
apar atunci când nu scrieÆi codul judeÆului format din douå litere.
use angajati Se deschide tabelul AngajaÆi care conÆine zece înregistråri.
copy structure to ang CopiaÆi structura tabelului într-un tabel nou ang.
use ang Se deschide tabelul Ang care nu conÆine înregistråri.
append blank (de 5 ori) Se adaugå cinci înregistråri vide.
browse În fereastra de editare sunt afiçate cele 5 înregistråri vide.
128 Informatică
replace all tip_ang with 'a' Se completeazå pentru toÆi angajaÆii câmpul tip_ang cu 'a'.
goto top PoziÆionaÆi pointerul la începutul tabelului, deoarece comanda replace all
l-a pozÆionat la sfârçitul tabelului.
replace next 3 id_sup with 300, loc with 'Buzau', c_jud with 'Bz',tel_f with '038'
Primii trei angajaÆi sunt din Buzåu çi sunt subordonaÆi aceleiaçi
persoane. Pentru numårul de telefon se scrie prefixul pentru Buzåu.
Pointerul de înregistrare va fi poziÆionat pe înregistrarea 3.
skip Salt la urmåtoarea înregistrare (înregistrarea 4)
replace rest id_sup with 100, loc with 'Bucuresti', c_jud with 'B',tel_f with '01'
Ultimii doi angajaÆi sunt din Bucureçti çi sunt subordonaÆi aceleiaçi
persoane. Pentru numårul de telefon se scrie prefixul pentru Bucureçti.
Pointerul de înregistrare va fi poziÆionat pe înregistrarea 5.
browse În fereastra de editare completaÆi cu valori restul câmpurilor.
use angajati Se deschide tabelul AngajaÆi.
append from ang for c_jud='B'
Se adaugå din tabelul Ang la sfârçitul tabelului, angajaÆii din Bucureçti.
append from ang for c_jud='Bz'
Se adaugå din tabelul Ang la sfârçitul tabelului, angajaÆii din Buzåu.
browse DeschideÆi fereastra de editare. ObservaÆi cum s-au executat operaÆiile.
use clienti Se deschide tabelul ClienÆi.
browse Nu conÆine nici o înregistrare.
appen blank (de 6 ori) AdåugaÆi 6 înregistråri vide.
browse Se completeazå pentru toate înregistrårile codul clientului çi codul
angajatului care se ocupå de el.
replace for id_ang>=100 and id_ang<200 loc with 'Bucuresti', c_jud with 'B', tel_f with '01',
fax with '01'
Se completeazå pentru clienÆii de care se ocupå angajaÆii din Bucureçti
localitatea, codul judeÆului çi prefixul pentru telefon çi fax.
replace for id_ang>=200 and id_ang<300 loc with 'Constanta', c_jud with 'Ct',
tel_f with '041', fax with '041'
Se completeazå pentru clienÆii de care se ocupå angajaÆii din Constan-
Æa localitatea, codul judeÆului çi prefixul pentru telefon çi fax.
replace for id_ang>=300 and id_ang<400 loc with 'Buzau', c_jud with 'Bz', tel_f with '038',
fax with '038'
Se completeazå pentru clienÆii de care se ocupå angajaÆii din Buzåu
localitatea, codul judeÆului çi prefixul pentru telefon çi fax.
brow CompletaÆi restul câmpurilor.
ÇtergeÆi înregistråri:
delete for lower(c_jud)='ct'
browse Înregistrårile din judeÆul ConstanÆa sunt marcate logic pentru çtergere.
set deleted on
browse Înregistrårile marcate logic pentru çtergere nu mai sunt afiçate.
set deleted off
browse Înregistrårile marcate logic pentru çtergere sunt afiçate.
PoziÆionaÆi cursorul pe o înregistrare marcatå logic pentru çtergere.
?deleted()
.T. PoziÆionaÆi cursorul pe o înregistrare care nu este marcatå pentru çtergere.
?deleted()
.F.
recall for lower(c_jud)='ct'
RefaceÆi înregistrårile marcate logic pentru çtergere.
delete record 1 MarcaÆi logic pentru çtergere înregistrarea 1.
set deleted on
browse Înregistrarea 1 nu este afiçatå în fereastra de editare.
recall record 1 RefaceÆi înregistrarea marcatå logic pentru çtergere.
browse Înregistrarea 1 este afiçatå în fereastra de editare.
set deleted off
4 . 4 . C o n s u l t a r e a t a be l u l u i
Bazele de date se construiesc pentru a obÆine informaÆii într-un timp mai scurt. Informa-
Æiile obÆinute dintr-un tabel pot fi:
1. Detaliate - sub forma unor liste:
Se pot folosi comenzile list sau display . Sintaxa lor este:
list | display [ [fields] <listå_câmpuri>]
[<domeniu>] [for <cond_1>] [while <cond_2>]
[to printer | to file <nume_fiçier>] [noconsole] [off]
Deosebirile dintre comanda list çi display sunt:
Utilizarea unor instrumente de prelucrare a datelor 129
ÇtergeÆi înregistråri:
delete for lower(c_jud)='ct'
browse Înregistrårile din judeÆul ConstanÆa sunt marcate logic pentru çtergere.
set deleted on
browse Înregistrårile marcate logic pentru çtergere nu mai sunt afiçate.
set deleted off
browse Înregistrårile marcate logic pentru çtergere sunt afiçate.
PoziÆionaÆi cursorul pe o înregistrare marcatå logic pentru çtergere.
?deleted()
.T. PoziÆionaÆi cursorul pe o înregistrare care nu este marcatå pentru çtergere.
?deleted()
.F.
recall for lower(c_jud)='ct'
RefaceÆi înregistrårile marcate logic pentru çtergere.
delete record 1 MarcaÆi logic pentru çtergere înregistrarea 1.
set deleted on
browse Înregistrarea 1 nu este afiçatå în fereastra de editare.
recall record 1 RefaceÆi înregistrarea marcatå logic pentru çtergere.
browse Înregistrarea 1 este afiçatå în fereastra de editare.
set deleted off
4 . 4 . C o n s u l t a r e a t a be l u l u i
Bazele de date se construiesc pentru a obÆine informaÆii într-un timp mai scurt. Informa-
Æiile obÆinute dintr-un tabel pot fi:
1. Detaliate - sub forma unor liste:
Se pot folosi comenzile list sau display . Sintaxa lor este:
list | display [ [fields] <listå_câmpuri>]
[<domeniu>] [for <cond_1>] [while <cond_2>]
[to printer | to file <nume_fiçier>] [noconsole] [off]
Deosebirile dintre comanda list çi display sunt:
130 Informatică
average tarif for tip_ang='a' Se afiçeazå media aritmeticå a tarifului pentru angajaÆii per-
manenÆi cu normå întreagå (tip 'a').
average tarif for tip_ang<>'a' Se afiçeazå media aritmeticå a tarifului pentru angajaÆii care nu
sunt permanenÆi cu normå întreagå (tip diferit de 'a').
NumåraÆi înregistråri:
Prin numårarea înregistrårilor care corespund unui criteriu, puteÆi så aflaÆi câÆi angajaÆi
îndeplinesc acel criteriu:
count for id_sup=100 Se numårå çi se afiçeazå câÆi angajaÆi sunt subordonaÆi anga-
jatului cu identificatorul 100.
count for id_sup=100 to v Se numårå câÆi angajaÆi sunt subordonaÆi angajatului cu identi-
ficatorul 100 çi rezultatul se påstreazå în variabila de memorie v
?v al cårui conÆinut se afiçeazå ulterior.
count for lower(c_jud)='ct' Se numårå çi se afiçeazå câÆi angajaÆi sunt din ConstanÆa.
count for tarif > 250000 Se numårå çi se afiçeazå câÆi angajaÆi au tariful mai mare decât
250000 lei.
AfiçaÆi liste:
În liste puteÆi så afiçaÆi anumite câmpuri precizate prin lista de câmpuri çi anumite
înregistråri precizate prin domeniu sau clauzele for sau while:
list nume, pren, data_n for month(data_n)=03
Se afiçeazå numele, prenumele çi data naçterii pentru toÆi angajaÆii nåscuÆi în
luna martie.
list for id_sup=100
Se afiçeazå toate câmpurile pentru angajaÆii subordonaÆi angajatului cu codul 100.
list nume, pren, id_ang for id_sup=100
Se afiçeazå numele, prenumele çi identificatorul pentru angajaÆii subordonaÆi
angajatului cu codul 100.
list nume, pren, id_ang for id_sup=id_ang
Se afiçeazå numele, prenumele çi identificatorul pentru angajaÆii care nu sunt
subordonaÆi altor angajaÆi.
display nume, pren, id_ang for id_sup=id_ang
list id_ang, nume, pren to file alfa
Lista, care conÆine numai câmpurile cu identificatorul angajatului, numele çi
prenumele pentru toÆi angajaÆii, este copiatå într-un fiçier.
dir alfa.* Se afiçeazå lista fiçierelor care au numele alfa din directorul curent. Fiçierul în
care s-a transferat lista are extensia .txt.
type alfa.txt Se afiçezå conÆinutul fiçierului alfa.txt care conÆine lista.
TestaÆi modul în care sunt tratate înregistrårile çterse logic:
Controlul se face prin parametrul deleted:
delete for lower(c_jud)='ct' Se marcheazå pentru çtergere logicå înregistrårile
angajaÆilor din ConstanÆa.
set deleted on Se atribuie parametrului deleted valoarea on.
display Se afiçeazå înregistrarea curentå cu comanda display.
list Se afiçeazå toate înregistrårile cu comanda list.
display all Se afiçeazå toate înregistrårile cu comanda display all.
set deleted off Se atribuie parametrului deleted valoarea off.
display Se afiçeazå înregistrarea curentå cu comanda display.
132 Informatică
4 . 5 . S o r t a r e a t a b e l u lu i
În urma sortårii unui tabel se creeazå un alt tabel în care înregistrårile sunt rearanjate
conform criteriului de sortare folosit. OperaÆia acÆioneazå asupra tabelului deschis.
Sintaxa comenzii este:
sort to <nume_tabel> on <câmp_1> [/a | /d] [ /c] [, <câmp_1> [/a | /d] [ /c].... ]
[ascending | descending] [<domeniu>] [for <cond_1>] [while <cond_2>]
[fields <listå_câmpuri>]
Forma implicitå a comenzii este:
sort to <nume_tabel> on <câmp>
Utilizarea unor instrumente de prelucrare a datelor 133
unde <nume_tabel> este numele tabelului obÆinut în urma sortårii tuturor înregistrårilor din
tabelul deschis, iar <câmp> este numele câmpului folosit pentru cheia de sortare. Sortarea
se face în ordinea crescåtoare a câmpului cheie de sortare. Tabelul sortat va avea aceeaçi
structurå ca çi tabelul surså. Explicit, se pot sorta din tabelul surså numai înregistrårile
precizate prin <domeniu> sau clauzele for sau while çi pot fi folosite mai multe chei de
sortare <câmp_1>, <câmp_2> etc. Sortarea se poate face descrescåtor, dupå toatå lista de
câmpuri cheie de sortare folosind clauza descending, sau poate fi controlatå ordinea de
sortare la nivelul fiecårui câmp, folosind adverbele /a - crescåtor, /d - descrescåtor sau /c -
fårå så se Æinå cont de diferenÆa dintre literele mari sau mici. Tabelul sortat poate så conÆinå
numai câmpurile precizate prin lista din clauza fields.
4 . 6 . I n d e x a r e a t a b e lu l u i
Pentru a putea exploata un tabel în acces direct, trebuie organizat astfel încât så aveÆi
acces direct la o înregistrare în funcÆie de valoarea unui câmp sau a unor câmpuri care
vor forma cheia de acces. SoluÆia este de ordonare logicå a înregistrårilor prin interme-
diul fiçierelor index, iar cheia de acces se mai numeçte cheie de indexare.
Visual FoxPro permite crearea a douå tipuri de fiçiere de index pe lângå indexul structural:
9 index simplu care conÆine o singurå cheie de indexare într-un fiçier (numele diferit
de al tabelului çi extensia idx),
9 index compus care conÆine mai multe chei de indexare (etichete index) într-un
fiçier (numele diferit de al tabelului çi extensia cdx).
Cheia de indexare poate fi formatå dintr-un singur câmp sau din mai multe câmpuri legate
printr-o expresie de concatenare. Din aceastå cauzå, dacå nu sunt de tip çir de caractere,
câmpurile trebuie convertite într-un çir de caractere cu ajutorul funcÆiilor de conversie. Am
notat cp1 - câmpul 1, cp2 - câmpul 2 çi e(cp1,cp2) - expresia formatå din cele douå câmpuri.
tip cp1 tip cp2 cp1 convertit cp2 convertit e(cp1,cp2)
C C cp1 cp2 cp1+cp2
C N cp1 str(cp2) cp1+ str(cp2)
C D cp1 dtos(cp2) cp1+ dtos(cp2)
C T cp1 ttoc(cp2) cp1+ ttoc(cp2)
N N str(cp1) str(cp2) str(cp1)+ str(cp2)
N D str(cp1) dtos(cp2) str(cp1)+ dtos(cp2)
N T str(cp1) ttoc(cp2) str(cp1)+ ttoc(cp2)
D D dtos(cp2) dtos(cp2) dtos(cp1)+ dtos(cp2)
D T dtos(cp2) ttoc(cp2) dtos(cp1)+ ttoc(cp2)
T T ttoc(cp2) ttoc(cp2) ttoc(cp1)+ ttoc(cp2)
Câmpurile logice çi memo nu pot fi folosite în cheia de indexare.
4.6.1. Crearea unui index
Dacå indexul compus structural se creeazå împreunå cu tabelul, ceilalÆi indecçi se
creeazå dupå ce a fost creat tabelul, prin comanda:
index on <expresie_index>
to <nume_fiçier.idx> | tag <nume_etichetå> [of <nume_fiçier.cdx>]
[for <cond_1>] [ascending | descending] [additive]
134 Informatică
FuncÆia testeazå dacå existå o înregistrare care are cheia de indexare egalå cu expresia
<expresie>. Dacå o gåseçte, poziÆioneazå pointerul pe aceastå înregistrare çi furnizeazå
valoarea .T., altfel poziÆioneazå pointerul la sfârçitul fiçierului çi furnizeazå valoarea .F..
SortaÆi tabele:
DeschideÆi tabelul AngajaÆi. SortaÆi acest tabel dupå urmåtoarele criterii:
use angajati Se deschide tabelul AngajaÆi.
browse Se afiçeazå conÆinutul tabelului în fereastra de editare.
sort on nume, pren to a1
Se sorteazå tabelul dupå câmpurile nume çi pren. Rezultatul sortårii este în tabelul a1.
sort on id_ang to a2
Se sorteazå tabelul dupå câmpul id_ang. Rezultatul sortårii este în tabelul a2.
sort on id_sup to a3
Se sorteazå tabelul dupå câmpul id_sup. Rezultatul sortårii este în tabelul a3.
sort on loc, id_ang to a4
Se sorteazå tabelul dupå câmpurile loc çi id_ang. Rezultatul sortårii este în tabelul a4.
use a1 Se deschide tabelul a1.
list nume, pren, id_ang, id_sup, loc
browse Înregistrårile sunt aranjate alfabetic dupå valoarea câmpurilor nume çi pren. Pentru
acelaçi nume, sunt ordonate alfabetic dupå prenume.
use a2 Se deschide tabelul a2.
list nume, pren, id_ang, id_sup, loc
browse Înregistrårile sunt aranjate crescåtor dupå valoarea câmpului id_ang.
use a3 Se deschide tabelul a3.
list nume, pren, id_ang, id_sup, loc
browse Înregistrårile sunt aranjate crescåtor dupå valoarea câmpului id_ang.
use a4 Se deschide tabelul a4.
list nume, pren, id_ang, id_sup, loc
browse Înregistrårile sunt aranjate alfabetic dupå localitate. Pentru aceeaçi localitate, sunt
aranjate în ordinea crescåtoare a identificatorului de angajat.
IndexaÆi tabele:
use judete S-a deschis tabelul JudeÆe.
modify structure
În caseta de dialog Table Designer, deschideÆi secÆiunea Index. ObservaÆi cå pentru acest
tabel nu s-a definit la creare nici un index structural.
index on c_jud tag cod of judete
S-a definit un index structural. ConÆine o singurå etichetå cod, iar cheia de indexare a
etichetei este câmpul c_jud (codul judeÆului).
modify structure
În caseta de dialog Table Designer, deschideÆi secÆiunea Index. ObservaÆi cå indexul
definit este de tip Regular. SchimbaÆi tipul în Candidate.
list Înregistrårile sunt afiçate în ordinea alfabeticå a codului judeÆului.
browse În fereastra de editare, înregistrårile sunt afiçate în ordinea alfabeticå a
codului judeÆului.
seek 'ct' Cautå înregistrarea pentru care codul judeÆului este ct.
?iif (found(),n_jud, 'nu a gasit')
136 Informatică
# ÎncercaÆi:
R åspunsuri:
Adevårat/Fals: 1-F; 2-A; 3-F; 4-F; 5-F; 6-A; 7-F; 8-A; 9-A; 10-F.
CompletaÆi: 1-etichete index; 2-create table; 3-modify structure; 4-câmpuri; 5-fcount; 6-reccount;
7-locate; 8-fields; 9-avg(); 10-set order to
AlegeÆi råspunsurile corecte: 1-b; 2-b; 3-c; 4-b; 5-a,b,c; 6-b; 7-c; 8-a; 9-b; 10-b.
138 Informatică
se vor închide toate bazele de date deschise, toate tabelele încorporate în bazele de date
sau libere çi toate fiçierele asociate exploatårii bazelor de date care erau deschise în acel
moment.
5.2.2. Deschiderea çi închiderea tabelelor
Pentru a folosi un tabel din baza de date, el trebuie deschis. Pentru a administra mai
multe tabele din baza de date, fiecare dintre ele trebuie så fie deschis. Pentru a putea
deschide mai multe tabele, Visual FoxPro foloseçte mecanismul zonelor de lucru.
O zonå de lucru este o zonå de memorie care se asociazå unui tabel la deschiderea lui.
Pot fi folosite peste 30.000 de zone de lucru. În zona de lucru se påstreazå informaÆii
despre tabelul deschis în acea zonå:
9 identificatorul fiçierului în care este memorat tabelul,
9 structura fiçierului,
9 numårul de înregistråri din fiçier,
9 contorul înregistrårii curente etc.
Identificarea unei zone de lucru se face prin numårul såu 1, 2, 3, ... 30.000. Primele
zece zone de lucru se pot identifica çi prin literele alfabetului: a,b, ...,j. La deschiderea
tabelului, acestuia i se poate atribui un alias, adicå un nume cu care puteÆi så identificaÆi
tabelul çi componentele sale în timpul operaÆiilor de exploatare.
Deschiderea unui tabel într-o zonå de lucru se face cu comanda:
use <nume_tabel> in <zona> [alias <nume_alias>] [again]
unde <zona> este identificatorul zonei în care se deschide tabelul, iar <nume_alias> este
un nume atribuit pentru alias. Dacå acest nume nu se precizeazå, sistemul îi atribuie
implicit un alias: numele tabelului (numele fiçierului în care este påstrat tabelul) dacå
tabelul este deschis într-o singurå zonå sau numårul zonei, dacå tabelul este deschis în
mai multe zone. Dacå vreÆi så deschideÆi acelaçi tabel în mai multe zone de lucru, folosiÆi
clauza again începând de la a doua operaÆie de deschidere. Dacå precizaÆi pentru
<zona> valoarea 0, tabelul va fi deschis în prima zonå de lucru disponibilå (liberå).
La un moment dat, într-o zonå de lucru nu poate fi deschis decât un singur tabel. Dacå în
zona respectivå este deschis deja un tabel, el trebuie închis în prealabil.
Indiferent de câte zone de lucru folosiÆi, la un moment dat una singurå dintre ele este
zona de lucru activå (curentå). Zona de lucru curentå este zona la care se referå
implicit o comandå în care nu se precizeazå explicit numele tabelului (comanda va
acÆiona asupra tabelului din zona de lucru activå). La începutul sesiunii de lucru, zona de
lucru activå este zona 1.
Schimbarea zonei de lucru curente se face cu comanda:
select <zona>
unde <zona> poate fi precizatå prin numårul såu sau prin aliasul sau numele tabelului
deschis în aceastå zonå.
Alocarea unei zone de lucru unui tabel se poate face la deschiderea lui prin clauza in sau
prin selectarea zonei de lucru înainte de deschiderea tabelului. Comanda:
use <nume_tabel> in <zona>
este echivalentå cu grupul de comenzi:
select <zona> use <nume_tabel>.
142 Informatică
Grupul de butoane
radio din care alegeÆi
tabele (Tables) sau
vizualizåri (Views).
DeschideÆi pe rând toate tabelele din baza de date: fie executaÆi dublu clic în fereastra
Database Designer pe fiecare tabel pentru a deschide fereastra de editare a tabelului çi
implicit tabelul, fie în fereastra View executaÆi clic pe declançatorul Open çi în caseta de
144 Informatică
dialog Open executaÆi clic pe rând pe numele fiecårui tabel din lista Tables in Database.
DeschideÆi pe rând, începând cu zona 1 çi terminând cu zona 5 tabelele: Customer,
Products, Orditems, Orders çi Employee.
Dupå ce aÆi deschis tabelele, ele vor fi afiçate în fereastra View. SelectaÆi pe rând fiecare
tabel din listå. În bara de stare a ferestrei vor fi afiçate informaÆii despre tabelul selectat:
numårul zonei de lucru çi numårul total de înregistråri. ÎnchideÆi fereastra de comenzi.
display database
Se vor afiça numele bazei de date, calea fiçierului bazå de date, versiunea çi, pentru
fiecare tabel adåugat la baza de date, numele, calea fiçierului çi structura de câmpuri.
AfiçaÆi informaÆii despre tabelele din baza de date cu comanda:
display tables
Se va afiça lista cu numele tabelelor çi cåile fiçierelor.
AdåugaÆi la baza de date un tabel nou cu comanda :
create contracte
Se deschide fereastra Table Designer, care spre deosebire de cea afiçatå la crearea
unui tabel liber, conÆine controale noi. De exemplu, pentru câmpul tip_c puteÆi defini o
regulå de validare care så nu permitå introducerea în câmp decât a uneia dintre
valorile: 'e'-evaluare, 'i' - instruire, 'p'-proiect. Regula de validare poate fi exprimatå
prin una dintre urmåtoarele condiÆii logice: lower(tip_c)='i' or lower(tip_c)='p' or
lower(tip_c)='e' sau inlist (lower(tip_c),'i','p','e'). DefiniÆi structura tabelului çi indecçii.
ObservaÆi cå între tabelul JudeÆe çi tabelele AngajaÆi çi ClienÆi nu s-au stabilit încå
relaÆii. În tabelele AngajaÆi çi ClienÆi cheia c_jud nu poate fi declaratå cheie candidat,
deoarece existå mai multe înregistråri cu aceeaçi valoare a cheii (mai mulÆi angajaÆi çi
clienÆi din acelaçi judeÆ). Açadar, se poate stabili o relaÆie de tip una-la-mai multe între
tabelul JudeÆe çi tabelul AngajaÆi, respectiv ClienÆi.
Utilizarea unor instrumente de prelucrare a datelor 147
Deoarece tabelele din baza de date trebuie gestionate împreunå, trebuie asiguratå inte-
gritatea referenÆialå. DefiniÆi pentru fiecare relaÆie regula de integritate referenÆialå astfel:
în fereastra Database Designer executaÆi dublu clic pe o relaÆie. Se deschide caseta de
dialog Edit Relationship în care executaÆi clic pe declançatorul Referential Integrity....
Se deschide caseta de dialog Referential Integrity Builder care conÆine trei secÆiuni:
# ÎncercaÆi:
R åspunsuri:
Adevårat/Fals: 1-A; 2-F; 3-A; 4-A; 5-F.
CompletaÆi: 1-Database Designer; 2-validate database; 3-set database to; 4-close databases;
5-modify database.
AlegeÆi råspunsul corect: 1-a; 2-c; 3-b; 4-b; 5-a.
Utilizarea unor instrumente de prelucrarea datelor 149
6.1. Interogările
Interogarea este operaÆia prin care extrageÆi date din baza de date fårå så le çtergeÆi sau
så le modificaÆi çi pe care le afiçaÆi într-un anumit format. Extragerea se face în funcÆie de
un anumit criteriu numit criteriu de interogare. Acesta trebuie så defineascå datele pe
care vreÆi så le extrageÆi: numele câmpurilor, tabelele din care fac parte, criteriile prin care
se extrag înregistrårile çi în ce ordine sunt pezentate. Interogarea este scopul bazei de
date. Când un utilizator interogheazå baza de date, el pune de fapt o întrebare: „Ce date
din baza de date îndeplinesc aceste condiÆii?". Folosind o interogare puteÆi:
9 så combinaÆi înregistråri din mai multe tabele într-un singur tabel,
9 så selectaÆi numai înregistrårile care îndeplinesc un anumit criteriu,
9 så afiçaÆi înregistrårile în ordinea doritå,
9 så afiçaÆi câmpuri calculate.
Interogårile pot afiça înregistråri din mai multe tabele. Dacå relaÆia dintre cele douå tabele
este de una-la-mai-multe, interogarea va afiça pe mai multe rânduri câmpurile corespun-
zåtoare înregistrårilor din al doilea tabel (mai-multe) legate de o singurå înregistrare din
primul tabel (una), iar în aceste rânduri se vor repeta câmpurile din primul tabel.
150 Informatică
Pentru operaÆia de interogare, orice sistem de gestiune a bazelor de date are implemen-
tate diferite instrumente prin care så se comunice sistemului criteriul de interogare.
Unul dintre aceste instrumente este limbajul SQL, care este limbajul standard de
interogare.
În Visual FoxPro puteÆi crea o interogare:
9 interactiv folosind generatorul de interogåri (Query Designer);
1
9 prin limbajul de comandå SQL (instrucÆiunea select ).
În urma operaÆiei de creare, interogarea este salvatå într-un fiçier cu extensia .qpr care
conÆine specificaÆiile criteriului de interogare. Acest fiçier este un fiçier de tip ASCII în care
se memoreazå comanda SQL asociatå. Deoarece fiçierul conÆine o comandå SQL, pentru
a o executa trebuie så lansaÆi în execuÆie fiçierul cu comanda:
do <nume_fiçier>.qpr
AÆi våzut cå operatorul relaÆional select aplicat pe un tabel creeazå un alt tabel care conÆi-
ne submulÆimi de date din tabelul surså. Açadar çi rezultatul unei interogåri va fi tot un
tabel, care va conÆine datele specificate de criteriul de interogare. DestinaÆia interogårii
(destinaÆia datelor din tabelul obÆinut) poate fi:
9 fereastra de editare Browse,
9 diagrama (graph),
9 ecranul (screen),
9 raportul (report),
9 tabelul permanent (table) sau temporar (cursor).
Açadar, interogarea se aplicå pe mai multe tabele ale bazei de date numite tabele surså,
iar rezultatul unei interogåri este un tabel numit tabel destinaÆie; modificårile fåcute în
tabelul destinaÆie nu se reflectå çi în tabelele surså.
Parametrii folosiÆi în construirea unei interogåri sunt:
9 Câmpurile (fields) din tabelele bazei de date (tabelele surså). Se recomandå så se
preia din tabelele surså numai câmpurile strict necesare.
9 Legåtura (join) dintre tabelele bazei de date (tabelele surså). Pe lângå legåturile
stabilite între tabele în cadrul bazei de date, care vor fi preluate automat, se mai pot
stabili noi legåturi cu tabele care nu au fost legate la baza de date. Dacå definiÆi douå
legåturi între tabele, le puteÆi lega cu operatorii logici or sau and.
9 Filtrul (filter) prin care se precizeazå condiÆiile de filtrare, adicå modul în care vor fi
selectate datele din tabelele bazei de date. Un criteriu de selecÆie sau de filtrare
trebuie så precizeze câmpul sau expresia care conÆine câmpul, operatorul relaÆional çi
valoarea cu care se comparå. Pot fi definite mai multe criterii de filtrare legate între ele
prin operatorii logici or sau and (ordinea de evaluare este and çi apoi or).
9 Ordonarea (order by) prin care se precizeazå ordinea în care vor fi prezentate rezul-
tatele interogårii (în tabelul destinaÆie). Ordinea este datå de un criteriu de ordonare
determinat de un câmp din tabel sau de mai multe criterii de ordonare determinate de
mai multe câmpuri. În acest caz, un criteriu de ordonare este luat în consideraÆie numai
dacå cele definite anterior au aceeaçi valoare a câmpurilor pentru douå înregistråri.
1
Este diferitå de comanda select folositå pentru selectarea unei zone de lucru.
Utilizarea unor instrumente de prelucrarea datelor 151
9 Gruparea (group by) prin care se precizeazå un criteriu de grupare a datelor. Acest
criteriu este dat de cheia de grupare formatå din unul sau mai multe câmpuri ale
tabelului. Conform acestei chei, înregistrårile care au aceeaçi valoare a cheii de
grupare vor fi cumulate în tabelul destinaÆie într-o singurå înregistrare, în care fiecare
câmp numeric va fi calculat prin însumarea valorilor corespunzåtoare câmpului din
toate înregistrårile grupului. Mai pot fi definite çi criterii de selecÆie la nivel de grup
prin care se precizeazå condiÆia pe care trebuie så o îndeplineascå grupul de înre-
gistråri pentru a face parte din tabelul destinaÆie. CondiÆia este precizatå prin câmpul
sau expresia care conÆine câmpul, operatorul relaÆional çi valoarea cu care se comparå.
6.2. Vizualizările
Vizualizårile sunt tabele virtuale, construite pe baza datelor din tabelele bazei de date, care
pot fi legate prin relaÆii çi care permit modificarea lor de cåtre utilizator. Açadar, dacå în
cazul unei interogåri utilizatorul poate vedea numai un rezultat, în cazul vizualizårii
utilizatorul poate interveni çi poate modifica valoarea datelor. Orice modificare fåcutå într-o
vizualizare se va regåsi çi în tabelul real al bazei de date. Când se creeazå o vizualizare, se
pune de fapt întrebarea: „Cu ce date din baza de date poate interacÆiona utilizatorul?".
Construirea unei vizualizåri constå, ca çi în cazul unei interogåri, în extragerea anumitor
date din baza de date, pe baza unui criteriu. Rezultatul va fi memorat în fiçierul bazei de
date (.dbc). De aceea, pentru a folosi o vizualizare, trebuie deschiså mai întâi baza de
date çi apoi vizualizarea, ca orice tabel din baza de date.
Açadar, vizualizarea este o structurå de date, la fel ca çi tabelele bazei de date, iar
interogarea este un fiçier care conÆine o comandå çi care trebuie lansat în execuÆie
la fel ca orice fiçier de program.
Dacå în cazul interogårilor datele circulå într-un singur sens, de la tabelele bazei de date
la formatul ales pentru afiçare, în cazul vizualizårilor ele pot circula în ambele sensuri
între tabelele bazei de date çi vizualizare.
Vizualizårile se pot construi cu constructorul de vizualizåri (View Designer).
Vizualizarea foloseçte, pe lângå parametrii întâlniÆi la interogåri, urmåtorii parametri:
9 Câmpurile cheie. Aceste câmpuri sunt alese astfel încât så identifice unic relaÆia
dintre vizualizare çi tabelele surså. Pentru fiecare tabel surså trebuie så se defineascå
unul sau mai multe câmpuri cheie care så identifice unic fiecare înregistrare din acel
tabel.
9 Câmpurile actualizate çi câmpurile neactualizate. Acest parametru stabileçte
modul în care se transmit datele între vizualizare çi tabelele surså. Astfel, dacå în
vizualizare se face modificarea într-un câmp actualizat, modificarea va fi transmiså çi
în tabelele surså, altfel, dacå modificarea se face într-un câmp nemodificat, ea nu se
va transmite çi cåtre tabelele surså.
6.3. Rapoartele
Raportul este o colecÆie de informaÆii obÆinute din datele stocate în tabelele bazei de date,
prezentate utilizatorului într-o formå cât mai clarå çi mai conciså. El poate fi tipårit la
152 Informatică
imprimantå sau afiçat pe ecran çi prezintå un set de date legate între ele, preluate din
tabelele bazei de date. Permite descrierea elementelor care pot så aparå: textul afiçat
deasupra coloanelor, câmpurile din coloane, la care pot fi adåugate çi alte texte sau
imagini grafice (linii, chenare, imagini bitmap sau vectoriale etc.). Raportul nu modificå
datele din tabele. El parcurge secvenÆial înregistrårile din tabele pentru:
9 obÆinerea unor date sintetice: subtotaluri çi totaluri,
9 obÆinerea unor rezumate,
9 gruparea datelor pe mai multe niveluri, fiecare nivel cu propriile sale informaÆii
sintetice çi rezumate,
9 analize complexe çi grafice.
În general, raportul este conceput sub forma unui tabel. În plus are çi funcÆia de sortare çi
grupare a datelor. Raportul se compune din:
9 SecÆiunea de date (Detail) conÆine date care se repetå pentru fiecare înregistrare.
9 Antetul paginii (Page Header) defineçte elementele care trebuie så aparå în partea
de sus a fiecårei pagini a raportului.
9 Subsolul paginii (Page Footer) defineçte elementele care trebuie så aparå în partea
de jos a fiecårei pagini a raportului.
9 Antetul raportului (Report Header sau Title) apare numai pe prima paginå a
raportului. El este ca un titlu pentru întregul raport çi poate conÆine texte çi imagini (de
exemplu sigla firmei).
9 Subsolul raportului (Report Footer sau Summary) apare numai pe ultima paginå a
raportului çi cuprinde de obicei un rezumat al datelor din diferite secÆiuni ale raportului.
9 Grupul (Group). Un raport poate prezenta conÆinutul unui tabel sau al mai multor
tabele din baza de date. Aceste date pot fi grupate dupå diferite criterii çi totalizate la
nivel de grup. În linia totalului pot fi inserate totaluri ale unor câmpuri, adicå date în
care sunt cumulate valorile aceluiaçi câmp pentru întreg grupul de înregistråri. Pot fi
definite mai multe niveluri de grupare. Pentru fiecare nivel trebuie definit un criteriu
de grupare caracterizat printr-o expresie care este evaluatå la fiecare înregistrare.
Dacå existå un singur nivel de grupare, numårul de grupuri va fi egal cu numårul de
valori diferite ale cheii de grupare.
9 Antetul grupului (Group Header) afiçeazå un titlu al grupului (criteriul de grupare).
9 Subsolul grupului (Group Footer) afiçeazå date sintetice despre grup.
Raportul conÆine informaÆii utile personalului care are atribuÆii de conducere în cadrul
organizaÆiei. În funcÆie de nivelul de conducere pentru care se produce raportul,
cantitatea de date prezentatå diferå. La nivelul inferior de conducere, nivelul operaÆional,
la care personalul de conducere are rolul de a monitoriza çi a controla activitåÆile zilnice
ale angajaÆilor, rapoartele trebuie så fie detaliate çi så conÆinå informaÆii specifice despre
activitåÆile zilnice (de exemplu rapoartele de încasåri).
La nivelul mediu de conducere (director tehnic, director de vânzåri, director de resurse
umane etc.) ele trebuie så conÆinå mai puÆine detalii çi mai multe treceri în revistå,
rezumate çi analize ale datelor din istoric. Aceste date trebuie så-i ajute så planifice çi så
controleze operaÆiile çi så implementeze strategii care trebuie så fie bine formulate çi
argumentate. De exemplu, aceste rapoarte pot prezenta un rezumat al activitåÆilor
(încasårile rezultate din contractele de consultanÆå cu un client, încasårile rezultate
Utilizarea unor instrumente de prelucrarea datelor 153
CreaÆi o interogare
Interogarea trebuie så råspundå la urmåtoarea întrebare: „Ce angajaÆi (identificaÆi prin
nume, prenume çi numele judeÆului) au tariful cuprins între 260.000 çi 300.000?". Afiçarea
se va face într-o fereastrå de editare Browse.
Fiçierul în care veÆi salva interogarea va fi a1.qry.
DeschideÆi baza de date Compania cu
comanda: open database compania.
AlegeÆi opÆiunea New∈File. Se deschide case-
ta de dialog New în care din grupul de butoane
cu opÆiuni File Type activaÆi butonul Query
dupå care executaÆi clic pe butonul New File.
Se deschide caseta de dialog Add Table or
View. Din lista Tables in Database selectaÆi
mai întâi tabelul AngajaÆi çi executaÆi clic pe
butonul Add Table din bara de instrumente
Query Designer, apoi selectaÆi tabelul JudeÆe
çi executaÆi clic pe butonul Add Table.
Se deschide fereastra generatorului de interogåri Query Designer. În partea
superioarå este afiçat un panou care conÆine tabelele care au fost selectate din baza
de date pentru a face parte din interogare. Fiecare tabel este reprezentat într-o fe-
154 Informatică
reastrå redimensionabilå în care sunt afiçate câmpurile çi indecçii tabelului. Dacå între
tabele existå legåturi, sunt afiçate çi acestea. Pe lângå aceste legåturi definite deja în
baza de date, puteÆi crea noi legåturi fie glisând un câmp index de la tabelul surså la
tabelul destinaÆie, fie prin intermediul obiectelor din caseta de dialog Join Condition pe
care o deschideÆi executând dublu clic pe butonul Add Join din bara de instrumente
Query Designer. În partea inferioarå este afiçat un panou cu mai multe secÆiuni:
9 Selection Criteria - conÆine controale pentru a stabili criteriul de selectare a
înregistrårilor. Criteriul poate conÆine anumite valori ale unui câmp çi condiÆii
pentru legåturile temporare dintre tabele.
9 Fields - conÆine controale pentru a stabili câmpurile din tabel sau câmpurile
calculate care vor fi afiçate de interogare.
9 Order By - conÆine controale pentru a stabili câmpurile din tabel sau câmpurile
calculate care vor determina ordinea de afiçare în interogare.
9 Group By - conÆine controale pentru a stabili modul în care vor fi grupate
înregistrårile afiçate de interogare.
DeschideÆi secÆiunea Fields. În lista Available Fields sunt afiçate câmpurile disponi-
bile în tabelele selectate. SelectaÆi din aceastå listå grupul de câmpuri AngajaÆi.nume,
AngajaÆi.pren, AngajaÆi.tarif çi JudeÆe.n_jud (executaÆi clic pe numele câmpului cu
tasta Ctrl apåsatå). ExecutaÆi apoi clic pe declançatorul Add>. Câmpurile selectate
vor fi copiate în lista cu câmpurile selectate pentru a fi afiçate - Selected Output. În
secÆiune mai puteÆi folosi urmåtoarele controale: butoanele Add All>> (copiazå toate
câmpurile din tabele în lista Selected Output), <Remove (înlåturå câmpul selectat),
çi <<Remove All (înlåturå toate câmpurile din lista Selected Output) precum çi
caseta combinatå Functions/Expressions prin care puteÆi defini câmpurile calculate.
Bara de instrumente Query Designer conÆine urmåtoarele butoane:
1 Add Table Adaugå un tabel nou la interogare.
2 Remove Table Înlåturå tabelul selectat din interogare. Implicit vor fi înlåturate câmpurile,
criteriile de selectare, criteriile de sortare çi criteriile de grupare definite de
câmpurile din acest tabel.
3 Add Join Adaugå noi legåturi între tabelele interogårii.
4 Show the SQL Deschide fereastra de editare în care este afiçatå comanda SQL asociatå
Window interogårii definite interactiv.
5 Maximize the Maximizeazå panoul cu tabele. Panoul cu secÆiuni nu va mai fi afiçat.
table Window
6 Query Deschide o casetå de dialog care conÆine controale pentru a alege destinaÆia
Destination interogårii: o fereastrå Browse, ecranul, o diagramå etc.
DeschideÆi secÆiunea Selection Criteria. ExecutaÆi dublu clic pe butonul Condition.
Se deschide caseta de dialog Join Condition în care este afiçatå condiÆia care
defineçte legåtura dintre cele douå tabele. Deoarece legåtura este realizatå prin douå
câmpuri de tip çir de caractere, pentru a evita unele nepotriviri din cauza scrierii cu
litere mari sau cu litere mici a aceluiaçi cod de judeÆ, activaÆi comutatorul Ignore
Upper/Lower Case. ÎnchideÆi caseta de dialog. VeÆi observa cå în urma acestei
operaÆii, s-a activat în grilå comutatorul Case corespunzåtor condiÆiei.
În grila afiçatå în secÆiune adåugaÆi criteriul pentru selectarea înregistrårilor:
tarif>260000 and tarif<300000. Pentru aceasta executaÆi clic pe declançatorul
Insert, alegeÆi din lista ascunså Field Name numele câmpului AngajaÆi.tarif, din lista
ascunså Criteria operatorul More Than çi scrieÆi în caseta de text Example valoarea
Utilizarea unor instrumente de prelucrarea datelor 155
260000. ExecutaÆi din nou clic pe declançatorul Insert, alegeÆi din lista Field Name
din nou numele câmpului AngajaÆi.tarif, din lista Criteria operatorul Less Than çi
scrieÆi în caseta de text Example valoarea 300000. Cele douå condiÆii au fost
adåugate în grilå. CondiÆiile sunt legate implicit prin operatorul logic and. Dacå
trebuie schimbat operatorul logic and cu or se executå clic pe declançatorul Add Or.
Dacå vreÆi så schimbaÆi ordinea în care sunt afiçate condiÆiile în grilå selectaÆi condiÆia
pe care vreÆi så o mutaÆi çi executaÆi clic pe butonul ¦ (Mover Box). Dacå vreÆi så
înlåturaÆi o condiÆie, o selectaÆi în grilå çi executaÆi clic pe declançatorul Remove.
1 2 3 4 5 6
condiÆia pentru
legåtura dintre tabele
lista câmpurilor
butonul din interogare
Condition
DeschideÆi secÆiunea Order By pentru a stabili ordinea în care vor fi afiçate înregis-
trårile. SelectaÆi, din lista Selected Output care afiçeazå câmpurile din interogare,
câmpurile AngajaÆi.nume çi AngajaÆi.pren dupå care acÆionaÆi declançatorul Add>. Câm-
purile vor fi adåugate în lista Ordering Criteria. În grupul de butoane radio Order
Options este activat butonul Ascending (ordinea alfabeticå a numelui çi prenu-
melui). Ordinea câmpurilor din cheia de sortare este AngajaÆi.nume çi Angaja1i.pren,
adicå ordinea din lista Ordering Criteria (ordinea este datå de ordinea de adåugare
la aceastå listå). Dacå vreÆi så înlåturaÆi un criteriu de sortare, îl selectaÆi în lista
Ordering Criteria çi acÆionaÆi declançatorul <Remove.
DeschideÆi secÆiunea Group By numai pentru a identifica controalele, deoarece
interogarea nu conÆine grupuri de înregistråri. În secÆiune sunt douå liste Available
Fields (câmpurile disponibile) din care puteÆi selecta câmpul folosit pentru cheia de
grupare, lista Group By Fields în care vor fi afiçate cheile de grupare, declança-
toarele Add> çi <Remove cu care puteÆi adåuga sau înlåtura chei de grupare. Prin
acÆionarea declançatorului Having... se deschide caseta de dialog Having prin
intermediul cåreia puteÆi stabili criterii de selecÆie la nivelul unui grup.
156 Informatică
ModificaÆi interogarea astfel încât rezultatul så fie afiçat pe ecran. DeschideÆi inte-
rogarea pentru modificare, fie cu opÆiunea Open∈File, fie cu comanda:
modify query c:\vfp\a1.qpr
Se deschide fereastra generatorului de interogåri Query Designer. ExecutaÆi clic pe
butonul Query Destination din bara de instrumente. Se deschide caseta de dialog
Query Destination în care executaÆi clic pe butonul Screen. VizualizaÆi comanda
SQL asociatå acestei interogåri. ExecutaÆi clic pe butonul Show the SQL Window
din bara de instrumente. Se deschide fereastra de editare care afiçeazå comanda
SQL, la care observaÆi cå a fost adåugatå opÆiunea to screen. ÎnchideÆi fereastra de
editare a comenzii. ÎnchideÆi fereastra generatorului cu salvare.
AfiçaÆi rezultatul interogårii cu comanda: do a1.qri
Utilizarea unor instrumente de prelucrarea datelor 157
CreaÆi o vizualizare
Vizualizarea trebuie så råspundå la urmåtoarea întrebare: „Cu ce date din baza de date
poate interacÆiona utilizatorul pentru angajaÆii (identificaÆi prin nume, prenume, vârstå çi
numele judeÆului) care au tariful cuprins între 260.000 çi 300.000?". Utilizatorului i se va
permite så interacÆioneze doar cu câmpul tarif.
DeschideÆi baza de date Compania.
AlegeÆi opÆiunea New∈File. Se deschide caseta de dialog New în care din grupul de
butoane cu opÆiuni File Type activaÆi butonul View, dupå care executaÆi clic pe
butonul New File.
Se deschide caseta de dialog Add Table or View. Din acest moment veÆi urma
aceiaçi paçi pe care i-aÆi executat atunci când aÆi creat o interogare. Bara de
instrumente View Designer conÆine primele cinci butoane din bara Query Designer.
Fereastra generatorului de vizualizåri conÆine în plus secÆiunea Update Criteria. Prin
intermediul controalelor din aceastå secÆiune puteÆi stabili câmpurile cheie (câmpurile
care realizeazå legåtura între vizualizare çi tabelele surså) çi câmpurile actualizate
(câmpurile a cåror modificare se transmite çi cåtre tabelele surså). DeschideÆi aceastå
secÆiune pentru a stabili parametrii vizualizårii. Lista Field Name conÆine lista câmpu-
rilor din vizualizare disponibile pentru actualizare, din tabelul AngajaÆi. Se stabilesc mai
întâi câmpurile cheie (care vor identifica unic relaÆia vizualizare-tabel surså). Aceste
158 Informatică
câmpuri sunt nume çi pren. Se selecteazå fiecare dintre aceste câmpuri çi se activeazå
comutatorul pentru câmpul cheie. Se pot stabili acum câmpurile care pot fi actualizate
(ele nu pot fi câmpuri cheie). Singurul câmp care a mai råmas este câmpul tarif. Îl vom
marca pentru actualizare fie executând clic pe comutatorul de actualizare din dreptul
såu din lista Field Name, fie executând clic pe declançatorul Update All. Actualizarea
câmpului marcat se poate face în douå moduri, pe care le stabiliÆi cu butoanele radio
Update using: prin çtergerea vechilor înregistråri çi reinserarea celor modificate (SQL
DELETE then INSERT) sau prin scrierea modificårilor direct în înregistrare (SQL
UPDATE). ActivaÆi butonul radio SQL UPDATE. ActivaÆi comutatorul Send SQL
updates (dacå vreÆi ca aceste actualizåri så se çi realizeze). SalvaÆi vizualizarea sub
numele a1.
DeschideÆi vizualizarea (ca pe un tabel cu comanda use).
AfiçaÆi vizualizarea în fereastra de editare Browse (cu comanda browse). FaceÆi
modificåri în câmpurile vizualizårii.
coloana de comutatoare
pentru câmpuri actualizate
coloana de comutatoare
pentru câmpuri cheie
DeschideÆi tabelul AngajaÆi. AfiçaÆi conÆinutul acestui tabel într-o fereastrå browse.
ObservaÆi ce modificåri fåcute în vizualizare se regåsesc în tabel.
ÎnchideÆi baza de date.
CreaÆi un raport
Se construieçte un raport în care se prezintå situaÆia încasårilor cu subtotaluri pentru
fiecare contract.
DeschideÆi baza de date Compania.
AlegeÆi opÆiunea New∈File. Se deschide caseta de dialog New în care, din grupul de
butoane cu opÆiuni File Type, activaÆi butonul Report, dupå care executaÆi clic pe
butonul New File. Se deschide fereastra generatorului de rapoarte care este
Utilizarea unor instrumente de prelucrarea datelor 159
împårÆitå în mai multe benzi, fiecare bandå reprezentând o zonå din raport. PuteÆi
modifica dimensiunea unei zone pe verticalå, glisând bara delimitatoare a zonei.
DefiniÆi mediul de date al raportului (tabelele din care preia datele). AlegeÆi opÆiunea
Data Environment...∈View. Se deschide fereastra care este vidå.
AlegeÆi opÆiunea Add...∈ Data Environment. Se deschide caseta de dialog Add
Table or View. AlegeÆi din listå tabelul Încasåri. ReluaÆi operaÆia çi alegeÆi din listå
tabelul Contracte. Tabelele çi relaÆia dintre ele vor fi adåugate în fereastrå.
AdåugaÆi în fereastra generatorului de rapoarte benzile pentru antetul çi subsolul
raportului. AlegeÆi opÆiunea Title/Summary...∈ Report. Se deschide caseta de dialog
Title/Summary în care activaÆi comutatorul Title band pentru antetul raportului çi
comutatorul Summary band pentru subsolul raportului.
StabiliÆi caracteristicile caracterelor din raport. AlegeÆi opÆiunea Default Font...∈
Report. AlegeÆi în caseta de dialog Font fontul Arial.
1 2 3 4 5 6 7 8
1 Select Object Selecteazå un obiect.
2 Label Activeazå scrierea textului.
3 Field Activeazå inserarea unui câmp
4 Line Activeazå trasarea unei linii.
5 Rectangle Activeazå trasarea unui dreptunghi.
6 Rounded Rectangle Activeazå trasarea unui dreptunghi cu colÆuri rotunjite.
7 Data Grouping Permite gruparea datelor.
8 Report Controls Toolbar Activeazå bara cu instrumente Report Controls.
ScrieÆi titlul raportului. ExecutaÆi clic pe instrumentul Label, executaÆi clic în banda
pentru antetul raportului în locul în care vreÆi så scrieÆi titlul çi scrieÆi: SituaÆia
încasårilor pe contracte. ExecutaÆi clic în banda de antet de paginå çi scrieÆi titlurile
coloanelor: Nr. încasare, Nr. contract, Client, Data çi Valoare.
AdåugaÆi la raport câmpurile care vor fi afiçate. ExecutaÆi clic pe instrumentul Field.
ExecutaÆi apoi clic în banda Detail, sub titlul coloanei Nr. încasare în poziÆia în care
vreÆi så aparå valoarea câmpului. Se deschide caseta de dialog Report Expression.
ExecutaÆi clic pe butonul Expression çi se deschide caseta de dialog Expression
160 Informatică
Builder în care alegeÆi din lista Fields câmpul Încasåri.nr_i. ReluaÆi operaÆia pentru
câmpurile Încasåri.id_cont, Contracte.id_cl, Încasåri.data_p, Încasåri.valoare.
CreaÆi grupuri de înregistråri dupå numårul contractului.
AlegeÆi opÆiunea Data Grouping...∈Report. Se deschide caseta de dialog Data
Grouping în care veÆi defini un singur nivel pentru grup. ExecutaÆi clic pe butonul
primului grup. Se deschide caseta de dialog Expression Builder în care alegeÆi din
lista Fields câmpul Încasari.id_cont.
DefiniÆi totalul la nivelul raportului çi subtotal la nivelul fiecårui grup pentru câmpul
valoare. ExecutaÆi clic pe instrumentul Field. ExecutaÆi apoi clic în banda Group, sub
câmpul Valoare. Se deschide caseta de dialog Report Expression. ExecutaÆi clic pe
butonul Expression çi din caseta de dialog Expression Builder alegeÆi câmpul
incasari.valoare. În caseta de dialog Report Expression executaÆi clic pe butonul
Calculations.... Se deschide caseta de dialog Subtotal or Calculate Field în care
activaÆi în grupul de butoane radio Subtotal or Calculate butonul Sum. ReluaÆi
aceleaçi operaÆii çi pentru banda subsolului de raport.
SalvaÆi raportul sub numele a1. ÎnchideÆi caseta de dialog. În fereastra Command
este afiçatå comanda cu care a fost creat raportul: create report.
PrevizualizaÆi raportul cu comanda:
report form a1 preview.
PuteÆi modifica raportul cu comanda:
modify report a1.
VeÆi modifica raportul astfel: deoarece câmpurile pentru numårul contractului çi pentru
identificatorul clientului se repetå la nivelul grupului, veÆi adåuga aceste date în antetul
grupului çi le veÆi scoate din secÆiunea de date a raportului.
PuteÆi tipåri un raport cu comanda:
Report form <nume_fiçier> [heading <exp_C>] [summary]
[<domeniu>][for <expL1>][ while <expL2>][to printer | to file <nume_fiçier>]
unde clauza heading permite afiçarea unui antet suplimentar la începutul fiecårei pagini,
iar clauza summary inhibå afiçarea rândurilor cu date
çi afiçeazå numai rândurile cu totaluri çi subtotaluri.
Utilizarea unor instrumente de prelucrarea datelor 161
Import
Append from
tabel al bazei de date alt tip de fiçier
Copy to
Export
Utilizarea unor instrumente de prelucrarea datelor 163
3. CreaÆi un raport cu evidenÆa çedinÆelor. ÇedinÆele vor fi grupate dupå numårul contractului çi
pentru acelaçi contract vor fi afiçate în ordine cronologicå. AfiçaÆi subtotaluri la nivel de grup
çi un total la nivel de raport pentru durata çedinÆelor çi pentru costul çedinÆelor.
4. ImportaÆi fiçierele cu texte cl1.text, ..., cl5.txt în tabele. VizualizaÆi conÆinutul acestor tabele.
5. ExportaÆi tabelul ClienÆi într-o foaie de calcul Excel. VizualizaÆi conÆinutul foii de calcul.
6. ImportaÆi foaia de calcul într-un tabel. VizualizaÆi
conÆinutul tabelului.
# ÎncercaÆi:
Adevårat/Fals:
1. Prin intermediul interogårii puteÆi face modificåri în tabelele bazei de date.
2. Prin intermediul unei vizualizåri puteÆi modifica orice câmp din tabelele bazei de date.
3. Folosind interogarea puteÆi stabili o ordine de afiçare a înregistrårilor.
4. Folosind interogarea puteÆi combina înregistråri din mai multe tabele.
5. PuteÆi insera date dintr-un tabel al bazei de date într-un document Word.
6. PuteÆi exporta un tabel Visual FoxPro într-un tabel FoxPro for MS-DOS.
7. Comanda copy to alfa.txt delimited with ! va exporta datele din tabel într-un fiçier de
tip text în care câmpurile din tabel vor fi separate de semnul !.
CompletaÆi:
1. Criteriul de interogare este salvat într-un fiçier sub formå de ..........................…………
2. Vizualizarea este salvatå într-un fiçier sub formå de ..........................…………
3. ObÆineÆi rezultatul unei interogåri cu comanda ..............................................
4. PuteÆi construi interactiv un raport folosind ....................................
5. Datele din câmpurile înregistrårii vor fi inserate în raport în banda............................
6. Pentru a obÆine în urma exportului dintr-un tabel un fiçier text în care câmpurile sunt
separate prin tabulatori folosiÆi clauza.............................
7. PuteÆi introduce o imagine într-un câmp de tip General folosind ....................
RåspundeÆi:
1. Ce este o interogare a bazei de date?
2. Ce este o vizualizare a bazei de date?
R åspunsuri:
Adevårat/Fals: 1-F; 2-F; 3-A; 4-A; 5-A; 6-A; 7-F.
CompletaÆi: 1-comandå SQL; 2-tabel; 3-do; 4-generatorul de rapoarte; 5-Detail; 6-delimited with
tab; protocolul OLE.
Utilizarea unor instrumente de prelucrare a datelor 165
8. Tablouri de memorie
Visual FoxPro permite crearea çi manipularea structurilor de date de tip tablou de
memorie care, în acest sistem au urmåtoarele caracteristici:
9 Se pot crea numai tablouri cu o singurå dimensiune (vectori) sau cu douå dimensiuni
(matrice).
9 Tablourile de memorie Visual FoxPro sunt tablouri neomogene.
9 La creare, elementele tabloului sunt iniÆializate cu valoarea logicå .F.
9 La un moment dat, în memoria internå gestionatå de Visual FoxPro se pot crea
maxim 65.000 de tablouri de memorie, iar un tablou de memeorie poate avea
65.000 de elemente.
ObservaÆii:
9 Nu existå nici o diferenÆå între comenzile declare çi define (existå ambele comenzi
pentru a crea compatibilitate cu versiunile anterioare de limbaje de comandå specifi-
ce sistemelor de gestiune a bazelor de date compatibile dBase).
9 Printr-o comandå pot fi definite mai multe tablouri de memorie identificate prin nume
<nume_tablou1>, <nume_tablou2>, .... Tablourile definite pot fi atât de tip vector,
cât çi de tip matrice.
9 Comenzile au un singur adverb: lista de tablouri de memorie care se definesc.
Separarea tablourilor în listå se face prin virgulå. Pentru fiecare tabel se precizeazå
numele çi numårul de elemente dupå o dimensiune, dacå se defineçte un vector
(<expN11>, <expN21>, ...), respectiv numårul de elemente dupå douå dimensiuni,
dacå se defineçte o matrice (<expN11> çi <expN12>, <expN21> çi <expN22>, ...).
Dupå ce aÆi definit structura tabloului, puteÆi identifica orice element din tablou astfel:
pentru vectori : <nume_tablou>(<expN>), unde <expN> reprezintå numårul de ordine al
elementului în cadrul vectorului;
pentru matrice : <nume_tablou>(expN1,<expN2>), unde identificarea elementului se
face prin numårul liniei <expN1> çi numårul coloanei <expN2>. Elementele unei
matrice se pot identifica çi prin numårul de ordine. æinând cont cå în Visual FoxPro o
matrice se memoreazå în ordinea liniilor çi dacå notåm cu n numårul de linii ale matricei,
cu m numårul de coloane, iar cu i çi j cei doi indici ai unui element, atunci numårul de
ordine al unui element va fi m×(i-1)+j.
b. Atribuirea de valori elementelor se poate face în douå moduri:
Se atribuie aceeaçi valoare tuturor elementelor cu ajutorul comenzii store care
are sintaxa:
store <exp> to <nume_tablou>
Se atribuie câte o valoare fiecårui element folosind operaÆia de atribuire:
<element_tablou>= <exp>
sau comanda store care are sintaxa:
store <exp> to <element_tablou>
Utilizarea unor instrumente de prelucrare a datelor 167
1
Numele funcÆiilor folosite pentru operaÆii cu tablouri de memorie încep cu litera a (array).
168 Informatică
b. Çtergerea unui element (pentru vectori) sau a unei linii/coloane (pentru matrice) se
face folosindu-se funcÆia adel(): adel(<nume_tablou>,<expN>[,2]) , unde argumentele
çi rezultatul furnizat au aceeaçi semnificaÆie ca çi la funcÆia ains(). FuncÆia nu modificå
dimensiunea tabloului. Elementele care urmeazå poziÆiei, respectiv liniei sau coloanei
çterse vor fi deplasate spre începutul tabloului, iar ultimul element, respectiv ultima linie
sau coloanå va fi iniÆalizatå cu valoarea .F..
Replace
Gather
memoria internå memoria externå
(set de variabile de memorie) (câmpuri dintr-o înregistrare din tabel)
Scatter
Scatter
Copy to array
ObservaÆie:
Comanda Copy to array cere ca tabloul så fie creat anterior spre deosebire de comanda
Scatter care îçi creeazå singurå tabloul de memorie.
Sintaxa comenzilor:
a. Comanda save to: salveazå variabilele de memorie çi tablourile descrise prin <sablon>
într-un fiçier pentru variabile de memorie (extensia .mem) specificat prin <nume_fisier>
sau într-un câmp memo al tabelului activ specificat prin clauza to memo çi identificat
prin nume <nume_câmp>:
save to <nume_fisier>| to memo <nume_câmp> [all like | except <sablon>]
b. Comanda restore from: restaureazå variabilele de memorie çi tablourile dintr-un fiçier
pentru variabile de memorie specificat prin <nume_fisier> sau într-un câmp memo al
tabelului activ specificat prin clauza to memo çi identificat prin nume <nume_câmp>:
restore from <nume_fisier>| to memo <nume_câmp> [additive]
c. Comanda scatter copiazå datele din
câmpurile înregistrårii curente ale ta- ?
belului activ într-un tablou de memorie
1. În ce ordine se copiazå datele din
identificat prin <nume_tablou> sau într-
câmpurile tabelului în tabloul de memorie?
un set de variabile de memorie, caz 2. Ce se întâmplå dacå numårul de câmpuri
specificat prin clauza memvar. care trebuie copiate este mai mare decât
Variabilele de memorie vor avea numårul de elemente din tabel?
acelaçi nume ca çi câmpurile care se
copiazå. Implicit se copiazå toate câmpurile, mai puÆin câmpurile memo. Explicit se pot
172 Informatică
copia numai câmpurile din lista de câmpuri a clauzei fields çi se pot copia çi câmpurile
memo dacå se precizeazå clauza memo. Clauza blank semnificå faptul cå se creeazå
tabloul de memorie, respectiv setul de variabile de memorie de acelaçi tip çi lungime ca
çi câmpurile, dar în loc så se transfere în ele datele din câmpuri, acestea vor fi vide.
scatter [fields <listå_câmpuri>] [memo] to <nume_tablou> | to <nume_tablou> blank |
memvar | memvar blank
d. Comanda gather copiazå în câmpurile înregistrårii curente a tabelului activ, datele dintr-
un tablou de memorie identificat prin <nume_tablou> sau dintr-un set de variabile de
memorie, caz specificat prin clauza memvar. Variabilele de memorie trebuie så aibå
acelaçi nume ca çi câmpurile. Ele pot fi create cu comanda scatter memvar blank, dupå
care li se pot atribui valori. Dacå pentru un câmp nu existå o variabilå de memorie cu
acelaçi nume, câmpul råmâne neschimbat. Copierea dintr-un tablou de memorie se face
secvenÆial, în fiecare câmp copiindu-se un element al tabloului, pânå când se terminå
elementele din tablou sau pânå când se terminå câmpurile din înregistrare. Implicit
transferul se face în toate câmpurile, mai puÆin câmpurile memo. Explicit transferul se
poate face numai în câmpurile precizate în lista de câmpuri a clauzei fields çi se pot
copia çi câmpurile memo dacå se precizeazå clauza memo.
gather from <nume_tablou> | memvar [fields <listå_câmpuri>] [memo]
e. Comanda copy to array încarcå într-un tablou de memorie creat anterior, identificat prin
<nume_tablou>, datele din câmpurile tabelului activ. Dacå tabloul este de tip vector, se
copiazå numai câmpurile din înregistrarea curentå, iar dacå tabloul este de tip matrice, se
încarcå în fiecare linie a matricei câmpurile dintr-o înregistrare. Dacå existå mai multe
elemente decât câmpuri, restul elementelor råmâne neschimbat, iar dacå existå mai multe
câmpuri decât elemente, câmpurile care nu mai încap nu se copiazå. Dacå existå mai
multe linii decât înregistråri, restul de linii råmâne neschimbat, iar dacå existå mai multe
înregistråri decât linii, înregistrårile care nu mai încap nu se copiazå. Implicit se transferå
toate câmpurile dintr-o înregistrare. Explicit se transferå numai în câmpurile precizate în lista
de câmpuri a clauzei fields. Implicit se transferå toate înregistrårile din tabelul activ. Explicit
se transferå numai înregistrårile precizate prin <domeniu> sau clauzele for sau while.
copy to array <nume_tablou> [fields <listå_câmpuri>] [<domeniu>]
[for <expL1>][while < expL2>][<nooptimize>]
f. Comanda append from array adaugå la sfârçitul tablelului activ înregistråri cu date
preluate dintr-un tablou de memorie identificat prin <nume_tablou>. Dacå tabloul de
memorie este de tip vector, se adaugå o singurå înregistrare astfel: dacå existå mai multe
elemente decât câmpuri, restul elementelor din tablou sunt ignorate, iar dacå sunt mai
multe câmpuri decât elemente, restul câmpurilor se iniÆalizeazå cu elementul neutru
pentru acel tip de datå. Dacå tabloul este de tip matrice, se copiazå în câte o înregistrare
câte o linie a matricei. Linia matricei este tratatå la fel ca un tablou de tip vector. Implicit
se transferå date în toate câmpurile înregistrårii. Explicit se transferå numai în câmpurile
precizate în lista de câmpuri a clauzei fields. Implicit se transferå toate liniile din tablou.
Explicit se transferå numai liniile precizate prin clauza for. Dacå tipul elementului din
tablou nu corespunde cu tipul câmpului în care se transferå, se încearcå transformarea
acelui tip de datå, care poate så reuçeascå sau nu. De exemplu, o datå de tip numeric,
logic sau datå calendaristicå poate fi transformatå într-o datå de tip çir de caractere, iar o
Utilizarea unor instrumente de prelucrare a datelor 173
datå de tip datå calendaristicå poate fi transformatå într-o datå de tip numeric. O datå de
tip çir de caractere nu poate fi transformatå într-o datå de tip numeric, iar o datå de tip
numeric nu poate fi transformatå într-o datå de tip datå calendaristicå.
append from array <nume_tablou> [fields <listå_câmpuri>] [for <expL>]
3 b(2,1)=10
? aelement(b, asubscript(b,11,1), b(2,2)=20
asubscript(b,11,2)) b(2,3)=30
11 b(2,4)=40
? ascan(b,40) b(2,5)=50
9 ? adel(b,3,2)
? asubscript(b, ascan(b,40),1) 1
2 display memory like b
? asubscript(b, ascan(b,40),2) a fost çtearså coloana 3 çi
1 elementele din ultima coloanå -
? ascan(b,'azi') b(1,5) çi b(2,5) - au valoarea .F.
1 ? ains(b,3,2)
? ascan(b,'zi') 1
0 display memory like b
? ascan(b,date()) a fost inseratå coloana 2 çi
3 elementele din aceastå coloanå
? ascan(b,.T.) -b(1,3) çi b(2,3)- au valoarea .F.
4 b(1,3)=date()
b(2,3)=30
7. ActualizaÆi tablourile de memorie:
display memory like a 8. CopiaÆi tablouri de memorie în alte
elementele a(9) çi a(10) au tablouri de memorie:
valoarea .F. declare d(20)
? ains(a,3) declare e(5)
1 ? acopy(b,d)
display memory like a 10
elementele a(3) çi a(10) au display memory like d
valoarea .F. elementele tabloului b au fost
a(3)='nou' copiate în primele 10 elemente
display memory like a ale tabloului d; restul elemen-
? adel(a,5) telor din d au valoarea .F.
1 ? acopy(b,c)
display memory like a 10
elementele a(9) çi a(10) au display memory like d
valoarea .F. s-a creat tabloul de memorie c
? adel(a,15) care are 10 elemente; elemen-
mesaj de eroare (depåçirea tele tabloului b au fost copiate
rangului indicelui): "Subscript is în tabloul c
outside defined range" ? acopy(b,e)
? ains(a,15) mesaj de eroare (depåçirea
acelaçi mesaj de eroare (depå- rangului indicelui)
çirea rangului indicelui) ? acopy(b,e,1,5)
declare b(2,5) 5
display memory like b display memory like e
? ains(b,3,1) s-au copiat în vectorul e prime-
acelaçi mesaj de eroare (depå- le 5 elemente din matricea b
çirea rangului indicelui) (prima linie)
? ains(b,2,1) ? acopy(b,a,6,5,4)
1 5
display memory like b display memory like a
elementele din ultima linie a s-au copiat în vectorul a, înce-
matricei au valoarea .F. pând de la elementul a(4) pânå
Utilizarea unor instrumente de prelucrare a datelor 175
12. TransformaÆi matricea a într-o matrice cu 2 linii çi 5 coloane. AfiçaÆi conÆinutul matricei.
13. ComparaÆi numårul de linii ale matricei a cu variabila de memorie ak1. ComparaÆi
numårul de coloane ale matricei a cu variabila de memorie ak2. ComparaÆi numårul de
elemente ale matricei a cu variabila de memorie al.
14. AfiçaÆi valoarea elementului 9 din matricea a. AfiçaÆi valoarea elementului 10 din
matricea a.
15. TransformaÆi matricea a într-un vector cu 10 elemente.
16. RefaceÆi datele din matricea iniÆialå a.
17. SortaÆi descrescåtor vectorul a. AfiçaÆi conÆinutul vectorului sortat.
18. TransformaÆi vectorul a într-o matrice cu 2 linii çi 4 coloane. AfiçaÆi conÆinutul matricei.
19. SortaÆi creascåtor matricea a dupå coloana 3 începând cu prima linie. AfiçaÆi conÆinutul
acestei matrice.
20. TransformaÆi matricea a într-un vector cu 10 elemente. AfiçaÆi conÆinutul acestui vector.
21. SortaÆi crescåtor vectorul a. AfiçaÆi conÆinutul acestui vector.
22. CreaÆi printr-o singurå comandå structura vectorului c cu 5 elemente çi a vectorului d
cu 2 elemente.
23. Folosind datele din matricea a, atribuiÆi elementelor din vectorul c valorile 6, 7, ..., 10,
iar elementelor din vectorul d valorile 3 çi 8. AfiçaÆi conÆinutul celor doi vectori.
24. TransformaÆi vectorul a într-o matrice cu 3 linii çi 5 coloane. AfiçaÆi conÆinutul matricei.
25. ÇtergeÆi linia 2 a matricei a. TransformaÆi matricea a într-o matrice cu 2 linii çi 5 coloane.
AfiçaÆi conÆinutul acestei matrice.
26. TransformaÆi matricea a într-o matrice cu 2 linii çi 6 coloane. AfiçaÆi conÆinutul acestei
matrice. InseraÆi o coloanå vidå în coloana 3. AfiçaÆi conÆinutul acestei matrice.
27. TransformaÆi matricea a într-o matrice cu 2 linii çi 5 coloane. RefaceÆi matricea iniÆialå a.
AfiçaÆi conÆinutul matricei. InseraÆi o coloanå vidå în coloana 3. AfiçaÆi conÆinutul matricei.
28. ÇtergeÆi coloana 3 din matricea a. AfiçaÆi conÆinutul matricei a.
29. CåutaÆi valoarea 6 în matricea a. CåutaÆi valoarea 8 în vectorul c.
30. RefaceÆi matricea iniÆialå a. CåutaÆi valoarea 6 în matricea a.
31. CreaÆi structura a doi vectori cu 5 elemente: a1 çi a2.
32. CopiaÆi în vectorul a1 prima linie din matricea a.
33. CopiaÆi în vectorul a2 a doua linie din matricea a.
34. AfisaÆi printr-o singurå comandå conÆinutul vectorilor a1 çi a2 çi al matricei a.
35. SalvaÆi vectorii a1 çi a2 çi matricea a în fiçierul fa.
36. ÇtergeÆi din memoria internå vectorii a1 çi a2 çi matricea a.
37. AfiçaÆi conÆinutul vectorilor a1 çi a2 çi al matricei a.
38. RefaceÆi în memoria internå vectorii a1 çi a2 çi matricea a prin preluare din fiçierul fa.
39. AfiçaÆi conÆinutul vectorilor a1 çi a2 çi al matricei a.
40. ÇtergeÆi conÆinutul memoriei interne.
41. DeschideÆi tabelul Incasari din baza de date Compania. PåstraÆi în variabila x numårul
de înregistråri din tabel.
42. CopiaÆi din acest tabel, într-un tablou de memorie cu trei coloane, câmpurile nr_i,
id_cont, valoare. VizualizaÆi datele din tabloul de memorie.
43. SortaÆi acest tabel dupå valoarea câmpului valoare. VizualizaÆi datele sortate.
44. AdåugaÆi aceste date la sfârçitul tabelului. VizualizaÆi datele adåugate.
45. ÇtergeÆi datele adåugate. ÎnchideÆi tabelul çi baza de
date. EliberaÆi memoria internå.
178 Informatică
# ÎncercaÆi:
Adevårat/Fals:
1. În Visual FoxPro tablourile de memorie sunt omogene.
2. Un element al unei matrice Visual FoxPro poate fi identificat dupå numårul såu de ordine.
3. Dacå transformaÆi un vector într-o matrice, datele se pierd.
4. În Visual FoxPro se pot defini tablouri de memorie cu trei dimensiuni.
5. Înregistrarea în memoria internå a elementelor unei matrice se face linie dupå linie.
CompletaÆi:
1. Structura tabelului activ se poate salva într-o matrice folosind funcÆia ................
2. FuncÆia alen(a,2) furnizeazå ............................... ale matricei a.
3. Prin comanda de definire a structurii unui tablou de memorie elementele sunt
iniÆializate cu valoarea ..........
4. Pentru a çterge a doua coloanå dintr-o matrice a folosiÆi funcÆia ....................
AlegeÆi råspunsul corect:
1. Pentru copierea elementelor unui tablou de memorie într-un alt tablou de memorie folosiÆi:
a) funcÆia acopy() b) comanda copy to array c) comanda append from array
2. Într-o matrice Visual FoxPro se pot ordona:
a) elementele b) liniile c) coloanele
3. Elementul inserat într-un vector va avea valoarea:
a) .T. b) .F. c) NULL pentru acel tip de datå
4. Pentru a cåuta un element al tabloului de memorie care are o valoare precizatå, folosiÆi
funcÆia:
a) afind() b) afilds() c) ascan()
5. PuteÆi încårca într-un vector câmpurile din înregistrarea curentå a tabelului activ cu
ajutorul comenzii:
a) restore from b) copy to array c) scatter
6. PuteÆi încårca în câmpurile din înregistrarea curentå a tabelului activ datele din elemen-
tele unui vector folosind comanda:
a) save to b) gather c) append from array
RåspundeÆi:
1. CaracterizaÆi structura de date de tip tablou de memorie din Visual FoxPro.
2. Ce operaÆii se pot executa cu tablourile de memorie?
3. Ce operaÆii de transfer se pot executa între datele din memoria internå çi datele din
memoria externå.
R åspunsuri:
Adevårat/Fals: 1-F; 2-A; 3-F; 4-F; 5-A.
CompletaÆi: 1-afields(); 2-numårul de coloane; 3-.F.; 4- adel(a,2,2).
AlegeÆi råspunsul corect: 1) a; 2) b; 3) b;4) c;5) b,c; 6) b.
Capitolul 3
Elaborarea unor
strategii de modularizare
şi abstractizare a
prelucrării datelor
Dupå ce veÆi parcurge acest capitol AÆi învåÆat så folosiÆi interfaÆa unui sistem de ges-
trebuie så çtiÆi: tiune a bazelor de date pentru a crea çi a întreÆine
o bazå de date.
1. Cum puteÆi crea o aplicaÆie Visual
FoxPro. Pentru exploatarea unei baze de date, utilizatorul
2. Cum puteÆi modulariza aplicaÆia. nu interacÆioneazå direct cu baza de date sau cu
3. Cum puteÆi dezvolta o aplicaÆie sistemul de gestiune al bazei de date, ci cu un
folosind elementele programårii software de aplicaÆie. Rolul acestuia este de a
clasice. prezenta informaÆiile din baza de date într-o formå
4. Ce metode puteÆi folosi pentru çi în termeni accesibili utilizatorului. Utilizatorul
construirea interfeÆei unei aplicaÆii. interacÆioneazå cu aplicaÆia prin intermediul inter-
5. Cum puteÆi construi interfaÆa unei feÆei. Açadar, partea vizibilå a oricårei aplicaÆii
aplicaÆii folosind programarea
cu care interacÆioneazå utilizatorul este inter-
orientatå pe obiecte.
faÆa. Din punctul de vedere al utilizatorului, apli-
6. Cum puteÆi construi interfaÆa apli-
caÆiei cu ajutorul obiectelor vizuale. caÆia înseamnå de fapt interfaÆa ei. Pentru el nu
conteazå instrucÆiunile care se gåsesc în spatele
ei çi nici efortul consumat de programator pentru a scrie çi a optimiza codul programului.
Pentru utilizator conteazå modul în care exploateazå aplicaÆia, adicå interfaÆa çi
informaÆiile pe care le obÆine prin intermediul acestei interfeÆe.
Pentru crearea unei aplicaÆii, sistemul de gestiune a bazelor de date Visual FoxPro pune
la dispoziÆia programatorului douå metode de programare:
9 Programarea clasicå în care rezolvarea unei probleme se face cu ajutorul algoritmilor
descriçi prin cele trei structuri de control: structura secvenÆialå, structura alternativå çi
structura repetitivå. Ea este orientatå pe prelucrarea datelor. Folosind aceastå
metodå, programatorul trebuie så construiascå un program care este format din
ansamblul de date çi algoritmul folosit pentru descrierea problemei. Algoritmul este
implementat în calculator cu ajutorul instrucÆiunilor puse la dispoziÆie de limbajul de
programare.
180 Informatică
Limbajul gazdå Visual FoxPro (ca çi limbajele gazdå din versiunile anterioare FoxPro)
poate fi folosit la fel ca orice limbaj de programare structuratå. La construirea unui
program, comenzile studiate anterior pot fi folosite ca instrucÆiuni, iar pentru schimbarea
ordinii secvenÆiale de execuÆie se pot folosi instrucÆiuni de control. Programul surså
devine astfel o colecÆie de comenzi çi instrucÆiuni de control scrise în ordinea în care
trebuie så fie executate. InstrucÆiunile de control sunt instrucÆiuni bloc deoarece conÆin
mai multe instrucÆiuni. De aceea ele trebuie delimitate de cuvinte cheie care marcheazå
începutul çi sfârçitul structurii de control. InstrucÆiunile nu pot fi folosite în modul comandå.
Compilatorul FoxPro trebuie så poatå identifica fiecare instrucÆiune a programului surså.
El considerå ca separator între instrucÆiuni codul ASCII generat la acÆionarea tastei enter.
Se numeçte EOL (End Of Line) çi este format din douå coduri ASCII:
EOL = LF (Line Feed = salt la linia urmåtoare) +
CR (Carriage Return = retur la începutul liniei) = 0DH + 0AH
182 Informatică
Din aceastå cauzå, în fereastra de editare fiecare comandå se va scrie pe câte un rând:
instrucÆiune
.......................................................
Dacå doriÆi så scrieÆi o comandå pe mai multe rânduri, pentru a aråta cå ea continuå pe
rândul urmåtor, la sfârçitul liniei, înainte de a acÆiona tasta enter scrieÆi caracterul punct çi
virgulå ( ; ), astfel:
sfârçit de comandå
AtenÆie: urmåtoarele linii ale comenzii nu
se scriu din prima coloanå.
cu numår
cunoscut de paçi for ... endfor
structura repetitivå
cu numår necunoscut
de paçi, condiÆionatå do while ... enddo
anterior
pentru parcurgerea
înregistrårilor dintr-un scan ... endscan
tabel
ObservaÆii:
1. Spre deosebire de limbajele clasice de programare, în limbajul gazdå FoxPro este imple-
mentatå o structurå repetitivå specificå acestui gen de aplicaÆie (scan ... endscan), care
faciliteazå scrierea unui program ce exploateazå secvenÆial un tabel al bazei de date.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 183
if <expL>
<secvenÆå-instrucÆiuni-1>
else
<secvenÆå-instrucÆiuni-2>
endif
ObservaÆii:
1. Cuvintele cheie if çi endif delimiteazå structura, iar cuvântul else marcheazå începutul sec-
venÆei de instrucÆiuni care descrie activitatea ce se executå dacå expresia logicå are valoa-
rea „fals”.
2. Cuvântul cheie if împreunå cu condiÆia çi cuvintele cheie else çi endif se scriu fiecare pe
câte un rând.
3. Sunt permise structuri if ... endif imbricate. Dacå sunt mai multe structuri alternative
simple imbricate, else se referå la primul if care îl precede.
4. Se pot construi çi structuri alternative simple cu o ramurå vidå.
Exemplu
Så se scrie un program pentru rezolvarea ecuaÆiei de gradul I cu coeficienÆi numere
reale. CoeficienÆii a çi b se introduc de la tastaturå.
Metoda 1
set talk off else
clear ? 'Ecuatia este imposibila'
store 0 to a,b endif
? 'Programul va furnizeaza; else
solutia ecuatiei de gradul I' x=-b/a
? 'de forma a*x+b=0' ? 'x= ',x
input 'a= ' to a endif
input 'b= ' to b wait 'Actionati orice tasta;
if a=0 pentru continuare'
if b=0 clear
? 'Ecuatia are o infinitate; return
de solutii'
Metoda 2 (care foloseçte structuri if...endif imbricate)
set talk off ? 'Programul va furnizeaza;
clear solutia ecuatiei de gradul I'
store 0 to a,b ? 'de forma a*x+b=0'
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 185
ObservaÆii:
1. Cuvintele cheie do case çi endcase delimiteazå structura, iar cuvintele cheie case mar-
cheazå începutul unui caz care urmeazå så fie tratat (condiÆia logicå ce trebuie evaluatå
çi secvenÆa de instrucÆiuni care descrie activitatea ce se va executa atunci când condiÆia
logicå are valoarea „adevårat”). Cuvântul cheie otherwise împreunå cu secvenÆa de in-
strucÆiuni <secvenÆå-instrucÆiuni-n+1> sunt opÆionale çi reprezintå acÆiunea care se va
186 Informatică
executa atunci când nici una dintre expresiile logice din cazurile prezentate nu au avut
valoarea „adevårat”.
2. Cuvântul cheie case împreunå cu condiÆia çi cuvintele cheie do case, otherwise çi
endcase se scriu fiecare pe câte un rând.
3. Se acceptå într-o structurå do case ... endcase structuri alternative sau structuri repetitive
cu condiÆia ca aceste structuri så fie incluse complet în interiorul unui case sau otherwise.
4. Structura alternativå generalizatå do case ... endcase poate fi echivalatå cu mai multe
structuri alternative simple if ... endif imbricate:
if <expL1>
<secvenÆa-instrucÆiuni-1>
else
if <expL2>
<secvenÆa-instrucÆiuni-2>
else
if <expLn>
<secvenÆa-instrucÆiuni-1>
else
......................................
if <expLn>
<secvenÆa-instrucÆiuni-n>
else
<secvenÆa-instrucÆiuni-n>
endif
......................................
endif
endif
endif
Mod de executare a instrucÆiunii:
1. Se evalueazå pe rând expresiile logice <expL1>, <expL2>, <expL3>, ... çi <expLn>.
Când se întâlneçte prima expresie care are valoarea „adevårat”, se executå secvenÆa
de instrucÆiuni cuprinså între condiÆia logicå çi apariÆia unuia dintre cuvintele cheie case,
otherwise sau endcase.
2. Dupå ce s-a întâlnit un caz adevårat çi s-au executat instrucÆiunile corespunzåtoare
cazului, celelalte cazuri nu vor mai fi tratate çi se va trece la executarea primei instrucÆiuni
aflate dupå cuvântul cheie endcase.
3. Dacå nici una dintre expresiile logice evaluate nu a avut valoarea „adevårat”, se executå
secvenÆa de instrucÆiuni delimitatå de cuvintele cheie otherwise çi endcase, dacå existå
sau, în caz contrar, prima instrucÆiune aflatå dupå cuvântul cheie endcase.
Recomandare:
Se recomandå folosirea instrucÆiunii do case ... endcase în locul instrucÆiunii if ... endif
în urmåtoarele cazuri:
1. Din mai multe cazuri unul singur poate fi adevårat.
2. Din mai multe condiÆii numai prima gåsitå adevåratå trebuie executatå.
3. Existå un numår mic de excepÆii la o anumitå condiÆie. În acest caz excepÆiile vor fi puse
în evidenÆå prin case <expL>, iar situaÆia obiçnuitå prin otherwise.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 187
Exemplu
Så se scrie un program pentru rezolvarea ecuaÆiei de gradul I folosind structura repetitivå
generalizatå pornind de la metoda folosirii structurilor alternative simple imbricate:
set talk off case a=0 and b<>0
clear ? 'Ecuatia este imposibila'
? 'Programul va furnizeaza; otherwise
solutia ecuatiei de gradul I' x=-b/a
? 'de forma a*x+b=0' ? 'x= ',x
input 'a= ' to a endcase
input 'b= ' to b wait 'Actionati orice tasta;
do case pentru continuare'
case a=0 and b=0 clear
? 'Ecuatia are o infinitate; return
de solutii'
ObservaÆie:
1. Cuvântul cheie for marcheazå începutul structurii, iar cuvântul cheie endfor (sau cuvân-
tul cheie next) marcheazå sfârçitul structurii. Cuvintele cheie for çi to delimiteazå opera-
Æia de atribuire prin care se face iniÆializarea contorului, cuvântul to precede valoarea
finalå a contorului, iar cuvântul step precede valorea cu care se incrementeazå contorul.
2. Cuvântul cheie for împreunå cu expresiile çi cuvintele cheie to çi step se scriu pe acelaçi
rând. Cuvântul cheie endfor, respectiv next se scrie pe un singur rând.
3. Variabila de memorie <contor> trebuie definitå înaintea structurii for ... endfor ca
variabilå de tip numeric întreg printr-o operaÆie de atribuire.
Exemplu:
Så se calculeze suma a n numere introduse de la tastaturå. Valoarea lui n se introduce
de la tastaturå.
set talk off suma=suma+a
clear endfor
store 0 to suma,i ? 'Suma = ', suma
? 'Programul calculeaza suma a n; wait 'Actionati orice tasta;
numere introduse de la tastatura' pentru continuare'
input 'n= ' to n clear
for i=1 to n return
input 'a= ' to a
tot_timp=tot_timp+timp_s
k=k+1
endscan
? 'Total sedinte = '+str(k,3)
? 'Total valoare sedinte = '+str(tot_cost,9)
? 'Total timp sedinte = '+str(tot_timp,9)
wait 'Actionati orice tasta pentru continuare'
clear
use
close databases
poate fi încårcat în fereastra standard a editorului. Explicit aceastå fereastrå poate prelua
caracteristicile ferestrei precizate prin clauza window <nume_fereastrå_1>. Fereastra de
editare este deschiså implicit pe ecran çi explicit într-o fereastrå pårinte precizatå prin
clauza in [window] <nume_fereastrå_2>.
b. O anumitå operaÆie este necesarå în mai multe programe, cum sunt de exemplu
diferite operaÆii matematice (extragerea radicalului, extragerea pårÆii întregi sau a pårÆii
fracÆionare dintr-un numår real etc.), diferite operaÆii cu çiruri de caractere (extragerea
unui subçir dintr-un çir, çtergerea unui subçir dintr-un çir, inserarea unui subçir într-un
çir etc.), diferite operaÆii cu fiçiere (deschiderea unui fiçier, închiderea unui fiçier,
testarea sfârçitului de fiçier etc.).
c. Pentru simplificare, orice problemå poate fi descompuså în subprobleme folo-
sind tehnica top-down de proiectare a algoritmilor. Descompunerae poate continua
pânå când se obÆin subprobleme cu rezolvare imediatå çi care sunt independente
unele de altele, astfel încât programele cu care vor fi descrise så fie uçor de conceput
çi depanat, iar ulterior, când se schimbå unele cerinÆe, så fie uçor de dezvoltat.
În anii precedenÆi de studiu aÆi aflat cå subproblemele obÆinute pot fi descrise prin unitåÆi
de programe care se mai numesc çi module. AÆi mai învåÆat cå modulele se clasificå
astfel:
9 Modul apelant. Este modulul care Modul apelant Transfer Modul apelat
pentru rezolvarea propriei probleme control
apeleazå la alte module, fiecare din-
tre ele rezolvând o anumitå subpro-
blemå. La apelare, el transferå con-
trolul modului apelat.
9 Modul apelat. Este un modul la ca- Revenire
re apeleazå un alt modul pentru a-i control
rezolva o subproblemå. Dupå ce îçi
terminå execuÆia, el redå controlul modulului apelant.
În Visual FoxPro, la fel ca çi în versiunile anterioare de FoxPro existå douå metode de a
descompune o problemå în subprobleme (module):
9 ConstruiÆi modulele sub formå de programe independente. Fiecare program va fi
scris într-un fiçier separat. Aceste programe se pot apela unele pe altele folosind
comanda do. Se obÆin astfel comenzi do imbricate. Comanda do acceptå 128 de
niveluri de imbricare (32 de niveluri în variantele anterioare de FoxPro).
9 ConstruiÆi modulele sub formå de subprograme, la fel ca çi în limbajele clasice de
programare. Aceste subprograme pot fi grupate în biblioteci de subprograme.
toarelor situaÆii: execuÆia unei anumite linii din program (care creeazå puncte de între-
rupere permanente), schimbarea valorii unei expresii, evaluarea unei expresii la o a-
numitå valoare, terminarea execuÆiei unui anumit modul (step out) sau producerea
unui anumit eveniment în timpul execuÆiei programului.
1
În continuare, se va folosi numai termenul variabile de memorie çi se va subînÆelege cå acele
operaÆii se referå çi la tablouri de memorie.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 197
1.4.5. Subprogramele
ÇtiÆi deja cå din punct de vedere al valorilor returnate modulului apelant, subprogramele
se clasificå în proceduri (care returneazå un rezultat, nici un rezultat sau mai multe
rezultate prin intermediul listei de parametri) çi funcÆii (care returneazå un singur rezultat
prin numele såu). Tipul subprogramului determinå çi modul în care este activat (lansat în
execuÆie): procedura printr-o instrucÆiune de apel çi funcÆia în cadrul unei expresii unde
este folositå ca operand. Din punct de vedere al constructorului, subprogramele se
clasificå în subprograme de sistem çi subprograme utilizator.
Limbajul gazdå Visual FoxPro permite lucrul cu:
Proceduri Î utilizator
FuncÆii Î de sistem
Î utilizator (UDF - User Defined Functions)
Construirea unei proceduri sau a unei funcÆii utilizator se face astfel:
procedure | function <nume_procedurå>|<nume_funcÆie>
<corp-procedurå> | <corp_funcÆie>
[return [<expresie>]]
browse on error
on error do eroare with:'; on error
error(),message(),message(1),; uses
program(), lineno() close data
go to top && In aceasta;
linie va fi detectata o eroare
2. CreaÆi fiçierul surså eroare.prg çi îl compilaÆi:
parameter nrer, mesaj1,; ?? mesaj2
mesaj2, numeprog, nrlinie ? 'Programul cu eroarea: '
clear ?? numeprog
? 'Eroare cu numarul: ' ? 'Linia cu numarul: '
?? ?? nrlinie
str(nrer,4)+replicate(chr(7),3) wait ''
? 'Mesaj de eroare: ' clear
?? mesaj1 return
? 'Comanda eronata: '
3. LansaÆi în execuÆie programul exemplu. ObservaÆi modul în care sunteÆi informaÆi
despre erorile de compilare.
TestaÆi modul în care pot fi folosite variabilele de memorie ascunse
ScrieÆi urmåtorul program surså în fiçierul ex1.prg çi-l lansaÆi în execuÆie:
set talk off a1 = 100
a1 = 10 a2 = 200
a2 = 20 ? 'Afiseaza variabilele din;
do ascunde procedura'
? 'Afiseaza variabilele din; ? 'a1= '
program dupa revenire din; ?? a1 && Afiseaza 100
procedura' ? 'a2= '
? a1, a2 && Afiseaza 10, 200 ?? a2 && Afiseaza 200
procedure ascunde return
private a1
TestaÆi modul în care pot fi folosite variabilele de memorie publice
ScrieÆi urmåtorul program surså în fiçierul ex2.prg çi-l lansaÆi în execuÆie. ObservaÆi valo-
rile afiçate. ObservaÆi comportamentul variabilelor publice. ComparaÆi acest exemplu de
program (în care variabilele de memorie a1 çi a2 au fost declarate publice) cu exemplul
anterior în care nu au fost declarate publice. Ce concluzie trageÆi? ObservaÆi cå prin co-
manda release all nu sunt eliberate variabilele publice, iar prin comanda release a1,a2
sunt eliberate variabilele de memorie specificate în listå, chiar dacå sunt publice.
set talk off release all
public a1,a2 display memory like a?
a1 = 10 release a1,a2
a2 = 20 display memory like a?
do ascunde procedure ascunde
? 'Afiseaza variabilele din; private a1
program dupa revenire din; a1 = 100
procedura' a2 = 200
? a1, a2 && Afiseaza 10, 200 ? 'Afiseaza variabilele din;
procedura'
202 Informatică
? data(ctod(dt)) luna='noiembrie'
procedure data case month(d)=12
parameter d luna='decembrie'
do case endcase
case month(d)=1 do case
luna='ianuarie' case lower(cdow(d))='monday'
case month(d)=2 ziua='luni'
luna='februarie' case lower(cdow(d))='tuesday'
case month(d)=3 ziua='marti'
luna='martie' case
case month(d)=4 lower(cdow(d))='wednesday'
luna='aprilie' ziua='miercuri'
case month(d)=5 case lower(cdow(d))='thursday'
luna='mai' ziua='joi'
case month(d)=6 case lower(cdow(d))='friday'
luna='iunie' ziua='vineri'
case month(d)=7 case lower(cdow(d))='saturday'
luna='iulie' ziua='sambata'
case month(d)=8 case lower(cdow(d))='sunday'
luna='august' ziua='duminica'
case month(d)=9 endcase
luna='septembrie' dat=ziua+', '+str(day(d),2)+;
case month(d)=10 ' '+luna+' '+str(year(d),4)
luna='octombrie' return dat
case month(d)=11
ConstruiÆi çi testaÆi o bibliotecå
ConstruiÆi în fiçierul vectori.prg o bibliotecå cu operaÆii pentru vectori care så conÆinå: pro-
ceduri pentru citirea unui vector, pentru afiçarea unui vector, pentru concatenarea doi vectori,
pentru interclasare a doi vectori, pentru divizarea unui vector, o funcÆie pentru cåutarea unui
element cu o valoare precizatå într-un vector (funcÆia va furniza un rezultat numeric: prima po-
ziÆie în care a fost gåsit elementul în vector sau -1 dacå nu a fost gåsit) çi o procedurå de
cåutare care va comunica toate poziÆiile în care a fost gåsit un element cu o valoare precizatå
(se va folosi dacå existå mai multe elemente cu aceeçi valoare în vector). Dupå ce aÆi scris
fiçierul surså, îl veÆi compila ca så fiÆi siguri cå nu aveÆi erori de sintaxå.
procedure creare ?
parameters a,n i=1
local i do while i<=n-1
? 'Creati un vector cu n elemente' for j=1 to 10
input 'n= ' to n ?? str(a(i),6)+', '
dimension a(n) i=i+1
for i=1 to n if i=n
input 'a('+str(i,2)+')= ' to; exit
a(i) endif
endfor endfor
return if i<=n-1
procedure afisare ?
parameters a,n endif
local i,j enddo
? 'Se afiseaza un vector cu ', ?? str(a(n),6)
str(n,2)+' elemente' return
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 205
a2) cuvintele sunt separate prin douå sau mai multe spaÆii.
b) Så se numere caracterele din text çi så se precizeze:
b1) câte consoane sunt;
b2) câte vocale sunt;
b3) câte cifre sunt;
b4) câte semne speciale sunt.
c) Så se înlocuiascå în text un çir de caractere cu un alt çir de caractere. Cele douå
çiruri de caractere se introduc de la tastaturå. Se vor înlocui toate apariÆiile çirului
de caractere precizat în urmåtoarele cazuri:
c1) nu conteazå diferenÆa dintre literele mari çi mici;
c2) conteazå diferenÆa dintre literele mari çi mici;
c3) nu conteazå dacå çirul de caractere este un cuvânt+cerinÆa c2;
c4) çirul de caractere este un cuvânt+ cerinÆa c2.
d) Så se afiçeze în ordine alfabeticå cuvintele din text.
e) Så se numere cuvintele care au m caractere. Valoarea lui m se introduce de la
tastaturå.
f) Så se afiçeze pentru fiecare literå, câte litere sunt în text (frecvenÆa de apariÆie a
literelor). Afiçarea se va face pe ecran sub forma:
Literea a sau A ............ 20
Literea b sau B ............ 5
........................................
Lista se va afiça sortat în douå moduri: în ordinea alfabeticå a literelor çi în
ordinea descrescåtoare a frecvenÆei de apariÆie.
g) Så se afiçeze litera care are cea mai mare frecvenÆå de apariÆie în text.
h) Så se afiçeze media apariÆiilor çi abaterea medie påtraticå. Ce informaÆii obÆineÆi
comparând cele douå valori obÆinute.
6. Så se realizeze un tabel bazå de date în care så se memoreze evoluÆia cursului leu-euro
din luna precedentå. Pentru fiecare zi din lunå se vor memora urmåtoarele informaÆii: data,
valoarea cursului, indicele cu bazå fixå (raportul dintre cursul zilei çi cursul din ziua de în-
ceput a perioadei de analizå), indicele cu bazå în lanÆ (raportul dintre cursul zilei çi cursul din
ziua precedentå), sporul cu bazå fixå (diferenÆa dintre cursul zilei çi cursul din ziua de în-
ceput a perioadei de analizå), sporul cu bazå în lanÆ (diferenÆa dintre cursul zilei çi cursul din
ziua precedentå). Crearea structurii tabelului çi încårcarea câmpurilor pentru datå çi curs se
va face la nivel de limbaj de comandå. Pentru calcularea celorlalte câmpuri se va folosi un
program. Så se afiçeze urmåtoarele informaÆii folosind datele din tabel: ziua cu cel mai
mare curs, ziua cu cel mai mic curs, media aritmeticå a cursului çi abaterea medie påtraticå
a cursului. Aceste informaÆii se vor furniza în douå moduri: cu ajutorul limbajului de
comandå çi cu ajutorul unui program.
7. Så se realizeze un tabel bazå de date în care så se memoreze situaÆia notelor çi a mediilor
la disciplina Informaticå a elevilor dintr-o claså. Tabelul va conÆine urmåtoarele informaÆii:
numele çi prenumele elevului, poziÆia lui din catalog, cinci note pentru primul semestru, cinci
note pentru cel de al doilea semestru, douå note pentru tezele de pe cele douå semestre,
mediile de pe cele douå semestre çi media anualå. Crearea structurii tabelului çi încårcarea
câmpurilor pentru numele çi prenumele elevului, pentru poziÆia lui din catalog, pentru cele
maxim 10 note din cele douå semestre çi pentru cele douå note de la tezele semestriale se
va face la nivel de limbaj de comandå. Pentru calcularea mediilor se va folosi un program.
La calcularea mediilor trebuie så ÆineÆi cont de urmåtoarele:
208 Informatică
a) valorile mediilor semestriale sunt de tip întreg, iar valoarea mediei generale este
de tip real;
b) este posibil ca un elev så primeascå mai puÆin de cinci note;
c) teza are ponderea de 25% din media semestrialå.
ScrieÆi un program care så afiçeze urmåtoarele informaÆii:
a) corigenÆii de pe fiecare semestru çi corigenÆii anuali;
b) o listå ordonatå alfabetic dupå numele çi prenumele elevilor care så conÆinå
numele, prenumele, mediile semestriale çi media anualå;
c) o listå ordonatå descrescåtor dupå media anualå care så conÆinå numele, prenu-
mele, mediile semestriale çi media anualå;
d) numele elevului cu cea mai mare medie pe semestrul 1, pe semestrul 2 çi res-
pectiv pe an;
e) media generalå a clasei çi abaterea medie påtraticå a mediilor pe fiecare semes-
tru çi pe an (ce concluzie trageÆi prin compararea acestor medii?).
8. CompletaÆi biblioteca vectori cu urmåtaorele subprograme pentru operaÆii cu vectori:
proceduri pentru adunarea çi produsul vectorial a doi vectori çi funcÆii pentru produsul
scalar a doi vectori çi pentru suma çi produsul elementelor unui vector. TestaÆi noile
subprograme adåugate la bibliotecå.
9. ConstruiÆi o bibliotecå pentru operaÆii cu mulÆimi care så permitå executarea urmåtoare-
lor operaÆii: citirea çi afiçarea unei mulÆimi, reuniunea, intersecÆia, diferenÆa, diferenÆa si-
metricå, produsul cartezian a douå mulÆimi, cardinalul unei mulÆimi (numårul de elemen-
te), apartenenÆa unui element (a cårui valoare o veÆi comunica de la tastaturå) la o mul-
Æime. Pentru mulÆimi veÆi folosi tipul de date vector. Spre deosebire de un vector oarecare,
într-un vector care påstreazå elementele unei mulÆimi nu pot exista douå elemente cu
aceeaçi valoare.
10. ConstruiÆi o bibliotecå cu operaÆii cu çiruri de caractere în care så påstraÆi subpro-
grame pentru rezolvarea cerinÆelor de la problema 5. ConstruiÆi programe pentru
testarea acestei biblioteci.
11. Folosind editorul de texte Notepad vizualizaÆi conÆinutul fiçierelor clienÆi.dbf çi clienÆi.fpt.
ObservaÆi cå orice persoanå care vrea så citeascå datele din tabelele bazei de date poate
face acest lucru cu un simplu editor de texte. Cu puÆin efort poate identifica ce reprezintå
fiecare datå çi poate obÆine anumite informaÆii care pot fi secrete. Pentru a evita acest lucru
puteÆi codifica datele de tip alfanumeric (câmpurile de tip çir de caractere aflate în fiçierul cu
extensia .dbf çi câmpurile memo aflate în fiçierul cu extensia .fpt). VeÆi crea un cod simplu:
translataÆi cu o valoare stabilitå (de exemplu 15) codurile ASCII ale caracterelor. ConstruiÆi
douå subprograme: unul pentru codificare (pe care îl folosiÆi înainte de închiderea bazei de
date) çi unul pentru decodificare (pe care îl folosiÆi la deschiderea bazei de date). Çirurile de
caractere pot conÆine numai cifre, litere çi anumite semne speciale. Pentru a evita afiçarea
în çirurile de caractere codificate a altor caractere, puteÆi complica codul folosind pentru
acelaçi tip de caractere (cifre, litere sau semne speciale) o translatare circularå. De
exemplu, pentru literele mici consideraÆi cå dupå litera z urmeazå litera a; în acest mod,
pentru o translatare cu 15, în locul literei a (cod ASCII: 97) se va folosi litera p (cod ASCII
97+15=112), iar în locul literei z (cod ASCII: 122) se va
folosi litera o (cod ASCII 97-1+15=111).
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 209
# ÎncercaÆi:
Adevårat/Fals:
1. O procedurå utilizator din Visual FoxPro poate fi activatå ca o funcÆie.
2. În limbajul Visual FoxPro este implementatå structura repetitivå de tip repeat ... until.
3. Comenzile care permit redirectarea unei valori de pe ecran într-o variabilå de memorie
folosind clauza to creeazå variabila de memorie.
4. Variabilele de memorie pot fi definite oriunde în interiorul programului.
5. Printr-o comandå modify command puteÆi deschide mai multe ferestre de editare.
6. InstrucÆiunea exit redå controlul sistemului de operare.
7. InstrucÆiunea public creeazå variabile de memorie.
8. Printr-o comandå compile puteÆi compila un singur program.
CompletaÆi:
1. În instrucÆiunea alternativå generalizatå do case ... endcase cuvântul cheie ............ prece-
de instrucÆiunile care se vor executa dacå nici unul dintre cazuri nu a fost „adevårat”.
2. Comentariul inserat într-o linie a programului trebuie precedat de .................
3. InstrucÆiunea prin care puteÆi forÆa reevaluarea condiÆiei de terminare a unei structuri
repetitive este .....................
4. Pentru crearea unei capcane pentru erori folosiÆi comanda ........................
5. ConÆinutul liniei care a cauzat o eroare de compilare este furnizat de funcÆia ...............
6. PuteÆi så urmåriÆi execuÆia pas cu pas a unui program în fereastra ....................
7. Parametrii formali se declarå cu instrucÆiunea .................
8. AflaÆi numårul de parametri actuali transmiçi unui subprogram cu funcÆia ...................
9. DeschideÆi o bibliotecå de subprograme cu comanda ..........................
AlegeÆi råspunsurile corecte:
1. În funcÆie de context, într-un program Visual FoxPro caracterul = poate fi:
a) operator relaÆional
b) operator de atribuire
c) comandå
2. Dacå din mai multe acÆiuni posibile trebuie så se execute una singurå veÆi folosi:
d) instrucÆiuni if ... endif imbricate
e) instrucÆiunea do case ... endcase
f) instrucÆiunea scan ... endscan
3. Fraza „citeçte înregistrårile fiçierului pânå când ajungi la marcajul de sfârçit de fiçier“
poate fi descriså cu instrucÆiunea:
a) for i=1 to reccount() ... endfor
b) do while not eof() ... enddo
c) scan ... endscan
4. O variabilå de memorie declaratå „privatå“ cu instrucÆiunea private este:
a) o variabilå de memorie localå, vizibilå numai în modulul în care a fost creatå;
b) o variabilå vizibilå numai în regiunea de program în care a fost creatå;
c) o variabilå de memorie ascunså de modulele superioare.
5. Comanda return to master redå controlul:
a) modulului apelant b) modulului principal c) sistemului de operare
210 Informatică
R åspunsuri:
Adevårat/Fals: 1-A; 2-F; 3-A; 4-A; 5-A; 6-F; 7-A; 8-F.
CompletaÆi: 1-otherwise; 2-&&; 3-loop; 4-on error; 5-message(1); 6-Trace; 7- parameters;
8-parameters(); 9-set procedure to<nume_biblioteca>.
AlegeÆi råspunsurile corecte: 1-a,b,c; 2- a,b; 3- a,b,c; 4-c; 5-b; 6-a,b; 7-b.
2 . P r o g r a m a r e a o r i e n t a tă p e o bi e c t e
2 . 1 . P r i n c i p i i l e p r o g r a m ăr i i o r i e n t a t e p e o b i e c t e
Programele de calculator prelucreazå informaÆii din lumea care ne înconjoarå. Lumea realå
este formatå din obiecte, iar omul interacÆioneazå cu ea prin intermediul acestor obiecte. O
fotografie prezintå çi ea un ansamblu de obiecte care sunt caracterizate înså numai de
proprietåÆi (formå, dimensiuni, culoare etc.), nu çi de acÆiuni. Ea este o reprezentare staticå
a lumii reale. Dar lumea care ne înconjoarå este o lume dinamicå în care fiecare obiect este
determinat de proprietåÆi, metode çi evenimente. Putem så ne gândim la proprietåÆi ca la
atributele obiectului, la metode ca la acÆiuni ale obiectului, iar la evenimente ca la råspun-
suri ale obiectului la acÆiunile omului asupra lui. Pentru a înÆelege mai bine ce înseamnå
proprietåÆile, metodele çi evenimentele så consideråm un obiect din viaÆa de zi cu zi: balo-
nul unui copil. Balonului i se pot asocia proprietåÆi, metode çi evenimente. ProprietåÆile ba-
lonului includ atât atributele vizibile cum sunt înålÆimea, diametrul, culoarea, cele care des-
criu starea lui (umflat sau dezumflat), cât çi atribute invizibile cum este vârsta. Prin definiÆie,
toate baloanele au aceste proprietåÆi. Valorile acestor proprietåÆi diferå de la un balon la al-
tul. Balonului i se pot asocia de asemenea çi acÆiuni pe care le poate executa, adicå meto-
de: metoda de umflare a balonului (acÆiunea prin care se umflå balonul cu aer), metoda de
dezumflare a balonului (acÆiunea prin care se scoate aerul din balon), metoda de înålÆare a
balonului (acÆiunea prin care se ridicå balonul). Toate baloanele sunt capabile så execute
aceste acÆiuni, deci au asociate aceste metode. Baloanele au çi råspunsuri predefinite la
anumite evenimente externe: la evenimentul înÆepåturå, råspunsul este dezumflarea auto-
matå, iar la evenimentul eliberarea balonului råspunsul este înålÆarea lui în aer.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 211
Açadar, baloanele diferå între ele numai prin valorile proprietåÆilor çi au acelaçi comporta-
ment (reacÆioneazå la aceleaçi evenimente prin aceleaçi metode). Putem spune cå balonul
este un tip de obiect din lumea realå, iar mulÆimea baloanelor formeazå o claså de obiecte.
Aça cum o fotografie descrie starea unui obiect la un moment dat, çi o structurå de date
folositå pentru descrierea obiectului nu poate så caracterizeze decât starea acelui obiect la
un moment dat, deci este o descriere staticå a obiectului. TendinÆa limbajelor moderne de
programare este de a pune în corespondenÆå obiectele reale cu obiectele virtuale pentru a
putea evidenÆia transformårile pe care acestea le suferå în mod continuu. Obiectul va încap-
sula atât datele care descriu proprietåÆile, dar çi subprogramele care prelucreazå aceste date
çi care vor defini metodele obiectului.
Domeniul în care programarea orientatå pe obiecte a ajuns indispensabilå este realizarea
interfeÆei. Aça cum obiectele cu care venim în contact reprezintå interfaÆa între noi çi lumea
realå çi interfaÆa graficå dintre utilizator çi programul de aplicaÆie este construitå cu diferite
obiecte virtuale afiçate pe ecran care pot fi acÆionate cu mouse-ul çi tastatura. Putem spune
cå în urma acÆionårii, obiectul declançeazå un anumit eveniment. Deoarece, utilizatorul
poate veni în contact cu mai multe aplicaÆii, s-a cåutat o standardizare a acestor obiecte
atât din punct de vedere al proprietåÆilor, cât çi din punct de vedere al evenimentului
declançat. De exemplu, dacå un utilizator vede pe ecranul calculatorului un buton pe care
scrie OK, çtie cå dacå îl va acÆiona se va închide caseta de dialog çi se va continua
execuÆia aplicaÆiei.
AÆi studiat deja principiile programårii orientate pe obiecte. Dintre conceptele studiate, så
ne reamintim urmåtoarele:
Obiectul (object) reprezintå un ansamblu de date (un numår fix de variabile) çi
subprograme (proceduri çi funcÆii) necesare pentru prelucrarea datelor. Datele poartå
numele de proprietåÆi, iar subprogramele numele de metode sau evenimente. Proprie-
tåÆile, metodele çi evenimentele sunt membrii unui obiect. InterfaÆa de acces la obiect
este realizatå numai prin intermediul metodelor. În acest mod, subprogramele membre
ale unui obiect prelucreazå datele membre ale obiectului care apeleazå metoda.
Proprietatea (property) reprezintå un atribut al unui obiect care defineçte una dintre
caracteristicile sau unul dintre aspectele sale. De exemplu, un obiect vizual poate avea
proprietatea visible care determinå dacå obiectul este vizibil la un moment dat.
Metoda (method) reprezintå acÆiunea pe care o poate executa un obiect. Utilizatorul
unui obiect are acces la date numai prin intermediul metodelor obiectului, iar metoda are
acces implicit la membrii unui obiect. Metodele ascund celui care utilizeazå obiectul
amånunte despre modul în care a fost implementat. De exemplu, un obiect vizual de tip
listå are implementate metode necesare pentru întreÆinerea listei: adåugarea unui articol la listå,
çtergerea unui articol din listå etc.
Evenimentul (event) reprezintå o acÆiune recunoscutå de obiect pentru care se poate scrie un
program ca råspuns. Evenimentele pot fi externe, adicå generate de acÆiuni ale utilizatorului (un
clic cu mouse-ul, miçcarea mouse-ului, apåsarea unei taste) sau interne, adicå generate prin-
tr-un cod de program sau de sistem.
Clasa (class) reprezintå definiÆia unui anumit tip de obiect. DefiniÆia cuprinde descrierea
proprietåÆilor çi a metodelor obiectului. Folosirea claselor permite gestionarea mai multor
obiecte de acelaçi tip. Clasa este înså doar un termen abstract, un çablon care defineçte
caracteristicile unui obiect (cum aratå çi cum se comportå).
212 Informatică
InstanÆa (instance) reprezintå un obiect creat pornind de la definiÆia unei clase. Spre deosebire de
claså care este doar o definiÆie, o instanÆå existå ca un obiect care poate fi folosit pentru a
executa anumite acÆiuni. De exemplu, o casetå de text dintr-un formular este o instanÆå a clasei
TextBox care descrie acest tip de obiecte vizuale.
InstanÆe multiple (multiple instances) reprezintå mai multe obiecte create de aceeaçi claså.
Obiectele au propriile proprietåÆi çi date private, dar folosesc împreunå codul de program.
Încapsularea (encapsulation) reprezintå un mecanism prin care folosind o singurå definiÆie sunt
incluse în obiect datele çi metodele. Datele membre ale unui obiect nu pot fi modificate decât
prin intermediul metodelor proprii obiectului respectiv. Încapsularea izoleazå complexitatea
internå a unui obiect de restul aplicaÆiei.
Moçtenirea (inheritance) este o facilitate oferitå de programarea pe obiecte prin care o claså
nouå numitå claså copil (child class) se poate construi pornind de la o claså existentå numitå
claså pårinte (parent class) prin preluarea caracteristicilor clasei pårinte. Clasa copil se mai
numeçte çi claså derivatå (subclass), iar clasa pårinte claså de bazå (base class). Folosind
aceastå facilitate se poate crea o ierarhie de clase çi se poate dezvolta uçor un software exis-
tent. Clasa copil moçteneçte accesul la datele çi metodele stråmoçilor. La acestea, programato-
rul poate adåuga proprietåÆi çi metode noi, definite explicit în noua claså. Orice modificare într-
un stråmoç se reflectå çi la urmaçi. De exemplu, dacå o claså Text are proprietatea ca textul så
fie scris îngroçat, orice urmaç al acestei clase va avea aceastå proprietate.
Aceeaçi problemå poate fi rezolvatå atât în varianta clasicå a programårii structurate, cât
çi folosind programarea orientatå pe obiecte. Principalele avantaje ale folosirii progra-
mårii orientate pe obiecte sunt:
9 Reutilizarea unui software deja scris. Acest avantaj creçte eficienÆa programatorilor.
În programarea clasicå se realiza prin crearea bibliotecilor de subprograme.
9 Dezvoltarea mai uçoarå a aplicaÆiilor. În programarea orientatå pe obiecte creçte
gradul de modularizare al unei aplicaÆii faÆå de programarea clasicå. Adåugarea sau
modificarea unor module de aplicaÆie se va face mai uçor datoritå organizårii
obiectelor în clase de obiecte çi a facilitåÆii de moçtenire.
9 Controlul mai bun al programelor de dimensiuni mari. AplicaÆia este mai bine
structuratå decât în cazul programårii clasice çi mult mai abstractizatå, permiÆând o
mai uçoarå citire çi urmårire a codului.
9 Dezvoltarea programårii vizuale ca aplicaÆie a programårii orientate pe obiecte. În
varianta clasicå, descrierea unui obiect grafic de pe ecran se fåcea precizând printr-un
set de instrucÆiuni caracteristicile obiectului (coordonatele obiectului, dimensiunile, cu-
loarea, textul afiçat etc.), iar prin subprograme modul în care putea fi manipulat obiectul.
În programarea vizualå existå deja obiecte vizuale predefinite care pot fi folosite pentru
construirea unei intrefeÆe. Obiectul vizual conÆine proprietåÆile obiectului grafic (cu valori
implicite, care înså pot fi modificate) çi metodele çi evenimentele la care poate reacÆiona
obiectul vizual, fårå så mai necesite scrierea codului de cåtre programator.
2 . 2 . L u c r u l c u c l a s e şi o b i e c t e în V i s u a l F o x P r o
2.2.1. Clasele
Visual FoxPro are implementate mai multe clase predefinite care permit crearea unor
obiecte cu care poate fi construitå interfaÆa unei aplicaÆii, cum sunt de exemplu casetele
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 213
Prin aceastå instrucÆiune se defineçte clasa identificatå prin <nume_cls1>. DefiniÆia noii clase
se bazeazå pe clasa pårinte precizatå prin <nume_cls2> din clauza as de la care moçteneçte
proprietåÆile, metodele çi evenimentele. Clasa pårinte poate fi o claså predefinitå, o claså vi-
zualå (care se bazeazå pe o claså predefinitå) sau o claså nevizualå (definitå de utilizator). La
noua claså pot fi adåugate:
214 Informatică
9 ProprietåÆi noi. Ele vor fi precizate printr-o listå de operaÆii de atribuire <nume_pr>=
<exp>, unde <nume_pr> este numele proprietåÆii, iar <exp> este valoarea cu care se
iniÆializeazå proprietatea. ProprietåÆile pot fi protejate, adicå se poate împiedica acce-
sul la proprietate çi se poate împiedica modificarea ei din afara definiÆiei clasei. Prote-
jarea unor proprietåÆi se precizeazå cu clauza protected însoÆitå de lista de proprietåÆi
care vor fi protejate: <nume_pr1>, <nume_pr2>,... .
9 Obiecte noi. Fiecare obiect nou care va fi adåugat la definiÆia clasei este precizat printr-o
clauzå add object. Obiectul va fi identificat prin <nume_ob> çi va fi adåugat dintr-o claså
precizatå prin <nume_cls3> din clauza as. Obiectul adåugat poate fi protejat, adicå se
poate împiedica accesul çi modificarea lui din afara clasei, dacå se precizeazå clauza
protected. Metodele çi evenimentele clasei vor avea înså acces la proprietate. Implicit se
executå metoda de inÆializare a obiectului la adåugarea obiectului. Explicit nu se face
iniÆializarea dacå este precizatå clauza noinit. Explicit se poate preciza cu clauza with
lista proprietåÆilor çi valorile proprietåÆilor care se adaugå obiectului adåugat la claså.
9 Metode çi evenimente noi. Ele sunt create ca un set de subprograme (proceduri çi
funcÆii). Fiecare funcÆie çi procedurå este delimitatå de cuvintele cheie function çi
endfunc çi respectiv procedure çi endproc. Între cuvintele cheie se scrie secvenÆa
de instrucÆiuni care formeazå corpul subprogramului. Se pot folosi parametri de
comunicaÆie între subprogram çi obiect sau între subprogramele aceleiaçi clase.
Parametrii se declarå la începutul fiecårui subprogram cu instrucÆiunea paramaters
sau lparameters. Metodele pot fi protejate (este împiedicat accesul la ele din afara
obiectului) dacå se precizeazå clauza protected înainte de a scrie subprogramul
asociat. Metoda va fi un subprogram care va acÆiona asupra obiectului creat pe baza
clasei çi care poate fi apelat indiferent de îndeplinirea unor condiÆii, iar evenimentul va
fi un subprogram care se va executa numai atunci când se produce o acÆiune (de
exemplu un clic cu mouse-ul) recunoscutå de obiectul creat pe baza clasei.
ObservaÆii:
1. Define class este instrucÆiune deoarece nu poate fi folositå în modul interactiv, ci nu-
mai în programe. InstrucÆiunea are o sintaxå de bloc, deoarece este formatå dintr-un
ansamblu de instrucÆiuni. Blocul de instrucÆiuni începe cu comanda define class çi se
terminå cu cuvântul cheie enddefine. InstrucÆiunile componente sunt scrise în
sintaxa blocului fiecare pe câte un rând çi trebuie scrise pe un singur rând çi în cadrul
unui program (la fel ca orice instrucÆiune independentå).
2. Clauza as precede numele clasei pårinte pe care se bazeazå definiÆia noii clase sau a
unui obiect adåugat la o claså container.
Exemplu:
Se creeazå o claså cu numele formular pe baza clasei vizuale form (clasa formularelor).
Obiectele din aceastå claså vor fi obiecte container, deoarece obiectul formular conÆine
alte trei obiecte: douå care se bazeazå pe clasa CommandButton (adicå vor fi butoane
de comandå), iar unul care se bazeazå pe clasa ListBox (adicå va fi o listå). Clasa formu-
lar va conÆine pe lângå proprietåÆile, metodele çi evenimentele clasei form proprietåÆile
nume çi versiune çi metoda click.
define class formular as form
* Se definesc proprietatile nume si versiune. Ele sunt
* initializate cu 20 de spatii, respectiv cu un sir de caractere.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 215
2.2.2. Obiectele
Obiectele se creeazå pe baza claselor definite. Obiectul este instanÆa unei clase. Pen-
tru crearea unui obiect se foloseçte funcÆia createobject() care are sintaxa:
createobject('<nume_cls>' [,<p1>, <p2>, ...]
Rezultatul furnizat de funcÆie este de tip obiect (adicå referinÆå cåtre un obiect). Obiectul se
creeazå pe baza clasei identificate prin <nume_cls>, iar pentru crearea sa se poate face
transfer prin parametrii din lista <p1>, <p2>, ... . Numele clasei va fi scris nu ca un identi-
ficator, ci ca un çir de caractere. Pentru a putea folosi obiectul, trebuie så se atribuie referinÆa
cåtre obiect unei variabile de memorie. În acest mod, numele variabilei de memorie va putea
fi folosit pentru a referi obiectul.
Exemplu:
Se creeazå un obiect pe baza clasei definite anterior. Variabilei de memorie obiect i se
atribuie referinÆa cåtre acest obiect: obiect = createobject('clasa')
În lucrul cu clase çi obiecte se folosesc urmåtorii operatori specifici:
9 Operatorul . (punct). Se foloseçte pentru a separa numele obiectului de numele
pårintelui sau pentru a separa numele unui membru al obiectului (proprietate, metodå
sau eveniment) de numele obiectului.
9 Operatorul :: (delimitarea domeniului). Se foloseçte atunci când doriÆi så apelaÆi
dintr-o claså o metodå din clasa pårinte.
Astfel, sintaxa generalå pentru a avea acces la unul din membrii unui obiect este:
<nume_obiect>.<nume_membru>
unde <nume_membru> este numele unei proprietåÆi, al unei metode sau al unui eveniment al
obiectului.
216 Informatică
În cadrul definiÆiei unei clase se pot folosi urmåtoarele referiri relative la membrii unui obiect
sau la alte clase:
9 Parent - obiectul container al obiectului curent.
9 This - obiectul curent.
9 ThisForm - formularul care conÆine obiectul curent (formularul curent).
9 ThisFormSet - setul de formulare curent care conÆine formularul curent.
Aceste cuvinte cheie se folosesc pentru a se face referiri la obiecte care nu au fost create
încå (ele au fost definite în cadrul clasei) çi implicit nu li s-au atribuit nume pentru a fi referite.
În timpul execuÆiei unui program puteÆi så adåugaÆi sau så înlåturaÆi obiecte dintr-un
obiect container folosind metodele obiectului container: AddObject() pentru adåugarea çi
RemoveObject() pentru înlåturarea unui obiect. Aceste metode sunt implementate
implicit în marea majoritate a claselor predefinite çi în clasa custom. Sintaxa lor este:
<nume_ob1>.addobject('<nume_ob2>' , '<nume_cls>')
unde <nume_ob1> este numele obiectului container la care se adaugå obiectul cu numele
<nume_ob2> ce se creeazå pe baza clasei <nume_cls> çi
<nume_ob1>.removeobject('<nume_ob2>')
unde <nume_ob1> este numele obiectului container din care se înlåturå obiectul cu numele
<nume_ob2>. Obiectul înlåturat nu va mai fi afiçat pe ecran.
ObservaÆii:
În sintaxa celor douå funcÆii numele obiectului container a fost separat prin operatorul punct
de numele metodei membru al obiectului container.
Exemplu:
În acest exemplu puteÆi observa cum este folosit operatorul :: pentru a apela o metodå
din clasa pårinte (în clasa F2 este apelatå metoda click definitå în clasa F1 care este
clasa pårinte a clasei F2) çi referinÆa This pentru a preciza cå este vorba de obiectul
curent, adicå obiectul creat pe baza clasei F2 (This.Backcolor se referå la proprietatea
Backcolor a obiectului curent - culoarea fundalului):
* Se creeaza clasa F1 care are ca parinte clasa Form
define class F1 as Form
procedure click
wait window 'S-a executat clic in formular'
endproc
enddefine
* Se creeaza clasa F2 care are ca parinte clasa F1
define class F2 as F1
procedure click
F1::click
This.BackColor=This.BackColor+1
endproc
enddefine
Exemplu:
În acest exemplu puteÆi observa cum pot fi folosite metodele proprii ale obiectului, cum
pot fi modificate proprietåÆile unui obiect, cum se fac referirile la proprietåÆile çi metodele
unui obiect çi cum este folosit operatorul punct în aceste referiri:
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 217
9 Datele unui obiect pot fi prelucrate prin metodele proprii obiectului. În timpul acestor pre-
lucråri pot så fie necesare diferite variabile temporare. Acestea trebuie definite ca proprie-
tåÆi ale obiectului pentru a putea fi folosite în interiorul obiectului, dar trebuie izolate de
exteriorul lui, deoarece modificarea lor din exterior ar putea afecta prelucrårile din interior.
9 Unele dintre subprograme sunt folosite intern de metodele obiectului çi nu trebuie så
fie folosite çi din exterior.
Din aceste douå cazuri se observå cå este necesar så fie controlat accesul la membrii
unui obiect. De aceea, membrii unui obiect pot fi:
9 Publici. Accesul la aceçti membri este posibil din interiorul clasei, dar çi din exteriorul ei.
9 ProtejaÆi. Accesul la aceçti membri este posibil din interiorul clasei çi din interiorul
unei clase derivate din ea. Aceçti membri vor fi declaraÆi protejaÆi prin intermediul
clauzei protected din definiÆia clasei.
Exemplu
define class ang as Custom
protected data_n
nume=space(20)
pren=space(20)
adresa=space(30)
data_n={ / / }
procedure data_ns
return this.data_n
endproc
enddefine
Proprietatea data_n este protejatå çi nu poate fi modificatå din exteriorul clasei, în schimb
metoda data_ns nu este protejatå çi poate furniza valoarea proprietåÆii data_n.
ObÆinerea de informaÆii despre obiecte
ObÆineÆi informaÆii despre obiecte folosind urmåtoarele funcÆii:
aclass() - plaseazå într-un vector numele clasei unui obiect çi ale stråmoçilor
acestuia. FuncÆia returneazå un rezultat numeric care va reprezenta numårul de
clase plasate în vector. În primul element al vectorului va fi scris numele clasei
obiectului. Sintaxa funcÆiei este: aclass(<nume_vector>,<nume_ob>).
ainstance() - plaseazå într-un vector instanÆele unei clase. FuncÆia retuneazå un
rezultat numeric care va reprezenta numårul de instanÆe plasate în vector. Sintaxa
funcÆiei este: ainstance(<nume_vector>,<nume_cls>).
amembers() - plaseazå într-un tablou de memorie numele membrilor unui obiect
(proprietåÆi, metode, evenimente çi obiecte membre). FuncÆia returneazå un rezultat
numeric care reprezintå numårul de membrii ai obiectului, memoraÆi în tablou.
Sintaxa funcÆiei este: amembers(<nume_tablou>,<nume_ob>[,1|2]). Implicit se
creeazå un vector în care vor fi memorate numai proprietåÆile. Explicit, dacå se
precizeazå argumentul 1 se va crea o matrice bidimensionalå în care în prima
coloanå va fi scris numele membrului çi în coloana a doua tipul membrului (Property,
Event, Method, Object), iar dacå se precizeazå argumentul 2 se va crea un vector
care va conÆine numai numele obiectelor membre.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 219
Afiçarea listei obiectelor active (numele lor, propietåÆile, metodele çi evenimentele asocia-
te) se face cu comanda:
display object [ like <sablon>]
CondiÆia de existenÆå a unui obiect
Dupå eliberarea unui obiect (de exemplu prin închiderea formularului container), variabila de
memorie care a fost folositå pentru referirea lui va conÆine valoarea null. Çtergerea ei din me-
morie se va face printr-o comandå explicitå (release):
release <listå_nume_obiecte>
Pentru a testa dacå existå un obiect, folosiÆi urmåtoarea condiÆie:
type('<nume_ob>')='o' and not isnull (<nume_obiect>)
adicå trebuie îndeplinite douå condiÆii: tipul variabilei de memorie folosite pentru referirea
obiectului trebuie så fie o (object) çi variabila de memorie så nu aibå valoarea null,
deoarece dacå obiectul a fost eliberat, variabila are valoarea null.
Atunci când se creeazå o instanÆå a unei clase se påstreazå în memorie definiÆia clasei.
Aceastå definiÆie råmâne în memorie çi dupå ce obiectul a fost eliberat. Ea trebuie
çtearså explicit cu comanda:
clear <nume_cls>
2.2.3. Studiu de caz
Så se creeze un obiect care så descrie comportamentul unui numår complex. Obiectul va
avea proprietåÆile re (partea realå a numårului), im (partea imaginarå a numårului) çi
modul (modulul unui numår complex) çi metoda m pentru calculul modulului.
Pentru a crea çi a testa un astfel de obiect se vor scrie urmåtoarele linii de program într-un
fiçier surså, la fel ca çi programele pe care le-aÆi scris folosind limbajul gazdå. Blocul in-
strucÆiunii define class se scrie la sfârçit, dupå instrucÆiunile din program, la fel ca çi
subprogramele. Prin instrucÆiunile input atribuiÆi valori proprietåÆilor re çi im.
Exemplul 1
Pentru construirea metodei modul se va folosi un subprogram de tip procedurå. Prin
instrucÆiunea z.m apelaÆi metoda m pentru a calcula modulul, iar prin instrucÆiunea
?z.modul afiçaÆi valoarea proprietåÆii modul.
clear
set talk off
z=CreateObject('Complex')
input 're (partea reala a numarului)= ' to z.re
input 'im (partea imaginara a numarului)= ' to z.im
z.m
?z.modul
define class complex as custom
re=0
im=0
modul=0
procedure m
this.modul=sqrt(this.re**2 +this.im**2)
endproc
enddefine
220 Informatică
Exemplul 2
Pentru construirea metodei modul se va folosi un subprogram de tip funcÆie. Prin instruc-
Æiunea ?z.m() afiçaÆi valoarea furnizatå de metoda m. ObservaÆi cå pentru metodele care re-
turnezå valori folosite în expresii trebuie så scrieÆi între paranteze lista parametrilor actuali (în
acest caz lista este vidå; nu existå parametri pentru transferul datelor).
clear
set talk off
z=CreateObject('Complex')
input 're (partea reala a numarului)= ' to z.re
input 'im (partea imaginara a numarului)= ' to z.im
?z.modul()
define class complex as custom
re=0
im=0
m=0
function modul
this.m=sqrt(this.re**2+this.im**2)
return this.m
endfunc
enddefine
Exemplul 3
Pe baza clasei complex se defineçte o claså nouå complex1 care va conÆine în plus o metodå
pentru afiçarea numårului complex. Pentru definirea acestei metode se va folosi o metodå
internå a clasei nrc (metodå protejatå) pentru calcularea cifrelor unui numår çi proprietatea nc
care are ca valoare numårul de cifre al pårÆii întregi sau imaginare a numårului complex.
Aceastå proprietate este folositå numai intern çi de aceea este protejatå. Ea este necesarå
pentru a stabili numårul de poziÆii afiçabile ale unui numår pentru funcÆia str(). Prin instruc-
Æiunea z.afiçare se apeleazå metoda afisare pentru afiçarea unui numår complex. Clasa
complex1 a moçtenit toate proprietåÆile çi metodele clasei complex.
clear
set talk off
z=CreateObject('Complex1')
input 're (partea reala a numarului)= ' to z.re
input 'im (partea imaginara a numarului)= ' to z.im
?z.modul()
z.afisare
define class complex as custom
re=0
im=0
m=0
function modul
this.m=sqrt(this.re**2+this.im**2)
return this.m
endfunc
enddefine
define class complex1 as complex
protected nr
nr=0
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 221
procedure afisare
? 'Numarul complex este: '+str(this.re,this.nrc(this.re))
do case
case this.im>0
?? ' + i*'+str(this.im,this.nrc(this.im))
case this.im<0
?? ' - i*'+str(abs(this.im),this.nrc(this.im))
endcase
endproc
protected function nrc
parameter v
this.nr=1
do while v<>0
v=int(v/10)
this.nr=this.nr+1
enddo
return this.nr
endfunc
enddefine
2 . 3 . P r i n c i p i i l e p r o g r a m ăr i i c o n d u s e d e ev e n i m e n t e
2 . 4 . F o l o s i r e a p r o g r a m ă r i i o r i e n t a t e p e o b i e c t e în r e a l i z a r e a
i n t e r f e ţ e i u n e i a p l i c a ţi i
InterfaÆa graficå cu o aplicaÆie afiçeazå mai multe ecrane cu obiecte prin intermediul cårora utili-
zatorul interacÆioneazå cu aplicaÆia pentru a controla evoluÆia ei sau pentru a cere så execute
diferite procese prin care se prelucreazå datele în vederea obÆinerii de informaÆii (de exemplu,
procesul de cåutare într-o bazå de date a unor date care corespund unui anumit criteriu).
222 Informatică
Container ConÆinut
grup de butoane de comandå butoane de comandå
grup cu butoane de opÆiuni butoane de opÆiuni
set de pagini pagini
paginå controale, containere, obiecte utilizator
set de formulare formulare, bare de instrumente
formular set de pagini, controale, containere, obiecte utilizator
grilå coloane într-o grilå
coloanå într-o grilå antet de coloanå çi orice obiect cu excepÆia formulare-
lor, a seturilor de formulare, a coloanelor într-o grilå çi a
barelor cu instrumente
barå de instrumente controale, seturi de paginå, containere
AÆi mai observat cå unele obiecte nu pot fi definite independent, ci numai în interiorul unui
container. De exemplu:
Obiect Container
antet de coloanå coloanå într-o grilå
buton pentru opÆiune grup de butoane pentru opÆiuni
coloanå într-o grilå grilå
paginå set de pagini
separator barå de instrumente
Pe lângå aceste obiecte predefinite care creeazå obiecte vizuale într-o aplicaÆie, mai
puteÆi folosi urmåtoarele obiecte predefinite:
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 225
2 . 5 . B i b l i o t e c i l e d e c la s e
Biblioteca de clase (class library) este folositå pentru a påstra o colecÆie de clase
vizuale. Se memoreazå într-un fiçier cu extensia .vcx.
Asupra unei biblioteci de clase se pot executa urmåtoarele operaÆii:
crearea bibliotecii
create classlib
remove class
Biblioteca
deschidere bibliotecå
set classlib to
OpreaÆii de
exploatare
biblioteca precizatå
release classlib
închidere
bibliotecå toate bibliotecile
set classlib to
Comanda create classlib are sintaxa:
create classlib <nume_bib>
çi creeazå o bibliotecå de clase cu numele <nume_bib> (implicit çi numele fiçierului).
Biblioteca va fi vidå.
Comanda add class are sintaxa:
add class <nume_cls> [of <nume_bib1>] to <nume_bib1> [overwrite]
La biblioteca precizatå prin <nume_bib1> se adaugå clasa identificatå prin <nume_cls>.
Implicit aceastå claså poate fi în orice bibliotecå deschiså. Explicit ea este preluatå din
biblioteca precizatå prin clauza of çi identificatå prin <nume_bib2>. Biblioteca nu poate fi
adåugatå dintr-un program, dintr-o aplicaÆie sau dintr-un fiçier de proceduri.
Comanda remove class are sintaxa:
remove class <nume_cls> of <nume_bib>]
çi înlåturå definiÆia clasei cu numele <nume_cls> din biblioteca precizatå prin <nume_bib>.
Comanda set classlib to are sintaxa:
set classlib to <nume_bib> [additive]
228 Informatică
Dacå aÆi deschis o bibliotecå, toate definiÆiile Ce se întâmplå dacå înlåturaÆi dintr-o
bibliotecå de clase o claså pårinte
claselor vor fi påstrate în memoria internå. Dacå
pentru alte clase din bibliotecå?
vreÆi så le çtergeÆi, puteÆi folosi comanda clear:
clear <nume_bib>
Trebuie så aveÆi grijå ca atunci când executaÆi aceastå operaÆie de çtergere så nu existe
o instanÆå a nici unei clase din bibliotecå.
if this.y=0 this.a=-this.a+pi()
this.a=0 endif
else else
this.a=pi()/2 if this.y<0
endif this.a=-a+2*pi()
else endif
this.a=atan(abs(this.x/; endif
this.y)) endif
if this.x<0 this.a=this.a*180/pi()
if this.y<=0 return this.a
this.a=this.a+pi() endfunc
else enddefine
a. IdentificaÆi clasele çi obiectele, proprietåÆile çi metodele obiectului.
b. ExplicaÆi ce realizeazå programul.
c. Pe baza acestui program definiÆi obiectul dreaptå cu metodele generare çi calculul
lungimii çi obiectul dreptunghi cu metodele generare çi calculul ariei çi al perimetrului.
2. IdentificaÆi çi corectaÆi erorile din urmåtorul program:
clear input 'x= ' to z.c(1)
set talk off input 'y= ' to z.c(2)
z=CreateObject("Complex") endproc
z.citire function modul
?z.modul() this.m=sqrt(this.c(1)**2+;
define class complex as custom this.c(2)**2)
dimension c(2) return this.m
m=0 endfunc
procedure citire enddefine
3. ComparaÆi urmåtoarea variantå de program cu cea prezentatå ca exemplu în studiul
de caz. VerificaÆi dacå aceastå variantå este corectå. Ce concluzie trageÆi din compa-
rarea celor douå versiuni?
clear im=0
set talk off m=0
z=CreateObject("Complex") function modul
input 're= ' to z.re parameter re,im
input 'im= ' to z.im this.modul=sqrt(re**2+im**2)
?z.m(z.re,z.im) return this.m
define class complex as custom endfunc
re=0 enddefine
4. AdåugaÆi obiectului complex metoda pentru citirea numårului complex:
procedure citire
input 're= ' to this.re
input 'im= ' to this.im
endproc
ModificaÆi corespunzåtor programul astfel încât citirea numårului complex så se facå
prin intermediul acestei metode.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 231
# ÎncercaÆi:
Adevårat/Fals:
1. În definiÆia unei clase de obiecte metodele se scriu înaintea proprietåÆilor.
2. Într-un program definiÆia clasei de obiecte se face înaintea de a crea obiectul.
3. Într-o metodå nu se poate defini o claså de obiecte.
4. Parametrii metodelor pot avea acelaçi nume ca çi proprietåÆile obiectului.
5. InstrucÆiunea with ... endwith poate fi folositå în instrucÆiunea pentru definirea unei clase.
6. Clasele pot fi adåugate la biblioteci din fiçiere de programe.
7. O claså pårinte moçteneçte proprietåÆile çi metodele de la urmaçi.
8. În definiÆia unei clase trebuie precizatå obligatoriu clasa pårinte.
9. AcÆiunea metodelor çi råspunsul la evenimente se defineçte cu ajutorul subprogramelor.
CompletaÆi:
1. InstrucÆiunea pentru definirea clasei este o instrucÆiune ........... delimitatå de cuvintele
cheie ............................... çi ..............................
2. AcÆiunea metodelor se defineçte prin intermediul .........................
232 Informatică
R åspunsuri:
Adevårat/Fals: 1-F; 2-F; 3-A; 4-A; 5-F; 6-F; 7-F; 8-A; 9-A;.
CompletaÆi: 1-bloc, define class, enddefine; 2-subprogramelor;
AlegeÆi råspunsurile corecte: 1-b; 2- a; 3- b; 4-a; 5-b.
3 . P r o g r a m a r e a v i z u a lă
3 . 1 . R e a l i z a r e a i n t e r f e ţe i
Fiecare tip de control are propriul såu set de proprietåÆi, metode çi evenimente care îl fac
potrivit unui anumit scop. Unele dintre cotroalele pe care le puteÆi folosi în aplicaÆii sunt
cele mai potrivite pentru introducerea çi afiçarea datelor. Altele vå permit så cereÆi exe-
cutarea unui proces în cadrul aplicaÆiei sau vå permit accesul la alte aplicaÆii ca så puteÆi
prelucra unele date ca çi cum ar face parte din propria aplicaÆie.
Într-o interfaÆå pot fi folosite urmåtoarele tipuri de controale:
9 controalele pentru executarea acÆiunilor: butonul de comandå, opÆiunea de meniu;
9 controalele pentru introducerea çi afiçarea datelor: eticheta, caseta de text, zona
de editare, caseta de text cu derulor, grila;
9 controalele care îi permit utilizatorului så aleagå: comutatorul, lista, lista combi-
natå, grupul cu butoane de opÆiuni;
9 controalele grafice: linia, chenarul, imaginea, forma;
9 controalele care îi permit afiçarea obiectelor inserabile create cu alte aplicaÆii.
9 Bare cu instrumente (toolbar). Este o casetå de dialog mai specialå care conÆine
numai butoane de comandå reprezentate în general prin pictograme. Ea poate fi
mobilå (float), adicå poate fi afiçatå oriunde în interiorul ferestrei de aplicaÆie sau fixå
(dock), adicå poate fi lipitå de una dintre marginile ferestrei de aplicaÆie. Bara de titlu
este afiçatå numai în barele cu instrumente flotante.
Pentru implementarea acestor obiecte pentru interfaÆå, Visual FoxPro pune la dispoziÆia pro-
gramatorului urmåtoarele obiecte vizuale predefinite:
9 Pentru formulare: FormSet, Form, Page, !
PageFrame çi ToolBar.
AsociaÆi obiectele vizuale predefinite
9 Pentru controale: EditBox, TextBox, Label,
prezentate în capitolul anterior, cu tipu-
Spinner, Grid, OptionButtonGroup, ListBox, rile de controale definite în acest capitol.
ComboBox, CheckBox, CommandButton.
Crearea obiectelor de interfaÆå se poate face în douå moduri:
9 Prin crearea unui program în care obiectele sunt descrise prin intermediul instrucÆiu-
nilor de program. La crearea obiectelor se pot folosi clasele predefinite de obiecte
specifice programårii orientate pe obiecte. Dupå crearea programului surså, pentru a
realiza interfaÆa, trebuie lansat în execuÆie programul cu comanda do <nume_fiçier>.
9 Folosind programarea vizualå. În acest caz, caracteristicile formularelor sunt înre-
gistrate sub forma unui tabel într-un fiçier de date care are extensia .scx. Aceste date
sunt interpretate de un modul al sistemului. Lansarea în execuÆie a acestui modul,
împreunå cu fiçierul care conÆine tabelul (<nume_formular>) se face cu comanda:
do form <nume_formular> with <lista_parametri_actuali>
Comanda de lansare în execuÆie va crea formularul. Ea poate fi scriså într-un modul de
program (modulul apelant al formularului). Adverbul <lista_parametri_actuali> reprezintå o
listå de variabile çi/sau constante de tipuri diferite care se transmit formularului la lansarea
în execuÆie.
3.1.2. Proiectarea interfeÆei
Atunci când se proiecteazå o aplicaÆie, trebuie luate mai multe decizii referitoare la interfaÆå:
Ò ce stil de interfaÆå se va folosi?
Ò de câte formulare este nevoie?
Ò ce comenzi vor fi incluse în meniuri?
Ò se va folosi o barå cu instrumente pentru a dubla opÆiunile
de meniu cu butoane scurtåturi cu pictograme?
Ò ce asistenÆå se va oferi utilizatorului?
Ò ce casete de dialog vor fi folosite pentru a asigura interac-
tivitatea cu utilizatorul?
Elementele de interfaÆå ale unei aplicaÆii sunt dependente de funcÆiile pe care trebuie så
le îndeplineascå aplicaÆia. În plus, atunci când se proiecteazå interfaÆa unei aplicaÆii,
trebuie proiectate çi urmåtoarele elemente:
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 235
Formularul de început (startup form). Este primul formular care se afiçeazå çi reprezintå
ce va vedea prima datå utilizatorul când va porni aplicaÆia. Unele interfeÆe nu au un
formular specific de început. Acest caz apare atunci când aplicaÆia începe cu încårcarea
unui fiçier de date çi testarea unor date, iar primul formular care va fi afiçat va depinde de
rezultatul testului. Formularul de început poate fi o casetå prin care se cere introducerea
unei parole prin care utilizatorul îçi câçtigå dreptul de a folosi aplicaÆia. Asupra parolei se
pot pune restricÆii. De exemplu, dacå utilizatorul nu a introdus parola corectå din trei
încercåri, se va afiça un mesaj de eroare çi se va termina execuÆia programului.
Ecranul introductiv (splash screen). Dacå dureazå foarte mult încårcarea çi lansarea în
execuÆie a unei aplicaÆii, este bine ca în acest timp så fie afiçat un ecran introductiv în
care se poate afiça un mesaj sau emblema firmei.
Formularul de sfârçit (ending form). Este ultimul formular care se afiçeazå la terminarea
aplicaÆiei. Este bine ca acest formular så conÆinå un buton de închidere a aplicaÆiei care
så fie acÆionat de utilizator, operaÆie care så ofere siguranÆa închiderii tuturor fiçierelor çi
descårcårii tuturor formularelor interfeÆei aplicaÆiei. Unele interfeÆe rezolvå închiderea
aplicaÆiei prin opÆiunea de meniu Exit∈File, care terminå execuÆia aplicaÆiei, închide toate
fiçierele çi descarcå toate formularele deschise.
Înainte de a se proiecta interfaÆa trebuie så se cunoascå scopul aplicaÆiei. Unele aplicaÆii sunt
folosite în mod constant, iar altele ocazional pe o perioadå scurtå de timp. De asemenea, o
aplicaÆie care are ca scop principal afiçarea informaÆiilor are cerinÆe diferite faÆå de una care
este folositå pentru a colecta date. InterfaÆa este influenÆatå çi de categoria de utilizatori care
o va folosi. Dacå sunt utilizatori începåtori, interfaÆa trebuie så fie cât mai simplå, iar dacå
utilizatorii sunt experimentaÆi ea poate så fie mai complexå. În plus, dacå aplicaÆia va cunoaç-
te o distribuÆie internaÆionalå, trebuie så Æinå cont de limba çi cultura viitorilor utilizatori.
Orice interfaÆå trebuie så îndeplineascå urmåtoarele cerinÆe ale utilizatorului:
9 InterfaÆa trebuie så-i permitå utilizatorului så controleze evoluÆia programului.
9 Sistemul de meniuri trebuie så fie concis, eficient, logic çi bine structurat.
9 Ecranul nu trebuie aglomerat cu obiecte. Dacå o fereastrå conÆine prea multe butoa-
ne, ele ar trebui înlocuite cu opÆiuni de meniu. Se vor afiça sub formå de butoane
numai controalele care sunt folosite foarte des.
9 InterfaÆa trebuie så-i ofere utilizatorului o reprezentare vizualå complexå a opÆiunilor
de lucru ale aplicaÆiei la momentul respectiv. Folosirea porprietåÆåÆilor de disponibilita-
te sau de vizibilitate ale unui obiect vizual este foarte importantå deoarece împiedicå
accesul uitilizatorului la obiectele care nu pot fi acÆionate în acel moment.
9 Utilizatorul trebuie så fie informat continuu de starea programului. Dacå un proces
dureazå prea mult timp, interfaÆa nu trebuie så îngheÆe, deoarece utilizatorul nu mai
çtie dacå procesul continuå sau s-a blocat. În acest caz, utilizatorul va fi informat cå
procesul continuå fie prin transformarea formei cursorului, fie prin afiçarea unui contor
care numårå paçii parcurçi de proces, fie prin afiçarea unui indicator de evoluÆie, fie
prin imagini grafice animate.
9 InterfaÆa trebuie så permitå anularea unor operaÆii pentru ca utilizatorul så-çi poatå
corecta uçor unele greçeli, fie de introducere a datelor, fie de prelucrare a lor. Pentru
operaÆiile de çtergere este bine så cereÆi confirmarea operaÆiei. Pentru operaÆiile de
introducere a datelor trebuie så prevedeÆi cât mai multe operaÆii de verificare a
236 Informatică
corectitudinii datelor introduse (prin compararea lor cu limitele permise, prin introduce-
rea aceloraçi date de douå ori çi compararea celor douå valori introduse etc.).
9 AplicaÆia trebuie så prevadå cât mai multe cazuri de eroare astfel încât så poatå func-
Æiona în cât mai multe condiÆii ale datelor de intrare. Orice eroare detectabilå trebuie så
declançeze un proces de informare a utilizatorului (prin mesaje care så precizeze
cauzele erorii çi eventual prin sunete pentru atenÆionare) çi de recuperare a datelor.
Stilul interfeÆei se alege în funcÆie de tipul aplicaÆiei. Stilul MDI se foloseçte la aplicaÆiile care
necesitå frecvent vizualizarea simultanå a mai multor documente pentru a le compara sau
pentru a face transfer de date între ele cum este de exemplu procesorul de texte (Word). În
cazul altor tipuri de aplicaÆii (cum sunt aplicaÆiile de tip calendar sau calculator) este
suficient så se deschidå un singur document çi de aceea se foloseçte o interfaÆå SDI. În
general, stilul SDI este cel mai råspândit deoarece este un stil de interfaÆå pe care
proiectantul produsului o creeazå mai uçor çi care este mai simplå çi pentru utilizator.
Stilul MDI permite crearea unei interfeÆe care administreazå mai multe formulare într-un
singur formular container. Formularul container se mai numeçte çi fereastrå pårinte
(parent window), iar formularele din interiorul såu se numesc ferestre copil (child
windows). O aplicaÆie MDI poate avea un singur formular pårinte çi mai multe formulare
copil. Formularul pårinte nu poate fi un formular modal. Ferestrele copil pot fi de acelaçi
tip sau de tipuri diferite. Fereastra pårinte furnizeazå un spaÆiu de lucru (workspace)
pentru toate ferestrele copil ale aplicaÆiei. SpaÆiul de lucru este delimitat de bordura
formularului pårinte çi este situat sub bara de meniu.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 237
3.1.6. Focalizarea
Focalizarea (focus) este capacitatea aplicaÆiei de a primi datele de intrare
ale utilizatorului prin intermediul tastaturii sau al mouse-ului.
Ea se manifestå în cadrul interfeÆei prin prezenÆa selectorului. Când selectorul este pozi-
Æionat pe un obiect, acesta va putea primi datele de intrare ale utilizatorului. Pe de o par-
te, sistemul de operare Windows permite lansarea în execuÆie a mai multor aplicaÆii la un
moment dat, dar numai una dintre aplicaÆii are capacitatea de focalizare. Aceasta este
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 241
aplicaÆia activå, adicå aplicaÆia care va primi datele de intrare furnizate de utilizator. Pe
de altå parte, în cadrul unei aplicaÆii la un moment dat pot fi deschise mai multe formu-
lare, înså un singur formular are capacitatea de focalizare çi se numeçte formular activ,
iar în cadrul formularului activ un singur control poate primi focalizarea çi se numeçte
control activ.
Înainte de a focaliza un obiect trebuie activat containerul, acÆiune sesizatå prin eveni-
mentul Activates. Containerul se activeazå:
9 Interactiv: utilizatorul executå clic pe obiectul container.
9 Din program: se apeleazå metoda Show (afiçarea) a obiectului container.
Evenimentul Activate se declançeazå în ordinea de incluziune a formularelor: mai întâi
pentru obiectul FormSet, apoi pentru obiectele Form conÆinute de acesta çi în final pentru
obiectele Page din obiectele Form.
Dupå activarea containerului, un obiect poate fi focalizat:
9 Interactiv: utilizatorul executå clic pe obiect sau apaså repetat tasta Tab pânå
focalizeazå obiectul dorit.
9 Din program: se apeleazå metoda SetFocuss a controlului pe care vreÆi så-l focalizaÆi.
Un obiect îçi poate pierde focalizarea:
9 Interactiv: utilizatorul focalizeazå alt obiect executând clic pe acel obiect.
9 Din program: se apeleazå metoda SetFocuss a controlului pe care-l doriÆi så preia
focali-zarea.
De aceea, formularele çi cele mai multe dintre controale au asociate evenimente de pri-
mire a focalizårii çi de pierdere a focalizårii. Aceste evenimente sunt:
9 Primirea focalizårii declançeazå evenimentul GotFocuss.
9 Pierderea focalizårii declançeazå evenimentul LostFocuss.
Programatorul poate scrie proceduri pentru aceste evenimente, la nivelul fiecårui control.
De exemplu, atunci când un control primeçte focalizarea (evenimentul GotFocus), prin
intermediul procedurii asociate evenimentului pot fi afiçate în casete instrucÆiuni referi-
toare la control sau în bara de stare mesaje de informare despre control.
Obiectul focalizat este evidenÆiat prin diferite metode. De exemplu, un buton declançator
focalizat este evidenÆiat printr-o bordurå care înconjoarå butonul.
Un obiect poate fi focalizat numai dacå are proprietatea de a fi disponibil (de a råspunde
la acÆionåri de la tastaturå sau mouse) çi proprietatea de a fi vizibil pe ecran. Nu pot fi
focalizate urmåtoarele obiecte: eticheta, linia, forma, imaginea çi caseta de imagine.
Focalizarea este controlatå prin douå proprietåÆi de tip referinÆå (adreså), specifice formula-
relor, care sunt protejate la scriere - read-only - çi nu pot fi modificate de programator:
9 ActiveForms - formularul activ. Este o proprietate prin care se face referirea la for-
mularul activ dintr-un set de formulare sau de pe ecran. Poate fi folosit în obiectele
container: Form, FormSet, _Screen. Folosind aceastå referinÆå puteÆi modifica valoa-
rea unei proprietåÆi a formularului activ sau puteÆi apela o metodå a formularului activ:
<nume_obiect_container>.ActiveForm.<proprietate>=<valoare>
<nume_obiect_container>.ActiveForm.<metodå>
242 Informatică
3 . 2 . P r i n c i p i i l e p r o g r a m ăr i i v i z u a l e
Chiar dacå se uçureazå munca programatorului atunci când construieçte interfaÆa cu
ajutorul obiectelor create pe baza claselor vizuale predefinite puse la dispoziÆie de
programarea pe obiecte, din exemplele prezentate se poate vedea cå çi aceastå metodå
este destul de laborioaså. De aceea, pentru construirea interfeÆei se recomandå metoda
vizualå. Açadar:
Programarea vizualå constå în folosirea unor instrumente interactive care ajutå
programatorul så precizeze diferite opÆiuni çi så contruiascå diferite elemente ale
aplicaÆiei, pe baza cårora sistemul genereazå apoi codul programului.
Programarea vizualå se bazeazå pe programarea orientatå pe obiecte (codul de program
este generat folosind programarea orientatå pe obiecte). Metoda vizualå creçte producti-
vitatea programatorului.
Recomandare: Pentru construirea elementelor aplicaÆiei, se recomandå folosirea
metodei vizuale, iar acolo unde nu obÆineÆi efectul dorit folosind aceastå metodå, veÆi
folosi metoda clasicå a programårii structurate pentru a scrie programul.
Programarea vizualå pune la dispoziÆia programatorului douå instrumente interactive:
Ò constructori çi
Ò proceduri asistent.
tori rapizi, fiecare dintre ei specializat pentru un anumit obiect de interfaÆå. Fiecare
constructor rapid afiçeazå anumite secÆiuni, în funcÆie de obiect. Fiecare secÆiune
grupeazå anumite caracteristici ale obiectului care corespund unei categorii de
proprietåÆi. Existå constructori rapizi pentru:
Formulare: Form Builder.
Controale: Combo Box Builder, Command Group Builder, Edit Box Builder,
Text Box Builder, List Box Builder, Option Group Builder.
9 Form Designer - Constructorul normal - care permite construirea unor formulare
complexe. Constructorul pune la dispoziÆia proiectantului diferite instrumente: bara cu
obiectele care pot fi inserate în formular, bara cu instrumente ale aplicaÆiei constructor,
fereastra pentru stabilirea proprietåÆilor, fereastra pentru stabilirea procedurilor
asociate evenimentelor çi metodelor etc. Prin intermediul lor proiectantul atribuie valori
proprietåÆilor (identificate prin numele lor) çi scrie procedurile asociate metodelor çi
evenimentelor.
Pentru lansarea în execuÆie a constructorului folosiÆi comanda:
create form <nume_formular>
unde <nume_formular> este numele fiçierului în care se salveazå formularul.
Pentru modificarea formularului cu ajutorul constructorului folosiÆi comanda:
modify form <nume_formular>
unde <nume_formular> este numele fiçierului în care se salveazå formularul.
Procedura asistent pentru construirea formularelor
Procedura asistent Form Wizard construieçte ea însåçi formularul pe baza unor infor-
maÆii furnizate de proiectant prin intermediul unui dialog desfåçurat în mai mulÆi paçi.
Proiectantul nu modificå proprietåÆile çi nu scrie codurile procedurilor.
Deoarece fiçierul în care este memorat formularul are o structurå de tabel el poate fi
deschis cu comanda use çi vizualizat apoi cu comanda browse. Caracteristicile unui
obiect al formularului sunt memorate în câte o înregistrare fiecare, iar în fiecare coloanå
câte o caracteristicå. De exemplu, coloana Properties conÆine câmpuri de tip memo în
care sunt memorate proprietåÆile care au valori diferite de cele implicite, iar coloana
Methods conÆine câmpuri de tip memo în care sunt memorate procedurile asociate
metodelor çi evenimentelor obiectului.
Pentru a afiça formularul creat pe ecran çi pentru a permite utilizatorului så interacÆioneze
cu obiectele de interfaÆå pe care le conÆine, formularul trebuie lansat în execuÆie prin
comanda:
do form <nume_formular> [with <lista_parametri >] [to < parametru_ieçire>]
Transferul parametrilor se face astfel:
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 245
Formularul
<nume_formular>.scx
partea inferioarå ferestrei sunt afiçate douå liste ascunse: Form care este disponibilå
numai dacå aÆi creat un set de
formulare çi vå permite så
alegeÆi un formular din set çi
Page care este disponibilå
numai dacå aÆi creat un set de
pagini çi vå permite så alegeÆi
o paginå din set.
AlegeÆi opÆiunea
Quick Form...∈Form. Se
deschide caseta de dialog
Form Builder. Caseta de dia-
log conÆine douå secÆiuni: sec-
Æiunea Field Section din care
alegeÆi câmpurile din baza de
date pentru care doriÆi så creaÆi obiecte în formular pentru editarea datelor. AlegeÆi toate
câmpurile din tabel: din lista Available Fields selectaÆi câmpul çi executaÆi clic pe
butonul 8 . Din secÆiunea Style alegeÆi stilul formularului (alegeÆi opÆiunea Embosed din
lista Style). ÎnchideÆi caseta de dialog executând clic pe declançatorul OK.
248 Informatică
AutoOpen - Dacå are valoarea .T. tabelele çi vizualizårile din mediul de date sunt
deschise automat o datå cu crearea formularului.
AutoClose - Dacå are valoarea .T. tabelele çi vizualizårile din mediul de date sunt
închise automat o datå cu eliberarea formularului.
9 Evenimentele la care poate råspunde mediul datelor sunt:
BeforeOpenTables - Evenimentul este declançat înaintea deschiderii tabelelor çi
a vizualizårilor din mediul de date. Se declançeazå înaintea evenimentului Load al for-
mularului pentru cå tabelele trebuie så fie deschise înainte de iniÆializarea formu-
larului, deoarece în formular trebuie afiçate date din aceste tabele çi vizualizåri. În
procedura asociatå acestui eveniment se pot stabili numele tabelelor çi vizualizårilor
care se vor deschide çi locul în care sunt memorate pe disc.
AfterCloseTables - Evenimentul este declançat dupå închiderea tabelelor çi a vizua-
lizårilor din mediul de date (este provocat de fiecare apel al metodei CloseTables). Se
declançeazå dupå descårcarea formularului (dupå evenimentul Unload al formula-
rului).
9 Metodele pe care le poate executa mediul de date sunt:
OpenTables - dechiderea tabelelor çi vizualizårilor din mediul de date; în aceastå
metodå se scriu instrucÆiunile pentru deschiderea tabelelor în diferite zone de lucru.
CloseTables - închiderea tabelelor çi vizualizårilor din mediul de date; în aceastå
metodå se scriu instrucÆiunile pentru închiderea tabelelor deschise în diferite zone de
lucru.
Formularul Formx
Cu ajutorul acestui tip de obiect vizual puteÆi crea formulare de tip fereastrå sau casetå
de dialog.
Formularele au proprietåÆi, metode çi evenimente cu care le este controlat aspectul çi
comportamentul. Pe lângå proprietåÆile standard, formularele mai au urmåtoarele
proprietåÆi specifice care determinå aspectul çi comportamentul lor:
9 Starea ferestrei - WindowStates. Este o proprietatea de tip numeric care con-
troleazå starea în care se gåseçte fereastra: normalå (0), minimizatå (1) sau maxi-
mizatå (2). Fereastra minimizatå ve fi reduså fie la o dimensiune minimå, fie la o picto-
gramå. Fereastra maximizatå va fi måritå astfel încât så ocupe tot ecranul.
9 Dimensiunile ferestrei minimizate sunt specificate prin proprietåÆile de tip numeric:
MinHeight - înålÆimea ferestrei minimizate;
MinWidth - låÆimea ferestrei minimizate.
9 Pictograma ferestrei minimizate - Icon . Este de tip çir de caractere çi reprezintå
identificatorul fiçierului care conÆine pictograma asociatå ferestrei minimizate. Fiçierul
trebuie så fie de tip fiçier de pictograme (.ico).
9 Pictograma meniului de control - Picture . Este de tip çir de caratere çi reprezintå
identificatorul fiçierului sau numele unui câmp de tip General care conÆine pictograma
asociatå butonului meniului de control. Fiçierul trebuie så fie de tip bitmap (.bmp) sau
de pictograme (.ico).
9 Scara de poziÆionare - ScaleMod . Este de tip numeric çi reprezintå un cod pentru
unitatea de måsurå folositå pentru coordonatele obiectului. Are valoarea 0 pentru
unitatea de måsurå Foxels (unitate specificå mediului Visual FoxPro, echivalentå cu
înålÆimea maximå çi låÆimea medie a unui caracter din fontul curent çi 3 pentru pixeli.
9 Coordonatele poziÆiei în care se poate începe scrierea unui text sau desenarea unui
obiect grafic într-un formular sunt specificate prin proprietåÆile de tip numeric:
CurentX - coordonata <x>;
CurentY - coordonata <y>.
9 Centrarea formularului - AutoCenter . Este o proprietate de tip logic. Dacå are
valoarea .T. formularul este afiçat automat în centrul reperului (ecran sau alt formular) fårå
så se Æinå cont de valorile proprietåÆilor Left çi Top.
9 Acoperirea formularului - AlwaysOnTop . Este o proprietate de tip logic. Dacå are
valoarea .T. formularul nu poate fi acoperit de alte formulare.
9 Umplerea este specificatå prin proprietåÆile de tip numeric:
FillStyle - modelul care va fi afiçat în fundalul formularului;
FillColor - culoarea modelului afiçat în fundalul formularului.
9 Butoanele specifice unui formular sunt precizate prin proprietåÆile de tip logic:
MinButton - controleazå dacå formularul are buton de minimizare sau nu;
MaxButton - controleazå dacå formularul are buton de maximizare sau nu;
252 Informatică
ControlBox - controleazå dacå formularul are buton de meniu de control sau nu.
9 ProprietåÆi legate de comportament sunt specificate prin proprietåÆile de tip logic:
Closable - controleazå dacå formularul poate fi închis folosind meniul de control
(opÆiunea Close a meniului sau dublu clic pe butonul meniului) sau nu;
Movable - controleazå dacå formularul poate fi mutat sau nu;
9 Afiçarea casetelor cu informaÆii despre controalele din formular ShowTips este
de tip logic: dacå are valoarea .T. (implicit în ToolBar) se afiçeazå caseta cu informaÆii
despre controlul indicat cu mouse-ul (ToolTip), iar dacå are valoarea .F. (implicit în
Form) nu se afiçeazå caseta.
Evenimentele la care pot råspunde formularele sunt:
9 Redimensionarea formularului Resize - este declançat fie prin schimbarea interac-
tivå a dimensiunii formularului, fie prin modificarea din program a dimensiunii sale
(proprietåÆile Height çi Width).
9 Mutarea formularului Moved - este declançat fie prin mutarea interactivå a formula-
rului, fie prin modificarea din program a poziÆiei sale (proprietåÆile Top çi Left).
Metodele pe care le pot executa formularele sunt:
9 Metoda de mutare a formularului pe ecran Move .
9 Metoda de desenare a unei linii în formular Line ; prin intermediul parametrilor se
vor preciza coordonatele primului punct (x1,y1) çi coordonatele celui de al doilea
punct (x2,y2). Parametrii se vor scrie între paranteze rotunde, dupå numele metodei.
Dupå desenare, coordonatele poziÆiei de desenare vor fi (x2,y2).
9 Metoda de desenare a unui dreptunghi în formular Box ; prin intermediul parametrilor
se vor preciza coordonatele colÆului din stânga sus (x1,y1) çi coordonatele colÆului din
dreapta jos (x2,y2). Dupå desenare, coordonatele poziÆiei de desenare vor fi (x2,y2).
9 Metoda de desenare a unui cerc în formular Circle ; prin intermediul parametrilor se
vor preciza raza cercului çi coordonatele centrului cercului (x,y). Dupå desenare,
coordonatele poziÆiei de desenare vor fi (x,y).
9 Metoda de scrierea a unui text în formular Print ; prin intermediul parametrului se
precizeazå çirul de caractere care va fi scris. Dupå scriere, coordonatele poziÆiei de
desenare vor fi cele de la sfârçitul textului.
9 Metoda de çtergere a textului çi a desenelor din formular Cls . Dupå çtergere,
coordo-natele poziÆiei de desenare vor fi (0,0).
OpÆiunea SemnificaÆia
Form Controls OpÆiune de tip comutator. Controleazå afiçarea barei cu instrumente pentru
Toolbar crearea obiectelor în formular.
Layout Toolbar OpÆiune de tip comutator. Controleazå afiçarea barei cu instrumente pentru
administrarea obiectelor în formular.
Color Palette OpÆiune de tip comutator. Controleazå afiçarea barei cu instrumente pentru
Toolbar stabilirea culorilor.
Tab Order Permite modificarea ordinii de focalizare cu tasta Tab a obiectelor din formular.
Ordinea implicitå este cea în care au fost proiectate (adåugate la formular).
Grid Lines OpÆiune de tip comutator. Afiçeazå/ascunde grila pentru alinierea obiectelor.
Show Position OpÆiune de tip comutator. Controleazå afiçarea în bara de stare a poziÆiei çi
dimensiunii obiectului selectat.
Meniul Format
Snap To Grid OpÆiune de tip comutator. Controleazå alinierea automatå a obiectelor nou create
la liniile grilei.
Set Grid Scale Permite modificarea distanÆelor (în pixeli) dintre liniile grilei.
Meniul Form
New Property... Creeazå o proprietate nouå pentru o claså definitå de utilizator. Se deschide
caseta de dialog New Property prin intermediul cåreia stabiliÆi numele çi
descrierea proprietåÆii.
New Method... Creeazå o metodå nouå pentru o claså definitå de utilizator. Se deschide caseta de
dialog New Method prin intermediul cåreia stabiliÆi numele çi descrierea metodei.
Edit Property/ Permite modificarea sau çtergerea unei proprietåÆi sau metode definite de utiliza-
Method... tor. Se deschide caseta de dialog Modify Property/Method prin intermediul
cåreia administraÆi proprietåÆile çi metodele definite.
Include File...
Permite specificarea numelui fiçierului cu constante predefinite ale clasei definite
de utilizator.
Create Form Creeazå un set de formulare care va conÆine formularul curent. Dacå existå deja
Set un set de formulare, opÆiunea nu este disponibilå.
Remove Form Înlåturå setul de formulare. OpÆiunea este disponibilå numai dacå existå un set de
Set formulare, iar acesta conÆine numai un formular.
Add New Form Adaugå un formular la setul de formulare. OpÆiunea este disponibilå numai dacå a
fost creat un set de formulare.
Remove Form Înlåturå formularul curent din set. OpÆiunea este disponibilå numai dacå a fost
creat un set de formulare, iar acesta conÆine mai mult de un formular.
Quick Form... Deschide fereastra Constructorului rapid de formulare.
Run Form Lanseazå în execuÆie formularul.
IdentificaÆi instrumentele specifice constructorului de formulare: butoanele din barele
de instrumente, ferestrele çi opÆiunile de meniu specifice acestei aplicaÆii.
AfiçaÆi barele cu instrumente çi identificaÆi pe fiecare barå controalele pe care le puteÆi
folosi.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 255
1 2 3 4 5 6 7 8 9
Buton Buton Buton
1 Set Tab Order 4 Code Window 7 Layout Toolbar
2 Data Environment 5 Form Control Toolbar 8 Form Builder
3 Properties Windows 6 Color Palette Toolbar 9 Auto Format
Majoritatea butoanelor din bara Form Designer pot fi folosite pentru a stabili ce
instrumente ale aplicaÆiei veÆi afiça (fereastra de proprietåÆi, fereastra de cod etc). Butonul
FormBuilder îl puteÆi folosi pentru lansa în execuÆie Constructorul rapid pentru formulare.
Butonul AutoFormat îl veÆi folosi atunci când veÆi dori så aplicaÆi un anumit stil de formatare
asupra obiectelor de acelaçi tip, selectate. Stilul de formatare se referå la aspectul
chenarului, la culorile folosite, la fonturile caracterelor, la alinierea obiectelor çi la efectul 3D
al obiectelor. La acÆionarea acestui buton se deschide fereastra aplicaÆiei Constructorului
de format: AutoFormat Builder. IdentificaÆi opÆiunile de meniu pentru care butoanele din
aceastå barå sunt scurtåturi.
1 2 3 4 5 6 7 8 9 10 11 12 13
OpÆiunea SemnificaÆie
Paste F Insereazå în formular, în poziÆia indicatå, obiectul care fost copiat anterior în
Clipboard.
Data F Deschide fereastra Data Environment
Environment
Properties F,O Afiçeazå în fereastra de proprietåÆi formularul sau obiectul selectat.
Builder F,O Deschide fereastra Constructorului rapid de formulare corespunzåtoare
obiectului selectat.
Code F,O Deschide fereastra pentru scrierea secvenÆei de cod asociate unei metode
sau eveniment al obiectului selectat.
Help F,O Deschide fereastra cu informaÆii despre obiect (help dependent de context).
SecÆiunea ConÆine
All Toate proprietåÆile
Data Numai proprietåÆile care carac-
terizeazå data memoratå în control.
Method Numai metodele çi evenimentele
asociate obiectului.
Layout Numai proprietåÆile care
caracterizeazå aspectul controlului.
Other Alte proprietåÆi decât cele care
caracterizeazå datele çi aspectul.
Copierea obiectului - selec-taÆi obiectul çi apoi folosiÆi operaÆiile Copy çi Paste (din
meniul Edit sau din meniul de comenzi rapide).
Çtergerea obiectului - selectaÆi obiectul çi apoi apåsaÆi tasta Delete.
CreaÆi instanÆe multiple ale unui obiect - executaÆi clic pe butonul ButtonLock din
bara Form controls, executaÆi apoi clic în aceastå barå pe obiectul pentru care creaÆi
instanÆe multiple, creaÆi obiectul în formular çi apoi executaÆi clic în locul în care vreÆi
så creaÆi o copie a acestui obiect. ExecutaÆi clic pentru fiecare copie pe care vreÆi så o
creaÆi. Dupå ce aÆi terminat de creat copii ale obiectului, dezactivaÆi aceastå funcÆie
executând clic pe butonul ButtonLock.
Folosind funcÆia de creare de
instanÆe multiple, mai adåugaÆi
la formular douå casete de
text. SelectaÆi grupul de ca-
sete de text çi aplicaÆi un
anumit stil acestor casete (cu
AutoFormat Builder). AliniaÆi
grupul în diferite maniere folo-
sind butoanele de pe bara
Layout.
SchimbaÆi ordinea de par- Structura ierarhizatå
curgere a formularului fie folo- a formularului.
sind opÆiunea de meniu, fie
butonul Sel Tab Order din
bara Form Designer. StabiliÆi
ordinea executând clic în formular, pe obiecte, în ordinea în care vreÆi så fie parcurse:
CreaÆi un formular
VeÆi realiza un formular în care textul çi
desenele sunt afiçate numai dacå se indicå
formularul cu mouse-ul çi se apaså butonul
stâng. La eliberarea butonului de mouse
textul çi desenele afiçate se çterg.
DeschideÆi fereastra constructorului
de aplicaÆii.
În fereastra de proprietåÆi atribuiÆi
urmåtoarele valori proprietåÆilor (ca-
re determinå aspectul çi comportarea
formularului):
Name = "Form1"
ScaleMode = 3 FontBold = .T.
Top = 13 DrawWidth = 5
Left = 14 FillColor = 150,150,150
Height = 300 FillStyle = 7
Width = 450 Closable = .T.
Desktop = .F. Enabled = .T.
BackColor = 220,220,220 Visible = .T.
ForeColor = 0,0,0 ShowTips = .F.
BorderStyle = 2 TabIndex = 1
Caption = "Exemplu" TabStop = .T.
FontName = "Courier New" WindowState = 0
FontSize = 16 WindowType = 0
Pentru afiçarea textului çi a desenelor, la apåsarea butonului de mouse s-a scris
procedura asociatå evenimentului MouseDown în care s-au apelat metodele spe-
cifice formularelor - Print (scrierea textului), Line (desenarea liniei), Circle (desena-
rea cercului). Pentru a avea acces la fereastra de cod, deschideÆi în fereastra de
pro-prietåÆi secÆiunea Method çi din lista de metode çi evenimente alegeÆi
evenimentul MouseDown.
ThisForm.Print('Exemplu') y2=50
ThisForm.CurrentX=; for i=1 to 8
ThisForm.CurrentX+10 ThisForm.Line(x1,y1,x2,y2)
ThisForm.CurrentY=; ThisForm.Line(x2,y2,x1,y2+50)
ThisForm.CurrentY+10 x1=x1+50
endfor x2=x2+50
x1=25 endfor
y1=10 ThisForm.Circle(75,225,225)
x2=65 Endproc
Pentru çtergerea textului çi a desenelor, la eliberarea butonului de mouse s-a scris
procedura asociatå evenimentului MouseUp în care s-a apelat metoda Cls
(çtergerea):
Procedure MouseUp
Lparameters nButton, nShift, nXCoord, nYCoord
ThisForm.Cls
Endproc
SalvaÆi formularul çi îl lansaÆi în execuÆie executând clic pe butonul Run din bara
standard.
Run - LansaÆi în execuÆie Modify Form - ModificaÆi
formularul formularul
ObservaÆie:
Procedurile asociate evenimentelor MouseMove, MouseUp çi MouseDown primesc din
partea sistemului urmåtoarele informaÆii prin intermediul parametrilor:
nButton - reprezintå butonul de mouse acÆionat: 1 - butonul stâng, 1 - butonul
drept çi 4 -butonul din mijloc.
nShift - este un cod numeric (modul în care se calculeazå a fost prezentat la eve-
nimentul PressKey) prin care se poate determina dacå mouse-ul a fost acÆionat
împreunå cu o tastå rece Shift, Alt çi Ctrl.
nXCoord, nYCoord - reprezintå coordonatele
cursorului de mouse, relative la formular.
9 ProprietåÆile care pot fi folosite pentru parcurgerea ciclicå a paginilor din set:
Numårul de pagini din set PageCount . Este de tip numeric.
Paginile Pages . Este de tip vector. În elementele vectorului se påstreazå
referinÆele cåtre paginile din set.
9 ProprietåÆile de tip numeric care pot fi folosite pentru dimensiunile paginilor din set:
PageHeight - înålÆimea paginii (fårå etichetå);
PageWidth - låÆimea paginii.
9 ProprietåÆile care caracterizeazå etichetele paginilor din set:
PrezenÆa etichetelor Tabs . Este de tip logic çi determinå dacå vor fi afiçate
etichetele. Dacå are valoarea .T. (implicit), etichetele paginilor vor fi afiçate, altfel
zona etichetei va fi ocupatå de paginå.
LåÆimea etichetelor TabStyle . Este de tip numeric. Dacå are valoarea 0 -
(Justified), eticheta este dimensionatå dupå lungimea textului. Dacå are valoarea 1
- (Nonjustified), etichetele paginilor sunt dimensionate astfel încât så ocupe toatå
låÆimea setului de paginå.
Aranjarea etichetelor TabsStretch . Este de tip numeric çi determinå modul în
care vor fi aranjate etichetele în cadrul setului de pagini, atunci când lungimea
textului etichetelor depåçeçte låÆimea setului de pagini. Dacå are valoarea 0 -
(Multiple Rows), etichetele vor fi scrise pe mai multe rânduri. Dacå are valoarea 1 -
(Single Row), etichetele sunt afiçate pe o singurå linie çi textul etichetelor este
secÆionat astfel încât så încapå în etichetå. Valoarea implicitå este 1.
Identificarea unei pagini se poate face în douå moduri:
<nume_set_pagini>.<nume_paginå>
sau
<nume_set_pagini>.Pages(<n>)
unde Pages este numele propritåÆii care påstreazå într-un vector referinÆele fiecårei
pagini a setului, iar <n> indexul paginii din acest vector.
Formularele de tip paginå au proprietatea specificå de tip numeric PageOrder -
numårul de ordine al paginii. Ea este diferitå de indexul paginii din vectorul Pages.
Modificarea unui numår de ordine al unei pagini duce la rearanjarea tuturor pginilor. De
exemplu, dacå existå patru pagini çi vreÆi ca pagina a patra så devinå a doua, îi atroibuiÆi
acesteia numårul de ordine 2. Automat pagina a doua va primi numårul de ordine 3, iar
pagina a treia numårul de ordine 4.
TabStretch=0
TabStretch=1
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 265
# ÎncercaÆi:
Adevårat/Fals:
1. InterfaÆa de explorare este o interfaÆå container care conÆine mai multe ferestre.
2. Procedura asociatå evenimentului KeyPress primeçte ca parametru codul numeric
asociat tastelor reci apåsate.
3. Focalizarea este o metodå prin care se poate måri un control grafic.
4. Evenimentul Init este declançat de activarea obiectului.
5. Print este o metodå prin care scrieÆi într-un formular.
6. Evenimentul Destroy este declançat de eliberarea zonei de memorie alocate obiectului.
7. Procedura asociatå evenimentului Load se executå dupå cea asociatå evenimentului Init.
CompletaÆi:
1. Dimensiunile, poziÆiile pe ecran, vizibilitatea çi disponibilitatea sunt ...........................
ale unui obiect vizual.
2. Variabila de sistem folositå pentru a referi fereastra implicitå a aplicaÆiei Visual
FoxPro este ....... .
3. FuncÆia care furnizeazå codul unei culori descrise prin intensitatea celor trei culori de
bazå este ........
4. Un obiect poate fi focalizat din program cu metoda ......................
5. Procedura asociatå evenimentului .......... al unui formular este ultima care se executå.
AlegeÆi råspunsurile corecte:
1. Pentru un obiect,Click este:
a) o proprietate b) un eveniment c) o metodå
2. StabiliÆi tipul formularului (modal/nemodal) cu proprietatea:
a) WindowType b) ShowWindow c) MDIForm
3. Ordinea tabulårii este o proprietate specificå:
a) tuturor controalelor b) controalelor grilå c) formularelor
4. Caseta de dialog Open a interfeÆei aplicaÆiei Visual FoxPro este o casetå de dialog:
a) modalå b) nemodalå c) copil d) pårinte
5. Stilul interfeÆei aplicaÆiei Visual FoxPro este de tip:
a) SDI b) MDI c) de explorare
6. Pentru un formular, Release este:
a) o proprietate b) un eveniment c) o metodå
266 Informatică
R åspunsuri:
Adevårat/Fals: 1-F; 2-A; 3-F; 4-F; 5-F; 6-A; 7-F.
CompletaÆi: 1-proprietåÆi; 2-_screen; 3-rgb(); 4-SetFocus ; 5-Unload
AlegeÆi råspunsurile corecte: 1-b; 2-a; 3- c; 4-a; 5-b; 6-c.
3.4. C o n t r o alele
çi un buton Stop care poate opri execuÆia procesului. În general, acestui control nu i se
asociazå valori, ci acÆiuni descrise prin procedura asociatå evenimentului Click.
Butonul de comandå nu are proprietatea BackColor, iar proprietatea Style poate avea
valorile: 0 - standard (implicit) çi 1 - invizibil. Are proprietåÆile WordWrap çi Autosize
(care vor fi prezentate ulterior).
În funcÆie de modul în care este informat utilizatorul despre acÆiunea butonului existå:
9 Butoane în care acÆiunea este descriså printr-un text. În acest caz, textul care descrie
acÆiunea va fi påstrat de proprietatea Caption a controlului.
9 Butoane în care acÆiunea este descriså printr-o imagine. În acest caz, identificatorul
fiçierului care conÆine imaginea care va fi afiçatå va fi påstrat de proprietatea Picture a
controlului (identificatorul fiçierului în care este påstratå imaginea). În cazul în care se
foloseçte imaginea pentru descrierea acÆiunii, trebuie folosite çi urmåtoarele proprietåÆi:
DownPicture - imaginea afiçatå atunci când butonul este focalizat;
DisablePicture - imaginea afiçatå atunci când butonul nu este disponibil.
Declançatorul poate fi acÆionat în mai multe moduri:
9 ExecutaÆi clic pe butonul focalizat.
9 FocalizaÆi butonul apåsând repetat tasta Tab çi apoi apåsaÆi tasta Enter sau SpaÆiu.
9 ApåsaÆi tasta Alt împreunå cu tasta de acces la buton (cu tasta literei de identificare).
9 Dacå butonul de comandå este butonul implicit al formularului, apåsaÆi tasta Enter,
indiferent de poziÆia selectorului.
9 Dacå butonul de comandå este butonul de anulare al formularului, apåsaÆi tasta Esc,
indiferent de poziÆia selectorului.
Indiferent de modul ales, evenimentul este acelaçi (evenimentul Click): prin acÆionarea
butonului se declançeazå operaÆia atribuitå lui.
Într-un formular nu poate fi decât un buton implicit çi un buton de anulare. Tipul butonului
este controlat cu proprietåÆile specifice unui buton de comandå:
9 Implicit Default . Este de tip logic. Dacå are valoarea .T., butonul de comandå este
butonul implicit (default command button). Într-un formular, un singur buton de
comandå poate fi implicit. Valoarea implicitå pentru aceastå proprietate este .F..
9 Anulare Cancel . Este de tip logic. Dacå are valoarea .T., butonul de comandå este
butonul de anulare (cancel command button). Într-un formular, un singur buton de
comandå poate fi de anulare. Valoarea implicitå pentru aceastå proprietate este .F..
CreaÆi un formular nou. CreaÆi în formular un set de pagini cu douå pagini. CreaÆi în
fiecare secÆiune etichetele astfel: executaÆi clic pe butonul Label de pe bara Form
controls çi glisaÆi apoi mouse-ul în formular pentru a trasa eticheta.
272 Informatică
ThisForm.Caseta.Pages(1).L10.Visible=.F.
endif
if inlist(nShift,4,5,6,7)
ThisForm.Caseta.Pages(1).L11.Visible=.T.
else
ThisForm.Caseta.Pages(1).L11.Visible=.F.
Endif
ThisForm.Caseta.Refresh
Endproc
Pentru secÆiunea 2 a casetei se asociazå o procedurå evenimentului MouseDown
(în etichetele L10 çi L11 se afiçeazå coordonatele, în eticheta L2 se afiçeazå butonul
apåsat, iar în etichetele L5, L5 çi L6 se afiçeazå tastele apåsate) çi o procedurå
evenimentului MouseUp:
Procedure Sect2.MouseDown
Lparameters nButton, nShift, nXCoord, nYCoord
ThisForm.Caseta.Pages(2).L10.Caption=str(nXCoord,4,0)
ThisForm.Caseta.Pages(2).L11.Caption=str(nYCoord,4,0)
Do case
case nButton=1
ThisForm.Caseta.Pages(2).L2.Caption='Stanga'
case nButton=2
ThisForm.Caseta.Pages(2).L2.Caption='Dreapta'
case nButton=4
ThisForm.Caseta.Pages(2).L2.Caption='Mijloc'
otherwise
ThisForm.Caseta.Pages(2).L2.Caption=''
Endcase
if inlist(nShift,1,3,5,7)
ThisForm.Caseta.Pages(2).L4.Visible=.T.
else
ThisForm.Caseta.Pages(2).L4.Visible=.F.
endif
if inlist(nShift,2,3,6,7)
ThisForm.Caseta.Pages(2).L5.Visible=.T.
else
ThisForm.Caseta.Pages(2).L5.Visible=.F.
endif
if inlist(nShift,4,5,6,7)
ThisForm.Caseta.Pages(2).L6.Visible=.T.
else
ThisForm.Caseta.Pages(2).L6.Visible=.F.
Endif
ThisForm.Caseta.Refresh
Endproc
Procedure Sect2.MouseUp
Lparameters nButton, nShift, nXCoord, nYCoord
ThisForm.Caseta.Pages(2).L10.Caption=''
ThisForm.Caseta.Pages(2).L11.Caption=''
ThisForm.Caseta.Pages(2).L2.Caption=''
ThisForm.Caseta.Pages(2).L4.Visible=.F.
ThisForm.Caseta.Pages(2).L5.Visible=.F.
274 Informatică
ThisForm.Caseta.Pages(2).L6.Visible=.F.
ThisForm.Caseta.Refresh
Endproc
Pentru butonul de comandå s-a asociat o procedurå evenimentului Click:
Procedure Click
ThisForm.Release
Endproc
proprietåÆii este çirul vid) sau o fereastrå definitå de utilizator (valoarea proprietåÆii va fi
numele ferestrei).
F1.C2.Value=0
F1.AddObject('L1','Label') F1.C2.InputMask = "999999"
F1.AddObject('C1','TextBox') F1.C2.Left = 85
F1.AddObject('L2','Label') F1.C2.Top = 84
F1.AddObject('C2','TextBox') F1.C2.Height = 25
F1.AddObject('L3','Label') F1.C2.Width = 108
F1.AddObject('L4','Label') F1.C2.Visible =.T.
F1.AddObject('C3','TextBox') F1.C3.Value=0
F1.AddObject('B1','Buton1') F1.C3.BackColor=RGB(220,220,220)
F1.AddObject('B2','Buton2') F1.C3.Height = 25
F1.AddObject('B3','Buton3') F1.C3.Left = 85
F1.AddObject('B4','Buton4') F1.C3.ReadOnly = .T.
F1.AddObject('B5','Buton5') F1.C3.Top = 144
F1.C3.Width = 108
F1.L1.AutoSize = .T. F1.C3.Style = 1
F1.L1.BackColor=RGB(220,220,220) F1.C3.Visible =.T.
F1.L1.Caption = "a" F1.B1.Visible =.T.
F1.L1.Height = 18 F1.B2.Visible =.T.
F1.L1.Left = 48 F1.B3.Visible =.T.
F1.L1.Top = 36 F1.B4.Visible =.T.
F1.L1.Width = 8 F1.B5.Visible =.T.
F1.L1.Visible =.T.
F1.L2.AutoSize = .T. F1.Show
F1.L2.BackColor=RGB(220,220,220) Read events
F1.L2.Caption = "b"
F1.L2.Height = 18 Define class Buton1 as;
F1.L2.Left = 48 CommandButton
F1.L2.Top = 96 Top = 24
F1.L2.Width = 8 Left = 276
F1.L2.Visible =.T. Height = 25
F1.L3.BackColor=RGB(220,220,220) Width = 61
F1.L3.Caption = "c" Caption = "+"
F1.L3.Height = 18 Procedure Click
F1.L3.Left = 48 ThisForm.C3.Value=;
F1.L3.Top = 144 ThisForm.C1.Value+;
F1.L3.Width = 7 ThisForm.C2.Value
F1.L3.Visible =.T. ThisForm.C3.Refresh
F1.L4.BackColor=RGB(220,220,220) Enddefine
F1.L4.Caption = "Imposibil!!!; Define class Buton2 as;
Impartire la zero" CommandButton
F1.L4.Height = 25 Top = 60
F1.L4.Left = 36 Left = 276
F1.L4.Top = 204 Height = 25
F1.L4.Visible = .F. Width = 61
F1.L4.Width = 181 Caption = "-"
F1.C1.Value=0 Procedure Click
F1.C1.InputMask = "999999" ThisForm.C3.Value=;
F1.C1.Left = 85 ThisForm.C1.Value-;
F1.C1.Top = 36 ThisForm.C2.Value
F1.C1.Height = 25 ThisForm.C3.Refresh
F1.C1.Width = 108 Enddefine
F1.C1.Visible =.T.
278 Informatică
Stergere, Copiere çi Mutare nu vor fi disponibile dacå nu a fost selectat un text, iar butonul
Inserare nu va fi disponibil dacå variabila de memorie zona_s este vidå (în Clipboard nu au
fost transferate date). În caseta de dialog se vor crea douå zone pentru editarea textului
(douå controale de tip EditBox). OperaÆiile se pot executa în aceeaçi zonå (acelaçi
document) sau între cele douå zone (douå documente diferite). Pentru a çti cu ce zonå de
text se va lucra, se va folosi variabila de memorie text, de tip numeric, care are valoarea 1
pentru prima zonå de text çi valoarea 2 pentru a doua zonå de text.
CreaÆi formularul çi adåugaÆi la formular douå etichete, douå zone de editare çi cinci
butoane de comandå. Pentru zona de editare folosiÆi butonul EditBox de pe bara
Form Controls. StabiliÆi pentru formular çi controale urmåtoarele proprietåÆi:
* Formularul * Pentru toate etichetele
Name = "Form1" AutoSize = .T.
BackColor = 192,192,192 BackStyle = 0
Caption = "Prelucrare text" * Butoane
Closable = .F. Name = "Command1"
* Zonele de editare Caption = "\<Stergere"
Name = "Edit1" Name = "Command2"
HideSelection = .F. Caption = "\<Inserare"
Name = "Edit2" Name = "Command3"
HideSelection = .F. Caption = "\<Copiere"
*Etichetele Name = "Command4"
Name = "Label1" Caption = "\<Mutare"
Caption = "Text 1" Name = "Command5"
Name = "Label2" Cancel = .T.
Caption = "Text 2" Caption = "\<Terminare"
ScrieÆi procedura asociatå evenimentului Init al formularului. În aceastå procedurå
declaraÆi variabilele globale text çi zona_s çi iniÆializaÆi proprietåÆile Value ale celor
douå zone de editare:
procedure Init && Formular ThisForm.Edit1.Value=''
public text,zona_s ThisForm.Edit2.Value=''
text=1 endproc
zona_s=''
ScrieÆi procedurile asociate evenimentului LostFocus pentru cele douå zone de
text, în care memoraÆi în variabila text zona de editare care a pierdut focalizarea.
procedure LostFocus &&Edit1 procedure LostFocus &&Edit1
text=1 text=2
endproc endproc
ScrieÆi procedurile asociate evenimentului Click pentru cele cinci butoane:
procedure Click &&Buton1 else
if text=1 ThisForm.Edit2.SelText=zona_s
ThisForm.Edit1.SelText='' endif
else endproc
ThisForm.Edit2.SelText='' procedure Click &&Buton3
endif if text=1
endproc zona_s=ThisForm.Edit1.SelText
procedure Click &&Buton2 else
if text=1 zona_s=ThisForm.Edit2.SelText
ThisForm.Edit1.SelText=zona_s endif
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 283
endproc ThisForm.Edit2.SelText=''
procedure Click &&Buton4 endif
if text=1 endproc
zona_s=ThisForm.Edit1.SelText procedure Click &&Buton5
ThisForm.Edit1.SelText='' ThisForm.Release
else endproc
zona_s=ThisForm.Edit2.SelText
SalvaÆi formularul. LansaÆi în execuÆie formularul çi-l testaÆi.
5. RealizaÆi o casetå de dialog care så simuleze operaÆiile de cåutare çi înlocuire într-un text
(operaÆiile Find çi Replace). Pentru aceste operaÆii se vor folosi butoanele Cauta (Find),
Inlocuieste (Replace) çi Inlocuieste toate aparitiile (Replace All). Butoanele au taste de
acces. În acest mod scurtåtura Alt+C este similarå cu Ctrl+F çi Alt+I este similarå cu
Ctrl+H. Butonul Cauta nu este disponibil dacå zona de editare çi caseta de text cu
eticheta Se cautå sunt vide. Butoanele Inlocuieste çi Inlocuieste toate aparitiile nu sunt
disponibile dacå nu a fost gåsit în zona de text textul scris în caseta de text cu eticheta Se
cauta.
CreaÆi formularul çi adåugaÆi la formular trei etichete, o zonå de editare, douå casete
de text, un grup de trei butoane de comandå çi un buton de comandå. StabiliÆi
Grupul de butoane de
comandå
endproc
procedure Command2.Click && Grup.Buton1
ThisForm.Edit1.SelText=alltrim(ThisForm.Text2.Value)
ThisForm.Text2.Value=''
ThisForm.Text2.Enabled=.F.
ThisForm.Commandgroup1.Command2.Enabled=.F.
ThisForm.Commandgroup1.Command3.Enabled=.F.
endproc
procedure Command3.Click && Grup.Buton1
ThisForm.Edit1.SelText=alltrim(ThisForm.Text2.Value)
x=at(alltrim(ThisForm.Text1.Value),ThisForm.Edit1.Value)
do while x<>0
ThisForm.Edit1.SelStart=at(alltrim(ThisForm.Text1.Value),;
ThisForm.Edit1.Value)-1
ThisForm.Edit1.SelLength=Len(alltrim(ThisForm.Text1.Value))
ThisForm.Edit1.SelText=alltrim(ThisForm.Text2.Value)
x=at(alltrim(ThisForm.Text1.Value),ThisForm.Edit1.Value)
enddo
ThisForm.Text2.Value=''
ThisForm.Text2.Enabled=.F.
ThisForm.Commandgroup1.Command1.Enabled=.F.
ThisForm.Commandgroup1.Command2.Enabled=.F.
ThisForm.Commandgroup1.Command3.Enabled=.F.
endproc
procedure Click && Buton1
ThisForm.Release
endproc
SalvaÆi formularul. LansaÆi formularul în execuÆie çi-l testaÆi.
ThisForm.Text3.ReadOnly=.T. ThisForm.Text3.ReadOnly=.F.
ThisForm.Text4.ReadOnly=.T. ThisForm.Text4.ReadOnly=.F.
ThisForm.Edit1.ReadOnly=.T. ThisForm.Edit1.ReadOnly=.F.
ThisForm.Refresh ThisForm.Refresh
endif ThisForm.Text1.SetFocus
endproc endproc
procedure Click &&Buton3 procedure Click &&Buton4
append blank ThisForm.Release
ThisForm.Text1.ReadOnly=.F. endproc
ThisForm.Text2.ReadOnly=.F.
SalvaÆi formularul. LansaÆi formularul în execuÆie
çi-l testaÆi.
9 Antetul coloanei. Este o etichetå afiçatå în partea de sus a coloanei care conÆine un
text explicativ referitor la datele afiçate în coloanå.
9 Celula. Celula curentå (celula activå) este celula care primeçte focalizarea. Ea este
determinatå de numårul rândului çi numårul coloanei la intersecÆia cårora se gåseçte
celula. Utilizatorul poate schimba în orice moment celula curentå folosind mouse-ul
sau tastatura (tasta Tab). Dimensiunea celulei este determinatå de înålÆimea rândului çi
låÆimea coloanei. Aceste proprietåÆi trebuie så fie modificate dacå nu sunt suficiente ca så
încapå textul sau imaginea în celulå.
9 Alinierea. Se referå la alinierea datelor în coloanele tabelului çi în celule.
9 Barele de derulare. Se folosesc pentru a deplasa conÆinutul grilei atunci când nu pot
fi vizualizate toate datele în zona de afiçare a grilei. Se pot folosi bare de derulare pe
verticalå çi pe orizontalå.
9 Liniile folosite ca delimitatori. Pentru delimitarea celulelor se pot folosi linii care pot
fi caracterizate de culoare çi grosime.
9 Coloana cu marcajul pentru çtergere. Este o coloanå care poate fi folositå pentru a
marca o înregistrare pentru çtergere (se executå clic în aceastå coloanå în dreptul
înregistrårii pe care vreÆi så o marcaÆi pentru çtergere sau pentru care vreÆi så anulaÆi
un marcaj pentru çtergere - la fel ca la fereastra Browse).
9 Coloana cu marcajul rândului curent. Este o coloanå care poate fi folositå pentru a
stabili înregistrarea curentå (se executå clic în aceastå coloanå în dreptul înregistrårii
care vreÆi så devinå înregistrare curentå - la fel ca la fereastra Browse).
9 Panourile grilei. La fel ca la fereastra Browse grila poate fi împårÆitå în douå partiÆii
numite panouri. Cele douå panouri pot funcÆiona ca douå grile independente, iar
divizarea lor se face prin intermediul unei bare de divizare (split).
Coloana Antetul
Formularul
Coloana cu
marcajul rândului Barele de
derulare ale grilei
Celula selectatå
Coloana cu
marcajul pentru
çtergere
Grila
panouri, iar valoarea proprietåÆii reprezintå distanÆa dintre marginea stângå a grilei
çi bara de divizare a grilei în panouri.
Panoul activ: Panel - este de tip numeric. Dacå are valoarea 0, panoul activ este în
stânga, iar dacå are valoarea 1 (implicit), panoul activ este în dreapta.
Legåtura dintre panouri: PanelLink - este de tip logic çi determinå dacå cele
douå panouri sunt legate între ele (dacå au acelaçi aspect determinat de proprie-
tåÆile HeaderHeight, DeleteMark, GridLines,..., HeightLight, RecordMark,
RowHeight, ScrollBar): dacå are valoarea .T. (implicit), au acelaçi aspect, iar
dacå are valoarea .F., nu au acelaçi aspect.
9 ProprietåÆile folosite pentru a caracteriza coloanele grilei:
Numåul de coloane: ColumnCount - este de tip numeric. Implicit are valoarea -1,
care înseamnå numår suficient de coloane pentru a afiça câmpurile sursei de date.
Referirea coloanei: Columns - este de tip vector çi conÆine referinÆe cåtre coloanele
grilei.
Prima coloanå afiçatå: LeftColumn - este de tip numeric çi reprezintå numårul
coloanei (numåråtoarea se face începând de la stânga) care va fi prima afiçatå. De
exemplu, dacå proprietatea are valoarea 3, afiçarea în grilå va începe cu coloana
3, iar coloanele 1 çi 2 nu vor fi afiçate.
Pe lângå proprietåÆile care caracterizeazå aspectul, grila mai are çi proprietåÆi specifice,
prin care este caracterizat comportamentul ei:
9 ProprietåÆile folosite pentru a caracteriza celula activå (focalizatå):
PoziÆia absolutå furnizatå de numårul rândului ActiveRow çi de numårul coloanei
ActiveColumn . Aceste proprietåÆi sunt de tip numeric çi se calculeazå faÆå de primul
rând, respectiv prima coloanå a grilei. Sunt proprietåÆi protejate la scriere (read-only).
Aceste valori corespund parametrilor metodei ActivateCell.
PoziÆia relativå furnizatå de numårul rândului RelativeRow faÆå de primul rând
afiçat în grilå çi de numårul coloanei RelativeColumn faÆå de prima coloanå
afiçatå în grilå. Aceste proprietåÆi sunt de tip numeric. De exemplu, dacå prima
coloanå afiçatå în grilå este coloana 2, iar proprietatea ActiveColumn are valoarea 5,
înseamnå cå valoarea proprietåÆii RelativeColumn este 3.
9 Adåugarea datelor la grilå este controlatå cu proprietatea de tip logic AllowAddNew,
care dacå are valoarea .T. permite adåugarea de noi rânduri la grilå (dacå se apaså
tasta ↓ se mai adaugå un rând la grilå).
9 ProprietåÆile folosite pentru a caracteriza sursa de date a grilei:
Tipul sursei de date: RecordSourceType este de tip numeric çi caracterizeazå
ce date se vor folosi pentru a popula grila. Dacå datele vor fi preluate dintr-un
tabel, acesta poate fi permanent sau temporar (cusor), poate fi deja construit sau
poate fi construit la iniÆializarea grilei (în procedura asociatå evenimentului Init al
grilei se poate crea un tabel folosind comanda SQL Create table). Înregistrårile
tabelului vor fi rândurile grilei, iar câmpurile lui vor fi coloanele grilei.
Sursa de date: RecordSource este de tip çir de caractere çi furnizeazå numele
tabelului folosit ca surså de date sau numele aliasului cursorului sau numele
fiçierului de interogåri.
296 Informatică
# ÎncercaÆi:
Adevårat/Fals:
1. Textul afiçat în formular prin care utilizatorul poate identifica rolul controlului se pås-
treazå în proprietatea Name.
2. ProprietåÆile ReadOnly çi Enabled au aceeaçi semnificaÆie: controleazå accesul la un
control.
3. When este un eveniment declançat înaintea primirii focalizårii de cåtre control.
4. Proprietatea Default este specificå unui control de tip CommandButton.
5. Eticheta are proprietatea AutoSize.
6. Câmpul de editare are proprietatea WordWrap.
7. Increment este o propritatea specificå unui control de tip Spinner.
8. Evenimentul UpClick este specific tuturor controalelor.
9. Obiectul Column se poate crea numai în obiectul container Grid.
10. Proprietatea Panel controleazå împårÆirea grilei în panouri.
CompletaÆi:
1. InformaÆiile despre control, afiçate într-o casetå atunci când este indicat controlul, se
påstreazå în proprietatea .............. çi se poate folosi numai dacå proprietatea ..............
a formularului are valoarea .T.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 301
R åspunsuri:
Adevårat/Fals: 1-F; 2-F; 3-A; 4-A; 5-A; 6-F; 7-A; 8-F; 9-A; 10-F.
CompletaÆi: 1-ToolTipText, ShowToolTips; 2-dupå pierderea; 3-modal; 4-Spinner; 5- Column; 6-
Column; 7-Header; 8-Bound.
AlegeÆi råspunsurile corecte: 1-b; 2-a,c; 3- a; 4-a; 5-b.
Comutatorul CheckBoxx
Se foloseçte într-o aplicaÆie pentru a permite utilizatorului så aleagå din douå variante
posibile, adicå så comute între douå variante posibile. Într-un formular, comutatoarele
sunt independente unele de altele. De obicei, legenda comutatorului afiçeazå numele
comutatorului care corespunde datei a cårui valoare va fi stabilitå de utilizator.
Proprietatea de aliniere a comutatorului (Alignment) se referå la modul de aranjare a
legendei faÆå de comutator (la dreapta - 1 sau la stânga - 0). Metoda de acÆionare a unui
comutator este la fel ca çi la butoanele de comnadå: Click. Astfel, procedura asociatå
evenimentului Click trebuie så asigure trecerea comutatorului dintr-o stare în alta çi de a
atribui proprietåÆii Value valoarea corespunzåtoare noii ståri. Valoarea unui comutator
poate fi de tip logic sau numeric:.F. sau 0, dacå este dezactivat, .T. sau 1, dacå este
activat çi NULL sau 2, dacå nu este disponibil.
Stilul de reprezentare a comutatorului poate fi stabilit cu proprietatea Style. Dacå
proprietatea are valoarea 0 - Standard (implicit), controlul este reprezentat grafic printr-o
casetå pentru care, dacå are în interior semnul de validare, valoarea controlului este .T.,
iar dacå nu are semnul de validare are valoarea .F.. De aceea se mai numeçte çi casetå
de validare. Dacå proprietatea are valoarea 1 - Graphic, controlul este reprezentat ca un
buton de comandå: în interiorul såu este afiçatå o imagine care poate fi însoÆitå de text
(textul va fi scris centrat, sub imagine). Pentru acest stil de reprezentare trebuie folositå
proprietatea DownPicture prin care se stabileçte aspectul comutatorului când este
activat. Se recomandå folosirea acestui tip de reprezentare în barele cu instrumente.
În proprietatea Value se memoreazå 0 sau 1 dacå proprietatea ControlSource este tip
numeric sau .T. sau .F. dacå proprietatea ControlSource este de tip logic.
9 ApåsaÆi tastele de acces la buton (tasta Alt împreunå cu tasta literei de identificare).
Pentru administrarea butoanelor din grup puteÆi folosi proprietåÆile specifice grupului de
butoane radio:
9 Numårul de butoane din grup ButtonCount . Este de tip numeric.
9 Butoanele Buttons . Este de tip vector çi poate fi folosit pentru referirea butoanelor
din grup.
PuteÆi folosi metoda SetAll pentru a atribui aceeaçi valoare a unei proprietåÆi tuturor
butoanelor din grup. Sintaxa de apelare a metodei este: SetAll('<proprietate>',<valoare>).
Evenimentul Click asociat grupului de butoane radio va atribui datei valoarea asociatå
butonului selectat.
endproc
procedure Click &&Buton
ThisForm.Release
endproc
SalvaÆi formularul, îl lansaÆi în execuÆie çi-l testaÆi.
Drop-down List, adicå o listå derulantå, care conÆine numai o listå derulantå (se mai
numeçte çi listå ascunså).
Açadar, folosind aceste tipuri de controale puteÆi obÆine urmåtoarele tipuri de liste:
9 Lista simplå (List). Afiçeazå pe ecran mai multe articole (nu neapårat toate articole-
le). Se obÆine cu controlul ListBox .
9 Lista ascunså sau lista derulantå (Drop-down List). Afiçeazå pe ecran numai
articolul curent selectat din listå (ascunde restul articoleleor). Pentru a avea acces çi
la alte elemente, lista trebuie deschiså. În urma operaÆiei de deschidere, lista este
expandatå (se deruleazå conÆinutul), iar utilizatorul are acces la mai multe articole (nu
neapårat toate). Se obÆine cu controlul ComboBox având proprietatea Style=1.
9 Caseta derulantå combinatå (Drop-down List). Combinå o listå ascunså cu o case-
tå de text. Afiçeazå pe ecran numai elementul curent selectat din listå. Pentru a avea
acces çi la alte elemente lista trebuie deschiså. În urma operaÆiei de deschidere, lista
este expandatå (sunt afiçate mai multe articole, nu neapårat toate) çi se activeazå
caseta de text. Utilizatorul fie poate alege un articol din listå, fie scrie valoarea în
caseta de text. Se obÆine cu controlul ComboBox având proprietatea Style=0.
Identificarea articolelor din listå
Articolele listei pot fi precizate, înainte de executarea listei (liste statice), la fel ca çi în
cazul butoanelor radio, prin precizarea sursei de date în momentul proiectårii çi citirea
sursei de date a listei în momentul execuÆiei, dar pot fi stabilite çi în timpul execuÆiei (liste
dinamice), prin adåugarea çi înlåturarea unor articole din listå. În timpul execuÆiei,
articolele listei sunt påstrate în memoria internå sub forma unui tablou de memorie.
Dacå lista are o singurå coloanå, tabloul va fi de tip vector cu elemente de tip çir de
caractere, iar dacå are mai multe coloane, va fi de tip matrice. Fiecare element al
vectorului, respectiv fiecare rând al matricei reprezintå un articol din listå. Articolele listei
pot fi aranjate în ordine alfabeticå (sortate) sau nu.
Fiecårui articol din listå i se atribuie, la crearea listei sau la adåugarea lui la listå, douå
co-duri numerice pentru identificare:
9 Indexul (Index) Reprezintå poziÆia articolului în listå la un moment dat. OperaÆiile de
reordonare a listei, de çtergere sau de adåugare a unui articol au ca efect shimbarea
poziÆiei articolului în listå. În acest caz se modificå çi indexul articolelor, pentru a
reflecta noua situaÆie.
9 Codul de identificare (ItemID). Reprezintå un cod numeric unic asociat articolului
care nu se modificå pe toatå perioada existenÆei articolului în listå (nu se modificå la
schimbarea poziÆiei articolului în listå). De obicei, acest cod este indexul iniÆial al
articolului (atribuit articolului la adåugarea lui la listå). Numele proprietåÆilor care
folosesc acest cod pentru identificarea unui articol în listå conÆin cuvântul cheie ID.
Pentru conversia celor douå coduri numerice se pot folosi metodele:
ItemIDToIndex - furnizeazå codul asociat al unui articol specificat prin index.
IndexToItemID - furnizeazå indexul unui articol specificat prin codul asociat.
De exemplu, dacå într-o listå identificatå prin numele Lista articolul din poziÆia 5 are codul
20, apelarea metodei Lista.IndexToItemID(5) va furniza numårul 20, iar apelarea metodei
Lista.IndexToItemID(20) va furniza numårul 5.
310 Informatică
primului articol afiçat în partea vizibilå a listei. Aceste proprietåÆi se pot folosi pentru a afla
dacå un articol se gåseçte în zona vizibilå a listei sau pentru a schimba articolele afiçate în
partea vizibilå a listei.
9 Ultimul articol adåugat la listå: NewIndex - furnizeazå poziÆia curentå a ultimului
articol adåugat la listå çi NewItemID - furnizeazå codul de identificare a ultimului articol
adåugat la listå.
9 ProprietåÆi specifice listelor care au ca surså de date tablouri de memorie prin care
se controleazå intervalul de elemente din tablou care sunt preluate în listå (valabil nu-
mai pentru RowSourceType=5). ProprietåÆile sunt de tip numeric çi determinå interva-
lul de elemente, respectiv de rânduri care vor fi folosite ca surså de date, altfel vor fi
folosite toate elementele, respectiv toate rândurile din tabloul.
Primul element: FirstElement - primul element, respectiv primul rând al intervalului.
Implicit are valoarea 1 (primul element, respectiv primul rând al tabloului).
Numårul de elemente: NumberOfElements - numårul de elemente, respectiv de
rânduri preluate din sursa de date începând cu primul element al intervalului. Implicit
are valoarea corespunzåtoare numårului de elemente, respectiv de rânduri ale tablo-
ului.
9 ProprietåÆi specifice selectårii multiple:
Selectarea multiplå: MultipleSelect - este de tip numeric çi controleazå dacå
este permiså (valoarea 1) sau nu (valoarea 0 - implicit) selectarea mai multor arti-
cole în listå.
EvidenÆa articolelor selectate este furnizatå de proprietåÆile Selected çi
SelectedID . Ambele proprietåÆi sunt de tip vector cu elemente de tip logic çi conÆin
atâtea elemente câte articole sunt în listå. Fiecare element din vector reprezintå starea
unui articol: dacå are valoarea .T., articolul este selectat, iar dacå are valoarea .F., arti-
colul nu este selectat. Cei doi vectori se deosebesc dupå modul în care se face identifi-
carea articolelor: dupå poziÆia curentå, respectiv dupå codul de identificare. De
exemplu, dacå vreÆi så aflaÆi dacå în lista Lista a fost selectat al treilea articol din listå,
aflaÆi valoarea proprietåÆii Lista.Selected(3), iar dacå vreÆi så aflaÆi dacå articolul cu
codul de identificare 10 a fost selectat, aflaÆi valoarea proprietåÆii Lista.SelectedID(10).
Aceste proprietåÆi pot fi folosite pentru a selecta un articol sau pentru a anula
selectarea unui articol din program. De exemplu, dacå vreÆi så selectaÆi al treilea articol
în lista Lista, atribuiÆi valoarea corespunzåtoare proprietåÆii: Lista.Selected(3)=.T., iar
dacå vreÆi så anulaÆi selectarea pentru articolul cu codul de identificare 10, atribuiÆi
valoarea corespunzåtoare proprietåÆii: Lista.SelectedID(10)=.F..
9 ProprietåÆi specifice listelor cu mai multe coloane:
Numårul de coloane: ColumnCount - este de tip numeric; dacå are valoarea 0,
nu se afiçeazå coloane.
LåÆimea coloanelor: ColumnWidth - este de o listå de numere, separate prin
virgulå; fiecare numår reprezintå låÆimea unei coloane. De exemplu, în lista Lista
Lista.ColumnCount=3 çi Lista.ColumnWidth='5,7,9'
Afiçarea liniilor separatoare între coloane: ColumnLines - este de tip logic
(dacå are valoarea .T. - implicit - între coloane vor fi afiçate linii separatoare, altfel
liniile de separare sunt invizibile).
314 Informatică
a(3)='Verde'
a(4)='Galben'
a(5)='Albastru'
a(6)='Magenta'
a(7)='Cian'
a(8)='Alb'
ThisForm.Combo1.ListIndex = 8
ThisForm.Shape1.BackColor=rgb(255,255,255)
ThisForm.Shape1.Visible=.T.
endproc
Formularului îi vom adåuga o metodå pentru calculul codului de
culoare corespunzåtor culorii din listå. Metoda se numeçte
Culoarea çi foloseçte o matrice b cu 8 linii çi 3 coloane pentru a
calcula ponderea celor trei culori de bazå: coloana 1 - ponderea
pentru roçu, coloana 2 - ponderea pentru verde çi coloana 3 -
ponderea pentru albastru care corespund parametrilor funcÆiei Rgb(). De exemplu,
culoarea galben este determinatå de valorile din cea de a patra linie a matricei çi,
deoarece codul ei este dat de funcÆia Rgb(255,255,0), conform tabelului prezentat
anterior, elementele de pe linia a patra vor avea valoarea: b(4,1)=1, b(4,2)=1 çi
b(4,3)=0. Pentru constru-irea acestei metode folosiÆi opÆiunea de meniu New
Method... ∈ Form. În caseta de dialog scrieÆi numele metodei Culoarea. Numele
metodei va fi adåugat la lista de metode a formularului. AlegeÆi din lista afiçatå în
secÆiunea Method a ferestrei de proprietåÆi a formularului opÆiunea Culoarea. Se va
deschide fereastra pentru cod. ScrieÆi procedura asociatå metodei:
procedure culoarea && Formular b(i,j)=k%2
parameters n k=int(k/2)
dimension b(8,3) enddo
store 0 to b endfor
for i=1 to 8 cod=rgb(b(n,1)*255,b(n,2)*255,;
k=i-1 b(n,3)*255)
j=0 return cod
do while k <>0 endproc
j=j+1
ScrieÆi procedura asociatå evenimentului Click al listei:
procedure Click && Lista
ThisForm.Shape1.BackColor =;
ThisForm.Culoarea(ThisForm.Combo1.ListIndex)
endproc
* formularul BackStyle = 0
Name = "Form1" * zona de editare
BackColor = 200,200,200 Name = "Edit1"
Caption = "Test" BackStyle = 0
Closable = .F. Enabled = .T.
FontSize = 14 ReadOnly = .T.
* eticheta folosita pentru * buton de comanda
* legenda listei Name = "Command1"
Name = "Label1" Cancel = .T.
Caption = "Alegeti:" Caption = "\<Terminare"
* etichete folosite pentru * Lista
* informare Name = "List1"
Name = "Label2" BoundColumn = 2
Caption = "Telefon" ColumnCount = 2
Name = "Label4" ColumnWidths = "70,70"
Caption = "Adresa" RowSourceType = 2
* eticheta folosita pentru afi- RowSource = "agenda"
* sarea numarului de telefon ColumnLines = .F.
Name = "Label3" Height = 97
Caption = "" Left = 24
* pentru toate etichetele: Top = 60
AutoSize = .T. Width = 170
ScrieÆi procedurile asociate evenimentelor Load, Init çi Unload ale formularului în care
deschideÆi çi închideÆi tabelul, evnimentului Click al butonului de comandå çi
procedura Click a listei:
procedure Load && Formular
use agenda index agenda
endproc
procedure Init && Formular
goto top
ThisForm.List1.ListIndex = 1
locate for agenda.nume=ThisForm.List1.DisplayValue and;
agenda.prenume=ThisForm.List1.Value
ThisForm.Label3.Caption=agenda.telefon
ThisForm.Edit1.Value=agenda.adresa
endproc
318 Informatică
# ÎncercaÆi:
Adevårat/Fals:
1. Cu metoda SetAll puteÆi selecta toate articolele dintr-o listå.
2. Identificarea unui articol selectat în listå se face cu proprietatea ListIndex.
3. Proprietatea Value a unui comutator memoreazå starea comutatorului.
4. Proprietatea Value a unui comutator poate fi de tip numeric.
5. Grupul de butoane radio are proprietatea AutoSize.
CompletaÆi:
1. Pentru a atribui aceeaçi valoare unei proprietåÆi pentru toate butoanele dintr-un grup
de butoane radio folosiÆi metoda ...............
2. CreaÆi o listå ascunså cu controlul ............... cu valorea .... a proprietåÆii Style.
3. Reîmprospåtarea listei se face cu metoda ........................
4. IncrementalSearch este o proprietate specificå unui control de tip ..............
5. Numårul de articole din listå se påstreazå în proprietatea ....................
AlegeÆi råspunsurile corecte:
1. Tabloul de memorie în care se påstreazå articolele listei în ordinea poziÆiei lor curente
se memoreazå în proprietatea:
a) List b) ListItem c) ListIndex
2. FirstElement este o proprietate a listei care foloseçte ca surså de date:
a) lista cu nume de câmpuri b) tabloul de memorie c) lista de valori
3. Articolele selectate dintr-o listå cu selecÆie multiplå se påstreazå într-un vector în
proprietatea:
a) MultipleSelect b) Selected c) ListItemID
R åspunsuri:
Adevårat/Fals: 1-F; 2-A; 3-A; 4-A; 5-A.
CompletaÆi: 1-SetAll; 2-ComboBox,1; 3-Requery; 4-listå; 5- ListCount; 6- Column; 7-Header; 8-
Bound.
AlegeÆi råspunsurile corecte: 1-a; 2-b; 3- b.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 321
ecran.show
define class bara as toolbar
add object b1 as commandbutton
add object s1 as separator
add object b2 as commandbutton
add object s2 as separator
add object b3 as commandbutton
b1.height = 20
b1.width = 50
b1.caption = "Bold"
b2.height = 20
b2.width = 50
b2.caption = "Italic"
b2.fontbold = .f.
b2.fontitalic = .t.
b3.height = 20
b3.width = 50
b3.caption = "subliniat"
b3.fontbold = .f.
b3.fontunderline = .t.
left=1
top=1
width=25
caption="afisare ecran"
procedure activate
This.b1.FontBold=_screen.FontBold
This.b2.FontItalic=_screen.FontItalic
This.b3.FontUnderline=_screen.FontUnderline
endproc
procedure b1.click
_ screen.FontBold =!_screen.FontBold
This.FontBold =_screen.FontBold
endproc
procedure b2.click
_ screen.FontItalic=!_screen.FontItalic
This.FontItalic=_screen.FontItalic
endproc
procedure b3.click
_ screen.FontUnderline=!_screen.FontUnderline
This.FontUnderline=_screen.FontUnderline
endproc
enddefine
LansaÆi în execuÆie programul cu comanda do test_bara1.
TestaÆi bara de instrumente. ActivaÆi unul dintre stiluri sau mai multe stiluri. AfiçaÆi pe
ecran un text de fiecare datå (de exemplu, comanda ? 'AAAA'). UrmåriÆi efectul obÆinut.
DeplasaÆi bara cu instrumente în interiorul ferestrei Visual FoxPro. AncoraÆi bara în
diferite poziÆii.
ÎnchideÆi bara executând clic pe butonul de închidere.
324 Informatică
enddefine
define class bara as toolbar
add object b1 as commandbutton
add object s1 as separator
add object b2 as commandbutton
add object s2 as separator
add object b3 as commandbutton
left = 1
top = 1
width = 25
showtips = .T.
caption = "Afisare ecran"
b1.height = 20
b1.width = 50
b1.ToolTipText="Ingrosat"
b1.caption = "Bold"
b2.height = 20
b2.width = 50
b2.ToolTipText="Aplecat"
b2.caption = "Italic"
b2.fontbold = .f.
b3.height = 20
b3.width = 50
b3.ToolTipText="Subliniat"
b3.caption = "Underline"
b3.fontbold = .f.
procedure activate
This.b1.FontBold = ThisFormSet.f1.FontBold
This.b2.FontItalic = ThisFormSet.f1.FontItalic
This.b3.FontUnderline = ThisFormSet.f1.FontUnderline
endproc
procedure b1.click
ThisFormSet.f1.FontBold = !ThisFormSet.f1.FontBold
This.FontBold =ThisFormSet.f1.FontBold
endproc
procedure b2.click
ThisFormSet.f1.FontItalic = !ThisFormSet.f1.FontItalic
This.FontItalic = ThisFormSet.f1.FontItalic
endproc
procedure b3.click
ThisFormSet.f1.FontUnderline = !ThisFormSet.f1.FontUnderline
This.FontUnderline =ThisFormSet.f1.FontUnderline
endproc
enddefine
LansaÆi în execuÆie programul cu comanda do test_bara2.
TestaÆi bara de instrumente. ActivaÆi unul dintre stiluri sau mai multe stiluri çi exe-
cutaÆi clic pe butonul Test din fereastrå. ObservaÆi informaÆiile afiçate pentru fiecare
instrument selectat.
ÎnchideÆi setul de formulare executând clic pe butonul Terminare.
326 Informatică
Containerul OLE permite afiçarea çi editarea obiectelor OLE într-o aplicaÆie Visual
FoxPro. Obiectul vizual OLEContainer din Visual FoxPro este un container pentru obiec-
tul creat cu o altå aplicaÆie. Aceste obiecte pot fi:
9 Controale OLE (fiçiere .ocx). Au propriul lor set de proprietåÆi, metode çi evenimente.
9 Obiecte OLE inserabile. Nu au propriul lor set de proprietåÆi, metode çi evenimente
(nu pot råspunde la evenimente).
Containerul OLE care nu are proprietåÆile ControlSource çi Value. În scimb, obiectul vizual
OLEBoundControl are aceste proprietåÆi. Proprietatea ControlSource memoreazå nume-
le câmpului în care se påstreazå obiectul.
ProprietåÆile specifice obiectelor vizuale Valoare Efect Autoactivate
OLE Container çi OLEBoundControl sunt: 0 Activat din program cu
9 Autoactivarea: Autoactivate este de tip (Manual) metoda DoVerb.
numeric çi determinå modul în care poate fi 1 Activat atunci când obiectul
activat obiectul. A activa obiectul înseamnå a (GotFocust) primeçte focalizarea.
2 Activat atunci când se exe-
activa aplicaÆia server care l-a creat. Dacå are
(DoubleClick) cutå dublu clic pe obiect sau
valoarea 2 (valoarea implicitå), nu mai puteÆi
când obiectul este foca-lizat
folosi evenimentul DoubleClick. çi se apaså tasta Enter.
9 Tipul de obiect permis OLETypeAlowed . 3 (Automatic) Activat de evenimentul impli-
Este de tip numeric çi controleazå tipul de cit de activare al obiectului
obiect care poate fi adåugat la cotainer. (de exemplu focalizarea
9 Modul în care se executå redimensionarea formularului).
Stretch . Este de tip numeric çi controleazå modul în care este redimensionat obiectul
pentru a încåpea în zona alocatå lui în cadrul formularului. Valoarea implicitå este 0.
Valoare Efect OLETypeAlowed Valoare Efect Stretch
0 Linked - legat. 0 Clip - Este secÆionat ca så încapå.
1 Embedded - încapsulat. 1 Isometric - Este redimensionat ca
-1 OLE Bound - nu conÆine un så încapå, cu påstrarea proporÆiilor.
obiect OLE. 2 Stretch - Este redimensionat ca så
-2 OLE control - control OLE (.ocx) încapå, fårå påstrarea proporÆiilor.
9 Accesul la obiect Object . Verb Efectul metodei DoVerb
Este o referinÆå cåtre un obiect 0 Este acÆiunea implicitå a obiectului.
OLE care permite accesul la -1 Obiectul va fi activat pentru editare împreunå cu
proprietåÆile çi metodele sale. containerul OLE.
ProprietåÆile çi metodele spe- -2 Deschide fereastra aplicaÆiei server în care se
cifice unui anumit obiect OLE le încarcå obiectul pentru editare.
puteÆi afla din documentaÆia -3 Ascunde aplicaÆia care a creat obiectul (pentru
aplicaÆiei server. De exemplu, obiectele încapsulate).
-4 Obiectul este activat în container pentru editare çi
dacå obiectul OLE este o foaie
sunt afiçate instrumentele specifice aplicaÆiei server.
de calcul (un obiect Excel), in-
-5 La focalizarea obiectului se creeazå o fereastrå
formaÆiile despre proprietåÆile çi pentru editarea obiectului.
metodele lui le puteÆi afla din -6 Obiectul este activat pentru editare dar sunt igno-
documentaÆia aplicaÆiei Microsoft rate toate modificårile pe care aplicaÆia server le
Excel. FolosiÆi aceastå proprie- poate anula.
tate astfel: pentru modificarea
valorii unei proprietåÆi:
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 329
<nume_obiect>.Object.<nume_proprietate>=<valoare>
iar pentru apelarea unei metode:
<nume_obiect>.Object.<nume_metodå>[(<listå-parametri>)]
9 AplicaÆia server cu care a fost creat obiectul: OLEClass (numele aplicaÆiei).
9 Identificatorul fiçierului care conÆine obiectul (unitatea de disc, calea de director, nu-
mele çi extensia): DocumentFile .
9 Redimensionarea zonei alocate obiectului OLE: Sizable . Are aceeaçi semnificaÆie ca
çi la obiectul ToolBar. Dacå are valoarea .T. se poate folosi pro-prietatea AutoSize
pentru a se redimensiona automat zona alo-catå obiectului.
Metoda specificå unui obiect OLE este DoVerb çi are ca efect activarea obiectului çi
stabilirea ope-raÆiilor care se pot executa cu obiectul respectiv. Obiectul poate fi activat prin
acÆionarea standard a obiectului sau prin alte acÆiuni (verbe). Metoda poate fi apelatå prin:
DoVerb[(<verb>)]
left = 250
top = 310
height = 25
procedure click
clear events
thisform.release
enddefine
LansaÆi în execuÆie programul cu comanda do obiect1.
prin intermediul cåreia stabiliÆi obiectul care va fi adåugat în formular. Din grupul de
butoane radio activaÆi butonul Create From File. AcÆionaÆi butonul Browse pentru a
construi identificatorul fiçierului care conÆine obiectul: discul C, dosarul Test çi fiçierul
Cheltuieli.xls. ÎnchideÆi caseta de dialog (clic pe butonul OK).
În caseta de proprietåÆi modificaÆi proprietåÆile controlului OLEControl pentru a
corespunde cu cele din program. ObservaÆi care sunt proprietåÆile, metodele çi
evenimentele acestui tip de control.
AdåugaÆi la formular butonul pentru terminare. StabiliÆi proprietåÆile controlului (cele din
program) çi codul evenimentului Click.
SalvaÆi formularul çi închideÆi aplicaÆia Constructorului de formulare.
LansaÆi în execuÆie formularul cu comanda do form obiect1.
thisform.refresh skip -1
endproc endif
procedure click && butonul <<< thisform.refresh
if not bof() endproc
AdåugaÆi la formular un obiect de tip OLEBoundControl: executaÆi clic pe obiectul
din bara de obiecte a constructorului. StabiliÆi proprietåÆile controlului (ControlSource=
sigle.sigla).
SalvaÆi formularul. LansaÆi în execuÆie formularul cu comanda do form obiect2. TestaÆi
formularul.
Control SemnificaÆie
Imagea Afiçeazå o imagine preluatå dintr-un fiçier .bmp. Caracteristicile sale pot fi
controlate cu proprietåÆile Top, Left, Height, Width, BackStyle,
BorderColor, Border Style, Enabled, Visible, Stretch.
Linea Afiçeazå o linie. Caracteristicile sale pot fi controlate cu proprietåÆile Top,
Left, Height, Width, BorderWidth, BorderColor, Border Style, Enabled,
Visible, LineSlant.
Shapea Afiçeazå o formå (påtrat, dreptunghi, cerc, elipså). Caracteristicile sale pot fi
controlate cu proprietåÆile Top, Left, Height, Width, BackStyle, BackColor,
BorderWidth, BorderColor, Border Style, FullColor, FullStyle, Enabled,
Visible, ToolTipText, Curvature.
Imaginea (image) poate fi folositå la crearea butoanelor cu pictograme în locul butoa-
nelor cu legendå, care pot fi folosite ca butoane declançatoare. Se recomandå folosirea
lor în cazul barelor cu instrumente. Imaginea graficå are o proprietate specificå Picture
(imaginea) care memoreazå sursa imaginii. Aceasta poate fi: un fiçier bitmap .bmp, un
fiçier de imagini .ico sau un câmp din tabel de tip general.
Formele çi liniile (shape sau line) sunt folosite pentru a se desena elemente grafice pe
suprafaÆa formularelor. Chiar dacå au asociate evenimente (declançate de acÆiuni ale
mouse-ului), au în general numai un rol decorativ, de grupare sau de evidenÆiere.
Ceasul Timer este un obiect nevizual care poate fi folosit în interfaÆa unei aplicaÆii
pentru a måsura timpul. Este un mecanism implementat în interfaÆå care permite progra-
matorului så declançeze un anumit proces dupå un interval de timp. Este caracterizat de:
9 Proprietatea interval - Intervalx. Este de tip numeric çi reprezintå numårul de
milisecunde dupå care este generat evenimentul Timer, adicå intervalul de timp pânå
la apelul procesului. Valoarea sa implicitå este 0 (corespunde dezactivårii ceasului).
9 Evenimentul asociat ceasului - Timerx. Este un eveniment care se declançeazå la
intervale egale de timp (stabilite de proprietatea Interval). În procedura asociatå aces-
tui eveniment se scriu instrucÆiunile acÆiunii care trebuie så se execute dupå un interval
de timp.
9 Metoda de resetare a ceasului - Resetx prin care contorul ceasului este adus la 0.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 333
endproc
procedure Timer
ThisForm.Image1.Visible=!ThisForm.Image1.Visible
ThisForm.Label1.Visible=!ThisForm.Label1.Visible
endproc
SalvaÆi formularul. LansaÆi în execuÆie formularul cu comanda do form imagine2.
TestaÆi formularul. ÎnchideÆi formularul.
CreaÆi un formular care simuleazå un ceas
Fie creaÆi douå fiçiere bitmap .bmp, fie gåsiÆi în sistem douå fiçiere cu pictograme .ico
(de exemplu face01.ico çi face02.ico în imaginile din formularul alåturat). CreaÆi formu-
larul Ceas care, la acÆionarea unui buton Afisare va afiça alternant la un interval de
500 ms o imagine în partea dreaptå çi o imagine în partea stângå, iar sub cele douå
imagini o afiçare numericå a timpului (cu pasul de 500 ms).
DeschideÆi fereastra constructorului de formulare cu comanda create form imagine3.
StabiliÆi pentru formular proprietåÆile:
BackColor=192,192,192
Caption="Ceas"
Closable=.F.
AdåugaÆi în fereastrå urmåtoarele obiecte: douå imagini (Image1 çi Image2), o casetå
de text (TextBox1), douå butoane de comandå (Command1 çi Command2) çi un
ceas (Timer). StabiliÆi pentru aceste controale proprietåÆile:
* Imagnea "Image1" Caption="\<Afisare"
Picture=c:\test\face01.ico * Butonul "Command2"
BackStyle=0 Caption="\<Terminare"
* Imagnea "Image2" * Ceasul "Timer"
Picture=c:\test\face03.ico Interval=0
BackStyle=0 * Caseta de text "TextBox1"
* Butonul "Command1" BackStyle=0
ThisForm.Image1.Visible=.T.
ThisForm.Image2.Visible=.F.
endproc
procedure Click && Command2
ThisForm.Release
endproc
procedure Timer
ThisForm.Text1.Value=ThisForm.Text1.Value+ ThisForm.Timer1.Interval
ThisForm.Image1.Visible=!ThisForm.Image1.Visible
ThisForm.Image2.Visible=!ThisForm.Image2.Visible
endproc
SalvaÆi formularul. LansaÆi în execuÆie çi testaÆi formularul. ÎnchideÆi formularul.
# ÎncercaÆi:
Adevårat/Fals:
1. Obiectul ToolBox are proprietatea AutoSize.
2. DocumentFile este o proprietate specificå obiectelor de tip OLE.
3. Obiectul Timer are proprietatea Picture.
CompletaÆi:
1. Evenimentul AfterDock este specific obiectului ............................
2. Modul în care poate fi activat un obiect de tip OLE este controlat cu proprietatea
.........................
3. Metoda prin care contorul ceasului este adus la 0 este ....................
336 Inormatică
R åspunsuri:
Adevårat/Fals: 1-A; 2-A; 3-F.
CompletaÆi: 1-ToolBox; 2- Autoactivate; 3-Reset.
AlegeÆi råspunsurile corecte: 1-b; 2- b; 3- c.
4. Proiectarea m e n i u rilor
Dacå aplicaÆia pune la dispoziÆia utilizatorului un set de comenzi, metoda cea mai avan-
tajoaså, mai uçoarå çi mai potrivitå pentru a grupa aceste comenzi astfel încât utilizatorul
så aibå acces la ele o reprezintå meniurile.
Meniul (menu) este un element de interfaÆå prin care i se oferå utilizatorului posibilitatea
de a selecta o opÆiune (menu item) dintr-o mulÆime finitå de opÆiuni posibile, afiçate pe
ecran total sau parÆial. În urma selectårii unei opÆiuni se declançeazå o anumitå acÆiune,
corespunzåtoare opÆiunii alese.
VeÆi preciza structura arborescentå a meniului çi veÆi specifica acÆiunile pe care tre-
buie så le execute fiecare opÆiune de meniu ca de exemplu afiçarea unei casete de
dialog, a unui formular, a unei bare de instrumente sau a unui alt sistem de meniuri.
Cererea de executare a unei acÆiuni trebuie så se facå numai printr-o singurå co-
mandå. Dacå acÆiunea declançatå de selectarea unei opÆiuni se descrie printr-un
grup de instrucÆiuni, acestea vor fi scrise într-un fiçier de tip program surså çi vor fi
lansate în execuÆie printr-o singurå comandå: do <nume_fiçier>. În urma acestor
acÆiuni ale programatorului constructorul de meniuri va crea un fiçier cu numele me-
niului çi extensia .mnx în care se gåsesc, sub forma unui tabel, componentele unui
meniu çi caracteristicile lor. PuteÆi modifica un meniu cu comanda:
modify menu <nume_meniu>
3. GeneraÆi programul excutabil al meniului. Pentru a putea folosi meniul, trebuie
generat un program care, în urma execuÆiei sale, så activeze meniul. Programul va fi
memorat într-un fiçier cu extensia .mpr. Dupå orice modificare a meniului va trebui så
executaÆi din nou operaÆia de generare.
4. LansaÆi în execuÆie çi testaÆi meniul. Meniul va fi activat prin lansarea în execuÆie a
pogramului generat cu comanda:
do <nume_meniu>.mpr
9 Zona de editare Procedure çi comutatorul Edit le veÆi folosi dacå vreÆi så definiÆi o
procedurå globalå care va fi folositå implicit în întregul sistem de meniuri. Ea va fi
lansatå în execuÆie de fiecare datå când se va alege o opÆiune cåreia nu i s-a atribuit o
procedurå proprie. Pentru meniul pe care îl construiÆi trebuie så fie activat butonul
Replace. ÎnchideÆi caseta de dialog executând clic pe butonul Ok.
AÆi revenit în fereastra Menu Designer în care definiÆi titlurile din meniul principal:
În fereastra Menu Designer puteÆi folosi urmåtoarele controale:
9 Zona de de lucru afiçeazå sub forma unui tabel mai multe controale: pe un rând sunt
afiçate controalele corespunzåtoare definirii caracteristicilor unei opÆiuni de meniu, iar
pe o coloanå controalele corespunzåtoare unei caracteristici a opÆiunii de meniu.
Coloanele sunt urmåtoarele:
Mover Control. Este prima coloanå çi conÆine un buton cu sågeatå dublå¦. Se
foloseçte pentru a schimba locul opÆiunilor în listå (prin glisarea opÆiunii în noua
poziÆie).
Prompt. În aceastå coloanå se scrie textul legendei opÆiunii de meniu. Dacå în
legendå scrieÆi înaintea textului caracterul \, opÆiunea nu va disponibilå. Dacå în
legendå scrieÆi numai caracterele \-, opÆiunea respectivå va fi o linie de demarcare
între grupurile de opÆiuni.
Result. În acestå coloanå este afiçat un control de tip listå ascunså din care puteÆi
alege tipul acÆiunii declançate de selectarea opÆiunii de meniu (tipul rezultatului).
Tipul rezultatului poate fi: Submenu (se deschide un submeniu), Command (se
executå o comandå) sau Procedure (se executå o procedurå). Pentru opÆiunile de
submeniu Afiseaza, Coloreaza, Grup 1, Grup 2, Calculator çi Ceas alegeÆi un rezul-
tat de tip Command, pentru titlul Terminare, rezultatul Procedure, pentru restul
opÆiunilor rezultatul Submenu.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 343
9 SecÆiunea de butoane Item conÆine butoane pentru inserarea unei opÆiuni de meniu între
cele existente: Insert (o opÆiune definitå de utilizator) çi Insert Bar... (o opÆiune preluatå
din meniul sistemului Visual FoxPro) çi pentru çtergerea unei opÆiuni Delete.
9 Butonul Preview. Prin acÆionarea lui puteÆi så previzualizaÆi
meniul pe care îl construiÆi: meniul sistemului este înlocuit
de acesta çi se deschide o casetå de dialog Preview în
care sunt prezentate informaÆii despre opÆiunea selectatå
din meniu (numele fiçierul, legenda opÆiunii çi comanda aso-
ciatå).
Dupå ce aÆi terminat de construit meniul, îl previzualizaÆi
folosind butonul Preview.
GeneraÆi meniul executabil cu opÆiunea Generate...∈Menu.
LansaÆi în execuÆie meniul cu comanda: do menu_test. TestaÆi meniul.
Structura meniului este memoratå într-un fiçier de tip tabel, care are cu numele meniului
(menu_test) çi extensia .mnx. DeschideÆi acest fiçier cu comanda use menu_test.mnx.
AfiçaÆi conÆinutul såu cu comanda browse. IdentificaÆi în acest tabel semnificaÆia fiecårei
coloane. IdentificaÆi ce element din structura meniului este înregistrat în fiecare rând al
tabelului.
TestaÆi modul în care puteÆi folosi procedura globalå çi procedurile asociate eveni-
mentelor Setup çi Cleanup
VeÆi adåuga sistemului de meniuri o procedurå globalå:
DeschideÆi meniul anterior çi-l salvaÆi sub numele menu_1. În noul meniu veÆi face
urmåtoarele modificåri:
In caseta de dialog General Option scrieÆi în zona de editare a procedurii globale
instrucÆiunea:
? "Test procedura globala"
ActivaÆi comutatorul Setup çi în fereastra de editare a procedurii scrieÆi:
? "Test eveniment Setup"
În fereastra Form Designer în meniul principal adåugaÆi titlul Scrie înainte de titlul de
meniu Terminare. Acestui titlu de meniu îi atribuiÆi un rezultat de tip Command, dar nu
îi atribuiÆi nici o comandå. În meniul Utilitati adåugaÆi la sfârçit douå opÆiuni: Scrie 1 çi
Scrie 2. Ambelor le atribuiÆi un rezultat de tip comandå. OpÆiunii Scrie 1 nu îi atribuiÆi
nici o comandå, iar opÆiunii Scrie 2 îi atribuiÆi comanda:
? "Test optiune Scrie 2"
În procedura asociatå titlului Terminare din meniul principal, çtergeÆi instrucÆiunea clear.
SalvaÆi modificårile fåcute çi generaÆi meniul executabil. LansaÆi în execuÆie meniul.
TestaÆi meniul Scrie çi opÆiunile Scrie 1 çi Scrie 2. Ce concluzii trageÆi?
DeschideÆi meniul menu_1 çi îl salvaÆi sub numele menu_2. În noul meniu deschideÆi
caseta de dialog General Option, activaÆi comutatorul Cleanup çi în fereastra de
editare a procedurii scrieÆi:
clear
? "Test eveniment Cleanup"
SalvaÆi modificårile fåcute çi generaÆi meniul executabil. LansaÆi în execuÆie meniul.
TestaÆi meniul Scrie çi opÆiunile Scrie 1 çi Scrie 2. Ce concluzii trageÆi? Când se
executå procedura asociatå evenimentului Cleanup.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 345
va crea o listå dinamicå cu numele elevilor corigenÆi din clasa respectivå, în perioada
aleaså. Toate aceste formulare vor avea un buton de terminare.
d. Meniul Listare va deschide un meniu pe verticalå cu opÆiunile Lista 1, Lista 2, Lista 3,
Lista 4, Lista 5 çi Lista 6. Aceste opÆiuni vor fi grupate logic în douå grupuri de
opÆiuni (fiecare grupå va conÆine 3 opÆiuni) separate printr-o barå separatoare.
Toate aceste opÆiuni de meniu vor afiça rapoarte, în care înregistrårile vor fi grupate
dupå criteriul clasei. Lista 1 (Lista 4) çi Lista 2 (Lista 5) vor afiça rapoarte cu numele
çi prenumele elevului, notele çi media pe primul semestru, respectiv al doilea
semestru, iar Lista 3 ((Lista 6)) va afiça un raport cu numele çi prenumele elevului,
mediile semestriale çi media generalå. În primul grup de rapoarte, în cadrul grupului
clasa, înregistrårile vor fi afiçate în ordine alfabeticå, iar al doilea grup de rapoarte în
ordinea descrescåtoare a mediilor. Utilizatorul programului va cunoaçte semnificaÆia
fiecårei opÆiuni din mesajul afiçat în bara de stare.
e. StabiliÆi scurtåturi çi mesaje pentru toate opÆiunile de meniu.
f. Înainte de a se activa meniul, afiçaÆi pe ecran o casetå de dialog pentru introducerea
parolei. StabiliÆi ce parolå doriÆi. Se vor accepta
numai cinci încercåri de comunicare a parolei
pentru a avea acces la datele din baza de date.
5 . P r o i e c t a r e a a p l i c a ţi i l o r
5 . 1 . P r o g r a m u l m o ni t o r
O aplicaÆie cuprinde mai multe module: pentru introducerea datelor, pentru prelucrarea
lor sau pentru afiçarea unor rapoarte pe ecran sau la imprimantå. Toate aceste module
trebuie asamblate într-o aplicaÆie, în care un modul de program trebuie så le administreze
çi så le coordoneze.
_screen.caption=<numele_ferestrei_de_aplicatie>
Înainte înså de a modifica proprietåÆile ferestrei, salvaÆi valorile pe care le modificaÆi
în variabile de memorie (de exemplu: nume_f=_screen.caption) .
c. Så activeze meniul principal al aplicaÆiei. Din meniul principal se vor lansa în
execuÆie modulele de program pentru prelucrarea datelor, formularele pentru
editarea datelor, comenzile pentru afiçarea rapoartele etc.
d. Så activeze procesorul de evenimente. Deoarece programul generat de con-
structorul de meniuri nu conÆine propriul procesor de evenimente, este necesar
ca, dupå ce a fost lansat în execuÆie programul care creeazå meniul, så se
activeze procesorul de evenimente care la rândul såu va activa meniul çi va
permite tratarea evenimentelor.
e. Så dezactiveze procesorul de evenimente çi så refacå starea anterioarå a
mediului de lucru la terminarea execuÆiei aplicaÆiei.
Exemplu
Pentru salvarea çi restaurarea parametrilor care caracterizeazå starea sistemului, puteÆi
folosi douå tabele (câte una pentru fiecare tip de comandå set):
9 stare1 (comenzi set pentru parametrii cu douå valori - on çi off; de exemplu talk,
century, confirm, console, deleted çi safety) cu structura nume C(15), valoarea_s
C(3), valoarea_a C(3);
9 stare2 (comenzi set pentru parametrii cu mai multe valori - set ... to; de exemplu
default çi date) cu structura nume C(15), valoarea_s C(30), valoarea_a C(30);
unde valoarea_s este valoarea parametrului în sistemul Visual FoxPro, iar valoarea_a este
valoarea parametrului în aplicaÆie. ÎncårcaÆi iniÆial tabelul cu numele parameterilor pe care
doriÆi så-i modificaÆi (câmpul nume) çi cu valorile pe care doriÆi så le aibå în aplicaÆie.
Pentru salvarea configurårii sistemului, la începutul sesiunii de lucru veÆi folosi procedura
intrare:
procedure intrare
* se salveaza valorile parametrilor sistemului
* se atribuie parametrilor valorile aplicatiei
use stare1
scan
replace valoare_s with set(alltrim(stare1.nume))
alfa=alltrim(stare1.nume)
beta=alltrim(stare1.valoare_a)
set &alfa &beta
endscan
use
use stare2
scan
replace valoare_s with set(alltrim(stare2.nume))
alfa=alltrim(stare2.nume)
beta=alltrim(stare2.valoare_a)
set &alfa to &beta
endscan
use
endproc
348 Informatică
Pentru restaurarea stårii sitemului, la sfârçitul sesiunii de lucru veÆi folosi procedura ieçire:
procedure iesire
* se restaureaza valorile parametrilor sistemului
use stare1
scan
alfa=alltrim(stare1.nume)
beta=alltrim(stare1.valoare_s)
set &alfa &beta
endscan
use
use stare2
scan
alfa=alltrim(stare2.nume)
beta=alltrim(stare2.valoare_s)
set &alfa to &beta
endscan
use
endproc
5.2. G e s t i o n a r e a c o m p o n e n t e l o r u n e i a p li c a ţii
Proiectul (project) este o facilitate prin care proiectantul unei aplicaÆii poate
Æine evidenÆa componentelor aplicaÆiei çi le poate administra. El este un fiçier
care conÆine o colecÆie de fiçiere cu structuri specifice sistemului care le-a creat.
CreaÆi un proiect
Proiectul va cuprinde meniul definit anterior menu_test, formularele care sunt activate de
opÆiunile acestui meniu, çi cele douå fiçiere cu pictograme folosite în formularul care
simuleazå ceasul. La aceste componente trebuie så adåugaÆi programul monitor.
CreaÆi în rådåcina discului C directorul AplicaÆie. În acest director veÆi crea proiectul.
LansaÆi în execuÆie generatorul de proiecte fie cu opÆiunea de meniu New...∈File (din
caseta de dialog New alegeÆi butonul radio Project çi executaÆi apoi clic pe butonul New
File, dupå care în caseta de dialog Create alegeÆi directoul Aplicatie çi atribuiÆi
proiectului numele Proiect), fie cu comanda:
create project \aplicatie\proiect
Se deschide fereastra Project Butonul de restrângere/expandare a ferestrei. În urma
Manager care este împårÆitå în operaÆiei de restrângere fereastra va fi reduså la zona
mai multe secÆiuni, fiecare etichetelor secÆiunilor çi va putea fi ancoratå la fel ca orice
secÆiune reprezentând o cate- barå de instrumente. Executând apoi clic pe o etichetå veÆi
gorie de componente: All - toa- expanda numai secÆiunea corespunzåtoare etichetei.
te componentele, Date - com-
ponentele care conÆin date
(Database, Free Table, Que-
ries), Documents - componen-
tele utile pentru introducerea çi
afiçarea datelor (formularele
Forms çi rapoartele Reports),
Class Libraries - bibliotecile de
clase, Code - componente care
conÆin module de program
(Pro-grams çi Applications) çi
Other - alte componente (meni-
urile Menus, fiçierele de texte
Text Files çi alte fiçiere Other
Files). În zona de lucru a feres-
trei vor fi afiçate componentele
specifice secÆiunii.
Cu ajutorul Gestionarului de proiecte puteÆi executa urmåtoarele operaÆii:
9 Crearea unei componente noi (butonul New...). Se va deschide fereastra construc-
torului corespunzåtor componentei selectate: Menu Designer - pentru meniuri, Query
Designer - pentru interogåri, Report Designer - pentru rapoarte, Form Designer -
pentru formulare ... çi fereastra de editare texte pentru Programs çi Files.
9 Adåugarea unei componente la proiect (butonul Add...). Dacå obiectul a fost
creat în afara proiectului, dupå ce acÆionaÆi acest buton puteÆi så alegeÆi dintr-o listå
componentele pe care doriÆi så le adåugaÆi la proiect.
9 Editarea unei componente a proiectului (butonul Modify). SelectaÆi componenta
din secÆiunea corespunzåtoare a fereastrei çi acÆionaÆi butonul. Se va deschide
fereastra constructoului cu care aÆi creat componenta çi puteÆi så faceÆi modificårile.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 351
Pentru a vizualiza conÆinutul proiectului, executaÆi clic pe butoanele + din faÆa numelui
obiectului:
AcÆionaÆi butonul Build.... În caseta de dialog Build
Options activaÆi butonul Rebuild Project çi apoi
butonul OK.
ÎnchideÆi fereastra aplicaÆiei executând clic pe bu-
tonul de închidere.
InformaÆiile proiectului sunt memorate sub forma
unui tabel. DeschideÆi acest tabel cu comanda:
use \aplicatie\proiect.pjx.
VizualizaÆi conÆinutul tabelului cu comanda
browse. IdentificaÆi semnificaÆia informaÆiilor me-
morate în fiecare rând çi în fiecarea coloanå a tabelului. ÎnchideÆi fereastra de vizualizare.
ÎnchideÆi tabelul cu comanda use.
CreaÆi o aplicaÆie
AplicaÆia o veÆi construi pornind de la proiectul construit anterior.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 353
DeschideÆi proiectul fie cu opÆiunea de meniu Open...∈File (din lista ascunså Files of
type alegeÆi Project, selectaÆi fiçierul Proiect din directoul AplicaÆie çi executaÆi apoi clic
pe butonul Open), fie cu comanda:
modify project \aplicatie\proiect
În secÆiunea Code a ferestrei Project Manager selectaÆi programul monitor care va fi
programul principal. SelectaÆi apoi opÆiunea Set Main∈Project. Numele programului
principal va fi scris cu stilul bold.
Pentru a genera aplicaÆia, acÆionaÆi butonul Build... din fereastra Project Manager.
Se deschide caseta de dialog Build Options în care din grupul de butoane radio
Action activaÆi butonul Build Application. AcÆionaÆi apoi comutatorul OK çi în
fereastra Save As scrieÆi numele aplicaÆiei: test.
LansaÆi în execuÆie aplicaÆia cu comanda:
do \aplicatie\test.app. TestaÆi aplicaÆia.
CreaÆi kitul pentru distribuirea aplicaÆiei
CreaÆi un director Test în care va fi creatå imaginea kitului de distribuÆie.
DeschideÆi caseta de dialog a procedurii asistent alegând opÆiunea de meniu Setup∈
Wizard ∈ Tools çi parcurgeÆi urmåtorii paçi (folosind butonul Next):
1. PrecizaÆi locul sursei kitului- Locate Files. Îl comunicaÆi în câmpul de editare
Distribution files. Pentru a uçura cåutarea, executaÆi clic pe butonul .... Din lista
deschiså alegeÆi directorul c:\aplicatie.
2. PrecizaÆi componentele speciale folosite de aplicaÆie - Specify Components.
Componentele pe care le puteÆi preciza (activând comutatorul corespunzåtor) sunt:
Visual FoxPro runtime - versiunea „pentru rulare” necesarå aplicaÆiilor (este
necesarå atunci când kitul conÆine o aplicaÆie), Microsoft Graph 5.0 runtime -
versiunea „pentru rulare” a programului Microsoft Graph 5.0 (este necesarå atunci
când în programele kitului se creeazå grafice), OLE servers (este necesar atunci
când în programele kitului se foloseçte tehnologia OLE). ActivaÆi comutatorul Visual
FoxPro runtime.
3. CreaÆi directorul cu imaginea kitului - Create Disk Image Directory. Procedura
asistent creeazå pe hard disc o imagine a kitului. Aceastå imagine poate fi
segmentatå în grupuri de directoare, fiecare grup corespunzând unui disc flexibil de
de 3.5 inch sau poate fi nesegmentatå. Modul pe care l-aÆi ales pentru memorarea
pe hard disc va determina tipul suportului destinaÆie. AlegeÆi acest mod activând unul
dintre comutatoarele din grupul Disk Image: 1.44 MB 3.5-inch (pentru discheta de
3.5 inch) sau Netsetup (pentru CD). Locul în care va fi memoratå imaginea kitului îl
veÆi comunica în caseta de text Disk Images Directory. Pentru exemplul nostru veÆi
alege varianta discurilor de 3.5 inch çi directorul pentru imagine va fi c:\Test.
4. PrecizaÆi opÆiunile la instalare - Specify Setup Option. Este obligatoriu så
comunicaÆi informaÆiile pentru caseta de text Setup dialog box caption (titlul afiçat
de fereastra în care ruleazå kitul de instalare; scrieÆi de exemplu Instalare) çi
Copyright information (date referitoare la drepturile de copyright ale aplicaÆiei;
scrieÆi de exemplu Autor <nume>). Mai puteÆi completa caseta de text Post-setup
executable cu numele unui program executabil care va fi lansat în execuÆie la
sfârçitul instalårii kitului. PuteÆi folosi acest program pentru a vå proteja aplicaÆia
împotriva copierilor ilegale sau pentru a stabili configuraÆia specificå aplicaÆiei.
354 Informatică
screen.BackColor= This.culoare_f
set sysmenu to default
endproc
enddefine
# ÎncercaÆi:
Adevårat/Fals:
1. Se poate preciza cazul în care o opÆiune de meniu nu este disponibilå.
2. În procedura Setup a meniului se dezactiveazå procesorul de evenimente.
3. Într-o aplicaÆie Visual FoxPro puteÆi crea un meniu de comenzi rapide.
4. Procedura Cleanup se executå înaintea procedurii Setup.
5. Programul monitor se foloseçte pentru a administra proiectul.
6. Proiectul este un program care, dacå este lansat în execuÆie, monitorizeazå aplicaÆia.
7. AplicaÆia este independentå de mediul Visual FoxPro.
CompletaÆi:
1. Mesajul informativ Message se afiçeazå .............................................................
2. Unei opÆiuni de meniu puteÆi så-i asociaÆi un submeniu, o comandå sau..,....................
3. Fiçierul în care se memoreazå tabelul cu structura meniului are extensia ..........
4. CondiÆia prin care testaÆi disponibilitatea unei opÆiuni de meniu este precizatå prin .............
5. Kitul de instalare conÆine programul ...................... care se foloseçte pentru instalarea
aplicaÆiei pe alt calculator.
AlegeÆi råspunsurile corecte:
1. Pentru revenirea din meniul aplicaÆiei în meniul sistemului, trebuie så atribuiÆi cu comanda
set parametrului sysmenu valoarea :
a) off b) automatic c) to default
2. Extensia fiçierului care conÆine meniul executabil este:
a) mnx b) mnt c) mpr d) mpx
3. Extensia fiçierului care conÆine aplicaÆia este:
a) prj b) api c) exe d) app
R åspunsuri:
Adevårat/Fals: 1-A; 2-F; 3-A; 4-F; 5-F; 6-F; 7-F.
CompletaÆi: 1-bara de stare; 2-o procedurå; 3-.mnx; 4-Skip For ; 5-setup.exe
AlegeÆi råspunsurile corecte: 1-c; 2- c; 3- d.