Sunteți pe pagina 1din 356

Capitolul

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.

Dup ce vei parcurge acest


capitol trebuie s tii:
1.
2.
3.
4.

5.

Ce este o baz de date i cum


sunt organizate datele ntr-o
baz de date.
Ce operaii putei executa
pentru a obine informaii n
urma prelucrrii datelor dintr-o
baz de date.

Ai mai nvat c un calculator nu tie s prelucreze


dect iruri de cifre binare care pot fi modelate fizic prin
impulsuri de curent, cu dou niveluri de tensiune ce co6.
respund celor dou cifre binare 0 i 1. Prin urmare, datele vor fi codificri binare ale informaiei existente n exteriorul calculatorului. Fiecrui tip de informaie i corespunde un anumit mod de stocare n mediul de memorare, adic un anumit tip de dat. Tipul datei determin att operaiile care se pot executa cu
acele date, ct i modul n care sunt reprezentate pe mediul de memorare. Astfel, fiecare
caracter dintr-un ir de caractere va fi reprezentat sub forma unui grup de 8 cifre binare
corespunztoare codului ASCII asociat caracterului, iar asupra datelor de acest tip se pot
aplica numai operatorul de concatenare i operatorii relaionali. Aadar, datele (data) sunt
iruri de bii care sunt prelucrate de calculator. Data este o resurs la dispoziia
programatorului i orice limbaj de programare permite folosirea mai multor tipuri de date.
Indiferent de tipul de date ales, reprezentarea datei n memoria calculatorului (fie intern,
fie extern) se face printr-un ir de bii. Pentru a realiza aceast reprezentare sunt implementai algoritmi de codificare care asigur corespondena dintre tipul de dat i irul
de bii att la scrierea datelor, ct i la citirea lor. Tipul de dat ales de ctre programator
influeneaz calitatea programului deoarece el determin dimensiunea zonei de memorie

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.

Identificarea i clasificarea unor tipuri de structuri de date

Aadar, scopul programelor de calculator este de a prelucra datele pentru a furniza


informaii. Aceast informaie poate fi pstrat pe diferite medii de memorare, n diferite
formate, sub form de date. ntre datele prelucrate de un program exist diferite relaii.
Modul n care vor fi aranjate aceste date n mediul de memorare depinde de legtura
dintre ele.

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

Obiectul: realizarea bazei de date a unei companii.


Analiza sistemului iniial, format din mai multe fiiere de date

Resurse
umane

Salarizare

Relaii cu
clienii

Producie

Marketing

Produse
Angajai

Aprovizionare

Stocuri

Salarii
Vnzri

Clieni

Catalog
produse

Furnizori

Comenzi

Fiecare departament al companiei i-a creat i ntreinut propriul fiier de date:


9 Departamentul Resurse umane are fiierul Angajai n care sunt pstrate date
despre angajaii companiei: numele, codul numeric personal, adresa, numrul de
telefon, data naterii, data angajrii, studii, experien, funcia i departamentul n care
lucreaz, istoricul posturilor ocupate, data fiecrei avansri etc.
9 Departamentul Salarizare are fiierul Salarii n care sunt pstrate date despre
salariile angajailor companiei: numele i prenumele salariatului, codul numeric
personal, adresa, funcia deinut, treapta de salarizare, salariul tarifar, numrul de
ore lucrate, reineri lunare, salariul lunar etc.
9 Departamentul Relaii cu clienii are fiierele Clieni n care sunt pstrate date despre
clienii companiei (numele companiei client, adresa, numele persoanei de contact,
telefonul etc.) i Comenzi n care sunt pstrate informaii despre comenzile clienilor
(numrul comenzii, clientul care a emis comanda, coninutul comenzii, data comenzii etc.).
9 Departamentul Aprovizionare are fiierele Stocuri n care sunt pstrate date despre
stocul de materiale i materii prime necesare produciei (denumirea materialului,
unitatea de msur, cantitatea etc.) i Furnizori n care sunt pstrate date despre
furnizorii de materii prime i materiale ale companiei (numele companiei furnizor,
adresa, numele persoanei de contact, telefonul etc.).
9 Departamentul Marketing are fiierele Vnzri n care sunt pstrate date despre vnzrile de produse ale companiei (denumirea produsului, unitatea de msur, cantitatea, data
vnzrii, persoana care a intermediat vnzarea, date despre clientul care a cumprat
produsul etc.) i Catalog_produse care conine un catalog cu oferta de produse a
companiei (denumirea produsului, descrierea produsului, unitatea de msur, preul etc.).
9 Departamentul Producie are fiierele Produse n care sunt pstrate date despre
produsele realizate: denumirea produsului, unitatea de msur, cantitatea, data la
care a fost realizat produsul etc.

Identificarea i clasificarea unor tipuri de structuri de date

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.

est pentru evaluare:

Identificai n colecia de fiiere de date a companiei datele redundante. Identificai n


aceeai colecie datele care sunt necesare mai multor departamente. Presupunnd c
datele companiei se organizeaz ntr-o colecie unic, dai exemple de date la care
trebuie controlat accesul angajailor companiei.

est pentru evaluare:

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.

1.1. Definirea bazei de date


Din punct de vedere al serviciilor pe care le ofer, baza de date este o colecie de date
care poate descrie ntreaga activitate a unei organizaii i care furnizeaz acces la diferite
informaii, prezentate n diferite formate.
Din punct de vedere al organizrii datelor sub forma unei structuri de date pe mediul de
memorare, ea este forma optim de organizare a datelor. Se poate spune c:

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.

Identificarea i clasificarea unor tipuri de structuri de date

9 Creterea cantitii de informaii disponibile unui utilizator. Deoarece datele


produse de un compartiment al organizaiei pot fi folosite de toi membrii organizaiei
i nu numai de membrii compartimentului respectiv, crete cantitatea de informaii la
care au acces membrii organizaiei, chiar dac se vor impune unele restricii de acces
pentru unele grupuri de membri. Gruparea datelor ntr-o colecie unic de date face
posibil ca utilizatorul s poat obine toate datele legate logic de o dat elementar
de care el are nevoie pentru a-i desfura activitatea n cadrul companiei.
9 Micorarea redundanei datelor. Membrii organizaiei vor avea acces la aceeai colecie de date n loc s-i creeze fiecare propria colecie de date, care nseamn de
fapt existena acelorai date n mai multe colecii (multiplicarea unor seturi de date).
Rmn multiplicate numai acele date care trebuie s asigure coerena bazei de date.
Prin eliminarea datelor multiplicate se micoreaz i spaiul de memorie extern alocat pentru colecia de date i timpul de actualizare a coleciei de date deoarece o dat
va fi actualizat o singur dat, n cadrul coleciei, i nu de mai multe ori, n fiecare
fiier de date n care apare.
9 Consistena datelor. Actualizarea datelor din baza de date este perceput de fiecare
utilizator al bazei de date, nu numai de utilizatorii din compartimentul care gestioneaz
acele date. Deoarece nu mai exist mai multe copii ale acelorai date, se elimin
situaiile n care pot s apar valori diferite pentru aceeai dat.
9 Integritatea datelor. Un alt efect al eliminrii redundanei datelor este integritatea datelor, deoarece datele vor fi actualizate ntr-un singur loc (n baza de date) i nu n fiecare
colecie de date (n fiierele de date). n plus, pot fi adugate diferite proceduri pentru
validarea datelor introduse sau actualizate. Astfel, nu mai exist riscul s apar neconcordane ntre datele care corespund acelorai informaii, dar care aparin la colecii diferite de date, sau riscul ca datele s fie incorecte (s nu aparin domeniului de definiie).
9 Securitatea datelor. Se poate asigura mult mai uor pentru o singur colecie de date
(baza de date) dect pentru mai multe colecii de date (fiierele de date). Astfel, numai
utilizatorii autorizai vor avea acces la un anumit set de date din colecia de date.
9 Controlul centralizat al datelor. Prin stabilirea unui administrator al bazei de date
se poate asigura controlul tuturor datelor din colecia de date (baza de date), dect n
cazul coleciilor de date independente (fiierele de date) unde fiecare utilizator i
exercit controlul la nivelul propriei colecii de date.
9 Transparena. Utilizatorul poate obine informaii din baza de date fr s cunoasc
toat organizarea ei complex.
9 Dezvoltarea standardelor. Se pot dezvolta standarde referitoare la bazele de date att
la nivelul organizrii logice a datelor, ct i la nivelul limbajelor pentru manipularea i
interogarea datelor, standarde care s permit transferul datelor dintr-o baz de date n
alta. Cererea de date se poate face prin intermediul unui limbaj simplu, prin precizarea
criteriului de selectare a datelor i a modului de prezentare a informaiilor.
9 Independena datelor. Se asigur dou tipuri de independen a datelor: independena
fizic i independena logic. Independena fizic nseamn independena datelor fa
de programele de aplicaie, adic orice modificare a structurii datelor nu afecteaz programul de aplicaie i reciproc, orice modificare a programului de aplicaie nu afecteaz
structura de date. Independena logic nseamn independena fiecrei scheme
particulare a unui utilizator fa de schema general, adic pot fi definite noi cmpuri i
pot fi adugate noi nregistrri n baza de date fr s fie afectai utilizatorii care nu au

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.

1.2. Stratificarea bazei de date


Din punct de vedere conceptual, sistemul care folosete baza de date este organizat pe
mai multe straturi:
stratul utilizator al bazei de date,
stratul software de aplicaii,
stratul sistem de gestiune a bazelor de date,
stratul baza de date propriu-zis.

Utilizatorul bazei de date


Este o persoan care este membru al organizaiei i are dreptul s foloseasc baza de
date pentru a obine informaii. El poate fi i o persoan exterioar organizaiei, creia
organizaia i-a permis accesul la anumite informaii. De obicei nu este specialist n informatic i nu cunoate tehnicile folosite n exploatarea bazelor de date. Informaiile i sunt
furnizate n termenii aplicaiei i nu n termenii tehnici folosii n bazele de date.
Software-ul de aplicaie
Prezint imaginea datelor ntr-o form accesibil utilizatorului i permite personalizarea
sistemului de gestiune a bazelor de date folosit. Rolul su este de a prezenta informaia
n mod interactiv, n termeni specifici aplicaiei, prin intermediul unei interfee. Nu are
rolul de a gestiona datele. Aplicaia poate comunica cu utilizatorul fie printr-un sistem de
ntrebri i rspunsuri, fie prin intermediul unor formulare completate de ctre utilizator.
Software-ul de aplicaie poate fi conceput fie de programatori, n cazul bazelor de date
mari, distribuite pe mai multe calculatoare ale organizaiei, fie chiar de unii utilizatori ai
bazei de date, n cazul bazelor de date mici, organizate pe microcalculatoare.

Baz de date
Sistem de gestiune
a bazelor de date
Software de aplicaii
Utilizator

Identificarea i clasificarea unor tipuri de structuri de date

11

Sistemul de gestiune a bazelor de date


Pentru gestionarea datelor din baza de date trebuie s folosii un Sistem de Gestiune a
Bazelor de Date (SGBD).

Sistemul de gestiune a bazelor de date (database management) este un


software specializat pentru crearea, ntreinerea i consultarea bazelor de date.
Este un instrument software specializat n gestionarea datelor din baza de date:
crearea structurii de date, manipularea datelor n cadrul structurii i regsirea datelor n
vederea extragerii informaiilor. El asigur interfaa cu sistemul de operare n scopul simplificrii procesului de acces la datele fizice de pe suportul de memorare. n general,
sistemele de gestiune a bazelor de date au implementate limbaje gazd care permit att
descrierea algoritmului rezolvrii problemei folosind structurile de control din limbajele de
programare clasice, ct i comenzi specializate n manipularea datelor din baza de date,
specifice numai sistemului de gestiune a bazelor de date.
Principalele faciliti oferite de un sistem de gestiune a bazelor de date pentru crearea i
exploatarea bazelor de date sunt:
9 Facilitatea de descriere a datelor - asigurat de limbajul de descriere a datelor
(Data Description Language). Prin aceast facilitate se realizeaz legtura ntre sistemul
de gestiune a bazelor de date i baza de date. Acest limbaj permite descrierea modelului bazei de date (schema bazei de date) i a restriciilor aplicate coleciei de date.
9 Facilitatea de manipulare a datelor - asigurat de limbajul de manipulare a datelor
(Data Manipulation Language). Prin aceast facilitate se realizeaz legtura ntre sistemul de gestiune a bazelor de date i utilizator. Acest limbaj este o colecie de comenzi
care permit executarea operaiilor obinuite de exploatare i ntreinere a bazei de date:
cererile de acces la date i actualizarea lor (adugare, tergere, modificare).
Prin separarea programului de aplicaie de sistemul de gestiune a bazelor de date se
obin mai multe avantaje:
9 Utilizatorul poate lucra cu baza de date prin intermediul interfeei create de programul
de aplicaie care presupune cunotine numai despre aplicaie i nu i despre sistemul
de gestiune a bazelor de date, care prezentnd datele n termeni specifici modului n
care a fost conceput baza de date, oblig utilizatorul s aib cunotine tehnice,
legate de acest gen de software.
9 Deoarece se folosesc dou tipuri de software - unul pentru interfa i unul pentru
gestionarea datelor - se creeaz independena datelor, adic modificarea structurii
datelor nu implic modificarea programelor de aplicaii.
9 Se asigur controlul accesului la baza de date. Cel care va stabili setul de date la care
are acces un utilizator este sistemul de gestiune a bazelor de date. Programul de
aplicaie nu are dect rolul de a-i comunica parola introdus de utilizator care i d acestuia anumite drepturi de acces la date. Sistemul de gestiune a bazelor de date va folosi
n interior schema general pentru a manipula i a ntreine datele din baza de date i va
folosi n exterior schema parial atribuit unui utilizator conform parolei, pentru a-l
mpiedica pe acesta s obin informaii din seturile de date la care nu are acces.

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

Identificarea i clasificarea unor tipuri de structuri de date

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.

est pentru evaluare:

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.

1.3. Clasificarea bazelor de date


Scopul bazelor de date este de a integra date individuale, pe care le transform din fapte
izolate n informaii utile. Dac fiierele de date pot fi organizate n mai multe moduri
astfel nct s permit accesul secvenial sau direct la informaii, n funcie de necesitile
utilizatorilor, i bazele de date pot fi organizate n mai multe moduri, astfel nct s i fie
ct mai utile utilizatorului. Aadar, baza de date fiind o colecie de entiti (cmpuri i
nregistrri), organizarea acestor entiti se poate face n mai multe moduri astfel nct
structura de date s rspund ct mai bine necesitilor utilizatorului. Cele mai rspndite
modele de organizare a bazelor de date sunt urmtoarele:
ierarhice,
reea,
relaionale.

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

ntr-un astfel de tip de organizare apar urmtoarele probleme:


9 Dac se terge un nod printe, se terg toate nodurile copil subordonate.
9 Un nod copil poate fi adugat numai dac au fost adugate mai nti nodurile printe.
9 ntre nodurile copii nu pot fi stabilite relaii.
Baze de date reea (network database). i n acest caz exist o aranjare ierarhizat a
nodurilor, cu deosebirea c un nod copil poate s aib mai multe noduri prini. ntre
nodurile printe i nodurile copil se adaug conexiuni adiionale numite pointere. Aceasta
nseamn c unui nod i se poate aduga o cale nou i c pot fi trasate n jos ramuri noi.
n aceast organizare, fiecare entitate poate avea un numr nelimitat de conexiuni,
disprnd noiunea de entitate ierarhic superioar.
produse

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-

Identificarea i clasificarea unor tipuri de structuri de date

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

identif. elev nume prenume

... 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.

2. Bazele de date relaionale


Baza de date relaional este format dintr-unul sau mai multe tabele
bidimensionale ntre care se pot stabili legturi.
Tabelul permite gruparea unor date nrudite i poate fi privit ca o colecie de cmpuri.
Pentru fiecare cmp sunt descrise datele care vor fi memorate n el. Descrierea se face
prin tipul datelor, dimensiunea lor i alte proprieti. Ele definesc implicit domeniul de
definiie al datelor memorate n cmp. Dac domeniul datelor este inclus n domeniul
implicit de definiie, se pot defini condiii de validare a datelor care s controleze
corectitudinea datelor introduse sau modificate. De exemplu, datele dintr-un cmp sunt
numere ntregi cuprinse ntre 1.000 i 30.000. Se va alege tipul ntreg, ca domeniu implicit
al datelor, dar se vor preciza condiii de validare suplimentare care s oblige utilizatorul
s introduc n acest cmp numai date ntregi pozitive din domeniul 1.000 30.000.
Antetul tabelului (capul de tabel) poate fi privit ca o descriere a structurii tabelului:
ansamblul de cmpuri i descrierea lor. n teoria bazelor de date relaionale tabelele se
mai numesc i relaii, fiecare coloan din tabel care corespunde unui cmp se mai
numete i atributul relaiei, iar fiecare rnd din tabel care conine cte o valoare pentru
fiecare cmp se mai numete i tuplu. Tuplul corespunde nregistrrii din fiierul de
date. ntr-un tabel al unei baze de date relaionale nu pot exista nregistrri identice.
Tabelele bazei de date sunt organizate apoi ntr-o structur arborescent determinat de
relaia dintre tabele.
Schema general a unei baze de date relaionale este format din ansamblul
tabelelor i al legturilor dintre ele.
Putem stabili urmtoarea analogie ntre un fiier de date i o baz de date:
Fiierul de date
Colecia de date = fiier de date
Fiier de date (tabel)
nregistrare
Cmp

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.

Identificarea i clasificarea unor tipuri de structuri 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

Definirea unei relaii ntre cele dou


tabele are ca efect stabilirea unor
legturi ntre nregistrrile celor dou
tabele.

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.

Identificarea i clasificarea unor tipuri de structuri de date

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.

Condiia de integritate referenial impune ca mulimea valorilor unei chei


secundare s fie inclus n mulimea valorilor cheii primare din care s-a propagat.
Integritatea referenial trebuie s fie satisfcut permanent n baza de date.
Operaiile de adugare, tergere i modificare pot afecta integritatea referenial:
n tabelul condus:
9 Operaia de adugare a unei nregistrri trebuie s se fac numai dac valorile din
cmpurile secundare se gsesc n mulimea valorilor cheilor primare din care s-au
propagat.
9 Operaia de tergere a unei nregistrri se poate face fr s fie afectat integritatea
referenial.
9 Operaia de modificare a valorii unui cmp dintr-o nregistrare trebuie s aib n
vedere faptul c dac acel cmp este un cmp secundar, valoarea sa trebuie s se
gseasc n mulimea valorilor cheii primare din care s-a propagat.
n tabelul conductor:
9 Operaia de adugare a unei nregistrri se poate face fr s fie afectat integritatea
referenial.
9 Operaia de tergere a unei nregistrri poate s afecteze relaiile dintre tabele numai
n cazul n care exist chei secundare care au aceeai valoare cu a cheii primare din
nregistrarea tears. n acest caz se pot folosi dou metode: tergerea
restricionat (nu se accept tergerea nregistrrii dac exist cel puin o cheie
secundar ntr-unul din tabelele bazei de date, propagat din cheia primar care are
aceeai valoare cu cheia primar din nregistrarea pe care vrei s o tergei) sau
tergerea n cascad (tergerea nregistrrii va avea ca efect tergerea din toate
tabelele a nregistrrilor care conin chei secundare propagate din cheia primar i
care au aceeai valoare cu cheia primar din nregistrarea tears).
9 Operaia de modificare a unei nregistrri poate s afecteze relaiile dintre tabele
numai n cazul n care exist chei secundare care au aceeai valoare cu a cheii
primare care se modific. i n acest caz se pot folosi dou metode: modificarea
restricionat (nu se accept modificarea unui cmp dac el este cheie primar i
exist cel puin o cheie secundar ntr-unul din tabelele bazei de date propagat din
cheia primar care are aceeai valoare cu cheia primar pe care vrei s o modificai)
sau modificarea n cascad (modificarea cheii primare va avea ca efect modificarea
tuturor cheilor secundare propagate din aceasta, din toate tabelele, care au aceeai
valoare cu cheia primar care se modific).

20 Informatic

Obiectul: analiza integritii refereniale n cazul bazei de date a unei coli.


Analiza se va face pe baza de date relaional coala
n baza de date coala, legtura ntre tabelul Elevi i tabelul Note, respectiv un tabel
Medii, se face prin intermediul cmpului cod_elev, care este cheie primar n tabelul Elevi
i cheie secundar n tabelul Note, respectiv tabelul Medii. Aadar, cmpul cod_elev s-a
propagat n tabelul Note, respectiv n tabelul Medii, unde a devenit cheie secundar.
Scopul propagrii a fost de a asigura legtura cu aceste tabele.
S presupunem c n tabelul Elevi, care conine date generale despre elevi, se terge
nregistrarea corespunztoare unui elev deoarece acesta s-a transferat la o alt coal.
n tabelul Note se pstreaz toate notele elevilor, iar n tabelul Medii toate mediile
elevilor. S presupunem c trebuie extrase din baza de date una dintre urmtoarele
situaii: lista cu toi elevii care au cel puin o not de 10 la o anumit disciplin sau lista cu
toi elevii corijeni pe primul semestru la cel puin o disciplin. S mai presupunem c
elevul care s-a transferat se ncadreaz ntr-una dintre aceste situaii. Cutarea n baza
de date a elevilor care corespund acestor situaii se face astfel: se caut n tabelul Note
toate nregistrrile care pentru o anumit valoare a codului disciplinei au valoarea 10
pentru cmpul nota (de exemplu, cod_disciplina=02 and nota=10), respectiv se caut n
tabelul Medii toate nregistrrile care au valoarea cmpului media mai mic dect 5
(media<5). Pentru a se afia numele elevului, se folosete ca legtur cu tabelul Elevi
cmpul cheie cod_elev. n baza de date Elevi, nu mai exist o nregistrare care s aib
aceeai valoare a cheii primare cu cheile secundare din tabelele Note i Medii. nseamn
c nu a fost ndeplinit condiia de integritate referenial, deoarece o valoare a
cheii secundare nu se gsete n mulimea valorilor cheii primare. Efectul nerespectrii acestei condiii este c n tabelele Note i Medii exist nregistrri pentru care s-a
rupt legtura cu tabelul Elevi. Problema se complic i mai mult dac n coal se mut
un elev cruia i se atribuie acelai cod_elev cu al elevului care s-a transferat. n acest
mod, toate datele care se refer la elevul transferat (note, medii, absene) sunt atribuite
automat noului elev prin relaia care exist ntre tabele.
Pentru a se asigura integritatea referenial, normal ar fi ca atunci cnd elevul se
transfer, s se tearg nregistrarea corespunztoare elevului din tabelul Elevi, dar i
toate nregistrrile din celelalte tabele care au valoarea cheilor secundare cod_elev egal
cu valoarea cheii primare cod_elev corespunztoare elevului transferat din tabelul Elevi,
pentru a se asigura astfel condiia de integritate referenial. n acest exemplu, trebuie
folosit tergerea n cascad atunci cnd un elev este transferat. Prin aceast operaie
vor fi terse toate nregistrrile din tabelele bazei de date care sunt legate de elevul
transferat. La venirea unui elev nou, acestuia i se poate atribui codul matricol al elevului
transferat deoarece n tabele nu vor mai exista nregistrri referitoare la acesta (note, absene, medii).
n baza de date se gsesc dou tipuri de date:
9 coleciile de date organizate sub form de tabele care reprezint informaia util i

Identificarea i clasificarea unor tipuri de structuri de date

21

9 fiiere ajuttoare n care este descris structura tabelelor (fiierele de structur),


legturile dintre ele i alte informaii necesare regsirii datelor n tabele (cum sunt
fiierele index care permit regsirea datelor n baza de date n funcie de valoarea
unui cmp cheie i care asigur accesul direct la date) sau interpretrii lor (cum sunt
fiierele pentru rapoarte).
Modelul relaional are urmtoarele avantaje fa de celelalte modele de organizare:
9 Este un model uor de neles de ctre utilizator i uor de vizualizat.
9 Asigur independena structurii logice a datelor fa de modul de stocare fizic a lor.
9 Regulile i restriciile care asigur integritatea datelor i protejarea datelor i a structurii de date sunt uor de neles de ctre utilizator.
9 Spaiul de stocare a datelor este redus.
9 Redundana datelor este redus.

Obiectul: baza de date a unei companii.


Crearea bazei de date, pornind de la sistemul iniial format din mai multe fiiere:
Fiierele de date dezvoltate de fiecare compartiment al companiei se pot transforma n
tabelele unei baze de date relaionale:
9 Tabelul Angajai n care sunt pstrate date despre angajaii companiei: numele i
prenumele, codul angajatului, codul numeric personal, adresa, numrul de telefon,
data naterii, data angajrii, studii, experiena, funcia i departamentul n care
lucreaz, istoricul posturilor ocupate, data fiecrei avansri etc.
9 Tabelul Salarii n care sunt pstrate date despre salariile angajailor companiei:
numele i prenumele salariatului, codul angajatului, codul numeric personal, adresa,
funcia deinut, treapta de salarizare, salariul tarifar, numrul de ore lucrate, reineri
lunare, salariul lunar etc.
9 Tabelul Clieni n care sunt pstrate date despre clienii companiei: numele companiei
client, codul clientului, adresa, numele persoanei de contact, telefonul etc.
9 Tabelul Comenzi n care sunt pstrate informaii despre comenzile clienilor: numrul
comenzii, codul clientului care a emis comanda, coninutul comenzii, data comenzii etc.
9 Tabelul Catalog_materiale n care sunt pstrate date despre materialele folosite de
companie: codul materialului, denumirea materialului, unitatea de msur etc.
9 Tabelul Stocuri n care sunt pstrate date despre stocul de materiale i materii prime
necesare produciei: codul materialului, cantitatea, codul depozitului, denumirea
depozitului, angajatul care rspunde de depozit etc.
9 Tabelul Furnizori n care sunt pstrate date despre furnizorii de materii prime i
materiale ale companiei: numele companiei furnizor, codul furnizorului, adresa,
numele persoanei de contact, telefonul, codul materialului furnizat, preul etc.
9 Tabelul Vnzri n care sunt pstrate date despre vnzrile de produse ale
companiei: codul produsului, denumirea produsului, unitatea de msur, cantitatea,
data vnzrii, codul angajatului care a intermediat vnzarea, date despre clientul care
a cumprat produsul etc.

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

Baza de date a companiei

Stocuri

Identificarea i clasificarea unor tipuri de structuri de date

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.

est pentru evaluare:

Considernd c sgeile reprezint o relaie ntre un tabel conductor i un tabel condus,


precizai cheile primare i cheile secundare care pot fi folosite pentru a realiza legtura
ntre tabele (sensul sgeii reprezint legtura ntre tabelul conductor i tabelul condus).
Pe baza structurii de cmpuri precizat pentru fiecare tabel i pe baza legturilor stabilite
ntre tabele, identificai datele redundante din tabele (de exemplu denumirea produsului i
unitatea de msur care apar att n tabelul Vnzri,
ct i n tabelul Produse). Eliminai datele redundante.

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

Identificarea i clasificarea unor tipuri de structuri de date

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).

2.1. Sistemul de Gestiune a Bazelor de Date Relaionale (SGBDR)


Aadar, modelul relaional este caracterizat de:
9 Structuri. Sunt obiecte definite ce conin date la care utilizatorul are acces.
9 Operaii. Sunt aciuni definite care permit utilizatorului s manipuleze datele.
9 Reguli. Sunt legi prin care se stabilete cine i cum manipuleaz datele.
Datorit rspndirii din ce n ce mai mari a bazelor de date relaionale pe microcalculatoare, majoritatea firmelor productoare de seturi software au inclus n acestea i
sisteme de gestiune a bazelor de date:
Firma
Microsoft
Lotus
Corel

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

Identificarea i clasificarea unor tipuri de structuri de date

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

Identificarea i clasificarea unor tipuri de structuri de date

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.

2.2. Normalizarea unei bazei de date


Cea mai important problem care apare n proiectarea unei aplicaii de exploatare a
bazei de date nu o reprezint aplicaia n sine, ci modul n care este proiectat structura
bazei de date pentru c de ea depinde timpul de acces la date i ea este cea care
asigur integritatea referenial a datelor.
Ai aflat deja c, structura bazei de date este definit de:
9 structura de cmpuri a fiecrui tabel i de
9 legturile care se stabilesc ntre tabele.
Structura de date obinut nu trebuie s conin dependene nedorite ntre tabele,
deoarece acestea pot genera anomalii n exploatarea bazei de date.

Normalizarea este procesul de simplificare a unei structuri complexe de date prin


divizarea ei n mai multe entiti mai simple, interconectate ntre ele.
n cadrul acestui proces sunt identificate datele care trebuie separate n tabele mai mici i
modul n care va fi asigurat legtura ntre ele. Prin aceast operaie se simplific o
nregistrare de mari dimensiuni n mai multe tabele legate ntre ele. Nu trebuie alocate
cmpuri pentru datele derivate sau calculate (cum este de exemplu vrsta unei
persoane, dac exist deja un cmp n care este nregistrat data naterii).
Pe de alt parte, dac o baz de date relaional conine foarte multe tabele, exploatarea
sa va necesita un timp mai mare de prelucrare, deoarece o interogare a bazei de date va
avea ca efect parcurgerea mai multor tabele. De aceea, procesul de divizare a tabelului
iniial n mai multe tabele trebuie s se opreasc la un moment dat.
Ai vzut c elementul principal care definete o baz de date este schema tabelelor,
adic tabelele care fac parte din baza de date: numele tabelului i structura de cmpuri a
tabelului. Problema proiectrii unei baze de date const de fapt n modul n care grupm
datele sub form de cmpuri n tabele pentru a reui s modelm ct mai eficient colecia
de date pentru a putea rspunde ntrebrilor formulate n cadrul organizaiei. De aceea, n
procesul de proiectare a bazelor de date trebuie avut n vedere dependena datelor,
adic legturile care exist ntre cmpurile unui tabel sau ntre cmpurile unor tabele
diferite. Dependenele cele mai influente sunt dependena funcional i dependena
multivaloric.
Dependena funcional se refer la faptul c un cmp al unui tabel depinde de un alt
cmp al unui tabel, adic se spune c un cmp x depinde funcional de un cmp y dac
i numai dac pentru o valoare a cmpului x corespunde o singur valoare a cmpului y.
De exemplu, n tabela Clieni cmpul cod_client este dependent funcional de cmpul
adres_client deoarece fiecrui client al companiei i corespunde o singur adres. O
astfel de constrngere aplicat bazei de date face ns imposibil nregistrarea n baza

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.

Prima form normal


Aducerea unei baze de date la prima form normal nseamn eliminarea cmpurilor
compuse i a cmpurilor repetitive.
De exemplu, s considerm c tabelul Angajai_tot conine, pe lng informaiile generale
despre un angajat, i informaiile necesare pentru a urmri istoricul evoluiei unui angajat n
posturile companiei. nseamn c pentru fiecare angajat trebuie s existe urmtoarele date:
cod_angajat, nume_prenume, cod_numeric, adres, telefon, studii, data_naterii,
data_angajrii, funcie1, departament1, data_inial1, data_final1, motiv_schimbare1, funcie2, departament2, data_inial2, data_final2, motiv_schimbare2, funcie3, departament3,
data_inial3, data_final3, motiv_schimbare3 etc. Toate aceste date pot furniza informaii
particulare despre angajat (data naterii, codul numeric personal, adresa, telefonul) i modul

Identificarea i clasificarea unor tipuri de structuri de date

31

n care a evoluat profesional n cadrul companiei (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

Informaii despre fiecare


post ocupat de un salariat.
Ele se repet de mai multe
ori ntr-o nregistrare.

Informaii generale despre salariat. Fiecrui


salariat i corespunde o singur nregistrare n
tabel.

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.

Pentru a elimina cmpurile repetitive dintr-o nregistrare, se va reorganiza structura acestui


tabel ntr-un nou tabel Angajai astfel: cod_angajat, nume_prenume, cod_numeric, adres,
telefon, studii, data_naterii,
data_angajrii,
schimbare_
Angajai_tot
funcie, funcie, departament,
data_inial, data_final, motiv_schimbare. Folosind o
astfel de structur, cmpurile
funcie, departament, data
Angajai
_inial, data_final, motiv_
schimbare nu se vor mai
repeta n cadrul aceleiai
nregistrri. Vor aprea ns
Angajaii
Funcii
Departamente
mai multe nregistrri pentru

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.

A doua form normal


Aducerea unei baze de date la a
doua form normal nseamn c
divizarea tabelelor bazei de date
trebuie s continue astfel nct
fiecare tabel obinut s nu conin
dependene funcionale pariale,
adic toate cmpurile unui tabel
trebuie s depind numai de cheia
primar a tabelului, i nu de diverse
cmpuri care compun cheia primar,
adic fiecare nregistrare a unui
tabel trebuie s fie identificat unic
de cheia primar.

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

Identificarea i clasificarea unor tipuri de structuri de date

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

Tabelul Angajaii va fi descompus n dou tabele.


Tabelul Angajat va conine
informaii generale despre
angajai. Exist o singur
nregistrare pentru fiecare
angajat.
Cod_
angajat

Nume_
prenume

Cod_
numeric

Cod_
angajat

...

Cod_
funcie

Cod_
departament

...

Motiv_
schimbare

Tabelul Funcii_angajat va conine informaii


despre posturile ocupate de fiecare angajat.
Pentru fiecare angajat exist attea nregistrri.
cte posturi a ocupat n cadrul organizaiei.

A treia form normal


Aducerea unei baze de date la a treia form normal nseamn c divizarea tabelelor
bazei de date trebuie s continue astfel nct fiecare tabel obinut s nu conin
dependene funcionale tranzitive, adic un cmp x nu trebuie s depind de un cmp
y care depinde la rndul su de un cmp z.
S analizm tabelul Vnzri n care sunt pstrate date despre vnzrile de produse ale
companiei: codul produsului, denumirea produsului, unitatea de msur, cantitatea, data
vnzrii, codul angajatului care a intermediat vnzarea, date despre clientul care a
cumprat produsul, date despre factura prin care s-a ncheiat tranzacia etc.
Se observ c pentru acelai angajat vnztor (adic acelai cod vnztor, care este de
fapt codul angajatului, o cheie secundar cu care se poate lega tabela Salarii de tabela
Angajat unde acest cmp este cheie primar) pot s existe mai multe facturi. Fiecare
factur corespunde unui cod de client i fiecare factur poate conine mai multe produse
vndute de acel angajat. Aadar cmpul cod_produs depinde de cmpul cod_client (cel
cruia i s-a vndut produsul), care la rndul su depinde de cmpul cod_vnztor (cel
care a vndut produsul).

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

est pentru evaluare:

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.

Identificarea i clasificarea unor tipuri de structuri de date

35

disciplin obinut semestrial, media anual la fiecare disciplin, media semestrial i


media anual a elevului). Construii cu aceste date primul tabel. Normalizai tabelul.

est pentru evaluare:

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

2.3. Fundamentul matematic al bazelor de date relaionale


Cele mai multe limbaje folosite pentru interogarea bazelor de date, aa cum este i
limbajul SQL, deriv din aplicarea operatorilor specializai asupra relaiilor dintre tabelele
bazei de date. Aceti operatori fac parte din algebra relaional.
Algebra relaional conine pe lng operatorii de mulimi care trateaz tabelele ca pe
mulimi de elemente (reuniunea, intersecia, diferena, produsul cartezian), fr s in
cont de relaiile dintre ele, i operatorii relaionali specifici care se aplic asupra
relaiilor stabilite ntre nregistrrile tabelelor legate.
Operatorii relaionali specifici sunt:
selecia (select),
proiecia (project),
cuplarea (join).

1.

Selecia (Select2). Operatorul se aplic pe un tabel surs. Rezultatul este un tabel


nou, cu aceeai structur de cmpuri ca i a tabelului surs, ce conine ns numai
acele nregistrri din tabelul surs care ndeplinesc o condiie precizat: au aceeai
valoare pentru un anumit cmp.
Angajai
Cod-a
1111
1112
1113
1114

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

Select from Angajai where funcia='Casier'

Cod-a
1111
1113

Funcia
Casier
Vnzator
Casier
Contabil

Select from Angajai where departament='Salarizare'

Cod-a
1113
1114

Nou3

Departament
Marketing
Marketing
Salarizare
Salarizare

Select from Angajai where cod_num=1020260403456

Cod-a
1112

Nou2

Cod_num
2030361403457
1020260403456
2040469402458
2050570403453

Nume_prenume
Ionescu Maria
Andronescu Ana

Cod_num
2030361403457
2040469402458

Departament
Marketing
Salarizare

Operatorul relaional Select nu trebuie confundat cu comanda SQL Select.

Funcia
Casier
Casier

Identificarea i clasificarea unor tipuri de structuri de date

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

Tabel A B (produs cartezian)


Cmpuri
RA1
RA1
RA1
RA2
RA2
RA2

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

Tabel C Join A and B where A.C1=B.C4


Cmpuri
RA1
RA2

C1
1
2

C2
a
b

Rndurile tabelului A

C3
x
y

C4
1
2

C5
m
n

RB1
RB2

Rndurile tabelului B

De exemplu, departamentul Aprovizionare folosete urmtoarele tabele:


9 Tabelul Catalog materiale pentru evidena materialelor cu care se poate face
aprovizionarea. Conine cmpurile: cod_material, denumire, unitate_msur.
9 Tabelul Intrri pentru evidena materialelor achiziionate. Conine cmpurile:
cod_material, cantitate_intrat, tip_document, numr_document, data_intrrii.
9 Tabelul Ieiri pentru evidena materialelor consumate. Conine cmpurile:
cod_material, cantitate_ieit, tip_document, numr_document, data_ieirii.
Pentru a obine stocul din fiecare material, trebuie calculat pentru fiecare material
diferena dintre suma cantitilor intrate i suma cantitilor ieite. Pentru a putea executa
aceast operaie trebuie compuse cele dou tabele ntr-unul singur, condiia de
compunere fiind egalitatea cmpurilor: intrri. cod_material = ieiri. cod_material, adic
Join intrri and ieiri where intrri. cod_material = ieiri. cod_material
Operatorii din algebra relaional pot fi folosii pentru a formula diferite interogri. De
exemplu, n baza de date a organizaiei:
9 Lista cu numele angajailor din toate departamentele care au funcia 'casier'. n tabelul
Angajai se execut o operaie de selecie:
Select from Angajai where Funcie='casier'

Identificarea i clasificarea unor tipuri de structuri de date

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.

est pentru evaluare:

Pornind de la tabelele A i B, precizai coninutul tabelului C obinut ca rezultat al


operaiei relaionale:
a) Project X,Z from A
Tabelul A
Tabelul B
b) Select from A where Y=1
X
Y
Z
U
V
c) Project U from B
m
1
a
i
2
d) Select from B where V=2
n
2
b
j
4
e) Join A and B where A.Y=B.V
o
3
c
k
2
p

est pentru evaluare:

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:

A naliz. S presupunem c avei o baz de date format dintr-un tabel A i o baz de

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.

A naliz. S presupunem c avei o baz de date format dintr-un tabel A i o baz de

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.

Identificarea i clasificarea unor tipuri de structuri de date

41

Ce concluzie tragei? Reproiectai cea de-a doua baz de date astfel nct s poat
rspunde la aceste ntrebri.

M iniproiect.

Presupunnd c exist o companie care asigur distribuia ctre


abonai a mai multor publicaii, descriei n ce mod vor putea fi reprezentate ntr-o baz de
date relaionale (tabele i relaii ntre tabele) urmtoarele informaii referitoare la editori i
abonai:
a) Exist mai multe edituri. Informaiile referitoare la o editur sunt: nume, adres,
persoan de contact, numr de telefon.
b) Fiecare editur are mai multe publicaii. Informaiile referitoare la o publicaie
sunt: nume, tip publicaie, pre.
c) Fiecrui abonat i se pot distribui mai multe publicaii. Informaiile referitoare la un
abonat sunt: nume, adres, numr de telefon.
Artai ce condiii trebuie ndeplinite pentru a fi asigurat integritatea referenial a bazei
de date.

M iniproiect.

Descriei n ce mod vor putea fi reprezentate ntr-o baz de date


relaional (tabele i relaii ntre tabele) urmtoarele informaii referitoare la cursele
aeriene dintr-o zi i pasagerii acestor curse :
a) Exist mai multe linii aeriene, fiecare identificat printr-un nume.
b) Pe fiecare linie aerian exist mai multe curse identificate printr-un nume.
Fiecare curs are o destinaie.
c) Fiecare curs are o anumit capacitate (numr de locuri) i folosete un anumit
tip de avion.
d) La fiecare curs exist mai muli pasageri care rezerv locuri. Un pasager poate
rezerva mai multe locuri. Pasagerii se identific dup nume, iar locurile dup
numr.
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) Lista cu pasagerii de la cursa X.
b) Locurile rezervate de pasagerul X la cursa Y.
c) Tipul avionului folosit de cursa X.
d) Lista curselor care aparin liniei aeriene X.
e) Lista curselor care au destinaia X.

M iniproiect.

Descriei n ce mod vor putea fi reprezentate ntr-o baz de date


relaional (tabele i relaii ntre tabele) urmtoarele informaii referitoare la o bibliotec:
a) Biblioteca este format din mai multe cri, care aparin mai multor domenii de
interes pentru cititor. Domeniul se identific prin cod i nume.
b) Fiecare carte se identific prin: cod carte, titlu, autor, editur, an apariie, pre,
cod domeniu.
c) Fiecare cititor se identific prin: cod cititor, nume, adres, telefon.

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.

Descriei n ce mod vor putea fi reprezentate ntr-o baz de date


relaional (tabele i relaii ntre tabele) urmtoarele informaii referitoare la o agenie de
turism:
a) Agenia organizeaz excursii sau sejururi de mai multe zile la diferite obiective turistice.
b) Obiectivele turistice se identific prin localitate i aparin unui domeniu de interes.
c) La un obiectiv turistic pot exista mai multe ci de acces.
d) Turistului i se asigur cazare i mas. Hotelurile se identific prin nume, adres
i categorie, iar restaurantele prin nume i adres.
e) Organizarea excursiei const n a asigura turistului transportul, cazarea i masa
pe o perioad determinat de timp.
f) Agenia ine evidena turitilor, a excursiilor i a sejururilor organizate pentru
acetia.
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) Lista cu obiectivele turistice dintr-un jude X.
b) Lista cu hotelurile care pot fi folosite pentru a asigura cazarea la un obiectiv
turistic X.
c) Lista cu rezervrile fcute pe o perioad de timp D la un hotel X.
d) Lista cu turitii care vor merge n excursie ntr-o perioad D la un obiectiv X.
e) Turistul care a rezervat camera X din hotelul Y de la obiectivul turistic Z n data D.
Dac este cazul, modificai structura tabelelor din baza de date astfel nct baza de date
s poat rspunde la aceste ntrebri.

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.

Identificarea i clasificarea unor tipuri de structuri de date

43

Dirigini: cod_profesor, cod_clas.


ncadrare_discipline: cod_clas, cod_ disciplin, numr_ore.
ncadrare_profesori: cod_profesor, cod_disciplin, cod_clas.
Clase

Discipline

a)
b)
c)
d)
e)
f)

Elevi

Note

Profesori

Dirigini

Absene

ncadrare_
profesori

Prini

ncadrare_
discipline

Stabilii legturi ntre tabele.


Precizai pentru fiecare legtur tipul relaiei.
Identificai pentru fiecare relaie cheia primar i cheia secundar.
Artai ce condiii trebuie ndeplinite pentru a fi asigurat integritatea referenial.
Formulai zece cereri de interogare a bazei de date.
Ce date mai putei aduga la baza de date pentru a obine noi informaii?

est pentru evaluare:

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.

Conine toate informaiile despre entitile memorate n baza de date.


Cel mai popular model de baze de date folosit pe microcalculatoare.
Instrument software care faciliteaz crearea i ntreinerea bazelor de date.
O persoan sau un grup de persoane care coordoneaz i controleaz toate
activitile legate de baza de date a unei organizaii.
e. O colecie de fiiere i nregistrri legate ntre ele.
f. Unul dintre cele mai mari avantaje ale folosirii bazelor de date.
g. O colecie de cmpuri care sunt legate logic.
h. Descrierea ntregii colecii de date din baza de date.
i. Una dintre proprietile datelor care creeaz deficiene mari coleciilor de fiiere de
date.
j. O nregistrare din primul tabel poate fi legat de mai multe nregistrri din al doilea
tabel.
Adevrat/Fals:
1. Un avantaj al folosirii fiierelor de date este partajarea datelor ntre mai muli utilizatori.
2. Un avantaj al folosirii bazelor de date este asigurarea integritii datelor.
3. Dicionarul de date descrie structura datelor din baza de date.

44 Informatic
4.
5.
6.
7.

Administratorul bazei de date asigur consistena datelor.


Administratorul bazei de date asigur controlul centralizat al datelor.
Tabelul virtual (vizualizarea) este modelul datelor cu care opereaz utilizatorul.
tergerea restricionat nseamn c nregistrrile din tabelele conduse vor fi terse
numai cu acordul utilizatorului.
8. O relaie mai-multe-la-mai-multe poate fi descompus n dou relaii una-la-una.
9. Operatorul relaional Select se aplic pe dou tabele pentru a obine un tabel nou, cu
nregistrrile din ambele tabele care au aceeai valoare a cmpului cheie n ambele
tabele.
10. Limbajul SQL folosete interogarea prin exemple.
Completai:
1. Cmpul care identific unic o nregistrare din tabel se numete ,.
2. Baza de date este o colecie de ................. i ................ legate ntre ele.
3. Setul de date la care are acces un grup de utilizatori este descris prin .........................
4. Cheia secundar este folosit n tabelul ......................
5. Mecanismul de propagare a cheilor asigur ........................ dintre tabelele bazei de
date.
6. Pentru a asigura condiia de integritate referenial, mulimea valorilor cheii secundare trebuie s fie ....................... mulimea valorilor cheii primare din care s-a propagat.
7. Normalizarea este procesul de ................................. a unei structuri complexe prin
................................ ei n structuri mai simple, legate ntre ele.
8. Proprietatea datelor care caracterizeaz cantitatea de date memorat de mai multe
ori pe suportul de memorare se numete ............................. datelor.
Alegei rspunsurile corecte:
1. Care dintre urmtoarele entiti sunt caracteristice unei baze de date relaionale :
a) tabelul
b) nregistrrile
c) legturile logice complexe
d) cmpurile
e) structura de reea a tabelelor
2. Care dintre urmtoarele operaii creeaz probleme ntr-un ansamblu de fiiere de date :
a) actualizarea datelor
b) asigurarea independenei datelor fa de programe
c) redundana datelor
3. Care dintre urmtoarele nu sunt componente ale sistemului de gestiune a bazelor de
date:
a) limbajul de manipulare a datelor
b) dicionarul de date
c) limbajul de interogare
d) sistemul de gestiune a fiierelor
e) limbajul de descriere a datelor
f) baza de date
4. Dicionarul bazei de date nu furnizeaz informaii despre:
a) locul n care se gsesc datele din baza de date
b) dimensiunea spaiului de pe disc

Identificarea i clasificarea unor tipuri de structuri de date

5.

6.

7.

8.

9.

45

c) proprietarul unor seturi de date din baza de date


d) modul n care pot fi folosite datele de ctre utilizatori
e) limitri pentru a asigura securitatea i confidenialitatea datelor
Dac unele componente ale coleciei de date se nregistreaz de mai multe ori pe
suportul de date, redundana datelor:
a) crete
b) scade
c) nu se modific
Administratorul bazei de date stabiliete:
a) drepturile de acces ale utilizatorilor la baza de date
b) programele de aplicaie folosite pentru baza de date
c) sistemul de gestiune a bazelor de date folosit
d) modificarea structurii bazei de date
Utilizatorul bazei de date opereaz cu:
a) tabelele bazei de date
b) colecia de fiiere n care este memorat baza de date
c) vizualizrile
Operatorii relaionali Select, Project i Join se pot folosi n limbajul de tip :
a) SQL
b) QBE
c) gazd
Pentru a extrage ntr-un tabel nou anumite cmpuri dintr-un tabel surs se folosete
operatorul relaional :
a) Select
b) Project
c) Join

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

3. Tipuri de date folosite de sistemele de gestiune a


bazelor de date relaionale
n orice sistem de gestiune a bazelor de date sunt implementate urmtoarele tipuri de
date:

tipul numeric

tipul alfanumeric

tipul logic

tipul pentru gestionarea timpului

tipul special

Pentru a asigura o mai mare flexibilitate n manipularea i stocarea datelor, n sistemele


de gestiune a datelor, ca i n alte sisteme care permit prelucrarea datelor, sunt
implementate subtipuri de date. Aceste subtipuri pot fi folosite pentru datele elementare
stocate n memorie (variabilele de memorie) i/sau pentru datele elementare stocate n
memoriile externe (cmpurile tabelelor care formeaz baza de date). Subtipurile de date
difer ntre ele prin modul de stocare a datelor i prin domeniul de definiie al lor. n
continuare, pentru a v putea crea o imagine asupra varietii de subtipuri de date pe
care le putei ntlni atunci cnd lucrai cu bazele de date, sunt prezentate subtipurile
implementate n sistemul de gestiune a bazelor de date Visual FoxPro.
n acest sistem structurile de date de tip tablou de memorie sunt neomogene.
Pentru operatorul de atribuire se folosete simbolul = :
3

<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.

3.1. Tipul numeric


Pentru manipularea informaiei numerice (numere reale sau ntregi) exist urmtoarele
subtipuri numerice:
Pentru variabilele de memorie exist un singur tip numeric, reprezentat n memoria
intern pe 8 octei, care permite manipularea numerelor reale cu o precizie de 16 cifre
zecimale.
Pentru cmpuri exist patru subtipuri numerice. Unele subtipuri au lungime fix, altele
permit modificarea lungimii de ctre utilizator:
Subtipul float (simplu) poate fi folosit pentru numerele reale. Reprezentarea sa n
memoria intern poate avea o lungime cuprins ntre 1 octet i 20 de octei, n funcie de
declaraia utilizatorului. Acesta trebuie s precizeze numrul total de caractere folosite
3

Numele unei variabile de memorie sau al unui cmp.

Identificarea i clasificarea unor tipuri de structuri de date

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:

M = {+, -, *, /, **|^, %6}


Pentru operaia modulo se mai poate folosi i funcia mod(a,b) care calculeaz restul
mpririi lui a la b.
Operatorii relaionali care pot fi aplicai pe datele de tip numeric sunt:

R = {>, >=, <, <=, =, #|<>|!=7}


3.2. Tipul alfanumeric
n orice sistem de gestiune a bazelor de date sunt implementate subtipuri de date pentru
reprezentarea informaiei alfanumerice (a textelor). Astfel:
Subtipul character (ir de caractere) poate fi folosit att pentru variabilele de memorie, ct i pentru cmpuri. Fiecare caracter este reprezentat pe suportul de memorare pe
4

Mai exact, numere din intervalul [-1,7976931348623210308 1,7976931348623210308]


Mai exact, numere din intervalul [-922337203685477,5808 922337203685477,5807]
6
Pentru operaia modulo prin care se calculeaz restul mpririi unui operand de tip numeric
ntreg la un al doilea operand de tip numeric ntreg.
7
Variante ale operatorului diferit.
5

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
+

'Pop ' - ' Ana' = 'Pop Ana


P o p
-

'
A

Operatorii relaionali care pot fi aplicai pe datele de tip ir de caractere sunt:

R = {>, >=, <, <=, =, ==, #|<>|!=, $}


Operatorul == (identic) va furniza rezultatul logic adevrat dac cele dou iruri de
caractere sunt identice (conin exact aceleai caractere, inclusiv spaiile, n exact aceleai
poziii). De exemplu, expresia 'abc' == 'abc' are valoarea adevrat, iar expresia
'abc' == 'acb' are valoarea fals. Operatorul = (egal) compar irurile caracter cu
caracter, de la stnga la dreapta, pn cnd dou caractere comparate nu sunt egale
sau pn cnd se ajunge la sfritul celui de-al doilea ir. De exemplu, condiia
"abc" = "ab" are valoarea adevrat, iar condiia "ab" = "abc" are valoarea fals.
Operatorul $ (inclus n) va furniza rezultatul adevrat dac primul ir de caractere este
coninut de cel de-al doilea ir de caractere (primul ir este subir n al doilea ir). De
exemplu, expresia 'abc' $ 'abcd' are valoarea adevrat, iar expresia 'abc' $ 'acbd' are
valoarea fals.
Subtipul memo poate fi folosit numai pentru cmpuri. Se recomand pentru cmpurile n
care se memoreaz iruri de caractere ce au o lungime mai mare de 254 de caractere
sau care au lungimi foarte diferite ntre ele, de la o nregistrare la alta. De exemplu, dac
n baza de date a colii trebuie s se pstreze informaii despre cauzele exmatriculrii
unui elev, aceste informaii sunt texte de lungimi diferite, care pot avea i lungimea 0
pentru elevii care nu au fost exmatriculai. Stabilirea unei lungimi optime pentru astfel de
cmpuri este imposibil. n aceste cazuri se prefer subtipul memo care permite o alo-

Identificarea i clasificarea unor tipuri de structuri de date

49

care dinamic pentru astfel de cmpuri a spaiului de memorare de pe disc, diferit de la


un cmp la altul, n funcie de necesitile de la un moment dat. Memorarea caracterelor
din fiecare cmp memo se face ntr-un fiier asociat tabelului care conine cte o nregistrare de lungime variabil asociat fiecrui cmp memo din tabel. Acest fiier are extensia .fpt. n tabel, n cmpul memo se pstreaz pe 4 octei doar adresa la care se gsete nregistrarea asociat n fiier. Cmpurile de tip memo nu pot fi cmpuri cheie.

3.3. Tipul logic


Pentru tipul logic nu exist subtipuri. Tipul logic poate fi folosit att pentru variabile de memorie, ct i pentru cmpuri. Cmpurile care conin date de tip logic nu pot fi cmpuri cheie.
Tipul logic se numete logical. El se reprezint folosind 1 octet de suport de memorie.
Mulimea constantelor logice este:
L = {.T., .F.};
Operatorii logici care pot fi aplicai pe datele de tip logic sunt:

L = {and, or, not|!}


Ordinea de evaluare a operatorilor logici este: not, and, or.

3.4. Tipul pentru gestionarea timpului


n aplicaiile care gestioneaz un volum mare de date este important s se poat urmri
evoluia cronologic a acestor date. Din aceast cauz orice sistem de gestiune a
bazelor de date are implementat tipul de date pentru gestionarea timpului. De exemplu,
folosind subtipul Date se pot reprezenta date cuprinse ntre 1 ianuarie 100 i 31
decembrie 9999. n Visual FoxPro sunt implementate dou subtipuri de date pentru
gestionarea timpului, att pentru variabile de memorie, ct i pentru cmpuri:
Subtipul date (data calendaristic) permite memorarea datelor calendaristice cu
precizie de o zi, folosind 8 octei: 4 pentru numrul anului, 2 pentru numrul lunii i 2
pentru numrul zilei. Fiecare cifr a acestor numere se reprezint n codul ASCII.
Pentru constanta dat calendaristic se folosesc ca delimitatori parantezele acolad.
ntre paranteze se scrie data. Formatul implicit pentru dat este: ll/zz/aa. Astfel constanta
{01/25/01} specific data 25 ianuarie 2001. Constanta dat calendaristic vid se precizeaz astfel: { / / } (cte dou spaii pentru fiecare numr). Datele invalide (dac
numrul zilei sau al lunii nu este corect) sunt considerate date vide.
Operatorii pentru date calendaristice care pot fi aplicai pe datele de tip dat calendaristic sunt:

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

Subtipul datetime (timp calendaristic) permite memorarea momentelor de timp dintr-o


zi, cu o precizie de sutime de secund, att fa de data curent, ct i fa de momentul
zero al sistemului FoxPro care este considerat data de 1 ianuarie 100. Se memoreaz
folosind 8 octei: 4 octei pentru data calendaristic (memorat sub form de ntreg care
reprezint numrul de zile scurse de la momentul zero FoxPro) i 4 octei pentru timp
(memorat sub form de ntreg care reprezint numrul de secunde scurse de la miezul
nopii).
i pentru constanta timp calendaristic se folosesc ca delimitatori parantezele acolad.
10
ntre paranteze se scriu data i timpul n formatul ll/zz/aa oo:mm:ss [xM] . oo reprezint
un numr format din dou cifre pentru or: 00oo12 dac se folosete mprirea zilei n
dou perioade AM (antemeridian) i PM (postmeridian) sau 00oo24 n caz contrar. mm
este un numr format din dou cifre i reprezint numrul de minute (00mm59), iar ss
este un numr format din dou cifre i reprezint numrul de secunde (00ss59).
Operatorii timp calendaristic ce pot fi aplicai pe datele de tip timp calendaristic sunt:

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

Tip dat calendaristic.


Tip ntreg.
10
Parantezele [ ] semnific faptul c este opional coninutul lor.
11
Tip timp calendaristic;
9

Identificarea i clasificarea unor tipuri de structuri de date

51

3.5. Tipul special


Acest tip de date este folosit numai pentru cmpurile din tabelele bazei de date i
permite stocarea unor entiti create cu alte aplicaii (foi de calcul, imagini grafice,
sunete etc.).
n Visual FoxPro se folosete numai tipul general (date generale) care permite
pstrarea n tabelele bazei de date a unor entiti de tip document, foaie de calcul sau
imagine. Aceste entiti sunt considerate obiecte i pot fi stocate n baza de date
folosind protocolul OLE de ncapsulare i legare a obiectelor. Ele trebuie s fie create
cu o aplicaie OLE server. Memorarea obiectelor din cmpul general se face ntr-un fiier
asociat tabelului. n tabel, n cmpul general se pstreaz pe 4 octei doar adresa la care
se gsete obiectul. Cmpurile de tip general nu pot fi cmpuri cheie.

3.6. Proprietile cmpurilor bazei de date


Ai vzut c ntr-un cmp al bazei de date pot fi pstrate date elementare. Tipul sau subtipul datei elementare stocate determin tipul cmpului. Un cmp dintr-un tabel al bazei de
date mai are i alte proprieti pe lng proprietatea dat de tipul datelor. Acestea sunt:

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.

3.7. Crearea unei variabile de memorie n Visual FoxPro


O variabil de memorie se creeaz atribuind o valoare numelui variabilei. Valoarea poate
fi precizat printr-o constant, prin numele unei alte variabile de memorie sau printr-o
expresie. Tipul datei atribuite determin tipul variabilei.
De exemplu, prin operaia de atribuire a=2 s-a creat variabila de memorie a de tip
numeric. Urmtoarea operaie de atribuire a=2=3 schimb tipul variabilei de memorie a,
deoarece noua valoare atribuit este de tip logic (rezultatul operaiei de comparare 2=3).

Identificarea i clasificarea unor tipuri de structuri de date

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

pentru a=1, b=2, c=3 i d=3.

Vei folosi cinci variabile de memorie a, b, c, d, i e. Atribuii valori primelor patru


variabile de memorie. Scriei patru operaii de atribuire, cte una pe fiecare rnd.
Terminai fiecare operaie de atribuire apsnd tasta Enter.

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

Fereastra de comenzi. Aici


scriei comenzile.

Aici se afieaz
rezultatul evalurii.

2. Evaluai urmtoarele expresii pentru x=2, a=1, b=2 i c=3


x3 1
x ( x 3)(x 1)
a 2 + (a + b )3
+ a 2b
E2 =
ab 2
a
a
+ c ) + (ab )2 + 3
4(
bc
bc
E3 =
2a 3
E1=

3. Comparai dou date calendaristice: 2 ianuarie 2001 cu 1 februarie


2001:
? {01/02/01} > {02/01/01}
.F.

4. Evaluai expresia logic:


e = a and b or (not a or not b)

pentru a=.T. i b=.T. i pentru a=.F. i


b=.F.
a=.T.
b=.T.
e=a and b or (not a or not b)
?e
.T.
a=.F.
b=.F.

Identificarea i clasificarea unor tipuri de structuri de date


e= a and b or (not a or not b)
?e
.T.

Observai c dup fiecare operaie de


atribuire pentru variabilele de memorie a
i b s-a executat o nou operaie de
atribuire pentru expresia e, pentru ca
expresia s fie evaluat cu noile valori
ale variabilelor a i b.
5. Verificai dac valoarea numrului
real x aparine mulimii A =
(0,10]{30} pentru x=50 i pentru
x=5. Pentru fiecare valoare vei
testa dac x aparine sau nu la
mulimea A. Pentru apartenen vei
evalua expresia logic:
e = (x>0 and x<=10) or x=30
iar pentru a verifica dac nu aparine
vei evalua expresia logic not e.
x=50
e=(x>0 and x<=10) or x=30
?e
.F.
? not e
.T.
x=5
e=(x>0 and x<=10) or x=30
?e
.T.
? not e
.F.

6. Concatenai dou iruri de caractere 'Ion ' i 'Maria ':

.T.
? a>b
.F.
? a==b
.F.
? a$b
.F.
? b$a
.T.
b='abc '
? a<b
.T.

8. Aplicai diferii operatori asupra


datelor calendaristice. Adugai 2
zile la data de 10 februarie 2001 i
obinei data de 12 februarie 2001,
scdei 10 zile din data de 1
ianuarie 2001 i obinei data de 22
decembrie 2000 i calculai diferena de zile ntre datele 1 ianuarie
2001 i 22 decembrie 2000.
? {02/10/01}+2
02/12/01
? {01/01/01}-10
12/22/00
? {01/01/01}-{12/22/00}
10

9. Folosii macrosubstituia. Memorai


n variabila a valoarea 1 i n variabila b numele variabilei a.
a=1
b=a
?b
a
?a
1

a='Ion '
b='Maria '
? a + b + '!'

? &b
1
Ion Maria !

? a - b + '!'
IonMaria

7. Comparai dou iruri de caractere:


a='123'
b='12 '
? a<b
.F.
? a=b

55

Macrosubstituia &b afieaz coninutul


variabilei a al crei nume este memorat
n variabila b, adic valoarea 1.
10. Folosii macrosubstituia. Memorai
n variabila a valoarea alfa:
a=alfa
alfa1=Caldura
alfa2=mare

56 Informatic
alfa3=monser!
? &a.1+&a.2+&a.2
Caldura mare monser!

Macrosubstituia &a.1+&a.2+&a.3 afieaz irul de caractere Caldura mare


monser! Se afieaz acest ir de
caractere deoarece &a.1 are urmtoarea semnificaie: numele memorat n
variabila a se concateneaz cu caracterul 1, adic alfa+1 i se obine
numele de variabil de memorie alfa1.

Aadar &a.1 nseamn coninutul


variabilei de memorie alfa1, adic irul
de caractere Caldura. n acelai mod,
&a.2 nseamn coninutul variabilei de
memorie alfa2, adic irul de caractere
mare, iar &a.3 nseamn coninutul
variabilei de memorie alfa3, adic irul
de caractere monser!. Expresia nseamn de fapt concatenarea acestor trei
iruri de caractere.

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:

Identificarea i clasificarea unor tipuri de structuri de date


a) 24 -1

b) 9999

3. Rezultatul expresiei 3^2*35%5**2 este:


a) 0.00
b) 15.00

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:

Adevrat/Fals: 1-F; 2-A; 3-F; 4-A; 5-F; 6-A; 7-F; 8-F.


Completai: 1-inclus n, iruri de caractere; 2-1 ianuarie 100, 31 decembrie 9999; 3-+,-; 4-{ };
5-adresarea indirect.
Alegei rspunsul corect: 1) a; 2) b; 3) b; 4) c; 5) a; 6) c; 7) a; 8) a; 9) b.

Capitolul

Utilizarea unor
instrumente de
prelucrare a datelor

Baza de date relaional este un instrument


complex de organizare a datelor. Ea este format nu numai din datele care reprezint informaia
1.
propriu-zis (datele din tabele), dar i de multe
date ajuttoare necesare pentru descrierea structurii tabelelor i a relaiilor dintre tabele, pentru
2.
regsirea i interpretarea datelor, astfel nct s
3.
v poat oferi acces la o mare cantitate de informaii care s v ajute s luai decizii. Pentru administrarea ei este necesar un software specializat numit sistem de gestiune a bazelor de
date. Termenul de baz de date se refer la modelul de organizare a datelor pe suportul de me4.
morare, iar termenul de gestiune se refer la
aciunea de stocare i prelucrare a acestor date.
Deja ai putut vedea ce tipuri de date se folosesc
ntr-un sistem de gestiune a bazelor de date. Acesta a fost primul pas pentru a nelege
complexitatea unui sistem de gestiune a bazelor de date.
Dup ce vei parcurge acest capitol
trebuie s tii:
S lucrai cu interfaa unei aplicaii
specifi pentru gestiunea bazelor de
date.
S creai o baz de date definind
tabelele i relaiile dintre ele.
S executai prin intermediul
interfeei operaii specifice gestiunii
bazelor de date relaionale: actualizarea (adugarea, tergerea i
modificarea nregistrrilor), sortarea,
consultarea, cutarea, sortarea.
S obinei informaii din baza de
date sub form de rapoarte, interogri i vizualizri.

Orice sistem de gestiune a bazelor de date trebuie s asigure urmtoarele funcii


elementare:
9 definirea bazei de date,
9 actualizarea datelor din baza de date prin:
adugarea de noi nregistrri,
tergerea unor nregistrri,
modificarea valorii unor cmpuri din nregistrri;
9 interogarea bazei de date (extragerea informaiilor din baza de date).
La aceste funcii elementare, pe msura dezvoltrii sistemelor de gestiune a bazelor de
date s-au mai adugat i alte funcii, dintre care cele mai importante sunt:
9 generarea formularelor de ecran pentru introducerea datelor,
9 generarea rapoartelor,

Utilizarea unor instrumente de prelucrare a datelor

59

9 noi modaliti de interogare a bazelor de date (de exemplu folosind un


limbaj neprocedural cum este SQL).
Pe microcalculatoare au fost implementate mai multe tipuri de sisteme de gestiune a
bazelor de date:
9 dBase II, III, III+, IV au fost realizate de firma Ashton-Tate. Ele au deinut supremaia
muli ani i au impus un standard n domeniul bazelor de date relaionale, astfel nct
sistemele dezvoltate ulterior, cum este i sistemul FoxPro, au preluat i dezvoltat
acest standard. Deoarece bazele de date dBase au nmagazinat un volum foarte
mare de date, pentru a nu se pierde aceste date i pentru a le putea folosi ulterior cu
ajutorul aplicaiilor create cu alte sisteme de gestiune a bazelor de date, toate noile
sisteme de gestiune a bazelor de date pentru microcalculatoare, dac nu folosesc
standardul dBase, au implementat facilitatea de import al bazelor de date dBase.
9 Clipper a fost creat de firma Nantucket i respect standardul dBase.
9 Paradox creat de firma Borland a fost ulterior cumprat de firma Corel i integrat n
setul software creat de aceast firm. Nu respect standardul dBase.
9 FoxPro a fost creat de firma FoxSoftware i a fost cumprat ulterior de firma
Microsoft. Este sistemul de gestiune a bazelor de date care s-a impus cel mai mult n
ultima vreme pe microcalculatoare.
9 Access a fost creat de firma Microsoft i integrat n setul Microsoft Office. Nu
respect standardul dBase, dar poate importa baze de date dBase.
Dintre sistemele de gestiune a bazelor de date folosite pe microcalculatoare vei studia
aplicaia Visual FoxPro, deoarece este cea mai nou versiune a sistemului de gestiune a
bazelor de date FoxPro. Termenul visual nseamn c aplicaia dispune de instrumentele
folosite de programarea vizual. n aceast tehnic de programare, programatorii au la
dispoziie programe utilitare care scriu singure secvena de instruciuni necesare pentru
realizarea unor operaii. Rolul programatorului se reduce la specificarea unor opiuni
(valoarea unor parametri) n cadrul unui dialog interactiv cu programul utilitar.

1. Interfaa aplicaiei Visual FoxPro


1.1. Prezentarea sistemului de gestiune a bazelor de date FoxPro
Sistemul de gestiune a bazelor de date FoxPro este cel mai rspndit produs de acest
tip pentru microcalculatoare deoarece:
9 Este orientat pe standardul dBase, ceea ce a permis preluarea bazelor de date
exploatate prin acest sistem. Sunt baze de date care au fost create acum civa ani
folosind sistemul de gestiune a bazelor de date dBase. S-a consumat mult timp pentru
ncrcarea lor i preluarea datelor elementare ntr-un nou format de baz de date
relaional, cum este FoxPro, se poate face simplu, fr pierderea datelor.
9 Asigur compatibilitatea cu versiunile anterioare i cu produsele dBase.
9 Poate fi folosit sub diverse sisteme de operare: MS-DOS, Windows, Unix,
MacIntosh. Deosebirea de la un sistem de operare la altul apare doar n interfa i
structura meniului. Aceste deosebiri sunt uor de depit, deoarece nseamn de fapt
readaptarea la interfaa noului sistem de operare.

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.

Utilizarea unor instrumente de prelucrare a datelor

61

1.2. Moduri de lucru n Visual FoxPro


Sistemul de gestiune a bazelor de date Visual FoxPro permite dou moduri de lucru:

modul de lucru interactiv,


modul de lucru programat.

1.2.1. Modul de lucru interactiv


Modul de lucru interactiv se poate desfura i el n dou moduri:

prin intermediul interfeei grafice,


prin intermediul limbajului de comand.

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

Meniul Edit conine operaiile


pentru editarea textelor, inclusiv a
comenzilor din fereastra document
Command.

Barele cu instrumente

n fereastra Command putei s editai


comenzile. Pentru editare putei folosi aceleai
tehnici ca i n cazul editoarelor de texte.

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.

Utilizarea unor instrumente de prelucrare a datelor

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:

Identificatorul tabelului i al bazei


de date din care face parte

Numrul nregistrrii curente i numrul


total de nregistrri din tabel

n partea dreapt a barei de stare sunt afiate informaii despre tastele


comutator Insert (OVR), Num Lock (NUM) i Caps Lock (CAPS).
Dac numele lor este afiat (ca n exemplu), nseamn c sunt activate.
La fel ca la orice aplicaie Microsoft, utilizatorul mai are la dispoziie i meniul contextului sau meniul de comenzi rapide care se deschide atunci cnd executai clic cu
butonul din dreapta al mouse-ului pe un obiect din fereastr. Opiunile din acest meniu
depind de context (de obiectul indicat cu mouse-ul).

Ferestrele document care pot fi deschise n fereastra aplicaiei Visual FoxPro sunt:

Obiectul indicat cu mouse-ul a


fost spaiul liber al ferestrei
generatorului de baz de date.
Meniul contextului conine
opiuni care se refer la baza de
date.

Obiectul indicat cu mouse-ul a


fost un tabel al bazei de date.
Meniul contextului conine
opiuni care se refer la tabel.

9 Fereastra Command. Se folosete pentru editarea comenzilor.


9 Fereastra View. Se folosete la vizualizarea tabelelor bazei de date deschise, a relaiilor dintre tabele i a zonelor n care lucreaz fiecare tabel.

Utilizarea unor instrumente de prelucrare a datelor

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.

Comanda este o succesiune de caractere organizate conform sintaxei limbajului, prin


care i se cere calculatorului s execute o aciune. Sintaxa se refer la structura liniei de
comand. Linia de comand are urmtoarea sintax:
verb

definete aciunea

list adverbe

Enter

precizeaz modul n care se execut


aciunea comandat de verb

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).

Utilizarea unor instrumente de prelucrare a datelor

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

comanda care acioneaz


asupra nregistrrii

comanda care acioneaz


asupra nregistrrii

salt la urmtoarea nregistrare

salt la urmtoarea nregistrare

De exemplu, linia de comand:


Display next 30 adresa for nume=Popescu
conine verbul display (afieaz) i adverbele care precizeaz ce nregistrri i cmpuri
vor fi afiate din tabel. Lista de adverbe conine trei adverbe:
next 30 - un adverb prin care se precizeaz domeniul nregistrrilor care vor fi afiate:
urmtoarele 30 de nregistrri ncepnd cu nregistrarea curent;
adresa - un adverb nume de cmp care precizeaz ce cmpuri se vor afia din
nregistrri;
for nume=Popescu - un adverb precizat printr-o clauz care definete domeniul
nregistrrilor: toate nregistrrile pentru care valoarea cmpului nume este Popescu.

1.2.2. Modul de lucru programat


Comenzile sunt memorate n fiiere de comenzi speciale de tip program executabil care
pot fi ncrcate n memorie i lansate n execuie.
n loc s se scrie comenzile n fereastra de comenzi una cte una i s se cear de fiecare
dat execuia lor, se vor scrie ntr-un fiier de comenzi. Fiierul de comenzi are extensia .prg.
Printr-o singur comand se va cere executarea programului, adic a grupului de comenzi

Utilizarea unor instrumente de prelucrare a datelor

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

comanda care acioneaz


asupra nregistrrii

comanda care acioneaz


asupra nregistrrii

salt la urmtoarea nregistrare

salt la urmtoarea nregistrare

De exemplu, linia de comand:


Display next 30 adresa for nume=Popescu
conine verbul display (afieaz) i adverbele care precizeaz ce nregistrri i cmpuri
vor fi afiate din tabel. Lista de adverbe conine trei adverbe:
next 30 - un adverb prin care se precizeaz domeniul nregistrrilor care vor fi afiate:
urmtoarele 30 de nregistrri ncepnd cu nregistrarea curent;
adresa - un adverb nume de cmp care precizeaz ce cmpuri se vor afia din
nregistrri;
for nume=Popescu - un adverb precizat printr-o clauz care definete domeniul
nregistrrilor: toate nregistrrile pentru care valoarea cmpului nume este Popescu.

1.2.2. Modul de lucru programat


Comenzile sunt memorate n fiiere de comenzi speciale de tip program executabil care
pot fi ncrcate n memorie i lansate n execuie.
n loc s se scrie comenzile n fereastra de comenzi una cte una i s se cear de fiecare
dat execuia lor, se vor scrie ntr-un fiier de comenzi. Fiierul de comenzi are extensia .prg.
Printr-o singur comand se va cere executarea programului, adic a grupului de comenzi

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>

1.3. Configurarea mediului de lucru Visual FoxPro


1.3.1. Sintaxa comenzilor de configurare a mediului Visual FoxPro
Configurarea mediului de lucru se face prin intermediul unui ansamblu de comenzi
Set. n general, sintaxa comenzii Set este:
Set <parametru>
unde <parametru> reprezint un parametru al sistemului care poate fi modificat prin comand.
Comanda Set prezint dou forme:

Set <parametru> On|Off


Aceast form se folosete pentru parametrii care pot avea doar dou valori: on parametru activat i off - parametru dezactivat. De exemplu:
Set Bell On|Off
Controleaz parametrul Bell (sunet) care poate fi activat (on) sau dezactivat (off).
Implicit este on.
Set Clock On|Off|Status
Controleaz parametrul Clock (afiarea pe ecran a ceasului) care poate fi activat
(on), dezactivat (off) sau poate fi afiat n bara de stare (status). Implicit este off.
Set Status Bar On|Off
Controleaz parametrul Status Bar (afiarea barei de stare) care poate fi activat
(on) sau dezactivat (off). Implicit este on.
Set Blink On|Off
Controleaz parametrul Blink (clipirea elementelor ecranului: margini, umbre, texte
etc.) care poate fi activat (on) sau dezactivat (off). Implicit este on.
Set Talk On|Off
Controleaz parametrul Talk (afiarea pe ecran a rezultatului comenzilor) care
poate fi activat (on) sau dezactivat (off). Implicit este on.

Set <parametru> to <valoare>

Utilizarea unor instrumente de prelucrare a datelor

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.

1.3.2. Configurarea mediului pentru diferite tipuri de date


Folosind comenzile Set putei configura mediul Visual FoxPro pentru diferite tipuri de
date. De exemplu, pentru:

Tipul numeric. Putei folosi comenzile:


Set Decimals to [<x>]
Stabilete numrul minim de zecimale afiate. Numrul de zecimale este precizat
prin <x>, care trebuie s fie o expresie numeric cu valoarea cuprins ntre 0 i 18.
Valoarea implicit este 2.
Set Fixed On|Off
Stabilete dac numrul de poziii zecimale afiate este controlat sau nu. Dac are
valoarea off, numrul de poziii afiate nu este controlat (depinde de valoarea numeric afiat). Dac are valoarea on, numrul de poziii afiate poate fi controlat
cu comanda Set decimals to. Valoarea implicit a acestui parametru este off.
Set Point to [<x>]
Stabilete prin expresia de tip ir de caractere <x> care va fi delimitatorul folosit ntre
partea ntreag i partea fracionar a unui numr. Valoarea implicit este punctul.

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.

1.3.3. Redirectarea ieirii n mediul Visual FoxPro


Putei folosi comenzile Set i pentru redirectarea ieirilor comenzilor. Ieirea standard
este ecranul. De exemplu, prin comanda ? datele de ieire vor fi afiate pe ecran. Datele
de ieire pot fi redirectate ctre un alt echipament: imprimant sau fiier pe disc.
Set Console On|Off
Controleaz ieirea ctre ecran. Dac are valoarea on, datele de ieire vor fi
afiate pe ecran, altfel va fi inhibat afiarea lor. Dac ai inhibat afiarea pe ecran,
putei s redirectai ieirea ctre imprimant sau ctre un fiier pe disc folosind
comanda Set Printer. Valoarea implicit este on.
Set Printer On|Off
Controleaz redirectarea ieirii ctre imprimant. Dac are valoarea on, permite
ieirea la imprimant, altfel aceast ieire este inhibat. Valoarea implicit a
acestui parametru este off.
Set Printer to [<nume_fiier>[additive]]
Redirecteaz ieirea ctre un fiier specificat prin <nume_fiier>. Dac nu se precizeaz parametrul, ieirea va fi implicit ctre dispozitivul folosit pentru tiprire.

1.3.4. Configurarea interactiv a mediului Visual FoxPro


Pentru a configura interactiv (prin intermediul interfeei) mediul de lucru Visual FoxPro,
deschidei caseta de dialog Options cu opiunea Options...Tools.
Caseta conine mai multe seciuni:
9 Data pentru parametrii care stabilesc modul n care se controleaz datele din tabele,
9 View pentru parametrii care stabilesc obiectele afiate n fereastra aplicaiei: bara de
stare, ceasul, rezultatul comenzilor, mesajele sistemului etc.
9 General pentru parametrii generali ai mediului care stabilesc caracteristicile sunetului,
ale interfeei de programare, ale modului de introducere a datelor etc.
9 Edit pentru parametrii care stabilesc modul n care se face editarea unui text i modul
n care se salveaz fiierele,
9 File Locations pentru parametrii care furnizeaz informaii pentru localizarea
fiierelor folosite de Visual FoxPro (calea de director i numele fiierului),
9 Forms pentru parametrii generatorului de formulare,
9 Project pentru parametrii administratorului de proiecte,
9 Controls pentru parametrii bibliotecii de clase vizuale i de controale OLE,

Utilizarea unor instrumente de prelucrare a datelor

71

9 Internationals pentru parametrii care stabilesc formatul datelor calendaristice, al


datelor moment de timp i al datelor numerice.

1.4. Comenzi pentru gestionarea fiierelor n Visual FoxPro


Sistemul de gestiune a bazelor de date creeaz mai multe fiiere: fiierele care conin tabele
ale bazelor de date .dbf, fiierele care conin bazele de date .dbc, fiierele de comenzi .prg,
fiierele care conin cmpurile memo .fpt, fiierele care conin indecii .idx i .cdx.
Gestionarea acestor fiiere (copiere, mutare, redenumire etc.) implic nchiderea aplicaiei i revenirea la interfaa sistemului de operare. Pentru a se evita aceste operaii, sistemul de gestiune a bazelor de date Visual FoxPro pune la dispoziia utilizatorilor
comenzi pentru gestionarea fiierelor. Aceste comenzi sunt:
a. copierea unui fiier:
Copy file <nume1> to <nume2>
unde <nume1> reprezint numele fiierului surs (numele fiierului care se copiaz), iar
<nume2> reprezint numele fiierului destinaie (numele sub care se face copierea).
b. redenumirea unui fiier:
Rename <nume1> to <nume2>
unde <nume1> reprezint numele iniial al fiierului, iar <nume2> reprezint noul nume al
fiierului.
c. tergerea unui fiier:
Erase <nume> sau
Delete file <nume>
unde <nume> reprezint numele fiierului care se terge.
d. afiarea coninutului unui fiier cu text:
Type <nume1> [to printer | to file <nume2>]
unde <nume1> reprezint numele fiierului cu text al crui coninut se afieaz implicit pe
ecran, dar poate fi redirectat ctre imprimant (to printer) sau ntr-un alt fiier cu numele
<nume2> (to file <nume2>).
e. afiarea coninutului unui director:
Dir [on] [<disc>] [<dir>] [<ablon>] [to printer | to file <nume>]
Se afieaz coninutul directorului care se gsete pe unitatea de disc <disc> i care
poate fi identificat prin calea de director <dir>. Prin <ablon> se poate preciza grupul de
fiiere care va fi inventariat (de exemplu *.prg este un ablon prin care se precizeaz c
vor fi inventariate numai fiierele de comenzi). Afiarea se face implicit pe ecran, dar poate fi
redirectat ctre imprimant (to printer) sau ntr-un alt fiier cu numele <nume> (to file <nume>).
Se mai pot folosi dou comenzi, identice din punct de vedere al sintaxei:
List/Display files [[on] [<disc>] [like <ablon>]] [to printer | to file <nume2>]
Putei s administrai interactiv fiierele prin intermediul casetei de dialog Filer pe care o
deschidei cu comanda:
Filer

72 Informatic

1.5. Asistena utilizatorului n Visual FoxPro


tii deja c autodocumentarea nseamn o facilitate pus la dispoziie de aplicaie pentru
a furniza utilizatorului explicaii despre modul n care poate folosi interfaa, despre comenzi,
despre diferite operaii pe care le poate executa. Autodocumentarea se mai numete i
help. Visual FoxPro pune la dispoziia utilizatorului ambele tipuri de autodocumentare:

Help dependent de context


Informaiile afiate depind de contextul n care au fost cerute, adic se apeleaz funcia
help n timpul executrii unei operaii, iar informaiile se refer strict la operaia respectiv.
n general, funcia Help exist n marea majoritate a casetelor de dialog i a ferestrelor
document. Apelarea ei se face prin apsarea tastei F1. n cazul casetelor de dialog mai
putei folosi i butonul declanator Help sau butonul ? din bara de titlu a casetei.
Mai putei s cerei informaii despre o comand sau o funcie precizat prin <nume>
folosind comanda Help care are sintaxa:
Help <nume>
De exemplu, comada Help str() cere s se afieze informaii depre funcia str(). Aplicaia
afieaz caseta de dialog Help Topics la seciunea Index.

Help independent de context


Se afieaz o list cu nume de subiecte (topic) i diverse mecanisme de cutare rapid
printre aceste subiecte. Fereastra aplicaiei Help se deschide cu opiunea Contents
Help. Meniurile aplicaiei Help sunt:
9 File conine opiuni pentru operaii cu fiiere de tip Help (deschidere, tiprire).
9 Edit conine opiuni pentru copierea textului selectat din fereastra Help i pentru administrarea comentariilor (adugare, tergere, modificare). Comentariul (annotation) este un
text suplimentar pe care utilizatorul poate s-l adauge la textul unui subiect din Help.
9 Bookmark conine opiuni pentru administrarea semnelor de carte - bookmarks (creare,
tergere, modificare). Acestea sunt marcaje ce pot fi identificate printr-un nume. Ele sunt
asociate unor subiecte i ajut la localizarea rapid a subiectelor marcate.
9 Options conine opiuni pentru stabilirea modului de afiare n fereastra aplicaiei
Help: dimensiunea caracterelor, dac se folosete sau nu sistemul de culori, dac la
revenirea n aplicaie fr nchiderea ferestrei Help, aceasta rmne deschis
deasupra sau sub fereastra aplicaiei etc.
Butoanele declanatoare sunt:
9 Contents deschide caseta de dialog n care este afiat coninutul unui subiect.
9 Print tiprete subiectul la imprimant.
9 Search deschide o caset de dialog care conine controale ce v permit s localizai
rapid un subiect. Cutarea se face dup numele subiectului sau dup primele litere
ale numelui subiectului.
9 Back aduce n fereastr ultimul subiect vizualizat.
9 Glossary afieaz glosarul (list de termeni ordonat alfabetic). Dac executai clic
pe numele unui termen, se afieaz ntr-o caset informaii despre el.

Utilizarea unor instrumente de prelucrare a datelor

73

Din interfaa sistemului de operare Windows lansai aplicaia Visual FoxPro.


Administrai interfaa aplicaiei Visual FoxPro
1. Identificai elementele ferestrei de aplicaie Visual FoxPro: bara de meniuri, bara cu
instrumente, bara de stare, fereastra de comenzi i spaiul de lucru al ferestrei de
aplicaie.
2. Fereastra Commands este o fereastr document. Executai cu aceast fereastr
operaiile de minimizare, deplasare, maximizare, redimensionare i restaurare.
Observai c aceste operaii se execut numai n cadrul ferestrei de aplicaie.
3. Deschidei caseta de dialog Toolbars cu opiunea Toolbars...View. n lista
Toolbar executai clic pe comutatorul View Designer i apoi clic pe declanatorul
Ok. Observai c n fereastra aplicaiei este afiat o nou bar cu instrumente. Deschidei din nou caseta de dialog Toolbars. Verificai s fie activat numai comutatorul
Standard din lista Toolbar. Executai clic pe declanatorul Ok. Observai c n
fereastra aplicaiei este afiat numai bara standard cu instrumente.
4. Deschidei meniul Window. Observai informaiile afiate n bara de stare.
5. Executai operaii cu ferestrele document:
Ascundei fereastra document Command cu opiunea HideWindow. Observai
c n bara de meniu nu mai este afiat titlul meniului Format, deoarece acest
meniu conine opiuni pentru formatarea textelor editate. El depinde de existena
unei ferestre care s permit editarea. Fereastra Command este o fereastr n
care se editeaz comenzi. Ferestrele View i Debug pe care le vei deschide nu
sunt ferestre de editare.
Reafiai fereastra apsnd tastele Ctrl+F2 (scurttura opiunii CommandWindow).
Deschidei fereastra View cu opiunea ViewWindow.
Deschidei fereastra Debug cu opiunea Debug WindowTools.
Activai pe rnd ferestrele document deschise, apsnd tastele Ctrl+F1.
nchidei ferestrele View i Debug executnd clic pe butonul de nchidere.
Folosii autodocumentarea
1. Vizualizai informaii despre comanda Display Status (help dependent de context):
Scriei n fereastra Command comanda Help Display Status.
Se deschide caseta de dialog Help Topics. n list este selectat subiectul DISPLAY
STATUS command. Executai clic pe declanatorul Display.
Se deschide caseta de dialog Topics Found. Selectai n list subiectul DISPLAY
STATUS command i executai clic pe declanatorul Display.
Se deschide fereastra aplicaiei Help. n fereastr sunt afiate informaii despre
acest subiect.
Executai clic pe butonul Glossary. Se deschide caseta de dialog Help Index.
Executai clic pe butonul cu litera S.
n caset este afiat lista cu termenii care ncep cu litera S. Executai clic pe
termenul SQL. Se deschide o caset cu text n care v sunt furnizate informaii
despre acest termen. nchidei aceast caset executnd clic n exteriorul ei.

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.

Utilizarea unor instrumente de prelucrare a datelor

75

8. Deschidei meniul View. Observai c opiunile acestui meniu sunt dependente de


context. n meniu au aprut opiuni noi. De exemplu, a aprut un grup de opiuni de
tip butoane radio: Browse i Edit. Este activat opiunea Browse. Aceasta nseamn c fereastra generatorului de tabel este de tip Browse. Executai clic pe opiunea
Edit. Observai c s-a modificat modul n care sunt afiate datele n fereastra
tabelului. De data aceasta, pe fiecare rnd este afiat coninutul unui cmp. Numele
cmpului apare scris la nceputul rndului. Revenii la modul de afiare Browse.
9. nchidei cele dou ferestre document. Observai c n fereastra Command au aprut
comenzile pe care le-ai executat prin intermediul interfeei:
OPEN DATABASE C:\VFP\SAMPLES\DATA\Testdata.dbc EXCLUSIVE
MODIFY DATABASE
Configurai mediul de lucru Visual FoxPro
1. Configurai ceasul i modul n care este afiat timpul:
set hours to 12
set clock to status
ceasul este afiat n bara de
stare n format de 12 ore
? set ('clock')
STATUS
? set ( 'hours')
12
set clock off
ceasul nu mai este afiat n
bara de stare
set clock on
ceasul este afiat n colul din
dreapta sus al spaiului de
lucru al ferestrei

? 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

2. Configurai modul n care sunt comparate datele de tip ir de caractere:


set exact off
?'abc'='abc1'
.F.
?'abc'=='abc1'
.F.
?'abc'='ab'
.T.
?'ab'='abc'
.F.
?'abc'='ab1'
.F.
?'ab'='ab1'
.F.
?'ab1'='ab'

.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

Set Bell On|Off

Clock

Set Clock On|Off

Clock

Set Clock to [12|24]

Decimals

Set Decimals to

Point

Set Point to

Seciunea General; grupul de butoane radio Off


(fr sunet), Default (cu sunet implicit), Play (cu
sunet ales prin intermediul unei casete de text).
Seciunea View; caseta Show; comutatorul
Clock.
Seciunea International; grupul de butoane radio
12-Hour i 24-Hour.
Seciunea International; caseta de text cu derulor
Decimals Digit.
Seciunea International; caseta de text Decimals
Separator.
Seciunea Data; comutatorul SET EXACT.
Seciunea View; caseta Show; comutatorul
Status Bar.
Seciunea View; caseta Show; comutatorul
Command Result.

Exact
Set Exact On|Off
Status Bar Set Status Bar On|Off
Talk

Set Talk On|Off

Lucrai cu fereastra document a editorului de texte


1. Scriei n fereastra Command urmtoarele comenzi pe care le executai:
set fixed on
set decimals to 4
set point to ','

x=4*30
?x

Se afieaz rezultatul 120,0000:


2. Deschidei fereastra de editare cu comanda modify command a1. Numele ferestrei
de editare este numele fiierului a1.prg.
3. Activai fereastra de comenzi executnd clic n aceast fereastr. Selectai comenzile
introduse la punctul 1. Copiai n zona Clipboard aceste instruciuni apsnd tastele
Ctrl+C.
4. Activai fereastra de editare executnd clic n spaiul ei de lucru. Copiai n aceast
fereastr instruciunile din Clipboard apsnd tastele Ctrl+V. nchidei fereastra de
editare cu salvarea coninutului apsnd tastele Ctrl+W.
5. Deschidei din nou fereastra de editare cu comanda modify command a1. n fereastra de editare sunt afiate instruciunile scrise anterior. Salvai acest coninut ntr-un
alt fiier de program cu comanda Save As...File. n caseta de dialog Save As scriei
n zona de editare Save a2. Observai numele dosarului n care se salveaz aceste
fiiere cu programe. Executai clic pe declanatorul Save. Observai c acum numele
ferestrei de editare este a2.prg. Ea conine comenzile din programul a1. Modificai
instruciunile urmtoare, pentru a reveni la afiarea implicit a numerelor (2 poziii
zecimale i separatorul punct):
set decimals to

set point to

Utilizarea unor instrumente de prelucrare a datelor

77

nchidei fiierul a2 cu salvarea modificrilor apsnd tastele Ctrl+W.


6. Executai comenzile din fiierul a1. Scriei n fereastra Commands comanda Do a1.
Rezultatul afiat este 120,0000.
7. Executai comenzile din fiierul a2. Scriei n fereastra Commands comanda Do a2.
Rezultatul afiat este 120.00.
Manipulai fiierele
1. Copiai fiierul a1.prg sub numele nou.prg, folosind comanda:
copy file a1.prg to nou.prg
2. Vizualizai lista cu fiiere cu programe din directorul curent. Identificai n list fiierele
program create: a1.prg, a2.prg i nou.prg. Folosii comanda:
dir like *.prg
3. Redenumii fiierul nou.prg cu numele a3.prg folosind comanda:
rename nou.prg to a3.prg
4. Vizualizai lista cu fiiere cu programe din directorul curent create n aceast sesiune
de lucru: a1.prg, a2.prg i a3.prg. Folosii comanda:
dir like a*.prg
5. Deschidei caseta de dialog Filer folosind comanda:
filer
Identificai controalele din caseta de dialog. n list sunt afiate directoarele i fiierele din
directorul curent. Pentru fiecare dintre ele se afieaz numele, dimensiunea, data i ora
ultimei actualizri, atributele. Cele dou liste ascunse Drive i Directories se folosesc
pentru a schimba discul implicit i directorul curent. Caseta de text Files Like se folosete pentru a comunica ablonul fiierelor afiate n list (implicit este *.*, adic toate fiierele). Pentru executarea operaiilor cu fiiere i directoare putei folosi declanatoarele:
9 Find - localizarea unui fiier sau director prin intermediul controalelor din caseta de
dialog Find Files;
9 Copy - copierea fiierului sau a directorului selectat sau a grupului de fiiere sau
directoare selectate;
9 Move - mutarea fiierului sau a directorului selectat sau a grupului de fiiere sau
directoare selectate;
9 Delete - tergerea fiierului sau a directorului selectat sau a grupului de fiiere sau
directoare selectate;
9 Sort - sortarea listei cu fiiere i directoare dup diferite criterii (nume, extensie, dat,
dimensiune etc.);
9 Edit - editarea fiierului selectat (deschide fereastra de editare n care ncarc fiierul);
9 Attr - afiarea sau modificarea atributelor fiierului selectat;
9 Rename - redenumirea fiierului sau directorului selectat;
9 Size - afiarea dimensiunii fiierului selectat (n octei);
9 Tree - are efect de comutator: prin acionare schimb informaia afiat n list; n
locul listei cu fiiere i directoare este afiat arborele de directoare.
Scriei n caseta de text ablonul *.prg. Observai c n list sunt afiate numai
fiierele care au extensia .prg. Revenii la afiarea tuturor fiierelor rescriind n
aceast caset ablonul *.*.

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

Utilizarea unor instrumente de prelucrare a datelor

79

b) manipularea nregistrrilor dintr-un tabel


c) crearea legturilor ntre tabele
2. Fereastra n care putei vedea ce tabele conine baza de date deschis, n ce zone
lucreaz i ce legturi exist ntre ele se numete:
a) Database Designer
b) Form Designer
c) View
3. Clauza prin care putei preciza numai nregistrrile care ndeplinesc o anumit
condiie logic, ncepnd cu prima nregistrare din tabel este:
a) While
b) All Like
c) For
4. Linia de comand trebuie scris cu:
a) litere mari

b) litere mici

c) orice tip de liter

5. n adverbul de tip list, separarea elementelor se face prin:


a) punct i virgul
b) virgul

c) spaiu

6. Lansai n execuie un program cu comanda:


a) Modi Comm
b) Do

c) Return

7. Comanda Set clock status:


a) afieaz starea ceasului
b) afieaz ceasul n bara de stare
c) este greit
8. Putei stabili interactiv parametrii sistemului prin intermediul:
a) ferestrei document Trace
b) casetei de dialog Option
c) ferestrei document Project Manager
Rspundei:
1. Ce nseamn compatibil cu standardul dBase?
2. Ce nseamn termenul Visual din numele aplicaiei Visual FoxPro? Ce reprezint aceast tehnic?
3. Ce tipuri de limbaje are implementat Visual FoxPro pe lng limbajul propriu?
4. Ce informaii afieaz bara de stare atunci cnd este selectat un tabel din baza de date?
5. Ce tipuri de adverbe pot fi folosite n linia de comand?
6. Cte forme are comanda Set? Pentru ce tip de parametri se poate folosi fiecare form? Ce formular putei folosi n locul comenzii Set pentru a configura interactiv
mediul de lucru Visual FoxPro?
7. Pentru ce operaii cu fiiere v pune la dispoziie comenzi aplicaia Visual FoxPro?
Ce formular putei folosi n locul comenzilor pentru operaii cu fiiere? Cum deschidei
acest formular?
8. Cte tipuri de autodocumentare folosete Visual FoxPro? Cum putei avea acces la
fiecare tip de help?

spunsuri:

Adevrat/Fals: 1-A; 2-F; 3-A; 4-A; 5-A; 6-F; 7-F; 8-F.


Completai: 1- bara de stare; 2-Command; 3-Database Designer; 4-Next; 5-To Print; 6-Help Erase;
7-caseta de dialog, Filer; 8-dependent.
Alegei rspunsul corect: 1-b; 2-c; 3-c; 4-c; 5-b; 6-b; 7-b; 8-b.

80 Informatic

2. Funcii folosite pentru datele din Visual FoxPro


Tipuri de date

Numeric

Alfanumeric

Logic

Timp

Logical
Character

Memo

Special

General
Date

DateTime

ntreg
Monetar
Real
Currency
Integer
Float

Double

Pentru prelucrarea datelor elementare


(variabile de memorie sau cmpuri) putei
folosi, pe lng operatorii specifici
tipului de dat, i funciile. Acestea pot
fi grupate dup tipul datelor care sunt
folosite ca argumente (parametri de
intrare sau date de intrare prelucrate de
funcie).

2.1. Funcii pentru date de tip numeric


Pentru aceste funcii argumentul este de tip numeric (ntreg sau real). Argumentul poate fi
o variabil sau un cmp numeric, sau o expresie al crui rezultat este numeric.
Funcia

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.

Utilizarea unor instrumente de prelucrarea datelor

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

Prelucrai date numerice cu ajutorul funciilor


1. Evaluai expresii numerice folosind funcia sqrt():

grade

Rtod()

82 Informatic
a + 1- a 1
a + 1+ a 1

(2 a )

pentru a=4. Scriei comenzile:


a=4
e=((sqrt(a+1)-sqrt(a-1))/ (sqrt(a+1)+sqrt(a-1)))*(2-a)
?e
-0.25
(rezultatul afiat)

2. Evaluai expresia:
x2 1
pentru x=3.
x=3
e=sqrt(sqrt(sqrt(x^2-1)))
?e
1.30

3. Evaluai semnul expresiei numerice


cu funciile: sign(), abs():
? abs(-1000)
1000
? sign(-1000)
-1
alfa=-1000
? alfa=sign(alfa)*abs(alfa)
.T.

4.

Aproximai expresia numeric folosind


funciile: ceiling(), floor(), round(),
int():
x=5.253
? floor(x)
5
? int(x)
5
? ceiling(x)
6
? round(x,2)
5.25
? round(x+0.004,2)
5.26
x=-5.25
? floor(x)
-6
? int(x)
-5
? ceiling(x)
-5
? sign(x)

-1
? round(x,2)
-5.25

5. Extragei partea fracionar dintr-un


numr:
x=3.15
? x-int(x)
0.15
x=-3.15
? x-int(x)
-0.15

6. Calculai modulo (restul mpririi)


folosind operatorul % i funcia mod():
? mod(5,2)
1
? 5%2
1
? mod(5,2) = 5%2
.T.
? mod(6.5,3)
0.5
? 6.5%3
0.5

7. Evaluai expresii numerice folosind


funcia sqrt(), log(),log10(), exp():
a=2
b=3
? a^b=exp(b*log(a))
.T.

Utilizarea unor instrumente de prelucrarea datelor


? exp(0)
1
? exp(1)
2.72
? log(1)
0.00
? log(exp(5))
5.00
? exp(log(5))
5.00
? log10(1000)
3.00
? log10(1000^2)
6.00

8. Evaluai funcii trigonometrice folosind funciile: sin(), cos(), tan(), asin(),


acos(), atan(), pi(), rtod(), dtor():
? sin(pi()/2)

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

2.2. Funcii pentru date de tip ir de caractere


Pentru aceste funcii argumentul este de tip ir de caractere. Argumentul poate fi o variabil
sau un cmp ir de caractere, ori o expresie al crei rezultat este un ir de caractere.
Funcia

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.

Funcii care furnizeaz informaii despre un ir de caractere


Len(x)
Furnizeaz un rezultat de tip numeric ce reprezint
lungimea irului de caractere.
Isalpha(x)
Furnizeaz un rezultat de tip logic prin care se testeaz
dac primul caracter din irul de caractere este o liter
(rezultatul este .T. dac primul caracter este o liter).
Isupper(x)
Furnizeaz un rezultat de tip logic prin care se testeaz dac
primul caracter din irul de caractere este o liter mare
(rezultatul este .T. dac primul caracter este o liter mare).
Islower(x)
Furnizeaz un rezultat de tip logic prin care se testeaz dac
primul caracter din irul de caractere este o liter mic
(rezultatul este .T. dac primul caracter este o liter mic).
Isdigit(x)
Furnizeaz un rezultat de tip logic prin care se testeaz
dac primul caracter din irul de caractere este o cifr
(rezultatul este .T. dac primul caracter este o cifr).

84 Informatic
Funcia
Replicate

Space

Sintaxa

Ce reprezint?

Funcii pentru generarea de iruri de caractere


Replicate(x,y)
Argumentul x este de tip ir de caractere, iar argumentul
y este de tip numeric. Funcia furnizeaz un ir de
caractere obinut prin repetarea de y ori a irului de
caractere x.
Space(x)
Argumentul x este de tip numeric. Funcia furnizeaz un
ir de caractere format din x spaii.

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

Funcii pentru transformarea unui ir de caractere


Lower(x)
Furnizeaz un ir de caractere n care literele din irul de carractere x sunt transformate n litere mici.
Upper(x)
Furnizeaz un ir de caractere n care literele din irul de caractere x sunt transformate n litere mari.
Proper(x)
Furnizeaz un ir de caractere n care literele din irul de caractere x sunt transformate astfel: prima liter este mare, iar
celelalte sunt mici.
Chrtran(x,y,z) Argumentele x, y, z sunt de tip ir de caractere. Furnizeaz
un ir de caractere obinut prin transformarea irului de caractere x astfel: toate apariiile primului caracter din irul de caractere y sunt nlocuite cu primul caracter din irul z, toate apariiile celui de-al doilea caracter din irul y sunt nlocuite cu
al doilea caracter din irul z etc. Dac expresia y are mai multe caractere dect expresia z, atunci caracterele care sunt n
plus vor fi transformate n caracterul NULL. Dac expresia z
are mai multe caractere dect expresia y, atunci caracterele
care sunt n plus vor fi ignorate.

Utilizarea unor instrumente de prelucrarea datelor


Funcia
Strtran

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.

Funcii pentru operaii cu subiruri de caractere


Left(x,n)
Argumentul x este de tip ir de caractere, iar argumentul n
este de tip numeric. Furnizeaz un ir de caractere obinut
prin extragerea a n caractere de la stnga irului x.
Right(x,n)
Argumentul x este de tip ir de caractere, iar argumentul n
este de tip numeric. Furnizeaz un ir de caractere obinut
prin extragerea a n caractere de la dreapta irului x.
Substr(x,m,n)
Argumentul x este de tip ir de caractere, iar argumentele n
i m sunt de tip numeric. Furnizeaz un ir de caractere
obinut prin extragerea unui subir de lungime n din irul x,
ncepnd cu poziia m.
At(x,y[,n])
Argumentele x iy sunt de tip ir de caractere, iar argumentul n este de tip numeric. Furnizeaz un rezultat numeric care reprezint poziia n irul y a subirului x. Cutarea se face de la stnga la dreapta, innd cont de diferena dintre
literele mari i mici. Dac se precizeaz argumentul n, se
caut apariia n.
Rat(x,y[,n])
Argumentele x iy sunt de tip ir de caractere, iar argumentul n este de tip numeric. Furnizeaz un rezultat numeric care reprezint poziia n irul y a subirului x. Cutarea se face de la dreapta la stnga, innd cont de diferena dintre
literele mari i mici. Dac se precizeaz argumentul n, se
caut apariia n.
Atc(x,y[,n])
Argumentele x iy sunt de tip ir de caractere, iar argumentul n este de tip numeric. Furnizeaz un rezultat numeric care reprezint poziia n irul y a subirului x. Cutarea se face de la stnga la dreapta, fr s in cont de diferena dintre literele mari i mici. Dac se precizeaz argumentul n, se
caut apariia n.
Atline(x,y)
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

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()

Padc(), Padl(), Padr()

ir cu spaii

ir fr spaii

Alltrim(), Ltrim(), Trim(), Rtrim()

b. Funciile acioneaz n diferite zone ale irului de caractere:


9 la stnga irului: Ltrim(),Padl()
9 la dreapta irului: Trim(), Rtrim(), Padr()
9 la ambele capete ale irului: Alltrim(), Padc()
Ltrim(),Padl()

Trim(), Rtrim(),Padr()

Alltrim(), Padc()

5. Transformarea unui ir de caractere se poate face prin dou tipuri de operaii.


a. transformarea din litere mari n litere mici i invers: Lower(), Upper(), Proper()
b. nlocuirea unor caractere cu alte caractere: Chrtran(), Strtran(), Stuff()

Utilizarea unor instrumente de prelucrarea datelor

87

De exemplu, pentru funcia Strtran():


y - subirul care se nlocuiete

x - irul n care se nlocuiete

z - subirul cu care se nlocuiete

n = 2; nlocuirea se face ncepnd cu a doua apariie


m = 3; numrul de apariii care se nlocuiesc

i pentru funcia Stuff():


subirul care se nlocuiete,
definit prin poziia n i lungimea m

x - irul n care se nlocuiete


n
y - subirul cu care se nlocuiete

Folosind funcia Stuff() putei realiza urmtoarele operaii:


9 inserarea unui ir de caractere, dac m=0;
9 tergerea unui ir de caractere, dac y='' (irul vid).
6. Operaiile cu subiruri de caractere se fac prin trei tipuri de operaii:
a. extragerea unui subir de caractere dintr-un ir se poate face din diferite poziii ale
irului cu funciile : Left(), Right(), Substrr()
n

Left(x,n)

irul x

m
Substr(x,m,n)

Right(x,n)

ntre aceste funcii exist urmtoarele relaii:


9 Left(x,n) = Substr(x,1,n);
9 Right(x,n) = Substr(x,len(x)-n+1,n).
b. cutarea unui subir de caractere ntr-un ir se poate face innd cont de mai multe criterii:
9 cutarea se face pe o singur linie de text:
innd cont de diferena dintre literele mari i mici At(), Rat() sau
fr s se in cont de diferena dintre literele mari i mici Atc()
9 cutarea se face pe mai multe linii de text:
innd cont de diferena dintre literele mari i mici Atline(), Ratline() sau

88 Informatic

fr s se in cont de diferena dintre literele mari i mici Atcline()


cutarea se face n urmtoarele sensuri:
de la stnga la dreapta At (), Atc(), Atline(), Atcline() sau
de la dreapta la stnga Rat (), Ratline()

At(), Atc(),
Atline(),Atcline()

Rat(),
Ratline()

c. determinarea numrului de apariii ale unui subir ntr-un ir: Occurs()

Prelucrai iruri de caractere cu ajutorul funciilor


Vei folosi mai multe funcii pentru iruri de caractere i vei observa rezultatul furnizat de
aceste funcii:
1. Folosii funciile de conversie: asc(),
chr():
? asc ('123')
49 codul ASCII al caracterului 1
? asc ('abc')
97 codul ASCII al caracterului a
? asc('abc')>asc('123')
.T. deoarece 97>49
? asc ('A')
65 codul ASCII al caracterului A
? chr (65)
A
? chr (7)
bip semnal sonor
? asc ('1') = asc('123')
.T.
? 'z'==chr (asc('z'))
.T.
? 122=asc (chr(122))
.T.
? chr(asc('Z')+32)
z

2. Obinei informaii despre un ir de


caractere folosind funciile len(),
isalpha(),
isdigit(),
isupper(),
islower():
x='Albastru'
? len (x)
8
? len ('')

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.

3. Generai iruri de caractere folosind


funciile: replicate (), space():
? replicate ('*',10)
**********
? replicate (chr(7),5)
bip, bip, bip, bip bip
x='Buna'+space(8)+'ziua'
?x
Buna
ziua
? len (x)
16
? replicate(' ',10)=space(10)
.T.

Utilizarea unor instrumente de prelucrarea datelor


4. Eliminai sau inserai spaii i inserai caractere ntr-un ir de caractere folosind funciile: alltrim(), ltrim(),
trim(), rtrim(), padc(), padl(), padr():
x= space(2)+'Popescu'+space(3)
? len (x)
12
? len (alltrim(x))
7
? alltrim(x)=='Popescu'
.T.
? len (ltrim(x))
10
? len (rtrim(x))
9
y= ltrim (x)
? len (y)
10
z=trim (y)
? len (z)
7
a='Salut'
? padc (a,15,'*')
*****Salut*****
? padc (a,16,'*')
*****Salut******
? len(padc (a,15,'*'))
15
? padl (a,10,'*')
*****Salut
? padr (a,10,'*')
Salut*****
? len(padr(a,15,'*'))= len(padl(a,15,' '))
.T.
? len(padr(a,15,'*'))= len(padc(a,15,' '))
.T.

5. Transformai un ir de caractere folosind funciile: lower(), upper(),


proper(), chrtran(), strtran(), stuff():
x= 'abc'
y='ABC'
? upper (x)
ABC
? lower (y)
abc
? lower(y) = x
.T.
? upper(x) = y
.T.

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

6. Executai operaii cu subiruri de


caractere folosind funciile: left(),
right(), substr(), at(), rat(), atc():
x= 'Marea Neagra'
y='untdelemn'
? left (x,5)
Marea
? right (x,6)
Neagra
? left(y,3)
unt
? substr(y,4,2)
de
? right(y,4)
lemn
? left(y,3)=substr(y,1,3)
.T.
? substr(y,len(y)-4+1,4) = right(y,4)
.T.
a='str. Iezerului nr. 32'

? 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

2.3. Funcii pentru date folosite pentru gestionarea timpului


Pentru aceste funcii argumentul
este de tip dat pentru gestionarea timpului sau de tip dat
calendaristic.
Reprezentarea datei calendaristice se poate face n mai multe
formate, conform tabelului.

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

Formatul determin modul n


care este interpretat o dat de
tip dat calendaristic atunci cnd este scris de la tastatur sau atunci cnd este citit
din memorie i afiat pe ecran. Formatul implicit este cel american. Pentru schimbarea
formatului se poate folosi comanda:
Set date to <format>
Pentru an se pot specifica dou sau patru cifre. Formatul implicit este cu dou cifre.
Acest format nu deranjeaz, n special n cazul anilor mai mici de 2000. Se poate cere i
o afiare a anului cu patru cifre folosind comanda:
Set century on
Se poate modifica separatorul folosit n cadrul reprezentrii datei folosind comanda:
Set mark to <delimitator>
Modul n care este afiat data pentru gestionarea timpului poate fi controlat cu
urmtoarele comenzi:

Utilizarea unor instrumente de prelucrarea datelor

91

Set hours to 12|24


care permite stabilirea unui format cu ziua format din 24 de ore sau a unui format cu
ziua mprit n dou perioade de 12 ore (am i pm) i :
Set seconds on|off
care permite afiarea timpului cu secunde (on) sau fr secunde (off).
Funcia

Sintaxa

Ce reprezint?

Date

Date()

DateTime

DateTime()

Time

Time()

Funcii pentru aflarea timpului


Furnizeaz data curent preluat din sistem. Rezultatul este
de tip dat calendaristic.
Furnizeaz data curent i momentul de timp preluate din
sistem. Rezultatul este de tip ir de caractere.
Furnizeaz numai momentul de timp preluat din sistem.
Rezultatul este de tip ir de caractere.

Funcii pentru extragerea informaiilor din dat


Argumentul x poate fi dat calendaristic sau dat pentru gestionarea timpului.
Argumentul y este o dat pentru gestionarea timpului.
Rezultatul poate fi de tip N (numeric) sau C (ir de caractere).

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()

Furnizeaz numrul zilei din lun. Rezultatul este de tip N.


Furnizeaz numrul zilei din sptmn. Rezultatul este de tip N.
Furnizeaz numele zilei din sptmn. Rezultatul este de tip C.
Furnizeaz numrul sptmnii din an. Rezultatul este de tip N.
Furnizeaz numrul lunii din an. Rezultatul este de tip N.
Furnizeaz numele lunii. Rezultatul este de tip C.
Furnizeaz numrul anului. Rezultatul este de tip N (cu patru cifre).
Furnizeaz numrul orei. Rezultatul este de tip N.
Furnizeaz numrul minutelor. Rezultatul este de tip N.
Furnizeaz numrul secundelor. Rezultatul este de tip N.
Furnizeaz numrul secundelor scurse de la miezul nopii.
Rezultatul este de tip N (real, n care partea ntreag reprezint
secundele, iar partea fracionar milisecundele).

Gomonth

Gomonth(x,n)

Funcii pentru modificarea datei


Argumentul x este de tip dat calendaristic, iar argumentul n
de tip numeric ntreg. Funcia furnizeaz un rezultat de tip
dat calendaristic a crei lun este incrementat cu n, dac n este pozitiv i decrementat cu n, dac n este negativ.

Prelucrai date folosite pentru gestionarea timpului:


1. Extragei informaii din timpul sistemului folosind funciile: date(), time(),
timedate():

? 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.

Extragei informaii despre luna din dat


folosind funciile: month(), cmonth():
? month (d)
5
? cmonth (d)
May
? gomonth(d,3)
10/08/01

5. Extragei informaii despre an din dat


folosind funcia: year():
? year(d)
2001

2. Extragei informaii despre ziua din dat folosind funciile: day(), dow(),
cdow():

6. Extragei informaii despre or, minute


i secunde din dat folosind funciile:
hours(), minute(), sec(), seconds():

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

3. Extragei informaii despre sptmna


din dat folosind funcia: week():
? week(d)
19

2.4. Funcii folosite pentru conversii


Pentru a realiza unele operaii este necesar ca un tip de dat s fie transformat ntr-un alt
tip de dat. Transformarea se face folosind funciile pentru conversii. Se pot realiza
urmtoarele conversii:

a. tip numeric tip ir de caractere


Val()
tip numeric

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

Utilizarea unor instrumente de prelucrarea datelor


Funcia

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.

b. tip dat calendaristic tip ir de caractere


Ctod()
tip dat calendaristic

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.

c. tip dat pentru timp tip ir de caractere


Ctot()
tip dat pentru timp

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

tip dat calendaristic


Ttod()

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.

Facei conversii ntre tipuri de date:


1. Convertii numere iruri de caractere folosind funciile: val(), str():
a='10'
b='15'
? a+b
1015
? val(a)+val(b)
25.00
c='-10'
? val(c)
-10
x=val ('10,25')
? type('x')
N
?x
10.00
? val ('10a10')
10.00
a=10
b=15
? a+b
25
? str(a)+str(b)
10
15
? len(str(a)+str(b))

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

2. Convertii date calendaristice iruri


de caractere folosind funciile: dtoc(),
dtos(), ctod():
d1={08/03/01}
d2={07/04/01}
x=dtoc(d1)
?x
08/03/01
y=dtoc(d2)

Utilizarea unor instrumente de prelucrarea datelor


?y

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.

3. Convertii data calendaristic moment de timp folosind funciile: dtot(),


ttod():
a=datetime()
? ttod(a)
02/03/01
b=date()
? dtot(b)

95

4.

Convertii ir de caractere moment de timp folosind funciile: ctot(),


ttoc():
a=datetime()
?a
02/03/01 04:52:12 PM
b = ttoc(a)
?b
02/03/01 04:52:12 PM
?type('b')
C
c=ctot(b)
?c
02/03/01 04:52:12 PM
?type('c')
T

2.5. Funcii de uz general


Aceste funcii se pot aplica pe mai multe tipuri de date:
Funcia
Min()
Max()
Between()

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.

Prelucrai date de tipuri diferite cu ajutorul funciilor generale


1. Atribuii o valoare ntreag unei variabile de memorie i verificai dac acel numr
este divizibil prin 3:
a=1
b1='Numarul este divizibil prin 3'
b2='Numarul nu este divizibil prin 3'
? iif(a % 3 = 0, b1, b2)
Numarul nu este divizibil prin 3
a=9
? iif(a % 3 = 0, b1, b2)
Numarul este divizibil prin 3

2. Testai dac o variabil de memorie este vid:

Utilizarea unor instrumente de prelucrare a datelor

97

b1='Variabila de memorie este vida'


b2='Variabila de memorie nu este vida'
a=''
? iif(empty(a), b1, b2)
Variabila de memorie este vida
a=0
? iif(empty(a), b1, b2)
Variabila de memorie este vida
a=date()
? iif(empty(a), b1, b2)
Variabila de memorie nu este vida

3. Calculai maximul i minimul:


a=1
b=2
c=3
? max(a,b,c)
3
? min(a,b,c)

1
? max('a','b','c')
c
? min('a','b','c')
a

4. Testai dac un element exist n list:


a=1
c=inlist(a,1,2,3,4,5)
b1='Elementul este in lista'
b2='Elementul nu este in lista'
?iif(c,b1,b2)
Elementul este in lista
a=10
c=inlist(a,1,2,3,4,5)
?iif(c,b1,b2)
Elementul nu este in lista

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

5. Testai dac o variabil de memorie aparine unui interval:


a='a'
c=between(a, 'a','z')
b1='litera mica'
b2='litera mare'
? iif(c,b1,b2)
litera mica
a='M'
c=between(a, 'a','z')
? iif(c,b1,b2)

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>

2. introducerea unei valori de la tastatur, folosind comenzile:


9 Accept. Este recomandat pentru tipul de date ir de caractere.
9 Input. Este recomandat pentru tipul de date numeric.
9 Wait. Este recomandat pentru un singur caracter. Sistemul ateapt acionarea
unei taste. Caracterul tastei acionate poate fi pstrat ntr-o variabil de memorie.
Aceste trei comenzi au sintaxa:
Accept | Input | Wait [<expresie>] to <nume_variabil>
Adverbul <expresie> este opional i este de tip ir de caractere. El reprezint un mesaj
afiat pe ecran, ca un prompter, care informeaz utilizatorul despre operaia de introducere date care urmeaz s se execute.
Consultarea unei variabile de memorie nseamn vizualizarea coninutului ei pe ecran
sau la imprimant. Pentru vizualizarea pe ecran putei folosi comenzile:
9 ?. naintea afirii, cursorul este poziionat pe rndul urmtor.
9 ??. naintea afirii, cursorul rmne n poziia curent. Cele dou comenzi au sintaxa:
? | ?? <list_nume_variabile>
Pentru vizualizarea la imprimant putei folosi comanda:
9 ???. Comanda trimite ctre imprimant un ir de caractere exprimat printr-o
expresie de tip ir de caractere care poate conine i variabile de memorie:
??? <expresie>

Utilizarea unor instrumente de prelucrare a datelor

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:

1. pentru eliberarea global (tergerea tuturor variabilelor de memorie):


9 Comanda Clear Memory terge toate variabilele de memorie i toate tablourile de
memorie, lsnd numai variabilele de sistem.
9 Comanda Clear All terge i ea toate variabilele de memorie i toate tablourile de
memorie, lsnd numai variabilele de sistem. Suplimentar elibereaz i celelalte
zone de memorie ocupate de diferite obiecte Visual FoxPro: meniuri, ferestre,
controale definite de utilizator i tabele ale bazei de date deschise, inclusiv fiierele
folosite pentru exploatarea bazei de date.

2. pentru eliberarea selectiv (tergerea anumitor variabile de memorie) vei folosi


una dintre urmtoarele comenzi (alegerea se va face n funcie de modul n care
putei s descriei grupul de variabile de memorie):
9 Comanda Release All terge variabilele de memorie i tablourile de memorie
precizate printr-un ablon: variabilele terse pot s corespund ablonului (Like)
sau pot s nu corespund ablonului (Except). Sintaxa comenzii este:
Release All [Like | Except <ablon>]
9 Comanda Release terge variabilele de memorie i tablourile de memorie
precizate printr-o list. Vei alege aceast comand dac nu putei s descriei
grupul de variabile de memorie printr-un ablon. Sintaxa comenzii este:
Release <list_nume_variabile>
La nchiderea sesiunii de lucru
Save to
Visual FoxPro, are loc o tergere
memoria intern
memoria extern
a coninutului memoriei interne
(variabile
de
memorie)
(fiier .mem)
alocat aplicaiei i se pierde
coninutul variabilelor de memoRestore from
rie folosite. Ele pot fi salvate
(save) ntr-un fiier (cu extensia .mem) de unde pot fi readuse ulterior n memoria intern,
operaie numit restaurare (restore). Comenzile folosite pentru aceste operaii sunt:
9 Comanda Save to salveaz ntr-un fiier identificat prin nume toate variabilele de memorie sau numai cele care corespund (Like) sau nu corespund (Except) unui ablon:
Save to <nume_fiier> [All Like | Except <ablon>]
1

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]

Prelucrai variabile de memorie


1. Creai variabile de memorie; nainte de a crea aceste variabile de memorie eliberai
memoria de orice alte variabile de memorie create anterior:
clear memory
store 0 to a1, a2, a3
store .T. to b1, b2
x1='alfa'
x2='beta'
a1=2
a2=7

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

2. Consultai variabilele de memorie:


? a1, a2, a3
2 7 14
?? a1, a2, a3
2 7 14 ( pe acelai rnd cu rspunsul comenzii precedente)
? nume, varsta
Popescu
18
? b1, b2, b3, x1, x2
.T. .T. x alfa beta
list memory like a?
a1
Pub
N
2
( 2.00000000)
a2
Pub
N
7
( 7.00000000)
a3
Pub
N
14
( 14.00000000)
list memory like ?1
a1
Pub
N
2
( 2.00000000)
b1
Pub
L
.T.
x1
Pub
C
"alfa'

3. Eliberai memoria intern :


display memory
sunt afiate informaii despre toate
variabilele definite anterior: a1, a2,
a3, b1, b2, b3, x1, x2, nume, vrsta
release varsta, nume
display memory
sunt afiate informaii despre
variabilele rmase: a1, a2, a3, b1,
b2, b3, x1, x2
release all like a?
display memory

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

Utilizarea unor instrumente de prelucrare a datelor

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)

Ce realizeaz aceast secven de comenzi? Scriei secvena de comenzi ntr-un fiier


de tip program executabil cu numele alfa. Folosii comanda:
modify command alfa
Executai programul pentru fiecare valoare a tripletului (a,b,c) din mulimea de definiie.
Pentru executarea programului folosii comanda:
do alfa
5. Testai urmtoarea secven de instruciuni pentru mai multe valori ale variabilelor a,
b i c, definite astfel: (a,b,c) {(2,3,4), (5,3,4), (2,3,3), (2,1,4)}
input 'a= ' to a
input 'b= ' to b
input 'c= ' to c
x=a^2
y=b^2
z=c^2
b1='nu este triunghi'
b2='triunghi dreptunghic'
b3='triunghi ascutitunghic'
b4='triunghi optuzunghic'
c1=a+b>c and b+c>a and c+a>b
c2=x+y=z or y+z=x or z+x=y
c3=x+y>z and y+z>x and z+x>y
c4=x+y<z or y+z<x or z+x<y
? iif(c1, iif( c2,b2, iif(c3,b3, iif(c4,b4,''))),b1)

Ce realizeaz aceast secven de comenzi? Scriei secvena de comenzi ntr-un fiier


de tip program executabil cu numele beta. Folosii comanda:
modify command beta
Executai programul pentru fiecare valoare a tripletului (a,b,c) din mulimea de definiie.
Pentru executarea programului folosii comanda:
do beta
nlocuii ultima comand din program cu comanda:
? iif(c1, iif( c2,b2, iif(c3,b3,b4)),b1)
Reluai execuia programului modificat pentru fiecare valoare a tripletului (a,b,c) din
mulimea de definiie. Ce constatai?

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.

Funcia mod(10,5) furnizeaz rezultatul


Funcia len(padc(5,'alfa')) afieaz valoarea ......
Funcia occurs('a','calamar') afieaz rezultatul ...............
Funcia prin care convertii un numr ntr-un ir de caractere se numete ........
Pentru a extrage n caractere dintr-un ir de caractere folosii funcia ..............
Funcia str() cu care putei s obinei irul de caractere 123 din numrul 123.45 este ....
Pentru a obine valoarea numeric 23 din irul de caractere .1234 vei folosi funciile: ......
Pentru a obine valoarea 23 din numrul 1234 vei folosi funciile .............

Alegei rspunsurile corecte:


1. Funcia ceiling(-3.5) afieaz:
a) -3
b) -4
2. Funcia round(3.5) afieaz:
a) 3
b) 4

c) 4
c) eroare

Utilizarea unor instrumente de prelucrare a datelor

103

3. Funcia floor(3.5) afieaz:


a) 3
b) 3.5
c) 4
4. Funcia int(-3.5) afieaz:
a) -3
b) -4
c) 3
5. Secvena de comenzi set decimals to 3 i ?pi() afieaz:
a) 3.1
b) 3.14
c) 3.142
6. Funcia inlist(1, 2, 3, 4) furnizeaz rezultatul:
a) .T.
b) .F.
c) 10
7. Funcia between(1, 2, 3) furnizeaz rezultatul:
a) .T.
b) .F.
c) 6
8. Funcia type('2B') furnizeaz rezultatul:
a) N
b) C
c) U
9. Data d are valoarea {05/04/01} n formatul american. Rezultatul furnizat de funcia
min(day(d)-2, month(d)-2,year(d)) are valoarea:
a) 1
b) 2
c) 3
10. Funcia strtran('ala bala','a','o',2,1) furnizeaz rezultatul:
a) olo bala
b) alo bala
c) alo bolo
11. Funcia str (12345,3, 2) furnizeaz rezultatul:
a) 123.45
b) 12.345
c) eroare
12. Care dintre urmtoarele expresii logice va furniza rezultatul .T. dac i numai dac
expresia w ncepe cu un caracter special:
a) not (isalpha(w) and isdigit(w))
b) not (isalpha(w) or isdigit(w))
c) not isalpha(w) and not isdigit(w)
d) not isalpha(w) or not isdigit(w)
13. Dac x='1234.56a', funcia val (left(x,6)) furnizeaz rezultatul:
a) 1234.56
b) 1234.50
c) eroare
14. Dac x='10.5' i y=',25', pentru a obine valoarea numeric 10.25 folosii:
a) val(left(x,2)+y)
b) val(left(x,2))+val(y)
c) val(x+y)-0.25
d) val(x+y)
Rspundei:
Cum putei afia o expresie la imprimant? De ce tip trebuie s fie expresia?
Ci parametri are funcia round()? Ce se ntmpl dac lipsete un parametru?
Ci parametri are funcia string()? Ce se ntmpl dac lipsete un parametru?
Ce funcii putei folosi pentru a testa primul caracter dintr-un ir de caractere?
Ce funcii putei folosi pentru a genera un ir de caractere?
Ce funcii putei folosi pentru a elimina spaiile dintr-un ir de caractere? Ce criterii de
comparare putei folosi pentru aceste funcii?
7. Ce funcii putei folosi pentru a insera un subir de caractere ntr-un ir de caractere?
8. Ce funcii putei folosi pentru a terge un subir de caractere ntr-un ir de caractere?
9. Ce funcii putei folosi pentru a descompune un cuvnt compus n cuvintele care l compun?
10. Cu ce comand putei stabili formatul unei date calendaristice? Cum se numete formatul zz/ll/aa?
1.
2.
3.
4.
5.
6.

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.

est pentru evaluare:

1. Creai variabilele de memorie a1 de tip numeric, a2 de tip ir de caractere, a3 de tip


dat calendaristic i a4 de tip logic. Variabilele de memorie trebuie s fie vide.
Verificai c ai definit corect variabilele de memorie afind tipul i dac sunt vide.
2. Vizualizai coninutul variabilelor de memorie create.
3. Aflai ce tip de rezultat furnizeaz funcia Seconds().
4. Modificai coninutul variabilei de memorie astfel nct s-i pstreze tipul. n cele
patru variabile de memorie vei pstra urmtoarele informaii:
a1 - numrul de secunde scurse de la miezul nopii,
a2 - un ir de caractere format din 10 grupuri de caractere *1!,
a3 - data curent,
a4 - rezultatul comparrii expresiilor e1 i e2: e1 = (72/5+5)*5 i e2 = (40-6+2*8)*2
Vizualizai coninutul variabilelor de memorie i verificai dac i-au pstrat tipul.
Vizualizai variabila de memorie de tip dat calendaristic n formatul zz/ll/aa.
5. Afiai pe ecran o linie cu urmtorul coninut:
zz/ll/aa ********** Buna ziua ********** hh:mm:ss
Afiarea se va face printr-o singur comand, fr a folosi variabile de memorie.
6. Copiai coninutul variabilelor de memorie a1, a2, a3 i a4 n variabilele de memorie
b1, b2, b3 i b4.
7. Afiai urmtoarele informaii:

Utilizarea unor instrumente de prelucrare a datelor

105

9 partea ntreag din numrul memorat n variabila de memorie b1,


9 numrul memorat n variabila de memorie b1, rotunjit la partea ntreag, prin adugare,
9 numrul memorat n variabila de memorie b1, rotunjit la partea ntreag, prin pierdere,
Extragei partea fracionar din numrul memorat n variabila de memorie b1.
8. Memorai n variabilele de memorie a1, a2, , a6 cuvintele din urmtorul text:
Uf! Am terminat o saptamana obositoare
Folosind macrosubstituia prin intermediul variabilei de memorie z, afiai textul pe ecran.
Memorai textul n variabila de memorie w.
9. Afiai textul:
Uf! Am terminat o saptamana obositoare!!!
astfel nct la sfritul tipririi s se aud un semnal sonor.
10. Folosind textul din variabila de memorie w, scriei pe ecran urmtoarele texte:
Uf! Am Terminat O Saptamana Obositoare!!!
uf! am terminat o saptamana obositoare!!!
UF! AM TERMINAT O SAPTAMANA OBOSITOARE!!!
uf! Terminat OBOSITOARE
11. Verificai dac exist irul de caractere oa n variabila de memorie w. Dac exist,
aflai poziia n care se gsete. Executai operaia n dou moduri.
12. Afiai n ce zi a sptmnii suntem.
13. Afiai cte zile mai sunt pn la sfritul anului. Afiai cte sptmni mai sunt
pn la sfritul anului sub forma urmtorului mesaj:
Mai sunt nn saptamani si m zile.
Unde nn reprezint numrul de sptmni, iar m numrul de zile.
===== hh:mm:ss =====
14. Afiai ora sub forma unui ir de caractere:
Executai operaia n patru moduri diferite.
15. Construii variabila de memorie t care conine urmtorul ir de caractere: 5 spaii, ora
i 5 spaii. Afiai coninutul irului i lungimea lui.
16. Eliminai spaiile din irul de caractere memorat n variabila t. Executai operaia n dou
moduri diferite. Memorai irul de caractere fr spaii n variabila de memorie u.
Comparai lungimile celor dou iruri de caractere. Afiai diferena dintre lungimile lor.
17. Transformai printr-o funcie pentru date de tip ir de caractere urmtoarele cuvinte:
copac capac i capac copac. Executai operaia n dou moduri diferite.
18. Scriei un program care s rezolve urmtoarea problem:
Pentru executarea unei piese sunt necesare x minute. Afiai timpul necesar confecionrii a n piese, exprimat n numr de zile, ore i minute. La fabricarea pieselor se
lucreaz n ritm continuu (24 de ore pe zi).
19. Afiai lista cu variabilele de memorie pe care le-ai creat. n aceast list se gsesc
i variabilele de memorie definite n programul de la punctul 18. De ce?
20. tergei variabilele de memorie a1, b2 i u. Verificai c operaia s-a executat corect.
21. tergei variabilele de memorie b1, b3 i b4. Verificai c operaia s-a executat
corect.
22. tergei toate variabilele de memorie, mai puin variabila t. Verificai c operaia s-a
executat corect.
23. Eliberai memoria intern.

106 Informatic

spunsuri:

1) a1=0 | a2=space(0) | a3={ / / } | a4=.F. | ? empty(a1) | ? empty(a2) | ? empty(a3) |


? empty(a4) | ? type('a1'), a1 | ? type('a2'), a2 | ? type('a3'), a3 | ? type('a4'), a4
2) ? a1 | ? a2 | ? a3 | ? a4
3) ?type('seconds()')
4) a1=seconds() | a2=replicate('*1!',10) | a3=date() | a4=((75/5+5)*5=(40-6+2*8)*2)
? type('a1'), a1 | ? type('a2'), a2 | ? type('a3'), a3 | ? type('a4'), a4 | set date to british | ?a3
5) ?dtoc(Date())+' '+replicate('*',10)+' Buna ziua '+replicate('*',10)+' '+time()
6) b1=a1 | b2=a2 | b3=a3 | b4=a4
7) ?int(b1) | ?floor(b1) | ?ceiling(b1) | ?b1-int(b1) sau ?mod(b1,int(b1))
8) b1=a1 | b2=a2 | b3=a3 | b4=a4 | z='a' | a1='Uf! ' | a2='Am ' | a3='terminat ' | a4='o ' |
a5='saptamana ' | a6='obositoare' | ?&z.1+&z.2+&z.3+&z.4+&z.5+&z.6 |
w=&z.1+&z.2+&z.3+&z.4+&z.5+&z.6
9) ?w+'!!!'+replicate(chr(7),5)
10) ?proper(w)+'!!!' | ?lower(w)+'!!!' | ?upper(w)+'!!!' |
?left(lower(w),4)+substr(proper(w),8,9)+right(upper(w),10)
11) ?at('oa',w) | ?rat('oa',w)
12) ?dow(date())| ?cdow(date())
13) dif={31/12/01}-date() | ?dif | spt=int(dif/7) | ?spt | zile=mod(dif,7) | ?zile |
?str(spt,2)+' saptamani si '+str(zile,1)+' zile' |
?str(spt,2)+' saptamani si '+str(zile,1)+iif(zile=1,' zi',' zile')
14) ?padc(time(),18,'=') | ?padl(padr(time(),13,'='),18,'=') | ?replicate('=',5)+time()+replicate('=',5) |
?'====='+time()+'====='
15) t=space(5)+time()+space(5) | ? t | ? len(t)
16) ?alltrim(t) sau ?ltrim(rtrim(t)) | u=alltrim(t) | ?len(u) | ?len(t) | ?len(u)=len(t) | ?len(t)>len(u)
17) ?chrtran('copac','o','a') sau ?strtran('copac','o','a') |
?strtran('capac','ap','op') sau ?stuff('capac',2,1,'o')
18) Creai fiierul cu programul folosind comanda modify command timp.
Scriei n fereastra de editare urmtoarele comenzi:
input 'timp executie piesa ' to x
nr_ore=nr_tot_ore%24
input 'numar piese executate ' to n
? 'timpul necesar executarii pieselor este
t=x*n
de:'
nr_min=t%60
? nr_zile, 'zile', nr_ore, 'ore', nr_min,
nr_tot_ore=int(t/60)
'minute'
nr_zile=int(nr_tot_ore/24)
Salvai comenzile scrise. Lansai n execuie programul cu comanda do timp. Introducei valori
pentru x i n (de exemplu 50 de minute i 100 de piese).
19) display memory | nu se gsesc i variabilele de memorie create n program, deoarece la terminarea execuiei programului, zona de memorie alocat lui se elibereaz, inclusiv zona ocupat de
variabilele de memorie create de el. Efectul este pierderea valorii acestor variabile de memorie.
20) release a1, b2, u | display memory
21) release all like b? | display memory
22) release all except t | display memory
23) clear memory | display memory

Utilizarea unor instrumente de prelucrare a datelor

107

4. Operaii cu datele dintr-un tabel al bazei de date


Exploatarea unui tabel const n:
9 Operaii de actualizare cum sunt cele de adugare a unei noi nregistrri, de
tergere a unei nregistrri sau de modificare a valorii unor cmpuri din nregistrri.
9 Operaii de consultare (interogare) prin care se pot obine informaii din tabel.
Aceste operaii presupun i operaii de cutare a anumitor nregistrri. Operaiile de
cutare trebuie s precizeze criteriul de cutare i modul de afiare a informaiilor
(pe ecran, la imprimant etc.). Operaia de consultare este posibil s necesite n
prealabil o operaie de sortare (de reordonare fizic a nregistrrilor din tabel).
Exploatarea unui tabel se poate face:
9 Secvenial, adic n ordinea fizic a nregistrrilor (ordinea n care au fost scrise
n tabel).
9 n acces direct, adic n ordinea logic a nregistrrilor (ordinea dat de valoarea
cresctoare sau descresctoare a unui cmp din tabel). Pentru a avea acces direct,
nregistrrile din tabel trebuie ordonate logic. Ordonarea logic se face prin crearea
unui fiier numit fiier de index care memoreaz ordinea logic a nregistrrilor.
Observaie:
Sortarea este operaia de ordonare fizic a nregistrrilor dintr-un tabel. Prin aceast
operaie se creeaz un nou tabel n care nregistrrile sunt scrise conform criteriului de
ordonare precizat. Indexarea este operaia de ordonare logic a nregistrrilor dintr-un
tabel. Prin aceast operaie se creeaz un fiier special asociat tabelului, numit fiier de
index care se exploateaz mpreun cu tabelul (se deschide i se nchide mpreun cu
acesta) i care pstreaz evidena ordinii logice a nregistrrilor. El are dou cmpuri: un
cmp care conine valoarea cmpului folosit pentru indexare (care determin ordonarea)
numit i cheie de indexare i un cmp cu numrul nregistrrii din tabel n care se
gsete cmpul. Acest fiier este ordonat cresctor sau descresctor dup valoarea cheii
de indexare:
nr. nreg.
1
2
3
4
5
6
7
8

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:

1. Crearea unui tabel care cuprinde operaii pentru:


9 crearea structurii tabelului,
9 manipularea structurii tabelului;
2. Exploatarea unui tabel n acces secvenial care cuprinde operaii pentru:
9 localizarea nregistrrilor prin parcurgere secvenial a nregistrrilor din tabel,
9 actualizarea tabelului,
9 controlarea accesului la nregistrri,
9 consultarea tabelului;

3. Exploatarea unui tabel n acces direct care cuprinde operaii pentru:


9 crearea i administrarea fiierelor index,
9 localizarea nregistrrilor dup valoarea unei chei.
Observaie:
Toate comenzile au un domeniu implicit de aciune. Domeniul implicit de aciune poate
fi schimbat prin explicitarea cu adverbele care sunt scrise ntre parantezele ptrate [ ].

Utilizarea unor instrumente de prelucrare a datelor

109

4.1. Crearea tabelului


Un tabel poate fi creat n interiorul unei baze de date ca tabel al bazei de date sau n
afara ei ca tabel liber. Ulterior, tabelul liber poate fi adugat la o baz de date. n
continuare vor fi prezentate metodele prin care putei crea tabele libere. n general,
aceste metode pot fi folosite i n cadrul unei baze de date. Deosebirea este c pentru un
tabel liber nu putei stabili reguli de validare i nici chei primare, aa cum putei face
pentru tabelele din baza de date. Crearea unui tabel se face n dou etape:
9 crearea structurii tabelului,
9 introducerea datelor n tabel, conform structurii definite.
La definirea structurii tabelului poate fi definit i indexul structural compus. Acest index se
numete compus deoarece poate conine mai multe chei de indexare numite etichete
index (tag). La un moment dat se poate folosi o singur cheie de indexare dintre cheile
definite, adic o singur etichet este activ. Se numete structural deoarece are acelai
nume ca i tabelul. Extensia sa este .cdx. El se creeaz automat la crearea tabelului dac
definii o etichet de index i se deschide automat mpreun cu tabelul. Este actualizat
automat dup fiecare operaie de actualizare a tabelului (tergerea sau adugarea unei
nregistrri sau modificarea cmpurilor dintr-o nregistrare). Indecii pot fi:
9 Primary - cheia primar. Se poate folosi numai n cazul n care tabelul se gsete
ntr-o baz de date. Numai un singur index poate fi folosit pentru cheia primar.
9 Candidate - cheia candidat. Este o cheie care poate deveni cheie primar deoarece
nu conine valori duplicate i nici valori nule. i ea este util numai n baza de date.
9 Unique - cheia unic. Este o cheie care se consider c nu conine valori
duplicate. Dac exist dou nregistrri cu aceeai valoare a cheii unice, va fi
vizibil logic numai prima dintre ele, chiar dac fizic exist amndou.
9 Regular - cheia obinuit.
Folosind indexarea putei:
9 s ordonai nregistrrile afiate din tabel (indexul poate fi cheie obinuit, candidat
sau cheie primar);
9 s controlai valorile duble introduse ntr-un cmp (indexul poate fi cheie candidat
sau primar pentru baze de date i cheie candidat pentru tabelele libere);
9 s definii relaii ntre tabele (indexul poate fi cheie obinuit, candidat sau primar).

4.1.1. Crearea structurii tabelului


n urma operaiei de creare, tabelul este deschis automat. Crearea structurii unui tabel se
poate face prin mai multe metode:
1. Prin definirea structurii:
9 interactiv - structura se definete prin intermediul controalelor din fereastra document
a generatorului de tabele Table Designer; deschiderea ferestrei se poate face fie prin
intermediul opiunii de meniu New...File, fie prin intermediul comenzii:
create <nume_tabel>
9 folosind limbajul de comand - structura se definete prin intermediul adverbelor
din comanda SQL:
create table <nume_tabel> (<nume_cmp1> <tip1> (<lime1> [,<poz_zec1>]
[<nume_cmp2> <tip2> (<lime2> [,<poz_zec2>]...]

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.

4.1.2. Manipularea structurii tabelului


Manipularea structurii unui tabel se face prin urmtoarele operaii:
1. Afiarea structurii tabelului:
Structura tabelului poate fi afiat cu comenzile list structure i display structure.
Deosebirea dintre aceste dou comenzi const n modul n care se face afiarea:
comanda display structure afieaz n regim paginat (dup umplerea ecranului se
ateapt confirmare din partea utilizatorului pentru a continua afiarea), iar comanda list
structure afieaz n regim de defilare (este derulat pe ecran toat informaia chiar
dac depete capacitatea de afiare a ecranului; se vor putea vedea astfel numai
ultimele cmpuri din tabel). Comenzile au aceeai sintax:
display | list structure [to printer | to file <nume_fiier>] [no console]
Domeniul implicit al comenzii se refer la faptul c afiarea se face pe ecran. Explicit, afiarea
se poate face i la imprimant sau ntr-un fiier (adverbele to printer sau to file), sau numai
la unul dintre acestea, inhibndu-se ieirea ctre ecran (adverbul no console).
2. Modificarea structurii tabelului:
Se poate modifica structura unui tabel deschis n prealabil folosind comanda:
modify structure
Se deschide caseta de dialog Table Designer care conine aceleai controale ca i la
crearea tabelului. Putei s facei urmtoarele modificri:
9 s inserai cmpuri noi,
9 s tergei cmpuri,
9 s modificai caracteristicile unui cmp (nume, tip, lungime).
naintea modificrilor, aplicaia salveaz datele din tabel ntr-un fiier cu acelai nume i
cu extensia .bak pentru tabel i .tbk pentru fiierul memo asociat tabelului (care conine
valorile pentru cmpurile memo). Dup efectuarea modificrilor de structur, datele vor fi

Utilizarea unor instrumente de prelucrare a datelor

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.

4.1.3. Manipularea i controlarea cmpurilor dintr-un tabel


Cmpurile dintr-un tabel pot fi manipulate i controlate prin intermediul comenzilor Set i
al funciilor.
1. Prin intermediul comenzilor set se poate controla accesul la cmpuri:
9 Controlul accesului la cmpuri poate fi activat (on) sau inhibat (off) cu comanda:
set fields on|off
Valoarea implicit este off.
9 Se pot preciza cmpurile la care poate avea acces utilizatorul cu comanda:
set fields to [<list_cmpuri> | all]
De exemplu:
a. Se poate preciza c utilizatorul are acces la toate cmpurile:
set fields to all
sau
set fields off
b. Se poate preciza c utilizatorul are acces numai la cmpurile nume i pren:
set fields to nume, pren
c. Se poate preciza c utilizatorul nu are acces la nici un cmp:
set fields to

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().

4.1.4. Cmpurile memo


Ai aflat c un cmp memo se folosete pentru pstrarea textelor (a irurilor de caractere
cu lungime variabil sau mai mare de 255 de caractere). Ai mai aflat c ele se pstreaz
ntr-un fiier separat, asociat tabelului (are acelai nume cu tabelul, are extensia .fpt i
este deschis i nchis mpreun cu tabelul). Cmpul memo din tabel memoreaz de fapt
adresa la care se gsesc datele din cmp n fiierul memo.
Utilizatorul poate ncrca datele ntr-un cmp memo:
9 de la tastatur,
9 dintr-un fiier,
9 din memoria intern (dintr-o variabil de memorie).
Introducerea unui cmp memo de la tastatur se face prin intermediul fetrestrei de editare a unui cmp memo. Dac este deschis o fereastr de editare a tabelului, deschidei
fereastra de editare memo poziionnd cursorul pe cmp i executnd dublu clic sau
apsnd tastele Ctrl+PageDown| PageUp. Dac nu este deschis fereastra de editare a
tabelului, poziionai pointerul de nregistrare pe nregistrarea n care vrei s scriei valoarea cmpului memo i deschidei fereastra de editare memo cu comanda:
modify memo <nume_cmp>
Preluarea unui cmp memo dintr-un fiier cu texte (extensia .txt) se face cu comanda:
append memo <nume_cmp> from <nume_fiier> [overwrite]
Fiierul din care se preia valorea se identific prin <nume_fiier>. ncrcarea valorii se
face implicit la sfritul textului care exist deja. Explicit se poate rescrie peste vechiul
coninut cu clauza [overwrite]. Comanda complementar este cea de copiere a valorii
unui cmp memo ntr-un fiier text:
copy memo <nume_cmp> to <nume_fiier> [additive]
Preluarea unui cmp memo dintr-o variabil de memorie se face cu comanda:
replace <nume_cmp> with <nume_variabil>
Comanda complementar este cea de copiere a valorii unui cmp memo ntr-o variabil
de memorie, folosind operaia de atribuire.

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.

Utilizarea unor instrumente de prelucrare a datelor

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.

Utilizarea unor instrumente de prelucrare a datelor

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

Utilizarea unor instrumente de prelucrare a datelor

117

Creai un tabel definind structura interactiv:


Creai structura tabelului Angajai:
Deschidei caseta New cu opiunea New...File. Activai
butonul radio Table i apoi executai clic pe butonul New File.
Se deschide caseta de dialog Create care conine aceleai
controale ca i o caset de dialog de tip Save As. Alegei
din lista ascuns Save As Type tipul de fiier Table/DBF.
Scriei n caseta de text Enter table numele tabelului
Angajai. Executai clic pe declanatorul Save.
Se deschide fereastra generatorului de tabele Table Designer. Seciunea Table conine controalele prin care definii
structura tabelului. Structura de cmpuri o definii n grila derulant care are cinci coloane. n coloana Name scriei numele
cmpului n caseta de text (de exemplu id_ang). Numele trebuie s conin numai litere, cifre i linie de subliniere. Atunci
cnd creai un tabel liber, numele nu trebuie s depeasc
10 caractere, iar cnd definii un tabel ntr-o baz de date,
poate s aib pn la 128 de caractere. n coloana Type alegei din lista ascuns tipul
cmpului (de exemplu Integer). Dimensiunea cmpului este prestabilit. Nu se pot
accepta valori nule n acest cmp. Verificai s nu fie activat comutatorul din coloana
NULL.
Repetai aceste operaii pentru toate cmpurile din tabel.
Coloanele grilei reprezint proprieti ale cmpului pe care l definii.

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.

Tipul de index ales Scriei expresia cheii de


este Regular.
indexare: nume+prenume.

Comutatoare:
Insert - insereaz un
index deasupra indexului
selectat;
Delete - terge indexul
selectat;

Butonul Move care v permite s mutai un rnd


care definete un index.

n zona Expression trebuie s definii cheia de indexare. Ea poate s conin maxim


240 de caractere i poate fi format dintr-un singur cmp (expresie simpl) sau poate
s fie obinut prin concatenarea mai multor cmpuri (expresie complex). Deoarece
nu se pot concatena dect cmpuri de tip ir de caractere, trebuie s convertii
celelalte cmpuri n tipul ir de caractere. Pentru a v uura munca de construire a
unei expresii complexe de indexare, putei s facei apel la constructorul de
expresii (Expression Builder). Aadar, fie scriei expresia, fie executai clic pe buton
ca s se deschid caseta de dialog Expression Builder.
Expresia se construiete n caseta de text
Expression. Folosind controalele putei
alege numele unui cmp (n lista Fields
executai dublu clic pe numele cmpului),
numele unei variabile de memorie sistem
sau utilizator (executai dublu clic pe numele variabilei din lista Variables), tabelul
(l alegei din lista ascuns From Table).
Din grupul de liste ascunse Function
alegei funcia pe care o vei folosi n
expresie. Ea poate fi o funcie matematic
(Math), o funcie pentru iruri de caractere
(String), o funcie logic sau un operator
relaional (Logical) sau o funcie pentru
date calendaristice (Date). n momentul n
care alegei o funcie (executnd clic pe
numele ei) vor fi afiate i parantezele ().
Scriei parametrii ntre paranteze.

Utilizarea unor instrumente de prelucrare a datelor

119

Dup ce ai definit toat structura tabelului, o salvai acionnd declanatorul Ok. Se


deschide caseta de dialog prin care suntei ntrebai dac vrei s introducei date:
Input data records now? Executai clic pe declanatorul Yes. Se deschide o fereastr de editare a tabelului, de tip browse. Scriei cinci nregistrri:
100, Popescu, Andrei, a, 100, 300000, 02/03/1960, 04/08/1995, / / , Str. Morilor nr. 50
sector 2, Bucuresti, B, 23451, 014567890, 092111111,
101, Andronescu, Ana, a, 100, 280000, 09/05/1958, 09/15/1996, / / , Str. Cuza Voda nr.
20 sector 1, Bucuresti, B, 23456, 012345678, 092122222,
102, Ionescu Maria, a, 100, 280000, 03/01/1961, 03/15/1998, / / , Str. Zorilor nr. 23 sector
4, Bucuresti, B, 34561, 012346789, 093189467,

200, Petrescu Radu, a, 200, 280000, 03/08/1964, 06/15/1998, / / , Soseaua


Mangalia nr. 34, Constanta, Ct, 34512, 041123123, 092134567,
201, Popescu Mihai, a, 200, 250000, 01/01/1965, 09/15/1998, / / , Str. Lujerului
nr. 56, Constanta, Ct, 34562, 041237893, 092341561,

nchidei apoi fereastra de editare.

Creai un tabel definind structura prin intermediul comenzii SQL:


Creai tabelul Judee folosind comanda SQL:
create table judete (c_jud c (2), n_jud C (15))
Creai un tabel prelund structura dintr-un alt tabel:
Creai tabelul Clieni prin preluarea unor cmpuri din tabelul Angajai:
Deschidei tabelul Angajai cu comanda:
use angajati
Afiai structura tabelului Angajai cu comanda:
display structure
Copiai din tabelul Angajai n tabelul Clieni numai cmpurile id_ang, nume, pren,
id_sup, data_n, adresa, loc, c_jud, cp, tel_m, tel_f, obs cu comanda:
copy structure to clienti fields id_ang, nume, pren, id_sup, data_n, adresa, loc, c_jud,
cp, tel_m, tel_f, obs
Deschidei tabelul Clieni cu comanda:
use clienti
Deschidei caseta de dialog Table Designer pentru a face modificri n structura
tabelului. Folosii comanda:
modify structure
n caseta de dialog facei urmtoarele modificri. Schimbai numele cmpurilor:
id_ang n id_cl, id_sup n id_ang i data_n n data_i. Inserai n poziia corespunztoare cmpurile: tip_cl i fax.
Vizualizai structura tabelului Clieni cu comanda display structure.
Obinei informaii despre cmpurile din tabel:
Aflai cte cmpuri are nregistrarea folosind funcia (rspunsul este 14):
?fcount()
Aflai ce dimensiune are cmpul loc folosind funcia (rspunsul este 15):
?fsize('loc')

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.

4.2. Poziionarea pe o nregistrare din tabel


La un moment dat exist o singur nregistrare care poate fi prelucrat. Ea se numete
nregistrarea curent. Numrul nregistrrii curente se pstreaz n contorul de
nregistrare. El se mai numete indicator de nregistrare sau pointer de nregistrare.
Contorul de nregistrare este o zon de memorie intern care se asociaz tabelului la
deschiderea lui. La nchiderea tabelului contorul se terge. Se pot folosi urmtoarele
comenzi pentru poziionarea pointerului de nregistrare:
9 poziionarea dup numrul nregistrrii: goto, skip;
9 poziionarea dup un criteriu logic: locate+continue.

4.2.1. Poziionarea dup numrul nregistrrii


Putei folosi:
9 Comanda goto sau go poziioneaz pointerul de nregistrare pe o anumit nregistrare din
tabel, precizat prin numrul su. Sintaxa comenzii este:
goto| go <n >| top | bottom
unde <n> reprezint numrul nregistrrii, top prima nregistrare, iar bottom ultima nregistrare.
9 Comanda skip poziioneaz pointerul de nregistrare peste un anumit numr de nregistrri din tabel, relativ fa de nregistrarea curent. Sintaxa comenzii este:
skip [<n >]
unde <n> reprezint numrul de nregistrri peste care se sare nainte dac n>0 sau napoi
dac n<0. Dac numrul lipsete, saltul se face la nregistrarea urmtoare.

4.2.2. Poziionarea dup un criteriu logic de cutare


Putei folosi:
9 Comanda locate poziioneaz pointerul de nregistrare pe o nregistrare care ndeplinete
condiia specificat. Sintaxa comenzii este:
locate for <cond_1> [<domeniu>]
[while <cond_2>]
Comanda caut secvenial i poziioneaz pointerul pe prima nregistrare care ndeplinete
un criteriu de cutare precizat prin condiia <cond_1> din clauza For. Dac nu gsete nici o
nregistrare, pointerul va fi poziionat dup ultima nregistrare de date, adic pe marcajul eof.
Comanda caut implicit n tot tabelul (All). Explicit poate cuta numai n anumite nregistrri,
precizate prin <domeniu> sau prin clauza while. Cu aceast comand se gsete prima nregistrare care ndeplinete criteriul de cutare.
9 Comanda continue continu procesul de cutare definit de ultima comand locate (caut
urmtoarea nregistrare care ndeplinete criteriul de cutare precizat n comanda locate).

Utilizarea unor instrumente de prelucrare a datelor


Comanda continue se folosete numai mpreun cu comanda locate. Sintaxa comenzii este:
continue
Dac nu se mai gsete nici o nregistrare, n bara
de stare se afieaz mesajul End of locate scope.

121

locate for <cond>

nu

Putei s folosii aceste comenzi de poziionare i


prin intermediul interfeei. Alegei opiunea Goto
Record4 Table. Se deschide un submeniu cu
opiuni pentru poziionarea pe o anumit nregistrare: Top (prima nregistrare), Bottom (ultima nregistrare), Next (urmtoarea nregistrare), Previous
(nregistrarea precedent), Record#... (nregistrarea
cu numrul precizat), Locate... (adverbele comenzii
locate vor fi definite prin intermediul controalelor din
caseta de dialog Locate).

eof() =.F.
sfrit
da
<prelucrare>

continue

4.2.3. Controlarea poziionrii n tabel


Prin intermediul funciilor se pot obine informaii
despre nregistrrile din tabel:
9 numrul de nregistrri din tabel se obine cu
funcia reccount();
9 numrul nregistrrii curente din tabel se obine
cu funcia recno();
9 sfritul de fiier eof() - funcia furnizeaz un
rezultat logic care este .T. dac pointerul este
poziionat pe ultima nregistrare din tabel;
9 nceputul de fiier bof() - funcia furnizeaz un
rezultat logic care este .T. dac pointerul este
poziionat pe prima nregistrare din tabel;
9 modul n care a decurs cutarea found() funcia furnizeaz un rezultat logic care este
.T. dac a avut succes operaia de cutare.

locate for <cond>

nu
found() =.T.
sfrit
da
<prelucrare>

continue

Aceste funcii pot fi folosite pentru a testa dac mai


continuai sau nu procesul de cutare.

Poziionai pointerul de nregistrare folosind numrul nregistrrii:


Deschidei tabelul Angajai cu comanda:
use angajati
Executai mai multe operaii de poziionare folosind comenzile goto i skip.
Observai informaia afiat n bara de stare dup fiecare operaie de poziionare.
?recno()
1
?reccount()

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

Executai operaii de poziionare folosind opiunea de meniu. Deschidei mai nti


fereastra de editare a tabelului cu opiunea de meniu Browse "Angajati"View.
Observai dup fiecare operaie de poziionare informaia afiat n bara de stare i
nregistrarea pe care s-a poziionat pointerul de nregistrare n fereastra de editare:
Table Goto Record4 Next nregistrarea 2 (era urmtoarea nregistrare)
Table Goto Record4 Bottom nregistrarea 5 (ultima nregistrare)
Table Goto Record4 Record#... caseta de dialog Go to Record: scriei n caseta
cu derulor Record valoarea 2 i executai clic pe declanatorul Go to nregistrarea 2.

nchidei fereastra de editare. Observai n fereastra Command comenzile corespunztoare aciunilor executate:
skip

go bottom

go 2

Poziionai pointerul de nregistrare folosind un criteriu de cutare:

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.)

Utilizarea unor instrumente de prelucrare a datelor

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

Executai comanda locate folosind opiunea de meniu.


Table Goto Record4 Locate... caseta de dialog Locate Record: executai clic pe
declanatorul Locate nregistrarea 1 (prima nregistrare).
Table Goto Record4 Locate... caseta de dialog Locate Record: executai clic
pe declanatorul For... caseta de dialog Expression Builder: executai dublu clic pe
cmpul pren, scriei n caseta de text semnul =, apoi n lista de funcii String executai
clic pe funcia Proper() i scriei ca parametru n locul parametrului expC, prenumele
'Maria' (n caset va fi scris condiia Angajati.pren=PROPER('Maria')), acionai
declanatorul Verify pentru a verifica dac este corect expresia i apoi executai clic pe
OK n caseta de dialog Locate Record executai clic pe declanatorul Locate
nregistrarea 3 (prima nregistrare pentru care valoarea cmpului pren este Maria).

nchidei fereastra de editare. Observai n fereastra Command comenzile corespunztoare aciunilor executate:
locate all

locate for Angajati.pren= proper('Maria')

4.3. Actualizarea tabelului


Operaia de actualizare a tabelului se execut asupra tabelului deschis i presupune trei
tipuri de operaii:
9 adugarea de noi nregistrri,
9 tergerea unei nregistrri,
9 modificarea cmpurilor dintr-o nregistrare.

4.3.1. Adugarea de noi nregistrri


Se poate face:
1. Prin adugare la sfritul tabelului:
9 de la tastatur - se realizeaz fie prin intermediul opiunii de meniu Append New
RecordsTable, fie prin intermediul comenzii:
append
Se deschide fereastra de editare de tip Edit. La sfritul fiierului este adugat o
nregistrare vid. Completai cmpurile din nregistrare prin intermediul controalelor din aceast fereastr. Dac vrei s mai adugai o nou nregistrare, dup ce
ai terminat de completat cmpurile unei nregistrri apsai tasta Enter. Terminai
operaia de adugare nchiznd fereastra.
9 prin adugarea unei nregistrri vide - se realizeaz prin intermediul comenzii:
append blank
La sfritul tabelului se adaug o nregistrare vid pentru care urmeaz s
completai ulterior valorile cmpurilor.

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.

4.3.2. tergerea nregistrrilor


Se poate face prin urmtoarele operaii:
9 tergerea logic. Operaia de tergere logic nu nseamn eliminarea fizic a nregistrrilor din tabel, ci numai marcarea lor pentru tergere. nregistrrile terse logic pot fi refcute. Operaia se realizeaz fie prin intermediul opiunii de meniu Delete Records...
Table, fie prin intermediul comenzii:
delete [<domeniu>] [for <cond_1>] [while <cond_2>]
Implicit este tears logic nregistrarea curent. Explicit poate fi ters logic un grup de
nregistrri precizat prin <domeniu> sau clauzele for sau while.
9 Refacerea nregistrrilor terse logic. Operaia nltur marcajele pentru tergere logic. Se realizeaz fie prin intermediul opiunii de meniu Recall Records...Table, fie prin
intermediul comenzii:
recall [<domeniu>] [for <cond_1>] [while <cond_2>]
Implicit sunt refcute toate nregistrrile marcate logic pentru tergere. Explicit poate fi
refcut un grup de nregistrri precizat prin <domeniu> sau clauzele for sau while.
9 tergerea fizic. Operaia de tergere fizic nseamn eliminarea fizic din tabel a
nregistrrilor marcate logic pentru tergere. nregistrrile terse fizic nu mai pot fi refcute.
Operaia se realizeaz fie prin intermediul opiunii de meniu Remove Deleted Records
Table, fie prin intermediul comenzii:
pack
9 tergerea fizic a tuturor nregistrrilor. Operaia de tergere fizic a tuturor nregistrrilor nseamn eliminarea fizic din tabel a tuturor nregistrrilor de date i pstrarea numai
a structurii tabelului. Se realizeaz prin intermediul comenzii:
zap
Aceast operaie este echivalent cu dou operaii delete all i pack.
n fereastra de editare putei s marcai logic pentru tergere sau s anulai marcajul cu
opiunea Toggle Deletion MarkTable sau folosind scurttura Ctrl+T. Opiunea are

Utilizarea unor instrumente de prelucrare a datelor

125

efectul unui comutator. Dac nregistrarea nu este marcat, o marcheaz, i invers, dac
este marcat, i anuleaz marcajul.

Controlarea operaiei de tergere se face prin:


9 Comanda care stabilete cum pot fi folosite nregistrrile terse logic:
set deleted on | off
unde on nseamn c nregistrrile terse logic nu pot fi folosite de comenzile care au
n sintax clauzele for i while, iar off (implicit) nseamn c nregistrrile terse logic
pot fi folosite de toate comenzile.
9 Funcia care testeaz dac nregistrarea curent este marcat logic pentru tergere
(valoarea .T. nseamn c a fost marcat pentru tergere):
deleted()

4.3.3. Modificarea nregistrrilor


Modificarea valorii cmpurilor din nregistrri se poate face:
9 prin valori precizate: Se poate folosi comanda replace care are sintaxa:
replace <cmp_1> with <expr_1> [additive] [,<cmp_2> with <expr_2>[additive]...]
[<domeniu>] [for <cond_1>] [while <cond_2>]
Se nlocuiete valoarea din cmpul <cmp_1> cu valoarea obinut n urma evalurii
expresiei <expr_1>, valoarea din cmpul <cmp_2> cu valoarea obinut n urma evalurii expresiei <expr_2> etc. Implicit, nlocuirea se face numai n nregistrarea
curent. Explicit, nlocuirea se poate face ntr-un grup de nregistrri precizat prin
<domeniu> sau clauzele for sau while.
9 interactiv, de la tastatur: Se pot folosi comenzile edit sau browse care deschid
fereastra de editare.
Comenzile browse i edit au urmtoarea sintax:
browse | edit [fields <list_cmpuri>] [<domeniu>] [for <cond_1>] [while <cond_2>]
[font <nume_font> [,<n>]] [style <nume_stil>] [freeze <nume_cmp>]
[last| noinit ] [noappend] [nodelete] [noedit | nomodify] [title <nume_t>] [normal]
[partition <m>] [lpartition] [nolink] [ledit] [redit]
[valid [f] <cond_3> [error <mesaj>]] [when <cond_4>] [width <p>]
Clauzele din comand au urmtoarea semnificaie:
9 fields - permite afiarea numai a cmpurilor precizate n <list_cmpuri>. Lista de
cmpuri poate conine nume de cmpuri din tablou sau cmpuri calculate. Separarea
n list se face prin virgul. Fiecrui cmp i se poate asocia o opiune. Opiunile sunt:
:R - cmpul poate fi vizualizat dar nu poate fi modificat;
:V = <cond> - cmpul introdus este evaluat prin expresia logic <cond>. Dac
valoarea expresiei este T., data din cmp este corect, altfel se afieaz un
mesaj de eroare.
:F - se verific o regul de validare atunci cnd trece cursorul prin cmp (fr
modificare). Opiunea se poate folosi mpreun cu opiunea :V.
:E= <mesaj> - Mesajul de eroare standard produs de introducerea unei valori
invalide n cmp poate fi modificat cu mesajul <mesaj> de tip ir de caractere. Opiunea se poate folosi mpreun cu opiunea :V.

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.

Utilizarea unor instrumente de prelucrare a datelor

127

Comanda browse mai poate avea clauzele:


9 lock <n> - precizeaz numrul de cmpuri <n> care pot fi vzute n partiia din
stnga a ferestrei browse fr s se deruleze coninutul; partiia se va dimensiona
automat pentru a realiza acest format de afiare.
9 nolgrid, norgrid - nltur grila din partiia stng, respectiv dreapt a ferestrei de
editare browse.

4.3.4. Controlarea accesului la nregistrri


Accesul la nregistrrile unui tabel poate fi controlat la citire i scriere prin dou metode:
1. Metoda tergerii logice:
Aceast metod const n urmtoarele aciuni:
9 Se terg logic nregistrrile la care nu vrei s avei acces cu comanda delete.
9 Se inhib accesul la nregistrrile terse logic cu comanda set deleted on.
9 Atunci cnd vrei s avei acces la unele nregistrri, anulai marcajul lor pentru
tergere cu comanda recall.
2. Metoda filtrului:
Aceast metod const n urmtoarele aciuni:
9 Se construiete un filtru cu comanda:
set filter to <cond>
unde <cond> este o condiie logic pe care trebuie s o ndeplineasc nregistrrile la
care avei acces.
9 Refacerea accesului la toate nregistrrile se face cu comanda:
set filter to
9 Putei s testai filtrul (condiia pe care trebuie s o ndeplineasc nregistrrile ca s
avei acces la ele) cu funcia logic:
filter()

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.

Modificai valoarea cmpurilor din nregistrri:


use angajati
Se deschide tabelul Angajai.
browse freeze tarif valid tarif>=300000 and tarif<=500000
n fereastra de editare se modific numai tariful. Valoarea introdus
trebuie s aparin intervalului [300000, 500000]
browse for lower(c_jud)='ct' fields nume:r, pren:r, tel_f:v=tel_f >'041000000' and
tel_f<'041999999':e='telefon gresit'
n fereastra de editare se fac modificri numai pentru angajaii din
Constana pentru care se modific numai numrul de telefon. Pentru
valoarea introdus s-a precizat o regul de validare i un mesaj afiat
n caz de introducere eronat a valorii.
replace id_sup with 1000 for id_sup=100
Se nlocuiete n tot tabelul codul superiorului 100 cu 1000.

Utilizarea unor instrumente de prelucrare a datelor

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:

Utilizarea unor instrumente de prelucrare a datelor

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

domeniul implicit de aciune


modul de afiare
efectul valorii on a
parameterului deleted

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().

Sintaxa comenzilor este:


sum | average | calculate [<list_expresii_numerice>]
[<domeniu>] [for <cond_1>] [while <cond_2>][ to <nume_variabil>]
count [<domeniu>] [for <cond_1>] [while <cond_2>] [ to <nume_variabil>]
Domeniul implicit de aciune al acestor comenzi este: comanda se aplic asupra tuturor
nregistrrilor i asupra tuturor cmpurilor numerice, iar rezultatul se afieaz pe ecran.
Explicit, comenzile acioneaz numai asupra grupului de nregistrri precizat prin
<domeniu> sau clauza for sau while i numai asupra cmpurilor numerice precizate n
<list_expresii_numerice>, iar rezultatul poate fi memorat n variabile de memorie.

Aflai media aritmetic:


Deschidei tabelul Angajai. Aflai media aritmetic a tarifului folosind comanda:
average tarif
average tarif to v
?v
calculate avg(tarif)
average for tip_ang='a'

Se calculeaz i se afieaz media aritmetic a tarifului pentru


toi angajaii.
Se calculeaz media aritmetic a tarifului pentru toi angajaii i
se pstreaz n variabila de memorie v
al crui coninut se afieaz ulterior.
Calculai media aritmetic cu ajutorul funciei avg().
Se afieaz media aritmetic pentru toate cmpurile numerice
(inclusiv pentru cele care conin codurile angajailor i ale superiorilor; din aceast cauz cererea de informaie nu s-a fcut corect)

Utilizarea unor instrumente de prelucrare a datelor


average tarif for tip_ang='a'
average tarif for tip_ang<>'a'

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

Se numr i se afieaz ci angajai sunt subordonai angajatului cu identificatorul 100.


Se numr ci angajai sunt subordonai angajatului cu identificatorul 100 i rezultatul se pstreaz n variabila de memorie v
al crui coninut se afieaz ulterior.
Se numr i se afieaz ci angajai sunt din Constana.
Se numr i se afieaz ci angajai au tariful mai mare dect
250000 lei.

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.

Testai modul n care sunt tratate nregistrrile terse logic:


Controlul se face prin parametrul deleted:
delete for lower(c_jud)='ct'
set deleted on
display
list
display all
set deleted off
display

Se marcheaz pentru tergere logic nregistrrile


angajailor din Constana.
Se atribuie parametrului deleted valoarea on.
Se afieaz nregistrarea curent cu comanda display.
Se afieaz toate nregistrrile cu comanda list.
Se afieaz toate nregistrrile cu comanda display all.
Se atribuie parametrului deleted valoarea off.
Se afieaz nregistrarea curent cu comanda display.

132 Informatic
list
display all
recall for lower(c_jud)='ct'

Se afieaz toate nregistrile cu comanda list.


Se afieaz toate nregistrile cu comanda display all.
Se refac nregistrrile marcate logic pentru tergere.

Testai efectul filtrului definit pentru nregistrri:


Putei s definii filtre pentru nregistrri cu ajutorul parametrului filter:
set filter to upper(c_jud)='B'

Se construiete un filtru. Scopul este de a lsa s treac


numai angajaii din Bucureti.
?filter()
Se cere afiarea filtrului.
upper(c_jud)='B'
Se afieaz condiia logic din filtru.
list id_ang, nume, pren, loc
Se afieaz att angajaii din Bucureti ct i cei din Buzu.
browse
Aadar, filtrul nu a fost construit corect.
set filter to upper(c_jud)=='B' Se definete din nou filtrul, cu o alt condiie logic.
?filter()
Se cere afiarea filtrului.
upper(c_jud)=='B'
Se afieaz condiia logic din filtru.
list id_ang, nume, pren, loc
Nu se afieaz nici o nregistrare. Din nou filtrul nu a fost definit
browse
corect.
set filter to upper(c_jud)=='B ' Se definete din nou filtrul, cu o alt condiie logic.
?filter()
Se cere afiarea filtrului.
(c_jud)=='B '
Se afieaz condiia logic din filtru.
list id_ang, nume, pren, loc
Se afieaz numai angajaii din Bucureti. Condiia din filtru a
browse
fost definit corect.
set filter to
Se anuleaz filtrul.
list id_ang, nume, pren, loc
Se afieaz toate nregistrrile.
browse

Testai efectul filtrului definit pentru cmpuri:


Putei s definii filtre pentru cmpuri cu ajutorul parametrului fields. Deschidei tabelul
Clieni cu comanda use clienti.
set fields to id_cl, nume, pren, id_ang
list
Sunt afiate numai cmpurile identificator client, nume i prebrowse
nume client, identificatorul angajatului care se ocup de client.
display
(numai cmpurile id_cl, nume, pren, id_ang)
set fields to
browse
Nu este afiat nici un cmp.
set fields to all
browse
Sunt afiate toate cmpurile.

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>

Utilizarea unor instrumente de prelucrare a datelor

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)

Cmpurile logice i memo nu pot fi folosite n cheia de indexare.

4.6.1. Crearea unui index


Dac indexul compus structural se creeaz mpreun cu tabelul, ceilali indeci se
creeaz dup ce a fost creat tabelul, prin comanda:
index on <expresie_index>
to <nume_fiier.idx> | tag <nume_etichet> [of <nume_fiier.cdx>]
[for <cond_1>] [ascending | descending] [additive]

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).

4.6.2. Deschiderea unui index


n afar de indexul compus structural care se deschide automat la deschiderea tabelului,
ceilali indeci trebuie deschii fie prin opiunea OpenFile (n caseta de dialog Open
alegei tipul index (*.idx; *.cdx) din lista Files of type), fie folosind una dintre comenzile:
9 la deschiderea tabelului:
use <nume_tabel> index <list_fiiere.idx>
[order <nume_fiier.idx>| tag <nume_etichet> of <nume_fiier.cdx>
[ascending | descending]
n lista de fiiere a clauzei index pot fi specificai att indeci simpli, ct i indeci compui.
Nu este obligatoriu s se precizeze i extensia (doar dac exist dou fiiere index, unul
simplu i altul compus, cu acelai nume). Dac se deschid mai muli indeci prin clauza
order, precizai care este indexul activ (indexul simplu sau eticheta din indexul compus).
9 dup deschiderea tabelului:
set index to <list_fiiere.idx> [ascending | descending] [additive]
order <nume_fiier.idx>| tag <nume_etichet> of <nume_fiier.cdx>

4.6.3. Alte operaii cu indeci


9

schimbarea indexului activ din lista de indeci deschii:


set order to <nume_fiier.idx>| tag <nume_etichet> of <nume_fiier.cdx>
[ascending | descending]
tergerea etichetelor dintr-un index compus:
delete tag <nume_etichet_1> of <nume_fiier_1.cdx>
[,<nume_etichet_1> of <nume_fiier_1.cdx> ...]

4.6.4. Exploatarea unui tabel mpreun cu indexul


Dac deschidei tabelul mpreun cu un index, avei acces direct la nregistrri. Poziionarea
pointerului de nregistrare direct pe o nregistrare se face folosind comanda:
seek <expresie>
care caut prima nregistrare cu valoarea cheii de indexare egal cu <expresie>. Efectul
comenzii seek n acces direct este echivalent cu efectul comenzii locate for <cond> n acces
secvenial. Dac se gsete nregistrarea, funcia found() va furniza valoarea .T.
n loc s folosii comanda seek mpreun cu funcia found(), putei folosi funcia seek():
seek (<expresie>)

Utilizarea unor instrumente de prelucrare a datelor

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:

T est pentru evaluare:


Adevrat/Fals:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.

Ordonarea logic nseamn o ordonare dup o condiie logic.


Cheia de indexare poate conine mai multe cmpuri legate printr-o expresie de concatenare.
Un tabel poate avea mai muli indeci structural compui.
ntr-un tabel putei defini mai multe etichete de tipul Primary.
Numrul nregistrrii curente din tabel l obinei cu funcia reccount().
Domeniul implicit al comenzii list este all.
Domeniul implicit al comenzii display este all.
Funcia cnt() nu poate fi folosit dect n comanda calculate.
Comanda delete tag terge o etichet dintr-un index compus.
Se poate crea un singur index simplu.

Completai:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.

Un index compus conine mai multe ..........................


Pentru crearea unui tabel putei folosii comanda SQL ............................
Putei s modificai structura unui tabel cu comanda ..............................................
Cu comanda set fields to controlai accesul la ....................................
Obinei numrul de cmpuri dintr-o nregistrare cu funcia ..............................
Obinei numrul de nregistrri dintr-un tabel cu funcia ...................................
n acces secvenial, cutarea unei nregistrri dup un criteriu logic se face cu comanda .....
n comanda list, pentru a afia anumite cmpuri folosii clauza ......................
Pentru a calcula media aritmetic folosii funcia ..........................
Stabilii eticheta activ dintr-un index compus cu comanda ..........................................

Utilizarea unor instrumente de prelucrare a datelor

137

Alegei rspunsurile corecte:


1. Obinei dimensiunea unei nregistrri cu funcia:
a) fsize()
b) recsize()
c) reccount()
2. Ordonarea fizic a nregistrrilor din tabel se face cu operaia de:
a) indexare
b) sortare
c) concatenare
3. Vrei s indexai dup dou cmpuri numerice a i b. Expresia cheii de indexare este:
a) a+b
b) a,b
c) str(a)+str(b)
4. Vrei s sortai dup dou cmpuri numerice a i b. Expresia cheii de sortare este:
a) a+b
b) a,b
c) str(a)+str(b)
5. Putei vedea structura unui tabel cu comanda:
a) list structure
b) display structure
c) modify structure
6. Cu comanda set filter to controlai accesul la:
a) cmpuri
b) nregistrri
c) nregistrri i cmpuri
7. Comanda goto next poziioneaz pointerul de nregistrare pe:
a) nregistrarea urmtoare
b) nregistrarea curent
c) eroare
8. Comanda delete:
a) terge logic nregistrarea curent
b) terge fizic nregistrarea curent
c) terge logic toate nregistrrile
d) terge fizic toate nregistrrile
9. Combinaia comanda seek + funcia found() poate fi nlocuit de:
a) comanda locate + funcia found()
b) funcia seek()
c) comanda found
10. Comanda insert blank insereaz:
a) spaii ntr-un cmp de tip ir de caractere
b) o nregistrare vid dup nregistrarea curent
c) o nregistrare vid naintea nregistrrii curente
Rspundei:
1. Ce este un tabel liber?
2. Prin cte metode putei crea structura unui tabel? Ce comenzi folosii?
3. Ce este un tabel de structur?
4. Ce sunt indecii? De cte tipuri sunt? Unde sunt memorai n afara sesiunii de lucru?
5. Ce este un index structural compus? Ce avantaje are folosirea acestui index?
6. Ce tip de etichet de index trebuie s definii pentru cmpul care va asigura legtura
cu un alt cmp al bazei de date?
7. Ce avantaj are folosirea a dou operaii de tergere: logic i fizic?
8. Cum controlai accesul la nivel de nregistrare i la nivel de cmp ntr-un tabel?
9. Ce informaii putei obine despre cmpurile din tabel cu ajutorul funciilor?
10. Ce informaii putei obine despre nregistrrile din tabel cu ajutorul funciilor?
11. Care este deosebirea dintre comenzile list i display?
12. Care este deosebirea dintre comenzile edit i browse?
spunsuri:
R
Adevrat/Fals: 1-F; 2-A; 3-F; 4-F; 5-F; 6-A; 7-F; 8-A; 9-A; 10-F.
Completai: 1-etichete index; 2-create table; 3-modify structure; 4-cmpuri; 5-fcount; 6-reccount;
7-locate; 8-fields; 9-avg(); 10-set order to
Alegei rspunsurile corecte: 1-b; 2-b; 3-c; 4-b; 5-a,b,c; 6-b; 7-c; 8-a; 9-b; 10-b.

138 Informatic

5. Operaii cu datele dintr-o baz de date


n Visual FoxPro putei folosi dou metode pentru crearea unei baze de date. Aceste
metode creeaz dou tipuri de baze de date:
9 Temporare. Ele sunt create prin metoda clasic (metoda folosit n variantele
anterioare de FoxPro i care s-a pstrat i n Visual FoxPro pentru compatibilitate
cu versiunile anterioare). Tabelele bazei de date sunt permanente i se
memoreaz n fiiere .dbf. Ele pot fi create i manipulate prin operaiile descrise n
capitolul anterior. Baza de date nu este ns permanent. Ea trebuie definit n
fiecare sesiune de lucru sau trebuie scris un program de aplicaie n care s fie
definit i care trebuie rulat de fiecare dat cnd vrei s exploatai baza de date.
La nceputul sesiunii de lucru, tabelele care fac parte din baza de date se deschid
n zone de lucru diferite, apoi se construiete baza de date prin definirea relaiilor
dintre tabele. Aceste relaii pot fi numai de tip una-la-una sau una-la-mai-multe. n
timpul sesiunii de lucru se execut operaii de exploatare i ntreinere a bazei de
date. La terminarea sesiunii de lucru tabelele se nchid i automat se distrug i
relaiile stabilite ntre ele, relaii care defineau baza de date. n urmtoarea sesiune
de lucru, trebuie reluat operaia de definire a relaiilor dintre tabele, operaii care
creeaz baza de date.
9 Permanente. Ele sunt create prin metoda containerului, n care baza de date
este o entitate permanent. Tabelele sunt pstrate n continuare n fiiere cu
extensia .dbf. Baza de date este ns definit ca un container care va conine: lista
tabelelor componente, relaiile dintre tabele i alte date necesare regsirii informaiilor. Baza de date este memorat ntr-un fiier cu extensia .dbc, este independent de programele de aplicaii i poate fi pstrat i n afara sesiunii de lucru.
Definirea relaiilor se face o singur dat, la crearea bazei de date. Pentru a avea
acces la baza de date, este suficient s deschidei fiierul bazei de date (fiierul
.dbc). Prin aceast metod poate fi mbuntit lucrul cu tabelele bazei de date,
deoarece n baza de date pot fi pstrate i alte date, ca de exemplu date despre
cmpurile din tabele: etichetele cmpurilor, valoarea implicit a cmpului, regula
de validare la nivel de cmp sau la nivel de nregistrare, mesajele care vor fi
afiate dac datele introduse n cmp nu respect regula de validare etc.
Operaiile puse la dispoziie de Visual FoxPro pentru administrarea bazelor de date pot fi
grupate astfel:

1. Crearea bazei de date care cuprinde urmtoarele operaii:


9
9
9
9

crearea unui fiier nou baz de date;


adugarea pe rnd la baza de date a tabelelor libere create anterior;
construirea unor noi tabele direct n baza de date;
precizarea, pentru tabelele libere create anterior, a proprietilor care nu au putut fi
definite la crearea lor: etichetele cmpurilor, valorile implicite ale cmpurilor,
regulile de validare la nivel de cmp i la nivel de nregistrare, mesajele de eroare
pentru regulile de validare.
9 stabilirea legturilor ntre tabele;
9 stabilirea proprietilor bazei de date;
9 ncorporarea n baza de date a unor entiti specifice pentru exploatarea ei:
vizualizri, conexiuni (care asigur accesul la datele create cu alte sisteme),

Utilizarea unor instrumente de prelucrare a datelor


proceduri i funcii care pot fi folosite atunci cnd se
exploateaz tabelele bazei de date.
2. Exploatarea bazei de date care cuprinde operaii pentru:
9 deschiderea bazei de date i a tabelelor,
9 prelucrarea datelor din tabele prin operaii de actualizare,
consultare, sortare etc.,
9 nchiderea tabelelor i a bazei de date.

139

Start
Open (baza de date)
Open (tabele)
Prelucrare

5.1. Crearea bazei de date


Close (tabele)

5.1.1. Crearea bazei de date


n urma operaiei de creare, baza de date este deschis
automat. Putei crea baza de date prin urmtoarele metode:

Close (baza de date)

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

5.1.2. Adugarea la baza de date a tabelelor libere


Putei s adugai tabele libere la baza de date prin urmtoarele metode:
1. Interactiv:
Fie folosii opiunea Add Table...Database, fie executai clic pe butonul Add Table din
bara de instrumente Database Designer.
2. Prin comanda:
add table <nume_tabel>

5.1.3. Adugarea la baza de date a tabelelor noi


Putei s adugai tabele noi la baza de date prin urmtoarele metode:
1. Interactiv:
Fie folosii opiunea New Table...Database, fie executai clic pe butonul New Table din
bara de instrumente Database Designer.
2. Prin comanda:
create <nume_tabel>

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.

5.1.5. Alte operaii cu baza de date


ndeprtai un tabel din baza de date fie cu opiunea de meniu Remove...Database,
fie executnd clic pe butonul Remove Table din bara de instrumente Database
Designer dup ce ai selectat tabelul, fie cu comanda:
remove <nume_tabel>
Dup ce ai selectat un tabel n fereastra Database Designer, putei s-i modificai
structura fie cu opiunea de meniu Modify...Database, fie executnd clic pe butonul
Modify Table din bara de instrumente Database Designer, fie cu comanda:
modify structure
Dup ce ai selectat un tabel n fereastra Database Designer, putei s deschidei
fereastra de editare pentru a face modificri cu opiunea de meniu Browse Database,
executnd clic pe butonul Browse Table din bara de instrumente Database Designer,
executnd dublu clic pe tabel sau cu comanda:
browse
Verificai integritatea bazei de date cu comanda:
validate databases
Dac ai deschis mai multe baze de date, una singur este activ (baza de date pe care
o putei exploata). Pentru a activa o baz de date folosii comanda:
set database to <nume_baz de date>

5.2. Exploatarea bazei de date


5.2.1. Deschiderea i nchiderea bazei de date
Pentru a actualiza sau a consulta o baz de date, ea trebuie deschis. Deschiderea ei
se face fie prin deschiderea unui tabel din baza de date, fie prin comanda:
open database <nume_baz_de_date>
Deschiderea bazei de date nu implic i deschiderea tabelelor care o compun.
nchiderea bazei de date se face cu comanda:
close databases
care determin i nchiderea tabelelor care fac parte din ea. Dac se folosete comanda:
close all databases

Utilizarea unor instrumente de prelucrare a datelor

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.

5.2.2. Deschiderea i nchiderea tabelelor


Pentru a folosi un tabel din baza de date, el trebuie deschis. Pentru a administra mai
multe tabele din baza de date, fiecare dintre ele trebuie s fie deschis. Pentru a putea
deschide mai multe tabele, Visual FoxPro folosete mecanismul zonelor de lucru.
O zon de lucru este o zon de memorie care se asociaz unui tabel la deschiderea lui.
Pot fi folosite peste 30.000 de zone de lucru. n zona de lucru se pstreaz informaii
despre tabelul deschis n acea zon:
9 identificatorul fiierului n care este memorat tabelul,
9 structura fiierului,
9 numrul de nregistrri din fiier,
9 contorul nregistrrii curente etc.
Identificarea unei zone de lucru se face prin numrul su 1, 2, 3, ... 30.000. Primele
zece zone de lucru se pot identifica i prin literele alfabetului: a,b, ...,j. La deschiderea
tabelului, acestuia i se poate atribui un alias, adic un nume cu care putei s identificai
tabelul i componentele sale n timpul operaiilor de exploatare.
Deschiderea unui tabel ntr-o zon de lucru se face cu comanda:
use <nume_tabel> in <zona> [alias <nume_alias>] [again]
unde <zona> este identificatorul zonei n care se deschide tabelul, iar <nume_alias> este
un nume atribuit pentru alias. Dac acest nume nu se precizeaz, sistemul i atribuie
implicit un alias: numele tabelului (numele fiierului n care este pstrat tabelul) dac
tabelul este deschis ntr-o singur zon sau numrul zonei, dac tabelul este deschis n
mai multe zone. Dac vrei s deschidei acelai tabel n mai multe zone de lucru, folosii
clauza again ncepnd de la a doua operaie de deschidere. Dac precizai pentru
<zona> valoarea 0, tabelul va fi deschis n prima zon de lucru disponibil (liber).
La un moment dat, ntr-o zon de lucru nu poate fi deschis dect un singur tabel. Dac n
zona respectiv este deschis deja un tabel, el trebuie nchis n prealabil.
Indiferent de cte zone de lucru folosii, la un moment dat una singur dintre ele este
zona de lucru activ (curent). Zona de lucru curent este zona la care se refer
implicit o comand n care nu se precizeaz explicit numele tabelului (comanda va
aciona asupra tabelului din zona de lucru activ). La nceputul sesiunii de lucru, zona de
lucru activ este zona 1.
Schimbarea zonei de lucru curente se face cu comanda:
select <zona>
unde <zona> poate fi precizat prin numrul su sau prin aliasul sau numele tabelului
deschis n aceast zon.
Alocarea unei zone de lucru unui tabel se poate face la deschiderea lui prin clauza in sau
prin selectarea zonei de lucru nainte de deschiderea tabelului. Comanda:
use <nume_tabel> in <zona>
este echivalent cu grupul de comenzi:
select <zona>
use <nume_tabel>.

142 Informatic
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).

Folosii fereastra View pentru a vizualiza zonele de lucru


Deschidei baza de date din exemplul (testdata) din dosarul Data, din dosarul Samples,
din dosarul aplicaiei Visual FoxPro. Pentru deschidere folosii comanda OpenFile. Se
deschide fereastra Database Designer n care sunt afiate tabelele i relaiile dintre
tabelele bazei de date.
Deschidei fereastra View folosind comanda View WindowWindow. n fereastr nu
este afiat nici un tabel n list, deoarece ai deschis baza de date, nu i tabelele din baza
de date.

Utilizarea unor instrumente de prelucrare a datelor

143

Deschidei caseta de dialog Open executnd


clic pe declanatorul Open din fereastra View.
Lista ascuns din care
alegei baza de date.

Lista din care


alegei tabelul pe
care l deschidei.
Grupul de butoane
radio din care alegei
tabele (Tables) sau
vizualizri (Views).
Dup ce ai deschis mai multe tabele, numele
lor va fi afiat n lista Aliases. Ele sunt afiate
n list n ordinea invers deschiderii.
Selectai un fiier din list. n bara de stare se
va afia numrul zonei de lucru n care este
deschis (Work Area) i numrul total de
nregistrri (Records).
Observai c zonele de lucru au fost alocate n
ordinea deschiderii: primului tabel deschis,
zona 1, celui de-al doilea tabel deschis,
zona 2 etc.
Putei s definii relaii ntre dou tabele.
Selectai din lista Alias tabelul surs i apoi
executai clic pe declanatorul Relations.
Numele tabelului va fi afiat n lista Relations.
Selectai din lista Alias tabelul destinaie i apoi executai clic pe declanatorul
Relations. Numele tabelului
va fi afiat n lista Relations.
Se deschide caseta de dialog Set IndexOrder n care
este afiat lista de etichete
index definite pentru tabel.
Executnd clic pe eticheta index corespunztoare relaiei, se deschide caseta de dialog
Expression Builder prin intermediul creia putei construi relaia.

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

Creai baza de date din exemplu:

Creai baza de date Compania cu comanda:


create database compania

Afiai informaii despre baza de date nou creat cu comanda:


display database
Se vor afia numele bazei de date, calea fiierului baz de date i versiunea.

Afiai baza de date n fereastra Database Designer cu comanda


modify database
Fereastra este vid.

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

Afiai informaii despre baza de date cu comanda:

Utilizarea unor instrumente de prelucrare a datelor

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.

Afiai informaii despre tabelele din baza de date cu comanda:


display tables
Se va afia lista cu numele tabelelor i cile fiierelor.

Adugai la baza de date un tabel nou cu comanda :


create contracte
Se deschide fereastra Table Designer, care spre deosebire de cea afiat la crearea
unui tabel liber, conine controale noi. De exemplu, pentru cmpul tip_c putei defini o
regul de validare care s nu permit introducerea n cmp dect a uneia dintre
valorile: 'e'-evaluare, 'i' - instruire, 'p'-proiect. Regula de validare poate fi exprimat
prin una dintre urmtoarele condiii logice: lower(tip_c)='i' or lower(tip_c)='p' or
lower(tip_c)='e' sau inlist (lower(tip_c),'i','p','e'). Definii structura tabelului i indecii.
n partea inferioar a ferestrei au aprut controale noi care permit stabilirea unei reguli de validare
la nivelul cmpului selectat (Validation Rule),
mesajul de eroare afiat
(Validation Text), valoarea implicit a cmpului
(Default Value), eticheta
cmpului (Caption),
comentarii despre cmp
(Field Comment). n
exemplu s-au completat
aceste casete de text
pentru cmpul tip_c - tipul
contractului. Regula de
validare este:
lower(tip_c)='i' or
lower(tip_c)='p' or
lower(tip_c)='e' iar valoarea implicit este 'p'.

Adugai la baza de date i celelalte tabele cu comenzile :


create estimari
create sedinte
create incasari
Dup fiecare comand se deschide fereastra Table Designer n care definii structura
tabelului i indecii.

Modificai structura tabelelor create liber, adugndu-le reguli de validare i indeci.


Executai pentru fiecare tabel deschiderea cu comanda use i apoi modificarea cu
comanda modify structure.

Dup ce ai adugat tabelele n baza de date, fereastra Database Designer va


conine aceste tabele:

146 Informatic

ntre tabele nu sunt stabilite relaii permanente. n prealabil, n tabelele conductoare


s-a stabilit cte un index primar, iar n tabelele conduse indeci de tip regular. Vei
stabili interactiv relaii n fereastra Database Designer, glisnd indexul primar din
tabelul conductor peste indexul regular din tabelul condus. De exemplu, glisai cheia
cu numele angajat din tabela Angajai (cmpul index este id_ang) peste cheia
angajat din tabela edine (cmpul index este id_ang). Se deschide caseta de dialog
Edit Relationship n care executai clic pe declanatorul OK.

Dup ce ai definit relaiile, fereastra Database Designer va afia:

Observai c ntre tabelul Judee i tabelele Angajai i Clieni nu s-au stabilit nc


relaii. n tabelele Angajai i Clieni cheia c_jud nu poate fi declarat cheie candidat,
deoarece exist mai multe nregistrri cu aceeai valoare a cheii (mai muli angajai i
clieni din acelai jude). Aadar, se poate stabili o relaie de tip una-la-mai multe ntre
tabelul Judee i tabelul Angajai, respectiv Clieni.

Utilizarea unor instrumente de prelucrare a datelor

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:

9 seciunea Rules for Updating n care putei stabili regula de integritate


referenial pentru operaiile de actualizare,
9 seciunea Rules for Deleting n care putei stabili regula de integritate
referenial pentru operaiile de tergere i
9 seciunea Rules for Inserting n care putei stabili regula de integritate
referenial pentru operaiile de adugare.
Aceste operaii se refer la tabelele conductoare, n care modificarea valorii cheii primare poate s duc la ruperea legturii cu unele nregistrri din tabelul condus. Deschidei
seciunea corespunztoare operaiei pentru care stabilii regula de integritate, selectai
relaia tabel printe - tabel copil pentru care stabilii regula i activai apoi butonul radio
corespunztor regulii de integritate. Putei alege una dintre urmtoarele reguli de integritate: Cascade (se terg sau se modific n cascad toate nregistrrile din tabelul copil,
legate de nregistrarea tears sau modificat din tabelul printe), Restrict (dac exist
n tabelul copil o nregistrare legat de nregistrarea care se terge sau se modific n
tabelul printe, se oprete procesul i se afieaz un mesaj de eroare), Ignore (operaiile
se pot executa fr restricii).
Deschidei acum prin comenzi fiecare tabel ntr-o zon diferit:
select 1
use clienti
select 6
use angajati
select 4
use estimari
select 2
use contracte
select 7
use judete
select 5
use incasari
select 3
use sedinte
Verificai integritatea datelor existente n acest moment folosind comanda:
validate database
Adugai date la fiecare tabel.

148 Tehnologii asistate de calculator

nchidei baza de date cu comanda:


close databases

ncercai:

T est pentru evaluare:


Adevrat/Fals:
1.
2.
3.
4.
5.

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:

Adevrat/Fals: 1-A; 2-F; 3-A; 4-A; 5-F.


Completai: 1-Database Designer; 2-validate database; 3-set database to; 4-close databases;
5-modify database.
Alegei rspunsul corect: 1-a; 2-c; 3-b; 4-b; 5-a.

Utilizarea unor instrumente de prelucrarea datelor

149

6. Obinerea informaiilor din baza de date


Datele din baza de date v ajut s modelai i s analizai evenimentele care se
produc n cadrul organizaiei. Metoda cea mai simpl de a genera anumite informaii din
datele din baza de date este aceea de a prezenta datele sub forma vizualizrilor sau a
interogrilor. Alteori este necesar s prezentai datele sub forma unor rapoarte care s
grupeze i s sintetizeze informaiiile.
n prezentarea informaiilor apar cazuri n care trebuie s combinai informaii dintr-o
baz de date cu informaiile create cu alte aplicaii i este necesar s integrai datele
dintr-o baz de date ntr-un document creat cu mai multe tipuri de aplicaii (s integrai
datele dintr-o baz de date ntr-un tabel Excel, ntr-un document Word sau ntr-o prezentare
Power Point). De exemplu, un angajat al firmei de consultan trebuie s-i prezinte
activitatea pe o perioad de timp. El i pstreaz unele date legate de activitatea sa n
tabele personale create cu aplicaia Excel, iar alte date se gsesc n baza de date a
companiei. Raportul va fi scris cu procesorul de texte Word i va trebui s integreze date
att din aplicaia Excel, ct i din aplicaia Visual FoxPro. Mai este posibil ca un angajat al
firmei s pregteasc o prezentare cu Power Point pentru unul dintre clienii fideli. Pentru
prezentare are nevoie de date din baza de date a companiei, despre contractele derulate,
termene, preuri etc. n acest caz, n prezentarea creat cu aplicaia Power Point trebuie s
integreze date create cu aplicaia Visual FoxPro. Alteori este posibil s avei nevoie de date
create cu un alt sistem de gestiune a bazelor de date. De exemplu, firma de consultan a
preluat clienii i o parte dintre angajaii altei firme de consultan, care i-a pstrat datele
ntr-o baz de date Paradox. Pentru a evita reintroducerea acestor date, ele trebuie
preluate din vechea baz de date n baza de date a companiei. Sistemul de gestiune a
bazelor de date trebuie s tie s rezolve aceste probleme.
Aadar, scopul pentru care creai i administrai o baz de date este de a obine rapid
informaii. Informaia poate fi prezentat n diferite formate. Pentru prezentarea ei putei
folosi interogrile, vizualizrile i rapoartele.

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.

Utilizarea unor instrumente de prelucrarea datelor

151

9 Gruparea (group by) prin care se precizeaz un criteriu de grupare a datelor. Acest
criteriu este dat de cheia de grupare format din unul sau mai multe 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

Utilizarea unor instrumente de prelucrarea datelor

153

dintr-un anumit tip de consultan - de exemplu instruire), pot prezenta situaii de


excepie, care depesc limitele normale (clieni care au derulat n ultimul trimestru mai
mult de cinci contracte de consultan) sau, atunci cnd trebuie s se concentreze pe o
problem, pot conine date la cerere (dac un client nu i-a mai pltit de mult edinele de
consultan, se poate cere un raport despre client care s conin contractele i modul n
care a pltit pe o perioad de timp).
n funcie de informaia prezentat, exist trei categorii de rapoarte:
9 Rapoarte periodice. Se produc la intervale de timp regulate (sptmnal, lunar,
trimestrial etc.), cum este de exemplu raportul lunar al edinelor cu clienii.
9 Rapoarte la cerere. Sunt produse la cerere, cum este de exemplu raportul cu
contractele de consultan ale unui client.
9 Rapoarte ale excepiilor. Sunt produse pentru a atrage atenia asupra unor evenimente deosebite, cum este de exemplu raportul ncasrilor lunare ale unui angajat
permanent cu norm ntreag, care sunt cu mult sub nivelul normal.
Pentru construirea unui raport se poate folosi constructorul de rapoarte (Report
Designer). El simplific procesul de creare a rapoartelor, deoarece folosete o procedur simpl: utilizatorul trebuie s precizeze numele coloanelor din tabele care trebuie s
apar n raport, totalurile pe coloane, subtotalurile pe grupuri de nregistrri, diferite alte
calcule. n urma comunicrii acestor date, el va genera un tabel care conine toate datele
i caracteristicile raportului i care sunt memorate ntr-un fiier cu extensia .frx.

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

Adaug un tabel nou la interogare.


nltur tabelul selectat din interogare. Implicit vor fi nlturate cmpurile,
criteriile de selectare, criteriile de sortare i criteriile de grupare definite de
cmpurile din acest tabel.
Adaug noi legturi ntre tabelele interogrii.
Deschide fereastra de editare n care este afiat comanda SQL asociat
interogrii definite interactiv.
Maximizeaz panoul cu tabele. Panoul cu seciuni nu va mai fi afiat.
Deschide o caset de dialog care conine controale pentru a alege destinaia
interogrii: o fereastr Browse, ecranul, o diagram etc.

Deschidei seciunea Selection Criteria. Executai dublu clic pe butonul Condition.


Se deschide caseta de dialog Join Condition n care este afiat condiia care
definete legtura dintre cele dou tabele. Deoarece legtura este realizat prin dou
cmpuri de tip ir de caractere, pentru a evita unele nepotriviri din cauza scrierii cu
litere mari sau cu litere mici a aceluiai cod de jude, activai comutatorul Ignore
Upper/Lower Case. nchidei caseta de dialog. Vei observa c n urma acestei
operaii, s-a activat n gril comutatorul Case corespunztor condiiei.
n grila afiat n seciune adugai criteriul pentru selectarea nregistrrilor:
tarif>260000 and tarif<300000. Pentru aceasta executai clic pe declanatorul
Insert, alegei din lista ascuns Field Name numele cmpului Angajai.tarif, din lista
ascuns Criteria operatorul More Than i scriei n caseta de text Example valoarea

Utilizarea unor instrumente de prelucrarea datelor

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

Executai clic pe butonul


Query Destination din bara
de instrumente Query Designer. Se deschide caseta
de dialog Query Destination n care executai clic
pe butonul Browse pentru
ca rezultatul interogrii s se
afieze ntr-o fereastr de
editare Browse.
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:
SELECT Angajati.nume, Angajati.pren, Angajati.tarif, Judete.n_jud;
FROM compania!angajati, compania!judete;
WHERE UPPER(Judete.c_jud) = UPPER(Angajati.c_jud);
AND (Angajati.tarif > 260000;
AND Angajati.tarif < 300000);
ORDER BY Angajati.nume, Angajati.pren

nchidei fereastra de editare.


nchidei fereastra generatorului de interogri i salvai interogarea sub numele
a1.qry. Observai c n fereastra Command este afiat comanda asociat
interogrii create interactiv:
create query
Afiai rezultatul interogrii cu comanda:
do a1.qri
Se deschide fereastra de editare de tip Browse:

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

Utilizarea unor instrumente de prelucrarea datelor

157

Rezultatul va fi afiat pe ecran, la fel ca rezultatul unei comenzi list/display.


Modificai aceast interogare astfel: se vor afia i angajaii care au un tarif de
300000 lei, se va afia o coloan nou cu vrsta angajailor, iar rezultatul va fi afiat
ntr-o fereastr Browse. Deschidei interogarea pentru modificare.
Se deschide fereastra generatorului de interogri Query Designer. Deschidei seciunea Selection Criteria i nlocuii valoarea 300000 cu 300001. Deschidei seciunea Fields i scriei n caseta combinat expresia prin care se calculeaz valoarea
cmpului vrsta: int((date()-data_n)/365). Executai clic pe butonul Query Destination din bara de instrumente. Se deschide caseta de dialog Query Destination n
care executai clic pe butonul Browse. nchidei cu salvare fereastra generatorului de
interogri.
Afiai rezultatul interogrii cu comanda do a1.qri
Modificai interogarea astfel nct n fereastra de editare coloana Pren s aib numele Prenume, coloana N_jud numele Jude, iar coloana cmpului calculat numele
Varsta. Modificarea se va face n comanda SQL. Pentru aceasta vei deschide o
fereastr de editare cu comanda:
modi comm a1.qpr
Fereastra de editare va afia comanda SQL. Modificai comanda astfel:
SELECT Angajati.nume, Angajati.pren As Prenume, Angajati.tarif, Judete.n_jud As Judet;
INT((DATE()-Angajati.data_n)/365) As Varsta;
FROM compania!angajati, compania!judete;
WHERE Judete.c_jud = Angajati.c_jud;
AND (Angajati.tarif > 260000;
AND Angajati.tarif < 300001);
ORDER BY Angajati.nume, Angajati.pren

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

Utilizarea unor instrumente de prelucrarea datelor

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 antet de pagin

Banda pentru datele din raport (Detail)

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.

Utilizarea unor instrumente de prelucrarea datelor

161

7. Transferul datelor ntre un sistem de gestiune a


bazelor de date i o alt aplicaie
O problem important a oricrui sistem o reprezint schimbul de informaii dintre
aplicaii. Visual FoxPro permite folosirea urmtoarelor metode:
9 Exportul i importul fiierelor. Poate s execute aceste operaii pentru foi de calcul
Excel sau Lotus 1-2-3 i pentru baze de date Access i Paradox.
9 Protocolul OLE. Folosind acest protocol pot fi introduse ntr-un tabel diferite obiecte
(un document, o foaie de calcul, o imagine etc.). Pentru aceste obiecte se folosete
cmpul General.
9 Protocolul DDE. Folosind acest protocol se poate realiza un schimb de date ntre
dou aplicaii aflate n execuie. Se pot realiza transferuri complexe de date, ca de
exemplu: ncrcarea datelor ntr-o foaie de calcul Excel direct dintr-o aplicaie Visual
FoxPro, introducerea datelor ntr-un tabel Visual FoxPro direct din Excel sau scrierea
unui text ntr-un document Word direct dintr-o aplicaie Visual FoxPro. Comunicarea
dintre cele dou aplicaii se bazeaz pe un schimb de mesaje n care una dintre
aplicaii este client, iar cealalt server. n funcie de ceea ce se dorete, Visual FoxPro
poate fi client sau server.
9 Drivere ODBC (Open DataBase Connectivity). Folosind drivere ODCB, Visual FoxPro
se poate conecta la alte tipuri de baze de date.
9 Tehnologia ActivX. Aceast tehnologie permite aplicaiei Visual FoxPro s interacioneze ntr-o reea cu alte aplicaii, indiferent de software-ul folosit pentru crearea
lor. n acest mod, ntr-o interfa creat cu Visul FoxPro pot fi folosite controale
ActivX create ntr-un alt limbaj de programare.

7.1. Importul i exportul


Operaiile de import-export se pot realiza numai pentru acele tipuri de fiiere pentru care
n Visual FoxPro sunt implementate programe de conversie.
n general operaiile de import-export se realizeaz ntre tabelele Visual FoxPro i:
9 tabele create cu alte sisteme de gestiune a bazelor de date relaionale; n acest caz
se realizeaz o conversie ntre cele dou tipuri de nregistrri de structur.
9 foi de calcul create cu un produs de calcul tabelar; n acest caz nregistrrile din tabel
vor deveni rnduri n foaia de calcul, iar cmpurile coloane i invers.
9 fiiere de texte (ASCII) n care liniile de text sunt separate de caracterul Eol (generat
de codurile ASCII CR - retur de car i LF - linie nou, echivalent cu apsarea tastei
Enter); n acest caz rndurile de text devin nregistrri n tabel i invers. Exist dou
tipuri de fiiere text:
Sdf - nregistrrile au lungime fix, iar cmpurile nu sunt separate ntre ele prin
delimitatori;
Delimited - cmpurile sunt separate prin virgul, iar cmpurile de tip caracter sunt
delimitate prin ghilimele. Se pot schimba separatorii cu clauza with astfel:
with tab - cmpurile sunt separate prin caracterul tabulator (codul ASCII 9 generat de apsarea tastei Tab);

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

b. Sintaxa comenzii Append from


este:
Append from <nume_fiier>
type <tip>
unde <nume_fisier> este numele fiierului din care se import datele, iar <tip>
reprezint tipul fiierului.
2. Exportul datelor este operaia prin care se transfer date dintr-un tabel al bazei de
date ntr-un alt tip de fiier, specific unei alte aplicaii. Se realizeaz cu comenzile:
Export i Copy to.
a. Sintaxa comenzii Export este:
Export to <nume_fiier> [fields <list_cmpuri>]
[<domeniu>] [for <expL1>] [while <expL2>] type <tip>
b. Sintaxa comenzii copy to este:
Copy to <nume_fiier> [fields <list_cmpuri>]
[<domeniu>] [for <expL1>] [while <expL2>] type <tip>
unde <nume_fisier> este numele fiierului din care se import datele, iar <tip> este tipul
fiierului. Implicit se transfer toate cmpurile din tabel. Explicit se transfer numai cele
precizate prin lista clauzei fields. Implicit se transfer toate nregistrrile din tabel.
Explicit se transfer numai cele precizate prin clauzele <domeniu>, for sau while.
Import
Append from
tabel al bazei de date
Copy to
Export

alt tip de fiier

Utilizarea unor instrumente de prelucrarea datelor

163

Inserai date dintr-un tabel al bazei de date ntr-un document Word

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.

Exportai date dintr-un tabel al bazei de date

Deschidei baza de date Compania i apoi tabelul Clienti.


open database compania
use clienti

Exportai datele din tabel n diferite formate de fiier text ASCII:

copy to cl1.txt sdf


copy to cl2.txt delimited
copy to cl3.txt;
delimited with blank

copy to cl4.txt;
delimited with tab
copy to cl5.txt;
delimited with *

Vizualizai coninutul fiierelor text create i comparai rezultatul exporturilor.

modi file cl1.txt


................
modi file cl5.txt

T est pentru evaluare:


Creai o interogare n care afiai clienii care au fost nregistrai nainte de 01/01/2000.
Interogarea va fi afiat n ordinea codurilor angajailor.
2. Creai o vizualizare cu clienii atribuii angajatului cu codul 200 n perioada 01/01/2000 i
31/12/2001.
1.

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.

Prin intermediul interogrii putei face modificri n tabelele bazei de date.


Prin intermediul unei vizualizri putei modifica orice cmp din tabelele bazei de date.
Folosind interogarea putei stabili o ordine de afiare a nregistrrilor.
Folosind interogarea putei combina nregistrri din mai multe tabele.
Putei insera date dintr-un tabel al bazei de date ntr-un document Word.
Putei exporta un tabel Visual FoxPro ntr-un tabel FoxPro for MS-DOS.
Comanda copy to alfa.txt delimited with ! va exporta datele din tabel ntr-un fiier de
tip text n care cmpurile din tabel vor fi separate de semnul !.

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:

Adevrat/Fals: 1-F; 2-F; 3-A; 4-A; 5-A; 6-A; 7-F.


Completai: 1-comand SQL; 2-tabel; 3-do; 4-generatorul de rapoarte; 5-Detail; 6-delimited with
tab; protocolul OLE.

Utilizarea unor instrumente de prelucrare a datelor

165

8. Tablouri de memorie
Visual FoxPro permite crearea i manipularea structurilor de date de tip tablou de
memorie care, n acest sistem au 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.

8.1. Operaii cu tablouri de memorie:


Asupra tablourilor de memorie Visual FoxPro se pot executa urmtoarele operaii:

1. Crearea tabloului de memorie:


definirea structurii comenzile declare/dimension
atribuirea de valori elementelor comanda store sau
operaia de atribuire

2. Redimensionarea tabloului comenzile declare/dimension

9 schimbarea dimensiunii: din vector n matrice i din matrice n vector;


9 mrirea (creterea numrului de elemente) sau micorarea (diminuarea
numrului de elemente) tabloului.

3. Consultarea tablourilor const n:


9 obinerea de informaii despre elementele tabloului:
global (despre toate elementele) comenzile display/list memory
individual (numai despre anumite elemente) comenzile ?/??
9 obinerea de informaii despre tablou:
lungimea tabloului funcia alen()
poziia unui element din linia i coloana specificat funcia aelement()
numrul liniei sau al coloanei unui element specificat prin poziie n cadrul
tabloului funcia asubscript()
existena unui ir de caractere n tablou funcia ascan()

4. Actualizarea tablourilor const n:


tergerea unui element, a unei linii sau a unei coloane funcia adel()
adugarea unui element, a unei linii sau a unei coloane funcia ains()

5. Copierea unui tablou funcia acopy()


6. Sortarea unui tablou funcia asort()
7. Salvarea informaiilor ntr-un tablou const n salvarea:
coninutului unui director funcia adir()
structurii unui tabel din baza de date (fiier .dbf) funcia afield()

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>

Utilizarea unor instrumente de prelucrare a datelor

167

8.1.2. Redimensionarea tablourilor de memorie:


Redimensionarea unui tablou se face redeclarnd structura cu comanda declare/define.
Se pot executa urmtoarele operaii:
a. Se schimb dimensiunea tabloului, adic un tablou unidimensional (vector) se poate
transforma ntr-un tablou bidimensional (matrice) i invers. Prin schimbarea dimensiunii
nu se distrug datele din tablou.
b. Se mreste tabloul, adic se crete numrul de elemente ale tabloului. Elementele
adugate vor fi inializate cu valoarea logic .F..
c. Se micoreaz tabloul, adic se reduce numrul de elemente ale tabloului. Elementele care vor ajunge n afara tabloului, n urma redeclarrii structurii, se vor pierde.

8.1.3. Consultarea tablourilor:


Consultarea unui tablou de memorie (obinerea de informaii din tabloul de mmorie) se
poate face prin urmtoarele operaii:
a. Vizualizarea elementelor tabloului. Se poate executa n dou moduri:
Se vizualizeaz toate elementele tabloului (sunt afiate valorile elementelor i
informaii despre tipul lor) folosind comenzile list memory | display memory care
au sintaxa:
list memory | display memory like <nume_tablou>
Se vizualizeaz valoarea unui element sau a mai multor elemente folosind comanda
?| ?? (elementele tabloului sunt tratate ca variabile de memorie):
?| ?? <element_tablou>
sau:
?| ?? <list_elemente_tablou>
b. Obinerea de informaii despre tablou sau despre elementele tabloului. Aceste
1
informaii se pot obine cu ajutorul urmtoarelor funcii :
Lungimea tabloului, adic numrul de elemente ale unui tablou se poate obine cu
ajutorul funciei alen() care are sintaxa: alen(<nume_tablou>,[,<expN>]) . Funcia
furnizeaz un rezultat numeric.
Implicit acesta este numrul de ele?
mente din tablou. Dac se folosete
1. Ce valoare va furniza funcia alen() dac
argumentul <expN> care este opse va preciza argumentul <expN> n cazul
ional, funcia va furniza numrul de
unui vector?
linii (pentru valoarea 1 a argumen2. Ce valoare va furniza funcia alen() dac
tului <expN>) sau numrul de coloaargumentul <expN> are valoarea 0 sau o
ne (pentru valoarea 2 a argumenvaloare mai mare dect 2?
tului <expN>).

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?

Numrul liniei sau al coloanei unui element din


tablou (adic unul dintre indicii ele-mentului), identificat prin poziia sa n cadrul
tabloului, se obine cu ajutorul funciei asubscript() care are sintaxa:
asubscript(<nume_tablou>,<expN1>,<expN2>), unde prin <expN1> se precizeaz
poziia elementului i prin expresia <expN2>, ceea ce dorii s aflai. Funcia furnizeaz
un rezultat numeric care reprezint
?
pentru vectori numrul de ordine al
elementului, iar pentru matrice
1. Ce valoare va furniza funcia asubscript()
dac pentru un vector se furnizeaz
numrul liniei (primul indice) dac
argumentul <expN2>?
<expN2> are valoarea 1 sau numrul
2. Ce valoare va furniza funcia asubscript()
coloanei (al doilea indice) dac
dac pentru o matrice argumentul
<expN2> are valoarea 2.
<expN2> are valoarea 0 sau o valoare

Cutarea unui element din tablou


mai mare dect 2?
care are o valoare precizat se face
cu funcia ascan():
ascan(<nume_tablou>,<exp>[,<expN1>[,<expN2>]]), unde <exp> este expresia prin
care se specific valoarea cutat. Ea poate fi de orice tip (numeric, ir de caractere,
logic, dat calendaristic). Funcia furnizeaz un rezultat numeric care reprezint
numrul de ordine al elementului care are valoarea precizat. Dac nici un element
nu are aceast valoare, rezultatul furnizat va fi 0. Implicit cutarea se face prin toate
elementele tabloului. Explicit se caut numai printre elementele care ncep din poziia
precizat cu argumentul <expN1> i pn la elementul din poziia precizat cu
argumentul <expN2>.

8.1.4. Actualizarea tablourilor de memorie:


Valoarea unui element al tabloului de memorie poate fi modificat prin simpla atribuire a noii
valori. n afar de aceast operaie de actualizare, se mai pot executa urmtoarele operaii:
a. Inserarea unui element (pentru vectori) sau a unei linii/coloane (pentru matrice) se face
cu ajutorul funciei ains(): ains(<nume_tablou>,<expN>[,2]) , unde argumentul
<expN> se folosete pentru a preciza poziia n care se face inserarea. Argumentul 2
se folosete la matrice unde, dac nu se precizeaz se insereaz o linie, iar dac se
precizeaz se insereaz o coloan. Funcia furnizeaz un rezultat numeric astfel: 1
dac operaia s-a executat cu succes i -1 n caz contrar. Funcia nu modific dimensiunea tabloului. Elementele care urmeaz poziiei, respectiv liniei sau coloanei inserate vor fi deplasate spre sfritul tabloului, iar ultimul element, respectiv ultima linie sau
coloan va fi scos n afara tabloului i se va pierde. n poziia inserat elementelor li se
va atribui valoarea .F..

Utilizarea unor instrumente de prelucrare a datelor

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..

8.1.5. Copierea unui tablou de memorie:


Se poate realiza o copie a unui tablou de memorie folosind funcia acopy() care are
urmtoare sintax:
acopy(<nume_tablou1>,<nume_tablou2>[,<expN1>[,<expN2>[,<expN3>]]])
Se copiaz elementele tabloului identificat prin <nume_tablou1> (tabloul surs) n tabloul
identificat prin <nume_tablou2> (tabloul destinaie). Dac tabloul destinaie nu exist, el va
fi creat automat de aceeai dimensiune i mrime ca i tabloul surs. Implicit se copiaz
toate elementele. Explicit se copiaz numai o poriune din tabelul surs, i anume cea care
ncepe din poziia precizat prin <expN1> i conine urmtoarele <expN2> elemente.
Implicit copierea se face n tabelul destinaie ncepnd din prima poziie. Explicit, copierea
se face ncepnd din poziia precizat prin <expN3>. Funcia furnizeaz un rezultat
numeric care reprezint numrul de elemente copiate.

8.1.6. Sortarea unui tablou de memorie:


Folosind funcia asort() se pot ordona cresctor sau descresctor elementele unui vector
sau liniile unei matrice n funcie de valoarea elementelor dintr-o coloan precizat. Pentru
a se putea executa operaia de sortare tabloul de memorie trebuie s fie omogen.
Funcia are urmtoarea sintax:
asort(<nume_tablou> [,<expN1>[,<expN2>[,<expN3>]]])
Se sorteaz elementele tabloului identificat prin <nume_tablou>. Modul n care se face
ordonarea se precizeaz prin argumentul <expN3> care, dac este diferit de zero,
determin o ordonare descresctoare, iar dac este zero sau lipsete, determin o
ordonare cresctoare. Funcia furnizeaz un rezultat numeric astfel: 1 dac operaia s-a
executat cu succes i -1 n caz contrar. Implicit se ordoneaz toate elementele vectorului,
respectiv toate liniile matricei ncepnd cu primul element al tabloului. Explicit se ordoneaz
numai numrul de elemente sau numrul de linii precizate prin <expN2> ncepnd cu
poziia precizat prin <expN1>, respectiv cu linia n care se gsete elementul cu numrul
de ordine precizat prin <expN1>. n cazul unei matrice, coloana folosit pentru ordonare
este coloana elementului cu numrul de ordine precizat prin<expN1>.

8.1.7. Salvarea informaiilor n tablouri de memorie:


ntr-un tablou de memorie pot fi salvate urmtoarele informaii:
a. Coninutul directorului curent poate fi salvat ntr-un tablou de memorie de tip matrice
folosind funcia adir(): adir(<nume_tablou>,<expC1>[,<expC2>]) . 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

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.

8.2. Pstrarea variabilelor de memorie i a tablourilor de memorie


n afara sesiunii de lucru
Tablourile de memorie sunt structuri de date temporare. La terminarea execuiei
programului sau la terminarea execuiei sesiunii de lucru Visual FoxPro, datele pstrate
n ele se pierd. La fel ca i n cazul variabilelor de memorie, datele din tablourile de
memorie pot fi salvate ntr-un fiier (fiier cu extensia .mem) folosind comanda save to i
readuse din fiier n memoria intern folosind comanda restore from.

8.3. Transferul datelor ntre variabile de memorie sau tablouri de


memorie i un tabel al bazei de date
Se pot transfera date n ambele sensuri ntre memoria intern (variabile de memorie sau
tablouri de memorie) i memoria extern (fiiere cu tabelele bazei de date). Astfel:
variabile de memorie tabel din baza de date :
a. variabil de memorie cmp memo din tabel
Save to memo
memoria intern
(variabil de memorie)

memoria extern
(cmp memo din tabel)

Restore from memo

Utilizarea unor instrumente de prelucrare a datelor


b.

171

set de variabile de memorie cmpuri dintr-o nregistrare din tabel


tablou de memorie tabel din baza de date :
Replace
Gather
memoria intern
(set de variabile de memorie)

memoria extern
(cmpuri dintr-o nregistrare din tabel)

Scatter

Append from array


Gather
memoria intern
(tablou de memorie)

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

Utilizarea unor instrumente de prelucrare a datelor

173

dat de tip dat calendaristic poate fi transformat ntr-o dat de tip numeric. O dat de
tip ir de caractere nu poate fi transformat ntr-o dat de tip numeric, iar o dat de tip
numeric nu poate fi transformat ntr-o dat de tip dat calendaristic.
append from array <nume_tablou> [fields <list_cmpuri>] [for <expL>]

Creai tablouri de memorie


1. Creai dou structuri de date - a de tip
vector i b de tip matrice, ambele cu
10 elemente:
declare a(10), b(2,5)

2. Afiai valoarea tuturor elementelor


din tablouri folosind comanda display
memory.
display memory like a
display memory like b

Observai c informaia este afiat sub


forma unui tabel - pe fiecare linie se afieaz informaii despre un element, iar pe
fiecare coloan cte un tip de informaie:
valoarea indicelui sau valorile indicilor, tipul datei din element, valoarea datei i,
pentru datele numerice, i reprezentarea
intern a valorii. Iniial toate elementele tablourilor create au valoarea logic .F..
3. Afiai valoarea unor elemente din
tablouri:
? a(5)
.F.
? b(2,4)
.F.

4. Atribuii valori elementelor din tablourile create i verificai modul n care


s-au executat operaiile de atribuire:
b(2,4)=40
? b(2,4)
40
? b(9)
40
b(1,1)='azi'
b(1,2)='maine'

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)

6. Consultai tablouri de memorie (lungime, indici, existena unui element):


? alen(a)
10
? alen(b)
16
? alen(b,1)
2
? alen(b,2)
8
? aelement(b,2,3)
11
? asubscript(b,11,1)
2
? asubscript(b,11,2)

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

7. Actualizai tablourile de memorie:


display memory like a
elementele a(9) i a(10) au
valoarea .F.
? ains(a,3)
1
display memory like a
elementele a(3) i a(10) au
valoarea .F.
a(3)='nou'
display memory like a
? adel(a,5)
1
display memory like a
elementele a(9) i a(10) au
valoarea .F.
? adel(a,15)
mesaj de eroare (depirea
rangului indicelui): "Subscript is
outside defined range"
? ains(a,15)
acelai mesaj de eroare (depirea rangului indicelui)
declare b(2,5)
display memory like b
? ains(b,3,1)
acelai mesaj de eroare (depirea rangului indicelui)
? ains(b,2,1)
1
display memory like b
elementele din ultima linie a
matricei au valoarea .F.

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

8. Copiai tablouri de memorie n alte


tablouri de memorie:
declare d(20)
declare e(5)
? acopy(b,d)
10
display memory like d
elementele tabloului b au fost
copiate n primele 10 elemente
ale tabloului d; restul elementelor din d au valoarea .F.
? acopy(b,c)
10
display memory like d
s-a creat tabloul de memorie c
care are 10 elemente; elementele tabloului b au fost copiate
n tabloul c
? acopy(b,e)
mesaj de eroare (depirea
rangului indicelui)
? acopy(b,e,1,5)
5
display memory like e
s-au copiat n vectorul e primele 5 elemente din matricea b
(prima linie)
? acopy(b,a,6,5,4)
5
display memory like a
s-au copiat n vectorul a, ncepnd de la elementul a(4) pn

Utilizarea unor instrumente de prelucrare a datelor


la elementul a(8) cele 5 elemente din ultima linie a matricei b

9. Sortai tablourile de memorie:


? asort(a)
mesaj de eroare (elementele
tabloului trebuie s fie de acelait tip): "Data type mismatch"
a(3)=100
a(9)=15
a(10)=0
a(1)=5
a(2)=25
display memory like a
? asort(a)
1
display memory like a
elementele vectorului a sunt
ordonate cresctor
? adel(a,1,alen(a),1)
1
display memory like a
elementele vectorului a sunt
ordonate descresctor
declare a(3,4)
a(11)=300
a(12)=400
display memory like a
elementele matricei a sunt:
100
50
40
30
25
20
15
10
5
0
300
400
? asort(a,2)
1
display memory like a
au fost sortate toate liniile
matricei a ncepnd cu linia n
care se gsete elementul 2 prima linie i dup coloana n
care se gsete acest element coloana 2; elementele matricei
a sunt:
5
0
300
400
25
20
15
10
100
50
40
30
? asort(a,3,2)
1
display memory like a
au
fost
sortate
cresctor
primele dou linii ale matricei a
ncepnd cu linia n care se gsete elementul 3 - prima linie

175

i dup coloana n care se gsete acest element - coloana


3; elementele matricei a sunt:
25
20
15
10
5
0
300
400
100
50
40
30

10. Transferai date ntre tablouri de


memorie i tabelul bazei de date:
create ex
Se creeaz tabelul liber ex cu
urmtoarea structur: c1(C,10),
c2(N,5,0), c3(D), c4(L)
declare a(2,4)
a(1,1))='linia1'
a(1,2))=100
a(1,3))=date()
a(1,4))=.T.
a(2,1))='linia2'
a(2,2))=200
a(2,3))=date()+10
a(2,4))=.F.
append from array a
list
goto 2
replace c2 with 500
list
goto top
scatter to q
display memory like q
a fost creat vectorul q cu 4 elemenete; elementele sale conin
valorile cmpurilor din prima
nregistrare a tabelului ex
q(1)='linia3'
q(2)=1000
display memory like q
append from array q
list
tabelul conine trei nregistrri; ultima nregistrare conine valorile elementelor vectorului q:
a(1,1))='linia4'
a(1,2))=800
a(1,3))=date()+20
a(2,1))='linia5'
a(2,2))=900
a(2,3))=date()+30
display memory like a
append from array a
list

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

11. Salvai informaii n tablouri de memorie:


? adir(alfa,'*.dbf")
display memory like alfa
?alfa(1,1)
? adir(alfa,'*ex.dbf")
display memory like alfa
?afields(alfa)
display memory like alfa
help afields()

12. Transferai date ntre tabele ale bazei de


date i tablouri de memorie. Pentru aceasta deschidei tabelul Sedinte din
baza de date Compania. Copiai
cmpurile nr_s, id_cont, id_ang, cost_s
ntr-un tabel de memorie i sortai aceste

date dup valoarea cresctoare a


cmpului cost_s (coloana 4 a tabloului):
open database compania
use sedinte
release all like a
x=reccount()
declare a(reccount(),4)
copy to array a fields nr_s, id_cont,
id_ng, cost_s
display memory like a
sau
?a(1,1), a(1,2), a(1,3), a(1,4)
?a(2,1), a(2,2), a(2,3), a(2,4)
?a(3,1), a(3,2), a(3,3), a(3,4)
..............................................
?asort(a,4)
append from array a fields nr_s,
id_cont, id_ang, cost_s
brow
goto x+1
delete rest
pack
use
close database
clear memory

T est pentru evaluare:


1. Creai structura a dou tablouri de memorie: vectorul b cu 10 elemente i matricea a cu
dou linii i cinci coloane.
2. Afiai coninutul acestor tablouri de memorie. Afiai lungimea lor.
3. Atribuii tuturor elementelor din vectorul b valoarea 0. Atribuii elementelor din matricea
a valorile 1, 2, ..., 10. Afiai coninutul celor dou tablouri de memorie.
4. Afiai valoarea elementului 8 din vectorul b. Afiai valoarea elementului 8 din matricea
a. Afiai valoarea elementului din linia 2 i coloana 3 din matricea a.
5. Afiai numrul de ordine al elementului din linia 2 i coloana 3 a matricei a.
6. Afiai din matricea a valoarea elementului care are numrul de ordine al elementului
din linia 2 i coloana 3 a matricei a.
7. Memorai n variabila ak1 numrul de linii ale matricei a. Memorai n variabila ak2
numrul de coloane ale matricei a. Memorai n variabila al numrul de elemente ale
matricei a. Memorai n variabila bl numrul de elemente ale matricei b.
8. Folosind variabilele de memorie definite anterior, afiai pe ecran urmtorul text
(prezentai cele trei variante):
Tabloul are <n> linii i <m> coloane
9. Transformai matricea a ntr-un vector cu 10 elemente. Afiai coninutul acestui vector.
10. Transformai vectorul a ntr-o matrice cu 2 linii i 4 coloane. Afiai coninutul matricei.
11. 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.

Utilizarea unor instrumente de prelucrare a datelor

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

2. ntr-o matrice Visual FoxPro se pot ordona:


a) elementele
b) liniile

c) coloanele

3. Elementul inserat ntr-un vector va avea valoarea:


a) .T.
b) .F.
c) NULL pentru acel tip de dat
4. Pentru a cuta un element al tabloului de memorie care are o valoare precizat, folosii
funcia:
a) afind()
b) afilds()
c) ascan()
5. Putei ncrca ntr-un vector cmpurile din nregistrarea curent a tabelului activ cu
ajutorul comenzii:
a) restore from
b) copy to array
c) scatter
6. Putei ncrca n cmpurile din nregistrarea curent a tabelului activ datele din elementele unui vector folosind comanda:
a) save to
b) gather
c) append from array
Rspundei:
1. Caracterizai structura de date de tip tablou de memorie din Visual FoxPro.
2. Ce operaii se pot executa cu tablourile de memorie?
3. Ce operaii de transfer se pot executa ntre datele din memoria intern i datele din
memoria extern.

R spunsuri:

Adevrat/Fals: 1-F; 2-A; 3-F; 4-F; 5-A.


Completai: 1-afields(); 2-numrul de coloane; 3-.F.; 4- adel(a,2,2).
Alegei rspunsul corect: 1) a; 2) b; 3) b;4) c;5) b,c; 6) b.

Capitolul

Elaborarea unor
strategii de modularizare
i abstractizare a
prelucrrii datelor

Dup ce vei parcurge acest capitol


trebuie s tii:

1. Cum putei crea o aplicaie Visual

Ai nvat s folosii interfaa unui sistem de gestiune a bazelor de date pentru a crea i a ntreine
o baz de date.

Pentru exploatarea unei baze de date, utilizatorul


nu interacioneaz direct cu baza de date sau cu
sistemul de gestiune al bazei de date, ci cu un
software de aplicaie. Rolul acestuia este de a
folosind elementele programrii
clasice.
prezenta informaiile din baza de date ntr-o form
4. Ce metode putei folosi pentru
i n termeni accesibili utilizatorului. Utilizatorul
construirea interfeei unei aplicaii.
interacioneaz cu aplicaia prin intermediul inter5. Cum putei construi interfaa unei
feei. Aadar, partea vizibil a oricrei aplicaii
aplicaii folosind programarea
cu care interacioneaz utilizatorul este interorientat pe obiecte.
faa. Din punctul de vedere al utilizatorului, apli6. Cum putei construi interfaa aplicaiei cu ajutorul obiectelor vizuale. caia nseamn de fapt interfaa ei. Pentru el nu
conteaz instruciunile care se gsesc n spatele
ei i nici efortul consumat de programator pentru a scrie i a optimiza codul programului.
Pentru utilizator conteaz modul n care exploateaz aplicaia, adic interfaa i
informaiile pe care le obine prin intermediul acestei interfee.
FoxPro.

2. Cum putei modulariza aplicaia.


3. Cum putei dezvolta o aplicaie

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.

1. Elemente de programare clasic structurat


1.1. Declararea datelor
Atunci cnd ai folosit un limbaj clasic de programare structurat ai vzut c programul
conine o seciune declarativ, n care trebuie definite datele elementare i structurile de
date folosite de algoritmul care rezolv problema. n aceast seciune datele se definesc
prin precizarea identificatorului i a tipului datei. Aceast seciune declarativ trebuie s
precead seciunea de instruciuni care descriu algoritmul, deoarece n faza de compilare
se aloc fiecrei date, n funcie de tip, zona de memorie corespunztoare. Programul
scris n limbajul gazd FoxPro nu conine o seciune declarativ n care s fie definite
datele care vor fi folosite de instruciunile programului. Variabilele de memorie i
tablourile de memorie pot fi definite oriunde n interiorul programului astfel:
9 variabilele de memorie simple (corespunznd datelor elementare) se creeaz prin
atribuirea unei valori unui identificator, tipul valorii atribuite determinnd tipul datei.
9 tablourile de memorie se creeaz cu comanda dimension sau declare.
De exemplu, urmtoarele comenzi creeaz (i implicit definesc) variabile de memorie de
tip numeric prin atribuirea de valori numerice unui identificator:
a=100
{atribuie variabilei de memorie a valorea 100}
store 1000 to b
{atribuie variabilei de memorie b valorea 1000}
input 'n= ' to n
{atribuie variabilei de memorie n valorea introdus de la
tastatur}

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor


sum camp1 to c
count to d

181

{atribuie variabilei de memorie c valorea obinut prin nsumarea


valorilor din cmpul numeric camp1 al tabelului activ}
{atribuie variabilei de memorie d valorea obinut prin numrarea
nregistrrilor din tabelul activ}

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).

1.2. Structuri de control


tii deja c un program reprezint o succesiune de comennzi de operaii numite instruciuni, care trebuie s rezolve o anumit problem, descriind un anumit algoritm. Structura
de control a algoritmului definete ordinea de executare a pailor, adic ordinea n care
un pas pred controlul altui pas i prin care se determin fluxul controlului. n general,
instruciunile unui program se execut n ordinea n care apar scrise n programul surs,
dar uneori este necesar s se schimbe aceast ordine cu ajutorul unor instruciuni de
control. Atunci cnd ai studiat un limbaj de programare clasic ai vzut c pentru a
descrie un algoritm este suficient s folosii trei tipuri de structuri de control:

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.

Instruciunile de control implementate n limbajul gazd FoxPro sunt:


simpl

if ... endif

structura alternativ
generalizat

cu numr
cunoscut de pai

do case ... endcase

for ... endfor

structura repetitiv
cu numr necunoscut
de pai, condiionat
anterior
pentru parcurgerea
nregistrrilor dintr-un
tabel

do while ... enddo

scan ... endscan

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.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

183

2. Nu este implementat structura repetitiv cu numr necunoscut de pai condiionat


posterior (de tip repeat ... until).

1.2.1. Structura liniar sau secvenial


Structura liniar sau secvenial este structura n care comenzile se execut n ordinea n
care au fost scrise.
Comentariile
Sunt iruri de caractere inserate n program care nu reprezint comenzi executate de
sistem. Ele se folosesc pentru a uura urmrirea logicii unui program. Se pot folosi dou
tipuri de comentarii:
9 Linia de comentariu. Este un text care se scrie pe o linie sau mai multe linii. Pentru a
nu fi interpretat de ctre sistem ca instruciune, textul este precedat de caracterul **
sau de cuvntul cheie note . La fel ca i la o comand, pentru a arta c ea continu
i pe rndul urmtor scriei la sfritul liniei de comentarii caracterul ;.
9 Comentariu inserat n comand. Este un text care se scrie pe aceeai linie cu comanda,
dar la sfritul ei. Pentru a nu fi interpretat de ctre sistem ca adverb al comenzii, textul
este precedat de caracterele && . Comentariul poate fi continuat pe rndul urmtor dac
scriei la sfritul liniei caracterul ;. Nu adugai comentarii la sfritul unei linii de comand
care se continu pe rndul urmtor. De exemplu, nu vei scrie pe un rnd input 'x= ' to ; &&
Se introduce x iar pe rndul urmtor continuai comanda scriind x.
Exemplu
S se genereze aleator un numr cu valoarea cuprins ntre dou numere precizate, a
cror valoare se introduce de la tastatur:

note Programul este un exemplu pentru modul in care pot fi;


folosite comentariile
set talk off
clear
&& Se sterge ecranul
store 0 to x,y
&& Nu este obligatoriu sa se initializeze;
aceste variabile de memorie
? 'Programul va furnizeaza un numar aleator intre x si y'
? 'Numerele x si y pot lua orice valoare ntre 0 si 999'
* Se introduc de la tastatura valorile pentru x si y
input 'x= ' to x
input 'y= ' to y
note Se initializeaza generatorul de numere aleatoare
=rand(-1) && Comanda = evalueaza una sau mai multe expresii preci-;
zate printr-o lista scrisa n dreapta caracterului =;
n exemplu se evalueaza functia rand(-1))
z=x+(y-x)*rand() && se calculeaza valoarea z (numar aleator)
? 'Numarul este: '+str(z,8,4)
wait 'Actionati orice tasta pentru continuare'
clear
return

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

set talk off


clear
store 0 to a,b
? 'Programul va furnizeaza;
solutia ecuatiei de gradul I'
? 'de forma a*x+b=0'
input 'a= ' to a
input 'b= ' to b
if a=0
if b=0
? 'Ecuatia are o infinitate;
de solutii'

else
? 'Ecuatia este imposibila'
endif
else
x=-b/a
? 'x= ',x
endif
wait 'Actionati orice tasta;
pentru continuare'
clear
return

Metoda 2 (care folosete structuri if...endif imbricate)

set talk off


clear
store 0 to a,b

? 'Programul va furnizeaza;
solutia ecuatiei de gradul I'
? 'de forma a*x+b=0'

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor


input 'a= ' to a
input 'b= ' to b
if a=0 and b=0
? 'Ecuatia are o infinitate;
de solutii'
else
if a=0 and b<>0
? 'Ecuatia este imposibila'
else

185

x=-b/a
? 'x= ',x
endif
endif
wait 'Actionati orice tasta;
pentru continuare'
clear
return

Metoda 3 (care folosete funcia iif())

set talk off


clear
store 0 to a,b
? 'Programul va furnizeaza solu-;
tia ecuatiei de gradul I'
? 'de forma a*x+b=0'
input 'a= ' to a
input 'b= ' to b

? 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

b. Structura alternativ generalizat


Structura alternativ generalizat permite executarea unei singure aciuni din mai multe
aciuni posibile (descrise prin secvenele de instruciuni: <secven-instruciuni-1>,
<secven-instruciuni-2>, ..., <secven-instruciuni-n+1>). Stabilirea aciunii care urmeaz s se execute se face n urma evalurii unei condiii care poate lua mai multe valori
exprimate prin expresiile logice (<expL1>, <expL2>, ..., <expLN>):
do case
case <expL1>
<secven-instruciuni-1>
case <expL2>
<secven-instruciuni-2>
..............................................
case <expLi>
<secven-instruciuni-i>
.............................................
case <expLn>
<secven-instruciuni-n>
[otherwise
<secven-instruciuni-n+1>]
endcase
Observaii:
1. Cuvintele cheie do case i endcase delimiteaz structura, iar cuvintele cheie case marcheaz nceputul unui caz care urmeaz s fie tratat (condiia logic ce trebuie evaluat
i secvena de instruciuni care descrie activitatea ce se va executa atunci cnd condiia
logic are valoarea adevrat). Cuvntul cheie otherwise mpreun cu secvena de instruciuni <secven-instruciuni-n+1> sunt opionale i reprezint aciunea care se va

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.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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'

1.2.3. Structura repetitiv


Prin aceast structur se execut repetat o aciune (exprimat printr-o secven de instruciuni - <secven-instruciuni>) att timp ct este ndeplinit o condiie pentru execuia repetat. Toate structurile repetitive accept n
corpul lor (secvena de instruciuni care se execut
for
repetat) instruciunile loop i exit:
contor:=<expN1>

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.

Instruciunile loop i exit se vor folosi ntr-o structur


alternativ din interiorul structurii repetitive.

to
<contor>
<= <expN2>

.F.

endfor
.T.
<secven-instruciuni>
<contor>=<contor>+<expN3>

step

n limbajul FoxPro sunt implementate urmtoarele


tipuri de structuri repetitive:
a. Structura repetitiv cu numr cunoscut de pai
Permite executarea repetat a unei secvene de instruciuni de un numr specificat de
ori. Pentru a numra de cte ori s-a executat secvena de instruc-iuni se folosete
variabila de memorie <contor> care va avea valoarea iniial precizat prin <expN1> la
nceperea executrii repetate a secvenei de instruciuni. Aceast variabil va trebui s
aib valoarea precizat prin <expN2> pentru a se termina executarea repetat a
secvenei de instruciuni. Dup fiecare executare a secvenei de instruciuni, variabila
contor este incrementat implicit cu valoarea 1 sau, dac se precizeaz clauza step, cu
valoarea <expN3>. Sintaxa instruciunii este:

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

de la tastatur. Valoarea lui n se introduce

suma=suma+a
endfor
? 'Suma = ', suma
wait 'Actionati orice
pentru continuare'
clear
return

tasta;

b. Structura repetitiv cu numr necunoscut de pai condiionat anterior


Permite executarea repetat a unei secvene de instruciuni att timp ct o condiie exprimat printr-o expresie logic <expL> are valoarea adevrat. Sintaxa instruciunii este:
do while <expL>
<secven-instruciuni>
enddo
Observaii:
1. Cuvntul cheie while marcheaz nceputul structurii iar
cuvntul cheie enddo sfritul ei.
2. Cuvntul cheie while mpreun cu expresia logic i
cuvntul cheie enddo se scriu fiecare pe cte un rnd.

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>

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

189

set talk off


clear
store 0 to suma,i
? 'Programul calculeaza media aritmetica a numerelor '
? 'introduse de la tastatura'
accept 'Doriti sa introduceti primul numar? (d/n) ' to rasp
do while .T.
do case
case rasp$'Dd'
input 'a= ' to a
suma=suma+a
i=i+1
accept 'Mai doriti sa introduceti un numar? (d/n) ' to rasp
case rasp$'Nn'
exit
otherwise
? 'Ati raspuns gresit'
accept 'Mai doriti sa introduceti un numar? (d/n) ' to rasp
endcase
enddo
if i<>0
media=suma/i
? 'Media = ', media
else
? 'Nu ati introdus nici un numar si nu se poate calcula media'
endif
wait 'Actionati orice tasta pentru continuare'
clear
return
Exemplu:
n tabelul Sedinte din baza de date Compania s se numere edinele care au avut o
valoare mai mare dect o valoare precizat, care se va introduce de la tastatur. S se
afieze numrul acestor edine i ce procent reprezint ele din totalul edinelor.
set talk off
endif
clear
k=k+1
store 0 to k
skip
? 'Programul evalueaza valoarea;
enddo
sedintelor'
? str(k,3)+' sedinte ' au o va-;
input 'Introduceti valoarea de;
loare mai mare de '+str(val,8)
referinta: ' to val
? 'si reprezinta '+;
open database compania
str(((k/reccount())*100),5,2);
use sedinte
+'% din total sedinte'
do while .T.
wait 'Actionati orice tasta;
if eof()
pentru continuare'
exit
clear
endif
use
if cost_s<val
close databases
skip
return
loop

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.

set talk off


clear
store 0 to tot_cost, tot_timp,k
? 'Programul furnizeaza informatii despre sedintele de ;
consultanta ale unui angajat'
input 'Introduceti identificatorul angajatului: ' to cod
open database compania
use sedinte
? 'Lista sedintelor angajatului '+str(cod,4)
scan for id_ang=cod
? id_cont, data_s, timp_s, cost_s
tot_cost=tot_cost+cost_s

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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

1.3. Construirea programului


Pentru construirea i lansarea n execuie a unui program Visual FoxPro se parcurg etapele:

1.3.1. Crearea programului surs


Programul surs se scrie ntr-un fiier de tip text cu ajutorul editorului de texte ncorporat.
Editorul de texte se activeaz cu comanda modify command (care creeaz un fiier program
surs, cu extensia implicit .prg) sau modify file (care creeaz un fiier text, cu extensia
implicit .txt). Prin aceast comand se deschide fereastra de editare, n care se vor scrie
comenzile i instruciunile programului. Fereastra editorului de texte poate fi deschis cu ajutorul
acestor comenzi fie din fereastra Command (folosind limbajul de comand), fie din interiorul
unui program (folosind una dintre aceste comenzi ca instruciune ntr-un program surs).
Sintaxa celor dou comenzi este:
modify command | modify file [<nume_fiier> | <ablon> | ?] [noedit] [nowait]
[range <expN1>, <expN2>] [save]
[[window <nume_fereastr_1>] [in [window] <nume_fereastr_2> ]]
Forma implicit a comenzii este modify command | modify file care deschide fereastra de
editare pentru a crea un fiier de tip text al crui nume se va comunica ulterior prin operaia
Save as i care va avea extensia implicit comenzii. Dac vei comunica i numele fiierului
prin adverbul <nume_fiier>, n fereastra de editare se va ncrca coninutul fiierului pentru a
fi editat (la creare, coninutul fiierului este vid). i n acest caz, comanda va avea n vedere
fiierele care au extensia implicit. Dac vrei s ncrcai un fiier cu o alt extensie, trebuie
s precizai i extensia. Dac nu cunoatei numele fiierului, folosii adverbul ? care va
deschide caseta de dialog Open prin intermediul creia putei alege numele fiierului. Pentru
numele fiierului putei folosi un ablon pentru nume de fiiere (adverbul <ablon>). n acest
caz se vor deschide mai multe ferestre de editare i n fiecare fereastr va fi ncrcat cte un
fiier care corespunde ablonului.
Implicit se pot face modificri n text. Explicit textul poate fi numai vizualizat dac se
folosete clauza noedit. Implicit n fereastra de editare este ncrcat tot textul din fiier,
Explicit este ncrcat numai textul cuprins ntre caracterele cu numrul de ordine precizat
prin expresiile <expN1> i <expN2> ale clauzei range.
Dac se folosete comanda ntr-un program, implicit programul i ntrerupe execuia,
ateptnd nchiderea ferestrei de editare. Explicit, programul i poate continua execuia
dac se precizeaz clauza nowait. Implicit fereastra de editare se nchide la prsirea
editorului. Explicit ea rmne deschis dac se precizeaz clauza save. Implicit, textul

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>.

1.3.2. Compilarea programului surs


Programul surs poate fi compilat cu comanda compile ce pune n eviden erorile de
sintax ale programului. n urma compilrii se obine un fiier cu extensia .fxp care
conine codul obiect al programului. Comanda are sintaxa:
compile <nume_fiier> | <ablon> [encrypt] [nodebug]
Comanda poate aciona asupra unui singur fiier surs precizat prin adverbul <nume_fiier>
sau asupra unui grup de fiiere surs care poate fi identificat prin adverbul <ablon>. Implicit
codul obinut n urma compilrii nu este cifrat. Explicit el poate fi cifrat dac se precizeaz clauza
encrypte. Implicit se genereaz un cod care permite vizualizarea execuiei programului n
fereastra trace. Pentru a micora dimensiunea acestui cod la 2 octei pentru fiecare linie surs
se poate folosi clauza nodebug. n acest caz nu se va mai putea folosi fereastra trace.

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.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

193

Funcia poate fi utilizat pentru a crea puncte de ntrerupre (breakpoints), adic


instruciuni la care s se opreasc execuia programului pentru a fi depanat. Ea
permite oprirea programului la o linie specificat prin numrul su <expN>:
lineno()=<expN>.
program() - furnizeaz numele programului n execuie sau al programului care
se executa cnd a aprut eroarea. Rezultatul este de tip ir de caractere.
Informaiile furnizate de aceste funcii sunt utile pentru depanarea programului n
fereastra debug.

1.3.3. Lansarea n execuie a programului


Pentru a produce rezultate programul trebuie ncrcat n memoria intern i lansat n
execuie cu comanda do care are sintaxa:
do <nume_fiier_1> [ with <list_parametri>] [in <nume_fiier_2>]
Comanda lanseaz n execuie programul
!
care se afl n fiierul <nume_fiier_1>.
Folosind facilitatea de autodocumentare aflai
Acest fiier poate s aib extensia implicit
ordinea n care comanda do alege programul
.prg (fiier program surs FoxPro), .fxp (fipe care l lanseaz n execuie n funcie de
ier cod obiect FoxPro), .exe (fiier executaextensia fiierului n care este memorat.
bil) sau .app (fiier de aplicaii FoxPro). Implicit se execut programul din acest fiier care
este cutat pe disc n directorul curent sau n directorul specificat n identificatorul fiierului. n
acest caz directorul specificat devine director curent. Explicit, se execut procedura cu numele
<nume_fiier_1> care se gsete n fiierul de programe <nume_fiier_2> precizat n clauza in.
Observaii:
1. Dac se dorete execuia unui fiier care conine comenzi pentru meniuri, formate de
ecran sau interogri trebuie precizat extensia fiierului (.mpr, .spr, qpr).
2. Execuia unui program apelat prin comanda do se termin atunci cnd se ntlnete
una dintre urmtoarele situaii:

9 o comand Return - care red controlul unui alt modul.


9 o comand Cancel - care abandoneaz execuia programului i red controlul
ferestrei de comenzi (comanda elibereaz toate variabilele de memorie);
9 o comand Quit - care ntrerupe execuia programului i red controlul sistemului
de operare.
9 o comand Do - care red controlul modului apelat.
9 sfritul fiierului care conine programul (eof()=.T.)

1.4. Modularizarea aplicaiilor


Ai nvat deja c atunci cnd construii o aplicaie este avantajos s o descompunei n
subprobleme. Aceast operaie este necesar deoarece:

O secven de instruciuni se repet de mai multe ori n cadrul unui program.

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

n Visual FoxPro, la fel ca i n versiunile anterioare de FoxPro exist dou metode de a


descompune o problem n subprobleme (module):
9 Construii modulele sub form de programe independente. Fiecare program va fi
scris ntr-un fiier separat. Aceste programe se pot apela unele pe altele folosind
comanda do. Se obin astfel comenzi do imbricate. Comanda do accept 128 de
niveluri de imbricare (32 de niveluri n variantele anterioare de FoxPro).
9 Construii modulele sub form de subprograme, la fel ca i n limbajele clasice de
programare. Aceste subprograme pot fi grupate n biblioteci de subprograme.

1.4.1. Controlul execuiei modulelor


Folosind comanda return putei s controlai modul n care redai controlul altui modul.
Comanda are sintaxa:
return [<exp> | to master | to <nume_program>]
Implicit controlul este redat modulului apelant. Explicit controlul poate fi redat modulului principal (nivel 0 pentru comanda do) dac precizai clauza to master, unui alt modul identificat
prin <nume_program> dac precizai clauza to sau putei returna ctre modulul apelant o
valoare precizat prin <exp> dac modulul apelat este un subprogram de tip funcie.
Executarea unui modul poate fi controlat prin comenzile Return , Cancel , Quit i:

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

195

9 Comanda Suspend - care suspend (ntrerupe) execuia unui program. n timpul


suspendrii execuiei se pot executa alte comenzi, se pot vizualiza variabile de memorie etc. Variabilele de memorie create n timpul suspendrii sunt variabile private
(locale). Comanda este util n depanarea programelor. Execuia programului poate fi
reluat din punctul n care a fost ntrerupt cu comanda resume.
9 Comand Resume - care reia execuia unui program suspendat ncepnd cu linia
care a fost ntrerupt (comenzile resume i suspend lucreaz mpreun).
9 Comand Retry - care reexecut comanda anterioar. Ea red controlul modulului
apelant i este util n rutinele de tratare a erorilor sau n cazul n care se dorete
executarea reptat a unei comenzi pn cnd este ndeplinit o condiie.
Pentru depanarea programelor (detectarea i eliminarea erorilor) putei urmri procesul
de execuie folosind ferestrele:
9 Trace. Permite urmrirea procesului de execuie a unui program sau a unui formular.
Execuia poate fi urmrit i pas cu pas.
!
9 Debug. Permite testarea funciilor, vizualizarea
Folosind facilitatea de autodocumenvariabilelor de memorie n timpul execuiei unui
tare aflai informaii despre modul n care
modul, verificarea expresiilor etc. Fereastra are
putei lucra cu ferestrele trace i debug
dou panouri: panoul din dreapta poate fi folosit
pentru a v depana programele.
pentru a edita numele variabilelor de memorie i
expresiile pe care le testai n timpul execuiei
programului, iar panoul din partea dreapt pentru vizualizarea valorii lor.
La primele versiuni de Visual FoxPro ferestrele se deschid cu opiunea Trace Window,
respectiv Debug Window din meniul Tools. Deschidei aceste ferestre naintea comenzii
do cu care lansai n execuie programul pe care vrei s-l testai. n versiunile mai mari
de 4, n fereastra Debugger a aplicaiei (care poate fi deschis cu opiunea Debugger
din meniul Tools) pot fi deschise mai multe ferestre document care v ajut s urmrii
modul n care se execut programul: Trace - n care se afieaz instruciunile programului, Watch - n care sunt afiate valorile variabilelor de memorie folosite de program,
Locals - n care sunt afiate valorile variabilelor de memorie locale folosite de subprogramul care se execut, Call Stack - stiva programelor n execuie (util n cazul unei aplicaii modularizate deoarece permite vizualizarea modului n care se apeleaz modulele).
Indiferent de versiunea de Visual FoxPro folosit, depanatorul de programe v ofer
urmtoarele faciliti:
9 Rularea pas cu pas (step over). Execuia programului este suspendat dup execuia
fiecrei instruciuni permind programatorului s observe modul n care s-a executat instruciunea. Execuia urmtoarei instruciuni se face numai la cererea programatorului.
9 Rularea cu vitez ncetinit (throttle). Execuia programului se face n mod continuu,
dar dup execuia fiecrei instruciuni este introdus un timp de ateptare (a crui valoare
este precizat de programator). Acest mod de rulare a programului permite programatorului s vizualizeze valorile unor variabile mai rapid dect n cazul rulrii pas cu pas.
9 Rularea continu pn la intlnirea unui punct de ntrerupere (breackpoint). Execuia programului se face n mod continuu pn la ntlnirea unui punct de ntrerupere,
dup care execuia poate fi reluat (resume) sau anulat (cancel). Punctele de ntrerupere sunt create de ctre programator n interiorul programului prin precizarea urm-

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.

1.4.2. Domeniul de vizibilitate al identificatorilor


Deoarece att n modulul apelant, ct i n modulul apelat sunt definii mai muli identi1
ficatori pentru variabilele i tablourile de memorie , apare urmtoarea problem: care
este domeniul de vizibilitate al identificatorilor n funcie de locul i modul n care sunt
declarai? Ai nvat deja c domeniul de vizibilitate al unui identificator este regiunea din interiorul programului n care un identificator este vizibil (poate fi referit n
cadrul unei operaii de consultare sau modificare).
n Visual FoxPro n funcie de domeniul de vizibilitate, variabilele de memorie se clasific n:
9 Globale sau publice. Ele sunt vizibile att n modulul n care au fost declarate, ct i
n modulele activate de acesta, din momentul n care au fost declarate i pn cnd
modulul i termin execuia. Se recomand folosirea lor atunci cnd unele date sunt
folosite n comun de mai multe module ale aplicaiei. Declararea lor se face cu
instruciunea Public care are urmtoarea sintax:
public <list_variabile_memorie>
pentru variabilele de memorie i

public [array] <nume_tablou_1>(<expN11>[,<expN12>])


[<nume_tablou_2>(<expN21>[,<expN22>])] ...
pentru tablourile de memorie.
Locale. Sunt vizibile numai n modulul n care au fost create. La terminarea execuiei
modulului, ele vor fi distruse, eliberndu-se zona de memorie pe care o ocupau.
Folosirea lor este util pentru a se elimina confuziile care apar atunci cnd se
folosesc variabile cu acelai nume n dou module diferite. Ele pot fi create cu
instruciunea Local care are urmtoarea sintax:
local <list_variabile_memorie>
pentru variabilele de memorie i

local [array] <nume_tablou_1>(<expN11>[,<expN12>])


[<nume_tablou_2>(<expN21>[,<expN22>])] ...
pentru tablourile de memorie.
Private. Sunt ascunse de modulele superioare. Se recomand folosirea lor atunci
cnd dorii s memorai n module diferite, valori diferite, folosind acelai identificator. Ascunznd o variabil sau un tablou de memorie, operaiile de modificare a
valorilor executate n modulul curent nu vor fi percepute de modulele superioare.
Declararea lor se face cu instruciunea Private care are urmtoarea sintax:
private <list_variabile_memorie>

n continuare, se va folosi numai termenul variabile de memorie i se va subnelege c acele


operaii se refer i la tablouri de memorie.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

197

pentru un grup de variabile i tablouri de memorie care nu poate fi descris cu ajutorul unui ablon i

private all [like <ablon> | except <ablon>]


pentru un grup de variabile i tablouri de memorie care poate fi descris cu un ablon.
Regionale. Sunt vizibile ntr-o anumit regiune a modulului. Se recomand folosi-rea
lor atunci cnd dorii s memorai n regiuni diferite ale modulului valori diferite
folosind acelai identificator. Pentru aceasta trebuie create mai nti regiunile
modulului folosind directiva de compilare #Region astfel:
#region <numr_regiune>
Se pot crea maxim 32 de regiuni numerotate de la 0 la 31. Dup declararea regiunii
se pot declara i variabilele din acea regiune cu instruciunea Regional care are
sintaxa:
regional <list_variabile_memorie>

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.

1.4.3. Parametrii de comunicare


Din experiena cptat prin studiul unui limbaj de programare structurat tii deja c
transmiterea datelor ntre modulele unei aplicaii se face prin intermediul parametrilor de
comunicare.
Parametrii de comunicare sunt variabile de memorie sau tablouri de memorie prin
care modulul apelant transmite datele de intrare ctre modulul apelat i prin care
primete rezultatele obinute n urma executrii acestuia.
i limbajul gazd Visual FoxPro permite folosirea parametrilor de comunicare. Pentru
transmiterea datelor se pot folosi maxim 27 de parametri. Ei pot fi variabile de memorie
locale sau globale. Transmiterea valorilor prin intermediul parametrilor se face astfel:
9 n modulul apelat, pentru fiecare parametru trebuie s se precizeze denumirea simbolic folosit n interiorul modulului, adic trebuie precizat lista de parametri formali. Pentru declararea parametrilor formali vei folosi instruciunea Parameterss
sau Lparameters care trebuie scris ca prim instruciune n modulul apelat. Deosebirea dintre cele dou instruciuni const n tipul de vizibilitate al variabilelor de
memorie declarate ca parametri: cu lparameters variabilele de memorie vor fi
locale, iar cu parameters vor fi private. Instruciunile au urmtoarea sintax:

parameters | lparameters <list_parametri_formali>


La activarea modulului apelat parametrilor de comunicare li se atribuie valori concrete
cu care se va executa modulul la acel apel, adic se comunic lista de parametri
actuali. Lista se comunic prin clauza with <list_ parametri_actuali> a comenzii do.

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.4. Modul de transmitere al parametrilor


Ca i n cazul limbajelor de programare structurat studiate, pentru transmiterea datelor
ntre module se pot folosi dou metode:

9 Transmiterea prin referin . Valoarea transmis este afectat de eventualele


modificri aduse n modulul apelat. La sfritul executrii modulului apelat, coninutul
variabilelor de memorie folosite ca parametri este trecut n variabilele de memorie
din modulul apelant.
9 Transmiterea prin valoare . Valoarea transmis nu este afectat de eventualele
modificri aduse n modulul apelat. La sfritul executrii modulului apelat, coninutul
variabilelor de memorie din modulul apelant, folosite ca parametri, nu este actualizat
cu coninutul variabilelor de memorie din modulul apelat.
n cazul modulelor de tip program, transmiterea se face implicit prin referin. Pentru a
schimba modul de transmitere, numele parametrului trebuie scris ntre paranteze
rotunde: (<nume_parametru>).

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)

Construirea unei proceduri sau a unei funcii utilizator se face astfel:


procedure | function <nume_procedur>|<nume_funcie>
<corp-procedur> | <corp_funcie>
[return [<expresie>]]
Prin comanda procedure , respectiv function se definete antetul subprogramului
(tipul i numele). Dac la sfritul subprogramului nu se scrie instruciunea return (care

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

199

semnific terminarea subprogramului) acesta se consider terminat atunci cnd se


ntlnete un alt antet de subprogram sau sfritul fiierului. Adverbul <expresie> din
comanda return reprezint valoarea ntoars de funcie sau procedur prin numele su.
Dac nu se precizeaz valoarea returnat aceasta va fi .T..
Activarea unei proceduri se face cu instruciunea:
do <nume_procedur> with <list_parametri>
iar a unei funcii se face fie prin instruciunea do, fie ca operand ntr-o expresie, fie folosind
comanda =. Dac o procedur furnizeaz un singur rezultat, returnat printr-o variabil de
memorie creia i se atribuie valoarea expresiei din comanda return, ea poate fi activat la
fel ca o funcie, ca operand ntr-o expresie.
Subprogramele pot fi scrise:
!
9 n acelai fiier cu programul principal.
Folosind facilitatea de autodocumentare aflai
Subprogramele se vor scrie dup inordinea n care comanda do alege subprograstruciunile programului principal.
mul pe care l lanseaz n execuie n funcie de
9 ntr-o bibliotec de programe. Bibliotefiierul n care este memorat.
ca de programe din Visual FoxPro se
numete fiier de proceduri. Pentru a putea folosi un subprogram din bibliotec, nainte a-l
activa trebuie deschis biblioteca, iar dup ce s-a terminat lucrul cu subprogramele din
bibliotec, ea trebuie nchis. Starea unei biblioteci poate fi controlat cu parametrul de
sistem procedure a crui valoare se stabilete cu comanda:
set procedure to [<nume_fiier_proceduri>]
unde <nume_fiier_proceduri> este numele bibliotecii care se deschide. Comanda:
set procedure to
fr parametru nchide biblioteca deschis.
Transmiterea parametrilor se va face implicit prin referin dac activai subprogramul cu
comanda do i prin valoare, dac activai subprogramul ca un operand. Putei s
controlai modul de transmitere al parametrilor cu parametrul sistemului udfparms care
are valoarea reference pentru transmiterea prin referin i valoarea value pentru
transmiterea prin valoare. Valoarea parametrului se stabilete cu comanda set:
set udfparms to reference | value
Observaie:
Se mai poate stabili modul de transfer pentru fiecare parametru astfel: dac numele este
scris ntre paranteze, transferul se face prin valoare, iar dac este precedat de caracterul
@ transferul se face prin referin.

Creai un fiier care conine un program surs i-l lansai n execuie


1. Creai fiierul surs, l compilai i-l lansai n execuie folosind meniul aplicaiei:

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

on error do eroare with;


error(),message(),message(1),;
program(), lineno()
open database compania
use sedinte
apend
&& In aceasta;
linie va fi detectata o eroare
? program()
wait ''
goto top

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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.

set talk off


public a1,a2
a1 = 10
a2 = 20
do ascunde
? 'Afiseaza variabilele din;
program dupa revenire din;
procedura'
? a1, a2
&& Afiseaza 10, 200

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 = '

&& Afiseaza 100

?? a2
return

&& Afiseaza 200

Testai modul n care pot fi folosite variabilele de memorie regionale


Scriei urmtorul program surs n fiierul ex3.prg i-l lansai n execuie:

* Se creeaza doua regiuni


* In prima regiune se creeaza variabilele a1,a2,a3,a4
* In a doua regiune se creeaza variabilele a2,a3,a4,a5
* Variabilele a2,a3,a4 sunt comune celor doua regiuni
#region 1
regional a1,a2,a3,a4
store 10 to a1,a2,a3,a4
#region 2
regional a2,a3,a4,a5
store 20 to a2,a3,a4,a5
? 'Observati modul in care sunt afisate variabilele'
? 'regionale care folosesc acelasi identificator'
display memory like a*
#region 1
? a2, a3, a4
#region 2
? a2, a3, a4
return
Rezolvai problemele cu ajutorul subprogramelor
Notm combinri de n luate cte m cu C(n,m). Calcularea lor se face folosind urmtoarea
formul: C(n,m)=n!/(m!*(n-m)!)). Observai c n formul se repet de trei ori calculul factorialului. Pentru acest calcul se va folosi un subprogram. Scriei urmtorul program surs n
fiierul ex4.prg i-l lansai n execuie. Subprogramul folosit este de tip procedur i va fi scris
dup instruciunile din programul apelant.
clear
c=f1/(f2*f3)
set talk off
? 'Combinari = ', c
public n,m,f1,f2,f3
return
? 'Programul calculeaza;
procedure fact
combinari de n luate cate m'
parameters j,p
input 'n= ' to n
store 1 to i,p
input 'm= ' to m
for i=1 to j
do fact with n,f1
p=p*i
do fact with m,f2
endfor
do fact with n-m,f3
return
Scriei urmtorul program surs n fiierul ex5.prg i-l lansai n execuie. Subprogramul
folosit este de tip funcie. Observai modul n care a fost rezolvat aceeai problem
folosind cele dou tipuri de subprograme.
clear
input 'n= ' to n
set talk off
input 'm= ' to m
public n,m
c=fact(n)/(fact(m)*fact(n-m))
? 'Programul calculeaza;
? 'Combinari = ',c
combinari de n luate cate m'
return

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor


function fact
parameters j
fact=1
for i=1 to j

203

fact=fact*i
endfor
return fact

Testai modul n care putei folosi informaiile furnizate de funcia parameters()


Scriei urmtorul program surs n fiierul ex6.prg i-l lansai n execuie.
set talk off
a1 = 10
a2 = 20
a3 = 30
a4 = 40
med = media(a1, a2, a3, a4)
? 'Media aritmetica = '
?? med
function media
* functia permite transferul datelor prin cel mult 9 parametri.
parameters b1,b2,b3,b4,b5,b6,b7,b8,b9
* se foloseste functia parameters() pentru a afla numarul;
de valori transferate functiei
if parameters()=0
&& Daca nu s-a transferat nici un parametru;
return 0
&& media aritmetica este 0
else
suma = 0
for i=1 to parameters()
nume_p = 'b' +(str(i,1)) && Pentru numele parametrului se
suma = suma + &nume p
&& foloseste adresarea indirecta
endfor
m = suma/(i-1)
return m
endif
return
Testai modul n care se face transferul parametrilor ntre module
Scriei urmtorul program surs n fiierul ex7.prg i-l lansai n execuie.

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

&& Afiseaza 70, 70

function test
parameters y
y=2*y+50
return y

Testai modul n care putei activa o procedur la fel ca i o funcie


Procedura data furnizeaz un format romnesc de afiare a datei prin chiar numele su.
Scriei urmtorul program surs n fiierul ex8.prg i-l lansai n execuie.

set talk off


set century on

set date to british


accept 'Data (zz/ll/aaaa):' to dt

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

Construii i testai o bibliotec


Construii n fiierul vectori.prg o bibliotec cu operaii pentru vectori care s conin: proceduri pentru citirea unui vector, pentru afiarea unui vector, pentru concatenarea doi vectori,
pentru interclasare a doi vectori, pentru divizarea unui vector, o funcie pentru cutarea unui
element cu o valoare precizat ntr-un vector (funcia va furniza un rezultat numeric: prima poziie n care a fost gsit elementul n vector sau -1 dac nu a fost gsit) i o procedur de
cutare care va comunica toate poziiile n care a fost gsit un element cu o valoare precizat
(se va folosi dac exist mai multe elemente cu aceei valoare n vector). Dup ce ai scris
fiierul surs, l vei compila ca s fii siguri c nu avei erori de sintax.
procedure creare
?
parameters a,n
i=1
local i
do while i<=n-1
? 'Creati un vector cu n elemente'
for j=1 to 10
input 'n= ' to n
?? str(a(i),6)+', '
dimension a(n)
i=i+1
for i=1 to n
if i=n
input 'a('+str(i,2)+')= ' to;
exit
a(i)
endif
endfor
endfor
return
if i<=n-1
procedure afisare
?
parameters a,n
endif
local i,j
enddo
? 'Se afiseaza un vector cu ',
?? str(a(n),6)
str(n,2)+' elemente'
return

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor


procedure concatenare
parameters a,b,c,n,m
dimension c(n+m)
?acopy(a,c,1,n,1)
?acopy(b,c,1,m,n+1)
procedure divizare
parameters a,b,c,n,m
dimension b(m)
dimension c(n-m)
?acopy(a,b,1,m,1)
?acopy(a,c,m+1,n-m,1)
return
procedure interclasare
parameters a,b,c,n,m
dimension c(n+m)
?acopy(a,c,1,n,1)
?acopy(b,c,1,m,n+1)
?asort(c)
return
function caut
parameters a,n,x
local i

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

set talk off


? 'Cu acest program lucrati cu;
vectori cu elemente numerice'
public m,p,x,v(1),u(1)
clear
note Se deschide biblioteca
set procedure to vectori
do creare with v,m
do afisare with v,m
? 'Puteti cauta o valoare;
numerica x in vector'
input 'x= ' to x
?? 'Veti afla prima pozitie in;
care a fost gasita'
if caut(v,m,x)=-1
? 'Nu exista elementul cautat'
test2.prg
set talk off
public p,q,x(1),y(1),z(1)
clear
set procedure to vectori
? 'Programul concateneaza doi;

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

input 'Numarul de elemente;


preluate de primul vector = ';
to q
do divizare with x,y,z,p,q
?'Primul vector obtinut'
do afisare with y,q
?'Al doilea vector obtinut'
do afisare with z,p-q
set procedure to
return

T est pentru evaluare:


1. S se scrie un program care permite crearea unei matrici de 2 linii i 5 coloane n
care s se nregistreze n ordine primele 10 numere naturale:
1 2 3 4 5
6 7 8 9 10
S se afieze apoi aceste numere pe ecran n ordine, pe cinci linii i dou coloane:
1 2
........
9 10
i apoi sub forma unui triunghi:
1
2 3
4 5 6
7 8 9 10
2. Scriei un program prin care cutai un element ntr-o matrice. Dimensiunea matricei,
elementele matricei i valoarea cutat se introduc de la tastatur. Programul va
afia numrul de ordine al elementului, numrul liniei i numrul coloanei n cazul n
care se gsete elementul i un mesaj dac nu se gsete.
3. S se scrie un program pentru rezolvarea ecuaiei de gradul II cu coeficieni numere
reale. Coeficienii a,b,c se introduc de la tastatur. Programul trebuie s permit
reluarea rezolvrii problemei pentru mai multe seturi de date de intrare (seturi de
coeficieni) i s calculeze att rdcinile reale, ct i cele complexe.
4. S se scrie un program care s tearg nregistrrile dintr-un tabel pentru care un
cmp de tip ir de caractere este vid. Se presupune c tabelul are cel puin un cmp de
tip ir de caractere care poate fi vid. Numele tabelului i numele cmpului se introduc
de la tastatur (folosii tabele din baza de date Compania pentru a testa programul).
5. S se scrie un program care s realizeze urmtoarele prelucrri asupra unui ir de
caractere introdus de la tastatur:
a) S se numere cuvintele din text n urmtoarele dou variante:
a1) cuvintele sunt separate printr-un singur spaiu;

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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.

S se realizeze un tabel baz de date n care s se memoreze evoluia cursului leu-euro


din luna precedent. Pentru fiecare zi din lun se vor memora urmtoarele informaii: data,
valoarea cursului, indicele cu baz fix (raportul dintre cursul zilei i cursul din ziua de nceput a perioadei de analiz), indicele cu baz n lan (raportul dintre cursul zilei i cursul din
ziua precedent), sporul cu baz fix (diferena dintre cursul zilei i cursul din ziua de nceput a perioadei de analiz), sporul cu baz n lan (diferena dintre cursul zilei i cursul din
ziua precedent). Crearea structurii tabelului i ncrcarea cmpurilor pentru dat i curs se
va face la nivel de limbaj de comand. Pentru calcularea celorlalte cmpuri se va folosi un
program. S se afieze urmtoarele informaii folosind datele din tabel: ziua cu cel mai
mare curs, ziua cu cel mai mic curs, media aritmetic a cursului i abaterea medie ptratic
a cursului. Aceste informaii se vor furniza n dou moduri: cu ajutorul limbajului de
comand i cu ajutorul unui program.

7.

S se realizeze un tabel baz de date n care s se memoreze situaia notelor i a mediilor


la disciplina Informatic a elevilor dintr-o clas. Tabelul va conine urmtoarele informaii:
numele i prenumele elevului, poziia lui din catalog, cinci note pentru primul semestru, cinci
note pentru cel de al doilea semestru, dou note pentru tezele de pe cele dou semestre,
mediile de pe cele dou semestre i media anual. Crearea structurii tabelului i ncrcarea
cmpurilor pentru numele i prenumele elevului, pentru poziia lui din catalog, pentru cele
maxim 10 note din cele dou semestre i pentru cele dou note de la tezele semestriale se
va face la nivel de limbaj de comand. Pentru calcularea mediilor se va folosi un program.
La calcularea mediilor trebuie s inei cont de urmtoarele:

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).

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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:

Obiectul (object) reprezint un ansamblu de date (un numr fix de variabile) i


subprograme (proceduri i funcii) necesare pentru prelucrarea datelor. Datele poart
numele de proprieti, iar subprogramele numele de metode sau evenimente. Proprietile, metodele i evenimentele sunt membrii unui obiect. Interfaa de acces la obiect
este realizat numai prin intermediul metodelor. n acest mod, subprogramele membre
ale unui obiect prelucreaz datele membre ale obiectului care apeleaz metoda.

Proprietatea (property) reprezint un atribut al unui obiect care 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.

Metoda (method) reprezint aciunea pe care o poate executa un obiect. Utilizatorul


unui obiect are acces la date numai prin intermediul metodelor obiectului, iar metoda are
acces implicit la membrii unui obiect. Metodele ascund celui care utilizeaz obiectul
amnunte despre modul n care a fost implementat. De exemplu, un obiect vizual de tip
list are implementate metode necesare pentru ntreinerea listei: adugarea unui articol la list,
tergerea unui articol din list etc.

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.

Aceeai problem poate fi rezolvat att n varianta clasic a programrii structurate, ct


i folosind programarea orientat pe obiecte. Principalele avantaje ale folosirii programrii orientate pe obiecte sunt:
9 Reutilizarea unui software deja scris. Acest avantaj crete eficiena programatorilor.
n programarea clasic se realiza prin crearea bibliotecilor de subprograme.
9 Dezvoltarea mai uoar a aplicaiilor. n programarea orientat pe obiecte crete
gradul de modularizare al unei aplicaii fa de programarea clasic. Adugarea sau
modificarea unor module de aplicaie se va face mai uor datorit organizrii
obiectelor n clase de obiecte i a facilitii de motenire.
9 Controlul mai bun al programelor de dimensiuni mari. Aplicaia este mai bine
structurat dect n cazul programrii clasice i mult mai abstractizat, permind o
mai uoar citire i urmrire a codului.
9 Dezvoltarea programrii vizuale ca aplicaie a programrii orientate pe obiecte. n
varianta clasic, descrierea unui obiect grafic de pe ecran se fcea preciznd printr-un
set de instruciuni caracteristicile obiectului (coordonatele obiectului, dimensiunile, culoarea, textul afiat etc.), iar prin subprograme modul n care putea fi manipulat obiectul.
n programarea vizual exist deja obiecte vizuale predefinite care pot fi folosite pentru
construirea unei intrefee. Obiectul vizual conine proprietile obiectului grafic (cu valori
implicite, care ns pot fi modificate) i metodele i evenimentele la care poate reaciona
obiectul vizual, fr s mai necesite scrierea codului de ctre programator.
2 . 2 . L u c r u l c u c l a s e i o b i e c t e n V i s u a l F o x P r o

2.2.1. Clasele
Visual FoxPro are implementate mai multe clase predefinite care permit crearea unor
obiecte cu care poate fi construit interfaa unei aplicaii, cum sunt de exemplu casetele

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

213

de text, comutatoarele, butoanele radio, listele, formularele etc. Folosind facilitatea de


motenire, programatorul poate defini dou categorii de clase:
9 Clase vizuale care permit crearea obiectelor vizuale ce pot fi folosite la realizarea
interfeei. Definiia acestor clase se bazeaz pe una dintre clasele predefinite vizuale.
Altfel spus, clasele vor avea ca strmo una dintre clasele predefinite. De exemplu,
pornind de la clasa predefinit form, care descrie obiecte vizuale de tip formular, se
poate crea o nou clas, care s descrie tot un obiect de tip formular, dar cu proprieti
modificate i eventual cu metode noi fa de formularul predefinit.
9 Clase nevizuale care permit crearea unor obiecte nevizuale. Definiia acestor clase se
bazeaz pe clasa custom sau pe clasele predefinite nevizuale (de exemplu clasele
timer sau cursor). Clasele derivate din clasa custom se mai numesc i clase definite de
utilizator - User Defined Class (UDC). De exemplu, pornind de la clasa custom se poate
crea o nou clas, care s descrie comportamentul unui numr complex.
Clasa container este format dintr-un grup de clase similare (clase predefinite sau derivate din acestea) care pot fi tratate ca o unitate. De exemplu, clasa predefinit form (a
formularelor) este un grup de clase de controale predefinite tratate ca o unitate, iar clasa
form set (a setului de formulare) este i ea o clas container care conine unul sau mai
multe formulare legate ntre ele. Instana unei clase container este un obiect container.
Obiectul container este un obiect care conine pe lng proprieti, metode i evenimente
i alte obiecte. El permite accesul la obiectele pe care le conine. Obiectul container este
foarte util la construirea interfeelor. De exemplu, un formular de tip caset de dialog este
un obiect container care poate conine alte obiecte cu care se poate asigura un dialog
interactiv cu utilizatorul: liste, comutatoare, butoane radio, casete de text etc.
Clasele (predefinite i custom) au implementate implicit urmtoarele evenimente: Init (se
produce la crearea obiectului), Destroy (se produce la eliberarea obiectului), Error (se produce la apariia unei erori n timpul execuiei unei metode) i metode: AddObject (adaug un
obiect la un container n timpul execuiei), CloneObject (creeaz o copie a obiectului),
RemoveObject (nltur un obiect dintr-un container n timpul execuiei), SaveAsClass
(salveaz o instan a unui obiect ca o definiie de clas ntr-o bibliotec de clase),
Fiecare clas se identific printr-un nume. O clas se poate crea cu instruciunea bloc
define class care are sintaxa:
define class <nume_cls1> as <nume_cls2>
[[protected <nume_pr1>, <nume_pr2>,... ]
<nume_pr>=<exp> ...]
[add object [protected] <nume_ob> as <nume_cls3> [noinit] [with <lista_pr>]...
[[protected] function | procedure <nume>
<secven-instruciuni>
endfunc | endproc ] ...
enddefine
Prin aceast instruciune se definete clasa identificat prin <nume_cls1>. Definiia noii clase
se bazeaz pe clasa printe precizat prin <nume_cls2> din clauza as de la care motenete
proprietile, metodele i evenimentele. Clasa printe poate fi o clas predefinit, o clas vizual (care se bazeaz pe o clas predefinit) sau o clas nevizual (definit de utilizator). La
noua clas pot fi adugate:

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.

define class formular as form


* Se definesc proprietatile nume si versiune. Ele sunt
* initializate cu 20 de spatii, respectiv cu un sir de caractere.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

215

* Proprietatea versiune va fi protejata.


protected versiune
nume=space(20)
versiune='1.0'
* Se precizeaza obiectele care vor fi adaugate.
* Pentru obiectele cb1 si cb2 se vor modifica valorile proprieta* tilor caption (legenda) si backcolor (culoarea fundalului).
add object cb1 as CommandButton;
with Caption='Da', BackColor = 2
add object cb2 as CommandButton;
with Caption='Nu', BackColor = 2
add object lista as ListBox
* Se scrie metoda Click cu ajutorul unei proceduri.
procedure Click
= messagebox('Ati executat un clic n formular')
endproc
enddefine
Observaie:
Clasele pot fi definite i modificate interactiv prin intermediul constructorului de clase Class Designer pe care l activai cu comanda create class.

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:

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

217

F1=createobject('form') && se creeaza un obiect formular


* Se modifica valoarea proprietatilor caption (legenda) si
* closable (daca formularul poate fi nchis folosind meniul de
* control - .T. sau nu - .F.)
F1.caption='Exemplu'
&& Numele obiectului este separat de numeF1.closable=.F.
&& le proprietatii prin operatorul punct.
* Se adauga la formular o linie si doua butoane de comanda
* folosind metoda proprie a obiectului
F1.addobject('L1','Line')
F1.addobject('B1','CommandButton')
F1.addobject('B2','CommandButton')
* Se modifica unele proprietati ale obiectelor adaugate
F1.B1.caption='Da'
&& Operatorul punct a fost folosit pentru a
F1.B2.caption='Nu'
&& separa proprietatea de obiect si
F1.B1.visible=.T.
&& obiectul de obiectul container.
F1.B2.visible=.T.
F1.L1.visible=.T.
F1.show
&& Se apeleaza metoda obiectului prin care;
este afisat obiectul
Dac adugai un obiect la un obiect container el nu va fi vizibil. Pentru a-l face vizibil trebuie s i se atribuie proprietii visible valoarea .T.
Observaie:
Putei specifica proprietile multiple pentru un obiect cu instruciunea with ... endwith .
Instruciunea nu poate fi folosit n instruciunea bloc pentru definirea clasei. Ea are sintaxa:
with <nume_ob>
<secven_instruciuni>
endwith
Astfel, n exemplul precedent putei modifica proprietile obiectelor adugate astfel:
with F1
with B2
with B1
caption='Nu'
caption='Da'
visible=.T.
visible=.T.
endwith
endwith
L1.visible=.T.
endwith
Mecanismele programrii orientate pe obiecte sunt implementate n Visual
FoxPro astfel:
ncapsularea. Prin folosirea comenzii define class sunt incluse n aceeai
clas definiiile pentru proprietile, metodele i evenimentele unui obiect.
Motenirea. O clas poate fi definit pe baza definiiei altei clase folosind clauza as <nume_clas_printe>. Proprietile clasei printe nu vor mai fi definite
n clasa derivat, n care vor fi definite numai proprietile i metodele noi.

Accesul la membrii unui obiect


n tratarea accesului la membrii unui obiect pot s apar urmtoarele cazuri:

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.

Obinerea de informaii despre obiecte


Obinei informaii despre obiecte folosind urmtoarele funcii:
aclass() - plaseaz ntr-un vector numele clasei unui obiect i ale strmoilor
acestuia. Funcia returneaz un rezultat numeric care va reprezenta numrul de
clase plasate n vector. n primul element al vectorului va fi scris numele clasei
obiectului. Sintaxa funciei este: aclass(<nume_vector>,<nume_ob>).
ainstance() - plaseaz ntr-un vector instanele unei clase. Funcia retuneaz un
rezultat numeric care va reprezenta numrul de instane plasate n vector. Sintaxa
funciei este: ainstance(<nume_vector>,<nume_cls>).
amembers() - plaseaz ntr-un tablou de memorie numele membrilor unui obiect
(proprieti, metode, evenimente i obiecte membre). Funcia returneaz un rezultat
numeric care reprezint numrul de membrii ai obiectului, memorai n tablou.
Sintaxa funciei este: amembers(<nume_tablou>,<nume_ob>[,1|2]). Implicit se
creeaz un vector n care vor fi memorate numai proprietile. Explicit, dac se
precizeaz argumentul 1 se va crea o matrice bidimensional n care n prima
coloan va fi scris numele membrului i n coloana a doua tipul membrului (Property,
Event, Method, Object), iar dac se precizeaz argumentul 2 se va crea un vector
care va conine numai numele obiectelor membre.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

219

Afiarea listei obiectelor active (numele lor, propietile, metodele i evenimentele asociate) se face cu comanda:
display object [ like <sablon>]

Condiia de existen a unui obiect


Dup eliberarea unui obiect (de exemplu prin nchiderea formularului container), variabila de
memorie care a fost folosit pentru referirea lui va conine valoarea null. tergerea ei din memorie se va face printr-o comand explicit (release):
release <list_nume_obiecte>
Pentru a testa dac exist un obiect, folosii urmtoarea condiie:
type('<nume_ob>')='o' and not isnull (<nume_obiect>)
adic trebuie ndeplinite dou condiii: tipul variabilei de memorie folosite pentru referirea
obiectului trebuie s fie o (object) i variabila de memorie s nu aib valoarea null,
deoarece dac obiectul a fost eliberat, variabila are valoarea null.
Atunci cnd se creeaz o instan a unei clase se pstreaz n memorie definiia clasei.
Aceast definiie rmne n memorie i dup ce obiectul a fost eliberat. Ea trebuie
tears explicit cu comanda:
clear <nume_cls>

2.2.3. Studiu de caz


S se creeze un obiect care s descrie comportamentul unui numr complex. Obiectul va
avea proprietile re (partea real a numrului), im (partea imaginar a numrului) i
modul (modulul unui numr complex) i metoda m pentru calculul modulului.
Pentru a crea i a testa un astfel de obiect se vor scrie urmtoarele linii de program ntr-un
fiier surs, la fel ca i programele pe care le-ai scris folosind limbajul gazd. Blocul instruciunii define class se scrie la sfrit, dup instruciunile din program, la fel ca i
subprogramele. Prin instruciunile input atribuii valori proprietilor re i im.
Exemplul 1
Pentru construirea metodei modul se va folosi un subprogram de tip procedur. Prin
instruciunea z.m apelai metoda m pentru a calcula modulul, iar prin instruciunea
?z.modul afiai valoarea proprietii modul.

clear
set talk off
z=CreateObject('Complex')
input 're (partea reala a numarului)= ' to z.re
input 'im (partea imaginara a numarului)= ' to z.im
z.m
?z.modul
define class complex as custom
re=0
im=0
modul=0
procedure m
this.modul=sqrt(this.re**2 +this.im**2)
endproc
enddefine

220 Informatic
Exemplul 2
Pentru construirea metodei modul se va folosi un subprogram de tip 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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

221

procedure afisare
? 'Numarul complex este: '+str(this.re,this.nrc(this.re))
do case
case this.im>0
?? ' + i*'+str(this.im,this.nrc(this.im))
case this.im<0
?? ' - i*'+str(abs(this.im),this.nrc(this.im))
endcase
endproc
protected function nrc
parameter v
this.nr=1
do while v<>0
v=int(v/10)
this.nr=this.nr+1
enddo
return this.nr
endfunc
enddefine
2 . 3 . P r i n c i p i i l e p r o g r a m r i i c o n d u s e d e ev e n i m e n t e

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

Clasa predefinit Semnificaia obiectului vizual

CheckBox

Comutator

Control care indic dac o opiune este activ (on)


sau nu (off).

Column

Coloan ntr-o
gril

Container care conine antetul de coloan i alte


obiecte care pot s apar ntr-o coloan a unei grile; nu poate fi folosit independent, ci numai ntr-un
container de tip gril.

ComboBox

List combinat

Control similar unei combinaii dintre o caset de text


(TextBox) i o list (ListBox) n care putei introduce
o valoare sau o putei alege dintr-o list.

CommandButton Buton de
comand

Control asociat unei comenzi: dac la un moment


dat executai clic pe un buton, se execut comanda
asociat butonului.

Command
Group

Grup de butoane Container care poate conine numai un grup de


de comand
butoane de comand care pot fi tratate ca o unitate.

Container

Obiect container

Container care conine alte obiecte neprotejate


(este permis accesul la obiectele coninute).

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

Control care furnizeaz o zon pentru introducerea


sau vizualizarea unui text ntr-un formular (permite
afiarea pe mai multe linii).

Form

Formular

Container care poate conine o colecie de mai


multe pagini (care se pot comporta ca o caset de
dialog sau ca o fereastr standard), controale i
containere pentru afiarea i editarea datelor i
controale utilizator (custom).

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

223

Numele clasei

Clasa predefinit Semnificaia obiectului vizual

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

Control care permite introducerea unei imagini


ntr-un formular; imaginea este memorat ntr-un
fiier bitmap (.bmp).

Label

Etichet

Control care conine un text ce descrie o zon de


formular sau un control.

Line

Linie

Control care deseneaz ntr-un formular o linie pe


vertical, pe orizontal sau pe diagonal.

ListBox

List

Control care furnizeaz o list de articole din care


utilizatorul poate alege unul dintre ele.

OLEContainer
Control

Control de
tip OLE

Container cu controale OLE (fiiere .ocx; au propriul


set de evenimente) i obiecte OLE inserabile (obiecte OLE create cu o alt aplicaie - Word, Excel etc.;
ele nu au propriul set de evenimente).

OLEBound
Control

Control container Controale folosite n formulare sau rapoarte care


de tip OLE
permit afiarea coninutului unui obiect OLE ntr-un
cmp General al unui tabel.

OptionButton

Buton de opiuni
(radio)

Obiect care nu poate fi folosit independent, ci ntr-un


container de tip grup de butoane de opiuni pentru a
reprezenta o opiune.

OptionButton
Group

Grup cu butoane
de opiuni (radio)

Container folosit pentru a grupa numai controale de


tip butoane de opiuni; putei folosi un buton pentru
a alege o opiune dintr-un set de opiuni.

Page

Pagin

Container folosit pentru crearea casetelor de dialog cu


mai multe seciuni (tabs); nu poate fi folosit independent, ci ntr-un container de tip set de pagini i poate
conine orice controale i containere.

PageFrame

Set de pagini

Container care conine una sau mai multe pagini.

Separator

Separator pe bara Obiect care nu poate fi folosit independent, ci ntr-un


de utiliti
container de tip bar cu instrumente; este folosit pentru a introduce spaii ntre controale cu scopul de a
crea grupuri de butoane.

Shape

Form

Control care creeaz o form care poate fi afiat ca o


combinaie de dreptunghiuri, cercuri i elipse.

224 Informatic
Numele clasei

Clasa predefinit Semnificaia obiectului vizual

Spinner

Caset de text cu Control care permite incrementarea sau decremenderulor


mentarea unei valori fie prin scrierea valorii noi, fie
executnd clic pe sgeata de incrementare sau pe
sgeata de decrementare.

TextBox

Caset de text

Timer

Obiect de tip ceas Control invizibil folosit pentru a executa secvene


de cod la intervale de timp egale (controleaz
evenimentele recurente din aplicaie).

ToolBar

Bar cu
instrumente

Control care furnizeaz o zon pentru introducerea


sau vizualizarea unui text ntr-un formular; permite
afiarea pe o singur linie.

Container care poate conine orice controale; este


format dintr-un set de butoane pe care putei
executa clic ca s cerei excutarea unei anumite
sarcini.

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:

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

225

Numele clasei Clasa predefinit Semnificaia obiectului vizual


Cursor

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

Obiect creat atunci cnd se stabilete o relaie ntre


dou tabele ntr-un raport, formular sau set de formulare; permite determinarea modului n care sunt legate
cele dou tabele.

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

add object text1 as Label


add object b3 as CommandButton
text1.caption='Felicitari;
!!!!!!!!!!!!'
text1.height=16
text1.left=110
text1.top=34
text1.width=376
text1.visible=.T.
b3.caption='Terminare'
b3.height=33
b3.left=110
b3.top=86
b3.width=114
b3.visible=.T.
procedure b3.click
* Elibereaza formularul si
* dezactiveaza procsorul de
* evenimente:
thisform.release
clear events
endproc
enddefine
define class form3 as form
caption='Raspuns'
closable=.F.
height=143
width=346
add object text2 as Label
add object b4 as CommandButton
text2.caption='????????????;
!!!!'
text2.height=16
text2.left=110
text2.top=34
text2.width=376
text2.visible=.T.
b4.caption='Terminare'
b4.visible=.T.
b4.height=33
b4.left=110
b4.top=86
b4.width=114
procedure b4.click
* Elibereaza formularul si
* dezactiveaza procesorul de
* evenimente:
thisform.release
clear events
endproc
enddefine

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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:

Ce se ntmpl dac nlturai dintr-o


Dac ai deschis o bibliotec, toate definiiile
bibliotec de clase o clas printe
claselor vor fi pstrate n memoria intern. Dac
pentru alte clase din bibliotec?
vrei s le tergei, putei folosi comanda clear:
clear <nume_bib>
Trebuie s avei grij ca atunci cnd executai aceast operaie de tergere s nu existe
o instan a nici unei clase din bibliotec.

Creai un fiier care conine un program surs i-l lansai n execuie


1. Creai un obiec care s conin proprietile nume, prenume, adresa, data_n (data
naterii), vrsta i metoda pentru calcularea vrstei. Metoda poate fi descris fie
folosind o procedur, fie folosind o funcie. Testai programul.
Metoda descris cu procedur:
ang = createobject('angajati')
? ang.varsta
with ang
define class angajati AS custom
.nume = 'Popa'
nume = space(20)
.pren = 'Ion'
pren = space (20)
.adresa = 'str. Zorilor nr. 34'
adresa = space (30)
.data_n = {02/07/83}
data_n = { \ \ }
endwith
varsta = 0
clear
procedure v
? ang.nume + ' ' + ang.pren
this.varsta=int((date()-;
? ang.adresa
this.data_n)/365)
? ang.data_n
endproc
ang.v
enddefine
Metoda descris cu funcie (observai informaiile afiate despre obiect):
*Scrieti secventa corespunzapren = space (20)
*toare de instructiuni
adresa = space (30)
clear
data_n = { \ \ }
display object like ang
varsta = 0
? ang.nume + ' '+ ang.pren
function v
? ang.adresa
this.varsta=int((date()-;
? ang.data_n
this.data_n)/365)
? ang.v()
return this.varsta
??' ani'
endfunc
define class angajati as custom
enddefine
nume = space(20)

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

229

2. Testai funcia aclass() cu ajutorul urmtorului program:


clear
obiect = createobject("forma11")
for ncount = 1 to aclass(a, obiect)
&& se creeaza vectorul
? a(ncount)
&& se afiseaza numele claselor
endfor
release obiect
define class forma1 as form
enddefine
define class forma11 as forma1
enddefine
3. Testai funcia ainstance() cu ajutorul urmtorului program:
clear all
obiect1 = createobject('form')
obiect2 = createobject('form')
obiect3 = createobject('form')
clear
? ainstance(a,'form')
&& furnizeaza rezultatul 3 (trei instante)
display memory like a
&& afiseaza referintele
4. Testai funcia amembers() cu ajutorul urmtorului program:
clear
forma=createobject"form") && creeaza un formular
= amembers(a1, forma)
= amembers(a2, forma1, 1)
= amembers(a3, forma1, 2)
display memory like a?
5. Testai lucrul cu biblioteci:
create classlib bib
create class f1 of bib as 'Form'
set classlib to bib additive
release classlib bib

T est pentru evaluare:


1. Se consider urmtorul program:

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

input 'x= ' to z.c(1)


input 'y= ' to z.c(2)
endproc
function modul
this.m=sqrt(this.c(1)**2+;
this.c(2)**2)
return this.m
endfunc
enddefine

3. Comparai urmtoarea variant de program cu cea prezentat ca exemplu n studiul


de caz. Verificai dac aceast variant este corect. Ce concluzie tragei din compararea celor dou versiuni?

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

4. Adugai obiectului complex metoda pentru citirea numrului complex:

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.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

231

5. Adugai obiectului complex o metod pentru calculul conjugatului numrului complex


i pentru calculul argumentului numrului complex. Scriei un program n care folosii
aceste metode.
6. Definii o clas de obiecte pentru adunarea i nmulirea a dou numere complexe.
Scriei un program n care folosii obiecte din aceast clas.
7. Definii o clas de obiecte prin care administrai o list de numere. Clasa trebuie s
conin o metod pentru adugarea unui element la list, tergerea ultimului element
din list, afiarea elementelor listei, cutarea unui element n list i afiarea elementului cu valoarea maxim. Scriei un program n care folosii obiecte din aceast clas.
8. Definii o clas de obiecte prin care administrai fraciile. Clasa trebuie s conin metode
pentru citirea numitorului i a numrtorului fraciei, pentru simplificarea fraciei, pentru
afiarea fraciei simplificate, pentru calculul fraciei ca numr zecimal, pentru afiarea
fraciei ca numr zecimal. Scriei un program n care folosii obiecte din aceast clas.
9. Definii o clas de obiecte prin care administrai mulimi de numere. Clasa trebuie s
conin metode pentru citirea i afiarea mulimii, pentru reuniunea, intersecia i diferena a dou mulimi i pentru determinarea apartenenei unui element la mulime.
Mulimile vor fi descrise prin vectori cu elemente cu valori distincte. Scriei un program
n care folosii obiecte din aceast clas.
10. Definii o clas de obiecte prin care administrai polinoame. Clasa trebuie s conin
metode pentru citirea i afiarea polinoamelor, pentru adunarea i nmulirea a dou
polinoame i pentru calcularea valorii unui polinom pentru un x precizat. Polinoamele vor
fi descrise prin vectori n care n prima poziie se va scrie gradul polinomului, iar n
urmtoarele n+1 poziii, coeficienii polinomului. Scriei
un program n care folosii obiecte din aceast clas.

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

3.1.1. Obiectele vizuale


Interfaa poate fi construit cu ajutorul obiectelor vizuale. Ele sunt de dou tipuri:
formulare i
controale.

Controalele sunt obiecte care sunt create n general n formulare i sunt


folosite pentru a asigura interaciunea utilizatorului cu aplicaia: prin
intermediul lor utilizatorul comunic aplicaiei datele de intrare i procesele
pe care trebuie s le execute, iar aplicaia comunic utilizatorului datele de
ieire i mesaje de informare sau de atenionare.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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.

Formularul este un obiect container care grupeaz alte obiecte. Are


proprieti specifice i metode care determin comportamenul su n diferite
situaii.
Suprafaa de afiare a formularelor este mprit n dou zone:
9 bara de titlu (title bar) mpreun cu butoanele de manipulare ale formularului i
9 spaiul de lucru (workspace) n care pot fi afiate diferite controale cu care poate
interaciona utilizatorul.
Formularele pot fi de tip:
9 Fereastr (window). Utilizatorul interacioneaz cu fereastra atunci cnd lanseaz n
execuie aplicaia. Ferestrele pot fi redimensionate i pot fi deplasate pe ecran. n
fereastra de aplicaie pot fi deschise alte formulare de tip fereastr numite ferestre
document n care utilizatorul poate prelucra diferite colecii de date ale aplicaiei (n
aplicaia Visual FoxPro, fereastra care se deschide atunci cnd prelucrai un fiier
surs este o fereastr document). Ferestrele asociate unei aplicaii pot avea sub bara
de titlu o bar de meniu cu titlurile meniurilor pe care aplicaia le pune la dispoziia
utili-zatorului. Ferestrele document nu au bar de meniuri.
9 Caset de dialog (dialog box). Se deschide n urma unei comenzi prin care se cere
declanarea unui proces. Prin intermediul ei utilizatorul poate s furnizeze datele necesare executrii unui proces pe care l-a activat fie prin acionarea unui buton de comand, fie prin alegerea unei opiuni de meniu. Mai poate fi folosit pentru ca aplicaia s
afieze pentru utilizator informaii despre desfurarea unui proces. Spre deosebire de
formularul fereastr, caseta de dialog nu are buton de minimizare sau de maximizare,
poate fi deplasat pe ecran, dar nu poate fi redimensionat. Cele mai folosite controale
ntr-o caset de dialog sunt casetele de text, etichetele i butoanele de comand.
Casetele de dialog pot fi simple sau cu seciuni. O caset de dialog cu seciuni (tabs)
poate afia n aceeai zon a formularului mai multe seturi de obiecte. Fiecare set de
obiecte formeaz o seciune. La un moment dat este afiat o singur seciune. Se
recomand acest tip de caset atunci cnd ntr-o caset trebuie create foarte multe
controale i ele nu ncap n spaiul formularului. Controalele se vor grupa dup anumite
criterii i fiecare grup va fi afiat ntr-o seciune a casetei. Un exemplu de caset de
dialog cu seciuni este caseta Option a interfeei Visual FoxPro.

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.

3.1.2. Proiectarea interfeei


Atunci cnd se proiecteaz o aplicaie, trebuie luate mai multe decizii referitoare la interfa:
ce stil de interfa se va folosi?
de cte formulare este nevoie?
ce comenzi vor fi incluse n meniuri?
se va folosi o bar cu instrumente pentru a dubla opiunile

de meniu cu butoane scurtturi cu pictograme?


ce asisten se va oferi utilizatorului?
ce casete de dialog vor fi folosite pentru a asigura interac-

tivitatea cu utilizatorul?
Elementele de interfa ale unei 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:

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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.

3.1.3. Stilurile interfeei


Exist trei stiluri de interfee:
Interfa cu un singur document (single-document interface - SDI) care permite la un

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.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

237

Formularele interfeei MDI au urmtoarele caracteristici:


9 Formularele copil pot fi afiate numai n spaiul de lucru al formularului printe.
Utilizatorul poate muta sau redimensiona formularele copil ca pe orice alt formular, cu
deosebirea c operaiile sunt limitate de spaiul de lucru al formularului printe.
9 Cnd un formular copil este minimizat, pictograma sa apare n formularul printe i nu
pe bara de aplicaii. Cnd un formular printe este minimizat, formularul printe i
toate formularele copil care i aparin vor fi reprezentate printr-o singur pictogram.
Cnd formularul printe este restaurat, sunt restaurate mpreun cu el i formularele
copil care vor fi afiate n aceeai stare n care erau nainte de minimizare.
9 Cnd un formular copil este maximizat, legenda sa este combinat cu legenda
formularului printe i afiat n bara de titlu a formularului printe.
9 Meniurile care pot fi folosite n formularul copil activ sunt afiate n bara de meniu a
formularului printe i nu n formularul copil.
Tipul formularului este controlat cu proprietatea MDIForms care este de tip logic (are
valoarea .T. pentru un formular MDI i valoarea .F. pentru un formular SDI).
Filiaia formularelor (dac un formular este formular copil sau formular printe) este
controlat cu proprietatea ShowWindows care este de tip numeric:
0 - Screen - formularul este creat n fereastra principal Visual FoxPro (implicit).
1 - In Top Level Form - formularul este copilul formularului activ de cel mai nalt
nivel i este afiat n acest formular. Atunci cnd este minimizat nu este afiat n
bara de aplicaii Windows (TaskBar). Se recomand pentru ferestrele document
ale unei ferestre de aplicaie.
2 - As Top Level Form - este un formular independent nemodal n care pot fi
plasate formulare copil. Nu are printe i poate fi folosit fie ca fereastr ntr-o
interfa SDI, fie ca fereastr printe ntr-o interfa MDI. Atunci cnd este
minimizat este afiat n bara de aplicaii Windows. Se recomnad s o folosii
pentru fereastra aplicaiei.
Prin proprietatea de tip logic Desktops controlai locul n care va fi creat formularul: dac
este .T. se creeaz oriunde pe ecran, iar dac este .F. se creeaz n fereastra aplicaiei
Visual FoxPro (implicit).
Variabila de memorie de sistem _Screens poate fi folosit pentru a referi fereastra
implicit a aplicaiei Visual FoxPro, astfel nct putei manipula aceast fereastr ca pe
un obiect: putei s-i modificai proprietile, putei s-i apelai metodele dar nu putei crea
proceduri pentru evenimente.

3.1.4. Proprietile generale ale obiectelor vizuale Visual FoxPro


Obiectele vizuale au proprieti fizice prin care se descrie aspectul lor cum sunt culoarea, dimensiunea i poziia pe ecran, dar i proprieti care caracterizeaz modul n
care se comport cum sunt vizibilitatea, disponibilitatea sau numrul de linii dintr-o caset de text (o linie sau mai multe). Orice obiect vizual are proprieti standard care
sunt comune tuturor obiectelor cum sunt dimensiunea, poziia i vizibilitatea. Pe lng
aceste proprieti ele mai au i proprieti specifice, caracteristice obiectului respectiv.
Proprietile sunt descrise printr-un set de date asociate, de un anumit tip.

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

Semnificaie cod chenar


Controale
Transparent (invizibil)
Solid (implicit; linie continu)
Dash (linie ntrerupt)
Dot (linie punctat)
Dash - Dot (linie format din grupuri
de o linie urmat de un punct)
Dash - Dot -Dot (linie format din grupuri de o linie urmat de dou puncte)
Inside Solid (linie continu n interior)
Formulare
No border (fr chenar)
Fixed Single (chenar simplu)
Fixed Dialog (chenar de tip caset de
dialog, care nu permite
redimensionarea formularului)
Sizable (implicit; chenar de tip
fereastr, care permite redimensionarea formularului)

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

239

sau dubl. Este caracterizat de urmtoarele proprieti:


BorderStyle - stilul chenarului este de tip numeric i exprim codul chenarulu.
BorderColor - culoarea liniei cu care este trasat chenarul;
BorderWidth - grosimea liniei cu care este trasat chenarul este de tip numeric i
este exprimat n puncte: 1 punct, 3 puncte etc.;
LineSlant - modul de trasare este de tip caracter i exprim codul direciei de
trasare a dreptunghiului care formeaz chenarul: \ - trasarea se face ncepnd de la
colul din stnga sus spre colul din dreapta jos i / - trasarea se face ncepnd de la
colul din dreapta jos spre colul din stnga sus;

Curvature - curbura colurilor chenarului stabilete gradul de rotunjire al colurilor i


este de tip numeric. Poate lua valori de la 0 la 99 determinnd aspectul chenarului.
Astfel pentru valoarea 0 chenarul va fi un dreptunghi sau un ptrat, pentru valoarea 99
chenarul se va transforma ntr-un cerc, respectiv o elips, iar pentru o valoare cuprins
ntre cele dou limite, de exemplu 30, se va transforma ntr-un dreptunghi, respectiv
ntr-un ptrat cu colurile rotunjite.
Pictograma de glisare - DragIcon . Este de tip ir de caractere i reprezint identificatorul fiierului (calea de director i numele) care conine pictograma ce va fi afiat n locul cursorului de mouse atunci cnd se execut operaia de glisare i plasare a obiectului.
Cursorul de mouse - MousePointer . Este
!
de tip numeric i reprezint codul asociat
Folosind autodocumentarea aflai care
formei cursorului de mouse afiat atunci
sunt valorile asociate proprietii
cnd este indicat o zon a obiectului.
MousePointer.
Disponibilitatea - Enabled . Este o proprietate de tip logic. Dac are valoarea .T. controlul este disponibil (enabled), adic
utilizatorul l poate aciona, iar dac are valoarea .F. nu este disponibil (disabled), adic
nu-l poate aciona. Un control nu este disponibil atunci cnd nu sunt ndeplinite condiiile
necesare pentru a putea fi folosit. Reprezentarea grafic i legenda controalelor care nu
sunt disponibile sunt afiate estompat.
Vizibilitatea - Visible . Este o proprietate de tip logic. Dac are valoarea .T. obiectul este
vizibil, iar cnd are valoarea .F. nu este vizibil.

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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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).

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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

Chiar dac se uureaz munca programatorului atunci cnd construiete interfaa cu


ajutorul obiectelor create pe baza claselor vizuale predefinite puse la dispoziie de
programarea pe obiecte, din exemplele prezentate se poate vedea c i aceast metod
este destul de laborioas. De aceea, pentru construirea interfeei se recomand metoda
vizual. Aadar:
Programarea vizual const n folosirea unor instrumente interactive care ajut
programatorul s precizeze diferite opiuni i s contruiasc diferite elemente ale
aplicaiei, pe baza crora sistemul genereaz apoi codul programului.
Programarea vizual se bazeaz pe programarea orientat pe obiecte (codul de program
este generat folosind programarea orientat pe obiecte). Metoda vizual crete productivitatea programatorului.
Recomandare: Pentru construirea elementelor aplicaiei, se recomand folosirea
metodei vizuale, iar acolo unde nu obinei efectul dorit folosind aceast metod, vei
folosi metoda clasic a programrii structurate pentru a scrie programul.
Programarea vizual pune la dispoziia programatorului dou instrumente interactive:
constructori i
proceduri asistent.

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:

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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

Creai tabelul Agenda1 cu urmtoarea structur de cmpuri: nume (C,15), prenume


(C,15) i telefon (C,10). Adugai
trei nregistrri de date la tabel. Nu
nchidei tabelul.
Creai un formular
procedura asistent

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

tabel. Alegei pentru criteriul de ordonare


cmpurile nume i prenume. Trecei la
dialogul urmtor.

n dialogul Step4 scriei legenda formularului


n caseta de text Type a title for your form.
Din grupul de butoane radio alegei opiunea
Save and run form. Acionai apoi butonul
Finish pentru terminare. Se deschide caseta de dialog Save As n care comunicai numele formularului Agenda1.
Dup nchiderea casetei Save as este
lansat n execuie formularul.
Testai butoanele formularului executnd
operaii de vizualizare a nregistrrilor, de
adugare, de tergere i de cutare a unei
nregistrri.
nchidei formularul.

Butoanele adugate la formular


Top Mut pointerul de nregistrare pe
prima nregistrare.
Prev Mut pointerul de nregistrare pe
nregistrarea precedent.
Next Mut pointerul de nregistrare pe
nregistrarea urmtoare.
Bottom Mut pointerul de nregistrare pe
ultima nregistrare.
Find Afiez caseta de dialog Search
prin intermediul creia construii
un criteriu de cutare a unei
nregistrri.
Print Tiprete un raport cu datele din
tabel.
Add Adaug o nregistrare la sfritul
tabelului.
Edit Permite modificarea valorilor din
cmpurile nregistrrii curente.
Delete terge nregistrarea curent.
Exit nchide formularul form.

Deschidei tabelul asociat formularului cu


comanda use Asgnda1.scx. Vizualizai cu
comanda list stru structura de cmpuri a tabelului asociat formularului. Vizualizai
coninutul tabelului cu comanda browse. Identificai proprietile i metodele asociate
formularului i obictelor din formular. nchidei fereastra Browse. nchidei fiierul cu
comanda use. Deschidei tabelul cu comanda use Agenda1.
Creai un formular folosind constructorul rapid pentru formulare

Lansai n execuie constructorul de formulare fie cu comanda:


create form agenda2
fie prin opiunea de meniu New...File. Se deschide caseta de dialog New din care
alegei din grupul de butoane radio File Type opiunea Form i apoi executai clic pe
butonul New File.

Se deschide fereastra aplicaiei Form Designer. n fereastr este deschis fereastra


document Form1 n care se vor crea obiectele care aparin formularului. Suprafaa
formularului este divizat printr-o gril care va ajuta utilizatorul la aranjarea obiectului

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

247

n cadrul formularului (alinierea obiectelor la liniile grilei). n bara de meniu a fost


adugat un titlu de meniu (Form) cu opiuni specifice constructorului de formulare. n
Meniul Form care conine opiuni specifice
constructorului de formulare

Grila prin care este divizat


suprafaa formularului.

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.

3.3. For m ularele

3.3.1. Metodele i evenimentele specifice formularelor


Formularele pot executa aciuni (au asociate metode) i pot rspunde la evenimente.
Evenimentele la care pot rspunde formularele sunt:
9 Iniializarea obiectului Init declanat de crearea obiectului; procedura asociat
acestui eveniment se execut automat la crearea formularului i are ca scop preluarea parametrilor transmii de modulul apelant (n cazul unui apel cu parametri, prima
instruciune din metoda init va fi parameters <list_parametri_formali>).
9 ncrcarea formularului Load ; procedura asociat acestui eveniment se apeleaz
naintea procedurii asociate evenimentului de iniializare i poate conine instruciuni
care trebuie s se execute nainte de a iniializa obiectele din formular (de exemplu
iniializarea unor variabile de memorie, deschiderea unor tabele etc.). Evenimentele
Load sunt sesizate n ordinea incluziunii obiectelor. De exemplu, este sesizat evenimentul Load al unui set de formulare i apoi cele ale formularelor coninute.
9 Activarea formularului Activate care d posibilitatea de a interaciona cu obiectele din
formular, ca de exemplu evidenierea unui text dintr-o caset de editare.
9 Dezactivarea formularului Deactivate - se produce atunci cnd este activat un alt
formular.
9 Distrugerea formularului Destroy - are ca efect tergerea din memoria intern a
tuturor informaiilor despre formular i eliminarea formularului de pe ecran.
9 Descrcarea formularului Unload - este ultlimul eveniment care se execut nainte
de eliberarea formularului; prin procedura asociat, formularul poate returna o valoare
modulului apelant (cel care l-a lansat n execuie).
Observaii:
1. Procedura asociat evenimentului Load se execut nainte de cele asociate evenimentelor Init, Activate i GotFocus.
2. ntr-un formular pot fi create mai multe obiecte, fiecare dintre ele avnd propriul
eveniment Init. Ordinea de execuie a procedurilor de inializare este: mai nti se
execut iniializarea obiectelor din formular (controalele) n ordinea n care au fost
definite i apoi iniializarea formularului. n acest mod putei avea acces la controalele
din procedura asociat evenimentului Init al formularului. Pentru a mpiedica crearea
unui control, procedura Init asociat controlului trebuie s ntoarc valoarea .F..

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

249

3. Dac datele preluate de formular prin intermediul parametrilor actuali ai procedurii


asociate evenimentului Init sunt necesare i n alte metode i evenimente, ei vor fi
transmii ca variabile globale.
4. Procedura asociat evenimentului Unload se execut dup procedura asociat
evenimentului Destroy i dup ce au fost eliberate toate obiectele coninute. De
exemplu, dac un formular este creat ntr-un set de formulare i conine o caset de
text i un buton de comand, la eliberarea unui formular evenimentele sunt tratate n
urmtoarea ordine: Destroy pentru setul de formulare, Destroy pentru formular,
Destroy pentru caseta de text i butonul de comand, Unload pentru formular i
Unload pentru setul de formulare.
Metodele pe care le pot executa formularele sunt:
9 Metoda de afiare Show - are ca efect afiarea pe ecran a formularului care a fost
creat sau care a fost ascuns anterior.
9 Aciunea de ascundere Hide - are ca efect ndeprtarea formularului de pe ecran,
fr ca informaiile referitoare la el s fie terse din memoria intern; se pot executa
chiar diferite operaii cu formularul ascuns, ca de exemplu crearea n formular a unor
noi controale care vor fi afiate atunci cnd formularul va fi reafiat.
9 Metoda de reactualizare Refresh - are ca efect remprosptarea formularului i a
obiectelor din formular, astfel nct ele s afieze valorile actuale; n aceast metod
vor fi scrise instruciunile prin care se pot actualiza valorile unor proprieti ale formularului sau ale obiectului, sau valorile unor variabile de memorie folosite pentru
calcularea unor date.
9 Metoda de tergere a formularului din memorie Release - are ca efect eliberarea
zonei de memorie alocate formularului.

3.3.2. Mediul de date al formularelor


Formularele sunt folosite pentru a permite accesul utilizatorului la datele din tabelele sau
vizualizrile bazei de date. De aceea, o dat cu crearea formularului se creeaz i obiectul container nevizual DataEnvironment care conine obiectele Cursor (pstreaz evidena tabelelor i a vizualizrilor asociate) i Relation (pstreaz legturile dintre tabele).
Prin intermediul acestui control container se deschid tabelele i vizualizrile asociate i
se stabilesc legturile dintre tabele i se nchid tabelele i vizualizrile atunci cnd se nchide i formularul. Proprietatea DataEnvironment a formularului conine referina ctre
obiectul DataEnvironment asociat formularului. Dac nu se folosete obiectul
DataEnvironment, comenzile pentru deschiderea tabelelor i a vizualizrilor se pot scrie
n proecdura asociat evenimentului Load, iar comenzile pentru nchiderea lor n
procedura asociat evenimentului Unload.
Mediul de date poate conine tabele ale bazei de date sau tabele libere. Dac tabelele
fac parte dintr-o baz de date, mediul de date preia i legturile permanente dintre
tabele. Se pot pstra aceste legturi, se pot modifica sau pot fi nlocuite cu altele noi.
Dac tabelele sunt libere, trebuie precizate legturile dintre ele.
Obiectul DataEnvironment are urmtoarele proprieti, metode i evenimente specifice:
9 Proprietile de tip logic se recomand numai dac localizarea pe disc a tabelelor i a
vizualizrilor este cunoscut de ctre programator la proiectarea formularului, altfel se vor
folosi metodele asociate obiectului:

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.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

251

3.3.3. Obiecte de tip formular


Formularul Formx
Cu ajutorul acestui tip de obiect vizual putei crea formulare de tip fereastr sau caset
de dialog.
Formularele au proprieti, metode i evenimente cu care le este controlat aspectul i
comportamentul. Pe lng proprietile standard, formularele mai au urmtoarele
proprieti specifice care determin aspectul i comportamentul lor:
9 Starea ferestrei - WindowStates. Este o proprietatea de tip numeric care controleaz starea n care se gsete fereastra: normal (0), minimizat (1) sau maximizat (2). Fereastra minimizat ve fi redus fie la o dimensiune minim, fie la o pictogram. Fereastra maximizat va fi mrit astfel nct s ocupe tot ecranul.
9 Dimensiunile ferestrei minimizate sunt specificate prin proprietile de tip numeric:
MinHeight - nlimea ferestrei minimizate;
MinWidth - limea ferestrei minimizate.
9 Pictograma ferestrei minimizate - Icon . Este de tip ir de caractere i reprezint
identificatorul fiierului care conine pictograma asociat ferestrei minimizate. Fiierul
trebuie s fie de tip fiier de pictograme (.ico).
9 Pictograma meniului de control - Picture . Este de tip ir de caratere i reprezint
identificatorul fiierului sau numele unui cmp de tip General care conine pictograma
asociat butonului meniului de control. Fiierul trebuie s fie de tip bitmap (.bmp) sau
de pictograme (.ico).
9 Scara de poziionare - ScaleMod . Este de tip numeric i reprezint un cod pentru
unitatea de msur folosit pentru coordonatele obiectului. Are valoarea 0 pentru
unitatea de msur Foxels (unitate specific mediului Visual FoxPro, echivalent cu
nlimea maxim i limea medie a unui caracter din fontul curent i 3 pentru pixeli.
9 Coordonatele poziiei n care se poate ncepe scrierea unui text sau desenarea unui
obiect grafic ntr-un formular sunt specificate prin proprietile de tip numeric:
CurentX - coordonata <x>;
CurentY - coordonata <y>.
9 Centrarea formularului - AutoCenter . Este o proprietate de tip logic. Dac are
valoarea .T. formularul este afiat automat n centrul reperului (ecran sau alt formular) fr
s se in cont de valorile proprietilor Left i Top.
9 Acoperirea formularului - AlwaysOnTop . Este o proprietate de tip logic. Dac are
valoarea .T. formularul nu poate fi acoperit de alte formulare.
9 Umplerea este specificat prin proprietile de tip numeric:
FillStyle - modelul care va fi afiat n fundalul formularului;
FillColor - culoarea modelului afiat n fundalul formularului.
9 Butoanele specifice unui formular sunt precizate prin proprietile de tip logic:
MinButton - controleaz dac formularul are buton de minimizare sau nu;
MaxButton - controleaz dac formularul are buton de maximizare sau nu;

252 Informatic
ControlBox - controleaz dac formularul are buton de meniu de control sau nu.
9 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).

Identificai instrumentele constructorului de formulare


Vei realiza un formular pentru testarea metodelor folosite ntr-o fereastr.

Deschidei fereastra constructorului de aplicaii fie cu opiunea de meniu New...File


(n caseta de dialog New File alegei butonul Form din grupul de butoane radio File
Type i apoi executai clic pe butonul New File), fie cu comanda create form forma1.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

253

Pentru crearea formularului i a obiectelor din formular Constructorul de formulare


v pune la dispoziie urmtoarele instrumente:
9 Ferestre:
Fereastra aplicaiei. Are titlul Form designer urmat de numele fiierului n care se
creeaz formularul. Fereastra conine spaiul formularului n care vei defini obiectele.
Fereastra de proprieti. Are titlul Properties i conine mai multe seciuni .
Fereastra pentru secvenele de cod asociate metodelor i evenimentelor. Are
titlul <nume_obiect>.<nume_procedura>, unde <nume_obiect> este numele obiectului pentru care scriei procedura (l putei alege din lista ascuns Object), iar
<nume_procedura> este numele metodei sau evenimentului pentru care scriei
procedura (l putei alege din lista ascuns Procedure).
Fereastra mediului de proprieti ale formularului. Are titlul Data Environment
i poate fi folosit pentru precizarea tabelelor, a vizulizrilor i a relaiilor dintre ele.
Tabelele vor fi deschise automat la definirea formularului.

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

Permite modificarea ordinii de focalizare cu tasta Tab a obiectelor din formular.


Ordinea implicit este cea n care au fost proiectate (adugate la formular).

Grid Lines
Show Position

Opiune de tip comutator. Afieaz/ascunde grila pentru alinierea obiectelor.


Opiune de tip comutator. Controleaz afiarea n bara de stare a poziiei i
dimensiunii obiectului selectat.
Meniul Format

Snap To Grid

Opiune de tip comutator. Controleaz alinierea automat a obiectelor nou create


la liniile grilei.
Permite modificarea distanelor (n pixeli) dintre liniile grilei.

Set Grid Scale

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...

Creeaz o metod nou pentru o clas definit de utilizator. Se deschide caseta de


dialog New Method prin intermediul creia stabilii numele i descrierea metodei.
Permite modificarea sau tergerea unei proprieti sau metode definite de utilizator. Se deschide caseta de dialog Modify Property/Method prin intermediul
creia administrai proprietile i metodele definite.

Include File...

Permite specificarea numelui fiierului cu constante predefinite ale clasei definite


de utilizator.
Create Form
Creeaz un set de formulare care va conine formularul curent. Dac exist deja
Set
un set de formulare, opiunea nu este disponibil.
Remove Form nltur setul de formulare. Opiunea este disponibil numai dac exist un set de
Set
formulare, iar acesta conine numai un formular.
Add New Form Adaug un formular la setul de formulare. Opiunea este disponibil numai dac a
fost creat un set de formulare.
Remove Form

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

Deschide fereastra Constructorului rapid de formulare.


Lanseaz n execuie formularul.

Identificai instrumentele specifice constructorului de formulare: butoanele din barele


de instrumente, ferestrele i opiunile de meniu specifice acestei aplicaii.
Afiai barele cu instrumente i identificai pe fiecare bar controalele pe care le putei
folosi.

9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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

OLE Container Control


OLE Bound Control
Line
Shape
Container
Separator
BuildLock
ButtonLock

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

Set Tab Order


Data Environment
Properties Windows

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

Align Left Sides


Align Right Sides
Align Top Edges
Align Bottom Edges

10 11 12 13

Buton
5
6
7
8
9

Align Vertical Centers


Align Horizontal Centers
Same Width
Same Height
Same Size

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

Copiaz n Clipboard obiectul selectat.


Mut n Clipboard obiectul selectat.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor


Opiunea
Paste

257

Semnificaie
Insereaz n formular, n poziia indicat, obiectul care fost copiat anterior n
Clipboard.

Data
Environment

Deschide fereastra Data Environment

Properties
Builder

F,O
F,O

Code

F,O

Afieaz n fereastra de proprieti formularul sau obiectul selectat.


Deschide fereastra Constructorului rapid de formulare corespunztoare
obiectului selectat.
Deschide fereastra pentru scrierea secvenei de cod asociate unei metode
sau eveniment al obiectului selectat.

Help

F,O Deschide fereastra cu informaii despre obiect (help dependent de context).


Lista ascuns din care alegei obiectul
pentru care stabilii prorpietile i
procedurile pentru metode i evenimente.

Seciunea

Conine

All

Toate proprietile

Data

Numai proprietile care caracterizeaz data memorat n control.

Method

Numai metodele i evenimentele


asociate obiectului.

Layout

Numai proprietile care


caracterizeaz aspectul controlului.

Other

Alte proprieti dect cele care


caracterizeaz datele i aspectul.

Activeaz constructorul de expresii


Expression Builder pentru construirea
interactiv a unei expresii.
Proprietate pentru care s-a
modificat valoarea implicit
Proprietate protejat la scriere
Proprietate sau metod sau
eveniment selectat

Identificai, pentru formular i obiectele definite n formular, opiunile meniului rapid.


Cu obiectele din formular putei executa mai multe operaii:
Selectare obiect - executai clic pe suprafaa obiectului.
Selectare grup de obiecte - executai clic pe butonul Select Object din bara Form
controls i glisai apoi mouse-ul peste obiectele pe care vrei s le selectai.
Mutarea obiectului - fie glisai obiectul cu mouse-ul, fie selectai obiectul i apoi
folosii operaiile Cut i Paste (din meniul Edit sau din meniul de comenzi rapide).

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.

Folosind funcia de creare de


instane multiple, mai adugai
la formular dou casete de
text. Selectai grupul de casete de text i aplicai un
anumit stil acestor casete (cu
AutoFormat Builder). Aliniai
grupul n diferite maniere folosind butoanele de pe bara
Layout.
Structura ierarhizat
Schimbai ordinea de para formularului.
curgere a formularului fie folosind opiunea de meniu, fie
butonul Sel Tab Order din
bara Form Designer. Stabilii
ordinea executnd clic n formular, pe obiecte, n ordinea n care vrei s fie parcurse:

Noua ordine de parcurgere a


formularului cu tasta Tab.

nchidei constructorul de formulare fr s salvai modificrile fcute.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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.

Deschidei fereastra constructorului


de aplicaii.
n fereastra de proprieti atribuii
urmtoarele valori proprietilor (care determin aspectul i comportarea
formularului):
Name = "Form1"
ScaleMode = 3
Top = 13
Left = 14
Height = 300
Width = 450
Desktop = .F.
BackColor = 220,220,220
ForeColor = 0,0,0
BorderStyle = 2
Caption = "Exemplu"
FontName = "Courier New"
FontSize = 16

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.

Din lista ascuns


Object putei alege
obiectul pentru
care scriei codul
procedurii.

Procedure MouseDown
Lparameters nButton, nShift,;
nXCoord, nYCoord

Din lista ascuns


Procedure putei
alege evenimentul
sau metoda pentru
care scriei
secvena de cod.

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

Modify Form - Modificai


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.

Setul de formulare FormSetx


Este un container care conine un grup de formulare. Este caracterizat de proprietile
care pot fi folosite pentru parcurgerea ciclic a formularelor din set:
9 Numrul de formulare din set FormCount . Este de tip numeric.
9 Formularele Forms . Este de tip vector. n elementele vectorului se pstreaz
referinele ctre formularele din grup.
Mai poate fi folsit i proprietatea AutoReleased care conine o referin ctre formularul activ
i proprietatea AutoReleased care determin cum este eliberat setul de formulare. Este de tip
logic: dac are valoarea .T. (implicit atunci cnd setul de formulare este creat pe baza metodei
vizuale), setul de formulare va fi eliberat dup ce este eliberat i ultimul formular din set i dac
are valoarea .F. (implicit atunci cnd setul de formulare este creat prin program), setul de
formulare nu va fi eliberat dup ce este eliberat i ultimul formular din set.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

261

Creai seturi de formulare


1. Creai un set de formulare care
conine dou formulare. Legendele celor dou formulare sunt
Formular 1 i Formular 2. Pentru
fundalul lor s-au ales dou culori
diferite.

Creai setul de formulare cu opiunea de meniu Create Form Set


Form. Iniial setul va conine un
singur formular. Adugai al doilea formular cu opiunea Add
New Form Form.
Proprietile setului de formulare
i ale formularelor se vor stabili
prin intermediul ferestrei de proprieti astfel:
* Proprietatile setului
Caption = "Formularul 1"
AutoRelease = .T.
AlwaysOnTop = .T.
Name = "Formset1"
* Proprietatile formularului 2
* Proprietatile formularului 1
Name = "Form2"
Name = "Form1"
Top = 32
Top = 8
Left = 113
Left = 44
Height = 250
Height = 250
Width = 375
Width = 375
BackColor = 192,192,192
BackColor = 128,128,128
BorderStyle = 2
BorderStyle = 1
Caption = "Formularul 2"
Pentru fiecare formular, scriei cte o procedur asociat evenimentului Click. La
producerea acestui eveniment, se parcurg ciclic cele dou formulare, i se scrie n bara
de titlu al fiecrui formular numrul su.
Procedure Click
for n=1 to thisformset.formcount
thisformSet.Forms(n).Caption= thisformSet.Forms(n).Caption+str(n,2)
endfor
Endproc
Salvai setul de formulare i l testai lansndu-l n execuie.
2. Setului de formulare li se va mai aduga un formular. Formularul Formular 1 va fi
afiat ntotdeauna deasupra celorlalte. Formularele pot fi mutate pe ecran, dar nici un
formular nu poate fi adus deasupra formularului Formular 1. Se implementeaz, prin
intermediul procedurilor, rspunsuri la evenimentul Click.

Deschidei formulaul anterior i l salvai sub un alt nume. Adugai la setul de


formulare cel de al treilea formular.

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

Setul de pagini PageFramex i pagina Pagex


Setul de pagini este un container care conine un grup de pagini. Pentru a fi vizibil, setul
de pagini trebuie creat ntr-un formular (form). El se folosete pentru a obine un obiect de
interfa de tipul caset de dialog cu seciuni (tabs). Setul de pagini va reprezenta caseta
de dialog, iar paginile seciunile casetei. La un moment dat, o singur pagin (seciune a
casetei) este activ. Paginile nu pot fi create dect ntr-un set de pagini, i nu ca formulare
independente. Dac este mutat setul de pagini, se mut automat cu el i paginile.
Eticheta paginii este afiat n partea superioar a paginii. Ea este folosit ca un
identificator al paginii, dar i ca un element care poate fi acionat cu mouse-ul (clic)
pentru a activa pagina. Ca identificator al etichetei paginii se folosete textul din proprietatea Caption a paginii.
Setul de formulare are urmtoarele proprieti specifice care determin caracteristicile
paginilor din set:
9 Pagina activ ActivePage . Este de tip numeric i reprezint numrul paginii active.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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.

Construii un set de pagini


1. Construii un set de pagini care s conin 8 pagini:

Lansai n execuie constructorul de formulare i creai un formular nou.


Executai clic pe butonul PageFrame din bara Form controls. Glisai apoi mouse-ul
n fereastra formularului, peste suprafaa care vrei s fie ocupat de setul de pagini.
Se va crea iniial un set de pagini cu dou pagini.

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

2. n fereastra Properties, deschidei lista cu obiectele din pagin i observai structura


ierarhizat a obiectelor din formular.
3. Cele dou moduri n care sunt afiate paginile sunt controlate cu proprietatea
TabStretch. Testai efectul acestei proprieti.
Setul de pagini se identific prin:
Form1.Pageframe1

O pagin (de exemplu pagina P4) se identific prin:


Form1.Pageframe1.P1

4. Dac paginii P2 i se atribuie numrul de ordine 5 (Page2.PageOrder=5), se vor


modifica i paginile: P3 va primi numrul de ordine 2, P4 va primi numrul de ordine
3 i P5 va primi numrul de ordine 4. Testai operaia de schimbare a ordinii
paginilor.

TabStretch=0
TabStretch=1

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

265

T est pentru evaluare:


1. Creai un set de trei formulare. Formularele vor fi de tip fereastr. n fiecare formular
vei desena cte o form: un ptrat, un cerc i o elips. Forma va fi afiat n formular
numai cnd este activat formularul.
2. Creai un formular cu patru pagini. Cnd activai o
pagin, n interiorul ei se va scrie legenda sa.

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

3.4.1. Proprietile i evenimentele specifice controalelor


Pe lng proprietile standard comune controalelor i formularelor, controalele mai au
urmtoarele proprieti specifice:
9 Valoarea Value . Este o proprietate pe care programatorul interfeei o poate folosi ca
s pstreze valoarea unei date prin simpla referire la acel control. Ea permite
proiectantului interfeei s foloseasc obiectele de tip control ca o legtur ntre
utilizator i aplicaie, prin care utilizatorul comunic aplicaiei datele de intrare i
procesele pe care trebuie s le execute, iar aplicaia, rezultatele obinute. n tabelul
alturat sunt prezentate tipurile de date permise pentru fiecare control predefinit.
9 Sursa controlului ControlSource . Este o proprieTipuri de date
tate care stabilete sursa de date a controlului (va- Control
permise
riabila de memorie sau cmpul referit) care deterCheckBox Integer, Numeric,
min i tipul datei pstrate n valoarea controlului.
Logical
9 Printele Parent . Este identificatorul formularului Command Character,
de care aparine controlul.
Group
Integer, Numeric
Character, Memo
9 Alinierea Alignment . Caracterizeaz modul n EditBox
Orice tip
care va fi aliniat textul n interiorul unui obiect. Pro- TextBox
Character,
prietatea este de tip numeric i poate lua valorile: 0 - Grid
Numeric
Left (aliniere la stnga; implicit), 1 - Right (aliniere la
ListBox
Character,
dreapta), 2 - Center (aliniere n centru) i 3 Integer, Numeric
Automatic (implicit - alinierea este fcut de ctre
Combo
Character,
sistem n funcie de tipul proprietii Value: pentru
Box
Integer, Numeric
tipuri numeric, la stnga, iar pentru celelalte la Spinner
Currency, Integer,
dreapta).
Numeric
9 Aparena SpecialEffect . Este de tip numeric i Option
Integer, Numeric,
definete aspectul tridimensional (0) sau plat (1) al Button
Logical
Option
Character,
obiectului.
Integer, Numeric
9 Stilul fundalului BackStyle . Este de tip numeric Group
i definete stilul fundalului controlului: transparent
(0) sau opac (1). Implicit este opac. n stilul transparent este ignorat proprietatea
BackColor. Se recomand acest stil pentru controalele plasate peste imagini grafice)
9 Bara de stare StatusBarText . Este de tip ir de caractere i reprezint textul care
va fi afiat n bara de stare atunci cnd este focalizat controlul.
9 Informaiile despre control ToolTipText . Este de tip ir de caractere i reprezint
textul care va fi afiat n caseta de informaii (ToolTip) atunci cnd este indicat
controlul cu mouse-ul.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

267

9 Culorile controlului care nu este disponibil sunt determinate de proprietile de tip


numeric:
BackColor - culoarea fundalului;
ForeColor - culoarea textului.
9 Tasta de acces. Putei focaliza rapid un control apsnd o liter mpreun cu tasta Alt.
Tasta literei se numete tast de acces (access key) i ea este afiat subliniat. Putei
s o stabilii, dac n proprietatea Caption a controlului scriei litera care vrei s fie tast
de acces precedat de caracterele: \<. De exemplu, dac legenda unui control este
Telefon i vrei ca litera F s fie tast de acces, vei scrie legenda astfel: Tele\<fon. n
formular legenda va fi afiat Telefon.
9 Protejarea la scriere ReadOnly . Este de tip logic i caracterizeaz modul de acces
la un control: dac are valoarea .T., controlul nu poate fi editat (poate fi numai
vizualizat), altfel utilizatorul poate modifica valoarea controlului. Valoarea implicit a
proprietii este .F..
Evenimentele specifice sunt:
9 Accesul condiionat When . Se declaneaz naintea primirii focalizrii. Procedura
asociat evenimentului poate fi folosit pentru a focaliza condiionat controlul: dac nu
sunt ndeplinite anumite condiii (precizate n procedur) controlul nu va putea fi focalizat. Procedura va ntoarce un rezultat de tip logic: valoarea .T. va permite primirea
focalizrii, iar valoarea .F. nu.
9 Validarea Valid . Se declaneaz nainte de pierderea focalizrii. Procedura asociat
evenimentului poate fi folosit pentru a ceda focalizarea condiionat: de exemplu, n
cazul unuei casete de text, dac valoarea introdus n cmp nu ndeplinete o anumit
condiie, nu se va putea focaliza urmtorul control. Procedura va ntoarce fie un rezultat
de tip logic (valoarea .T. va permite transferarea focalizrii, iar valoarea .F. va pstra
focalizarea), fie un rezultat numeric (0 - controlul pstreaz focalizarea, diferit de 0 focalizarea va avansa peste n controale, n fiind valoarea furnizat; avansarea se va
face n sensul acionrii tastei Tab, dac valoarea este pozitiv, i n sens invers, dac
valoarea este negativ). Astfel, dac procedura ntoarce valoarea 1, focalizarea este
trecut controlului urmtor, iar dac ntoarce valoarea -1, focalizarea este trecut
controlului anterior.

3.4.2. Controale pentru executarea aciunilor


Cea mai simpl cale prin care i se permite unui utilizator s interacioneze cu o aplicaie
este executarea unui clic pe un buton de pe ecran. Aceste controale pot fi de tip declanator sau buton de comand (command button) sau opiune de meniu (menu option).

Butonul de comand CommandButtonx


Este folosit pentru a ncepe, a ntrerupe sau a termina un anumit proces n cadrul
aplicaiei. De exemplu, n timpul executrii unui proces poate fi afiat un buton de
comand de tip Pause care prin acionare oprete temporar executarea procesului. n
timpul opririi temporare a unui proces, butonul de pauz este nlocuit cu butonul Resume
pentru reluarea execuiei procesului din punctul n care a fost ntrerupt. Mai poate fi afiat

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..

Grupul de butoane de comand CommandButtonGroupx


Se folosete pentru a grupa butoanele dintr-un formular i a uura administrarea lor.
Grupul de butoane de comand are urmtoarele proprieti specifice:
9 Numrul de butoane din grup ButtonCount . Este de tip numeric.
9 Butoanele Buttons . Este de tip vector. Elementele sale se folosesc pentru a referi
butoanelor din grup.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

269

Construii un formular care conine butoane de comand, folosind metoda


programrii
Realizai un formular care s prezinte panta unei linii. Formularul este
de tip caset de dialog, are titlul
Test linie i culoarea fundalului gri.
Pentru testarea liniei se vor folosi
trei butoane de comand: Crescator, Normal, Descrescator. Cel de la
patrulea buton, Terminare, se folosete pentru a nchide formularul.
Toate butoanele au taste de acces.
Aciunile realizate la acionarea
butonului sunt descrise n procedurile pentru evenimentele Click ale fiecrui buton.

Scriei programul surs ntr-un fiier forma_p.prg.


public h
Top = 100
F1 = CreateObject('Form')
Height = 25
F1.Caption='Test linie'
Procedure Click
F1.Closable = .F.
ThisForm.L.Visible = .F.
F1.Width=400
ThisForm.L.Height=H
F1.Height=200
ThisForm.L.LineSlant ='/'
F1.BackColor=RGB(220,220,220)
ThisForm.L.Visible = .T.
Enddefine
F1.AddObject('L','Line')
F1.AddObject('B1','Buton1')
Define class Buton2 as;
F1.AddObject('B2','Buton2')
CommandButton
F1.AddObject('B3','Buton3')
Caption = '\<Normal'
F1.AddObject('B4','Buton4')
Left = 150
Top = 100
F1.L.Visible = .T.
Height = 25
F1.L.Top = 20
Procedure Click
F1.L.Left = 150
ThisForm.L.Visible = .F.
h=F1.L.Height
ThisForm.L.Height=0
F1.B1.Visible =.T.
ThisForm.L.Visible = .T.
F1.B2.Visible =.T.
Enddefine
F1.B3.Visible =.T.
F1.B4.Visible =.T.
Define class Buton3 as;
CommandButton
F1.Show
Caption = '\<Descrescator'
Read events
Left = 275
Top = 100
Define class Buton1 as;
Height = 25
CommandButton
Procedure Click
Caption = ' \<Crescator'
ThisForm.L.Visible = .F.
Left = 25
ThisForm.L.Height=H

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

Construii un formular care conine butoane de comand folosind metoda vizual

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.

Pentru a crea cele patru butoane declantoare, folosii facilitatea de creare de


instan-e multiple. Executai clic pe butonul ButtonLock pe bara Form controls,
apoi exe-cutai clic pe butonul CommandButton de pe aceeai bar. Glisai mouseul n formular pentru a crea un buton de comand. Apoi executai clic de trei ori n
poziiile n care vrei s apar celelalte butoane. Dezactivai facilitatea executnd clic
pe bu-tonul ButtonLock.

Modificai corespunztor valorile proprietilor formularului i obiectelor din formular


(pe baza instruciunilor din programul surs).

Scriei cte o procedur pentru fiecare eveniment Click al celor patru butoane (pe
baza instruciunilor din programul surs).

Salvai formularul i-l lansai n execuie cu


comanda do form forma_v. Testai formularul.

3.4.3 Controale pentru introducerea i afiarea datelor


Eticheta Labelx
Este un control care afieaz un text pe care utilizatorul nu-l poate modifica. Poate fi
folosit ca identificator al unei zone dintr-un formular, pentru furnizarea unor instruciuni
pentru utilizator sau pentru identificarea unor controale care nu au proprietatea de
legend (cum sunt casetele de text, zonele de editare, listele etc.). Textul care va fi afiat
este memorat n proprietatea Caption a etichetei care poate avea lungimea de maxim
256 de caractere. Proprietatea de aliniere (alignment) se refer la tipul de aliniere folosit
pentru textul etichetei.
La definirea unei etichete, legenda nu poate ocupa dect o singur linie de text. Dac
legenda etichetei este mai mare sau lungimea ei se poate schimba n funcie de anumite
condiii (prin schimbarea textului), exist dou proprieti specifice etichetei care permit
legendei s ncap n zona alocat ei:
9 Autodimensionarea AutoSize . Este de tip logic i stabilete dac eticheta va fi redimensionat automat pe orizontal (textul va fi scris pe un singur rnd), pstrndu-i-se
nlimea, astfel nct s ncap textul: .T. - eticheta este redimensionat automat, iar .F.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

271

(implicit) - eticheta nu este redimensionat; n acest caz textul care nu ncape n


etichet este tiat i nu mai este afiat.
9 Trunchierea textului WordWrap . Este de tip logic i stabilete cum va fi expandat
eticheta (pe orizontal sau pe vertical) pentru a ncpea textul atunci cnd controlul
este redimensionat: .T. - textul este trunchiat, adic se mrete dimensiunea etichetei
pe vertical, pstrndu-i-se limea (textul va fi scris pe mai multe rnduri, separarea
textului pe rnduri fcndu-se la nivel de cuvnt), iar .F. (implicit) - textul nu se
trunchiaz, nu i se modific nlimea, dar este mrit limea. Dac are valoarea .T.,
proprietatea AutoSize este ignorat.

Construii un formular care conine etichete


Caseta de dialog Test mouse conine dou seciuni pentru testarea mouse-ului:
seciunea Deplasare mouse - pentru testarea deplasrii mouse-ului (coordonate, buton
apsat i taste apsate) i Apsare buton - pentru testarea butonului apsat (coordonate,
buton apsat i taste apsate).
Controalele folosite pentru afiare sunt de tip etichet (label). n fiecarea seciune se
creeaz 11 etichete. De exemplu, n prima seciune se definesc 5 etichete cu text fix:
Coordonatele cursorului de mouse sunt:, x=, y=, Buton apasat, Tasta apasata i 6
etichete cu legende dependente de aciunile mouse-ului: dou pentru coordonate, una
pentru butonul apsat i trei pentru tastele apsate.

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

Folosind fereastra Properties stabilii proprietile formularului, a setului de pagini,


ale paginilor i ale obiectelor folosite:

* 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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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

Caseta de text TextBoxx


Afieaz coninutul unei variabile de memorie, al unui cmp sau al unui element de
tablou i permite editarea lui. Pentru editarea textului dipunei de facilitile de editare:
mutarea cursorului de inserare, selectarea textului i operaiile de teregere, mutare i
copiere a textului selectat (Cut, Copy i Paste). Se mai numete i cmp de editare sau
caset de editare. Ea poate fi folosit i pentru afiarea unui text, dar prezint dezavantajul c utilizatorul poate modifica voluntar sau involuntar acest text. Pe lng proprietile standard (dimensiunea, poziia, aparena, fontul, dimensiunea i stilul caracterelor,
stilul bordurii chenarului, alinierea textului n caset) ea are i proprieti specifice care
caracterizeaz modul n care se comport.
Proprietile specifice unei casete de text sunt:
9 Stilul Style . Este de tip numeric i stabilete stilul casetei de text: 0 - Normal (implicit)
i 1 - Read Only (nu poate primi focalizarea; nu poate fi modificat).
9 Protejat la scriere ReadOnly . Este de tip logic; dac are valoarea .T., cmpul poate fi
numai vizualizat, nu i modificat. Cmpul poate fi ns focalizat.
9 Marginile Margin . Este de tip numeric i stabilete distana n interior de la text la
bordura controlului. Este bine s fie mai mare dect 0 pentru a face textul mai lizibil.
9 Ascunderea textului PasswordChar . Este de tip ir de caractere i precizeaz ce
se va afia n caseta de text: textul editat de utilizator (proprietatea are valoarea irul vid:
"") sau un ir de alte caractere, de exemplu * sau # (proprietatea are valoarea un ir de
caractere care ncepe cu caracterul care dorii s fie afiat). Aceast proprietate este
folosit de obicei la casetele de text pentru introducerea parolei sau a codului de
acces, pentru ca persoanele neautorizate s nu poat vedea textul scris.
9 Proprieti folosite la selectarea textului din caseta de text:
Culoarea zonei selectate: SelectedBackColor - culoarea fundalului i
SelectedForeColor - culoarea textului folosite pentru evidenierea textului selectat.
Poziia de nceput a zonei selectate: SelectedStart (tip numeric). Dac nu este
selectat un text, prorpietatea va furniza poziia cursorului de inserare.
Lungimea zonei selectate: SelectedLength (tip numeric) - numrul de caractere
din zona selectat.
Textul selectat: SelectedText (tip ir de caractere). Dac nu este selectat un text,
proprietatea va avea valoarea irul vid.
Ascunderea textului selectat: HideSelection (tip logic). Dac are valoarea .T.
(implicit) textul selectat n caset nu va mai fi evideniat dup ce caseta pierde
focalizarea, altfel el va fi evideniat i dup ce a fost focalizat alt control din formular.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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.

permite i precizarea lungimii formatului. De exemplu, dac proprietatea are


valoa-rea '9999.99', n caseta de text
vei putea scrie numai o valoare numeric; numrul va avea maxim 4 cifre
pentru partea ntreag i dou cifre
pentru partea fracionar.
9 Selectarea la focalizare:
SelectOnEntry . Este de tip logic; dac are valoarea .T., coninutul cmpului este
selectat la focalizarea controlului. Se recomand selectarea la focalizare pentru cmpurile a cror valoare de obicei trebuie schimbat des.
9 Proprieti specifice casetelor de text pentru introducerea cmpurilor memo:

Deschiderea ferestrei de editare a cmpului memo: OpenWindow (tip logic). Se


folosete pentru a stabili modul n care se face desciderea ferestrei: dac are valoarea
.T. (implicit), se va deschide automat atunci cnd este focalizat controlul, altfel trebuie
deschis de ctre utilizator prin apsarea tastelor Ctrl+PageDown.
Fereastra folosit pentru editarea cmpului memo: MemoWindow (tip ir de
caractere). Ea poate fi: fereastra implicit a interfeei Visual FoxPro (valoarea

276 Informatic
proprietii este irul vid) sau o fereastr definit de utilizator (valoarea proprietii va fi
numele ferestrei).

Zona de editare EditBoxx


Spre deosebire de caseta de text care permite scrierea datelor pe un singur rnd, zona
de editare permite introducerea lor pe mai multe rnduri. Ea este recomandat atunci
cnd datele de intrare sunt formate din texte foarte lungi. Fa de casetele de text, zonele
de editare au urmtoarele proprieti specifice:
9 Barele de derulare: ScrollBars . Este de tip numeric. Se afieaz barele de derulare
atunci cnd dimensiunea textului depete capacitatea de afiare a casetei. n
general, proprietatea precizeaz dac nu exist bar de derulare, dac exist bar de
derulare pe vertical, dac exist bar de derulare pe orizontal sau dac exist
ambele tipuri de bare. n cazul zonei de editare, dac are valoarea 0, bara de derulare
este ascuns i derularea textului n zona de editare se face numai cu ajutorul tastelor
de editare, iar dac are valoarea 2, este afiat bara de derulare pe vertical, care va
permite i folosirea mouse-ului. Valoarea implicit este 2.
9 Folosirea tabulrii n text: AlowTabs . Este de tip logic; dac are valoarea .F., nu
este voie s folosii tasta Tab pentru editarea textului (ea va fi folosit pentru ieirea din
zona de editare i predarea focalizrii urmtorului control), iar dac are valoarea .T.,
putei folosi tasta Tab pentru editarea textului (pentru ieirea din zona de editare se va
folosi Ctrl+Tab). Valoarea implicit este F.

Construii un formular care conine casete de text folosind metoda programrii


Realizai o caset de dialog care
simuleaz un calculator. Vor fi trei
casete de text: a,b - operanzii i c
- rezultatul. Rezultatul trebuie s
fie protejat la scrire. Pentru cele
patru operaii se vor folosi
declanatoarele +, -,*,/. Pentru
operaia de mprire se va testa
dac mpritorul este 0; dac are
valoarea 0 se va afia un mesaj
de atenionare, iar focalizarea va fi
mutat pe operandul b. Cel de al
cincilea buton, Terminare, se folosete pentru a nchide caseta de
dialog.

Scriei programul surs Calc_p.prg:


F1 = CreateObject('Form')
F1.Caption='Operatii'
F1.Closable = .F.

F1.Width=400
F1.Height=250
F1.BackColor=RGB(220,220,220)

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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.

Stabilii pentru formular i obiecte urmtoarele proprieti:


* Formularul
Name = "Label2" && Eticheta2
Name = "Form1"
Caption = "\<b"
Top = 0
Name = "Label3" && Eticheta3
Left = 0
Caption = "c"
BackColor = 220,220,220
Name = "Label4" && Eticheta4
Caption = "Operatii"
Caption = "Imposibil!!! ;
* Casetele de text
Impartire la zero"
Name = "Text1" && Text1
Visible = .F.
InputMask = "999999"
* pentru toate etichetele
Name = "Text2" && Text2
AutoSize = .T.
InputMask = "999999"
BackStyle = 0
Name = "Text3"
&& Text3
* Butoanele
BackColor = 220,220,220
Name = "Command1" && Buton1
ReadOnly = .T.
Caption = "+"
Style = 1
Name = "Command2" && Buton2
* Etichetele
Caption = "-"
Name = "Label1" && Eticheta1
Name = "Command3" && Buton3
Caption = "\<a"
Caption = "*"

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

279

Name = "Command4" && Buton4


Name = "Command5" && Buton5
Caption = "/"
Caption = "Terminare"
Scriei procedurile asociate urmtoarelor evenimente: evenimentul Init al
formularului i evenimentele Click ale butoanelor:
procedure Init && Formular
ThisForm.Text1.Value=0
ThisForm.Text2.Value=0
ThisForm.Text3.Value=0
ThisForm.Label4.Visible=.F.
endproc
procedure Click && Buton1
ThisForm.Text3.Value=ThisForm.Text1.Value+ThisForm.Text2.Value
ThisForm.Text3.Refresh
endproc
procedure Click && Buton2
ThisForm.Text3.Value=ThisForm.Text1.Value-ThisForm.Text2.Value
ThisForm.Text3.Refresh
endproc
procedure Click && Buton3
ThisForm.Text3.Value=ThisForm.Text1.Value*ThisForm.Text2.Value
ThisForm.Text3.Refresh
endproc
procedure Click && Buton4
ThisForm.Command4.StatusBarText=''
ThisForm.Label4.Visible=.F.
if ThisForm.Text2.Value=0
ThisForm.Command4.StatusBarText='ImposibiI!!! -Impartire la 0'
ThisForm.Label4.Visible=.T.
ThisForm.Text2.SetFocus
else
ThisForm.Text3.Value=ThisForm.Text1.Value/ThisForm.Text2.Value
ThisForm.Text3.Refresh
endif
endproc
procedure Click && Buton5
ThisForm.Release
endproc
Salvai formularul. l lansai n excuie
i-l testai.
2. Realizai caseta de dialog din exemplul
precedent folosind metoda vizual.

Salvai formularul anterior sub un alt


nume. tergei cea de a patra etichet (cea folosit pentru atenionare;
pentru atenionare vei folosi de data
aceasta o fereastr de atenionare).
Adugai la formular cele dou noi
butoane (pentru salvare n memorie

280 Informatic
M+ i pentru readucere din memorie). Pentru memorarea numrului se va folosi
variabila de memorie global memorie.

Pentru obiectele adugate stabilii proprietile:


Name = "Command6" && Buton6
Name = "Command7"
Caption = "M+"
Caption = "M-"
Scriei o procedur asociat evenimentului Load al formularului n care iniializai
variabila de memorie memorie.
procedure Load && Formular
memorie=0
public memorie
endproc
Modificai procedura asociat evenimentului Clic al butonului Buton4.
procedure Click && Buton4
ThisForm.Command4.StatusBarText=''
if ThisForm.Text2.Value=0
ThisForm.Command4.StatusBarText='ImposibiI!!! -Impartire la 0'
Wait Windows 'ImposibiI!!! -Impartire la 0'
ThisForm.Text2.SetFocus
else
ThisForm.Text3.Value=ThisForm.Text1.Value/ThisForm.Text2.Value
ThisForm.Text3.Refresh
endif
endproc
Scriei procdurile asociate evenimentului Clic pentru cele dou noi butoane:
procedure Click && Buton6
procedure Click && Buton7
Memorie=ThisForm.Text3.Value
ThisForm.Text1.Value=Memorie
endproc
endproc
3. Realizai caseta de dialog pentru introducerea parolei.

Creai formularul i adugai la formular o


etichet, o caset de text i un buton de
comand. Sursa controlului caset de
text va fi variabila de memorie m.parola.
Pentru a permite introducerea unei parole
caseta de dialog trebuie s fie un
formular modal. Stabilii pentru formular
i controale urmtoarele proprieti:
* Formularul
AutoSize = .T.
Name = "Form1"
BackStyle = 0
BackColor = 192,192,192
Caption = "Parola"
Caption = "Parola"
Name = "Text1"
Closable = .F.
ControlSource = "m.parola"
WindowType = 1 && Modal
PasswordChar = "*"
* Obiectele
Name = "Command1"
Name = "Label1"
Caption = "\<Terminare"
Scriei procedurile asociate evenimentelor formularului Load i Unload (prin care
este returnat parola ctre un program):

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

281

Procedure Load && Formular


Procedure Unload && Formular
parola=space(6)
return parola
endproc
endproc
Scriei procedura asociat evenimentului Click al butonului de terminare:
Procedure Click && Buton
ThisForm.Release
endproc
Salvai formularul sub numele form_par.

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.

Realizai o caset de dialog care


s simuleze operaiile de selectare a textului i de lucru cu zona
de memorie Clipboard pentru
transferul datelor (operaiile Copy,
Cut i Paste). Pentru aceste
operaii se vor folosi butoanele
Copiere (Copy), Mutare (Cut),
Inserare (Paste) i Stergere
(Delete). Butoanele au taste de
acces. n acest mod scurttura
Alt+C este similar cu Ctrl+C, Alt+M este similar cu Ctrl+X, Alt+I este similar cu Ctrl+V,
iar Alt+S este similar cu Delete. Transferul textului se va face prin intermediul unei
variabile de memorie zona_s care simuleaz zona de memorie Clipboard. Butoanele

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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

283

endproc
ThisForm.Edit2.SelText=''
procedure Click &&Buton4
endif
if text=1
endproc
zona_s=ThisForm.Edit1.SelText
procedure Click &&Buton5
ThisForm.Edit1.SelText=''
ThisForm.Release
else
endproc
zona_s=ThisForm.Edit2.SelText
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

pentru formular i controale urmtoarele proprieti:


* Formular
Name = "Form1"
Closable = .F.
BackColor = 192,192,192
Caption = "Prelucrare texte"
* Zona de editare
Name = "Edit1"
HideSelection = .F.
*Etichete
Name = "Label1"
Caption = "Text"
Name = "Label2"
Caption = "Se cauta"

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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

285

Pentru casetele de text scriei proceduri asociate evenimentelor GotFocus i


LostFocus:
procedure GotFocus &&Text1
ThisForm.Text2.Enabled=.F.
ThisForm.Commandgroup1.Command1.Enabled=.F.
ThisForm.Commandgroup1.Command2.Enabled=.F.
ThisForm.Commandgroup1.Command3.Enabled=.F.
endproc
procedure LostFocus &&Text1
if Len(ThisForm.Text1.Value)<>0
ThisForm.Commandgroup1.Command1.Enabled=.T.
if Len(ThisForm.Text2.Value)<>0
ThisForm.Commandgroup1.Command2.Enabled=.T.
ThisForm.Commandgroup1.Command3.Enabled=.T.
endif
else
ThisForm.Commandgroup1.Command1.Enabled=.F.
ThisForm.Commandgroup1.Command2.Enabled=.F.
ThisForm.Commandgroup1.Command3.Enabled=.F.
endif
endproc
procedure GotFocus &&Text2
ThisForm.Commandgroup1.Command2.Enabled=.F.
ThisForm.Commandgroup1.Command3.Enabled=.F.
endproc
procedure LostFocus &&Text2
if Len(ThisForm.Text2.Value)<>0
ThisForm.Commandgroup1.Command2.Enabled=.T.
ThisForm.Commandgroup1.Command3.Enabled=.T.
else
ThisForm.Commandgroup1.Command2.Enabled=.F.
ThisForm.Commandgroup1.Command3.Enabled=.F.
endif
endproc
Pentru butoanele din grup i pentru butonul Terminare scriei proceduri asociate
evenimentului Click:
procedure Command1.Click && Grup.Buton1
x=at(alltrim(ThisForm.Text1.Value),ThisForm.Edit1.Value)
if x<>0
ThisForm.Text2.Enabled=.T.
ThisForm.Edit1.SelStart=at(alltrim(ThisForm.Text1.Value),;
ThisForm.Edit1.Value)-1
ThisForm.Edit1.SelLength=Len(alltrim(ThisForm.Text1.Value))
n=n+1
else
ThisForm.Commandgroup1.Command1.Enabled=.F.
ThisForm.Commandgroup1.Command2.Enabled=.F.
ThisForm.Commandgroup1.Command3.Enabled=.F.
ThisForm.Text2.Enabled=.F.
endif

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.

Creai formularul i adugai la


formular cinci etichete, o zon de
editare (pentru cmpul adresa),
patru casete de text (pentru restul
cmpurilor) i patru butoane de
comand. Stabilii pentru formular i
controale urmtoarele proprieti:
* Formular
Name = "Form1"
BackColor = 220,220,220
Caption = "Agenda"
Closable = .F.
* Casetele de text
Name = "Text1"
ControlSource = "agenda.nume"

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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

Caset de text cu derulor Spinnerx


Caseta de text cu derulor este un control care combin un control caset de text cu un
control derulor. Derulorul faciliteaz utilizatorului modificarea unei valori numerice prin
incrementare sau decrementare. Este reprezentat printr-un buton cu dou sgei (sus/jos
sau dreapta/stnga) care poate fi acionat executnd clic cu mouse-ul pe una dintre
sgei. Evenimentul declanat este incrementarea/decrementarea cu un pas a valorii
asociate controlului. Derulorul nu are proprietatea de legend i din aceast cauz trebuie
asociat cu o etichet care s precizeze parametrul cruia i se atribuie valoarea.
Pe lng proprietile standard i specifice unei casete de text, derulorul mai are i
urmtoarele proprieti specifice:
9 Pasul Increment . Este de tip numeric i reprezint cu ct se incrementeaz/decrementeaz valoarea. De exemplu, valorile numerice ntregi pot fi incrementate cu o
unitate, iar cele reale cu o zecime de unitate. Pasul implicit este 1.
9 Proprietile folosite pentru a preciza domeniul care poate fi parcurs (limitele valorii
asociate controlului) sunt de tip numeric:
Pentru valorile introduse de la tastatur n caseta de text: KeyboardHighValue valoarea maxim i KeyboardLowValue - valoarea minim. Domeniul implicit este
2.147.483.647. Dac se introduce un numr care depete aceast valoare, se
afieaz un mesaj de eroare.
Pentru valorile incrementate/decrementate n derulor: SpinnerHighValue - valoarea maxim i SpinnerLowValue - valoarea minim. Dac se incrementeaz/
decrementeaz peste limite, nu se afieaz un mesaj de eroare, dar valoarea
controlului nu va mai fi modificat peste limitele admise.
Pentru a controla comportamentul controlului au o fost adugate urmtoarele evenimente
specifice:
9 Evenimentele declanate la pierderea focalizrii controlului i care permit validarea
valorii introduse (de la tastatur sau cu mouse-ul). Astfel:
Dac procedura asociat evenimentului RangeLow ntoarce un numr mai mare
dect cel introdus n control, controlul va pstra focalizarea.
Dac procedura asociat evenimentului RangeHight ntoarce un numr mai mic
dect cel introdus n control, controlul va pstra focalizarea.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

289

9 Evenimentele declanate de acionarea derulorului cu mouse-ul:


UpClick - cnd este acionat butonul de incrementare i
DownClick - cnd este acionat butonul de decrementare.

Construii un formular care conine casete de text folosind metoda programrii


Realizai o caset de dialog n care se
folosesc trei controale de tip caset de
text cu derulor pentru introducerea unei
date: anul, luna i ziua. Se mai folosesc
trei etichete i un buton de comand.
Limitele pentru an au fost stabilite: minim
1900 i maxim anul curent, adic
year(date()). Limitele pentru lun sunt 1
i 12, iar pentru zi 1 i 31.

Creai un formular nou. n formular


creai urmtoarele controale: trei
casete de text cu derulor, trei etichete i un buton de comand. Pentru caseta de
text cu derulor folosii instrumentul Spinner de pe bara Form Controls.

Stabilii propritile pentru formular i controale. Pentru controlul Spinner1 trebuie s


atribuii prorpietilor KeyboardHighValue i SpinnerHighValue o valoare calculat: year(date()). Pentru aceasta, n fereastra de proprieti folosii butonul constructorului de expresii Expression Builder care deschide caseta de dialog prin
intermediul creia construii expresia folosit pentru calcul.
* Formularul
SpinnerLowValue = 1.00
Name = "Form1"
Value = 1.0
BackColor = 192,192,192
* Derulorul Ziua
Caption = "Data"
Name = "Spinner3"
Closable = .F.
InputMask = "99"
* Derulorul An
KeyboardHighValue = 31
Name = "Spinner1"
KeyboardLowValue = 1
Increment = 10.00
SpinnerHighValue = 31.00
InputMask = "9999"
SpinnerLowValue = 1.00
KeyboardHighValue=year(date())
Value = 1.0
KeyboardLowValue = 1900
* Etichetele
SpinnerHighValue = year(date())
Name = "Label1"
SpinnerLowValue = 1900.00
Caption = "Anul"
Value = 2000.0000
Name = "Label2"
* Derulorul Luna
Caption = "Luna"
Name = "Spinner2"
Name = "Label3"
InputMask = "99"
Caption = "Ziua"
KeyboardHighValue = 12
* Butonul de comanda
KeyboardLowValue = 1
Name = "Command1"
SpinnerHighValue = 12.00
Caption = "Terminare"

290 Informatic

Definii urmtoarele proceduri pentru evenimentele care valideaz datele introduse


n casetele de text cu derulor RangeLow i RangeHight i pentru evenimentul Click
generat de executarea unui clic pe butonul de terminare:
Procedure RangeLow && Spinner1
case;
return 1900
thisform.spinner2.value=2
Endproc
return 28
Procedure RangeHigh && Spinner2
case;
luna
inlist(thisform.spinner2.;
return 12
value,1,3,5,7,8,10,12)
Endproc
return 31
Procedure RangeHigh && Spinner3
otherwise
do case
return 30
case;
endcase
thisform.spinner2.value=2 and;
Endproc
thisform.spinner1.value%4=0
Procedure Click
return 29
ThisForm.Release
Endproc
Salvai formularul. Lansai n execuie formularul i-l
testai.

Grila Gridx, coloana Columnx i antetul coloanei Headerx


Grila ca obiect de interfa se folosete pentru organizarea datelor sub form de tabele. Ea
afieaz un ansamblu de rnduri i coloane. Intersecia unui rnd cu o coloan se numete
celul (cell). n celulele grilei se pot scrie i se pot afia informaii att sub form de texte, ct
i sub form de imagini.
Grila se realizeaz prin intermediul obiectului container Gridx care conine obiecte de tip
coloan Columnx. Obiectul coloan la rndul su conine un obiect de tip antet Headerx
i alte controale. Controalele sunt adaptate datelor care trebuie introduse sau afiate n
coloana respectiv. Cele mai folosite sunt casetele de text (de aceea ele sunt implicite la
definirea unei coloane). Pentru datele care trebuie introduse de utilizator se mai pot folosi i
zonele de editare sau casetele cu derulor. Dac valoarea celulei trebuie aleas din mai multe
variante posibile, se pot folosi comutatoarele (pentru dou variante) sau listele. Aadar,
grila este o matrice n celulele creia pot fi create diferite obiecte de interfa. Grila se
creeaz ntr-un formular.
Folosind acest tip de obiect, pot fi afiate sub forma unui tabel cmpurile dintr-un tabel al
bazei de date. Aspectul afirii n gril este asemntor cu cel al ferestrei Browse. Fa de
fereastra Browse, grila are avantajul c poate fi tratat ca un obiect cu proprieti, care tie
s execute diferite metode i care tie s rspund la evenimente.
Elementele caracteristice ale unui obiect de interfa de tip gril sunt:
9 Dimensiunea grilei. Este dat de numrul de rnduri i de coloane ale grilei.
9 Rndul grilei. Corespunde unei nregistrri dintr-un tabel.
9 Coloana grilei. Corespunde unui cmp din tabel sau unei variabile de memorie a
crei valoare este dat de o expresie care poate conine i cmpuri din tabel.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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.

Coloana - obiectul Column


Creeaz o coloan ntr-o gril. Coloana poate conine un obiect antet i diverse
controale. Coloana poate conine date din cmpurile unui tabel sau valori ale unei
expresii. Afiarea i editarea lor se poate face cu ajutorul controalelor. Aadar, ntr-o
coloan poate fi creat un antet i pot fi adugate diferite controale. Controalele pot fi adugate la coloana unei grile cu metoda AddObject n procedura asociat evenimentului
Init al formularului care conine grila. Nu este permis accesul la antetul coloanei i la
coloan nainte de a se produce evenimentul Init al grilei.
Sursa de date a coloanei este dat de proprietatea ControlSource care este de tip ir de
caractere (este numele unui cmp sau al unei variabile de memorie).
Alinierea controalelor n coloan poate fi stabilit cu proprietatea Alignment. Coloanele
nu au dect proprietatea Width (lime). Proprietile Width ale controalelor create n coloan sunt protejate la scriere (read-only). Proprietile specifice unei coloane sunt:
9 Numrul de ordine al coloanei ColumnOrder . Este un numr de ordine relativ al coloanei n cadrul grilei. La crearea grilei, fiecare coloan primete un index pentru referin,
n ordinea n care au fost create. Numrul de ordine al coloanei este diferit de acest index
i se refer la ordinea de exploatare a coloanelor ntr-o gril (afiare i focalizare).
9 Proprietile dinamice pentru aspectul fizic al coloanei. Aceste prorpieti se pot
folosi pentru a stabili dinamic caracteristicile fizice ale unei coloane deoarece ele sunt
reevaluate dup fiecare execuie a metodei Refresh a grilei. Ele se refer la aliniere
DynamicAlignment , la culori DynamicBackColor i DynamicForeColor , la
aspectul caracterelor DynamicFontName , DynamicFontSize , ..., la controlul curent
DynamicCurrentControl .
9 Metoda folosit pentru focalizarea unei celule SelectOnEntry . Este de tip logic i
se folosete pentru a controla modul n care poate fi focalizat o celul din coloan.
Dac are valoarea .T., celula este focalizat atunci cnd utilizatorul execut clic n celul
sau apas repetat tasta Tab pn este deplasat selectorul n celul. Dac are valoarea .F.
(valoarea implicit), aceste aciuni nu vor focaliza celula.
9 Proprietile folosite pentru a administra controalele din coloan:
Numrul controalelor: ControlCount . Este de tip numeric i reprezint numrul de
controale definite ntr-o coloan (inclusiv antetul).
Referinele controalelor: Controls - este un vector care conine referinele pentru
controalele din coloan.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

293

Controlul curent: CurrentControl - este de tip ir de caractere i conine numele


controlului care afieaz i primete date n celula activ a coloanei.
Rspndirea influenei: Sparse - este de tip logic i se folosete pentru a controla
modul n care controlul curent influeneaz i celelalte controale din coloan. Dac are
valoarea .T. (valoarea implicit), numai celula activ folosete obiectul de interfa
specificat n proprietatea CurrentControl (controlul curent), iar celelalte celule din
coloan folosesc pentru afiare i editare controale de tip caset de text (TextBox).
Dac are valoarea .F., toate celulele din coloan vor folosi obiectul de interfa
specificat n proprietatea CurrentControl. Aadar, dac vrei ca ntr-o coloan s
folosii pentru vizualizarea i editarea datelor un alt tip de control dect caseta de text,
proprietatea Sparse a coloanei trebuie s aib valoarea .F..
Domeniul sursei de date: Bound - este de tip logic i se folosete pentru a controla
sursa de date a controalelor din coloan. Dac are valoarea .T. (valoarea implicit),
toate controalele din coloan vor folosi aceei surs de date ca i coloana, iar dac are
valoarea .F., fiecare control din coloan va putea folosi propria sa surs de date.
Aadar, dac vrei s obligai toate controalele din coloan s foloseasc sursa de
date a coloanei (condiie necesar n cazul unui tabel al sursei de date), proprietatea
Bound a coloanei trebuie s aib valoarea .T..
9 Proprietile folosite pentru manipularea coloanei:
Deplasarea coloanei: Movable - este de tip logic i determin dac o coloan
poate fi mutat sau nu. Dac are valoarea .T. (valoarea implicit), coloana poate fi
mutat interactiv, iar dac are valoarea .F., coloana nu poate fi mutat interactiv de
ctre utilizator (cu ajutorul tastaturii sau prin glisarea cu mouse-ul a coloanei), ci numai
din program prin modificarea valorii proprietii ColumnOrder.
Redimensionarea: Resizable - este de tip logic i determin dac o coloan poate
fi redimensionat sau nu. Dac are valoarea .T., coloana poate fi redimensionat
interactiv (pe lime), iar dac are valoarea .F. (valoarea implicit), coloana nu poate fi
redimensionat interactiv de ctre utilizator (cu ajutorul tastaturii sau prin glisarea cu
mouse-ul a uneia dintre laturile coloanei), ci numai din program prin modificarea valorii
proprietii Width.
Printre metodele care pot fi folosite de coloan sunt: SetAll, Refresh, SetFocus i Move.
Evenimentele recunoscute de coloan sunt: MouseMove, Moved (provocat prin mutatea
interactiv a coloanei de ctre utilizator sau prin modificarea din program a proprietilor
Top i Left ale coloanei) i Resize (provocat prin redimensionarea interactiv a coloanei de
ctre utilizator, sau prin modificarea din program a proprietii Width a coloanei).

Grila - obiectul Grid


Adun ntr-un container mai multe obiecte de tip coloan. La nivelul grilei nu exist proprietatea Alignment (alinierea se face la nivelul fiecrei coloane). Exist proprietile
pentru poziia grilei, relative la formular (Top i Left), proprietile pentru dimensiunea
grilei (Hight i Width), pentru culori i pentru caracteristicile caracterelor.
Pe lng aceste proprieti generale exist urmtoarele proprieti folosite pentru a stabili
aspectul fizic al grilei (sunt proprieti care se refer la unele obiecte componente ale

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.

mprirea n panouri: Partition - este de tip numeric i controleaz dac grila


este mprit sau nu n panouri. Dac are valoarea 0, grila nu este mprit n
panouri, dac are valoarea diferit de 0, nseamn c grila este mprit n

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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>]).

Evenimentele specifice grilei sunt declanate de:


9 Manipularea barelor de derulare Scrolled . Acest eveniment este declanat fie de
acionarea interactiv a barei de derulare, fie prin acionarea ei din program cu metoda
DoScroll. Procedura asociat evenimentului primete din partea acestuia parametrul

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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 o gril pentru un tabel

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'.

Adugai o coloan la gril: n obiectul Grid1 modificai proprietatea ColumnCount=6.


n coloana a asea se va afia un cmp calculat i anume vrsta persoanei. Stabilii
pentru aceast coloan proprietile: pentru obiectul Column6 proprietile
ControlSource=int((date()-agenda.data_n)/365) i ReadOnly=.T.(este protejat la
scriere fiind un cmp calculat), iar pentru controlul Header al acestei coloane
proprietatea Caption='Varsta'.
Salvai formularul sub numele agenda_t i nchidei constructorul de formulare.
Prin aceast metod fiecrei coloane i se atribuie implicit un control de tip caset de
text. Vom schimba tipul controlului din coloana a treia (pentru adresa), cu o zon de
editare, astfel: deschidei tabelul asociat formularului cu comanda:
use agenda_t.scx
Deschidei fereastra Browse cu comanda browse. Cutai n acest tabel nregistrarea
care coprespunde obiectului Grid1.Column3.Text1 (caseta de text din coloana a treia
a grilei). n aceast nregistrare facei urmtoarele modificri: n coloanele class i
baseclass nlocuii textbox cu editbox, n coloana objname nlocuii Text1 cu Edit1.
Deschidei cmpul Properties i tergei coninutul. nchidei fereastra Browse.
nchidei tabelul cu comanda use.
Deschidei fiierul pentru modificare cu comanda modi form agenda_t. Adugai la
formular un buton pentru terminare. Facei modificrile ncesare pentru proprieti,
astfel nct ele s corespund cu cele prezentate mai jos.
* Mediul de date
Column2.ControlSource =;
Name = "Dataenvironment"
"agenda.prenume"
Name = "Cursor1"
Column2.ReadOnly = .F.
Alias = "agenda"
Column3.Name = "Column4"
CursorSource = agenda.dbf
Column3.ControlSource =;
* Formular
"agenda.telefon"
Name = "Form1"
Column3.ReadOnly = .F.
Caption = "Agenda"
Column4.Name = "Column5"
Closable = .F.
Column4.ControlSource =;
* Grila
"agenda.data_n"
Name = "Grid1"
Column4.ReadOnly = .F.
ColumnCount = 6
Column5.Name = "Column6"
AllowAddNew = .T.
Column5.ControlSource =;
AllowRowSizing = .T.
"int((date()-agenda.data_n)/365)"
Panel = 1
Column5.ReadOnly = .T.
ReadOnly = .T.
Column6.Name = "Column3"
RecordSource = "agenda"
Column6.Bound = .T.
RecordSourceType = 1
Column6.ControlSource =;
RowHeight = 30
"agenda.adresa"
* coloanele grilei
Column6.ReadOnly = .F.
Column1.Name = "Column1"
Column6.Sparse = .F.
Column1.ControlSource =;
* Antetul coloanelor + control
"agenda.nume"
Name = "Header1"
Column1.ReadOnly = .F.
Caption = "nume"
Column2.Name = "Column2"
Name = "Text1"
ReadOnly = .F.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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.

Adugai la tabel cmpul de tip numeric Copii (numrul de copii ai persoanei


respective).

Reluai operaia de creare a grilei folosind metoda constructorului rapid (deschidei


tabelul, creai un formular nou i apsai butonul BuilderLock de pe bara Form
Controls. n caseta de dialog care se deschide, n seciunea Grid gsii instrumentele
necesare pentru a alege cmpurile din tabel care vor fi surs de date pentru coloanele
grilei, n seciunea Style gsii instrumentele necesare pentru a alege stilul grilei, iar n
seciunea Layout gsii instrumentele necesare pentru stabilirea unor proprieti pentru
obiectele grilei: proprietatea Caption pentru Header, tipul controlului din lista Control
type). Pentru cmpul Copii alegei un control de tip Spinner).

300 Informatic

T est pentru evaluare:


1. Creai un tabel cu evidena elevilor care vor s mearg ntr-o excursie. Tabelul are
structura: nume (C,15), prenume (C,15), telefon (C,10), suma (N,6). Elevii pot achita
n mai multe etape valoarea excursiei. Valoarea total a excursiei este de 500.000
lei. Creai un formular cu urmtoarele controale: trei casete de text pentru nume,
prenume i telefon, o caset de text cu derulor pentru plata parial (cu pasul de
10.0000 i cu valorile limit 0 i 500.000), trei casete de text protejate la scriere n
care afiai suma total achitat de elev (cmpul suma), diferena rmas de achitat
i suma total pltit de elevi (controlul va deveni vizibil la prima apsare a butonului
pentru Total), apte etichete n care s afiai semnificaia casetelor de text din
formular i 5 butoane declanatoare: 2 pentru parcurgerea tabelului nainte i napoi,
unul pentru adugarea unei noi nregistrri, unul pentru afiarea sumei totale i unul
pentru terminare.
2. Rezolvai aceeai problem folosind un control de tip gril. Grila va avea ase
coloane corspunztoare celor ase casete de text care se refer la un elev. Pentru
plata parial se va folosi i n gril o caset de text cu derulor. Vor fi protejate la
scriere coloanele care conin suma total achitat de elev i diferena de achitat.
Pentru suma total pltit de elevi vei folosi o caset de text protejat la scriere i o
etichet. Formularul va avea doar dou butoane declanatoare: unul pentru Total i
altul pentru Terminare.
3. n variantele prezentate anterior, nu avei posibilitatea s corectai o plat parial pe
care ai scris-o greit (la prsirea controlului se actualizeaz cmpul suma). Cum
putei mbunti formularul pentru a rezolva aceast situaie?

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.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

301

2.
3.
4.
5.
6.
7.

Evenimentul Valid se declaneaz .................................... focalizrii.


Un formular care conine o caset de text pentru introducerea parolei trebuie s fie ............
Evenimentul DownClick este specific unui control de tip ........
Obiectul Header se poate crea numai n obiectul ...................
Sparse este o proprietate specific unui control ...........................
Textul afiat ca o etichet a unei coloane dintr-o gril se memoreaz n proprietatea
Caption a controlului ...........
8. Proprietatea prin care se stabilete dac toate controalele dintr-o coloan au aceeai
surs de date este ..............

Alegei rspunsurile corecte:


1. Tipul datelor memorate ntr-un control este determinat de proprietatea:
a) Value
b) Control Source
c) Caption
2. SelectedText este o proprietate a controlului:
a) TextBox
b) Label
c) EditBox
3. Pentru formatul datelor memorate n proprietatea Value, caracteristica ntregului cmp
de editare se stabilete prin proprietatea:
a) Format
b) InputMask
c) ControlSource
4. HeaderHeight este o proprietate specific unui control:
a) Grid
b) Column
c) Header
5. Sursa de date a grilei se pstreaz n proprietatea:
a) RecordSourceType
b) RecordSource
c) RecordMark
spunsuri:
R
Adevrat/Fals: 1-F; 2-F; 3-A; 4-A; 5-A; 6-F; 7-A; 8-F; 9-A; 10-F.
Completai: 1-ToolTipText, ShowToolTips; 2-dup pierderea; 3-modal; 4-Spinner; 5- Column; 6Column; 7-Header; 8-Bound.
Alegei rspunsurile corecte: 1-b; 2-a,c; 3- a; 4-a; 5-b.

3.4.4. Controale care permit utilizatorului s aleag


Multe aplicaii necesit ca utilizatorul s aleag din mai multe variante, de la o simpl
alegere dintre dou opiuni Da/Nu pn la alegerea unei variante dintr-o list care conine
sute de posibiliti. Varianta aleas este atribuit ca valoare nou unei variabile de
memorie sau unui cmp. Controalele care permit utilizatorului s aleag sunt:
Controlul

Semnificaie

Tipul datelor

Comutatorul

Permite utilizatorului s aleag din dou


variante posibile: adevrat sau fals.

Logic

Butoane de opiuni

Un set de opiuni care permite utilizatorului s ir de caractere


aleag numai una dintre ele.
sau numere

Lista

O list de variante din care utilizatorul poate


s aleag una sau mai multe variante.

Caseta combinat

O combinaie ntre o list i o caset de text. ir de caractere


Utilizatorul poate fie s aleag din list, fie s sau numere
scrie alegerea n zona de editare a casetei.

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.

Creai un comutator folosind metoda programrii clasice


n caseta de dialog Test se folosete comutatorul Afisare patrat pentru a controla afiarea
unei forme de tip ptrat.
Scriei pogramul surs:

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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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.

Creai un comutator folosind metoda programrii vizuale


Creai un formular nou. Creai n acest formular urmtoarele obiecte: un comutator, o
form i un buton. Pentru comutator folosii butonul CheckBox, iar pentru form
butonul Shape de pe bara Form controls.

Stabilii pentru formular i controale urmtoarele proprieti:


*Formular
BackStyle = 0
Name = "Form1"
Caption = "\<Afisare patrat"
BackColor = 192,192,192
* Forma
Caption = "Test"
Name = "Shape1"
Closable = .F.
BackColor = 100,100,100
* Comutator
FillStyle = 7
Name = "Check1"
* Buton de comanda
FontSize = 12
Name = "Command1"
AutoSize = .T.
Cancel = .T.
Alignment = 1
Caption = "\<Terminare"
Scriei procedurile asociate evnimentelor Init i Click ale comutatorului i evenimentului Click al butonului :

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).

Reluai operaia de creare a grilei folosind metoda


constructorului rapid. Pentru cmpul Are_copii alegei un control de tip CheckBox).

Butonul de opiune OptionButtonx i


grupul de butoane de opiuni OptionGroupx
ntr-un formular, controlul de tip buton de opiune nu poate fi folosit independent ci
ntr-un container de tip grup de butoane de opiuni. Se folosesc ntr-o aplicaie pentru a
permite utilizatorului s aleag din dou sau mai multe variante posibile. Apartenena
butoanelor de opiuni la un grup face ca la un moment dat utilizatorul s poat selecta un
singur buton din grup, celelalte butoane din grup nefiind selectate. Ele funcioneaz la fel
ca butoanele pentru selectarea lungimii de und ale unui aparat de radio i de aceea se
mai numesc i butoane radio. ntr-un formular pot s existe mai multe grupuri de butoane
de opiuni, fiecare grup avnd activat un singur buton. Grupul de butoane radio este
desenat n interiorul unui recipient care are proprietatea BorderStyle egal cu 1 (fix i
trasat cu linie simpl). Grupul de butoane radio nu are proprietatea de legend. Dac
vrei s afiai numele datei pentru care stabilii o valore cu ajutorul butoanelor de opiuni
din grup, va trebui s folosii un control de tip etichet (label).
Legenda fiecrui buton afieaz valoarea care se va atribui datei asociate grupului dac
se va selecta acel buton. Proprietatea de aliniere a butonului de opiuni se refer la
modul de aranjare a legendei fa de buton (la dreapta sau la stnga). Butonul de opiuni
este reprezentat grafic printr-un cerc care are n interior un punct atunci cnd butonul
este selectat.
n proprietatea Value se memoreaz:
9 Dac proprietatea ControlSource este o variabil de memorie sau un cmp de tip
numeric, se memoreaz poziia n grup a butonului selectat.
9 Dac proprietatea ControlSource este o variabil de memorie sau un cmp de tip ir
de caractere, se memoreaz textul explicativ (Caption) asociat butonului selectat.
Butonul radio poate fi selectat prin mai multe metode:
9 Indicai cu mouse-ul butonul i executai clic.
9 Mutai selectorul n grupul de butoane radio apsnd repetat tasta Tab i selectai
apoi butonul activ din grup folosind tastele cu sgei.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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.

Creai un grup de butoane cu opiuni folosind metoda programrii


n caseta de dialog Test se folosete
grupul de butoane radio Afisare pentru
a alege figura geometric afiat: cerc,
elipsa sau patrat. n procedura asociat
evenimentului Click al grupului de
butoane se va testa proprietatea Value
a grupului i n funcie de valoarea ei
se va afia una dintre figurile geometrice. Pentru afiarea unei legende a
grupului de butoane s-a folosit un
control de tip etichet.
Obiectele, proprietile obiectelor i
procedurile asociate evenimentelor
sunt prezentate n programul urmtor. Scriei programul, l salvai, l lansai n execuie i
apoi testai grupul de butoane radio.

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 grup de butoane cu opiuni folosind metoda vizual

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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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 i caseta combinat ComboBoxx


Listele i casetele combinate sunt controale care permit utilizatorului s aleag dintr-o
colecie de valori numite articolele listei (item). Ele pot fi folosite pentru administrarea
sistemului sau pot fi folosite pentru introducerea datelor n cmpurile unei baze de date.
Pentru administrarea sistemului, putei construi liste cu unitile de disc din sistem, cu
directoarele i cu fiierele dintr-un director.
Aceste controale nu au proprietatea Caption. Din aceast cauz ele se pot folosi mpreun cu un control Label. Proprietatea Caption a etichetei ataate poate fi folosit pentru
a afia numele parametrului a crui valoare va fi stabilit de utilizator n urma selectrii
unui articol din list.
Deosebirea dintre un grup de butoane radio i o list este aceea c, n cazul butoanelor
de opiuni, colecia de articole din care se alege valoarea este fix, iar n cazul listei
aceast colecie este variabil, controlul avnd ncorporate metode suplimentare pentru
actualizarea coleciei (adugarea i nlturarea unor articole din list), pentru sortarea
articolelor din list i pentru localizarea unui articol din list.

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 -

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

311

9 Sursa de date a listei:


Tipul sursei de date: RowSourceType - este de tip numeric i specific un cod prin
care poate fi identificat tipul sursei de date.
Sursa de date: RowSource - este de tip ir de caractere i furnizez sursa de date.
RowSourceType
Articolele listei sunt furnizate:
RowSource
0 - None
n timpul execuiei listei folosind meto- Nu este precizat.
dele AddItem sau AddListItem.
1 - Value
Prin enumerare ntr-o list de valori. Lista de valori. Valorile sunt separate
n list prin virgul.
2 - Alias
Prin preluare din cmpurile unui tabel. Numele tabelului din baza de date
sau a tabelului liber (.dbf).
3 - SQL Statement De o instruciune SQL Select de inte- Instruciunea SQL
rogare a bazei de date, care va genera un tabel permanent sau temporar ce va conine articolele listei.
4 - Query
De o interogare.
Numele fiierului de interogri (.qpr)
5 - Array
De un tablou de memorie (vector
Numele tabloului de memorie.
pentru lista cu o singur coloan sau
matrice pentru lista cu multe coloane).
6 -Fields
De cmpurile unui tabel, enumerate Lista de nume de cmpuri ( separa-te
ntr-o list.
n list prin virgul). Numele cmpului
trebuie precedat de numele tabelului:
<nume_tabel>.<nume_cmp>
7 - Files
un grup de fiiere dintr-un director.
ablonul care descrie grupul de
fiiere.
8 - Structure
numele cmpurilor unui tabel.
Numele tabelului.

9 Variabila de memorie sau cmpul n care se memoreaz valoarea elementului


selectat ControlSource . Dac este de tip numeric, se va memora poziia curent n
list a articolului selectat, iar dac este de tip ir de caractere, se va memora textul
asociat articolului selectat.
9 Data memorat n prorprietatea Value BoundTo . Este de tip logic: dac are
valoarea .T., n proprietatea Value se va memora textul asociat articolului selectat, iar
dac are valoarea .F., n proprietatea Value se va memora coninutul variabilei sau
cmpului specificat de proprietatea ControlSource.
9 Tabloul de memorie care conine articolele listei este caracterizat de proprietile:
Numrul de articole din list: ListCount - este de tip numeric.
Tabloul de memorie (de tip vector sau matrice, n funcie de numrul de coloane ale
listei) se pstreaz n proprietile: List - articolele se pstreaz n ordinea poziiei
lor curente (ordinea n care sunt afiate n list) i ListItem - articolele se pstreaz
n ordinea dat de codurile de identificare. Ambele proprieti sunt de tip tablou de
memorie. De exemplu, n lista cu numele Lista, Lista.List(5) identific al cincilea articol din list, iar Lista.ListItem(5) identific articolul din list care are codul de identificare 5. Dac lista conine mai multe coloane, trebuie precizat i numrul coloanei.
De exemplu, dac lista Lista are 4 coloane, Lista.List(5,2) identific a doua coloan
din cel de al cincilea articol din list. Proprietatea ListCount poate fi folosit pentru a
parcurge elementele tabloului de la primul element pn la ultimul (ListCount).

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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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.

Creai o list ascuns folosind valorile ca surs de date


n exemplul de formular creat la lecia despre butoane radio, vei nlocui controlul folosit
pentru alegerea formei afiate cu o list ascuns (obiectul ComboBox cu stilul 2). Sursa de
date (numele celor trei forme) va fi precizat printr-o list de valori.
Deoarece formularul pe care trebuie s-l realizai este foarte
asemntor cu cel prezentat la acea lecie, l vei salva pe acela
sub un alt nume, vei terge obiectul grup de butoane radio i n
locul lui vei crea un control de tip list folosind instrumentul
ComboBox de pe bara Form Controls.

Stabilii proprietile listei:


Name = "Combo1"
RowSourceType = 1
RowSource = "Cerc
,Elipsa ,Patrat
"
Style = 2
Scriei procedurile asociate elementului Init al formularului i evenimentului Click al
listei (pstrai procedura asociat evenimentului Click al butonului de comand):

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

315

procedure Init && Formular


ThisForm.Combo1.ListIndex = 1
ThisForm.Shape1.Visible=.T.
ThisForm.Shape2.Visible=.F.
ThisForm.Shape3.Visible=.F.
endproc
procedure Click && Lista
ThisForm.Shape1.Visible = .F.
ThisForm.Shape2.Visible = .F.
ThisForm.Shape3.Visible = .F.
do case
case ThisForm.Combo1.Value = ThisForm.Combo1.List(1)
ThisForm.Shape1.Visible = .T.
case ThisForm.Combo1.Value = ThisForm.Combo1.List(2)
ThisForm.Shape2.Visible = .T.
case ThisForm.Combo1.Value = ThisForm.Combo1.List(3)
ThisForm.Shape3.Visible = .T.
endcase
ThisForm.CurrentX=20
ThisForm.CurrentY=155
ThisForm.Print(ThisForm.Combo1.List(ThisForm.Combo1.ListIndex))
endproc
Salvai formularul, l lansai n execuie i-l testai.
Creai o list ascuns folosind ca surs de date tabloul de memorie
n exemplul de formular creat la lecia despre comutator, vei nlocui controlul comutator
folosit pentru a controla afiarea ptratului cu o list ascuns din care vei alege culoarea
de umplere a ptratului (obiectul ComboBox cu stilul 2). Lista va conine 8 culori i sursa
de date (numele celor 8 culori) va fi precizat printr-un vector.
Salvai formularul realizat anterior sub un alt nume, tergei obiectul comutator i n
locul lui creai un control de tip list folosind instrumentul ComboBox de pe bara
Form Controls. Vei mai aduga i un control de tip etichet pentru legenda listei.

Stabilii proprietile listei i ale etichetei:


Name = "Label1"
ControlSource = ""
AutoSize = .T.
Height = 25
BackStyle = 0
Left = 24
Caption = "Culoarea"
NumberOfElements = 8
Name = "Combo1"
Style = 2
RowSourceType = 5
Top = 48
RowSource = "a"
Width = 121
Scriei procedurile asociate evenimentelor Load i Init ale formularului n care
declarai i creai vectorul a:
procedure Load && Formular
public a
dimension a(8)
endproc
procedure Init && Formular
a(1)='Negru'
a(2)='Rosu'

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.

Creai un formular nou. Adugai n formular patru etichete, o zon de edita-re, un


buton declanator i o list (butonul ListBox de pe bara Form Controls).
Stabilii proprietile formularului i ale obiectelor din formular:

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor


* formularul
Name = "Form1"
BackColor = 200,200,200
Caption = "Test"
Closable = .F.
FontSize = 14
* eticheta folosita pentru
* legenda listei
Name = "Label1"
Caption = "Alegeti:"
* etichete folosite pentru
* informare
Name = "Label2"
Caption = "Telefon"
Name = "Label4"
Caption = "Adresa"
* eticheta folosita pentru afi* sarea numarului de telefon
Name = "Label3"
Caption = ""
* pentru toate etichetele:
AutoSize = .T.

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.

Creai directorul Test.


Creai un formular nou. Adugai n formular dou liste, dou etichete (pentru
legenda celor dou liste) i trei butoane de comand. Prima list va avea ca surs
de date fiierele de tip *.prg. A doua list nu va avea surs de date.
Stabilii prorpietile pentru formular i obiectele din formular:
* Formularul
Name = "Form1"
Caption = "Test"
Closable = .F.
FontSize = 14
WindowType = 1
BackColor
* Etichetele

Name = "Label1"
Caption = "Fisiere pentru ;
selectare"
Name = "Label2"
Caption = "Fisiere selectate"
* Toate tichetele:
AutoSize = .T.
BackStyle = 0

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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.

T est pentru evaluare:


1. Creai un tabel cu evidena elevilor din clas. Tabelul are structura: nume (C,15) i
prenume (C,15). Completai cu date tabelul. Modificai structura tabelului i adugai
cmpul echipa (C,10) care reprezint echipa din care face parte elevul, presupunnd
c el face parte dintr-o singur echip: baschet, handbal, volei sau nici o echip.
Construii un formular prin care s actualizai tabelul. Formularul va conine o list cu
dou coloane (nume i prenume) din care alegei elevul, un grup de butoane radio
pentru a alege echipa i un buton de comand pentru terminare.

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.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

321

3.4.5. Alte controale i obiecte


Bara cu instrumente ToolBarx
Bara cu instrumente este un obiect de interfa care pune la dispoziia utilizatorului un cadru
care conine un grup de butoane cu ajutorul crora poate s cear executarea unor aciuni.
Se recomand ca n acest obiect s fie grupate controale care s permit un acces mai rapid
la comenzile cele mai des folosite din meniurile aplicaiei (de exemplu deschiderea, salvarea
i nchiderea unui tabel). Bara cu instrumente are avantajul c pune la dispoziia utilizatorului
reprezentri grafice ale comenzilor care sunt mai uor de memorat dect combinaiile de
taste folosite pentru scurtturi. Butoanele de pe bara cu instrumente pot avea proprietatea
informaii despre instrument (ToolTips) care afieaz o mic etichet cu numele butonului
atunci cnd utilizatorul l indic cu cursorul de mouse.
Bara de instrumente este construit ca un formular container ce conine mai multe controale care are urmtoarele caracteristici specifice:
9 Este afiat ntotdeauna deasupra formularelor de tip fereastr.
9 Dac este mutat, poate fi ancorat (dock) la marginile ferestrei de aplicaie.
9 Cnd nu este ancorat, afieaz o bar de titlu (cu nlimea jumtate din nlimea
obinuit a unei bare de titlu) i butonul de nchidere.
9 Cnd se modific dimensiunea cadrului, controalele din interior sunt rearanjate astfel
nct s ncap n cadru.
9 Poate fi mutat oriunde n freastr sau pe ecran prin operaia de glisare cu mouse-ul.
9 Pentru controalele din interiorul ei nu se pot folosi taste de acces.
9 Unele controale nu primesc focalizarea atunci cnd sunt selectate.
Cnd bara de instrumente este ancorat, aspectul ei se modific astfel:
9 Bara de titlu i butonul de nchidere sunt ascunse.
9 Chenarul este trasat cu o singur linie.
9 Este redimensionat astfel nct s afieze un singur rnd de butoane.
9 Fereastra n care este creat bara este redimensionat astfel nct bara s nu ascund
informaii din fereastr.
Pe lng proprietile specifice unui formular (Caption, Movable, Sizable etc.) sau specifice unui obiect container (Controls - vectorul cu referinele controalelor i
ControlCount - numrul de controale), obiectul ToolBox are urmtoarele proprieti
specifice:
9 Ancorarea: Docked este de tip logic: dac are Valoare
Efect DockPosition
valoarea .T., bara este ancorat, iar dac are valoarea -1
Nu este ancorat
.F., bara este mobil.
0 (Top)
Marginea de sus.
Marginea din stnga.
9 Poziia ancorrii: DockPosition este de tip numeric 1 (Left)
Marginea din dreapta.
i arat poziia ancorrii (marginea ferestrei de care a 2 (Right)
3 (Bottom) Marginea de jos.
fost ancorat).
9 ActiveControl: ActiveControl este o referin ctre
controlul activ al unui obiect. Pentru a avea acces la proprietile sale se folosete construcia: <nume_obiect>.ActiveControl.<proprietate>=<valoare>.
9 Redimensionarea cadrului: Sizable - este de tip logic: dac are valoarea .T. (implicit),
cadrul barei poate fi redimensionat. Dac poate fi redimensionat, se poate folosi proprie-

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.

Creai o bar de instrumente pe ecran

Butoanele din bar au efect de comutator.

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')

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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:

Salvai fiierul cu programul surs test_bara2 sub numele test_bara3. Deschidei


acest fiier i facei urmtoarele modificri.
Adugai n program, nainte de definirea claselor, instruciunile:
set.f1.addobject("bt3","buton3")
set.f1.bt3.visible=.t.
n seciunea Define class buton1 modificai:
left=25
width=75
n seciunea Define class buton2 nlocuii buton 2 cu i buton 3 modificai:
left=300
width=75
Adugai seciunea de program pentru definirea clasei Buton2:
define class Buton2 as CommandButton
Top = 200
Left = 150
Height = 25
Width = 75
ToolTipText='Afiseaza/anuleaza bara cu instrumente'
Caption = "\<Bara"
procedure Click
ThisFormSet.Bara1.Visible=!ThisFormSet.Bara1.Visible
endproc
enddefine
Lansai n execuie programul cu comanda do test_bara3.
Creai vizual o bar de instrumente
Se va crea bara de la primul exemplu. Deoarece bara cu obiecte a constructorului de
formulare nu are un buton asociat obiectului ToolBar, trebuie fcut un mic artificiu: se
construiete un formular vid care se transform apoi ntr-o bar cu instrumente.

Deschidei fereastra constructorului de formulare cu comanda create form bara.


Salvai i nchidei fereastra constructorului.
Deschidei tabelul asociat formularului cu comanda use bara.scx. Afiai coninutul
tabelului cu comnada browse.

n rndul 2 al tabelului sunt nregistrate caracteristicile obiectului DataEnvironment


asociat formularului, iar n rndul 3 caracteristicile formularului Form1. n rndul 3 al
tabelului vei face urmtoarele modificri n cmpurile memo:

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

327

9 n cmpurile Class i BaseClass tergei Form i scriei ToolBar.


9 n cmpul Objname tergei Form1 i scriei Bara.
9 n cmpul Properties tergei tot coninutul.
nchidei fereastra de editare i apoi i fiierul cu comanda use.
Deschidei formularul cu comanda Modify Form bara.
n fereastra constructorului de formulare Form Design este afiat obiectul ToolBar.
Adugai acestui obiect trei comutatoare. Spre deosebire de formular, ntr-o bar cu
instrumente, poziiile obiectelor sunt stabilite automat. Ele vor fi plasate unele lng
altele. Nu putei stabili dect ordinea n care apar butoanele n bar, nu i poziia exact
a fiecrui buton. Pentru a aduga un control, procedai astfel: executai clic pe obiectul
corespunztor de pe bara cu obiecte de interfa pentru
a-l selecta (n exemplu, pe obiectul Command Button) i
apoi n bara pe care o construii executai clic n poziia n
care vrei s fie inserat obiectul. ntre butoane inserai
separatori (obiectul Separator de pe bara cu obiecte).
Stabilii pentru aceste controale valorile pentru restul pro-prietilor. Scriei procedurile
corespunztoare evenimentelor. Salvai modificrile fcute n formular. nchidei
constructorul de formulare.
Deschidei din nou tabelul asociat formularului. Observai modificrile care au fost
fcute. nchidei fereastra de editare i tabelul.
Lansai n execuie formularul cu comanda do form bara.
Reluai toate aceste operaii i creai vizual formularul i o bar de instrumente ca cele
din cel de al doilea exemplu.
Reluai toate aceste operaii i creai vizual formularul i o bar de instrumente ca cele din cel de al
treilea exemplu.

Obiecte de tip OLE: container OLE OLE Containerx i


control OLE OLE Bound Controlx
Prin intermediul tehnologiei OLE putei introduce ntr-un formular obiecte create cu alte
aplicaii (documente, foi de calcul imagini). Aplicaiile cu care sunt create obiectele se
numesc aplicaii server (de exemplu, o aplicaie Microsoft: Word, Excel, Paint etc.).
Pentru adugarea obiectelor OLE ntr-un formular, aplicaia Visual FoxPro v pune la
dispoziie dou obiecte vizuale:
9 obiecte OLE de tip container - OLEContainerx.
9 obiecte OLE asociate cmpurilor de tip General din tabel - OLEBoundControlx
care permit afiarea i editarea unui obiect n acest tip de cmp.
Recomandare: Dac dorii s editai un cmp de tip General ntr-un formular, folosii un
obiect de tip OLEBoundControl. Dac dorii s vizualizai i eventual s editai ntr-un formular un obiect care nu este memorat ntr-un cmp, folosii un obiect de tip OLEContainer.

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.

Proprietile specifice obiectelor vizuale


Valoare
Efect Autoactivate
OLE Container i OLEBoundControl sunt:
0
Activat din program cu
(Manual)
metoda DoVerb.
9 Autoactivarea: Autoactivate este de tip
1
Activat atunci cnd obiectul
numeric i determin modul n care poate fi
(GotFocust)
primete focalizarea.
activat obiectul. A activa obiectul nseamn a
2
Activat atunci cnd se exeactiva aplicaia server care l-a creat. Dac are
(DoubleClick) cut dublu clic pe obiect sau
valoarea 2 (valoarea implicit), nu mai putei
cnd obiectul este foca-lizat
folosi evenimentul DoubleClick.
i se apas tasta Enter.
9 Tipul de obiect permis OLETypeAlowed . 3 (Automatic) Activat de evenimentul impliEste de tip numeric i controleaz tipul de
cit de activare al obiectului
(de exemplu focalizarea
obiect care poate fi adugat la cotainer.
formularului).
9 Modul n care se execut redimensionarea
Stretch . Este de tip numeric i controleaz modul n care este redimensionat obiectul
pentru a ncpea n zona alocat lui n cadrul formularului. Valoarea implicit este 0.
Valoare
Efect OLETypeAlowed
0
Linked - legat.
1
Embedded - ncapsulat.
-1
OLE Bound - nu conine un
obiect OLE.
-2
OLE control - control OLE (.ocx)

9 Accesul la obiect Object .


Este o referin ctre un obiect
OLE care permite accesul la
proprietile i metodele sale.
Proprietile i metodele specifice unui anumit obiect OLE le
putei afla din documentaia
aplicaiei server. De exemplu,
dac obiectul OLE este o foaie
de calcul (un obiect Excel), informaiile despre proprietile i
metodele lui le putei afla din
documentaia aplicaiei Microsoft
Excel. Folosii aceast proprietate astfel: pentru modificarea
valorii unei proprieti:

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.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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>)]

Inserai un obiect OLE ntr-un formular


Vei insera o foaie de calcul creat cu aplicaia Excel.
Creai un dosar Test n rdcina discului C. Creai n acest dosar o foaie de calcul cu
aplicaia Excel pentru cheltuielile casnice din primul trimestru al anului. Atribuii
formule de calcul (sum) pentru celulele care memoreaz totalul pe tip de cheltuial
(pe orizontal) i totalul chltuielilor pe lun (pe vertical). Realizai o diagram cu repartiia cheltuielilor n luna ianuarie.

Scriei n fiierul obiect1 programul surs:


f1 = createobject('Form')
f1.height = 350
f1.width = 500
f1.closable = .f.
f1.caption="Cheltuieli"
f1.addobject('b1','buton1')
f1.addobject('o1','obiectexcel')
f1.b1.visible=.t.
f1.o1.visible=.t.
f1.o1.height = 275
f1.o1.width = 475
f1.show
f1.o1.doverb(-1) && -1; pentru editare
read events
define class obiectexcel as olecontrol
oleclass ='excel.sheet' && numele aplicatiei server
documentfile = "c:\test\cheltuieli.xls"
enddefine
define class buton1 as commandbutton
caption = '\<Terminare'
cancel = .t.

330 Inormatic
left = 250
top = 310
height = 25
procedure click
clear events
thisform.release
enddefine
Lansai n execuie programul cu comanda do obiect1.

Obiectul a fost deschis pentru editare. Modificai valoarea cmpurilor. Observai c


valorile din cmpurile pentru care s-a aplicat formula de calcul pentru sum (sum)
sunt modificate automat pentru a reflecta corect sitiuaia din foaia de calcul. Dac ai
fcut modificrile n coloana corespunztoare lunii ianuarie, observai c s-a modificat
automat i diagrama. nchidei formularul.
Lansai n execuie programul cu comanda do test_bara1.
Creai vizual obiectul inserat n formular
Creai formularul din exemplul anterior folosind
metoda vizual:

Deschidei fereastra constructorului de formulare cu comanda create form obiect1.


Stabilii pentru formular proprietile din
program.
Selectai din bara cu obiecte a constructorului
obiectul OLEContainer.
n zona formularului delimitai zona ocupat
de obiect prin glisarea mouse-ului.
Se deschide caseta de dialog InsertObject

Din grupul de butoane radio al casetei


de dialog Insert Object mai putei s
activai butonul Create New, dac vrei
s creai un obiect nou (din lista Object
Type alegei aplicaia server pe care o
vei folosi pentru crearea obiectului i
se va deschide fereastra aplicaiei
pentru a crea obiectul) sau butonul
Insert Control dac vrei s inserai un
control OLE (se deschide caseta de
dialog Browse din care putei alege
fiierul .ocx).

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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.

Creai vizual obiectul inserat ntr-un cmp de tip General


Creai un tabel Sigle care conine cmpurile nume (C,15), prenume (C,15) i sigla (G).
Cmpul Sigla va conine fieiere .bmp n care sunt memorate sigle pentru iniialele
persoanelor nregistrate n tabel. Creai aceste fiiere cu
aplicaia Windows Paint. Adugai date n tabel cu ajutorul
ferestrei Browse. Atunci cnd vrei s adugai date n cmpul de tip General, executai clic pe cmp. Se deschide o fereastr de editare a cmpului n care vei insera obiectul cu
opiunea Insert Object... Edit. Se deschide caseta de dialog
Insert Object. Dac alegei butonul Create New, vei alege
din lista Liste Object Type articolul Bitmap Image dup care se va deschide o zon de
editare a obiectului i se vor afia instrumentele aplicaiei Paint cu care putei crea
obiectul. Dac alegei butonul Create from File, se va deschide o caset de editare n
care va trebui s scriei identificatorul fiierului care conine imaginea sau vei construi
acest identificator cu ajutorul ferestrei Browse. Dup ce ai completat cu date cmpurile
din tabel, nchidei tabelul.
Creai un formular pentru acest tabel.
Formularul va conine butoanele >>> i
<<< pentru parcurgerea nregistrrilor
din tabel.

Deschidei fereastra constructorului


de formulare cu comanda create
form obiect2.
Adugai n fereastr urmtoarele
obiecte: trei etichete cu legenda
Nume, Prenume i Sigla, dou casete de text pentru cmpurile din
tabel, sigle.nume (ControlSource= sigle.nume) i sigle.prenume (ControlSource=
sigle.prenume), trei comutatoare cu legenda \<>>>, \<<<< i \<Terminare. Fereastra
va avea legenda Sigle, culoarea fundalului gri i butonul de nchidere nu va fi
disponibil. Etichetele trebuie s fie afiate transparent.
Completai procedurile asociate evenimentului click al butoanelor >>> i <<<:
procedure click && butonul >>>
skip
if not eof()
endif

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.

Obiectele grafice i ceasul


ntr-un formular putei s introducei diferite obiecte grafice :
Control

Semnificaie

Imagea

Afieaz o imagine preluat dintr-un fiier .bmp. Caracteristicile sale pot fi


controlate cu proprietile Top, Left, Height, Width, BackStyle,
BorderColor, Border Style, Enabled, Visible, Stretch.

Linea

Afieaz o linie. Caracteristicile sale pot fi controlate cu proprietile Top,


Left, Height, Width, BorderWidth, BorderColor, Border Style, Enabled,
Visible, LineSlant.

Shapea

Afieaz o form (ptrat, dreptunghi, cerc, elips). Caracteristicile sale pot fi


controlate cu proprietile Top, Left, Height, Width, BackStyle, BackColor,
BorderWidth, BorderColor, Border Style, FullColor, FullStyle, Enabled,
Visible, ToolTipText, Curvature.

Imaginea (image) poate fi folosit la crearea butoanelor cu pictograme n locul 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.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

333

Creai un formular controlat de ceas


Creai un fiier bitmap n dosarul Test. Imaginea din formularul alturat a fost creat n
fiierul test.bmp. Creai formularul
Atenionare care, la acionarea unui
buton Afisare va afia o imagine i o
legend care vor disprea dup 2500
de ms. Ele vor fi reafiate numai dac
se acioneaz din nou butonul Afisare:

Deschidei fereastra constructorului


de formulare cu comanda create
form imagine1.
Stabilii pentru formular proprietile:
BackColor=192,192,192
Caption="Atentionare"
Closable=.F.
Adugai n fereastr urmtoarele obiecte: o imagine (Image1), o etichet (Label1),
dou butoane de comand (Command1 i Command2) i un ceas (Timer1). Stabilii
pentru aceste controale proprietile:
* Imagnea "Image1"
Caption="Vizitati ruinele ;
Picture=c\test\test.bmp
castrului roman !!!"
Visible = .F.
Visible = .F.
AutoSize = .T.
* Butonul "Command1"
* Eticheta "Label1"
Caption="\<Afisare"
FontSize = 12
* Butonul "Command1"
Alignment = 2
Caption="\<Terminare"
BackStyle = 0
Scriei procedurile asociate evenimentelor:
procedure Click && Command1
endproc
ThisForm.Image1.Visible=.T.
procedure Timer
ThisForm.Label1.Visible=.T.
ThisForm.Image1.Visible=.F.
ThisForm.Timer1.Interval=2500
ThisForm.Label1.Visible=.F.
endproc
This.Interval=0
procedure Click && Command2
endproc
ThisForm.Release
Salvai formularul. Lansai n execuie formularul cu comanda do form imagine1.
Testai formularul. nchidei formularul.
Deschidei formularul cu comanda modify form imagine1. Salvai formularul sub
numele imagine2.
Facei modificri n acest formular astfel nct imaginea i eticheta s fie afiate
intermitent la un interval de 500 ms (se creeaz un efect dinamic, de animaie). Se
modific urmtoarele proceduri:
procedure Click && Command1
ThisForm.Timer1.Interval=500

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).

Deschidei fereastra constructorului de formulare cu comanda create form imagine3.


Stabilii pentru formular proprietile:
BackColor=192,192,192
Caption="Ceas"
Closable=.F.
Adugai n fereastr urmtoarele obiecte: dou imagini (Image1 i Image2), o caset
de text (TextBox1), dou butoane de comand (Command1 i Command2) i un
ceas (Timer). Stabilii pentru aceste controale proprietile:
* Imagnea "Image1"
Caption="\<Afisare"
Picture=c:\test\face01.ico
* Butonul "Command2"
BackStyle=0
Caption="\<Terminare"
* Imagnea "Image2"
* Ceasul "Timer"
Picture=c:\test\face03.ico
Interval=0
BackStyle=0
* Caseta de text "TextBox1"
* Butonul "Command1"
BackStyle=0

Scriei procedurile asociate evenimentelor:


procedure Click && Command1
ThisForm.Text1.Value=0
ThisForm.Timer1.Interval=500

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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.

T est pentru evaluare:


1. Creai un tabel cu elevii din clas cu urmtoarea structur: nume (C,15), prenume
(C,15), telefon (C,10), adresa (M), foto (G). n cmpul foto vei memora poza elevului.
Crea1i un formular pntru introducerea i vizualizarea datelor din tabel. Vei folosi trei
controale de tip caset de text pentru cmpurile nume, prenume i telefon, un control
de tip zon de editare pentru cmpul adresa, un control de tip OLE pentru cmpul
foto i cinci comutatoare: pentru adugarea unei noi nregistrri, pentru tergerea
unei nregistrri, pentru parcurgere nainte i napoi a tabelului i pentru terminare.
2. Creai o bar cu instrumente care s conin trei butoane prin care se deseneaz o
form ntr-un formular: ptrat, cerc, elips i linie.
3. Construii un formular n care vor fi afiai, ntr-un control de tip list, elevii al cror
nume ncepe cu o anumit liter. Litera o vei alege dintr-o bar cu instrumente care
va conine butoane cu toate literele alfabetului.
4. Desenai cu ajutorul unui program care prelucreaz imagini, patru imagini care s
sugereze micarea unei persoane (patru cadre). Creai ntr-un formular un efect de
animaie afind repetat la un anumit interval de
timp, n ordine cte unul dintre cele patru cadre.

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:

Adevrat/Fals: 1-A; 2-A; 3-F.


Completai: 1-ToolBox; 2- Autoactivate; 3-Reset.
Alegei rspunsurile corecte: 1-b; 2- b; 3- c.

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:

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

339

laborioas o reprezint ns Constructorul de meniuri care permite programatorului s


defineasc interactiv un sistem de meniuri i s stabileasc elementele sale componente
(submeniuri i opiuni de meniu), proprietile lor (legenda, tastele de acces, scurttura) i
aciunile asociate unei opiuni de meniu: declanarea unei aciuni sau deschiderea unui
nou submeniu.
Pentru realizarea unui sistem de meniuri trebuie s parcurgei urmtorii pai:
1. Proiectai sistemul de meniuri. n aceast faz decidei de ce meniuri avei nevoie,
cnd sunt afiate n interfa i cnd sunt disponibile. Stabilii ce elemente vei folosi
pentru sistemul de meniuri (titlurile din meniul principal, submeniurile, opiunile din
submeniuri), adic structura sistemului de meniuri. Pentru fiecare element, vei stabili
proprietile specifice. Pentru fiecare opiune de meniu, vei stabili ce aciune va
declana n urma selectrii. Cnd proiectai sistemul de meniuri trebuie s avei n
vedere c utilizatorul trebuie s-l foloseasc uor i trebuie s nvee repede s-l
utilizeze. Utilizatorul i face o imagine mental despre modul n care este organizat
aplicaia pe baza meniului i a opiunilor de meniu. De aceea, atunci cnd proiectai
un sistem de meniuri este bine s respectai urmtoarele reguli:
a. Organizai sistemul de meniuri pornind de la sarcinile pe care trebuie s le
execute utilizatorul programului de aplicaii i nu de la structura de module a
programului de aplicaii.
b. Legendele afiate de titlurile i opiunile de meniuri trebuie s fie sugestive, cu
un neles asociat aciunii determinate de titlu sau opiune. n general este bine
s folosii verbe prin care descriei aciunea ce va rezulta n urma alegerii
opiunii. Pentru informarea utilizatorului vei folosi construcii suplimentare (de
exemplu mesaje n bara de stare) prin care vei descrie aciunea declanat de
alegerea unei opiuni.
c. n legendele titlurilor i opiunilor de meniu putei folosi att litere mari, ct i litere
mici. Limitai folosirea literelor mari numai la evidenierea anumitor caracteristici.
d. Limitai numrul de titluri de meniuri la un ecran. Dac ele depesc
capacitatea unui ecran, le vei organiza n submeniuri.
e. Opiunile de meniu se organizeaz fie innd cont de frecvena lor de folosire,
fie ntr-o secven logic de folosire, fie alfabetic. Vei alege ultimul criteriu
dac nu le cunoatei pe primele dou sau dac lista de opiuni este prea mare
(de regul peste 8) pentru a uura parcurgerea listei de ctre utilizator.
f.

Punei bare separatoare ntre grupuri logice de opiuni de meniu.

g. Este bine s nu se foloseasc mai mult de un nivel de submeniuri, pentru ca


utilizatorul s nu-i piard timpul cutnd comenzi printr-o structur arborescent de meniuri.
h. Stabilii taste de acces pentru titlurile de meniuri i opiunile de submeniuri i
scurtturi pentru opiunile de submeniuri.
2. Creai meniurile i submeniurile i stabilii sarcinile pe care trebuie s le execute
sistemul. Pentru aceasta lansai n execuie constructorul de meniuri cu comanda:
create menu <nume_meniu>

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

Creai un sistem de meniuri


Sistemul de meniuri pe care l vei crea reprezint programul principal de aplicaie n care,
n funcie de opiunile alese, vei lansa n execuie diferite module de program, construite
anterior sub form de formulare. Se va folosi pentru meniul principal un meniu sub forma
unei bare pe orizontal, la fel ca i meniul sistemului Visual FoxPro.
Sistemul de meniuri va afia o bar de meniuri pe
orizontal cu titlurile Afiseaza figuri, Utilitati i
Terminare. Titlul Afiseaza figuri va deschide un meniu
pe vertical care conine dou opiuni de tip submeniu:
Patrat4 i Figuri4. Submeniul Patrat4 conine doua
opiuni de tip comand: Afiseaza... care va lansa n execuie formularul n care este
controlat afiarea unui ptrat cu ajutorul unui control de tip comutator i Coloreaza...
care va lansa n execuie formularul n care este controlat afiarea culorii de umplere a
unui ptrat cu ajutorul unui control de tip list. Submeniul Figuri4 conine dou opiuni de
tip comand: Grup 1... care va lansa n execuie formularul n care este controlat
afiarea unei anumite figuri geomtrice cu ajutorul unui control de grup de butoane radio i
Grup 2... care va lansa n execuie formularul n care este controlat afiarea unei
anumite figuri geomtrice cu ajutorul unui control de tip list. Titlul Utiliti va deschide un
meniu pe vertical care conine dou opiuni de tip comand: Ceas... care va lansa n
execuie formularul n care este simulat un ceas cu ajutorul controlului de tip Timer i
Calculator... care va lansa n execuie formularul n care este simulat lucrul cu un

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

341

calculator de buzunar. Titlul Terminare va avea asociat o comand pentru terminarea


aplicaiei.

Lansai n execuie constructorul de meniuri fie cu opiunea de meniu New...File (din


caseta de dialog New alegei butonul radio Menu i executai apoi clic pe butonul New
File), fie cu comanda:
create menu menu_test

Se deschide caseta de dialog New Menu care conine dou


butoane: Menu pentru crearea unui sistem de meniuri sub
form de bar orizontal pe primul rnd al formularului n locul
sau mpreun cu titlurile meniului Visual FoxPro i Shortcut
pentru crearea unui meniu derulant pe vertical n interiorul
ferestrei de aplicaie. Putei alege butonul Shortcut atunci cnd
vrei s creai un meniu de comenzi rapide asociat unui anumit
element de interfa. Vei scrie comanda de lansare n execuie a acestui meniu n
procedura asociat evenimentului RightClick al elementului respectiv. Deoarece vrem
s construim un meniu sub form de bar pe orizontal, executai clic pe butonul Menu.
Se deschide fereastra constructorului de meniuri Menu Designer, iar n bara de meniuri
este afiat un titlu de meniu care conine opiuni specifice constructorului de meniuri:
Menu. Deschidei acest meniu i observai opiunile pe care le conine. Identificai
opiunile pentru care avei butoane n fereastra Menu Designer. Opiunea Quick menu
v ajut s creai rapid un sistem de meniuri pornind de la meniul Visual FoPro. Se va
genera automat structura acestui sistem de meniuri, dup care vei putea terge,
aduga sau modifica opiunile sau meniurile Visual FoxPro. Vei construi ns sistemul
de meniuri fr s folosii aceast facilitate.
nainte de a specifica structura sistemului de meniuri, i vei stabili caracteristicile generale prin intermediul casetei de dialog General Option pe care o deschidei cu opiunea
de meniu General Options...View. Ea conine urmtoarele controale:
9 Grupul de butoane radio Location prin
intermediul crora stabilii poziia meniului
pe care l creai fa de meniul sistemului
Visual FoxPro: Replace - n locul acestuia,
Append - la dreapta acestuia, Before naintea unui titlu de meniu i After - dup
un titlu de meniu din meniul sistemului.
Dac alegei una dintre ultimele dou opiuni, se va deschide o list derulant cu titlurile de meniuri din care putei s alegei titlul
meniului fa de care va fi adugat n meniul
sistemului, meniul creat de dumneavoastr.
9 Grupul de comutatoare Menu code prin intermediul crora stabilii dac dorii s scriei
o secven de cod asociat evenimentului Setup (comutatorul Setup...) i evenimentului Cleanup (comutatorul Cleanup...). Dac activai comutatorul se va deschide o
fereastr de editare n care vei scrie secvena de instruciuni.

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.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

343

Zona de creare sau editare a rezultatului. Este coloana urmtoare rezultatului


(coloana a patra). Conine un buton Create la creare i un buton Edit la editare. Dac tipul rezultatului este Submenu, la acionarea butonului se deschide o nou zon
de lucru n care putei defini opiunile submeniului i caracteristile lor. Dac tipul
rezultatului este Command, la acionarea butonului se activeaz n coloana a patra o
caset de text n care scriei comanda. Dac tipul rezultatului este Procedure, la
acionarea butonului se deschide o zon de editare n care scriei secvena de
instruciuni a procedurii. Pentru opiunile de meniu pentru care ai ales rezultatul de
tip Command, scriei comanda do form <nume_forma>, unde <nume_forma> este
numele fiierului n care ai salvat formularul. Pentru titlul Terminare pentru care ai
ales rezultatul Procedure, scriei n zona de editare urmtoarea secven de
instruciuni:
deactivate menu menu_test
&& dezactiveaza meniul
release menu menu_test extended && elibereaza zona de ;
memorie alocata meniului la creare
set sysmenu to default
clear memory
clear
Butonul Option. Dac l acionai se deschide caseta de dialog Prompt Option n
care stabilii caracteristicile opiunii de meniu. Completai n aceast caset de
dialog, pentru fiecare opiune de meniu, mesajul i scurttura.
9 Lista ascuns Menu level afieaz ierarhic meniurile din care s-a dezvoltat meniul pentru
care se pecizeaz opiunile n zona de lucru a ferestrei (filiaia meniului). Alegnd o
opiune din aceast list putei reveni ntr-unul din meniurile superioare lui. De exemplu,
folosind aceast list putei s revenii din zona de lucru a meniului Patrat, n zona de
lucru a meniului printe Afiseaz figuri sau a meniului principal Menu Bar.
Grupul de zone de editare Shortcut se folosete pentru a stabili o scurttur pentru opiunea de meniu. Combinaia de taste se scrie
n zona de editare Key Label (de exemplu innd apsat tasta Alt apsai tasta S;
scurttura va fi Alt+S). n zona de editare
Key Text se va scrie textul afiat lng opiunea de meniu prin care se precizeaz scurttura.
n caseta de editare Skip For scriei expresia
logic folosit pentru a controla disponibilitatea opiunii de meniu. Putei folosi constructorul de expresii dac acionai butonul ....
n caseta de editare Message scriei mesajul
care va fi afiat n bara de stare la selectarea
opiunii. Putei folosi constructorul de expresii.
n zona de editare Comment putei scrie
comentarii folosite intern, de proiectant.

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.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

345

T est pentru evaluare:


Construii o baz de date n care profesorul de informatica va ine evidena notelor
elevilor din clasele la care pred. Baza de date va fi format din dou tabele: elevi cu
structura identificatorul elevului (id_elev,N,3), clasa (cls,C,3), numele (nume,C,15),
prenume (pren,C,15), teza pe semestrul 1 (t1,N,2), media pe semestrul 1 (m1,N,2), teza
pe semestrul 2 (t1,N,2), media pe semestrul 2 (m2,N,2) i media general (mg,N,5,2) n
care inei evidena elevilor i note cu structura identificatorul elevului (id_elev,N,3), nota
(nota,N,2) i data notrii (data,D) n care inei evidena notelor la informatic. Cnd
definii baza de date avei grij s asigurai integritatea referenial a datelor. Separat
creai tabelul liber Clase n care profesorul ine evidena claselor la care pred. Tabelul
va avea un singur cmp pentru clase (cls,C,3). Acest tabel va fi folosit ca surs de date
pentru un control de tip list. Construii un sistem de meniuri care s-i permit
profesorului ntreinerea i exploatarea acestor date. Sistemul va avea urmtoarele titluri:
a. Titlurile din meniul principal vor fi: Actualizare, Prelucrare, Listare, Terminare.
b. Meniul Actualizare va deschide un meniu pe vertical cu opiunile Note, Teze, Elevi,
Clase. Selectarea uneia dintre aceste opiuni va deschide un formular pentru
actualizarea datelor din tabelul respectiv. Formularele Elevi i Clase vor avea
urmtoarele butoane: buton pentru adugarea unei nregistrri, buton pentru
tergerea unei nregistrri, buton pentru refacerea unei nregistrri terse accidental
n timpul lucrului cu formularul, dou butoane pentru parcurgere nregistrrilor din
tabel nainte i napoi i butonul de terminare. n formularul pentru elevi, se vor
actualiza numai urmtoarele date din tabelul Elevi: numele, prenumele i clasa.
Clasa se va alege dintr-o list a crei surs de date va fi tabelul Clase. Tabelul Note
va conine o caset de text pentru dat i o caset de text cu derulor pentru not, un
control de tip clas din care vei alege clasa i un control de tip list cu dou coloane
din care vei alege numele i prenumele elevului pentru care nregistrai nota.
Formularul va avea butoane de adugare, tergere, refacere a unei nregistrri
terse accidental n timpul lucrului cu formularul, dou butoane pentru parcurgerea
nregsitrrilor din tabel naintea i napoi i butonul de terminare. Formularul pentru
teze va permite alegerea elevului cu ajutorul celor dou liste, la fel ca i n cazul
notelor. Se vor crea dou casete de text cu derulor pentru cele dou note la tezele
de pe primul semestru, respectiv al doilea semestru.
c. Meniul Prelucrarea va deschide un meniu pe vertical cu opiunile Situaie elev,
Primii 10, Ultimii 10, Corigentii. Opiunea Situaie elev va afia un formular cu situaia
unui elev. Formularul va conine dou liste din care vei alege elevul i clasa, un
control de tip gril n care vor fi afiate nota i data i cinci casete de text pentru cele
dou teze, cele dou medii semestriale i menia anual. Valorile din toate aceste
controale vor fi protejate la scriere. Opiunile Primii 10 i Ultimii 10 vor afia
formulare care vor conine un control de tip list din care vei alege perioda
(Semestrul 1, Semestrul 2 sau An) i un control de tip gril n care vor fi afiai primii
10 elevi care au cele mai mari medii, respectiv ultimii 10 elevi care au cele mai mici
medii. Grila va avea coloane pentru nume, prenume, clas i medie. Opiunea
Corigenii va afia un formular n care, dintr-o list, vei putea alege perioada
(Semestrul 1, Semestrul 2 sau An) i o list din care vei alege clasa, dup care se

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:

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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

5.2.1. Proiectul aplicaiei


La realizarea unei aplicaii concur mai multe componente: module de program - programs
(programe independente care pot coine proceduri i funcii sau subprograme organizate n
fiiere de proceduri), baze de date - Database, tabele libere - Free Tables, formulare Forms, meniuri - Menus, rapoarte - Reports, interogri - Queries, biblioteci de clase - Class
Libraries, fiiere text - Text Files, alte tipuri de fiiere - Other Files. Pentru a manipula uor
componentele aplicaiiei, ele pot fi organizate ntr-un proiect.
Proiectul (project) este o facilitate prin care proiectantul unei aplicaii poate
ine evidena componentelor aplicaiei i le poate administra. El este un fiier
care conine o colecie de fiiere cu structuri specifice sistemului care le-a creat.
Se recomand ca nainte de a crea componentele unei aplicaii, s creai proiectul i s adugai la proiect fiecare nou component. n acest mod evitai s uitai s includei n proiect
una dintre componentele aplicaiei. Orice modificare a unei componente se va face n
interiorul proiectului. Propiectul se memoreaz ntr-un fiier cu extensia .pjx. Acest fiier are
structura unui tabel. ntr-o nregistare se memoreaz informaii despre o component a
proiectului. Practic proiectul nu conine componentele propriu-zise, ci informaii despre ele,
cum este de exemplu locul n care se gsesc pe disc.
Pentru construirea i modificarea unui proiect, Visual FoxPro v pune la dispoziie Gestionarul de proiecte - Project Manager pe care l lansai n execuie pentru crearea sau
modificarea unui proiect cu comanda:
create | modify project <nume_proiect>

5.2.2. Generarea aplicaiei i a programului executabil


Proiectul conine dou categorii de componente:

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

351

9 Lansarea n execuie a unei componente a proiectului (butonul Run). Selectai


componenta i acionai butonul. Va fi lansat n execuie componenta (programul,
interogarea, formularul etc.).
9 nlturarea unei componente din proiect (butonul Remove...). Selectai componenta din seciunea corespunztoare a ferestrei i acionai butonul. n caseta de
dilaog care se deschide, confirmai dac dorii numai nlturarea componentei din
proiect (Remove) sau nlturarea i tergerea ei de pe disc (Delete).
9 Construirea proiectului (butonul Build...). Dup ce apsai butonul, se va deschide o caset de dialog n care vei preciza ce vei construi (proiect, aplicaie,
fiier executabil sau vei recompila toate fiierele).
Deschidei seciunea Documents n care vei aduga la proiect formularele. Selectai
obiectul Form i acionai butonul Add.... Se deschide caseta de dialog Open n care
cutai directorul n care se gsete formularul i selectai apoi primul formular apelat n
meniu. Acionai apoi butonul Ok. Vei repeta aceast operaie pentru fiecare formular
care va fi adugat la proiect.
Deschidei seciunea Other n care vei aduga la proiect meniul i fiierele cu pictograme
necesare pentru simularea ceasului. Selectai mai nti obiectul Menus i acionai butonul
Add.... Se deschide caseta de dialog Open din care selectai meniul menu_test i
acionai apoi butonul Ok. Selectai apoi obiectul Other Files i acionai butonul Add....
Se deschide caseta de dialog Open din care selectai primul fiier cu pictogram
(Face01.ico) i acionai apoi butonul Ok. Vei repeta aceast operaie i pentru al doilea
fiier cu pictogram (Face01.ico).
Facei modificri n meniu. Selectai obiectul Menus i l dezvoltai executnd clic pe butonul +. n lista afiat selectai meniul Menu_test i apoi executai clic pe butonul
Modify. Se deschide fereastra constructorului de meniuri. Executai clic pe butonul
Edit al meniului Terminare. n fereastra de editare a procedurii asociate titlului de
meniu tergei instruciunile:
set sysmenu to default
clear memory
i adugai instruciunea:
clear events
nchidei fereastra de editare.
Deschidei seciunea code n care vei crea programul monitor. Selectai obiectul Programs i acionai butonul New.... Se deschide fereastra de editare. Scriei n fereastra de
editare instruciunile programului monitor i apoi l salvai sub numele monitor.
* se salveaza configuratia
do menu_test.mpr
salv=set('talk')
* se activeaza procesorul de;
_screen.Caption = 'Test'
evenimente
_screen.BackColor=Rgb(120,120,120) read events
* se stabileste noua configuratie
* se restaureaza configuratia
set talk off
set talk &salv
nume_f = screen.Caption
_screen.Caption=nume_f
culoare_f=_screen.BackColor
_screen.BackColor=culoare_f
* se creeaza meniul
set sysmenu to default

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.

nchidei fereastra aplicaiei executnd clic pe butonul de nchidere.


Informaiile proiectului sunt memorate sub forma
unui tabel. Deschidei acest tabel cu comanda:
use \aplicatie\proiect.pjx.
Vizualizai coninutul tabelului cu comanda
browse. Identificai semnificaia informaiilor memorate n fiecare rnd i n fiecarea coloan a tabelului. nchidei fereastra de vizualizare.
nchidei tabelul cu comanda use.

Creai o aplicaie
Aplicaia o vei construi pornind de la proiectul construit anterior.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

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

Creai un director Test n care va fi creat imaginea kitului de distribuie.


Deschidei caseta de dialog a procedurii asistent alegnd opiunea de meniu Setup
Wizard Tools i parcurgei urmtorii pai (folosind butonul Next):
1. Precizai locul sursei kitului- Locate Files. l comunicai n cmpul de editare
Distribution files. Pentru a uura cutarea, executai clic pe butonul .... Din lista
deschis alegei directorul c:\aplicatie.
2. Precizai componentele speciale folosite de aplicaie - Specify Components.
Componentele pe care le putei preciza (activnd comutatorul corespunztor) sunt:
Visual FoxPro runtime - versiunea pentru rulare necesar aplicaiilor (este
necesar atunci cnd kitul conine o aplicaie), Microsoft Graph 5.0 runtime versiunea pentru rulare a programului Microsoft Graph 5.0 (este necesar atunci
cnd n programele kitului se creeaz grafice), OLE servers (este necesar atunci
cnd n programele kitului se folosete tehnologia OLE). Activai comutatorul Visual
FoxPro runtime.
3. Creai directorul cu imaginea kitului - Create Disk Image Directory. Procedura
asistent creeaz pe hard disc o imagine a kitului. Aceast imagine poate fi
segmentat n grupuri de directoare, fiecare grup corespunznd unui disc flexibil de
de 3.5 inch sau poate fi nesegmentat. Modul pe care l-ai ales pentru memorarea
pe hard disc va determina tipul suportului destinaie. Alegei acest mod activnd unul
dintre comutatoarele din grupul Disk Image: 1.44 MB 3.5-inch (pentru discheta de
3.5 inch) sau Netsetup (pentru CD). Locul n care va fi memorat imaginea kitului l
vei comunica n caseta de text Disk Images Directory. Pentru exemplul nostru vei
alege varianta discurilor de 3.5 inch i directorul pentru imagine va fi c:\Test.
4. Precizai opiunile la instalare - Specify Setup Option. Este obligatoriu s
comunicai informaiile pentru caseta de text Setup dialog box caption (titlul afiat
de fereastra n care ruleaz kitul de instalare; scriei de exemplu Instalare) i
Copyright information (date referitoare la drepturile de copyright ale aplicaiei;
scriei de exemplu Autor <nume>). Mai putei completa caseta de text Post-setup
executable cu numele unui program executabil care va fi lansat n execuie la
sfritul instalrii kitului. Putei folosi acest program pentru a v proteja aplicaia
mpotriva copierilor ilegale sau pentru a stabili configuraia specific 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.

7. Terminai procesul de creare al kitului. Pentru aceasta acionai butonul Finish.


Se va afia caseta de dialog Setup Progress care v informeaz despre modul n
care decurge procesul de creare a kitului.

Dup ce s-a terminat procesul de creare a imaginii kitului de distribuie, deschidei


directorul Test i observai c el conine un director Disk144 (imagine pe disc flexibil) i n
acest director trei subdirectoare Disk1, Disk2 i Disk3. Aceste directoare vor fi copiate
fiecare pe cte un disc flexibil.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

355

Putem s testm kitul de instalare pe


propriul calculator. Deschidei directorul
Disk1 i lansai n execuie programul

setup. Vei pstra ca director pentru


aplicaie directorul stabilit n kit, aa c
vei aciona butonul Install all files for
Instalare.

La terminarea procesului de insta-lare, pe calculatorul dumneavoastr va fi creat un


director nou (Testare) i n el vor fi scrise fiierele aplicaiei. Lansai n execuie aplicaia.
Creai un program monitor folosind tehnica programrii pe obiecte
Vei deschide proiectul, vei modifica programul monitor, apoi vei crea aplica-ia. Dup ce ai
salvat noua versiune a aplicaiei, vei genera kitul ei de instalare.
Programul monitor n aceast versiune va fi (crearea obiectului program monitor se va face
pornind de la clasa Custom):
* se creeaza un obiect program monitor
monitor=CreateObject("clasa_m","menu_test")
monitor.proc_ev
Define class clasa_m as custom
protected salv, nume_f, culoare_f
procedure init && Evenimentul init declansat de creare obiect pm
parameters meniu
This.salv=set('talk')
This.nume_f= screen.Caption
This.culoare_f= screen.BackColor
set talk off
_screen.Caption = 'Test'
_screen.BackColor=Rgb(120,120,120)
nume_m=meniu+'.mpr'
do &nume_m
endproc
procedure proc_ev && Metoda activeaza procesorul de evenimente
read events
endproc
procedure destroy && Evenimentul destroy declansat de terminarea;
program monitor
val=This.salv
set talk &val
_screen.Caption=This.nume_f

356 Informatic
screen.BackColor= This.culoare_f
set sysmenu to default
endproc
enddefine

T est pentru evaluare:


Creai proiectul, aplicaia i kitul de distribuie pentru sistemul de meniuri definit anterior,
care este folosit de un profesor pentru a ine evidena
notelor i mediilor la disciplina Informatic.

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.

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