Documente Academic
Documente Profesional
Documente Cultură
Identificarea i
clasificarea unor tipuri
de structuri de date
n anii precedeni de studiu, ai nvat c un calculator
este o unealt electronic ce v poate ajuta s prelucrai
informaia. Informaia prelucrat poate fi format din
Cum folosii datele pentru a
texte, numere, imagini sau sunete. Ea este pstrat pe
prelucra informaiile.
diferite medii de memorare, n diferite formate, sub
Ce tipuri de date putei folosi.
form de date. Aadar, orice rezolvare de problem
Cum putei organiza datele
ncepe prin definirea datelor, continu cu prelucrarea lor
sub form de colecii de date.
Ce colecii de date putei folosi (de exemplu atribuirea de valori) i se termin fie cu
afiarea valorii lor, fie cu stocarea lor pe un mediu de
n procesul de prelucrare a
memorare n vederea prelucrrii lor ulterior.
datelor.
5.
4 Informatic
alocat, algoritmul de codificare, operatorii admii pentru prelucrare i implicit timpul
necesr prelucrrii.
Analiza datelor se poate face n dou moduri:
9 Logic (la nivelul conceptual). De exemplu, o dat este un numr ntreg pozitiv, cu valori
cuprinse ntre 0 i 100.
9 Fizic (la nivelul reprezentrii ei n memoria intern). De exemplu, n limbajul Pascal o
dat de tip integer, iar n limbajul C o dat de tip int (dat numeric de tip ntreg) este
reprezentat n 2 octei de memorie i permite memorarea datelor cu valori cuprinse
ntre -32768 32767. La nivelul limbajului de programare este necesar s fie
implementai diferii algoritmi care s permit folosirea acestui tip de dat: algoritmi de
ncrcare a valorii datei n zona de memorie, algoritmi de adresare a zonei de memorie
alocate, algoritmi de extragere a valorii din zona de memorie etc.
Ai mai nvat c exist:
9 Date simple sau date elementare. Sunt date independente unele de altele din punct
de vedere al reprezentrii lor n memorie. Chiar dac ele pot depinde din punct de
vedere logic (valoarea unei date este dependent de valoarea altei date), ele nu depind
din punct de vedere fizic (localizarea unei date pe suportul de memorare nu se face n
funcie de locaia unei alte date pe suport).
9 Date compuse sau structuri de date. Sunt colecii de date ntre care exist anumite
relaii (relaii structurale). Fiecare component a structurii are o anumit poziie n
cadrul structurii, iar toate componentele formeaz un ntreg, astfel nct prelucrarea se
poate face att la nivelul structurii de date (care poate fi considerat o entitate de sine
stttoare), ct i la nivelul fiecrei componente. Pentru fiecare tip de structur de
date n limbajul de programare trebuie s fie definii algoritmi de localizare a
componentelor n cadrul structurii de date. ntre componentele structurii exist i
legturi de coninut, adic ntregul ansamblu de date din colecie poate caracteriza un
obiect, o persoan, un fenomen, un proces etc. De exemplu, un vector cu 12
elemente n care se memoreaz valorile lunare ale unui contor electric. Structura de
date caracterizeaz n acest caz un proces: consumul lunar de curent electric.
Aadar orice obiect, proces sau fenomen din lumea real poate fi caracterizat printr-o
list de atribute. Valorile atributelor din list pot fi reprezentate fizic n calculator
(lumea virtual) sub forma unei structuri de date. n anii precedeni de studiu ai lucrat
cu urmtoarele structuri fizice de date:
Structuri de date
n memoria intern
Tabloul de memorie
(vectori i matrici)
n memoria extern
nregistrarea
Fiierul de date
Structurile de date create n memoria intern sunt temporare dar permit o vitez de
prelucrare mult mai mare dect 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 cantiti mari de date.
1. Baza de date
Principalele probleme pe care le implic ns o colecie de date format dintr-un ansamblu de fiiere de date sunt:
9 Redundana datelor. Redundana reprezint o proprietate a unei colecii de date i
se refer la faptul c unele componente ale coleciei sunt memorate de mai multe
ori pe suportul de memorare. Date care reprezint aceeai informaie pot s apar
n fiiere de date diferite, de multe ori cu formate de reprezentare diferite. Folosind
mai multe copii ale acelorai date se consum inutil suport de memorare. Pe lng
acest dezavantaj, mai exist i alte dezavantaje: se consum timpi suplimentari cu
actualizarea datelor, deoarece se actualizeaz de mai multe ori acelai set de date
(actualizarea se face n fiecare fiier de date n care setul de date apare), actualizarea
datelor n toate fiierele de date este un proces dificil (fiecare posesor al unui fiier de
date trebuie s fie informat de schimbrile survenite) i nu pot fi controlate erorile
aprute n procesul de actualizare a datelor.
9 Actualizarea fiierelor i pstrarea integritii datelor. Actualizarea datelor trebuie
s se fac n toate fiierele n care apar. Dac se omite un singur fiier, nu mai este
asigurat integritatea datelor, iar rapoartele obinute cu aceste date vor conine
informaii greite.
9 Dependena programelor de fiierele de date. Pentru exploatarea i ntreinerea
fiecrui fiier de date, programatorii vor scrie cte un program. Orice modificare n
structura fiierului de date va avea ca efect modificarea programului de aplicaie. n
plus, n loc s se scrie un singur program pentru o colecie de date unic, se scriu mai
multe programe, cte unul pentru fiecare colecie. Efectul este creterea costurilor
pltite de ctre organizaie pentru programele care trebuie s-i furnizeze informaiile
din fiierele de date.
Ansamblurile independente de date erau folosite n general n folosul unui singur departament al organizaiei i mai puin n folosul ntregii organizaii. Soluia care poate rezolva
aceast problem este reunirea datelor ntr-o colecie unic numit baza de date. n
acest mod, organizaia i poate exercita controlul asupra tuturor datelor.
Controlul se execut prin intermediul administratorului bazei de date (database
administrator - DBA) care este o poziie n cadrul administraiei (ocupat de una sau mai
multe persoane) ce are ca atribuie stabilirea datelor care sunt necesare n cadrul
organizaiei sau la nivelul fiecrui departament. Administratorul bazei de date mai poate
s stabileasc i modul n care se execut accesul la date, adic s hotrasc pentru
fiecare persoan din organizaie setul de date din colecia de date la care are acces. Pe
parcursul exploatrii bazei de date, el poate s hotrasc modificarea structurii bazei de
date n funcie de noile cerine ale utilizatorilor.
6 Informatic
Resurse
umane
Salarizare
Relaii cu
clienii
Producie
Marketing
Produse
Angajai
Aprovizionare
Stocuri
Salarii
Vnzri
Clieni
Catalog
produse
Furnizori
Comenzi
Deoarece datele companiei se gsesc n mai multe fiiere de date independente, apar
urmtoarele dezavantaje:
1. Departamentele nu pot folosi n comun datele de care au nevoie. ntre fiierele cu
date ale departamentelor nu exist posibilitatea de comunicare, iar departamentele nu
pot folosi n comun aceste date. De exemplu, dac angajaii implicai n vnzri sunt
pltii n funcie de coeficientul vnzrilor lunare i nu conform unui salariu tarifar,
informaiile necesare calculrii drepturilor salariale ale acestor persoane se gsesc n
fiierul Vnzri. La acest fiier nu are acces funcionarul din departamentul Salarizare
care are nevoie de ele pentru a calcula salariul lunar al angajailor ce se ocup cu
vnzarea produselor. Aceasta nseamn c o persoan din departamentul Marketing
va extrage din fiierul Vnzri o list cu angajaii implicai n vnzri n luna respectiv
i cu volumul valoric al vnzrilor fiecruia dintre ei. La rndul su, persoana din
departamentul Salarizare va trebui s actualizeze fiierul Salarii pe baza listei primite.
2. Ansamblul de fiiere de date are o redundan foarte mare. Colecia de fiiere de
date are o redundan mare deoarece foarte multe din date sunt duplicate, fiind
memorate n mai multe fiiere de date. De exemplu, unele informaii despre angajai
sunt memorate i n fiierul Salarii aflat n ntreinerea compartimentului Salarizare,
dar i n fiierul Angajai aflat n ntreinerea compartimentului Resurse umane sau
unele informaii despre produsele realizate pot s apar att n fiierul Produse aflat
n ntreinerea compartimentului Producie, ct i n fiierul Catalog_produse aflat n
ntreinerea compartimentului Marketing.
3. Orice micare n cadrul companiei necesit intervenia n mai multe fiiere de
date. De exemplu, datele despre un client pot s apar att n fiierul Clieni, ct i n
fiierul Vnzri. Dac un client i schimb adresa, modificarea trebuie fcut n ambele
fiiere. Deci, o persoan din cadrul companiei trebuie s aib grij s informeze cele
dou persoane care se ocup de actualizarea celor dou fiiere din cele dou
departamente ca s fac aceste modificri. Aceasta nseamn c la nivelul companiei
ar trebui s existe o persoan care s aib cunotine despre toate aceste fiiere de
date, de structura lor i de toate schimbrile care apar n cadrul companiei i care pot
afecta aceste date. Aceast persoan ar trebui s informeze, atunci cnd 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. Deficiene pot s
apar chiar dac aceast persoan informeaz corect departamentele. Persoana care
face modificri ntr-un fiier de date poate s scrie greit o valoare, astfel nct la nivelul
companiei, aceeai dat va avea valori diferite, n fiiere diferite.
Soluia este reunirea acestor fiiere de date ntr-o singur colecie de date: baza de
date. n aceast colecie pot fi eliminate datele duplicate (de exemplu informaiile des-pre
un client care apar i n fiierul Clieni i n fiierul Vnzri i n fiierul Comenzi),
micorndu-se foarte mult redundana datelor. Deoarece datele se vor gsi o singur
dat, n aceeai colecie, actualizarea lor se poate face mult mai uor, asigurndu-se
astfel integritatea datelor. n plus, angajaii unui departament pot avea acces i la datele
produse de un alt departament.
Principala problem care apare n acest caz este ca angajaii 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 angajailor, ale clienilor i ale furnizorilor pentru a putea expedia corespondena, nu i la alte date despre acetia: salariile angajailor, conturile bancare ale
clienilor, facturile emise ctre clieni i alte tranzacii financiare fcute de companie.
Aadar, principalul avantaj al bazelor de date l reprezint partajarea datelor unei
organizaii ntre membrii ei, iar principalul dezavantaj este necesitatea controlrii
accesului la datele importante din colecie.
Considerai c coala voastr este o organizaie format din mai multe compartimente.
Analizai activitatea din coala voastr i punei n eviden fiierele de date care pot fi
folosite pentru a ine evidena activitilor care au loc la nivelul colii i la nivelul fiecrei
clase. Artai care sunt deficienele acestei colecii de
fiiere de date.
Baza de date (database) este o colecie de fiiere i nregistrri legate ntre ele.
Pentru a permite accesul difereniat la datele din colecia de date, se poate defini o
schem general a bazei de date care descrie ntreaga colecie de date i diferite
scheme pariale care descriu seturile de date din colecie la care pot avea acces anumii
utilizatori sau anumite grupuri de utilizatori.
Aadar, avantajele folosirii bazelor de date n locul fiierelor de date sunt:
9 Partajarea informaiilor. Spre deosebire de datele din fiierele de date la care au
acces numai utilizatorii care le-au creat i le ntrein, la datele din baza de date pot
avea acces toi membrii unei organizaii, care i vor partaja datele din baza de date.
Pot fi create aplicaii noi care s foloseasc datele din mai multe colecii de date i
care s furnizeze informaii noi folosind tot ansamblul de date. n acest mod, fiecare
utilizator are senzaia c este beneficiarul unic al coleciei de date.
10 Informatic
nevoie de ele. n plus, baza de date poate fi reorganizat (pot fi regrupate cmpurile din
nregistrri) pentru a face fa cerinelor unui nou utilizator, fr a fi afectai vechii utilizatori. Eliminarea unor entiti din baza de date poate afecta ns utilizatorii care fac
referiri la acele entiti.
Baz de date
Sistem de gestiune
a bazelor de date
Software de aplicaii
Utilizator
11
12 Informatic
9 Programele de aplicaii sunt uor de scris deoarece ele descriu datele folosind
modelul conceptual al bazei de date (numele entitilor 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 cutarea uneia sau a mai multor entiti care ndeplinesc anumite criterii,
9 sortarea n diferite moduri a diferitelor entiti 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 fiierelor de date exist dou niveluri de organizare a datelor: nivelul
logic care const n descrierea structurii de cmpuri de ctre programator i nivelul fizic
care const n metodele de nregistrare i regsire a datelor la nivelul suportului de date. n
cazul bazelor de date, pentru asigurarea independenei datelor, organizarea trebuie s se
fac pe cel puin trei niveluri:
Nivelul extern
(modelul extern)
vizualizrile
Nivelul
conceptual
(modelul
conceptual)
descrierea bazei
de date
Nivelul intern
(modelul intern)
baza de date
fizic
Utilizatori
Calculator
Sistemul e gestiune a
bazelor de date
9 Nivelul intern sau baza de date fizic este reprezentat de colecia de fiiere nregistrate pe suportul de memorare, fiiere care conin datele propriu-zise dar i informaiile
suplimentare, necesare accesului la datele din baza de date.
9 Nivelul conceptual reprezint descrierea unitilor logice din care este format baza
de date i a legturilor dintre ele. Tot n modelul conceptual sunt specificate constrngerile aplicate asupra datelor, care determin restricii ale operaiilor 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 unitile logice de la nivelul conceptual cu care opereaz un
utilizator sau un grup de utilizatori. Pentru modelul extern se mai folosete i termenul
de vizualizare (view) sau tabel virtual, deoarece se definete pe baza unei expresii
13
relaionale aplicate cmpurilor din tabelele reale ale bazei de date. Vizualizarea
pstreaz numai schema prin care este definit, nu i datele propriu-zise, pe care le
preia din tabelele reale de fiecare dat cnd este folosit. Cea mai important utilitate
a unei vizualizri 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 vizualizri, acestea pot s ascund unui utilizator acele
uniti logice la care nu are drept de acces. Vizualizrile pot s controleze i operaiile
pe care le poate executa cu unitile logice: unele vizualizri i permit s actualizeze
unele uniti logice, altele i permit numai s le consulte. De exemplu, dac se
construiete o baz de date a companiei, n tabelul Angajai este nregistrat data
naterii pentru fiecare angajat. Dac o anumit categorie de utilizatori (de exemplu
personalul din compartimentul Resurse Umane) dorete o list cu angajaii dintr-un
compartiment i vrsta lor, nu se recomand nregistrarea vrstei 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 definete
entitatea vrst. Aceast entitate se calculeaz ca diferen dintre data curent
furnizat de sistem i data naterii nregistrat ntr-unul din tabelele bazei de date.
n baza de date avei un tabel cu notele elevilor, care are urmtoarele cmpuri: codul elevului, disciplina, data notrii, nota. Pentru a afla mediile semestriale ale elevilor dintr-o
clas la fiecare disciplin, ce soluie se poate alege: s se creeze un tabel cu mediile
elevilor (care s aib urmtoarea structur: codul elevului, codul disciplinei, media) sau
s se creeze o vizualizare cu aceeai structur?
Modelul de date ofer instrumentele necesare interpretrii datelor din colecia 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 operaiile pentru manipularea datelor.
Se pot folosi mai multe modele pentru organizarea bazelor de date.
14 Informatic
Baze de date ierarhice (hierarchical database). n acest model de organizare a bazelor
de date entitile (cmpurile i nregistrrile) sunt structurate sub form de noduri.
Nodurile sunt puncte care conecteaz ramurile unui arbore descendent. Un nod de pe
nivelul inferior este subordonat unui singur nod din nivelul ierarhic imediat superior, dar
poate fi n relaie cu n noduri aflate la nivelul inferior. Altfel spus fiecare entitate are un
singur nod printe (parent node), dar un printe poate avea mai multe noduri copil
(child nodes). Pentru a gsi un anumit cmp trebuie s se porneasc cu nodul printe de
pe primul nivel i s se coboare pe arbore pn la copilul care conine acel cmp.
Un exemplu de organizare ierarhic este baza de date pentru sistemul de rezervri la
liniile aeriene, structurat pe 4 niveluri. Nodul printe de pe primul nivel este oraul de
plecare Bucureti. Acest printe are patru copii: Cluj, Constana, Iai i Timioara, care
reprezint oraele de sosire. Nodul Timioara are la rndul su doi copii: 210 i 211 care
reprezint numrul zborurilor. Zborul 210 are la rndul su trei copii, pasagerii.
plecare
Bucureti
Cluj
sosire
Constana
Timioara
Iai
210
211
Clin Mircea
Andronescu Ana
numr zbor
Ionescu Alexandru
pasager
ansambluri
piese
Produsul 1
Ansamblul 1
Piesa 1
Piesa 2
Produsul 2
Ansamblul 2
Piesa 3
Produsul 3
Ansamblul 3
Piesa 4
Piesa 5
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 componena mai multor ansam-
15
bluri, iar fiecare ansamblu poate intra n componena mai multor produse. n acest
exemplu se poate observa c organizarea de tip reea este mai flexibil i n multe cazuri
mai eficient dect cea ierarhic.
Baze de date relaionale (relational database). Cel mai flexibil model de organizare l
reprezint bazele de date relaionale, 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 relaie.
elevi
absene
... adresa
identif. dat
elev
absen
discipline
identif.
nume
disciplin
...........
identif.
identif.
disciplin profesor
profesori
identif.
nume
.............
profesor
S construim o baz de date a colii. S considerm tabelul elevi care conine date despre
elevii colii: identificatorul elevului, numele, prenumele, data naterii, numrul de telefon i
adresa. Un alt tabel, absene, conine date despre absenele elevilor din toat coala:
identificatorul elevului, data absenei, identificatorul disciplinei i identificatorul profesorului.
Aceste dou tabele sunt legate printr-un cmp comun numit cmp cheie. n acest caz,
cmpul cheie este identificatorul elevului. Aceasta nseamn c ntre tabelul elevi i tabelul
absene s-a stabilit o relaie prin intermediul unui cmp cheie care conine o informaie
comun ambelor tabele i anume identificatorul elevului. n tabelul profesori se pstreaz
date despre profesorii din coal: nume, prenume, discipline la care predau, grad didactic,
adres, numr telefon etc. Tabelul profesori se leag de tabelul absene prin cmpul cheie
identificatorul profesorului. n tabelul discipline se pstreaz date despre disciplinele predate
n coal: nume, profilul clasei i anul de studiu, numrul de ore etc. Tabelul discipline se
leag de tabelul absene prin cmpul cheie identificatorul disciplinei. Aceste patru tabele
formeaz mpreun o baz de date relaional (relational database). Baza de date a colii
mai poate fi completat i cu alte tabele ca de exemplu, tabelul cu date despre prinii elevilor
(prini) care se va lega de tabelul elevi prin cmpul cheie identificatorul elevului, tabelul cu
date despre notele elevilor (note) care se va lega de tabelul elevi prin cmpul cheie
identificatorul elevului, de tabelul profesori prin cmpul cheie identificatorul profesorului i de
tabelul discipline prin cmpul cheie identificatorul disciplinei, tabelul cu date despre clase
(clase) care conine date despre clasele din coal (identificator clas, an de studiu,
identificatorul profesorului diriginte) care se va lega de tabelul elevi prin cmpul cheie
identificatorul clasei, iar de tabelul profesori prin cmpul cheie identificatorul profesorului etc.
16 Informatic
Fiecare rnd din tabel n care se gsesc informaii despre un elev corespunde unei
nregistrri de date. Fiecare coloan cu informaii corespunde unui cmp (de exemplu,
coloana adres). Capul de tabel (antetul tabelului) definete structura tabelului i se mai
numete 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 nti structura tabelului (capul de tabel), adic trebuie precizate cmpurile
care o compun, ct i caracteristicile acestora.
Baza de date
Colecia de date = colecie de relaii
Relaie
Tuplu
Atribut
Deoarece interfeele puse la dispoziie de sistemele de gestiune a bazelor de date relaionale folosesc n general termenii de tabel (table), cmp (field) i nregistrare (record),
vom folosi n continuare aceti termeni pentru a defini obiectele corespunztoare ale
bazei de date.
17
Coloane = Cmpuri
Relaii ntre tabele
Rnduri = nregistrri
Tabelele
Baza de date relaional
Procesul de construire a unei baze de date se desfoar n dou etape:
1. Construirea tabelelor care compun baza de date. Aceasta nseamn c pentru
fiecare tabel din baza de date trebuie definit structura, adic ansamblul de cmpuri
mpreun cu proprietile lor. Dup definirea structurii ncepe ncrcarea datelor n
tabel. La nivelul tabelului entitatea prelucrat este nregistrarea: se pot aduga
nregistrri, se pot terge nregistrri, se pot modifica nregistrri. Se poate modifica
structura unui tabel chiar dup ce a fost ncrcat cu date. Sistemul de gestiune a
bazelor de date nu opereaz modificarea de structur direct n tabel, ci execut
urmtoarele operaii: creeaz noua structur de tabel (rezultat n urma modificrilor
cerute), ncarc n noul tabel datele din vechiul tabel i terge vechiul tabel. Toate
aceste operaii sunt executate automat de ctre sistem, fr intervenia utilizatorului
i fr a fi vizibile pentru utilizator.
2. Stabilirea relaiilor ntre tabele. Relaiile care se vor stabili ntre tabele sunt unidirecionale, adic ntre dou tabele nu se stabilete o relaie de egalitate ci o relaie
de subordonare: unul dintre tabele este tabelul conductor sau principal (tabelul de
la care pornete legtura), iar cellalt este tabelul condus sau secundar (tabelul la
care ajunge legtura). Tabelul condus este subordonat tabelului conductor. Aceasta
nseamn c dac utilizatorul selecteaz o nregistrare n tabelul conductor, sistemul
va selecta automat nregistrarea de care este legat din tabelul condus.
De obicei, modelul relaional cel mai des ntlnit este cel descris printr-un arbore cu o
singur rdcin, adic n baza de date exist un singur tabel conductor care reprezint
rdcina arborelui. Celelalte tabele sunt legate de tabelul conductor direct sau indirect
(prin intermediul altor tabele).
18 Informatic
Tabelul conductor
nregistrarea 1
nregistrarea 2
nregistrarea 3
nregistrarea 4
nregistrarea 5
nregistrarea 6
Tabelul condus
nregistrarea 1
nregistrarea 2
nregistrarea 3
nregistrarea 4
nregistrarea 5
nregistrarea 6
nregistrarea este
selectat printr-o
comand a utilizatorului.
nregistrarea este
selectat automat de
sistem.
Pentru a putea stabili legturi ntre tabele, se definesc n tabele chei de identificare.
Cheia de identificare este format din numrul minim de cmpuri alese astfel nct
ansamblul lor de valori s fie unic n cadrul unui tabel pentru a permite identificarea
nregistrrilor din tabel. Aadar, fiecare nregistrare va putea fi identificat n mod unic
prin valorile cheii astfel definite. Este posibil ca ntr-un tabel s poat fi evideniate mai
multe grupuri de cmpuri care s permit identificarea n mod unic a nregistrrilor
tabelului, deci pot fi definite mai multe chei de identificare. Deoarece un tabel nu poate
avea dou nregistrri identice, orice tabel poate avea cel puin o cheie de
identificare, format n cel mai ru caz din toate cmpurile nregistrrii.
Cheia primar este aleas din mulimea cheilor de identificare pe baza anumitor criterii
i este folosit pentru a face legtura ntre nregistrrile mai multor tabele ale bazei de
date. Cheia primar va fi folosit de sistemul de gestiune a bazelor de date pentru a
identifica unic nregistrrile n procesul de cutare i regsire a datelor. Se recomand ca
din mulimea cheilor de identificare s se aleag, pentru cheia primar, cheia care este
format din cele mai puine cmpuri.
Cheia secundar este format dintr-unul sau mai multe cmpuri dintr-un tabel, care sunt
folosite ca o cheie primar n alt tabel, valorile cmpurilor din cheie fiind identice n
ambele tabele. Se mai numete i cheie strin.
Legtura dintre tabelele bazei de date se realizeaz prin mecanismul de propagare a
cheilor. n tabelul surs, tabelul de la care ncepe propagarea cheii (tabelul conductor),
se gsete cheia primar, iar n tabelul destinaie, tabelul pn la care se propag cheia
(tabel condus), se gsete cheia secundar. Se spune c a avut loc propagarea cheii din
tabelul surs n tabelul destinaie. Acest mecanism permite stabilirea legturii ntre o
nregistrare din tabelul surs i o nregistrare din tabelul destinaie. Condiia care trebuie
respectat pentru a putea fi asigurat aceast legtur se numete condiia de
integritate referenial.
19
Integritatea referenial
Este specific relaiilor dintre tabelele bazei de date. Ea nseamn o colecie de reguli i
restricii impuse tabelelor ntre care s-au stabilit relaii. Astfel, a asigura integritatea
referenial nseamn ca atunci cnd se fac modificri ale valorii unui cmp dintr-un
tabel s nu fie afectat relaia dintre tabele. Aceast problem apare n cazul
cmpurilor care fac parte dintr-o cheie primar sau secundar. Ele trebuie s respecte
condiia de integritate referenial.
20 Informatic
21
22 Informatic
9 Tabelul Produse n care sunt pstrate date despre produsele realizate: codul
produsului, denumirea produsului, unitatea de msur, cantitatea, data la care a fost
realizat produsul, preul de fabricaie etc.
9 Tabelul Catalog_produse n care sunt pstrate date despre produsele oferite de
companie: codul produsului, denumirea produsului, descrierea produsului, unitatea de
msur, preul etc.
n aceste tabele apar mai multe cmpuri de tip: cod produs, cod angajat, cod client sau
cod furnizor. Ele se folosesc pentru a identifica unic nregistrrile din tabele.
Pentru aceste tabele pot fi definite diferite chei de identificare. De exemplu, pentru
tabelul Angajai se poate folosi pentru cheie cmpul cod_angajat sau
cod_numeric_personal deoarece ele identific unic un angajat din tabel. Cmpurile
nume_prenume, funcie sau departament nu pot fi folosite pentru cheia de identificare
pentru c ele nu pot identifica unic nregistrrile din tabel (angajaii) deoarece pot exista
mai muli angajai care au acelai nume i prenume sau care au aceeai funcie ori
lucreaz n acelai departament. Cmpurile cod_angajat i cod_numeric_personal nu
pot forma mpreun o cheie de identificare deoarece cheia presupune numrul minim de
cmpuri necesar identificrii, iar n acest exemplu, fiecare cmp n parte este suficient
pentru identificarea angajatului.
Pentru tabelul Stocuri sunt necesare dou cmpuri pentru a obine cheia de identificare
a unei nregistrri: cod_material i cod_depozit, deoarece fiecare dintre aceste cmpuri
luate separat nu pot identifica unic o nregistrare din tabel: exist mai multe cmpuri
cod_material cu aceeai valoare, cte unul pentru fiecare depozit n care se gsete n
stoc acel material i mai multe cmpuri cod_depozit cu aceeai valoare, cte unul pentru
fiecare material care exist n acel depozit.
Dac n tabelul Clieni cmpul cod_client este cheie primar deoarece el identific unic
un client, n tabelul Comenzi el va fi cheie secundar i va permite stabilirea unei relaii
ntre tabelul Clieni i tabelul Comenzi. Pentru a fi ndeplinit condiia de integritate referenial, nu trebuie s existe nici o comand n tabelul Comenzi care s nu corespund
unui client din tabelul Clieni.
Salarii
Catalog
materiale
Clieni
Catalog
produse
Furnizori
Angajai
Vnzri
Produse
Comenzi
Stocuri
23
ntre tabelele bazei de date ale companiei se vor stabili mai multe legturi. De exemplu,
ntre tabelul Catalog_produse i tabelul Produse sau ntre tabelul Catalog_produse i
tabelul Vnzri prin intermediul cheii cod_produs.
Baza de date poate conine:
9 Tabele corelate. Sunt tabele ntre care se stabilesc legturi. De exemplu, ntre
tabelele Clieni i Comenzi exist o legtur realizat prin intermediul codului clientului
care a emis comanda (cheia cod_client).
9 Tabele necorelate. Sunt tabele ntre care nu se stabilesc legturi. De exemplu, ntre
tabelele Stocuri i Salarii nu exist nici un fel de legtur. n acest caz tabelele se
folosesc pentru a separa date diferite ntre ele.
Relaia
Este o legtur dintre un cmp sau o combinaie de cmpuri dintr-un tabel (cheia
primar) i cmpurile corespunztoare dintr-un alt tabel (cheia secundar). Exist mai
multe tipuri de relaii:
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 relaie este similar cu un tabel care conine ambele tabele. Se folosesc ns
dou tabele din urmtoarele motive:
Tabelul A
Tabelul B
9 Un tabel unic ar fi un tabel foarte
mare, cu o structur care poate
depi numrul maxim de cmpuri
a1
b1
acceptat de sistemul de gestiune a
a2
b2
bazelor de date (de exemplu, 255
de cmpuri n Visual FoxPro).
a3
b3
9 Numrul de cmpuri din nregisa4
b4
trrile tabelului nu sunt fixe (unele
nregistrri au nevoie de mai multe
a5
cmpuri dect alte nregistrri).
9 Dac se lucreaz ntr-o reea de calculatoare, se prefer ca anumite cmpuri din tabel
s se pstreze pe calculatorul local i nu pe serverul de fiiere.
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 operaii, iar asupra
altui grup de date din tabel se execut alt gen de operaii.
De exemplu, relaia stabilit ntre tabelele Salarii i Angajai este de una-la-una deoarece
unui angajat i corespunde un singur salariu, iar un salariu corespunde unui singur angajat.
Legtura ntre cele dou tabele se face prin intermediul cmpului 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 acelai gen de operaii n cadrul organizaiei. Datele din
tabelul Agajai sunt folosite de departamentul Personal atunci cnd trebuie luate decizii referitoare la angajaii companiei. Acest tabel conine datele generale ale fiecrui angajat care
sunt necesare atunci cnd trebuie promovat, penalizat, disponibilizat sau cnd trebuie localizat (adres, telefon) pentru a i se transmite o anumit informaie. Datele din tabelul Salarii
sunt folosite de departamentul Salarizare atunci cnd trebuie calculate drepturile salariale ale
fiecrui angajat sau datoriile companiei ctre bugetul statului i ctre asigurri, legate de
angajaii si. Acest tabel conine informaii necesare pentru calculul lunar al salariului fiecrui
angajat.
(one-to-many).
2. Una-la-mai-multe
nseamn c o nregistrare din primul tabel poate fi legat cu mai
multe nregistrri din al doilea tabel.
Tabelul A
Tabelul B
a1
b1
b2
Este cel mai rspndit tip de relaie.
b3
Primul tabel trebuie s aib un cmp
cheie primar, iar al doilea tabel
a2
b4
trebuie s conin un cmp similar, prin
care s se poat identifica nregistrarea
din primul tabel de care este legat nregistrarea din al doilea tabel. Un exemplu de
relaie una la mai multe este cea stabilit ntre tabelul Clieni i tabelul Comenzi. Unui
client i corespund mai multe comenzi, dar o comand poate fi emis de ctre un singur
client. Cmpul cheie folosit pentru legtur 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 nregistrri din al doilea tabel, i invers, o nregistrare din
cel de-al doilea tabel poate fi legat de una sau mai multe nregistrri din primul tabel.
De exemplu, ntre tabelul Vnztori i
Tabelul A
Tabelul B
tabelul Produse poate fi stabilit o relaie de mai-multe-la-mai-multe: un angajat comercial poate vinde mai multe
a1
b1
produse, iar un produs este vndut de
a2
b2
mai muli angajai comerciali. Relaia
mai-multe-la-mai-multe poate fi desa3
b3
compus n dou relaii una-la-maia4
b4
multe. n acest caz se construiete un
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. Fiecrei nregistrri din tabelul Elevi i corespund mai multe
nregistrri n tabelul Discipline (un elev studiaz mai multe discipline) i fiecrei nregistrri
25
din tabelul Discipline i corespund mai multe nregistrri n tabelul Elevi (o disciplin este
studiat de mai muli elevi). Aceast relaie se poate descompune n dou relaii una-la-maimulte prin crearea unui tabel suplimentar ncadrri care s conin nregistrri cu dou cmpuri: cod_elev i cod_disciplin. Relaiile vor fi de una-la-mai-multe ntre tabelul Elevi i
tabelul ncadrri (unui elev i corespund mai multe ncadrri, cte una pentru fiecare disciplin
pe care o studiaz) i ntre tabelul Discipline i tabelul ncadrri (unei discipline i corespund
mai multe ncadrri, cte una pentru fiecare elev care o studiaz).
Setul software
Microsoft Office
Lotus SmartSuite
Corel Suite Office
S.G.B.D.
Access
Lotus Approach
Paradox
Unele firme, cum este Microsoft, produc i alte SGBD-uri relaionale (FoxPro). Toate
aceste sisteme de gestiune a bazelor de date sunt orientate pe microcalculatoare i
reele de microcalculatoare.
ns cel mai utilizat SGBD relaional din ntreaga lume rmne n continuare Oracle
produs de firma Oracle Corporation, deoarece are urmtoarelor avantaje:
9 Poate fi folosit cu diferite sisteme de operare: Windows pentru microcalculatoarele compatibile IBM i System pentru calculatoarele Macintosh, Unix pentru microcalculatoare i
minicalculatoare i sisteme de operare pentru calculatoare mari (mainframe).
9 Permite dezvoltarea unor baze de date de orice dimensiune (de la civa octei pn
la gigaoctei).
9 Respect standardele n vigoare referitoare la limbajele de accesare a datelor (SQL).
9 Accept un numr mare de utilizatori simultani, minimiznd conflictele care pot s
apar n cererile simultane de acces la date.
9 Asigur o securitate mrit datorit siguranei foarte mari la limitarea i monitorizarea
accesului la date.
Funciile unui sistem de gestiune a bazelor de date relaionale sunt:
9 memorarea, actualizarea (adugarea, tergerea i modificarea) i regsirea datelor
din baza de date (utilizatorul poate crea i manipula datele fr s cunoasc modul n
care sunt stocate pe mediul de memorare),
9 crearea i ntreinerea dicionarului de date,
9 asigurarea acesului rapid la datele din colecia de date,
9 pstrarea unei copii de siguran a datelor pentru a putea fi recuperate n cazul n care
au loc ntreruperi accidentale ale funcionrii sistemului,
26 Informatic
9 asigurarea securitii datelor,
9 asigurarea accesului simultan al mai multor utilizatori la o nregistrare din baza de
date (eventual asigurarea accesului concurent),
9 asigurarea integritii datelor (se pot introduce n baza de date numai date valide, iar
operaiile de actualizare nu distrug legturile dintre tabele).
Sistemele de gestiune a bazelor de date relaionale v pot pune la dispoziie urmtoarele
metode prin care s asigurai securitatea bazei de date:
Parol la nivelul ntregii baze de date
Aceast metod permite asigurarea securitii la nivelul bazei de date. Este cea mai
simpl metod de asigurare a securitii i cel mai rapid de realizat. Se atribuie o singur
parol pentru ntreaga baz de date. Orice persoan care dorete s foloseasc baza de
date trebuie mai nti s introduc parola. Dac parola este corect, se obine accesul la
baza de date i toate obiectele bazei de date i vor fi disponibile. Metoda este eficient
numai n cazul unui birou mic i cu un numr foarte mic de utilizatori ai bazei de date
(eventual unul singur). Acetia se pot asigura astfel c nici o persoan neautorizat (din
afara biroului) nu are acces la baza de date.
Drepturi specifice acordate utilizatorilor sau grupurilor de utilizatori
Aceast metod permite asigurarea securitii la nivelul utilizatorului. Utilizatorii pot
avea drepturi diferite asupra aceleiai baze de date prin folosirea schemelor pariale. Fiecare utilizator deine propria parol, care este unic i nu are legtur cu parolele celorlali utilizatori. La nceperea sesiunii de lucru, utilizatorul introduce numele de utilizator i
parola. Sistemul de gestiune a bazelor de date verific dac sunt corecte i dac da,
determin drepturile asociate utilizatorului respectiv (schema parial la care are acces).
Utilizatorii pot fi organizai pe grupuri i pot fi atribuite drepturi la nivel de grup, la nivel de
utilizator sau la ambele niveluri. Grupurile sunt categorii de utilizatori care au aceleai
drepturi de a folosi baza de date. Utilizatorul poate s fac parte dintr-un grup sau din
mai multe grupuri. El va moteni drepturile grupului cel mai puin restrictiv din care face
parte. La aceste drepturi se vor aduga drepturile proprii. Prin aceast metod pot fi
personalizate uor drepturile fiecrui utilizator asupra obiectelor din baza de date.
Informaiile despre utilizatori i grupurile de utilizatori se pstreaz la nivelul bazei de
date, iar drepturile de folosire a obiectelor bazei de date se pstreaz n cadrul tabelelor.
Folosirea grupurilor de utilizatori uureaz mult munca de asigurare a securitii bazei de
date. Mai nti se organizeaz drepturile de acces pe grupuri logice i apoi se ataeaz
utilizatorii la aceste grupuri. Drepturile unui utilizator pot fi uor modificate prin simpla mutare a utilizatorului dintr-un grup n altul. De exemplu, pot fi definite trei grupuri de utilizatori ai unei baze de date relaionale Angajai: primul grup poate vizualiza i actualiza (modifica, aduga, terge) baza de date, al doilea grup poate doar vizualiza baza de date, iar
al treilea grup poate vizualiza numai anumite cmpuri ale bazei de date (de exemplu,
numai numele i adresa). Dac utilizatorul este promovat n funcie i primete noi drepturi de folosire a bazei de date, el va fi mutat n grupul corespunztor acestor drepturi.
Criptarea bazei de date
Primele dou metode se refer la protejarea folosirii bazei de date de ctre persoane
neautorizate prin intermediul sistemului de gestiune a bazelor de date, dar ele nu
27
mpiedic vizualizarea datelor din tabele cu ajutorul altor aplicaii 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.
Elementele folosite de sistemul de gestiune a bazelor de date relaionale pentru ai realiza funciile sunt:
Dicionarul de date (Data Dictionary) conine descrierea structurii datelor folosite n baza
de date. El este generat automat la crearea bazei de date i conine informaii referitoare
la tabelele bazei de date, la fiierele ajuttoare folosite n exploatarea tabelelor i la modul n care pot fi localizate pe disc. De obicei aceste informaii sunt despre:
9 ce date sunt disponibile,
9 unde sunt localizate datele,
9 descrierea datelor,
9 legturile dintre date,
9 cum pot fi folosite datele,
9 cine este proprietarul lor,
9 cui i se permite accesul la consultarea datelor,
9 cui i se permite accesul la actualizarea datelor,
9 limitrile n exploatare generate din necesitatea de a asigura securitatea i
confidenialitatea datelor.
n dicionarul de date se gsesc tabele care conin datele bazei de date n formatul intern
al sistemului de gestiune a bazelor de date folosit, precum i vizualizrile (tabele
virtuale) care sintetizeaz datele din tabelele reale i prezint informaia ntr-un format
accesibil utilizatorului. Actualizarea dicionarului de date se face folosind limbajul
dicionarului de date (Data Dictionary Language). Accesul la dicionarul de date este
permis numai dac baza de date este deschis.
Limbajul de manipulare a datelor (Data Manipulation Language). Este un limbaj folosit
de sistemul de gestiune a bazelor de date pentru gestionarea dicionarului de date prin
operaii de inserare i actualizare a datelor. El permite efectuarea calculelor matematice
i statistice care pot fi folosite apoi n generarea rapoartelor.
Limbajul de interogare (Query Language). Este un limbaj accesibil, uor de neles i de
folosit de marea majoritate a utilizatorilor. Deseori el se confund cu limbajul de manipulare a datelor. El asigur accesul la datele din baza de date, regsirea i afiarea lor.
Interogarea (query) sau cererea de nregistrri este un proces prin care se extrag din
baza de date i sunt prezentate n vederea utilizrii acele nregistrri care satisfac
anumite criterii.
Iat cteva exemple de interogri ale bazei de date a companiei:
9 Identificarea tuturor clienilor dintr-un jude.
9 Afiarea tuturor comenzilor dintr-o perioad de timp pentru un anumit produs sau
pentru toate produsele.
9 Afiarea informaiilor despre un client identificat dup numrul su de cod sau dup
numele su.
28 Informatic
Interogare
Sistemul de
gestiune a
bazelor de date
Terminal
9 Stabilirea volumului mediu de comenzi ntr-o perioad de timp pentru un anumit produs.
9 Stabilirea produsului care a fost
cel mai bine vndut ntr-o anumit
perioad de timp.
9 Afiarea pentru fiecare produs a
cantitii maxime vndute ntr-o
anumit perioad de timp.
9 Afiarea listei de materiale care
au stocul 0.
9 Afiarea listei de materiale care
sunt sub stocul de siguran
admis pentru a asigura fluxul
produciei.
Identificarea
cererii de date
Determinarea
locaiilor n baza
de date
Dicionarul
de date
Limbajul de
manipulare
a datelor
Rspuns
Terminal
Baza de date
9 Afiarea listei cu clienii care au comandat produse care nu exist n acest moment n
stoc (numele clientului, numele persoanei de contact i numrul de telefon).
9 Afiarea unei liste cu clienii care nu au avut comenzi ntr-o perioad de timp precizat.
9 Afiarea unitilor vndute pentru fiecare produs ntr-o perioad de timp.
9 Afiarea informaiilor despre un client identificat dup numrul su de cod sau dup nume.
SQL (Structured Query Language - limbaj structurat de interogare) este cel mai rspndit limbaj de interogare a bazelor de date relaionale. Este un limbaj standardizat care a
fost creat special pentru a putea fi folosit la interogarea, actualizarea i gestionarea bazelor de date. Instruciunile SQL descriu operaiile relaionale ntre tabele, ca de exemplu
Select, Project i Join. Limbajul SQL nu opereaz cu datele propriu-zise (variabile de
memorie i cmpuri) ci cu relaiile 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 (aa 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 instruciuni (prin care i se spune calculatorului pas cu pas ce trebuie s execute). Pe baza
acestor programe, calculatorul execut instruciune dup instruciune respectnd cele trei
tipuri de structuri de control: secvenial, alternativ i repetitiv. Limbajul SQL este un
limbaj de rezultate: el i spune calculatorului ce dorete utilizatorul s obin i nu ce
aciuni trebuie s efectueze ca s obin acele rezultate. Elementul fundamental al
29
oricrei interogri SQL este cuvntul cheie Select cu care ncepe fiecare instruciune
SQL folosit pentru interogarea bazei de date.
De exemplu, sistemul de gestiune a bazelor de date relaionale FoxPro are implementat
un limbaj propriu specializat, dar nelege i limbajul SQL.
30 Informatic
de date a unui client care are dou adrese. Prin eliminarea dependenelor funcionale se
micoreaz redundana datelor i anomaliile care pot s apar atunci cnd se adaug i
se terg nregistrri sau atunci cnd se modific valoarea cmpurilor. Principala cale prin
care se pot elimina dependeele funcionale din cadrul tabelelor este descompunerea lor
n tabele din ce n ce mai simple.
Dependena multivaloric se refer la faptul c valoarea unui cmp x poate forma cte
o nregistrare cu toate combinaiile posibile ale valorilor cmpurilor y i z - cu toate
perechile de valori (y,z) din produsul cartezian al mulimilor Y i Z, mulimi care specific
domeniul de definiie al cmpurilor y i z pentru valoarea cmpului x. De exemplu, pentru
obinerea unui atestat, o mulime Y de elevi trebuie s fie ndrumat de o mulime Z de
profesori, fiind posibil pentru acelai tip de atestat orice combinaie de elev-profesor din
cele dou mulimi. Tabelul format din cele trei cmpuri: tip_atestat, nume_elev,
nume_profesor conine dependene 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 nct s fie respectat aceast
condiie. n acest caz se obin trei tabele: Atestat_elevi (conine cmpurile tip_atestat,
nume_elev, adic atribuiri prin care se poate afla ce atestat va susine fiecare elev),
Atestat_profesori (conine cmpurile tip_atestat, nume_profesor, adic atribuiri prin care
se poate afla ce atestat poate ndruma fiecare profesor) i Atestat (conine cmpurile
nume_elev, nume_profesor, adic atribuiri prin care se poate afla ce profesor ndrum
fiecare elev pentru atestat).
Toate aceste dependene care exist n cadrul unui tabel pot genera diferite anomalii n
timpul executrii operaiilor de actualizare a bazei de date, anomalii care sunt generate n
special din cauza redundanei datelor. Pentru a evita aceste anomalii trebuie nlocuit
tabelul care le genereaz cu alte tabele n care dependenele sunt supuse unor restricii.
Formele echivalente astfel obinute se numesc forme normale.
Exist cinci niveluri de normalizare: primele trei acioneaz asupra dependenelor
funcionale i ultimele dou asupra dependenelor multivalorice. De obicei baza de date
se gndete iniial sub forma unui singur tabel, dup care tabelul respectiv se
normalizeaz trecndu-l prin cele cinci forme normale.
Deoarece n proiectarea unei baze de date primele trei forme sunt cele mai des ntlnite,
n continuare vor fi prezentate numai acestea, pentru a nelege ce nseamn procesul de
normalizare a bazei de date.
31
n care a evoluat profesional n cadrul companiei (funcia, departamentul, data la care a fost
angajat n funcie, data la care a fost schimbat din funcie i motivul: promovare, retrogradare
din cauza absenelor nemotivate, retrogradare din cauza incompetenei etc.). Se observ c
pentru acelai angajat exist mai multe ansambluri de cmpuri (funcie, departament,
data_inial, data_final, motiv_schimbare), n cazul n care a ocupat mai multe posturi n
cadrul companiei, cte un ansamblu pentru fiecare post ocupat. Vom numi post acest ansamblu de cmpuri. Numrul de repetri ale ansamblului post pentru un angajat nu poate fi precizat. Unii angajai au ocupat aceeai funcie de la angajare, alii i-au schimbat funcia de cinci
ori. Deci exist mai multe cmpuri compuse post cu aceeai semnificaie pentru informaia pe
care o reprezint (funcie, perioada ocuprii funciei i motivul schimbrii funciei).
Cod_angajat
Nume_prenume
Cod_numeric
...
Cod_
angajat
Departament
Nume_
prenume
Cod_
numeric
Data_iniial
...
Funcie
...
Post5
Funcie
Post1
Data_final
Departament
Motiv_schimbare
...
Motiv_
schimbare
Fiecare nregistrare conine informaii generale despre salariat i informaii despre un post
ocupat. Pentru un salariat pot exista mai multe nregistrri, cte una pentru fiecare post
ocupat.
32 Informatic
acelai angajat, cte una pentru fiecare schimbare de funcie. Cmpul schimbare_funcie va
nregistra cronologic a cta schimbare de funcie reprezint nregistrarea.
Se observ c n tabelul Angajai, pentru funcie i pentru departament exist un singur
cmp care nu poate identifica unic aceste date deoarece sunt dependente de irul de
caractere introdus de la tastatur (persoane diferite pot scrie diferit acelai nume de
funcie sau acelai nume de departament). Din aceast cauz se atribuie fiecrei funcii
un cod numeric unic cod_funcie i fiecrui departament un cod numeric unic
cod_departament. n acest mod cmpurile funcie i departament vor deveni cmpuri
compuse fiecare din cte dou cmpuri elementare. Cmpul compus funcie poate fi
descompus n cmpurile elementare cod_funcie i denumire_funcie, iar cmpul compus
departament poate fi descompus n cmpurile elementare cod_departament i
denumire_departament. n acest mod vor aprea dou noi tabele: tabelul Funcii care
conine cmpurile cod_funcie, denumire_funcie i tabelul Departamente care conine
cmpurile cod_departament, denumire_departament.
n acest caz tabelul Angajaii va fi format din: cod_angajat, nume_prenume,
cod_numeric, adres, telefon, studii, data_naterii, data_angajrii, schimbare_funcie,
cod_funcie, cod_departament, data_inial, data_final, motiv_schimbare. ntre tabelul
Angajat i tabelul Funcii va exista o legtur prin intermediul cmpului cod_funcie care
este cheie primar n tabelul Funcii i cheie secundar n tabelul Angajat. ntre tabelul
Angajai i tabelul Departamente va exista o legtur prin intermediul cmpului
cod_departament care este cheie primar n tabelul Departamente i cheie secundar n
tabelul Angajai.
Angajaii
Angajat
Funcii
angajat
Funcii
Departamente
Se observ c n tabelul Angajaii exist pentru acelai angajat (codul angajatului fiind
cheia primar) mai multe nregistrri n cazul n care a ocupat mai multe posturi n cadrul
companiei, cte una pentru fiecare post ocupat. Deci, n mai multe nregistrri se vor
repeta valori ale cmpurilor: cod_angajat, nume_prenume, cod_numeric, adres, telefon,
studii, data_naterii, data_angajrii. Valorile cmpurilor care pot diferi de la o nregistrare
la alta pentru aceeai valoare a cmpurilor enumerate anterior sunt: schimbare_funcie,
cod_funcie, cod_departament, data_inial, data_final, motiv_schimbare. Pentru a
elimina cmpurile care nu pot fi identificate unic prin intermediul cmpului cod_angajat
33
(cheia primar a tabelului) se va diviza acest tabel n dou tabele: Angajat care conine
cmpurile cod_angajat, nume_prenume, cod_numeric, adres, telefon, studii,
data_naterii, data_angajrii i Funcii_angajat care conine cmpurile cod_angajat,
cod_funcie, cod_departament, data_inial, data_final, motiv_schimbare. n tabelul
Funcii_angajat cheia primar (cea care identific unic o nregistrare) este format din
cmpurile cod_angajat, cod_funcie i cod_departament. Acest tabel este legat de mai
multe tabele: Angajat (legtura ntre cele dou tabele va fi fcut prin cmpul
cod_angajat), Funcii (prin cheia cod_funcie care este cheie primar n tabelul Funcii 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).
Cod_
angajat
Nume_
prenume
Cod_
numeric
...
Funcie
Departament
...
Motiv_
schimbare
Nume_
prenume
Cod_
numeric
Cod_
angajat
...
Cod_
funcie
Cod_
departament
...
Motiv_
schimbare
34 Informatic
n acest caz, documentul ce leag toate aceste informaii este factura care pstreaz
urma tranzaciei comerciale. n ea se gsesc date generale despre tranzacie
(numrul_facturii, data_facturii), dar i date despre angajatul care a negociat tranzacia
(denumire_vnztor, cod vnztor), date despre client (persoana care a cumprat
produsele, identificat prin cod_client, denumire_client, cod_fiscal, adres etc.) i date
despre fiecare produs vndut (numr_produs_factur, cod_produs, denumire_produs,
unitate, pre_unitar, cantitate, valoare_cantitate1). Se observ c n cadrul unei facturi,
produsul vndut depinde de clientul care l-a cumprat (care pltete toat factura), care
la rndul su depinde de vnztorul cu care a negociat achiziionarea produselor. Pentru
a elimina aceste dependene funcionale tranzitive: produs client vnztor din datele
furnizate de o factur, vor fi construite mai multe tabele: tabelul Factur care conine date
generale despre factur (numr_factur, dat, serie), tabelul Vnztor care conine date
despre tranzaciile efectuate de angajaii comerciali ai companiei i care sunt necesare
pentru salarizarea lor (numr_factur, cod_angajat_vnztor), tabelul Cumprtor care
conine date pentru identificarea clientului implicat n tranzacie (numr_factur,
cod_client), presupunnd c exist deja tabelul Clieni care furnizeaz informaii
complete depre fiecare client obinuit al companiei (nume, cod fiscal, adres etc.), tabelul
Produs_vndut care identific produsul vndut prin factur i care conine date pentru
identificarea fiecrui produs vndut (numr_factur, cod_produs, cantitate), presupunnd
c exist deja tabelul Catalog_produse care furnizeaz informaii complete despre
fiecare produs vndut de companie (denumire, cod, unitate de msur, pre unitar etc.).
Factur
(document)
Factura
Vnztor
Cumprtor
Salarii
Clieni
Produs_vndut
Catalog_produse
Considerai c coala voastr este o organizaie care trebuie informatizat, iar colecia de
date pe care o vei folosi va fi de tipul unei baze de date relaionale. Analiza voastr
trebuie s porneasc de la entitatea Elev. Vei identifica toate datele caracteristice unui
elev, att din punct de vedere al datelor personale (numr matricol, nume i prenume,
iniiala tatlui, datele despre prini, adresa, numrul de telefon), ct i din punct de
vedere al situaiei 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 absenele 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.
35
n urmtorul exemplu, pentru proiectarea unei baze de date s-a pornit de la lista cu comenzile clienilor. Trecnd prin mai multe forme normale s-au obinut tabelele: Comenzi,
Clieni, Produse_comandate. Identificai formele normale prin care a trecut tabelul iniial.
Etapa 1. Se construiete tabelul Total_comenzi care conine urmtoarele cmpuri:
numr_comand, dat_comand, nume_client, adres_client i 6 cmpuri compuse
produs_comandat. Cmpul compus este format din cmpurile denumire_produs,
unitate_msur, cantitate, pre_unitar, valoare. Fiecare nregistrare reprezint o
comand. Cmpul numr_comand poate identifica unic o nregistrare.
Etapa 2. Se construiete tabelul Comenzi care conine urmtoarele cmpuri:
numr_comand, dat_comand, nume_client, adres_client, denumire_produs,
unitate_msur, cantitate, pre_unitar, valoare. Pentru fiecare comand vor fi mai multe
nregistrri, cte una pentru fiecare podus din comand. Cmpul numr_comand i
denumire_produs identific unic o nregistrare.
Etapa 3. Pentru a uura identificarea unui produs se atribuie acestuia un cod_produs. Se
construiete tabelul Catalog_produse care conine urmtoarele cmpuri: cod_produs,
denumire_produs, unitate_msur, pre_unitar. Fiecare produs din catalog va fi identificat
unic prin cmpul cod_produs. n tabelul Comenzi vor rmne cmpurile:
numr_comand, dat_comand, nume_client, adres_client, cod_produs, cantitate,
valoare. nregistrrile vor fi identificate unic prin cheia format din dou cmpuri
numr_comand i cod_produs.
Etapa 4. Din tabelul Comenzi se construiesc dou tabele: tabelul Comanda i tabelul
Produse. Tabelul Comanda conine cmpurile: numr_comand, dat_comand,
nume_client, adres_client, valoare. Pentru fiecare comand va fi o singur nregistrare
identificat unic prin cmpul numr_comand. Tabelul Produse conine cmpurile:
numr_comand, cod_produs, nume_client, adres_client, cantitate, valoare. Pentru
fiecare comand vor exista mai multe nregistrri. nregistrrile vor fi identificate unic prin
cheia format din dou cmpuri: numr_comand i cod_produs.
Etapa 5. Din tabelul Comanda se construiesc dou tabele: tabelul Comenzi i tabelul
Clieni. Tabelul Comenzi conine cmpurile: numr_comand, dat_comand, cod_client,
valoare. Pentru fiecare comand va fi o singur nregistrare identificat unic prin cmpul
numr_comand. Tabelul Clieni conine cmpurile: cod_client, nume_client,
adres_client. Pentru fiecare client va fi o singur nregistrare. nregistrrile vor fi
identificate unic prin cmpul: cod_client.
36 Informatic
1.
Nou1
Nume_prenume
Ionescu Maria
Popescu Ion
Andronescu Ana
Ene Magda
Nume_prenume
Popescu Ion
Cod_num
1020260403456
Departament
Marketing
Funcia
Vnzator
Nume_prenume
Andronescu Ana
Ene Magda
Cod_num
2040469402458
2050570403453
Departament
Salarizare
Salarizare
Funcia
Casier
Contabil
Cod-a
1111
1113
Funcia
Casier
Vnzator
Casier
Contabil
Cod-a
1113
1114
Nou3
Departament
Marketing
Marketing
Salarizare
Salarizare
Cod-a
1112
Nou2
Cod_num
2030361403457
1020260403456
2040469402458
2050570403453
Nume_prenume
Ionescu Maria
Andronescu Ana
Cod_num
2030361403457
2040469402458
Departament
Marketing
Salarizare
Funcia
Casier
Casier
37
De exemplu, putem considera ca tabel surs tabelul Angajai. Prin operaia select se pot
crea noi tabele:
9 Tabelul Nou1. Conine o singur nregistrare corespunztoare unui angajat care are
un anumit cod numeric personal:
Select from Angajai where Cod_num=1020260403456
9 Tabelul Nou2. Conine mai multe nregistrri care corespund angajailor din departamentul Salarizare:
Select from Angajai where Departament='Salarizare'
9 Tabelul Nou3. Conine mai multe nregistrri care corespund angajailor care au
funcia de casier:
Select from Angajai where Funcia='Casier'
2.
Proiecia (Project). Operatorul se aplic pe un tabel surs din care creeaz un tabel
nou ce va conine numai cmpurile specificate din tabloul surs.
Angajai
Cod-a
1111
1112
1113
1114
Nume_prenume
Ionescu Maria
Popescu Ion
Andronescu Ana
Ene Magda
Cod_num
2030361403457
1020260403456
2040469402458
2050570403453
Departament
Marketing
Marketing
Salarizare
Salarizare
Funcia
Casier
Vnzator
Casier
Contabil
Nou4
Project Nume_prenume, Cod_num from Angajai
Nume_prenume
Ionescu Maria
Popescu Ion
Andronescu Ana
Ene Magda
Cod_num
2030361403457
1020260403456
2040469402458
2050570403453
Nou5
Project Nume_prenume, Departament from Angajai
Nume_prenume
Ionescu Maria
Popescu Ion
Andronescu Ana
Ene Magda
Departament
Marketing
Marketing
Salarizare
Salarizare
De exemplu, putem considera ca tabel surs tabelul Angajai. Prin operaia project se
pot crea noi tabele:
9 Tabelul Nou4. Conine dou cmpuri: Nume_prenume i Cod_num:
Project Nume_prenume, Cod_num from Angajai
9 Tabelul Nou5. Conine dou cmpuri: Nume_prenume i Departament:
Project Nume_prenume, Departament from Angajai
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 pstreaz numai nregistrrile care ndeplinesc o anumit condiie.
38 Informatic
Exemplu de operaie Join
Tabel A
Cmpuri
RA1
RA2
Tabel B
C1
1
2
C2
a
b
Cmpuri
RB1
RB2
RB3
C3
x
y
Rndurile tabelului A
C4
1
2
3
C5
m
n
p
Rndurile tabelului B
C1
1
1
1
2
2
2
C2
a
a
a
b
b
b
Rndurile tabelului A
C3
x
x
x
y
y
y
C4
1
2
3
1
2
3
C5
m
n
p
m
n
p
RB1
RB2
RB3
RB1
RB2
RB3
Rndurile tabelului B
C1
1
2
C2
a
b
Rndurile tabelului A
C3
x
y
C4
1
2
C5
m
n
RB1
RB2
Rndurile tabelului B
39
i se obine tabelul Casieri care conine toi angajaii care au funcia de casier. Apoi pe
tabelul astfel obinut se aplic operaia de proiecie:
Project Nume_prenume, Departament from Casieri
i se obine n tabelul Casieri_departamente informaia dorit (lista cu numele persoanelor i departamentul n care lucreaz).
9 Lista cu numele furnizorului, numele i numrul 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 operaie de selecie:
Select from Stocuri where stoc<=stoc_sig
i se obine tabelul Siguran care conine toate materialele care sunt sub stocul de
siguran. Apoi pe tabelul astfel obinut se aplic operaia de proiecie:
Project cod_material, denumire from Siguran
i se obine tabelul Comenzi_materiale. Se compun tabelele Furnizori i
Comenzi_materiale cu operaia
Join Furnizori and Comenzi_materiale where
furnizori.cod_material = comenzi_materiale. cod_material
i se obine tabelul Comanda. Apoi pe tabelul astfel obinut se aplic operaia de proiecie
Project denumire, den_furnizor, nume_pers, telefon from Comanda
i se obine tabelul Comanda_furnizori care conine denumirea furnizorului, numele
persoanei de contact, numrul 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 conine informaii generale despre angajai: nume angajat, adres, numr de
telefon. Tabelul B conine informaii despre ocuparea posturilor de ctre angajai: nume
angajat, nume funcie, departament, data iniial, data final. Ce operaii relaionale
trebuie s executai ca s obinei informaiile:
a) Ce angajai au ocupat postul X?
b) Ce angajai au lucrat n departamentul X?
c) Ce posturi a ocupat angajatul X i n ce departamente?
d) Ce adrese au angajaii care au ocupat postul X din departamentul Y?
40 Informatic
n afara limbajelor care au la baz algebra relaional (care folosesc interogri exprimate
prin operatori relaionali specifici aa cum este limbajul SQL), mai exist i limbaje care
se bazeaz pe calculul relaional (care exprim interogrile prin intermediul condiiilor
pe care trebuie s le ndeplineasc mulimea nregistrrilor 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 interogrile bazei de
date folosind calculul relaional. De obicei limbajul QBE pune la dispoziia utilizatorului o
interfa prin intermediul creia utilizatorul i poate asambla interogarea, incluznd
operatori pentru calculul:
9 sumei valorilor unui cmp din tabel - sum,
9 mediei aritmetice a valorilor unui cmp din tabel - avg,
9 celei mai mari valori a unui cmp din tabel - max,
9 celei mai mici valori a unui cmp din tabel - min,
9 numrului de nregistrri dintr-un tabel - cnt.
n sistemul de gestiune a bazelor de date Visual FoxPro interogrile se pot construi prin
intermediul interfeei folosind interogarea prin exemple (QBE). n culise, aceste
comenzi sunt transformate n instruciuni SQL.
ncercai:
date format din dou tabele B i C. Tabelul A conine urmtoarele cmpuri: nume angajat,
funcie, departament. Tabelul B conine cmpurile nume angajat i funcie, iar tabelul C
cmpurile funcie i departament. Comparai cele dou baze de date. Ele conin aceleai
categorii de date, dar nu sunt identice din punct de vedere al informaiilor pe care le
furnizeaz. Artai cum rspund cele dou baze de date la urmtoarele cereri de informaii:
a) n ce departament lucreaz angajatul X.
b) Care sunt angajaii dintr-un departament.
c) Care sunt angajaii cu funcia X din departamentul Y.
Ce concluzie tragei? Reproiectai cea de-a doua baz de date astfel nct s poat
rspunde la aceste ntrebri.
date format din dou tabele B i C. Tabelul A conine urmtoarele cmpuri: nume angajat,
funcie, departament, numr de telefon. Tabelul B conine cmpurile nume angajat i
departament, iar tabelul C cmpurile funcie i numr de telefon. Comparai cele dou baze
de date. Ele conin aceleai categorii de date, dar nu sunt identice din punct de vedere al
informaiilor pe care le furnizeaz. Artai cum rspund cele dou baze de date la
urmtoarele cereri de informaii:
a) Ce numr de telefon are angajatul X.
b) Ce angajat are numrul de telefon Y.
c) Care sunt angajaii cu funcia X din departamentul Y.
41
Ce concluzie tragei? Reproiectai cea de-a doua baz de date astfel nct s poat
rspunde la aceste ntrebri.
M iniproiect.
M iniproiect.
M iniproiect.
42 Informatic
d) Crile pot fi mprumutate de cititori. Pentru fiecare mprumut se in urmtoarele
evidene: cartea mprumutat, cititorul care a mprumutat-o, data mprumutului,
data la care trebuie s o napoieze, data la care a napoiat-o.
Artai ce condiii trebuie ndeplinite pentru a fi asigurat integritatea referenial a bazei
de date. Verificai dac baza de date rspunde la urmtoarele interogri (exprimai
interogrile prin cei trei operatori relaionali):
a) Ce cri a mprumutat cititorul X n perioada D.
b) Lista cu crile care sunt mprumutate la data D.
c) Lista cu crile care aparin unui autor X.
d) Lista cu crile din domeniul Y.
e) Lista cu crile din domeniul X aprute la editura Y.
f) Lista cu crile aprute n anul X la editura Y.
M iniproiect.
M iniproiect. Baza de date a unei coli este format din urmtoarele 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.
Prini: cod_elev, nume_printe, tip_printe, telefon.
Note: cod_elev, cod_disciplin, dat, not.
Absene: cod_elev, cod_disciplin, dat.
43
Discipline
a)
b)
c)
d)
e)
f)
Elevi
Note
Profesori
Dirigini
Absene
ncadrare_
profesori
Prini
ncadrare_
discipline
Artai corespondenele:
Prima grup (1 10) v prezint mai muli termeni. A doua grup (a j) v prezint afirmaii sau
definiii posibile pentru aceti termeni. Legai corespunztor 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. relaia una-la-mai-multe
4. redundana datelor
9. independena datelor
5. dicionarul de date
10. modelul relaional de baze de date
a.
b.
c.
d.
44 Informatic
4.
5.
6.
7.
5.
6.
7.
8.
9.
45
Rspundei:
1. De ce este necesar un administrator de baze de date?
2. Care este deosebirea dintre schema general a bazei de date i o schem parial?
3. Ce este un sistem de gestiune a bazelor de date? Care este rolul su?
4. Care sunt cele mai importante avantaje ale unei baze de date?
5. Care sunt cele mai importante dezavantaje ale unei baze de date?
6. Ce este limbajul de interogare a unei baze de date?
7. Ce nseamn independena datelor ntr-o baz de date?
8. Ce tipuri de limbaje pot fi folosite pentru interogarea unei baze de date relaionale?
spunsuri:
Artai corespondenele: 1-e; 2-g; 3-h; 4-i; 5-a; 6-d; 7-c; 8-j; 9-f; 10-b.
Adevrat/Fals: 1-F; 2-A; 3-A; 4-F; 5-A; 6-A; 7-F; 8-F; 9-F; 10-F.
Completai: 1- cheie de identificare; 2-nregistrri, fiiere; 3- schema parial; 4- condus; 5- legtura;
6-inclus n; 7-simplificare, divizarea; 8-redundana.
Alegei rspunsurile corecte: 1-a,b,d; 2-b,c; 3-b,d; 4-b; 5-a; 6-a,d; 7-c; 8-a; 9-b.
Condiiile sunt:
a) E := alfa <> " " and alfa <> "," and fa <> "."
46 Informatic
tipul numeric
tipul alfanumeric
tipul logic
tipul special
<nume> = <expresie>
De exemplu, n=n+100 nseamn c variabilei n i se atribuie valoarea expresiei n+100,
adic valoarea obinut prin adugarea numrului 100 la valoarea avut anterior
operaiei de atribuire.
47
pentru reprezentarea numrului (un caracter pentru semnul minus folosit de numerele
negative, numrul de cifre pentru partea ntreag, numrul de cifre pentru partea zecimal
i un caracter pentru punctul folosit ca separator ntre partea ntreag i partea zecimal) i
numrul de caractere folosite numai pentru partea zecimal. Deoarece numrul maxim de
octei este 20 (deci numrul maxim de caractere folosite pentru numr este 20), acest
subtip poate fi folosit pentru reprezentarea cu precizie sczut a numerelor raionale mici.
Subtipul double (dublu) poate fi folosit i el pentru numerele reale. Reprezentarea
numrului 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 octei. Acest subtip
poate fi folosit pentru reprezentarea cu precizie mrit (pn la 15 cifre zecimale) a
4
numerelor reale foarte mari (pn la ordinul 10308) . Deoarece lungimea sa este fix,
pentru o bun gestionare a spaiului de memorare nu se recomand folosirea acestui
subtip pentru numere reale mici cu precizie sczut.
Subtipul integer (ntreg) poate fi folosit numai pentru numerele ntregi. Reprezentarea
numrului pe suportul de memorare se face n binar pe o lungime fix de 4 octei,
folosindu-se un bit pentru semn i 31 de bii pentru numr. Deoarece 231 - 1 este egal cu
2147483647, domeniul de definiie al acestui subtip este [-2147483648, 2147483647].
Subtipul currency (monetar) poate fi folosit pentru memorarea valorilor numerice
exprimate n uniti monetare. naintea numrului se introduce simbolul monetar ($).
Poate fi folosit pentru date reale, cu o precizie de maxim 4 cifre zecimale i cu valori
5
cuprinse aproximativ n domeniul [-91014, 91014] . Este specific domeniului contabil,
pentru a se preveni erorile de rotunjire. Pentru reprezentarea sa se folosesc 8 octei.
Operatorii matematici care pot fi aplicai pe datele de tip numeric sunt:
48 Informatic
un octet, prin codul su ASCII. Lungimea maxim a irului de caractere este 254 de
caractere. Lungimea irului de caractere dintr-un cmp este fix pentru ntregul tabel i
poate fi stabilit de ctre utilizator pn la maxim 254 de caractere. Lungimea irului de
caractere dintr-o variabil de memorie este variabil, n funcie 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 aplicai pe datele de tip ir de caractere sunt:
C = {+,-}
Operatorul + se numete operator de concatenare simplu, iar operatorul - se numete operator de concatenare special. Deosebirea dintre operatorul de concatenare
simplu i operatorul de concatenare special este aceea c cel de-al doilea operator mut
spaiile de la sfritul primului ir de caractere la sfritul irului de caractere concatenat.
De exemplu:
'Pop ' + ' Ana' = 'Pop
Ana'
P o p
+
'
A
49
D = {+, -}
Dac notm cu a primul operand, cu b al doilea operand i cu c rezultatul, aceti
operatori se aplic astfel:
50 Informatic
Operator Tip a
Tip b
Tip c
++
--
--
Execut
Exemplu
incrementeaz data din operandul a cu {08/31/01}+1=
numrul de zile din operandul b
{09/01/01}
decrementeaz data din operandul a {08/01/01}-1=
cu numrul de zile din operandul b
{07/31/01}
calculeaz diferena n zile dintre
{08/01/01}primul operand i al doilea operand {07/01/01}=31
T = {+, -}
Dac notm cu a primul operand, cu b al doilea operand i cu c rezultatul, aceti
operatori se aplic astfel:
Operator Tip a Tip b Tip c
+-
11
--
--
Execut
Exemplu
incrementeaz timpul din {08/31/01 01:01:10 AM}+10
={08/31/01 01:01:20 AM}
operandul a cu numrul de
secunde din operandul b
{08/31/01 01:01:10 AM}-5
decrementeaz timpul din
={08/31/01 01:01:5 AM}
operandul a cu numrul de
secunde din operandul b
{08/31/01 01:01:15 AM} calculeaz diferena n
{08/31/01 01:01:10 AM} = 5
secunde dintre primul
operand i al doilea operand
51
formatul
masca de introducere
eticheta
valoarea implicit
regula de validare
textul regulii de validare
indexarea
valoarea nul
Formatul (format). Aceast proprietate controleaz modul n care sistemul de gestiune a
bazelor de date afiez valoarea memorat n cmp. Pentru fiecare tip sau subtip de dat
exist mai multe formate de afiare.
Masca de introducere (input mask). Aceast proprietate controleaz valorile datelor
introduse n cmp. Ea determin numrul de poziii ale cmpului i, pentru fiecare poziie
din cmp, tipul caracterului acceptat: numeric, alfabetic, alfanumeric, caracter special, un
anumit caracter, orice caracter. Pentru caracterele alfabetice se poate stabili dac sunt
litere mici sau litere mari. Se mai poate stabili dac introducerea datelor se face de la
stnga la dreapta (pentru cmpurile aliniate la stnga, cum sunt de exemplu irurile de
caractere) sau de la dreapta la stnga (pentru cmpurile aliniate la dreapta, cum sunt de
exemplu numerele ntregi). O masc de introducere special este masca password care
afieaz pe ecran cte un asterisc pentru fiecare caracter introdus.
Eticheta (caption). Aceast proprietate controleaz titlul afiat pe ecran pentru cmp.
Valoarea implicit pentru aceast proprietate este numele cmpului. Utilizatorul poate
schimba aceast valoare.
52 Informatic
Valoarea implicit (default value). Aceast proprietate controleaz iniializarea cmpului. Prin ea se poate stabili valoarea iniial atribuit unui cmp la adugarea unei
nregistrri n tabel. De exemplu, pentru cmpurile de tip dat calendaristic se poate
stabili ca valoare iniial data curent, iar pentru cmpurile logice valoarea true.
Regula de validare (validation rule). Aceast proprietate controleaz valorile datelor
introduse n cmp. Regula de validare se exprim printr-o condiie logic, ce trebuie s
aib valoarea true dup ce se introduce valoarea cmpului. Regula de validare se poate
aplica la nivel de:
9 cmp, i anume se verific dac valoarea introdus pentru cmp se ncadreaz
ntr-un anumit interval de valori sau ntr-o anumit mulime de valori. Aceast validare
se declaneaz la introducerea sau modificarea valorii cmpului.
9 nregistrare, i anume se verific dac valoarea introdus pentru cmp respect anumite corelaii cu valorile altor cmpuri din nregistrare. Aceast validare se declaneaz dup validarea la nivel de cmp, n urma introducerii sau modificrii valorii unui
cmp sau a tergerii valorii cmpului. Nu se declaneaz dac se terge toat
nregistrarea. n expresia din condiia de validare pot fi folosite i funcii de sistem sau
definite de utilizator.
Textul regulii de validare (validation text). Aceast proprietate controleaz textul afiat
n cazul n care datele introduse n cmp nu respect regula de validare (n cazul n care
condiia logic pentru validare are valoarea false dup introducerea valorii cmpului). De
obicei, prin acest text i se explic utilizatorului regulile de validare pe care trebuie s le
respecte datele introduse n cmp.
Indexarea (index). Aceast proprietate controleaz dac acel cmp este folosit pentru
indexare. Indexarea este o tehnologie utilizat de sistemele de gestiune a bazelor de
date care permite ordonarea logic, dup un anumit criteriu, a nregistrrilor dintr-un
tabel, la exploatarea sau vizualizarea datelor din tabel, fr s fie afectat ordinea fizic
a nregistrrilor din tabel (ordinea n care sunt scrise). Cmpul devine cheie de indexare.
Valoarea nul (NULL). Aceast proprietate controleaz dac n cmp a fost memorat
sau nu o valoare nul (NULL). Aceast proprietate este util pentru a putea face
deosebirea dintre un cmp n care utilizatorul nu a introdus date i un cmp n care
utilizatorul a introdus o dat neutr pentru acel tip de dat, cum ar fi: 0 pentru datele
numerice, irul vid - irul de caractere de lungime zero ("") - pentru datele alfabetice, false
pentru datele logice sau data vid ({ / / }) pentru datele de tip dat calendaristic. De
exemplu, dac ai declarat cmpul telefon numeric, respectiv ir de caractere, valoarea
NULL indic faptul c nu se cunosc detalii despre numrul de telefon al acelei persoane,
iar valoarea 0, respectiv irul vid arat c acea persoan nu are telefon.
53
Adresarea indirect
Unele comenzi sau funcii Visual FoxPro cer s li se furnizeze un nume, cum ar fi:
numele unui fiier baz de date, numele unui cmp, numele unui alias, numele unui fiier
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 nct s se poat generaliza comanda.
Pentru adresarea indirect se poate folosi macrosubstituia: se memoreaz numele
ntr-o variabil de memorie, dup care poate fi substituit ntr-o comand sau ntr-o funcie
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
funcie prin numele variabilei de memorie sau al elementului de tablou, nchis ntre
paranteze rotunde:
(<nume_variabil_de memorie>)
Evaluai expresii
Vei evalua mai multe tipuri de expresii folosind aplicaia Visual FoxPro. n expresii vei
folosi i variabile de memorie.
Deschidei fereastra aplicaiei Visual FoxPro. n fereastra aplicaiei este deschis o
fereastr document care are numele Command. Aceasta este fereastra de comenzi n
care putei s editai diferite comenzi.
Pentru nceput vei scrie diferite comenzi pentru evaluarea unor expresii. Pentru a cere
evaluarea unei expresii vei scrie naintea ei semnul ? care semnific operaia de
afiare. Rezultatul evalurii va fi afiat n spaiul liber al ferestrei de aplicaie.
1. Evaluai expresia:
E=
a+b b +d
a+c
+
+
c
c + a (a + b )3
54 Informatic
a=1
b=2
c=3
d=4
Atribuii variabilei de memorie e valoarea expresiei. Scriei pe un rnd operaia de
atribuire i apsai la sfrit tasta Enter.
e=(a+b)/c + (b+d)/(c+a)+(a+c)/((a+b)**3)
Afiai valoarea variabilei de memorie e. Scriei pe un rnd comanda i apsai la
sfrit tasta Enter:
?e
n fereastra aplicaiei va fi afiat valoarea 2.65.
? afieaz
Aici se afieaz
rezultatul evalurii.
.T.
? a>b
.F.
? a==b
.F.
? a$b
.F.
? b$a
.T.
b='abc '
? a<b
.T.
a='Ion '
b='Maria '
? a + b + '!'
? &b
1
Ion Maria !
? a - b + '!'
IonMaria
55
56 Informatic
alfa3=monser!
? &a.1+&a.2+&a.2
Caldura mare monser!
ncercai:
Adevrat/Fals:
1. Visual FoxPro accept pentru numere ntregi subtipul longinteger.
2. Operatorul relaional != folosit n Visual FoxPro se numete operatorul diferit.
3. Operatorul relaional $ se folosete 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 octei.
6. Valoarea nul este o proprietate a cmpului care controleaz dac ntr-un cmp nu
s-a introdus nici o dat.
7. Cmpurile care n Visual FoxPro au tipul general pot fi cmpuri cheie.
8. Macrosubstituia este o metod folosit pentru a defini proprietatea unui cmp.
Completai:
1. Operatorul $ folosit n Visual FoxPro se numete 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 folosii pentru subtipul Datetime sunt: ................
4. n Visual FoxPro constanta de tip dat calendaristic se delimiteaz folosind
caracterele ........
5. Expresia nume se folosete pentru ...........................
Alegei rspunsul corect:
1.
Dac trebuie s memorai ntr-un cmp al unei baze de date Visual FoxPro media general
a unui elev, vei alege un cmp numeric cu subtipul:
a) simplu
b) dublu
c) monetar
2. Dac folosii subtipul numeric simplu pe 4 octei pentru reprezentarea unui numr ntreg
ntr-o baz de date Visual FoxPro, valoarea maxim pe care o vei putea reprezenta
este:
b) 9999
57
c) 2147483646
c) 3.00
4. Reprezentarea subtipului float folosit pentru cmpurile numerice din Visual FoxPro are
lungimea de:
a) 1 octet
b) 20 octei
c) cuprins ntre 1 octet i 20 de octei
5. Reprezentarea subtipului integer folosit pentru cmpurile numerice din Visual FoxPro
are lungimea de:
a) 4 octei
b) 8 octei
c) 16 octei
6. Operatorul folosit n Visual FoxPro pentru operaia modulo este :
a) MOD
b) \
c) %
7. n Visual FoxPro numrul maxim de caractere dintr-un ir de caractere este:
a) 254
b) 255
c) 256
8. n Visual FoxPro rezultatul evalurii 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) relaional
b) logic
c) de concatenare
Rspundei:
1. Ce subtipuri numerice se folosesc pentru cmpurile din Visual FoxPro?
2. n Visual FoxPro ce operatori relaionali 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 folosete tipul de date general n Visual FoxPro?
7. Ce este valoarea nul a unui cmp?
8. Care sunt proprietile cmpurilor dintr-o baz de date?
9. Ce este regula de validare? La cte niveluri se poate aplica?
spunsuri:
Capitolul
Utilizarea unor
instrumente de
prelucrare a datelor
59
60 Informatic
9 Permite o adaptare uoar la lucrul cu mai muli utilizatori, fr s necesite implementarea unei variante speciale pentru lucrul n reea.
9 Are implementat conceptul de colecie de date definit ca un depozit cu informaii
despre tabele, care permite folosirea numelor lungi pentru tabele i pentru cmpuri i
implementarea integritii refereniale direct n tabelele bazei de date n loc s fie
descris n programele de aplicaie.
9 Permite comunicarea i cu alte aplicaii folosind mecanisme DDE, cum este de
exemplu, comunicarea cu aplicaia Excel. Orice modificare fcut 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 aplicaii diferite. Aplicaiile FoxPro sunt aplicaii client i n ele pot fi legate i ncapsulate diferite
obiecte produse de aplicaiile server: texte, sunete, imagini, foi de calcul.
9 Permite importul i exportul diferitelor tipuri de date pstrate n diferite formate de
fiiere: Access, dBase, Paradox, Oracle, Excel etc.
9 Dispune de un limbaj procedural puternic ce permite descrierea datelor i a aplicaiilor pe baza modelului programrii 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 lng limbajul propriu, att limbajul
de interogare de tip SQL, ct i limbajul de tip QBE (interogarea prin exemple,
exemplele fiind create interactiv prin diferite obiecte puse la dispoziie de interfa). Aceste
limbaje uureaz folosirea sistemului de ctre utilizatorii neinformaticieni.
9 ncepnd cu versiunea 3.0, n limbajul FoxPro este implementat i modelul programrii
orientate pe obiecte. Dac n programarea clasic datele i programele care le prelucrau erau separate, n programarea orientat pe obiecte programul este definit ca un
obiect care nglobeaz att ansamblul de date, ct i algoritmii care prelucreaz aceste
date. n cadrul algoritmilor se folosete n continuare modelul programrii structurate.
9 Limbajul de programare propriu sistemului de gestiune a bazelor de date FoxPro are
implementat i modelul programrii 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 cnd apar n sistem anumite evenimente. Un
exemplu de astfel de eveniment este apsarea unei combinaii de taste, care se poate
produce n orice moment n sistem i nu la momente determinate de programator.
9 Permite programarea vizual a aplicaiilor. Acest tip de proiectare ofer programatorilor posibilitatea de a realiza mai simplu aplicaii de exploatare a bazelor de date,
deoarece ei nu mai sunt obligai s precizeze cum trebuie realizat aplicaia (s
descrie algoritmul de rezolvare a problemei), ci ce trebuie s realizeze aplicaia.
Pentru aceasta, FoxPro pune la dispoziia utilizatorilor diferite instrumente vizuale
numite generatoare sau constructori. Acestea sunt programe care permit
proiectarea interactiv a bazelor de date, a interogrilor, a rapoartelor, a elementelor
de interfa (formulare de introducere a datelor, meniuri, ferestre), a aplicaiilor 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 ctre programator n cadrul dialogului interactiv.
9 Are o vitez de lucru foarte mare, deoarece folosete o tehnologie special denumit
tehnologie Rushmore care reduce timpul de acces la date prin optimizarea interogrilor.
61
Interfaa grafic
Interfaa grafic este de tip MDI (interfa cu mai multe documente), adic n fereastra
aplicaiei pot fi deschise mai multe ferestre document. Ea este compatibil cu interfaa de
tip Microsoft Office (meniurile, barele de instrumente, scurtturile de la tastatur).
Fereastra aplicaiei prezint un sistem de meniuri care pun la dispoziia utilizatorului
marea majoritate a comenzilor care formeaz limbajul de comand. n general, opiunea
de meniu reprezint verbul comenzii, iar adverbele sunt precizate prin intermediul
controalelor din caseta de dialog. Comenzile, n funcie de modul n care pot aciona, sunt
grupate n meniuri. Astfel:
Titlurile meniurilor
Barele cu instrumente
9 File conine opiuni pentru operaii cu fiiere: creare, deschidere, salvare, tiprire. Mai
conine i opiunea pentru nchiderea aplicaiei Visual FoxPro: Exit.
62 Informatic
9 Edit conine opiuni pentru editarea textelor: operaii de selectare, operaii de copiere
(Cut, Copy, Paste), operaii de cutare i nlocuire (Find i Replace), inserarea sau
legarea obiectelor.
9 View conine opiuni pentru modificarea obiectelor afiate n fereastra aplicaiei. Cea
mai important opiune este Toolbars... care v permite s alegei barele cu
instrumente care vor fi afiate.
9 Format conine opiuni pentru formatarea textelor afiate n ferestrele document ale
aplicaiei (fontul, dimensiunea i stilul caracterelor, indentarea i spaiul dintre liniile
paragrafelor).
9 Tools conine opiuni prin care putei alege diferite instrumente: proceduri asistent,
editorul de macrocomenzi, ferestrele pentru depanarea programului (Debug) sau
pentru executarea pas cu pas a programului (Trace).
9 Program conine opiuni pentru compilarea i executarea programelor.
9 Window conine opiuni pentru operaii 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 legturilor dintre tabele (View Window).
9 Help conine opiuni pentru asigurarea asistenei utilizatorului.
Sistemul de meniuri este dependent de context. n funcie de operaiile care se execut,
mai pot s apar meniurile:
Titlul meniului Database este afiat n bara de meniuri numai dac n fereastra aplicaiei
este deschis o fereastr document de tip baz de date n care sunt afiate tabelele
bazei de date i relaiile dintre ele.
63
9 Table conine opiuni pentru manipularea nregistrrilor din tabel: adugarea de noi
nregistrri - Append New Record i Append Records..., marcarea pentru tergere a
nregistrrilor (tergerea logic) - Delete, refacerea nregistrrilor terse logic - Recall
tergerea fizic a nregistrrilor marcate pentru tergere - Remove Deleted Records,
poziionarea pe o nregistrare din tabel - Go to Record..., nlocuirea valorilor unor
cmpuri cu alte valori - Replace Field..., actualizarea indexului tabelului pentru a
reflecta situaia actual - Rebuild Indexes etc. Meniul mai conine i opiuni pentru
stabilirea proprietilor tabelului (Properties...) i pentru alegerea fontului, a
dimensiunii i a stilului caracterelor cu care se afieaz datele din tabel (Font...) etc.
9 Database conine opiuni pentru manipularea tabelelor din baza de date: crearea unui
tabel nou i adugarea lui la baza de date - New Table, adugarea unui tabel la baza
de date - Add Table, crearea unei noi vizualizri i adugarea ei la baza de date New Local View, modificarea structurii tabelului selectat din baza de date - Modify,
afiarea coninutului tabelului selectat din baza de date ntr-o fereastr de editare Browse, nlturarea unui tabel din baze de date - Remove, actualizarea indexului
tabelului selectat din baza de date - Rebuild Table Indexes, tergerea fizic a
nregistrrilor marcate logic pentru tergere din tabelul selectat din baza de date Remove Deleted Records..., editarea relaiei selectate dintre dou tabele ale bazei
de date - Edit Relationship... deschiderea ferestrei generatorului pentru integritatea
referenial a bazei de date - Referential Integrity... etc.
Titlul meniului Table este afiat n bara de meniuri numai dac n fereastra aplicaiei
este deschis o fereastr document de tip tabel al bazei de date.
64 Informatic
Bara de stare furnizeaz informaii despre obiectul focalizat (titlu de meniu, opiune 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
informaii despre identificatorul tabelului (<nume_baz_date> ! <nume tabel>) i aliasul
tabelului, despre numrul nregistrrii curente x din numrul total de nregistrri y. Afiarea
se face sub forma <x>/<y>. Aceste informaii sunt afiate n partea stng a barei de stare:
Ferestrele document care pot fi deschise n fereastra aplicaiei Visual FoxPro sunt:
65
9 Ferestrele pentru constructori i generatoare. Se folosesc pentru crearea i modificarea diferitelor elemente Visual FoxPro: baze de date (Database Designer), tabele
ale bazei de date i indeci (Table Designer), vizualizri (View Designer), interogri
(Query Designer), formulare pentru introducerea datelor (Form Designer), rapoarte
(Report Designer), meniuri (Menu Designer).
9 Fereastra pentru administratorul de proiecte (Project Manager). Proiectul este o
colecie de fiiere, date, documente i obiecte Visual FoxPro folosite de o aplicaie.
9 Fereastra pentru editarea fiierelor cu texte, a fiierelor de programe i a cmpurilor
memo. Numele ferestrei va fi numele fiierului, iar n cazul cmpului memo numele va
fi format din numele tabelului i numele cmpului memo, separate prin punct.
9 Fereastra pentru editarea unui tabel. Poate s fie de tip Browse cnd sunt afiate mai
multe nregistrri din tabel, cte o nregistrare pe fiecare rnd sau de tip Edit cnd
este afiat o singur nregistrare, cte un cmp pe fiecare rnd. Numele ferestrei
este numele tabelului.
9 Fereastra Debug. Se folosete pentru depanarea programelor.
9 Fereastra Trace. Se folosete pentru executarea pas cu pas a unui program.
Deschiderea unei ferestre document se face automat la alegerea unei opiuni de meniu sau
printr-o comand. Operaiile cu ferestrele document (redimensionarea, minimizarea,
maximizarea, mutarea, defilarea coninutului) se execut la fel ca la orice aplicaie Microsoft
Office. Pentru operaia de ascundere a unei ferestre alegei opiunea Hide Window.
Barele cu instrumente grupeaz dup funcii butoanele scurtturi pentru opiunile din
meniuri. Bara standard conine aceleai butoane ca orice bar standard din aplicaiiile
Microsoft Office. Celelalte bare grupeaz n general butoane care corespund ferestrelor
document ale generatoarelor (Database Designer, Form Designer, Report Designer,
View Designer i Query Designer) sau butoane prin care pot fi inserate diferite
controale n formulare sau rapoarte (Form Controls i Report Controls). Controalele
care pot fi inserate ntr-un formular pot fi: etichete, casete de text, deruloare, butoane de
comand, comutatoare, butoane de opiuni, liste, casete combinate, grile etc.
Limbajul de comand
Comenzile vor fi editate n fereastra Command. Fiecare comand se scrie pe un rnd.
Terminarea unei comenzi se marcheaz prin acionarea tastei Enter. Acionarea acestei
taste semnific faptul c interpretorul de comenzi poate prelua aceast comand s o
analizeze, s o decodifice i s o lanseze n execuie.
definete aciunea
list adverbe
Enter
Observaii:
1. Cuvintele comenzii (verbe i adverbe) se separ prin spaiu.
66 Informatic
2. n general, adverbele din list pot fi scrise n orice ordine.
3. Cuvintele din comand pot fi scrise cu litere mari sau mici sau combinaie de astfel
de litere.
4. Verbul comenzii poate fi prescurtat la primele patru caractere ale cuvntului.
5. Comanda trebuie scris pe un singur rnd. Dac vrei s o scriei pe mai multe
rnduri, nainte de acionarea tastei Enter (care semnific terminarea comenzii),
trebuie s scriei caracterul ; . Prezena lui nseamn c prin acionarea tastei Enter
comanda nu se termin, ci se continu pe rndul urmtor.
6. Lungimea maxim a unei linii de comand este de 1024 caractere.
7. Adverbele pot fi:
9 nume de cmpuri, nume de variabile de memorie, nume de fiiere, aliasuri, expresii.
9 o list - reprezint un grup de elemente asemntoare (nume de cmpuri, nume
de variabile de memorie etc.). Separarea lor n list se face prin virgul.
9 un domeniu (scope) - reprezint un grup de nregistrri dintr-un tabel.
Domeniul poate fi precizat prin:
a. cuvinte cheie:
Record <n> - nregistrarea cu numrul n,
Next <n> - urmtoarele n nregistrri, ncepnd cu nregistrarea curent,
All - toate nregistrrile,
Rest - toate nregistrrile pn la sfritul tabelului ncepnd cu nregistrarea curent.
b. clauze (precizeaz un anumit tip de aciune):
For <x> - numai nregistrrile care satisfac condiia precizat prin expresia logic
x, ncepnd cu prima nregistrare a tabelului.
While <x> - toat secvena de nregistrri care urmeaz nregistrrii curente pentru
care expresia logic x este adevrat, pn la prima nregistrare pentru care
expresia nu este adevrat.
Alte clauze care pot fi folosite ca adverbe sunt:
All/Like/Except <ablon> - poate fi folosit pentru a preciza un grup de variabile
de memorie, tablouri de memorie sau fiiere, al cror nume corespunde ablonului.
Comanda va aciona asupra tuturor (All), numai asupra celor care corespund
ablonului (Like) sau numai asupra celor care nu corespund ablonului (Except).
To - controleaz ieirea unei comenzi, redirecionnd-o fa de ieirea standard
(care este ecranul). Ieirea poate fi:
un fiier: File <nume_fiier>
un tablou de memorie: Array <nume_tablou>
imprimanta: Printer
In <alias> - permite manipularea unui tabel ntr-o alt zon de lucru precizat prin
alias. Alias este un nume care se atribuie unui tabel, diferit de numele pe care l-a
primit acesta la crearea sa. Poate fi folosit pentru identificarea tabelului.
Additive - controleaz modul n care se scriu date ntr-un fiier; prezena acestei
clauze precizeaz c datele vor fi adugate la fiier (scrise la sfritul fiierului), iar
absena clauzei precizeaz c datele vor fi scrise la nceputul fiierului (vechile
date din fiier se vor distruge).
67
For <x>
Schemele logice descriu modul n care clauzele For
i While definesc domeniul nregistrrilor.
BOF
While <x>
nregistrarea
curent
nu
Not EOF
sfrit
da
nu
Not EOF
and
x=.T.
nu
da
x=.T.
sfrit
da
67
For <x>
Schemele logice descriu modul n care clauzele For
i While definesc domeniul nregistrrilor.
BOF
While <x>
nregistrarea
curent
nu
Not EOF
sfrit
da
nu
Not EOF
and
x=.T.
nu
da
x=.T.
sfrit
da
68 Informatic
memorat n fiier. n plus, de fiecare dat cnd se dorete executarea acelor comenzi, ele nu
vor mai fi scrise, ci lansate direct n execuie din fiierul de comenzi.
Pentru crearea unui fiier de comenzi se deschide fereastra editorului de texte folosind
comanda:
Modify command <nume_fiier>
n fereastra de editare vei scrie comenzile, cte una pe fiecare rnd, aa cum le scriai i
n fereastra de comenzi. Operaiile pentru editare (selectare, copiere sau mutare text selectat, cutare sau cutare cu nlocuire a unui ir de caractere, anularea ultimei operaii)
sunt operaiile obinuite ale unui editor de texte Windows. Comenzile pentru aceste
operaii se gsesc sub form de opiuni n meniul Edit. Dup ce ai scris comenzile,
salvai fiierul cu opiunea SaveFile. Pentru nchiderea ferestrei de editare putei folosi
scurtturile: Ctrl+W pentru nchiderea cu salvare sau Esc pentru nchiderea fr salvare.
Lansai n execuie programul cu comanda:
Do <nume_fiier>
69
Aceast form se folosete pentru parametrii care pot lua o valoare dintr-un domeniu de
mai multe valori. Ei vor fi precizai 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 poziia afirii ceasului pe ecran. Ea
poate fi precizat prin coordonatele <x> - numrul rndului i <y> - numrul coloanei. Poziia implicit de afiare este colul din dreapta sus al spaiului de lucru din
fereastra de aplicaie Visual FoxPro.
Set Hours to [12/24]
Controleaz parametrul Hours care reprezint formatul de afiare 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_ci_director>
Permite stabilirea unei liste de cutare; aceast list conine mai multe ci de
director n care se va cuta fiierul precizat n comand, dac nu va fi gsit n
directorul curent.
Pentru a vizualiza starea parametrilor care pot fi stabilii prin comenzi Set, folosii comanda:
Display status
Obinei informaii despre starea unui parametru care poate fi stabilit prin comenzi Set
folosind funcia:
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 semnificaie diferit. n acest caz se folosete 1 sau 2 pentru a afla informaii
despre fiecare parametru.
70 Informatic
Tipul ir de caractere. Putei folosi comanda:
Set Exact On|Off
Controleaz modul n care se execut operaia de comparare a dou iruri. Dac
are valoarea on, dou iruri pentru a fi egale trebuie s aib aceeai lungime i s
fie identice la nivelul fiecrei poziii a caracterelor. Dac are valoarea off, irurile
pot avea lungimi diferite. Ele vor fi egale numai dac se potrivesc pn cnd se
termin irul din dreapta. Valoarea implicit este on.
71
72 Informatic
73
74 Informatic
nchidei caseta de dialog cu glosarul executnd clic pe butonul de nchidere.
nchidei fereastra Help executnd clic pe butonul de nchidere.
2. Vizualizai informaii despre controalele din caseta de dialog Toolbars (help dependent de context):
Deschidei caseta de dialog Toolbars. Executai clic pe butonul Help.
Se deschide fereastra Help. n fereastr este afiat subiectul Toolbar (View
Menu). nchidei fereastra Help.
n caseta de dialog Toolbars apsai tasta F1. Observai c aceast aciune are
acelai efect ca i apsarea butonului Help. nchidei fereastra Help.
3. Lucrai cu controalele din fereastra Help (help independent de context):
Deschidei fereastra Help cu ContentsHelp. n spaiul de lucru al ferestrei este
prezentat o list de capitole cu subiecte. Fiecare titlu de capitol reprezint un
salt ctre o list cu subcapitole.
Executai clic pe numele capitolului Language Reference. n fereastr va fi
afiat lista cu subcapitolele. Executai clic pe numele subcapitolului Language
Reference A-Z.
Se deschide caseta de dialog Help Index. Executai clic pe subiectul = Command.
n fereastra Help va fi afiat coninutul subiectului = Command (Comanda =;
operaia de atribuire). nchidei fereastra executnd clic pe butonul de nchidere.
Lucrai cu ferestrele document ale constructorilor
1. Alegei opiunea OpenFile. Se deschide caseta de dialog Open. n list este afiat
coninutul dosarului Vfp (Visual FoxPro). Deschidei din list dosarul cu exemple
Sample. Deschidei apoi dosarul Data. Din lista ascuns Files of type alegei
valoarea Database. Executai clic n lista cu fiiere i dosare pe numele fiierului
Testdata.dbc. Executai clic pe declanatorul Ok.
2. Se deschide fereastra Database Designer (generatorul bazei de date). n fereastr
este afiat baza de date a unei organizaii: tabelele i relaiile dintre tabele. n
fereastr nu este activat nici un obiect. Observai c meniul Format a fost nlocuit cu
meniul Database.
3. Deschidei meniul Database. Identificai opiunile disponibile. De ce nu sunt
disponibile opiunile Modify..., Browse i Remove? nchidei lista meniului.
4. Executai clic pe tabelul Products. Observai informaiile din bara de stare. Deschidei meniul Database. Identificai opiunile disponibile. De ce nu este disponibil
opiunea Edit Relationship...? nchidei lista meniului.
5. Executai clic pe legtura dintre tabelele Orders i Orditems. Deschidei meniul
Database. De ce este acum disponibil opiunea Edit Relationship...? De ce nu
sunt disponibile opiunile Modify..., Browse i Remove? nchidei lista meniului.
6. Executai dublu clic pe tabelul Products. Se deschide fereastra Table Designer (generatorul de tabele). Fereastra are numele tabelului - Products, iar n fereastr sunt
afiate datele din acest tabel. n partea superioar a ferestrei sunt afiate numele cmpurilor din tabel (numele fiecrei coloane). Putei s derulai coninutul ferestrei folosind
barele de derulare. Observai c meniul Database a fost nlocuit cu meniul Table.
7. Deschidei meniul Table. Identificai opiunile de meniu care pot fi folosite pentru
administrarea nregistrrilor dintr-un tabel. nchidei lista meniului.
75
? set ('clock',1)
0.000, 122.333
set clock to 15,60
ceasul este n interiorul spaiului de lucru al ferestrei
? set ('clock',1)
15.000, 60.000 (noile coordonate
ale ceasului)
set hours to 24
ceasul este afiat n format de
24 de ore
? set ( 'hours')
12
.T.
?''='ab'
.F.
?'ab'=''
.T.
set exact on
?'ab'='abc'
.F.
?'abc'='ab'
.F.
?'abc'='ab1'
.F.
?'ab'='ab1'
.F.
?'ab'='ab '
.T.
?'ab'=='ab '
.F.
?'ab1'='ab'
.F.
?'ab '='ab'
.T.
?'ab '=='ab'
.F.
?''='ab'
.F.
?'ab'=''
.F.
3. Identificai modul n care putei modifica interactiv diferii parametri Set. Deschidei
caseta de dialog Options la diferite seciuni i verificai controalele din urmtorul
tabel n care este prezentat o comparaie ntre modul de lucru comand i modul de
76 Informatic
lucru interactiv. Reluai operaiile de la punctele anterioare folosind controalele din
caseta de dialog Options.
Parametru Mod comand
Mod interactiv
Bell
Clock
Clock
Decimals
Set Decimals to
Point
Set Point to
Exact
Set Exact On|Off
Status Bar Set Status Bar On|Off
Talk
x=4*30
?x
set point to
77
78 Informatic
Selectai fiierul a1.prg i executai clic pe declanatorul Edit. Se deschide fereastra
de editare n care este ncrcat fiierul a1.prg. nchidei fereastra de editare.
n list exist fiierul a1.bak. El a fost creat automat de ctre sistem atunci cnd ai
fcut modificarea n acest fiier. Acest tip de fiier conine penultima versiune a fiierului. Selectai acest fiier i executai clic pe declanatorul Delete ca s l tergei.
Executai clic pe declanatorul Tree. Se afieaz structura arborescent a directoarelor. n locul acestui declanator este afiat acum declanatorul Files. Nu mai sunt afiate declanatoarele Find, Sort, Edit i Attr. n locul lor sunt afiate declanatoarele
Chdir (pentru schimbarea directorului curent) i Mkdir (pentru crearea unui director).
Executai clic pe declanatorul Files pentru a afia lista cu fiiere i directoare.
Selectai toate fiierele create n aceast sesiune de lucru i executai clic pe
declanatorul Delete.
ncercai:
Adevrat/Fals:
1. Meniul Database conine opiuni pentru manipularea tabelelor din baza de date.
2. ntr-o comand putei preciza grupul de nregistrri care ncepe cu nregistrarea
curent i se termin cu ultima nregistrare folosind cuvntul 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 afiai informaii despre starea monitorului.
7. Numrul de zecimale dintr-un numr l stabilii cu comanda Set Fixed.
8. Formularul prin intermediul cruia putei s modificai interactiv parametrii sistemului
este de tip fereastr document.
Completai:
1. Informaiile despre activarea/dezactivarea tastelor comutator se gsesc n .............
2. Fereastra folosit pentru editarea comenzilor se numete ..................................
3. Fereastra generatorului de tabele ale bazei de date se numete .................................
4. Cuvntul cheie prin care putei preciza ntr-o comand un grup de n nregistrri,
ncepnd cu nregistrarea curent este ......................
5. Pentru redirectarea ieirii unei comenzi la imprimant folosii clauza .....................
6. Comanda prin care cerei s aflai informaii despre operaia de tergere a fiierelor
Erase este ................................
7. Formularul prin intermediul cruia putei s administrai fiierele este de tip ................
............................. i se numete ....................................
8. Autodocumentarea declanat prin acionarea butonului Help dintr-o caset de dialog se numete help ............................... de context.
Alegei rspunsul corect:
1. Meniul Table conine opiuni pentru:
a) crearea i formatarea tabelelor
79
b) litere mici
c) spaiu
c) Return
spunsuri:
80 Informatic
Numeric
Alfanumeric
Logic
Timp
Logical
Character
Memo
Special
General
Date
DateTime
ntreg
Monetar
Real
Currency
Integer
Float
Double
Sintaxa
Sign
Sign(x)
Abs
Abs(x)
Mod
Mod(x,y)
Int
Ceiling
Int(x)
Ceiling(x)
Floor
Floor(x)
Ce reprezint?
Funcii pentru semnul expresiei
Furnizeaz semnul argumentului x: +1 dac x>0, 0 dac
x=0 i -1 dac x<0.
Furnizeaz valoarea absolut (modulul) argumentului x.
Funcii folosite ca operatori matematici
Furnizeaz restul mpririi argumentului x la argumentul y.
Funcii care aproximeaz datele
Furnizeaz partea ntreag a argumentului.
Furnizeaz cel mai apropiat ntreg mai mare sau egal cu
argumentul.
Furnizeaz cel mai apropiat ntreg mai mic sau egal cu
argumentul.
81
Funcia
Round
Sintaxa
Round(x,y)
Ce reprezint?
Furnizeaz valoarea numeric a numrului precizat prin
argumentul x, rotunjit la numrul de zecimale precizat
prin argumentul y.
Sqrt
Exp
Log
Log10
Sqrt(x)
Exp(x)
Log(x)
Log10(x)
Funcii matematice
Furnizeaz rdcina ptrat din argument.
Furnizeaz exponenialul argumentului.
Furnizeaz logaritmul natural din argument.
Furnizeaz logaritmul zecimal din argument.
Sin
Cos
Tan
Asin
Acos
Atan
Rtod
Dtor
Pi
Sin(x)
Cos(x)
Tan(x)
Asin(x)
Acos(x)
Atan(x)
Rtod(x)
Dtor(x)
Pi()
Funcii trigonometrice
Furnizeaz sinusul argumentului exprimat n radiani.
Furnizeaz cosinusul argumentului exprimat n radiani.
Furnizeaz tangenta argumentului exprimat n radiani.
Furnizeaz arcsinusul argumentului exprimat n radiani.
Furnizeaz arccosinusul argumentului exprimat n radiani.
Furnizeaz arctangenta argumentului exprimat n radiani.
Realizeaz conversia din radiani n grade.
Realizeaz conversia din grade n radiani.
Furnizeaz valoarea constantei (3,141592).
Observaii:
1. Putei exprima relaia dintre un numr, modulul su i semnul su astfel:
x = abs(x)*sign(x)
2. Pentru a afla partea fracionar a unui numr x putei folosi expresia:
x - int(x)
3. Putei folosi funciile exp() i log() pentru a calcula valoarea expresiei ab, adic a^b.
tii deja c din punct de vedere matematic: ab = eb*ln(a). Putei exprima operatorul
matematic pentru ridicare la putere folosind aceste funcii:
a^b = exp(b*log(a))
4. Putei folosi funciile log() i log10() pentru a calcula valoarea oricrui logaritm. tii
deja c din punct de vedere matematic:
logb(a)= log(a)/log(b) = log10(a)/log10(b)
5. Argumentele funciilor trigonometrice sin(x), cos(x) i tan(x) sunt specificate n radiani
i nu n grade. Rezultatul furnizat de
funciile asin(x), acos(x) i atan(x)
Dtor()
este n radiani.
Pentru a transforma gradele (Degree) n
radiani (Radian), i invers, se pot folosi
funciile Dtor() i Rtod().
radiani
grade
Rtod()
82 Informatic
a + 1- a 1
a + 1+ a 1
(2 a )
2. Evaluai expresia:
x2 1
pentru x=3.
x=3
e=sqrt(sqrt(sqrt(x^2-1)))
?e
1.30
4.
-1
? round(x,2)
-5.25
83
1.00
? sin(dtor(90))
1.00
? asin(1)
1.57
? rtod(asin(1))
90.00
? tan(pi()/4)
1.00
? rtod(atan(1))
45.00
? rtod(atan(-1))
-45.00
? rtod(asin(-1))
-90.00
? rtod(acos(-1))
180.00
? rtod(asin(sqrt(2)/2))
45.00
Sintaxa
Asc
Asc(x)
Chr
Chr(x)
Len
Isalpha
Isupper
Islower
Isdigit
Ce reprezint?
Funcii pentru conversii
Argumentul x este de tip ir de caractere. Funcia furnizeaz
codul ASCII al primului caracter din argument.
Argumentul x este de tip numeric ntreg cuprins ntre 0 i 255.
Funcia furnizeaz caracterul al crui cod ASCII este argumentul x. Funcia furnizeaz un rezultat de tip ir de caractere.
84 Informatic
Funcia
Replicate
Space
Sintaxa
Ce reprezint?
Funcii pentru eliminarea spaiilor sau pentru inserarea spaiilor sau a altor
caractere ntr-un ir de caractere
Alltrim
Alltrim(x)
Elimin spaiile din faa i din spatele (din stnga i din
dreapta) irului de caractere x.
Ltrim
Ltrim(x)
Elimin spaiile suplimentare din faa (din stnga - left) irului
de caractere x.
Rtrim,
Rtrim(x)
Elimin spaiile din spatele (din dreapta - right) irului de
Trim
Trim(x)
caractere x.
Padc
Padc(x,n[,y]) Argumentele sunt x,y de tip ir de caractere i n de tip numeric. Funcia completeaz irul de caractere x la stnga i la
dreapta cu irul de caractere y astfel nct irul rezultat s
aib lungimea n.
Padl
Padl(x,n[,y])
Argumentele sunt x,y de tip ir de caractere i n de tip numeric. Funcia completeaz irul de caractere x n fa (la stnga
- left) cu irul de caractere y astfel nct irul rezultat s aib
lungimea n.
Padr
Padr(x,yn[,y]) Argumentele sunt x,y de tip ir de caractere i n de tip numeric. Funcia completeaz irul de caractere x la sfrit (la
dreapta - right) cu irul de caractere y astfel nct irul rezultat
s aib lungimea n.
Lower
Upper
Proper
Chrtran
Stuff
Left
Right
Substr
At
Rat
Atc
Atline
85
Sintaxa
Strtran(x,y
[,z,n,m])
Ce reprezint?
Argumentele x, y, z sunt de tip ir de caractere, iar argumentele n i m sunt de tip numeric. Furnizeaz un ir de caractere
prin nlocuirea n irul de caractere x a irului de caractere y
cu irul de caractere z. nlocuirea ncepe cu apariia n a irului
y i se vor nlocui numai m apariii. Dac nu se precizeaz irul z, el va fi considerat irul vid, iar efectul va fi tergerea a m
apariii ale irului y ncepnd cu apariia n. Dac nu se precizeaz argumentul n, nlocuirea ncepe cu prima apariie, iar
dac nu se precizeaz argumentul m, se vor nlocui toate
apariiile.
Stuff(x,n,m,y) Argumentele x i y sunt de tip ir de caractere, iar argumentele
n i m sunt de tip numeric. Furnizeaz un ir de caractere obinut prin nlocuirea n irul de caractere x a unui subir, care
ncepe din poziia n i are lungimea m, cu irul de caractere y.
86 Informatic
Funcia
Sintaxa
Ratline
Ratline(x,y)
Atcline
Atcline(x,y)
Occurs
Occurs(x,y)
Ce reprezint?
cont de diferena dintre literele mari i mici i de la stnga la
dreapta.
Argumentele x i y sunt de tip ir de caractere. Furnizeaz
un rezultat numeric care reprezint linia de text din irul y n
care apare prima dat subirul x. Cutarea se face innd
cont de diferena dintre literele mari i mici i de la dreapta
la stnga.
Argumentele x iy sunt de tip ir de caractere. Furnizeaz
un rezultat numeric care reprezint linia de text din irul y n
care apare prima dat subirul x. Cutarea se face innd
cont de diferena dintre literele mari i mici i de la stnga la
dreapta.
Argumentele x iy sunt de tip ir de caractere. Furnizeaz
un rezultat numeric care reprezint numrul de apariii al
subirului x n irul y.
Observaii:
Asc()
1. Putei folosi urmtoarele funcii pencod ASCII
caracter
tru conversia numr caracter:
2. Pentru irul vid funcia Len() furniChr()
zeaz valoarea 0.
3. Funciile Replicate( ,n) i Space(n) furnizeaz acelai rezultat.
4. Funciile Alltrim(), Ltrim(), Trim(), Rtrim(), Padc(), Padl() i Padr() pot fi sintetizate n
urmtoarele diagrame:
a. Funciile pot fi folosite pentru dou
tipuri de operaii:
9 eliminarea spaiilor: Alltrim(),
Ltrim(), Trim(), Rtrim()
9 inserarea spaiilor sau a altor
caractere: Padc(), Padl(), Padr()
ir cu spaii
ir fr spaii
Trim(), Rtrim(),Padr()
Alltrim(), Padc()
87
Left(x,n)
irul x
m
Substr(x,m,n)
Right(x,n)
88 Informatic
At(), Atc(),
Atline(),Atcline()
Rat(),
Ratline()
0 irul vid
? len ('Ana '+'Maria')
10
? isalpha (x)
.T.
y='123'
z=123
? isalpha (y)
.F.
? isdigit (y)
.T.
? isalpha (z)
mesaj de eroare
? isupper (x)
.T.
? islower (x)
.F.
89
? proper(x)
Abc
? proper(y)
Abc
? proper(y) = proper(upper(x))
.T.
? proper(lower(y)) = proper(x)
.T.
? proper('AlFaBeT')
Alfabet
? upper(x) = lower(y)
.F.
? upper(y) = lower(x)
.F.
? chrtran ('abcdef','bdf','111')
a1c1e1
? chrtran ('abcdef','bdf','xyz')
axcyez
? chrtran ('abcdef','bdf','12')
a1c2e
? len (chrtran('abcdef','bdf','12'))
5
? chrtran ('abcdef','bdf','xyzu')
axcyez
? chrtran ('mosor','ms','tp')
topor
? chrtran ('cotor','cor','nal')
natal
a='Am cumparat bilet la "Ala Bala
Portocala"'
b='la'
c='na'
d='vala'
e=strtran(a,b,c,2)
?e
Am cumparat bilet la "Ana Bana
Portocana"
e=strtran(a,b,d,2,1)
?e
Am cumparat bilet la "Avala Bala
Portocala"
?stuff('parcare',4,1,'taj')
partajare
?stuff('caviar',3,3,'')
car
s-a ters subirul 'via'
?stuff('car',3,0,'via')
caviar s-a inserat subirul 'via'
a=stuff('cod',4,0,'are')
?a
codare
a=stuff(a,1,0,'dec')
?a
90 Informatic
decodare
? at ('nr', a)
16
? at ('Nr', a)
0
? atc ('Nr', a)
16
? rat('nr', a)
16
a='Ala Bala Portocala'
? at ('la',a,1)
2
? at ('la',a,2)
7
? at ('la',a,3)
17
? rat ('la',a,3)
2
? occurs('co','cocor')
2
? occurs('la',a)
3
Tipul
American/MDY
Ansi
British/French/DMY
German
Italian
Japan/YMD
USA
Formatul de reprezentare
ll/zz/aa
aa.ll.zz
zz/ll/aa
zz.ll.aa
zz-ll-aa
aa/ll/zz
ll-zz-aa
91
Sintaxa
Ce reprezint?
Date
Date()
DateTime
DateTime()
Time
Time()
Day
Dow
Cdow
Week
Month
Cmonth
Year
Hours
Minute
Sec
Seconds
Day(x)
Dow(x)
Cdow(x)
Week(x)
Month(x)
Cmonth(x)
Year(x)
Hours(y)
Minute(y)
Sec(y)
Seconds()
Gomonth
Gomonth(x,n)
? date()
03/02/01
set date to british
? date()
92 Informatic
02/03/01
set century on
? date()
02/03/2001
set century off
? time()
16:52:50
? datetime()
02/03/01 04:53:00 PM
set hours to 24
? datetime()
02/03/01 16:54:23
4.
2. Extragei informaii despre ziua din dat folosind funciile: day(), dow(),
cdow():
d={10/05/01}
? day(d)
10
? dow(d)
5
? cdow(d)
Thursday
d=datetime()
? hours(d)
17
? minute(d)
14
? sec(d)
12
? seconds()
62135.20
tip ir de caractere
Str()
Funcia
Str
Sintaxa
Str(m,n,p)
Ce reprezint?
Argumentele m,n i p sunt de tip numeric. Funcia convertete
numrul m ntr-un ir de caractere de lungime n care conine p
poziii pentru zecimale (cifre situate dup punctul zecimal). Dac
numrul conine mai multe poziii dect argumentul n, rezultatul va
Sintaxa
Val
Val(x)
93
Ce reprezint?
fi un ir de asteriscuri. Dac numrul conine mai puine poziii
dect argumentul n, irul de caractere va fi completat cu spaii
pn la obinerea lungimii n. Dac numrul p este mai mic dect
numrul de poziii zecimale, partea zecimal va fi trunchiat.
Argumentul x este de tip ir de caractere. El trebuie s conin
numai caracterele: cifre, punctul zecimal sau semnul minus, altfel
conversia se va face eronat. Funcia convertete irul de caractere
x ntr-un numr.
tip ir de caractere
Dtoc(), Dtos()
Funcia
Dtoc
Sintaxa
Dtoc(x)
Dtos
Dtos(x)
Ctod
Ctod(x)
Ce reprezint?
Argumentul x este de tip dat calendaristic. Funcia furnizeaz un
ir de 8 caractere care reprezint data. Are forma ll/zz/aa (dou
caractere pentru numrul lunii, dou pentru numrul zilei i dou
pentru numrul anului, separarea fcndu-se cu caracterul /).
Argumentul x este de tip dat calendaristic. Funcia furnizeaz un
ir de 8 caractere care reprezint data. Are forma aaaallzz (patru
caractere pentru an, dou pentru numrul lunii i dou pentru
numrul zilei).
Argumentul x este de tip ir de caractere care formeaz o dat
calendaristic. Funcia furnizeaz data calendaristic precizat
prin irul de caractere.
tip ir de caractere
Ttoc()
Funcia
Ttoc
Sintaxa
Ttoc(x)
Ctot
Ctot(x)
Ce reprezint?
Argumentul x este de tip dat pentru gestionarea timpului. Funcia
convertete aceast dat ntr-un ir de caractere.
Argumentul x este de tip ir de caractere. irul de caractere este de
forma zz/ll/aa hh:mm:ss apm (cte dou caractere pentru fiecare
element: zi, lun, an, or, minut, secund i am/pm). Funcia
convertete irul de caractere ntr-o dat pentru gestionarea timpului.
94 Informatic
d. tip dat pentru timp tip dat calendaristic
Dtot()
tip dat pentru timp
Funcia
Ttod
Sintaxa
Ttoc(x)
Dtot
Ctot(x)
Ce reprezint?
Argumentul x este de tip dat pentru gestionarea timpului. Funcia
convertete aceast dat ntr-o dat calendaristic.
Argumentul x este de tip dat calendaristic. Funcia convertete
aceast dat ntr-o dat pentru gestionarea timpului, considernd
ora 12:00:00 am.
Observaie:
Avantajul folosirii funciei Dtos() n locul funciei Dtoc() este acela c formatul furnizat de
ea permite compararea corect a dou date calendaristice.
20
? str(a,2)+str(b,2)
1015
? len(str(a,2)+str(b,2))
4
a=12.5
? str(a)
13
? len(str(a))
10
a=12345123451
? str(a)
.1234E+11
? len(str(a))
10
02/03/01 00:00:00
set hour to 12
? dtot(b)
02/03/01 12:00:00 AM
07/04/01
?x>y
.T.
x=dtos(d1)
?x
20010308
y=dtos(d2)
?y
20010407
?x>y
.F.
95
4.
Iif()
Inlist()
Type()
Empty
Sintaxa
Min(x1,x2,)
Max(x1,x2,)
Ce reprezint?
Argumentele x1, x2, trebuie s fie de acelai tip. Funcia
compar ntre ele toate argumentele i furnizeaz ca
rezultat valoarea cea mai mic, respectiv cea mai mare.
Between(x,y,z) Argumentul x, y i z trebuie s fie de acelai tip. Funcia
testeaz dac valoarea argumentului x se gsete ntre
valorile y i z. Funcia furnizeaz un rezultat logic (.T. dac
este ndeplinit relaia y<x<z).
Iif(x,y,z)
Argumentul x trebuie s fie de tip logic. Rezultatul furnizat
depinde de valoarea lui x. Dac x=.T., funcia afieaz valoarea lui y, iar dac x=.F., funcia afieaz valoarea lui z.
Inlist(x1,x2,
Funcia furnizeaz un rezultat logic. Ea testeaz dac
x2,)
primul argument x1 se gsete n lista descris de ceilali
parametri, x2, x3, . n cazul n care valoarea se gsete
n list, rezultatul este .T..
Type(x)
Testeaz tipul unui argument x scris ca un ir de caractere. n funcie de coninutul irului de caractere funcia va
furniza printr-o liter rezultatul: N-numeric, C-ir de caractere, L-logic, D-dat calendaristic, T-timp calendaristic,
M-memo, Y-monetar, O-obiect, G-general, U-necunoscut.
Empty(x)
Testeaz dac o dat este vid. Rezultatul furnizat este de
tip logic. Dac data este vid, rezultatul este .T..
96 Informatic
Funcia
Evaluate
Sintaxa
Evaluate(x)
Ce reprezint?
Funcia evalueaz un argument x scris ca un ir de caractere. n funcie de coninutul irului de caractere, funcia va
furniza un rezultat de tip ir de caractere, numeric, dat
calendaristic.
Observaii:
1. O dat vid este o dat care conine elementul neutru (nul) pentru acel tip de dat. De
aceea, coninutul unei date vide difer n funcie de tipul datei. Astfel:
Tipul datei
ir de caractere
numeric
dat calendaristic
logic
Formatul de reprezentare
irul vid sau irul de caractere format numai din spaii
(Chr(30)), caractere nul (Chr(0)), caractere Tab (Chr(9))
i caractere sfrit de linie (Chr(13), Chr(10)).
0
{} sau {//}
.F.
2. Funcia Evaluate poate identifica tipul datelor din irul de caractere. De exemplu,
evaluate(2*5+5) furnizeaz un rezultat de tip numeric egal cu 15, funcia evaluate(2>5)
furnizeaz un rezultat de tip logic egal cu .F., funcia evaluate({05/03/01}+2) furnizeaz
un rezultat de tip dat calendaristic egal cu data 05/05/01, iar funcia
evaluate("abc"+"123") furnizeaz un rezultat de tip ir de caractere egal cu abc123.
3. Funcia Type poate identifica tipul expresiei scrise ca ir de
caractere. De exemplu, type(5+5) furnizeaz tipul numeric (N), funcia type(2>5) furnizeaz tipul logic (L), funcia
type({05/05/01}+10) furnizeaz tipul dat calendaristic
(D), iar funcia type($20.00) furnizeaz tipul monetar (Y).
nu
da
x
4. Funcia Iif(x,y,z) poate fi folosit pentru o structur alternativ care este descris n pseudocod astfel: if x then
write y else write z endif.
97
1
? max('a','b','c')
c
? min('a','b','c')
a
a='A'
c=inlist(lower(a),'a','e','i','o','u')
b1='Este vocala'
b2='Nu este vocala'
?iif(c,b1,b2)
Este vocala
a='B'
c=inlist(lower(a),'a','e','i','o','u')
?iif(c,b1,b2)
Nu este vocala
litera mare
varsta=10
b1='minor'
b2='major'
? iif(between(varsta,0,17), b1, b2)
minor
varsta=18
? iif(between(varsta,0,17), b1, b2)
major
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
tii c o variabil de memorie reprezint o zon de memorie creia 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 su.
98 Informatic
Visual Fox Pro folosete
9 variabile de memorie utilizator,
9 variabile de memorie sistem.
Variabilele de memorie sistem sunt variabile proprii aplicaiei, pe care aceasta le
creeaz automat la lansarea n execuie i pe care le pstreaz n memorie att timp ct
este n execuie. Aceste variabile nu sunt terse de comenzile obinuite de tergere a
variabilelor de memorie. Identificatorul lor ncepe cu caracterul linie de subliniere _.
Variabilele de sistem sunt folosite de ctre aplicaie pentru configurarea mediului Visual
FoxPro (de exemplu, configurarea formatelor de ieire ctre ecran sau ctre imprimant).
Variabilele de memorie utilizator sunt create de ctre utilizatorul aplicaiei. Crearea lor
nseamn: atribuirea unui nume, stabilirea tipului datelor pentru a se rezerva corespunztor o zon de memorie i atribuirea unei valori iniiale.
Asupra unei variabile de memorie se pot executa operaii de creare i consultare.
Crearea unei variabile de memorie se face prin:
1. iniializare folosind
9 operaia de atribuire a unei valori (constant sau valoare obinut prin evaluarea
unei expresii)
9 comanda Store care are sintaxa:
Store <expresie> to <list_nume_variabile>
99
Putei obine informaii 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:
List | Display Memory [Like <ablon>] [ to print | to file <nume_fiier>]
<ablon> reprezint descrierea grupului de variabile folosind conveniile clasice pentru
caracterele de nlocuire ? i *. Lista de variabile de memorie poate fi afiat pe ecran sau
la imprimant (to print) ori salvat ntr-un fiier (to file <nume_fiier>).
Chiar dac sistemul v permite s definii 65.000 de variabile de memorie, este bine s
tergei variabilele de memorie pe care nu le mai folosii. Operaia se numete eliberarea
memoriei interne. Putei folosi urmtoarele comenzi:
O variabil public sau global poate fi folosit de orice subprogram al aplicaiei, 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
9 Comanda Restore from readuce n memoria intern variabilele de memorie dintr-un
fiier identificat prin nume; dac nu se precizeaz clauza additive, variabilele de memorie i tablourile de memorie care existau n memorie naintea restaurrii vor fi distruse:
Restore from <nume_fiier> [Additive]
store a1*a2 to a3
accept 'Scrieti numele: ' to nume
Scrieti numele: Popescu
input 'Scrieti varsta: ' to varsta
Scrieti varsta: 18
wait 'Raspundeti cu o litera: ' to b3
Raspundeti cu o litera: x
sunt afiate informaii despre variabilele rmase: b1, b2, b3, x1, x2
release all except b?
display memory
sunt afiate informaii despre variabilele rmase: b1, b2, b3
release all
display memory
nu mai sunt afiate informaii
despre variabile utilizator
101
4. Testai urmtoarea secven de instruciuni 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)
102 Informatic
ncercai:
Artai corespondenele:
Se evalueaz funcia:
?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. Legai prin linii fiecare element din coloana n de elementul
corespunztor din coloana Afieaz:
n:
Afieaz:
1
2
3
4
5
6
7
8
1 octet
2 octei
8 octei
incorect
Adevrat/Fals:
1. Funcia isdigit('123') furnizeaz rezultatul adevrat.
2. Pentru a afia irul de caractere 12345 din numrul ntreg 12345 folosii funcia
str(12345,5,0).
3. Rezultatul funciei max(day(d)+2,month(d)+5) este 7 pentru valoarea {02/04/01} a
variabilei de memorie d afiat n formatul american.
4. Funcia prin care convertii un caracter n codul su ASCII se numete val.
5. Eliminai spaiile din stnga unui ir de caractere cu funcia left().
6. Funcia at() nlocuiete ntr-un ir de caractere un subir cu un alt subir.
7. Funcia floor() se folosete pentru aproximarea unui numr.
8. Comanda ?? se folosete pentru a afia la imprimant un ir de caractere.
Completai:
1.
2.
3.
4.
5.
6.
7.
8.
c) 4
c) eroare
103
104 Informatic
11. Ce funcie putei folosi pentru a testa dac valoarea unei date aparine unui interval?
Dar pentru a testa dac aparine unei mulimi de valori?
12. Ce funcie putei folosi pentru a descrie o structur alternativ?
13. Scriei funciile prin care putei s realizai urmtoarele transformri de cuvinte:
cor color
covor cotor color cosor cosar
covor cotor motor mosor
calculator calator abator abatere
14. Scriei funciile prin care descompunei n cuvintele componente urmtoarele cuvinte
compuse i expresii: via de vie, Spitalul de Urgen, Delta Dunrii i cocoul de munte.
15. Trebuie s tergei un grup de variabile de memorie. Ce operaie vei folosi dac putei s
descriei grupul printr-un ablon? Ce operaie vei folosi dac nu putei s descriei grupul
printr-un ablon?
spunsuri:
Artai corespondenele: 1-d; 2-d; 3-a; 4-b; 5-d; 6-c; 7-d; 8-d.
Adevrat/Fals: 1-A; 2-A; 3-A; 4-F; 5-F; 6-F; 7-A; 8-F.
Completai: 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)))
Alegei rspunsurile 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.
105
106 Informatic
spunsuri:
107
a
10
40
45
23
89
90
12
34
Tabelul
b
100
300
200
100
200
400
500
800
c
a
b
a
c
d
a
b
c
.....
a
10
12
23
34
40
45
89
90
Indexul
nr. nreg.
1
7
4
8
2
3
5
6
Cutarea unei nregistrri dup valoarea unui cmp se face mult mai rapid atunci cnd
nregistrrile sunt ordonate dup acel cmp, deoarece n cazul unei structuri ordonate se pot
folosi diferii algoritmi de cutare. De exemplu, pentru a gsi nregistrarea care ndeplinete
condiia a=34 (valoarea cmpului a este 34), n cazul unei parcurgeri secveniale se vor
executa 8 operaii de verificare, cte una pentru fiecare nregistrare. n cazul ordonrii
structurii se poate folosi, de exemplu, algoritmul de njumtire a intervalului. Cutarea se
108 Informatic
va face n fiierul index folosind acest algoritm. Se mparte fiierul n dou: n prima jumtate
se vor gsi nregistrrile pentru care a[10,34], iar n a doua jumtate se vor gsi nregistrrile
pentru care a[40,90]. Se verific i se vede c valoarea 34 a cmpului a aparine primului
interval. Se mparte i acest interval n dou: n prima jumtate se vor gsi nregistrrile pentru
care a[10,12], iar n a doua jumtate se vor gsi nregistrrile pentru care a[23,34]. Se
verific i se vede c valoarea 34 a cmpului a aparine celui de-al doilea interval. Se mparte
i acest interval n dou: n prima jumtate se va gsi o singur valoare (23), iar n a doua
jumtate se va gsi o singur valoare (34), care este valoarea cutat. Pentru aceast
valoare, n index exist numrul nregistrrii: 8. Se poziioneaz n tabel pointerul de
nregistrare direct pe nregistrarea 8. n acest caz s-au executat numai trei operaii de
verificare (de apartenen a valorii cmpului a la un interval).
Start
Indiferent de modul n care este exploatat tabelul, algoritmul de exploatare
cuprinde urmtorii pai: deschiderea tabelului, prelucrarea i nchiderea.
Open
Tabelul este memorat ntr-un fiier de date care are acelai nume ca i
tabelul i extensia .dbf. Pentru a se putea prelucra nregistrrile dintr-un
Prelucrare
tabel, trebuie deschis fiierul n care acesta este pstrat. Prin operaia de
deschidere i se aloc o zon de memorie intern n care urmeaz s fie
transferate de pe disc nregistrrile care vor fi prelucrate. Deschiderea
Close
fiierului se face fie folosind opiunea de meniu Open...File, fie prin
intermediul comenzii:
Stop
use <nume_fiier>
Dup ce ai prelucrat nregistrrile din tabel trebuie nchis fiierul. Prin
operaia de nchidere se elibereaz zona de memorie intern alocat fiierului. nchiderea
fiierului se face prin intermediul comenzii:
use
Mai putei s nchidei tabelul din fereastra View (pe care o deschidei cu opiunea View
WindowWindow). Selectai numele tabelului i executai clic pe declanatorul Close.
Operaiile puse la dispoziie de Visual FoxPro pentru administrarea datelor dintr-un tabel
al bazei de date pot fi grupate astfel:
109
110 Informatic
unde <nume_tabel> este numele tabelului care se creeaz i a crui structur se
definete prin precizarea pentru fiecare cmp a numelui su <nume_cmp>, a
tipului <tip>, a dimensiunii <lime> i a numrului de poziii din partea fracionar
<poz_zec> (numai pentru cmpurile reale numeric, float i double).
2. Prin preluarea structurii dintr-un alt tabel:
9 Prin preluarea structurii dintr-un tabel de structur. Tabelul de structur este un tabel
n care se pstreaz informaii despre structura unui alt tabel (proprietile cmpurilor).
El a fost creat cu comanda copy structure extended. Sintaxa comenzii este:
create <nume_tabel1> from <nume_tabel2>
unde <nume_tabel1> este numele tabelului a crui structur se creeaz prin
preluarea structurii din tabelul de structur care are numele <nume_tabel2>.
9 Prin preluarea structurii dintr-un tabel deschis. Pot fi preluate toate cmpurile din
structur sau numai o parte din ele. Sintaxa comenzii este:
copy structure to <nume_tabel> [fields <list_nume_cmpuri>]
unde <nume_tabel> este numele tabelului care se creeaz i a crui structur se
preia din tabelul deschis n acel moment; se pot prelua toate cmpurile sau numai
cmpurile precizate n lista clauzei fields.
111
adugate din aceste fiiere la noua structur de tabel. Putei s pstrai i vechea versiune, redenumind fiierele nume.bak cu nume_nou.dbf i nume.tbk cu nume_nou.fpt.
Mai putei s deschidei caseta de dialog i din fereastra View. Selectai numele tabelului
i executai clic pe declanatorul Properties.... n caseta de dialog Work Area
Properties executai clic pe declanatorul Modify....
3. Copierea structurii tabelului:
Putei s copiai structura tabelului deschis:
9 ntr-un tabel de structur. Acest tabel are o structur predefinit. El conine 11
cmpuri, cte un cmp pentru fiecare proprietate a cmpului (de exemplu,
field_name pentru numele cmpului, field_type pentru tipul cmpului, field_len
pentru lungimea cmpului, field_dec pentru numrul de poziii ale prii fracionare,
field_null pentru a stabili dac se accept valoarea null n cmp, field_defa pentru
valoare implicit a cmpului etc.). n tabel exist cte o nregistrare pentru fiecare
cmp (aadar, va avea attea nregistrri, cte cmpuri are tabelul pentru care
pstreaz structura). Sintaxa comenzii este:
copy to <nume_tabel> structure extended
unde <nume_tabel> este numele tabelului n care se va pstra structura.
9 ntr-un tabel precizat prin <nume_tabel>. Pot fi copiate toate cmpurile din
structur sau numai o parte din ele. Sintaxa comenzii este:
copy structure to <nume_tabel> [fields <list_nume_cmpuri>]
Observaie:
Pentru a vedea ce conin tabelele n care au fost copiate structurile, trebuie s le deschidei.
Observaie:
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.
112 Informatic
2. Prin intermediul funciilor se pot obine informaii despre cmpuri:
9 numele cmpului dintr-o poziie precizat se obine cu funcia field(<n>), unde <n>
este numrul de ordine al cmpului;
9 numrul de cmpuri din tabel se obine cu funcia fcount();
9 lungimea unui cmp din tabel se obine cu funcia fsize(<nume>) unde <nume>
este numele cmpului;
9 dimensiunea nregistrrii din tabel se obine cu funcia recsize().
Obiectul: realizarea bazei de date a unei companii care ofer servicii de consultan.
Scopul bazei de date: gestionarea serviciilor de consultan asigurate clienilor de ctre
angajaii companiei.
113
Cerine:
9 Fiecare angajat al companiei are o persoan din cadrul companiei care i monitorizeaz i i supervizeaz activitatea.
9 Atunci cnd un client solicit pentru prima dat serviciile acestei companii, i se
repartizeaz un angajat care s se ocupe de el. De obicei angajatul se ntlnete cu
clientul pn cnd i se rezolv problema.
9 n cadrul primei discuii, angajatul stabilete obiectivele consultanei, termenele i
costul estimativ. Aceste date se pot modifica pe parcursul desfurrii consultanei.
Toate aceste modificri trebuie pstrate n baza de date.
9 Pentru fiecare edin de consultan trebuie s se pstreze date despre modul n
care serviciile prestate de angajat ndeplinesc obiectivele consultanei, n conformitate
cu termenele stabilite. Pentru fiecare edin se vor nregistra urmtoarele date: data
edinei, angajatul cu care s-a ntlnit clientul, durata edinei, suma facturat pentru
edin, rezumatul modului n care a decurs ntlnirea.
9 Costul unui serviciu de consultan este n funcie de ore. Tariful orar depinde de
angajatul care s-a ocupat de client: cu ct acesta are mai mult experien, cu att
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 consultanei.
9 Unii clieni sunt ntmpltori, alii devin permaneni, solicitnd frecvent diferite servicii
de consultan. Compania poate derula la un moment dat dou sau mai multe
contracte de consultan cu acelai client. Pentru fiecare contract se va ine o
eviden separat a notelor de plat.
9 Pe lng notele de plat, baza de date trebuie s furnizeze un raport lunar al activitilor cu fiecare client.
9 Un angajat al companiei are mai muli clieni, iar un client poate lucra cu mai muli
angajai ai companiei.
Pentru a putea rspunde la toate aceste cerine, baza de date va fi format din urmtoa13
rele tabele :
Tabelul Angajai care va trebui s conin urmtoarele date (sub form de cmpuri):
9 Identificatorul angajatului (id_ang, I). Este un numr care identific unic angajatul i
este folosit pentru cheia primar.
9 Numele angajatului (nume, C, 20). Deoarece pot s apar cutri n tabel i dup
numele angajatului, acest cmp va fi cheie de indexare mpreun cu cmpul prenume.
9 Preumele angajatului (pren, C, 20).
9 Tip angajat (tip_ang, C, 1). Acesta este un cod care folosete un singur caracter prin
care se identific tipul angajatului: permanent cu norm ntreag (a), permanent cu
jumtate de norm (b), temporar cu norm ntreag (c), temporar cu jumtate 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 cmpului nu este
determinat de tipul datelor, se va preciza i lungimea cmpului. De exemplu, nume,C,20
nseamn cmpul nume este de tip Character i are lungimea 20.
114 Informatic
9 Identificatorul superiorului (id_sup, I). Este un numr care identific angajatul cruia i
este subordonat. Trebuie s fie de acelai tip ca i cmpul identificatorul angajatului.
deoarece superiorul este i el angajat al companiei.
9 Data naterii (data_n, D). Este data naterii angajatului.
9 Data angajrii (data_a, D). Este data angajrii.
9 Data ncetrii angajrii (data_i, D). Este data de la care angajatul nu mai face parte
din firm (demisie, demitere, restrngere de activitate, pensionare etc.). El va fi
pstrat n continuare n evidenele 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 spaiul de
memorie se va folosi cmpul de tip Memo.
9 Localitatea (loc, C, 15). Deoarece compania are sucursale i birouri de reprezentan
n mai multe localiti, i angajaii pot avea domiciliile n mai multe localiti.
9 Codul judeului (c_jud, C, 2). Pentru jude se nregistreaz numai codul. Separat, n
tabelul Judee vor fi nregistrate i numele judeelor.
9 Codul potal (cp, C, 5). Este codul potal al adresei angajatului.
9 Telefonul fix (tel_f, C, 9). Este numrul telefonului fix al angajatului.
9 Telefonul mobil (tel_m, C, 9). Este numrul telefonului mobil al angajatului.
9 Observaii (obs, M). Conine informaii biografice ale angajatului sau referitoare la
activitatea lui n cadrul companiei.
Tabelul Clieni care va trebui s conin urmtoarele date (sub form de cmpuri):
9 Identificatorul clientului (id_cl, I). Este un numr care identific unic clientul i este folosit pentru cheia primar. Este de acelai tip ca i cmpul id_ang din tabelul Angajai.
9 Numele clientului (nume, C, 20). Deoarece pot s apar cutri n tabel i dup
numele clientului, acest cmp va fi cheie de indexare. Este de acelai tip ca i cmpul
nume din tabelul Angajai.
9 Prenumele clientului (pren, C, 20). Este de acelai tip ca i cmpul pren din tabelul Angajai.
9 Tip client (Tip_cl, L). Cmpul va avea valoarea .T. n cazul unui client curent (are un
contract de consultan n derulare).
9 Identificatorul angajatului (id_ang, I). Este un numr care identific angajatul atribuit
clientului s se ocupe de el. Este de acelai tip ca i cmpul id_ang din tabelul Angajai.
9 Data intrrii (data_i, D). Este data de la care a devenit clientul companiei de consultan.
9 Adresa clientului (adresa, M). Este adresa clientului. Este de acelai tip ca i cmpul
adresa din tabelul Angajai.
9 Localitatea clientului (loc, C, 15). Este localitatea de reziden a clientului. Este de
acelai tip ca i cmpul loc din tabelul Angajai.
9 Codul judeului (c_jud, C, 2). Este codul judeului de reziden al clientului. Este de
acelai tip ca i cmpul c_jud din tabelul Angajai.
9 Codul potal (cp, C, 5). Este codul potal al adresei clientului. Este de acelai tip ca i
cmpul cp din tabelul Angajai.
9 Fax (fax, C, 9). Este numrul de fax al clientului.
9 Telefonul fix (tel_f, C, 9). Este numrul telefonului fix al clientului. Este de acelai tip
ca i cmpul tel_f din tabelul Angajai.
9 Telefon mobil (tel_m, C, 9). Este numrul telefonului mobil al clientului. Este de
acelai tip ca i cmpul tel_m din tabelul Angajai.
115
9 Observaii (obs, M). Conine scurte informaii despre client i relaiile sale cu
compania de consultan.
Tabelul Judee care va trebui s conin urmtoarele date (sub form de cmpuri):
9 Codul judeului (c_jud, C, 2). Este folosit pentru cheia secundar.
9 Numele judeului (n_jud, C, 15).
Un angajat poate s aib mai muli clieni, iar de un client se pot ocupa mai muli
angajai. Aadar, ntre tabelele Angajai i Clieni, tipul de relaie este de mai-multe-lamai-multe. Din aceast cauz trebuie creat un tabel intermediar Contracte, care ine
evidena contractelor de consultan:
9 Identificatorul contractului (id_cont, I). Este un numr 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 definete
categoria de consultan: instruire, proiectare etc.
9 Observaii (obs_c, C, 254). Conine 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 consultana.
Deoarece estimrile se modific pe parcursul derulrii contractului (vor fi mai multe estimri pentru acelai contract) i deoarece se dorete pstrarea unui istoric al acestor estimri, ele vor fi nregistrate ntr-un tabel separat Estimri care are urmtoarea 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 Numrul estimrii (nr_est, I). Reprezint a cta estimare este pentru acelai contract.
9 Identificatorul angajatului (id_ang, I). Este identificatorul angajatului care a fcut estimarea.
9 Obiectivul estimrii (obiectiv, C, 254). Este descrierea obiectivelor pentru aceast
estimare a derulrii contractului. Descrierea trebuie s se fac precis i concis.
9 Termene (term, I). Este numrul estimativ de edine n care se va derula contractul.
9 Cost estimat (cost_e, I). Este costul estimativ al contractului de consultan.
9 Data estimriii (data_e, D). Este data la care s-a fcut estimarea.
9 Data terminrii (data_t, D). Este data estimat pentru terminarea contractului de consultan.
Dar fiecare contract de consultan se desfoar pe parcursul mai multor edine de
consultan. Din aceast cauz trebuie creat un tabel intermediar edine care s in
evidena acestora i care are urmtoarea structur:
9 Numrul edinei (nr_s, I). Este un numr unic atribuit edinei i este folosit ca o cheie
primar a tabelului care ajut la identificarea unei nregistrri din tabel (a unei edine).
9 Identificatorul contractului (id_cont, I). Este identificatorul contractului pentru care se desfoar edina 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 edinei (data_s, D).
9 Durata edinei (timp_s, I). Este timpul n care s-a derulat edina. Se msoar n minute.
9 Costul edinei (cost_s, I). Se calculeaz ca produs ntre durat i tariful angajatului.
9 Rezumat (rez_s, C, 254). Este un rezumat scurt al edinei, care va fi tiprit pe notele
de plat ale clientului.
9 Observaii (obs_s, M). Sunt observaii despre modul n care a decurs edina. Sunt
folosite numai n interiorul companiei.
116 Informatic
Aadar, tabelul Contracte leag ntre ele toate edinele prestate pentru o consultan,
iar tabelul edine leag ntre ei clientul i angajatul care au participat la acea edin.
Pentru serviciile prestate, compania ncaseaz bani de la client. Clientul nu pltete o singur
dat valoarea final a contractului de consultan. El va face mai multe pli pe parcursul derulrii contractului. Din aceast cauz, ncasarea nu va fi nregistrat n tabelul Contracte.
Clientul nu pltete nici la fiecare edin. Din aceast cauz, ncasarea nu va fi nregistrat
nici n tabelul edine. Clientul poate s aib cu compania mai multe contracte de consultan. Din aceast cauz, ncasarea nu va fi nregistrat nici n tabelul Clieni. Va trebui creat
un tabel separat, tabelul ncasri, cu urmtoarea structur:
9 Numrul ncasrii (nr_i, I). Este un numr unic atribuit ncasrii. El este folosit ca o cheie
primar a tabelului i ajut la identificarea unei nregistrri din tabel (a unei ncasri).
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 plii (data_p, D).
9 Modul plii (mod_p, C,50). Se folosete pentru a descrie modul n care s-a fcut plata:
numerar (chitana ncasrii), ordin de plat (banc, numr), fil cec (banc, numr) etc.
9 Valoare (valoare, I). Este valoarea ncasrii i reprezint o parte din valoarea total a
consultanei.
9 Observaii (obs_i, C, 254). Sunt detalii referitoare la obiectivul plilor.
ntre aceste tabele s-au stabilit urmtoarele relaii:
Tabelul 1
Tabelul 2
Tipul relaiei
Cmpul de legtur
Judee
Angajai
Judee
Clieni
Contracte
Contracte
Contracte
Angajai
edine
Clieni
Contracte
edine
Estimri
ncasri
una-la-mai-multe
una-la-mai-multe
una-la-mai-multe
una-la-mai-multe
una-la-mai-multe
una-la-mai-multe
una-la-mai-multe
codul judeului
codul angajatului
codul judeului
codul clientului
numrul contractului
numrul contractului
numrul contractului
Angajai
Clieni
Judee
Contracte
edine
Estimri
ncasri
117
Comutatoare:
Insert - insereaz
un cmp deasupra
cmpului selectat;
Delete - terge
cmpul selectat;
Bara de stare afieaz informaii despre tabel: identificatorul tabelului, numrul de nregistrri - Records
(are valoarea 0 pentru c nu s-au introdus date), numrul de cmpuri definite - Fields (s-au definit 16) i
lungimea nregistrrii n octei - Length (reprezint suma lungimilor tuturor cmpurilor) .
Definii un index structural pentru acest tabel, cmpul de indexare fiind cmpurile
nume i prenume (nregistrrile vor fi aranjate logic n ordinea alfabetic a numelui i
118 Informatic
prenumelui; adic, atunci cnd numele este acelai, vor fi aranjate n ordinea
alfabetic a prenumelui). Executai clic pe seciunea Index.
n grila derulant scriei n caseta Name numele etichetei index: Nume. n stnga
acestei casete de text se gsete butonul cu sgeat. Sgeata indic ordinea de
aranjare: cresctor sau descresctor . Verificai ca simbolul s corespund
ordonrii cresctoare. Dac este necesar, schimbai ordinea executnd clic pe buton.
Putei alege din lista ascuns Type tipul de index: Primary, Candidate, Unique sau
Regular (cheia obinuit). Alegei pentru acest index valoarea Regular.
Comutatoare:
Insert - insereaz un
index deasupra indexului
selectat;
Delete - terge indexul
selectat;
119
120 Informatic
Aflai cum se numete cmpul din poziia 10 folosind funcia (rspunsul este cp):
?field(10)
Aflai ce dimensiune are nregistrarea folosind funcia (rspunsul este 126):
?recsize()
nchidei tabelul folosind comanda use.
121
nu
eof() =.F.
sfrit
da
<prelucrare>
continue
nu
found() =.T.
sfrit
da
<prelucrare>
continue
5
?bof()
.F.
skip-1
?bof()
.T.
122 Informatic
goto 3
?recno()
3
goto bottom
?recno()
5
goto top
?recno()
1
skip 2*3
?recno()
6
?eof()
.T.
skip 2
End of file
encountered
?recno()
6
skip -7
?recno()
1
skip -10
Beginning of file encountered
?recno()
1
nchidei fereastra de editare. Observai n fereastra Command comenzile corespunztoare aciunilor executate:
skip
go bottom
go 2
Folosii pentru poziionare comenzile locate i continue. Urmrii efectul lor observnd informaiile afiate n bara de stare.
locate for id_ang=100
(Se caut angajatul cu codul 100.)
? nume, pren, adresa, loc
(Se afieaz numele, prenumele, adresa i localitatea angajatului.)
Popescu Andrei Str. Morilor nr. 50 sector 2 Bucureti
continue
(Se continu cutarea angajatului cu codul 100.)
End of locate scope
(Nu s-a mai gsit un angajat cu codul 100.)
? found()
(Se testeaz dac s-a mai gsit o nregistrare.)
.F
(Nu s-a mai gsit un angajat cu codul 100.)
locate for id_sup=100
(Se caut angajaii care au ca superior angajatul cu codul 100.)
? nume, pren, adresa, loc
(Se afieaz numele, prenumele, adresa i localitatea angajatului.)
Popescu Andrei Str. Morilor nr. 50 sector 2 Bucureti
continue
(Se continu cutarea angajailor care au superiorul cu codul 100.)
? found()
(Se testeaz dac s-a mai gsit o nregistrare.)
.T.
(S-a mai gsit angajatul care are ca superior angajatul 100.)
? nume, pren, adresa, loc
(Se afieaz numele, prenumele, adresa i localitatea angajatului.)
Andronesu Ana Str. Cuza Vod nr. 20 sector 1 Bucureti
continue
(Se continu cutarea angajailor care au superiorul cu codul 100.)
? found()
(Se testeaz dac s-a mai gsit o nregistrare.)
.T.
(S-a mai gsit angajatul care are ca superior angajatul 100.)
? nume, pren, adresa, loc
(Se afieaz numele, prenumele, adresa i localitatea angajatului.)
Ionescu Maria Str. Zorilor nr. 23 sector 4 Bucureti
continue
(Se continu cutarea angajailor care au superiorul cu codul 100.)
End of locate scope
(Nu s-au mai gsit angajai subordonai angajatului 100.)
? found()
(Se testeaz dac s-a mai gsit o nregistrare.)
.F.
(Nu s-au mai gsit angajai subordonai angajatului cu codul 100.)
? eof()
(Se testeaz dac s-a ajuns la sfritul fiierului.)
123
.T.
(S-a ajuns la sfritul fiierului.)
locate for day(data_n)=day(date()) and month(date_n) = month(date())
Se caut angajatul care are data de natere astzi. Dac s-a gsit, afiai-i numele i prenumele.
locate for upper(nume)='ANDRONESCU' and upper(pren)='ANA'
Se caut angajatul care are numele Andronescu i prenumele Ana. Deoarece nu tii cu ce tip
de caractere au fost scrise numele i prenumele, le transformai n litere mari.
?tel_f, tel_m
(se afieaz numerele de telefon)
012345678 921222222
nchidei fereastra de editare. Observai n fereastra Command comenzile corespunztoare aciunilor executate:
locate all
124 Informatic
9 dintr-un alt tabel - se realizeaz fie prin intermediul opiunii de meniu Append
Records...Table, fie prin intermediul comenzii:
append from <nume_tabel> [fields <list_cmpuri>] [for <cond>]
unde <nume_tabel> este numele tabelului din care se adaug nregistrri. Implicit se
adaug toate nregistrrile i toate cmpurile din tabel, dar se poate explicita numai
adugarea anumitor cmpuri (cmpurile precizate n lista de cmpuri a clauzei fields)
i/sau numai a anumitor nregistrri (cele care ndeplinesc condiia precizat prin
expresia <cond> a clauzei for).
2. Prin inserarea n interiorul tabelului:
9 Operaia 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 cmpurilor. Explicit, inserarea se
poate face naintea nregistrrii curente, folosind clauza before, sau se poate
insera numai o nregistrare vid folosind clauza blank.
125
efectul unui comutator. Dac nregistrarea nu este marcat, o marcheaz, i invers, dac
este marcat, i anuleaz marcajul.
126 Informatic
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
:B = <val_1>,<val_2> - se verific dac dup editare cmpul aparine intervalului definit de valorile <val_1> (limita inferioar) i <val_2> (limita superioar). Cele dou valori trebuie s fie de acelai tip. n cazul n care valoarea
cmpului nu se ncadreaz ntre cele dou limite, se afieaz un mesaj de
eroare care poate fi personalizat cu opiunea :F.
:H = <nume_cmp> - numele cmpului afiat n fereastra de editare este
nlocuit cu '<nume_cmp>' de tip ir de caractere.
:W = <cond> - se va intra n operaia de editare cu cmpul respectiv numai
dac este ndeplinit condiia <cond>.
font - permite stabilirea fontului caracterelor afiate n fereastra de editare prin
nume font i dimensiune font (de exemplu, font 'arial',12).
style - permite stabilirea stilului caracterelor afiate n fereastra de editare (de
exemplu, 'b' - bold, 'u' - underline, 'i' - italic, 'o' - outline, 's' - shadow).
freeze - permite selectarea pentru editare a unui singur cmp (precizat prin
<nume_cmp>); restul cmpurilor sunt numai pentru informare.
last | noinit - fereastra este deschis cu configuraia pe care a avut-o la ultima
operaie de editare.
noappend - nu permite utilizatorului s adauge noi nregistrri n tabel.
nodelete - nu permite utilizatorului s tearg logic nregistrri din tabel.
noedit | nomodify - nu permite utilizatorului s modifice nregistrrile din tabel (numai s adauge sau s tearg).
normal - deschide fereastra de editare cu valori implicite pentru parametri (culoare, dimensiune, poziie, titlu etc.).
title - modific titlul ferestrei de editare cu numele <nume_t> de tip ir de caractere.
partition - precizeaz coloana <m> n care se mparte fereastra n dou partiii: una de
tip browse, alta de tip edit; fiecare dintre ele poate fi vzut independent.
lpartition - la deschiderea ferestrei de editare, cursorul va fi afiat n partiia din
partea stng, n primul cmp, altfel este poziionat n partea dreapt.
nolink - cele dou partiii nu sunt legate, altfel ele sunt legate, adic atunci cnd
se deruleaz coninutul unei partiii se deruleaz i coninutul celeilalte partiii.
ledit - partiia din partea stng este de tip invers fa de fereastra de editare (de
tip browse pentru fereastra edit i de tip edit pentru fereastra browse).
redit - partiia din partea dreapt este de tip invers fa de fereastra de editare (de
tip browse pentru fereastra edit i de tip edit pentru fereastra browse).
valid - valideaz valorile introduse n cmpuri (validarea se face la nivelul nregistrrii i nu la nivelul cmpului cum face opiunea V); dac este adevrat condiia
<cond_3>, se trece la urmtoarea nregistrare, altfel se rmne la nregistrarea
care se modific i se afieaz un mesaj de eroare. Mesajul de eroare poate fi personalizat cu <mesaj> (de tip ir de caractere) cu clauza error. Opiunea :f foreaz
executarea operaiei de validare chiar dac nu s-au fcut modificri n nregistrare.
when - are acelai efect ca i opiunea w, cu deosebirea c se aplic la nivelul
ntregii nregistrri, i nu numai la nivelul unui cmp.
width - limiteaz limea cmpurilor la <p> caractere; afecteaz numai formatul
de afiare din fereastr, nu i structura tabelului.
127
Adugai nregistrri:
use angajati
Se deschide tabelul Angajai care conine deja cinci nregistrri.
append
Se deschide fereastra de editare. Adugai cinci nregistrri.
use judete
Se deschide tabelul Judee care nu conine nregistrri.
append
Adugai numai nregistrarea pentru Bucureti.
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'
Executai clic pe opiunea Append Mode View (putei s adugai
nregistrri i n fereastra de editare de tip Browse). Adugai restul nregistrrilor n fereastra Browse. Verificai mesajele de eroare care
apar atunci cnd nu scriei codul judeului format din dou litere.
use angajati
Se deschide tabelul Angajai care conine zece nregistrri.
copy structure to ang
Copiai structura tabelului ntr-un tabel nou ang.
use ang
Se deschide tabelul Ang care nu conine nregistrri.
append blank (de 5 ori) Se adaug cinci nregistrri vide.
browse
n fereastra de editare sunt afiate cele 5 nregistrri vide.
128 Informatic
replace all tip_ang with 'a' Se completeaz pentru toi angajaii cmpul tip_ang cu 'a'.
goto top
Poziionai pointerul la nceputul tabelului, deoarece comanda replace all
l-a pozionat la sfritul tabelului.
replace next 3 id_sup with 300, loc with 'Buzau', c_jud with 'Bz',tel_f with '038'
Primii trei angajai sunt din Buzu i sunt subordonai aceleiai
persoane. Pentru numrul de telefon se scrie prefixul pentru Buzu.
Pointerul de nregistrare va fi poziionat pe nregistrarea 3.
skip
Salt la urmtoarea nregistrare (nregistrarea 4)
replace rest id_sup with 100, loc with 'Bucuresti', c_jud with 'B',tel_f with '01'
Ultimii doi angajai sunt din Bucureti i sunt subordonai aceleiai
persoane. Pentru numrul de telefon se scrie prefixul pentru Bucureti.
Pointerul de nregistrare va fi poziionat pe nregistrarea 5.
browse
n fereastra de editare completai cu valori restul cmpurilor.
use angajati
Se deschide tabelul Angajai.
append from ang for c_jud='B'
Se adaug din tabelul Ang la sfritul tabelului, angajaii din Bucureti.
append from ang for c_jud='Bz'
Se adaug din tabelul Ang la sfritul tabelului, angajaii din Buzu.
browse
Deschidei fereastra de editare. Observai cum s-au executat operaiile.
use clienti
Se deschide tabelul Clieni.
browse
Nu conine nici o nregistrare.
appen blank (de 6 ori)
Adugai 6 nregistrri vide.
browse
Se completeaz pentru toate nregistrrile 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 clienii de care se ocup angajaii din Bucureti
localitatea, codul judeului 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 clienii de care se ocup angajaii din Constana localitatea, codul judeului 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 clienii de care se ocup angajaii din Buzu
localitatea, codul judeului i prefixul pentru telefon i fax.
brow
Completai restul cmpurilor.
129
browse
Se afieaz modificrile fcute n fereastra de editare.
replace id_sup with 100 for id_sup=1000
Se nlocuiete n tot tabelul codul superiorului 1000 cu 100.
browse
Se afieaz modificrile fcute n fereastra de editare.
browse fields nume, pren:h='prenume', varsta= int((date()-data_n)/365)
Se afieaz n fereastra browse numai cmpurile nume, pren i varsta
(un cmp calculat). Pentru cmpul pren se afieaz eticheta prenume.
replace for id_ang=104 tip_ang with 'c'
Se modific pentru angajatul cu identificatorul 104 tipul angajatului din a n c.
replace for id_ang=302 tip_ang with 'b'
Se modific pentru angajatul cu identificatorul 104 tipul angajatului din a n b.
browse
Se afieaz modificrile fcute n fereastra de editare.
tergei nregistrri:
delete for lower(c_jud)='ct'
browse
nregistrrile din judeul Constana sunt marcate logic pentru tergere.
set deleted on
browse
nregistrrile marcate logic pentru tergere nu mai sunt afiate.
set deleted off
browse
nregistrrile marcate logic pentru tergere sunt afiate.
Poziionai cursorul pe o nregistrare marcat logic pentru tergere.
?deleted()
.T.
Poziionai cursorul pe o nregistrare care nu este marcat pentru tergere.
?deleted()
.F.
recall for lower(c_jud)='ct'
Refacei nregistrrile marcate logic pentru tergere.
delete record 1
Marcai logic pentru tergere nregistrarea 1.
set deleted on
browse
nregistrarea 1 nu este afiat n fereastra de editare.
recall record 1
Refacei nregistrarea marcat logic pentru tergere.
browse
nregistrarea 1 este afiat 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 obine informaii ntr-un timp mai scurt. Informaiile obinute 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_cmpuri>]
[<domeniu>] [for <cond_1>] [while <cond_2>]
[to printer | to file <nume_fiier>] [noconsole] [off]
Deosebirile dintre comanda list i display sunt:
129
browse
Se afieaz modificrile fcute n fereastra de editare.
replace id_sup with 100 for id_sup=1000
Se nlocuiete n tot tabelul codul superiorului 1000 cu 100.
browse
Se afieaz modificrile fcute n fereastra de editare.
browse fields nume, pren:h='prenume', varsta= int((date()-data_n)/365)
Se afieaz n fereastra browse numai cmpurile nume, pren i varsta
(un cmp calculat). Pentru cmpul pren se afieaz eticheta prenume.
replace for id_ang=104 tip_ang with 'c'
Se modific pentru angajatul cu identificatorul 104 tipul angajatului din a n c.
replace for id_ang=302 tip_ang with 'b'
Se modific pentru angajatul cu identificatorul 104 tipul angajatului din a n b.
browse
Se afieaz modificrile fcute n fereastra de editare.
tergei nregistrri:
delete for lower(c_jud)='ct'
browse
nregistrrile din judeul Constana sunt marcate logic pentru tergere.
set deleted on
browse
nregistrrile marcate logic pentru tergere nu mai sunt afiate.
set deleted off
browse
nregistrrile marcate logic pentru tergere sunt afiate.
Poziionai cursorul pe o nregistrare marcat logic pentru tergere.
?deleted()
.T.
Poziionai cursorul pe o nregistrare care nu este marcat pentru tergere.
?deleted()
.F.
recall for lower(c_jud)='ct'
Refacei nregistrrile marcate logic pentru tergere.
delete record 1
Marcai logic pentru tergere nregistrarea 1.
set deleted on
browse
nregistrarea 1 nu este afiat n fereastra de editare.
recall record 1
Refacei nregistrarea marcat logic pentru tergere.
browse
nregistrarea 1 este afiat 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 obine informaii ntr-un timp mai scurt. Informaiile obinute 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_cmpuri>]
[<domeniu>] [for <cond_1>] [while <cond_2>]
[to printer | to file <nume_fiier>] [noconsole] [off]
Deosebirile dintre comanda list i display sunt:
130 Informatic
diferene
list
display
toate nregistrrile
defilare
nu afieaz nregistrrile
terse logic
nregistrarea curent
paginat (ecran plin)
afieaz nregistrrile
terse logic
Aadar, comanda list este echivalent cu comanda display rest, iar comanda display
este echivalent cu comanda list next 1 sau list record recno().
Implicit sunt afiate pe ecran toate cmpurile, inclusiv numrul nregistrrii. Explicit se
poate afia numai un grup de nregistrri precizat prin <domeniu> sau clauzele for sau
while, numai anumite cmpuri precizate prin clauza fields, fr numrul nregistrrii
folosind clauza off, iar ieirea poate fi redirectat la imprimant sau ntr-un fiier.
2. Sintetizate - sub forma unor valori:
Se pot folosi comenzi sau funcii:
Comanda
Funcia
Efectul
count
sum
average
calculate
cnt()
furnizeaz numrul de nregistrri
sum(<expn>) furnizeaz suma unor cmpuri numerice
avg(<expn>) furnizeaz media aritmetic a unor cmpuri numerice
furnizeaz rezultatul evalurii funciilor cnt(), sum() i avg().
131
Se afieaz media aritmetic a tarifului pentru angajaii permaneni cu norm ntreag (tip 'a').
Se afieaz media aritmetic a tarifului pentru angajaii care nu
sunt permaneni cu norm ntreag (tip diferit de 'a').
Numrai nregistrri:
Prin numrarea nregistrrilor care corespund unui criteriu, putei s aflai ci angajai
ndeplinesc acel criteriu:
count for id_sup=100
count for id_sup=100 to v
?v
count for lower(c_jud)='ct'
count for tarif > 250000
Afiai liste:
n liste putei s afiai anumite cmpuri precizate prin lista de cmpuri i anumite
nregistrri precizate prin domeniu sau clauzele for sau while:
list nume, pren, data_n for month(data_n)=03
Se afieaz numele, prenumele i data naterii pentru toi angajaii nscui n
luna martie.
list for id_sup=100
Se afieaz toate cmpurile pentru angajaii subordonai angajatului cu codul 100.
list nume, pren, id_ang for id_sup=100
Se afieaz numele, prenumele i identificatorul pentru angajaii subordonai
angajatului cu codul 100.
list nume, pren, id_ang for id_sup=id_ang
Se afieaz numele, prenumele i identificatorul pentru angajaii care nu sunt
subordonai altor angajai.
display nume, pren, id_ang for id_sup=id_ang
list id_ang, nume, pren to file alfa
Lista, care conine numai cmpurile cu identificatorul angajatului, numele i
prenumele pentru toi angajaii, este copiat ntr-un fiier.
dir alfa.*
Se afieaz lista fiierelor care au numele alfa din directorul curent. Fiierul n
care s-a transferat lista are extensia .txt.
type alfa.txt
Se afiez coninutul fiierului alfa.txt care conine lista.
132 Informatic
list
display all
recall for lower(c_jud)='ct'
4 . 5 . S o r t a r e a t a b e l u lu i
n urma sortrii unui tabel se creeaz un alt tabel n care nregistrrile sunt rearanjate
conform criteriului de sortare folosit. Operaia acioneaz asupra tabelului deschis.
Sintaxa comenzii este:
sort to <nume_tabel> on <cmp_1> [/a | /d] [ /c] [, <cmp_1> [/a | /d] [ /c].... ]
[ascending | descending] [<domeniu>] [for <cond_1>] [while <cond_2>]
[fields <list_cmpuri>]
Forma implicit a comenzii este:
sort to <nume_tabel> on <cmp>
133
unde <nume_tabel> este numele tabelului obinut n urma sortrii tuturor nregistrrilor din
tabelul deschis, iar <cmp> este numele cmpului folosit pentru cheia de sortare. Sortarea
se face n ordinea cresctoare a cmpului cheie de sortare. Tabelul sortat va avea aceeai
structur ca i tabelul surs. Explicit, se pot sorta din tabelul surs numai nregistrrile
precizate prin <domeniu> sau clauzele for sau while i pot fi folosite mai multe chei de
sortare <cmp_1>, <cmp_2> etc. Sortarea se poate face descresctor, dup toat lista de
cmpuri cheie de sortare folosind clauza descending, sau poate fi controlat ordinea de
sortare la nivelul fiecrui cmp, folosind adverbele /a - cresctor, /d - descresctor sau /c fr s se in cont de diferena dintre literele mari sau mici. Tabelul sortat poate s conin
numai cmpurile 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 nct s avei
acces direct la o nregistrare n funcie de valoarea unui cmp sau a unor cmpuri care
vor forma cheia de acces. Soluia este de ordonare logic a nregistrrilor prin intermediul fiierelor index, iar cheia de acces se mai numete cheie de indexare.
Visual FoxPro permite crearea a dou tipuri de fiiere de index pe lng indexul structural:
9 index simplu care conine o singur cheie de indexare ntr-un fiier (numele diferit
de al tabelului i extensia idx),
9 index compus care conine mai multe chei de indexare (etichete index) ntr-un
fiier (numele diferit de al tabelului i extensia cdx).
Cheia de indexare poate fi format dintr-un singur cmp sau din mai multe cmpuri legate
printr-o expresie de concatenare. Din aceast cauz, dac nu sunt de tip ir de caractere,
cmpurile trebuie convertite ntr-un ir de caractere cu ajutorul funciilor de conversie. Am
notat cp1 - cmpul 1, cp2 - cmpul 2 i e(cp1,cp2) - expresia format din cele dou cmpuri.
tip cp1
C
C
C
C
N
N
N
D
D
T
tip cp2
C
N
D
T
N
D
T
D
T
T
cp1 convertit
cp1
cp1
cp1
cp1
str(cp1)
str(cp1)
str(cp1)
dtos(cp2)
dtos(cp2)
ttoc(cp2)
cp2 convertit
cp2
str(cp2)
dtos(cp2)
ttoc(cp2)
str(cp2)
dtos(cp2)
ttoc(cp2)
dtos(cp2)
ttoc(cp2)
ttoc(cp2)
e(cp1,cp2)
cp1+cp2
cp1+ str(cp2)
cp1+ dtos(cp2)
cp1+ ttoc(cp2)
str(cp1)+ str(cp2)
str(cp1)+ dtos(cp2)
str(cp1)+ ttoc(cp2)
dtos(cp1)+ dtos(cp2)
dtos(cp1)+ ttoc(cp2)
ttoc(cp1)+ ttoc(cp2)
134 Informatic
Forma implicit a comenzii este:
9 pentru indexul simplu:
index on <expresie_index> to <nume_fiier.idx>
9 pentru indexul compus:
index on <expresie_index> tag <nume_etichet> of <nume_fiier.cdx>
Implicit, se ordoneaz cresctor toate nregistrrile din tabel, iar la crearea noului index
toate celelalte fiiere index asociate tabelului sunt nchise (cu excepia indexului structural).
Explicit, prin fiierul index putei avea acces numai la nregistrrile precizate cu clauza for,
ordonarea logic poate fi cresctoare (ascending) sau descresctoare (descending) i se
pot pstra deschise fiierele index deschise anterior (folosind clauza additive).
135
Funcia testeaz dac exist o nregistrare care are cheia de indexare egal cu expresia
<expresie>. Dac o gsete, poziioneaz pointerul pe aceast nregistrare i furnizeaz
valoarea .T., altfel poziioneaz pointerul la sfritul fiierului i furnizeaz valoarea .F..
Sortai tabele:
Deschidei tabelul Angajai. Sortai acest tabel dup urmtoarele criterii:
use angajati
Se deschide tabelul Angajai.
browse
Se afieaz coninutul tabelului n fereastra de editare.
sort on nume, pren to a1
Se sorteaz tabelul dup cmpurile nume i pren. Rezultatul sortrii este n tabelul a1.
sort on id_ang to a2
Se sorteaz tabelul dup cmpul id_ang. Rezultatul sortrii este n tabelul a2.
sort on id_sup to a3
Se sorteaz tabelul dup cmpul id_sup. Rezultatul sortrii este n tabelul a3.
sort on loc, id_ang to a4
Se sorteaz tabelul dup cmpurile loc i id_ang. Rezultatul sortrii este n tabelul a4.
use a1
Se deschide tabelul a1.
list nume, pren, id_ang, id_sup, loc
browse
nregistrrile sunt aranjate alfabetic dup valoarea cmpurilor nume i pren. Pentru
acelai nume, sunt ordonate alfabetic dup prenume.
use a2
Se deschide tabelul a2.
list nume, pren, id_ang, id_sup, loc
browse
nregistrrile sunt aranjate cresctor dup valoarea cmpului id_ang.
use a3
Se deschide tabelul a3.
list nume, pren, id_ang, id_sup, loc
browse
nregistrrile sunt aranjate cresctor dup valoarea cmpului id_ang.
use a4
Se deschide tabelul a4.
list nume, pren, id_ang, id_sup, loc
browse
nregistrrile sunt aranjate alfabetic dup localitate. Pentru aceeai localitate, sunt
aranjate n ordinea cresctoare a identificatorului de angajat.
Indexai tabele:
use judete
S-a deschis tabelul Judee.
modify structure
n caseta de dialog Table Designer, deschidei seciunea Index. Observai 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. Conine o singur etichet cod, iar cheia de indexare a
etichetei este cmpul c_jud (codul judeului).
modify structure
n caseta de dialog Table Designer, deschidei seciunea Index. Observai c indexul
definit este de tip Regular. Schimbai tipul n Candidate.
list
nregistrrile sunt afiate n ordinea alfabetic a codului judeului.
browse
n fereastra de editare, nregistrrile sunt afiate n ordinea alfabetic a
codului judeului.
seek 'ct'
Caut nregistrarea pentru care codul judeului este ct.
?iif (found(),n_jud, 'nu a gasit')
136 Informatic
Constanta
S-a gsit nregistrarea.
?iif(seek('bz'),n_jud,'nu a gasit')
Buzau
S-a gsit nregistrarea.
use angajati
S-a deschis tabelul Angajai.
browse
nregistrrile sunt afiate n ordinea n care le-ai creat.
modify structure
n caseta de dialog Table Designer, deschidei seciunea Index. Observai c pentru acest
tabel este definit deja de la creare indexul nume care are cheia determinat de expresia
nume+pren. Definii un nou index cu numele cod, de tip Candidate i cu expresia de
indexare id_ang. Mutai acest index pe prima poziie n list. Definii un nou index cu numele
data, de tip Regular i cu expresia de indexare dtos(data_n)+ dtos(data_a).
set order to tag cod
Ordinea de indexare este dat de eticheta cod.
browse
Observai ordinea n care sunt afiate nregistrrile.
list id_ang, nume, pren
set order to tag nume
Ordinea de indexare este dat de eticheta cod.
list id_ang, nume, pren
browse
Observai ordinea n care sunt afiate nregistrrile.
ncercai:
Completai:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
137
138 Informatic
139
Start
Open (baza de date)
Open (tabele)
Prelucrare
1. Interactiv:
Alegei opiunea New...File i n caseta de dialog New activai
Stop
butonul radio Database din lista File Type i executai clic pe
controlul New File. Se deschide caseta de dialog Create n care scriei numele bazei de
date n caseta de text Enter i apoi executai clic pe declanatorul Save. Se deschide
fereastra generatorului de baze de date Database Designer, n care putei vedea
arhitectura bazei de date: tabele i relaii ntre tabele. Iniial ea afieaz containerul gol al
bazei de date nou create.
2. Prin comanda:
create database <nume_baz_de_date>
Comanda creeaz baza de date i o deschide. Deschidei apoi fereastra Database
Designer cu comanda:
modify database
140 Informatic
5.1.4. Obinerea informaiilor despre baza de date deschis
Putei folosi comenzile:
list | display databases
Afieaz numele bazei de date, identificatorul cii de director n care se gsete fiierul,
versiunea i lista tabelelor mpreun cu cmpurile lor.
list | display tables
Afieaz pe dou coloane lista tabelelor din baza de date: n coloana Name - numele
tabelului, iar n coloana Source identificatorul fiierului n care se gsete tabelul.
141
se vor nchide toate bazele de date deschise, toate tabelele ncorporate n bazele de date
sau libere i toate fiierele asociate exploatrii bazelor de date care erau deschise n acel
moment.
142 Informatic
Operaiile care se pot executa n zonele de lucru sunt:
9 n zona activ se poate citi din tabel i se poate scrie n tabel.
9 n celelalte zone se poate numai citi din tabel.
Identificarea tabelelor se face astfel:
9 n zona activ, numele tabelului se subnelege (este implicit n comenzi).
9 n celelalte zone, prin aliasul su sau prin numele zonei.
Identificarea cmpurilor dintr-un tabel se face astfel:
9 n zona activ prin numele cmpului.
9 n celelalte zone prin identificatorul <alias>.<nume_cmp> sau <alias>-><nume_cmp>.
Putei s obinei informaii despre zonele de lucru i tabelele deschise n aceste zone cu
funciile:
9 select([1]) furnizeaz implicit numrul zonei de lucru active; dac folosii parametrul 1,
va furniza numrul ultimei zone de lucru nefolosite.
9 used([<zona>]) furnizeaz un rezultat logic prin care se precizeaz dac zona este
ocupat (.T.) sau liber (.F.). Implicit, rezultatul funciei se refer la zona curent,
explicit, se refer la zona precizat prin parametrul <zona>.
9 used(<nume_tabel>) furnizeaz un rezultat logic prin care se precizeaz dac tabelul
este deschis ntr-o zon de lucru (.T.) sau nu (.F.).
9 dbf([<zona>]) furnizeaz un rezultat de tip ir de caractere care poate conine numele
fiierului deschis n zona de lucru sau irul vid, dac nu este deschis nici un fiier.
Implicit, rezultatul funciei se refer la zona curent, explicit, se refer la zona
precizat prin parametrul <zona>.
9 alias([<zona>]) furnizeaz un rezultat de tip ir de caractere care poate conine aliasul
fiierului deschis n zona de lucru sau irul vid, dac nu este deschis nici un fiier.
Implicit, rezultatul funciei se refer la zona curent, explicit, se refer la zona
precizat prin parametrul <zona>.
nchiderea unui tabel se face cu comanda:
use [in <zona>]
Implicit, se nchide tabelul din zona curent, explicit, se nchide tabelul din zona precizat
cu clauza in.
Tabelul mai poate fi nchis i cu comanda de nchidere a bazei de date (close
databases) sau comanda de nchidere a tuturor fiierelor (close all).
143
Deschidei pe rnd toate tabelele din baza de date: fie executai dublu clic n fereastra
Database Designer pe fiecare tabel pentru a deschide fereastra de editare a tabelului i
implicit tabelul, fie n fereastra View executai clic pe declanatorul Open i n caseta de
144 Informatic
dialog Open executai clic pe rnd pe numele fiecrui tabel din lista Tables in Database.
Deschidei pe rnd, ncepnd cu zona 1 i terminnd cu zona 5 tabelele: Customer,
Products, Orditems, Orders i Employee.
Dup ce ai deschis tabelele, ele vor fi afiate n fereastra View. Selectai pe rnd fiecare
tabel din list. n bara de stare a ferestrei vor fi afiate informaii despre tabelul selectat:
numrul zonei de lucru i numrul total de nregistrri. nchidei fereastra de comenzi.
Obinei informaii despre tabelele deschise:
select 1
?used()
.T.
?used(5)
.T.
?used(10)
.F.
?used('orders')
.T.
?dbf(3)
c:\vfp\samples\data\orditems.dbf
?alias(3)
orditems
?dbf(10)
nimic
?alias(10)
nimic
Observaie: Tabelele din baza de date trebuie s conin urmtoarele chei, astfel nct
s putei stabili legturi ntre ele:
9 Tabelul Angajai - cmpul id_ang cheie primar; cmpul cheie c_jud se va declara de
tipul regular deoarece un tabel nu poate avea dect o cheie primar.
9 Tabelul Clieni - cmpul id_cl cheie primar; cmpul cheie c_jud se va declara de tipul
regular deoarece un tabel nu poate avea dect o cheie primar.
9 Tabelul Contracte - cmpul id_cont cheie primar; cmpul cheie id_cl de tipul regular.
9 Tabelul edine - cmpul nr_s cheie primar; cmpurile cheie id_ang i id_cont se
vor declara de tipul regular.
9 Tabelul Estimri - cmpul id_cont cheie de tipul regular.
9 Tabelul ncasri - cmpul nr_i cheie primar; cmpul cheie id_cont de tipul regular.
9 Tabelul Judee - cmpul c_jud se va declara de tipul cheie primar.
Adugai la baza de date tabelele libere create fie folosind opiunea de meniu, fie cu
butonul din bara de instrumente, fie cu comenzile:
add table angajati
add table clienti
add table judete
145
display database
Se vor afia numele bazei de date, calea fiierului baz de date, versiunea i, pentru
fiecare tabel adugat la baza de date, numele, calea fiierului i structura de cmpuri.
146 Informatic
147
Deoarece tabelele din baza de date trebuie gestionate mpreun, trebuie asigurat integritatea referenial. Definii pentru fiecare relaie regula de integritate referenial astfel:
n fereastra Database Designer executai dublu clic pe o relaie. Se deschide caseta de
dialog Edit Relationship n care executai clic pe declanatorul Referential Integrity....
Se deschide caseta de dialog Referential Integrity Builder care conine trei seciuni:
ncercai:
Visual FoxPro v permite crearea unor relaii permanente ntre tabelele bazei de date.
La o baz de date nu putei aduga tabele libere.
Dac nchidei o baz de date, se nchid automat i tabelele pe care le conine.
Dac deschidei un tabel dintr-o baz de date, se deschide automat i baza de date.
Nu putei ndeprta un tabel dintr-o baz de date.
Completai:
1. Putei vedea arhitectura bazei de date n fereastra ..........................
2. Putei verifica integritatea bazei de date cu comanda ............................
3. Dac ai deschis mai multe baze de date, putei activa o baz de date cu comanda
..............................................
4. Putei nchide o baz de date cu comanda ....................................
5. Putei s deschidei fereastra Database Designer pentru o baz de date deschis cu
comanda ..............................
Alegei rspunsul corect:
1. Adugai un tabel liber la o baz de date cu comanda:
a) add table
b) new table
2. Adugai un tabel nou la o baz de date cu comanda:
a) add table
b) new table
3. Stabilii zona de lucru activ cu comanda:
a) open
b) select
4. Aflai dac un tabel este deschis cu funcia:
a) dbf()
b) used()
5. Aflai numrul zonei de lucru active cu funcia:
a) select()
b) used()
c) create table
c) create
c) alias
c) alias()
c) alias()
Rspundei:
1. Care sunt etapele de creare a unei baze de date?
2. Prin ce metode putei vedea arhitectura bazei de date?
R spunsuri:
149
6.1. Interogrile
Interogarea este operaia prin care extragei date din baza de date fr s le tergei sau
s le modificai i pe care le afiai ntr-un anumit format. Extragerea se face n funcie de
un anumit criteriu numit criteriu de interogare. Acesta trebuie s defineasc datele pe
care vrei s le extragei: numele cmpurilor, tabelele din care fac parte, criteriile prin care
se extrag nregistrrile i n ce ordine sunt pezentate. Interogarea este scopul bazei de
date. Cnd un utilizator interogheaz baza de date, el pune de fapt o ntrebare: Ce date
din baza de date ndeplinesc aceste condiii?". Folosind o interogare putei:
9 s combinai nregistrri din mai multe tabele ntr-un singur tabel,
9 s selectai numai nregistrrile care ndeplinesc un anumit criteriu,
9 s afiai nregistrrile n ordinea dorit,
9 s afiai cmpuri calculate.
Interogrile pot afia nregistrri din mai multe tabele. Dac relaia dintre cele dou tabele
este de una-la-mai-multe, interogarea va afia pe mai multe rnduri cmpurile corespunztoare nregistrrilor din al doilea tabel (mai-multe) legate de o singur nregistrare din
primul tabel (una), iar n aceste rnduri se vor repeta cmpurile din primul tabel.
150 Informatic
Pentru operaia de interogare, orice sistem de gestiune a bazelor de date are implementate 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 putei crea o interogare:
9 interactiv folosind generatorul de interogri (Query Designer);
1
9 prin limbajul de comand SQL (instruciunea select ).
n urma operaiei de creare, interogarea este salvat ntr-un fiier cu extensia .qpr care
conine specificaiile criteriului de interogare. Acest fiier este un fiier de tip ASCII n care
se memoreaz comanda SQL asociat. Deoarece fiierul conine o comand SQL, pentru
a o executa trebuie s lansai n execuie fiierul cu comanda:
do <nume_fiier>.qpr
Ai vzut c operatorul relaional select aplicat pe un tabel creeaz un alt tabel care conine submulimi de date din tabelul surs. Aadar i rezultatul unei interogri va fi tot un
tabel, care va conine datele specificate de criteriul de interogare. Destinaia interogrii
(destinaia datelor din tabelul obinut) poate fi:
9 fereastra de editare Browse,
9 diagrama (graph),
9 ecranul (screen),
9 raportul (report),
9 tabelul permanent (table) sau temporar (cursor).
Aadar, interogarea se aplic pe mai multe tabele ale bazei de date numite tabele surs,
iar rezultatul unei interogri este un tabel numit tabel destinaie; modificrile fcute n
tabelul destinaie nu se reflect i n tabelele surs.
Parametrii folosii n construirea unei interogri sunt:
9 Cmpurile (fields) din tabelele bazei de date (tabelele surs). Se recomand s se
preia din tabelele surs numai cmpurile strict necesare.
9 Legtura (join) dintre tabelele bazei de date (tabelele surs). Pe lng legturile
stabilite ntre tabele n cadrul bazei de date, care vor fi preluate automat, se mai pot
stabili noi legturi cu tabele care nu au fost legate la baza de date. Dac definii dou
legturi ntre tabele, le putei lega cu operatorii logici or sau and.
9 Filtrul (filter) prin care se precizeaz condiiile de filtrare, adic modul n care vor fi
selectate datele din tabelele bazei de date. Un criteriu de selecie sau de filtrare
trebuie s precizeze cmpul sau expresia care conine cmpul, operatorul relaional 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 rezultatele interogrii (n tabelul destinaie). Ordinea este dat de un criteriu de ordonare
determinat de un cmp din tabel sau de mai multe criterii de ordonare determinate de
mai multe cmpuri. n acest caz, un criteriu de ordonare este luat n consideraie numai
dac cele definite anterior au aceeai valoare a cmpurilor pentru dou nregistrri.
Este diferit de comanda select folosit pentru selectarea unei zone de lucru.
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 cmpuri ale
tabelului. Conform acestei chei, nregistrrile care au aceeai valoare a cheii de
grupare vor fi cumulate n tabelul destinaie ntr-o singur nregistrare, n care fiecare
cmp numeric va fi calculat prin nsumarea valorilor corespunztoare cmpului din
toate nregistrrile grupului. Mai pot fi definite i criterii de selecie la nivel de grup
prin care se precizeaz condiia pe care trebuie s o ndeplineasc grupul de nregistrri pentru a face parte din tabelul destinaie. Condiia este precizat prin cmpul
sau expresia care conine cmpul, operatorul relaional i valoarea cu care se compar.
6.2. Vizualizrile
Vizualizrile sunt tabele virtuale, construite pe baza datelor din tabelele bazei de date, care
pot fi legate prin relaii i care permit modificarea lor de ctre utilizator. Aadar, dac n
cazul unei interogri utilizatorul poate vedea numai un rezultat, n cazul vizualizrii
utilizatorul poate interveni i poate modifica valoarea datelor. Orice modificare fcut ntr-o
vizualizare se va regsi i n tabelul real al bazei de date. Cnd se creeaz o vizualizare, se
pune de fapt ntrebarea: Cu ce date din baza de date poate interaciona utilizatorul?".
Construirea unei vizualizri const, ca i n cazul unei interogri, n extragerea anumitor
date din baza de date, pe baza unui criteriu. Rezultatul va fi memorat n fiierul bazei de
date (.dbc). De aceea, pentru a folosi o vizualizare, trebuie deschis mai nti baza de
date i apoi vizualizarea, ca orice tabel din baza de date.
Aadar, vizualizarea este o structur de date, la fel ca i tabelele bazei de date, iar
interogarea este un fiier care conine o comand i care trebuie lansat n execuie
la fel ca orice fiier de program.
Dac n cazul interogrilor datele circul ntr-un singur sens, de la tabelele bazei de date
la formatul ales pentru afiare, n cazul vizualizrilor ele pot circula n ambele sensuri
ntre tabelele bazei de date i vizualizare.
Vizualizrile se pot construi cu constructorul de vizualizri (View Designer).
Vizualizarea folosete, pe lng parametrii ntlnii la interogri, urmtorii parametri:
9 Cmpurile cheie. Aceste cmpuri sunt alese astfel nct s identifice unic relaia
dintre vizualizare i tabelele surs. Pentru fiecare tabel surs trebuie s se defineasc
unul sau mai multe cmpuri cheie care s identifice unic fiecare nregistrare din acel
tabel.
9 Cmpurile actualizate i cmpurile neactualizate. Acest parametru stabilete
modul n care se transmit datele ntre vizualizare i tabelele surs. Astfel, dac n
vizualizare se face modificarea ntr-un cmp actualizat, modificarea va fi transmis i
n tabelele surs, altfel, dac modificarea se face ntr-un cmp nemodificat, ea nu se
va transmite i ctre tabelele surs.
6.3. Rapoartele
Raportul este o colecie de informaii obinute din datele stocate n tabelele bazei de date,
prezentate utilizatorului ntr-o form ct mai clar i mai concis. El poate fi tiprit la
152 Informatic
imprimant sau afiat 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 afiat
deasupra coloanelor, cmpurile din coloane, la care pot fi adugate i alte texte sau
imagini grafice (linii, chenare, imagini bitmap sau vectoriale etc.). Raportul nu modific
datele din tabele. El parcurge secvenial nregistrrile din tabele pentru:
9 obinerea unor date sintetice: subtotaluri i totaluri,
9 obinerea unor rezumate,
9 gruparea datelor pe mai multe niveluri, fiecare nivel cu propriile sale informaii
sintetice i rezumate,
9 analize complexe i grafice.
n general, raportul este conceput sub forma unui tabel. n plus are i funcia de sortare i
grupare a datelor. Raportul se compune din:
9 Seciunea de date (Detail) conine date care se repet pentru fiecare nregistrare.
9 Antetul paginii (Page Header) definete elementele care trebuie s apar n partea
de sus a fiecrei pagini a raportului.
9 Subsolul paginii (Page Footer) definete elementele care trebuie s apar n partea
de jos a fiecrei 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 conine 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 seciuni ale raportului.
9 Grupul (Group). Un raport poate prezenta coninutul 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 cmpuri, adic date n
care sunt cumulate valorile aceluiai cmp pentru ntreg grupul de nregistrri. 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, numrul de grupuri va fi egal cu numrul de
valori diferite ale cheii de grupare.
9 Antetul grupului (Group Header) afieaz un titlu al grupului (criteriul de grupare).
9 Subsolul grupului (Group Footer) afieaz date sintetice despre grup.
Raportul conine informaii utile personalului care are atribuii de conducere n cadrul
organizaiei. n funcie de nivelul de conducere pentru care se produce raportul,
cantitatea de date prezentat difer. La nivelul inferior de conducere, nivelul operaional,
la care personalul de conducere are rolul de a monitoriza i a controla activitile zilnice
ale angajailor, rapoartele trebuie s fie detaliate i s conin informaii specifice despre
activitile zilnice (de exemplu rapoartele de ncasri).
La nivelul mediu de conducere (director tehnic, director de vnzri, director de resurse
umane etc.) ele trebuie s conin mai puine 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 operaiile i s implementeze strategii care trebuie s fie bine formulate i
argumentate. De exemplu, aceste rapoarte pot prezenta un rezumat al activitilor
(ncasrile rezultate din contractele de consultan cu un client, ncasrile rezultate
153
Creai o interogare
Interogarea trebuie s rspund la urmtoarea ntrebare: Ce angajai (identificai prin
nume, prenume i numele judeului) au tariful cuprins ntre 260.000 i 300.000?". Afiarea
se va face ntr-o fereastr de editare Browse.
Fiierul n care vei salva interogarea va fi a1.qry.
Deschidei baza de date Compania cu
comanda: open database compania.
Alegei opiunea NewFile. Se deschide caseta de dialog New n care din grupul de butoane
cu opiuni File Type activai butonul Query
dup care executai clic pe butonul New File.
Se deschide caseta de dialog Add Table or
View. Din lista Tables in Database selectai
mai nti tabelul Angajai i executai clic pe
butonul Add Table din bara de instrumente
Query Designer, apoi selectai tabelul Judee
i executai clic pe butonul Add Table.
Se deschide fereastra generatorului de interogri Query Designer. n partea
superioar este afiat un panou care conine 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 afiate cmpurile i indecii tabelului. Dac ntre
tabele exist legturi, sunt afiate i acestea. Pe lng aceste legturi definite deja n
baza de date, putei crea noi legturi fie glisnd un cmp index de la tabelul surs la
tabelul destinaie, fie prin intermediul obiectelor din caseta de dialog Join Condition pe
care o deschidei executnd dublu clic pe butonul Add Join din bara de instrumente
Query Designer. n partea inferioar este afiat un panou cu mai multe seciuni:
9 Selection Criteria - conine controale pentru a stabili criteriul de selectare a
nregistrrilor. Criteriul poate conine anumite valori ale unui cmp i condiii
pentru legturile temporare dintre tabele.
9 Fields - conine controale pentru a stabili cmpurile din tabel sau cmpurile
calculate care vor fi afiate de interogare.
9 Order By - conine controale pentru a stabili cmpurile din tabel sau cmpurile
calculate care vor determina ordinea de afiare n interogare.
9 Group By - conine controale pentru a stabili modul n care vor fi grupate
nregistrrile afiate de interogare.
Deschidei seciunea Fields. n lista Available Fields sunt afiate cmpurile disponibile n tabelele selectate. Selectai din aceast list grupul de cmpuri Angajai.nume,
Angajai.pren, Angajai.tarif i Judee.n_jud (executai clic pe numele cmpului cu
tasta Ctrl apsat). Executai apoi clic pe declanatorul Add>. Cmpurile selectate
vor fi copiate n lista cu cmpurile selectate pentru a fi afiate - Selected Output. n
seciune mai putei folosi urmtoarele controale: butoanele Add All>> (copiaz toate
cmpurile din tabele n lista Selected Output), <Remove (nltur cmpul selectat),
i <<Remove All (nltur toate cmpurile din lista Selected Output) precum i
caseta combinat Functions/Expressions prin care putei defini cmpurile calculate.
Bara de instrumente Query Designer conine urmtoarele butoane:
1 Add Table
2 Remove Table
3 Add Join
4 Show the SQL
Window
5 Maximize the
table Window
6 Query
Destination
155
260000. Executai din nou clic pe declanatorul Insert, alegei din lista Field Name
din nou numele cmpului Angajai.tarif, din lista Criteria operatorul Less Than i
scriei n caseta de text Example valoarea 300000. Cele dou condiii au fost
adugate n gril. Condiiile sunt legate implicit prin operatorul logic and. Dac
trebuie schimbat operatorul logic and cu or se execut clic pe declanatorul Add Or.
Dac vrei s schimbai ordinea n care sunt afiate condiiile n gril selectai condiia
pe care vrei s o mutai i executai clic pe butonul (Mover Box). Dac vrei s
nlturai o condiie, o selectai n gril i executai clic pe declanatorul Remove.
condiia pentru
legtura dintre tabele
butonul
Condition
lista cmpurilor
din interogare
Deschidei seciunea Order By pentru a stabili ordinea n care vor fi afiate nregistrrile. Selectai, din lista Selected Output care afieaz cmpurile din interogare,
cmpurile Angajai.nume i Angajai.pren dup care acionai declanatorul Add>. Cmpurile vor fi adugate n lista Ordering Criteria. n grupul de butoane radio Order
Options este activat butonul Ascending (ordinea alfabetic a numelui i prenumelui). Ordinea cmpurilor din cheia de sortare este Angajai.nume i Angaja1i.pren,
adic ordinea din lista Ordering Criteria (ordinea este dat de ordinea de adugare
la aceast list). Dac vrei s nlturai un criteriu de sortare, l selectai n lista
Ordering Criteria i acionai declanatorul <Remove.
Deschidei seciunea Group By numai pentru a identifica controalele, deoarece
interogarea nu conine grupuri de nregistrri. n seciune sunt dou liste Available
Fields (cmpurile disponibile) din care putei selecta cmpul folosit pentru cheia de
grupare, lista Group By Fields n care vor fi afiate cheile de grupare, declanatoarele Add> i <Remove cu care putei aduga sau nltura chei de grupare. Prin
acionarea declanatorului Having... se deschide caseta de dialog Having prin
intermediul creia putei stabili criterii de selecie la nivelul unui grup.
156 Informatic
Modificai interogarea astfel nct rezultatul s fie afiat pe ecran. Deschidei interogarea pentru modificare, fie cu opiunea OpenFile, fie cu comanda:
modify query c:\vfp\a1.qpr
Se deschide fereastra generatorului de interogri Query Designer. Executai clic pe
butonul Query Destination din bara de instrumente. Se deschide caseta de dialog
Query Destination n care executai clic pe butonul Screen. Vizualizai comanda
SQL asociat acestei interogri. Executai clic pe butonul Show the SQL Window
din bara de instrumente. Se deschide fereastra de editare care afieaz comanda
SQL, la care observai c a fost adugat opiunea to screen. nchidei fereastra de
editare a comenzii. nchidei fereastra generatorului cu salvare.
Afiai rezultatul interogrii cu comanda:
do a1.qri
157
nchidei fereastra de editare. Afiai din nou rezultatul interogrii. Observai modificrile aprute n fereastra Browse.
nchidei interogarea i baza de date cu comanda close all.
Creai o vizualizare
Vizualizarea trebuie s rspund la urmtoarea ntrebare: Cu ce date din baza de date
poate interaciona utilizatorul pentru angajaii (identificai prin nume, prenume, vrst i
numele judeului) care au tariful cuprins ntre 260.000 i 300.000?". Utilizatorului i se va
permite s interacioneze doar cu cmpul tarif.
Deschidei baza de date Compania.
Alegei opiunea NewFile. Se deschide caseta de dialog New n care din grupul de
butoane cu opiuni File Type activai butonul View, dup care executai clic pe
butonul New File.
Se deschide caseta de dialog Add Table or View. Din acest moment vei urma
aceiai pai pe care i-ai executat atunci cnd ai creat o interogare. Bara de
instrumente View Designer conine primele cinci butoane din bara Query Designer.
Fereastra generatorului de vizualizri conine n plus seciunea Update Criteria. Prin
intermediul controalelor din aceast seciune putei stabili cmpurile cheie (cmpurile
care realizeaz legtura ntre vizualizare i tabelele surs) i cmpurile actualizate
(cmpurile a cror modificare se transmite i ctre tabelele surs). Deschidei aceast
seciune pentru a stabili parametrii vizualizrii. Lista Field Name conine lista cmpurilor din vizualizare disponibile pentru actualizare, din tabelul Angajai. Se stabilesc mai
nti cmpurile cheie (care vor identifica unic relaia vizualizare-tabel surs). Aceste
158 Informatic
cmpuri sunt nume i pren. Se selecteaz fiecare dintre aceste cmpuri i se activeaz
comutatorul pentru cmpul cheie. Se pot stabili acum cmpurile care pot fi actualizate
(ele nu pot fi cmpuri cheie). Singurul cmp care a mai rmas este cmpul tarif. l vom
marca pentru actualizare fie executnd clic pe comutatorul de actualizare din dreptul
su din lista Field Name, fie executnd clic pe declanatorul Update All. Actualizarea
cmpului marcat se poate face n dou moduri, pe care le stabilii cu butoanele radio
Update using: prin tergerea vechilor nregistrri i reinserarea celor modificate (SQL
DELETE then INSERT) sau prin scrierea modificrilor direct n nregistrare (SQL
UPDATE). Activai butonul radio SQL UPDATE. Activai comutatorul Send SQL
updates (dac vrei ca aceste actualizri s se i realizeze). Salvai vizualizarea sub
numele a1.
Deschidei vizualizarea (ca pe un tabel cu comanda use).
Afiai vizualizarea n fereastra de editare Browse (cu comanda browse). Facei
modificri n cmpurile vizualizrii.
coloana de comutatoare
pentru cmpuri actualizate
coloana de comutatoare
pentru cmpuri cheie
Deschidei tabelul Angajai. Afiai coninutul acestui tabel ntr-o fereastr browse.
Observai ce modificri fcute n vizualizare se regsesc n tabel.
nchidei baza de date.
Creai un raport
Se construiete un raport n care se prezint situaia ncasrilor cu subtotaluri pentru
fiecare contract.
Deschidei baza de date Compania.
Alegei opiunea NewFile. Se deschide caseta de dialog New n care, din grupul de
butoane cu opiuni File Type, activai butonul Report, dup care executai clic pe
butonul New File. Se deschide fereastra generatorului de rapoarte care este
159
mprit n mai multe benzi, fiecare band reprezentnd o zon din raport. Putei
modifica dimensiunea unei zone pe vertical, glisnd bara delimitatoare a zonei.
Definii mediul de date al raportului (tabelele din care preia datele). Alegei opiunea
Data Environment...View. Se deschide fereastra care este vid.
Alegei opiunea Add... Data Environment. Se deschide caseta de dialog Add
Table or View. Alegei din list tabelul ncasri. Reluai operaia i alegei din list
tabelul Contracte. Tabelele i relaia dintre ele vor fi adugate n fereastr.
Adugai n fereastra generatorului de rapoarte benzile pentru antetul i subsolul
raportului. Alegei opiunea Title/Summary... Report. Se deschide caseta de dialog
Title/Summary n care activai comutatorul Title band pentru antetul raportului i
comutatorul Summary band pentru subsolul raportului.
Stabilii caracteristicile caracterelor din raport. Alegei opiunea Default Font...
Report. Alegei n caseta de dialog Font fontul Arial.
Banda pentru
1
1
2
3
4
5
6
7
8
Select Object
Label
Field
Line
Rectangle
Rounded Rectangle
Data Grouping
Report Controls Toolbar
subsol de pagin
Selecteaz un obiect.
Activeaz scrierea textului.
Activeaz inserarea unui cmp
Activeaz trasarea unei linii.
Activeaz trasarea unui dreptunghi.
Activeaz trasarea unui dreptunghi cu coluri rotunjite.
Permite gruparea datelor.
Activeaz bara cu instrumente Report Controls.
Scriei titlul raportului. Executai clic pe instrumentul Label, executai clic n banda
pentru antetul raportului n locul n care vrei s scriei titlul i scriei: Situaia
ncasrilor pe contracte. Executai clic n banda de antet de pagin i scriei titlurile
coloanelor: Nr. ncasare, Nr. contract, Client, Data i Valoare.
Adugai la raport cmpurile care vor fi afiate. Executai clic pe instrumentul Field.
Executai apoi clic n banda Detail, sub titlul coloanei Nr. ncasare n poziia n care
vrei s apar valoarea cmpului. Se deschide caseta de dialog Report Expression.
Executai clic pe butonul Expression i se deschide caseta de dialog Expression
160 Informatic
Builder n care alegei din lista Fields cmpul ncasri.nr_i. Reluai operaia pentru
cmpurile ncasri.id_cont, Contracte.id_cl, ncasri.data_p, ncasri.valoare.
Creai grupuri de nregistrri dup numrul contractului.
Alegei opiunea Data Grouping...Report. Se deschide caseta de dialog Data
Grouping n care vei defini un singur nivel pentru grup. Executai clic pe butonul
primului grup. Se deschide caseta de dialog Expression Builder n care alegei din
lista Fields cmpul ncasari.id_cont.
Definii totalul la nivelul raportului i subtotal la nivelul fiecrui grup pentru cmpul
valoare. Executai clic pe instrumentul Field. Executai apoi clic n banda Group, sub
cmpul Valoare. Se deschide caseta de dialog Report Expression. Executai clic pe
butonul Expression i din caseta de dialog Expression Builder alegei cmpul
incasari.valoare. n caseta de dialog Report Expression executai clic pe butonul
Calculations.... Se deschide caseta de dialog Subtotal or Calculate Field n care
activai n grupul de butoane radio Subtotal or Calculate butonul Sum. Reluai
aceleai operaii i pentru banda subsolului de raport.
Salvai raportul sub numele a1. nchidei caseta de dialog. n fereastra Command
este afiat comanda cu care a fost creat raportul: create report.
Previzualizai raportul cu comanda:
report form a1 preview.
Putei modifica raportul cu comanda:
modify report a1.
Vei modifica raportul astfel: deoarece cmpurile pentru numrul contractului i pentru
identificatorul clientului se repet la nivelul grupului, vei aduga aceste date n antetul
grupului i le vei scoate din seciunea de date a raportului.
Putei tipri un raport cu comanda:
Report form <nume_fiier> [heading <exp_C>] [summary]
[<domeniu>][for <expL1>][ while <expL2>][to printer | to file <nume_fiier>]
unde clauza heading permite afiarea unui antet suplimentar la nceputul fiecrei pagini,
iar clauza summary inhib afiarea rndurilor cu date
i afieaz numai rndurile cu totaluri i subtotaluri.
161
162 Informatic
with blank - cmpurile sunt separate prin spaiu;
with <delimitator> - cmpurile de tip caracter vor fi delimitate de caracterul
<delimitator> n locul ghilimelelor.
1. Importul datelor este operaia prin
care se preiau date create cu alte
aplicaii i sunt transformate ntr-un
tabel al bazei de date Visaul
FoxPro. Se realizeaz cu comenzile: Import i Append from.
a. Sintaxa comenzii Import este:
Import from <nume_fiier>
type <tip>
<tip>
extensie
produs de
Tabele din baz de date
fox2x
.dbf
versiuni anterioare
FoxPro (pentru MS-DOS
sau Windows
pdox
.db
Paradox versiuni 3.5/4.0
Foi de calcul
wk1/wk3/ wk1/wk3/ Lotus 1-2-3 - diferite
wks
wks
versiuni
xls/xl5
xls
Excel vers. 2.0/5.0
Fiiere text
sdf
txt
fiiere ASCII
delimited
txt
fiiere ASCII
163
Poziionai cursorul n document n poziia n care vrei s inserai datele din tabel.
Afiai bara de instrumente Database cu opiunea DatabaseToolbarsView.
Executai clic pe butonul Insert Database. Se deschide caseta de dialog Database.
Executai clic pe declanatorul Get Data... Din caseta de dialog Open Data Source
alegei numele tabelului, de exemplu Angajai. Se revine n caseta de dialog
Database.
Executai clic pe declanatorul Query Options... Se deschide caseta de dialog
Query Options care conine trei seciuni pentru stabilirea unui criteriu de interogare.
Deschidei seciunea Filter Records pentru a stabili criteriul de filtrare (de exemplu
numai angajaii din Bucureti). Din lista ascuns Field alegei cmpul c_jud, din lista
Comparison operatorul Equal to, iar n caseta de text Compare to scriei B. Deschidei seciunea Sort Records pentru a stabili cheia de sortare (de exemplu dup
nume i prenume). Putei alege maxim trei chei de sortare. Alegei din lista ascuns
Sort by cmpul nume etc. Deschidei seciunea Select Fields pentru a stabili
cmpurile care vor fi preluate din baza de date. Alegei din list cmpurile nume,
pren, tel_f i tel_m. nchidei caseta de dialog Query Options.
Executai clic pe declanatorul Table Auto Format dac vrei s alegei unul dintre
formatele predefinite pentru tabele.
Executai clic pe declanatorul Insert Data.... Se deschide caseta de dialog Insert
Data din care putei alege domeniul nregistrrilor.
Datele din tabelul bazei de date vor fi inserate n document sub forma unui tabel.
copy to cl4.txt;
delimited with tab
copy to cl5.txt;
delimited with *
164 Informatic
3.
Creai un raport cu evidena edinelor. edinele vor fi grupate dup numrul contractului i
pentru acelai contract vor fi afiate n ordine cronologic. Afiai subtotaluri la nivel de grup
i un total la nivel de raport pentru durata edinelor i pentru costul edinelor.
4. Importai fiierele cu texte cl1.text, ..., cl5.txt n tabele. Vizualizai coninutul acestor tabele.
5. Exportai tabelul Clieni ntr-o foaie de calcul Excel. Vizualizai coninutul foii de calcul.
6. Importai foaia de calcul ntr-un tabel. Vizualizai
coninutul tabelului.
ncercai:
Adevrat/Fals:
1.
2.
3.
4.
5.
6.
7.
Completai:
1. Criteriul de interogare este salvat ntr-un fiier sub form de ..........................
2. Vizualizarea este salvat ntr-un fiier sub form de ..........................
3. Obinei rezultatul unei interogri cu comanda ..............................................
4. Putei construi interactiv un raport folosind ....................................
5. Datele din cmpurile nregistrrii vor fi inserate n raport n banda............................
6. Pentru a obine n urma exportului dintr-un tabel un fiier text n care cmpurile sunt
separate prin tabulatori folosii clauza.............................
7. Putei introduce o imagine ntr-un cmp de tip General folosind ....................
Rspundei:
1. Ce este o interogare a bazei de date?
2. Ce este o vizualizare a bazei de date?
R spunsuri:
165
8. Tablouri de memorie
Visual FoxPro permite crearea i manipularea structurilor de date de tip tablou de
memorie care, n acest sistem au urmtoarele 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 iniializate 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.
166 Informatic
8.1.1. Crearea unui tablou de memorie:
Crearea unui tablou de memorie se face prin dou operaii:
a. Definirea structurii cu ajutorul comenzilor declare/define. Comenzile au sintaxa:
declare | define <nume_tablou1> (<expN11>[,<expN12>])
[,<nume_tablou2> (<expN21>[,<expN22>]) ....... ]
Numele tabloului
de memorie
Numrul de elemente
dup prima dimensiune
Numrul de elemente
dup a doua dimensiune
Observaii:
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 specifice 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 att de tip vector,
ct 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 numrul de elemente dup o dimensiune, dac se definete un vector
(<expN11>, <expN21>, ...), respectiv numrul de elemente dup dou dimensiuni,
dac se definete o matrice (<expN11> i <expN12>, <expN21> i <expN22>, ...).
Dup ce ai definit structura tabloului, putei identifica orice element din tablou astfel:
pentru vectori : <nume_tablou>(<expN>), unde <expN> reprezint numrul de ordine al
elementului n cadrul vectorului;
pentru matrice : <nume_tablou>(expN1,<expN2>), unde identificarea elementului se
face prin numrul liniei <expN1> i numrul coloanei <expN2>. Elementele unei
matrice se pot identifica i prin numrul de ordine. innd cont c n Visual FoxPro o
matrice se memoreaz n ordinea liniilor i dac notm cu n numrul de linii ale matricei,
cu m numrul de coloane, iar cu i i j cei doi indici ai unui element, atunci numrul de
ordine al unui element va fi m(i-1)+j.
b. Atribuirea de valori elementelor se poate face n dou moduri:
Se atribuie aceeai valoare tuturor elementelor cu ajutorul comenzii store care
are sintaxa:
store <exp> to <nume_tablou>
Se atribuie cte o valoare fiecrui element folosind operaia de atribuire:
<element_tablou>= <exp>
sau comanda store care are sintaxa:
store <exp> to <element_tablou>
167
Numele funciilor folosite pentru operaii cu tablouri de memorie ncep cu litera a (array).
168 Informatic
Poziia unui element din tablou, identificat prin
numrul liniei i numrul coloanei se obine cu
ajutorul funciei aelement() care are sintaxa:
aelement(<nume_tablou>,<expN1>[,<expN2>]
,
unde <expN1> i <expN2> sunt indicii elementului
(numrul liniei i numrul coloanei). Funcia furnizeaz un rezultat numeric care reprezint numrul de ordine al elementului n cadrul structurii.
?
Ce valoare va furniza funcia
aelement() dac argumentul
<expN1> este mai mare
dect numrul de linii, iar
argumentul <expN2> este
mai mare dect numrul de
coloane ale unei matrice?
169
b. tergerea unui element (pentru vectori) sau a unei linii/coloane (pentru matrice) se
face folosindu-se funcia adel(): adel(<nume_tablou>,<expN>[,2]) , unde argumentele
i rezultatul furnizat au aceeai semnificaie ca i la funcia ains(). Funcia nu modific
dimensiunea tabloului. Elementele care urmeaz poziiei, respectiv liniei sau coloanei
terse vor fi deplasate spre nceputul tabloului, iar ultimul element, respectiv ultima linie
sau coloan va fi inializat cu valoarea .F..
170 Informatic
redimensionat corespunztor. Matricea va avea un numr de linii egal cu numrul de
fiiere i directoare (dosare=foldere) nregistrate n director i 5 coloane,
corespunztoare celor 5 caracteristici ale unui fiier sau director: nume fiier (tip ir de
caractere), dimensiune fiier (tip numeric), data ultimei actualizri (tip dat calendaristic), timpul ultimei actualizri (tip ir de caractere) i atribute (tip ir de
caractere). Atributele fiierelor sau directoarelor pot fi: A - arhivat, H - ascuns, R - protejat la scriere, S - sistem, D - director. Implicit pot fi salvate informaii despre toate fiierele i dosarele nregistrate. Explicit vor fi salvate informaii numai despre fiierele care
pot fi identificate prin ablonul descris cu argumentul <expC1> sau fiierele care au
atributele precizate prin argumentul <expC2>: 'D' - numai directoare, 'H' - numai fiierele ascunse, 'S' - numai fiierele sistem, 'V' - n primul element al tabloului va fi nregistrat eticheta volumului de disc pe care se gsete directorul curent. Funcia furnizeaz un rezultat numeric care reprezint numrul de fiiere i dosare inventariate.
b. Structura tabelului baz de date activ poate fi salvat ntr-un tablou de memorie de
tip matrice folosind funcia afields(): afields(<nume_tablou>) . Salvarea se face n
tabloul precizat prin argumentul <nume_tablou>. Aceast matrice are o structur bine
definit i dac nu a fost creat anterior, va fi creat de funcie, iar dac exist va fi
redimensionat corespunztor. Matricea va avea un numr de linii egal cu numrul de
cmpuri din tabel i 11 coloane, corespunztoare caracteristicilor ale unui cmp: nume
cmp (tip ir de caractere), tip cmp (tip ir de caractere), lungime cmp (tip
numeric), numr poziii zecimale (tip numeric), regula de validare (tip ir de caractere), .... . Funcia furnizeaz un rezultat numeric care reprezint numrul de cmpuri.
memoria extern
(cmp memo din tabel)
171
memoria extern
(cmpuri dintr-o nregistrare din tabel)
Scatter
memoria extern
(tabel din baza de date)
Scatter
Copy to array
Observaie:
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 fiier pentru variabile de memorie (extensia .mem) specificat prin <nume_fisier>
sau ntr-un cmp memo al tabelului activ specificat prin clauza to memo i identificat
prin nume <nume_cmp>:
save to <nume_fisier>| to memo <nume_cmp> [all like | except <sablon>]
b. Comanda restore from: restaureaz variabilele de memorie i tablourile dintr-un fiier
pentru variabile de memorie specificat prin <nume_fisier> sau ntr-un cmp memo al
tabelului activ specificat prin clauza to memo i identificat prin nume <nume_cmp>:
restore from <nume_fisier>| to memo <nume_cmp> [additive]
c. Comanda scatter copiaz datele din
cmpurile nregistrrii curente ale ta?
belului activ ntr-un tablou de memorie
1. n ce ordine se copiaz datele din
identificat prin <nume_tablou> sau ntrcmpurile tabelului n tabloul de memorie?
un set de variabile de memorie, caz
2. Ce se ntmpl dac numrul de cmpuri
specificat prin clauza memvar.
care trebuie copiate este mai mare dect
Variabilele de memorie vor avea
numrul de elemente din tabel?
acelai nume ca i cmpurile care se
copiaz. Implicit se copiaz toate cmpurile, mai puin cmpurile memo. Explicit se pot
172 Informatic
copia numai cmpurile din lista de cmpuri a clauzei fields i se pot copia i cmpurile
memo dac se precizeaz clauza memo. Clauza blank semnific faptul c se creeaz
tabloul de memorie, respectiv setul de variabile de memorie de acelai tip i lungime ca
i cmpurile, dar n loc s se transfere n ele datele din cmpuri, acestea vor fi vide.
scatter [fields <list_cmpuri>] [memo] to <nume_tablou> | to <nume_tablou> blank |
memvar | memvar blank
d. Comanda gather copiaz n cmpurile nregistrrii curente a tabelului activ, datele dintrun 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
acelai nume ca i cmpurile. Ele pot fi create cu comanda scatter memvar blank, dup
care li se pot atribui valori. Dac pentru un cmp nu exist o variabil de memorie cu
acelai nume, cmpul rmne neschimbat. Copierea dintr-un tablou de memorie se face
secvenial, n fiecare cmp copiindu-se un element al tabloului, pn cnd se termin
elementele din tablou sau pn cnd se termin cmpurile din nregistrare. Implicit
transferul se face n toate cmpurile, mai puin cmpurile memo. Explicit transferul se
poate face numai n cmpurile precizate n lista de cmpuri a clauzei fields i se pot
copia i cmpurile memo dac se precizeaz clauza memo.
gather from <nume_tablou> | memvar [fields <list_cmpuri>] [memo]
e.
Comanda copy to array ncarc ntr-un tablou de memorie creat anterior, identificat prin
<nume_tablou>, datele din cmpurile tabelului activ. Dac tabloul este de tip vector, se
copiaz numai cmpurile din nregistrarea curent, iar dac tabloul este de tip matrice, se
ncarc n fiecare linie a matricei cmpurile dintr-o nregistrare. Dac exist mai multe
elemente dect cmpuri, restul elementelor rmne neschimbat, iar dac exist mai multe
cmpuri dect elemente, cmpurile care nu mai ncap nu se copiaz. Dac exist mai
multe linii dect nregistrri, restul de linii rmne neschimbat, iar dac exist mai multe
nregistrri dect linii, nregistrrile care nu mai ncap nu se copiaz. Implicit se transfer
toate cmpurile dintr-o nregistrare. Explicit se transfer numai n cmpurile precizate n lista
de cmpuri a clauzei fields. Implicit se transfer toate nregistrrile din tabelul activ. Explicit
se transfer numai nregistrrile precizate prin <domeniu> sau clauzele for sau while.
copy to array <nume_tablou> [fields <list_cmpuri>] [<domeniu>]
[for <expL1>][while < expL2>][<nooptimize>]
f.
Comanda append from array adaug la sfritul tablelului activ nregistrri 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 dect cmpuri, restul elementelor din tablou sunt ignorate, iar dac sunt mai
multe cmpuri dect elemente, restul cmpurilor se inializeaz cu elementul neutru
pentru acel tip de dat. Dac tabloul este de tip matrice, se copiaz n cte o nregistrare
cte o linie a matricei. Linia matricei este tratat la fel ca un tablou de tip vector. Implicit
se transfer date n toate cmpurile nregistrrii. Explicit se transfer numai n cmpurile
precizate n lista de cmpuri 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 cmpului n care se transfer, se ncearc transformarea
acelui tip de dat, care poate s reueasc 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
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_cmpuri>] [for <expL>]
b(1,3)=date()
b(1,4)=.T.
b(1,5)=datetime()
b(2,1)=10
b(2,2)=20
b(2,3)=30
b(2,5)=50
display memory like b
store 0 to a
display memory like a
5. Redimensionai tablourile:
declare a(8)
display memory like a
dimension a(2,4)
display memory like a
dimension a(2,5)
display memory like a
elementele a(2,4) i a(2,5) au
valoarea .F.
dimension a(10)
dimension b(2,8)
display memory like b
ultimele 6 elemente au valoarea
.F. (ca i cum b ar fi un vector)
174 Informatic
3
? aelement(b, asubscript(b,11,1),
asubscript(b,11,2))
11
? ascan(b,40)
9
? asubscript(b, ascan(b,40),1)
2
? asubscript(b, ascan(b,40),2)
1
? ascan(b,'azi')
1
? ascan(b,'zi')
0
? ascan(b,date())
3
? ascan(b,.T.)
4
b(2,1)=10
b(2,2)=20
b(2,3)=30
b(2,4)=40
b(2,5)=50
? adel(b,3,2)
1
display memory like b
a fost tears coloana 3 i
elementele din ultima coloan b(1,5) i b(2,5) - au valoarea .F.
? ains(b,3,2)
1
display memory like b
a fost inserat coloana 2 i
elementele din aceast coloan
-b(1,3) i b(2,3)- au valoarea .F.
b(1,3)=date()
b(2,3)=30
175
176 Informatic
declare w(5,3)
copy to array w fields c1, c2, c3
display memory like w
? asort(w,2)
1
display memory like w
zap
append from array w for c2>400
list
177
12. Transformai matricea a ntr-o matrice cu 2 linii i 5 coloane. Afiai coninutul matricei.
13. Comparai numrul de linii ale matricei a cu variabila de memorie ak1. Comparai
numrul de coloane ale matricei a cu variabila de memorie ak2. Comparai numrul de
elemente ale matricei a cu variabila de memorie al.
14. Afiai valoarea elementului 9 din matricea a. Afiai valoarea elementului 10 din
matricea a.
15. Transformai matricea a ntr-un vector cu 10 elemente.
16. Refacei datele din matricea iniial a.
17. Sortai descresctor vectorul a. Afiai coninutul vectorului sortat.
18. Transformai vectorul a ntr-o matrice cu 2 linii i 4 coloane. Afiai coninutul matricei.
19. Sortai creasctor matricea a dup coloana 3 ncepnd cu prima linie. Afiai coninutul
acestei matrice.
20. Transformai matricea a ntr-un vector cu 10 elemente. Afiai coninutul acestui vector.
21. Sortai cresctor vectorul a. Afiai coninutul acestui vector.
22. Creai printr-o singur comand structura vectorului c cu 5 elemente i a vectorului d
cu 2 elemente.
23. Folosind datele din matricea a, atribuii elementelor din vectorul c valorile 6, 7, ..., 10,
iar elementelor din vectorul d valorile 3 i 8. Afiai coninutul celor doi vectori.
24. Transformai vectorul a ntr-o matrice cu 3 linii i 5 coloane. Afiai coninutul matricei.
25. tergei linia 2 a matricei a. Transformai matricea a ntr-o matrice cu 2 linii i 5 coloane.
Afiai coninutul acestei matrice.
26. Transformai matricea a ntr-o matrice cu 2 linii i 6 coloane. Afiai coninutul acestei
matrice. Inserai o coloan vid n coloana 3. Afiai coninutul acestei matrice.
27. Transformai matricea a ntr-o matrice cu 2 linii i 5 coloane. Refacei matricea iniial a.
Afiai coninutul matricei. Inserai o coloan vid n coloana 3. Afiai coninutul matricei.
28. tergei coloana 3 din matricea a. Afiai coninutul matricei a.
29. Cutai valoarea 6 n matricea a. Cutai valoarea 8 n vectorul c.
30. Refacei matricea iniial a. Cutai valoarea 6 n matricea a.
31. Creai structura a doi vectori cu 5 elemente: a1 i a2.
32. Copiai n vectorul a1 prima linie din matricea a.
33. Copiai n vectorul a2 a doua linie din matricea a.
34. Afisai printr-o singur comand coninutul vectorilor a1 i a2 i al matricei a.
35. Salvai vectorii a1 i a2 i matricea a n fiierul fa.
36. tergei din memoria intern vectorii a1 i a2 i matricea a.
37. Afiai coninutul vectorilor a1 i a2 i al matricei a.
38. Refacei n memoria intern vectorii a1 i a2 i matricea a prin preluare din fiierul fa.
39. Afiai coninutul vectorilor a1 i a2 i al matricei a.
40. tergei coninutul memoriei interne.
41. Deschidei tabelul Incasari din baza de date Compania. Pstrai n variabila x numrul
de nregistrri din tabel.
42. Copiai din acest tabel, ntr-un tablou de memorie cu trei coloane, cmpurile nr_i,
id_cont, valoare. Vizualizai datele din tabloul de memorie.
43. Sortai acest tabel dup valoarea cmpului valoare. Vizualizai datele sortate.
44. Adugai aceste date la sfritul tabelului. Vizualizai datele adugate.
45. tergei datele adugate. nchidei tabelul i baza de
date. Eliberai memoria intern.
178 Informatic
ncercai:
Adevrat/Fals:
1. n Visual FoxPro tablourile de memorie sunt omogene.
2. Un element al unei matrice Visual FoxPro poate fi identificat dup numrul su de ordine.
3. Dac transformai 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.
Completai:
1. Structura tabelului activ se poate salva ntr-o matrice folosind funcia ................
2. Funcia alen(a,2) furnizeaz ............................... ale matricei a.
3. Prin comanda de definire a structurii unui tablou de memorie elementele sunt
iniializate cu valoarea ..........
4. Pentru a terge a doua coloan dintr-o matrice a folosii funcia ....................
Alegei rspunsul corect:
1.
Pentru copierea elementelor unui tablou de memorie ntr-un alt tablou de memorie folosii:
a) funcia acopy()
b) comanda copy to array
c) comanda append from array
c) coloanele
R spunsuri:
Capitolul
Elaborarea unor
strategii de modularizare
i abstractizare a
prelucrrii datelor
Ai nvat s folosii interfaa unui sistem de gestiune a bazelor de date pentru a crea i a ntreine
o baz de date.
Pentru crearea unei aplicaii, sistemul de gestiune a bazelor de date Visual FoxPro pune
la dispoziia programatorului dou metode de programare:
9 Programarea clasic n care rezolvarea unei probleme se face cu ajutorul algoritmilor
descrii prin cele trei structuri de control: structura secvenial, 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 instruciunilor puse la dispoziie de limbajul de
programare.
180 Informatic
9 Programarea orientat pe obiecte n care rezolvarea problemei se face cu ajutorul
obiectelor. Ea este orientat pe definirea obiectelor. Folosind aceast metod, programatorul trebuie s construiasc obiecte care sunt formate din date i procedurile
care prelucreaz aceste date.
Aceeai problem poate fi rezolvat cu oricare dintre cele dou metode. Metoda
programrii pe obiecte are ns urmtoarele avantaje: permite un control mai bun al
programelor (n special al programelor de dimensiuni mari) i permite o mai uoar
dezvoltare a programelor. n schimb, programarea clasic asigur compatibilitatea cu
programele scrise ca aplicaii pentru versiunile anterioare ale sistemului de gestiune a
bazelor de date FoxPro.
Pe lng cele dou metode de programare Visual FoxPro pune la dispoziia utilizatorului
instrumente vizuale pe care le poate folosi pentru a realiza interfaa aplicaiei.
Aplicaia Visual FoxPro cuprinde, pe lng fiierele surs sau cu module obiect ale
programelor i ale bibliotecilor de subprograme, i alte fiiere care concur la realizarea
interfeei i la obinearea informaiilor, cum sunt de exemplu fiierele cu formularele
folosite pentru introducerea datelor, fiierele pentru formatul rapoartelor, fiierele pentru
interogri etc. Toate aceste elemente necesare la realizarea unei aplicaii pot fi organizate ntr-un proiect care s permit o mai bun gestionarea a lor din punct de vedere al
programatorului. Pentru a proteja aceste elemente mpotriva unor modificri neautorizate,
proiectul poate genera un fiier executabil independent de mediul Visual FoxPro.
181
Pe parcursul unui program, acelai identificator de dat poate s defineasc tipuri diferite
de date. De exemplu, n acelai program se pot ntlni comenzile:
store 0 to a
{se creeaz variabila de memorie a de tip numeric prin atribuirea
...........................
unei valori numerice}
a=date()
{se creeaz variabila de memorie a de tip dat calendaristic prin
...........................
atribuirea valorii unei funcii de tip dat calendaristic}
accept 'a=' to a
{se creeaz variabila de memorie a de tip ir de caractere prin
atribuirea irului de caractere introdus de la tastatur}
n general, pentru marea majoritate a comenzilor nu este necesar ca variabilele de memorie s fie definite anterior comenzii (de exemplu comenzile de atribuire sau comenzile
care permit redirectarea unor valori de pe ecran ntr-o variabil de memorie folosind
clauza to: accept, input, sum, count etc. creeaz ele nsele variabila de memorie).
structura liniar,
structura alternativ,
structura repetitiv.
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 instruciuni, iar pentru schimbarea
ordinii secveniale de execuie se pot folosi instruciuni de control. Programul surs
devine astfel o colecie de comenzi i instruciuni de control scrise n ordinea n care
trebuie s fie executate. Instruciunile de control sunt instruciuni bloc deoarece conin
mai multe instruciuni. De aceea ele trebuie delimitate de cuvinte cheie care marcheaz
nceputul i sfritul structurii de control. Instruciunile nu pot fi folosite n modul comand.
Compilatorul FoxPro trebuie s poat identifica fiecare instruciune a programului surs.
El consider ca separator ntre instruciuni codul ASCII generat la acionarea tastei enter.
Se numete EOL (End Of Line) i este format din dou coduri ASCII:
EOL = LF (Line Feed = salt la linia urmtoare) +
CR (Carriage Return = retur la nceputul liniei) = 0DH + 0AH
182 Informatic
Din aceast cauz, n fereastra de editare fiecare comand se va scrie pe cte un rnd:
<verb1> <list_adverbe_1> enter
<verb2> <list_adverbe_2> enter
instruciune
.......................................................
Dac dorii s scriei o comand pe mai multe rnduri, pentru a arta c ea continu pe
rndul urmtor, la sfritul liniei, nainte de a aciona tasta enter scriei caracterul punct i
virgul ( ; ), astfel:
<verb> < adverb_1> ; enter
< adverb_2> ; enter
< adverb_3> enter
sfrit de comand
Atenie: urmtoarele linii ale comenzii nu
se scriu din prima coloan.
if ... endif
structura alternativ
generalizat
cu numr
cunoscut de pai
structura repetitiv
cu numr necunoscut
de pai, condiionat
anterior
pentru parcurgerea
nregistrrilor dintr-un
tabel
Observaii:
1. Spre deosebire de limbajele clasice de programare, n limbajul gazd FoxPro este implementat o structur repetitiv specific acestui gen de aplicaie (scan ... endscan), care
faciliteaz scrierea unui program ce exploateaz secvenial un tabel al bazei de date.
183
184 Informatic
1.2.2. Structura alternativ
Prin aceast structur se execut condiionat o anumit secven de instruciuni, n
funcie de valoarea unei condiii logice. Limbajul gazd FoxPro permite folosirea a dou
tipuri de structuri alternative:
a. Structura alternativ simpl
Structura alternativ simpl permite executarea unei aciuni (descris printr-o secven
de instruciuni: <secven-instruciuni-1> sau <secven-instruciuni-2>) din dou aciuni
posibile, n funcie de valoarea unei condiii exprimate printr-o expresie logic (<expL>):
if <expL>
<secven-instruciuni-1>
else
<secven-instruciuni-2>
endif
Observaii:
1.
Cuvintele cheie if i endif delimiteaz structura, iar cuvntul else marcheaz nceputul secvenei de instruciuni care descrie activitatea ce se execut dac expresia logic are valoarea fals.
2. Cuvntul cheie if mpreun cu condiia i cuvintele cheie else i endif se scriu fiecare pe
cte un rnd.
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 ecuaiei de gradul I cu coeficieni numere
reale. Coeficienii a i b se introduc de la tastatur.
Metoda 1
else
? 'Ecuatia este imposibila'
endif
else
x=-b/a
? 'x= ',x
endif
wait 'Actionati orice tasta;
pentru continuare'
clear
return
? 'Programul va furnizeaza;
solutia ecuatiei de gradul I'
? 'de forma a*x+b=0'
185
x=-b/a
? 'x= ',x
endif
endif
wait 'Actionati orice tasta;
pentru continuare'
clear
return
? iif(a<>0, -b/a,iif(b<>0,
'Ecuatia este imposibila',;
'Ecuatia are o infinitate de;
solutii'))
wait 'Actionati orice tasta;
pentru continuare'
clear
return
186 Informatic
executa atunci cnd nici una dintre expresiile logice din cazurile prezentate nu au avut
valoarea adevrat.
2. Cuvntul cheie case mpreun cu condiia i cuvintele cheie do case, otherwise i
endcase se scriu fiecare pe cte un rnd.
3. Se accept ntr-o structur do case ... endcase structuri alternative sau structuri repetitive
cu condiia 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>
<secvena-instruciuni-1>
else
if <expL2>
<secvena-instruciuni-2>
else
if <expLn>
<secvena-instruciuni-1>
else
......................................
if <expLn>
<secvena-instruciuni-n>
else
<secvena-instruciuni-n>
endif
......................................
endif
endif
endif
Mod de executare a instruciunii:
1. Se evalueaz pe rnd expresiile logice <expL1>, <expL2>, <expL3>, ... i <expLn>.
Cnd se ntlnete prima expresie care are valoarea adevrat, se execut secvena
de instruciuni cuprins ntre condiia logic i apariia unuia dintre cuvintele cheie case,
otherwise sau endcase.
2. Dup ce s-a ntlnit un caz adevrat i s-au executat instruciunile corespunztoare
cazului, celelalte cazuri nu vor mai fi tratate i se va trece la executarea primei instruciuni
aflate dup cuvntul cheie endcase.
3. Dac nici una dintre expresiile logice evaluate nu a avut valoarea adevrat, se execut
secvena de instruciuni delimitat de cuvintele cheie otherwise i endcase, dac exist
sau, n caz contrar, prima instruciune aflat dup cuvntul cheie endcase.
Recomandare:
Se recomand folosirea instruciunii do case ... endcase n locul instruciunii if ... endif
n urmtoarele cazuri:
1. Din mai multe cazuri unul singur poate fi adevrat.
2. Din mai multe condiii numai prima gsit adevrat trebuie executat.
3. Exist un numr mic de excepii la o anumit condiie. n acest caz excepiile vor fi puse
n eviden prin case <expL>, iar situaia obinuit prin otherwise.
187
Exemplu
S se scrie un program pentru rezolvarea ecuaiei 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'
Loop
- foreaz reevaluarea condiiei de
terminare a structurii repetitive printr-un salt la
nceputul structurii (n cazul unei structuri repetitive
cu numr cunoscut de pai, nainte de evaluarea
condiiei produce i incrementarea contorului).
Exit - foreaz abandonarea structurii repetitive
indiferent de rezultatul evalurii condiiei de
terminare printr-un salt la prima instruciune care
urmeaz dup terminarea structurii repetitive.
to
<contor>
<= <expN2>
.F.
endfor
.T.
<secven-instruciuni>
<contor>=<contor>+<expN3>
step
188 Informatic
for <contor>=<expN1> to <expN2> [step <expN3>]
<secven-instruciuni>
endfor | next
Observaie:
1. Cuvntul cheie for marcheaz nceputul structurii, iar cuvntul cheie endfor (sau cuvntul cheie next) marcheaz sfritul structurii. Cuvintele cheie for i to delimiteaz operaia de atribuire prin care se face iniializarea contorului, cuvntul to precede valoarea
final a contorului, iar cuvntul step precede valorea cu care se incrementeaz contorul.
2. Cuvntul cheie for mpreun cu expresiile i cuvintele cheie to i step se scriu pe acelai
rnd. Cuvntul cheie endfor, respectiv next se scrie pe un singur rnd.
3. Variabila de memorie <contor> trebuie definit naintea structurii for ... endfor ca
variabil de tip numeric ntreg printr-o operaie de atribuire.
Exemplu:
S se calculeze suma a n numere introduse
de la tastatur.
set talk off
clear
store 0 to suma,i
? 'Programul calculeaza suma a n;
numere introduse de la tastatura'
input 'n= ' to n
for i=1 to n
input 'a= ' to a
suma=suma+a
endfor
? 'Suma = ', suma
wait 'Actionati orice
pentru continuare'
clear
return
tasta;
iniializare
do while
Exemplu:
S se calculeze media aritmetic a unor numere introduse
de la tastatur. Utilizatorul programului este ntrebat de
fiecare dat dac mai dorete s introduc un numr.
Operaia se termin atunci cnd acesta rspunde c nu mai
dorete continuarea operaiei de introducerea numerelor.
<expL>
.F.
enddo
.T.
<secven-instruciuni>
189
190 Informatic
c. Structura repetitiv pentru parcurgerea nregistrrilor dintr-un tabel
Permite parcurgerea secvenial a nregistrrilor dintr-un tabel, excutnd o secven de
instruciuni. Secvena de instruciuni acioneaz implicit asupra tuturor nregistrrilor din
tabel. Explicit, ea se poate executa condiionat numai asupra nregistrrilor care aparin
unui domeniu precizat prin clauza <domeniu> sau numai asupra nregistrrilor care
ndeplinesc condiia precizat prin expresia logic <expL1> respectiv <expL2> din clauza
for respectiv while. Sintaxa instruciunii este:
scan [<domeniu>] [for <expL1>] [while <expL2>]
<secven-instruciuni>
endscan
Observaie:
1. Cuvntul cheie scan marcheaz nceputul structurii, iar cuvntul cheie endscan sfritul
structurii.
2. Cuvntul cheie scan (mpreun cu adverbele care
use <tabel>
precizeaz nregistrrile ce vor fi prelucrate) i cuvntul cheie endscan se scriu fiecare pe cte un rnd.
3. Forma implicit a instruciunii scan ... endscan este
do while
echivalent cu urmtoarea instruciune do while ...
.F.
enddo:
not eof()
goto top
do while not eof()
enddo
<secven-instruciuni>
.T.
skip
<secven-instruciuni>
enddo
4. Forma implicit a instruciunii scan ... endscan este
skip
echivalent cu urmtoarea instruciune for ... endfor:
goto top
for i=1 to reccount()
<secven-instruciuni>
skip
endfor
Exemplu:
S se afieze informaii despre edinele inute de un angajat al firmei de consultan.
Identificatorul angaja-tului se introduce de la tastatur.
191
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
192 Informatic
poate fi ncrcat 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 printe precizat prin
clauza in [window] <nume_fereastr_2>.
Controlul compilrii
Putei controla compilarea folosind urmtoarele comenzi i funcii:
9 Putei salva mesajele de eroare obinute n urma compilrii ntr-un fiier de texte
cu acelai nume ca i fiierul surs i cu extensia .err. Aceast facilitate este
controlat de parametrul logerrors care trebuie s aib valoarea on. Valoarea
parametrului poate fi stabilit cu comanda set logerrors care are sintaxa:
set logerrors on | off
9 Putei construi capcane pentru erori. O capcan pentru erori oprete execuia
programului atunci cnd apare o eroare i d controlul unei subrutine (subprogram
sau program). Activarea i dezactivarea subrutinei se face cu comanda on errorr
care are sintaxa:
on error <comand>
pentru activarea rutinei i
on error
pentru dezactivarea ei. Adverbul <comand> este o comand de apel a unui subprogram: do <nume_program>. Subprogramul poate fi scris n fiierul surs al programului (ca procedur) sau ntr-un fiier separat. Dup executarea subrutinei, programul
va fi reluat cu instruciunea imediat urmtoare dup cea n care a aprut eroarea. n
cadrul subrutinei de eroare pot fi obinute informaii despre eroare utiliznd ca
parametri funciile: error(), message(), lineno() i program():
error() - furnizeaz numrul erorii detectate de capcana on error (rezultat numeric).
message() - furnizeaz mesajul de eroare (fr parametru) sau coninutul liniei
care a cauzat eroarea (dac se folosete parametrul 1). Rezultatul este de tip ir
de caractere.
lineno() - furnizeaz numrul relativ al liniei programului n curs de execuie
(rezultat numeric). Se numr toate liniile, inclusiv liniile de comentarii i liniile vide.
193
194 Informatic
b. O anumit operaie este necesar n mai multe programe, cum sunt de exemplu
diferite operaii matematice (extragerea radicalului, extragerea prii ntregi sau a prii
fracionare dintr-un numr real etc.), diferite operaii cu iruri de caractere (extragerea
unui subir dintr-un ir, tergerea unui subir dintr-un ir, inserarea unui subir ntr-un
ir etc.), diferite operaii cu fiiere (deschiderea unui fiier, nchiderea unui fiier,
testarea sfritului de fiier etc.).
c. Pentru simplificare, orice problem poate fi descompus n subprobleme folosind tehnica top-down de proiectare a algoritmilor. Descompunerae poate continua
pn cnd se obin subprobleme cu rezolvare imediat i care sunt independente
unele de altele, astfel nct programele cu care vor fi descrise s fie uor de conceput
i depanat, iar ulterior, cnd se schimb unele cerine, s fie uor de dezvoltat.
n anii precedeni de studiu ai aflat c subproblemele obinute pot fi descrise prin uniti
de programe care se mai numesc i module. Ai mai nvat c modulele se clasific
astfel:
Modul apelant
Transfer Modul apelat
9 Modul apelant. Este modulul care
pentru rezolvarea propriei probleme
apeleaz la alte module, fiecare dintre ele rezolvnd o anumit subproblem. La apelare, el transfer controlul modului apelat.
9 Modul apelat. Este un modul la care apeleaz un alt modul pentru a-i
rezolva o subproblem. Dup ce i
termin execuia, el red controlul modulului apelant.
control
Revenire
control
195
196 Informatic
toarelor situaii: execuia unei anumite linii din program (care creeaz puncte de ntrerupere permanente), schimbarea valorii unei expresii, evaluarea unei expresii la o anumit valoare, terminarea execuiei unui anumit modul (step out) sau producerea
unui anumit eveniment n timpul execuiei programului.
197
pentru un grup de variabile i tablouri de memorie care nu poate fi descris cu ajutorul unui ablon i
Observaii:
1. Instruciunile public, local i regional creeaz variabile de memorie. O variabil de
memorie trebuie declarat global, local respectiv regional nainte de a i se atribui
valori i de a fi folosit n cadrul modulului.
2. Comanda private nu creeaz variabile de memorie; ea schimb numai statutul
variabilelor de memorie precizate.
3. Variabilele i tablourile de memorie create n fereastra de comenzi sunt publice.
198 Informatic
Atribuirea valorilor se face respectnd regula de coresponden. De aceea n cele
dou liste de parametri trebuie s se respecte aceeai succesiune a parametrilor i
acelai tip de date pentru fiecare pereche de parametri. Se accept ns ca lista de
parametri actuali s conin mai puini parametri dect lista de parametri formali (dar nu
mai muli parametri). n acest caz, parametrii formali crora nu li s-a atribuit o valoare
folosind regula de corespondn vor fi iniializai cu valoarea logic .F..
Putei afla numrul de parametri transmii unui modul folosind funcia parameters() .
1.4.5. Subprogramele
tii 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 funcii (care returneaz un singur rezultat
prin numele su). Tipul subprogramului determin i modul n care este activat (lansat n
execuie): procedura printr-o instruciune de apel i funcia 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
Funcii
de sistem
utilizator (UDF - User Defined Functions)
199
200 Informatic
Deschidei o fereastr a editorului de texte ncorporat astfel: alegei opiunea
New... File; se deschide caseta de dialog New n care alegei din grupul de butoane radio File Type opiunea Program i apoi acionai declanatorul New File.
Se deschide fereastra de editare. Folosind operaia Save As atribuii fiierului
numele test1.prg.
Scriei n fereastra de editare textul programului din exemplul prezentat la structura liniar. Compilai fiierul surs cu opiunea de meniu Compile Program.
Salvai i nchidei fereastra de editare fie cu opiunea de meniu, fie folosind
butonul de nchidere al ferestrei, fie apsnd tastele ctrl+w.
Lansai n execuie programul cu opiunea de meniu Do... Program.
2. Creai fiierul surs, l compilai i-l lansai n execuie folosind limbajul de comand:
Deschidei o fereastr a editorului de texte ncorporat cu comanda:
modify command test2
Se deschide fereastra de editare care are titlul test2.prg. Scriei n aceast
fereastr textul programului din exemplul prezentat la structura alternativ simpl.
Salvai i nchidei fereastra de editare.
Compilai fiierul surs cu comanda:
compile test2
Lansai n execuie programul cu comanda:
do test2
Deschidei fereastra editorului de texte ncorporat cu comanda:
modify command test2
Salvai coninutul acestui fiier sub numele test3.prg. nchidei fereastra de editare.
Compilai fiierul surs cu comanda:
compile test2 encrypt
Deschidei dou ferestre de editare n care ncrcai cele dou fiiere obiect obinute n urma compilrii: test2.fxp i test3.fxp. Ele s-au obinut n urma compilrii
aceluiai program surs, dar folosind metode diferite de compilare. Comparai cele dou fiiere obiect obinute.
3. Creai fiierele surs, le compilai i le lansai n execuie pentru toate exemplele
prezentate la seciunea Structuri de control.
Creai o capcan pentru erori
S se construiasc o capcan pentru erori. n fiierul surs exemplu.prg se vor scrie
instruciunile programului (modulul apelant), iar n fiierul surs eroare.prg instruciunile
subrutinei de eroare (modulul apelat).
1. Creai fiierul surs exemplu.prg i l compilai:
if set('talk')='on'
set talk off
endif
if set('bell')='off'
set bell on
endif
* prin urmatoarea instructiune
* se activeaza un subprogram
* care a fost scris ntr-un
* fisier separat:eroare.prg
201
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. Creai fiierul surs eroare.prg i l compilai:
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. Lansai n execuie programul exemplu. Observai modul n care suntei informai
despre erorile de compilare.
Testai modul n care pot fi folosite variabilele de memorie ascunse
Scriei urmtorul program surs n fiierul ex1.prg i-l lansai n execuie:
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
Testai modul n care pot fi folosite variabilele de memorie publice
Scriei urmtorul program surs n fiierul ex2.prg i-l lansai n execuie. Observai valorile afiate. Observai comportamentul variabilelor publice. Comparai 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 tragei? Observai c prin comanda 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.
release all
display memory like a?
release a1,a2
display memory like a?
procedure ascunde
private a1
a1 = 100
a2 = 200
? 'Afiseaza variabilele din;
procedura'
202 Informatic
? 'a1 = '
?? a1
? 'a2 = '
?? a2
return
203
fact=fact*i
endfor
return fact
clear
if set('talk')='on'
set talk off
endif
set udfparms to value
n=10
?test(n),n
&& Afiseaza 70, 10
set udfparms to reference
n=10
?test(n),n
return
function test
parameters y
y=2*y+50
return y
204 Informatic
? data(ctod(dt))
procedure data
parameter d
do case
case month(d)=1
luna='ianuarie'
case month(d)=2
luna='februarie'
case month(d)=3
luna='martie'
case month(d)=4
luna='aprilie'
case month(d)=5
luna='mai'
case month(d)=6
luna='iunie'
case month(d)=7
luna='iulie'
case month(d)=8
luna='august'
case month(d)=9
luna='septembrie'
case month(d)=10
luna='octombrie'
case month(d)=11
luna='noiembrie'
case month(d)=12
luna='decembrie'
endcase
do case
case lower(cdow(d))='monday'
ziua='luni'
case lower(cdow(d))='tuesday'
ziua='marti'
case
lower(cdow(d))='wednesday'
ziua='miercuri'
case lower(cdow(d))='thursday'
ziua='joi'
case lower(cdow(d))='friday'
ziua='vineri'
case lower(cdow(d))='saturday'
ziua='sambata'
case lower(cdow(d))='sunday'
ziua='duminica'
endcase
dat=ziua+', '+str(day(d),2)+;
' '+luna+' '+str(year(d),4)
return dat
205
k=-1
for i=1 to n
if a(i)=x
k=i
exit
endif
endfor
return k
procedure cautv
parameters a,n,x,t,k
local i,j
k=-1
j=0
for i=1 to n
if a(i)=x
j=j+1
dimension t(j)
t(j)=i
k=j
endif
endfor
return
Testai apoi biblioteca folosind urmtoarele programe: test1.prg pentru testarea operaiei
de cutare, test2.prg pentru testarea operaiei de concatenare, test3.prg pentru testarea
operaiei de interclasare i test4.prg pentru testarea operaiei de divizare.
test1.prg
else
? 'Prima pozitie in care se;
gaseste valoarea este ';
+str(caut(v,m,x),2)
do cautv with v,m,x,u,p
if p>1
? 'Valoarea apare in mai;
multe pozitii'
? 'Pozitiile gasite sunt:'
do afisare with u,p
endif
endif
note Se nchide biblioteca
set procedure to
return
vectori numerici'
? 'Comunicati primul vector'
do creare with x,p
? 'Comunicati al doilea vector'
do creare with y,q
206 Informatic
do concatenare with x,y,z,p,q
set procedure to
do afisare with z,p+q
return
test3.prg La fel ca la test2.prg numai c n loc de do concatenare with x,y,z,p,q
scriei do interclasare with x,y,z,p,q
test4.prg
set talk off
public p,q,x(1),y(1),z(1)
clear
set procedure to vectori
? 'Programul divizeaza un;
vector numeric in doi vectori'
? 'Comunicati vectorul care se;
divizeaza'
do creare with x,p
207
a2) cuvintele sunt separate prin dou sau mai multe spaii.
b) S se numere caracterele din text i s se precizeze:
b1) cte consoane sunt;
b2) cte vocale sunt;
b3) cte cifre sunt;
b4) cte 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 apariiile irului
de caractere precizat n urmtoarele cazuri:
c1) nu conteaz diferena dintre literele mari i mici;
c2) conteaz diferena dintre literele mari i mici;
c3) nu conteaz dac irul de caractere este un cuvnt+cerina c2;
c4) irul de caractere este un cuvnt+ cerina c2.
d) S se afieze 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 afieze pentru fiecare liter, cte litere sunt n text (frecvena de apariie a
literelor). Afiarea se va face pe ecran sub forma:
Literea a sau A ............ 20
Literea b sau B ............ 5
........................................
Lista se va afia sortat n dou moduri: n ordinea alfabetic a literelor i n
ordinea descresctoare a frecvenei de apariie.
g) S se afieze litera care are cea mai mare frecven de apariie n text.
h) S se afieze media apariiilor i abaterea medie ptratic. Ce informaii obinei
comparnd cele dou valori obinute.
6.
7.
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 puin de cinci note;
c) teza are ponderea de 25% din media semestrial.
Scriei un program care s afieze urmtoarele informaii:
a) corigenii de pe fiecare semestru i corigenii anuali;
b) o list ordonat alfabetic dup numele i prenumele elevilor care s conin
numele, prenumele, mediile semestriale i media anual;
c) o list ordonat descresctor dup media anual care s conin numele, prenumele, mediile semestriale i media anual;
d) numele elevului cu cea mai mare medie pe semestrul 1, pe semestrul 2 i respectiv pe an;
e) media general a clasei i abaterea medie ptratic a mediilor pe fiecare semestru i pe an (ce concluzie tragei prin compararea acestor medii?).
8. Completai biblioteca vectori cu urmtaorele subprograme pentru operaii cu vectori:
proceduri pentru adunarea i produsul vectorial a doi vectori i funcii pentru produsul
scalar a doi vectori i pentru suma i produsul elementelor unui vector. Testai noile
subprograme adugate la bibliotec.
9. Construii o bibliotec pentru operaii cu mulimi care s permit executarea urmtoarelor operaii: citirea i afiarea unei mulimi, reuniunea, intersecia, diferena, diferena simetric, produsul cartezian a dou mulimi, cardinalul unei mulimi (numrul de elemente), apartenena unui element (a crui valoare o vei comunica de la tastatur) la o mulime. Pentru mulimi vei folosi tipul de date vector. Spre deosebire de un vector oarecare,
ntr-un vector care pstreaz elementele unei mulimi nu pot exista dou elemente cu
aceeai valoare.
10. Construii o bibliotec cu operaii cu iruri de caractere n care s pstrai subprograme pentru rezolvarea cerinelor de la problema 5. Construii programe pentru
testarea acestei biblioteci.
11. Folosind editorul de texte Notepad vizualizai coninutul fiierelor clieni.dbf i clieni.fpt.
Observai c orice persoan care vrea s citeasc datele din tabelele bazei de date poate
face acest lucru cu un simplu editor de texte. Cu puin efort poate identifica ce reprezint
fiecare dat i poate obine anumite informaii care pot fi secrete. Pentru a evita acest lucru
putei codifica datele de tip alfanumeric (cmpurile de tip ir de caractere aflate n fiierul cu
extensia .dbf i cmpurile memo aflate n fiierul cu extensia .fpt). Vei crea un cod simplu:
translatai cu o valoare stabilit (de exemplu 15) codurile ASCII ale caracterelor. Construii
dou subprograme: unul pentru codificare (pe care l folosii nainte de nchiderea bazei de
date) i unul pentru decodificare (pe care l folosii la deschiderea bazei de date). irurile de
caractere pot conine numai cifre, litere i anumite semne speciale. Pentru a evita afiarea
n irurile de caractere codificate a altor caractere, putei complica codul folosind pentru
acelai tip de caractere (cifre, litere sau semne speciale) o translatare circular. De
exemplu, pentru literele mici considerai 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).
209
ncercai:
Adevrat/Fals:
1. O procedur utilizator din Visual FoxPro poate fi activat ca o funcie.
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 putei deschide mai multe ferestre de editare.
6. Instruciunea exit red controlul sistemului de operare.
7. Instruciunea public creeaz variabile de memorie.
8. Printr-o comand compile putei compila un singur program.
Completai:
1. n instruciunea alternativ generalizat do case ... endcase cuvntul cheie ............ precede instruciunile care se vor executa dac nici unul dintre cazuri nu a fost adevrat.
2. Comentariul inserat ntr-o linie a programului trebuie precedat de .................
3. Instruciunea prin care putei fora reevaluarea condiiei de terminare a unei structuri
repetitive este .....................
4. Pentru crearea unei capcane pentru erori folosii comanda ........................
5. Coninutul liniei care a cauzat o eroare de compilare este furnizat de funcia ...............
6. Putei s urmrii execuia pas cu pas a unui program n fereastra ....................
7. Parametrii formali se declar cu instruciunea .................
8. Aflai numrul de parametri actuali transmii unui subprogram cu funcia ...................
9. Deschidei o bibliotec de subprograme cu comanda ..........................
Alegei rspunsurile corecte:
1. n funcie de context, ntr-un program Visual FoxPro caracterul = poate fi:
a) operator relaional
b) operator de atribuire
c) comand
2. Dac din mai multe aciuni posibile trebuie s se execute una singur vei folosi:
d) instruciuni if ... endif imbricate
e) instruciunea do case ... endcase
f) instruciunea scan ... endscan
3. Fraza citete nregistrrile fiierului pn cnd ajungi la marcajul de sfrit de fiier
poate fi descris cu instruciunea:
a) for i=1 to reccount() ... endfor
b) do while not eof() ... enddo
c) scan ... endscan
4. O variabil de memorie declarat privat cu instruciunea 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
6. Linia de comentarii ncepe cu:
a) note
b) *
c) &&
7. Dac scriei numele unui parametru ntre paranteze rotunde, transferul se va face prin:
a) referin
b) valoare
c) adresare indirect
Rspundei:
1. Realizai o comparaie ntre un limbaj de programare structurat studiat i limbajul
gazd Visual FoxPro. Punei n eviden asemnrile i deosebirile referitoare la:
declararea datelor, structurile de control care pot fi folosite, comentarii, modularizarea
unei aplicaii (i tot ce presupune acest prooces - transferul datelor, domeniul de
vizibilitate al identificatorilor etc.), bibliotecile de subprograme etc.
2. Ce tipuri de structuri de control sunt implementate n limbajul gazd Visual FoxPro?
3. Cum poate fi modularizat o aplicaie n Visual FoxPro? Cte metode exist?
4. Cte tipuri de variabile de memorie sunt n funcie de domeniul de vizibilitate?
spunsuri:
R
Adevrat/Fals: 1-A; 2-F; 3-A; 4-A; 5-A; 6-F; 7-A; 8-F.
Completai: 1-otherwise; 2-&&; 3-loop; 4-on error; 5-message(1); 6-Trace; 7- parameters;
8-parameters(); 9-set procedure to<nume_biblioteca>.
Alegei rspunsurile 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 informaii din lumea care ne nconjoar. Lumea real
este format din obiecte, iar omul interacioneaz cu ea prin intermediul acestor obiecte. O
fotografie prezint i ea un ansamblu de obiecte care sunt caracterizate ns numai de
proprieti (form, dimensiuni, culoare etc.), nu i de aciuni. Ea este o reprezentare static
a lumii reale. Dar lumea care ne nconjoar este o lume dinamic n care fiecare obiect este
determinat de proprieti, metode i evenimente. Putem s ne gndim la proprieti ca la
atributele obiectului, la metode ca la aciuni ale obiectului, iar la evenimente ca la rspunsuri ale obiectului la aciunile omului asupra lui. Pentru a nelege mai bine ce nseamn
proprietile, metodele i evenimentele s considerm un obiect din viaa de zi cu zi: balonul unui copil. Balonului i se pot asocia proprieti, metode i evenimente. Proprietile balonului includ att atributele vizibile cum sunt nlimea, diametrul, culoarea, cele care descriu starea lui (umflat sau dezumflat), ct i atribute invizibile cum este vrsta. Prin definiie,
toate baloanele au aceste proprieti. Valorile acestor proprieti difer de la un balon la altul. Balonului i se pot asocia de asemenea i aciuni pe care le poate executa, adic metode: metoda de umflare a balonului (aciunea prin care se umfl balonul cu aer), metoda de
dezumflare a balonului (aciunea prin care se scoate aerul din balon), metoda de nlare a
balonului (aciunea prin care se ridic balonul). Toate baloanele sunt capabile s execute
aceste aciuni, deci au asociate aceste metode. Baloanele au i rspunsuri predefinite la
anumite evenimente externe: la evenimentul neptur, rspunsul este dezumflarea automat, iar la evenimentul eliberarea balonului rspunsul este nlarea lui n aer.
211
Aadar, baloanele difer ntre ele numai prin valorile proprietilor i au acelai comportament (reacioneaz la aceleai evenimente prin aceleai metode). Putem spune c balonul
este un tip de obiect din lumea real, iar mulimea baloanelor formeaz o clas de obiecte.
Aa cum o fotografie descrie starea unui obiect la un moment dat, i o structur de date
folosit pentru descrierea obiectului nu poate s caracterizeze dect starea acelui obiect la
un moment dat, deci este o descriere static a obiectului. Tendina limbajelor moderne de
programare este de a pune n coresponden obiectele reale cu obiectele virtuale pentru a
putea evidenia transformrile pe care acestea le sufer n mod continuu. Obiectul va ncapsula att datele care descriu proprietile, 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
interfeei. Aa cum obiectele cu care venim n contact reprezint interfaa ntre noi i lumea
real i interfaa grafic dintre utilizator i programul de aplicaie este construit cu diferite
obiecte virtuale afiate pe ecran care pot fi acionate cu mouse-ul i tastatura. Putem spune
c n urma acionrii, obiectul declaneaz un anumit eveniment. Deoarece, utilizatorul
poate veni n contact cu mai multe aplicaii, s-a cutat o standardizare a acestor obiecte
att din punct de vedere al proprietilor, ct i din punct de vedere al evenimentului
declanat. De exemplu, dac un utilizator vede pe ecranul calculatorului un buton pe care
scrie OK, tie c dac l va aciona se va nchide caseta de dialog i se va continua
execuia aplicaiei.
Ai studiat deja principiile programrii orientate pe obiecte. Dintre conceptele studiate, s
ne reamintim urmtoarele:
Proprietatea (property) reprezint un atribut al unui obiect care definete 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.
Evenimentul (event) reprezint o aciune recunoscut de obiect pentru care se poate scrie un
program ca rspuns. Evenimentele pot fi externe, adic generate de aciuni ale utilizatorului (un
clic cu mouse-ul, micarea mouse-ului, apsarea unei taste) sau interne, adic generate printr-un cod de program sau de sistem.
Clasa (class) reprezint definiia unui anumit tip de obiect. Definiia cuprinde descrierea
proprietilor i a metodelor obiectului. Folosirea claselor permite gestionarea mai multor
obiecte de acelai tip. Clasa este ns doar un termen abstract, un ablon care definete
caracteristicile unui obiect (cum arat i cum se comport).
212 Informatic
Instana (instance) reprezint un obiect creat pornind de la definiia unei clase. Spre deosebire de
clas care este doar o definiie, o instan exist ca un obiect care poate fi folosit pentru a
executa anumite aciuni. De exemplu, o caset de text dintr-un formular este o instan a clasei
TextBox care descrie acest tip de obiecte vizuale.
Instane multiple (multiple instances) reprezint mai multe obiecte create de aceeai clas.
Obiectele au propriile proprieti i date private, dar folosesc mpreun codul de program.
ncapsularea (encapsulation) reprezint un mecanism prin care folosind o singur definiie sunt
incluse n obiect datele i metodele. Datele membre ale unui obiect nu pot fi modificate dect
prin intermediul metodelor proprii obiectului respectiv. ncapsularea izoleaz complexitatea
intern a unui obiect de restul aplicaiei.
Motenirea (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 printe (parent class) prin preluarea caracteristicilor clasei printe. Clasa copil se mai
numete i clas derivat (subclass), iar clasa printe clas de baz (base class). Folosind
aceast facilitate se poate crea o ierarhie de clase i se poate dezvolta uor un software existent. Clasa copil motenete accesul la datele i metodele strmoilor. La acestea, programatorul poate aduga proprieti i metode noi, definite explicit n noua clas. Orice modificare ntrun strmo se reflect i la urmai. De exemplu, dac o clas Text are proprietatea ca textul s
fie scris ngroat, orice urma al acestei clase va avea aceast proprietate.
2.2.1. Clasele
Visual FoxPro are implementate mai multe clase predefinite care permit crearea unor
obiecte cu care poate fi construit interfaa unei aplicaii, cum sunt de exemplu casetele
213
214 Informatic
9 Proprieti noi. Ele vor fi precizate printr-o list de operaii de atribuire <nume_pr>=
<exp>, unde <nume_pr> este numele proprietii, iar <exp> este valoarea cu care se
iniializeaz proprietatea. Proprietile pot fi protejate, adic se poate mpiedica accesul la proprietate i se poate mpiedica modificarea ei din afara definiiei clasei. Protejarea unor proprieti se precizeaz cu clauza protected nsoit de lista de proprieti
care vor fi protejate: <nume_pr1>, <nume_pr2>,... .
9 Obiecte noi. Fiecare obiect nou care va fi adugat la definiia clasei este precizat printr-o
clauz add object. Obiectul va fi identificat prin <nume_ob> i va fi adugat dintr-o clas
precizat prin <nume_cls3> din clauza as. Obiectul adugat 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 inializare a obiectului la adugarea obiectului. Explicit nu se face
iniializarea dac este precizat clauza noinit. Explicit se poate preciza cu clauza with
lista proprietilor i valorile proprietilor care se adaug obiectului adugat la clas.
9 Metode i evenimente noi. Ele sunt create ca un set de subprograme (proceduri i
funcii). Fiecare funcie i procedur este delimitat de cuvintele cheie function i
endfunc i respectiv procedure i endproc. ntre cuvintele cheie se scrie secvena
de instruciuni care formeaz corpul subprogramului. Se pot folosi parametri de
comunicaie ntre subprogram i obiect sau ntre subprogramele aceleiai clase.
Parametrii se declar la nceputul fiecrui subprogram cu instruciunea 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 aciona asupra obiectului creat pe baza
clasei i care poate fi apelat indiferent de ndeplinirea unor condiii, iar evenimentul va
fi un subprogram care se va executa numai atunci cnd se produce o aciune (de
exemplu un clic cu mouse-ul) recunoscut de obiectul creat pe baza clasei.
Observaii:
1. Define class este instruciune deoarece nu poate fi folosit n modul interactiv, ci numai n programe. Instruciunea are o sintax de bloc, deoarece este format dintr-un
ansamblu de instruciuni. Blocul de instruciuni ncepe cu comanda define class i se
termin cu cuvntul cheie enddefine. Instruciunile componente sunt scrise n
sintaxa blocului fiecare pe cte un rnd i trebuie scrise pe un singur rnd i n cadrul
unui program (la fel ca orice instruciune independent).
2. Clauza as precede numele clasei printe pe care se bazeaz definiia noii clase sau a
unui obiect adugat 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 conine
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 formular va conine pe lng proprietile, metodele i evenimentele clasei form proprietile
nume i versiune i metoda click.
215
2.2.2. Obiectele
Obiectele se creeaz pe baza claselor definite. Obiectul este instana unei clase. Pentru crearea unui obiect se folosete funcia createobject() care are sintaxa:
createobject('<nume_cls>' [,<p1>, <p2>, ...]
Rezultatul furnizat de funcie este de tip obiect (adic referin ctre 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 identificator, ci ca un ir de caractere. Pentru a putea folosi obiectul, trebuie s se atribuie referina
ctre 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
obiect = createobject('clasa')
atribuie referina ctre acest obiect:
n lucrul cu clase i obiecte se folosesc urmtorii operatori specifici:
9 Operatorul . (punct). Se folosete pentru a separa numele obiectului de numele
printelui sau pentru a separa numele unui membru al obiectului (proprietate, metod
sau eveniment) de numele obiectului.
9 Operatorul :: (delimitarea domeniului). Se folosete atunci cnd dorii s apelai
dintr-o clas o metod din clasa printe.
Astfel, sintaxa general pentru a avea acces la unul din membrii unui obiect este:
<nume_obiect>.<nume_membru>
unde <nume_membru> este numele unei proprieti, al unei metode sau al unui eveniment al
obiectului.
216 Informatic
n cadrul definiiei unei clase se pot folosi urmtoarele 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 conine obiectul curent (formularul curent).
9 ThisFormSet - setul de formulare curent care conine 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 execuiei unui program putei s adugai sau s nlturai obiecte dintr-un
obiect container folosind metodele obiectului container: AddObject() pentru adugarea i
RemoveObject() pentru nlturarea 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 nltur obiectul cu numele
<nume_ob2>. Obiectul nlturat nu va mai fi afiat pe ecran.
Observaii:
n sintaxa celor dou funcii numele obiectului container a fost separat prin operatorul punct
de numele metodei membru al obiectului container.
Exemplu:
n acest exemplu putei observa cum este folosit operatorul :: pentru a apela o metod
din clasa printe (n clasa F2 este apelat metoda click definit n clasa F1 care este
clasa printe a clasei F2) i referina 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 putei observa cum pot fi folosite metodele proprii ale obiectului, cum
pot fi modificate proprietile unui obiect, cum se fac referirile la proprietile i metodele
unui obiect i cum este folosit operatorul punct n aceste referiri:
217
218 Informatic
9 Datele unui obiect pot fi prelucrate prin metodele proprii obiectului. n timpul acestor pre-
lucrri pot s fie necesare diferite variabile temporare. Acestea trebuie definite ca proprieti ale obiectului pentru a putea fi folosite n interiorul obiectului, dar trebuie izolate de
exteriorul lui, deoarece modificarea lor din exterior ar putea afecta prelucrrile 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 aceti membri este posibil din interiorul clasei, dar i din exteriorul ei.
9 Protejai. Accesul la aceti membri este posibil din interiorul clasei i din interiorul
unei clase derivate din ea. Aceti membri vor fi declarai protejai prin intermediul
clauzei protected din definiia 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 proprietii data_n.
219
Afiarea listei obiectelor active (numele lor, propietile, metodele i evenimentele asociate) se face cu comanda:
display object [ like <sablon>]
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 funcie. Prin instruciunea ?z.m() afiai valoarea furnizat de metoda m. Observai c pentru metodele care returnez valori folosite n expresii trebuie s scriei 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 definete o clas nou complex1 care va conine n plus o metod
pentru afiarea numrului complex. Pentru definirea acestei metode se va folosi o metod
intern a clasei nrc (metod protejat) pentru calcularea cifrelor unui numr i proprietatea nc
care are ca valoare numrul de cifre al prii ntregi sau imaginare a numrului complex.
Aceast proprietate este folosit numai intern i de aceea este protejat. Ea este necesar
pentru a stabili numrul de poziii afiabile ale unui numr pentru funcia str(). Prin instruciunea z.afiare se apeleaz metoda afisare pentru afiarea unui numr complex. Clasa
complex1 a motenit toate proprietile 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
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
Programarea orientat pe obiecte a dus la dezvoltarea programrii conduse de evenimente. Dac n cazul programrii clasice aplicaia era o colecie de instruciuni care se
executau n ordinea n care au fost scrise, n cazul programrii conduse de evenimente
aplicaia este un ansamblu de subprograme care nu se execut ntr-o ordine prestabilit,
ci n funcie de producerea unor evenimente (deplasarea mouse-ului, executarea unui clic
cu mouse-ul, glisarea unui obiect, apsarea unei taste sau a unei combinaii de taste
etc). Apariia evenimentului este aleatorie i de aceea programul trebuie s tie cum s
rspund la un anumit eveniment. Acest lucru se realizeaz prin asocierea la fiecare
eveniment a unei secvene de cod prin care se descriu operaiile care trebuie executate.
Programarea condus de evenimente se bazeaz pe bucla evenimentului (event loop),
adic un mediu interactiv n execuie care poate fi:
activat cu comanda read events care pornete procesorul de evenimente care va
sesiza apariia unui eveniment i
dezactivat cu comanda clear events care l oprete.
Dup oprirea procesorului de evenimente programul va continua cu prima instruciune
care urmeaz dup comanda read event.
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
Interfaa grafic cu o aplicaie afieaz mai multe ecrane cu obiecte prin intermediul crora utilizatorul interacioneaz cu aplicaia pentru a controla evoluia ei sau pentru a cere s execute
diferite procese prin care se prelucreaz datele n vederea obinerii de informaii (de exemplu,
procesul de cutare ntr-o baz de date a unor date care corespund unui anumit criteriu).
222 Informatic
Orice interfa grafic este realizat din obiecte care au asociate
proprieti, metode i evenimente.
Obiectul virtual este o sum de proprieti, metode i evenimente. Asupra obiectelor
virtuale se pot folosi n general urmtoarele aciuni: clic, dublu clic, glisare i apsarea
unei taste. Prin asociere cu balonul s identificm care sunt proprietile, metodele i
evenimentele asociate unui obiect, cum ar fi butonul declanator dintr-o caset de dialog.
Proprietile sale sunt numele su, poziia n care este afiat fa de marginile ca-setei de
dialog, culoarea butonului i a textului etc. Aciunile care se pot executa asupra butonului
sunt: indicare cu mouse-ul i clic sau apsarea unei anumite taste. Evenimentul
reprezint efectul acionrii butonului prin intermediul mouse-ului sau al tastaturii, adic
rspunsul sistemului n urma acionrii butonului. De exemplu, evenimentul asociat butonului Open este deschiderea obiectului selectat n caseta de dialog (fiier sau dosar).
Programarea orientat pe obiecte poate fi folosit pentru realizarea unei interfee deoarece sistemul de gestiune a bazelor de date Visual FoxPro pune la dispoziia utilizatorului
mai multe clase vizuale predefinite:
Numele clasei
CheckBox
Comutator
Column
Coloan ntr-o
gril
ComboBox
List combinat
CommandButton Buton de
comand
Command
Group
Container
Obiect container
Control
Obiect container
Container care poate include i obiecte ale utilizatorului, obiectele incluse fiind protejate (nu este permis accesul la obiectele coninute).
EditBox
Zon de editare
text
Form
Formular
223
Numele clasei
FormSet
Set de formulare
Container care poate conine unul sau mai multe formulare legate ntre ele sau bare cu instrumente.
Grid
Gril
Container care creeaz o gril pentru prezentarea datelor pe rnduri i coloane, sub form de tabel; poate
conine numai controale de tip coloan ntr-o gril.
Header
Antet de coloan Obiect care conine antetul coloanei i care nu poate fi folosit independent, ci numai ntr-un container
de tip coloan ntr-o gril.
Image
Imagine
Label
Etichet
Line
Linie
ListBox
List
OLEContainer
Control
Control de
tip OLE
OLEBound
Control
OptionButton
Buton de opiuni
(radio)
OptionButton
Group
Grup cu butoane
de opiuni (radio)
Page
Pagin
PageFrame
Set de pagini
Separator
Shape
Form
224 Informatic
Numele clasei
Spinner
TextBox
Caset de text
Timer
ToolBar
Bar cu
instrumente
Ai observat c obiectele vizuale pe care le putei crea pot fi simple sau containere. n
general, obiectele container nu pot conine orice obiecte. De exemplu:
Container
grup de butoane de comand
grup cu butoane de opiuni
set de pagini
pagin
set de formulare
formular
gril
coloan ntr-o gril
bar de instrumente
Coninut
butoane de comand
butoane de opiuni
pagini
controale, containere, obiecte utilizator
formulare, bare de instrumente
set de pagini, controale, containere, obiecte utilizator
coloane ntr-o gril
antet de coloan i orice obiect cu excepia formularelor, a seturilor de formulare, a coloanelor ntr-o gril i a
barelor cu instrumente
controale, seturi de pagin, containere
Ai mai observat c unele obiecte nu pot fi definite independent, ci numai n interiorul unui
container. De exemplu:
Obiect
antet de coloan
buton pentru opiune
coloan ntr-o gril
pagin
separator
Container
coloan ntr-o gril
grup de butoane pentru opiuni
gril
set de pagini
bar de instrumente
Pe lng aceste obiecte predefinite care creeaz obiecte vizuale ntr-o aplicaie, mai
putei folosi urmtoarele obiecte predefinite:
225
Cursor
Obiect creat atunci cnd se adaug un tabel sau o vizualizare la mediul de date dintr-un tabel, dintr-un formular sau dintr-un set de formulare; permite specificarea proprietilor tabelului sau ale vizualizrii atunci
cnd este lansat n execuie formularul sau raportul.
Relation
Relaie
Data
Environment
Mediu de date
Obiect container pentru obiectele cursor i relaie asociate unui formular, raport sau set de formulare; se creeaz o dat cu raportul, formularul sau setul de formulare.
Exemplu:
Folosind clasele vizuale predefinite s-au creat trei formulare: primul formular conine o
etichet i dou butoane de comand, care dac vor fi acionate vor deschide fiecare
cte un alt formular u o etichet i un buton de comand. Fiecare buton reacioneaz
diferit la evenimentul clic cu mouse-ul, i de aceea a fost scris cte o procedur pentru
fiecare eveniment: b1.click, b2.click, b3.click i b4.click. Metoda release se folosete
pentru a terge din memorie obiectul de tip formular.
forma1=createobject('Form1')
forma2=createobject('Form2')
forma3=createobject('Form3')
* Afiseaza primul formular:
forma1.show
read events
define class form1 as Form
* Se definesc proprietatile
* formularului form1:
caption='Intrebare'
closable=.F.
height=143
width=386
226 Informatic
* Se adauga obiecte la
* formular
add object text as Label
add object b1 as CommandButton
add object b2 as CommandButton
* Se definesc proprietatile
* obiectului text:
text.caption='Ati rezolvat;
testul din capitolul;
precedent?'
text.height=16
text.left=45
text.top=34
text.width=376
text.visible=.T.
* Se definesc proprietatile
* obiectului b1:
b1.caption='Da'
b1.height=33
b1.left=40
b1.top=96
b1.width=114
b1.visible=.T.
* se definesc proprietatile
* obiectului b2:
b2.caption='Nu'
b2.height=33
b2.left=222
b2.top=96
b2.width=114
b2.visible=.T.
* Se defineste codul evenimen* tului click pe obiectul b1:
procedure b1.click
thisform.release
* Afiseaza al doilea formular:
forma2.show
endproc
* Se defineste codul evenimen* tului click pe obiectul b2:
procedure b2.click
thisform.release
* Afiseaza al treilea formular:
forma3.show
endproc
enddefine
define class form2 as Form
caption='Raspuns'
closable=.F.
height=143
width=346
227
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 pstra o colecie de clase
vizuale. Se memoreaz ntr-un fiier cu extensia .vcx.
Asupra unei biblioteci de clase se pot executa urmtoarele operaii:
crearea bibliotecii
create classlib
adugarea unei clase
Opreaii de
ntreinere
add class
nlturarea unei clase
remove class
Biblioteca
deschidere bibliotec
set classlib to
Opreaii 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 fiierului).
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
adugat dintr-un program, dintr-o aplicaie sau dintr-un fiier de proceduri.
Comanda remove class are sintaxa:
remove class <nume_cls> of <nume_bib>]
i nltur definiia 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
cnd deschide biblioteca precizat prin <nume_bib> sau sintaxa:
set classlib to
cnd nchide toate bibliotecile deschise.
Comanda release classlib are sintaxa:
release classlib <nume_bib>
i nchide biblioteca precizat prin <nume_bib>.
Observaie:
229
clear
set talk off
punct=CreateObject("puncte")
punct.generare
?'Distanta fata de origine: '
??punct.distanta()
?'Unghiul fata de sistemul de;
axe: '
??punct.argument()
define class puncte as custom
x=0
y=0
d=0
a=0
procedure generare
? 'Coordonatele punctului:'
input 'x= ' to this.x
input 'y= ' to this.y
endproc
function distanta
this.d=sqrt(this.x**2+;
this.y**2)
return this.d
endfunc
function argument
if this.x=0
230 Informatic
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. Identificai clasele i obiectele, proprietile i metodele obiectului.
b. Explicai ce realizeaz programul.
c. Pe baza acestui program definii obiectul dreapt cu metodele generare i calculul
lungimii i obiectul dreptunghi cu metodele generare i calculul ariei i al perimetrului.
2. Identificai i corectai erorile din urmtorul program:
clear
set talk off
z=CreateObject("Complex")
z.citire
?z.modul()
define class complex as custom
dimension c(2)
m=0
procedure citire
clear
set talk off
z=CreateObject("Complex")
input 're= ' to z.re
input 'im= ' to z.im
?z.m(z.re,z.im)
define class complex as custom
re=0
im=0
m=0
function modul
parameter re,im
this.modul=sqrt(re**2+im**2)
return this.m
endfunc
enddefine
procedure citire
input 're= ' to this.re
input 'im= ' to this.im
endproc
Modificai corespunztor programul astfel nct citirea numrului complex s se fac
prin intermediul acestei metode.
231
ncercai:
Adevrat/Fals:
1. n definiia unei clase de obiecte metodele se scriu naintea proprietilor.
2. ntr-un program definiia 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 acelai nume ca i proprietile obiectului.
5. Instruciunea with ... endwith poate fi folosit n instruciunea pentru definirea unei clase.
6. Clasele pot fi adugate la biblioteci din fiiere de programe.
7. O clas printe motenete proprietile i metodele de la urmai.
8. n definiia unei clase trebuie precizat obligatoriu clasa printe.
9. Aciunea metodelor i rspunsul la evenimente se definete cu ajutorul subprogramelor.
Completai:
1. Instruciunea pentru definirea clasei este o instruciune ........... delimitat de cuvintele
cheie ............................... i ..............................
2. Aciunea metodelor se definete prin intermediul .........................
232 Informatic
Alegei rspunsurile corecte:
1. Putei aduga un obiect la un obiect container cu:
a) instruciunea Add Object
b) metoda AddObject
c) instruciunea Add Class
2. Aflai ci strmoi are o clas folosind funcia:
a) aclass()
b) ainstance()
c) amembers()
3. Aflai cte obiecte au fost realizate pe baza aceleiai clase folosind funcia:
a) aclass()
b) ainstance()
c) amembers()
4. Form este:
a) o clas vizual de tip container predefinit
b) o clas vizual simpl predefinit
c) un obiect vizual din clasa predefinit PageFrame.
5. Header este:
a) un obiect independent predefinit
b) un obiect predefinit dependent de clasa Column
c) un obiect predefinit dependent de clasa Grid.
Rspundei:
1. Realizai o comparaie ntre modurile n care este implementat programarea pe
obiecte n limbajul de programare structurat studiat i limbajul gazd Visual FoxPro.
2. Ce tehnici caracteristice programrii pe obiecte sunt implementate n Visual FoxPro?
R spunsuri:
Adevrat/Fals: 1-F; 2-F; 3-A; 4-A; 5-F; 6-F; 7-F; 8-A; 9-A;.
Completai: 1-bloc, define class, enddefine; 2-subprogramelor;
Alegei rspunsurile 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
233
Fiecare tip de control are propriul su set de proprieti, metode i evenimente care l fac
potrivit unui anumit scop. Unele dintre cotroalele pe care le putei folosi n aplicaii sunt
cele mai potrivite pentru introducerea i afiarea datelor. Altele v permit s cerei executarea unui proces n cadrul aplicaiei sau v permit accesul la alte aplicaii ca s putei
prelucra unele date ca i cum ar face parte din propria aplicaie.
ntr-o interfa pot fi folosite urmtoarele tipuri de controale:
9 controalele pentru executarea aciunilor: butonul de comand, opiunea de meniu;
9 controalele pentru introducerea i afiarea 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 combinat, grupul cu butoane de opiuni;
9 controalele grafice: linia, chenarul, imaginea, forma;
9 controalele care i permit afiarea obiectelor inserabile create cu alte aplicaii.
234 Informatic
9 Bare cu instrumente (toolbar). Este o caset de dialog mai special care conine
numai butoane de comand reprezentate n general prin pictograme. Ea poate fi
mobil (float), adic poate fi afiat oriunde n interiorul ferestrei de aplicaie sau fix
(dock), adic poate fi lipit de una dintre marginile ferestrei de aplicaie. Bara de titlu
este afiat numai n barele cu instrumente flotante.
Pentru implementarea acestor obiecte pentru interfa, Visual FoxPro pune la dispoziia programatorului urmtoarele obiecte vizuale predefinite:
9 Pentru formulare: FormSet, Form, Page, !
PageFrame i ToolBar.
Asociai obiectele vizuale predefinite
9 Pentru controale: EditBox, TextBox, Label,
prezentate n capitolul anterior, cu tipuSpinner, 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 instruciunilor de program. La crearea obiectelor se pot folosi clasele predefinite de obiecte
specifice programrii orientate pe obiecte. Dup crearea programului surs, pentru a
realiza interfaa, trebuie lansat n execuie programul cu comanda do <nume_fiier>.
9 Folosind programarea vizual. n acest caz, caracteristicile formularelor sunt nregistrate sub forma unui tabel ntr-un fiier de date care are extensia .scx. Aceste date
sunt interpretate de un modul al sistemului. Lansarea n execuie a acestui modul,
mpreun cu fiierul care conine tabelul (<nume_formular>) se face cu comanda:
do form <nume_formular> with <lista_parametri_actuali>
Comanda de lansare n execuie 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 execuie.
tivitatea cu utilizatorul?
Elementele de interfa ale unei aplicaii sunt dependente de funciile pe care trebuie s
le ndeplineasc aplicaia. n plus, atunci cnd se proiecteaz interfaa unei aplicaii,
trebuie proiectate i urmtoarele elemente:
235
Formularul de nceput (startup form). Este primul formular care se afieaz i reprezint
ce va vedea prima dat utilizatorul cnd va porni aplicaia. Unele interfee nu au un
formular specific de nceput. Acest caz apare atunci cnd aplicaia ncepe cu ncrcarea
unui fiier de date i testarea unor date, iar primul formular care va fi afiat va depinde de
rezultatul testului. Formularul de nceput poate fi o caset prin care se cere introducerea
unei parole prin care utilizatorul i ctig dreptul de a folosi aplicaia. Asupra parolei se
pot pune restricii. De exemplu, dac utilizatorul nu a introdus parola corect din trei
ncercri, se va afia un mesaj de eroare i se va termina execuia programului.
Ecranul introductiv (splash screen). Dac dureaz foarte mult ncrcarea i lansarea n
execuie a unei aplicaii, este bine ca n acest timp s fie afiat un ecran introductiv n
care se poate afia un mesaj sau emblema firmei.
Formularul de sfrit (ending form). Este ultimul formular care se afieaz la terminarea
aplicaiei. Este bine ca acest formular s conin un buton de nchidere a aplicaiei care
s fie acionat de utilizator, operaie care s ofere sigurana nchiderii tuturor fiierelor i
descrcrii tuturor formularelor interfeei aplicaiei. Unele interfee rezolv nchiderea
aplicaiei prin opiunea de meniu ExitFile, care termin execuia aplicaiei, nchide toate
fiierele i descarc toate formularele deschise.
nainte de a se proiecta interfaa trebuie s se cunoasc scopul aplicaiei. Unele aplicaii sunt
folosite n mod constant, iar altele ocazional pe o perioad scurt de timp. De asemenea, o
aplicaie care are ca scop principal afiarea informaiilor are cerine diferite fa de una care
este folosit pentru a colecta date. Interfaa este influenat i de categoria de utilizatori care
o va folosi. Dac sunt utilizatori nceptori, interfaa trebuie s fie ct mai simpl, iar dac
utilizatorii sunt experimentai ea poate s fie mai complex. n plus, dac aplicaia va cunoate o distribuie internaional, trebuie s in cont de limba i cultura viitorilor utilizatori.
Orice interfa trebuie s ndeplineasc urmtoarele cerine ale utilizatorului:
9 Interfaa trebuie s-i permit utilizatorului s controleze evoluia programului.
9 Sistemul de meniuri trebuie s fie concis, eficient, logic i bine structurat.
9 Ecranul nu trebuie aglomerat cu obiecte. Dac o fereastr conine prea multe butoane, ele ar trebui nlocuite cu opiuni de meniu. Se vor afia sub form de butoane
numai controalele care sunt folosite foarte des.
9 Interfaa trebuie s-i ofere utilizatorului o reprezentare vizual complex a opiunilor
de lucru ale aplicaiei la momentul respectiv. Folosirea porprietilor de disponibilitate sau de vizibilitate ale unui obiect vizual este foarte important deoarece mpiedic
accesul uitilizatorului la obiectele care nu pot fi acionate n acel moment.
9 Utilizatorul trebuie s fie informat continuu de starea programului. Dac un proces
dureaz prea mult timp, interfaa nu trebuie s nghee, 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 afiarea unui contor
care numr paii parcuri de proces, fie prin afiarea unui indicator de evoluie, fie
prin imagini grafice animate.
9 Interfaa trebuie s permit anularea unor operaii pentru ca utilizatorul s-i poat
corecta uor unele greeli, fie de introducere a datelor, fie de prelucrare a lor. Pentru
operaiile de tergere este bine s cerei confirmarea operaiei. Pentru operaiile de
introducere a datelor trebuie s prevedei ct mai multe operaii de verificare a
236 Informatic
corectitudinii datelor introduse (prin compararea lor cu limitele permise, prin introducerea acelorai date de dou ori i compararea celor dou valori introduse etc.).
9 Aplicaia trebuie s prevad ct mai multe cazuri de eroare astfel nct s poat funciona n ct mai multe condiii ale datelor de intrare. Orice eroare detectabil trebuie s
declaneze un proces de informare a utilizatorului (prin mesaje care s precizeze
cauzele erorii i eventual prin sunete pentru atenionare) i de recuperare a datelor.
moment dat deschiderea unui singur document (de exemplu aplicaia Notepad). Dac
vrei s deschidei un nou document, trebuie nchis cel precedent (dac alegei opiunea
NewFile pentru a deschide un nou document, documentul curent va fi nchis).
Interfa cu mai multe documente (multiple-document interface - MDI) care permite
deschiderea mai multor documente (de exemplu aplicaia Word). La un moment dat pot
fi deschise mai multe documente, fiecare document n fereastra sa (dac este deschis
un document i alegei opiunea NewFile, aplicaia va crea un nou formular n care va fi
deschis noul document). Acest stil de interfa poate fi recunoscut prin existena n bara
de meniuri a titlului meniului Window ale crui opiuni sunt folosite la manipularea
ferestrelor cu documente. Unul singur dintre documente este activ, adic documentul
care primete datele introduse de la tastatur de ctre utilizator. Formularul
documentului activ este obiectul focalizat din interfaa aplicaiei.
Interfa de explorare (explorer-style interface) care conine o singur fereastr
mprit n dou regiuni numite panouri (panel). De obicei, panoul din stnga
conine un arbore sau o structur ierarhic, iar panoul din dreapta o zon de afiare
a unei liste (de exemplu aplicaia Windows Explorer). Un astfel de tip de interfa se
folosete atunci cnd trebuie s se caute ntr-o list mare cu articole (fiiere,
documente, imagini etc.) prin operaia de rsfoire (browse).
Stilul interfeei se alege n funcie de tipul aplicaiei. Stilul MDI se folosete la aplicaiile 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 aplicaii (cum sunt aplicaiile de tip calendar sau calculator) este
suficient s se deschid un singur document i de aceea se folosete o interfa SDI. n
general, stilul SDI este cel mai rspndit deoarece este un stil de interfa pe care
proiectantul produsului o creeaz mai uor i care este mai simpl i pentru utilizator.
Stilul MDI permite crearea unei interfee care administreaz mai multe formulare ntr-un
singur formular container. Formularul container se mai numete i fereastr printe
(parent window), iar formularele din interiorul su se numesc ferestre copil (child
windows). O aplicaie MDI poate avea un singur formular printe i mai multe formulare
copil. Formularul printe nu poate fi un formular modal. Ferestrele copil pot fi de acelai
tip sau de tipuri diferite. Fereastra printe furnizeaz un spaiu de lucru (workspace)
pentru toate ferestrele copil ale aplicaiei. Spaiul de lucru este delimitat de bordura
formularului printe i este situat sub bara de meniu.
237
238 Informatic
Proprietile standard (proprietile comune majoritii obiectelor) sunt:
9 Numele obiectului - Name . Se folosete pentru a referi obiectul n program.
9 Dimensiunile obiectului. Sunt de tip numeric i se exprim n pixeli. Sunt date de:
Height - nlimea (dimensiunea pe vertical) i
Width - limea (dimensiunea pe orizontal).
9 Coordonatele obiectului. Reprezint un sistem de dou coordonate [x,y] prin care
se stabilete poziia obiectului fa de colul din stnga sus al reperului (ecranul sau
formularul din care face parte). Pentru stabilirea coordonatelor se folosesc proprietile de tip numeric, exprimate n pixeli :
Left - poziia pe orizontal, fa de marginea stng a reperului (x),
Top - poziia pe vertical, fa de marginea de sus a reperului (y),
9 Legenda - Caption . Este un text prin
care utilizatorul poate identifica rolul obiec!
tului. n cazul formularelor, legenda este
Proprietatea Name se folosete pentru
afiat n bara de titlu. n cazul controaleidentificarea obiectului n interior (la nivel
lor, este afiat n interiorul lui sau lng el.
de program, de ctre programator), iar
Au legend urmtoarele controale: butonul
proprietatea Caption se folosete pentru
identificarea lui n exterior (la nivel de
de comand, comutatorul, butoanele de
interfa, de ctre utilizator).
opiuni, cadrele, eticheta, meniul. Proprietatea este de tip ir de caractere.
9 Caracteristicile caracterelor folosite n formular. Sunt trei proprieti prin care se caracterizeaz textele:
FontName - numele fontului, de tip ir de caractere: Arial, Courier New, Times
New Roman etc.,
FontSize - dimensiunea, de tip numeric, exprimat n pixeli.
stilul caracterelor de tip logic:
FontBold - ngroat, FontItalic - aplecat,
FontUnderline - subliniat,
FontCondense - condensat,
FontExtend - extins, FontOutline - cu
contur, FontStrikethrough - tiat i
FontShadow - cu umbr.
9 Culoarea folosit la afiarea textului este
specificat prin proprietile de tip nume-ric
ce reprezint codul culorii astfel:
BackColor
- culoarea fundalului
obiectului n care este afiat textul;
ForeColor - culoarea primplanului, adic
a textului sau a imaginii din obiect.
9 Chenarul (Border) este folosit la unele
obiecte (formularul, eticheta, caseta de text,
grila, imaginea, caseta de imagine, linia,
forma) ca un delimitator. Chenarul poate fi
fix sau dimensionabil, trasat cu linie simpl
Cod
0
1
2
3
4
5
6
0
1
2
239
Pentru precizarea codului unei culori se folosete schema de culori RGB prin care precizai
prin trei numere cuprinse ntre 0 i 255 intensitatea pentru fiecare din cele trei culori de baz:
rou, verde i albastru. Pentru a afla codul culorii folosii funcia RGB() care are sintaxa
rgb(<r>, <g>,<b>), unde cei trei parametri reprezint intensitile celor trei culori:
Culoare
Alb
Negru
Gri
Gri nchis
Rou
Rou nchis
Galben
Galben nchis
Parametri RGB()
255, 255, 255
0, 0, 0
192, 192, 192
128, 128, 128
255, 0, 0
128, 0, 0
255, 255, 0
128, 128, 0
Numr
16777215
0
12632256
8421504
255
128
65535
32896
Culoare
Verde
Verde nchis
Cian
Cian nchis
Albastru
Albastru nchis
Magenta
Magenta nchis
Parametri RGB()
0, 255, 0
0, 128, 0
0, 255, 255
0, 128, 128
0, 0, 255
0, 0, 128
255, 0 ,255
128, 0, 128
Numr
65280
32768
16776960
8421376
16711680
8388608
16711935
8388736
240 Informatic
3.1.5. Evenimente recunoscute de obiectele vizuale
Att formularele, ct i marea majoritate a controalelor sunt capabile s primeasc din
partea sistemului semnale prin care sunt informate de producerea unui eveniment. La
proiectarea formularului programatorul poate specifica secvene de instruciuni prin care
obiectul trebuie s rspund la diferite evenimente. De exemplu, evenimentele recunoscute de majoritatea obiectelor (formulare i controale) sunt:
9 Evenimente declanate de aciunile mouse-ului:
MouseMove - deplasarea mouse-ului pe obiect;
Clicks - clic cu mouse-ul pe obiect cu butonul din stnga (are ca efect focalizarea
obiectului).
RightClicks - clic cu mouse-ul pe obiect cu butonul din dreapta (are ca efect n
general deschiderea unui meniu dependent de context, adic un meniu cu opiuni
specifice obiectului pe care s-a executat clic);
DblClick - dublu clic cu mouse-ul pe obiect;
MouseDown - apsarea butonului de mouse;
MouseUp - eliberarea butonului de mouse;
DragOvers - glisarea obiectului cu mouse-ul;
DragDrops - glisarea i plasarea obiectului cu mouse-ul.
9 Evenimentul declanat la acionarea unei taste (apsarea i eliberarea ei) KeyPress. Procedurii care se va executa la apariia acestui eveniment i se pot transmite ca parametri numrul asociat tastei apsate i un cod numeric prin care se definete combinaia de taste reci care nsoete tasta apsat. Fiecrei taste reci i corespunde un bit poziionat pe 1 din codul numeric. Astfel, pentru tasta Shift este bitul 0
(rezult codul=1), pentru tasta Ctrl bitul 1
Poziie
2
1
0
(rezult codul=2) i pentru tasta Alt bitul 2
22
21
20
(rezult codul=4). Se pot combina mai multe
Apsai
Alt Ctrl Shift Cod
taste reci.
Shift
0
0
1
1
Ctrl
0
1
0
2
9 Evenimente declanate de crearea i
Ctrl +Shift
0
1
1
3
eliberarea obiectului:
Init - iniializarea obiectului declanat de
crearea lui;
Destroys - eliberarea obiectului declanat de metoda de eliberare a zonei de memorie
alocate obiectului.
Alt
Alt+Shift
Alt+Ctrl
Alt+Ctrl+Shift
1
1
1
1
0
0
1
1
0
1
0
1
4
5
6
7
3.1.6. Focalizarea
Focalizarea (focus) este capacitatea aplicaiei de a primi datele de intrare
ale utilizatorului prin intermediul tastaturii sau al mouse-ului.
Ea se manifest n cadrul interfeei prin prezena selectorului. Cnd selectorul este poziionat pe un obiect, acesta va putea primi datele de intrare ale utilizatorului. Pe de o parte, sistemul de operare Windows permite lansarea n execuie a mai multor aplicaii la un
moment dat, dar numai una dintre aplicaii are capacitatea de focalizare. Aceasta este
241
aplicaia activ, adic aplicaia care va primi datele de intrare furnizate de utilizator. Pe
de alt parte, n cadrul unei aplicaii la un moment dat pot fi deschise mai multe formulare, ns un singur formular are capacitatea de focalizare i se numete formular activ,
iar n cadrul formularului activ un singur control poate primi focalizarea i se numete
control activ.
nainte de a focaliza un obiect trebuie activat containerul, aciune sesizat prin evenimentul Activates. Containerul se activeaz:
9 Interactiv: utilizatorul execut clic pe obiectul container.
9 Din program: se apeleaz metoda Show (afiarea) a obiectului container.
Evenimentul Activate se declaneaz n ordinea de incluziune a formularelor: mai nti
pentru obiectul FormSet, apoi pentru obiectele Form coninute 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 pn
focalizeaz obiectul dorit.
9 Din program: se apeleaz metoda SetFocuss a controlului pe care vrei s-l focalizai.
Un obiect i poate pierde focalizarea:
9 Interactiv: utilizatorul focalizeaz alt obiect executnd clic pe acel obiect.
9 Din program: se apeleaz metoda SetFocuss a controlului pe care-l dorii s preia
focali-zarea.
De aceea, formularele i cele mai multe dintre controale au asociate evenimente de primire a focalizrii i de pierdere a focalizrii. Aceste evenimente sunt:
9 Primirea focalizrii declaneaz evenimentul GotFocuss.
9 Pierderea focalizrii declaneaz evenimentul LostFocuss.
Programatorul poate scrie proceduri pentru aceste evenimente, la nivelul fiecrui control.
De exemplu, atunci cnd un control primete focalizarea (evenimentul GotFocus), prin
intermediul procedurii asociate evenimentului pot fi afiate n casete instruciuni referitoare la control sau n bara de stare mesaje de informare despre control.
Obiectul focalizat este evideniat prin diferite metode. De exemplu, un buton declanator
focalizat este evideniat printr-o bordur care nconjoar butonul.
Un obiect poate fi focalizat numai dac are proprietatea de a fi disponibil (de a rspunde
la acionri de la tastatur sau mouse) i proprietatea de a fi vizibil pe ecran. Nu pot fi
focalizate urmtoarele obiecte: eticheta, linia, forma, imaginea i caseta de imagine.
Focalizarea este controlat prin dou proprieti de tip referin (adres), specifice formularelor, 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 formularul activ dintr-un set de formulare sau de pe ecran. Poate fi folosit n obiectele
container: Form, FormSet, _Screen. Folosind aceast referin putei modifica valoarea unei proprieti a formularului activ sau putei apela o metod a formularului activ:
<nume_obiect_container>.ActiveForm.<proprietate>=<valoare>
<nume_obiect_container>.ActiveForm.<metod>
242 Informatic
9 ActiveControl - controlul activ. Este o proprietate prin care se face referirea la
controlul activ dintr-un obiect container. Poate fi folosit n obiectele container: Form,
Page, ToolBar, _Screen. Folosind aceast referin putei modifica valoarea unei
proprieti a controlului activ:
<nume_obiect_container>.ActiveControl.<proprietate>=<valoare>
Dac obiectul container nu mai conine nici un obiect focalizat, nseamn c el este
dezactivat, stare care va fi sesizat prin evenimentul Deactivates. Evenimentul este
declanat:
9 Interactiv: se mut focalizarea din obiectul container ntr-un alt obiect container sau
ntr-o alt aplicaie.
9 Din program: se creeaz un nou obiect care declaneaz evenimentul Activate
pentru noul obiect i evenimentul Deactivate pentru vechiul obiect.
Transferul controlului focalizrii de la un obiect (formular sau control) se poate face folosind metoda SetFocuss care poate fi apelat din diferite metode.
Ordinea tabulrii este una dintre proprietile unui formular i reprezint ordinea n care
utilizatorul se poate deplasa de la un control la altul pentru a-l focaliza, folosind tasta
Tab. Pentru a stabili aceast ordine, fiecare control din formular are dou proprieti:
9 TabStops - controlul tabulrii. Are valoare logic i este folosit pentru a determina
dac utilizatorul poate focaliza controlul folosind tasta Tab. Dac valoarea este .F.,
controlul nu va putea fi focalizat dect executnd clic pe el.
9 TabIndex - indexul tabulrii. Este numrul de ordine al controlului n cadrul formularului atunci cnd se folosete tasta Tab pentru a focaliza un control.
Fomularele pot fi:
9 Modale (modal). Un astfel de formular cere utilizatorului s execute anumite aciuni
prin care s nchid formularul activ pentru a putea continua execuia aplicaiei i
pentru a putea focaliza un alt formular. Astfel, o caset de dialog modal trebuie
nchis prin acionarea declanatoarelor OK sau Cancel ca s se poat continua
lucrul cu restul aplicaiei (de exemplu, n Visual FoxPro casetele de dialog Open sau
Save As sunt modale). Se recomand folosirea acestui tip de formular n cazul n care
prin intermediul lui se solicit utilizatorului un rspuns sau anumite date necesare
pentru continuarea unui proces de prelucrare.
9 Nemodale (modeless). Acest tip de formular nu trebuie nchis pentru a ceda focalizarea altui formular. De exemplu, ferestrele cu documente din aplicaia Visual FoxPro
sunt ferestre nemodale. Caseta de dialog Find and replace care se deschide cu
opiunea Find.../Replace...Edit atunci cnd scriei un program surs cu editorul
ncorporat Visual FoxPro permite continuarea lucrului n aplicaia curent (continuarea operaiei de editare a programului surs) n timp ce caseta de dialog este afiat
n continuare pe ecran. Barele cu instrumente sunt i ele formulare nemodale. Se
recomand folosirea acestui tip de formular n cazul n care el conine date care
trebuie vizualizate pentru a fi comparate cu date din alte formulare.
Tipul formularului este controlat cu proprietatea WindowType care este de tip numeric.
Ea poate lua valoarea 0 (nemodal) sau 1 (modal).
243
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
Cu ajutorul acestor instrumente, programatorul poate construi marea majoritate a elementelor unei aplicaii: baza de date, formularele, meniurile, rapoartele, interogrile, vizualizrile etc.
n cazul obictelor de interfa, n procesul de creare a formularului prin intermediul acestor instrumente vizuale, proiectantul trebuie s comunice proprietile formularului i ale
obiectelor componente i procedurile asociate evenimentelor i metodelor care vor fi
folosite de formulare i controale. Aceste caracteristici se memoreaz ntr-un fiier care
are o structur de tabel i extensia .scx.
Constructorii de formulare
Principiul folosit de constructorii de formulare este urmtorul: constructorul pune la dispoziia proiectantului de interfa un formular care are proprieti, metode i evenimente
implicite, iar obiectele care vor fi create n formular vor primi i ele valori implicite pentru
proprieti (conform clasei de baz a obiectului respectiv). Rolul proiectantului const n
modificarea interactiv a valorii unor proprieti ale obiectelor create i scrierea unor proceduri asociate metodelor i evenimentelor, n conformitate cu configuraia pe care vrea
s o realizeze pentru interfa. Constructorii de formulare pe care putei s-i folosii sunt:
9 Form Builder - Constructorul rapid - care permite o proiectare rapid a formularelor
simple. Prin intermediul unei casete de dialog cu mai multe seciuni, proiectantul furnizeaz constructorului valoarea unor proprieti. El nu are cunotin de numele acestor proprieti, ci numai de caracteristicile fomularului pe care le stabilesc. Nu poate
stabili dect valoarea proprietilor asociate acestor caracteristici i nici nu poate scrie
proceduri asociate evenimentelor i metodelor. Sunt implementai mai muli construc-
244 Informatic
tori rapizi, fiecare dintre ei specializat pentru un anumit obiect de interfa. Fiecare
constructor rapid afieaz anumite seciuni, n funcie de obiect. Fiecare seciune
grupeaz anumite caracteristici ale obiectului care corespund unei categorii de
proprieti. 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 dispoziia proiectantului diferite instrumente: bara cu
obiectele care pot fi inserate n formular, bara cu instrumente ale aplicaiei constructor,
fereastra pentru stabilirea proprietilor, fereastra pentru stabilirea procedurilor
asociate evenimentelor i metodelor etc. Prin intermediul lor proiectantul atribuie valori
proprietilor (identificate prin numele lor) i scrie procedurile asociate metodelor i
evenimentelor.
Pentru lansarea n execuie a constructorului folosii comanda:
create form <nume_formular>
unde <nume_formular> este numele fiierului n care se salveaz formularul.
Pentru modificarea formularului cu ajutorul constructorului folosii comanda:
modify form <nume_formular>
unde <nume_formular> este numele fiierului n care se salveaz formularul.
Procedura asistent pentru construirea formularelor
Procedura asistent Form Wizard construiete ea nsi formularul pe baza unor informaii furnizate de proiectant prin intermediul unui dialog desfurat n mai muli pai.
Proiectantul nu modific proprietile i nu scrie codurile procedurilor.
Deoarece fiierul 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 cte o nregistrare fiecare, iar n fiecare coloan
cte o caracteristic. De exemplu, coloana Properties conine cmpuri de tip memo n
care sunt memorate proprietile care au valori diferite de cele implicite, iar coloana
Methods conine cmpuri de tip memo n care sunt memorate procedurile asociate
metodelor i evenimentelor obiectului.
Pentru a afia formularul creat pe ecran i pentru a permite utilizatorului s interacioneze
cu obiectele de interfa pe care le conine, formularul trebuie lansat n execuie prin
comanda:
do form <nume_formular> [with <lista_parametri >] [to < parametru_ieire>]
Transferul parametrilor se face astfel:
245
Formularul
<nume_formular>.scx
Lansarea n execuie a
formularului:
do form <nume_formular>
with <lista_parametri >
to < parametru_ieire>
procedure init
parameters <lista_parametri>
............................................
endproc
............................................
procedure unload
............................................
return <parametru>
endproc
folosind
Alegei
opiunea
Form
Wizard8Tools. Se deschide
caseta de dialog Wizard Selection. Din caseta de dialog alegei
opiunea Form Wizard. Dac ai
fi creat un formular cu cmpuri
din dou tabele, ai fi ales
opiunea One-to-Many Form
Wizard. Acionai butonul OK.
Se deschide caseta de dialog corespunztoare primului pas (Step1) n care alegei
cmpurile din tabel pentru care se vor crea obiecte n formular. n acest exemplu vei
alege toate cmpurile. Pentru aceste cmpuri, asistentul va crea controale de tip
TextBox asociate cu controale Label. Vei circula de la un dialog la altul cu butoanele
Next (dialogul urmtor) i Back (dialogul anterior). Terminai dialogul cu butonul Finish.
Dup ce ai selectat toate cmpurile din tabel, trecei la urmtorul dialog Step2.
n dialogul Step2 alegei stilul formularului. Din grupul de butoane radio Button Type
activai butonul Text Button, iar din lista Style alegei stilul Chiseled. n acest pas sunt
adugate controalele pentru editarea cmpurilor din tabel i suplimentar butoane
pentru administrarea datelor din tabel. Controalele vor avea aspectul fizic stabilit prin
stilul ales. Trecei la urmtorul dialog.
n dialogul Step3 alegei criteriul de ordonare a datelor din tabel: ordinea de sortare i
cmpul cheie pentru sortare care este format dintr-un cmp sau mai multe cmpuri din
246 Informatic
247
partea inferioar ferestrei sunt afiate dou liste ascunse: Form care este disponibil
numai dac ai creat un set de
formulare i v permite s
alegei un formular din set i
Page care este disponibil
numai dac ai creat un set de
pagini i v permite s alegei
o pagin din set.
Alegei opiunea
Quick Form...Form. Se
deschide caseta de dialog
Form Builder. Caseta de dialog conine dou seciuni: seciunea Field Section din care
alegei cmpurile din baza de
date pentru care dorii s creai obiecte n formular pentru editarea datelor. Alegei toate
cmpurile din tabel: din lista Available Fields selectai cmpul i executai clic pe
butonul 8 . Din seciunea Style alegei stilul formularului (alegei opiunea Embosed din
lista Style). nchidei caseta de dialog executnd clic pe declanatorul OK.
248 Informatic
n proiectul de formular vor fi inserate automat casete de text pentru editarea
cmpurilor din tabel i etichete asociate acestor cmpuri pentru identificarea lor.
nchidei aplicaia (clic pe butonul de nchidere al ferestrei de aplicaie).
Deschidei tabelul asociat formularului cu comanda use Agenda2.scx. Vizualizai coninutul tabelului cu comanda browse. Identificai obiectele create n formular (coloana
cmpurilor Objectname) i proprietile asociate acestor obiecte (coloana cmpurilor
Properties). nchidei fiierul cu comanda use.
249
250 Informatic
AutoOpen - Dac are valoarea .T. tabelele i vizualizrile din mediul de date sunt
deschise automat o dat cu crearea formularului.
AutoClose - Dac are valoarea .T. tabelele i vizualizrile din mediul de date sunt
nchise automat o dat cu eliberarea formularului.
9 Evenimentele la care poate rspunde mediul datelor sunt:
BeforeOpenTables - Evenimentul este declanat naintea deschiderii tabelelor i
a vizualizrilor din mediul de date. Se declaneaz naintea evenimentului Load al formularului pentru c tabelele trebuie s fie deschise nainte de iniializarea formularului, deoarece n formular trebuie afiate date din aceste tabele i vizualizri. n
procedura asociat acestui eveniment se pot stabili numele tabelelor i vizualizrilor
care se vor deschide i locul n care sunt memorate pe disc.
AfterCloseTables - Evenimentul este declanat dup nchiderea tabelelor i a vizualizrilor din mediul de date (este provocat de fiecare apel al metodei CloseTables). Se
declaneaz dup descrcarea formularului (dup evenimentul Unload al formularului).
9 Metodele pe care le poate executa mediul de date sunt:
OpenTables - dechiderea tabelelor i vizualizrilor din mediul de date; n aceast
metod se scriu instruciunile pentru deschiderea tabelelor n diferite zone de lucru.
CloseTables - nchiderea tabelelor i vizualizrilor din mediul de date; n aceast
metod se scriu instruciunile pentru nchiderea tabelelor deschise n diferite zone de
lucru.
Sesiunea (session) este intervalul de timp n care o aplicaie primete date
i le prelucreaz. Sesiunea de date (data session) este mediul de date
asociat sesiunii (parametrii sistemului, variabile de memorie, fiiere de date).
n Visual FoxPro un formular poate rula n:
9 sesiunea de date implicit care preia configurrile implicite ale mediului Visual
FoxPro.
9 sesiunea de date privat (proprie formularului) n care toate configurrile mediului
trebuie fcute la crearea formularului; acest tip de sesiune creeaz o mai mare
independen a formularului fa de mediu.
Operaiile pe care trebuie s le executai pentru a proiecta un formular sunt urmtoarele:
1. Deschidei constructorul pentru proiectarea formularului (Form Designer).
2. Definii proprietile formularului i scriei procedurile asociate metodelor i evenimentelor formularului.
3. Deschidei baza de date pentru a se crea obiectul DataEnvironment asociat
formularului.
4. Creai controalele n formular. Definii proprietile lor i scriei procedurile asociate
metodelor i evenimentelor fiecrui control.
5. Salvai formularul.
251
252 Informatic
ControlBox - controleaz dac formularul are buton de meniu de control sau nu.
9 Proprieti legate de comportament sunt specificate prin proprietile de tip logic:
Closable - controleaz dac formularul poate fi nchis folosind meniul de control
(opiunea Close a meniului sau dublu clic pe butonul meniului) sau nu;
Movable - controleaz dac formularul poate fi mutat sau nu;
9 Afiarea casetelor cu informaii despre controalele din formular ShowTips este
de tip logic: dac are valoarea .T. (implicit n ToolBar) se afieaz caseta cu informaii
despre controlul indicat cu mouse-ul (ToolTip), iar dac are valoarea .F. (implicit n
Form) nu se afieaz caseta.
Evenimentele la care pot rspunde formularele sunt:
9 Redimensionarea formularului Resize - este declanat fie prin schimbarea interactiv a dimensiunii formularului, fie prin modificarea din program a dimensiunii sale
(proprietile Height i Width).
9 Mutarea formularului Moved - este declanat fie prin mutarea interactiv a formularului, fie prin modificarea din program a poziiei sale (proprietile 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 poziiei de desenare vor fi (x2,y2).
9 Metoda de desenare a unui dreptunghi n formular Box ; prin intermediul parametrilor
se vor preciza coordonatele colului din stnga sus (x1,y1) i coordonatele colului din
dreapta jos (x2,y2). Dup desenare, coordonatele poziiei 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 poziiei 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 poziiei de
desenare vor fi cele de la sfritul textului.
9 Metoda de tergere a textului i a desenelor din formular Cls . Dup tergere,
coordo-natele poziiei de desenare vor fi (0,0).
253
9 Bare cu instrumente:
Bara pentru obiectele de interfa - Form Controls Toolbar. Afieaz controale cu
ajutorul crora selectai obiectul pe care vrei s-l creai n cadrul formularului.
Bara pentru manipularea obiectelor - Layout Toolbar. Afieaz controale cu
ajutorul crora manipulai obiectele pe care le-ai creat n formular.
Bara aplicaiei - Form Designer. Afieaz controale cu ajutorul crora stabilii
instrumentele afiate de aplicaie.
Bara pentru controlul culorilor - Color Palette. Afieaz controale cu ajutorul crora
alegei culorile.
9 Opiuni de meniu:
Meniul Form este vizibil numai dac este deschis fereastra constructorului de
formulare i conine opiuni specifice acestei aplicaii. Prin intermediul opiunilor
sale putei administra clasele definite de utilizator (crearea i modificarea unor
proprieti i metode, includerea unui fiier de constante), putei administra seturi
de formulare (crearea setului de formulare, adugarea sau nlturarea formularelor
din set etc.), putei administra formularul pe care l creai (deschiderea
constructorului rapid pentru crearea lui, lansarea lui n execuie, modificarea lui).
n meniul View devin vizibile opiuni prin care putei s stabilii instrumentele
Constructorului de formulare care vrei s fie afiate.
n meniul Format devin vizibile opiuni prin care putei s stabilii caracteristicile
grilei folosite pentru alinierea obiectelor n formular.
Opiunile de meniu:
Opiunea
Data
Environment
Properties
Code
Semnificaia
Meniul View
Opiune de tip comutator. Controleaz afiarea ferestrei mediului de date.
Opiune de tip comutator. Controleaz afiarea ferestrei de proprieti.
Opiune de tip comutator. Controleaz afiarea ferestrei pentru secvenele de cod.
254 Informatic
Opiunea
Semnificaia
Form Controls Opiune de tip comutator. Controleaz afiarea barei cu instrumente pentru
Toolbar
crearea obiectelor n formular.
Layout Toolbar Opiune de tip comutator. Controleaz afiarea barei cu instrumente pentru
administrarea obiectelor n formular.
Color Palette
Opiune de tip comutator. Controleaz afiarea barei cu instrumente pentru
Toolbar
stabilirea culorilor.
Tab Order
Grid Lines
Show Position
Snap To Grid
Meniul Form
New Property... Creeaz o proprietate nou pentru o clas definit de utilizator. Se deschide
caseta de dialog New Property prin intermediul creia stabilii numele i
descrierea proprietii.
New Method...
Edit Property/
Method...
Include File...
nltur formularul curent din set. Opiunea este disponibil numai dac a fost
creat un set de formulare, iar acesta conine mai mult de un formular.
Quick Form...
Run Form
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
Buton
1
2
3
4
5
6
7
8
Buton
Select Object
View Classes
Label
TextBox
EditBox
CommandButton
CommandGroup
OptionButton
9
10
11
12
13
14
15
16
255
Buton
CheckBox
ComboBox
List
Spinner
Grid
Image
Timer
PageFrame
17
18
18
20
21
22
23
24
Marea majoritate a butoanelor din bara Form controls le vei folosi pentru a crea obiecte n
formulare (Label, TextBox etc.). Butonul Select Object l putei folosi pentru a selecta un
grup de obiecte din formular. Butonul BuildLock l putei folosi pentru a lansa n execuie
Constructorul rapid pentru formulare, iar butonul ButtonLock l vei folosi atunci cnd vei
dori s creai mai multe instane ale aceluiai obiect.
Buton
1
2
3
Buton
4
5
6
Buton
Code Window
Form Control Toolbar
Color Palette Toolbar
7
8
9
Layout Toolbar
Form Builder
Auto Format
Majoritatea butoanelor din bara Form Designer pot fi folosite pentru a stabili ce
instrumente ale aplicaiei vei afia (fereastra de proprieti, fereastra de cod etc). Butonul
FormBuilder l putei folosi pentru lansa n execuie Constructorul rapid pentru formulare.
Butonul AutoFormat l vei folosi atunci cnd vei dori s aplicai un anumit stil de formatare
asupra obiectelor de acelai 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 acionarea acestui buton se deschide fereastra aplicaiei Constructorului
de format: AutoFormat Builder. Identificai opiunile de meniu pentru care butoanele din
aceast bar sunt scurtturi.
Buton
1
2
3
4
10 11 12 13
Buton
5
6
7
8
9
Buton
10
11
12
13
Center Horizontally
Center Vertically
Bring to Front
Send to Back
Butoanele din bara Layout sunt disponibile numai dac au fost selectate mai multe
controale i se folosesc pentru a stabili alinierea grupului de controale, modul n care se
uniformizeaz dimensiunea lor i stratul din formular n care vor fi afiate (obiectele pot fi
256 Informatic
afiate n dou straturi). Butoanele Align Left
Se stabilete
Sides, Align Right Sides, Align Top Edges i culoarea cernelii.
Align Bottom Edges se folosesc pentru alinierea
Se stabilete
controalelor fa de marginea grupului selectat.
Butoanele Align Vertical Centers i Align culoarea hrtiei.
Horizontal Centers se folosesc pentru alinierea
centrat fa de axa vertical, respectiv orizontal a Paleta de culori
grupului selectat, iar Center Horizontally i Center
Vertically se folosesc pentru alinierea centrat fa Se deschide o
de axa vertical, respectiv orizontal a grupului palet de culori
selectat, n mijlocul formularului. Butoanele Same pentru a alege
l
l a i uniformiza dimensiunea
Width, Same Height i Same Size se folosesc pentru
controalelor din grupul selectat: la cel mai lat, la cel mai nalt i la cel mai mare. Butoanele
Bring to Front i Send to Back stabilesc stratul n care va fi afiat grupul de controale:
deasupra celorlalte sau dedesubt.
Paleta de culori conine controale prin care putei s stabilii elementul pentru care alegei
culoarea (hrtia sau cerneala), controale pentru o palet standard de culori i controlul
pentru deschiderea unui constructor de culori.
n fereastra de proprieti putei stabili i vizualiza proprietile formularului i a fiecrui obiect din formular. Din lista ascuns alegei formularul sau obiectul pentru
care stabilii proprietile. Dac deschidei aceast list putei vedea ierarhia de
obiecte a formularului. Prin intermediul ei identificai relaia de filiaie a obiectelor n
formular. Exist urmtoarele convenii n scrierea proprietilor n list:
Normal - proprietatea are valoarea implicit i nu este protejat la scriere (este de
tip Read-Write).
Bold - proprietatea are valoarea modificat fa de cea implicit.
Italic - proprietatea are valoarea implicit i nu este protejat la scriere (este de tip
Read-Only).
Fiecare proprietate are un meniu rapid care conine opiunea Reset to Default prin
care se atribuie proprietii valoarea implicit i Help... care deschide fereastra cu
informaii despre proprietate (help dependent de context).
Definii n fereastr dou obiecte, o etichet i o caset de text astfel: executai clic pe
butonul Label din bara cu controale i apoi indicai n formular colul din stnga sus al
etichetei i glisai mouse-ul pn cnd obinei dimensiunea dorit pentru obiect.
Repetai operaia pentru caseta de text (butonul TextBox). Identificai pentru aceste
controale valorile implicite pentru proprietile, evenimentele i metodele asociate.
Formularul i obiectele din formular au fiecare cte un meniu rapid de comenzi pe
care l deschidei executnd pe formular sau pe obiect clic cu butonul din dreapta al
mouse-ului. n tabel, opiunile disponibile pentru formular sunt marcate cu F, iar cele
disponibile pentru obiecte sunt marcate cu O.
Opiunea
Run
Semnificaie
Lanseaz n execuie formularul.
Copy
Cut
O
O
257
Semnificaie
Insereaz n formular, n poziia indicat, obiectul care fost copiat anterior n
Clipboard.
Data
Environment
Properties
Builder
F,O
F,O
Code
F,O
Help
Seciunea
Conine
All
Toate proprietile
Data
Method
Layout
Other
258 Informatic
Copierea obiectului - selec-tai obiectul i apoi folosii operaiile Copy i Paste (din
meniul Edit sau din meniul de comenzi rapide).
tergerea obiectului - selectai obiectul i apoi apsai tasta Delete.
Creai instane multiple ale unui obiect - executai clic pe butonul ButtonLock din
bara Form controls, executai apoi clic n aceast bar pe obiectul pentru care creai
instane multiple, creai obiectul n formular i apoi executai clic n locul n care vrei
s creai o copie a acestui obiect. Executai clic pentru fiecare copie pe care vrei s o
creai. Dup ce ai terminat de creat copii ale obiectului, dezactivai aceast funcie
executnd clic pe butonul ButtonLock.
259
Creai un formular
Vei realiza un formular n care textul i
desenele sunt afiate numai dac se indic
formularul cu mouse-ul i se apas butonul
stng. La eliberarea butonului de mouse
textul i desenele afiate se terg.
FontBold = .T.
DrawWidth = 5
FillColor = 150,150,150
FillStyle = 7
Closable = .T.
Enabled = .T.
Visible = .T.
ShowTips = .F.
TabIndex = 1
TabStop = .T.
WindowState = 0
WindowType = 0
Pentru afiarea textului i a desenelor, la apsarea butonului de mouse s-a scris
procedura asociat evenimentului MouseDown n care s-au apelat metodele specifice formularelor - Print (scrierea textului), Line (desenarea liniei), Circle (desenarea cercului). Pentru a avea acces la fereastra de cod, deschidei n fereastra de
pro-prieti seciunea Method i din lista de metode i evenimente alegei
evenimentul MouseDown.
Procedure MouseDown
Lparameters nButton, nShift,;
nXCoord, nYCoord
ThisForm.CurrentX=10
ThisForm.CurrentY=10
for i=1 to 25
260 Informatic
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
Salvai formularul i l lansai n execuie executnd clic pe butonul Run din bara
standard.
Run - Lansai n execuie
formularul
Observaie:
Procedurile asociate evenimentelor MouseMove, MouseUp i MouseDown primesc din
partea sistemului urmtoarele informaii prin intermediul parametrilor:
nButton - reprezint butonul de mouse acionat: 1 - butonul stng, 1 - butonul
drept i 4 -butonul din mijloc.
nShift - este un cod numeric (modul n care se calculeaz a fost prezentat la evenimentul PressKey) prin care se poate determina dac mouse-ul a fost acionat
mpreun cu o tast rece Shift, Alt i Ctrl.
nXCoord, nYCoord - reprezint coordonatele
cursorului de mouse, relative la formular.
261
262 Informatic
Stabilii proprietile pentru cel de la
treilea formular:
* Proprietatile formularului 3
Name = "Form3"
Top = 54
Left = 132
Caption = "Formularul 3"
Pentru fiecare formular scriei cte o
procedur asociat evenimentului Click.
La producere acestui eveniment, se
parcurg ciclic cele trei formulare i se
scrie n fiecare formular eticheta formularului n care s-a produs evenimentul
Click:
* Procedura pentru formularul 1
Procedure Click
for n=1 to thisformset.formcount
thisformSet.Forms(n).Print('Formularul 1')
endfor
Endproc
* Procedura pentru formularul 2
Procedure Click
for n=1 to thisformset.formcount
thisformSet.Forms(n).Print('Formularul 2')
endfor
Endproc
* Procedura pentru formularul 3
Procedure Click
for n=1 to thisformset.formcount
thisformSet.Forms(n).Print('Formularul 3')
endfor
Endproc
263
9 Proprietile care pot fi folosite pentru parcurgerea ciclic a paginilor din set:
Numrul de pagini din set PageCount . Este de tip numeric.
Paginile Pages . Este de tip vector. n elementele vectorului se pstreaz
referinele ctre paginile din set.
9 Proprietile de tip numeric care pot fi folosite pentru dimensiunile paginilor din set:
PageHeight - nlimea paginii (fr etichet);
PageWidth - limea paginii.
9 Proprietile care caracterizeaz etichetele paginilor din set:
Prezena etichetelor Tabs . Este de tip logic i determin dac vor fi afiate
etichetele. Dac are valoarea .T. (implicit), etichetele paginilor vor fi afiate, altfel
zona etichetei va fi ocupat de pagin.
Limea 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 nct s ocupe toat
limea 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 cnd lungimea
textului etichetelor depete limea setului de pagini. Dac are valoarea 0 (Multiple Rows), etichetele vor fi scrise pe mai multe rnduri. Dac are valoarea 1 (Single Row), etichetele sunt afiate pe o singur linie i textul etichetelor este
secionat astfel nct 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 propritii care pstreaz ntr-un vector referinele fiecrei
pagini a setului, iar <n> indexul paginii din acest vector.
Formularele de tip pagin au proprietatea specific de tip numeric PageOrder numrul de ordine al paginii. Ea este diferit de indexul paginii din vectorul Pages.
Modificarea unui numr de ordine al unei pagini duce la rearanjarea tuturor pginilor. De
exemplu, dac exist patru pagini i vrei ca pagina a patra s devin a doua, i atroibuii
acesteia numrul de ordine 2. Automat pagina a doua va primi numrul de ordine 3, iar
pagina a treia numrul de ordine 4.
264 Informatic
n fereastra Properties, alegei din lista de obiecte obiectul PageFrame1 i scriei
pentru proprietatea PageCount (numr de pagini) valoarea 8.
Stabilii apoi i celelalte prorpieti ale obiectelor. Valorile proprietilor formularului,
setului de pagini i paginilor sunt:
* Formularul
Caption = "Form1"
Name = "Form1"
* Setul de pagini
Name = "Pageframe1"
PageCount = 8
PageHeight=203
PageWedth=345
TabStretch = 0
Top = 12
Left = 12
Width = 349
Height = 252
Tabs = .T.
* Paginile
Page1.Caption = "Pagina 1"
Page1.Name = "P1"
Page1.PageOrder = 1
Page2.Caption = "Pagina 2"
Page2.Name = "P2"
Page2.PageOrder = 2
..............................
Page8.Caption = "Pagina 8"
Page8.Name = "P8"
Page8.PageOrder = 8
TabStretch=0
TabStretch=1
265
ncercai:
Adevrat/Fals:
1. Interfaa de explorare este o interfa container care conine mai multe ferestre.
2. Procedura asociat evenimentului KeyPress primete ca parametru codul numeric
asociat tastelor reci apsate.
3. Focalizarea este o metod prin care se poate mri un control grafic.
4. Evenimentul Init este declanat de activarea obiectului.
5. Print este o metod prin care scriei ntr-un formular.
6. Evenimentul Destroy este declanat de eliberarea zonei de memorie alocate obiectului.
7. Procedura asociat evenimentului Load se execut dup cea asociat evenimentului Init.
Completai:
1. Dimensiunile, poziiile pe ecran, vizibilitatea i disponibilitatea sunt ...........................
ale unui obiect vizual.
2. Variabila de sistem folosit pentru a referi fereastra implicit a aplicaiei Visual
FoxPro este ....... .
3. Funcia 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.
Alegei rspunsurile corecte:
1. Pentru un obiect,Click este:
a) o proprietate
b) un eveniment
c) o metod
2. Stabilii tipul formularului (modal/nemodal) cu proprietatea:
a) WindowType
b) ShowWindow
c) MDIForm
3. Ordinea tabulrii este o proprietate specific:
a) tuturor controalelor
b) controalelor gril
c) formularelor
4. Caseta de dialog Open a interfeei aplicaiei Visual FoxPro este o caset de dialog:
a) modal
b) nemodal
c) copil
d) printe
5. Stilul interfeei aplicaiei 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
spunsuri:
R
Adevrat/Fals: 1-F; 2-A; 3-F; 4-F; 5-F; 6-A; 7-F.
Completai: 1-proprieti; 2-_screen; 3-rgb(); 4-SetFocus ; 5-Unload
Alegei rspunsurile corecte: 1-b; 2-a; 3- c; 4-a; 5-b; 6-c.
3.4. C o n t r o alele
267
268 Informatic
i un buton Stop care poate opri execuia procesului. n general, acestui control nu i se
asociaz valori, ci aciuni 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 proprietile WordWrap i Autosize
(care vor fi prezentate ulterior).
n funcie de modul n care este informat utilizatorul despre aciunea butonului exist:
9 Butoane n care aciunea este descris printr-un text. n acest caz, textul care descrie
aciunea va fi pstrat de proprietatea Caption a controlului.
9 Butoane n care aciunea este descris printr-o imagine. n acest caz, identificatorul
fiierului care conine imaginea care va fi afiat va fi pstrat de proprietatea Picture a
controlului (identificatorul fiierului n care este pstrat imaginea). n cazul n care se
folosete imaginea pentru descrierea aciunii, trebuie folosite i urmtoarele proprieti:
DownPicture - imaginea afiat atunci cnd butonul este focalizat;
DisablePicture - imaginea afiat atunci cnd butonul nu este disponibil.
Declanatorul poate fi acionat n mai multe moduri:
9 Executai clic pe butonul focalizat.
9 Focalizai butonul apsnd repetat tasta Tab i apoi apsai tasta Enter sau Spaiu.
9 Apsai tasta Alt mpreun cu tasta de acces la buton (cu tasta literei de identificare).
9 Dac butonul de comand este butonul implicit al formularului, apsai tasta Enter,
indiferent de poziia selectorului.
9 Dac butonul de comand este butonul de anulare al formularului, apsai tasta Esc,
indiferent de poziia selectorului.
Indiferent de modul ales, evenimentul este acelai (evenimentul Click): prin acionarea
butonului se declaneaz operaia atribuit lui.
ntr-un formular nu poate fi dect un buton implicit i un buton de anulare. Tipul butonului
este controlat cu proprietile 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..
269
270 Informatic
Cancel = .T.
Left = 150
Top = 150
Height = 25
Define class Buton4 as;
Procedure Click
CommandButton
Clear events
Caption = '\<Terminare'
Enddefine
Salvai programul i-l lansai n execuie cu comanda do forma_p.prg. Testai
butoanele.
ThisForm.L.LineSlant ='\'
ThisForm.L.Visible = .T.
Enddefine
Creai un formular nou forma_v. Creai n acest formular un obiect de tip linie:
executai clic pe butonul Line de pe bara Form controls i glisai apoi mouse-ul n
formular pentru a trasa linia.
Scriei cte o procedur pentru fiecare eveniment Click al celor patru butoane (pe
baza instruciunilor din programul surs).
271
Creai un formular nou. Creai n formular un set de pagini cu dou pagini. Creai n
fiecare seciune etichetele astfel: executai clic pe butonul Label de pe bara Form
controls i glisai apoi mouse-ul n formular pentru a trasa eticheta.
272 Informatic
* Formularul
Page2.Caption = "Apasare buton"
Name = "Formular"
* Etichetele
Top = 11
* proprietati comune:
Left = 33
Name = ....
Height = 296
AutoSize = .T.
Width = 375
BackStyle = 0
BackColor = 200,200,200
Caption = ....
Caption = "Test mouse"
Height = ...
WindowState = 0
Left = ...
* Setul de pagini
Top = ...
Name = "Caseta"
Width = ...
PageCount = 2
*Exemplu:
TabStretch = 1
Name = "L2"
ActivePage = 1
AutoSize = .T.
Top = 0
BackStyle = 0
Left = -12
Caption = "x= "
Width = 408
Height = 18
Height = 253
Left = 47
* Sectiunea 1
Top = 72
Page1.Name = "Sect1"
Width = 20
Page1.Caption="Deplasare mouse"
* Butonul de comanda
* Sectiunea 2
Name = "Buton"
Page2.Name = "Sect2"
Caption = "\<Terminare"
Pentru seciunea 1 a casetei se asociaz o procedur evenimentului MouseMove
(n etichetele L4 i L5 se afieaz coordonatele, n eticheta L7 se afieaz butonul
apsat, iar n etichetele L9, L10 i L11 se afieaz tastele apsate):
Procedure Sect1.MouseMove
Lparameters nButton, nShift, nXCoord, nYCoord
ThisForm.Caseta.Pages(1).L4.Caption=str(nXCoord,4,0)
ThisForm.Caseta.Pages(1).L5.Caption=str(nYCoord,4,0)
Do case
case nButton=1
ThisForm.Caseta.Pages(1).L7.Caption='Stanga'
case nButton=2
ThisForm.Caseta.Pages(1).L7.Caption='Dreapta'
case nButton=4
ThisForm.Caseta.Pages(1).L7.Caption='Mijloc'
otherwise nButton=0
ThisForm.Caseta.Pages(1).L7.Caption=''
Endcase
if inlist(nShift,1,3,5,7)
ThisForm.Caseta.Pages(1).L9.Visible=.T.
else
ThisForm.Caseta.Pages(1).L9.Visible=.F.
endif
if inlist(nShift,2,3,6,7)
ThisForm.Caseta.Pages(1).L10.Visible=.T.
else
273
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 seciunea 2 a casetei se asociaz o procedur evenimentului MouseDown
(n etichetele L10 i L11 se afieaz coordonatele, n eticheta L2 se afieaz butonul
apsat, iar n etichetele L5, L5 i L6 se afieaz tastele apsate) 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
275
9 Lungimea maxim a textului MaxLength (tip numeric) - numrul maxim de caractere care pot fi scrise n caseta de text . Se folosete n cazul cmpurilor de tip ir de
caractere pentru ca textul introdus s nu depeasc lungimea permis n cmp.
9 Proprieti prin care se controleaz formatul de introducere i afiare a datei memorate n proprietatea Value:
Formatul de introducere: Format (tip ir de caractere). Prin aceast proprietate se
stabilete caracteristica ntregului cmp de editare. De exemplu, dac proprietatea are
valoarea 'A', n caseta de text nu vei putea scrie dect litere.
Masca de introducere: InputMask (tip ir de caractere). Prin aceast proprietate se stabilete un ablon pentru format n care se precizeaz caracteristica
fiecrei poziii a formatului. Fa de proprietatea anterioar prezint avantajul c
ablonul
Cod Semnificaie
X
Orice caracter.
9
Numai cifre i semne (ca de exemplu semnul minus -)
#
Cifre, spaii i semne
$
Afieaz simbolul monetar
$$ Afieaz simbolul monetar mobil.
*
Afieaz asteriscuri la stnga valorii.
.
Reprezint poziia punctului zecimal
(separatporul ntre partea ntreag i
partea fracionar).
,
Reprezint poziia separatorului
ordinelor de mrime (sute de mii,
sutele de mii de milioane etc.)
Format
Cod Semnificaie
A
Numai litere, fr spaii sau semne
de punctuaie.
D
Pentru datele calendaristice, se folosete formatul stabilit prin set date.
E
Datele de tip dat calendaristic vor
fi editate n format british.
K
Selecteaz textul din cmp atunci
cnd este focalizat controlul.
L
Se folosete numai pentru tipul numeric; afieaz zerouri nesemnificative n
n locul spaiilor.
R
Afieaz ablonul definit prin proprietatea InputMask. Valoarea ablonului nu
va fi memorat n proprietatea Value.
T
Se folosete numai pentru tipul ir de
caractere; nltur spaiile de la nceputul i de la sfritul irului de caractere.
!
Se folosete numai pentru tipul ir
de caractere; convertete toate
literele n litere mari.
$
Se folosete numai pentru tipul numeric; afieaz simbolul monetar.
276 Informatic
proprietii este irul vid) sau o fereastr definit de utilizator (valoarea proprietii va fi
numele ferestrei).
F1.Width=400
F1.Height=250
F1.BackColor=RGB(220,220,220)
F1.AddObject('L1','Label')
F1.AddObject('C1','TextBox')
F1.AddObject('L2','Label')
F1.AddObject('C2','TextBox')
F1.AddObject('L3','Label')
F1.AddObject('L4','Label')
F1.AddObject('C3','TextBox')
F1.AddObject('B1','Buton1')
F1.AddObject('B2','Buton2')
F1.AddObject('B3','Buton3')
F1.AddObject('B4','Buton4')
F1.AddObject('B5','Buton5')
F1.L1.AutoSize = .T.
F1.L1.BackColor=RGB(220,220,220)
F1.L1.Caption = "a"
F1.L1.Height = 18
F1.L1.Left = 48
F1.L1.Top = 36
F1.L1.Width = 8
F1.L1.Visible =.T.
F1.L2.AutoSize = .T.
F1.L2.BackColor=RGB(220,220,220)
F1.L2.Caption = "b"
F1.L2.Height = 18
F1.L2.Left = 48
F1.L2.Top = 96
F1.L2.Width = 8
F1.L2.Visible =.T.
F1.L3.BackColor=RGB(220,220,220)
F1.L3.Caption = "c"
F1.L3.Height = 18
F1.L3.Left = 48
F1.L3.Top = 144
F1.L3.Width = 7
F1.L3.Visible =.T.
F1.L4.BackColor=RGB(220,220,220)
F1.L4.Caption = "Imposibil!!!;
Impartire la zero"
F1.L4.Height = 25
F1.L4.Left = 36
F1.L4.Top = 204
F1.L4.Visible = .F.
F1.L4.Width = 181
F1.C1.Value=0
F1.C1.InputMask = "999999"
F1.C1.Left = 85
F1.C1.Top = 36
F1.C1.Height = 25
F1.C1.Width = 108
F1.C1.Visible =.T.
277
F1.C2.Value=0
F1.C2.InputMask = "999999"
F1.C2.Left = 85
F1.C2.Top = 84
F1.C2.Height = 25
F1.C2.Width = 108
F1.C2.Visible =.T.
F1.C3.Value=0
F1.C3.BackColor=RGB(220,220,220)
F1.C3.Height = 25
F1.C3.Left = 85
F1.C3.ReadOnly = .T.
F1.C3.Top = 144
F1.C3.Width = 108
F1.C3.Style = 1
F1.C3.Visible =.T.
F1.B1.Visible =.T.
F1.B2.Visible =.T.
F1.B3.Visible =.T.
F1.B4.Visible =.T.
F1.B5.Visible =.T.
F1.Show
Read events
Define class Buton1 as;
CommandButton
Top = 24
Left = 276
Height = 25
Width = 61
Caption = "+"
Procedure Click
ThisForm.C3.Value=;
ThisForm.C1.Value+;
ThisForm.C2.Value
ThisForm.C3.Refresh
Enddefine
Define class Buton2 as;
CommandButton
Top = 60
Left = 276
Height = 25
Width = 61
Caption = "-"
Procedure Click
ThisForm.C3.Value=;
ThisForm.C1.Value-;
ThisForm.C2.Value
ThisForm.C3.Refresh
Enddefine
278 Informatic
Define class Buton3 as;
ThisForm.B4.StatusBarText=;
CommandButton
'ImposibiI!!! -;
Top = 96
Impartire la 0'
Left = 276
ThisForm.L4.Visible=.T.
Height = 25
ThisForm.C2.SetFocus
Width = 61
else
Caption = "*"
ThisForm.C3.Value=;
Procedure Click
ThisForm.C1.Value/;
ThisForm.C3.Value=;
ThisForm.C2.Value
ThisForm.C1.Value*;
ThisForm.C3.Refresh
ThisForm.C2.Value
endif
ThisForm.C3.Refresh
Enddefine
Enddefine
Define class Buton5 as;
Define class Buton4 as;
CommandButton
CommandButton
Top = 204
Top = 132
Left = 264
Left = 276
Height = 25
Height = 25
Width = 84
Width = 61
Caption = "\<Terminare"
Caption = "/"
Procedure Click
Procedure Click
ThisForm.Release
ThisForm.B4.StatusBarText=''
clear events
ThisForm.L4.Visible=.F.
Enddefine
if ThisForm.C2.Value=0
Salvai fiierul. Lansai n execuie programul Calc_p.prg. Testai formularul.
Construii un formular care conine casete de text folosind metoda vizual
1. Realizai caseta de dialog din exemplul precedent folosind metoda vizual.
Creai un formular nou, n care creai urmtoarele obicete: patru etichete, trei casete
de text i cinci butoane de comand.
279
280 Informatic
M+ i pentru readucere din memorie). Pentru memorarea numrului se va folosi
variabila de memorie global memorie.
281
Deschidei fereastra editorului de texte i scriei urmtorul program prin care lansai
n execuie formularul. Formularul va furniza programului apelant parola introdus de
utilizator. Parola corect este alfa plus dou caractere pentru ziua din lun (de
exemplu, dac parola se introduce pe 12 februarie, parola corect este alfa12). n
programul principal se stabilete parola corect (variabila parola_c) i se verific
dac parola furnizat este corect. Se accept maxim 3 ncercri.
set talk off
if day(date())<10
parola_c='alfa0'+str(day(date()),1)
else
parola_c='alfa'+str(day(date()),2)
endif
for i=1 to 3
do form form_par to parola
if parola=parola_c
wait window 'Felicitari!!! Parola este corecta'
exit
else
wait window 'Parola gresita !!! Mai aveti '+str(3-i,1)+';
incercari'
endif
endfor
Salvai programul. Lansai n execuie programul i testai modul n care funcioneaz programul i formularul
pentru parol.
4.
282 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). Operaiile se pot executa n aceeai zon (acelai
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.
Creai formularul i adugai la formular dou etichete, dou zone de editare i cinci
butoane de comand. Pentru zona de editare folosii butonul EditBox de pe bara
Form Controls. Stabilii pentru formular i controale urmtoarele proprieti:
* 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"
Scriei procedura asociat evenimentului Init al formularului. n aceast procedur
declarai variabilele globale text i zona_s i iniializai proprietile 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=''
Scriei procedurile asociate evenimentului LostFocus pentru cele dou zone de
text, n care memorai n variabila text zona de editare care a pierdut focalizarea.
procedure LostFocus &&Edit1
procedure LostFocus &&Edit1
text=1
text=2
endproc
endproc
Scriei 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
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
Salvai formularul. Lansai n execuie formularul i-l testai.
5. Realizai o caset de dialog care s simuleze operaiile de cutare i nlocuire ntr-un text
(operaiile Find i Replace). Pentru aceste operaii se vor folosi butoanele Cauta (Find),
Inlocuieste (Replace) i Inlocuieste toate aparitiile (Replace All). Butoanele au taste de
acces. n acest mod scurttura 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 gsit n zona de text textul scris n caseta de text cu eticheta Se
cauta.
Creai formularul i adugai la formular trei etichete, o zon de editare, dou casete
de text, un grup de trei butoane de comand i un buton de comand. Stabilii
Grupul de butoane de
comand
Name = "Label3"
Caption = "Se inlocuieste cu"
* Pentru toate etichetele
AutoSize = .T.
BackStyle = 0
*Casetele de text
Name = "Text1"
DisabledBackColor = 192,192,192
Name = "Text2"
DisabledBackColor = 192,192,192
284 Informatic
* Grupul de butoane
Command1.Caption = "\<Cauta"
Name = "Commandgroup1"
Command1.Style = 0
AutoSize = .T.
Command2.Name = "Command2"
ButtonCount = 3
Command2.AutoSize = .F.
BackStyle = 0
Command2.Caption="\<Inlocuieste"
Value = 1
Command3.Name = "Command3"
Height = 106
Command3.AutoSize = .T.
Left = 288
Command3.Caption = "Inlocuieste;
Top = 36
toate \<aparitiile"
Width = 198
* Butonul de comanda
Command1.Name = "Command1"
Name = "Command1"
Command1.AutoSize = .F.
Caption = "\<Terminare"
Pentru formular scriei procedura asociat evenimentului Init:
procedure Init &&Formular
public x
store 0 to x
ThisForm.Edit1.Value=''
ThisForm.Text1.Value=''
ThisForm.Text2.Value=''
ThisForm.Text1.Enabled=.F.
ThisForm.Text2.Enabled=.F.
ThisForm.Commandgroup1.Command1.Enabled=.F.
ThisForm.Commandgroup1.Command2.Enabled=.F.
ThisForm.Commandgroup1.Command3.Enabled=.F.
endproc
Pentru zona de editare scriei proceduri asociate evenimentelor GotFocus,
LostFocus i Valid:
procedure GotFocus && EditBox
ThisForm.Text1.Enabled=.T.
ThisForm.Text2.Enabled=.F.
ThisForm.Commandgroup1.Command1.Enabled=.F.
ThisForm.Commandgroup1.Command2.Enabled=.F.
ThisForm.Commandgroup1.Command3.Enabled=.F.
endproc
procedure LostFocus && EditBox
ThisForm.Text2.Enabled=.F.
ThisForm.Commandgroup1.Command1.Enabled=.F.
ThisForm.Commandgroup1.Command2.Enabled=.F.
ThisForm.Commandgroup1.Command3.Enabled=.F.
endproc
procedure Valid && EditBox
if len(ThisForm.Edit1.Value)<>0
ThisForm.Text1.Enabled=.T.
Return .T.
else
ThisForm.Text1.Enabled=.F.
Return .F.
endif
endproc
285
286 Informatic
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
Salvai formularul. Lansai formularul n execuie i-l testai.
6. Creai tabelul agenda cu urmtoarea structur: nume(C,15), prenume(C,15), adresa
(C,40), telefon(C,10) i data_n(D). Realizai o caset de dialog care s permit urmtoarele operaii cu datele din tabel: parcurgerea tabelului pentru vizualizare (nu se pot
modifica datele din cmpuri) i adugarea de noi nregistrri. Butoanele >>> i <<< se
folosesc pntru parcurgerea tabelului nainte i napoi, iar butonul Adauga pentru
adugarea de noi nregistrri.
287
Name = "Text2"
Name = "Label4"
ControlSource="agenda.prenume"
"Tele\<fon"
Name = "Text3"
Name = "Label5"
ControlSource="agenda.telefon"
Caption = "\<Data nasterii"
Name = "Text4"
*pentru toate etichetele:
ControlSource="agenda.data_n"
AutoSize = .T.
Format = "E"
BackStyle = 0
* Zona de editare
* Butoane
Name = "Edit1"
Name = "Command1"
ControlSource="agenda.adresa"
Caption = ">>>"
*Etichetele
Name = "Command2"
Name = "Label1"
Caption = "<<<"
Caption = "\<Numele"
Name = "Command3"
Name = "Label2"
Caption = "\<Adauga"
Caption = "\<Preumele"
Name = "Command4"
Name = "Label3"
Caption = "\<Terminare"
"Adre\<sa"
Scriei procedurile asociate evenimentelor Load, Unload i Init ale formularului:
procedure Load &&Formular
ThisForm.Text3.ReadOnly=.T.
use agenda
ThisForm.Text4.ReadOnly=.T.
goto top
ThisForm.Edit1.ReadOnly=.T.
endproc
ThisForm.Text1.SetFocus
procedure Init &&Formular
endproc
set date to british
procedure Unload &&Formular
ThisForm.Text1.ReadOnly=.T.
use
ThisForm.Text2.ReadOnly=.T.
endproc
Scriei procedurile asociate evenimentului Init al casetelor de text i al zonei de editare:
procedure Init &&Text1
endif
if eof()
endproc
ThisForm.text1.Value=''
procedure Init &&Text3
endif
if eof()
endproc
ThisForm.Text3.Value=''
procedure Init &&Text2
endif
if eof()
endproc
ThisForm.Text2.Value=''
procedure Init &&Text4
endif
if eof()
endproc
ThisForm.Text4.Value={ / / }
procedure Init &&Edit1
endif
if eof()
endproc
ThisForm.Edit1.Value=''
Scriei procedurile asociate evenimentelor Click ale butoanelor:
procedure Click &&Buton1
ThisForm.Refresh
if not eof()
endif
skip
endproc
ThisForm.Text1.ReadOnly=.T.
procedure Click &&Buton2
ThisForm.Text2.ReadOnly=.T.
if not bof()
ThisForm.Text3.ReadOnly=.T.
skip -1
ThisForm.Text4.ReadOnly=.T.
ThisForm.Text1.ReadOnly=.T.
ThisForm.Edit1.ReadOnly=.T.
ThisForm.Text2.ReadOnly=.T.
288 Informatic
ThisForm.Text3.ReadOnly=.T.
ThisForm.Text4.ReadOnly=.T.
ThisForm.Edit1.ReadOnly=.T.
ThisForm.Refresh
endif
endproc
procedure Click &&Buton3
append blank
ThisForm.Text1.ReadOnly=.F.
ThisForm.Text2.ReadOnly=.F.
Salvai formularul. Lansai formularul n
i-l testai.
ThisForm.Text3.ReadOnly=.F.
ThisForm.Text4.ReadOnly=.F.
ThisForm.Edit1.ReadOnly=.F.
ThisForm.Refresh
ThisForm.Text1.SetFocus
endproc
procedure Click &&Buton4
ThisForm.Release
endproc
execuie
289
290 Informatic
291
9 Antetul coloanei. Este o etichet afiat n partea de sus a coloanei care conine un
text explicativ referitor la datele afiate n coloan.
9 Celula. Celula curent (celula activ) este celula care primete focalizarea. Ea este
determinat de numrul rndului i numrul coloanei la intersecia crora se gsete
celula. Utilizatorul poate schimba n orice moment celula curent folosind mouse-ul
sau tastatura (tasta Tab). Dimensiunea celulei este determinat de nlimea rndului i
limea coloanei. Aceste proprieti 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 coninutul grilei atunci cnd nu pot
fi vizualizate toate datele n zona de afiare 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
nregistrrii pe care vrei s o marcai pentru tergere sau pentru care vrei s anulai
un marcaj pentru tergere - la fel ca la fereastra Browse).
9 Coloana cu marcajul rndului curent. Este o coloan care poate fi folosit pentru a
stabili nregistrarea curent (se execut clic n aceast coloan n dreptul nregistrrii
care vrei s devin nregistrare curent - la fel ca la fereastra Browse).
9 Panourile grilei. La fel ca la fereastra Browse grila poate fi mprit n dou partiii
numite panouri. Cele dou panouri pot funciona ca dou grile independente, iar
divizarea lor se face prin intermediul unei bare de divizare (split).
Coloana
Antetul
Formularul
Coloana cu
marcajul rndului
Barele de
derulare ale grilei
Celula selectat
Coloana cu
marcajul pentru
tergere
Grila
Toate aceste elemente pot fi caracterizate cu ajutorul proprietilor grilei, coloanelor i al
anteturilor, pot fi manipulate cu ajutorul metodelor i pot rspunde la evenimente specifice.
292 Informatic
Antetul - obiectul Header
Creeaz un antet al unei coloane dintr-o gril prin care se afieaz o etichet n partea
de sus a coloanei. Antetul poate rspunde la evenimente. Aspectul antetului poate fi
stabilit prin intermediul proprietilor pentru fontul caracterelor (nume font, dimensiune,
stil), pentru aliniere i culoare (pentru fond i pentru text). Obiectul nu are proprieti
pentru dimensiune i poziie. Prin proprietatea Caption a antetului se stabilete textul
care se afieaz ca etichet a coloanei.
Antetul rspunde la evenimente declanate de aciunile mouse-ului (Click, RightClick,
DblClick, MouseUp, MouseDown, MouseMove) i cunoate metoda Refresh.
293
294 Informatic
grilei, dar care nu se stabilesc la nivelul componentei, deoarece trebuie s existe un
aspect unitar al acestor componente la nivelul grilei):
9 nlimea antetului HeaderHeight . Este de tip numeric i se msoar n pixeli.
9 Modificarea interactiv a nlimii antetului AllowHeaderSizing . Este de tip logic.
Dac are valorea .T., permite modificarea interactiv de ctre utilizator a nlimii antetului.
9 nlimea rndului RowHeight . Este de tip numeric. Dac are valoarea -1, nlimea
este aleas automat astfel nct s ncap caracterele corespunztoare dimensiunii
stabilite prin proprietile FontSize i FontName.
9 Modificarea interactiv a nlimii rndului AllowRowSizing . Este de tip logic. Dac
are valorea .T., permite modificarea interactiv de ctre utilizator a nlimii rndului.
9 Evidenierea celulei focalizate HeighLight . Este de tip logic i determin cum este
afiat celula focalizat: dac are valoarea .T., celula focalizat apare evideniat, iar
dac are valoarea .F., celula focalizat nu apare evideniat.
Alte proprieti se folosesc pentru a stabili aspectul fizic al elementelor specifice grilei:
9 Barele de derulare
ScrollBars . Este de tip
Valoare
Efect ScrollBars
numeric i controleaz ce bare de derulare sunt
0
Barele nu sunt afiate.
afiate. Pentru valorile diferite de 0 barele de
1
Se afieaz numai barele
derulare sunt afiate automat atunci cnd n spaiul
pe orizontal.
de afiare al grilei nu pot fi afiate toate datele din
2
Se afieaz numai barele
sursa de date a grilei. Acionarea elementelor
pe vertical.
caracteristice ale barei de derulare sunt sesizate de
3
Se afieaz barele pe
evenimentul Scrolled. Barele de derulare pot fi (implicit) orizontal i pe vertical.
acionate interactiv (clic pe sgei, clic deasupra,
deddesubt, la dreapta sau la stnga casetei de derulare sau glisarea casetei de
derulare) sau pot fi acionate din program folosind metoda DoScroll.
9 Coloana cu marcajul nregistrrii curente RecordMark . Este de tip logic i controleaz dac este afiat coloana care conine marcajul pentru nregistrarea curent:
dac are valoarea .T. (implicit), este afiat, iar dac are valoarea .F., nu este afiat.
9 Coloana cu marcajele pentru tergere DeleteMark . Este de tip logic i controleaz
dac este afiat coloana care conine marcajele pentru tergere. Dac are valoarea .T.
(implicit), este afiat, iar dac are valoarea .F., coloana nu este afiat.
9 Proprietile folosite pentru a caracteriza liniile folosite ca delimitatori:
Modul de afiare a liniilor: GridLines - este de tip Valoare
numeric.
0
Grosimea liniilor: GridLineWidth - este de tip
numeric i determin grosimea n pixeli a liniilor.
Culoarea liniilor: GridLineColor - este de tip
numeric i reprezint codul culorii.
9 Proprietile folosite pentru a caracteriza mprirea
grilei n panouri:
Efect GridLines
Liniile nu sunt afiate.
1
Liniile se afieaz numai
pe orizontal.
2
Liniile se afieaz numai
pe vertical.
3
Liniile se afieaz pe
(implicit) orizontal i pe vertical.
295
panouri, iar valoarea proprietii reprezint distana dintre marginea stng 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
stnga, iar dac are valoarea 1 (implicit), panoul activ este n dreapta.
Legtura dintre panouri: PanelLink - este de tip logic i determin dac cele
dou panouri sunt legate ntre ele (dac au acelai aspect determinat de proprietile HeaderHeight, DeleteMark, GridLines,..., HeightLight, RecordMark,
RowHeight, ScrollBar): dac are valoarea .T. (implicit), au acelai aspect, iar
dac are valoarea .F., nu au acelai aspect.
9 Proprietile folosite pentru a caracteriza coloanele grilei:
Numul de coloane: ColumnCount - este de tip numeric. Implicit are valoarea -1,
care nseamn numr suficient de coloane pentru a afia cmpurile sursei de date.
Referirea coloanei: Columns - este de tip vector i conine referine ctre coloanele
grilei.
Prima coloan afiat: LeftColumn - este de tip numeric i reprezint numrul
coloanei (numrtoarea se face ncepnd de la stnga) care va fi prima afiat. De
exemplu, dac proprietatea are valoarea 3, afiarea n gril va ncepe cu coloana
3, iar coloanele 1 i 2 nu vor fi afiate.
Pe lng proprietile care caracterizeaz aspectul, grila mai are i proprieti specifice,
prin care este caracterizat comportamentul ei:
9 Proprietile folosite pentru a caracteriza celula activ (focalizat):
Poziia absolut furnizat de numrul rndului ActiveRow i de numrul coloanei
ActiveColumn . Aceste proprieti sunt de tip numeric i se calculeaz fa de primul
rnd, respectiv prima coloan a grilei. Sunt proprieti protejate la scriere (read-only).
Aceste valori corespund parametrilor metodei ActivateCell.
Poziia relativ furnizat de numrul rndului RelativeRow fa de primul rnd
afiat n gril i de numrul coloanei RelativeColumn fa de prima coloan
afiat n gril. Aceste proprieti sunt de tip numeric. De exemplu, dac prima
coloan afiat n gril este coloana 2, iar proprietatea ActiveColumn are valoarea 5,
nseamn c valoarea proprietii RelativeColumn este 3.
9 Adugarea datelor la gril este controlat cu proprietatea de tip logic AllowAddNew,
care dac are valoarea .T. permite adugarea de noi rnduri la gril (dac se apas
tasta se mai adaug un rnd la gril).
9 Proprietile 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 iniializarea grilei (n procedura asociat evenimentului Init al
grilei se poate crea un tabel folosind comanda SQL Create table). nregistrrile
tabelului vor fi rndurile grilei, iar cmpurile 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
fiierului de interogri.
296 Informatic
RowSourceType
Semnific:
0 - Table
Sursa de date este un tabel deja construit. El va fi
deschis automat la iniializarea grilei (evenimentul Init).
1 - Alias (implicit) Tabelul care va fi sursa de date este specificat prin alias.
2 - Prompt
Sursa de date este un tabel al crui nume va fi
specificat de utilizator pin intermediul unei casete de
dialog; dac este deschis o baz de date poate
alege un tabel din ea.
3 - Query
Sursa de date este generat dintr-un fiier de
interogri (.qpr).
4 - SQL Statement Sursa de date va fi descris printr-o instruciune SQL
Select de interogare a bazei de date, care va genera
un tabel permanent sau temporar ce va fi afiat n gril.
RowSource
Numele tabelului.
Aliasul tabelului.
Numele tabelului.
Numele fiierului de
interogri (.qpr)
Instruciunea SQL
9 Proprietile folosite pentru a caracteriza grila care afieaz date dintr-un tabel al
bazei de date:
Cmpul cheie: RelationalExpr este de tip caracter i precizeaz cmpul cheie
care asigur legtura ntre tabelul condus i tabelul conductor i care permite
reunirea celor dou tabele ntr-un singur tabel.
Aliasul tabelului conductor: LinkMaster este de tip ir de caractere i
furnizeaz aliasul tabelului conductor al tabelului afiat n gril.
Pe lng metodele obinuite, printre care i SetAll i SetFocus, grila mai are urmtoarele metode specifice:
9 Manipularea barelor de derulare DoScroll . Prin aceast metod pemite derularea din
program a coninutului grilei pentru a simula acionarea interactiv a barelor de derulare.
Metoda are parametrul <n>. Apelul metodei se face cu DoScroll(<n>). Parametrul <n>
determin modul n care se face derularea i poate avea urmtoarele valori: 0- derulare cu
un rnd n sus, 1- derulare cu un rnd n jos, 2- derulare cu o pagin n sus, 3- derulare cu
o pagin n jos, 4- derulare cu o coloan la stnga, 5- derulare cu o coloan la dreapta, 6derulare cu o pagin la stnga, 7- derulare cu cte o pagin la dreapta.
9 Activarea celulei ActiveCell . Prin aceast metod se poate schimba din program
celula activ. Metoda trebuie s primeasc doi parametri: <n> - numrul rndului i
<m> - numrul coloanei. Apelul metodei se face cu ActivateCell(<n>,<m>).
9 Adugarea unei coloane la gril AddColumn . Prin aceast metod se poate
aduga un nou obiect Column la gril. Metoda trebuie s primeasc un parametru <n>
- poziia coloanei n gril; coloanele care urmeaz dup ea sunt deplasate cu o poziie
spre drepata. Apelul metodei se face cu AddColumn(<n>).
9 tergerea unei coloane din gril DeleteColumn . Prin aceast metod se poate
terge un obiect Column din gril. Metoda poate primi un parametru <n> - poziia
coloanei care se terge din gril, altfel se terge coloana activ (cea care conine
celula activ); coloanele care urmeaz dup ea sunt deplasate cu o poziie spre
stnga. Apelul metodei se face cu DeleteColumn([<n>]).
297
<nDirection> care i comunic modul n care a fost acionat bara de derulare: 0derulare cu un rnd n sus (butonul sau tasta ), 1- derulare cu un rnd n jos (butonul
sau tasta ), 2- derulare cu o pagin n sus (clic pe bara vertical, deasupra casetei), 3derulare cu o pagin n jos (clic pe bara vertical, sub caset), 4- derulare cu o coloan
la stnga (butonul sau tasta ), 5- derulare cu o coloan la dreapta (butonul sau tasta
), 6- derulare cu o pagin la stnga (clic pe bara orizontal, la stnga casetei), 7derulare cu o pagin la dreapta (clic pe bara orizontal, la dreapta casetei).
9 Marcarea pentru tergere a unei nregistrri Deleted . Acest eveniment este
declanat fie de marcarea interactiv n gril a nregistrrii pentru tergere sau refacerea
ei, fie prin marcarea pentru tergere cu comanda Delete. Procedura asociat evenimentului primete din partea acestuia parametrul <nRecNo> care i comunic numrul nregistrrii marcate pentru tergere.
9 Schimbarea celulei focalizate (fie interactiv prin deplasarea selectorului de celul cu
mouse-ul sau cu tastatura, fie din program cu metoda ActivateCell):
Dup mutarea focalizrii: AfterRowColChange - se produce atunci cnd utilizatorul
mut focalizarea ntr-o celul dintr-o alt coloan sau un alt rnd al grilei, dup ce a
fost focalizat noua celul i numai dac procedura asociat evenimentului When a
obiectului din celula nou focalizat furnizeaz un rezultat .T.. Evenimentul furnizeaz
un parametru care corespunde indexului coloanei sau rndului n care a fost mutat
focalizarea.
naintea mutrii focalizrii: BeforeRowColChange - se produce atunci cnd
utilizatorul mut focalizarea ntr-o celul dintr-o alt coloan sau un alt rnd al grilei,
nainte ca noua celul s primeasc focalizarea i nainte de evenimentul Valid al
obiectului din celula din care se mut focalizarea.
Creai un formular nou. n acest formular vei crea n mod rapid o gril pentru
cmpurile din tabelul agenda cu ajutorul obiectului Data Environment.
Executai clic pe butonul Data Environment din bara Form Designer. Se deschide
caseta de dialog Open din care
alegei tabelul agenda. n fereastra
Data Environment va fi afiat
tabelul. Indicai titlul tabelului i l
glisai n formular. Dup ce eliberai
butonul mouse-ului, n formular se va
crea o gril cu o structur de
coloane care corespunde cmpurilor
din tabel. Legendele din anteturile
coloanelor vor fi numele cmpurilor.
Facei urmtoarele modificri de proprieti n fereastra Properties:
Pentru obiectul Grid1 modificai proprietatea AllowAddNew = .T., pentru obiectul
298 Informatic
Header1 al coloanei a cincea (controlul Column5) modificai proprietatea Caption=
'Data nasterii'.
299
Name = "Header1"
ReadOnly = .T.
Caption = "prenume"
Name = "Header1"
Name = "Text1"
Caption = "adresa"
ReadOnly = .F.
Name = "Edit1"
Name = "Header1"
ReadOnly = .F.
Caption = "telefon"
* pentru toate controalele
Name = "Text1"
* caseta de text:
ReadOnly = .F.
BorderStyle = 0
Name = "Header1"
Margin = 0
Caption = "data nasterii"
ForeColor = 0,0,0
Name = "Text1"
BackColor = 255,255,255
ReadOnly = .F.
* Butonul de comanda
Name = "Header1"
Name = "Command1"
Caption = "varsta"
Caption = "\<Termina"
Name = "Text1"
Default = .T.
Scriei procedurile asociate evenimentelor Init al formularului i Click al butonului de
nchidere (prin care se terg i nregistrrile considerate vide - fr nume pentru
persoan - i cele care au fost marcate pentru tergere):
procedure Init && formular
delete
set date to british
endscan
endproc
pack
procedure Click && Buton
ThisForm.Release
scan for nume=space(15)
endproc
Salvai formularul i-l lansai n execuie. Testai grila.
300 Informatic
ncercai:
Adevrat/Fals:
1. Textul afiat n formular prin care utilizatorul poate identifica rolul controlului se pstreaz n proprietatea Name.
2. Proprietile ReadOnly i Enabled au aceeai semnificaie: controleaz accesul la un
control.
3. When este un eveniment declanat naintea primirii focalizrii de ctre control.
4. Proprietatea Default este specific unui control de tip CommandButton.
5. Eticheta are proprietatea AutoSize.
6. Cmpul 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 mprirea grilei n panouri.
Completai:
1. Informaiile despre control, afiate ntr-o caset atunci cnd este indicat controlul, se
pstreaz n proprietatea .............. i se poate folosi numai dac proprietatea ..............
a formularului are valoarea .T.
301
2.
3.
4.
5.
6.
7.
Semnificaie
Tipul datelor
Comutatorul
Logic
Butoane de opiuni
Lista
Caseta combinat
ir de caractere
sau numere
302 Informatic
Comutatorul CheckBoxx
Se folosete ntr-o aplicaie 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 afieaz numele
comutatorului care corespunde datei a crui 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 stnga - 0). Metoda de acionare 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 proprietii Value valoarea corespunztoare noii stri. 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 numete i caset
de validare. Dac proprietatea are valoarea 1 - Graphic, controlul este reprezentat ca un
buton de comand: n interiorul su este afiat o imagine care poate fi nsoit de text
(textul va fi scris centrat, sub imagine). Pentru acest stil de reprezentare trebuie folosit
proprietatea DownPicture prin care se stabilete aspectul comutatorului cnd 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.
F1 = CreateObject('Form')
F1.Closable = .F.
F1.Caption='Test'
F1.Height=200
F1.BackColor = RGB(200,200,200)
F1.AddObject('B1','Buton')
F1.AddObject('C1','Comutator')
F1.AddObject('P1','Patrat')
F1.B1.Visible =.T.
F1.C1.Value=.F.
F1.C1.Visible = .T.
F1.C1.BackStyle = 0
F1.C1.Click
F1.Show
Read events
Define class Comutator asB;
CheckBox
Alignment=1
Top = 40
Left = 10
Height = 25
303
Width = 130
Cancel = .T.
FontSize=12
Left = 125
Caption = "\<Afisare patrat"
Top = 150
Procedure Click
Height = 25
ThisForm.P1.Visible =;
Procedure Click
!ThisForm.P1.Visible
ThisForm.Release
ThisForm.CurrentX=55
Clear events
ThisForm.CurrentY=100
Enddefine
If This.Value
Define class Patrat as Shape
ThisForm.Print("Patrat")
Top = 30
else
Left = 220
ThisForm.Print(space(12))
Width = 100
endif
Height = 100
Enddefine
Curvature = 0
Define class Buton as;
BackColor = RGB(100,100,100)
CommandButton
FillStyle=7
Caption = '\<Terminarea'
Enddefine
Scriei pogramul. Lansai programul n execuie i testai comutatorul.
304 Informatic
procedure Init &&Check1
ThisForm.Print("Patrat")
ThisForm.Check1.Value=.T.
else
endproc
ThisForm.Print(space(12))
procedure Click &&Check1
endif
ThisForm.Shape1.Visible=;
endproc
!ThisForm.Shape1.Visible
procedure Click &&Buton
ThisForm.CurrentX=55
ThisForm.Release
ThisForm.CurrentY=100
endproc
if ThisForm.Check1.Value
Salvai formularul. l lansai n execuie i-l testai.
Adugai la tabelul Agenda cmpul de tip logic Are_copii (are valoarea adevrat dac
persoana respectiv are copii).
305
9 Apsai tastele de acces la buton (tasta Alt mpreun cu tasta literei de identificare).
Pentru administrarea butoanelor din grup putei folosi proprietile specifice grupului de
butoane radio:
9 Numrul 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.
Putei folosi metoda SetAll pentru a atribui aceeai valoare a unei proprieti 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.
dimension a(3)
a(1)='Cerc
'
a(2)='Elipsa '
a(3)='Patrat '
F1 = CreateObject('Form')
F1.Closable = .F.
F1.FontSize=14
F1.Caption='Test'
F1.BackColor = RGB(200,200,200)
F1.AddObject('B1','Buton')
F1.AddObject('GO1','GrupOpt')
F1.AddObject('C1','Cerc')
F1.AddObject('E1','Elipsa')
F1.AddObject('P1','Patrat')
F1.AddObject('L1','Label')
F1.B1.Visible =.T.
F1.L1.Caption = 'Afisare'
F1.L1.AutoSize = .T.
F1.L1.Top=20
F1.L1.Left=20
F1.L1.BackStyle=0
F1.L1.Visible =.T.
F1.GO1.Buttons(1).Caption=;
"\<Cerc"
F1.GO1.Buttons(2).Caption=;
"\<Elipsa"
F1.GO1.Buttons(3).Caption=;
"\<Patrat"
F1.GO1.SetAll("Width", 100)
F1.GO1.SetAll("Left", 10)
306 Informatic
F1.GO1.SetAll("BackStyle", 0)
F1.GO1.SetAll("FontSize", 12)
F1.GO1.Visible = .T.
F1.GO1.BackStyle = 0
F1.GO1.Click
F1.Show
Read events
Define class GrupOpt as;
OptionGroup
ButtonCount = 3
Top = 40
Left = 20
Height = 80
Width = 100
Procedure Click
ThisForm.C1.Visible = .F.
ThisForm.E1.Visible = .F.
ThisForm.P1.Visible = .F.
do case
case ThisForm.GO1.Value=1
ThisForm.C1.Visible =.T.
case ThisForm.GO1.Value = 2
ThisForm.E1.Visible = .T.
case ThisForm.GO1.Value = 3
ThisForm.P1.Visible = .T.
endcase
ThisForm.CurrentX=20
ThisForm.CurrentY=150
ThisForm.Print;
(a(ThisForm.GO1.Value))
Enddefine
Define class Buton as;
CommandButton
Caption = '\<Terminarea'
Cancel = .T.
Left = 125
Top = 200
Height = 25
Procedure Click
ThisForm.Release
clear events
enddefine
Define class Cerc as shape
Top = 30
Left = 200
Width = 100
Height = 100
Curvature = 99
BackColor = RGB(200,200,200)
FillStyle=4
Enddefine
Define class Elipsa as shape
Top = 30
Left = 200
Width = 120
Height = 80
Curvature = 99
BackColor = RGB(150,150,150)
FillStyle=5
Enddefine
Define class Patrat as shape
Top = 30
Left = 200
Width = 100
Height = 100
Curvature = 0
BackColor = RGB(100,100,100)
FillStyle=7
Enddefine
Creai un formular n care definii apoi o legend pentru grupul de butoane de opiuni,
un grup de butoane de opiuni cu trei butoane, trei forme care se vor suprapune n
formular i un buton.
Stabilii proprietile formularului i ale controalelor din formular:
* Formular
AutoSize = .T.
Name = "Form1"
BackStyle = 0
BackColor = 200,200,200
Caption = "Afisare"
Caption = "Test"
* Grupul de optiuni
Closable = .F.
Name = "Optiongroup1"
FontSize = 14
AutoSize = .T.
* Eticheta grupului
ButtonCount = 3
Name = "Label1"
BackStyle = 0
307
Value = 1
BackColor = 150,150,150
Option1.Name = "Option1"
Curvature = 90
Option1.Caption = "\<Cerc"
FillStyle = 5
Option2.Name = "Option2"
Height = 80
Option2.Caption = "\<Elipsa"
Left = 195
Option3.Name = "Option3"
Top = 24
Option3.Caption = "\<Patrat"
Width = 120
* Formele
Name = "Shape3"
Name = "Shape1"
BackColor = 100,100,100
BackColor = 200,200,200
FillStyle = 7
Curvature = 99
Height = 120
FillStyle = 4
Left = 195
Height = 120
Top = 24
Left = 195
Width = 120
Top = 24
Name = "Command1"
Width = 120
Cancel = .T.
Name = "Shape2"
Caption = "\<Terminare"
Scriei procedurile asociate evenimentelor Init al formularului, Init i Click ale grupului
de butoane de opiuni i Click al butonului de comenzi:
procedure Init &&Formular
ThisForm.Optiongroup1.Value=1
ThisForm.Shape1.Visible=.T.
ThisForm.Shape2.Visible=.F.
ThisForm.Shape3.Visible=.F.
endproc
procedure Init &&Grup optiuni
public a
dimension a(3)
a(1)='Cerc
'
a(2)='Elipsa '
a(3)='Patrat '
ThisForm.Optiongroup1.SetAll("Width",100)
ThisForm.Optiongroup1.SetAll("Left",100)
ThisForm.Optiongroup1.SetAll("BackStyle",0)
ThisForm.Optiongroup1.SetAll("FontSize",12)
endproc
procedure Click &&Grup optiuni
ThisForm.Shape1.Visible = .F.
ThisForm.Shape2.Visible = .F.
ThisForm.Shape3.Visible = .F.
do case
case ThisForm.Optiongroup1.Value=1
ThisForm.Shape1.Visible=.T.
case ThisForm.Optiongroup1.Value=2
ThisForm.Shape2.Visible =.T.
case ThisForm.Optiongroup1.Value=3
ThisForm.Shape3.Visible =.T.
endcase
ThisForm.CurrentX=20
ThisForm.CurrentY=150
ThisForm.Print(a(ThisForm.Optiongroup1.Value))
308 Informatic
endproc
procedure Click &&Buton
ThisForm.Release
endproc
Salvai formularul, l lansai n execuie i-l testai.
Creai un grup de butoane cu opiuni folosind Option Group Builder
Creai acelai grup de butoane radio folosind acest constructor rapid. Creai obiectul de tip
grup de butoane de opiuni, l selectai i deschidei caseta de dialog a constructorului rapid
cu opiunea Builder a meniului de comenzi rapide al controlului. Caseta de dialog conine
trei seciuni: Buttons pentru stabilirea butoanelor (numr, tip, etichete), Layout pentru
stabilirea aspectului controlului (modul n care vor fi afiate butoanele - pe orizontal sau
vertical, dimensiunea spaiului care separ butoanele,
stilul bordurii) i Value pentru stabilirea cmpului dintr-un
tabel n care se va memora valoarea asociat controlului.
Lista ListBoxx afieaz colecia de valori din care utilizatorul poate s aleag sub forma
unei liste de articole ntr-o caset, afiate pe vertical, pe o singur coloan sau pe mai
multe coloane (liste multicoloan). n cazul listei multicoloan un articol din list conine
mai multe coloane cu valori. Dac numrul de articole din colecie depete capacitatea
de afiare a casetei, apar automat barele de derulare. Articolele listei pot s fie derulate
numai pe vertical.
Caseta combinat ComboBox este un control care combin o caset de text cu o
list permind utilizatorului s aleag dintr-o colecie de valori. Aceste valori sunt afiate
n list i utilizatorul poate fie s aleag un articol din list, fie s scrie valoarea de la tastatur n caseta de text. Fa de list, caseta combinat are i proprietatea stil Style .
Proprietatea este de tip numeric i poate lua valorile: 0 - Drop-down Combo, adic o
caset derulant combinat care conine o list derulant i o caset de text i 1 -
309
Drop-down List, adic o list derulant, care conine numai o list derulant (se mai
numete i list ascuns).
Aadar, folosind aceste tipuri de controale putei obine urmtoarele tipuri de liste:
9 Lista simpl (List). Afieaz pe ecran mai multe articole (nu neaprat toate articolele). Se obine cu controlul ListBox .
9 Lista ascuns sau lista derulant (Drop-down List). Afieaz pe ecran numai
articolul curent selectat din list (ascunde restul articoleleor). Pentru a avea acces i
la alte elemente, lista trebuie deschis. n urma operaiei de deschidere, lista este
expandat (se deruleaz coninutul), iar utilizatorul are acces la mai multe articole (nu
neaprat toate). Se obine cu controlul ComboBox avnd proprietatea Style=1.
9 Caseta derulant combinat (Drop-down List). Combin o list ascuns cu o caset de text. Afieaz pe ecran numai elementul curent selectat din list. Pentru a avea
acces i la alte elemente lista trebuie deschis. n urma operaiei de deschidere, lista
este expandat (sunt afiate mai multe articole, nu neaprat toate) i se activeaz
caseta de text. Utilizatorul fie poate alege un articol din list, fie scrie valoarea n
caseta de text. Se obine cu controlul ComboBox avnd 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 proiectrii i citirea
sursei de date a listei n momentul execuiei, dar pot fi stabilite i n timpul execuiei (liste
dinamice), prin adugarea i nlturarea unor articole din list. n timpul execuiei,
articolele listei sunt pstrate 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 rnd al matricei reprezint un articol din list. Articolele listei
pot fi aranjate n ordine alfabetic (sortate) sau nu.
Fiecrui articol din list i se atribuie, la crearea listei sau la adugarea lui la list, dou
co-duri numerice pentru identificare:
9 Indexul (Index) Reprezint poziia articolului n list la un moment dat. Operaiile de
reordonare a listei, de tergere sau de adugare a unui articol au ca efect shimbarea
poziiei articolului n list. n acest caz se modific i indexul articolelor, pentru a
reflecta noua situaie.
9 Codul de identificare (ItemID). Reprezint un cod numeric unic asociat articolului
care nu se modific pe toat perioada existenei articolului n list (nu se modific la
schimbarea poziiei articolului n list). De obicei, acest cod este indexul iniial al
articolului (atribuit articolului la adugarea lui la list). Numele proprietilor care
folosesc acest cod pentru identificarea unui articol n list conin cuvntul 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 poziia 5 are codul
20, apelarea metodei Lista.IndexToItemID(5) va furniza numrul 20, iar apelarea metodei
Lista.IndexToItemID(20) va furniza numrul 5.
310 Informatic
Selectarea articolelor din list
A selecta un articol din list, nseamn a atribui proprietii Value a obiectului de tip list
valoarea articolului selctat. Dac lista este de tip multicoloan, proprietii Value a listei i
se va atribui numai una dintre valoarile afiate n coloanele articolului.
Selectarea unui articol din list se poate face fie cu mouse-ul (se execut clic pe articol),
fie de la tastatur (se deplaseaz selectorul pe articol cu tastele i i se confirm
alegerea apsnd tasta Enter). Dac lista este ascuns, n prealabil ea trebuie deschis
fie cu mouse-ul (se execut clic pe butonul cu sgeat din partea dreapt), fie de la
tastatur (se apas tastele Alt+).
Mecanismul implementat pentru listele Visual FoxPro permite selectarea unui grup de
articole din list. Aceast metod de selectare multipl este util atunci cnd dorii s
executai operaii cu un grup de articole din list: s copiai, s mutai sau s tergei un
grup de articole dintr-o list n alta (de exemplu s copiai, s mutai sau s tergei un
grup de fiiere), s efectuai calcule cu un grup de articole etc. Pentru a avea evidena
articolelor selectate, lista are asociat un vector cu valori logice de aceeai lungime ca i
vectorul list. Fiecare element al vectorului descrie starea unui articol din list: dac are
valoarea adevrat, articolul este selectat, iar dac are valoarea fals, nu este selectat.
Selectarea unui grup de articole din list se face prin selectarea fiecrui articol fie cu
mouse-ul (se execut clic pe articol cu tasta Shift sau Ctrl apsat), fie cu tastatura (se
deplaseaz selectorul pe articol cu tastele i i se confirm alegerea apsnd tasta
Shift sau Ctrl mpreun cu tasta Space). Tasta Shift se folosete atunci cnd grupul de
articole selectat formeaz un bloc continuu n list, iar tasta Ctrl atunci cnd articolele
sunt dispersate n list. Pentru anularea selectrii unui articol din grup se procedeaz la
fel ca i la selectarea lui.
Dac lista permite selectarea unui grup de articole, proprietii Value a listei i se va
atribui valoarea ultimului articol selectat (chiar dac ntre timp i s-a anulat selectarea, dar
dup el nu a mai fost selectat un alt articol din list).
Lista poate s permit sau nu selectarea unui grup de articole. De exemplu, dac lista
conine fiiere care pot fi deschise, se va putea selecta un singur fiier, iar dac lista conine documente care pot fi copiate sau mutate, se vor putea selecta mai multe documente.
Proprietile specifice listei sunt:
9 Proprietile folosite pentru a controla culoarea de afiare a articolelor i a listei:
Lista nu este disponibil: DisabledBackColor - pentru fundal i
DisabledForeColor - pentru text.
Chenarul listei: BorderColor - pentru fundal i DisabledItemForeColor - pentru
text.
Articolele din list (care nu au fost selectate): ItemBackColor - pentru fundal i
ItemForeColor - pentru text.
Articolele selectate din list: SelectedItemBackColor - pentru fundal i
SelectedItemForeColor - pentru text.
Articolele din list care nu sunt disponibile: DisabledItemBackColor - pentru
fundal i DisabledItemForeColor - pentru text.
311
312 Informatic
Identificatorul articolului selectat este furnizat de proprietile: ListIndex - care
se folosete mpreun cu proprietatea List (dac are valoarea 0, nu este selectat un
articol, iar dac are o valoare cuprins ntre 1 i ListCount reprezint poziia curent
a articolului selectat) i ListItemID - care se folosete mpreun cu proprietatea
ListItem (dac are valoarea -1, nu este selectat un articol, iar dac are o valoare
pozitiv reprezint codul de identificare al articolului selectat). Ambele sunt de tip
numeric. De exemplu, pentru a face referire la articolul selectat n lista Lista se poate
folosi Lista.List(Lista.ListIndex), dar i Lista.ListItem(Lista.ListIItemID).
Vectorul cu indeci asociat listei poate fi folosit de programator pentru a atribui
intern coduri speciale articolelor listei. Fiecare element al vectorului conine un cod
special asociat unui articol din list, diferit de codul de identificare. Dimensiunea vectorului este egal cu numrul de elemente, respectiv cu numrul de rnduri ale tabloului asociat listei. Vectorul este furnizat de proprietile: ItemData - vector n care
identificarea articolului se face prin poziia n list i ItemIDData - vector n care
identificarea articolului se face prin codul de identificare. De exemplu, n listaLista se
obine codul special asociat articolului focalizat cu Lista.ItemData(Lista.ListIndex).
Codul special asociat poate fi folosit pentru a identifica un articol din list: poziia n
list a unui articol cu codul special asociat cu valoarea12345 se poate afla cu
Lista.ItemIDData(12345).
9 Ordonarea articolelor n list este controlat cu urmtoarele proprieti:
Autosortarea: Sorted - este de tip logic i controleaz modul n care sunt afiate
articolele din list. Dac are valoarea .T., articolele din list sunt automat ordonate
alfabetic, inndu-se cont de diferena dintre literele mari i mici. Dac are valoarea .F.
(implicit), articolele din list sunt afiate n ordinea natural, ordinea n care au fost
adugate la creare sau n care au fost preluate dintr-o surs de date. Proprietatea este
disponibil numai pentru valorile 0 i 1 ale proprietii RowSourceType.
Ordonarea manual: MoveBars - este de tip logic i controleaz dac articolele pot
fi aranjate manual n list. Dac are valoarea .T., este afiat bara de mutare care
permite executarea interactiv a operaiei de mutare a articolelor n list. Dac are
valoarea .F. (implicit), bara nu este afiat. Pentru a muta un articol n list se poate
folosi fie tastatura (se selecteaz articolul i apoi cu tastat Ctrl apsat se deplaseaz
articolul n noua poziie cu tastele i ), fie mouse-ul (pe bara de mutare se gliseaz
butonul din dreptul articolului pe care vrei s-l mutai n noua poziie). Proprietatea este
specific numai controlului ListBox.
9 Cutarea asistat: IncrementalSearch - este de tip logic i controleaz dac se
poate folosi metoda de cutare asistat pentru gsirea unui articol n list. Dac are
valoarea .T., se folosete cutarea asistat, iar dac are valoarea .F., nu este activat
aceast facilitate. Cutarea asistat nseamn c atunci cnd este apsat o tast,
sistemul interpreteaz aceast tast ca fiind primul caracter al textului afiat de articolul
cutat i deruleaz lista astfel nct s fie afiat n list primul articol care ndeplinete
aceast condiie. Dac se mai apas o tast, aceasta este interpretat ca fiind al doilea
caracter al textului afiat de articolul cutat i deruleaz lista astfel nct s fie afiat n list
primul articol care afieaz un text care ncepe cu cele dou caractere .a.m.d. Este util s
activai aceast facilitate dac lista are dimensiuni mari.
9 Primul articol vizibil din list: TopIndex - furnizeaz poziia curent a primului
articol afiat n partea vizibil a listei i TopItemID - furnizeaz codul de identificare a
313
primului articol afiat n partea vizibil a listei. Aceste proprieti se pot folosi pentru a afla
dac un articol se gsete n zona vizibil a listei sau pentru a schimba articolele afiate n
partea vizibil a listei.
9 Ultimul articol adugat la list: NewIndex - furnizeaz poziia curent a ultimului
articol adugat la list i NewItemID - furnizeaz codul de identificare a ultimului articol
adugat la list.
9 Proprieti 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 numai pentru RowSourceType=5). Proprietile sunt de tip numeric i determin intervalul de elemente, respectiv de rnduri care vor fi folosite ca surs de date, altfel vor fi
folosite toate elementele, respectiv toate rndurile din tabloul.
Primul element: FirstElement - primul element, respectiv primul rnd al intervalului.
Implicit are valoarea 1 (primul element, respectiv primul rnd al tabloului).
Numrul de elemente: NumberOfElements - numrul de elemente, respectiv de
rnduri preluate din sursa de date ncepnd cu primul element al intervalului. Implicit
are valoarea corespunztoare numrului de elemente, respectiv de rnduri ale tabloului.
9 Proprieti specifice selectrii multiple:
Selectarea multipl: MultipleSelect - este de tip numeric i controleaz dac
este permis (valoarea 1) sau nu (valoarea 0 - implicit) selectarea mai multor articole n list.
Evidena articolelor selectate este furnizat de proprietile Selected i
SelectedID . Ambele proprieti sunt de tip vector cu elemente de tip logic i conin
attea elemente cte articole sunt n list. Fiecare element din vector reprezint starea
unui articol: dac are valoarea .T., articolul este selectat, iar dac are valoarea .F., articolul nu este selectat. Cei doi vectori se deosebesc dup modul n care se face identificarea articolelor: dup poziia curent, respectiv dup codul de identificare. De
exemplu, dac vrei s aflai dac n lista Lista a fost selectat al treilea articol din list,
aflai valoarea proprietii Lista.Selected(3), iar dac vrei s aflai dac articolul cu
codul de identificare 10 a fost selectat, aflai valoarea proprietii Lista.SelectedID(10).
Aceste proprieti pot fi folosite pentru a selecta un articol sau pentru a anula
selectarea unui articol din program. De exemplu, dac vrei s selectai al treilea articol
n lista Lista, atribuii valoarea corespunztoare proprietii: Lista.Selected(3)=.T., iar
dac vrei s anulai selectarea pentru articolul cu codul de identificare 10, atribuii
valoarea corespunztoare proprietii: Lista.SelectedID(10)=.F..
9 Proprieti specifice listelor cu mai multe coloane:
Numrul de coloane: ColumnCount - este de tip numeric; dac are valoarea 0,
nu se afieaz coloane.
Limea coloanelor: ColumnWidth - este de o list de numere, separate prin
virgul; fiecare numr reprezint limea unei coloane. De exemplu, n lista Lista
Lista.ColumnCount=3 i Lista.ColumnWidth='5,7,9'
Afiarea liniilor separatoare ntre coloane: ColumnLines - este de tip logic
(dac are valoarea .T. - implicit - ntre coloane vor fi afiate linii separatoare, altfel
liniile de separare sunt invizibile).
314 Informatic
Coloana preluat de proprietatea Value a controlului: BoundColumn - este de
tip numeric i reprezint numrul coloanei al crui text va fi preluat de proprietatea
Value. Implicit se preia textul din prima coloan.
Textul din prima coloan este preluat de proprietatea DisplayValue - este de
tip ir de caratere. Proprietatea este util atunci cnd n proprietatea Value este
preluat textul articolului dintr-o alt coloan.
Metodele specifice listei sunt:
9 Adugarea unui articol la list: AddItem i AddItemList . Metodelor trebuie s li se
comunice textul afiat de articol (<text>), poziia n care va fi adugat (<n>) pentru
AddItem, respectiv codul de identificare atribuit pentru AddItemList i numrul coloanei
(<n>) n cazul unor liste cu coloane: AddItem('<text>'[,<n>[,<c>]])). Dac poziia precizat
este valid, articolul va fi inserat n poziia precizat. Dac nu este precizat poziia,
articolul va fi inserat n poziia corespunztoare dac lista este sortat, iar dac nu este
sortat, va fi adugat la sfritul listei. Dac lista are mai multe coloane i nu se
precizeaz coloana, se va considera coloana 1. Aceste metode se pot folosi numai pentru
listele a cror surs de date nu este precizat (RowSourceType=0).
9 nlturarea unui articol din list: RemoveItem i RemoveItemList . Metodelor
trebuie s li se comunice indexul articolului nlturat , respectiv codul de identificare al
articolului. De exemplu, apelul metodei RemoveItem(5) nltur din list articolul din
poziia a cincea.
9 tergerea coninutului unei liste: Clear .
9 Remprosptarea listei: Requery . Acest metod trebuie s fie apelat dup orice
modificare a sursei de date. Prin aceast metod este recitit sursa de date a listei.
Metoda este similar metodei Refresh.
315
316 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 aduga o metod pentru calculul codului de
culoare corespunztor culorii din list. Metoda se numete
Culoarea i folosete o matrice b cu 8 linii i 3 coloane pentru a
calcula ponderea celor trei culori de baz: coloana 1 - ponderea
pentru rou, coloana 2 - ponderea pentru verde i coloana 3 ponderea pentru albastru care corespund parametrilor funciei Rgb(). De exemplu,
culoarea galben este determinat de valorile din cea de a patra linie a matricei i,
deoarece codul ei este dat de funcia 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 folosii opiunea de meniu New
Method... Form. n caseta de dialog scriei numele metodei Culoarea. Numele
metodei va fi adugat la lista de metode a formularului. Alegei din lista afiat n
seciunea Method a ferestrei de proprieti a formularului opiunea Culoarea. Se va
deschide fereastra pentru cod. Scriei 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
Scriei procedura asociat evenimentului Click al listei:
procedure Click && Lista
ThisForm.Shape1.BackColor =;
ThisForm.Culoarea(ThisForm.Combo1.ListIndex)
endproc
Creai o list cu mai multe coloane
Lista va avea dou coloane corespunztoare cmpurilor nume i prenume din tabelul
agenda. La alegerea unui articol din list, n formular se va afia numrul de telefon (se
alege ca obiect eticheta) i a-dresa persoanei (se alege ca obiect zona de editare). Creai
un fiier index (dup cmpurile nume i prenume pentru tabelul agenda.
317
BackStyle = 0
* zona de editare
Name = "Edit1"
BackStyle = 0
Enabled = .T.
ReadOnly = .T.
* buton de comanda
Name = "Command1"
Cancel = .T.
Caption = "\<Terminare"
* Lista
Name = "List1"
BoundColumn = 2
ColumnCount = 2
ColumnWidths = "70,70"
RowSourceType = 2
RowSource = "agenda"
ColumnLines = .F.
Height = 97
Left = 24
Top = 60
Width = 170
Scriei procedurile asociate evenimentelor Load, Init i Unload ale formularului n care
deschidei i nchidei 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
procedure Unload && Formular
use
endproc
procedure Click && Buton
ThisForm.Release
endproc
procedure Click &&Lista
goto top
locate for agenda.nume=ThisForm.List1.DisplayValue and;
agenda.prenume=ThisForm.List1.Value
ThisForm.Label3.Caption=agenda.telefon
ThisForm.Edit1.Value=agenda.adresa
endproc
Salvai formularul, l lansai n execuie i-l testai.
Creai o list dinamic cu selecie multipl
Creai un formular care conine dou liste. ntr-o list vor
fi afiate fiierele de tip program din directorul curent
(*.prg). Din aceast list vei
selecta un grup de fiiere
care vor fi adugate la cea
de a doua list. Cea de a
doua list este o list dinamic (se creeaz dinamic n
timpul execuiei formularului). Pentru lucrul cu cele
dou liste vor fi folosite dou
butoane: unul pentru adugare la cea de a doua list a fiierelor selectate n prima list i
unul pentru anularea selectrii unor fiiere din a doua list. Ambele liste permit selecie
multipl. Dup ce ai selectat grupul de fiiere, acionai cel de al treilea buton, butonul de
terminare care va declana operaia de copiere a fiierelor n directorul Test din rdcina
discului C.
Name = "Label1"
Caption = "Fisiere pentru ;
selectare"
Name = "Label2"
Caption = "Fisiere selectate"
* Toate tichetele:
AutoSize = .T.
BackStyle = 0
319
* Listele
MultiSelect = .T.
Name = "List1"
* Butoanele
BoundColumn = 1
Name = "Command1"
RowSourceType = 7
Cancel = .T.
RowSource = "*.prg"
Caption = "\<Terminare"
MultiSelect = .T.
Name = "Command2"
Name = "List2"
Caption = "\<Selecteaza>>>"
BoundColumn = 1
Name = "Command3"
RowSourceType = 0
Caption="<<<\<Anuleaza selectare"
RowSource = ""
Scriei procedurile asociate evenimentelor Click ale celor trei butoane:
procedure Click && Buton1
for i=1 to ThisForm.List2.Listcount
numef=ThisForm.List2.List(i)
copy file &numef to c:\test
endfor
ThisForm.Release
endproc
procedure Click && Buton2
for i=1 to ThisForm.List1.Listcount
if ThisForm.List1.Selected(i)
ThisForm.List2.AddItem(ThisForm.List1.List(i))
endif
endfor
ThisForm.List1.Requery
ThisForm.List2.Requery
endproc
procedure Click && Buton3
for i=1 to ThisForm.List2.Listcount
if ThisForm.List2.Selected(i)
ThisForm.List2.RemoveItem(i)
endif
endfor
ThisForm.List1.Requery
ThisForm.List2.Requery
endproc
Salvai formularul, l lansai n execuie i-l testai.
320 Informatic
2. Creai un tabel pentru reeta unui preparat gastronomic cu urmtoarea structur:
ingredient, unitate de msur, cantitate. Creai un tabel cu un singur cmp n care
memorai ingredintele care pot fi folosite pentru prepararea lui. Creai un formular
pentru introducerea datelor n tabel, care va conine o list pentru selectarea ingredientelor, un grup de butoane radio pentru alegerea unitii de msur, o caset de
text pentru comunicarea cantitii i un buton pentru terminare.
3. Din tabelul cu elevii clasei nscrii la diferite echipe, creai un formular prin care s
extragei numai elevii care fac parte din echipa de baschet. Formularul va conine o
list cu dou coloane cu elevii din clas i va permite crearea unei liste dinamice cu
elevii din echipa de baschet, prin selectarea lor din
lista surs.
ncercai:
Adevrat/Fals:
1. Cu metoda SetAll putei 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.
Completai:
1. Pentru a atribui aceeai valoare unei proprieti pentru toate butoanele dintr-un grup
de butoane radio folosii metoda ...............
2. Creai o list ascuns cu controlul ............... cu valorea .... a proprietii Style.
3. Remprosptarea listei se face cu metoda ........................
4. IncrementalSearch este o proprietate specific unui control de tip ..............
5. Numrul de articole din list se pstreaz n proprietatea ....................
Alegei rspunsurile corecte:
1. Tabloul de memorie n care se pstreaz articolele listei n ordinea poziiei lor curente
se memoreaz n proprietatea:
a) List
b) ListItem
c) ListIndex
2. FirstElement este o proprietate a listei care folosete ca surs de date:
a) lista cu nume de cmpuri b) tabloul de memorie
c) lista de valori
3. Articolele selectate dintr-o list cu selecie multipl se pstreaz ntr-un vector n
proprietatea:
a) MultipleSelect
b) Selected
c) ListItemID
spunsuri:
R
Adevrat/Fals: 1-F; 2-A; 3-A; 4-A; 5-A.
Completai: 1-SetAll; 2-ComboBox,1; 3-Requery; 4-list; 5- ListCount; 6- Column; 7-Header; 8Bound.
Alegei rspunsurile corecte: 1-a; 2-b; 3- b.
321
322 Informatic
tatatea logic AutoSize pentru a determina dac se redimensioneaz automat cadrul
containerului atunci cnd se adaug obiecte noi.
Pe lng metodele specifice unui formular (Refresh, Show, Move, Hide etc.), obiectul
ToolBox are urmtoarele metode specifice :
9 Ancorarea barei: Dock ancoreaz bara la una dintre marginile ferestrei. Apelul metodei
se face prin Dock([<poziie>[,<x>,<y>]]), unde parametrul reprezint marginea ferestrei de
care va fi ancorat i poate lua aceleai valori ca i proprietatea DockPosition, iar <x> i
<y> reprezint coordonatele poziiei barei ancorate.
9 Transformarea barei fixe n bar mobil cu metoda Move . Dac apelai aceast
metod atunci cnd bara este ancorat, ea va deveni mobil.
Pe lng evenimentele specifice unui formular, obiectul ToolBox rspunde la urmtoarele evenimente specifice :
9 Dup ancorarea barei: AfterDock este declanat dup ce a fost ancorat bara.
9 nainte de ancorarea barei: BeforeDock este declanat fie interactiv, prin glisarea
barei de ctre utilizator pentru a fi ancorat, fie din program prin apelarea metodei Dock.
Procedura asociat acestui eveniment primete parametrul nLocation care reprezint
poziia n care va fi ancorat bara (aceleai valori ca i proprietatea DockPosition).
nainte ca bara s fie redesenat n poziia de ancorare, n procedura asociat acestui
eveniment se pot scrie instruciuni prin care s fie modificat aspectul barei (de exemplu,
s se nlocuiasc un control cu un alt control).
9 Anularea ancorrii barei: Undock este declanat fie interactiv, prin glisarea barei
de ctre utilizator din poziia n care a fost ancorat, fie din program prin apelarea
metodei Move.
Bara cu instrumente va conine trei controale Atunci cnd sunt activate, determin scrierea
pe ecran cu caractere cu stilul respectiv.
pentru stabilirea stilului n care va fi scris
Atunci cnd un buton este activat, textul
textul pe ecran: ngroat (butonul Italic),
legendei sale este scris cu acel stil.
nclinat i subliniat (butonul Underline).
Aceste butoane au efect de comutator. Executnd clic pe ele, proprietatea care corespunde stilului este negat (este o proprietate
logic). De exemplu, dac se execut clic pe
butonul Bold se va executa instruciunea
screen.fontbold=!_screen.fontbol,
adic proprietii FontBold a ecranului i
se va atribui valoarea invers (este folosit
opera-torul pentru negare !).
Toate
Toate
Scriei n fiierul test_bara1 programul
comutatoarele
comutatoarele
surs:
sunt activate
sunt dezactivate
public ecran
ecran=createobj('bara')
323
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
Lansai n execuie programul cu comanda do test_bara1.
Testai bara de instrumente. Activai unul dintre stiluri sau mai multe stiluri. Afiai pe
ecran un text de fiecare dat (de exemplu, comanda ? 'AAAA'). Urmrii efectul obinut.
Deplasai bara cu instrumente n interiorul ferestrei Visual FoxPro. Ancorai bara n
diferite poziii.
nchidei bara executnd clic pe butonul de nchidere.
324 Informatic
Creai o bar de instrumente care acioneaz asupra unui formular
Bara cu instrumente va conine aceleai trei controale pentru stabilirea stilului n care va fi
scris textul pe ecran: ngroat (butonul Bold), nclinat (butonul Italic) i subliniat (butonul
Underline). Aceste butoane au efect de comutator. Se va crea un set de formulare care va
cuprinde un formular pentru fereastr i o bar cu instrumente. Butonul Test al formularului
va testa stilul ales prin scrierea unui text n formular. Att butoanele din bara cu
instrumente, ct i butoanele din formular vor afia informaii despre instrument
(ToolTips).
Scriei n fiierul test_bara2 programul surs:
set=createobj('formset')
set.addobject("bara1","bara")
set.addobject("f1","form")
set.f1.addobject("bt1","buton1")
set.f1.addobject("bt2","buton2")
set.f1.top=8
set.f1.left=44
set.f1.height=250
set.f1.width=400
set.f1.backcolor=rgb(190,190,190)
set.f1.borderstyle=1
set.f1.caption="test"
set.f1.showtips=.T.
set.f1.closable=.F.
set.f1.bt1.visible=.t.
set.f1.bt2.visible=.t.
set.f1.show
set.bara1.show
read events
define class buton1 as commandbutton
top = 200
left = 50
height = 25
width = 100
caption = "T\<est"
ToolTipText = "Test scriere"
procedure click
ThisForm.print('test
')
endproc
enddefine
define class buton2 as commandbutton
top = 200
left = 250
height = 25
width = 100
ToolTipText = "Termina aplicatia"
caption = "\<Terminare"
procedure click
ThisFormSet.Release
clear events
endproc
325
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
Lansai n execuie programul cu comanda do test_bara2.
Testai bara de instrumente. Activai unul dintre stiluri sau mai multe stiluri i executai clic pe butonul Test din fereastr. Observai informaiile afiate pentru fiecare
instrument selectat.
nchidei setul de formulare executnd clic pe butonul Terminare.
326 Informatic
Modificai formularul creat anterior
Adugai fomularului creat anterior un buton care s controleze afiarea barei cu
instrumente:
327
328 Inormatic
Containerul OLE permite afiarea i editarea obiectelor OLE ntr-o aplicaie Visual
FoxPro. Obiectul vizual OLEContainer din Visual FoxPro este un container pentru obiectul creat cu o alt aplicaie. Aceste obiecte pot fi:
9 Controale OLE (fiiere .ocx). Au propriul lor set de proprieti, metode i evenimente.
9 Obiecte OLE inserabile. Nu au propriul lor set de proprieti, metode i evenimente
(nu pot rspunde la evenimente).
Containerul OLE care nu are proprietile ControlSource i Value. n scimb, obiectul vizual
OLEBoundControl are aceste proprieti. Proprietatea ControlSource memoreaz numele cmpului n care se pstreaz obiectul.
Valoare
Efect Stretch
0
Clip - Este secionat ca s ncap.
1
Isometric - Este redimensionat ca
s ncap, cu pstrarea proporiilor.
2
Stretch - Este redimensionat ca s
ncap, fr pstrarea proporiilor.
Verb
Efectul metodei DoVerb
0 Este aciunea implicit a obiectului.
-1 Obiectul va fi activat pentru editare mpreun cu
containerul OLE.
-2 Deschide fereastra aplicaiei server n care se
ncarc obiectul pentru editare.
-3 Ascunde aplicaia care a creat obiectul (pentru
obiectele ncapsulate).
-4 Obiectul este activat n container pentru editare i
sunt afiate instrumentele specifice aplicaiei server.
-5 La focalizarea obiectului se creeaz o fereastr
pentru editarea obiectului.
-6 Obiectul este activat pentru editare dar sunt ignorate toate modificrile pe care aplicaia server le
poate anula.
329
<nume_obiect>.Object.<nume_proprietate>=<valoare>
iar pentru apelarea unei metode:
<nume_obiect>.Object.<nume_metod>[(<list-parametri>)]
9 Aplicaia server cu care a fost creat obiectul: OLEClass (numele aplicaiei).
9 Identificatorul fiierului care conine obiectul (unitatea de disc, calea de director, numele i extensia): DocumentFile .
9 Redimensionarea zonei alocate obiectului OLE: Sizable . Are aceeai semnificaie 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-raiilor care se pot executa cu obiectul respectiv. Obiectul poate fi activat prin
acionarea standard a obiectului sau prin alte aciuni (verbe). Metoda poate fi apelat prin:
DoVerb[(<verb>)]
330 Inormatic
left = 250
top = 310
height = 25
procedure click
clear events
thisform.release
enddefine
Lansai n execuie programul cu comanda do obiect1.
331
prin intermediul creia stabilii obiectul care va fi adugat n formular. Din grupul de
butoane radio activai butonul Create From File. Acionai butonul Browse pentru a
construi identificatorul fiierului care conine obiectul: discul C, dosarul Test i fiierul
Cheltuieli.xls. nchidei caseta de dialog (clic pe butonul OK).
n caseta de proprieti modificai proprietile controlului OLEControl pentru a
corespunde cu cele din program. Observai care sunt proprietile, metodele i
evenimentele acestui tip de control.
Adugai la formular butonul pentru terminare. Stabilii proprietile controlului (cele din
program) i codul evenimentului Click.
Salvai formularul i nchidei aplicaia Constructorului de formulare.
Lansai n execuie formularul cu comanda do form obiect1.
332 Inormatic
thisform.refresh
skip -1
endproc
endif
procedure click && butonul <<<
thisform.refresh
if not bof()
endproc
Adugai la formular un obiect de tip OLEBoundControl: executai clic pe obiectul
din bara de obiecte a constructorului. Stabilii proprietile controlului (ControlSource=
sigle.sigla).
Salvai formularul. Lansai n execuie formularul cu comanda do form obiect2. Testai
formularul.
Semnificaie
Imagea
Linea
Shapea
Imaginea (image) poate fi folosit la crearea butoanelor cu pictograme n locul butoanelor cu legend, care pot fi folosite ca butoane declanatoare. 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 fiier bitmap .bmp, un
fiier de imagini .ico sau un cmp din tabel de tip general.
Formele i liniile (shape sau line) sunt folosite pentru a se desena elemente grafice pe
suprafaa formularelor. Chiar dac au asociate evenimente (declanate de aciuni ale
mouse-ului), au n general numai un rol decorativ, de grupare sau de evideniere.
Ceasul Timer este un obiect nevizual care poate fi folosit n interfaa unei aplicaii
pentru a msura timpul. Este un mecanism implementat n interfa care permite programatorului s declaneze un anumit proces dup un interval de timp. Este caracterizat de:
9 Proprietatea interval - Intervalx. Este de tip numeric i reprezint numrul de
milisecunde dup care este generat evenimentul Timer, adic intervalul de timp pn
la apelul procesului. Valoarea sa implicit este 0 (corespunde dezactivrii ceasului).
9 Evenimentul asociat ceasului - Timerx. Este un eveniment care se declaneaz la
intervale egale de timp (stabilite de proprietatea Interval). n procedura asociat acestui eveniment se scriu instruciunile aciunii 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.
333
334 Inormatic
endproc
procedure Timer
ThisForm.Image1.Visible=!ThisForm.Image1.Visible
ThisForm.Label1.Visible=!ThisForm.Label1.Visible
endproc
Salvai formularul. Lansai n execuie formularul cu comanda do form imagine2.
Testai formularul. nchidei formularul.
Creai un formular care simuleaz un ceas
Fie creai dou fiiere bitmap .bmp, fie gsii n sistem dou fiiere cu pictograme .ico
(de exemplu face01.ico i face02.ico n imaginile din formularul alturat). Creai formularul Ceas care, la acionarea unui buton Afisare va afia alternant la un interval de
500 ms o imagine n partea dreapt i o imagine n partea stng, iar sub cele dou
imagini o afiare numeric a timpului (cu pasul de 500 ms).
335
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
Salvai formularul. Lansai n execuie i testai formularul. nchidei formularul.
ncercai:
Adevrat/Fals:
1. Obiectul ToolBox are proprietatea AutoSize.
2. DocumentFile este o proprietate specific obiectelor de tip OLE.
3. Obiectul Timer are proprietatea Picture.
Completai:
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
Alegei rspunsurile corecte:
1. Pentru un obiect ToolBox, Dock este:
a) o proprietate
b) o metod
2. Pentru un obiect de tip OLE DoVerb este:
a) o proprietate
b) o metod
3. Pentru obiectul ceas Timer este:
a) o proprietate
b) o metod
c) un eveniment
c) un eveniment
c) un eveniment
R spunsuri:
4. Proiectarea m e n i u rilor
Dac aplicaia pune la dispoziia utilizatorului un set de comenzi, metoda cea mai avantajoas, mai uoar i mai potrivit pentru a grupa aceste comenzi astfel nct 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 opiune (menu item) dintr-o mulime finit de opiuni posibile, afiate pe
ecran total sau parial. n urma selectrii unei opiuni se declaneaz o anumit aciune,
corespunztoare opiunii alese.
n Visual FoxPro putei folosi dou tipuri de meniu:
9 Meniul sistem - este pus la dispoziie de mediul Visual FoxPro pentru a realiza aciuni corespunztoare limbajului de comand.
9 Meniul utilizator - este creat de programatorul unei aplicaii ca element al aplicaiei
construite de el.
Tipul de meniu disponibil (modul n care este afiat bara de meniu Visual FoxPro n
timpul execuiei programului) este controlat de parametrul Sysmenu cu comanda:
set sysmenu on| off | automatic | to default
unde:
9 on - bara de meniu Visual FoxPro este disponibil n timpul execuiei programului.
9 off - bara de meniu Visual FoxPro nu este disponibil n timpul execuiei programului.
9 automatic - bara de meniu Visual FoxPro este vizibil n timpul execuiei
programului, iar opiunile sunt disponibile n funcie de comanda care se execut n
program.
9 to default - se revine la afiarea meniului Visual FoxPro dup ce programul i-a terminat execuia.
n funcie de modul n care este dispus lista cu opiuni, meniurile sunt de dou tipuri:
337
9 Meniuri orizontale - afieaz lista de opiuni pe un rnd, pe orizontal. Meniul orizontal se mai numete i bar de meniu (menu bar), iar opiunile sale se mai numesc
i titluri de meniuri (menu titles). Ele pot fi reprezentate prin cuvinte, expresii sau
pictograme. n terminologia Visual FoxPro, meniul orizontal se numete menu, iar
opiunile sale se numesc pad.
9 Meniuri verticale - afieaz lista de opiuni ntr-o coloan, pe vertical. Ele se mai
numesc i submeniuri. n terminologia Visual FoxPro, meniul vertical se numete
popup, iar opiunile sale se numesc bar.
Sistemul de meniuri al unei aplicaii este o combinaie de bar de meniuri, titluri de
meniuri, submeniuri i opiuni de meniu. Forma standard a unui sistem de meniuri este
urmtoarea:
9 Meniul principal (main menu) este reprezentat printr-o bar de meniu afiat sub
bara de titlu a unui formular de tip fereastr, n care ruleaz aplicaia. Atunci cnd se
execut clic pe un titlu de meniu se deschide un meniu pe vertical.
9 Meniurile pe vertical afieaz o list cu opiuni. Opiunile pot fi comenzi de operaii
de prelucrare, titluri de submeniuri sau bare separatoare. Barele separatoare se
folosesc pentru a mpri n grupuri opiunile din lista meniului. Submeniul este un alt
meniu care afieaz o alt list de opiuni. n acest mod se poate crea o structur
arborescent de submeniuri.
Pentru a face aplicaia mai uor de utilizat, opiunile de meniu sunt grupate dup funciile
lor. Submeniurile se creeaz atunci cnd:
9 bara de meniu este plin cu titluri de meniu i nu mai ncape un nou titlu de meniu;
9 lista submeniului este format din comenzi care sunt folosite mai rar;
9 lista de comenzi din submeniu este ntr-o anumit relaie cu o opiune de meniu.
Unele opiuni de meniu execut direct o aciune. Alte opiuni afieaz o caset de dialog, un fomular prin care aplicaia cere utilizatorului s-i furnizeze informaii suplimentare
ca s poat executa aciunea cerut. n marea majoritate a aplicaiilor aceste opiuni de
meniu sunt urmate de trei puncte. Este bine ca i n interfaa pe care o construii s
respectai acest standard.
Fiecrei opiuni de meniu i corespunde un control de meniu. Controlul meniului este i el
un obiect. La fel ca orice obiect, i el are proprieti standard prin care i se poate stabili
aspectul: legenda, disponibilitatea, vizibilitatea etc. Legenda este textul care apare n titlu
sau n opiunea de meniu. Controlul meniu are asociat un singur eveniment care este
declanat atunci cnd opiunea de meniu este selectat de la tastatur sau cu mouse-ul.
Proprietile specifice unui control meniu sunt:
9 Legenda opiunii Prompt - este textul explicativ afiat de titlul meniului sau de
opiunea de meniu.
9 Tasta de acces Access key - este tasta care se apas pentru a selecta direct titlul
sau opiunea respectiv atunci cnd meniul este activat. Litera tastei de acces este
subliniat n legend. Pentru a stabili o tast de acces, naintea literei respective din
legend, scriei caracterele \<.
9 Scurttura Shortcut key - este combinaia de taste asociat opiunii de meniu care
permite executarea unei comenzi dintr-un meniu fr s se mai activeze bara de
338 Informatic
meniu i s se selecteze comanda. Lng opiune, n partea dreapt este afiat un
text cu combinaia respectiv de taste.
9 Mesajul informativ Message - este un mesaj afiat n bara de stare atunci cnd se
selecteaz opiunea.
9 Marcajul de verificare Mark character - este un simbol care se afieaz n partea
stng a opiunii de meniu n funcie de o condiie: dac valoarea condiiei este adevrat,
n faa opiunii este afiat marcajul de verificare b(bifa), iar dac este fals, marcajul nu
este afiat. Aceast proprietate permite folosirea opiunilor de meniu pentru stabilirea
valorii unui parametru. Dac parametrul poate lua valoarea adevrat sau fals, se folosete
o singur opiune care poate fi marcat sau nu. Numele opiunii este numele parametrului.
Deoarece aceast opiune se comport la fel ca un control comutator, ea se mai numete
i opiune comutator. Dac parametrul poate lua mai multe valori, se folosesc mai multe
opiuni de meniu, numele fiecrei opiuni reprezentnd o valoare posibil a parametrului.
O singur opiune din grupul de opiuni poate fi marcat i ea reprezint valoarea aleas
pentru parametru. La alegerea unei noi opiuni din grup, va fi ters marcajul vechii opiuni
i va fi marcat noua opiune. Deoarece grupul de opiuni de meniu se comport la fel ca
un control de tip butoane radio, el se mai numete i grup de opiuni butoane radio.
9 Disponibilitatea Skip for - este determinat de o condiie prin care se controleaz
dac opiunea de meniu este disponibil sau nu: dac expresia logic are valoarea
adevrat, opiunea de meniu este disponibil.
Pentru a controla afiarea marcajului n faa unei opiuni se folosete comanda:
set mark of popup <nume_opiune> to <expL>
unde <nume_opiune> este numele atribuit opiunii (diferit de legend) folosit pentru identificarea sa, iar <expL> exprim condiia care determin afiarea marcajului.
Evenimentele specifice unui control meniu sunt:
9 Iniilizarea Setup - este declanat de crearea meniului. n procedura asociat
acestui meniu putei defini variabilele de memorie, putei deschide fiiere, putei salva
sau restaura un sistem de meniuri. Meniurile pot fi salvate n stiva meniurilor. Pentru
operaiile cu stiva putei folosi comenzile push menu pentru salvarea meniului n stiv
i pop menu pentru extragerea meniului n stiv.
9 tergerea Cleanup - este declanat de activarea meniului. n procedura asociat
acestui meniu putei scrie secvene de cod prin care tergei informaiile care au fost
afiate pe ecran i prin care stabilii ce opiuni de meniu sunt disponibile. Dac meniul
este programul principal al aplicaiei, n aceast procedur putei activa procesorul de
evenimente cu comanda read events. Comanda prin care dezactivai acest procesor
clear evnts o vei scrie n procedura asociat opiunii de meniu prin care terminai
aplicaia.
Unele aplicaii pun la dispoziia utilizatorului meniuri derulante (pop-up menu) care sunt
afiate deasupra formularului, independent de bara de meniu. Opiunile afiate n acest
meniu depind de context, adic de locul n care se gsete cursorul atunci cnd este
apsat butonul din partea dreapt a mouse-ului. El se numete meniul contextului
(context menus) sau meniu de comenzi rapide.
Pentru proiectarea unui meniu se poate folosi limbajul de comand care v pune la
dispoziie comenzi i funcii pentru realizarea acestei operaii. Forma mai rapid i mai puin
339
340 Informatic
Vei preciza structura arborescent a meniului i vei specifica aciunile pe care trebuie s le execute fiecare opiune de meniu ca de exemplu afiarea unei casete de
dialog, a unui formular, a unei bare de instrumente sau a unui alt sistem de meniuri.
Cererea de executare a unei aciuni trebuie s se fac numai printr-o singur comand. Dac aciunea declanat de selectarea unei opiuni se descrie printr-un
grup de instruciuni, acestea vor fi scrise ntr-un fiier de tip program surs i vor fi
lansate n execuie printr-o singur comand: do <nume_fiier>. n urma acestor
aciuni ale programatorului constructorul de meniuri va crea un fiier cu numele meniului i extensia .mnx n care se gsesc, sub forma unui tabel, componentele unui
meniu i caracteristicile lor. Putei modifica un meniu cu comanda:
modify menu <nume_meniu>
3. Generai programul excutabil al meniului. Pentru a putea folosi meniul, trebuie
generat un program care, n urma execuiei sale, s activeze meniul. Programul va fi
memorat ntr-un fiier cu extensia .mpr. Dup orice modificare a meniului va trebui s
executai din nou operaia de generare.
4. Lansai n execuie i testai meniul. Meniul va fi activat prin lansarea n execuie a
pogramului generat cu comanda:
do <nume_meniu>.mpr
341
342 Informatic
9 Zona de editare Procedure i comutatorul Edit le vei folosi dac vrei s definii o
procedur global care va fi folosit implicit n ntregul sistem de meniuri. Ea va fi
lansat n execuie de fiecare dat cnd se va alege o opiune creia nu i s-a atribuit o
procedur proprie. Pentru meniul pe care l construii trebuie s fie activat butonul
Replace. nchidei caseta de dialog executnd clic pe butonul Ok.
Ai revenit n fereastra Menu Designer n care definii titlurile din meniul principal:
n fereastra Menu Designer putei folosi urmtoarele controale:
9 Zona de de lucru afieaz sub forma unui tabel mai multe controale: pe un rnd sunt
afiate controalele corespunztoare definirii caracteristicilor unei opiuni de meniu, iar
pe o coloan controalele corespunztoare unei caracteristici a opiunii de meniu.
Coloanele sunt urmtoarele:
Mover Control. Este prima coloan i conine un buton cu sgeat dubl. Se
folosete pentru a schimba locul opiunilor n list (prin glisarea opiunii n noua
poziie).
Prompt. n aceast coloan se scrie textul legendei opiunii de meniu. Dac n
legend scriei naintea textului caracterul \, opiunea nu va disponibil. Dac n
legend scriei numai caracterele \-, opiunea respectiv va fi o linie de demarcare
ntre grupurile de opiuni.
Result. n acest coloan este afiat un control de tip list ascuns din care putei
alege tipul aciunii declanate de selectarea opiunii 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 opiunile de
submeniu Afiseaza, Coloreaza, Grup 1, Grup 2, Calculator i Ceas alegei un rezultat de tip Command, pentru titlul Terminare, rezultatul Procedure, pentru restul
opiunilor rezultatul Submenu.
343
344 Informatic
9 Seciunea de butoane Item conine butoane pentru inserarea unei opiuni de meniu ntre
cele existente: Insert (o opiune definit de utilizator) i Insert Bar... (o opiune preluat
din meniul sistemului Visual FoxPro) i pentru tergerea unei opiuni Delete.
9 Butonul Preview. Prin acionarea lui putei s previzualizai
meniul pe care l construii: meniul sistemului este nlocuit
de acesta i se deschide o caset de dialog Preview n
care sunt prezentate informaii despre opiunea selectat
din meniu (numele fiierul, legenda opiunii i comanda asociat).
Dup ce ai terminat de construit meniul, l previzualizai
folosind butonul Preview.
Generai meniul executabil cu opiunea Generate...Menu.
Lansai n execuie meniul cu comanda: do menu_test. Testai meniul.
Structura meniului este memorat ntr-un fiier de tip tabel, care are cu numele meniului
(menu_test) i extensia .mnx. Deschidei acest fiier cu comanda use menu_test.mnx.
Afiai coninutul su cu comanda browse. Identificai n acest tabel semnificaia fiecrei
coloane. Identificai ce element din structura meniului este nregistrat n fiecare rnd al
tabelului.
Testai modul n care putei folosi procedura global i procedurile asociate evenimentelor Setup i Cleanup
Vei aduga sistemului de meniuri o procedur global:
Deschidei meniul anterior i-l salvai sub numele menu_1. n noul meniu vei face
urmtoarele modificri:
In caseta de dialog General Option scriei n zona de editare a procedurii globale
instruciunea:
? "Test procedura globala"
Activai comutatorul Setup i n fereastra de editare a procedurii scriei:
? "Test eveniment Setup"
n fereastra Form Designer n meniul principal adugai titlul Scrie nainte de titlul de
meniu Terminare. Acestui titlu de meniu i atribuii un rezultat de tip Command, dar nu
i atribuii nici o comand. n meniul Utilitati adugai la sfrit dou opiuni: Scrie 1 i
Scrie 2. Ambelor le atribuii un rezultat de tip comand. Opiunii Scrie 1 nu i atribuii
nici o comand, iar opiunii Scrie 2 i atribuii comanda:
? "Test optiune Scrie 2"
n procedura asociat titlului Terminare din meniul principal, tergei instruciunea clear.
Salvai modificrile fcute i generai meniul executabil. Lansai n execuie meniul.
Testai meniul Scrie i opiunile Scrie 1 i Scrie 2. Ce concluzii tragei?
Deschidei meniul menu_1 i l salvai sub numele menu_2. n noul meniu deschidei
caseta de dialog General Option, activai comutatorul Cleanup i n fereastra de
editare a procedurii scriei:
clear
? "Test eveniment Cleanup"
Salvai modificrile fcute i generai meniul executabil. Lansai n execuie meniul.
Testai meniul Scrie i opiunile Scrie 1 i Scrie 2. Ce concluzii tragei? Cnd se
execut procedura asociat evenimentului Cleanup.
345
346 Informatic
va crea o list dinamic cu numele elevilor corigeni 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 opiunile Lista 1, Lista 2, Lista 3,
Lista 4, Lista 5 i Lista 6. Aceste opiuni vor fi grupate logic n dou grupuri de
opiuni (fiecare grup va conine 3 opiuni) separate printr-o bar separatoare.
Toate aceste opiuni de meniu vor afia rapoarte, n care nregistrrile vor fi grupate
dup criteriul clasei. Lista 1 (Lista 4) i Lista 2 (Lista 5) vor afia rapoarte cu numele
i prenumele elevului, notele i media pe primul semestru, respectiv al doilea
semestru, iar Lista 3 ((Lista 6)) va afia un raport cu numele i prenumele elevului,
mediile semestriale i media general. n primul grup de rapoarte, n cadrul grupului
clasa, nregistrrile vor fi afiate n ordine alfabetic, iar al doilea grup de rapoarte n
ordinea descresctoare a mediilor. Utilizatorul programului va cunoate semnificaia
fiecrei opiuni din mesajul afiat n bara de stare.
e. Stabilii scurtturi i mesaje pentru toate opiunile de meniu.
f. nainte de a se activa meniul, afiai pe ecran o caset de dialog pentru introducerea
parolei. Stabilii ce parol dorii. Se vor accepta
numai cinci ncercri 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 aplicaie cuprinde mai multe module: pentru introducerea datelor, pentru prelucrarea
lor sau pentru afiarea unor rapoarte pe ecran sau la imprimant. Toate aceste module
trebuie asamblate ntr-o aplicaie, n care un modul de program trebuie s le administreze
i s le coordoneze.
Programul monitor al unei aplicaii are rolul de a coordona executarea
modulelor aplicaiei i a asigura colaborarea ntre ele.
Sarcinile unui program monitor sunt:
a. S configureze mediul de lucru. Sistemul de gestiune a bazelor de date poate fi
configurat prin intermediul unor parametri a cror valoare se stabilete cu comanda set. Aceti parametri au valori implicite, iar n unele aplicaii aceste valori
implicite nu sunt tocmai potrivite. De exemplu, parametrul talk trebui s aib
valoarea off, iar parametrului date, care stabilete formatul datelor calendaristice, i
se poate atribui un anumit format (set date to british). Se mai poate stabili directorul curent din care se vor prelua baza de date i alte fiiere necesare aplicaiei cu
parametrul default (set default to <cale_director>). Ali parametri pentru care se
stabilesc de obicei valorile sunt century, confirm, console, deleted i safety.
b. S personalizeze fereastra de aplicaie. Aplicaia ruleaz n fereastra sistemului
Visual FoxPro, care va deveni fereastra aplicaiei. De aceea trebuie s schimbai
anumite proprieti ale acestei ferestre. Obiectul fereastra aplicaiei Visual FoxPro
se identific prin variabila de memorie sistem _screen. De exemplu, dac vrei s
schimbai legenda ferestrei de aplicaie vei folosi comanda de atribuire:
347
_screen.caption=<numele_ferestrei_de_aplicatie>
nainte ns de a modifica proprietile ferestrei, salvai valorile pe care le modificai
n variabile de memorie (de exemplu: nume_f=_screen.caption) .
c. S activeze meniul principal al aplicaiei. Din meniul principal se vor lansa n
execuie modulele de program pentru prelucrarea datelor, formularele pentru
editarea datelor, comenzile pentru afiarea rapoartele etc.
d. S activeze procesorul de evenimente. Deoarece programul generat de constructorul de meniuri nu conine propriul procesor de evenimente, este necesar
ca, dup ce a fost lansat n execuie programul care creeaz meniul, s se
activeze procesorul de evenimente care la rndul su 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 execuiei aplicaiei.
Exemplu
Pentru salvarea i restaurarea parametrilor care caracterizeaz starea sistemului, putei
folosi dou tabele (cte 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 aplicaie. ncrcai iniial tabelul cu numele parameterilor pe care
dorii s-i modificai (cmpul nume) i cu valorile pe care dorii s le aib n aplicaie.
Pentru salvarea configurrii sistemului, la nceputul sesiunii de lucru vei 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 strii sitemului, la sfritul sesiunii de lucru vei folosi procedura ieire:
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
349
9 Componente care nu se modific n timpul execuiei: programele, meniurile, rapoartele, formularele etc.
9 Componente care se modific n timpul execuiei: bazele de date, tabelele etc.
Aplicaia (application) este un fiier care conine componetele unui proiect
care nu se modific n timpul execuiei.
Fiierul aplicaiei are extensia .app.
Pentru a crea o aplicaie trebuie parcurse urmtoarele etape:
a. Se creeaz proiectul aplicaiei. Nu se poate crea o aplicaie dac nu ai
inclus componentele ei ntr-un proiect.
b. Se stabilete programul principal - Set Main. Orice aplicaie trebuie s aib
un program principal. Programul principal este programul care se va executa
atunci cnd se lanseaz n execuie aplicaia i din care vor fi apelate celelalte
componente ale aplicaiei: modulele de program, meniurile, formularele etc.
c. Se genereaz aplicaia.
Aplicaia se lanseaz n execuie cu comanda:
do <nume_aplicaie>.app
Aplicaia este dependent de mediul Visual FoxPro. Pentru a crea un program independent
de acest mediu, acesta trebuie s fie un program executabil (fiier cu extensia .exe) care se
obine la fel ca o aplicaie, cu deosebirea c n caseta Build Options se activeaz butonul
Build Executable.
Aadar, pentru a putea rula aplicaia pe care ai construit-o pe un calculator pe care nu este
instalat Visual FoxPro avei dou posibiliti:
9 Creai fiierul aplicaiei (.app) i l distribuii utilizatorului mpreun cu versiunea
pentru rulare a sistemului Visual FoxPro care conine numai acele elemente care
asigur execuia programelor, nu i modificarea lor.
9 Creai programul executabil al aplicaiei. Acesta nu are nevoie de varianta pentru
rulare, ci i sunt necesare numai bibliotecile de rulare (fiiere care conin proceduri pentru
rularea programelor).
Aplicaia i programul executabil trebuie transportate la destinaie (calculatorul utilizatorului)
pe un suport de memorare (discuri flexibile sau CD). Pe acest suport va fi construit kitul de
instalare care va conine o imagine a structurii de directoare necesare executrii aplicaiei,
directoarele n care se vor gsi fiierul executabil i alte fiiere necesare aplicaiei.
Pentru realizarea kitului de instalare folosii procedura asistent a kitului de instalare
Setup Wizard. Procedura creeaz pe hard discul calculatorului dumneavoastr, n directorul precizat, o imagine a chitului de instalare. Dup ce ai creat aceast imagine, o
vei copia pe suportul de memorare stabilit pentru destinaie n timpul procesului de
generare a kitului (dac ai ales discul flexibil, vei copia coninutul fiecrui director
rezultat pe o dischet). La destinaie vei instala aplicaia lansnd n execuie programul
setup.exe care a fost creat, n cazul suportului de tip disc flexibil, pe primul disc.
350 Informatic
Creai un proiect
Proiectul va cuprinde meniul definit anterior menu_test, formularele care sunt activate de
opiunile acestui meniu, i cele dou fiiere cu pictograme folosite n formularul care
simuleaz ceasul. La aceste componente trebuie s adugai programul monitor.
Creai n rdcina discului C directorul Aplicaie. n acest director vei crea proiectul.
Lansai n execuie generatorul de proiecte fie cu opiunea de meniu New...File (din
caseta de dialog New alegei butonul radio Project i executai apoi clic pe butonul New
File, dup care n caseta de dialog Create alegei directoul Aplicatie i atribuii
proiectului numele Proiect), fie cu comanda:
create project \aplicatie\proiect
Se deschide fereastra Project Butonul de restrngere/expandare a ferestrei. n urma
Manager care este mprit n
operaiei de restrngere fereastra va fi redus la zona
mai multe seciuni, fiecare etichetelor seciunilor i va putea fi ancorat la fel ca orice
seciune reprezentnd o cate- bar de instrumente. Executnd apoi clic pe o etichet vei
gorie de componente: All - toaexpanda numai seciunea corespunztoare etichetei.
te componentele, Date - componentele care conin date
(Database, Free Table, Queries), Documents - componentele utile pentru introducerea i
afiarea datelor (formularele
Forms i rapoartele Reports),
Class Libraries - bibliotecile de
clase, Code - componente care
conin module de program
(Pro-grams i Applications) i
Other - alte componente (meniurile Menus, fiierele de texte
Text Files i alte fiiere Other
Files). n zona de lucru a ferestrei vor fi afiate componentele
specifice seciunii.
Cu ajutorul Gestionarului de proiecte putei executa urmtoarele operaii:
9 Crearea unei componente noi (butonul New...). Se va deschide fereastra constructorului corespunztor componentei selectate: Menu Designer - pentru meniuri, Query
Designer - pentru interogri, Report Designer - pentru rapoarte, Form Designer pentru formulare ... i fereastra de editare texte pentru Programs i Files.
9 Adugarea unei componente la proiect (butonul Add...). Dac obiectul a fost
creat n afara proiectului, dup ce acionai acest buton putei s alegei dintr-o list
componentele pe care dorii s le adugai la proiect.
9 Editarea unei componente a proiectului (butonul Modify). Selectai componenta
din seciunea corespunztoare a fereastrei i acionai butonul. Se va deschide
fereastra constructoului cu care ai creat componenta i putei s facei modificrile.
351
352 Informatic
Pentru a vizualiza coninutul proiectului, executai clic pe butoanele + din faa numelui
obiectului:
Acionai butonul Build.... n caseta de dialog Build
Options activai butonul Rebuild Project i apoi
butonul OK.
Creai o aplicaie
Aplicaia o vei construi pornind de la proiectul construit anterior.
353
Deschidei proiectul fie cu opiunea de meniu Open...File (din lista ascuns Files of
type alegei Project, selectai fiierul Proiect din directoul Aplicaie i executai apoi clic
pe butonul Open), fie cu comanda:
modify project \aplicatie\proiect
n seciunea Code a ferestrei Project Manager selectai programul monitor care va fi
programul principal. Selectai apoi opiunea Set MainProject. Numele programului
principal va fi scris cu stilul bold.
Pentru a genera aplicaia, acionai butonul Build... din fereastra Project Manager.
Se deschide caseta de dialog Build Options n care din grupul de butoane radio
Action activai butonul Build Application. Acionai apoi comutatorul OK i n
fereastra Save As scriei numele aplicaiei: test.
Lansai n execuie aplicaia cu comanda:
do \aplicatie\test.app. Testai aplicaia.
Creai kitul pentru distribuirea aplicaiei
354 Informatic
5. Precizai directorul implicit n care se va instala aplicaia la destinaie - Specify
Default Destination. Aceast informaie o comunicai n caseta de text Default
Directory. Este posibil ca acest director s fie schimbat la instalarea kitului prin
precizarea unui alt director de ctre persoana care instaleaz aplicaia. Scriei n
caseta de text c:\produs. Mai putei s scriei n caseta de text Program Group
numele grupului care va fi adugat la meniul de start (implicit este Visual FoxPro
Application). Din grupul de butoane radio User can modify putei activa butonul
Directory and program group (utilizatorul poate modifica la instalare i numele
directorului n care va fi instalat aplicaia i numele grupului de programe) sau
butonul Directory only (utilizatorul poate modifica la instalare numai numele
directorului).
6. Precizai caracteristicile fiierelor care compun aplicaia - Change File Setings.
Se deschide tabelul n care sunt memorate datele referitoare la fiierele incluse n kitul
de instalare. Fiecare rnd reprezint un fiier, iar fiecare coloan o caracteristic a
fiie-rului. Titlurile coloanelor sunt: File - numele fiierului, Target Dir - directorul n
care va fi copiat fiierul la destinaie (din lista ascuns putei alege una dintre opiunile:
AppDir - directorul aplicaiei, WinDir - directorul sistemului de operarea Windows,
WinSysDir - directorul System al sistemului de operarea Windows), PM Item activeaz programul Program Manager cu ajutorul cruia putei stabili proprieti
suplimentare ale fiierului (de exemplu pictograma), ActiveX - activeaz instalarea
controlului de tip ActiveX la destinaie.
355
356 Informatic
screen.BackColor= This.culoare_f
set sysmenu to default
endproc
enddefine
ncercai:
Adevrat/Fals:
1. Se poate preciza cazul n care o opiune de meniu nu este disponibil.
2. n procedura Setup a meniului se dezactiveaz procesorul de evenimente.
3. ntr-o aplicaie Visual FoxPro putei crea un meniu de comenzi rapide.
4. Procedura Cleanup se execut naintea procedurii Setup.
5. Programul monitor se folosete pentru a administra proiectul.
6. Proiectul este un program care, dac este lansat n execuie, monitorizeaz aplicaia.
7. Aplicaia este independent de mediul Visual FoxPro.
Completai:
1. Mesajul informativ Message se afieaz .............................................................
2. Unei opiuni de meniu putei s-i asociai un submeniu, o comand sau..,....................
3. Fiierul n care se memoreaz tabelul cu structura meniului are extensia ..........
4. Condiia prin care testai disponibilitatea unei opiuni de meniu este precizat prin .............
5. Kitul de instalare conine programul ...................... care se folosete pentru instalarea
aplicaiei pe alt calculator.
Alegei rspunsurile corecte:
1. Pentru revenirea din meniul aplicaiei n meniul sistemului, trebuie s atribuii cu comanda
set parametrului sysmenu valoarea :
a) off
b) automatic
c) to default
2. Extensia fiierului care conine meniul executabil este:
a) mnx
b) mnt
c) mpr
d) mpx
3. Extensia fiierului care conine aplicaia este:
a) prj
b) api
c) exe
d) app
spunsuri:
R
Adevrat/Fals: 1-A; 2-F; 3-A; 4-F; 5-F; 6-F; 7-F.
Completai: 1-bara de stare; 2-o procedur; 3-.mnx; 4-Skip For ; 5-setup.exe
Alegei rspunsurile corecte: 1-c; 2- c; 3- d.