SGBD Visual Foxpro

Descărcați ca pdf sau txt
Descărcați ca pdf sau txt
Sunteți pe pagina 1din 356

Capitolul 1

Identificarea şi
clasificarea unor tipuri
de structuri de date
Dupå ce veÆi parcurge acest
În anii precedenÆi de studiu, aÆi învåÆat cå un calculator
capitol trebuie så çtiÆi: este o unealtå electronicå ce vå poate ajuta så prelucraÆi
informaÆia. InformaÆia prelucratå poate fi formatå din
1. Cum folosiÆi datele pentru a texte, numere, imagini sau sunete. Ea este påstratå pe
prelucra informaÆiile. diferite medii de memorare, în diferite formate, sub
2. Ce tipuri de date puteÆi folosi.
formå de date. Açadar, orice rezolvare de problemå
3. Cum puteÆi organiza datele
sub formå de colecÆii de date.
începe prin definirea datelor, continuå cu prelucrarea lor
4. Ce colecÆii de date puteÆi folosi (de exemplu atribuirea de valori) çi se terminå fie cu
în procesul de prelucrare a afiçarea valorii lor, fie cu stocarea lor pe un mediu de
datelor. memorare în vederea prelucrårii lor ulterior.
5. Ce este o bazå de date çi cum
AÆi mai învåÆat cå un calculator nu çtie så prelucreze
sunt organizate datele într-o
bazå de date.
decât çiruri de cifre binare care pot fi modelate fizic prin
6. Ce operaÆii puteÆi executa impulsuri de curent, cu douå niveluri de tensiune ce co-
pentru a obÆine informaÆii în respund celor douå cifre binare 0 çi 1. Prin urmare, date-
le vor fi codificåri binare ale informaÆiei existente în exte-
urma prelucrårii datelor dintr-o
bazå de date. riorul calculatorului. Fiecårui tip de informaÆie îi cores-
punde un anumit mod de stocare în mediul de memora-
re, adicå un anumit tip de datå. Tipul datei determinå atât operaÆiile care se pot executa cu
acele date, cât çi modul în care sunt reprezentate pe mediul de memorare. Astfel, fiecare
caracter dintr-un çir de caractere va fi reprezentat sub forma unui grup de 8 cifre binare
corespunzåtoare codului ASCII asociat caracterului, iar asupra datelor de acest tip se pot
aplica numai operatorul de concatenare çi operatorii relaÆionali. Açadar, datele (data) sunt
çiruri de biÆi care sunt prelucrate de calculator. Data este o resurså la dispoziÆia
programatorului çi orice limbaj de programare permite folosirea mai multor tipuri de date.
Indiferent de tipul de date ales, reprezentarea datei în memoria calculatorului (fie internå,
fie externå) se face printr-un çir de biÆi. Pentru a realiza aceastå reprezentare sunt imple-
mentaÆi algoritmi de codificare care asigurå corespondenÆa dintre tipul de datå çi çirul
de biÆi atât la scrierea datelor, cât çi la citirea lor. Tipul de datå ales de cåtre programator
influenÆeazå calitatea programului deoarece el determinå dimensiunea zonei de memorie
4 Informatică

alocatå, algoritmul de codificare, operatorii admiçi pentru prelucrare çi implicit timpul


necesr prelucrårii.
Analiza datelor se poate face în douå moduri:
9 Logic (la nivelul conceptual). De exemplu, o datå este un numår întreg pozitiv, cu valori
cuprinse între 0 çi 100.
9 Fizic (la nivelul reprezentårii 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 octeÆi de memorie çi permite memorarea datelor cu valori cuprinse
între -32768 ÷ 32767. La nivelul limbajului de programare este necesar så fie
implementaÆi diferiÆi algoritmi care så permitå folosirea acestui tip de datå: algoritmi de
încårcare 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.
AÆi mai învåÆat cå existå:
9 Date simple sau date elementare. Sunt date independente unele de altele din punct
de vedere al reprezentårii 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
funcÆie de locaÆia unei alte date pe suport).
9 Date compuse sau structuri de date. Sunt colecÆii de date între care existå anumite
relaÆii (relaÆii structurale). Fiecare componentå a structurii are o anumitå poziÆie în
cadrul structurii, iar toate componentele formeazå un întreg, astfel încât prelucrarea se
poate face atât la nivelul structurii de date (care poate fi consideratå o entitate de sine
ståtåtoare), cât çi la nivelul fiecårei componente. Pentru fiecare tip de structurå de
date în limbajul de programare trebuie så fie definiÆi algoritmi de localizare a
componentelor în cadrul structurii de date. Între componentele structurii existå çi
legåturi de conÆinut, adicå întregul ansamblu de date din colecÆie 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.
Açadar 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 precedenÆi de studiu aÆi lucrat
cu urmåtoarele structuri fizice de date:

Structuri de date

în memoria internå în memoria externå

Tabloul de memorie Înregistrarea Fiçierul de date


(vectori çi matrici)

Structurile de date create în memoria internå sunt temporare dar permit o vitezå de
prelucrare mult mai mare decât a celor organizate în memorie externå. Pe de altå parte,
structurile de date organizate în memoria externå sunt permanente çi permit stocarea çi
prelucrarea unei cantitåÆi mari de date.
Identificarea Ñi clasificarea unor tipuri de structuri de date 5

Açadar, scopul programelor de calculator este de a prelucra datele pentru a furniza


informaÆii. Aceastå informaÆie poate fi påstratå pe diferite medii de memorare, în diferite
formate, sub formå de date. Între datele prelucrate de un program existå diferite relaÆii.
Modul în care vor fi aranjate aceste date în mediul de memorare depinde de legåtura
dintre ele.

1. Baza de date
Principalele probleme pe care le implicå înså o colecÆie de date formatå dintr-un ansam-
blu de fiçiere de date sunt:
9 RedundanÆa datelor. RedundanÆa reprezintå o proprietate a unei colecÆii de date çi
se referå la faptul cå unele componente ale colecÆiei sunt memorate de mai multe
ori pe suportul de memorare. Date care reprezintå aceeaçi informaÆie pot så aparå
în fiçiere de date diferite, de multe ori cu formate de reprezentare diferite. Folosind
mai multe copii ale aceloraçi date se consumå inutil suport de memorare. Pe lângå
acest dezavantaj, mai existå çi alte dezavantaje: se consumå timpi suplimentari cu
actualizarea datelor, deoarece se actualizeazå de mai multe ori acelaçi set de date
(actualizarea se face în fiecare fiçier de date în care setul de date apare), actualizarea
datelor în toate fiçierele de date este un proces dificil (fiecare posesor al unui fiçier de
date trebuie så fie informat de schimbårile survenite) çi nu pot fi controlate erorile
apårute în procesul de actualizare a datelor.
9 Actualizarea fiçierelor çi påstrarea integritåÆii datelor. Actualizarea datelor trebuie
så se facå în toate fiçierele în care apar. Dacå se omite un singur fiçier, nu mai este
asiguratå integritatea datelor, iar rapoartele obÆinute cu aceste date vor conÆine
informaÆii greçite.
9 DependenÆa programelor de fiçierele de date. Pentru exploatarea çi întreÆinerea
fiecårui fiçier de date, programatorii vor scrie câte un program. Orice modificare în
structura fiçierului de date va avea ca efect modificarea programului de aplicaÆie. În
plus, în loc så se scrie un singur program pentru o colecÆie de date unicå, se scriu mai
multe programe, câte unul pentru fiecare colecÆie. Efectul este creçterea costurilor
plåtite de cåtre organizaÆie pentru programele care trebuie så-i furnizeze informaÆiile
din fiçierele de date.
Ansamblurile independente de date erau folosite în general în folosul unui singur depar-
tament al organizaÆiei çi mai puÆin în folosul întregii organizaÆii. SoluÆia care poate rezolva
aceastå problemå este reunirea datelor într-o colecÆie unicå numitå baza de date. În
acest mod, organizaÆia îçi poate exercita controlul asupra tuturor datelor.
Controlul se executå prin intermediul administratorului bazei de date (database
administrator - DBA) care este o poziÆie în cadrul administraÆiei (ocupatå de una sau mai
multe persoane) ce are ca atribuÆie stabilirea datelor care sunt necesare în cadrul
organizaÆiei sau la nivelul fiecårui departament. Administratorul bazei de date mai poate
så stabileascå çi modul în care se executå accesul la date, adicå så hotårascå pentru
fiecare persoanå din organizaÆie setul de date din colecÆia de date la care are acces. Pe
parcursul exploatårii bazei de date, el poate så hotårascå modificarea structurii bazei de
date în funcÆie de noile cerinÆe ale utilizatorilor.
6 Informatică

Obiectul: realizarea bazei de date a unei companii.


Analiza sistemului iniÆial, format din mai multe fiçiere de date

RelaÆii cu
Resurse clienÆii Aprovizi-
umane Salarizare ProducÆie onare
Marketing

Produse Stocuri
AngajaÆi Salarii
Vânzåri Catalog
produse
Furnizori
ClienÆi Comenzi

Fiecare departament al companiei çi-a creat çi întreÆinut propriul fiçier de date:


9 Departamentul Resurse umane are fiçierul AngajaÆi în care sunt påstrate date
despre angajaÆii companiei: numele, codul numeric personal, adresa, numårul de
telefon, data naçterii, data angajårii, studii, experienÆå, funcÆia çi departamentul în care
lucreazå, istoricul posturilor ocupate, data fiecårei avansåri etc.
9 Departamentul Salarizare are fiçierul Salarii în care sunt påstrate date despre
salariile angajaÆilor companiei: numele çi prenumele salariatului, codul numeric
personal, adresa, funcÆia deÆinutå, treapta de salarizare, salariul tarifar, numårul de
ore lucrate, reÆineri lunare, salariul lunar etc.
9 Departamentul RelaÆii cu clienÆii are fiçierele ClienÆi în care sunt påstrate date despre
clienÆii companiei (numele companiei client, adresa, numele persoanei de contact,
telefonul etc.) çi Comenzi în care sunt påstrate informaÆii despre comenzile clienÆilor
(numårul comenzii, clientul care a emis comanda, conÆinutul comenzii, data comenzii etc.).
9 Departamentul Aprovizionare are fiçierele Stocuri în care sunt påstrate date despre
stocul de materiale çi materii prime necesare producÆiei (denumirea materialului,
unitatea de måsurå, cantitatea etc.) çi Furnizori în care sunt påstrate date despre
furnizorii de materii prime çi materiale ale companiei (numele companiei furnizor,
adresa, numele persoanei de contact, telefonul etc.).
9 Departamentul Marketing are fiçierele Vânzåri în care sunt påstrate date despre vânzå-
rile de produse ale companiei (denumirea produsului, unitatea de måsurå, cantitatea, data
vânzårii, persoana care a intermediat vânzarea, date despre clientul care a cumpårat
produsul etc.) çi Catalog_produse care conÆine un catalog cu oferta de produse a
companiei (denumirea produsului, descrierea produsului, unitatea de måsurå, preÆul etc.).
9 Departamentul ProducÆie are fiçierele Produse în care sunt påstrate date despre
produsele realizate: denumirea produsului, unitatea de måsurå, cantitatea, data la
care a fost realizat produsul etc.
Identificarea Ñi clasificarea unor tipuri de structuri de date 7

Deoarece datele companiei se gåsesc în mai multe fiçiere de date independente, apar
urmåtoarele dezavantaje:
1. Departamentele nu pot folosi în comun datele de care au nevoie. Între fiçierele cu
date ale departamentelor nu existå posibilitatea de comunicare, iar departamentele nu
pot folosi în comun aceste date. De exemplu, dacå angajaÆii implicaÆi în vânzåri sunt
plåtiÆi în funcÆie de coeficientul vânzårilor lunare çi nu conform unui salariu tarifar,
informaÆiile necesare calculårii drepturilor salariale ale acestor persoane se gåsesc în
fiçierul Vânzåri. La acest fiçier nu are acces funcÆionarul din departamentul Salarizare
care are nevoie de ele pentru a calcula salariul lunar al angajaÆilor ce se ocupå cu
vânzarea produselor. Aceasta înseamnå cå o persoanå din departamentul Marketing
va extrage din fiçierul Vânzåri o listå cu angajaÆii implicaÆi în vânzåri în luna respectivå
çi cu volumul valoric al vânzårilor fiecåruia dintre ei. La rândul såu, persoana din
departamentul Salarizare va trebui så actualizeze fiçierul Salarii pe baza listei primite.
2. Ansamblul de fiçiere de date are o redundanÆå foarte mare. ColecÆia de fiçiere de
date are o redundanÆå mare deoarece foarte multe din date sunt duplicate, fiind
memorate în mai multe fiçiere de date. De exemplu, unele informaÆii despre angajaÆi
sunt memorate çi în fiçierul Salarii aflat în întreÆinerea compartimentului Salarizare,
dar çi în fiçierul AngajaÆi aflat în întreÆinerea compartimentului Resurse umane sau
unele informaÆii despre produsele realizate pot så aparå atât în fiçierul Produse aflat
în întreÆinerea compartimentului ProducÆie, cât çi în fiçierul Catalog_produse aflat în
întreÆinerea compartimentului Marketing.
3. Orice miçcare în cadrul companiei necesitå intervenÆia în mai multe fiçiere de
date. De exemplu, datele despre un client pot så aparå atât în fiçierul ClienÆi, cât çi în
fiçierul Vânzåri. Dacå un client îçi schimbå adresa, modificarea trebuie fåcutå în ambele
fiçiere. Deci, o persoanå din cadrul companiei trebuie så aibå grijå så informeze cele
douå persoane care se ocupå de actualizarea celor douå fiçiere din cele douå
departamente ca så facå aceste modificåri. Aceasta înseamnå cå la nivelul companiei
ar trebui så existe o persoanå care så aibå cunoçtinÆe despre toate aceste fiçiere de
date, de structura lor çi de toate schimbårile care apar în cadrul companiei çi care pot
afecta aceste date. Aceastå persoanå ar trebui så informeze, atunci când este cazul,
departamentele care trebuie så-çi actualizeze datele, ce date trebuie så actualizeze çi
cu ce valori, altfel nu ar mai putea fi asiguratå integritatea datelor. DeficienÆe pot så
aparå chiar dacå aceastå persoanå informeazå corect departamentele. Persoana care
face modificåri într-un fiçier de date poate så scrie greçit o valoare, astfel încât la nivelul
companiei, aceeaçi datå va avea valori diferite, în fiçiere diferite.
SoluÆia este reunirea acestor fiçiere de date într-o singurå colecÆie de date: baza de
date. În aceastå colecÆie pot fi eliminate datele duplicate (de exemplu informaÆiile des-pre
un client care apar çi în fiçierul ClienÆi çi în fiçierul Vânzåri çi în fiçierul Comenzi),
micçorându-se foarte mult redundanÆa datelor. Deoarece datele se vor gåsi o singurå
datå, în aceeaçi colecÆie, actualizarea lor se poate face mult mai uçor, asigurându-se
astfel integritatea datelor. În plus, angajaÆii unui departament pot avea acces çi la datele
produse de un alt departament.
Principala problemå care apare în acest caz este ca angajaÆii unui departament så aibå
acces numai la datele care le sunt strict necesare çi nu la toate datele companiei. De
exemplu, persoana care se ocupå de corespondenÆå trebuie så aibå acces numai la
8 Informatică

adresele angajaÆilor, ale clienÆilor çi ale furnizorilor pentru a putea expedia cores-
pondenÆa, nu çi la alte date despre aceçtia: salariile angajaÆilor, conturile bancare ale
clienÆilor, facturile emise cåtre clienÆi çi alte tranzacÆii financiare fåcute de companie.
Açadar, principalul avantaj al bazelor de date îl reprezintå partajarea datelor unei
organizaÆii între membrii ei, iar principalul dezavantaj este necesitatea controlårii
accesului la datele importante din colecÆie.

T est pentru evaluare:

IdentificaÆi în colecÆia de fiçiere de date a companiei datele redundante. IdentificaÆi în


aceeaçi colecÆie datele care sunt necesare mai multor departamente. Presupunând cå
datele companiei se organizeazå într-o colecÆie unicå, daÆi exemple de date la care
trebuie controlat accesul angajaÆilor companiei.

T est pentru evaluare:

ConsideraÆi cå çcoala voastrå este o organizaÆie formatå din mai multe compartimente.
AnalizaÆi activitatea din çcoala voastrå çi puneÆi în evidenÆå fiçierele de date care pot fi
folosite pentru a Æine evidenÆa activitåÆilor care au loc la nivelul çcolii çi la nivelul fiecårei
clase. AråtaÆi care sunt deficienÆele acestei colecÆii de
fiçiere de date.

1.1. Definirea bazei de date


Din punct de vedere al serviciilor pe care le oferå, baza de date este o colecÆie de date
care poate descrie întreaga activitate a unei organizaÆii çi care furnizeazå acces la diferite
informaÆii, prezentate în diferite formate.
Din punct de vedere al organizårii 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 colecÆie de fiçiere çi înregistråri legate între ele.

Pentru a permite accesul diferenÆiat la datele din colecÆia de date, se poate defini o
schemå generalå a bazei de date care descrie întreaga colecÆie de date çi diferite
scheme parÆiale care descriu seturile de date din colecÆie la care pot avea acces anumiÆi
utilizatori sau anumite grupuri de utilizatori.
Açadar, avantajele folosirii bazelor de date în locul fiçierelor de date sunt:
9 Partajarea informaÆiilor. Spre deosebire de datele din fiçierele de date la care au
acces numai utilizatorii care le-au creat çi le întreÆin, la datele din baza de date pot
avea acces toÆi membrii unei organizaÆii, care îçi vor partaja datele din baza de date.
Pot fi create aplicaÆii noi care så foloseascå datele din mai multe colecÆii de date çi
care så furnizeze informaÆii noi folosind tot ansamblul de date. În acest mod, fiecare
utilizator are senzaÆia cå este beneficiarul unic al colecÆiei de date.
Identificarea Ñi clasificarea unor tipuri de structuri de date 9

9 Creçterea cantitåÆii de informaÆii disponibile unui utilizator. Deoarece datele


produse de un compartiment al organizaÆiei pot fi folosite de toÆi membrii organizaÆiei
çi nu numai de membrii compartimentului respectiv, creçte cantitatea de informaÆii la
care au acces membrii organizaÆiei, chiar dacå se vor impune unele restricÆii de acces
pentru unele grupuri de membri. Gruparea datelor într-o colecÆie unicå de date face
posibil ca utilizatorul så poatå obÆine toate datele legate logic de o datå elementarå
de care el are nevoie pentru a-çi desfåçura activitatea în cadrul companiei.
9 Micçorarea redundanÆei datelor. Membrii organizaÆiei vor avea acces la aceeaçi co-
lecÆie de date în loc så-çi creeze fiecare propria colecÆie de date, care înseamnå de
fapt existenÆa aceloraçi date în mai multe colecÆii (multiplicarea unor seturi de date).
Råmân multiplicate numai acele date care trebuie så asigure coerenÆa bazei de date.
Prin eliminarea datelor multiplicate se micçoreazå çi spaÆiul de memorie externå alo-
cat pentru colecÆia de date çi timpul de actualizare a colecÆiei de date deoarece o datå
va fi actualizatå o singurå datå, în cadrul colecÆiei, çi nu de mai multe ori, în fiecare
fiçier de date în care apare.
9 ConsistenÆa 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 aceloraçi date, se eliminå
situaÆiile în care pot så aparå valori diferite pentru aceeaçi datå.
9 Integritatea datelor. Un alt efect al eliminårii redundanÆei datelor este integritatea date-
lor, deoarece datele vor fi actualizate într-un singur loc (în baza de date) çi nu în fiecare
colecÆie de date (în fiçierele de date). În plus, pot fi adåugate diferite proceduri pentru
validarea datelor introduse sau actualizate. Astfel, nu mai existå riscul så aparå necon-
cordanÆe între datele care corespund aceloraçi informaÆii, dar care aparÆin la colecÆii dife-
rite de date, sau riscul ca datele så fie incorecte (så nu aparÆinå domeniului de definiÆie).
9 Securitatea datelor. Se poate asigura mult mai uçor pentru o singurå colecÆie de date
(baza de date) decât pentru mai multe colecÆii de date (fiçierele de date). Astfel, numai
utilizatorii autorizaÆi vor avea acces la un anumit set de date din colecÆia de date.
9 Controlul centralizat al datelor. Prin stabilirea unui administrator al bazei de date
se poate asigura controlul tuturor datelor din colecÆia de date (baza de date), decât în
cazul colecÆiilor de date independente (fiçierele de date) unde fiecare utilizator îçi
exercitå controlul la nivelul propriei colecÆii de date.
9 TransparenÆa. Utilizatorul poate obÆine informaÆii din baza de date fårå så cunoascå
toatå organizarea ei complexå.
9 Dezvoltarea standardelor. Se pot dezvolta standarde referitoare la bazele de date atât
la nivelul organizårii logice a datelor, cât ç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 informaÆiilor.
9 IndependenÆa datelor. Se asigurå douå tipuri de independenÆå a datelor: independenÆa
fizicå çi independenÆa logicå. IndependenÆa fizicå înseamnå independenÆa datelor faÆå
de programele de aplicaÆie, adicå orice modificare a structurii datelor nu afecteazå pro-
gramul de aplicaÆie çi reciproc, orice modificare a programului de aplicaÆie nu afecteazå
structura de date. IndependenÆa logicå înseamnå independenÆa fiecårei scheme
particulare a unui utilizator faÆå de schema generalå, adicå pot fi definite noi câmpuri çi
pot fi adåugate noi înregistråri în baza de date fårå så fie afectaÆi utilizatorii care nu au
10 Informatică

nevoie de ele. În plus, baza de date poate fi reorganizatå (pot fi regrupate câmpurile din
înregistråri) pentru a face faÆå cerinÆelor unui nou utilizator, fårå a fi afectaÆi vechii utili-
zatori. Eliminarea unor entitåÆi din baza de date poate afecta înså utilizatorii care fac
referiri la acele entitåÆi.

1.2. Stratificarea bazei de date


Din punct de vedere conceptual, sistemul care foloseçte baza de date este organizat pe
mai multe straturi:
Ò stratul utilizator al bazei de date,
Ò stratul software de aplicaÆii,
Ò 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 organizaÆiei çi are dreptul så foloseascå baza de
date pentru a obÆine informaÆii. El poate fi çi o persoanå exterioarå organizaÆiei, cåreia
organizaÆia i-a permis accesul la anumite informaÆii. De obicei nu este specialist în infor-
maticå çi nu cunoaçte tehnicile folosite în exploatarea bazelor de date. InformaÆiile îi sunt
furnizate în termenii aplicaÆiei çi nu în termenii tehnici folosiÆi în bazele de date.

Software-ul de aplicaÆie
Prezintå imaginea datelor într-o formå accesibilå utilizatorului çi permite personalizarea
sistemului de gestiune a bazelor de date folosit. Rolul såu este de a prezenta informaÆia
în mod interactiv, în termeni specifici aplicaÆiei, prin intermediul unei interfeÆe. Nu are
rolul de a gestiona datele. AplicaÆia poate comunica cu utilizatorul fie printr-un sistem de
întrebåri çi råspunsuri, fie prin intermediul unor formulare completate de cåtre utilizator.
Software-ul de aplicaÆie poate fi conceput fie de programatori, în cazul bazelor de date
mari, distribuite pe mai multe calculatoare ale organizaÆiei, fie chiar de unii utilizatori ai
bazei de date, în cazul bazelor de date mici, organizate pe microcalculatoare.

Bazå de date

Sistem de gestiune
a bazelor de date

Software de aplicaÆii

Utilizator
Identificarea Ñi clasificarea unor tipuri de structuri de date 11

Sistemul de gestiune a bazelor de date


Pentru gestionarea datelor din baza de date trebuie så folosiÆi un Sistem de Gestiune a
Bazelor de Date (SGBD).

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


software specializat pentru crearea, întreÆinerea ç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 regåsirea datelor în
vederea extragerii informaÆiilor. El asigurå interfaÆa cu sistemul de operare în scopul sim-
plificårii 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 atât
descrierea algoritmului rezolvårii problemei folosind structurile de control din limbajele de
programare clasice, cât çi comenzi specializate în manipularea datelor din baza de date,
specifice numai sistemului de gestiune a bazelor de date.
Principalele facilitåÆi 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å legåtura între sistemul
de gestiune a bazelor de date çi baza de date. Acest limbaj permite descrierea mode-
lului bazei de date (schema bazei de date) çi a restricÆiilor aplicate colecÆiei de date.
9 Facilitatea de manipulare a datelor - asiguratå de limbajul de manipulare a datelor
(Data Manipulation Language). Prin aceastå facilitate se realizeazå legåtura între sis-
temul de gestiune a bazelor de date çi utilizator. Acest limbaj este o colecÆie de comenzi
care permit executarea operaÆiilor obiçnuite de exploatare çi întreÆinere a bazei de date:
cererile de acces la date çi actualizarea lor (adåugare, çtergere, modificare).
Prin separarea programului de aplicaÆie de sistemul de gestiune a bazelor de date se
obÆin mai multe avantaje:
9 Utilizatorul poate lucra cu baza de date prin intermediul interfeÆei create de programul
de aplicaÆie care presupune cunoçtinÆe numai despre aplicaÆie çi nu çi despre sistemul
de gestiune a bazelor de date, care prezentând datele în termeni specifici modului în
care a fost conceputå baza de date, obligå utilizatorul så aibå cunoçtinÆe 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å independenÆa datelor, adicå modificarea structurii
datelor nu implicå modificarea programelor de aplicaÆii.
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
aplicaÆie nu are decât rolul de a-i comunica parola introduså de utilizator care îi då aces-
tuia anumite drepturi de acces la date. Sistemul de gestiune a bazelor de date va folosi
în interior schema generalå pentru a manipula çi a întreÆine datele din baza de date çi va
folosi în exterior schema parÆialå atribuitå unui utilizator conform parolei, pentru a-l
împiedica pe acesta så obÆinå informaÆii din seturile de date la care nu are acces.
12 Informatică

9 Programele de aplicaÆii sunt uçor de scris deoarece ele descriu datele folosind
modelul conceptual al bazei de date (numele entitåÆilor care formeazå baza de date)
çi nu structura fizicå a datelor înregistrate pe suportul de memorare.
Sistemul de gestiune a bazelor de date furnizeazå instrumentele necesare pentru
manipularea datelor, dintre care cele mai importante sunt:
9 cåutarea uneia sau a mai multor entitåÆi care îndeplinesc anumite criterii,
9 sortarea în diferite moduri a diferitelor entitåÆi din baza de date,
9 generarea unor raporte folosind datele stocate în baza de date,
9 generarea unor formulare pentru introducerea çi validarea datelor.

Baza de date
Reprezintå un model de organizare a datelor oferit de sistemul de gestiune a bazelor de
date folosit. În cazul fiçierelor de date existå douå niveluri de organizare a datelor: nivelul
logic care constå în descrierea structurii de câmpuri de cåtre programator çi nivelul fizic
care constå în metodele de înregistrare çi regåsire a datelor la nivelul suportului de date. În
cazul bazelor de date, pentru asigurarea independenÆei datelor, organizarea trebuie så se
facå pe cel puÆin trei niveluri:

Nivelul extern
(modelul extern) Nivelul
conceptual
vizualizårile (modelul Nivelul intern
conceptual) (modelul intern)
descrierea bazei
de date baza de date
fizicå

Utilizatori

Calculator
Sistemul e gestiune a
bazelor de date

9 Nivelul intern sau baza de date fizicå este reprezentat de colecÆia de fiçiere înregis-
trate pe suportul de memorare, fiçiere care conÆin datele propriu-zise dar çi informaÆiile
suplimentare, necesare accesului la datele din baza de date.
9 Nivelul conceptual reprezintå descrierea unitåÆilor logice din care este formatå baza
de date çi a legåturilor dintre ele. Tot în modelul conceptual sunt specificate constrân-
gerile aplicate asupra datelor, care determinå restricÆii ale operaÆiilor de actualizare.
Ele sunt necesare pentru a asigura integritatea datelor.
9 Nivelul extern reprezintå modelul extern cu care opereazå utilizatorul bazei de date.
Acesta este format din unitåÆile logice de la nivelul conceptual cu care opereazå un
utilizator sau un grup de utilizatori. Pentru modelul extern se mai foloseçte çi termenul
de vizualizare (view) sau tabel virtual, deoarece se defineçte pe baza unei expresii
Identificarea Ñi clasificarea unor tipuri de structuri de date 13

relaÆionale aplicate câmpurilor din tabelele reale ale bazei de date. Vizualizarea
påstreazå numai schema prin care este definitå, nu çi datele propriu-zise, pe care le
preia din tabelele reale de fiecare datå când este folositå. Cea mai importantå utilitate
a unei vizualizåri este aceea cå prin intermediul ei se poate controla accesul unui grup
de utilizatori la baza de date. Deoarece utilizatorul are acces la baza de date nu prin
modelul conceptual, ci prin vizualizåri, acestea pot så ascundå unui utilizator acele
unitåÆi logice la care nu are drept de acces. Vizualizårile pot så controleze çi operaÆiile
pe care le poate executa cu unitåÆile logice: unele vizualizåri îi permit så actualizeze
unele unitåÆi logice, altele îi permit numai så le consulte. De exemplu, dacå se
construieçte o bazå de date a companiei, în tabelul AngajaÆi este înregistratå data
naçterii pentru fiecare angajat. Dacå o anumitå categorie de utilizatori (de exemplu
personalul din compartimentul Resurse Umane) doreçte o listå cu angajaÆii dintr-un
compartiment çi vârsta lor, nu se recomandå înregistrarea vârstei ca unitate logicå în
modelul conceptual deoarece ar trebui actualizatå zi de zi. Cel mai simplu este så se
creeze o vizualizare pentru aceastå categorie de utilizatori în care se defineçte
entitatea vârstå. Aceastå entitate se calculeazå ca diferenÆå dintre data curentå
furnizatå de sistem çi data naçterii înregistratå într-unul din tabelele bazei de date.

T est pentru evaluare:

În baza de date aveÆi un tabel cu notele elevilor, care are urmåtoarele câmpuri: codul ele-
vului, disciplina, data notårii, nota. Pentru a afla mediile semestriale ale elevilor dintr-o
claså la fiecare disciplinå, ce soluÆie se poate alege: så se creeze un tabel cu mediile
elevilor (care så aibå urmåtoarea structurå: codul elevului, codul disciplinei, media) sau
så se creeze o vizualizare cu aceeaçi structurå?

Modelul de date oferå instrumentele necesare interpretårii datelor din colecÆia de date.
El este format din douå componente:
9 un set de reguli pentru organizarea çi structurarea datelor,
9 un set de reguli care definesc operaÆiile pentru manipularea datelor.
Se pot folosi mai multe modele pentru organizarea bazelor de date.

1.3. Clasificarea bazelor de date


Scopul bazelor de date este de a integra date individuale, pe care le transformå din fapte
izolate în informaÆii utile. Dacå fiçierele de date pot fi organizate în mai multe moduri
astfel încât så permitå accesul secvenÆial sau direct la informaÆii, în funcÆie de necesitåÆile
utilizatorilor, çi bazele de date pot fi organizate în mai multe moduri, astfel încât så îi fie
cât mai utile utilizatorului. Açadar, baza de date fiind o colecÆie de entitåÆi (câmpuri çi
înregistråri), organizarea acestor entitåÆi se poate face în mai multe moduri astfel încât
structura de date så råspundå cât mai bine necesitåÆilor utilizatorului. Cele mai råspândite
modele de organizare a bazelor de date sunt urmåtoarele:
Ò ierarhice,
Ò reÆea,
Ò relaÆionale.
14 Informatică

Baze de date ierarhice (hierarchical database). În acest model de organizare a bazelor


de date entitåÆile (câmpurile çi înregistrårile) 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 relaÆie cu n noduri aflate la nivelul inferior. Altfel spus fiecare entitate are un
singur nod pårinte (parent node), dar un pårinte poate avea mai multe noduri copil
(child nodes). Pentru a gåsi un anumit câmp trebuie så se porneascå cu nodul pårinte de
pe primul nivel çi så se coboare pe arbore pânå la copilul care conÆine acel câmp.
Un exemplu de organizare ierarhicå este baza de date pentru sistemul de rezervåri la
liniile aeriene, structuratå pe 4 niveluri. Nodul pårinte de pe primul nivel este oraçul de
plecare Bucureçti. Acest pårinte are patru copii: Cluj, ConstanÆa, Iaçi çi Timiçoara, care
reprezintå oraçele de sosire. Nodul Timiçoara are la rândul såu doi copii: 210 çi 211 care
reprezintå numårul zborurilor. Zborul 210 are la rândul såu trei copii, pasagerii.

plecare Bucureçti

Cluj ConstanÆa Iaçi Timiçoara


sosire

210 211
numår zbor
Ionescu Alexandru Cålin Mircea Andronescu Ana
pasager

Într-un astfel de tip de organizare apar urmåtoarele probleme:


9 Dacå se çterge un nod pårinte, se çterg toate nodurile copil subordonate.
9 Un nod copil poate fi adåugat numai dacå au fost adåugate mai întâi nodurile pårinte.
9 Între nodurile copii nu pot fi stabilite relaÆii.
Baze de date reÆea (network database). Çi în acest caz existå o aranjare ierarhizatå a
nodurilor, cu deosebirea cå un nod copil poate så aibå mai multe noduri pårinÆi. Între
nodurile pårinte çi nodurile copil se adaugå conexiuni adiÆionale numite pointere. Aceasta
înseamnå cå unui nod i se poate adåuga o cale nouå çi cå pot fi trasate în jos ramuri noi.
În aceastå organizare, fiecare entitate poate avea un numår nelimitat de conexiuni,
dispårând noÆiunea de entitate ierarhic superioarå.

produse Produsul 1 Produsul 2 Produsul 3

ansambluri Ansamblul 1 Ansamblul 2 Ansamblul 3

piese Piesa 1 Piesa 2 Piesa 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 componenÆa mai multor ansam-
Identificarea Ñi clasificarea unor tipuri de structuri de date 15

bluri, iar fiecare ansamblu poate intra în componenÆa mai multor produse. În acest
exemplu se poate observa cå organizarea de tip reÆea este mai flexibilå çi în multe cazuri
mai eficientå decât cea ierarhicå.
Baze de date relaÆionale (relational database). Cel mai flexibil model de organizare îl
reprezintå bazele de date relaÆionale, în care nu existå o cale de acces ierarhizatå la o
anumitå datå. Baza de date este formatå din mai multe tabele, fiecare dintre ele fiind
format din linii çi coloane. Un tabel este numit o relaÆie.

elevi absenÆe
identif. elev nume prenume ... adresa identif. datå identif. identif.
elev absenÆå disciplinå profesor

discipline profesori
identif. nume ........... identif. nume .............
disciplinå profesor

Så construim o bazå de date a çcolii. Så consideråm tabelul elevi care conÆine date despre
elevii çcolii: identificatorul elevului, numele, prenumele, data naçterii, numårul de telefon çi
adresa. Un alt tabel, absenÆe, conÆine date despre absenÆele elevilor din toatå çcoala:
identificatorul elevului, data absenÆei, identificatorul disciplinei çi identificatorul profesorului.
Aceste douå tabele sunt legate printr-un câmp comun numit câmp cheie. În acest caz,
câmpul cheie este identificatorul elevului. Aceasta înseamnå cå între tabelul elevi çi tabelul
absenÆe s-a stabilit o relaÆie prin intermediul unui câmp cheie care conÆine o informaÆie
comunå ambelor tabele çi anume identificatorul elevului. În tabelul profesori se påstreazå
date despre profesorii din çcoalå: nume, prenume, discipline la care predau, grad didactic,
adreså, numår telefon etc. Tabelul profesori se leagå de tabelul absenÆe prin câmpul cheie
identificatorul profesorului. În tabelul discipline se påstreazå date despre disciplinele predate
în çcoalå: nume, profilul clasei çi anul de studiu, numårul de ore etc. Tabelul discipline se
leagå de tabelul absenÆe prin câmpul cheie identificatorul disciplinei. Aceste patru tabele
formeazå împreunå o bazå de date relaÆionalå (relational database). Baza de date a çcolii
mai poate fi completatå çi cu alte tabele ca de exemplu, tabelul cu date despre pårinÆii elevilor
(pårinÆi) care se va lega de tabelul elevi prin câmpul cheie identificatorul elevului, tabelul cu
date despre notele elevilor (note) care se va lega de tabelul elevi prin câmpul cheie
identificatorul elevului, de tabelul profesori prin câmpul cheie identificatorul profesorului çi de
tabelul discipline prin câmpul cheie identificatorul disciplinei, tabelul cu date despre clase
(clase) care conÆine date despre clasele din çcoalå (identificator claså, an de studiu,
identificatorul profesorului diriginte) care se va lega de tabelul elevi prin câmpul cheie
identificatorul clasei, iar de tabelul profesori prin câmpul cheie identificatorul profesorului etc.
16 Informatică

Fiecare rând din tabel în care se gåsesc informaÆii despre un elev corespunde unei
înregistråri de date. Fiecare coloanå cu informaÆii corespunde unui câmp (de exemplu,
coloana adreså). Capul de tabel (antetul tabelului) defineçte structura tabelului çi se mai
numeçte çi înregistrare de structurå. Datele sunt înregistrate în baza de date prin
intermediul structurii definite în înregistrarea de structurå. La crearea unui tabel trebuie
definitå mai întâi structura tabelului (capul de tabel), adicå trebuie precizate câmpurile
care o compun, cât çi caracteristicile acestora.

2. Bazele de date relaţionale


Baza de date relaÆionalå este formatå dintr-unul sau mai multe tabele
bidimensionale între care se pot stabili legåturi.

Tabelul permite gruparea unor date înrudite çi poate fi privit ca o colecÆie de câmpuri.
Pentru fiecare câmp sunt descrise datele care vor fi memorate în el. Descrierea se face
prin tipul datelor, dimensiunea lor çi alte proprietåÆi. Ele definesc implicit domeniul de
definiÆie al datelor memorate în câmp. Dacå domeniul datelor este inclus în domeniul
implicit de definiÆie, se pot defini condiÆii de validare a datelor care så controleze
corectitudinea datelor introduse sau modificate. De exemplu, datele dintr-un câmp sunt
numere întregi cuprinse între 1.000 çi 30.000. Se va alege tipul întreg, ca domeniu implicit
al datelor, dar se vor preciza condiÆii de validare suplimentare care så oblige utilizatorul
så introducå în acest câmp numai date întregi pozitive din domeniul 1.000 ÷ 30.000.
Antetul tabelului (capul de tabel) poate fi privit ca o descriere a structurii tabelului:
ansamblul de câmpuri çi descrierea lor. În teoria bazelor de date relaÆionale tabelele se
mai numesc çi relaÆii, fiecare coloanå din tabel care corespunde unui câmp se mai
numeçte çi atributul relaÆiei, iar fiecare rând din tabel care conÆine câte o valoare pentru
fiecare câmp se mai numeçte çi tuplu. Tuplul corespunde înregistrårii din fiçierul de
date. Într-un tabel al unei baze de date relaÆionale nu pot exista înregistråri identice.
Tabelele bazei de date sunt organizate apoi într-o structurå arborescentå determinatå de
relaÆia dintre tabele.
Schema generalå a unei baze de date relaÆionale este formatå din ansamblul
tabelelor çi al legåturilor dintre ele.
Putem stabili urmåtoarea analogie între un fiçier de date çi o bazå de date:

Fiçierul de date Baza de date


ColecÆia de date = fiçier de date ColecÆia de date = colecÆie de relaÆii
Fiçier de date (tabel) RelaÆie
Înregistrare Tuplu
Câmp Atribut
Deoarece interfeÆele puse la dispoziÆie de sistemele de gestiune a bazelor de date rela-
Æionale folosesc în general termenii de tabel (table), câmp (field) çi înregistrare (record),
vom folosi în continuare aceçti termeni pentru a defini obiectele corespunzåtoare ale
bazei de date.
Identificarea Ñi clasificarea unor tipuri de structuri de date 17

Coloane = Câmpuri

RelaÆii între tabele


Rânduri = Înregistråri

Tabelele
Baza de date relaÆionalå

Procesul de construire a unei baze de date se desfåçoarå î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 câmpuri
împreunå cu proprietåÆile lor. Dupå definirea structurii începe încårcarea datelor în
tabel. La nivelul tabelului entitatea prelucratå este înregistrarea: se pot adåuga
înregistråri, se pot çterge înregistråri, se pot modifica înregistråri. Se poate modifica
structura unui tabel chiar dupå ce a fost încårcat cu date. Sistemul de gestiune a
bazelor de date nu opereazå modificarea de structurå direct în tabel, ci executå
urmåtoarele operaÆii: creeazå noua structurå de tabel (rezultatå în urma modificårilor
cerute), încarcå în noul tabel datele din vechiul tabel çi çterge vechiul tabel. Toate
aceste operaÆii sunt executate automat de cåtre sistem, fårå intervenÆia utilizatorului
çi fårå a fi vizibile pentru utilizator.
2. Stabilirea relaÆiilor între tabele. RelaÆiile care se vor stabili între tabele sunt unidi-
recÆionale, adicå între douå tabele nu se stabileçte o relaÆie de egalitate ci o relaÆie
de subordonare: unul dintre tabele este tabelul conducåtor sau principal (tabelul de
la care porneçte legåtura), iar celålalt este tabelul condus sau secundar (tabelul la
care ajunge legåtura). Tabelul condus este subordonat tabelului conducåtor. Aceasta
înseamnå cå dacå utilizatorul selecteazå o înregistrare în tabelul conducåtor, sistemul
va selecta automat înregistrarea de care este legatå din tabelul condus.
De obicei, modelul relaÆional cel mai des întâlnit este cel descris printr-un arbore cu o
singurå rådåcinå, adicå în baza de date existå un singur tabel conducåtor care reprezintå
rådåcina arborelui. Celelalte tabele sunt legate de tabelul conducåtor direct sau indirect
(prin intermediul altor tabele).
18 Informatică

Tabelul conducåtor Tabelul condus


Înregistrarea 1 Înregistrarea 1
Înregistrarea 2 Înregistrarea 2
Înregistrarea 3 Înregistrarea 3
Înregistrarea 4 Înregistrarea 4
Înregistrarea 5 Înregistrarea 5
Înregistrarea 6 Înregistrarea 6

Definirea unei relaÆii între cele douå


tabele are ca efect stabilirea unor
legåturi între înregistrårile celor douå
tabele.
Înregistrarea este
selectatå printr-o Înregistrarea este
comandå a utilizatorului. selectatå automat de
sistem.
Pentru a putea stabili legåturi între tabele, se definesc în tabele chei de identificare.
Cheia de identificare este formatå din numårul minim de câmpuri alese astfel încât
ansamblul lor de valori så fie unic în cadrul unui tabel pentru a permite identificarea
înregistrårilor din tabel. Açadar, fiecare înregistrare va putea fi identificatå în mod unic
prin valorile cheii astfel definite. Este posibil ca într-un tabel så poatå fi evidenÆiate mai
multe grupuri de câmpuri care så permitå identificarea în mod unic a înregistrårilor
tabelului, deci pot fi definite mai multe chei de identificare. Deoarece un tabel nu poate
avea douå înregistråri identice, orice tabel poate avea cel puÆin o cheie de
identificare, formatå în cel mai råu caz din toate câmpurile înregistrårii.
Cheia primarå este aleaså din mulÆimea cheilor de identificare pe baza anumitor criterii
çi este folositå pentru a face legåtura între înregistrårile mai multor tabele ale bazei de
date. Cheia primarå va fi folositå de sistemul de gestiune a bazelor de date pentru a
identifica unic înregistrårile în procesul de cåutare çi regåsire a datelor. Se recomandå ca
din mulÆimea cheilor de identificare så se aleagå, pentru cheia primarå, cheia care este
formatå din cele mai puÆine câmpuri.
Cheia secundarå este formatå dintr-unul sau mai multe câmpuri dintr-un tabel, care sunt
folosite ca o cheie primarå în alt tabel, valorile câmpurilor din cheie fiind identice în
ambele tabele. Se mai numeçte çi cheie stråinå.
Legåtura dintre tabelele bazei de date se realizeazå prin mecanismul de propagare a
cheilor. În tabelul surså, tabelul de la care începe propagarea cheii (tabelul conducåtor),
se gåseçte cheia primarå, iar în tabelul destinaÆie, tabelul pânå la care se propagå cheia
(tabel condus), se gåseçte cheia secundarå. Se spune cå a avut loc propagarea cheii din
tabelul surså în tabelul destinaÆie. Acest mecanism permite stabilirea legåturii între o
înregistrare din tabelul surså çi o înregistrare din tabelul destinaÆie. CondiÆia care trebuie
respectatå pentru a putea fi asiguratå aceastå legåturå se numeçte condiÆia de
integritate referenÆialå.
Identificarea Ñi clasificarea unor tipuri de structuri de date 19

Integritatea referenÆialå
Este specificå relaÆiilor dintre tabelele bazei de date. Ea înseamnå o colecÆie de reguli çi
restricÆii impuse tabelelor între care s-au stabilit relaÆii. Astfel, a asigura integritatea
referenÆialå înseamnå ca atunci când se fac modificåri ale valorii unui câmp dintr-un
tabel så nu fie afectatå relaÆia dintre tabele. Aceastå problemå apare în cazul
câmpurilor care fac parte dintr-o cheie primarå sau secundarå. Ele trebuie så respecte
condiÆia de integritate referenÆialå.

CondiÆia de integritate referenÆialå impune ca mulÆimea valorilor unei chei


secundare så fie incluså în mulÆimea valorilor cheii primare din care s-a propagat.

Integritatea referenÆialå trebuie så fie satisfåcutå permanent în baza de date.


OperaÆiile de adåugare, çtergere çi modificare pot afecta integritatea referenÆialå:
În tabelul condus:
9 OperaÆia de adåugare a unei înregistråri trebuie så se facå numai dacå valorile din
câmpurile secundare se gåsesc în mulÆimea valorilor cheilor primare din care s-au
propagat.
9 OperaÆia de çtergere a unei înregistråri se poate face fårå så fie afectatå integritatea
referenÆialå.
9 OperaÆia de modificare a valorii unui câmp dintr-o înregistrare trebuie så aibå în
vedere faptul cå dacå acel câmp este un câmp secundar, valoarea sa trebuie så se
gåseascå în mulÆimea valorilor cheii primare din care s-a propagat.
În tabelul conducåtor:
9 OperaÆia de adåugare a unei înregistråri se poate face fårå så fie afectatå integritatea
referenÆialå.
9 OperaÆia de çtergere a unei înregistråri poate så afecteze relaÆiile dintre tabele numai
în cazul în care existå chei secundare care au aceeaçi valoare cu a cheii primare din
înregistrarea çtearså. În acest caz se pot folosi douå metode: çtergerea
restricÆionatå (nu se acceptå çtergerea înregistrårii dacå existå cel puÆin o cheie
secundarå într-unul din tabelele bazei de date, propagatå din cheia primarå care are
aceeaçi valoare cu cheia primarå din înregistrarea pe care vreÆi så o çtergeÆi) sau
çtergerea în cascadå (çtergerea înregistrårii va avea ca efect çtergerea din toate
tabelele a înregistrårilor care conÆin chei secundare propagate din cheia primarå çi
care au aceeaçi valoare cu cheia primarå din înregistrarea çtearså).
9 OperaÆia de modificare a unei înregistråri poate så afecteze relaÆiile dintre tabele
numai în cazul în care existå chei secundare care au aceeaçi valoare cu a cheii
primare care se modificå. Çi în acest caz se pot folosi douå metode: modificarea
restricÆionatå (nu se acceptå modificarea unui câmp dacå el este cheie primarå çi
existå cel puÆin o cheie secundarå într-unul din tabelele bazei de date propagatå din
cheia primarå care are aceeaçi valoare cu cheia primarå pe care vreÆi så o modificaÆi)
sau modificarea în cascadå (modificarea cheii primare va avea ca efect modificarea
tuturor cheilor secundare propagate din aceasta, din toate tabelele, care au aceeaçi
valoare cu cheia primarå care se modificå).
20 Informatică

Obiectul: analiza integritåÆii referenÆiale în cazul bazei de date a unei çcoli.


Analiza se va face pe baza de date relaÆionalå Çcoala
În baza de date Çcoala, legåtura între tabelul Elevi çi tabelul Note, respectiv un tabel
Medii, se face prin intermediul câmpului cod_elev, care este cheie primarå în tabelul Elevi
çi cheie secundarå în tabelul Note, respectiv tabelul Medii. Açadar, câmpul cod_elev s-a
propagat în tabelul Note, respectiv în tabelul Medii, unde a devenit cheie secundarå.
Scopul propagårii a fost de a asigura legåtura cu aceste tabele.
Så presupunem cå în tabelul Elevi, care conÆine date generale despre elevi, se çterge
înregistrarea corespunzåtoare unui elev deoarece acesta s-a transferat la o altå çcoalå.
În tabelul Note se påstreazå toate notele elevilor, iar în tabelul Medii toate mediile
elevilor. Så presupunem cå trebuie extrase din baza de date una dintre urmåtoarele
situaÆii: lista cu toÆi elevii care au cel puÆin o notå de 10 la o anumitå disciplinå sau lista cu
toÆi elevii corijenÆi pe primul semestru la cel puÆin o disciplinå. Så mai presupunem cå
elevul care s-a transferat se încadreazå într-una dintre aceste situaÆii. Cåutarea în baza
de date a elevilor care corespund acestor situaÆii se face astfel: se cautå în tabelul Note
toate înregistrårile care pentru o anumitå valoare a codului disciplinei au valoarea 10
pentru câmpul nota (de exemplu, cod_disciplina=02 and nota=10), respectiv se cautå în
tabelul Medii toate înregistrårile care au valoarea câmpului media mai micå decât 5
(media<5). Pentru a se afiça numele elevului, se foloseçte ca legåturå cu tabelul Elevi
câmpul cheie cod_elev. În baza de date Elevi, nu mai existå o înregistrare care så aibå
aceeaçi valoare a cheii primare cu cheile secundare din tabelele Note çi Medii. Înseamnå
cå nu a fost îndeplinitå condiÆia de integritate referenÆialå, deoarece o valoare a
cheii secundare nu se gåseçte în mulÆimea valorilor cheii primare. Efectul neres-
pectårii acestei condiÆii este cå în tabelele Note çi Medii existå înregistråri pentru care s-a
rupt legåtura cu tabelul Elevi. Problema se complicå çi mai mult dacå în çcoalå se mutå
un elev cåruia i se atribuie acelaçi cod_elev cu al elevului care s-a transferat. În acest
mod, toate datele care se referå la elevul transferat (note, medii, absenÆe) sunt atribuite
automat noului elev prin relaÆia care existå între tabele.
Pentru a se asigura integritatea referenÆialå, normal ar fi ca atunci când elevul se
transferå, så se çteargå înregistrarea corespunzåtoare elevului din tabelul Elevi, dar çi
toate înregistrårile din celelalte tabele care au valoarea cheilor secundare cod_elev egalå
cu valoarea cheii primare cod_elev corespunzåtoare elevului transferat din tabelul Elevi,
pentru a se asigura astfel condiÆia de integritate referenÆialå. În acest exemplu, trebuie
folositå çtergerea în cascadå atunci când un elev este transferat. Prin aceastå operaÆie
vor fi çterse toate înregistrårile 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 înre-
gistråri referitoare la acesta (note, absenÆe, medii).

În baza de date se gåsesc douå tipuri de date:


9 colecÆiile de date organizate sub formå de tabele care reprezintå informaÆia utilå çi
Identificarea Ñi clasificarea unor tipuri de structuri de date 21

9 fiçiere ajutåtoare în care este descriså structura tabelelor (fiçierele de structurå),


legåturile dintre ele çi alte informaÆii necesare regåsirii datelor în tabele (cum sunt
fiçierele index care permit regåsirea datelor în baza de date în funcÆie de valoarea
unui câmp cheie çi care asigurå accesul direct la date) sau interpretårii lor (cum sunt
fiçierele pentru rapoarte).
Modelul relaÆional are urmåtoarele avantaje faÆå de celelalte modele de organizare:
9 Este un model uçor de înÆeles de cåtre utilizator çi uçor de vizualizat.
9 Asigurå independenÆa structurii logice a datelor faÆå de modul de stocare fizicå a lor.
9 Regulile çi restricÆiile care asigurå integritatea datelor çi protejarea datelor çi a struc-
turii de date sunt uçor de înÆeles de cåtre utilizator.
9 SpaÆiul de stocare a datelor este redus.
9 RedundanÆa datelor este reduså.

Obiectul: baza de date a unei companii.


Crearea bazei de date, pornind de la sistemul iniÆial format din mai multe fiçiere:
Fiçierele de date dezvoltate de fiecare compartiment al companiei se pot transforma în
tabelele unei baze de date relaÆionale:
9 Tabelul AngajaÆi în care sunt påstrate date despre angajaÆii companiei: numele çi
prenumele, codul angajatului, codul numeric personal, adresa, numårul de telefon,
data naçterii, data angajårii, studii, experienÆa, funcÆia çi departamentul în care
lucreazå, istoricul posturilor ocupate, data fiecårei avansåri etc.
9 Tabelul Salarii în care sunt påstrate date despre salariile angajaÆilor companiei:
numele çi prenumele salariatului, codul angajatului, codul numeric personal, adresa,
funcÆia deÆinutå, treapta de salarizare, salariul tarifar, numårul de ore lucrate, reÆineri
lunare, salariul lunar etc.
9 Tabelul ClienÆi în care sunt påstrate date despre clienÆii companiei: numele companiei
client, codul clientului, adresa, numele persoanei de contact, telefonul etc.
9 Tabelul Comenzi în care sunt påstrate informaÆii despre comenzile clienÆilor: numårul
comenzii, codul clientului care a emis comanda, conÆinutul comenzii, data comenzii etc.
9 Tabelul Catalog_materiale în care sunt påstrate date despre materialele folosite de
companie: codul materialului, denumirea materialului, unitatea de måsurå etc.
9 Tabelul Stocuri în care sunt påstrate date despre stocul de materiale çi materii prime
necesare producÆiei: codul materialului, cantitatea, codul depozitului, denumirea
depozitului, angajatul care råspunde de depozit etc.
9 Tabelul Furnizori în care sunt påstrate date despre furnizorii de materii prime çi
materiale ale companiei: numele companiei furnizor, codul furnizorului, adresa,
numele persoanei de contact, telefonul, codul materialului furnizat, preÆul etc.
9 Tabelul Vânzåri în care sunt påstrate date despre vânzårile de produse ale
companiei: codul produsului, denumirea produsului, unitatea de måsurå, cantitatea,
data vânzårii, codul angajatului care a intermediat vânzarea, date despre clientul care
a cumpårat produsul etc.
22 Informatică

9 Tabelul Produse în care sunt påstrate date despre produsele realizate: codul
produsului, denumirea produsului, unitatea de måsurå, cantitatea, data la care a fost
realizat produsul, preÆul de fabricaÆie etc.
9 Tabelul Catalog_produse în care sunt påstrate date despre produsele oferite de
companie: codul produsului, denumirea produsului, descrierea produsului, unitatea de
måsurå, preÆul etc.
În aceste tabele apar mai multe câmpuri de tip: cod produs, cod angajat, cod client sau
cod furnizor. Ele se folosesc pentru a identifica unic înregistrårile din tabele.
Pentru aceste tabele pot fi definite diferite chei de identificare. De exemplu, pentru
tabelul AngajaÆi se poate folosi pentru cheie câmpul cod_angajat sau
cod_numeric_personal deoarece ele identificå unic un angajat din tabel. Câmpurile
nume_prenume, funcÆie sau departament nu pot fi folosite pentru cheia de identificare
pentru cå ele nu pot identifica unic înregistrårile din tabel (angajaÆii) deoarece pot exista
mai mulÆi angajaÆi care au acelaçi nume çi prenume sau care au aceeaçi funcÆie ori
lucreazå în acelaçi departament. Câmpurile cod_angajat çi cod_numeric_personal nu
pot forma împreunå o cheie de identificare deoarece cheia presupune numårul minim de
câmpuri necesar identificårii, iar în acest exemplu, fiecare câmp în parte este suficient
pentru identificarea angajatului.
Pentru tabelul Stocuri sunt necesare douå câmpuri pentru a obÆine cheia de identificare
a unei înregistråri: cod_material çi cod_depozit, deoarece fiecare dintre aceste câmpuri
luate separat nu pot identifica unic o înregistrare din tabel: existå mai multe câmpuri
cod_material cu aceeaçi valoare, câte unul pentru fiecare depozit în care se gåseçte în
stoc acel material çi mai multe câmpuri cod_depozit cu aceeaçi valoare, câte unul pentru
fiecare material care existå în acel depozit.
Dacå în tabelul ClienÆi câmpul cod_client este cheie primarå deoarece el identificå unic
un client, în tabelul Comenzi el va fi cheie secundarå çi va permite stabilirea unei relaÆii
între tabelul ClienÆi çi tabelul Comenzi. Pentru a fi îndeplinitå condiÆia de integritate refe-
renÆialå, nu trebuie så existe nici o comandå în tabelul Comenzi care så nu corespundå
unui client din tabelul ClienÆi.

Salarii Catalog ClienÆi Catalog


produse materiale

Furnizori

AngajaÆi Vânzåri Produse Comenzi Stocuri

Baza de date a companiei


Identificarea Ñi clasificarea unor tipuri de structuri de date 23

Între tabelele bazei de date ale companiei se vor stabili mai multe legåturi. De exemplu,
între tabelul Catalog_produse çi tabelul Produse sau între tabelul Catalog_produse çi
tabelul Vânzåri prin intermediul cheii cod_produs.
Baza de date poate conÆine:
9 Tabele corelate. Sunt tabele între care se stabilesc legåturi. De exemplu, între
tabelele ClienÆi çi Comenzi existå o legåturå realizatå prin intermediul codului clientului
care a emis comanda (cheia cod_client).
9 Tabele necorelate. Sunt tabele între care nu se stabilesc legåturi. De exemplu, între
tabelele Stocuri çi Salarii nu existå nici un fel de legåturå. În acest caz tabelele se
folosesc pentru a separa date diferite între ele.

T est pentru evaluare:

Considerând cå sågeÆile reprezintå o relaÆie între un tabel conducåtor çi un tabel condus,


precizaÆi cheile primare çi cheile secundare care pot fi folosite pentru a realiza legåtura
între tabele (sensul sågeÆii reprezintå legåtura între tabelul conducåtor çi tabelul condus).
Pe baza structurii de câmpuri precizatå pentru fiecare tabel çi pe baza legåturilor stabilite
între tabele, identificaÆi datele redundante din tabele (de exemplu denumirea produsului çi
unitatea de måsurå care apar atât în tabelul Vânzåri,
cât çi în tabelul Produse). EliminaÆi datele redundante.

RelaÆia
Este o legåturå dintre un câmp sau o combinaÆie de câmpuri dintr-un tabel (cheia
primarå) çi câmpurile corespunzåtoare dintr-un alt tabel (cheia secundarå). Existå mai
multe tipuri de relaÆii:
1. Una-la-una (one-to-one). Înseamnå cå o înregistrare din primul tabel este legatå la o
singurå înregistrare din al doilea tabel. Este posibil çi cazul în care o înregistrare din
primul tabel nu este legatå cu nici o înregistrare din al doilea tabel.
Aceastå relaÆie este similarå cu un tabel care conÆine ambele tabele. Se folosesc înså
douå tabele din urmåtoarele motive:
9 Un tabel unic ar fi un tabel foarte Tabelul A Tabelul B
mare, cu o structurå care poate
depåçi numårul maxim de câmpuri a1 b1
acceptat de sistemul de gestiune a
bazelor de date (de exemplu, 255 a2 b2
de câmpuri în Visual FoxPro). a3 b3
9 Numårul de câmpuri din înregis-
a4 b4
trårile tabelului nu sunt fixe (unele
înregistråri au nevoie de mai multe a5
câmpuri decât alte înregistråri).
9 Dacå se lucreazå într-o reÆea de calculatoare, se preferå ca anumite câmpuri din tabel
så se påstreze pe calculatorul local çi nu pe serverul de fiçiere.
9 Un grup de date dintr-un tabel sunt legate de un tabel, iar un alt grup de date din tabel
sunt legate de un alt tabel sau nu sunt legate de nici un tabel.
24 Informatică

9 Asupra unui grup de date din tabel se executå un anumit gen de operaÆii, iar asupra
altui grup de date din tabel se executå alt gen de operaÆii.
De exemplu, relaÆia stabilitå între tabelele Salarii çi AngajaÆi este de una-la-una deoarece
unui angajat îi corespunde un singur salariu, iar un salariu corespunde unui singur angajat.
Legåtura între cele douå tabele se face prin intermediul câmpului cod_angajat. Chiar dacå
cele douå tabele ar putea fi reunite într-unul singur, nu se recomandå acest lucru deoarece
asupra acestor date nu se executå acelaçi gen de operaÆii în cadrul organizaÆiei. Datele din
tabelul AgajaÆi sunt folosite de departamentul Personal atunci când trebuie luate decizii refe-
ritoare la angajaÆii companiei. Acest tabel conÆine datele generale ale fiecårui angajat care
sunt necesare atunci când trebuie promovat, penalizat, disponibilizat sau când trebuie loca-
lizat (adreså, telefon) pentru a i se transmite o anumitå informaÆie. Datele din tabelul Salarii
sunt folosite de departamentul Salarizare atunci când trebuie calculate drepturile salariale ale
fiecårui angajat sau datoriile companiei cåtre bugetul statului çi cåtre asiguråri, legate de
angajaÆii såi. Acest tabel conÆine informaÆii necesare pentru calculul lunar al salariului fiecårui
angajat.
2. Una-la-mai-multe (one-to-many). Tabelul A Tabelul B
Înseamnå cå o înregistrare din pri-
mul tabel poate fi legatå cu mai a1 b1
multe înregistråri din al doilea tabel.
b2
Este cel mai råspândit tip de relaÆie.
Primul tabel trebuie så aibå un câmp b3
cheie primarå, iar al doilea tabel a2 b4
trebuie så conÆinå un câmp similar, prin
care så se poatå identifica înregistrarea
din primul tabel de care este legatå înregistrarea din al doilea tabel. Un exemplu de
relaÆie una la mai multe este cea stabilitå între tabelul ClienÆi çi tabelul Comenzi. Unui
client îi corespund mai multe comenzi, dar o comandå poate fi emiså de cåtre un singur
client. Câmpul cheie folosit pentru legåturå este cod_client.
3. Mai-multe-la-mai-multe (many-to-many). Înseamnå cå o înregistrare din primul tabel
poate fi legatå de mai multe înregistråri din al doilea tabel, çi invers, o înregistrare din
cel de-al doilea tabel poate fi legatå de una sau mai multe înregistråri din primul tabel.
De exemplu, între tabelul Vânzåtori çi
tabelul Produse poate fi stabilitå o rela- Tabelul A Tabelul B
Æie de mai-multe-la-mai-multe: un an-
gajat comercial poate vinde mai multe
a1 b1
produse, iar un produs este vândut de
mai mulÆi angajaÆi comerciali. RelaÆia a2 b2
mai-multe-la-mai-multe poate fi des-
a3 b3
compuså în douå relaÆii una-la-mai-
multe. În acest caz se construieçte un a4 b4
tabel suplimentar care så realizeze
aceastå descompunere. De exemplu, în
baza de date Çcoala pot fi definite un tabel Elevi cu elevii din çcoalå çi un alt tabel Discipline
cu disciplinele predate în çcoalå. Fiecårei înregistråri din tabelul Elevi îi corespund mai multe
înregistråri în tabelul Discipline (un elev studiazå mai multe discipline) çi fiecårei înregistråri
Identificarea Ñi clasificarea unor tipuri de structuri de date 25

din tabelul Discipline îi corespund mai multe înregistråri în tabelul Elevi (o disciplinå este
studiatå de mai mulÆi elevi). Aceastå relaÆie se poate descompune în douå relaÆii una-la-mai-
multe prin crearea unui tabel suplimentar Încadråri care så conÆinå înregistråri cu douå câm-
puri: cod_elev çi cod_disciplinå. RelaÆiile vor fi de una-la-mai-multe între tabelul Elevi çi
tabelul Încadråri (unui elev îi corespund mai multe încadråri, câte una pentru fiecare disciplinå
pe care o studiazå) çi între tabelul Discipline çi tabelul Încadråri (unei discipline îi corespund
mai multe încadråri, câte una pentru fiecare elev care o studiazå).

2.1. Sistemul de Gestiune a Bazelor de Date Relaţionale (SGBDR)


Açadar, modelul relaÆional este caracterizat de:
9 Structuri. Sunt obiecte definite ce conÆin date la care utilizatorul are acces.
9 OperaÆii. Sunt acÆiuni definite care permit utilizatorului så manipuleze datele.
9 Reguli. Sunt legi prin care se stabileçte cine çi cum manipuleazå datele.
Datoritå råspândirii din ce în ce mai mari a bazelor de date relaÆionale pe microcalcula-
toare, majoritatea firmelor producåtoare de seturi software au inclus în acestea çi
sisteme de gestiune a bazelor de date:

Firma Setul software S.G.B.D.


Microsoft Microsoft Office Access
Lotus Lotus SmartSuite Lotus Approach
Corel Corel Suite Office Paradox
Unele firme, cum este Microsoft, produc çi alte SGBD-uri relaÆionale (FoxPro). Toate
aceste sisteme de gestiune a bazelor de date sunt orientate pe microcalculatoare çi
reÆele de microcalculatoare.
Înså cel mai utilizat SGBD relaÆional din întreaga lume råmâne în continuare Oracle
produs de firma Oracle Corporation, deoarece are urmåtoarelor avantaje:
9 Poate fi folosit cu diferite sisteme de operare: Windows pentru microcalculatoarele com-
patibile 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 câÆiva octeÆi pânå
la gigaocteÆi).
9 Respectå standardele în vigoare referitoare la limbajele de accesare a datelor (SQL).
9 Acceptå un numår mare de utilizatori simultani, minimizând conflictele care pot så
aparå în cererile simultane de acces la date.
9 Asigurå o securitate måritå datoritå siguranÆei foarte mari la limitarea çi monitorizarea
accesului la date.

FuncÆiile unui sistem de gestiune a bazelor de date relaÆionale sunt:


9 memorarea, actualizarea (adåugarea, çtergerea çi modificarea) çi regåsirea datelor
din baza de date (utilizatorul poate crea çi manipula datele fårå så cunoascå modul în
care sunt stocate pe mediul de memorare),
9 crearea çi întreÆinerea dicÆionarului de date,
9 asigurarea acesului rapid la datele din colecÆia de date,
9 påstrarea unei copii de siguranÆå a datelor pentru a putea fi recuperate în cazul în care
au loc întreruperi accidentale ale funcÆionårii sistemului,
26 Informatică

9 asigurarea securitåÆii datelor,


9 asigurarea accesului simultan al mai multor utilizatori la o înregistrare din baza de
date (eventual asigurarea accesului concurent),
9 asigurarea integritåÆii datelor (se pot introduce în baza de date numai date valide, iar
operaÆiile de actualizare nu distrug legåturile dintre tabele).
Sistemele de gestiune a bazelor de date relaÆionale vå pot pune la dispoziÆie urmåtoarele
metode prin care så asiguraÆi securitatea bazei de date:
Parolå la nivelul întregii baze de date
Aceastå metodå permite asigurarea securitåÆii la nivelul bazei de date. Este cea mai
simplå metodå de asigurare a securitåÆii çi cel mai rapid de realizat. Se atribuie o singurå
parolå pentru întreaga bazå de date. Orice persoanå care doreçte så foloseascå baza de
date trebuie mai întâi så introducå parola. Dacå parola este corectå, se obÆine 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 numår foarte mic de utilizatori ai bazei de date
(eventual unul singur). Aceçtia 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 securitåÆii la nivelul utilizatorului. Utilizatorii pot
avea drepturi diferite asupra aceleiaçi baze de date prin folosirea schemelor parÆiale. Fie-
care utilizator deÆine propria parolå, care este unicå çi nu are legåturå cu parolele celor-
lalÆi 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 parÆialå la care are acces).
Utilizatorii pot fi organizaÆi 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 aceleaçi
drepturi de a folosi baza de date. Utilizatorul poate så facå parte dintr-un grup sau din
mai multe grupuri. El va moçteni drepturile grupului cel mai puÆin restrictiv din care face
parte. La aceste drepturi se vor adåuga drepturile proprii. Prin aceastå metodå pot fi
personalizate uçor drepturile fiecårui utilizator asupra obiectelor din baza de date.
InformaÆiile despre utilizatori çi grupurile de utilizatori se påstreazå la nivelul bazei de
date, iar drepturile de folosire a obiectelor bazei de date se påstreazå în cadrul tabelelor.
Folosirea grupurilor de utilizatori uçureazå mult munca de asigurare a securitåÆii bazei de
date. Mai întâi se organizeazå drepturile de acces pe grupuri logice çi apoi se ataçeazå
utilizatorii la aceste grupuri. Drepturile unui utilizator pot fi uçor modificate prin simpla mu-
tare a utilizatorului dintr-un grup în altul. De exemplu, pot fi definite trei grupuri de utiliza-
tori ai unei baze de date relaÆionale AngajaÆi: primul grup poate vizualiza çi actualiza (mo-
difica, adåuga, çterge) baza de date, al doilea grup poate doar vizualiza baza de date, iar
al treilea grup poate vizualiza numai anumite câmpuri ale bazei de date (de exemplu,
numai numele çi adresa). Dacå utilizatorul este promovat în funcÆie çi primeçte noi drep-
turi de folosire a bazei de date, el va fi mutat în grupul corespunzåtor acestor drepturi.
Criptarea bazei de date
Primele douå metode se referå la protejarea folosirii bazei de date de cåtre 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 aplicaÆii care pot så citeascå
texte (procesoare de texte, editoare de texte etc.). Singura metodå prin care se poate
împiedica vizualizarea datelor este cea de criptare a datelor.

Elementele folosite de sistemul de gestiune a bazelor de date relaÆionale pentru a-


çi realiza funcÆiile sunt:
DicÆionarul de date (Data Dictionary) conÆine descrierea structurii datelor folosite în baza
de date. El este generat automat la crearea bazei de date çi conÆine informaÆii referitoare
la tabelele bazei de date, la fiçierele ajutåtoare folosite în exploatarea tabelelor çi la mo-
dul în care pot fi localizate pe disc. De obicei aceste informaÆii sunt despre:
9 ce date sunt disponibile,
9 unde sunt localizate datele,
9 descrierea datelor,
9 legåturile 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 limitårile în exploatare generate din necesitatea de a asigura securitatea çi
confidenÆialitatea datelor.
În dicÆionarul de date se gåsesc tabele care conÆin datele bazei de date în formatul intern
al sistemului de gestiune a bazelor de date folosit, precum çi vizualizårile (tabele
virtuale) care sintetizeazå datele din tabelele reale çi prezintå informaÆia într-un format
accesibil utilizatorului. Actualizarea dicÆionarului de date se face folosind limbajul
dicÆionarului de date (Data Dictionary Language). Accesul la dicÆionarul 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 dicÆionarului de date prin
operaÆii 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, uçor de înÆeles çi de
folosit de marea majoritate a utilizatorilor. Deseori el se confundå cu limbajul de mani-
pulare a datelor. El asigurå accesul la datele din baza de date, regåsirea çi afiçarea lor.

Interogarea (query) sau cererea de înregistråri este un proces prin care se extrag din
baza de date çi sunt prezentate în vederea utilizårii acele înregistråri care satisfac
anumite criterii.

Iatå câteva exemple de interogåri ale bazei de date a companiei:


9 Identificarea tuturor clienÆilor dintr-un judeÆ.
9 Afiçarea tuturor comenzilor dintr-o perioadå de timp pentru un anumit produs sau
pentru toate produsele.
9 Afiçarea informaÆiilor despre un client identificat dupå numårul såu de cod sau dupå
numele såu.
28 Informatică

Interogare
Sistemul de
Terminal gestiune a
bazelor de date
9 Stabilirea volumului mediu de co-
menzi într-o perioadå de timp pen-
tru un anumit produs.
9 Stabilirea produsului care a fost
Identificarea DicÆionarul
cel mai bine vândut într-o anumitå
cererii de date de date
perioadå de timp.
9 Afiçarea pentru fiecare produs a
cantitåÆii maxime vândute într-o
anumitå perioadå de timp.
9 Afiçarea listei de materiale care
au stocul 0. Determinarea Limbajul de
9 Afiçarea listei de materiale care locaÆiilor în baza manipulare
sunt sub stocul de siguranÆå de date a datelor
admis pentru a asigura fluxul
producÆiei.

Råspuns
Terminal Baza de date

9 Afiçarea listei cu clienÆii care au comandat produse care nu existå în acest moment în
stoc (numele clientului, numele persoanei de contact çi numårul de telefon).
9 Afiçarea unei liste cu clienÆii care nu au avut comenzi într-o perioadå de timp precizatå.
9 Afiçarea unitåÆilor vândute pentru fiecare produs într-o perioadå de timp.
9 Afiçarea informaÆiilor despre un client identificat dupå numårul såu de cod sau dupå nume.
SQL (Structured Query Language - limbaj structurat de interogare) este cel mai råspân-
dit limbaj de interogare a bazelor de date relaÆionale. Este un limbaj standardizat care a
fost creat special pentru a putea fi folosit la interogarea, actualizarea çi gestionarea baze-
lor de date. InstrucÆiunile SQL descriu operaÆiile relaÆionale între tabele, ca de exemplu
Select, Project çi Join. Limbajul SQL nu opereazå cu datele propriu-zise (variabile de
memorie çi câmpuri) ci cu relaÆiile dintre tabele. Limbajul SQL poate fi folosit împreunå cu
un limbaj gazdå sau în unele cazuri este inclus în limbajul gazdå (cum este de exemplu
limbajul gazdå al sistemului de gestiune a bazelor de date FoxPro). Limbajul SQL este
deosebit de un limbaj procedural (aça cum sunt limbajele Pascal, C, Basic etc.). Limbajul
procedural duce la construirea unor programe prin care i se aratå calculatorului ce
trebuie så facå în conformitate cu algoritmul de rezolvare a problemei, descris prin in-
strucÆiuni (prin care i se spune calculatorului pas cu pas ce trebuie så execute). Pe baza
acestor programe, calculatorul executå instrucÆiune dupå instrucÆiune respectând cele trei
tipuri de structuri de control: secvenÆialå, alternativå çi repetitivå. Limbajul SQL este un
limbaj de rezultate: el îi spune calculatorului ce doreçte utilizatorul så obÆinå çi nu ce
acÆiuni trebuie så efectueze ca så obÆinå acele rezultate. Elementul fundamental al
Identificarea Ñi clasificarea unor tipuri de structuri de date 29

oricårei interogåri SQL este cuvântul cheie Select cu care începe fiecare instrucÆiune
SQL folositå pentru interogarea bazei de date.
De exemplu, sistemul de gestiune a bazelor de date relaÆionale FoxPro are implementat
un limbaj propriu specializat, dar înÆelege çi limbajul SQL.

2.2. Normalizarea unei bazei de date


Cea mai importantå problemå care apare în proiectarea unei aplicaÆii de exploatare a
bazei de date nu o reprezintå aplicaÆia î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 referenÆialå a datelor.
AÆi aflat deja cå, structura bazei de date este definitå de:
9 structura de câmpuri a fiecårui tabel çi de
9 legåturile care se stabilesc între tabele.
Structura de date obÆinutå nu trebuie så conÆinå dependenÆe 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 entitåÆi 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å legåtura între ele. Prin aceastå operaÆie se simplificå o
înregistrare de mari dimensiuni în mai multe tabele legate între ele. Nu trebuie alocate
câmpuri pentru datele derivate sau calculate (cum este de exemplu vârsta unei
persoane, dacå existå deja un câmp în care este înregistratå data naçterii).
Pe de altå parte, dacå o bazå de date relaÆionalå conÆine foarte multe tabele, exploatarea
sa va necesita un timp mai mare de prelucrare, deoarece o interogare a bazei de date va
avea ca efect parcurgerea mai multor tabele. De aceea, procesul de divizare a tabelului
iniÆial în mai multe tabele trebuie så se opreascå la un moment dat.
AÆi våzut cå elementul principal care defineçte o bazå de date este schema tabelelor,
adicå tabelele care fac parte din baza de date: numele tabelului çi structura de câmpuri a
tabelului. Problema proiectårii unei baze de date constå de fapt în modul în care grupåm
datele sub formå de câmpuri în tabele pentru a reuçi så modelåm cât mai eficient colecÆia
de date pentru a putea råspunde întrebårilor formulate în cadrul organizaÆiei. De aceea, în
procesul de proiectare a bazelor de date trebuie avutå în vedere dependenÆa datelor,
adicå legåturile care existå între câmpurile unui tabel sau între câmpurile unor tabele
diferite. DependenÆele cele mai influente sunt dependenÆa funcÆionalå çi dependenÆa
multivaloricå.
DependenÆa funcÆionalå se referå la faptul cå un câmp al unui tabel depinde de un alt
câmp al unui tabel, adicå se spune cå un câmp x depinde funcÆional de un câmp y dacå
çi numai dacå pentru o valoare a câmpului x corespunde o singurå valoare a câmpului y.
De exemplu, în tabela ClienÆi câmpul cod_client este dependent funcÆional de câmpul
adreså_client deoarece fiecårui client al companiei îi corespunde o singurå adreså. O
astfel de constrângere aplicatå bazei de date face înså imposibilå înregistrarea în baza
30 Informatică

de date a unui client care are douå adrese. Prin eliminarea dependenÆelor funcÆionale se
micçoreazå redundanÆa datelor çi anomaliile care pot så aparå atunci când se adaugå çi
se çterg înregistråri sau atunci când se modificå valoarea câmpurilor. Principala cale prin
care se pot elimina dependeÆele funcÆionale din cadrul tabelelor este descompunerea lor
în tabele din ce în ce mai simple.
DependenÆa multivaloricå se referå la faptul cå valoarea unui câmp x poate forma câte
o înregistrare cu toate combinaÆiile posibile ale valorilor câmpurilor y çi z - cu toate
perechile de valori (y,z) din produsul cartezian al mulÆimilor Y çi Z, mulÆimi care specificå
domeniul de definiÆie al câmpurilor y çi z pentru valoarea câmpului x. De exemplu, pentru
obÆinerea unui atestat, o mulÆime Y de elevi trebuie så fie îndrumatå de o mulÆime Z de
profesori, fiind posibilå pentru acelaçi tip de atestat orice combinaÆie de elev-profesor din
cele douå mulÆimi. Tabelul format din cele trei câmpuri: tip_atestat, nume_elev,
nume_profesor conÆine dependenÆe multivalorice. Pentru a elimina anomaliile de
exploatare a unei baze de date, într-un tabel trebuie så existe o singurå dependenÆå
multivaloare, adicå trebuie descompus tabelul astfel încât så fie respectatå aceastå
condiÆie. În acest caz se obÆin trei tabele: Atestat_elevi (conÆine câmpurile tip_atestat,
nume_elev, adicå atribuiri prin care se poate afla ce atestat va susÆine fiecare elev),
Atestat_profesori (conÆine câmpurile tip_atestat, nume_profesor, adicå atribuiri prin care
se poate afla ce atestat poate îndruma fiecare profesor) çi Atestat (conÆine câmpurile
nume_elev, nume_profesor, adicå atribuiri prin care se poate afla ce profesor îndrumå
fiecare elev pentru atestat).
Toate aceste dependenÆe care existå în cadrul unui tabel pot genera diferite anomalii în
timpul executårii operaÆiilor de actualizare a bazei de date, anomalii care sunt generate în
special din cauza redundanÆei datelor. Pentru a evita aceste anomalii trebuie înlocuit
tabelul care le genereazå cu alte tabele în care dependenÆele sunt supuse unor restricÆii.
Formele echivalente astfel obÆinute se numesc forme normale.
Existå cinci niveluri de normalizare: primele trei acÆioneazå asupra dependenÆelor
funcÆionale çi ultimele douå asupra dependenÆelor multivalorice. De obicei baza de date
se gândeçte iniÆial sub forma unui singur tabel, dupå care tabelul respectiv se
normalizeazå trecându-l prin cele cinci forme normale.
Deoarece în proiectarea unei baze de date primele trei forme sunt cele mai des întâlnite,
în continuare vor fi prezentate numai acestea, pentru a înÆelege ce înseamnå procesul de
normalizare a bazei de date.
Prima formå normalå
Aducerea unei baze de date la prima formå normalå înseamnå eliminarea câmpurilor
compuse çi a câmpurilor repetitive.
De exemplu, så consideråm cå tabelul AngajaÆi_tot conÆine, pe lângå informaÆiile generale
despre un angajat, çi informaÆiile necesare pentru a urmåri istoricul evoluÆiei unui angajat în
posturile companiei. Înseamnå cå pentru fiecare angajat trebuie så existe urmåtoarele date:
cod_angajat, nume_prenume, cod_numeric, adreså, telefon, studii, data_naçterii,
data_angajårii, funcÆie1, departament1, data_iniÆalå1, data_finalå1, motiv_schimbare1, func-
Æie2, departament2, data_iniÆalå2, data_finalå2, motiv_schimbare2, funcÆie3, departament3,
data_iniÆalå3, data_finalå3, motiv_schimbare3 etc. Toate aceste date pot furniza informaÆii
particulare despre angajat (data naçterii, codul numeric personal, adresa, telefonul) çi modul
Identificarea Ñi clasificarea unor tipuri de structuri de date 31

în care a evoluat profesional în cadrul companiei (funcÆia, departamentul, data la care a fost
angajat în funcÆie, data la care a fost schimbat din funcÆie çi motivul: promovare, retrogradare
din cauza absenÆelor nemotivate, retrogradare din cauza incompetenÆei etc.). Se observå cå
pentru acelaçi angajat existå mai multe ansambluri de câmpuri (funcÆie, departament,
data_iniÆalå, data_finalå, motiv_schimbare), în cazul în care a ocupat mai multe posturi în
cadrul companiei, câte un ansamblu pentru fiecare post ocupat. Vom numi post acest ansam-
blu de câmpuri. Numårul de repetåri ale ansamblului post pentru un angajat nu poate fi preci-
zat. Unii angajaÆi au ocupat aceeaçi funcÆie de la angajare, alÆii çi-au schimbat funcÆia de cinci
ori. Deci existå mai multe câmpuri compuse post cu aceeaçi semnificaÆie pentru informaÆia pe
care o reprezintå (funcÆie, perioada ocupårii funcÆiei çi motivul schimbårii funcÆiei).

Cod_angajat Nume_prenume Cod_numeric ... Post1 ... Post5

InformaÆii despre fiecare


InformaÆii generale despre salariat. Fiecårui post ocupat de un salariat.
salariat îi corespunde o singurå înregistrare în Ele se repetå de mai multe
tabel. ori într-o înregistrare.

FuncÆie Departament Data_iniÆialå Data_finalå Motiv_schimbare

Cod_ Nume_ Cod_ ... FuncÆie Departament ... Motiv_


angajat prenume numeric schimbare

Fiecare înregistrare conÆine informaÆii generale despre salariat çi informaÆii despre un post
ocupat. Pentru un salariat pot exista mai multe înregistråri, câte una pentru fiecare post
ocupat.

Pentru a elimina câmpurile repetitive dintr-o înregistrare, se va reorganiza structura acestui


tabel într-un nou tabel AngajaÆi astfel: cod_angajat, nume_prenume, cod_numeric, adreså,
telefon, studii, data_naçterii,
data_angajårii, schimbare_
AngajaÆi_tot
funcÆie, funcÆie, departament,
data_iniÆalå, data_finalå, mo-
tiv_schimbare. Folosind o
astfel de structurå, câmpurile
funcÆie, departament, data AngajaÆi
_iniÆalå, data_finalå, motiv_
schimbare nu se vor mai
repeta în cadrul aceleiaçi
înregistråri. Vor apårea înså
AngajaÆii FuncÆii Departamente
mai multe înregistråri pentru
32 Informatică

acelaçi angajat, câte una pentru fiecare schimbare de funcÆie. Câmpul schimbare_funcÆie va
înregistra cronologic a câta schimbare de funcÆie reprezintå înregistrarea.
Se observå cå în tabelul AngajaÆi, pentru funcÆie çi pentru departament existå un singur
câmp care nu poate identifica unic aceste date deoarece sunt dependente de çirul de
caractere introdus de la tastaturå (persoane diferite pot scrie diferit acelaçi nume de
funcÆie sau acelaçi nume de departament). Din aceastå cauzå se atribuie fiecårei funcÆii
un cod numeric unic cod_funcÆie çi fiecårui departament un cod numeric unic
cod_departament. În acest mod câmpurile funcÆie çi departament vor deveni câmpuri
compuse fiecare din câte douå câmpuri elementare. Câmpul compus funcÆie poate fi
descompus în câmpurile elementare cod_funcÆie çi denumire_funcÆie, iar câmpul compus
departament poate fi descompus în câmpurile elementare cod_departament çi
denumire_departament. În acest mod vor apårea douå noi tabele: tabelul FuncÆii care
conÆine câmpurile cod_funcÆie, denumire_funcÆie çi tabelul Departamente care conÆine
câmpurile cod_departament, denumire_departament.
În acest caz tabelul AngajaÆii va fi format din: cod_angajat, nume_prenume,
cod_numeric, adreså, telefon, studii, data_naçterii, data_angajårii, schimbare_funcÆie,
cod_funcÆie, cod_departament, data_iniÆalå, data_finalå, motiv_schimbare. Între tabelul
Angajat çi tabelul FuncÆii va exista o legåturå prin intermediul câmpului cod_funcÆie care
este cheie primarå în tabelul FuncÆii çi cheie secundarå în tabelul Angajat. Între tabelul
AngajaÆi çi tabelul Departamente va exista o legåturå prin intermediul câmpului
cod_departament care este cheie primarå în tabelul Departamente çi cheie secundarå în
tabelul AngajaÆi.

A doua formå normalå


Aducerea unei baze de date la a
doua formå normalå înseamnå cå AngajaÆii
divizarea tabelelor bazei de date
trebuie så continue astfel încât
fiecare tabel obÆinut så nu conÆinå Angajat FuncÆii
dependenÆe funcÆionale parÆiale, angajat
adicå toate câmpurile unui tabel
trebuie så depindå numai de cheia
primarå a tabelului, çi nu de diverse
câmpuri care compun cheia primarå,
adicå fiecare înregistrare a unui FuncÆii Departamente
tabel trebuie så fie identificatå unic
de cheia primarå.
Se observå cå în tabelul AngajaÆii existå pentru acelaçi angajat (codul angajatului fiind
cheia primarå) mai multe înregistråri în cazul în care a ocupat mai multe posturi în cadrul
companiei, câte una pentru fiecare post ocupat. Deci, în mai multe înregistråri se vor
repeta valori ale câmpurilor: cod_angajat, nume_prenume, cod_numeric, adreså, telefon,
studii, data_naçterii, data_angajårii. Valorile câmpurilor care pot diferi de la o înregistrare
la alta pentru aceeaçi valoare a câmpurilor enumerate anterior sunt: schimbare_funcÆie,
cod_funcÆie, cod_departament, data_iniÆalå, data_finalå, motiv_schimbare. Pentru a
elimina câmpurile care nu pot fi identificate unic prin intermediul câmpului 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 conÆine
câmpurile cod_angajat, nume_prenume, cod_numeric, adreså, telefon, studii,
data_naçterii, data_angajårii çi FuncÆii_angajat care conÆine câmpurile cod_angajat,
cod_funcÆie, cod_departament, data_iniÆalå, data_finalå, motiv_schimbare. În tabelul
FuncÆii_angajat cheia primarå (cea care identificå unic o înregistrare) este formatå din
câmpurile cod_angajat, cod_funcÆie çi cod_departament. Acest tabel este legat de mai
multe tabele: Angajat (legåtura între cele douå tabele va fi fåcutå prin câmpul
cod_angajat), FuncÆii (prin cheia cod_funcÆie care este cheie primarå în tabelul FuncÆii çi
cheie secundarå în tabelul Angajat) çi Departamente (prin cheia cod_departament care
este cheie primarå în tabelul Departamente çi cheie secundarå în tabelul Angajat).

Cod_ Nume_ Cod_ ... FuncÆie Departament ... Motiv_


angajat prenume numeric schimbare

Tabelul AngajaÆii va fi descompus în douå tabele.

Tabelul Angajat va conÆine


informaÆii generale despre
angajaÆi. Existå o singurå Cod_ Cod_ Cod_ ... Motiv_
înregistrare pentru fiecare angajat funcÆie departament schimbare
angajat.

Cod_ Nume_ Cod_ ... Tabelul FuncÆii_angajat va conÆine informaÆii


angajat prenume numeric despre posturile ocupate de fiecare angajat.
Pentru fiecare angajat existå atâtea înregistråri.
câte posturi a ocupat în cadrul organizaÆiei.

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 încât fiecare tabel obÆinut så nu conÆinå
dependenÆe funcÆionale tranzitive, adicå un câmp x nu trebuie så depindå de un câmp
y care depinde la rândul såu de un câmp z.
Så analizåm tabelul Vânzåri în care sunt påstrate date despre vânzårile de produse ale
companiei: codul produsului, denumirea produsului, unitatea de måsurå, cantitatea, data
vânzårii, codul angajatului care a intermediat vânzarea, date despre clientul care a
cumpårat produsul, date despre factura prin care s-a încheiat tranzacÆia etc.
Se observå cå pentru acelaçi angajat vânzåtor (adicå acelaçi cod vânzåtor, care este de
fapt codul angajatului, o cheie secundarå cu care se poate lega tabela Salarii de tabela
Angajat unde acest câmp este cheie primarå) pot så existe mai multe facturi. Fiecare
facturå corespunde unui cod de client çi fiecare facturå poate conÆine mai multe produse
vândute de acel angajat. Açadar câmpul cod_produs depinde de câmpul cod_client (cel
cåruia i s-a vândut produsul), care la rândul såu depinde de câmpul cod_vânzåtor (cel
care a vândut produsul).
34 Informatică

În acest caz, documentul ce leagå toate aceste informaÆii este factura care påstreazå
urma tranzacÆiei comerciale. În ea se gåsesc date generale despre tranzacÆie
(numårul_facturii, data_facturii), dar çi date despre angajatul care a negociat tranzacÆia
(denumire_vânzåtor, cod vânzåtor), date despre client (persoana care a cumpårat
produsele, identificatå prin cod_client, denumire_client, cod_fiscal, adreså etc.) çi date
despre fiecare produs vândut (numår_produs_facturå, cod_produs, denumire_produs,
unitate, preÆ_unitar, cantitate, valoare_cantitate1). Se observå cå în cadrul unei facturi,
produsul vândut depinde de clientul care l-a cumpårat (care plåteçte toatå factura), care
la rândul såu depinde de vânzåtorul cu care a negociat achiziÆionarea produselor. Pentru
a elimina aceste dependenÆe funcÆionale tranzitive: produs→ client→ vânzåtor din datele
furnizate de o facturå, vor fi construite mai multe tabele: tabelul Facturå care conÆine date
generale despre facturå (numår_facturå, datå, serie), tabelul Vânzåtor care conÆine date
despre tranzacÆiile efectuate de angajaÆii comerciali ai companiei çi care sunt necesare
pentru salarizarea lor (numår_facturå, cod_angajat_vânzåtor), tabelul Cumpåråtor care
conÆine date pentru identificarea clientului implicat în tranzacÆie (numår_facturå,
cod_client), presupunând cå existå deja tabelul ClienÆi care furnizeazå informaÆii
complete depre fiecare client obiçnuit al companiei (nume, cod fiscal, adreså etc.), tabelul
Produs_vândut care identificå produsul vândut prin facturå çi care conÆine date pentru
identificarea fiecårui produs vândut (numår_facturå, cod_produs, cantitate), presupunând
cå existå deja tabelul Catalog_produse care furnizeazå informaÆii complete despre
fiecare produs vândut de companie (denumire, cod, unitate de måsurå, preÆ unitar etc.).

Facturå
(document)

Factura Vânzåtor Cumpåråtor Produs_vândut

Salarii ClienÆi Catalog_produse

T est pentru evaluare:

ConsideraÆi cå çcoala voastrå este o organizaÆie care trebuie informatizatå, iar colecÆia de
date pe care o veÆi folosi va fi de tipul unei baze de date relaÆionale. Analiza voastrå
trebuie så porneascå de la entitatea Elev. VeÆi identifica toate datele caracteristice unui
elev, atât din punct de vedere al datelor personale (numår matricol, nume çi prenume,
iniÆiala tatålui, datele despre pårinÆi, adresa, numårul de telefon), cât çi din punct de
vedere al situaÆiei çcolare (anul de studiu, clasa, profilul clasei, profesorul diriginte,
profesorul pe care îl are la fiecare disciplinå, disciplinele pe care le studiazå în acest an
çcolar, notele çi absenÆele la fiecare disciplinå, pe fiecare semestru, media la fiecare

1
Pentru a simplifica analiza, s-au eliminat din structura unei facturi toate datele referitoare la TVA.
Identificarea Ñi clasificarea unor tipuri de structuri de date 35

disciplinå obÆinutå semestrial, media anualå la fiecare disciplinå, media semestrialå çi


media anualå a elevului). ConstruiÆi cu aceste date primul tabel. NormalizaÆi tabelul.

T est pentru evaluare:

În urmåtorul exemplu, pentru proiectarea unei baze de date s-a pornit de la lista cu co-
menzile clienÆilor. Trecând prin mai multe forme normale s-au obÆinut tabelele: Comenzi,
ClienÆi, Produse_comandate. IdentificaÆi formele normale prin care a trecut tabelul iniÆial.
Etapa 1. Se construieçte tabelul Total_comenzi care conÆine urmåtoarele câmpuri:
numår_comandå, datå_comandå, nume_client, adreså_client çi 6 câmpuri compuse
produs_comandat. Câmpul compus este format din câmpurile denumire_produs,
unitate_måsurå, cantitate, preÆ_unitar, valoare. Fiecare înregistrare reprezintå o
comandå. Câmpul numår_comandå poate identifica unic o înregistrare.
Etapa 2. Se construieçte tabelul Comenzi care conÆine urmåtoarele câmpuri:
numår_comandå, datå_comandå, nume_client, adreså_client, denumire_produs,
unitate_måsurå, cantitate, preÆ_unitar, valoare. Pentru fiecare comandå vor fi mai multe
înregistråri, câte una pentru fiecare podus din comandå. Câmpul numår_comandå çi
denumire_produs identificå unic o înregistrare.
Etapa 3. Pentru a uçura identificarea unui produs se atribuie acestuia un cod_produs. Se
construieçte tabelul Catalog_produse care conÆine urmåtoarele câmpuri: cod_produs,
denumire_produs, unitate_måsurå, preÆ_unitar. Fiecare produs din catalog va fi identificat
unic prin câmpul cod_produs. În tabelul Comenzi vor råmâne câmpurile:
numår_comandå, datå_comandå, nume_client, adreså_client, cod_produs, cantitate,
valoare. Înregistrårile vor fi identificate unic prin cheia formatå din douå câmpuri
numår_comandå çi cod_produs.
Etapa 4. Din tabelul Comenzi se construiesc douå tabele: tabelul Comanda çi tabelul
Produse. Tabelul Comanda conÆine câmpurile: numår_comandå, datå_comandå,
nume_client, adreså_client, valoare. Pentru fiecare comandå va fi o singurå înregistrare
identificatå unic prin câmpul numår_comandå. Tabelul Produse conÆine câmpurile:
numår_comandå, cod_produs, nume_client, adreså_client, cantitate, valoare. Pentru
fiecare comandå vor exista mai multe înregistråri. Înregistrårile vor fi identificate unic prin
cheia formatå din douå câmpuri: numår_comandå çi cod_produs.
Etapa 5. Din tabelul Comanda se construiesc douå tabele: tabelul Comenzi çi tabelul
ClienÆi. Tabelul Comenzi conÆine câmpurile: numår_comandå, datå_comandå, cod_client,
valoare. Pentru fiecare comandå va fi o singurå înregistrare identificatå unic prin câmpul
numår_comandå. Tabelul ClienÆi conÆine câmpurile: cod_client, nume_client,
adreså_client. Pentru fiecare client va fi o singurå înregistrare. Înregistrårile vor fi
identificate unic prin câmpul: cod_client.
36 Informatică

2.3. Fundamentul matematic al bazelor de date relaţionale


Cele mai multe limbaje folosite pentru interogarea bazelor de date, aça cum este çi
limbajul SQL, derivå din aplicarea operatorilor specializaÆi asupra relaÆiilor dintre tabelele
bazei de date. Aceçti operatori fac parte din algebra relaÆionalå.
Algebra relaÆionalå conÆine pe lângå operatorii de mulÆimi care trateazå tabelele ca pe
mulÆimi de elemente (reuniunea, intersecÆia, diferenÆa, produsul cartezian), fårå så Æinå
cont de relaÆiile dintre ele, çi operatorii relaÆionali specifici care se aplicå asupra
relaÆiilor stabilite între înregistrårile tabelelor legate.
Operatorii relaÆionali specifici sunt:
Ò selecÆia (select),
Ò proiecÆia (project),
Ò cuplarea (join).

1. SelecÆia (Select2). Operatorul se aplicå pe un tabel surså. Rezultatul este un tabel


nou, cu aceeaçi structurå de câmpuri ca çi a tabelului surså, ce conÆine înså numai
acele înregistråri din tabelul surså care îndeplinesc o condiÆie precizatå: au aceeaçi
valoare pentru un anumit câmp.
AngajaÆi
Cod-a Nume_prenume Cod_num Departament FuncÆia
1111 Ionescu Maria 2030361403457 Marketing Casier
1112 Popescu Ion 1020260403456 Marketing Vânzator
1113 Andronescu Ana 2040469402458 Salarizare Casier
1114 Ene Magda 2050570403453 Salarizare Contabil

Nou1 Select from AngajaÆi where cod_num=1020260403456


Cod-a Nume_prenume Cod_num Departament FuncÆia
1112 Popescu Ion 1020260403456 Marketing Vânzator

Nou2 Select from AngajaÆi where departament='Salarizare'


Cod-a Nume_prenume Cod_num Departament FuncÆia
1113 Andronescu Ana 2040469402458 Salarizare Casier
1114 Ene Magda 2050570403453 Salarizare Contabil

Nou3 Select from AngajaÆi where funcÆia='Casier'


Cod-a Nume_prenume Cod_num Departament FuncÆia
1111 Ionescu Maria 2030361403457 Marketing Casier
1113 Andronescu Ana 2040469402458 Salarizare Casier

2
Operatorul relaÆional Select nu trebuie confundat cu comanda SQL Select.
Identificarea Ñi clasificarea unor tipuri de structuri de date 37

De exemplu, putem considera ca tabel surså tabelul AngajaÆi. Prin operaÆia select se pot
crea noi tabele:
9 Tabelul Nou1. ConÆine o singurå înregistrare corespunzåtoare unui angajat care are
un anumit cod numeric personal:
Select from AngajaÆi where Cod_num=1020260403456
9 Tabelul Nou2. ConÆine mai multe înregistråri care corespund angajaÆilor din departa-
mentul Salarizare:
Select from AngajaÆi where Departament='Salarizare'
9 Tabelul Nou3. ConÆine mai multe înregistråri care corespund angajaÆilor care au
funcÆia de casier:
Select from AngajaÆi where FuncÆia='Casier'
2. ProiecÆia (Project). Operatorul se aplicå pe un tabel surså din care creeazå un tabel
nou ce va conÆine numai câmpurile specificate din tabloul surså.

AngajaÆi
Cod-a Nume_prenume Cod_num Departament FuncÆia
1111 Ionescu Maria 2030361403457 Marketing Casier
1112 Popescu Ion 1020260403456 Marketing Vânzator
1113 Andronescu Ana 2040469402458 Salarizare Casier
1114 Ene Magda 2050570403453 Salarizare Contabil

Nou4
Project Nume_prenume, Cod_num from AngajaÆi
Nume_prenume Cod_num
Ionescu Maria 2030361403457
Popescu Ion 1020260403456
Andronescu Ana 2040469402458
Ene Magda 2050570403453

Nou5
Project Nume_prenume, Departament from AngajaÆi
Nume_prenume Departament
Ionescu Maria Marketing
Popescu Ion Marketing
Andronescu Ana Salarizare
Ene Magda Salarizare

De exemplu, putem considera ca tabel surså tabelul AngajaÆi. Prin operaÆia project se
pot crea noi tabele:
9 Tabelul Nou4. ConÆine douå câmpuri: Nume_prenume çi Cod_num:
Project Nume_prenume, Cod_num from AngajaÆi
9 Tabelul Nou5. ConÆine douå câmpuri: Nume_prenume çi Departament:
Project Nume_prenume, Departament from AngajaÆi
3. Compunerea (Join). Operatorul se aplicå pe douå tabele surså din care creeazå un
tabel nou astfel: din produsul cartezian al celor douå tabele se påstreazå numai înre-
gistrårile care îndeplinesc o anumitå condiÆie.
38 Informatică

Exemplu de operaÆie Join

Tabel A Tabel B
Câmpuri → C1 C2 C3 Câmpuri → C4 C5
RA1 1 a x RB1 1 m
RA2 2 b y RB2 2 n
↑ Rândurile tabelului A RB3 3 p
↑ Rândurile tabelului B

Tabel A × B (produs cartezian)


Câmpuri → C1 C2 C3 C4 C5
RA1 1 a x 1 m RB1
RA1 1 a x 2 n RB2
RA1 1 a x 3 p RB3
RA2 2 b y 1 m RB1
RA2 2 b y 2 n RB2
RA2 2 b y 3 p RB3
↑ Rândurile tabelului A Rândurile tabelului B↑

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


Câmpuri → C1 C2 C3 C4 C5
RA1 1 a x 1 m RB1
RA2 2 b y 2 n RB2
↑ Rândurile tabelului A Rândurile tabelului B↑

De exemplu, departamentul Aprovizionare foloseçte urmåtoarele tabele:


9 Tabelul Catalog materiale pentru evidenÆa materialelor cu care se poate face
aprovizionarea. ConÆine câmpurile: cod_material, denumire, unitate_måsurå.
9 Tabelul Intråri pentru evidenÆa materialelor achiziÆionate. ConÆine câmpurile:
cod_material, cantitate_intratå, tip_document, numår_document, data_intrårii.
9 Tabelul Ieçiri pentru evidenÆa materialelor consumate. ConÆine câmpurile:
cod_material, cantitate_ieçitå, tip_document, numår_document, data_ieçirii.
Pentru a obÆine stocul din fiecare material, trebuie calculatå pentru fiecare material
diferenÆa dintre suma cantitåÆilor intrate çi suma cantitåÆilor ieçite. Pentru a putea executa
aceastå operaÆie trebuie compuse cele douå tabele într-unul singur, condiÆia de
compunere fiind egalitatea câmpurilor: intråri. cod_material = ieçiri. cod_material, adicå
Join intråri and ieçiri where intråri. cod_material = ieçiri. cod_material

Operatorii din algebra relaÆionalå pot fi folosiÆi pentru a formula diferite interogåri. De
exemplu, în baza de date a organizaÆiei:
9 Lista cu numele angajaÆilor din toate departamentele care au funcÆia 'casier'. În tabelul
AngajaÆi se executå o operaÆie de selecÆie:
Select from AngajaÆi where FuncÆie='casier'
Identificarea Ñi clasificarea unor tipuri de structuri de date 39

çi se obÆine tabelul Casieri care conÆine toÆi angajaÆii care au funcÆia de casier. Apoi pe
tabelul astfel obÆinut se aplicå operaÆia de proiecÆie:
Project Nume_prenume, Departament from Casieri
çi se obÆine în tabelul Casieri_departamente informaÆia doritå (lista cu numele persoa-
nelor çi departamentul în care lucreazå).
9 Lista cu numele furnizorului, numele çi numårul de telefon al persoanei de contact
pentru materialele care sunt sub stocul de siguranÆå, pentru a se putea comanda
aceste materiale. În tabelul Stocuri se executå o operaÆie de selecÆie:
Select from Stocuri where stoc<=stoc_sig
çi se obÆine tabelul SiguranÆå care conÆine toate materialele care sunt sub stocul de
siguranÆå. Apoi pe tabelul astfel obÆinut se aplicå operaÆia de proiecÆie:
Project cod_material, denumire from SiguranÆå
çi se obÆine tabelul Comenzi_materiale. Se compun tabelele Furnizori çi
Comenzi_materiale cu operaÆia
Join Furnizori and Comenzi_materiale where
furnizori.cod_material = comenzi_materiale. cod_material
çi se obÆine tabelul Comanda. Apoi pe tabelul astfel obÆinut se aplicå operaÆia de proiecÆie
Project denumire, den_furnizor, nume_pers, telefon from Comanda
çi se obÆine tabelul Comanda_furnizori care conÆine denumirea furnizorului, numele
persoanei de contact, numårul de telefon çi denumirea materialului pentru materialele
care sunt sub stocul de siguranÆå. Se poate verifica prin telefon dacå furnizorul poate
primi comanda de livrare pentru materialele care sunt sub stocul de siguranÆå.

T est pentru evaluare:

Pornind de la tabelele A çi B, precizaÆi conÆinutul tabelului C obÆinut ca rezultat al


operaÆiei relaÆionale:
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 1 d

T est pentru evaluare:

Tabelul A conÆine informaÆii generale despre angajaÆi: nume angajat, adreså, numår de
telefon. Tabelul B conÆine informaÆii despre ocuparea posturilor de cåtre angajaÆi: nume
angajat, nume funcÆie, departament, data iniÆialå, data finalå. Ce operaÆii relaÆionale
trebuie så executaÆi ca så obÆineÆi informaÆiile:
a) Ce angajaÆi au ocupat postul X?
b) Ce angajaÆi au lucrat în departamentul X?
c) Ce posturi a ocupat angajatul X çi în ce departamente?
d) Ce adrese au angajaÆii care au ocupat postul X din departamentul Y?
40 Informatică

În afara limbajelor care au la bazå algebra relaÆionalå (care folosesc interogåri exprimate
prin operatori relaÆionali specifici aça cum este limbajul SQL), mai existå çi limbaje care
se bazeazå pe calculul relaÆional (care exprimå interogårile prin intermediul condiÆiilor
pe care trebuie så le îndeplineascå mulÆimea înregistrårilor care corespund cererii). Din
aceastå categorie face parte limbajul QBE (Query By Example - Interogare prin
exemple) care este standardul prin care pot fi formulate interactiv interogårile bazei de
date folosind calculul relaÆional. De obicei limbajul QBE pune la dispoziÆia utilizatorului o
interfaÆå prin intermediul cåreia utilizatorul îçi poate asambla interogarea, incluzând
operatori pentru calculul:
9 sumei valorilor unui câmp din tabel - sum,
9 mediei aritmetice a valorilor unui câmp din tabel - avg,
9 celei mai mari valori a unui câmp din tabel - max,
9 celei mai mici valori a unui câmp din tabel - min,
9 numårului de înregistråri dintr-un tabel - cnt.
În sistemul de gestiune a bazelor de date Visual FoxPro interogårile se pot construi prin
intermediul interfeÆei folosind interogarea prin exemple (QBE). În culise, aceste
comenzi sunt transformate în instrucÆiuni SQL.

# ÎncercaÆi:

A nalizå. Så presupunem cå aveÆi o bazå de date formatå dintr-un tabel A çi o bazå de


date formatå din douå tabele B çi C. Tabelul A conÆine urmåtoarele câmpuri: nume angajat,
funcÆie, departament. Tabelul B conÆine câmpurile nume angajat çi funcÆie, iar tabelul C
câmpurile funcÆie çi departament. ComparaÆi cele douå baze de date. Ele conÆin aceleaçi
categorii de date, dar nu sunt identice din punct de vedere al informaÆiilor pe care le
furnizeazå. AråtaÆi cum råspund cele douå baze de date la urmåtoarele cereri de informaÆii:
a) În ce departament lucreazå angajatul X.
b) Care sunt angajaÆii dintr-un departament.
c) Care sunt angajaÆii cu funcÆia X din departamentul Y.
Ce concluzie trageÆi? ReproiectaÆi cea de-a doua bazå de date astfel încât så poatå
råspunde la aceste întrebåri.

A nalizå. Så presupunem cå aveÆi o bazå de date formatå dintr-un tabel A çi o bazå de


date formatå din douå tabele B çi C. Tabelul A conÆine urmåtoarele câmpuri: nume angajat,
funcÆie, departament, numår de telefon. Tabelul B conÆine câmpurile nume angajat çi
departament, iar tabelul C câmpurile funcÆie çi numår de telefon. ComparaÆi cele douå baze
de date. Ele conÆin aceleaçi categorii de date, dar nu sunt identice din punct de vedere al
informaÆiilor pe care le furnizeazå. AråtaÆi cum råspund cele douå baze de date la
urmåtoarele cereri de informaÆii:
a) Ce numår de telefon are angajatul X.
b) Ce angajat are numårul de telefon Y.
c) Care sunt angajaÆii cu funcÆia X din departamentul Y.
Identificarea Ñi clasificarea unor tipuri de structuri de date 41

Ce concluzie trageÆi? ReproiectaÆi cea de-a doua bazå de date astfel încât så poatå
råspunde la aceste întrebåri.

M iniproiect. Presupunând cå existå o companie care asigurå distribuÆia cåtre


abonaÆi a mai multor publicaÆii, descrieÆi în ce mod vor putea fi reprezentate într-o bazå de
date relaÆionale (tabele çi relaÆii între tabele) urmåtoarele informaÆii referitoare la editori çi
abonaÆi:
a) Existå mai multe edituri. InformaÆiile referitoare la o editurå sunt: nume, adreså,
persoanå de contact, numår de telefon.
b) Fiecare editurå are mai multe publicaÆii. InformaÆiile referitoare la o publicaÆie
sunt: nume, tip publicaÆie, preÆ.
c) Fiecårui abonat i se pot distribui mai multe publicaÆii. InformaÆiile referitoare la un
abonat sunt: nume, adreså, numår de telefon.
AråtaÆi ce condiÆii trebuie îndeplinite pentru a fi asiguratå integritatea referenÆialå a bazei
de date.

M iniproiect. DescrieÆi în ce mod vor putea fi reprezentate într-o bazå de date


relaÆionalå (tabele çi relaÆii între tabele) urmåtoarele informaÆii 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 destinaÆie.
c) Fiecare curså are o anumitå capacitate (numår de locuri) çi foloseçte un anumit
tip de avion.
d) La fiecare curså existå mai mulÆi pasageri care rezervå locuri. Un pasager poate
rezerva mai multe locuri. Pasagerii se identificå dupå nume, iar locurile dupå
numår.
AråtaÆi ce condiÆii trebuie îndeplinite pentru a fi asiguratå integritatea referenÆialå a bazei
de date. VerificaÆi dacå baza de date råspunde la urmåtoarele interogåri (exprimaÆi
interogårile prin cei trei operatori relaÆionali):
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 aparÆin liniei aeriene X.
e) Lista curselor care au destinaÆia X.

M iniproiect. DescrieÆi în ce mod vor putea fi reprezentate într-o bazå de date


relaÆionalå (tabele çi relaÆii între tabele) urmåtoarele informaÆii referitoare la o bibliotecå:
a) Biblioteca este formatå din mai multe cårÆi, care aparÆin 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 apariÆie, preÆ,
cod domeniu.
c) Fiecare cititor se identificå prin: cod cititor, nume, adreså, telefon.
42 Informatică

d) CårÆile pot fi împrumutate de cititori. Pentru fiecare împrumut se Æin urmåtoarele


evidenÆe: cartea împrumutatå, cititorul care a împrumutat-o, data împrumutului,
data la care trebuie så o înapoieze, data la care a înapoiat-o.
AråtaÆi ce condiÆii trebuie îndeplinite pentru a fi asiguratå integritatea referenÆialå a bazei
de date. VerificaÆi dacå baza de date råspunde la urmåtoarele interogåri (exprimaÆi
interogårile prin cei trei operatori relaÆionali):
a) Ce cårÆi a împrumutat cititorul X în perioada D.
b) Lista cu cårÆile care sunt împrumutate la data D.
c) Lista cu cårÆile care aparÆin unui autor X.
d) Lista cu cårÆile din domeniul Y.
e) Lista cu cårÆile din domeniul X apårute la editura Y.
f) Lista cu cårÆile apårute în anul X la editura Y.

M iniproiect. DescrieÆi în ce mod vor putea fi reprezentate într-o bazå de date


relaÆionalå (tabele çi relaÆii între tabele) urmåtoarele informaÆii referitoare la o agenÆie de
turism:
a) AgenÆia organizeazå excursii sau sejururi de mai multe zile la diferite obiective turistice.
b) Obiectivele turistice se identificå prin localitate çi aparÆin unui domeniu de interes.
c) La un obiectiv turistic pot exista mai multe cåi 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) AgenÆia Æine evidenÆa turiçtilor, a excursiilor çi a sejururilor organizate pentru
aceçtia.
AråtaÆi ce condiÆii trebuie îndeplinite pentru a fi asiguratå integritatea referenÆialå a bazei
de date. VerificaÆi dacå baza de date råspunde la urmåtoarele interogåri (exprimaÆi
interogårile prin cei trei operatori relaÆionali):
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 rezervårile fåcute pe o perioadå de timp D la un hotel X.
d) Lista cu turiçtii 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, modificaÆi structura tabelelor din baza de date astfel încât baza de date
så poatå råspunde la aceste întrebåri.

M iniproiect. Baza de date a unei çcoli este formatå din urmåtoarele tabele:
Clase: cod_claså, profil_claså.
Discipline: cod_disciplinå, denumire_disciplinå.
Profesori: cod_profesor, nume_profesor, adreså, telefon.
Elevi: cod_elev, cod_claså, nume_elev, adreså, telefon.
PårinÆi: cod_elev, nume_pårinte, tip_pårinte, telefon.
Note: cod_elev, cod_disciplinå, datå, notå.
AbsenÆe: cod_elev, cod_disciplinå, datå.
Identificarea Ñi clasificarea unor tipuri de structuri de date 43

DiriginÆi: cod_profesor, cod_claså.


Încadrare_discipline: cod_claså, cod_ disciplinå, numår_ore.
Încadrare_profesori: cod_profesor, cod_disciplinå, cod_claså.

Clase Elevi Note AbsenÆe PårinÆi

Discipline Profesori DiriginÆi Încadrare_ Încadrare_


profesori discipline

a) StabiliÆi legåturi între tabele.


b) PrecizaÆi pentru fiecare legåturå tipul relaÆiei.
c) IdentificaÆi pentru fiecare relaÆie cheia primarå çi cheia secundarå.
d) AråtaÆi ce condiÆii trebuie îndeplinite pentru a fi asiguratå integritatea referenÆialå.
e) FormulaÆi zece cereri de interogare a bazei de date.
f) Ce date mai puteÆi adåuga la baza de date pentru a obÆine noi informaÆii?

T est pentru evaluare:

AråtaÆi corespondenÆele:
Prima grupå (1 ÷ 10) vå prezintå mai mulÆi termeni. A doua grupå (a ÷ j) vå prezintå afirmaÆii sau
definiÆii posibile pentru aceçti termeni. LegaÆi corespunzåtor obiectele din prima grupå cu
obiectele din a doua grupå:
1. baza de date 6. administratorul bazei de date
2. înregistrarea 7. sistemul de gestiune a bazelor de date
3. schema 8. relaÆia una-la-mai-multe
4. redundanÆa datelor 9. independenÆa datelor
5. dicÆionarul de date 10. modelul relaÆional de baze de date
a. ConÆine toate informaÆiile despre entitåÆile memorate în baza de date.
b. Cel mai popular model de baze de date folosit pe microcalculatoare.
c. Instrument software care faciliteazå crearea çi întreÆinerea bazelor de date.
d. O persoanå sau un grup de persoane care coordoneazå çi controleazå toate
activitåÆile legate de baza de date a unei organizaÆii.
e. O colecÆie de fiçiere çi înregistråri legate între ele.
f. Unul dintre cele mai mari avantaje ale folosirii bazelor de date.
g. O colecÆie de câmpuri care sunt legate logic.
h. Descrierea întregii colecÆii de date din baza de date.
i. Una dintre proprietåÆile datelor care creeazå deficienÆe mari colecÆiilor de fiçiere de
date.
j. O înregistrare din primul tabel poate fi legatå de mai multe înregistråri din al doilea
tabel.
Adevårat/Fals:
1. Un avantaj al folosirii fiçierelor de date este partajarea datelor între mai mulÆi utilizatori.
2. Un avantaj al folosirii bazelor de date este asigurarea integritåÆii datelor.
3. DicÆionarul de date descrie structura datelor din baza de date.
44 Informatică

4. Administratorul bazei de date asigurå consistenÆa datelor.


5. Administratorul bazei de date asigurå controlul centralizat al datelor.
6. Tabelul virtual (vizualizarea) este modelul datelor cu care opereazå utilizatorul.
7. Çtergerea restricÆionatå înseamnå cå înregistrårile din tabelele conduse vor fi çterse
numai cu acordul utilizatorului.
8. O relaÆie mai-multe-la-mai-multe poate fi descompuså în douå relaÆii una-la-una.
9. Operatorul relaÆional Select se aplicå pe douå tabele pentru a obÆine un tabel nou, cu
înregistrårile din ambele tabele care au aceeaçi valoare a câmpului cheie în ambele
tabele.
10. Limbajul SQL foloseçte interogarea prin exemple.
CompletaÆi:
1. Câmpul care identificå unic o înregistrare din tabel se numeçte …………………,.
2. Baza de date este o colecÆie 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 condiÆia de integritate referenÆialå, mulÆimea valorilor cheii secunda-
re trebuie så fie ....................... mulÆimea 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 numeçte ............................. datelor.
AlegeÆi råspunsurile corecte:
1. Care dintre urmåtoarele entitåÆi sunt caracteristice unei baze de date relaÆionale :
a) tabelul
b) înregistrårile
c) legåturile logice complexe
d) câmpurile
e) structura de reÆea a tabelelor
2. Care dintre urmåtoarele operaÆii creeazå probleme într-un ansamblu de fiçiere de date :
a) actualizarea datelor
b) asigurarea independenÆei datelor faÆå de programe
c) redundanÆa datelor
3. Care dintre urmåtoarele nu sunt componente ale sistemului de gestiune a bazelor de
date:
a) limbajul de manipulare a datelor
b) dicÆionarul de date
c) limbajul de interogare
d) sistemul de gestiune a fiçierelor
e) limbajul de descriere a datelor
f) baza de date
4. DicÆionarul bazei de date nu furnizeazå informaÆii despre:
a) locul în care se gåsesc datele din baza de date
b) dimensiunea spaÆiului de pe disc
Identificarea Ñi clasificarea unor tipuri de structuri de date 45

c) proprietarul unor seturi de date din baza de date


d) modul în care pot fi folosite datele de cåtre utilizatori
e) limitåri pentru a asigura securitatea çi confidenÆialitatea datelor
5. Dacå unele componente ale colecÆiei de date se înregistreazå de mai multe ori pe
suportul de date, redundanÆa datelor:
a) creçte
b) scade
c) nu se modificå
6. Administratorul bazei de date stabilieçte:
a) drepturile de acces ale utilizatorilor la baza de date
b) programele de aplicaÆie folosite pentru baza de date
c) sistemul de gestiune a bazelor de date folosit
d) modificarea structurii bazei de date
7. Utilizatorul bazei de date opereazå cu:
a) tabelele bazei de date
b) colecÆia de fiçiere în care este memoratå baza de date
c) vizualizårile
8. Operatorii relaÆionali Select, Project çi Join se pot folosi în limbajul de tip :
a) SQL
b) QBE
c) gazdå
9. Pentru a extrage într-un tabel nou anumite câmpuri dintr-un tabel surså se foloseçte
operatorul relaÆional :
a) Select
b) Project
c) Join
RåspundeÆi:
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å parÆialå?
3. Ce este un sistem de gestiune a bazelor de date? Care este rolul såu?
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å independenÆa datelor într-o bazå de date?
8. Ce tipuri de limbaje pot fi folosite pentru interogarea unei baze de date relaÆionale?

R åspunsuri:
AråtaÆi corespondenÆele: 1-e; 2-g; 3-h; 4-i; 5-a; 6-d; 7-c; 8-j; 9-f; 10-b.
Adevårat/Fals: 1-F; 2-A; 3-A; 4-F; 5-A; 6-A; 7-F; 8-F; 9-F; 10-F.
CompletaÆi: 1- cheie de identificare; 2-înregistråri, fiçiere; 3- schema parÆialå; 4- condus; 5- legåtura;
6-incluså în; 7-simplificare, divizarea; 8-redundanÆa.
AlegeÆi råspunsurile corecte: 1-a,b,d; 2-b,c; 3-b,d; 4-b; 5-a; 6-a,d; 7-c; 8-a; 9-b.
CondiÆiile sunt:
a) E := alfa <> " " and alfa <> "," and fa <> "."
46 Informatică

3. Tipuri de date folosite de sistemele de gestiune a


bazelor de date relaţionale
În orice sistem de gestiune a bazelor de date sunt implementate urmåtoarele 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 (câmpurile tabelelor care formeazå baza de date). Subtipurile de date
diferå între ele prin modul de stocare a datelor çi prin domeniul de definiÆie al lor. În
continuare, pentru a vå putea crea o imagine asupra varietåÆii de subtipuri de date pe
care le puteÆi întâlni atunci când lucraÆi 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 foloseçte simbolul = :
3
<nume> = <expresie>
De exemplu, n=n+100 înseamnå cå variabilei n i se atribuie valoarea expresiei n+100,
adicå valoarea obÆinutå prin adåugarea numårului 100 la valoarea avutå anterior
operaÆiei de atribuire.

3.1. Tipul numeric


Pentru manipularea informaÆiei numerice (numere reale sau întregi) existå urmåtoarele
subtipuri numerice:
Pentru variabilele de memorie existå un singur tip numeric, reprezentat în memoria
internå pe 8 octeÆi, care permite manipularea numerelor reale cu o precizie de 16 cifre
zecimale.
Pentru câmpuri existå patru subtipuri numerice. Unele subtipuri au lungime fixå, altele
permit modificarea lungimii de cåtre 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 octeÆi, în funcÆie de
declaraÆia utilizatorului. Acesta trebuie så precizeze numårul total de caractere folosite

3
Numele unei variabile de memorie sau al unui câmp.
Identificarea Ñi clasificarea unor tipuri de structuri de date 47

pentru reprezentarea numårului (un caracter pentru semnul minus folosit de numerele
negative, numårul de cifre pentru partea întreagå, numårul de cifre pentru partea zecimalå
çi un caracter pentru punctul folosit ca separator între partea întreagå çi partea zecimalå) çi
numårul de caractere folosite numai pentru partea zecimalå. Deoarece numårul maxim de
octeÆi este 20 (deci numårul maxim de caractere folosite pentru numår este 20), acest
subtip poate fi folosit pentru reprezentarea cu precizie scåzutå a numerelor raÆionale mici.
Subtipul double (dublu) poate fi folosit çi el pentru numerele reale. Reprezentarea
numårului pe suportul de memorare se face în virgulå mobilå, dublå precizie (o metodå
optimå de reprezentare a numerelor reale) çi are o lungime fixå de 8 octeÆi. Acest subtip
poate fi folosit pentru reprezentarea cu precizie måritå (pânå la 15 cifre zecimale) a
4
numerelor reale foarte mari (pânå la ordinul 10308) . Deoarece lungimea sa este fixå,
pentru o bunå gestionare a spaÆiului de memorare nu se recomandå folosirea acestui
subtip pentru numere reale mici cu precizie scåzutå.
Subtipul integer (întreg) poate fi folosit numai pentru numerele întregi. Reprezentarea
numårului pe suportul de memorare se face în binar pe o lungime fixå de 4 octeÆi,
folosindu-se un bit pentru semn çi 31 de biÆi pentru numår. Deoarece 231 - 1 este egal cu
2147483647, domeniul de definiÆie al acestui subtip este [-2147483648, 2147483647].
Subtipul currency (monetar) poate fi folosit pentru memorarea valorilor numerice
exprimate în unitåÆi monetare. Înaintea numårului se introduce simbolul monetar ($).
Poate fi folosit pentru date reale, cu o precizie de maxim 4 cifre zecimale çi cu valori
cuprinse aproximativ în domeniul [-9×1014, 9×1014] . Este specific domeniului contabil,
5

pentru a se preveni erorile de rotunjire. Pentru reprezentarea sa se folosesc 8 octeÆi.


Operatorii matematici care pot fi aplicaÆi pe datele de tip numeric sunt:

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


Pentru operaÆia modulo se mai poate folosi çi funcÆia mod(a,b) care calculeazå restul
împårÆirii lui a la b.
Operatorii relaÆionali care pot fi aplicaÆi 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 informaÆiei alfanumerice (a textelor). Astfel:
Subtipul character (çir de caractere) poate fi folosit atât pentru variabilele de memo-
rie, cât çi pentru câmpuri. Fiecare caracter este reprezentat pe suportul de memorare pe

4
Mai exact, numere din intervalul [-1,79769313486232×10308 ÷ 1,79769313486232×10308]
5
Mai exact, numere din intervalul [-922337203685477,5808 ÷ 922337203685477,5807]
6
Pentru operaÆia modulo prin care se calculeazå restul împårÆirii unui operand de tip numeric
întreg la un al doilea operand de tip numeric întreg.
7
Variante ale operatorului diferit.
48 Informatică

un octet, prin codul såu ASCII. Lungimea maximå a çirului de caractere este 254 de
caractere. Lungimea çirului de caractere dintr-un câmp este fixå pentru întregul tabel çi
poate fi stabilitå de cåtre utilizator pânå la maxim 254 de caractere. Lungimea çirului de
caractere dintr-o variabilå de memorie este variabilå, în funcÆie de valoarea atribuitå datei.
Pentru constanta çir de caractere se pot folosi ambele tipuri de delimitatori: apostrof
('Caracter') çi ghilimele ("Caracter").
Operatorii de concatenare care pot fi aplicaÆi pe datele de tip çir de caractere sunt:

C = {+,-}
Operatorul + se numeçte operator de concatenare simplu, iar operatorul - se nu-
meçte operator de concatenare special. Deosebirea dintre operatorul de concatenare
simplu çi operatorul de concatenare special este aceea cå cel de-al doilea operator mutå
spaÆiile de la sfârçitul primului çir de caractere la sfârçitul çirului de caractere concatenat.
De exemplu:

'Pop ' + ' Ana' = 'Pop Ana'


P o p + A n a = P o p A n a
'Pop ' - ' Ana' = 'Pop Ana '
P o p - A n a = P o p A n a

Operatorii relaÆionali care pot fi aplicaÆi pe datele de tip çir de caractere sunt:

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


Operatorul == (identic) va furniza rezultatul logic adevårat dacå cele douå çiruri de
caractere sunt identice (conÆin exact aceleaçi caractere, inclusiv spaÆiile, în exact aceleaçi
poziÆii). De exemplu, expresia 'abc' == 'abc' are valoarea adevårat, iar expresia
'abc' == 'acb' are valoarea fals. Operatorul = (egal) comparå çirurile caracter cu
caracter, de la stânga la dreapta, pânå când douå caractere comparate nu sunt egale
sau pânå când se ajunge la sfârçitul celui de-al doilea çir. De exemplu, condiÆia
"abc" = "ab" are valoarea adevårat, iar condiÆia "ab" = "abc" are valoarea fals.
Operatorul $ (inclus în) va furniza rezultatul adevårat dacå primul çir de caractere este
conÆinut de cel de-al doilea çir de caractere (primul çir este subçir în al doilea çir). De
exemplu, expresia 'abc' $ 'abcd' are valoarea adevårat, iar expresia 'abc' $ 'acbd' are
valoarea fals.
Subtipul memo poate fi folosit numai pentru câmpuri. Se recomandå pentru câmpurile î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 påstreze informaÆii despre cauzele exmatriculårii
unui elev, aceste informaÆii sunt texte de lungimi diferite, care pot avea çi lungimea 0
pentru elevii care nu au fost exmatriculaÆi. Stabilirea unei lungimi optime pentru astfel de
câmpuri 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 câmpuri a spaÆiului de memorare de pe disc, diferitå de la


un câmp la altul, în funcÆie de necesitåÆile de la un moment dat. Memorarea caracterelor
din fiecare câmp memo se face într-un fiçier asociat tabelului care conÆine câte o înregis-
trare de lungime variabilå asociatå fiecårui câmp memo din tabel. Acest fiçier are exten-
sia .fpt. În tabel, în câmpul memo se påstreazå pe 4 octeÆi doar adresa la care se gåseç-
te înregistrarea asociatå în fiçier. Câmpurile de tip memo nu pot fi câmpuri cheie.

3.3. Tipul logic


Pentru tipul logic nu existå subtipuri. Tipul logic poate fi folosit atât pentru variabile de memo-
rie, cât çi pentru câmpuri. Câmpurile care conÆin date de tip logic nu pot fi câmpuri cheie.
Tipul logic se numeçte logical. El se reprezintå folosind 1 octet de suport de memorie.
MulÆimea constantelor logice este:
L = {.T., .F.};
Operatorii logici care pot fi aplicaÆi 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 aplicaÆiile care gestioneazå un volum mare de date este important så se poatå urmåri
evoluÆia 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, atât pentru variabile de memorie, cât çi pentru câmpuri:
Subtipul date (data calendaristicå) permite memorarea datelor calendaristice cu
precizie de o zi, folosind 8 octeÆi: 4 pentru numårul anului, 2 pentru numårul lunii çi 2
pentru numårul 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 preci-
zeazå astfel: { / / } (câte douå spaÆii pentru fiecare numår). Datele invalide (dacå
numårul zilei sau al lunii nu este corect) sunt considerate date vide.
Operatorii pentru date calendaristice care pot fi aplicaÆi pe datele de tip datå calenda-
risticå sunt:

D = {+, -}
Dacå notåm cu a primul operand, cu b al doilea operand çi cu c rezultatul, aceçti
operatori se aplicå astfel:
50 Informatică

Operator Tip a Tip b Tip c Executå Exemplu


8 9 incrementeazå data din operandul a cu {08/31/01}+1=
++ D Î D
numårul de zile din operandul b {09/01/01}
decrementeazå data din operandul a {08/01/01}-1=
-- D Î D
cu numårul de zile din operandul b {07/31/01}
calculeazå diferenÆa în zile dintre {08/01/01}-
-- D D Î
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å, atât faÆå de data curentå, cât çi faÆå de momentul
zero al sistemului FoxPro care este considerat data de 1 ianuarie 100. Se memoreazå
folosind 8 octeÆi: 4 octeÆi pentru data calendaristicå (memoratå sub formå de întreg care
reprezintå numårul de zile scurse de la momentul zero FoxPro) çi 4 octeÆi pentru timp
(memorat sub formå de întreg care reprezintå numårul de secunde scurse de la miezul
nopÆii).
Ç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 numår format din douå cifre pentru orå: 00≤oo≤12 dacå se foloseçte împårÆirea zilei în
douå perioade AM (antemeridian) çi PM (postmeridian) sau 00≤oo≤24 în caz contrar. mm
este un numår format din douå cifre çi reprezintå numårul de minute (00≤mm≤59), iar ss
este un numår format din douå cifre çi reprezintå numårul de secunde (00≤ss≤59).
Operatorii timp calendaristic ce pot fi aplicaÆi pe datele de tip timp calendaristic sunt:

T = {+, -}
Dacå notåm cu a primul operand, cu b al doilea operand çi cu c rezultatul, aceçti
operatori se aplicå astfel:

Operator Tip a Tip b Tip c Executå Exemplu


11 incrementeazå timpul din {08/31/01 01:01:10 AM}+10
+- T Î T
operandul a cu numårul de ={08/31/01 01:01:20 AM}
secunde din operandul b
decrementeazå timpul din {08/31/01 01:01:10 AM}-5
-- T Î T
operandul a cu numårul de ={08/31/01 01:01:5 AM}
secunde din operandul b
calculeazå diferenÆa în {08/31/01 01:01:15 AM} -
-- T T Î
secunde dintre primul {08/31/01 01:01:10 AM} = 5
operand çi al doilea operand

8
Tip datå calendaristicå.
9
Tip întreg.
10
Parantezele [ ] semnificå faptul cå este opÆional conÆinutul lor.
11
Tip timp calendaristic;
Identificarea Ñi clasificarea unor tipuri de structuri de date 51

3.5. Tipul special


Acest tip de date este folosit numai pentru câmpurile din tabelele bazei de date çi
permite stocarea unor entitåÆi create cu alte aplicaÆii (foi de calcul, imagini grafice,
sunete etc.).
În Visual FoxPro se foloseçte numai tipul general (date generale) care permite
påstrarea în tabelele bazei de date a unor entitåÆi de tip document, foaie de calcul sau
imagine. Aceste entitåÆi 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 aplicaÆie OLE server. Memorarea obiectelor din câmpul general se face într-un fiçier
asociat tabelului. În tabel, în câmpul general se påstreazå pe 4 octeÆi doar adresa la care
se gåseçte obiectul. Câmpurile de tip general nu pot fi câmpuri cheie.

3.6. Proprietăţile câmpurilor bazei de date


AÆi våzut cå într-un câmp al bazei de date pot fi påstrate date elementare. Tipul sau subti-
pul datei elementare stocate determinå tipul câmpului. Un câmp dintr-un tabel al bazei de
date mai are çi alte proprietåÆi pe lângå 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 afiçezå valoarea memoratå în câmp. Pentru fiecare tip sau subtip de datå
existå mai multe formate de afiçare.
Masca de introducere (input mask). Aceastå proprietate controleazå valorile datelor
introduse în câmp. Ea determinå numårul de poziÆii ale câmpului çi, pentru fiecare poziÆie
din câmp, 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
stânga la dreapta (pentru câmpurile aliniate la stânga, cum sunt de exemplu çirurile de
caractere) sau de la dreapta la stânga (pentru câmpurile aliniate la dreapta, cum sunt de
exemplu numerele întregi). O mascå de introducere specialå este masca password care
afiçeazå pe ecran câte un asterisc pentru fiecare caracter introdus.
Eticheta (caption). Aceastå proprietate controleazå titlul afiçat pe ecran pentru câmp.
Valoarea implicitå pentru aceastå proprietate este numele câmpului. Utilizatorul poate
schimba aceastå valoare.
52 Informatică

Valoarea implicitå (default value). Aceastå proprietate controleazå iniÆializarea câmpu-


lui. Prin ea se poate stabili valoarea iniÆialå atribuitå unui câmp la adåugarea unei
înregistråri în tabel. De exemplu, pentru câmpurile de tip datå calendaristicå se poate
stabili ca valoare iniÆialå data curentå, iar pentru câmpurile logice valoarea true.
Regula de validare (validation rule). Aceastå proprietate controleazå valorile datelor
introduse în câmp. Regula de validare se exprimå printr-o condiÆie logicå, ce trebuie så
aibå valoarea true dupå ce se introduce valoarea câmpului. Regula de validare se poate
aplica la nivel de:
9 câmp, çi anume se verificå dacå valoarea introduså pentru câmp se încadreazå
într-un anumit interval de valori sau într-o anumitå mulÆime de valori. Aceastå validare
se declançeazå la introducerea sau modificarea valorii câmpului.
9 înregistrare, çi anume se verificå dacå valoarea introduså pentru câmp respectå anu-
mite corelaÆii cu valorile altor câmpuri din înregistrare. Aceastå validare se declançea-
zå dupå validarea la nivel de câmp, în urma introducerii sau modificårii valorii unui
câmp sau a çtergerii valorii câmpului. Nu se declançeazå dacå se çterge toatå
înregistrarea. În expresia din condiÆia de validare pot fi folosite çi funcÆii de sistem sau
definite de utilizator.
Textul regulii de validare (validation text). Aceastå proprietate controleazå textul afiçat
în cazul în care datele introduse în câmp nu respectå regula de validare (în cazul în care
condiÆia logicå pentru validare are valoarea false dupå introducerea valorii câmpului). De
obicei, prin acest text i se explicå utilizatorului regulile de validare pe care trebuie så le
respecte datele introduse în câmp.
Indexarea (index). Aceastå proprietate controleazå dacå acel câmp 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 înregistrårilor dintr-un
tabel, la exploatarea sau vizualizarea datelor din tabel, fårå så fie afectatå ordinea fizicå
a înregistrårilor din tabel (ordinea în care sunt scrise). Câmpul devine cheie de indexare.
Valoarea nulå (NULL). Aceastå proprietate controleazå dacå în câmp a fost memoratå
sau nu o valoare nulå (NULL). Aceastå proprietate este utilå pentru a putea face
deosebirea dintre un câmp în care utilizatorul nu a introdus date çi un câmp î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å aÆi declarat câmpul telefon numeric, respectiv çir de caractere, valoarea
NULL indicå faptul cå nu se cunosc detalii despre numårul 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 operaÆia de atribuire a=2 s-a creat variabila de memorie a de tip
numeric. Urmåtoarea operaÆie de atribuire a=2=3 schimbå tipul variabilei de memorie a,
deoarece noua valoare atribuitå este de tip logic (rezultatul operaÆiei de comparare 2=3).
Identificarea Ñi clasificarea unor tipuri de structuri de date 53

Adresarea indirectå
Unele comenzi sau funcÆii Visual FoxPro cer så li se furnizeze un nume, cum ar fi:
numele unui fiçier bazå de date, numele unui câmp, numele unui alias, numele unui fiçier
index, numele unei variabile de memorie, numele unui tablou de memorie etc. Folosind
adresarea indirectå, numele poate fi furnizat prin intermediul unei variabile de memorie
sau al unui tablou de memorie, astfel încât så se poatå generaliza comanda.
Pentru adresarea indirectå se poate folosi macrosubstituÆia: se memoreazå numele
într-o variabilå de memorie, dupå care poate fi substituit într-o comandå sau într-o funcÆie
prin numele variabilei de memorie sau al elementului de tablou, precedat de semnul &
(ampersand):
&<nume_variabilå_de memorie>
sau
&<nume_variabilå_de memorie>.<x>
unde <x> este o expresie de tip çir de caractere. În acest caz, çirul de caractere x va fi
concatenat cu numele memorat în variabila de memorie.
Pentru adresarea indirectå se mai poate folosi çi expresia nume: se memoreazå
numele într-o variabilå de memorie dupå care poate fi substituit într-o comandå sau într-o
funcÆie prin numele variabilei de memorie sau al elementului de tablou, închis între
paranteze rotunde:
(<nume_variabilå_de memorie>)

EvaluaÆi expresii
VeÆi evalua mai multe tipuri de expresii folosind aplicaÆia Visual FoxPro. În expresii veÆi
folosi çi variabile de memorie.
DeschideÆi fereastra aplicaÆiei Visual FoxPro. În fereastra aplicaÆiei este deschiså o
fereastrå document care are numele Command. Aceasta este fereastra de comenzi în
care puteÆi så editaÆi diferite comenzi.
Pentru început veÆi scrie diferite comenzi pentru evaluarea unor expresii. Pentru a cere
evaluarea unei expresii veÆi scrie înaintea ei semnul ? care semnificå operaÆia de
afiçare. Rezultatul evaluårii va fi afiçat în spaÆiul liber al ferestrei de aplicaÆie.

1. EvaluaÆi expresia:
a+b b +d a+c
E= + +
c c + a (a + b )3

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


„ VeÆi folosi cinci variabile de memorie a, b, c, d, çi e. AtribuiÆi valori primelor patru
variabile de memorie. ScrieÆi patru operaÆii de atribuire, câte una pe fiecare rând.
TerminaÆi fiecare operaÆie de atribuire apåsând tasta Enter.
54 Informatică

a=1
b=2
c=3
d=4
„ AtribuiÆi variabilei de memorie e valoarea expresiei. ScrieÆi pe un rând operaÆia de
atribuire çi apåsaÆi la sfârçit tasta Enter.
e=(a+b)/c + (b+d)/(c+a)+(a+c)/((a+b)**3)
„ AfiçaÆi valoarea variabilei de memorie e. ScrieÆi pe un rând comanda çi apåsaÆi la
sfârçit tasta Enter:
?e
„ În fereastra aplicaÆiei va fi afiçatå valoarea 2.65.

? ⇒ afiçeazå

Fereastra de comenzi. Aici


scrieÆi comenzile.
Aici se afiçeazå
rezultatul evaluårii.

2. EvaluaÆi urmåtoarele expresii pentru x=2, a=1, b=2 çi c=3


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

3. ComparaÆi douå date calendaris- pentru a=.T. çi b=.T. çi pentru a=.F. çi


tice: 2 ianuarie 2001 cu 1 februarie b=.F.
2001:
a=.T.
? {01/02/01} > {02/01/01} b=.T.
.F. e=a and b or (not a or not b)
?e
4. EvaluaÆi expresia logicå: .T.
e = a and b or (not a or not b) a=.F.
b=.F.
Identificarea Ñi clasificarea unor tipuri de structuri de date 55

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


?e ? a>b
.T. .F.
? a==b
ObservaÆi cå dupå fiecare operaÆie de .F.
atribuire pentru variabilele de memorie a ? a$b
çi b s-a executat o nouå operaÆie de .F.
atribuire pentru expresia e, pentru ca ? b$a
expresia så fie evaluatå cu noile valori .T.
ale variabilelor a çi b. b='abc '
? a<b
5. VerificaÆi dacå valoarea numårului .T.
real x aparÆine mulÆimii A =
(0,10]∪{30} pentru x=50 çi pentru 8. AplicaÆi diferiÆi operatori asupra
x=5. Pentru fiecare valoare veÆi datelor calendaristice. AdåugaÆi 2
testa dacå x aparÆine sau nu la zile la data de 10 februarie 2001 çi
mulÆimea A. Pentru apartenenÆå veÆi obÆineÆi data de 12 februarie 2001,
evalua expresia logicå: scådeÆi 10 zile din data de 1
ianuarie 2001 çi obÆineÆi data de 22
e = (x>0 and x<=10) or x=30 decembrie 2000 çi calculaÆi diferen-
iar pentru a verifica dacå nu aparÆine Æa de zile între datele 1 ianuarie
veÆi evalua expresia logicå not e. 2001 çi 22 decembrie 2000.

x=50 ? {02/10/01}+2
e=(x>0 and x<=10) or x=30 02/12/01
?e ? {01/01/01}-10
.F. 12/22/00
? not e ? {01/01/01}-{12/22/00}
.T. 10
x=5 9. FolosiÆi macrosubstituÆia. MemoraÆi
e=(x>0 and x<=10) or x=30
în variabila a valoarea 1 çi în varia-
?e
bila b numele variabilei a.
.T.
? not e a=1
.F. b=’a’
?b
6. ConcatenaÆi douå çiruri de carac-
a
tere 'Ion ' çi 'Maria ': ?a
a='Ion ' 1
b='Maria ' ? &b
? a + b + '!' 1
Ion Maria !
MacrosubstituÆia &b afiçeazå conÆinutul
? a - b + '!'
variabilei a al cårei nume este memorat
IonMaria !
în variabila b, adicå valoarea 1.
7. ComparaÆi douå çiruri de caractere:
10. FolosiÆi macrosubstituÆia. MemoraÆi
a='123' în variabila a valoarea alfa:
b='12 '
? a<b a=’alfa’
.F. alfa1=’Caldura ’
? a=b alfa2=’mare ’
56 Informatică

alfa3=’monser! ’ Açadar &a.1 înseamnå conÆinutul


? &a.1+&a.2+&a.2 variabilei de memorie alfa1, adicå çirul
Caldura mare monser! de caractere Caldura. În acelaçi mod,
MacrosubstituÆia &a.1+&a.2+&a.3 afi- &a.2 înseamnå conÆinutul variabilei de
çeazå çirul de caractere Caldura mare memorie alfa2, adicå çirul de caractere
monser! Se afiçeazå acest çir de mare, iar &a.3 înseamnå conÆinutul
caractere deoarece &a.1 are urmå- variabilei de memorie alfa3, adicå çirul
toarea semnificaÆie: numele memorat în de caractere monser!. Expresia înseam-
variabila a se concateneazå cu carac- nå de fapt concatenarea acestor trei
terul 1, adicå ‘alfa’+’1’ çi se obÆine çiruri de caractere.
numele de variabilå de memorie alfa1.

# ÎncercaÆi:

Adevårat/Fals:
1. Visual FoxPro acceptå pentru numere întregi subtipul longinteger.
2. Operatorul relaÆional != folosit în Visual FoxPro se numeçte operatorul „diferit“.
3. Operatorul relaÆional $ se foloseçte pentru a verifica dacå valoarea unei expresii este
cuprinså între douå valori v1 çi v2.
4. Subtipul memo poate fi folosit în Visual FoxPro pentru çiruri de caractere care au o
lungime mai mare de 254 de caractere.
5. Subtipul datetime se reprezintå în Visual FoxPro pe 16 octeÆi.
6. Valoarea nulå este o proprietate a câmpului care controleazå dacå într-un câmp nu
s-a introdus nici o datå.
7. Câmpurile care în Visual FoxPro au tipul general pot fi câmpuri cheie.
8. MacrosubstituÆia este o metodå folositå pentru a defini proprietatea unui câmp.
CompletaÆi:
1. Operatorul $ folosit în Visual FoxPro se numeçte ………………… çi se aplicå pe
date de tip .......................................
2. Subtipul Date poate fi folosit pentru a reprezenta date calendaristice cuprinse între
..................... çi ..................
3. Operatorii care pot fi folosiÆi pentru subtipul Datetime sunt: ................
4. În Visual FoxPro constanta de tip datå calendaristicå se delimiteazå folosind
caracterele ........
5. Expresia nume se foloseçte pentru ...........................
AlegeÆi råspunsul corect:
1. Dacå trebuie så memoraÆi într-un câmp al unei baze de date Visual FoxPro media generalå
a unui elev, veÆi alege un câmp numeric cu subtipul:
a) simplu b) dublu c) monetar
2. Dacå folosiÆi subtipul numeric simplu pe 4 octeÆi pentru reprezentarea unui numår întreg
într-o bazå de date Visual FoxPro, valoarea maximå pe care o veÆi putea reprezenta
este:
Identificarea Ñi clasificarea unor tipuri de structuri de date 57

a) 24 -1 b) 9999 c) 2147483646
3. Rezultatul expresiei 3^2*35%5**2 este:
a) 0.00 b) 15.00 c) 3.00
4. Reprezentarea subtipului float folosit pentru câmpurile numerice din Visual FoxPro are
lungimea de:
a) 1 octet b) 20 octeÆi c) cuprinså între 1 octet çi 20 de octeÆi
5. Reprezentarea subtipului integer folosit pentru câmpurile numerice din Visual FoxPro
are lungimea de:
a) 4 octeÆi b) 8 octeÆi c) 16 octeÆi
6. Operatorul folosit în Visual FoxPro pentru operaÆia modulo este :
a) MOD b) \ c) %
7. În Visual FoxPro numårul maxim de caractere dintr-un çir de caractere este:
a) 254 b) 255 c) 256
8. În Visual FoxPro rezultatul evaluårii expresiei 12 + {08/15/01} - {07/15/01} = 43 este:
a) .T. b) .F. c) eroare
9. În Visual FoxPro operatorul ! este un operator:
a) relaÆional b) logic c) de concatenare
RåspundeÆi:
1. Ce subtipuri numerice se folosesc pentru câmpurile din Visual FoxPro?
2. În Visual FoxPro ce operatori relaÆionali se folosesc în plus pentru datele de tip çir de
caractere faÆå de cele de tip numeric?
3. Ce operatori de concatenare se folosesc în Visual FoxPro? Care este deosebirea
dintre ei?
4. Pentru ce tip de date a fost implementat subtipul memo? În ce caz se recomandå
folosirea lui?
5. Ce subtipuri de date se folosesc în Visual FoxPro pentru gestionarea timpului?
6. Pentru ce se foloseçte tipul de date general în Visual FoxPro?
7. Ce este valoarea nulå a unui câmp?
8. Care sunt proprietåÆile câmpurilor dintr-o bazå de date?
9. Ce este regula de validare? La câte niveluri se poate aplica?

R åspunsuri:
Adevårat/Fals: 1-F; 2-A; 3-F; 4-A; 5-F; 6-A; 7-F; 8-F.
CompletaÆi: 1-inclus în, çiruri de caractere; 2-1 ianuarie 100, 31 decembrie 9999; 3-+,-; 4-{ };
5-adresarea indirectå.
AlegeÆi råspunsul corect: 1) a; 2) b; 3) b; 4) c; 5) a; 6) c; 7) a; 8) a; 9) b.
Capitolul 2
Utilizarea unor
instrumente de
prelucrare a datelor
Baza de date relaÆionalå este un instrument
Dupå ce veÆi parcurge acest capitol
complex de organizare a datelor. Ea este forma-
trebuie så çtiÆi:
1.
tå nu numai din datele care reprezintå informaÆia
Så lucraÆi cu interfaÆa unei aplicaÆii
propriu-ziså (datele din tabele), dar çi de multe
specifiå pentru gestiunea bazelor de
date. date ajutåtoare necesare pentru descrierea struc-
2. Så creaÆi o bazå de date definind turii tabelelor çi a relaÆiilor dintre tabele, pentru
tabelele çi relaÆiile dintre ele. regåsirea çi interpretarea datelor, astfel încât så
3. Så executaÆi prin intermediul vå poatå oferi acces la o mare cantitate de infor-
interfeÆei operaÆii specifice gestiunii
maÆii care så vå ajute så luaÆi decizii. Pentru ad-
bazelor de date relaÆionale: actua-
ministrarea ei este necesar un software speci-
lizarea (adåugarea, çtergerea çi alizat numit sistem de gestiune a bazelor de
modificarea înregistrårilor), sortarea,
date. Termenul de bazå de date se referå la mo-
consultarea, cåutarea, sortarea.
delul de organizare a datelor pe suportul de me-
4. Så obÆineÆi informaÆii din baza de
morare, iar termenul de gestiune se referå la
date sub formå de rapoarte, intero-
gåri çi vizualizåri. acÆiunea de stocare çi prelucrare a acestor date.
Deja aÆi putut vedea ce tipuri de date se folosesc
într-un sistem de gestiune a bazelor de date. Acesta a fost primul pas pentru a înÆelege
complexitatea unui sistem de gestiune a bazelor de date.
Orice sistem de gestiune a bazelor de date trebuie så asigure urmåtoarele funcÆii
elementare:
9 definirea bazei de date,
9 actualizarea datelor din baza de date prin:
adåugarea de noi înregistråri,
çtergerea unor înregistråri,
modificarea valorii unor câmpuri din înregistråri;
9 interogarea bazei de date (extragerea informaÆiilor din baza de date).
La aceste funcÆii elementare, pe måsura dezvoltårii sistemelor de gestiune a bazelor de
date s-au mai adåugat çi alte funcÆii, dintre care cele mai importante sunt:
9 generarea formularelor de ecran pentru introducerea datelor,
9 generarea rapoartelor,
Utilizarea unor instrumente de prelucrare a datelor 59

9 noi modalitåÆi 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 deÆinut supremaÆia
mulÆi ani çi au impus un standard în domeniul bazelor de date relaÆionale, astfel încât
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 aplicaÆiilor 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 cumpårat 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 cumpårat 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 veÆi studia
aplicaÆia Visual FoxPro, deoarece este cea mai nouå versiune a sistemului de gestiune a
bazelor de date FoxPro. Termenul visual înseamnå cå aplicaÆia dispune de instrumentele
folosite de programarea vizualå. În aceastå tehnicå de programare, programatorii au la
dispoziÆie programe utilitare care scriu singure secvenÆa de instrucÆiuni necesare pentru
realizarea unor operaÆii. Rolul programatorului se reduce la specificarea unor opÆiuni
(valoarea unor parametri) în cadrul unui dialog interactiv cu programul utilitar.

1. Interfaţa aplicaţiei Visual FoxPro


1.1. Prezentarea sistemului de gestiune a bazelor de date FoxPro
Sistemul de gestiune a bazelor de date FoxPro este cel mai råspândit 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 câÆiva ani
folosind sistemul de gestiune a bazelor de date dBase. S-a consumat mult timp pentru
încårcarea lor çi preluarea datelor elementare într-un nou format de bazå de date
relaÆionalå, cum este FoxPro, se poate face simplu, fårå 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 uçor de depåçit, deoarece înseamnå de fapt
readaptarea la interfaÆa noului sistem de operare.
60 Informatică

9 Permite o adaptare uçoarå la lucrul cu mai mulÆi utilizatori, fårå så necesite imple-
mentarea unei variante speciale pentru lucrul în reÆea.
9 Are implementat conceptul de colecÆie de date definitå ca un depozit cu informaÆii
despre tabele, care permite folosirea numelor lungi pentru tabele çi pentru câmpuri çi
implementarea integritåÆii referenÆiale direct în tabelele bazei de date în loc så fie
descriså în programele de aplicaÆie.
9 Permite comunicarea çi cu alte aplicaÆii folosind mecanisme DDE, cum este de
exemplu, comunicarea cu aplicaÆia Excel. Orice modificare fåcutå într-o foaie de
calcul Excel se va reflecta çi în tabelul bazei de date FoxPro.
9 Are implementat protocolul OLE care permite schimbul de date între aplicaÆii dife-
rite. AplicaÆiile FoxPro sunt aplicaÆii client çi în ele pot fi legate çi încapsulate diferite
obiecte produse de aplicaÆiile server: texte, sunete, imagini, foi de calcul.
9 Permite importul çi exportul diferitelor tipuri de date påstrate în diferite formate de
fiçiere: Access, dBase, Paradox, Oracle, Excel etc.
9 Dispune de un limbaj procedural puternic ce permite descrierea datelor çi a aplica-
Æiilor pe baza modelului programårii structurate, în care orice algoritm de rezolvare a
unei probleme poate fi descris cu ajutorul a trei structuri de control: liniarå, alternativå,
repetitivå.
9 Are implementat pentru interogarea bazei de date, pe lângå limbajul propriu, atât limbajul
de interogare de tip SQL, cât çi limbajul de tip QBE (interogarea prin exemple,
exemplele fiind create interactiv prin diferite obiecte puse la dispoziÆie de interfaÆå). Aceste
limbaje uçureazå folosirea sistemului de cåtre utilizatorii neinformaticieni.
9 Începând cu versiunea 3.0, în limbajul FoxPro este implementat çi modelul programårii
orientate pe obiecte. Dacå în programarea clasicå datele çi programele care le pre-
lucrau erau separate, în programarea orientatå pe obiecte programul este definit ca un
obiect care înglobeazå atât ansamblul de date, cât çi algoritmii care prelucreazå aceste
date. În cadrul algoritmilor se foloseçte în continuare modelul programårii structurate.
9 Limbajul de programare propriu sistemului de gestiune a bazelor de date FoxPro are
implementat çi modelul programårii conduse de evenimente. În cadrul acestui model,
programul este considerat un ansamblu de proceduri care nu se executå într-o ordine
descriså de programator, ci numai atunci când apar în sistem anumite evenimente. Un
exemplu de astfel de eveniment este apåsarea unei combinaÆii de taste, care se poate
produce în orice moment în sistem çi nu la momente determinate de programator.
9 Permite programarea vizualå a aplicaÆiilor. Acest tip de proiectare oferå programatori-
lor posibilitatea de a realiza mai simplu aplicaÆii de exploatare a bazelor de date,
deoarece ei nu mai sunt obligaÆi så precizeze cum trebuie realizatå aplicaÆia (så
descrie algoritmul de rezolvare a problemei), ci ce trebuie så realizeze aplicaÆia.
Pentru aceasta, FoxPro pune la dispoziÆia utilizatorilor diferite instrumente vizuale
numite generatoare sau constructori. Acestea sunt programe care permit
proiectarea interactivå a bazelor de date, a interogårilor, a rapoartelor, a elementelor
de interfaÆå (formulare de introducere a datelor, meniuri, ferestre), a aplicaÆiilor çi a
proiectelor. În plus, utilizatorul poate apela çi la procedurile asistent (wizard) care îl
îndrumå interactiv, pas cu pas în construirea acestor elemente. Elementul va fi realizat
pe baza datelor furnizate de cåtre programator în cadrul dialogului interactiv.
9 Are o vitezå de lucru foarte mare, deoarece foloseçte o tehnologie specialå denumitå
tehnologie Rushmore care reduce timpul de acces la date prin optimizarea interogårilor.
Utilizarea unor instrumente de prelucrare a datelor 61

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 desfåçura çi el în douå moduri:
Ò prin intermediul interfeÆei grafice,
Ò prin intermediul limbajului de comandå.

InterfaÆa graficå
InterfaÆa graficå este de tip MDI (interfaÆå cu mai multe documente), adicå în fereastra
aplicaÆiei pot fi deschise mai multe ferestre document. Ea este compatibilå cu interfaÆa de
tip Microsoft Office (meniurile, barele de instrumente, scurtåturile de la tastaturå).
Fereastra aplicaÆiei prezintå un sistem de meniuri care pun la dispoziÆia utilizatorului
marea majoritate a comenzilor care formeazå limbajul de comandå. În general, opÆiunea
de meniu reprezintå verbul comenzii, iar adverbele sunt precizate prin intermediul
controalelor din caseta de dialog. Comenzile, în funcÆie de modul în care pot acÆiona, sunt
grupate în meniuri. Astfel:
Titlurile meniurilor Barele cu instrumente

Meniul Edit conÆine operaÆiile


pentru editarea textelor, inclusiv a În fereastra Command puteÆi så editaÆi
comenzilor din fereastra document comenzile. Pentru editare puteÆi folosi aceleaçi
Command. tehnici ca çi în cazul editoarelor de texte.
9 File conÆine opÆiuni pentru operaÆii cu fiçiere: creare, deschidere, salvare, tipårire. Mai
conÆine çi opÆiunea pentru închiderea aplicaÆiei Visual FoxPro: Exit.
62 Informatică

9 Edit conÆine opÆiuni pentru editarea textelor: operaÆii de selectare, operaÆii de copiere
(Cut, Copy, Paste), operaÆii de cåutare çi înlocuire (Find çi Replace), inserarea sau
legarea obiectelor.
9 View conÆine opÆiuni pentru modificarea obiectelor afiçate în fereastra aplicaÆiei. Cea
mai importantå opÆiune este Toolbars... care vå permite så alegeÆi barele cu
instrumente care vor fi afiçate.
9 Format conÆine opÆiuni pentru formatarea textelor afiçate în ferestrele document ale
aplicaÆiei (fontul, dimensiunea çi stilul caracterelor, indentarea çi spaÆiul dintre liniile
paragrafelor).
9 Tools conÆine opÆiuni prin care puteÆi alege diferite instrumente: proceduri asistent,
editorul de macrocomenzi, ferestrele pentru depanarea programului (Debug) sau
pentru executarea pas cu pas a programului (Trace).
9 Program conÆine opÆiuni pentru compilarea çi executarea programelor.
9 Window conÆine opÆiuni pentru operaÆii cu ferestrele document: aranjarea ferestrelor
(Arrange All), ascunderea ferestrei active (Hide), çtergerea ferestrei active (Clear),
comutarea între ferestre (Cycle), deschiderea ferestrei de comenzi (Command
Window), deschiderea ferestrei pentru vizualizarea tabelelor din baza de date
deschiså çi a legåturilor dintre tabele (View Window).
9 Help conÆine opÆiuni pentru asigurarea asistenÆei utilizatorului.
Sistemul de meniuri este dependent de context. În funcÆie de operaÆiile care se executå,
mai pot så aparå meniurile:
Titlul meniului Database este afiçat în bara de meniuri numai dacå în fereastra aplicaÆiei
este deschiså o fereastrå document de tip bazå de date în care sunt afiçate tabelele
bazei de date çi relaÆiile dintre ele.
Utilizarea unor instrumente de prelucrare a datelor 63

9 Table conÆine opÆiuni pentru manipularea înregistrårilor din tabel: adåugarea de noi
înregistråri - Append New Record çi Append Records..., marcarea pentru çtergere a
înregistrårilor (çtergerea logicå) - Delete, refacerea înregistrårilor çterse logic - Recall¸
çtergerea fizicå a înregistrårilor marcate pentru çtergere - Remove Deleted Records,
poziÆionarea pe o înregistrare din tabel - Go to Record..., înlocuirea valorilor unor
câmpuri cu alte valori - Replace Field..., actualizarea indexului tabelului pentru a
reflecta situaÆia actualå - Rebuild Indexes etc. Meniul mai conÆine çi opÆiuni pentru
stabilirea proprietåÆilor tabelului (Properties...) çi pentru alegerea fontului, a
dimensiunii çi a stilului caracterelor cu care se afiçeazå datele din tabel (Font...) etc.
9 Database conÆine opÆiuni pentru manipularea tabelelor din baza de date: crearea unui
tabel nou çi adåugarea lui la baza de date - New Table, adåugarea unui tabel la baza
de date - Add Table, crearea unei noi vizualizåri çi adåugarea ei la baza de date -
New Local View, modificarea structurii tabelului selectat din baza de date - Modify,
afiçarea conÆinutului tabelului selectat din baza de date într-o fereastrå de editare -
Browse, înlåturarea unui tabel din baze de date - Remove, actualizarea indexului
tabelului selectat din baza de date - Rebuild Table Indexes, çtergerea fizicå a
înregistrårilor marcate logic pentru çtergere din tabelul selectat din baza de date -
Remove Deleted Records..., editarea relaÆiei selectate dintre douå tabele ale bazei
de date - Edit Relationship...¸ deschiderea ferestrei generatorului pentru integritatea
referenÆialå a bazei de date - Referential Integrity... etc.

Titlul meniului Table este afiçat în bara de meniuri numai dacå în fereastra aplicaÆiei
este deschiså o fereastrå document de tip tabel al bazei de date.
64 Informatică

Bara de stare furnizeazå informaÆii despre obiectul focalizat (titlu de meniu, opÆiune de
meniu, buton din bara cu instrumente etc.), despre programul care se executå (numele
programului) sau despre tabelul bazei de date selectat. În acest ultim caz, furnizeazå
informaÆii despre identificatorul tabelului (<nume_bazå_date> ! <nume tabel>) çi aliasul
tabelului, despre numårul înregistrårii curente x din numårul total de înregistråri y. Afiçarea
se face sub forma <x>/<y>. Aceste informaÆii sunt afiçate în partea stângå a barei de stare:

Identificatorul tabelului çi al bazei


Numårul înregistrårii curente çi numårul
de date din care face parte
total de înregistråri din tabel
În partea dreaptå a barei de stare sunt afiçate informaÆii despre tastele
comutator Insert (OVR), Num Lock (NUM) çi Caps Lock (CAPS).
Dacå numele lor este afiçat (ca în exemplu), înseamnå cå sunt activate.
La fel ca la orice aplicaÆie Microsoft, utilizatorul mai are la dispoziÆie çi meniul contextu-
lui sau meniul de comenzi rapide care se deschide atunci când executaÆi clic cu
butonul din dreapta al mouse-ului pe un obiect din fereastrå. OpÆiunile din acest meniu
depind de context (de obiectul indicat cu mouse-ul).
Ferestrele document care pot fi deschise în fereastra aplicaÆiei Visual FoxPro sunt:

Obiectul indicat cu mouse-ul a


fost spaÆiul liber al ferestrei
generatorului de bazå de date.
Meniul contextului conÆine
opÆiuni care se referå la baza de
date.

Obiectul indicat cu mouse-ul a


fost un tabel al bazei de date.
Meniul contextului conÆine
opÆiuni care se referå la tabel.

9 Fereastra Command. Se foloseçte pentru editarea comenzilor.


9 Fereastra View. Se foloseçte la vizualizarea tabelelor bazei de date deschise, a rela-
Æiilor 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 modi-


ficarea diferitelor elemente Visual FoxPro: baze de date (Database Designer), tabele
ale bazei de date çi indecçi (Table Designer), vizualizåri (View Designer), interogåri
(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
colecÆie de fiçiere, date, documente çi obiecte Visual FoxPro folosite de o aplicaÆie.
9 Fereastra pentru editarea fiçierelor cu texte, a fiçierelor de programe çi a câmpurilor
memo. Numele ferestrei va fi numele fiçierului, iar în cazul câmpului memo numele va
fi format din numele tabelului çi numele câmpului memo, separate prin punct.
9 Fereastra pentru editarea unui tabel. Poate så fie de tip Browse când sunt afiçate mai
multe înregistråri din tabel, câte o înregistrare pe fiecare rând sau de tip Edit când
este afiçatå o singurå înregistrare, câte un câmp pe fiecare rând. Numele ferestrei
este numele tabelului.
9 Fereastra Debug. Se foloseçte pentru depanarea programelor.
9 Fereastra Trace. Se foloseçte pentru executarea pas cu pas a unui program.
Deschiderea unei ferestre document se face automat la alegerea unei opÆiuni de meniu sau
printr-o comandå. OperaÆiile cu ferestrele document (redimensionarea, minimizarea,
maximizarea, mutarea, defilarea conÆinutului) se executå la fel ca la orice aplicaÆie Microsoft
Office. Pentru operaÆia de ascundere a unei ferestre alegeÆi opÆiunea Hide∈ Window.
Barele cu instrumente grupeazå dupå funcÆii butoanele scurtåturi pentru opÆiunile din
meniuri. Bara standard conÆine aceleaçi butoane ca orice barå standard din aplicaÆiiile
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 opÆiuni, liste, casete combinate, grile etc.

Limbajul de comandå
Comenzile vor fi editate în fereastra Command. Fiecare comandå se scrie pe un rând.
Terminarea unei comenzi se marcheazå prin acÆionarea tastei Enter. AcÆionarea acestei
taste semnificå faptul cå interpretorul de comenzi poate prelua aceastå comandå så o
analizeze, så o decodifice çi så o lanseze în execuÆie.
Comanda este o succesiune de caractere organizate conform sintaxei limbajului, prin
care i se cere calculatorului så execute o acÆiune. Sintaxa se referå la structura liniei de
comandå. Linia de comandå are urmåtoarea sintaxå:
verb listå adverbe Enter

defineçte acÆiunea precizeazå modul în care se executå


acÆiunea comandatå de verb
ObservaÆii:
1. Cuvintele comenzii (verbe çi adverbe) se separå prin spaÆiu.
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 combinaÆie de astfel
de litere.
4. Verbul comenzii poate fi prescurtat la primele patru caractere ale cuvântului.
5. Comanda trebuie scriså pe un singur rând. Dacå vreÆi så o scrieÆi pe mai multe
rânduri, înainte de acÆionarea tastei Enter (care semnificå terminarea comenzii),
trebuie så scrieÆi caracterul ; . PrezenÆa lui înseamnå cå prin acÆionarea tastei Enter
comanda nu se terminå, ci se continuå pe rândul urmåtor.
6. Lungimea maximå a unei linii de comandå este de 1024 caractere.
7. Adverbele pot fi:
9 nume de câmpuri, nume de variabile de memorie, nume de fiçiere, aliasuri, expresii.
9 o listå - reprezintå un grup de elemente asemånåtoare (nume de câmpuri, nume
de variabile de memorie etc.). Separarea lor în listå se face prin virgulå.
9 un domeniu (scope) - reprezintå un grup de înregistråri dintr-un tabel.
Domeniul poate fi precizat prin:
a. cuvinte cheie:
Record <n> - înregistrarea cu numårul n,
Next <n> - urmåtoarele n înregistråri, începând cu înregistrarea curentå,
All - toate înregistrårile,
Rest - toate înregistrårile pânå la sfârçitul tabelului începând cu înregistrarea curentå.
b. clauze (precizeazå un anumit tip de acÆiune):
For <x> - numai înregistrårile care satisfac condiÆia precizatå prin expresia logicå
x, începând cu prima înregistrare a tabelului.
While <x> - toatå secvenÆa de înregistråri care urmeazå înregistrårii curente pentru
care expresia logicå x este adevåratå, pânå la prima înregistrare pentru care
expresia nu este adevåratå.
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 fiçiere, al cåror nume corespunde çablonului.
Comanda va acÆiona asupra tuturor (All), numai asupra celor care corespund
çablonului (Like) sau numai asupra celor care nu corespund çablonului (Except).
To … - controleazå ieçirea unei comenzi, redirecÆionând-o faÆå de ieçirea standard
(care este ecranul). Ieçirea poate fi:
un fiçier: File <nume_fiçier>
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 fiçier; prezenÆa acestei
clauze precizeazå cå datele vor fi adåugate la fiçier (scrise la sfârçitul fiçierului), iar
absenÆa clauzei precizeazå cå datele vor fi scrise la începutul fiçierului (vechile
date din fiçier 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 înregistrårilor.
BOF
While <x>

înregistrarea
nu
curentå
Not EOF
sfârçit

da

nu da
Not EOF nu x=.T.
and
x=.T. sfârçit

da comanda care acÆioneazå


asupra înregistrårii
comanda care acÆioneazå
asupra înregistrårii

salt la urmåtoarea înregistrare salt la urmåtoarea înregistrare

De exemplu, linia de comandå:


Display next 30 adresa for nume=’Popescu’
conÆine verbul display (afiçeazå) çi adverbele care precizeazå ce înregistråri çi câmpuri
vor fi afiçate din tabel. Lista de adverbe conÆine trei adverbe:
next 30 - un adverb prin care se precizeazå domeniul înregistrårilor care vor fi afiçate:
urmåtoarele 30 de înregistråri începând cu înregistrarea curentå;
adresa - un adverb nume de câmp care precizeazå ce câmpuri se vor afiça din
înregistråri;
for nume=’Popescu’ - un adverb precizat printr-o clauzå care defineçte domeniul
înregistrårilor: toate înregistrårile pentru care valoarea câmpului nume este ‘Popescu’.

1.2.2. Modul de lucru programat


Comenzile sunt memorate în fiçiere de comenzi speciale de tip program executabil care
pot fi încårcate în memorie çi lansate în execuÆie.
În loc så se scrie comenzile în fereastra de comenzi una câte una çi så se cearå de fiecare
datå execuÆia lor, se vor scrie într-un fiçier de comenzi. Fiçierul 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 înregistrårilor.
BOF
While <x>

înregistrarea
nu
curentå
Not EOF
sfârçit

da

nu da
Not EOF nu x=.T.
and
x=.T. sfârçit

da comanda care acÆioneazå


asupra înregistrårii
comanda care acÆioneazå
asupra înregistrårii

salt la urmåtoarea înregistrare salt la urmåtoarea înregistrare

De exemplu, linia de comandå:


Display next 30 adresa for nume=’Popescu’
conÆine verbul display (afiçeazå) çi adverbele care precizeazå ce înregistråri çi câmpuri
vor fi afiçate din tabel. Lista de adverbe conÆine trei adverbe:
next 30 - un adverb prin care se precizeazå domeniul înregistrårilor care vor fi afiçate:
urmåtoarele 30 de înregistråri începând cu înregistrarea curentå;
adresa - un adverb nume de câmp care precizeazå ce câmpuri se vor afiça din
înregistråri;
for nume=’Popescu’ - un adverb precizat printr-o clauzå care defineçte domeniul
înregistrårilor: toate înregistrårile pentru care valoarea câmpului nume este ‘Popescu’.

1.2.2. Modul de lucru programat


Comenzile sunt memorate în fiçiere de comenzi speciale de tip program executabil care
pot fi încårcate în memorie çi lansate în execuÆie.
În loc så se scrie comenzile în fereastra de comenzi una câte una çi så se cearå de fiecare
datå execuÆia lor, se vor scrie într-un fiçier de comenzi. Fiçierul de comenzi are extensia .prg.
Printr-o singurå comandå se va cere executarea programului, adicå a grupului de comenzi
68 Informatică

memorat în fiçier. În plus, de fiecare datå când se doreçte executarea acelor comenzi, ele nu
vor mai fi scrise, ci lansate direct în execuÆie din fiçierul de comenzi.
Pentru crearea unui fiçier de comenzi se deschide fereastra editorului de texte folosind
comanda:
Modify command <nume_fiçier>
În fereastra de editare veÆi scrie comenzile, câte una pe fiecare rând, aça cum le scriaÆi çi
în fereastra de comenzi. OperaÆiile pentru editare (selectare, copiere sau mutare text se-
lectat, cåutare sau cåutare cu înlocuire a unui çir de caractere, anularea ultimei operaÆii)
sunt operaÆiile obiçnuite ale unui editor de texte Windows. Comenzile pentru aceste
operaÆii se gåsesc sub formå de opÆiuni în meniul Edit. Dupå ce aÆi scris comenzile,
salvaÆi fiçierul cu opÆiunea Save∈File. Pentru închiderea ferestrei de editare puteÆi folosi
scurtåturile: Ctrl+W pentru închiderea cu salvare sau Esc pentru închiderea fårå salvare.
LansaÆi în execuÆie programul cu comanda:
Do <nume_fiçier>

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 foloseçte 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 (afiçarea pe ecran a ceasului) care poate fi activat
(on), dezactivat (off) sau poate fi afiçat în bara de stare (status). Implicit este off.
Set Status Bar On|Off
Controleazå parametrul Status Bar (afiçarea 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 (afiçarea 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 foloseçte pentru parametrii care pot lua o valoare dintr-un domeniu de
mai multe valori. Ei vor fi precizaÆi prin valoare. De exemplu:
Set Default to <cale_director>
Schimbå directorul curent în cel precizat prin <cale_director>.
Set Clock to [<x>,<y>]
Controleazå parametrul Clock care reprezintå poziÆia afiçårii ceasului pe ecran. Ea
poate fi precizatå prin coordonatele <x> - numårul rândului çi <y> - numårul coloa-
nei. PoziÆia implicitå de afiçare este colÆul din dreapta sus al spaÆiului de lucru din
fereastra de aplicaÆie Visual FoxPro.
Set Hours to [12/24]
Controleazå parametrul Hours care reprezintå formatul de afiçare al orei. El poate
considera ziua ca fiind formatå din douå grupe de 12 ore (cu precizarea am sau
pm) sau dintr-un grup de 24 de ore. Valoarea implicitå este 12.
Set Path to <listå_cåi_director>
Permite stabilirea unei liste de cåutare; aceastå listå conÆine mai multe cåi de
director în care se va cåuta fiçierul precizat în comandå, dacå nu va fi gåsit în
directorul curent.
Pentru a vizualiza starea parametrilor care pot fi stabiliÆi prin comenzi Set, folosiÆi comanda:
Display status
ObÆineÆi informaÆii despre starea unui parametru care poate fi stabilit prin comenzi Set
folosind funcÆia:
Set (<nume parametru>[,1|2])
Numele parametrului se scrie ca un çir de caractere. Dacå numele parametrului este folosit
cu ambele forme ale comenzii Set (cum este de exemplu parametrul Clock), el reprezintå doi
parametri cu semnificaÆie diferitå. În acest caz se foloseçte 1 sau 2 pentru a afla informaÆii
despre fiecare parametru.

1.3.2. Configurarea mediului pentru diferite tipuri de date


Folosind comenzile Set puteÆi configura mediul Visual FoxPro pentru diferite tipuri de
date. De exemplu, pentru:
Tipul numeric. PuteÆi folosi comenzile:
Set Decimals to [<x>]
Stabileçte numårul minim de zecimale afiçate. Numårul 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
Stabileçte dacå numårul de poziÆii zecimale afiçate este controlat sau nu. Dacå are
valoarea off, numårul de poziÆii afiçate nu este controlat (depinde de valoarea nu-
mericå afiçatå). Dacå are valoarea on, numårul de poziÆii afiçate poate fi controlat
cu comanda Set decimals to. Valoarea implicitå a acestui parametru este off.
Set Point to [<x>]
Stabileçte prin expresia de tip çir de caractere <x> care va fi delimitatorul folosit între
partea întreagå çi partea fracÆionarå a unui numår. Valoarea implicitå este punctul.
70 Informatică

Tipul çir de caractere. PuteÆi folosi comanda:


Set Exact On|Off
Controleazå modul în care se executå operaÆia de comparare a douå çiruri. Dacå
are valoarea on, douå çiruri pentru a fi egale trebuie så aibå aceeaçi lungime çi så
fie identice la nivelul fiecårei poziÆii a caracterelor. Dacå are valoarea off, çirurile
pot avea lungimi diferite. Ele vor fi egale numai dacå se potrivesc pânå când se
terminå çirul din dreapta. Valoarea implicitå este on.

1.3.3. Redirectarea ieçirii în mediul Visual FoxPro


PuteÆi folosi comenzile Set çi pentru redirectarea ieçirilor comenzilor. Ieçirea standard
este ecranul. De exemplu, prin comanda ? datele de ieçire vor fi afiçate pe ecran. Datele
de ieçire pot fi redirectate cåtre un alt echipament: imprimantå sau fiçier pe disc.
Set Console On|Off
Controleazå ieçirea cåtre ecran. Dacå are valoarea on, datele de ieçire vor fi
afiçate pe ecran, altfel va fi inhibatå afiçarea lor. Dacå aÆi inhibat afiçarea pe ecran,
puteÆi så redirectaÆi ieçirea cåtre imprimantå sau cåtre un fiçier pe disc folosind
comanda Set Printer. Valoarea implicitå este on.
Set Printer On|Off
Controleazå redirectarea ieçirii cåtre imprimantå. Dacå are valoarea on, permite
ieçirea la imprimantå, altfel aceastå ieçire este inhibatå. Valoarea implicitå a
acestui parametru este off.
Set Printer to [<nume_fiçier>[additive]]
Redirecteazå ieçirea cåtre un fiçier specificat prin <nume_fiçier>. Dacå nu se pre-
cizeazå parametrul, ieçirea va fi implicit cåtre dispozitivul folosit pentru tipårire.

1.3.4. Configurarea interactivå a mediului Visual FoxPro


Pentru a configura interactiv (prin intermediul interfeÆei) mediul de lucru Visual FoxPro,
deschideÆi caseta de dialog Options cu opÆiunea Options...∈Tools.
Caseta conÆine mai multe secÆiuni:
9 Data pentru parametrii care stabilesc modul în care se controleazå datele din tabele,
9 View pentru parametrii care stabilesc obiectele afiçate în fereastra aplicaÆiei: bara de
stare, ceasul, rezultatul comenzilor, mesajele sistemului etc.
9 General pentru parametrii generali ai mediului care stabilesc caracteristicile sunetului,
ale interfeÆei 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å fiçierele,
9 File Locations pentru parametrii care furnizeazå informaÆii pentru localizarea
fiçierelor folosite de Visual FoxPro (calea de director çi numele fiçierului),
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 fişierelor în Visual FoxPro


Sistemul de gestiune a bazelor de date creeazå mai multe fiçiere: fiçierele care conÆin tabele
ale bazelor de date .dbf, fiçierele care conÆin bazele de date .dbc, fiçierele de comenzi .prg,
fiçierele care conÆin câmpurile memo .fpt, fiçierele care conÆin indecçii .idx çi .cdx.
Gestionarea acestor fiçiere (copiere, mutare, redenumire etc.) implicå închiderea aplica-
Æiei çi revenirea la interfaÆa sistemului de operare. Pentru a se evita aceste operaÆii, sis-
temul de gestiune a bazelor de date Visual FoxPro pune la dispoziÆia utilizatorilor
comenzi pentru gestionarea fiçierelor. Aceste comenzi sunt:
a. copierea unui fiçier:
Copy file <nume1> to <nume2>
unde <nume1> reprezintå numele fiçierului surså (numele fiçierului care se copiazå), iar
<nume2> reprezintå numele fiçierului destinaÆie (numele sub care se face copierea).
b. redenumirea unui fiçier:
Rename <nume1> to <nume2>
unde <nume1> reprezintå numele iniÆial al fiçierului, iar <nume2> reprezintå noul nume al
fiçierului.
c. çtergerea unui fiçier:
Erase <nume> sau
Delete file <nume>
unde <nume> reprezintå numele fiçierului care se çterge.
d. afiçarea conÆinutului unui fiçier cu text:
Type <nume1> [to printer | to file <nume2>]
unde <nume1> reprezintå numele fiçierului cu text al cårui conÆinut se afiçeazå implicit pe
ecran, dar poate fi redirectat cåtre imprimantå (to printer) sau într-un alt fiçier cu numele
<nume2> (to file <nume2>).
e. afiçarea conÆinutului unui director:
Dir [on] [<disc>] [<dir>] [<çablon>] [to printer | to file <nume>]
Se afiçeazå conÆinutul directorului care se gåseçte pe unitatea de disc <disc> çi care
poate fi identificat prin calea de director <dir>. Prin <çablon> se poate preciza grupul de
fiçiere care va fi inventariat (de exemplu *.prg este un çablon prin care se precizeazå cå
vor fi inventariate numai fiçierele de comenzi). Afiçarea se face implicit pe ecran, dar poate fi
redirectatå cåtre imprimantå (to printer) sau într-un alt fiçier 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>]
PuteÆi så administraÆi interactiv fiçierele prin intermediul casetei de dialog Filer pe care o
deschideÆi cu comanda:
Filer
72 Informatică

1.5. Asistenţa utilizatorului în Visual FoxPro


ÇtiÆi deja cå autodocumentarea înseamnå o facilitate puså la dispoziÆie de aplicaÆie pentru
a furniza utilizatorului explicaÆii despre modul în care poate folosi interfaÆa, despre comenzi,
despre diferite operaÆii pe care le poate executa. Autodocumentarea se mai numeçte çi
help. Visual FoxPro pune la dispoziÆia utilizatorului ambele tipuri de autodocumentare:
Help dependent de context
InformaÆiile afiçate depind de contextul în care au fost cerute, adicå se apeleazå funcÆia
help în timpul executårii unei operaÆii, iar informaÆiile se referå strict la operaÆia respectivå.
În general, funcÆia Help existå în marea majoritate a casetelor de dialog çi a ferestrelor
document. Apelarea ei se face prin apåsarea tastei F1. În cazul casetelor de dialog mai
puteÆi folosi çi butonul declançator Help sau butonul ? din bara de titlu a casetei.
Mai puteÆi så cereÆi informaÆii despre o comandå sau o funcÆie precizatå prin <nume>
folosind comanda Help care are sintaxa:
Help <nume>
De exemplu, comada Help str() cere så se afiçeze informaÆii depre funcÆia str(). AplicaÆia
afiçeazå caseta de dialog Help Topics la secÆiunea Index.
Help independent de context
Se afiçeazå o listå cu nume de subiecte (topic) çi diverse mecanisme de cåutare rapidå
printre aceste subiecte. Fereastra aplicaÆiei Help se deschide cu opÆiunea Contents∈
Help. Meniurile aplicaÆiei Help sunt:
9 File conÆine opÆiuni pentru operaÆii cu fiçiere de tip Help (deschidere, tipårire).
9 Edit conÆine opÆiuni pentru copierea textului selectat din fereastra Help çi pentru adminis-
trarea comentariilor (adåugare, çtergere, modificare). Comentariul (annotation) este un
text suplimentar pe care utilizatorul poate så-l adauge la textul unui subiect din Help.
9 Bookmark conÆine opÆiuni 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 conÆine opÆiuni pentru stabilirea modului de afiçare în fereastra aplicaÆiei
Help: dimensiunea caracterelor, dacå se foloseçte sau nu sistemul de culori, dacå la
revenirea în aplicaÆie fårå închiderea ferestrei Help, aceasta råmâne deschiså
deasupra sau sub fereastra aplicaÆiei etc.
Butoanele declançatoare sunt:
9 Contents deschide caseta de dialog în care este afiçat conÆinutul unui subiect.
9 Print tipåreçte subiectul la imprimantå.
9 Search deschide o casetå de dialog care conÆine controale ce vå permit så localizaÆi
rapid un subiect. Cåutarea se face dupå numele subiectului sau dupå primele litere
ale numelui subiectului.
9 Back aduce în fereastrå ultimul subiect vizualizat.
9 Glossary afiçeazå glosarul (listå de termeni ordonatå alfabetic). Dacå executaÆi clic
pe numele unui termen, se afiçeazå într-o casetå informaÆii despre el.
Utilizarea unor instrumente de prelucrare a datelor 73

Din interfaÆa sistemului de operare Windows lansaÆi aplicaÆia Visual FoxPro.


AdministraÆi interfaÆa aplicaÆiei Visual FoxPro
1. IdentificaÆi elementele ferestrei de aplicaÆie Visual FoxPro: bara de meniuri, bara cu
instrumente, bara de stare, fereastra de comenzi çi spaÆiul de lucru al ferestrei de
aplicaÆie.
2. Fereastra Commands este o fereastrå document. ExecutaÆi cu aceastå fereastrå
operaÆiile de minimizare, deplasare, maximizare, redimensionare çi restaurare.
ObservaÆi cå aceste operaÆii se executå numai în cadrul ferestrei de aplicaÆie.
3. DeschideÆi caseta de dialog Toolbars cu opÆiunea Toolbars...∈View. În lista
Toolbar executaÆi clic pe comutatorul View Designer çi apoi clic pe declançatorul
Ok. ObservaÆi cå în fereastra aplicaÆiei este afiçatå o nouå barå cu instrumente. Des-
chideÆi din nou caseta de dialog Toolbars. VerificaÆi så fie activat numai comutatorul
Standard din lista Toolbar. ExecutaÆi clic pe declançatorul Ok. ObservaÆi cå în
fereastra aplicaÆiei este afiçatå numai bara standard cu instrumente.
4. DeschideÆi meniul Window. ObservaÆi informaÆiile afiçate în bara de stare.
5. ExecutaÆi operaÆii cu ferestrele document:
„ AscundeÆi fereastra document Command cu opÆiunea Hide∈Window. ObservaÆi
cå în bara de meniu nu mai este afiçat titlul meniului Format, deoarece acest
meniu conÆine opÆiuni pentru formatarea textelor editate. El depinde de existenÆa
unei ferestre care så permitå editarea. Fereastra Command este o fereastrå în
care se editeazå comenzi. Ferestrele View çi Debug pe care le veÆi deschide nu
sunt ferestre de editare.
„ ReafiçaÆi fereastra apåsând tastele Ctrl+F2 (scurtåtura opÆiunii Command∈Window).
„ DeschideÆi fereastra View cu opÆiunea View∈Window.
„ DeschideÆi fereastra Debug cu opÆiunea Debug Window∈Tools.
„ ActivaÆi pe rând ferestrele document deschise, apåsând tastele Ctrl+F1.
„ ÎnchideÆi ferestrele View çi Debug executând clic pe butonul de închidere.
FolosiÆi autodocumentarea
1. VizualizaÆi informaÆii despre comanda Display Status (help dependent de context):
„ ScrieÆi în fereastra Command comanda Help Display Status.
„ Se deschide caseta de dialog Help Topics. În listå este selectat subiectul DISPLAY
STATUS command. ExecutaÆi clic pe declançatorul Display.
„ Se deschide caseta de dialog Topics Found. SelectaÆi în listå subiectul DISPLAY
STATUS command çi executaÆi clic pe declançatorul Display.
„ Se deschide fereastra aplicaÆiei Help. În fereastrå sunt afiçate informaÆii despre
acest subiect.
„ ExecutaÆi clic pe butonul Glossary. Se deschide caseta de dialog Help Index.
ExecutaÆi clic pe butonul cu litera S.
„ În casetå este afiçatå lista cu termenii care încep cu litera S. ExecutaÆi clic pe
termenul SQL. Se deschide o casetå cu text în care vå sunt furnizate informaÆii
despre acest termen. ÎnchideÆi aceastå casetå executând clic în exteriorul ei.
74 Informatică

„ ÎnchideÆi caseta de dialog cu glosarul executând clic pe butonul de închidere.


ÎnchideÆi fereastra Help executând clic pe butonul de închidere.
2. VizualizaÆi informaÆii despre controalele din caseta de dialog Toolbars (help depen-
dent de context):
„ DeschideÆi caseta de dialog Toolbars. ExecutaÆi clic pe butonul Help.
„ Se deschide fereastra Help. În fereastrå este afiçat subiectul Toolbar (View
Menu). ÎnchideÆi fereastra Help.
„ În caseta de dialog Toolbars apåsaÆi tasta F1. ObservaÆi cå aceastå acÆiune are
acelaçi efect ca çi apåsarea butonului Help. ÎnchideÆi fereastra Help.
3. LucraÆi cu controalele din fereastra Help (help independent de context):
„ DeschideÆi fereastra Help cu Contents∈Help. În spaÆiul de lucru al ferestrei este
prezentatå o listå de capitole cu subiecte. Fiecare titlu de capitol reprezintå un
salt cåtre o listå cu subcapitole.
„ ExecutaÆi clic pe numele capitolului Language Reference. În fereastrå va fi
afiçatå lista cu subcapitolele. ExecutaÆi clic pe numele subcapitolului Language
Reference A-Z.
„ Se deschide caseta de dialog Help Index. ExecutaÆi clic pe subiectul = Command.
În fereastra Help va fi afiçat conÆinutul subiectului = Command (Comanda =;
operaÆia de atribuire). ÎnchideÆi fereastra executând clic pe butonul de închidere.
LucraÆi cu ferestrele document ale constructorilor
1. AlegeÆi opÆiunea Open∈File. Se deschide caseta de dialog Open. În listå este afiçat
conÆinutul dosarului Vfp (Visual FoxPro). DeschideÆi din listå dosarul cu exemple
Sample. DeschideÆi apoi dosarul Data. Din lista ascunså Files of type alegeÆi
valoarea Database. ExecutaÆi clic în lista cu fiçiere çi dosare pe numele fiçierului
Testdata.dbc. ExecutaÆi clic pe declançatorul Ok.
2. Se deschide fereastra Database Designer (generatorul bazei de date). În fereastrå
este afiçatå baza de date a unei organizaÆii: tabelele çi relaÆiile dintre tabele. În
fereastrå nu este activat nici un obiect. ObservaÆi cå meniul Format a fost înlocuit cu
meniul Database.
3. DeschideÆi meniul Database. IdentificaÆi opÆiunile disponibile. De ce nu sunt
disponibile opÆiunile Modify..., Browse çi Remove? ÎnchideÆi lista meniului.
4. ExecutaÆi clic pe tabelul Products. ObservaÆi informaÆiile din bara de stare. Deschi-
deÆi meniul Database. IdentificaÆi opÆiunile disponibile. De ce nu este disponibilå
opÆiunea Edit Relationship...? ÎnchideÆi lista meniului.
5. ExecutaÆi clic pe legåtura dintre tabelele Orders çi Orditems. DeschideÆi meniul
Database. De ce este acum disponibilå opÆiunea Edit Relationship...? De ce nu
sunt disponibile opÆiunile Modify..., Browse çi Remove? ÎnchideÆi lista meniului.
6. ExecutaÆi dublu clic pe tabelul Products. Se deschide fereastra Table Designer (ge-
neratorul de tabele). Fereastra are numele tabelului - Products, iar în fereastrå sunt
afiçate datele din acest tabel. În partea superioarå a ferestrei sunt afiçate numele câm-
purilor din tabel (numele fiecårei coloane). PuteÆi så derulaÆi conÆinutul ferestrei folosind
barele de derulare. ObservaÆi cå meniul Database a fost înlocuit cu meniul Table.
7. DeschideÆi meniul Table. IdentificaÆi opÆiunile de meniu care pot fi folosite pentru
administrarea înregistrårilor dintr-un tabel. ÎnchideÆi lista meniului.
Utilizarea unor instrumente de prelucrare a datelor 75

8. DeschideÆi meniul View. ObservaÆi cå opÆiunile acestui meniu sunt dependente de


context. În meniu au apårut opÆiuni noi. De exemplu, a apårut un grup de opÆiuni de
tip butoane radio: Browse çi Edit. Este activatå opÆiunea Browse. Aceasta înseam-
nå cå fereastra generatorului de tabel este de tip Browse. ExecutaÆi clic pe opÆiunea
Edit. ObservaÆi cå s-a modificat modul în care sunt afiçate datele în fereastra
tabelului. De data aceasta, pe fiecare rând este afiçat conÆinutul unui câmp. Numele
câmpului apare scris la începutul rândului. ReveniÆi la modul de afiçare Browse.
9. ÎnchideÆi cele douå ferestre document. ObservaÆi cå în fereastra Command au apårut
comenzile pe care le-aÆi executat prin intermediul interfeÆei:
OPEN DATABASE C:\VFP\SAMPLES\DATA\Testdata.dbc EXCLUSIVE
MODIFY DATABASE

ConfiguraÆi mediul de lucru Visual FoxPro


1. ConfiguraÆi ceasul çi modul în care este afiçat timpul:
set hours to 12 ? set ('clock',1)
set clock to status 0.000, 122.333
ceasul este afiçat în bara de set clock to 15,60
stare în format de 12 ore ceasul este în interiorul spaÆiu-
? set ('clock') lui de lucru al ferestrei
STATUS ? set ('clock',1)
? set ( 'hours') 15.000, 60.000 (noile coordonate
12 ale ceasului)
set clock off set hours to 24
ceasul nu mai este afiçat în ceasul este afiçat în format de
bara de stare 24 de ore
set clock on ? set ( 'hours')
ceasul este afiçat în colÆul din 12
dreapta sus al spaÆiului de
lucru al ferestrei
2. ConfiguraÆi modul în care sunt comparate datele de tip çir de caractere:
set exact off .T. ?'ab'='ab '
?'abc'='abc1' ?''='ab' .T.
.F. .F. ?'ab'=='ab '
?'abc'=='abc1' ?'ab'='' .F.
.F. .T. ?'ab1'='ab'
?'abc'='ab' set exact on .F.
.T. ?'ab'='abc' ?'ab '='ab'
?'ab'='abc' .F. .T.
.F. ?'abc'='ab' ?'ab '=='ab'
?'abc'='ab1' .F. .F.
.F. ?'abc'='ab1' ?''='ab'
?'ab'='ab1' .F. .F.
.F. ?'ab'='ab1' ?'ab'=''
?'ab1'='ab' .F. .F.
3. IdentificaÆi modul în care puteÆi modifica interactiv diferiÆi parametri Set. DeschideÆi
caseta de dialog Options la diferite secÆiuni çi verificaÆi controalele din urmåtorul
tabel în care este prezentatå o comparaÆie între modul de lucru comandå çi modul de
76 Informatică

lucru interactiv. ReluaÆi operaÆiile de la punctele anterioare folosind controalele din


caseta de dialog Options.

Parametru Mod comandå Mod interactiv


Bell Set Bell On|Off SecÆiunea General; grupul de butoane radio Off
(fårå sunet), Default (cu sunet implicit), Play (cu
sunet ales prin intermediul unei casete de text).
Clock Set Clock On|Off SecÆiunea View; caseta Show; comutatorul
Clock.
Clock Set Clock to [12|24] SecÆiunea International; grupul de butoane radio
12-Hour çi 24-Hour.
Decimals Set Decimals to SecÆiunea International; caseta de text cu derulor
Decimals Digit.
Point Set Point to SecÆiunea International; caseta de text Decimals
Separator.
Exact Set Exact On|Off SecÆiunea Data; comutatorul SET EXACT.
Status Bar Set Status Bar On|Off SecÆiunea View; caseta Show; comutatorul
Status Bar.
Talk Set Talk On|Off SecÆiunea View; caseta Show; comutatorul
Command Result.
LucraÆi cu fereastra document a editorului de texte
1. ScrieÆi în fereastra Command urmåtoarele comenzi pe care le executaÆi:
set fixed on x=4*30
set decimals to 4 ?x
set point to ','
Se afiçeazå rezultatul 120,0000:
2. DeschideÆi fereastra de editare cu comanda modify command a1. Numele ferestrei
de editare este numele fiçierului a1.prg.
3. ActivaÆi fereastra de comenzi executând clic în aceastå fereastrå. SelectaÆi comenzile
introduse la punctul 1. CopiaÆi în zona Clipboard aceste instrucÆiuni apåsând tastele
Ctrl+C.
4. ActivaÆi fereastra de editare executând clic în spaÆiul ei de lucru. CopiaÆi în aceastå
fereastrå instrucÆiunile din Clipboard apåsând tastele Ctrl+V. ÎnchideÆi fereastra de
editare cu salvarea conÆinutului apåsând tastele Ctrl+W.
5. DeschideÆi din nou fereastra de editare cu comanda modify command a1. În fe-
reastra de editare sunt afiçate instrucÆiunile scrise anterior. SalvaÆi acest conÆinut într-un
alt fiçier de program cu comanda Save As...∈File. În caseta de dialog Save As scrieÆi
în zona de editare Save a2. ObservaÆi numele dosarului în care se salveazå aceste
fiçiere cu programe. ExecutaÆi clic pe declançatorul Save. ObservaÆi cå acum numele
ferestrei de editare este a2.prg. Ea conÆine comenzile din programul a1. ModificaÆi
instrucÆiunile urmåtoare, pentru a reveni la afiçarea implicitå a numerelor (2 poziÆii
zecimale çi separatorul punct):
set decimals to set point to
Utilizarea unor instrumente de prelucrare a datelor 77

ÎnchideÆi fiçierul a2 cu salvarea modificårilor apåsând tastele Ctrl+W.


6. ExecutaÆi comenzile din fiçierul a1. ScrieÆi în fereastra Commands comanda Do a1.
Rezultatul afiçat este 120,0000.
7. ExecutaÆi comenzile din fiçierul a2. ScrieÆi în fereastra Commands comanda Do a2.
Rezultatul afiçat este 120.00.
ManipulaÆi fiçierele
1. CopiaÆi fiçierul a1.prg sub numele nou.prg, folosind comanda:
copy file a1.prg to nou.prg
2. VizualizaÆi lista cu fiçiere cu programe din directorul curent. IdentificaÆi în listå fiçierele
program create: a1.prg, a2.prg çi nou.prg. FolosiÆi comanda:
dir like *.prg
3. RedenumiÆi fiçierul nou.prg cu numele a3.prg folosind comanda:
rename nou.prg to a3.prg
4. VizualizaÆi lista cu fiçiere cu programe din directorul curent create în aceastå sesiune
de lucru: a1.prg, a2.prg çi a3.prg. FolosiÆi comanda:
dir like a*.prg
5. DeschideÆi caseta de dialog Filer folosind comanda:
filer
IdentificaÆi controalele din caseta de dialog. În listå sunt afiçate directoarele çi fiçierele din
directorul curent. Pentru fiecare dintre ele se afiçeazå numele, dimensiunea, data çi ora
ultimei actualizåri, atributele. Cele douå liste ascunse Drive çi Directories se folosesc
pentru a schimba discul implicit çi directorul curent. Caseta de text Files Like se foloseç-
te pentru a comunica çablonul fiçierelor afiçate în listå (implicit este *.*, adicå toate fiçi-
erele). Pentru executarea operaÆiilor cu fiçiere çi directoare puteÆi folosi declançatoarele:
9 Find - localizarea unui fiçier sau director prin intermediul controalelor din caseta de
dialog Find Files;
9 Copy - copierea fiçierului sau a directorului selectat sau a grupului de fiçiere sau
directoare selectate;
9 Move - mutarea fiçierului sau a directorului selectat sau a grupului de fiçiere sau
directoare selectate;
9 Delete - çtergerea fiçierului sau a directorului selectat sau a grupului de fiçiere sau
directoare selectate;
9 Sort - sortarea listei cu fiçiere çi directoare dupå diferite criterii (nume, extensie, datå,
dimensiune etc.);
9 Edit - editarea fiçierului selectat (deschide fereastra de editare în care încarcå fiçierul);
9 Attr - afiçarea sau modificarea atributelor fiçierului selectat;
9 Rename - redenumirea fiçierului sau directorului selectat;
9 Size - afiçarea dimensiunii fiçierului selectat (în octeÆi);
9 Tree - are efect de comutator: prin acÆionare schimbå informaÆia afiçatå în listå; în
locul listei cu fiçiere çi directoare este afiçat arborele de directoare.
„ ScrieÆi în caseta de text çablonul *.prg. ObservaÆi cå în listå sunt afiçate numai
fiçierele care au extensia .prg. ReveniÆi la afiçarea tuturor fiçierelor rescriind în
aceastå casetå çablonul *.*.
78 Informatică

„ SelectaÆi fiçierul a1.prg çi executaÆi clic pe declançatorul Edit. Se deschide fereastra


de editare în care este încårcat fiçierul a1.prg. ÎnchideÆi fereastra de editare.
„ În listå existå fiçierul a1.bak. El a fost creat automat de cåtre sistem atunci când aÆi
fåcut modificarea în acest fiçier. Acest tip de fiçier conÆine penultima versiune a fiçie-
rului. SelectaÆi acest fiçier çi executaÆi clic pe declançatorul Delete ca så îl çtergeÆi.
„ ExecutaÆi clic pe declançatorul Tree. Se afiçeazå structura arborescentå a directoare-
lor. În locul acestui declançator este afiçat acum declançatorul Files. Nu mai sunt afi-
çate declançatoarele Find, Sort, Edit çi Attr. În locul lor sunt afiçate declançatoarele
Chdir (pentru schimbarea directorului curent) çi Mkdir (pentru crearea unui director).
ExecutaÆi clic pe declançatorul Files pentru a afiça lista cu fiçiere çi directoare.
„ SelectaÆi toate fiçierele create în aceastå sesiune de lucru çi executaÆi clic pe
declançatorul Delete.

# ÎncercaÆi:

Adevårat/Fals:
1. Meniul Database conÆine opÆiuni pentru manipularea tabelelor din baza de date.
2. Într-o comandå puteÆi preciza grupul de înregistråri care începe cu înregistrarea
curentå çi se terminå cu ultima înregistrare folosind cuvântul cheie Next.
3. În general, adverbele dintr-o comandå pot fi scrise în orice ordine.
4. Verbul comenzii poate fi prescurtat la primele patru caractere.
5. Configurarea mediului de lucru Visual FoxPro se poate face prin ansamblul de
comenzi Set.
6. Folosind comanda Display status afiçaÆi informaÆii despre starea monitorului.
7. Numårul de zecimale dintr-un numår îl stabiliÆi cu comanda Set Fixed.
8. Formularul prin intermediul cåruia puteÆi så modificaÆi interactiv parametrii sistemului
este de tip fereastrå document.
CompletaÆi:
1. InformaÆiile despre activarea/dezactivarea tastelor comutator se gåsesc în .............…
2. Fereastra folositå pentru editarea comenzilor se numeçte ..................................
3. Fereastra generatorului de tabele ale bazei de date se numeçte .................................
4. Cuvântul cheie prin care puteÆi preciza într-o comandå un grup de n înregistråri,
începând cu înregistrarea curentå este ......................
5. Pentru redirectarea ieçirii unei comenzi la imprimantå folosiÆi clauza .....................
6. Comanda prin care cereÆi så aflaÆi informaÆii despre operaÆia de çtergere a fiçierelor
Erase este ................................
7. Formularul prin intermediul cåruia puteÆi så administraÆi fiçierele este de tip ................
............................. çi se numeçte ....................................
8. Autodocumentarea declançatå prin acÆionarea butonului Help dintr-o casetå de dia-
log se numeçte help ............................... de context.
AlegeÆi råspunsul corect:
1. Meniul Table conÆine opÆiuni pentru:
a) crearea çi formatarea tabelelor
Utilizarea unor instrumente de prelucrare a datelor 79

b) manipularea înregistrårilor dintr-un tabel


c) crearea legåturilor între tabele
2. Fereastra în care puteÆi vedea ce tabele conÆine baza de date deschiså, în ce zone
lucreazå çi ce legåturi existå între ele se numeçte:
a) Database Designer b) Form Designer c) View
3. Clauza prin care puteÆi preciza numai înregistrårile care îndeplinesc o anumitå
condiÆie logicå, începând 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) spaÆiu
6. LansaÆi în execuÆie un program cu comanda:
a) Modi Comm b) Do c) Return
7. Comanda Set clock status:
a) afiçeazå starea ceasului
b) afiçeazå ceasul în bara de stare
c) este greçitå
8. PuteÆi stabili interactiv parametrii sistemului prin intermediul:
a) ferestrei document Trace
b) casetei de dialog Option
c) ferestrei document Project Manager
RåspundeÆi:
1. Ce înseamnå compatibil cu standardul dBase?
2. Ce înseamnå termenul Visual din numele aplicaÆiei Visual FoxPro? Ce reprezintå aceas-
tå tehnicå?
3. Ce tipuri de limbaje are implementat Visual FoxPro pe lângå limbajul propriu?
4. Ce informaÆii afiçeazå bara de stare atunci când este selectat un tabel din baza de date?
5. Ce tipuri de adverbe pot fi folosite în linia de comandå?
6. Câte forme are comanda Set? Pentru ce tip de parametri se poate folosi fiecare for-
må? Ce formular puteÆi folosi în locul comenzii Set pentru a configura interactiv
mediul de lucru Visual FoxPro?
7. Pentru ce operaÆii cu fiçiere vå pune la dispoziÆie comenzi aplicaÆia Visual FoxPro?
Ce formular puteÆi folosi în locul comenzilor pentru operaÆii cu fiçiere? Cum deschideÆi
acest formular?
8. Câte tipuri de autodocumentare foloseçte Visual FoxPro? Cum puteÆi avea acces la
fiecare tip de help?

R åspunsuri:
Adevårat/Fals: 1-A; 2-F; 3-A; 4-A; 5-A; 6-F; 7-F; 8-F.
CompletaÆi: 1- bara de stare; 2-Command; 3-Database Designer; 4-Next; 5-To Print; 6-Help Erase;
7-caseta de dialog, Filer; 8-dependent.
AlegeÆi råspunsul corect: 1-b; 2-c; 3-c; 4-c; 5-b; 6-b; 7-b; 8-b.
80 Informatică

2. Funcţii folosite pentru datele din Visual FoxPro

Tipuri de date

Numeric Alfanumeric Logic Timp Special

Logical General

Character Memo Date DateTime

Întreg
Pentru prelucrarea datelor elementare
Monetar (variabile de memorie sau câmpuri) puteÆi
Real folosi, pe lângå operatorii specifici
tipului de datå, çi funcÆiile. Acestea pot
Currency fi grupate dupå tipul datelor care sunt
Integer folosite ca argumente (parametri de
intrare sau date de intrare prelucrate de
Float Double funcÆie).

2.1. Funcţii pentru date de tip numeric


Pentru aceste funcÆii argumentul este de tip numeric (întreg sau real). Argumentul poate fi
o variabilå sau un câmp numeric, sau o expresie al cårui rezultat este numeric.
FuncÆia Sintaxa Ce reprezintå?
FuncÆii pentru semnul expresiei
Sign Sign(x) Furnizeazå semnul argumentului x: +1 dacå x>0, 0 dacå
x=0 çi -1 dacå x<0.
Abs Abs(x) Furnizeazå valoarea absolutå (modulul) argumentului x.
FuncÆii folosite ca operatori matematici
Mod Mod(x,y) Furnizeazå restul împårÆirii argumentului x la argumentul y.
FuncÆii care aproximeazå datele
Int Int(x) Furnizeazå partea întreagå a argumentului.
Ceiling Ceiling(x) Furnizeazå cel mai apropiat întreg mai mare sau egal cu
argumentul.
Floor Floor(x) Furnizeazå cel mai apropiat întreg mai mic sau egal cu
argumentul.
Utilizarea unor instrumente de prelucrarea datelor 81

FuncÆia Sintaxa Ce reprezintå?


Round Round(x,y) Furnizeazå valoarea numericå a numårului precizat prin
argumentul x, rotunjitå la numårul de zecimale precizat
prin argumentul y.
FuncÆii matematice
Sqrt Sqrt(x) Furnizeazå rådåcina påtratå din argument.
Exp Exp(x) Furnizeazå exponenÆialul argumentului.
Log Log(x) Furnizeazå logaritmul natural din argument.
Log10 Log10(x) Furnizeazå logaritmul zecimal din argument.
FuncÆii trigonometrice
Sin Sin(x) Furnizeazå sinusul argumentului exprimat în radiani.
Cos Cos(x) Furnizeazå cosinusul argumentului exprimat în radiani.
Tan Tan(x) Furnizeazå tangenta argumentului exprimat în radiani.
Asin Asin(x) Furnizeazå arcsinusul argumentului exprimat în radiani.
Acos Acos(x) Furnizeazå arccosinusul argumentului exprimat în radiani.
Atan Atan(x) Furnizeazå arctangenta argumentului exprimat în radiani.
Rtod Rtod(x) Realizeazå conversia din radiani în grade.
Dtor Dtor(x) Realizeazå conversia din grade în radiani.
Pi Pi() Furnizeazå valoarea constantei Π (3,141592).
ObservaÆii:
1. PuteÆi exprima relaÆia dintre un numår, modulul såu çi semnul såu astfel:
x = abs(x)*sign(x)
2. Pentru a afla partea fracÆionarå a unui numår x puteÆi folosi expresia:
x - int(x)
3. PuteÆi folosi funcÆiile exp() çi log() pentru a calcula valoarea expresiei ab, adicå a^b.
ÇtiÆi deja cå din punct de vedere matematic: ab = eb*ln(a). PuteÆi exprima operatorul
matematic pentru ridicare la putere folosind aceste funcÆii:
a^b = exp(b*log(a))
4. PuteÆi folosi funcÆiile log() çi log10() pentru a calcula valoarea oricårui logaritm. ÇtiÆi
deja cå din punct de vedere matematic:
logb(a)= log(a)/log(b) = log10(a)/log10(b)
5. Argumentele funcÆiilor trigonometrice sin(x), cos(x) çi tan(x) sunt specificate în radiani
çi nu în grade. Rezultatul furnizat de
funcÆiile asin(x), acos(x) çi atan(x) Dtor()
este în radiani.
radiani grade
Pentru a transforma gradele (Degree) în
radiani (Radian), çi invers, se pot folosi Rtod()
funcÆiile Dtor() çi Rtod().

PrelucraÆi date numerice cu ajutorul funcÆiilor


1. EvaluaÆi expresii numerice folosind funcÆia sqrt():
82 Informatică

a + 1- a − 1
× (2 − a )
a + 1+ a − 1
pentru a=4. ScrieÆi comenzile:
a=4
e=((sqrt(a+1)-sqrt(a-1))/ (sqrt(a+1)+sqrt(a-1)))*(2-a)
?e
-0.25 (rezultatul afiçat)
2. EvaluaÆi expresia:

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

3. EvaluaÆi semnul expresiei numerice -1


cu funcÆiile: sign(), abs(): ? round(x,2)
-5.25
? abs(-1000)
1000 5. ExtrageÆi partea fracÆionarå dintr-un
? sign(-1000) numår:
-1
x=3.15
alfa=-1000
? x-int(x)
? alfa=sign(alfa)*abs(alfa)
0.15
.T.
x=-3.15
4. AproximaÆi expresia numericå folosind ? x-int(x)
funcÆiile: ceiling(), floor(), round(), -0.15
int(): 6. CalculaÆi modulo (restul împårÆirii)
x=5.253 folosind operatorul % çi funcÆia mod():
? floor(x)
? mod(5,2)
5
1
? int(x)
? 5%2
5
1
? ceiling(x)
? mod(5,2) = 5%2
6
.T.
? round(x,2)
? mod(6.5,3)
5.25
0.5
? round(x+0.004,2)
? 6.5%3
5.26
0.5
x=-5.25
? floor(x) 7. EvaluaÆi expresii numerice folosind
-6 funcÆia sqrt(), log(),log10(), exp():
? int(x)
-5 a=2
? ceiling(x) b=3
-5 ? a^b=exp(b*log(a))
? sign(x) .T.
Utilizarea unor instrumente de prelucrarea datelor 83

? exp(0) 1.00
1 ? sin(dtor(90))
? exp(1) 1.00
2.72 ? asin(1)
? log(1) 1.57
0.00 ? rtod(asin(1))
? log(exp(5)) 90.00
5.00 ? tan(pi()/4)
? exp(log(5)) 1.00
5.00 ? rtod(atan(1))
? log10(1000) 45.00
3.00 ? rtod(atan(-1))
? log10(1000^2) -45.00
6.00 ? rtod(asin(-1))
-90.00
8. EvaluaÆi funcÆii trigonometrice folo- ? rtod(acos(-1))
sind funcÆiile: sin(), cos(), tan(), asin(), 180.00
acos(), atan(), pi(), rtod(), dtor(): ? rtod(asin(sqrt(2)/2))
? sin(pi()/2) 45.00

2.2. Funcţii pentru date de tip şir de caractere


Pentru aceste funcÆii argumentul este de tip çir de caractere. Argumentul poate fi o variabilå
sau un câmp çir de caractere, ori o expresie al cårei rezultat este un çir de caractere.

FuncÆia Sintaxa Ce reprezintå?


FuncÆii pentru conversii
Asc Asc(x) Argumentul x este de tip çir de caractere. FuncÆia furnizeazå
codul ASCII al primului caracter din argument.
Chr Chr(x) Argumentul x este de tip numeric întreg cuprins între 0 çi 255.
FuncÆia furnizeazå caracterul al cårui cod ASCII este argu-
mentul x. FuncÆia furnizeazå un rezultat de tip çir de caractere.
FuncÆii care furnizeazå informaÆii despre un çir de caractere
Len Len(x) Furnizeazå un rezultat de tip numeric ce reprezintå
lungimea çirului de caractere.
Isalpha 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 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 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 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ă

FuncÆia Sintaxa Ce reprezintå?


FuncÆii pentru generarea de çiruri de caractere
Replicate Replicate(x,y) Argumentul x este de tip çir de caractere, iar argumentul
y este de tip numeric. FuncÆia furnizeazå un çir de
caractere obÆinut prin repetarea de y ori a çirului de
caractere x.
Space Space(x) Argumentul x este de tip numeric. FuncÆia furnizeazå un
çir de caractere format din x spaÆii.
FuncÆii pentru eliminarea spaÆiilor sau pentru inserarea spaÆiilor sau a altor
caractere într-un çir de caractere
Alltrim Alltrim(x) Eliminå spaÆiile din faÆa çi din spatele (din stânga çi din
dreapta) çirului de caractere x.
Ltrim Ltrim(x) Eliminå spaÆiile suplimentare din faÆa (din stânga - left) çirului
de caractere x.
Rtrim, Rtrim(x) Eliminå spaÆiile 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 nume-
ric. FuncÆia completeazå çirul de caractere x la stânga çi la
dreapta cu çirul de caractere y astfel încât çirul rezultat så
aibå lungimea n.
Padl Padl(x,n[,y]) Argumentele sunt x,y de tip çir de caractere çi n de tip nume-
ric. FuncÆia completeazå çirul de caractere x în faÆå (la stânga
- left) cu çirul de caractere y astfel încât çirul rezultat så aibå
lungimea n.
Padr Padr(x,yn[,y]) Argumentele sunt x,y de tip çir de caractere çi n de tip nume-
ric. FuncÆia completeazå çirul de caractere x la sfârçit (la
dreapta - right) cu çirul de caractere y astfel încât çirul rezultat
så aibå lungimea n.
FuncÆii pentru transformarea unui çir de caractere
Lower Lower(x) Furnizeazå un çir de caractere în care literele din çirul de car-
ractere x sunt transformate în litere mici.
Upper Upper(x) Furnizeazå un çir de caractere în care literele din çirul de ca-
ractere x sunt transformate în litere mari.
Proper Proper(x) Furnizeazå un çir de caractere în care literele din çirul de ca-
ractere x sunt transformate astfel: prima literå este mare, iar
celelalte sunt mici.
Chrtran Chrtran(x,y,z) Argumentele x, y, z sunt de tip çir de caractere. Furnizeazå
un çir de caractere obÆinut prin transformarea çirului de carac-
tere x astfel: toate apariÆiile primului caracter din çirul de ca-
ractere y sunt înlocuite cu primul caracter din çirul z, toate a-
pariÆiile celui de-al doilea caracter din çirul y sunt înlocuite cu
al doilea caracter din çirul z etc. Dacå expresia y are mai mul-
te caractere decât expresia z, atunci caracterele care sunt în
plus vor fi transformate în caracterul NULL. Dacå expresia z
are mai multe caractere decât expresia y, atunci caracterele
care sunt în plus vor fi ignorate.
Utilizarea unor instrumente de prelucrarea datelor 85

FuncÆia Sintaxa Ce reprezintå?


Strtran Strtran(x,y Argumentele x, y, z sunt de tip çir de caractere, iar argumen-
[,z,n,m]) tele 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 apariÆia n a çirului
y çi se vor înlocui numai m apariÆii. Dacå nu se precizeazå çi-
rul z, el va fi considerat çirul vid, iar efectul va fi çtergerea a m
apariÆii ale çirului y începând cu apariÆia n. Dacå nu se preci-
zeazå argumentul n, înlocuirea începe cu prima apariÆie, iar
dacå nu se precizeazå argumentul m, se vor înlocui toate
apariÆiile.
Stuff 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 obÆi-
nut prin înlocuirea în çirul de caractere x a unui subçir, care
începe din poziÆia n çi are lungimea m, cu çirul de caractere y.
FuncÆii pentru operaÆii cu subçiruri de caractere
Left Left(x,n) Argumentul x este de tip çir de caractere, iar argumentul n
este de tip numeric. Furnizeazå un çir de caractere obÆinut
prin extragerea a n caractere de la stânga çirului x.
Right Right(x,n) Argumentul x este de tip çir de caractere, iar argumentul n
este de tip numeric. Furnizeazå un çir de caractere obÆinut
prin extragerea a n caractere de la dreapta çirului x.
Substr 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
obÆinut prin extragerea unui subçir de lungime n din çirul x,
începând cu poziÆia m.
At At(x,y[,n]) Argumentele x çiy sunt de tip çir de caractere, iar argumen-
tul n este de tip numeric. Furnizeazå un rezultat numeric ca-
re reprezintå poziÆia în çirul y a subçirului x. Cåutarea se fa-
ce de la stânga la dreapta, Æinând cont de diferenÆa dintre
literele mari çi mici. Dacå se precizeazå argumentul n, se
cautå apariÆia n.
Rat Rat(x,y[,n]) Argumentele x çiy sunt de tip çir de caractere, iar argumen-
tul n este de tip numeric. Furnizeazå un rezultat numeric ca-
re reprezintå poziÆia în çirul y a subçirului x. Cåutarea se fa-
ce de la dreapta la stânga, Æinând cont de diferenÆa dintre
literele mari çi mici. Dacå se precizeazå argumentul n, se
cautå apariÆia n.
Atc Atc(x,y[,n]) Argumentele x çiy sunt de tip çir de caractere, iar argumen-
tul n este de tip numeric. Furnizeazå un rezultat numeric ca-
re reprezintå poziÆia în çirul y a subçirului x. Cåutarea se fa-
ce de la stânga la dreapta, fårå så Æinå cont de diferenÆa din-
tre literele mari çi mici. Dacå se precizeazå argumentul n, se
cautå apariÆia n.
Atline 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å subçirul x. Cåutarea se face Æinând
86 Informatică

FuncÆia Sintaxa Ce reprezintå?


cont de diferenÆa dintre literele mari çi mici çi de la stânga la
dreapta.
Ratline Ratline(x,y) 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å subçirul x. Cåutarea se face Æinând
cont de diferenÆa dintre literele mari çi mici çi de la dreapta
la stânga.
Atcline Atcline(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å subçirul x. Cåutarea se face Æinând
cont de diferenÆa dintre literele mari çi mici çi de la stânga la
dreapta.
Occurs Occurs(x,y) Argumentele x çiy sunt de tip çir de caractere. Furnizeazå
un rezultat numeric care reprezintå numårul de apariÆii al
subçirului x în çirul y.
ObservaÆii:
Asc()
1. PuteÆi folosi urmåtoarele funcÆii pen-
tru conversia numår ↔ caracter: cod ASCII caracter
2. Pentru çirul vid funcÆia Len() furni- Chr()
zeazå valoarea 0.
3. FuncÆiile Replicate(‘ ‘,n) çi Space(n) furnizeazå acelaçi rezultat.
4. FuncÆiile Alltrim(), Ltrim(), Trim(), Rtrim(), Padc(), Padl() çi Padr() pot fi sintetizate în
urmåtoarele diagrame:
a. FuncÆiile pot fi folosite pentru douå
Padc(), Padl(), Padr()
tipuri de operaÆii:
9 eliminarea spaÆiilor: Alltrim(), çir cu spaÆii çir fårå spaÆii
Ltrim(), Trim(), Rtrim()
9 inserarea spaÆiilor sau a altor Alltrim(), Ltrim(), Trim(), Rtrim()
caractere: Padc(), Padl(), Padr()
b. FuncÆiile acÆioneazå în diferite zone ale çirului de caractere:
9 la stânga ç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 operaÆii.
a. transformarea din litere mari în litere mici çi invers: Lower(), Upper(), Proper()
b. înlocuirea unor caractere cu alte caractere: Chrtran(), Strtran(), Stuff()
Utilizarea unor instrumente de prelucrarea datelor 87

De exemplu, pentru funcÆia Strtran():

y - subçirul care se înlocuieçte

x - çirul în care se înlocuieçte

n = 2; înlocuirea se face începând cu a doua apariÆie


z - subçirul cu care se înlocuieçte m = 3; numårul de apariÆii care se înlocuiesc

çi pentru funcÆia Stuff():


subçirul care se înlocuieçte, m
definit prin poziÆia n çi lungimea m

x - çirul în care se înlocuieçte

n
y - subçirul cu care se înlocuieçte

Folosind funcÆia Stuff() puteÆi realiza urmåtoarele operaÆii:


9 inserarea unui çir de caractere, dacå m=0;
9 çtergerea unui çir de caractere, dacå y='' (çirul vid).
6. OperaÆiile cu subçiruri de caractere se fac prin trei tipuri de operaÆii:
a. extragerea unui subçir de caractere dintr-un çir se poate face din diferite poziÆii ale
çirului cu funcÆiile : Left(), Right(), Substrr()
çirul x
n n n

m
Left(x,n)
Substr(x,m,n) Right(x,n)

Între aceste funcÆii existå urmåtoarele relaÆii:


9 Left(x,n) = Substr(x,1,n);
9 Right(x,n) = Substr(x,len(x)-n+1,n).
b. cåutarea unui subçir de caractere într-un çir se poate face Æinând cont de mai multe criterii:
9 cåutarea se face pe o singurå linie de text:
Æinând cont de diferenÆa dintre literele mari çi mici At(), Rat() sau
fårå så se Æinå cont de diferenÆa dintre literele mari çi mici Atc()
9 cåutarea se face pe mai multe linii de text:
Æinând cont de diferenÆa dintre literele mari çi mici Atline(), Ratline() sau
88 Informatică

fårå så se Æinå cont de diferenÆa dintre literele mari çi mici Atcline()


9 cåutarea se face în urmåtoarele sensuri:
de la stânga la dreapta At (), Atc(), Atline(), Atcline() sau
de la dreapta la stânga Rat (), Ratline()

At(), Atc(), Rat(),


Atline(),Atcline() Ratline()

c. determinarea numårului de apariÆii ale unui subçir într-un çir: Occurs()

PrelucraÆi çiruri de caractere cu ajutorul funcÆiilor


VeÆi folosi mai multe funcÆii pentru çiruri de caractere çi veÆi observa rezultatul furnizat de
aceste funcÆii:
1. FolosiÆi funcÆiile de conversie: asc(), 0 çirul vid
chr(): ? len ('Ana '+'Maria')
10
? asc ('123') ? isalpha (x)
49 codul ASCII al caracterului 1 .T.
? asc ('abc') y='123'
97 codul ASCII al caracterului a z=123
? asc('abc')>asc('123') ? isalpha (y)
.T. deoarece 97>49 .F.
? asc ('A') ? isdigit (y)
65 codul ASCII al caracterului A .T.
? chr (65) ? isalpha (z)
A mesaj de eroare
? chr (7) ? isupper (x)
bip semnal sonor .T.
? asc ('1') = asc('123') ? islower (x)
.T. .F.
? 'z'==chr (asc('z'))
.T. 3. GeneraÆi çiruri de caractere folosind
? 122=asc (chr(122)) funcÆiile: replicate (), space():
.T.
? replicate ('*',10)
? chr(asc('Z')+32)
**********
z
? replicate (chr(7),5)
2. ObÆineÆi informaÆii despre un çir de bip, bip, bip, bip bip
caractere folosind funcÆiile len(), x='Buna'+space(8)+'ziua'
isalpha(), isdigit(), isupper(), ?x
islower(): Buna ziua
? len (x)
x='Albastru' 16
? len (x) ? replicate(' ',10)=space(10)
8 .T.
? len ('')
Utilizarea unor instrumente de prelucrarea datelor 89

4. EliminaÆi sau inseraÆi spaÆii çi in- ? proper(x)


seraÆi caractere într-un çir de carac- Abc
tere folosind funcÆiile: alltrim(), ltrim(), ? proper(y)
trim(), rtrim(), padc(), padl(), padr(): Abc
? proper(y) = proper(upper(x))
x= space(2)+'Popescu'+space(3) .T.
? len (x) ? proper(lower(y)) = proper(x)
12 .T.
? len (alltrim(x)) ? proper('AlFaBeT')
7 Alfabet
? alltrim(x)=='Popescu' ? upper(x) = lower(y)
.T. .F.
? len (ltrim(x)) ? upper(y) = lower(x)
10 .F.
? len (rtrim(x)) ? chrtran ('abcdef','bdf','111')
9 a1c1e1
y= ltrim (x) ? chrtran ('abcdef','bdf','xyz')
? len (y) axcyez
10 ? chrtran ('abcdef','bdf','12')
z=trim (y) a1c2e
? len (z) ? len (chrtran('abcdef','bdf','12'))
7 5
a='Salut' ? chrtran ('abcdef','bdf','xyzu')
? padc (a,15,'*') axcyez
*****Salut***** ? chrtran ('mosor','ms','tp')
? padc (a,16,'*') topor
*****Salut****** ? chrtran ('cotor','cor','nal')
? len(padc (a,15,'*')) natal
15 a='Am cumparat bilet la "Ala Bala
? padl (a,10,'*') Portocala"'
*****Salut b='la'
? padr (a,10,'*') c='na'
Salut***** d='vala'
? len(padr(a,15,'*'))= len(padl(a,15,' ')) e=strtran(a,b,c,2)
.T. ?e
? len(padr(a,15,'*'))= len(padc(a,15,' ')) Am cumparat bilet la "Ana Bana
.T. Portocana"
e=strtran(a,b,d,2,1)
5. TransformaÆi un çir de caractere fo-
?e
losind funcÆiile: lower(), upper(), Am cumparat bilet la "Avala Bala
proper(), chrtran(), strtran(), stuff(): Portocala"
x= 'abc' ?stuff('parcare',4,1,'taj')
y='ABC' partajare
? upper (x) ?stuff('caviar',3,3,'')
ABC car s-a çters subçirul 'via'
? lower (y) ?stuff('car',3,0,'via')
abc caviar s-a inserat subçirul 'via'
? lower(y) = x a=stuff('cod',4,0,'are')
.T. ?a
? upper(x) = y codare
.T. a=stuff(a,1,0,'dec')
?a
90 Informatică

decodare ? at ('nr', a)
16
6. ExecutaÆi operaÆii cu subçiruri de ? at ('Nr', a)
caractere folosind funcÆiile: left(), 0
right(), substr(), at(), rat(), atc(): ? atc ('Nr', a)
x= 'Marea Neagra' 16
y='untdelemn' ? rat('nr', a)
? left (x,5) 16
Marea a='Ala Bala Portocala'
? right (x,6) ? at ('la',a,1)
Neagra 2
? left(y,3) ? at ('la',a,2)
unt 7
? substr(y,4,2) ? at ('la',a,3)
de 17
? right(y,4) ? rat ('la',a,3)
lemn 2
? left(y,3)=substr(y,1,3) ? occurs('co','cocor')
.T. 2
? substr(y,len(y)-4+1,4) = right(y,4) ? occurs('la',a)
.T. 3
a='str. Iezerului nr. 32'

2.3. Funcţii pentru date folosite pentru gestionarea timpului


Pentru aceste funcÆii argumentul
este de tip datå pentru ges- Tipul Formatul de reprezentare
tionarea timpului sau de tip datå American/MDY ll/zz/aa
calendaristicå. Ansi aa.ll.zz
British/French/DMY zz/ll/aa
Reprezentarea datei calendaris- German zz.ll.aa
tice se poate face în mai multe Italian zz-ll-aa
formate, conform tabelului. Japan/YMD aa/ll/zz
Formatul determinå modul în USA ll-zz-aa
care este interpretatå o datå de
tip datå calendaristicå atunci când este scriså de la tastaturå sau atunci când este cititå
din memorie çi afiçatå 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 afiçare a anului cu patru cifre folosind comanda:
Set century on
Se poate modifica separatorul folosit în cadrul reprezentårii datei folosind comanda:
Set mark to ‘<delimitator>’
Modul în care este afiçatå data pentru gestionarea timpului poate fi controlat cu
urmåtoarele 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 împårÆitå în douå perioade de 12 ore (am çi pm) çi :
Set seconds on|off
care permite afiçarea timpului cu secunde (on) sau fårå secunde (off).

FuncÆia Sintaxa Ce reprezintå?


FuncÆii pentru aflarea timpului
Date Date() Furnizeazå data curentå preluatå din sistem. Rezultatul este
de tip datå calendaristicå.
DateTime DateTime() Furnizeazå data curentå çi momentul de timp preluate din
sistem. Rezultatul este de tip çir de caractere.
Time Time() Furnizeazå numai momentul de timp preluat din sistem.
Rezultatul este de tip çir de caractere.
FuncÆii pentru extragerea informaÆiilor 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 Day(x) Furnizeazå numårul zilei din lunå. Rezultatul este de tip N.
Dow Dow(x) Furnizeazå numårul zilei din såptåmânå. Rezultatul este de tip N.
Cdow Cdow(x) Furnizeazå numele zilei din såptåmânå. Rezultatul este de tip C.
Week Week(x) Furnizeazå numårul såptåmânii din an. Rezultatul este de tip N.
Month Month(x) Furnizeazå numårul lunii din an. Rezultatul este de tip N.
Cmonth Cmonth(x) Furnizeazå numele lunii. Rezultatul este de tip C.
Year Year(x) Furnizeazå numårul anului. Rezultatul este de tip N (cu patru cifre).
Hours Hours(y) Furnizeazå numårul orei. Rezultatul este de tip N.
Minute Minute(y) Furnizeazå numårul minutelor. Rezultatul este de tip N.
Sec Sec(y) Furnizeazå numårul secundelor. Rezultatul este de tip N.
Seconds Seconds() Furnizeazå numårul secundelor scurse de la miezul nopÆii.
Rezultatul este de tip N (real, în care partea întreagå reprezintå
secundele, iar partea fracÆionarå milisecundele).
FuncÆii pentru modificarea datei
Gomonth Gomonth(x,n) Argumentul x este de tip datå calendaristicå, iar argumentul n
de tip numeric întreg. FuncÆia furnizeazå un rezultat de tip
datå calendaristicå a cårei lunå este incrementatå cu n, da-
cå n este pozitiv çi decrementatå cu n, dacå n este negativ.

PrelucraÆi date folosite pentru gestionarea timpului:

1. ExtrageÆi informaÆii din timpul siste- ? date()


mului folosind funcÆiile: date(), time(), 03/02/01
timedate(): set date to british
? date()
92 Informatică

02/03/01 4. ExtrageÆi informaÆii despre luna din datå


set century on folosind funcÆiile: month(), cmonth():
? date()
02/03/2001 ? month (d)
set century off 5
? time() ? cmonth (d)
16:52:50 May
? datetime() ? gomonth(d,3)
02/03/01 04:53:00 PM 10/08/01
set hours to 24 5. ExtrageÆi informaÆii despre an din datå
? datetime()
folosind funcÆia: year():
02/03/01 16:54:23
? year(d)
2. ExtrageÆi informaÆii despre ziua din da- 2001
tå folosind funcÆiile: day(), dow(), 6. ExtrageÆi informaÆii despre orå, minute
cdow(): çi secunde din datå folosind funcÆiile:
d={10/05/01} hours(), minute(), sec(), seconds():
? day(d)
d=datetime()
10
? hours(d)
? dow(d)
17
5
? minute(d)
? cdow(d)
14
Thursday
? sec(d)
3. ExtrageÆi informaÆii despre såptåmâna 12
din datå folosind funcÆia: week(): ? seconds()
? week(d) 62135.20
19

2.4. Funcţii folosite pentru conversii


Pentru a realiza unele operaÆii este necesar ca un tip de datå så fie transformat într-un alt
tip de datå. Transformarea se face folosind funcÆiile pentru conversii. Se pot realiza
urmåtoarele conversii:
a. tip numeric ↔ tip çir de caractere

Val()
tip numeric tip çir de caractere

Str()

FuncÆia Sintaxa Ce reprezintå?


Str Str(m,n,p) Argumentele m,n çi p sunt de tip numeric. FuncÆia converteçte
numårul m într-un çir de caractere de lungime n care conÆine p
poziÆii pentru zecimale (cifre situate dupå punctul zecimal). Dacå
numårul conÆine mai multe poziÆii decât argumentul n, rezultatul va
Utilizarea unor instrumente de prelucrarea datelor 93

FuncÆia Sintaxa Ce reprezintå?


fi un çir de asteriscuri. Dacå numårul conÆine mai puÆine poziÆii
decât argumentul n, çirul de caractere va fi completat cu spaÆii
pânå la obÆinerea lungimii n. Dacå numårul p este mai mic decât
numårul de poziÆii zecimale, partea zecimalå va fi trunchiatå.
Val Val(x) Argumentul x este de tip çir de caractere. El trebuie så conÆinå
numai caracterele: cifre, punctul zecimal sau semnul minus, altfel
conversia se va face eronat. FuncÆia converteçte çirul de caractere
x într-un numår.
b. tip datå calendaristicå ↔ tip çir de caractere

Ctod()
tip datå calendaristicå tip çir de caractere

Dtoc(), Dtos()

FuncÆia Sintaxa Ce reprezintå?


Dtoc Dtoc(x) Argumentul x este de tip datå calendaristicå. FuncÆia furnizeazå un
çir de 8 caractere care reprezintå data. Are forma ll/zz/aa (douå
caractere pentru numårul lunii, douå pentru numårul zilei çi douå
pentru numårul anului, separarea fåcându-se cu caracterul /).
Dtos Dtos(x) Argumentul x este de tip datå calendaristicå. FuncÆia furnizeazå un
çir de 8 caractere care reprezintå data. Are forma aaaallzz (patru
caractere pentru an, douå pentru numårul lunii çi douå pentru
numårul zilei).
Ctod Ctod(x) Argumentul x este de tip çir de caractere care formeazå o datå
calendaristicå. FuncÆia 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()

FuncÆia Sintaxa Ce reprezintå?


Ttoc Ttoc(x) Argumentul x este de tip datå pentru gestionarea timpului. FuncÆia
converteçte aceastå datå într-un çir de caractere.
Ctot Ctot(x) Argumentul x este de tip çir de caractere. Çirul de caractere este de
forma zz/ll/aa hh:mm:ss apm (câte douå caractere pentru fiecare
element: zi, lunå, an, orå, minut, secundå çi am/pm). FuncÆia
converteçte ç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()

FuncÆia Sintaxa Ce reprezintå?


Ttod Ttoc(x) Argumentul x este de tip datå pentru gestionarea timpului. FuncÆia
converteçte aceastå datå într-o datå calendaristicå.
Dtot Ctot(x) Argumentul x este de tip datå calendaristicå. FuncÆia converteçte
aceastå datå într-o datå pentru gestionarea timpului, considerând
ora 12:00:00 am.
ObservaÆie:
Avantajul folosirii funcÆiei Dtos() în locul funcÆiei Dtoc() este acela cå formatul furnizat de
ea permite compararea corectå a douå date calendaristice.

FaceÆi conversii între tipuri de date:


1. ConvertiÆi numere ⇔ çiruri de carac- 20
tere folosind funcÆiile: val(), str(): ? str(a,2)+str(b,2)
1015
a='10' ? len(str(a,2)+str(b,2))
b='15' 4
? a+b a=12.5
1015 ? str(a)
? val(a)+val(b) 13
25.00 ? len(str(a))
c='-10' 10
? val(c) a=12345123451
-10 ? str(a)
x=val ('10,25') .1234E+11
? type('x') ? len(str(a))
N 10
?x
10.00 2. ConvertiÆi date calendaristice ⇔ çiruri
? val ('10a10') de caractere folosind funcÆiile: dtoc(),
10.00 dtos(), ctod():
a=10
b=15 d1={08/03/01}
? a+b d2={07/04/01}
25 x=dtoc(d1)
? str(a)+str(b) ?x
10 15 08/03/01
? len(str(a)+str(b)) y=dtoc(d2)
Utilizarea unor instrumente de prelucrarea datelor 95

?y 02/03/01 00:00:00
07/04/01 set hour to 12
?x>y ? dtot(b)
.T. 02/03/01 12:00:00 AM
x=dtos(d1)
?x 4. ConvertiÆi çir de caractere ⇔ mo-
20010308 ment de timp folosind funcÆiile: ctot(),
y=dtos(d2) ttoc():
?y a=datetime()
20010407 ?a
?x>y 02/03/01 04:52:12 PM
.F. b = ttoc(a)
3. ConvertiÆi data calendaristicå ⇔ mo- ?b
ment de timp folosind funcÆiile: dtot(), 02/03/01 04:52:12 PM
?type('b')
ttod():
C
a=datetime() c=ctot(b)
? ttod(a) ?c
02/03/01 02/03/01 04:52:12 PM
b=date() ?type('c')
? dtot(b) T

2.5. Funcţii de uz general


Aceste funcÆii se pot aplica pe mai multe tipuri de date:

FuncÆia Sintaxa Ce reprezintå?


Min() Min(x1,x2,…) Argumentele x1, x2,… trebuie så fie de acelaçi tip. FuncÆia
Max() Max(x1,x2,…) comparå între ele toate argumentele çi furnizeazå ca
rezultat valoarea cea mai micå, respectiv cea mai mare.
Between() Between(x,y,z) Argumentul x, y çi z trebuie så fie de acelaçi tip. FuncÆia
testeazå dacå valoarea argumentului x se gåseçte între
valorile y çi z. FuncÆia furnizeazå un rezultat logic (.T. dacå
este îndeplinitå relaÆia y<x<z).
Iif() Iif(x,y,z) Argumentul x trebuie så fie de tip logic. Rezultatul furnizat
depinde de valoarea lui x. Dacå x=.T., funcÆia afiçeazå va-
loarea lui y, iar dacå x=.F., funcÆia afiçeazå valoarea lui z.
Inlist() Inlist(x1,x2, FuncÆia furnizeazå un rezultat logic. Ea testeazå dacå
x2,…) primul argument x1 se gåseçte în lista descriså de ceilalÆi
parametri, x2, x3,… . În cazul în care valoarea se gåseçte
în listå, rezultatul este .T..
Type() Type(x) Testeazå tipul unui argument x scris ca un çir de caracte-
re. În funcÆie de conÆinutul çirului de caractere funcÆia va
furniza printr-o literå rezultatul: N-numeric, C-çir de carac-
tere, L-logic, D-datå calendaristicå, T-timp calendaristic,
M-memo, Y-monetar, O-obiect, G-general, U-necunoscut.
Empty Empty(x) Testeazå dacå o datå este vidå. Rezultatul furnizat este de
tip logic. Dacå data este vidå, rezultatul este .T..
96 Informatică

FuncÆia Sintaxa Ce reprezintå?


Evaluate Evaluate(x) FuncÆia evalueazå un argument x scris ca un çir de carac-
tere. În funcÆie de conÆinutul çirului de caractere, funcÆia va
furniza un rezultat de tip çir de caractere, numeric, datå
calendaristicå.
ObservaÆii:
1. O datå vidå este o datå care conÆine elementul neutru (nul) pentru acel tip de datå. De
aceea, conÆinutul unei date vide diferå în funcÆie de tipul datei. Astfel:
Tipul datei Formatul de reprezentare
çir de caractere çirul vid sau çirul de caractere format numai din spaÆii
(Chr(30)), caractere nul (Chr(0)), caractere Tab (Chr(9))
çi caractere sfârçit de linie (Chr(13), Chr(10)).
numeric 0
datå calendaristicå {} sau {//}
logic .F.
2. FuncÆia Evaluate poate identifica tipul datelor din çirul de caractere. De exemplu,
evaluate(‘2*5+5’) furnizeazå un rezultat de tip numeric egal cu 15, funcÆia evaluate(‘2>5’)
furnizeazå un rezultat de tip logic egal cu .F., funcÆia evaluate(‘{05/03/01}+2’) furnizeazå
un rezultat de tip datå calendaristicå egal cu data 05/05/01, iar funcÆia
evaluate(‘"abc"+"123"’) furnizeazå un rezultat de tip çir de caractere egal cu abc123.
3. FuncÆia Type poate identifica tipul expresiei scrise ca çir de
caractere. De exemplu, type(‘5+5’) furnizeazå tipul nume- nu da
ric (N), funcÆia type(‘2>5’) furnizeazå tipul logic (L), funcÆia x
type(‘{05/05/01}+10’) furnizeazå tipul datå calendaristicå
(D), iar funcÆia type(‘$20.00’) furnizeazå tipul monetar (Y). z y
4. FuncÆia Iif(x,y,z) poate fi folositå pentru o structurå alter-
nativå care este descriså în pseudocod astfel: if x then
write y else write z endif.

PrelucraÆi date de tipuri diferite cu ajutorul funcÆiilor generale


1. AtribuiÆi o valoare întreagå unei variabile de memorie çi verificaÆi dacå acel numår
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. TestaÆi 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. CalculaÆi maximul çi minimul:
a=1 1
b=2 ? max('a','b','c')
c=3 c
? max(a,b,c) ? min('a','b','c')
3 a
? min(a,b,c)
4. TestaÆi dacå un element existå în listå:
a=1 a='A'
c=inlist(a,1,2,3,4,5) c=inlist(lower(a),'a','e','i','o','u')
b1='Elementul este in lista' b1='Este vocala'
b2='Elementul nu este in lista' b2='Nu este vocala'
?iif(c,b1,b2) ?iif(c,b1,b2)
Elementul este in lista Este vocala
a=10 a='B'
c=inlist(a,1,2,3,4,5) c=inlist(lower(a),'a','e','i','o','u')
?iif(c,b1,b2) ?iif(c,b1,b2)
Elementul nu este in lista Nu este vocala
5. TestaÆi dacå o variabilå de memorie aparÆine unui interval:
a='a' litera mare
c=between(a, 'a','z') varsta=10
b1='litera mica' b1='minor'
b2='litera mare' b2='major'
? iif(c,b1,b2) ? iif(between(varsta,0,17), b1, b2)
litera mica minor
a='M' varsta=18
c=between(a, 'a','z') ? iif(between(varsta,0,17), b1, b2)
? iif(c,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
ÇtiÆi cå o variabilå de memorie reprezintå o zonå de memorie cåreia i se atribuie un nume
çi în care se poate memora valoarea unei date elementare de un anumit tip. Referirea la
variabila de memorie se face prin numele såu.
98 Informatică

Visual Fox Pro foloseçte


9 variabile de memorie utilizator,
9 variabile de memorie sistem.
Variabilele de memorie sistem sunt variabile proprii aplicaÆiei, pe care aceasta le
creeazå automat la lansarea în execuÆie çi pe care le påstreazå în memorie atât timp cât
este în execuÆie. Aceste variabile nu sunt çterse de comenzile obiçnuite de çtergere a
variabilelor de memorie. Identificatorul lor începe cu caracterul linie de subliniere _.
Variabilele de sistem sunt folosite de cåtre aplicaÆie pentru configurarea mediului Visual
FoxPro (de exemplu, configurarea formatelor de ieçire cåtre ecran sau cåtre imprimantå).
Variabilele de memorie utilizator sunt create de cåtre utilizatorul aplicaÆiei. Crearea lor
înseamnå: atribuirea unui nume, stabilirea tipului datelor pentru a se rezerva cores-
punzåtor o zonå de memorie çi atribuirea unei valori iniÆiale.
Asupra unei variabile de memorie se pot executa operaÆii de creare çi consultare.
Crearea unei variabile de memorie se face prin:
1. iniÆializare folosind
9 operaÆia de atribuire a unei valori (constantå sau valoare obÆinutå 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 açteaptå acÆionarea
unei taste. Caracterul tastei acÆionate poate fi påstrat într-o variabilå de memorie.
Aceste trei comenzi au sintaxa:
Accept | Input | Wait [<expresie>] to <nume_variabilå>
Adverbul <expresie> este opÆional çi este de tip çir de caractere. El reprezintå un mesaj
afiçat pe ecran, ca un prompter, care informeazå utilizatorul despre operaÆia de introdu-
cere date care urmeazå så se execute.
Consultarea unei variabile de memorie înseamnå vizualizarea conÆinutului ei pe ecran
sau la imprimantå. Pentru vizualizarea pe ecran puteÆi folosi comenzile:
9 ?. Înaintea afiçårii, cursorul este poziÆionat pe rândul urmåtor.
9 ??. Înaintea afiçårii, cursorul råmâne în poziÆia curentå. Cele douå comenzi au sintaxa:
? | ?? <listå_nume_variabile>
Pentru vizualizarea la imprimantå puteÆi folosi comanda:
9 ???. Comanda trimite cåtre imprimantå un çir de caractere exprimat printr-o
expresie de tip çir de caractere care poate conÆine çi variabile de memorie:
??? <expresie>
Utilizarea unor instrumente de prelucrare a datelor 99

PuteÆi obÆine informaÆii complexe despre un grup de variabile de memorie (nume, dacå
1
sunt publice - public sau particulare - private, tip, valoare) folosind comenzile List
Memory çi Display Memory:

List | Display Memory [Like <çablon>] [ to print | to file <nume_fiçier>]


<çablon> reprezintå descrierea grupului de variabile folosind convenÆiile clasice pentru
caracterele de înlocuire ? çi *. Lista de variabile de memorie poate fi afiçatå pe ecran sau
la imprimantå (to print) ori salvatå într-un fiçier (to file <nume_fiçier>).
Chiar dacå sistemul vå permite så definiÆi 65.000 de variabile de memorie, este bine så
çtergeÆi variabilele de memorie pe care nu le mai folosiÆi. OperaÆia se numeçte eliberarea
memoriei interne. PuteÆi folosi urmåtoarele comenzi:
1. pentru eliberarea globalå (çtergerea tuturor variabilelor de memorie):
9 Comanda Clear Memory çterge toate variabilele de memorie çi toate tablourile de
memorie, låsând numai variabilele de sistem.
9 Comanda Clear All çterge çi ea toate variabilele de memorie çi toate tablourile de
memorie, låsând 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 fiçierele
folosite pentru exploatarea bazei de date.
2. pentru eliberarea selectivå (çtergerea anumitor variabile de memorie) veÆi folosi
una dintre urmåtoarele comenzi (alegerea se va face în funcÆie de modul în care
puteÆi så descrieÆi 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å. VeÆi alege aceastå comandå dacå nu puteÆi så descrieÆi
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
a conÆinutului memoriei interne memoria internå memoria externå
alocatå aplicaÆiei çi se pierde (variabile de memorie) (fiçier .mem)
conÆinutul variabilelor de memo-
rie folosite. Ele pot fi salvate Restore from
(save) într-un fiçier (cu extensia .mem) de unde pot fi readuse ulterior în memoria internå,
operaÆie numitå restaurare (restore). Comenzile folosite pentru aceste operaÆii sunt:
9 Comanda Save to salveazå într-un fiçier identificat prin nume toate variabilele de me-
morie sau numai cele care corespund (Like) sau nu corespund (Except) unui çablon:
Save to <nume_fiçier> [All Like | Except <çablon>]

1
O variabilå publicå sau globalå poate fi folositå de orice subprogram al aplicaÆiei, iar o variabilå
particularå sau localå poate fi folositå numai în subprogramul în care a fost creatå. Toate
variabilele create în fereastra de comenzi sunt publice.
100 Informatică

9 Comanda Restore from readuce în memoria internå variabilele de memorie dintr-un


fiçier identificat prin nume; dacå nu se precizeazå clauza additive, variabilele de memo-
rie çi tablourile de memorie care existau în memorie înaintea restaurårii vor fi distruse:
Restore from <nume_fiçier> [Additive]

PrelucraÆi variabile de memorie


1. CreaÆi variabile de memorie; înainte de a crea aceste variabile de memorie eliberaÆi
memoria de orice alte variabile de memorie create anterior:
clear memory store a1*a2 to a3
store 0 to a1, a2, a3 accept 'Scrieti numele: ' to nume
store .T. to b1, b2 Scrieti numele: Popescu
x1='alfa' input 'Scrieti varsta: ' to varsta
x2='beta' Scrieti varsta: 18
a1=2 wait 'Raspundeti cu o litera: ' to b3
a2=7 Raspundeti cu o litera: x
2. ConsultaÆi variabilele de memorie:
? a1, a2, a3
2 7 14
?? a1, a2, a3
2 7 14 ( pe acelaçi rând cu råspunsul 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. EliberaÆi memoria internå :
display memory sunt afiçate informaÆii despre varia-
sunt afiçate informaÆii despre toate bilele råmase: b1, b2, b3, x1, x2
variabilele definite anterior: a1, a2, release all except b?
a3, b1, b2, b3, x1, x2, nume, vârsta display memory
release varsta, nume sunt afiçate informaÆii despre varia-
display memory bilele råmase: b1, b2, b3
sunt afiçate informaÆii despre release all
variabilele råmase: a1, a2, a3, b1, display memory
b2, b3, x1, x2 nu mai sunt afiçate informaÆii
release all like a? despre variabile utilizator
display memory
Utilizarea unor instrumente de prelucrare a datelor 101

4. TestaÆi urmåtoarea secvenÆå de instrucÆiuni pentru mai multe valori ale variabilelor a,
b çi c, definite astfel: (a,b,c)∈ {(2,3,4), (2,3,3), (3,3,3), (2,1,4)}.
input 'a= ' to a
input 'b= ' to b
input 'c= ' to c
b1='Nu este triunghi'
b2='Triunghi oarecare'
b3='Triunghi echilateral'
b4='Triunghi isoscel'
c1=a+b>c and b+c>a and c+a>b
c2= a=b and b=c
c3= a=b or a=c or b=c
? iif(c1, iif(c2, b3, iif(c3 b4,b2)),b1)
Ce realizeazå aceastå secvenÆå de comenzi? ScrieÆi secvenÆa de comenzi într-un fiçier
de tip program executabil cu numele alfa. FolosiÆi comanda:
modify command alfa
ExecutaÆi programul pentru fiecare valoare a tripletului (a,b,c) din mulÆimea de definiÆie.
Pentru executarea programului folosiÆi comanda:
do alfa
5. TestaÆi urmåtoarea secvenÆå de instrucÆiuni pentru mai multe valori ale variabilelor a,
b çi c, definite astfel: (a,b,c)∈ {(2,3,4), (5,3,4), (2,3,3), (2,1,4)}
input 'a= ' to a
input 'b= ' to b
input 'c= ' to c
x=a^2
y=b^2
z=c^2
b1='nu este triunghi'
b2='triunghi dreptunghic'
b3='triunghi ascutitunghic'
b4='triunghi optuzunghic'
c1=a+b>c and b+c>a and c+a>b
c2=x+y=z or y+z=x or z+x=y
c3=x+y>z and y+z>x and z+x>y
c4=x+y<z or y+z<x or z+x<y
? iif(c1, iif( c2,b2, iif(c3,b3, iif(c4,b4,''))),b1)
Ce realizeazå aceastå secvenÆå de comenzi? ScrieÆi secvenÆa de comenzi într-un fiçier
de tip program executabil cu numele beta. FolosiÆi comanda:
modify command beta
ExecutaÆi programul pentru fiecare valoare a tripletului (a,b,c) din mulÆimea de definiÆie.
Pentru executarea programului folosiÆi comanda:
do beta
ÎnlocuiÆi ultima comandå din program cu comanda:
? iif(c1, iif( c2,b2, iif(c3,b3,b4)),b1)
ReluaÆi execuÆia programului modificat pentru fiecare valoare a tripletului (a,b,c) din
mulÆimea de definiÆie. Ce constataÆi?
102 Informatică

# ÎncercaÆi:

AråtaÆi corespondenÆele:
Se evalueazå funcÆia:
?iif(inlist(n,1,2,3,4,5,6), iif(2**n=a,'1 octet', iif(2**n=b, ' 2 octeti',
iif(2**n=c, '8 octeti', 'incorect'))), 'incorect')
unde a=8, b=16, c=64. LegaÆi prin linii fiecare element din coloana n de elementul
corespunzåtor din coloana Afiçeazå:
n: Afiçeazå:
1
2 a 1 octet
3
4 b 2 octeÆi
5
6 c 8 octeÆi
7
8 d incorect
Adevårat/Fals:
1. FuncÆia isdigit('123') furnizeazå rezultatul adevårat.
2. Pentru a afiça çirul de caractere 12345 din numårul întreg 12345 folosiÆi funcÆia
str(12345,5,0).
3. Rezultatul funcÆiei max(day(d)+2,month(d)+5) este 7 pentru valoarea {02/04/01} a
variabilei de memorie d afiçatå în formatul american.
4. FuncÆia prin care convertiÆi un caracter în codul såu ASCII se numeçte val.
5. EliminaÆi spaÆiile din stânga unui çir de caractere cu funcÆia left().
6. FuncÆia at() înlocuieçte într-un çir de caractere un subçir cu un alt subçir.
7. FuncÆia floor() se foloseçte pentru aproximarea unui numår.
8. Comanda ?? se foloseçte pentru a afiça la imprimantå un çir de caractere.
CompletaÆi:
1. FuncÆia mod(10,5) furnizeazå rezultatul …………
2. FuncÆia len(padc(5,'alfa')) afiçeazå valoarea ......
3. FuncÆia occurs('a','calamar') afiçeazå rezultatul ...............
4. FuncÆia prin care convertiÆi un numår într-un çir de caractere se numeçte ........
5. Pentru a extrage n caractere dintr-un çir de caractere folosiÆi funcÆia ..............
6. FuncÆia str() cu care puteÆi så obÆineÆi çirul de caractere 123 din numårul 123.45 este ....
7. Pentru a obÆine valoarea numericå 23 din çirul de caractere .1234 veÆi folosi funcÆiile: ......
8. Pentru a obÆine valoarea 23 din numårul 1234 veÆi folosi funcÆiile .............
AlegeÆi råspunsurile corecte:
1. FuncÆia ceiling(-3.5) afiçeazå:
a) -3 b) -4 c) 4
2. FuncÆia round(3.5) afiçeazå:
a) 3 b) 4 c) eroare
Utilizarea unor instrumente de prelucrare a datelor 103

3. FuncÆia floor(3.5) afiçeazå:


a) 3 b) 3.5 c) 4
4. FuncÆia int(-3.5) afiçeazå:
a) -3 b) -4 c) 3
5. SecvenÆa de comenzi set decimals to 3 çi ?pi() afiçeazå:
a) 3.1 b) 3.14 c) 3.142
6. FuncÆia inlist(1, 2, 3, 4) furnizeazå rezultatul:
a) .T. b) .F. c) 10
7. FuncÆia between(1, 2, 3) furnizeazå rezultatul:
a) .T. b) .F. c) 6
8. FuncÆia type('2B') furnizeazå rezultatul:
a) N b) C c) U
9. Data d are valoarea {05/04/01} în formatul american. Rezultatul furnizat de funcÆia
min(day(d)-2, month(d)-2,year(d)) are valoarea:
a) 1 b) 2 c) 3
10. FuncÆia strtran('ala bala','a','o',2,1) furnizeazå rezultatul:
a) olo bala b) alo bala c) alo bolo
11. FuncÆia str (12345,3, 2) furnizeazå rezultatul:
a) 123.45 b) 12.345 c) eroare
12. Care dintre urmåtoarele 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', funcÆia val (left(x,6)) furnizeazå rezultatul:
a) 1234.56 b) 1234.50 c) eroare
14. Dacå x='10.5' çi y=',25', pentru a obÆine valoarea numericå 10.25 folosiÆi:
a) val(left(x,2)+y) b) val(left(x,2))+val(y) c) val(x+y)-0.25 d) val(x+y)
RåspundeÆi:
1. Cum puteÆi afiça o expresie la imprimantå? De ce tip trebuie så fie expresia?
2. CâÆi parametri are funcÆia round()? Ce se întâmplå dacå lipseçte un parametru?
3. CâÆi parametri are funcÆia string()? Ce se întâmplå dacå lipseçte un parametru?
4. Ce funcÆii puteÆi folosi pentru a testa primul caracter dintr-un çir de caractere?
5. Ce funcÆii puteÆi folosi pentru a genera un çir de caractere?
6. Ce funcÆii puteÆi folosi pentru a elimina spaÆiile dintr-un çir de caractere? Ce criterii de
comparare puteÆi folosi pentru aceste funcÆii?
7. Ce funcÆii puteÆi folosi pentru a insera un subçir de caractere într-un çir de caractere?
8. Ce funcÆii puteÆi folosi pentru a çterge un subçir de caractere într-un çir de caractere?
9. Ce funcÆii puteÆi folosi pentru a descompune un cuvânt compus în cuvintele care îl compun?
10. Cu ce comandå puteÆi stabili formatul unei date calendaristice? Cum se numeçte for-
matul zz/ll/aa?
104 Informatică

11. Ce funcÆie puteÆi folosi pentru a testa dacå valoarea unei date aparÆine unui interval?
Dar pentru a testa dacå aparÆine unei mulÆimi de valori?
12. Ce funcÆie puteÆi folosi pentru a descrie o structurå alternativå?
13. ScrieÆi funcÆiile prin care puteÆi så realizaÆi urmåtoarele transformåri de cuvinte:
cor ⇒ color
covor ⇒ cotor ⇒ color ⇒ cosor ⇒ cosar
covor ⇒ cotor ⇒ motor ⇒ mosor
calculator ⇒ calator ⇒ abator ⇒ abatere
14. ScrieÆi funcÆiile prin care descompuneÆi în cuvintele componente urmåtoarele cuvinte
compuse çi expresii: viÆa de vie, Spitalul de UrgenÆå, Delta Dunårii çi cocoçul de munte.
15. Trebuie så çtergeÆi un grup de variabile de memorie. Ce operaÆie veÆi folosi dacå puteÆi så
descrieÆi grupul printr-un çablon? Ce operaÆie veÆi folosi dacå nu puteÆi så descrieÆi grupul
printr-un çablon?

R åspunsuri:
AråtaÆi corespondenÆele: 1-d; 2-d; 3-a; 4-b; 5-d; 6-c; 7-d; 8-d.
Adevårat/Fals: 1-A; 2-A; 3-A; 4-F; 5-F; 6-F; 7-A; 8-F.
CompletaÆi: 1-0; 2-5; 3-3; 4-str(); 5-substr(); 6-str(123.45,3); 7-int(val(substr('.1234',3,2)));
8-int(val(substr(str(1234,4),2,2)))
AlegeÆi råspunsurile corecte: 1-a; 2-c; 3-a; 4-a; 5-c;6-b; 7-b; 8-c; 9-b; 10-b; 11-c;12-b,c; 13-b; 14-a,b,c.

T est pentru evaluare:


1. CreaÆi 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.
VerificaÆi cå aÆi definit corect variabilele de memorie afiçând tipul çi dacå sunt vide.
2. VizualizaÆi conÆinutul variabilelor de memorie create.
3. AflaÆi ce tip de rezultat furnizeazå funcÆia Seconds().
4. ModificaÆi conÆinutul variabilei de memorie astfel încât så-çi påstreze tipul. În cele
patru variabile de memorie veÆi påstra urmåtoarele informaÆii:
a1 - numårul de secunde scurse de la miezul nopÆii,
a2 - un çir de caractere format din 10 grupuri de caractere *1!,
a3 - data curentå,
a4 - rezultatul comparårii expresiilor e1 çi e2: e1 = (72/5+5)*5 çi e2 = (40-6+2*8)*2
VizualizaÆi conÆinutul variabilelor de memorie çi verificaÆi dacå çi-au påstrat tipul.
VizualizaÆi variabila de memorie de tip datå calendaristicå în formatul zz/ll/aa.
5. AfiçaÆi pe ecran o linie cu urmåtorul conÆinut:
zz/ll/aa ********** Buna ziua ********** hh:mm:ss
Afiçarea se va face printr-o singurå comandå, fårå a folosi variabile de memorie.
6. CopiaÆi conÆinutul variabilelor de memorie a1, a2, a3 çi a4 în variabilele de memorie
b1, b2, b3 çi b4.
7. AfiçaÆi urmåtoarele informaÆii:
Utilizarea unor instrumente de prelucrare a datelor 105

9 partea întreagå din numårul memorat în variabila de memorie b1,


9 numårul memorat în variabila de memorie b1, rotunjit la partea întreagå, prin adåugare,
9 numårul memorat în variabila de memorie b1, rotunjit la partea întreagå, prin pierdere,
ExtrageÆi partea fracÆionarå din numårul memorat în variabila de memorie b1.
8. MemoraÆi în variabilele de memorie a1, a2, …, a6 cuvintele din urmåtorul text:
Uf! Am terminat o saptamana obositoare
Folosind macrosubstituÆia prin intermediul variabilei de memorie z, afiçaÆi textul pe ecran.
MemoraÆi textul în variabila de memorie w.
9. AfiçaÆi textul:
Uf! Am terminat o saptamana obositoare!!!
astfel încât la sfârçitul tipåririi så se audå un semnal sonor.
10. Folosind textul din variabila de memorie w, scrieÆi pe ecran urmåtoarele texte:
Uf! Am Terminat O Saptamana Obositoare!!!
uf! am terminat o saptamana obositoare!!!
UF! AM TERMINAT O SAPTAMANA OBOSITOARE!!!
uf! Terminat OBOSITOARE
11. VerificaÆi dacå existå çirul de caractere ‘oa’ în variabila de memorie w. Dacå existå,
aflaÆi poziÆia în care se gåseçte. ExecutaÆi operaÆia în douå moduri.
12. AfiçaÆi în ce zi a såptåmânii suntem.
13. AfiçaÆi câte zile mai sunt pânå la sfârçitul anului. AfiçaÆi câte såptåmâni mai sunt
pânå la sfârçitul anului sub forma urmåtorului mesaj:
Mai sunt nn saptamani si m zile.
Unde nn reprezintå numårul de såptåmâni, iar m numårul de zile.
14. AfiçaÆi ora sub forma unui çir de caractere: ===== hh:mm:ss =====
ExecutaÆi operaÆia în patru moduri diferite.
15. ConstruiÆi variabila de memorie t care conÆine urmåtorul çir de caractere: 5 spaÆii, ora
çi 5 spaÆii. AfiçaÆi conÆinutul çirului çi lungimea lui.
16. EliminaÆi spaÆiile din çirul de caractere memorat în variabila t. ExecutaÆi operaÆia în douå
moduri diferite. MemoraÆi çirul de caractere fårå spaÆii în variabila de memorie u.
ComparaÆi lungimile celor douå çiruri de caractere. AfiçaÆi diferenÆa dintre lungimile lor.
17. TransformaÆi printr-o funcÆie pentru date de tip çir de caractere urmåtoarele cuvinte:
copac ⇒ capac çi capac ⇒ copac. ExecutaÆi operaÆia în douå moduri diferite.
18. ScrieÆi un program care så rezolve urmåtoarea problemå:
Pentru executarea unei piese sunt necesare x minute. AfiçaÆi timpul necesar confec-
Æionårii a n piese, exprimat în numår de zile, ore çi minute. La fabricarea pieselor se
lucreazå în ritm continuu (24 de ore pe zi).
19. AfiçaÆi lista cu variabilele de memorie pe care le-aÆi creat. În aceastå listå se gåsesc
çi variabilele de memorie definite în programul de la punctul 18. De ce?
20. ÇtergeÆi variabilele de memorie a1, b2 çi u. VerificaÆi cå operaÆia s-a executat corect.
21. ÇtergeÆi variabilele de memorie b1, b3 çi b4. VerificaÆi cå operaÆia s-a executat
corect.
22. ÇtergeÆi toate variabilele de memorie, mai puÆin variabila t. VerificaÆi cå operaÆia s-a
executat corect.
23. EliberaÆi memoria internå.
106 Informatică

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

4. Operaţii cu datele dintr-un tabel al bazei de date


Exploatarea unui tabel constå în:
9 OperaÆii de actualizare cum sunt cele de adåugare a unei noi înregistråri, de
çtergere a unei înregistråri sau de modificare a valorii unor câmpuri din înregistråri.
9 OperaÆii de consultare (interogare) prin care se pot obÆine informaÆii din tabel.
Aceste operaÆii presupun çi operaÆii de cåutare a anumitor înregistråri. OperaÆiile de
cåutare trebuie så precizeze criteriul de cåutare çi modul de afiçare a informaÆiilor
(pe ecran, la imprimantå etc.). OperaÆia de consultare este posibil så necesite în
prealabil o operaÆie de sortare (de reordonare fizicå a înregistrårilor din tabel).
Exploatarea unui tabel se poate face:
9 SecvenÆial, adicå în ordinea fizicå a înregistrårilor (ordinea în care au fost scrise
în tabel).
9 În acces direct, adicå în ordinea logicå a înregistrårilor (ordinea datå de valoarea
crescåtoare sau descrescåtoare a unui câmp din tabel). Pentru a avea acces direct,
înregistrårile din tabel trebuie ordonate logic. Ordonarea logicå se face prin crearea
unui fiçier numit fiçier de index care memoreazå ordinea logicå a înregistrårilor.
ObservaÆie:
Sortarea este operaÆia de ordonare fizicå a înregistrårilor dintr-un tabel. Prin aceastå
operaÆie se creeazå un nou tabel în care înregistrårile sunt scrise conform criteriului de
ordonare precizat. Indexarea este operaÆia de ordonare logicå a înregistrårilor dintr-un
tabel. Prin aceastå operaÆie se creeazå un fiçier special asociat tabelului, numit fiçier de
index care se exploateazå împreunå cu tabelul (se deschide çi se închide împreunå cu
acesta) çi care påstreazå evidenÆa ordinii logice a înregistrårilor. El are douå câmpuri: un
câmp care conÆine valoarea câmpului folosit pentru indexare (care determinå ordonarea)
numit çi cheie de indexare çi un câmp cu numårul înregistrårii din tabel în care se
gåseçte câmpul. Acest fiçier este ordonat crescåtor sau descrescåtor dupå valoarea cheii
de indexare:
Tabelul Indexul
nr. înreg. a b c ..... a nr. înreg.
1 10 100 a 10 1
2 40 300 b 12 7
3 45 200 a 23 4
4 23 100 c 34 8
5 89 200 d 40 2
6 90 400 a 45 3
7 12 500 b 89 5
8 34 800 c 90 6

Cåutarea unei înregistråri dupå valoarea unui câmp se face mult mai rapid atunci când
înregistrårile sunt ordonate dupå acel câmp, deoarece în cazul unei structuri ordonate se pot
folosi diferiÆi algoritmi de cåutare. De exemplu, pentru a gåsi înregistrarea care îndeplineçte
condiÆia a=34 (valoarea câmpului a este 34), în cazul unei parcurgeri secvenÆiale se vor
executa 8 operaÆii de verificare, câte una pentru fiecare înregistrare. În cazul ordonårii
structurii se poate folosi, de exemplu, algoritmul de înjumåtåÆire a intervalului. Cåutarea se
108 Informatică

va face în fiçierul index folosind acest algoritm. Se împarte fiçierul în douå: în prima jumåtate
se vor gåsi înregistrårile pentru care a∈[10,34], iar în a doua jumåtate se vor gåsi înregistrårile
pentru care a∈[40,90]. Se verificå çi se vede cå valoarea 34 a câmpului a aparÆine primului
interval. Se împarte çi acest interval în douå: în prima jumåtate se vor gåsi înregistrårile pentru
care a∈[10,12], iar în a doua jumåtate se vor gåsi înregistrårile pentru care a∈[23,34]. Se
verificå çi se vede cå valoarea 34 a câmpului a aparÆine celui de-al doilea interval. Se împarte
çi acest interval în douå: în prima jumåtate se va gåsi o singurå valoare (23), iar în a doua
jumåtate se va gåsi o singurå valoare (34), care este valoarea cåutatå. Pentru aceastå
valoare, în index existå numårul înregistrårii: 8. Se poziÆioneazå în tabel pointerul de
înregistrare direct pe înregistrarea 8. În acest caz s-au executat numai trei operaÆii de
verificare (de apartenenÆå a valorii câmpului a la un interval).
Start
Indiferent de modul în care este exploatat tabelul, algoritmul de exploatare
cuprinde urmåtorii paçi: deschiderea tabelului, prelucrarea çi închiderea.
Open
Tabelul este memorat într-un fiçier de date care are acelaçi nume ca çi
tabelul çi extensia .dbf. Pentru a se putea prelucra înregistrårile dintr-un
tabel, trebuie deschis fiçierul în care acesta este påstrat. Prin operaÆia de Prelucrare
deschidere i se alocå o zonå de memorie internå în care urmeazå så fie
transferate de pe disc înregistrårile care vor fi prelucrate. Deschiderea Close
fiçierului se face fie folosind opÆiunea de meniu Open...∈File, fie prin
intermediul comenzii:
use <nume_fiçier> Stop
Dupå ce aÆi prelucrat înregistrårile din tabel trebuie închis fiçierul. Prin
operaÆia de închidere se elibereazå zona de memorie internå alocatå fiçierului. Închiderea
fiçierului se face prin intermediul comenzii:
use
Mai puteÆi så închideÆi tabelul din fereastra View (pe care o deschideÆi cu opÆiunea View
Window∈Window). SelectaÆi numele tabelului çi executaÆi clic pe declançatorul Close.
OperaÆiile puse la dispoziÆie de Visual FoxPro pentru administrarea datelor dintr-un tabel
al bazei de date pot fi grupate astfel:
1. Crearea unui tabel care cuprinde operaÆii pentru:
9 crearea structurii tabelului,
9 manipularea structurii tabelului;
2. Exploatarea unui tabel în acces secvenÆial care cuprinde operaÆii pentru:
9 localizarea înregistrårilor prin parcurgere secvenÆialå a înregistrårilor din tabel,
9 actualizarea tabelului,
9 controlarea accesului la înregistråri,
9 consultarea tabelului;
3. Exploatarea unui tabel în acces direct care cuprinde operaÆii pentru:
9 crearea çi administrarea fiçierelor index,
9 localizarea înregistrårilor dupå valoarea unei chei.
ObservaÆie:
Toate comenzile au un domeniu implicit de acÆiune. Domeniul implicit de acÆiune poate
fi schimbat prin explicitarea cu adverbele care sunt scrise între parantezele påtrate [ ].
Utilizarea unor instrumente de prelucrare a datelor 109

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 adåugat la o bazå de date. În
continuare vor fi prezentate metodele prin care puteÆi 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 puteÆi stabili reguli de validare çi nici chei primare, aça cum puteÆi 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
numeçte compus¸ deoarece poate conÆine 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 numeçte structural deoarece are acelaçi
nume ca çi tabelul. Extensia sa este .cdx. El se creeazå automat la crearea tabelului dacå
definiÆi o etichetå de index çi se deschide automat împreunå cu tabelul. Este actualizat
automat dupå fiecare operaÆie de actualizare a tabelului (çtergerea sau adåugarea unei
înregistråri sau modificarea câmpurilor dintr-o înregistrare). Indecçii pot fi:
9 Primary - cheia primarå. Se poate folosi numai în cazul în care tabelul se gåseçte
î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 conÆine 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 conÆine valori
duplicate. Dacå existå douå înregistråri cu aceeaçi valoare a cheii unice, va fi
vizibilå logic numai prima dintre ele, chiar dacå fizic existå amândouå.
9 Regular - cheia obiçnuitå.
Folosind indexarea puteÆi:
9 så ordonaÆi înregistrårile afiçate din tabel (indexul poate fi cheie obiçnuitå, candidat
sau cheie primarå);
9 så controlaÆi valorile duble introduse într-un câmp (indexul poate fi cheie candidat
sau primarå pentru baze de date çi cheie candidat pentru tabelele libere);
9 så definiÆi relaÆii între tabele (indexul poate fi cheie obiçnuitå, candidat sau primarå).
4.1.1. Crearea structurii tabelului
În urma operaÆiei 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 defineçte prin intermediul controalelor din fereastra document
a generatorului de tabele Table Designer; deschiderea ferestrei se poate face fie prin
intermediul opÆiunii de meniu New...∈File, fie prin intermediul comenzii:
create <nume_tabel>
9 folosind limbajul de comandå - structura se defineçte prin intermediul adverbelor
din comanda SQL:
create table <nume_tabel> (<nume_câmp1> <tip1> (<låÆime1> [,<poz_zec1>]
[<nume_câmp2> <tip2> (<låÆime2> [,<poz_zec2>]...]
110 Informatică

unde <nume_tabel> este numele tabelului care se creeazå çi a cårui structurå se


defineçte prin precizarea pentru fiecare câmp a numelui såu <nume_câmp>, a
tipului <tip>, a dimensiunii <låÆime> çi a numårului de poziÆii din partea fracÆionarå
<poz_zec> (numai pentru câmpurile 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 påstreazå informaÆii despre structura unui alt tabel (proprietåÆile câmpurilor).
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 cårui 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 câmpurile din
structurå sau numai o parte din ele. Sintaxa comenzii este:
copy structure to <nume_tabel> [fields <listå_nume_câmpuri>]
unde <nume_tabel> este numele tabelului care se creeazå çi a cårui structurå se
preia din tabelul deschis în acel moment; se pot prelua toate câmpurile sau numai
câmpurile precizate în lista clauzei fields.
4.1.2. Manipularea structurii tabelului
Manipularea structurii unui tabel se face prin urmåtoarele operaÆii:
1. Afiçarea structurii tabelului:
Structura tabelului poate fi afiçatå cu comenzile list structure çi display structure.
Deosebirea dintre aceste douå comenzi constå în modul în care se face afiçarea:
comanda display structure afiçeazå în regim paginat (dupå umplerea ecranului se
açteaptå confirmare din partea utilizatorului pentru a continua afiçarea), iar comanda list
structure afiçeazå în regim de defilare (este derulatå pe ecran toatå informaÆia chiar
dacå depåçeçte capacitatea de afiçare a ecranului; se vor putea vedea astfel numai
ultimele câmpuri din tabel). Comenzile au aceeaçi sintaxå:
display | list structure [to printer | to file <nume_fiçier>] [no console]
Domeniul implicit al comenzii se referå la faptul cå afiçarea se face pe ecran. Explicit, afiçarea
se poate face çi la imprimantå sau într-un fiçier (adverbele to printer sau to file), sau numai
la unul dintre acestea, inhibându-se ieçirea cåtre 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 conÆine aceleaçi controale ca çi la
crearea tabelului. PuteÆi så faceÆi urmåtoarele modificåri:
9 så inseraÆi câmpuri noi,
9 så çtergeÆi câmpuri,
9 så modificaÆi caracteristicile unui câmp (nume, tip, lungime).
Înaintea modificårilor, aplicaÆia salveazå datele din tabel într-un fiçier cu acelaçi nume çi
cu extensia .bak pentru tabel çi .tbk pentru fiçierul memo asociat tabelului (care conÆine
valorile pentru câmpurile memo). Dupå efectuarea modificårilor de structurå, datele vor fi
Utilizarea unor instrumente de prelucrare a datelor 111

adåugate din aceste fiçiere la noua structurå de tabel. PuteÆi så påstraÆi çi vechea versi-
une, redenumind fiçierele nume.bak cu nume_nou.dbf çi nume.tbk cu nume_nou.fpt.
Mai puteÆi så deschideÆi caseta de dialog çi din fereastra View. SelectaÆi numele tabelului
çi executaÆi clic pe declançatorul Properties.... În caseta de dialog Work Area
Properties executaÆi clic pe declançatorul Modify....
3. Copierea structurii tabelului:
PuteÆi så copiaÆi structura tabelului deschis:
9 Într-un tabel de structurå. Acest tabel are o structurå predefinitå. El conÆine 11
câmpuri, câte un câmp pentru fiecare proprietate a câmpului (de exemplu,
field_name pentru numele câmpului, field_type pentru tipul câmpului, field_len
pentru lungimea câmpului, field_dec pentru numårul de poziÆii ale pårÆii fracÆionare,
field_null pentru a stabili dacå se acceptå valoarea null în câmp, field_defa pentru
valoare implicitå a câmpului etc.). În tabel existå câte o înregistrare pentru fiecare
câmp (açadar, va avea atâtea înregistråri, câte câmpuri are tabelul pentru care
påstreazå structura). Sintaxa comenzii este:
copy to <nume_tabel> structure extended
unde <nume_tabel> este numele tabelului în care se va påstra structura.
9 Într-un tabel precizat prin <nume_tabel>. Pot fi copiate toate câmpurile din
structurå sau numai o parte din ele. Sintaxa comenzii este:
copy structure to <nume_tabel> [fields <listå_nume_câmpuri>]
ObservaÆie:
Pentru a vedea ce conÆin tabelele în care au fost copiate structurile, trebuie så le deschideÆi.
ObservaÆie:
Dacå într-o comandå nu se specificå numele unui tabel, înseamnå cå ea se referå la
tabelul deschis. De exemplu, comenzile list structure, modify structure etc.
4.1.3. Manipularea çi controlarea câmpurilor dintr-un tabel
Câmpurile dintr-un tabel pot fi manipulate çi controlate prin intermediul comenzilor Set çi
al funcÆiilor.
1. Prin intermediul comenzilor set se poate controla accesul la câmpuri:
9 Controlul accesului la câmpuri poate fi activat (on) sau inhibat (off) cu comanda:
set fields on|off
Valoarea implicitå este off.
9 Se pot preciza câmpurile la care poate avea acces utilizatorul cu comanda:
set fields to [<listå_câmpuri> | all]
De exemplu:
a. Se poate preciza cå utilizatorul are acces la toate câmpurile:
set fields to all
sau
set fields off
b. Se poate preciza cå utilizatorul are acces numai la câmpurile nume çi pren:
set fields to nume, pren
c. Se poate preciza cå utilizatorul nu are acces la nici un câmp:
set fields to
112 Informatică

2. Prin intermediul funcÆiilor se pot obÆine informaÆii despre câmpuri:


9 numele câmpului dintr-o poziÆie precizatå se obÆine cu funcÆia field(<n>), unde <n>
este numårul de ordine al câmpului;
9 numårul de câmpuri din tabel se obÆine cu funcÆia fcount();
9 lungimea unui câmp din tabel se obÆine cu funcÆia fsize(<nume>) unde <nume>
este numele câmpului;
9 dimensiunea înregistrårii din tabel se obÆine cu funcÆia recsize().
4.1.4. Câmpurile memo
AÆi aflat cå un câmp memo se foloseçte pentru påstrarea textelor (a çirurilor de caractere
cu lungime variabilå sau mai mare de 255 de caractere). AÆi mai aflat cå ele se påstreazå
într-un fiçier separat, asociat tabelului (are acelaçi nume cu tabelul, are extensia .fpt çi
este deschis çi închis împreunå cu tabelul). Câmpul memo din tabel memoreazå de fapt
adresa la care se gåsesc datele din câmp în fiçierul memo.
Utilizatorul poate încårca datele într-un câmp memo:
9 de la tastaturå,
9 dintr-un fiçier,
9 din memoria internå (dintr-o variabilå de memorie).
Introducerea unui câmp memo de la tastaturå se face prin intermediul fetrestrei de edi-
tare a unui câmp memo. Dacå este deschiså o fereastrå de editare a tabelului, deschideÆi
fereastra de editare memo poziÆionând cursorul pe câmp çi executând dublu clic sau
apåsând tastele Ctrl+PageDown| PageUp. Dacå nu este deschiså fereastra de editare a
tabelului, poziÆionaÆi pointerul de înregistrare pe înregistrarea în care vreÆi så scrieÆi va-
loarea câmpului memo çi deschideÆi fereastra de editare memo cu comanda:
modify memo <nume_câmp>
Preluarea unui câmp memo dintr-un fiçier cu texte (extensia .txt) se face cu comanda:
append memo <nume_câmp> from <nume_fiçier> [overwrite]
Fiçierul din care se preia valorea se identificå prin <nume_fiçier>. Încårcarea valorii se
face implicit la sfârçitul textului care existå deja. Explicit se poate rescrie peste vechiul
conÆinut cu clauza [overwrite]. Comanda complementarå este cea de copiere a valorii
unui câmp memo într-un fiçier text:
copy memo <nume_câmp> to <nume_fiçier> [additive]
Preluarea unui câmp memo dintr-o variabilå de memorie se face cu comanda:
replace <nume_câmp> with <nume_variabilå>
Comanda complementarå este cea de copiere a valorii unui câmp memo într-o variabilå
de memorie, folosind operaÆia de atribuire.

Obiectul: realizarea bazei de date a unei companii care oferå servicii de consultanÆå.
Scopul bazei de date: gestionarea serviciilor de consultanÆå asigurate clienÆilor de cåtre
angajaÆii companiei.
Utilizarea unor instrumente de prelucrare a datelor 113

CerinÆe:
9 Fiecare angajat al companiei are o persoanå din cadrul companiei care îi monito-
rizeazå çi îi supervizeazå activitatea.
9 Atunci când un client solicitå pentru prima datå serviciile acestei companii, i se
repartizeazå un angajat care så se ocupe de el. De obicei angajatul se întâlneçte cu
clientul pânå când i se rezolvå problema.
9 În cadrul primei discuÆii, angajatul stabileçte obiectivele consultanÆei, termenele çi
costul estimativ. Aceste date se pot modifica pe parcursul desfåçurårii consultanÆei.
Toate aceste modificåri trebuie påstrate în baza de date.
9 Pentru fiecare çedinÆå de consultanÆå trebuie så se påstreze date despre modul în
care serviciile prestate de angajat îndeplinesc obiectivele consultanÆei, în conformitate
cu termenele stabilite. Pentru fiecare çedinÆå se vor înregistra urmåtoarele date: data
çedinÆei, angajatul cu care s-a întâlnit clientul, durata çedinÆei, suma facturatå pentru
çedinÆå, rezumatul modului în care a decurs întâlnirea.
9 Costul unui serviciu de consultanÆå este în funcÆie de ore. Tariful orar depinde de
angajatul care s-a ocupat de client: cu cât acesta are mai multå experienÆå, cu atât
tariful este mai mare. Pentru fiecare çedinÆå de consultanÆå se emite o notå de platå.
9 Totalul sumelor facturate prin notele de platå trebuie så fie comparate cu valoarea
estimatå pentru costul consultanÆei.
9 Unii clienÆi sunt întâmplåtori, alÆii devin permanenÆi, solicitând frecvent diferite servicii
de consultanÆå. Compania poate derula la un moment dat douå sau mai multe
contracte de consultanÆå cu acelaçi client. Pentru fiecare contract se va Æine o
evidenÆå separatå a notelor de platå.
9 Pe lângå notele de platå, baza de date trebuie så furnizeze un raport lunar al activi-
tåÆilor cu fiecare client.
9 Un angajat al companiei are mai mulÆi clienÆi, iar un client poate lucra cu mai mulÆi
angajaÆi ai companiei.
Pentru a putea råspunde la toate aceste cerinÆe, baza de date va fi formatå din urmåtoa-
13
rele tabele :
Tabelul AngajaÆi care va trebui så conÆinå urmåtoarele date (sub formå de câmpuri):
9 Identificatorul angajatului (id_ang, I). Este un numår care identificå unic angajatul çi
este folosit pentru cheia primarå.
9 Numele angajatului (nume, C, 20). Deoarece pot så aparå cåutåri în tabel çi dupå
numele angajatului, acest câmp va fi cheie de indexare împreunå cu câmpul prenume.
9 Preumele angajatului (pren, C, 20).
9 Tip angajat (tip_ang, C, 1). Acesta este un cod care foloseçte un singur caracter prin
care se identificå tipul angajatului: permanent cu normå întreagå (a), permanent cu
jumåtate de normå (b), temporar cu normå întreagå (c), temporar cu jumåtate de
normå (d), colaborator cu ora (e) sau cu angajamentul terminat (f).

13
În descrierea structurii de date a tabelelor se vor folosi pentru tipul datelor: I - integer, F - float, C
- character, M - memo, D - date, T - DateTime, L - logic. În cazul în care lungimea câmpului nu este
determinatå de tipul datelor, se va preciza çi lungimea câmpului. De exemplu, nume,C,20
înseamnå câmpul nume este de tip Character çi are lungimea 20.
114 Informatică

9 Identificatorul superiorului (id_sup, I). Este un numår care identificå angajatul cåruia îi
este subordonat. Trebuie så fie de acelaçi tip ca çi câmpul identificatorul angajatului.
deoarece superiorul este çi el angajat al companiei.
9 Data naçterii (data_n, D). Este data naçterii angajatului.
9 Data angajårii (data_a, D). Este data angajårii.
9 Data încetårii angajårii (data_i, D). Este data de la care angajatul nu mai face parte
din firmå (demisie, demitere, restrângere de activitate, pensionare etc.). El va fi
påstrat în continuare în evidenÆele companiei.
9 Tariful orar (tarif, I). Este tariful perceput clientului pentru o orå de consultanÆå
asiguratå (prestatå) de angajat.
9 Adresa angajatului (adresa, M). Deoarece adresa este un çir de caractere cu lungime
care poate varia foarte mult de la un angajat la altul, pentru a nu se risipi spaÆiul de
memorie se va folosi câmpul de tip Memo.
9 Localitatea (loc, C, 15). Deoarece compania are sucursale çi birouri de reprezentanÆå
în mai multe localitåÆi, çi angajaÆii pot avea domiciliile în mai multe localitåÆi.
9 Codul judeÆului (c_jud, C, 2). Pentru judeÆ se înregistreazå numai codul. Separat, în
tabelul JudeÆe vor fi înregistrate çi numele judeÆelor.
9 Codul poçtal (cp, C, 5). Este codul poçtal al adresei angajatului.
9 Telefonul fix (tel_f, C, 9). Este numårul telefonului fix al angajatului.
9 Telefonul mobil (tel_m, C, 9). Este numårul telefonului mobil al angajatului.
9 ObservaÆii (obs, M). ConÆine informaÆii biografice ale angajatului sau referitoare la
activitatea lui în cadrul companiei.
Tabelul ClienÆi care va trebui så conÆinå urmåtoarele date (sub formå de câmpuri):
9 Identificatorul clientului (id_cl, I). Este un numår care identificå unic clientul çi este fo-
losit pentru cheia primarå. Este de acelaçi tip ca çi câmpul id_ang din tabelul AngajaÆi.
9 Numele clientului (nume, C, 20). Deoarece pot så aparå cåutåri în tabel çi dupå
numele clientului, acest câmp va fi cheie de indexare. Este de acelaçi tip ca çi câmpul
nume din tabelul AngajaÆi.
9 Prenumele clientului (pren, C, 20). Este de acelaçi tip ca çi câmpul pren din tabelul AngajaÆi.
9 Tip client (Tip_cl, L). Câmpul va avea valoarea .T. în cazul unui client curent (are un
contract de consultanÆå în derulare).
9 Identificatorul angajatului (id_ang, I). Este un numår care identificå angajatul atribuit
clientului så se ocupe de el. Este de acelaçi tip ca çi câmpul id_ang din tabelul AngajaÆi.
9 Data intrårii (data_i, D). Este data de la care a devenit clientul companiei de consultanÆå.
9 Adresa clientului (adresa, M). Este adresa clientului. Este de acelaçi tip ca çi câmpul
adresa din tabelul AngajaÆi.
9 Localitatea clientului (loc, C, 15). Este localitatea de rezidenÆå a clientului. Este de
acelaçi tip ca çi câmpul loc din tabelul AngajaÆi.
9 Codul judeÆului (c_jud, C, 2). Este codul judeÆului de rezidenÆå al clientului. Este de
acelaçi tip ca çi câmpul c_jud din tabelul AngajaÆi.
9 Codul poçtal (cp, C, 5). Este codul poçtal al adresei clientului. Este de acelaçi tip ca çi
câmpul cp din tabelul AngajaÆi.
9 Fax (fax, C, 9). Este numårul de fax al clientului.
9 Telefonul fix (tel_f, C, 9). Este numårul telefonului fix al clientului. Este de acelaçi tip
ca çi câmpul tel_f din tabelul AngajaÆi.
9 Telefon mobil (tel_m, C, 9). Este numårul telefonului mobil al clientului. Este de
acelaçi tip ca çi câmpul tel_m din tabelul AngajaÆi.
Utilizarea unor instrumente de prelucrare a datelor 115

9 ObservaÆii (obs, M). ConÆine scurte informaÆii despre client çi relaÆiile sale cu
compania de consultanÆå.
Tabelul JudeÆe care va trebui så conÆinå urmåtoarele date (sub formå de câmpuri):
9 Codul judeÆului (c_jud, C, 2). Este folosit pentru cheia secundarå.
9 Numele judeÆului (n_jud, C, 15).
Un angajat poate så aibå mai mulÆi clienÆi, iar de un client se pot ocupa mai mulÆi
angajaÆi. Açadar, între tabelele AngajaÆi çi ClienÆi, tipul de relaÆie este de mai-multe-la-
mai-multe. Din aceastå cauzå trebuie creat un tabel intermediar Contracte, care Æine
evidenÆa contractelor de consultanÆå:
9 Identificatorul contractului (id_cont, I). Este un numår unic folosit pentru identificarea
contracului de consultanÆå.
9 Identificatorul clientului (id_cl, I) care beneficiazå de contractul de consultanÆå.
9 Tipul contractului (tip_c, C, 1). Este un cod atribuit contractului care defineçte
categoria de consultanÆå: instruire, proiectare etc.
9 ObservaÆii (obs_c, C, 254). ConÆine o scurtå descriere a contractului de consultanÆå.
9 Data începerii (data_i, D). Este data la care începe derularea contractului de consultanÆå.
9 Terminat (term_c, L). Are valoarea .T. dacå s-a încheiat consultanÆa.
Deoarece estimårile se modificå pe parcursul derulårii contractului (vor fi mai multe esti-
måri pentru acelaçi contract) çi deoarece se doreçte påstrarea unui istoric al acestor esti-
måri, ele vor fi înregistrate într-un tabel separat Estimåri care are urmåtoarea structurå:
9 Identificatorul contractului (id_cont, I). Este identificatorul contractului pentru care se
face estimarea. El va fi o cheie secundarå, propagatå din tabelul Contracte.
9 Numårul estimårii (nr_est, I). Reprezintå a câta estimare este pentru acelaçi contract.
9 Identificatorul angajatului (id_ang, I). Este identificatorul angajatului care a fåcut estimarea.
9 Obiectivul estimårii (obiectiv, C, 254). Este descrierea obiectivelor pentru aceastå
estimare a derulårii contractului. Descrierea trebuie så se facå precis çi concis.
9 Termene (term, I). Este numårul estimativ de çedinÆe în care se va derula contractul.
9 Cost estimat (cost_e, I). Este costul estimativ al contractului de consultanÆå.
9 Data estimåriii (data_e, D). Este data la care s-a fåcut estimarea.
9 Data terminårii (data_t, D). Este data estimatå pentru terminarea contractului de consultanÆå.
Dar fiecare contract de consultanÆå se desfåçoarå pe parcursul mai multor çedinÆe de
consultanÆå. Din aceastå cauzå trebuie creat un tabel intermediar ÇedinÆe care så Æinå
evidenÆa acestora çi care are urmåtoarea structurå:
9 Numårul çedinÆei (nr_s, I). Este un numår unic atribuit çedinÆei çi este folosit ca o cheie
primarå a tabelului care ajutå la identificarea unei înregistråri din tabel (a unei çedinÆe).
9 Identificatorul contractului (id_cont, I). Este identificatorul contractului pentru care se desfå-
çoarå çedinÆa de consultanÆå. Va fi o cheie secundarå propagatå din tabelul Contracte.
9 Identificatorul angajatului (id_ang, I) care s-a ocupat de aceastå çedinÆå de consultanÆå.
9 Data çedinÆei (data_s, D).
9 Durata çedinÆei (timp_s, I). Este timpul în care s-a derulat çedinÆa. Se måsoarå în minute.
9 Costul çedinÆei (cost_s, I). Se calculeazå ca produs între duratå çi tariful angajatului.
9 Rezumat (rez_s, C, 254). Este un rezumat scurt al çedinÆei, care va fi tipårit pe notele
de platå ale clientului.
9 ObservaÆii (obs_s, M). Sunt observaÆii despre modul în care a decurs çedinÆa. Sunt
folosite numai în interiorul companiei.
116 Informatică

Açadar, tabelul Contracte leagå între ele toate çedinÆele prestate pentru o consultanÆå,
iar tabelul ÇedinÆe leagå între ei clientul çi angajatul care au participat la acea çedinÆå.
Pentru serviciile prestate, compania încaseazå bani de la client. Clientul nu plåteçte o singurå
datå valoarea finalå a contractului de consultanÆå. El va face mai multe plåÆi pe parcursul de-
rulårii contractului. Din aceastå cauzå, încasarea nu va fi înregistratå în tabelul Contracte.
Clientul nu plåteçte nici la fiecare çedinÆå. Din aceastå cauzå, încasarea nu va fi înregistratå
nici în tabelul ÇedinÆe. Clientul poate så aibå cu compania mai multe contracte de consul-
tanÆå. Din aceastå cauzå, încasarea nu va fi înregistratå nici în tabelul ClienÆi. Va trebui creat
un tabel separat, tabelul Încasåri, cu urmåtoarea structurå:
9 Numårul încasårii (nr_i, I). Este un numår unic atribuit încasårii. El este folosit ca o cheie
primarå a tabelului çi ajutå la identificarea unei înregistråri din tabel (a unei încasåri).
9 Identificatorul contractului (id_cont, I). Este identificatorul contractului pentru care se
face încasarea. El va fi o cheie secundarå propagatå din tabelul Contracte.
9 Data plåÆii (data_p, D).
9 Modul plåÆii (mod_p, C,50). Se foloseçte pentru a descrie modul în care s-a fåcut plata:
numerar (chitanÆa încasårii), ordin de platå (bancå, numår), filå cec (bancå, numår) etc.
9 Valoare (valoare, I). Este valoarea încasårii çi reprezintå o parte din valoarea totalå a
consultanÆei.
9 ObservaÆii (obs_i, C, 254). Sunt detalii referitoare la obiectivul plåÆilor.
Între aceste tabele s-au stabilit urmåtoarele relaÆii:

Tabelul 1 Tabelul 2 Tipul relaÆiei Câmpul de legåturå


JudeÆe AngajaÆi una-la-mai-multe codul judeÆului
AngajaÆi ÇedinÆe una-la-mai-multe codul angajatului
JudeÆe ClienÆi una-la-mai-multe codul judeÆului
ClienÆi Contracte una-la-mai-multe codul clientului
Contracte ÇedinÆe una-la-mai-multe numårul contractului
Contracte Estimåri una-la-mai-multe numårul contractului
Contracte Încasåri una-la-mai-multe numårul contractului

AngajaÆi ClienÆi

JudeÆe

Contracte

ÇedinÆe Estimåri Încasåri


Utilizarea unor instrumente de prelucrare a datelor 117

CreaÆi un tabel definind structura interactiv:


CreaÆi structura tabelului AngajaÆi:
„ DeschideÆi caseta New cu opÆiunea New...∈File. ActivaÆi
butonul radio Table çi apoi executaÆi clic pe butonul New File.
„ Se deschide caseta de dialog Create care conÆine aceleaçi
controale ca çi o casetå de dialog de tip Save As. AlegeÆi
din lista ascunså Save As Type tipul de fiçier Table/DBF.
ScrieÆi în caseta de text Enter table numele tabelului
AngajaÆi. ExecutaÆi clic pe declançatorul Save.
„ Se deschide fereastra generatorului de tabele Table De-
signer. SecÆiunea Table conÆine controalele prin care definiÆi
structura tabelului. Structura de câmpuri o definiÆi în grila deru-
lantå care are cinci coloane. În coloana Name scrieÆi numele
câmpului în caseta de text (de exemplu id_ang). Numele tre-
buie så conÆinå numai litere, cifre çi linie de subliniere. Atunci
când creaÆi un tabel liber, numele nu trebuie så depåçeascå
10 caractere, iar când definiÆi un tabel într-o bazå de date,
poate så aibå pânå la 128 de caractere. În coloana Type alegeÆi din lista ascunså tipul
câmpului (de exemplu Integer). Dimensiunea câmpului este prestabilitå. Nu se pot
accepta valori nule în acest câmp. VerificaÆi så nu fie activat comutatorul din coloana
NULL.
„ RepetaÆi aceste operaÆii pentru toate câmpurile din tabel.
Coloanele grilei reprezintå proprietåÆi ale câmpului pe care îl definiÆi.

Comutatoare:
Insert - insereazå
un câmp deasupra
câmpului selectat;
Delete - çterge
câmpul selectat;

Bara de stare afiçeazå informaÆii despre tabel: identificatorul tabelului, numårul de înregistråri - Records
(are valoarea 0 pentru cå nu s-au introdus date), numårul de câmpuri definite - Fields (s-au definit 16) çi
lungimea înregistrårii în octeÆi - Length (reprezintå suma lungimilor tuturor câmpurilor) .
„ DefiniÆi un index structural pentru acest tabel, câmpul de indexare fiind câmpurile
nume çi prenume (înregistrårile vor fi aranjate logic în ordinea alfabeticå a numelui çi
118 Informatică

prenumelui; adicå, atunci când numele este acelaçi, vor fi aranjate în ordinea
alfabeticå a prenumelui). ExecutaÆi clic pe secÆiunea Index.
„ În grila derulantå scrieÆi în caseta Name numele etichetei index: Nume. În stânga
acestei casete de text se gåseçte butonul cu sågeatå. Sågeata indicå ordinea de
aranjare: crescåtor ↑ sau descrescåtor ↓. VerificaÆi ca simbolul så corespundå
ordonårii crescåtoare. Dacå este necesar, schimbaÆi ordinea executând clic pe buton.
„ PuteÆi alege din lista ascunså Type tipul de index: Primary, Candidate, Unique sau
Regular (cheia obiçnuitå). AlegeÆi pentru acest index valoarea Regular.

Comutatoare:
Insert - insereazå un
index deasupra indexului
Tipul de index ales ScrieÆi expresia cheii de selectat;
este Regular. indexare: nume+prenume. Delete - çterge indexul
selectat;
Butonul Move care vå permite så mutaÆi un rând
care defineçte un index.

„ În zona Expression trebuie så definiÆi cheia de indexare. Ea poate så conÆinå maxim


240 de caractere çi poate fi formatå dintr-un singur câmp (expresie simplå) sau poate
så fie obÆinutå prin concatenarea mai multor câmpuri (expresie complexå). Deoarece
nu se pot concatena decât câmpuri de tip çir de caractere, trebuie så convertiÆi
celelalte câmpuri în tipul çir de caractere. Pentru a vå uçura munca de construire a
unei expresii complexe de indexare, puteÆi så faceÆi apel la constructorul de
expresii (Expression Builder). Açadar, fie scrieÆi expresia, fie executaÆi clic pe buton
ca så se deschidå caseta de dialog Expression Builder.

Expresia se construieçte în caseta de text


Expression. Folosind controalele puteÆi
alege numele unui câmp (în lista Fields
executaÆi dublu clic pe numele câmpului),
numele unei variabile de memorie sistem
sau utilizator (executaÆi dublu clic pe nu-
mele variabilei din lista Variables), tabelul
(îl alegeÆi din lista ascunså From Table).
Din grupul de liste ascunse Function
alegeÆi funcÆia pe care o veÆi folosi în
expresie. Ea poate fi o funcÆie matematicå
(Math), o funcÆie pentru çiruri de caractere
(String), o funcÆie logicå sau un operator
relaÆional (Logical) sau o funcÆie pentru
date calendaristice (Date). În momentul în
care alegeÆi o funcÆie (executând clic pe
numele ei) vor fi afiçate çi parantezele ().
ScrieÆi parametrii între paranteze.
Utilizarea unor instrumente de prelucrare a datelor 119

„ Dupå ce aÆi definit toatå structura tabelului, o salvaÆi acÆionând declançatorul Ok. Se
deschide caseta de dialog prin care sunteÆi întrebaÆi dacå vreÆi så introduceÆi date:
Input data records now? ExecutaÆi clic pe declançatorul Yes. Se deschide o fereas-
trå de editare a tabelului, de tip browse. ScrieÆi cinci înregistråri:
100, Popescu, Andrei, a, 100, 300000, 02/03/1960, 04/08/1995, / / , Str. Morilor nr. 50
sector 2, Bucuresti, B, 23451, 014567890, 092111111,
101, Andronescu, Ana, a, 100, 280000, 09/05/1958, 09/15/1996, / / , Str. Cuza Voda nr.
20 sector 1, Bucuresti, B, 23456, 012345678, 092122222,
102, Ionescu Maria, a, 100, 280000, 03/01/1961, 03/15/1998, / / , Str. Zorilor nr. 23 sector
4, Bucuresti, B, 34561, 012346789, 093189467,
200, Petrescu Radu, a, 200, 280000, 03/08/1964, 06/15/1998, / / , Soseaua
Mangalia nr. 34, Constanta, Ct, 34512, 041123123, 092134567,
201, Popescu Mihai, a, 200, 250000, 01/01/1965, 09/15/1998, / / , Str. Lujerului
nr. 56, Constanta, Ct, 34562, 041237893, 092341561,
„ ÎnchideÆi apoi fereastra de editare.

CreaÆi un tabel definind structura prin intermediul comenzii SQL:


CreaÆi tabelul JudeÆe folosind comanda SQL:
create table judete (c_jud c (2), n_jud C (15))
CreaÆi un tabel preluând structura dintr-un alt tabel:
CreaÆi tabelul ClienÆi prin preluarea unor câmpuri din tabelul AngajaÆi:
„ DeschideÆi tabelul AngajaÆi cu comanda:
use angajati
„ AfiçaÆi structura tabelului AngajaÆi cu comanda:
display structure
„ CopiaÆi din tabelul AngajaÆi în tabelul ClienÆi numai câmpurile 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
„ DeschideÆi tabelul ClienÆi cu comanda:
use clienti
„ DeschideÆi caseta de dialog Table Designer pentru a face modificåri în structura
tabelului. FolosiÆi comanda:
modify structure
„ În caseta de dialog faceÆi urmåtoarele modificåri. SchimbaÆi numele câmpurilor:
id_ang în id_cl, id_sup în id_ang çi data_n în data_i. InseraÆi în poziÆia corespunzå-
toare câmpurile: tip_cl çi fax.
„ VizualizaÆi structura tabelului ClienÆi cu comanda display structure.

ObÆineÆi informaÆii despre câmpurile din tabel:


„ AflaÆi câte câmpuri are înregistrarea folosind funcÆia (råspunsul este 14):
?fcount()
„ AflaÆi ce dimensiune are câmpul loc folosind funcÆia (råspunsul este 15):
?fsize('loc')
120 Informatică

„ AflaÆi cum se numeçte câmpul din poziÆia 10 folosind funcÆia (råspunsul este cp):
?field(10)
„ AflaÆi ce dimensiune are înregistrarea folosind funcÆia (råspunsul este 126):
?recsize()
„ ÎnchideÆi tabelul folosind comanda use.

4.2. Poziţionarea pe o înregistrare din tabel


La un moment dat existå o singurå înregistrare care poate fi prelucratå. Ea se numeçte
înregistrarea curentå. Numårul înregistrårii curente se påstreazå în contorul de
înregistrare. El se mai numeçte 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 urmåtoarele
comenzi pentru poziÆionarea pointerului de înregistrare:
9 poziÆionarea dupå numårul înregistrårii: goto, skip;
9 poziÆionarea dupå un criteriu logic: locate+continue.
4.2.1. PoziÆionarea dupå numårul înregistrårii
PuteÆi folosi:
9 Comanda goto sau go poziÆioneazå pointerul de înregistrare pe o anumitå înregistrare din
tabel, precizatå prin numårul såu. Sintaxa comenzii este:
goto| go <n >| top | bottom
unde <n> reprezintå numårul înregistrårii, top prima înregistrare, iar bottom ultima înregistrare.
9 Comanda skip poziÆioneazå pointerul de înregistrare peste un anumit numår de înregis-
tråri din tabel, relativ faÆå de înregistrarea curentå. Sintaxa comenzii este:
skip [<n >]
unde <n> reprezintå numårul de înregistråri peste care se sare înainte dacå n>0 sau înapoi
dacå n<0. Dacå numårul lipseçte, saltul se face la înregistrarea urmåtoare.
4.2.2. PoziÆionarea dupå un criteriu logic de cåutare
PuteÆi folosi:
9 Comanda locate poziÆioneazå pointerul de înregistrare pe o înregistrare care îndeplineçte
condiÆia specificatå. Sintaxa comenzii este:
locate for <cond_1> [<domeniu>]
[while <cond_2>]
Comanda cautå secvenÆial çi poziÆioneazå pointerul pe prima înregistrare care îndeplineçte
un criteriu de cåutare precizat prin condiÆia <cond_1> din clauza For. Dacå nu gåseçte nici o
înregistrare, pointerul va fi poziÆionat dupå ultima înregistrare de date, adicå pe marcajul eof.
Comanda cautå implicit în tot tabelul (All). Explicit poate cåuta numai în anumite înregistråri,
precizate prin <domeniu> sau prin clauza while. Cu aceastå comandå se gåseçte prima înre-
gistrare care îndeplineçte criteriul de cåutare.
9 Comanda continue continuå procesul de cåutare definit de ultima comandå locate (cautå
urmåtoarea înregistrare care îndeplineçte criteriul de cåutare precizat în comanda locate).
Utilizarea unor instrumente de prelucrare a datelor 121

Comanda continue se foloseçte numai împre-


unå cu comanda locate. Sintaxa comenzii este:
locate for <cond>
continue
Dacå nu se mai gåseçte nici o înregistrare, în bara
de stare se afiçeazå mesajul End of locate scope.
PuteÆi så folosiÆi aceste comenzi de poziÆionare çi nu
prin intermediul interfeÆei. AlegeÆi opÆiunea Goto eof() =.F.
Record4∈ Table. Se deschide un submeniu cu sfârçit
opÆiuni pentru poziÆionarea pe o anumitå înregistra-
re: Top (prima înregistrare), Bottom (ultima înregis- da
trare), Next (urmåtoarea înregistrare), Previous
<prelucrare>
(înregistrarea precedentå), Record#... (înregistrarea
cu numårul precizat), Locate... (adverbele comenzii
locate vor fi definite prin intermediul controalelor din
continue
caseta de dialog Locate).
4.2.3. Controlarea poziÆionårii în tabel
Prin intermediul funcÆiilor se pot obÆine informaÆii
despre înregistrårile din tabel: locate for <cond>
9 numårul de înregistråri din tabel se obÆine cu
funcÆia reccount();
9 numårul înregistrårii curente din tabel se obÆine
cu funcÆia recno(); nu
9 sfârçitul de fiçier eof() - funcÆia furnizeazå un found() =.T.
rezultat logic care este .T. dacå pointerul este sfârçit
poziÆionat pe ultima înregistrare din tabel;
9 începutul de fiçier bof() - funcÆia furnizeazå un da
rezultat logic care este .T. dacå pointerul este
poziÆionat pe prima înregistrare din tabel; <prelucrare>
9 modul în care a decurs cåutarea found() -
funcÆia furnizeazå un rezultat logic care este
.T. dacå a avut succes operaÆia de cåutare. continue

Aceste funcÆii pot fi folosite pentru a testa dacå mai


continuaÆi sau nu procesul de cåutare.

PoziÆionaÆi pointerul de înregistrare folosind numårul înregistrårii:


„ DeschideÆi tabelul AngajaÆi cu comanda:
use angajati
„ ExecutaÆi mai multe operaÆii de poziÆionare folosind comenzile goto çi skip.
ObservaÆi informaÆia afiçatå în bara de stare dupå fiecare operaÆie de poziÆionare.
?recno() 5 skip-1
1 ?bof() ?bof()
?reccount() .F. .T.
122 Informatică

goto 3 skip 2*3 6


?recno() ?recno() skip -7
3 6 ?recno()
goto bottom ?eof() 1
?recno() .T. skip -10
5 skip 2 Beginning of file encountered
goto top End of file ?recno()
?recno() encountered 1
1 ?recno()
„ ExecutaÆi operaÆii de poziÆionare folosind opÆiunea de meniu. DeschideÆi mai întâi
fereastra de editare a tabelului cu opÆiunea de meniu Browse "Angajati"∈View.
ObservaÆi dupå fiecare operaÆie de poziÆionare informaÆia afiçatå în bara de stare çi
înregistrarea pe care s-a poziÆionat pointerul de înregistrare în fereastra de editare:
Table → Goto Record4 → Next → înregistrarea 2 (era urmåtoarea înregistrare)
Table → Goto Record4 → Bottom → înregistrarea 5 (ultima înregistrare)
Table → Goto Record4 → Record#... → caseta de dialog Go to Record: scrieÆi în caseta
cu derulor Record valoarea 2 çi executaÆi clic pe declançatorul Go to → înregistrarea 2.
ÎnchideÆi fereastra de editare. ObservaÆi în fereastra Command comenzile corespun-
zåtoare acÆiunilor executate:
skip go bottom go 2
PoziÆionaÆi pointerul de înregistrare folosind un criteriu de cåutare:
„ FolosiÆi pentru poziÆionare comenzile locate çi continue. UrmåriÆi efectul lor obser-
vând informaÆiile afiçate în bara de stare.
locate for id_ang=100 (Se cautå angajatul cu codul 100.)
? nume, pren, adresa, loc (Se afiçeazå numele, prenumele, adresa çi localitatea angajatului.)
Popescu Andrei Str. Morilor nr. 50 sector 2 Bucureçti
continue (Se continuå cåutarea angajatului cu codul 100.)
End of locate scope (Nu s-a mai gåsit un angajat cu codul 100.)
? found() (Se testeazå dacå s-a mai gåsit o înregistrare.)
.F (Nu s-a mai gåsit un angajat cu codul 100.)
locate for id_sup=100 (Se cautå angajaÆii care au ca superior angajatul cu codul 100.)
? nume, pren, adresa, loc (Se afiçeazå numele, prenumele, adresa çi localitatea angajatului.)
Popescu Andrei Str. Morilor nr. 50 sector 2 Bucureçti
continue (Se continuå cåutarea angajaÆilor care au superiorul cu codul 100.)
? found() (Se testeazå dacå s-a mai gåsit o înregistrare.)
.T. (S-a mai gåsit angajatul care are ca superior angajatul 100.)
? nume, pren, adresa, loc (Se afiçeazå numele, prenumele, adresa çi localitatea angajatului.)
Andronesu Ana Str. Cuza Vodå nr. 20 sector 1 Bucureçti
continue (Se continuå cåutarea angajaÆilor care au superiorul cu codul 100.)
? found() (Se testeazå dacå s-a mai gåsit o înregistrare.)
.T. (S-a mai gåsit angajatul care are ca superior angajatul 100.)
? nume, pren, adresa, loc (Se afiçeazå numele, prenumele, adresa çi localitatea angajatului.)
Ionescu Maria Str. Zorilor nr. 23 sector 4 Bucureçti
continue (Se continuå cåutarea angajaÆilor care au superiorul cu codul 100.)
End of locate scope (Nu s-au mai gåsit angajaÆi subordonaÆi angajatului 100.)
? found() (Se testeazå dacå s-a mai gåsit o înregistrare.)
.F. (Nu s-au mai gåsit angajaÆi subordonaÆi angajatului cu codul 100.)
? eof() (Se testeazå dacå s-a ajuns la sfârçitul fiçierului.)
Utilizarea unor instrumente de prelucrare a datelor 123

.T. (S-a ajuns la sfârçitul fiçierului.)


locate for day(data_n)=day(date()) and month(date_n) = month(date())
Se cautå angajatul care are data de naçtere aståzi. Dacå s-a gåsit, afiçaÆi-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 çtiÆi cu ce tip
de caractere au fost scrise numele çi prenumele, le transformaÆi în litere mari.
?tel_f, tel_m (se afiçeazå numerele de telefon)
012345678 921222222
„ ExecutaÆi comanda locate folosind opÆiunea de meniu.
Table → Goto Record4 → Locate... → caseta de dialog Locate Record: executaÆi clic pe
declançatorul Locate → înregistrarea 1 (prima înregistrare).
Table → Goto Record4 → Locate... → caseta de dialog Locate Record: executaÆi clic
pe declançatorul For... → caseta de dialog Expression Builder: executaÆi dublu clic pe
câmpul pren, scrieÆi în caseta de text semnul =, apoi în lista de funcÆii String executaÆi
clic pe funcÆia Proper() çi scrieÆi ca parametru în locul parametrului expC, prenumele
'Maria' (în casetå va fi scriså condiÆia Angajati.pren=PROPER('Maria')), acÆionaÆi
declançatorul Verify pentru a verifica dacå este corectå expresia çi apoi executaÆi clic pe
OK → în caseta de dialog Locate Record executaÆi clic pe declançatorul Locate →
înregistrarea 3 (prima înregistrare pentru care valoarea câmpului pren este Maria).
ÎnchideÆi fereastra de editare. ObservaÆi în fereastra Command comenzile corespun-
zåtoare acÆiunilor executate:
locate all locate for Angajati.pren= proper('Maria')

4.3. Actualizarea tabelului


OperaÆia de actualizare a tabelului se executå asupra tabelului deschis çi presupune trei
tipuri de operaÆii:
9 adåugarea de noi înregistråri,
9 çtergerea unei înregistråri,
9 modificarea câmpurilor dintr-o înregistrare.
4.3.1. Adåugarea de noi înregistråri
Se poate face:
1. Prin adåugare la sfârçitul tabelului:
9 de la tastaturå - se realizeazå fie prin intermediul opÆiunii de meniu Append New
Records∈Table, fie prin intermediul comenzii:
append
Se deschide fereastra de editare de tip Edit. La sfârçitul fiçierului este adåugatå o
înregistrare vidå. CompletaÆi câmpurile din înregistrare prin intermediul controa-
lelor din aceastå fereastrå. Dacå vreÆi så mai adåugaÆi o nouå înregistrare, dupå ce
aÆi terminat de completat câmpurile unei înregistråri apåsaÆi tasta Enter. TerminaÆi
operaÆia de adåugare închizând fereastra.
9 prin adåugarea unei înregistråri vide - se realizeazå prin intermediul comenzii:
append blank
La sfârçitul tabelului se adaugå o înregistrare vidå pentru care urmeazå så
completaÆi ulterior valorile câmpurilor.
124 Informatică

9 dintr-un alt tabel - se realizeazå fie prin intermediul opÆiunii de meniu Append
Records...∈Table, fie prin intermediul comenzii:
append from <nume_tabel> [fields <listå_câmpuri>] [for <cond>]
unde <nume_tabel> este numele tabelului din care se adaugå înregistråri. Implicit se
adaugå toate înregistrårile çi toate câmpurile din tabel, dar se poate explicita numai
adåugarea anumitor câmpuri (câmpurile precizate în lista de câmpuri a clauzei fields)
çi/sau numai a anumitor înregistråri (cele care îndeplinesc condiÆia precizatå prin
expresia <cond> a clauzei for).
2. Prin inserarea în interiorul tabelului:
9 OperaÆia se realizeazå prin comanda:
insert [before] [blank]
Implicit se insereazå o înregistrare vidå dupå înregistrarea curentå çi se deschide
fereastra de editare pentru a completa valorile câmpurilor. Explicit, inserarea se
poate face înaintea înregistrårii curente, folosind clauza before, sau se poate
insera numai o înregistrare vidå folosind clauza blank.
4.3.2. Çtergerea înregistrårilor
Se poate face prin urmåtoarele operaÆii:
9 Çtergerea logicå. OperaÆia de çtergere logicå nu înseamnå eliminarea fizicå a înregistråri-
lor din tabel, ci numai marcarea lor pentru çtergere. Înregistrårile çterse logic pot fi refå-
cute. OperaÆia se realizeazå fie prin intermediul opÆiunii de meniu Delete Records...∈
Table, fie prin intermediul comenzii:
delete [<domeniu>] [for <cond_1>] [while <cond_2>]
Implicit este çtearså logic înregistrarea curentå. Explicit poate fi çters logic un grup de
înregistråri precizat prin <domeniu> sau clauzele for sau while.
9 Refacerea înregistrårilor çterse logic. OperaÆia înlåturå marcajele pentru çtergere logi-
cå. Se realizeazå fie prin intermediul opÆiunii de meniu Recall Records...∈Table, fie prin
intermediul comenzii:
recall [<domeniu>] [for <cond_1>] [while <cond_2>]
Implicit sunt refåcute toate înregistrårile marcate logic pentru çtergere. Explicit poate fi
refåcut un grup de înregistråri precizat prin <domeniu> sau clauzele for sau while.
9 Çtergerea fizicå. OperaÆia de çtergere fizicå înseamnå eliminarea fizicå din tabel a
înregistrårilor marcate logic pentru çtergere. Înregistrårile çterse fizic nu mai pot fi refåcute.
OperaÆia se realizeazå fie prin intermediul opÆiunii de meniu Remove Deleted Records∈
Table, fie prin intermediul comenzii:
pack
9 Çtergerea fizicå a tuturor înregistrårilor. OperaÆia de çtergere fizicå a tuturor înregistrå-
rilor înseamnå eliminarea fizicå din tabel a tuturor înregistrårilor de date çi påstrarea numai
a structurii tabelului. Se realizeazå prin intermediul comenzii:
zap
Aceastå operaÆie este echivalentå cu douå operaÆii delete all çi pack.
În fereastra de editare puteÆi så marcaÆi logic pentru çtergere sau så anulaÆi marcajul cu
opÆiunea Toggle Deletion Mark∈Table sau folosind scurtåtura Ctrl+T. OpÆiunea are
Utilizarea unor instrumente de prelucrare a datelor 125

efectul unui comutator. Dacå înregistrarea nu este marcatå, o marcheazå, çi invers, dacå
este marcatå, îi anuleazå marcajul.
Controlarea operaÆiei de çtergere se face prin:
9 Comanda care stabileçte cum pot fi folosite înregistrårile çterse logic:
set deleted on | off
unde on înseamnå cå înregistrårile çterse logic nu pot fi folosite de comenzile care au
în sintaxå clauzele for çi while, iar off (implicit) înseamnå cå înregistrårile çterse logic
pot fi folosite de toate comenzile.
9 FuncÆia care testeazå dacå înregistrarea curentå este marcatå logic pentru çtergere
(valoarea .T. înseamnå cå a fost marcatå pentru çtergere):
deleted()
4.3.3. Modificarea înregistrårilor
Modificarea valorii câmpurilor din înregistråri se poate face:
9 prin valori precizate: Se poate folosi comanda replace care are sintaxa:
replace <câmp_1> with <expr_1> [additive] [,<câmp_2> with <expr_2>[additive]...]
[<domeniu>] [for <cond_1>] [while <cond_2>]
Se înlocuieçte valoarea din câmpul <câmp_1> cu valoarea obÆinutå în urma evaluårii
expresiei <expr_1>, valoarea din câmpul <câmp_2> cu valoarea obÆinutå în urma eva-
luårii expresiei <expr_2> etc. Implicit, înlocuirea se face numai în înregistrarea
curentå. Explicit, înlocuirea se poate face într-un grup de înregistråri precizat prin
<domeniu> sau clauzele for sau while.
9 interactiv, de la tastaturå: Se pot folosi comenzile edit sau browse care deschid
fereastra de editare.
Comenzile browse çi edit au urmåtoarea sintaxå:
browse | edit [fields <listå_câmpuri>] [<domeniu>] [for <cond_1>] [while <cond_2>]
[font <nume_font> [,<n>]] [style <nume_stil>] [freeze <nume_câmp>]
[last| noinit ] [noappend] [nodelete] [noedit | nomodify] [title <nume_t>] [normal]
[partition <m>] [lpartition] [nolink] [ledit] [redit]
[valid [f] <cond_3> [error <mesaj>]] [when <cond_4>] [width <p>]
Clauzele din comandå au urmåtoarea semnificaÆie:
9 fields - permite afiçarea numai a câmpurilor precizate în <listå_câmpuri>. Lista de
câmpuri poate conÆine nume de câmpuri din tablou sau câmpuri calculate. Separarea
în listå se face prin virgulå. Fiecårui câmp i se poate asocia o opÆiune. OpÆiunile sunt:
:R - câmpul poate fi vizualizat dar nu poate fi modificat;
:V = <cond> - câmpul introdus este evaluat prin expresia logicå <cond>. Dacå
valoarea expresiei este T., data din câmp este corectå, altfel se afiçeazå un
mesaj de eroare.
:F - se verificå o regulå de validare atunci când trece cursorul prin câmp (fårå
modificare). OpÆiunea se poate folosi împreunå cu opÆiunea :V.
:E= <mesaj> - Mesajul de eroare standard produs de introducerea unei valori
invalide în câmp poate fi modificat cu mesajul <mesaj> de tip çir de carac-
tere. OpÆiunea se poate folosi împreunå cu opÆiunea :V.
126 Informatică

:B = <val_1>,<val_2> - se verificå dacå dupå editare câmpul aparÆine interva-


lului definit de valorile <val_1> (limita inferioarå) çi <val_2> (limita superioa-
rå). Cele douå valori trebuie så fie de acelaçi tip. În cazul în care valoarea
câmpului nu se încadreazå între cele douå limite, se afiçeazå un mesaj de
eroare care poate fi personalizat cu opÆiunea :F.
:H = <nume_câmp> - numele câmpului afiçat în fereastra de editare este
înlocuit cu '<nume_câmp>' de tip çir de caractere.
:W = <cond> - se va intra în operaÆia de editare cu câmpul respectiv numai
dacå este îndeplinitå condiÆia <cond>.
9 font - permite stabilirea fontului caracterelor afiçate în fereastra de editare prin
nume font çi dimensiune font (de exemplu, font 'arial',12).
9 style - permite stabilirea stilului caracterelor afiçate în fereastra de editare (de
exemplu, 'b' - bold, 'u' - underline, 'i' - italic, 'o' - outline, 's' - shadow).
9 freeze - permite selectarea pentru editare a unui singur câmp (precizat prin
<nume_câmp>); restul câmpurilor sunt numai pentru informare.
9 last | noinit - fereastra este deschiså cu configuraÆia pe care a avut-o la ultima
operaÆie de editare.
9 noappend - nu permite utilizatorului så adauge noi înregistråri în tabel.
9 nodelete - nu permite utilizatorului så çteargå logic înregistråri din tabel.
9 noedit | nomodify - nu permite utilizatorului så modifice înregistrårile din tabel (nu-
mai så adauge sau så çteargå).
9 normal - deschide fereastra de editare cu valori implicite pentru parametri (culoa-
re, dimensiune, poziÆie, titlu etc.).
9 title - modificå titlul ferestrei de editare cu numele <nume_t> de tip çir de caractere.
9 partition - precizeazå coloana <m> în care se împarte fereastra în douå partiÆii: una de
tip browse, alta de tip edit; fiecare dintre ele poate fi våzutå independent.
9 lpartition - la deschiderea ferestrei de editare, cursorul va fi afiçat în partiÆia din
partea stângå, în primul câmp, altfel este poziÆionat în partea dreaptå.
9 nolink - cele douå partiÆii nu sunt legate, altfel ele sunt legate, adicå atunci când
se deruleazå conÆinutul unei partiÆii se deruleazå çi conÆinutul celeilalte partiÆii.
9 ledit - partiÆia din partea stângå este de tip invers faÆå de fereastra de editare (de
tip browse pentru fereastra edit çi de tip edit pentru fereastra browse).
9 redit - partiÆia 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).
9 valid - valideazå valorile introduse în câmpuri (validarea se face la nivelul înregis-
trårii çi nu la nivelul câmpului cum face opÆiunea V); dacå este adevåratå condiÆia
<cond_3>, se trece la urmåtoarea înregistrare, altfel se råmâne la înregistrarea
care se modificå çi se afiçeazå un mesaj de eroare. Mesajul de eroare poate fi per-
sonalizat cu <mesaj> (de tip çir de caractere) cu clauza error. OpÆiunea :f forÆeazå
executarea operaÆiei de validare chiar dacå nu s-au fåcut modificåri în înregistrare.
9 when - are acelaçi efect ca çi opÆiunea w, cu deosebirea cå se aplicå la nivelul
întregii înregistråri, çi nu numai la nivelul unui câmp.
9 width - limiteazå låÆimea câmpurilor la <p> caractere; afecteazå numai formatul
de afiçare din fereastrå, nu çi structura tabelului.
Utilizarea unor instrumente de prelucrare a datelor 127

Comanda browse mai poate avea clauzele:


9 lock <n> - precizeazå numårul de câmpuri <n> care pot fi våzute în partiÆia din
stânga a ferestrei browse fårå så se deruleze conÆinutul; partiÆia se va dimensiona
automat pentru a realiza acest format de afiçare.
9 nolgrid, norgrid - înlåturå grila din partiÆia stângå, respectiv dreaptå a ferestrei de
editare browse.
4.3.4. Controlarea accesului la înregistråri
Accesul la înregistrårile unui tabel poate fi controlat la citire çi scriere prin douå metode:
1. Metoda çtergerii logice:
Aceastå metodå constå în urmåtoarele acÆiuni:
9 Se çterg logic înregistrårile la care nu vreÆi så aveÆi acces cu comanda delete.
9 Se inhibå accesul la înregistrårile çterse logic cu comanda set deleted on.
9 Atunci când vreÆi så aveÆi acces la unele înregistråri, anulaÆi marcajul lor pentru
çtergere cu comanda recall.
2. Metoda filtrului:
Aceastå metodå constå în urmåtoarele acÆiuni:
9 Se construieçte un filtru cu comanda:
set filter to <cond>
unde <cond> este o condiÆie logicå pe care trebuie så o îndeplineascå înregistrårile la
care aveÆi acces.
9 Refacerea accesului la toate înregistrårile se face cu comanda:
set filter to
9 PuteÆi så testaÆi filtrul (condiÆia pe care trebuie så o îndeplineascå înregistrårile ca så
aveÆi acces la ele) cu funcÆia logicå:
filter()

AdåugaÆi înregistråri:
use angajati Se deschide tabelul AngajaÆi care conÆine deja cinci înregistråri.
append Se deschide fereastra de editare. AdåugaÆi cinci înregistråri.
use judete Se deschide tabelul JudeÆe care nu conÆine înregistråri.
append AdåugaÆi numai înregistrarea pentru Bucureçti.
browse fields c_jud:v=isalpha(left(c_jud,1)) and isalpha(right(c_jud,1))
:e='cod gresit':h='cod judet', n_jud:h='nume_judet'
ExecutaÆi clic pe opÆiunea Append Mode ∈View (puteÆi så adåugaÆi
înregistråri çi în fereastra de editare de tip Browse). AdåugaÆi restul în-
registrårilor în fereastra Browse. VerificaÆi mesajele de eroare care
apar atunci când nu scrieÆi codul judeÆului format din douå litere.
use angajati Se deschide tabelul AngajaÆi care conÆine zece înregistråri.
copy structure to ang CopiaÆi structura tabelului într-un tabel nou ang.
use ang Se deschide tabelul Ang care nu conÆine înregistråri.
append blank (de 5 ori) Se adaugå cinci înregistråri vide.
browse În fereastra de editare sunt afiçate cele 5 înregistråri vide.
128 Informatică

replace all tip_ang with 'a' Se completeazå pentru toÆi angajaÆii câmpul tip_ang cu 'a'.
goto top PoziÆionaÆi pointerul la începutul tabelului, deoarece comanda replace all
l-a pozÆionat la sfârçitul tabelului.
replace next 3 id_sup with 300, loc with 'Buzau', c_jud with 'Bz',tel_f with '038'
Primii trei angajaÆi sunt din Buzåu çi sunt subordonaÆi aceleiaçi
persoane. Pentru numårul de telefon se scrie prefixul pentru Buzåu.
Pointerul de înregistrare va fi poziÆionat pe înregistrarea 3.
skip Salt la urmåtoarea înregistrare (înregistrarea 4)
replace rest id_sup with 100, loc with 'Bucuresti', c_jud with 'B',tel_f with '01'
Ultimii doi angajaÆi sunt din Bucureçti çi sunt subordonaÆi aceleiaçi
persoane. Pentru numårul de telefon se scrie prefixul pentru Bucureçti.
Pointerul de înregistrare va fi poziÆionat pe înregistrarea 5.
browse În fereastra de editare completaÆi cu valori restul câmpurilor.
use angajati Se deschide tabelul AngajaÆi.
append from ang for c_jud='B'
Se adaugå din tabelul Ang la sfârçitul tabelului, angajaÆii din Bucureçti.
append from ang for c_jud='Bz'
Se adaugå din tabelul Ang la sfârçitul tabelului, angajaÆii din Buzåu.
browse DeschideÆi fereastra de editare. ObservaÆi cum s-au executat operaÆiile.
use clienti Se deschide tabelul ClienÆi.
browse Nu conÆine nici o înregistrare.
appen blank (de 6 ori) AdåugaÆi 6 înregistråri vide.
browse Se completeazå pentru toate înregistrårile codul clientului çi codul
angajatului care se ocupå de el.
replace for id_ang>=100 and id_ang<200 loc with 'Bucuresti', c_jud with 'B', tel_f with '01',
fax with '01'
Se completeazå pentru clienÆii de care se ocupå angajaÆii din Bucureçti
localitatea, codul judeÆului çi prefixul pentru telefon çi fax.
replace for id_ang>=200 and id_ang<300 loc with 'Constanta', c_jud with 'Ct',
tel_f with '041', fax with '041'
Se completeazå pentru clienÆii de care se ocupå angajaÆii din Constan-
Æa localitatea, codul judeÆului çi prefixul pentru telefon çi fax.
replace for id_ang>=300 and id_ang<400 loc with 'Buzau', c_jud with 'Bz', tel_f with '038',
fax with '038'
Se completeazå pentru clienÆii de care se ocupå angajaÆii din Buzåu
localitatea, codul judeÆului çi prefixul pentru telefon çi fax.
brow CompletaÆi restul câmpurilor.

ModificaÆi valoarea câmpurilor din înregistråri:


use angajati Se deschide tabelul AngajaÆi.
browse freeze tarif valid tarif>=300000 and tarif<=500000
În fereastra de editare se modificå numai tariful. Valoarea introduså
trebuie så aparÆinå 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 modificåri numai pentru angajaÆii din
ConstanÆa pentru care se modificå numai numårul de telefon. Pentru
valoarea introduså s-a precizat o regulå de validare çi un mesaj afiçat
în caz de introducere eronatå a valorii.
replace id_sup with 1000 for id_sup=100
Se înlocuieçte în tot tabelul codul superiorului 100 cu 1000.
Utilizarea unor instrumente de prelucrare a datelor 129

browse Se afiçeazå modificårile fåcute în fereastra de editare.


replace id_sup with 100 for id_sup=1000
Se înlocuieçte în tot tabelul codul superiorului 1000 cu 100.
browse Se afiçeazå modificårile fåcute în fereastra de editare.
browse fields nume, pren:h='prenume', varsta= int((date()-data_n)/365)
Se afiçeazå în fereastra browse numai câmpurile nume, pren çi varsta
(un câmp calculat). Pentru câmpul pren se afiçeazå 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 afiçeazå modificårile fåcute în fereastra de editare.

ÇtergeÆi înregistråri:
delete for lower(c_jud)='ct'
browse Înregistrårile din judeÆul ConstanÆa sunt marcate logic pentru çtergere.
set deleted on
browse Înregistrårile marcate logic pentru çtergere nu mai sunt afiçate.
set deleted off
browse Înregistrårile marcate logic pentru çtergere sunt afiçate.
PoziÆionaÆi cursorul pe o înregistrare marcatå logic pentru çtergere.
?deleted()
.T. PoziÆionaÆi cursorul pe o înregistrare care nu este marcatå pentru çtergere.
?deleted()
.F.
recall for lower(c_jud)='ct'
RefaceÆi înregistrårile marcate logic pentru çtergere.
delete record 1 MarcaÆi logic pentru çtergere înregistrarea 1.
set deleted on
browse Înregistrarea 1 nu este afiçatå în fereastra de editare.
recall record 1 RefaceÆi înregistrarea marcatå logic pentru çtergere.
browse Înregistrarea 1 este afiçatå în fereastra de editare.
set deleted off

4 . 4 . C o n s u l t a r e a t a be l u l u i
Bazele de date se construiesc pentru a obÆine informaÆii într-un timp mai scurt. Informa-
Æiile obÆinute dintr-un tabel pot fi:
1. Detaliate - sub forma unor liste:
Se pot folosi comenzile list sau display . Sintaxa lor este:
list | display [ [fields] <listå_câmpuri>]
[<domeniu>] [for <cond_1>] [while <cond_2>]
[to printer | to file <nume_fiçier>] [noconsole] [off]
Deosebirile dintre comanda list çi display sunt:
Utilizarea unor instrumente de prelucrare a datelor 129

browse Se afiçeazå modificårile fåcute în fereastra de editare.


replace id_sup with 100 for id_sup=1000
Se înlocuieçte în tot tabelul codul superiorului 1000 cu 100.
browse Se afiçeazå modificårile fåcute în fereastra de editare.
browse fields nume, pren:h='prenume', varsta= int((date()-data_n)/365)
Se afiçeazå în fereastra browse numai câmpurile nume, pren çi varsta
(un câmp calculat). Pentru câmpul pren se afiçeazå 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 afiçeazå modificårile fåcute în fereastra de editare.

ÇtergeÆi înregistråri:
delete for lower(c_jud)='ct'
browse Înregistrårile din judeÆul ConstanÆa sunt marcate logic pentru çtergere.
set deleted on
browse Înregistrårile marcate logic pentru çtergere nu mai sunt afiçate.
set deleted off
browse Înregistrårile marcate logic pentru çtergere sunt afiçate.
PoziÆionaÆi cursorul pe o înregistrare marcatå logic pentru çtergere.
?deleted()
.T. PoziÆionaÆi cursorul pe o înregistrare care nu este marcatå pentru çtergere.
?deleted()
.F.
recall for lower(c_jud)='ct'
RefaceÆi înregistrårile marcate logic pentru çtergere.
delete record 1 MarcaÆi logic pentru çtergere înregistrarea 1.
set deleted on
browse Înregistrarea 1 nu este afiçatå în fereastra de editare.
recall record 1 RefaceÆi înregistrarea marcatå logic pentru çtergere.
browse Înregistrarea 1 este afiçatå în fereastra de editare.
set deleted off

4 . 4 . C o n s u l t a r e a t a be l u l u i
Bazele de date se construiesc pentru a obÆine informaÆii într-un timp mai scurt. Informa-
Æiile obÆinute dintr-un tabel pot fi:
1. Detaliate - sub forma unor liste:
Se pot folosi comenzile list sau display . Sintaxa lor este:
list | display [ [fields] <listå_câmpuri>]
[<domeniu>] [for <cond_1>] [while <cond_2>]
[to printer | to file <nume_fiçier>] [noconsole] [off]
Deosebirile dintre comanda list çi display sunt:
130 Informatică

diferenÆe list display


domeniul implicit de acÆiune toate înregistrårile înregistrarea curentå
modul de afiçare defilare paginat (ecran plin)
efectul valorii on a nu afiçeazå înregistrårile afiçeazå înregistrårile
parameterului deleted çterse logic çterse logic
Açadar, comanda list este echivalentå cu comanda display rest, iar comanda display
este echivalentå cu comanda list next 1 sau list record recno().
Implicit sunt afiçate pe ecran toate câmpurile, inclusiv numårul înregistrårii. Explicit se
poate afiça numai un grup de înregistråri precizat prin <domeniu> sau clauzele for sau
while, numai anumite câmpuri precizate prin clauza fields, fårå numårul înregistrårii
folosind clauza off, iar ieçirea poate fi redirectatå la imprimantå sau într-un fiçier.
2. Sintetizate - sub forma unor valori:
Se pot folosi comenzi sau funcÆii:
Comanda FuncÆia Efectul
count cnt() furnizeazå numårul de înregistråri
sum sum(<expn>) furnizeazå suma unor câmpuri numerice
average avg(<expn>) furnizeazå media aritmeticå a unor câmpuri numerice
calculate furnizeazå rezultatul evaluårii funcÆiilor 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 acÆiune al acestor comenzi este: comanda se aplicå asupra tuturor
înregistrårilor çi asupra tuturor câmpurilor numerice, iar rezultatul se afiçeazå pe ecran.
Explicit, comenzile acÆioneazå numai asupra grupului de înregistråri precizat prin
<domeniu> sau clauza for sau while çi numai asupra câmpurilor numerice precizate în
<listå_expresii_numerice>, iar rezultatul poate fi memorat în variabile de memorie.

AflaÆi media aritmeticå:


DeschideÆi tabelul AngajaÆi. AflaÆi media aritmeticå a tarifului folosind comanda:
average tarif Se calculeazå çi se afiçeazå media aritmeticå a tarifului pentru
toÆi angajaÆii.
average tarif to v Se calculeazå media aritmeticå a tarifului pentru toÆi angajaÆii çi
se påstreazå în variabila de memorie v
?v al cårui conÆinut se afiçeazå ulterior.
calculate avg(tarif) CalculaÆi media aritmeticå cu ajutorul funcÆiei avg().
average for tip_ang='a' Se afiçeazå media aritmeticå pentru toate câmpurile numerice
(inclusiv pentru cele care conÆin codurile angajaÆilor çi ale superi-
orilor; din aceastå cauzå cererea de informaÆie nu s-a fåcut corect)
Utilizarea unor instrumente de prelucrare a datelor 131

average tarif for tip_ang='a' Se afiçeazå media aritmeticå a tarifului pentru angajaÆii per-
manenÆi cu normå întreagå (tip 'a').
average tarif for tip_ang<>'a' Se afiçeazå media aritmeticå a tarifului pentru angajaÆii care nu
sunt permanenÆi cu normå întreagå (tip diferit de 'a').
NumåraÆi înregistråri:
Prin numårarea înregistrårilor care corespund unui criteriu, puteÆi så aflaÆi câÆi angajaÆi
îndeplinesc acel criteriu:
count for id_sup=100 Se numårå çi se afiçeazå câÆi angajaÆi sunt subordonaÆi anga-
jatului cu identificatorul 100.
count for id_sup=100 to v Se numårå câÆi angajaÆi sunt subordonaÆi angajatului cu identi-
ficatorul 100 çi rezultatul se påstreazå în variabila de memorie v
?v al cårui conÆinut se afiçeazå ulterior.
count for lower(c_jud)='ct' Se numårå çi se afiçeazå câÆi angajaÆi sunt din ConstanÆa.
count for tarif > 250000 Se numårå çi se afiçeazå câÆi angajaÆi au tariful mai mare decât
250000 lei.
AfiçaÆi liste:
În liste puteÆi så afiçaÆi anumite câmpuri precizate prin lista de câmpuri çi anumite
înregistråri precizate prin domeniu sau clauzele for sau while:
list nume, pren, data_n for month(data_n)=03
Se afiçeazå numele, prenumele çi data naçterii pentru toÆi angajaÆii nåscuÆi în
luna martie.
list for id_sup=100
Se afiçeazå toate câmpurile pentru angajaÆii subordonaÆi angajatului cu codul 100.
list nume, pren, id_ang for id_sup=100
Se afiçeazå numele, prenumele çi identificatorul pentru angajaÆii subordonaÆi
angajatului cu codul 100.
list nume, pren, id_ang for id_sup=id_ang
Se afiçeazå numele, prenumele çi identificatorul pentru angajaÆii care nu sunt
subordonaÆi altor angajaÆi.
display nume, pren, id_ang for id_sup=id_ang
list id_ang, nume, pren to file alfa
Lista, care conÆine numai câmpurile cu identificatorul angajatului, numele çi
prenumele pentru toÆi angajaÆii, este copiatå într-un fiçier.
dir alfa.* Se afiçeazå lista fiçierelor care au numele alfa din directorul curent. Fiçierul în
care s-a transferat lista are extensia .txt.
type alfa.txt Se afiçezå conÆinutul fiçierului alfa.txt care conÆine lista.
TestaÆi modul în care sunt tratate înregistrårile çterse logic:
Controlul se face prin parametrul deleted:
delete for lower(c_jud)='ct' Se marcheazå pentru çtergere logicå înregistrårile
angajaÆilor din ConstanÆa.
set deleted on Se atribuie parametrului deleted valoarea on.
display Se afiçeazå înregistrarea curentå cu comanda display.
list Se afiçeazå toate înregistrårile cu comanda list.
display all Se afiçeazå toate înregistrårile cu comanda display all.
set deleted off Se atribuie parametrului deleted valoarea off.
display Se afiçeazå înregistrarea curentå cu comanda display.
132 Informatică

list Se afiçeazå toate înregistårile cu comanda list.


display all Se afiçeazå toate înregistårile cu comanda display all.
recall for lower(c_jud)='ct' Se refac înregistrårile marcate logic pentru çtergere.
TestaÆi efectul filtrului definit pentru înregistråri:
PuteÆi så definiÆi filtre pentru înregistråri cu ajutorul parametrului filter:
set filter to upper(c_jud)='B' Se construieçte un filtru. Scopul este de a låsa så treacå
numai angajaÆii din Bucureçti.
?filter() Se cere afiçarea filtrului.
upper(c_jud)='B' Se afiçeazå condiÆia logicå din filtru.
list id_ang, nume, pren, loc Se afiçeazå atât angajaÆii din Bucureçti cât çi cei din Buzåu.
browse Açadar, filtrul nu a fost construit corect.
set filter to upper(c_jud)=='B' Se defineçte din nou filtrul, cu o altå condiÆie logicå.
?filter() Se cere afiçarea filtrului.
upper(c_jud)=='B' Se afiçeazå condiÆia logicå din filtru.
list id_ang, nume, pren, loc Nu se afiçeazå nici o înregistrare. Din nou filtrul nu a fost definit
browse corect.
set filter to upper(c_jud)=='B ' Se defineçte din nou filtrul, cu o altå condiÆie logicå.
?filter() Se cere afiçarea filtrului.
(c_jud)=='B ' Se afiçeazå condiÆia logicå din filtru.
list id_ang, nume, pren, loc Se afiçeazå numai angajaÆii din Bucureçti. CondiÆia din filtru a
browse fost definitå corect.
set filter to Se anuleazå filtrul.
list id_ang, nume, pren, loc Se afiçeazå toate înregistrårile.
browse
TestaÆi efectul filtrului definit pentru câmpuri:
PuteÆi så definiÆi filtre pentru câmpuri cu ajutorul parametrului fields. DeschideÆi tabelul
ClienÆi cu comanda use clienti.
set fields to id_cl, nume, pren, id_ang
list Sunt afiçate numai câmpurile identificator client, nume çi pre-
browse nume client, identificatorul angajatului care se ocupå de client.
display (numai câmpurile id_cl, nume, pren, id_ang)
set fields to
browse Nu este afiçat nici un câmp.
set fields to all
browse Sunt afiçate toate câmpurile.

4 . 5 . S o r t a r e a t a b e l u lu i

În urma sortårii unui tabel se creeazå un alt tabel în care înregistrårile sunt rearanjate
conform criteriului de sortare folosit. OperaÆia acÆioneazå asupra tabelului deschis.
Sintaxa comenzii este:
sort to <nume_tabel> on <câmp_1> [/a | /d] [ /c] [, <câmp_1> [/a | /d] [ /c].... ]
[ascending | descending] [<domeniu>] [for <cond_1>] [while <cond_2>]
[fields <listå_câmpuri>]
Forma implicitå a comenzii este:
sort to <nume_tabel> on <câmp>
Utilizarea unor instrumente de prelucrare a datelor 133

unde <nume_tabel> este numele tabelului obÆinut în urma sortårii tuturor înregistrårilor din
tabelul deschis, iar <câmp> este numele câmpului folosit pentru cheia de sortare. Sortarea
se face în ordinea crescåtoare a câmpului cheie de sortare. Tabelul sortat va avea aceeaçi
structurå ca çi tabelul surså. Explicit, se pot sorta din tabelul surså numai înregistrårile
precizate prin <domeniu> sau clauzele for sau while çi pot fi folosite mai multe chei de
sortare <câmp_1>, <câmp_2> etc. Sortarea se poate face descrescåtor, dupå toatå lista de
câmpuri cheie de sortare folosind clauza descending, sau poate fi controlatå ordinea de
sortare la nivelul fiecårui câmp, folosind adverbele /a - crescåtor, /d - descrescåtor sau /c -
fårå så se Æinå cont de diferenÆa dintre literele mari sau mici. Tabelul sortat poate så conÆinå
numai câmpurile precizate prin lista din clauza fields.

4 . 6 . I n d e x a r e a t a b e lu l u i
Pentru a putea exploata un tabel în acces direct, trebuie organizat astfel încât så aveÆi
acces direct la o înregistrare în funcÆie de valoarea unui câmp sau a unor câmpuri care
vor forma cheia de acces. SoluÆia este de ordonare logicå a înregistrårilor prin interme-
diul fiçierelor index, iar cheia de acces se mai numeçte cheie de indexare.
Visual FoxPro permite crearea a douå tipuri de fiçiere de index pe lângå indexul structural:
9 index simplu care conÆine o singurå cheie de indexare într-un fiçier (numele diferit
de al tabelului çi extensia idx),
9 index compus care conÆine mai multe chei de indexare (etichete index) într-un
fiçier (numele diferit de al tabelului çi extensia cdx).
Cheia de indexare poate fi formatå dintr-un singur câmp sau din mai multe câmpuri legate
printr-o expresie de concatenare. Din aceastå cauzå, dacå nu sunt de tip çir de caractere,
câmpurile trebuie convertite într-un çir de caractere cu ajutorul funcÆiilor de conversie. Am
notat cp1 - câmpul 1, cp2 - câmpul 2 çi e(cp1,cp2) - expresia formatå din cele douå câmpuri.
tip cp1 tip cp2 cp1 convertit cp2 convertit e(cp1,cp2)
C C cp1 cp2 cp1+cp2
C N cp1 str(cp2) cp1+ str(cp2)
C D cp1 dtos(cp2) cp1+ dtos(cp2)
C T cp1 ttoc(cp2) cp1+ ttoc(cp2)
N N str(cp1) str(cp2) str(cp1)+ str(cp2)
N D str(cp1) dtos(cp2) str(cp1)+ dtos(cp2)
N T str(cp1) ttoc(cp2) str(cp1)+ ttoc(cp2)
D D dtos(cp2) dtos(cp2) dtos(cp1)+ dtos(cp2)
D T dtos(cp2) ttoc(cp2) dtos(cp1)+ ttoc(cp2)
T T ttoc(cp2) ttoc(cp2) ttoc(cp1)+ ttoc(cp2)
Câmpurile logice çi memo nu pot fi folosite în cheia de indexare.
4.6.1. Crearea unui index
Dacå indexul compus structural se creeazå împreunå cu tabelul, ceilalÆi indecçi se
creeazå dupå ce a fost creat tabelul, prin comanda:
index on <expresie_index>
to <nume_fiçier.idx> | tag <nume_etichetå> [of <nume_fiçier.cdx>]
[for <cond_1>] [ascending | descending] [additive]
134 Informatică

Forma implicitå a comenzii este:


9 pentru indexul simplu:
index on <expresie_index> to <nume_fiçier.idx>
9 pentru indexul compus:
index on <expresie_index> tag <nume_etichetå> of <nume_fiçier.cdx>
Implicit, se ordoneazå crescåtor toate înregistrårile din tabel, iar la crearea noului index
toate celelalte fiçiere index asociate tabelului sunt închise (cu excepÆia indexului structural).
Explicit, prin fiçierul index puteÆi avea acces numai la înregistrårile precizate cu clauza for,
ordonarea logicå poate fi crescåtoare (ascending) sau descrescåtoare (descending) çi se
pot påstra deschise fiçierele 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,
ceilalÆi indecçi trebuie deschiçi fie prin opÆiunea Open∈File (în caseta de dialog Open
alegeÆi tipul index (*.idx; *.cdx) din lista Files of type), fie folosind una dintre comenzile:
9 la deschiderea tabelului:
use <nume_tabel> index <listå_fiçiere.idx>
[order <nume_fiçier.idx>| tag <nume_etichetå> of <nume_fiçier.cdx>
[ascending | descending]
În lista de fiçiere a clauzei index pot fi specificaÆi atât indecçi simpli, cât çi indecçi compuçi.
Nu este obligatoriu så se precizeze çi extensia (doar dacå existå douå fiçiere index, unul
simplu çi altul compus, cu acelaçi nume). Dacå se deschid mai mulÆi indecçi prin clauza
order, precizaÆi care este indexul activ (indexul simplu sau eticheta din indexul compus).
9 dupå deschiderea tabelului:
set index to <listå_fiçiere.idx> [ascending | descending] [additive]
order <nume_fiçier.idx>| tag <nume_etichetå> of <nume_fiçier.cdx>
4.6.3. Alte operaÆii cu indecçi
9 schimbarea indexului activ din lista de indecçi deschiçi:
set order to <nume_fiçier.idx>| tag <nume_etichetå> of <nume_fiçier.cdx>
[ascending | descending]
9 çtergerea etichetelor dintr-un index compus:
delete tag <nume_etichetå_1> of <nume_fiçier_1.cdx>
[,<nume_etichetå_1> of <nume_fiçier_1.cdx> ...]
4.6.4. Exploatarea unui tabel împreunå cu indexul
Dacå deschideÆi tabelul împreunå cu un index, aveÆi acces direct la înregistråri. PoziÆionarea
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
secvenÆial. Dacå se gåseçte înregistrarea, funcÆia found() va furniza valoarea .T.
În loc så folosiÆi comanda seek împreunå cu funcÆia found(), puteÆi folosi funcÆia seek():
seek (<expresie>)
Utilizarea unor instrumente de prelucrare a datelor 135

FuncÆia testeazå dacå existå o înregistrare care are cheia de indexare egalå cu expresia
<expresie>. Dacå o gåseçte, poziÆioneazå pointerul pe aceastå înregistrare çi furnizeazå
valoarea .T., altfel poziÆioneazå pointerul la sfârçitul fiçierului çi furnizeazå valoarea .F..

SortaÆi tabele:
DeschideÆi tabelul AngajaÆi. SortaÆi acest tabel dupå urmåtoarele criterii:
use angajati Se deschide tabelul AngajaÆi.
browse Se afiçeazå conÆinutul tabelului în fereastra de editare.
sort on nume, pren to a1
Se sorteazå tabelul dupå câmpurile nume çi pren. Rezultatul sortårii este în tabelul a1.
sort on id_ang to a2
Se sorteazå tabelul dupå câmpul id_ang. Rezultatul sortårii este în tabelul a2.
sort on id_sup to a3
Se sorteazå tabelul dupå câmpul id_sup. Rezultatul sortårii este în tabelul a3.
sort on loc, id_ang to a4
Se sorteazå tabelul dupå câmpurile loc çi id_ang. Rezultatul sortårii este în tabelul a4.
use a1 Se deschide tabelul a1.
list nume, pren, id_ang, id_sup, loc
browse Înregistrårile sunt aranjate alfabetic dupå valoarea câmpurilor nume çi pren. Pentru
acelaçi nume, sunt ordonate alfabetic dupå prenume.
use a2 Se deschide tabelul a2.
list nume, pren, id_ang, id_sup, loc
browse Înregistrårile sunt aranjate crescåtor dupå valoarea câmpului id_ang.
use a3 Se deschide tabelul a3.
list nume, pren, id_ang, id_sup, loc
browse Înregistrårile sunt aranjate crescåtor dupå valoarea câmpului id_ang.
use a4 Se deschide tabelul a4.
list nume, pren, id_ang, id_sup, loc
browse Înregistrårile sunt aranjate alfabetic dupå localitate. Pentru aceeaçi localitate, sunt
aranjate în ordinea crescåtoare a identificatorului de angajat.
IndexaÆi tabele:
use judete S-a deschis tabelul JudeÆe.
modify structure
În caseta de dialog Table Designer, deschideÆi secÆiunea Index. ObservaÆi cå pentru acest
tabel nu s-a definit la creare nici un index structural.
index on c_jud tag cod of judete
S-a definit un index structural. ConÆine o singurå etichetå cod, iar cheia de indexare a
etichetei este câmpul c_jud (codul judeÆului).
modify structure
În caseta de dialog Table Designer, deschideÆi secÆiunea Index. ObservaÆi cå indexul
definit este de tip Regular. SchimbaÆi tipul în Candidate.
list Înregistrårile sunt afiçate în ordinea alfabeticå a codului judeÆului.
browse În fereastra de editare, înregistrårile sunt afiçate în ordinea alfabeticå a
codului judeÆului.
seek 'ct' Cautå înregistrarea pentru care codul judeÆului este ct.
?iif (found(),n_jud, 'nu a gasit')
136 Informatică

Constanta S-a gåsit înregistrarea.


?iif(seek('bz'),n_jud,'nu a gasit')
Buzau S-a gåsit înregistrarea.
use angajati S-a deschis tabelul AngajaÆi.
browse Înregistrårile sunt afiçate în ordinea în care le-aÆi creat.
modify structure
În caseta de dialog Table Designer, deschideÆi secÆiunea Index. ObservaÆi cå pentru acest
tabel este definit deja de la creare indexul nume care are cheia determinatå de expresia
nume+pren. DefiniÆi un nou index cu numele cod, de tip Candidate çi cu expresia de
indexare id_ang. MutaÆi acest index pe prima poziÆie în listå. DefiniÆi 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 ObservaÆi ordinea în care sunt afiçate înregistrårile.
list id_ang, nume, pren
set order to tag nume Ordinea de indexare este datå de eticheta cod.
list id_ang, nume, pren
browse ObservaÆi ordinea în care sunt afiçate înregistrårile.

# ÎncercaÆi:

T est pentru evaluare:


Adevårat/Fals:
1. Ordonarea logicå înseamnå o ordonare dupå o condiÆie logicå.
2. Cheia de indexare poate conÆine mai multe câmpuri legate printr-o expresie de concatenare.
3. Un tabel poate avea mai mulÆi indecçi structural compuçi.
4. Într-un tabel puteÆi defini mai multe etichete de tipul Primary.
5. Numårul înregistrårii curente din tabel îl obÆineÆi cu funcÆia reccount().
6. Domeniul implicit al comenzii list este all.
7. Domeniul implicit al comenzii display este all.
8. FuncÆia cnt() nu poate fi folositå decât în comanda calculate.
9. Comanda delete tag çterge o etichetå dintr-un index compus.
10. Se poate crea un singur index simplu.
CompletaÆi:
1. Un index compus conÆine mai multe ..........................…………
2. Pentru crearea unui tabel puteÆi folosiÆi comanda SQL ............................
3. PuteÆi så modificaÆi structura unui tabel cu comanda ..............................................
4. Cu comanda set fields to controlaÆi accesul la ....................................
5. ObÆineÆi numårul de câmpuri dintr-o înregistrare cu funcÆia ..............................
6. ObÆineÆi numårul de înregistråri dintr-un tabel cu funcÆia ...................................
7. În acces secvenÆial, cåutarea unei înregistråri dupå un criteriu logic se face cu comanda .....
8. În comanda list, pentru a afiça anumite câmpuri folosiÆi clauza ......................
9. Pentru a calcula media aritmeticå folosiÆi funcÆia ..........................
10. StabiliÆi eticheta activå dintr-un index compus cu comanda ..........................................
Utilizarea unor instrumente de prelucrare a datelor 137

AlegeÆi råspunsurile corecte:


1. ObÆineÆi dimensiunea unei înregistråri cu funcÆia:
a) fsize() b) recsize() c) reccount()
2. Ordonarea fizicå a înregistrårilor din tabel se face cu operaÆia de:
a) indexare b) sortare c) concatenare
3. VreÆi så indexaÆi dupå douå câmpuri numerice a çi b. Expresia cheii de indexare este:
a) a+b b) a,b c) str(a)+str(b)
4. VreÆi så sortaÆi dupå douå câmpuri numerice a çi b. Expresia cheii de sortare este:
a) a+b b) a,b c) str(a)+str(b)
5. PuteÆi vedea structura unui tabel cu comanda:
a) list structure b) display structure c) modify structure
6. Cu comanda set filter to controlaÆi accesul la:
a) câmpuri b) înregistråri c) înregistråri çi câmpuri
7. Comanda goto next poziÆioneazå pointerul de înregistrare pe:
a) înregistrarea urmåtoare b) înregistrarea curentå c) eroare
8. Comanda delete:
a) çterge logic înregistrarea curentå
b) çterge fizic înregistrarea curentå
c) çterge logic toate înregistrårile
d) çterge fizic toate înregistrårile
9. CombinaÆia comanda seek + funcÆia found() poate fi înlocuitå de:
a) comanda locate + funcÆia found() b) funcÆia seek() c) comanda found
10. Comanda insert blank insereazå:
a) spaÆii într-un câmp de tip çir de caractere
b) o înregistrare vidå dupå înregistrarea curentå
c) o înregistrare vidå înaintea înregistrårii curente
RåspundeÆi:
1. Ce este un tabel liber?
2. Prin câte metode puteÆi crea structura unui tabel? Ce comenzi folosiÆi?
3. Ce este un tabel de structurå?
4. Ce sunt indecçii? De câte tipuri sunt? Unde sunt memoraÆi î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å definiÆi pentru câmpul care va asigura legåtura
cu un alt câmp al bazei de date?
7. Ce avantaj are folosirea a douå operaÆii de çtergere: logicå çi fizicå?
8. Cum controlaÆi accesul la nivel de înregistrare çi la nivel de câmp într-un tabel?
9. Ce informaÆii puteÆi obÆine despre câmpurile din tabel cu ajutorul funcÆiilor?
10. Ce informaÆii puteÆi obÆine despre înregistrårile din tabel cu ajutorul funcÆiilor?
11. Care este deosebirea dintre comenzile list çi display?
12. Care este deosebirea dintre comenzile edit çi browse?

R åspunsuri:
Adevårat/Fals: 1-F; 2-A; 3-F; 4-F; 5-F; 6-A; 7-F; 8-A; 9-A; 10-F.
CompletaÆi: 1-etichete index; 2-create table; 3-modify structure; 4-câmpuri; 5-fcount; 6-reccount;
7-locate; 8-fields; 9-avg(); 10-set order to
AlegeÆi råspunsurile corecte: 1-b; 2-b; 3-c; 4-b; 5-a,b,c; 6-b; 7-c; 8-a; 9-b; 10-b.
138 Informatică

5. Operaţii cu datele dintr-o bază de date


În Visual FoxPro puteÆi 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 påstrat çi în Visual FoxPro pentru compatibilitate
cu versiunile anterioare). Tabelele bazei de date sunt permanente çi se
memoreazå în fiçiere .dbf. Ele pot fi create çi manipulate prin operaÆiile 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 aplicaÆie în care så fie
definitå çi care trebuie rulat de fiecare datå când vreÆi så exploataÆi 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 construieçte baza de date prin definirea relaÆiilor
dintre tabele. Aceste relaÆii pot fi numai de tip una-la-una sau una-la-mai-multe. În
timpul sesiunii de lucru se executå operaÆii de exploatare çi întreÆinere a bazei de
date. La terminarea sesiunii de lucru tabelele se închid çi automat se distrug çi
relaÆiile stabilite între ele, relaÆii care defineau baza de date. În urmåtoarea sesiune
de lucru, trebuie reluatå operaÆia de definire a relaÆiilor dintre tabele, operaÆii care
creeazå baza de date.
9 Permanente. Ele sunt create prin metoda containerului, în care baza de date
este o entitate permanentå. Tabelele sunt påstrate în continuare în fiçiere cu
extensia .dbf. Baza de date este înså definitå ca un container care va conÆine: lista
tabelelor componente, relaÆiile dintre tabele çi alte date necesare regåsirii informa-
Æiilor. Baza de date este memoratå într-un fiçier cu extensia .dbc, este indepen-
dentå de programele de aplicaÆii çi poate fi påstratå çi în afara sesiunii de lucru.
Definirea relaÆiilor se face o singurå datå, la crearea bazei de date. Pentru a avea
acces la baza de date, este suficient så deschideÆi fiçierul bazei de date (fiçierul
.dbc). Prin aceastå metodå poate fi îmbunåtåÆit lucrul cu tabelele bazei de date,
deoarece în baza de date pot fi påstrate çi alte date, ca de exemplu date despre
câmpurile din tabele: etichetele câmpurilor, valoarea implicitå a câmpului, regula
de validare la nivel de câmp sau la nivel de înregistrare, mesajele care vor fi
afiçate dacå datele introduse în câmp nu respectå regula de validare etc.
OperaÆiile puse la dispoziÆie de Visual FoxPro pentru administrarea bazelor de date pot fi
grupate astfel:
1. Crearea bazei de date care cuprinde urmåtoarele operaÆii:
9 crearea unui fiçier nou bazå de date;
9 adåugarea pe rând la baza de date a tabelelor libere create anterior;
9 construirea unor noi tabele direct în baza de date;
9 precizarea, pentru tabelele libere create anterior, a proprietåÆilor care nu au putut fi
definite la crearea lor: etichetele câmpurilor, valorile implicite ale câmpurilor,
regulile de validare la nivel de câmp çi la nivel de înregistrare, mesajele de eroare
pentru regulile de validare.
9 stabilirea legåturilor între tabele;
9 stabilirea proprietåÆilor bazei de date;
9 încorporarea în baza de date a unor entitåÆi specifice pentru exploatarea ei:
vizualizåri, conexiuni (care asigurå accesul la datele create cu alte sisteme),
Utilizarea unor instrumente de prelucrare a datelor 139

proceduri çi funcÆii care pot fi folosite atunci când se Start


exploateazå tabelele bazei de date.
2. Exploatarea bazei de date care cuprinde operaÆii pentru: Open (baza de date)
9 deschiderea bazei de date çi a tabelelor,
9 prelucrarea datelor din tabele prin operaÆii de actualizare,
consultare, sortare etc., Open (tabele)
9 închiderea tabelelor çi a bazei de date.
Prelucrare
5.1. Crearea bazei de date
5.1.1. Crearea bazei de date Close (tabele)

În urma operaÆiei de creare, baza de date este deschiså


automat. PuteÆi crea baza de date prin urmåtoarele metode: Close (baza de date)
1. Interactiv:
AlegeÆi opÆiunea New...∈File çi în caseta de dialog New activaÆi
Stop
butonul radio Database din lista File Type çi executaÆi clic pe
controlul New File. Se deschide caseta de dialog Create în care scrieÆi numele bazei de
date în caseta de text Enter çi apoi executaÆi clic pe declançatorul Save. Se deschide
fereastra generatorului de baze de date Database Designer, în care puteÆi vedea
arhitectura bazei de date: tabele çi relaÆii între tabele. IniÆial ea afiçeazå 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. DeschideÆi apoi fereastra Database
Designer cu comanda:
modify database
5.1.2. Adåugarea la baza de date a tabelelor libere
PuteÆi så adåugaÆi tabele libere la baza de date prin urmåtoarele metode:
1. Interactiv:
Fie folosiÆi opÆiunea Add Table...∈Database, fie executaÆi clic pe butonul Add Table din
bara de instrumente Database Designer.
2. Prin comanda:
add table <nume_tabel>
5.1.3. Adåugarea la baza de date a tabelelor noi
PuteÆi så adåugaÆi tabele noi la baza de date prin urmåtoarele metode:
1. Interactiv:
Fie folosiÆi opÆiunea New Table...∈Database, fie executaÆi clic pe butonul New Table din
bara de instrumente Database Designer.
2. Prin comanda:
create <nume_tabel>
140 Informatică

5.1.4. ObÆinerea informaÆiilor despre baza de date deschiså


PuteÆi folosi comenzile:
list | display databases
Afiçeazå numele bazei de date, identificatorul cåii de director în care se gåseçte fiçierul,
versiunea çi lista tabelelor împreunå cu câmpurile lor.
list | display tables
Afiçeazå pe douå coloane lista tabelelor din baza de date: în coloana Name - numele
tabelului, iar în coloana Source identificatorul fiçierului în care se gåseçte tabelul.
5.1.5. Alte operaÆii cu baza de date
ÎndepårtaÆi un tabel din baza de date fie cu opÆiunea de meniu Remove...∈Database,
fie executând clic pe butonul Remove Table din bara de instrumente Database
Designer dupå ce aÆi selectat tabelul, fie cu comanda:
remove <nume_tabel>
Dupå ce aÆi selectat un tabel în fereastra Database Designer, puteÆi så-i modificaÆi
structura fie cu opÆiunea de meniu Modify...∈Database, fie executând clic pe butonul
Modify Table din bara de instrumente Database Designer, fie cu comanda:
modify structure
Dupå ce aÆi selectat un tabel în fereastra Database Designer, puteÆi så deschideÆi
fereastra de editare pentru a face modificåri cu opÆiunea de meniu Browse∈ Database,
executând clic pe butonul Browse Table din bara de instrumente Database Designer,
executând dublu clic pe tabel sau cu comanda:
browse
VerificaÆi integritatea bazei de date cu comanda:
validate databases
Dacå aÆi deschis mai multe baze de date, una singurå este activå (baza de date pe care
o puteÆi exploata). Pentru a activa o bazå de date folosiÆi 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 foloseçte 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 fiçierele asociate exploatårii bazelor de date care erau deschise în acel
moment.
5.2.2. Deschiderea çi închiderea tabelelor
Pentru a folosi un tabel din baza de date, el trebuie deschis. Pentru a administra mai
multe tabele din baza de date, fiecare dintre ele trebuie så fie deschis. Pentru a putea
deschide mai multe tabele, Visual FoxPro foloseçte mecanismul zonelor de lucru.
O zonå de lucru este o zonå de memorie care se asociazå unui tabel la deschiderea lui.
Pot fi folosite peste 30.000 de zone de lucru. În zona de lucru se påstreazå informaÆii
despre tabelul deschis în acea zonå:
9 identificatorul fiçierului în care este memorat tabelul,
9 structura fiçierului,
9 numårul de înregistråri din fiçier,
9 contorul înregistrårii curente etc.
Identificarea unei zone de lucru se face prin numårul såu 1, 2, 3, ... 30.000. Primele
zece zone de lucru se pot identifica çi prin literele alfabetului: a,b, ...,j. La deschiderea
tabelului, acestuia i se poate atribui un alias, adicå un nume cu care puteÆi så identificaÆi
tabelul çi componentele sale în timpul operaÆiilor de exploatare.
Deschiderea unui tabel într-o zonå de lucru se face cu comanda:
use <nume_tabel> in <zona> [alias <nume_alias>] [again]
unde <zona> este identificatorul zonei în care se deschide tabelul, iar <nume_alias> este
un nume atribuit pentru alias. Dacå acest nume nu se precizeazå, sistemul îi atribuie
implicit un alias: numele tabelului (numele fiçierului în care este påstrat tabelul) dacå
tabelul este deschis într-o singurå zonå sau numårul zonei, dacå tabelul este deschis în
mai multe zone. Dacå vreÆi så deschideÆi acelaçi tabel în mai multe zone de lucru, folosiÆi
clauza again începând de la a doua operaÆie de deschidere. Dacå precizaÆi pentru
<zona> valoarea 0, tabelul va fi deschis în prima zonå de lucru disponibilå (liberå).
La un moment dat, într-o zonå de lucru nu poate fi deschis decât un singur tabel. Dacå în
zona respectivå este deschis deja un tabel, el trebuie închis în prealabil.
Indiferent de câte zone de lucru folosiÆi, la un moment dat una singurå dintre ele este
zona de lucru activå (curentå). Zona de lucru curentå este zona la care se referå
implicit o comandå în care nu se precizeazå explicit numele tabelului (comanda va
acÆiona asupra tabelului din zona de lucru activå). La începutul sesiunii de lucru, zona de
lucru activå este zona 1.
Schimbarea zonei de lucru curente se face cu comanda:
select <zona>
unde <zona> poate fi precizatå prin numårul såu sau prin aliasul sau numele tabelului
deschis în aceastå zonå.
Alocarea unei zone de lucru unui tabel se poate face la deschiderea lui prin clauza in sau
prin selectarea zonei de lucru înainte de deschiderea tabelului. Comanda:
use <nume_tabel> in <zona>
este echivalentå cu grupul de comenzi:
select <zona> use <nume_tabel>.
142 Informatică

OperaÆiile 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 subînÆelege (este implicit în comenzi).
9 În celelalte zone, prin aliasul såu sau prin numele zonei.
Identificarea câmpurilor dintr-un tabel se face astfel:
9 În zona activå prin numele câmpului.
9 În celelalte zone prin identificatorul <alias>.<nume_câmp> sau <alias>-><nume_câmp>.
PuteÆi så obÆineÆi informaÆii despre zonele de lucru çi tabelele deschise în aceste zone cu
funcÆiile:
9 select([1]) furnizeazå implicit numårul zonei de lucru active; dacå folosiÆi parametrul 1,
va furniza numårul 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 funcÆiei 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 conÆine numele
fiçierului deschis în zona de lucru sau çirul vid, dacå nu este deschis nici un fiçier.
Implicit, rezultatul funcÆiei 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 conÆine aliasul
fiçierului deschis în zona de lucru sau çirul vid, dacå nu este deschis nici un fiçier.
Implicit, rezultatul funcÆiei 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 fiçierelor (close all).

FolosiÆi fereastra View pentru a vizualiza zonele de lucru


DeschideÆi baza de date din exemplul (testdata) din dosarul Data, din dosarul Samples,
din dosarul aplicaÆiei Visual FoxPro. Pentru deschidere folosiÆi comanda Open∈File. Se
deschide fereastra Database Designer în care sunt afiçate tabelele çi relaÆiile dintre
tabelele bazei de date.
DeschideÆi fereastra View folosind comanda View Window∈Window. În fereastrå nu
este afiçat nici un tabel în listå, deoarece aÆi deschis baza de date, nu çi tabelele din baza
de date.
Utilizarea unor instrumente de prelucrare a datelor 143

DeschideÆi caseta de dialog Open executând


clic pe declançatorul Open din fereastra View.
Lista ascunså din care
alegeÆi baza de date.

Lista din care


alegeÆi tabelul pe
care îl deschideÆi.

Grupul de butoane
radio din care alegeÆi
tabele (Tables) sau
vizualizåri (Views).

Dupå ce aÆi deschis mai multe tabele, numele


lor va fi afiçat în lista Aliases. Ele sunt afiçate
în listå în ordinea inverså deschiderii.
SelectaÆi un fiçier din listå. În bara de stare se
va afiça numårul zonei de lucru în care este
deschis (Work Area) çi numårul total de
înregistråri (Records).
ObservaÆi cå zonele de lucru au fost alocate în
ordinea deschiderii: primului tabel deschis,
zona 1, celui de-al doilea tabel deschis,
zona 2 etc.
PuteÆi så definiÆi relaÆii între douå tabele.
SelectaÆi din lista Alias tabelul surså çi apoi
executaÆi clic pe declançatorul Relations.
Numele tabelului va fi afiçat în lista Relations.

SelectaÆi din lista Alias tabe-


lul destinaÆie çi apoi execu-
taÆi clic pe declançatorul
Relations. Numele tabelului
va fi afiçat în lista Relations.
Se deschide caseta de dia-
log Set IndexOrder în care
este afiçatå lista de etichete
index definite pentru tabel.

Executând clic pe eticheta index corespunzåtoare relaÆiei, se deschide caseta de dialog


Expression Builder prin intermediul cåreia puteÆi construi relaÆia.

DeschideÆi pe rând toate tabelele din baza de date: fie executaÆi dublu clic în fereastra
Database Designer pe fiecare tabel pentru a deschide fereastra de editare a tabelului çi
implicit tabelul, fie în fereastra View executaÆi clic pe declançatorul Open çi în caseta de
144 Informatică

dialog Open executaÆi clic pe rând pe numele fiecårui tabel din lista Tables in Database.
DeschideÆi pe rând, începând cu zona 1 çi terminând cu zona 5 tabelele: Customer,
Products, Orditems, Orders çi Employee.
Dupå ce aÆi deschis tabelele, ele vor fi afiçate în fereastra View. SelectaÆi pe rând fiecare
tabel din listå. În bara de stare a ferestrei vor fi afiçate informaÆii despre tabelul selectat:
numårul zonei de lucru çi numårul total de înregistråri. ÎnchideÆi fereastra de comenzi.

ObÆineÆi informaÆii despre tabelele deschise:


select 1 ?dbf(3)
?used() c:\vfp\samples\data\orditems.dbf
.T. ?alias(3)
?used(5) orditems
.T. ?dbf(10)
?used(10) nimic
.F. ?alias(10)
?used('orders') nimic
.T.

CreaÆi baza de date din exemplu:


„ CreaÆi baza de date Compania cu comanda:
create database compania
„ AfiçaÆi informaÆii despre baza de date nou creatå cu comanda:
display database
Se vor afiça numele bazei de date, calea fiçierului bazå de date çi versiunea.
„ AfiçaÆi baza de date în fereastra Database Designer cu comanda
modify database
Fereastra este vidå.
ObservaÆie: Tabelele din baza de date trebuie så conÆinå urmåtoarele chei, astfel încât
så puteÆi stabili legåturi între ele:
9 Tabelul AngajaÆi - câmpul id_ang cheie primarå; câmpul cheie c_jud se va declara de
tipul regular deoarece un tabel nu poate avea decât o cheie primarå.
9 Tabelul ClienÆi - câmpul id_cl cheie primarå; câmpul cheie c_jud se va declara de tipul
regular deoarece un tabel nu poate avea decât o cheie primarå.
9 Tabelul Contracte - câmpul id_cont cheie primarå; câmpul cheie id_cl de tipul regular.
9 Tabelul ÇedinÆe - câmpul nr_s cheie primarå; câmpurile cheie id_ang çi id_cont se
vor declara de tipul regular.
9 Tabelul Estimåri - câmpul id_cont cheie de tipul regular.
9 Tabelul Încasåri - câmpul nr_i cheie primarå; câmpul cheie id_cont de tipul regular.
9 Tabelul JudeÆe - câmpul c_jud se va declara de tipul cheie primarå.
„ AdåugaÆi la baza de date tabelele libere create fie folosind opÆiunea de meniu, fie cu
butonul din bara de instrumente, fie cu comenzile:
add table angajati
add table clienti
add table judete
„ AfiçaÆi informaÆii despre baza de date cu comanda:
Utilizarea unor instrumente de prelucrare a datelor 145

display database
Se vor afiça numele bazei de date, calea fiçierului bazå de date, versiunea çi, pentru
fiecare tabel adåugat la baza de date, numele, calea fiçierului çi structura de câmpuri.
„ AfiçaÆi informaÆii despre tabelele din baza de date cu comanda:
display tables
Se va afiça lista cu numele tabelelor çi cåile fiçierelor.
„ AdåugaÆi la baza de date un tabel nou cu comanda :
create contracte
Se deschide fereastra Table Designer, care spre deosebire de cea afiçatå la crearea
unui tabel liber, conÆine controale noi. De exemplu, pentru câmpul tip_c puteÆi defini o
regulå de validare care så nu permitå introducerea în câmp decât a uneia dintre
valorile: 'e'-evaluare, 'i' - instruire, 'p'-proiect. Regula de validare poate fi exprimatå
prin una dintre urmåtoarele condiÆii logice: lower(tip_c)='i' or lower(tip_c)='p' or
lower(tip_c)='e' sau inlist (lower(tip_c),'i','p','e'). DefiniÆi structura tabelului çi indecçii.

În partea inferioarå a fe-


restrei au apårut controa-
le noi care permit stabili-
rea unei reguli de validare
la nivelul câmpului selec-
tat (Validation Rule),
mesajul de eroare afiçat
(Validation Text), valoa-
rea implicitå a câmpului
(Default Value), eticheta
câmpului (Caption),
comentarii despre câmp
(Field Comment). În
exemplu s-au completat
aceste casete de text
pentru câmpul tip_c - tipul
contractului. Regula de
validare este:
lower(tip_c)='i' or
lower(tip_c)='p' or
lower(tip_c)='e' iar va-
loarea implicitå este 'p'.
„ AdåugaÆi 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 definiÆi structura
tabelului çi indecçii.
„ ModificaÆi structura tabelelor create liber, adåugându-le reguli de validare çi indecçi.
ExecutaÆi pentru fiecare tabel deschiderea cu comanda use çi apoi modificarea cu
comanda modify structure.
„ Dupå ce aÆi adåugat tabelele în baza de date, fereastra Database Designer va
conÆine aceste tabele:
146 Informatică

„ Între tabele nu sunt stabilite relaÆii permanente. În prealabil, în tabelele conducåtoare


s-a stabilit câte un index primar, iar în tabelele conduse indecçi de tip regular. VeÆi
stabili interactiv relaÆii în fereastra Database Designer, glisând indexul primar din
tabelul conducåtor peste indexul regular din tabelul condus. De exemplu, glisaÆi cheia
cu numele angajat din tabela AngajaÆi (câmpul index este id_ang) peste cheia
angajat din tabela ÇedinÆe (câmpul index este id_ang). Se deschide caseta de dialog
Edit Relationship în care executaÆi clic pe declançatorul OK.
„ Dupå ce aÆi definit relaÆiile, fereastra Database Designer va afiça:

ObservaÆi cå între tabelul JudeÆe çi tabelele AngajaÆi çi ClienÆi nu s-au stabilit încå
relaÆii. În tabelele AngajaÆi çi ClienÆi cheia c_jud nu poate fi declaratå cheie candidat,
deoarece existå mai multe înregistråri cu aceeaçi valoare a cheii (mai mulÆi angajaÆi çi
clienÆi din acelaçi judeÆ). Açadar, se poate stabili o relaÆie de tip una-la-mai multe între
tabelul JudeÆe çi tabelul AngajaÆi, respectiv ClienÆi.
Utilizarea unor instrumente de prelucrare a datelor 147

„ Deoarece tabelele din baza de date trebuie gestionate împreunå, trebuie asiguratå inte-
gritatea referenÆialå. DefiniÆi pentru fiecare relaÆie regula de integritate referenÆialå astfel:
în fereastra Database Designer executaÆi dublu clic pe o relaÆie. Se deschide caseta de
dialog Edit Relationship în care executaÆi clic pe declançatorul Referential Integrity....
Se deschide caseta de dialog Referential Integrity Builder care conÆine trei secÆiuni:

9 secÆiunea Rules for Updating în care puteÆi stabili regula de integritate


referenÆialå pentru operaÆiile de actualizare,
9 secÆiunea Rules for Deleting în care puteÆi stabili regula de integritate
referenÆialå pentru operaÆiile de çtergere çi
9 secÆiunea Rules for Inserting în care puteÆi stabili regula de integritate
referenÆialå pentru operaÆiile de adåugare.
Aceste operaÆii se referå la tabelele conducåtoare, în care modificarea valorii cheii prima-
re poate så ducå la ruperea legåturii cu unele înregistråri din tabelul condus. DeschideÆi
secÆiunea corespunzåtoare operaÆiei pentru care stabiliÆi regula de integritate, selectaÆi
relaÆia tabel pårinte - tabel copil pentru care stabiliÆi regula çi activaÆi apoi butonul radio
corespunzåtor regulii de integritate. PuteÆi alege una dintre urmåtoarele reguli de integri-
tate: Cascade (se çterg sau se modificå în cascadå toate înregistrårile din tabelul copil,
legate de înregistrarea çtearså sau modificatå din tabelul pårinte), Restrict (dacå existå
în tabelul copil o înregistrare legatå de înregistrarea care se çterge sau se modificå în
tabelul pårinte, se opreçte procesul çi se afiçeazå un mesaj de eroare), Ignore (operaÆiile
se pot executa fårå restricÆii).
„ DeschideÆi 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
„ VerificaÆi integritatea datelor existente în acest moment folosind comanda:
validate database
„ AdåugaÆi date la fiecare tabel.
148 Tehnologii asistate de calculator

„ ÎnchideÆi baza de date cu comanda:


close databases

# ÎncercaÆi:

T est pentru evaluare:


Adevårat/Fals:
1. Visual FoxPro vå permite crearea unor relaÆii permanente între tabelele bazei de date.
2. La o bazå de date nu puteÆi adåuga tabele libere.
3. Dacå închideÆi o bazå de date, se închid automat çi tabelele pe care le conÆine.
4. Dacå deschideÆi un tabel dintr-o bazå de date, se deschide automat çi baza de date.
5. Nu puteÆi îndepårta un tabel dintr-o bazå de date.
CompletaÆi:
1. PuteÆi vedea arhitectura bazei de date în fereastra ..........................…………
2. PuteÆi verifica integritatea bazei de date cu comanda ............................
3. Dacå aÆi deschis mai multe baze de date, puteÆi activa o bazå de date cu comanda
..............................................
4. PuteÆi închide o bazå de date cu comanda ....................................
5. PuteÆi så deschideÆi fereastra Database Designer pentru o bazå de date deschiså cu
comanda ..............................
AlegeÆi råspunsul corect:
1. AdåugaÆi un tabel liber la o bazå de date cu comanda:
a) add table b) new table c) create table
2. AdåugaÆi un tabel nou la o bazå de date cu comanda:
a) add table b) new table c) create
3. StabiliÆi zona de lucru activå cu comanda:
a) open b) select c) alias
4. AflaÆi dacå un tabel este deschis cu funcÆia:
a) dbf() b) used() c) alias()
5. AflaÆi numårul zonei de lucru active cu funcÆia:
a) select() b) used() c) alias()
RåspundeÆi:
1. Care sunt etapele de creare a unei baze de date?
2. Prin ce metode puteÆi vedea arhitectura bazei de date?

R åspunsuri:
Adevårat/Fals: 1-A; 2-F; 3-A; 4-A; 5-F.
CompletaÆi: 1-Database Designer; 2-validate database; 3-set database to; 4-close databases;
5-modify database.
AlegeÆi råspunsul corect: 1-a; 2-c; 3-b; 4-b; 5-a.
Utilizarea unor instrumente de prelucrarea datelor 149

6. Obţinerea informaţiilor din baza de date


Datele din baza de date vå ajutå så modelaÆi çi så analizaÆi evenimentele care se
produc în cadrul organizaÆiei. Metoda cea mai simplå de a genera anumite informaÆii din
datele din baza de date este aceea de a prezenta datele sub forma vizualizårilor sau a
interogårilor. Alteori este necesar så prezentaÆi datele sub forma unor rapoarte care så
grupeze çi så sintetizeze informaÆiiile.
În prezentarea informaÆiilor apar cazuri în care trebuie så combinaÆi informaÆii dintr-o
bazå de date cu informaÆiile create cu alte aplicaÆii çi este necesar så integraÆi datele
dintr-o bazå de date într-un document creat cu mai multe tipuri de aplicaÆii (så integraÆi
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 påstreazå unele date legate de activitatea sa în
tabele personale create cu aplicaÆia Excel, iar alte date se gåsesc în baza de date a
companiei. Raportul va fi scris cu procesorul de texte Word çi va trebui så integreze date
atât din aplicaÆia Excel, cât çi din aplicaÆia Visual FoxPro. Mai este posibil ca un angajat al
firmei så pregåteascå o prezentare cu Power Point pentru unul dintre clienÆii fideli. Pentru
prezentare are nevoie de date din baza de date a companiei, despre contractele derulate,
termene, preÆuri etc. În acest caz, în prezentarea creatå cu aplicaÆia Power Point trebuie så
integreze date create cu aplicaÆia Visual FoxPro. Alteori este posibil så aveÆi nevoie de date
create cu un alt sistem de gestiune a bazelor de date. De exemplu, firma de consultanÆå a
preluat clienÆii çi o parte dintre angajaÆii altei firme de consultanÆå, care çi-a påstrat 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.
Açadar, scopul pentru care creaÆi çi administraÆi o bazå de date este de a obÆine rapid
informaÆii. InformaÆia poate fi prezentatå în diferite formate. Pentru prezentarea ei puteÆi
folosi interogårile, vizualizårile çi rapoartele.

6.1. Interogările
Interogarea este operaÆia prin care extrageÆi date din baza de date fårå så le çtergeÆi sau
så le modificaÆi çi pe care le afiçaÆi într-un anumit format. Extragerea se face în funcÆie de
un anumit criteriu numit criteriu de interogare. Acesta trebuie så defineascå datele pe
care vreÆi så le extrageÆi: numele câmpurilor, tabelele din care fac parte, criteriile prin care
se extrag înregistrårile çi în ce ordine sunt pezentate. Interogarea este scopul bazei de
date. Când un utilizator interogheazå baza de date, el pune de fapt o întrebare: „Ce date
din baza de date îndeplinesc aceste condiÆii?". Folosind o interogare puteÆi:
9 så combinaÆi înregistråri din mai multe tabele într-un singur tabel,
9 så selectaÆi numai înregistrårile care îndeplinesc un anumit criteriu,
9 så afiçaÆi înregistrårile în ordinea doritå,
9 så afiçaÆi câmpuri calculate.
Interogårile pot afiça înregistråri din mai multe tabele. Dacå relaÆia dintre cele douå tabele
este de una-la-mai-multe, interogarea va afiça pe mai multe rânduri câmpurile corespun-
zåtoare înregistrårilor din al doilea tabel (mai-multe) legate de o singurå înregistrare din
primul tabel (una), iar în aceste rânduri se vor repeta câmpurile din primul tabel.
150 Informatică

Pentru operaÆia de interogare, orice sistem de gestiune a bazelor de date are implemen-
tate diferite instrumente prin care så se comunice sistemului criteriul de interogare.
Unul dintre aceste instrumente este limbajul SQL, care este limbajul standard de
interogare.
În Visual FoxPro puteÆi crea o interogare:
9 interactiv folosind generatorul de interogåri (Query Designer);
1
9 prin limbajul de comandå SQL (instrucÆiunea select ).
În urma operaÆiei de creare, interogarea este salvatå într-un fiçier cu extensia .qpr care
conÆine specificaÆiile criteriului de interogare. Acest fiçier este un fiçier de tip ASCII în care
se memoreazå comanda SQL asociatå. Deoarece fiçierul conÆine o comandå SQL, pentru
a o executa trebuie så lansaÆi în execuÆie fiçierul cu comanda:
do <nume_fiçier>.qpr
AÆi våzut cå operatorul relaÆional select aplicat pe un tabel creeazå un alt tabel care conÆi-
ne submulÆimi de date din tabelul surså. Açadar çi rezultatul unei interogåri va fi tot un
tabel, care va conÆine datele specificate de criteriul de interogare. DestinaÆia interogårii
(destinaÆia datelor din tabelul obÆinut) poate fi:
9 fereastra de editare Browse,
9 diagrama (graph),
9 ecranul (screen),
9 raportul (report),
9 tabelul permanent (table) sau temporar (cursor).
Açadar, interogarea se aplicå pe mai multe tabele ale bazei de date numite tabele surså,
iar rezultatul unei interogåri este un tabel numit tabel destinaÆie; modificårile fåcute în
tabelul destinaÆie nu se reflectå çi în tabelele surså.
Parametrii folosiÆi în construirea unei interogåri sunt:
9 Câmpurile (fields) din tabelele bazei de date (tabelele surså). Se recomandå så se
preia din tabelele surså numai câmpurile strict necesare.
9 Legåtura (join) dintre tabelele bazei de date (tabelele surså). Pe lângå legåturile
stabilite între tabele în cadrul bazei de date, care vor fi preluate automat, se mai pot
stabili noi legåturi cu tabele care nu au fost legate la baza de date. Dacå definiÆi douå
legåturi între tabele, le puteÆi lega cu operatorii logici or sau and.
9 Filtrul (filter) prin care se precizeazå condiÆiile de filtrare, adicå modul în care vor fi
selectate datele din tabelele bazei de date. Un criteriu de selecÆie sau de filtrare
trebuie så precizeze câmpul sau expresia care conÆine câmpul, operatorul relaÆional çi
valoarea cu care se comparå. Pot fi definite mai multe criterii de filtrare legate între ele
prin operatorii logici or sau and (ordinea de evaluare este and çi apoi or).
9 Ordonarea (order by) prin care se precizeazå ordinea în care vor fi prezentate rezul-
tatele interogårii (în tabelul destinaÆie). Ordinea este datå de un criteriu de ordonare
determinat de un câmp din tabel sau de mai multe criterii de ordonare determinate de
mai multe câmpuri. În acest caz, un criteriu de ordonare este luat în consideraÆie numai
dacå cele definite anterior au aceeaçi valoare a câmpurilor pentru douå înregistråri.

1
Este diferitå de comanda select folositå pentru selectarea unei zone de lucru.
Utilizarea unor instrumente de prelucrarea datelor 151

9 Gruparea (group by) prin care se precizeazå un criteriu de grupare a datelor. Acest
criteriu este dat de cheia de grupare formatå din unul sau mai multe câmpuri ale
tabelului. Conform acestei chei, înregistrårile care au aceeaçi valoare a cheii de
grupare vor fi cumulate în tabelul destinaÆie într-o singurå înregistrare, în care fiecare
câmp numeric va fi calculat prin însumarea valorilor corespunzåtoare câmpului din
toate înregistrårile grupului. Mai pot fi definite çi criterii de selecÆie la nivel de grup
prin care se precizeazå condiÆia pe care trebuie så o îndeplineascå grupul de înre-
gistråri pentru a face parte din tabelul destinaÆie. CondiÆia este precizatå prin câmpul
sau expresia care conÆine câmpul, operatorul relaÆional çi valoarea cu care se comparå.

6.2. Vizualizările
Vizualizårile sunt tabele virtuale, construite pe baza datelor din tabelele bazei de date, care
pot fi legate prin relaÆii çi care permit modificarea lor de cåtre utilizator. Açadar, dacå în
cazul unei interogåri utilizatorul poate vedea numai un rezultat, în cazul vizualizårii
utilizatorul poate interveni çi poate modifica valoarea datelor. Orice modificare fåcutå într-o
vizualizare se va regåsi çi în tabelul real al bazei de date. Când se creeazå o vizualizare, se
pune de fapt întrebarea: „Cu ce date din baza de date poate interacÆiona utilizatorul?".
Construirea unei vizualizåri constå, ca çi în cazul unei interogåri, în extragerea anumitor
date din baza de date, pe baza unui criteriu. Rezultatul va fi memorat în fiçierul bazei de
date (.dbc). De aceea, pentru a folosi o vizualizare, trebuie deschiså mai întâi baza de
date çi apoi vizualizarea, ca orice tabel din baza de date.
Açadar, vizualizarea este o structurå de date, la fel ca çi tabelele bazei de date, iar
interogarea este un fiçier care conÆine o comandå çi care trebuie lansat în execuÆie
la fel ca orice fiçier de program.
Dacå în cazul interogårilor datele circulå într-un singur sens, de la tabelele bazei de date
la formatul ales pentru afiçare, în cazul vizualizårilor ele pot circula în ambele sensuri
între tabelele bazei de date çi vizualizare.
Vizualizårile se pot construi cu constructorul de vizualizåri (View Designer).
Vizualizarea foloseçte, pe lângå parametrii întâlniÆi la interogåri, urmåtorii parametri:
9 Câmpurile cheie. Aceste câmpuri sunt alese astfel încât så identifice unic relaÆia
dintre vizualizare çi tabelele surså. Pentru fiecare tabel surså trebuie så se defineascå
unul sau mai multe câmpuri cheie care så identifice unic fiecare înregistrare din acel
tabel.
9 Câmpurile actualizate çi câmpurile neactualizate. Acest parametru stabileçte
modul în care se transmit datele între vizualizare çi tabelele surså. Astfel, dacå în
vizualizare se face modificarea într-un câmp actualizat, modificarea va fi transmiså çi
în tabelele surså, altfel, dacå modificarea se face într-un câmp nemodificat, ea nu se
va transmite çi cåtre tabelele surså.

6.3. Rapoartele
Raportul este o colecÆie de informaÆii obÆinute din datele stocate în tabelele bazei de date,
prezentate utilizatorului într-o formå cât mai clarå çi mai conciså. El poate fi tipårit la
152 Informatică

imprimantå sau afiçat pe ecran çi prezintå un set de date legate între ele, preluate din
tabelele bazei de date. Permite descrierea elementelor care pot så aparå: textul afiçat
deasupra coloanelor, câmpurile din coloane, la care pot fi adåugate çi alte texte sau
imagini grafice (linii, chenare, imagini bitmap sau vectoriale etc.). Raportul nu modificå
datele din tabele. El parcurge secvenÆial înregistrårile din tabele pentru:
9 obÆinerea unor date sintetice: subtotaluri çi totaluri,
9 obÆinerea unor rezumate,
9 gruparea datelor pe mai multe niveluri, fiecare nivel cu propriile sale informaÆii
sintetice çi rezumate,
9 analize complexe çi grafice.
În general, raportul este conceput sub forma unui tabel. În plus are çi funcÆia de sortare çi
grupare a datelor. Raportul se compune din:
9 SecÆiunea de date (Detail) conÆine date care se repetå pentru fiecare înregistrare.
9 Antetul paginii (Page Header) defineçte elementele care trebuie så aparå în partea
de sus a fiecårei pagini a raportului.
9 Subsolul paginii (Page Footer) defineçte elementele care trebuie så aparå în partea
de jos a fiecårei pagini a raportului.
9 Antetul raportului (Report Header sau Title) apare numai pe prima paginå a
raportului. El este ca un titlu pentru întregul raport çi poate conÆine texte çi imagini (de
exemplu sigla firmei).
9 Subsolul raportului (Report Footer sau Summary) apare numai pe ultima paginå a
raportului çi cuprinde de obicei un rezumat al datelor din diferite secÆiuni ale raportului.
9 Grupul (Group). Un raport poate prezenta conÆinutul unui tabel sau al mai multor
tabele din baza de date. Aceste date pot fi grupate dupå diferite criterii çi totalizate la
nivel de grup. În linia totalului pot fi inserate totaluri ale unor câmpuri, adicå date în
care sunt cumulate valorile aceluiaçi câmp pentru întreg grupul de înregistråri. Pot fi
definite mai multe niveluri de grupare. Pentru fiecare nivel trebuie definit un criteriu
de grupare caracterizat printr-o expresie care este evaluatå la fiecare înregistrare.
Dacå existå un singur nivel de grupare, numårul de grupuri va fi egal cu numårul de
valori diferite ale cheii de grupare.
9 Antetul grupului (Group Header) afiçeazå un titlu al grupului (criteriul de grupare).
9 Subsolul grupului (Group Footer) afiçeazå date sintetice despre grup.
Raportul conÆine informaÆii utile personalului care are atribuÆii de conducere în cadrul
organizaÆiei. În funcÆie de nivelul de conducere pentru care se produce raportul,
cantitatea de date prezentatå diferå. La nivelul inferior de conducere, nivelul operaÆional,
la care personalul de conducere are rolul de a monitoriza çi a controla activitåÆile zilnice
ale angajaÆilor, rapoartele trebuie så fie detaliate çi så conÆinå informaÆii specifice despre
activitåÆile zilnice (de exemplu rapoartele de încasåri).
La nivelul mediu de conducere (director tehnic, director de vânzåri, director de resurse
umane etc.) ele trebuie så conÆinå mai puÆine detalii çi mai multe treceri în revistå,
rezumate çi analize ale datelor din istoric. Aceste date trebuie så-i ajute så planifice çi så
controleze operaÆiile çi så implementeze strategii care trebuie så fie bine formulate çi
argumentate. De exemplu, aceste rapoarte pot prezenta un rezumat al activitåÆilor
(încasårile rezultate din contractele de consultanÆå cu un client, încasårile rezultate
Utilizarea unor instrumente de prelucrarea datelor 153

dintr-un anumit tip de consultanÆå - de exemplu instruire), pot prezenta situaÆii de


excepÆie, care depåçesc limitele normale (clienÆi care au derulat în ultimul trimestru mai
mult de cinci contracte de consultanÆå) sau, atunci când trebuie så se concentreze pe o
problemå, pot conÆine date la cerere (dacå un client nu çi-a mai plåtit de mult çedinÆele de
consultanÆå, se poate cere un raport despre client care så conÆinå contractele çi modul în
care a plåtit pe o perioadå de timp).
În funcÆie de informaÆia prezentatå, existå trei categorii de rapoarte:
9 Rapoarte periodice. Se produc la intervale de timp regulate (såptåmânal, lunar,
trimestrial etc.), cum este de exemplu raportul lunar al çedinÆelor cu clienÆii.
9 Rapoarte la cerere. Sunt produse la cerere, cum este de exemplu raportul cu
contractele de consultanÆå ale unui client.
9 Rapoarte ale excepÆiilor. Sunt produse pentru a atrage atenÆia asupra unor eveni-
mente deosebite, cum este de exemplu raportul încasårilor 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 foloseçte o procedu-
rå simplå: utilizatorul trebuie så precizeze numele coloanelor din tabele care trebuie så
aparå în raport, totalurile pe coloane, subtotalurile pe grupuri de înregistråri, diferite alte
calcule. În urma comunicårii acestor date, el va genera un tabel care conÆine toate datele
çi caracteristicile raportului çi care sunt memorate într-un fiçier cu extensia .frx.

CreaÆi o interogare
Interogarea trebuie så råspundå la urmåtoarea întrebare: „Ce angajaÆi (identificaÆi prin
nume, prenume çi numele judeÆului) au tariful cuprins între 260.000 çi 300.000?". Afiçarea
se va face într-o fereastrå de editare Browse.
Fiçierul în care veÆi salva interogarea va fi a1.qry.
„ DeschideÆi baza de date Compania cu
comanda: open database compania.
„ AlegeÆi opÆiunea New∈File. Se deschide case-
ta de dialog New în care din grupul de butoane
cu opÆiuni File Type activaÆi butonul Query
dupå care executaÆi clic pe butonul New File.
„ Se deschide caseta de dialog Add Table or
View. Din lista Tables in Database selectaÆi
mai întâi tabelul AngajaÆi çi executaÆi clic pe
butonul Add Table din bara de instrumente
Query Designer, apoi selectaÆi tabelul JudeÆe
çi executaÆi clic pe butonul Add Table.
„ Se deschide fereastra generatorului de interogåri Query Designer. În partea
superioarå este afiçat un panou care conÆine tabelele care au fost selectate din baza
de date pentru a face parte din interogare. Fiecare tabel este reprezentat într-o fe-
154 Informatică

reastrå redimensionabilå în care sunt afiçate câmpurile çi indecçii tabelului. Dacå între
tabele existå legåturi, sunt afiçate çi acestea. Pe lângå aceste legåturi definite deja în
baza de date, puteÆi crea noi legåturi fie glisând un câmp index de la tabelul surså la
tabelul destinaÆie, fie prin intermediul obiectelor din caseta de dialog Join Condition pe
care o deschideÆi executând dublu clic pe butonul Add Join din bara de instrumente
Query Designer. În partea inferioarå este afiçat un panou cu mai multe secÆiuni:
9 Selection Criteria - conÆine controale pentru a stabili criteriul de selectare a
înregistrårilor. Criteriul poate conÆine anumite valori ale unui câmp çi condiÆii
pentru legåturile temporare dintre tabele.
9 Fields - conÆine controale pentru a stabili câmpurile din tabel sau câmpurile
calculate care vor fi afiçate de interogare.
9 Order By - conÆine controale pentru a stabili câmpurile din tabel sau câmpurile
calculate care vor determina ordinea de afiçare în interogare.
9 Group By - conÆine controale pentru a stabili modul în care vor fi grupate
înregistrårile afiçate de interogare.
„ DeschideÆi secÆiunea Fields. În lista Available Fields sunt afiçate câmpurile disponi-
bile în tabelele selectate. SelectaÆi din aceastå listå grupul de câmpuri AngajaÆi.nume,
AngajaÆi.pren, AngajaÆi.tarif çi JudeÆe.n_jud (executaÆi clic pe numele câmpului cu
tasta Ctrl apåsatå). ExecutaÆi apoi clic pe declançatorul Add>. Câmpurile selectate
vor fi copiate în lista cu câmpurile selectate pentru a fi afiçate - Selected Output. În
secÆiune mai puteÆi folosi urmåtoarele controale: butoanele Add All>> (copiazå toate
câmpurile din tabele în lista Selected Output), <Remove (înlåturå câmpul selectat),
çi <<Remove All (înlåturå toate câmpurile din lista Selected Output) precum çi
caseta combinatå Functions/Expressions prin care puteÆi defini câmpurile calculate.
„ Bara de instrumente Query Designer conÆine urmåtoarele butoane:
1 Add Table Adaugå un tabel nou la interogare.
2 Remove Table Înlåturå tabelul selectat din interogare. Implicit vor fi înlåturate câmpurile,
criteriile de selectare, criteriile de sortare çi criteriile de grupare definite de
câmpurile din acest tabel.
3 Add Join Adaugå noi legåturi între tabelele interogårii.
4 Show the SQL Deschide fereastra de editare în care este afiçatå comanda SQL asociatå
Window interogårii definite interactiv.
5 Maximize the Maximizeazå panoul cu tabele. Panoul cu secÆiuni nu va mai fi afiçat.
table Window
6 Query Deschide o casetå de dialog care conÆine controale pentru a alege destinaÆia
Destination interogårii: o fereastrå Browse, ecranul, o diagramå etc.
„ DeschideÆi secÆiunea Selection Criteria. ExecutaÆi dublu clic pe butonul Condition.
Se deschide caseta de dialog Join Condition în care este afiçatå condiÆia care
defineçte legåtura dintre cele douå tabele. Deoarece legåtura este realizatå prin douå
câmpuri de tip çir de caractere, pentru a evita unele nepotriviri din cauza scrierii cu
litere mari sau cu litere mici a aceluiaçi cod de judeÆ, activaÆi comutatorul Ignore
Upper/Lower Case. ÎnchideÆi caseta de dialog. VeÆi observa cå în urma acestei
operaÆii, s-a activat în grilå comutatorul Case corespunzåtor condiÆiei.
„ În grila afiçatå în secÆiune adåugaÆi criteriul pentru selectarea înregistrårilor:
tarif>260000 and tarif<300000. Pentru aceasta executaÆi clic pe declançatorul
Insert, alegeÆi din lista ascunså Field Name numele câmpului AngajaÆi.tarif, din lista
ascunså Criteria operatorul More Than çi scrieÆi în caseta de text Example valoarea
Utilizarea unor instrumente de prelucrarea datelor 155

260000. ExecutaÆi din nou clic pe declançatorul Insert, alegeÆi din lista Field Name
din nou numele câmpului AngajaÆi.tarif, din lista Criteria operatorul Less Than çi
scrieÆi în caseta de text Example valoarea 300000. Cele douå condiÆii au fost
adåugate în grilå. CondiÆiile sunt legate implicit prin operatorul logic and. Dacå
trebuie schimbat operatorul logic and cu or se executå clic pe declançatorul Add Or.
Dacå vreÆi så schimbaÆi ordinea în care sunt afiçate condiÆiile în grilå selectaÆi condiÆia
pe care vreÆi så o mutaÆi çi executaÆi clic pe butonul ¦ (Mover Box). Dacå vreÆi så
înlåturaÆi o condiÆie, o selectaÆi în grilå çi executaÆi clic pe declançatorul Remove.

1 2 3 4 5 6

condiÆia pentru
legåtura dintre tabele
lista câmpurilor
butonul din interogare
Condition

„ DeschideÆi secÆiunea Order By pentru a stabili ordinea în care vor fi afiçate înregis-
trårile. SelectaÆi, din lista Selected Output care afiçeazå câmpurile din interogare,
câmpurile AngajaÆi.nume çi AngajaÆi.pren dupå care acÆionaÆi declançatorul Add>. Câm-
purile vor fi adåugate în lista Ordering Criteria. În grupul de butoane radio Order
Options este activat butonul Ascending (ordinea alfabeticå a numelui çi prenu-
melui). Ordinea câmpurilor din cheia de sortare este AngajaÆi.nume çi Angaja1i.pren,
adicå ordinea din lista Ordering Criteria (ordinea este datå de ordinea de adåugare
la aceastå listå). Dacå vreÆi så înlåturaÆi un criteriu de sortare, îl selectaÆi în lista
Ordering Criteria çi acÆionaÆi declançatorul <Remove.
„ DeschideÆi secÆiunea Group By numai pentru a identifica controalele, deoarece
interogarea nu conÆine grupuri de înregistråri. În secÆiune sunt douå liste Available
Fields (câmpurile disponibile) din care puteÆi selecta câmpul folosit pentru cheia de
grupare, lista Group By Fields în care vor fi afiçate cheile de grupare, declança-
toarele Add> çi <Remove cu care puteÆi adåuga sau înlåtura chei de grupare. Prin
acÆionarea declançatorului Having... se deschide caseta de dialog Having prin
intermediul cåreia puteÆi stabili criterii de selecÆie la nivelul unui grup.
156 Informatică

„ ExecutaÆi clic pe butonul


Query Destination din bara
de instrumente Query Desi-
gner. Se deschide caseta
de dialog Query Desti-
nation în care executaÆi clic
pe butonul Browse pentru
ca rezultatul interogårii så se
afiçeze într-o fereastrå de
editare Browse.
„ VizualizaÆi comanda SQL
asociatå acestei interogåri.
ExecutaÆi clic pe butonul Show the SQL Window din bara de instrumente. Se
deschide fereastra de editare care afiçeazå comanda SQL:
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
„ ÎnchideÆi fereastra de editare.
„ ÎnchideÆi fereastra generatorului de interogåri çi salvaÆi interogarea sub numele
a1.qry. ObservaÆi cå în fereastra Command este afiçatå comanda asociatå
interogårii create interactiv: create query
„ AfiçaÆi rezultatul interogårii cu comanda: do a1.qri
„ Se deschide fereastra de editare de tip Browse:

„ ModificaÆi interogarea astfel încât rezultatul så fie afiçat pe ecran. DeschideÆi inte-
rogarea pentru modificare, fie cu opÆiunea Open∈File, fie cu comanda:
modify query c:\vfp\a1.qpr
„ Se deschide fereastra generatorului de interogåri Query Designer. ExecutaÆi clic pe
butonul Query Destination din bara de instrumente. Se deschide caseta de dialog
Query Destination în care executaÆi clic pe butonul Screen. VizualizaÆi comanda
SQL asociatå acestei interogåri. ExecutaÆi clic pe butonul Show the SQL Window
din bara de instrumente. Se deschide fereastra de editare care afiçeazå comanda
SQL, la care observaÆi cå a fost adåugatå opÆiunea to screen. ÎnchideÆi fereastra de
editare a comenzii. ÎnchideÆi fereastra generatorului cu salvare.
„ AfiçaÆi rezultatul interogårii cu comanda: do a1.qri
Utilizarea unor instrumente de prelucrarea datelor 157

„ Rezultatul va fi afiçat pe ecran, la fel ca rezultatul unei comenzi list/display.


„ ModificaÆi aceastå interogare astfel: se vor afiça çi angajaÆii care au un tarif de
300000 lei, se va afiça o coloanå nouå cu vârsta angajaÆilor, iar rezultatul va fi afiçat
într-o fereastrå Browse. DeschideÆi interogarea pentru modificare.
„ Se deschide fereastra generatorului de interogåri Query Designer. DeschideÆi secÆi-
unea Selection Criteria çi înlocuiÆi valoarea 300000 cu 300001. DeschideÆi secÆi-
unea Fields çi scrieÆi în caseta combinatå expresia prin care se calculeazå valoarea
câmpului vârsta: int((date()-data_n)/365). ExecutaÆi clic pe butonul Query Desti-
nation din bara de instrumente. Se deschide caseta de dialog Query Destination în
care executaÆi clic pe butonul Browse. ÎnchideÆi cu salvare fereastra generatorului de
interogåri.
„ AfiçaÆi rezultatul interogårii cu comanda do a1.qri
„ ModificaÆi interogarea astfel încât în fereastra de editare coloana Pren så aibå nume-
le Prenume, coloana N_jud numele JudeÆ, iar coloana câmpului calculat numele
Varsta. Modificarea se va face în comanda SQL. Pentru aceasta veÆi deschide o
fereastrå de editare cu comanda: modi comm a1.qpr
„ Fereastra de editare va afiça comanda SQL. ModificaÆi 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
„ ÎnchideÆi fereastra de editare. AfiçaÆi din nou rezultatul interogårii. ObservaÆi modifi-
cårile apårute în fereastra Browse.
„ ÎnchideÆi interogarea çi baza de date cu comanda close all.

CreaÆi o vizualizare
Vizualizarea trebuie så råspundå la urmåtoarea întrebare: „Cu ce date din baza de date
poate interacÆiona utilizatorul pentru angajaÆii (identificaÆi prin nume, prenume, vârstå çi
numele judeÆului) care au tariful cuprins între 260.000 çi 300.000?". Utilizatorului i se va
permite så interacÆioneze doar cu câmpul tarif.
„ DeschideÆi baza de date Compania.
„ AlegeÆi opÆiunea New∈File. Se deschide caseta de dialog New în care din grupul de
butoane cu opÆiuni File Type activaÆi butonul View, dupå care executaÆi clic pe
butonul New File.
„ Se deschide caseta de dialog Add Table or View. Din acest moment veÆi urma
aceiaçi paçi pe care i-aÆi executat atunci când aÆi creat o interogare. Bara de
instrumente View Designer conÆine primele cinci butoane din bara Query Designer.
„ Fereastra generatorului de vizualizåri conÆine în plus secÆiunea Update Criteria. Prin
intermediul controalelor din aceastå secÆiune puteÆi stabili câmpurile cheie (câmpurile
care realizeazå legåtura între vizualizare çi tabelele surså) çi câmpurile actualizate
(câmpurile a cåror modificare se transmite çi cåtre tabelele surså). DeschideÆi aceastå
secÆiune pentru a stabili parametrii vizualizårii. Lista Field Name conÆine lista câmpu-
rilor din vizualizare disponibile pentru actualizare, din tabelul AngajaÆi. Se stabilesc mai
întâi câmpurile cheie (care vor identifica unic relaÆia vizualizare-tabel surså). Aceste
158 Informatică

câmpuri sunt nume çi pren. Se selecteazå fiecare dintre aceste câmpuri çi se activeazå
comutatorul pentru câmpul cheie. Se pot stabili acum câmpurile care pot fi actualizate
(ele nu pot fi câmpuri cheie). Singurul câmp care a mai råmas este câmpul tarif. Îl vom
marca pentru actualizare fie executând clic pe comutatorul de actualizare din dreptul
såu din lista Field Name, fie executând clic pe declançatorul Update All. Actualizarea
câmpului marcat se poate face în douå moduri, pe care le stabiliÆi cu butoanele radio
Update using: prin çtergerea vechilor înregistråri çi reinserarea celor modificate (SQL
DELETE then INSERT) sau prin scrierea modificårilor direct în înregistrare (SQL
UPDATE). ActivaÆi butonul radio SQL UPDATE. ActivaÆi comutatorul Send SQL
updates (dacå vreÆi ca aceste actualizåri så se çi realizeze). SalvaÆi vizualizarea sub
numele a1.
„ DeschideÆi vizualizarea (ca pe un tabel cu comanda use).
„ AfiçaÆi vizualizarea în fereastra de editare Browse (cu comanda browse). FaceÆi
modificåri în câmpurile vizualizårii.

coloana de comutatoare
pentru câmpuri actualizate
coloana de comutatoare
pentru câmpuri cheie

„ DeschideÆi tabelul AngajaÆi. AfiçaÆi conÆinutul acestui tabel într-o fereastrå browse.
ObservaÆi ce modificåri fåcute în vizualizare se regåsesc în tabel.
„ ÎnchideÆi baza de date.

CreaÆi un raport
Se construieçte un raport în care se prezintå situaÆia încasårilor cu subtotaluri pentru
fiecare contract.
„ DeschideÆi baza de date Compania.
„ AlegeÆi opÆiunea New∈File. Se deschide caseta de dialog New în care, din grupul de
butoane cu opÆiuni File Type, activaÆi butonul Report, dupå care executaÆi clic pe
butonul New File. Se deschide fereastra generatorului de rapoarte care este
Utilizarea unor instrumente de prelucrarea datelor 159

împårÆitå în mai multe benzi, fiecare bandå reprezentând o zonå din raport. PuteÆi
modifica dimensiunea unei zone pe verticalå, glisând bara delimitatoare a zonei.
„ DefiniÆi mediul de date al raportului (tabelele din care preia datele). AlegeÆi opÆiunea
Data Environment...∈View. Se deschide fereastra care este vidå.
„ AlegeÆi opÆiunea Add...∈ Data Environment. Se deschide caseta de dialog Add
Table or View. AlegeÆi din listå tabelul Încasåri. ReluaÆi operaÆia çi alegeÆi din listå
tabelul Contracte. Tabelele çi relaÆia dintre ele vor fi adåugate în fereastrå.
„ AdåugaÆi în fereastra generatorului de rapoarte benzile pentru antetul çi subsolul
raportului. AlegeÆi opÆiunea Title/Summary...∈ Report. Se deschide caseta de dialog
Title/Summary în care activaÆi comutatorul Title band pentru antetul raportului çi
comutatorul Summary band pentru subsolul raportului.
„ StabiliÆi caracteristicile caracterelor din raport. AlegeÆi opÆiunea Default Font...∈
Report. AlegeÆi în caseta de dialog Font fontul Arial.

Banda pentru antet de paginå

Banda pentru datele din raport (Detail)

Banda pentru subsol de paginå

1 2 3 4 5 6 7 8
1 Select Object Selecteazå un obiect.
2 Label Activeazå scrierea textului.
3 Field Activeazå inserarea unui câmp
4 Line Activeazå trasarea unei linii.
5 Rectangle Activeazå trasarea unui dreptunghi.
6 Rounded Rectangle Activeazå trasarea unui dreptunghi cu colÆuri rotunjite.
7 Data Grouping Permite gruparea datelor.
8 Report Controls Toolbar Activeazå bara cu instrumente Report Controls.
„ ScrieÆi titlul raportului. ExecutaÆi clic pe instrumentul Label, executaÆi clic în banda
pentru antetul raportului în locul în care vreÆi så scrieÆi titlul çi scrieÆi: SituaÆia
încasårilor pe contracte. ExecutaÆi clic în banda de antet de paginå çi scrieÆi titlurile
coloanelor: Nr. încasare, Nr. contract, Client, Data çi Valoare.
„ AdåugaÆi la raport câmpurile care vor fi afiçate. ExecutaÆi clic pe instrumentul Field.
ExecutaÆi apoi clic în banda Detail, sub titlul coloanei Nr. încasare în poziÆia în care
vreÆi så aparå valoarea câmpului. Se deschide caseta de dialog Report Expression.
ExecutaÆi clic pe butonul Expression çi se deschide caseta de dialog Expression
160 Informatică

Builder în care alegeÆi din lista Fields câmpul Încasåri.nr_i. ReluaÆi operaÆia pentru
câmpurile Încasåri.id_cont, Contracte.id_cl, Încasåri.data_p, Încasåri.valoare.
„ CreaÆi grupuri de înregistråri dupå numårul contractului.
„ AlegeÆi opÆiunea Data Grouping...∈Report. Se deschide caseta de dialog Data
Grouping în care veÆi defini un singur nivel pentru grup. ExecutaÆi clic pe butonul
primului grup. Se deschide caseta de dialog Expression Builder în care alegeÆi din
lista Fields câmpul Încasari.id_cont.
„ DefiniÆi totalul la nivelul raportului çi subtotal la nivelul fiecårui grup pentru câmpul
valoare. ExecutaÆi clic pe instrumentul Field. ExecutaÆi apoi clic în banda Group, sub
câmpul Valoare. Se deschide caseta de dialog Report Expression. ExecutaÆi clic pe
butonul Expression çi din caseta de dialog Expression Builder alegeÆi câmpul
incasari.valoare. În caseta de dialog Report Expression executaÆi clic pe butonul
Calculations.... Se deschide caseta de dialog Subtotal or Calculate Field în care
activaÆi în grupul de butoane radio Subtotal or Calculate butonul Sum. ReluaÆi
aceleaçi operaÆii çi pentru banda subsolului de raport.

„ SalvaÆi raportul sub numele a1. ÎnchideÆi caseta de dialog. În fereastra Command
este afiçatå comanda cu care a fost creat raportul: create report.
„ PrevizualizaÆi raportul cu comanda:
report form a1 preview.
„ PuteÆi modifica raportul cu comanda:
modify report a1.
VeÆi modifica raportul astfel: deoarece câmpurile pentru numårul contractului çi pentru
identificatorul clientului se repetå la nivelul grupului, veÆi adåuga aceste date în antetul
grupului çi le veÆi scoate din secÆiunea de date a raportului.
PuteÆi tipåri un raport cu comanda:
Report form <nume_fiçier> [heading <exp_C>] [summary]
[<domeniu>][for <expL1>][ while <expL2>][to printer | to file <nume_fiçier>]
unde clauza heading permite afiçarea unui antet suplimentar la începutul fiecårei pagini,
iar clauza summary inhibå afiçarea rândurilor cu date
çi afiçeazå numai rândurile cu totaluri çi subtotaluri.
Utilizarea unor instrumente de prelucrarea datelor 161

7. Transferul datelor între un sistem de gestiune a


bazelor de date şi o altă aplicaţie
O problemå importantå a oricårui sistem o reprezintå schimbul de informaÆii dintre
aplicaÆii. Visual FoxPro permite folosirea urmåtoarelor metode:
9 Exportul çi importul fiçierelor. Poate så execute aceste operaÆii 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 foloseçte
câmpul General.
9 Protocolul DDE. Folosind acest protocol se poate realiza un schimb de date între
douå aplicaÆii aflate în execuÆie. Se pot realiza transferuri complexe de date, ca de
exemplu: încårcarea datelor într-o foaie de calcul Excel direct dintr-o aplicaÆie Visual
FoxPro, introducerea datelor într-un tabel Visual FoxPro direct din Excel sau scrierea
unui text într-un document Word direct dintr-o aplicaÆie Visual FoxPro. Comunicarea
dintre cele douå aplicaÆii se bazeazå pe un schimb de mesaje în care una dintre
aplicaÆii este client, iar cealaltå server. În funcÆie de ceea ce se doreçte, 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 aplicaÆiei Visual FoxPro så inte-
racÆioneze într-o reÆea cu alte aplicaÆii, 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


OperaÆiile de import-export se pot realiza numai pentru acele tipuri de fiçiere pentru care
în Visual FoxPro sunt implementate programe de conversie.
În general operaÆiile de import-export se realizeazå între tabelele Visual FoxPro çi:
9 tabele create cu alte sisteme de gestiune a bazelor de date relaÆionale; în acest caz
se realizeazå o conversie între cele douå tipuri de înregistråri de structurå.
9 foi de calcul create cu un produs de calcul tabelar; în acest caz înregistrårile din tabel
vor deveni rânduri în foaia de calcul, iar câmpurile coloane çi invers.
9 fiçiere 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 apåsarea tastei
Enter); în acest caz rândurile de text devin înregistråri în tabel çi invers. Existå douå
tipuri de fiçiere text:
Sdf - înregistrårile au lungime fixå, iar câmpurile nu sunt separate între ele prin
delimitatori;
Delimited - câmpurile sunt separate prin virgulå, iar câmpurile de tip caracter sunt
delimitate prin ghilimele. Se pot schimba separatorii cu clauza with astfel:
with tab - câmpurile sunt separate prin caracterul tabulator (codul ASCII 9 -
generat de apåsarea tastei Tab);
162 Informatică

with blank - câmpurile sunt separate prin spaÆiu;


with <delimitator> - câmpurile de tip caracter vor fi delimitate de caracterul
<delimitator> în locul ghilimelelor.
1. Importul datelor este operaÆia prin <tip> extensie produs de
care se preiau date create cu alte Tabele din bazå de date
aplicaÆii çi sunt transformate într-un fox2x .dbf versiuni anterioare
tabel al bazei de date Visaul FoxPro (pentru MS-DOS
FoxPro. Se realizeazå cu comen- sau Windows
zile: Import çi Append from. pdox .db Paradox versiuni 3.5/4.0
Foi de calcul
a. Sintaxa comenzii Import este:
wk1/wk3/ wk1/wk3/ Lotus 1-2-3 - diferite
Import from <nume_fiçier>
wks wks versiuni
type <tip> xls/xl5 xls Excel vers. 2.0/5.0
b. Sintaxa comenzii Append from Fiçiere text
este: sdf txt fiçiere ASCII
Append from <nume_fiçier> delimited txt fiçiere ASCII
type <tip>
unde <nume_fisier> este numele fiçierului din care se importå datele, iar <tip>
reprezintå tipul fiçierului.
2. Exportul datelor este operaÆia prin care se transferå date dintr-un tabel al bazei de
date într-un alt tip de fiçier, specific unei alte aplicaÆii. Se realizeazå cu comenzile:
Export çi Copy to.
a. Sintaxa comenzii Export este:
Export to <nume_fiçier> [fields <listå_câmpuri>]
[<domeniu>] [for <expL1>] [while <expL2>] type <tip>
b. Sintaxa comenzii copy to este:
Copy to <nume_fiçier> [fields <listå_câmpuri>]
[<domeniu>] [for <expL1>] [while <expL2>] type <tip>
unde <nume_fisier> este numele fiçierului din care se importå datele, iar <tip> este tipul
fiçierului. Implicit se transferå toate câmpurile din tabel. Explicit se transferå numai cele
precizate prin lista clauzei fields. Implicit se transferå toate înregistrårile din tabel.
Explicit se transferå numai cele precizate prin clauzele <domeniu>, for sau while.

Import
Append from
tabel al bazei de date alt tip de fiçier
Copy to
Export
Utilizarea unor instrumente de prelucrarea datelor 163

InseraÆi date dintr-un tabel al bazei de date într-un document Word


„ PoziÆionaÆi cursorul în document în poziÆia în care vreÆi så inseraÆi datele din tabel.
„ AfiçaÆi bara de instrumente Database cu opÆiunea Database∈Toolbars∈View.
ExecutaÆi clic pe butonul Insert Database. Se deschide caseta de dialog Database.
„ ExecutaÆi clic pe declançatorul Get Data... Din caseta de dialog Open Data Source
alegeÆi numele tabelului, de exemplu AngajaÆi. Se revine în caseta de dialog
Database.
„ ExecutaÆi clic pe declançatorul Query Options... Se deschide caseta de dialog
Query Options care conÆine trei secÆiuni pentru stabilirea unui criteriu de interogare.
DeschideÆi secÆiunea Filter Records pentru a stabili criteriul de filtrare (de exemplu
numai angajaÆii din Bucureçti). Din lista ascunså Field alegeÆi cîmpul c_jud, din lista
Comparison operatorul Equal to, iar în caseta de text Compare to scrieÆi B. Deschi-
deÆi secÆiunea Sort Records pentru a stabili cheia de sortare (de exemplu dupå
nume çi prenume). PuteÆi alege maxim trei chei de sortare. AlegeÆi din lista ascunså
Sort by câmpul nume etc. DeschideÆi secÆiunea Select Fields pentru a stabili
câmpurile care vor fi preluate din baza de date. AlegeÆi din listå câmpurile nume,
pren, tel_f çi tel_m. ÎnchideÆi caseta de dialog Query Options.
„ ExecutaÆi clic pe declançatorul Table Auto Format dacå vreÆi så alegeÆi unul dintre
formatele predefinite pentru tabele.
„ ExecutaÆi clic pe declançatorul Insert Data.... Se deschide caseta de dialog Insert
Data din care puteÆi alege domeniul înregistrårilor.
„ Datele din tabelul bazei de date vor fi inserate în document sub forma unui tabel.
ExportaÆi date dintr-un tabel al bazei de date
„ DeschideÆi baza de date Compania çi apoi tabelul Clienti.
open database compania use clienti
„ ExportaÆi datele din tabel în diferite formate de fiçier text ASCII:
copy to cl1.txt sdf copy to cl4.txt;
copy to cl2.txt delimited delimited with tab
copy to cl3.txt; copy to cl5.txt;
delimited with blank delimited with *
„ VizualizaÆi conÆinutul fiçierelor text create çi comparaÆi rezultatul exporturilor.
modi file cl1.txt
................
modi file cl5.txt

T est pentru evaluare:


1. CreaÆi o interogare în care afiçaÆi clienÆii care au fost înregistraÆi înainte de 01/01/2000.
Interogarea va fi afiçatå în ordinea codurilor angajaÆilor.
2. CreaÆi o vizualizare cu clienÆii atribuiÆi angajatului cu codul 200 în perioada 01/01/2000 çi
31/12/2001.
164 Informatică

3. CreaÆi un raport cu evidenÆa çedinÆelor. ÇedinÆele vor fi grupate dupå numårul contractului çi
pentru acelaçi contract vor fi afiçate în ordine cronologicå. AfiçaÆi subtotaluri la nivel de grup
çi un total la nivel de raport pentru durata çedinÆelor çi pentru costul çedinÆelor.
4. ImportaÆi fiçierele cu texte cl1.text, ..., cl5.txt în tabele. VizualizaÆi conÆinutul acestor tabele.
5. ExportaÆi tabelul ClienÆi într-o foaie de calcul Excel. VizualizaÆi conÆinutul foii de calcul.
6. ImportaÆi foaia de calcul într-un tabel. VizualizaÆi
conÆinutul tabelului.

# ÎncercaÆi:

Adevårat/Fals:
1. Prin intermediul interogårii puteÆi face modificåri în tabelele bazei de date.
2. Prin intermediul unei vizualizåri puteÆi modifica orice câmp din tabelele bazei de date.
3. Folosind interogarea puteÆi stabili o ordine de afiçare a înregistrårilor.
4. Folosind interogarea puteÆi combina înregistråri din mai multe tabele.
5. PuteÆi insera date dintr-un tabel al bazei de date într-un document Word.
6. PuteÆi exporta un tabel Visual FoxPro într-un tabel FoxPro for MS-DOS.
7. Comanda copy to alfa.txt delimited with ! va exporta datele din tabel într-un fiçier de
tip text în care câmpurile din tabel vor fi separate de semnul !.
CompletaÆi:
1. Criteriul de interogare este salvat într-un fiçier sub formå de ..........................…………
2. Vizualizarea este salvatå într-un fiçier sub formå de ..........................…………
3. ObÆineÆi rezultatul unei interogåri cu comanda ..............................................
4. PuteÆi construi interactiv un raport folosind ....................................
5. Datele din câmpurile înregistrårii vor fi inserate în raport în banda............................
6. Pentru a obÆine în urma exportului dintr-un tabel un fiçier text în care câmpurile sunt
separate prin tabulatori folosiÆi clauza.............................
7. PuteÆi introduce o imagine într-un câmp de tip General folosind ....................
RåspundeÆi:
1. Ce este o interogare a bazei de date?
2. Ce este o vizualizare a bazei de date?

R åspunsuri:
Adevårat/Fals: 1-F; 2-F; 3-A; 4-A; 5-A; 6-A; 7-F.
CompletaÆi: 1-comandå SQL; 2-tabel; 3-do; 4-generatorul de rapoarte; 5-Detail; 6-delimited with
tab; protocolul OLE.
Utilizarea unor instrumente de prelucrare a datelor 165

8. Tablouri de memorie
Visual FoxPro permite crearea çi manipularea structurilor de date de tip tablou de
memorie care, în acest sistem au urmåtoarele caracteristici:
9 Se pot crea numai tablouri cu o singurå dimensiune (vectori) sau cu douå dimensiuni
(matrice).
9 Tablourile de memorie Visual FoxPro sunt tablouri neomogene.
9 La creare, elementele tabloului sunt iniÆializate cu valoarea logicå .F.
9 La un moment dat, în memoria internå gestionatå de Visual FoxPro se pot crea
maxim 65.000 de tablouri de memorie, iar un tablou de memeorie poate avea
65.000 de elemente.

8.1. Operaţii cu tablouri de memorie:


Asupra tablourilor de memorie Visual FoxPro se pot executa urmåtoarele operaÆii:

1. Crearea tabloului de memorie:


definirea structurii → comenzile declare/dimension
atribuirea de valori elementelor → comanda store sau
operaÆia de atribuire

2. Redimensionarea tabloului → comenzile declare/dimension


9 schimbarea dimensiunii: din vector în matrice çi din matrice în vector;
9 mårirea (creçterea numårului de elemente) sau micçorarea (diminuarea
numårului de elemente) tabloului.
3. Consultarea tablourilor constå în:
9 obÆinerea de informaÆii despre elementele tabloului:
global (despre toate elementele) → comenzile display/list memory
individual (numai despre anumite elemente) → comenzile ?/??
9 obÆinerea de informaÆii despre tablou:
lungimea tabloului → funcÆia alen()
poziÆia unui element din linia çi coloana specificatå → funcÆia aelement()
numårul liniei sau al coloanei unui element specificat prin poziÆie în cadrul
tabloului → funcÆia asubscript()
existenÆa unui çir de caractere în tablou → funcÆia ascan()

4. Actualizarea tablourilor constå în:


çtergerea unui element, a unei linii sau a unei coloane → funcÆia adel()
adåugarea unui element, a unei linii sau a unei coloane → funcÆia ains()

5. Copierea unui tablou → funcÆia acopy()


6. Sortarea unui tablou → funcÆia asort()
7. Salvarea informaÆiilor într-un tablou constå în salvarea:
conÆinutului unui director → funcÆia adir()
structurii unui tabel din baza de date (fiçier .dbf) → funcÆia afield()
166 Informatică

8.1.1. Crearea unui tablou de memorie:


Crearea unui tablou de memorie se face prin douå operaÆii:
a. Definirea structurii cu ajutorul comenzilor declare/define. Comenzile au sintaxa:

declare | define <nume_tablou1> (<expN11>[,<expN12>])


[,<nume_tablou2> (<expN21>[,<expN22>]) ....... ]

Numele tabloului Numårul de elemente Numårul de elemente


de memorie dupå prima dimensiune dupå a doua dimensiune

ObservaÆii:
9 Nu existå nici o diferenÆå între comenzile declare çi define (existå ambele comenzi
pentru a crea compatibilitate cu versiunile anterioare de limbaje de comandå specifi-
ce sistemelor de gestiune a bazelor de date compatibile dBase).
9 Printr-o comandå pot fi definite mai multe tablouri de memorie identificate prin nume
<nume_tablou1>, <nume_tablou2>, .... Tablourile definite pot fi atât de tip vector,
cât çi de tip matrice.
9 Comenzile au un singur adverb: lista de tablouri de memorie care se definesc.
Separarea tablourilor în listå se face prin virgulå. Pentru fiecare tabel se precizeazå
numele çi numårul de elemente dupå o dimensiune, dacå se defineçte un vector
(<expN11>, <expN21>, ...), respectiv numårul de elemente dupå douå dimensiuni,
dacå se defineçte o matrice (<expN11> çi <expN12>, <expN21> çi <expN22>, ...).
Dupå ce aÆi definit structura tabloului, puteÆi identifica orice element din tablou astfel:
pentru vectori : <nume_tablou>(<expN>), unde <expN> reprezintå numårul de ordine al
elementului în cadrul vectorului;
pentru matrice : <nume_tablou>(expN1,<expN2>), unde identificarea elementului se
face prin numårul liniei <expN1> çi numårul coloanei <expN2>. Elementele unei
matrice se pot identifica çi prin numårul de ordine. æinând cont cå în Visual FoxPro o
matrice se memoreazå în ordinea liniilor çi dacå notåm cu n numårul de linii ale matricei,
cu m numårul de coloane, iar cu i çi j cei doi indici ai unui element, atunci numårul de
ordine al unui element va fi m×(i-1)+j.
b. Atribuirea de valori elementelor se poate face în douå moduri:
Se atribuie aceeaçi valoare tuturor elementelor cu ajutorul comenzii store care
are sintaxa:
store <exp> to <nume_tablou>
Se atribuie câte o valoare fiecårui element folosind operaÆia de atribuire:
<element_tablou>= <exp>
sau comanda store care are sintaxa:
store <exp> to <element_tablou>
Utilizarea unor instrumente de prelucrare a datelor 167

8.1.2. Redimensionarea tablourilor de memorie:


Redimensionarea unui tablou se face redeclarând structura cu comanda declare/define.
Se pot executa urmåtoarele operaÆii:
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 måresçte tabloul, adicå se creçte numårul de elemente ale tabloului. Elementele
adåugate vor fi inÆializate cu valoarea logicå .F..
c. Se micçoreazå tabloul, adicå se reduce numårul de elemente ale tabloului. Ele-
mentele care vor ajunge în afara tabloului, în urma redeclarårii structurii, se vor pierde.

8.1.3. Consultarea tablourilor:


Consultarea unui tablou de memorie (obÆinerea de informaÆii din tabloul de mmorie) se
poate face prin urmåtoarele operaÆii:
a. Vizualizarea elementelor tabloului. Se poate executa în douå moduri:
Se vizualizeazå toate elementele tabloului (sunt afiçate valorile elementelor çi
informaÆii 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. ObÆinerea de informaÆii despre tablou sau despre elementele tabloului. Aceste
1
informaÆii se pot obÆine cu ajutorul urmåtoarelor funcÆii :
Lungimea tabloului, adicå numårul de elemente ale unui tablou se poate obÆine cu
ajutorul funcÆiei alen() care are sintaxa: alen(<nume_tablou>,[,<expN>]) . FuncÆia
furnizeazå un rezultat numeric.
Implicit acesta este numårul de ele-
mente din tablou. Dacå se foloseçte
?
argumentul <expN> care este op- 1. Ce valoare va furniza funcÆia alen() dacå
se va preciza argumentul <expN> în cazul
Æional, funcÆia va furniza numårul de
unui vector?
linii (pentru valoarea 1 a argumen-
2. Ce valoare va furniza funcÆia alen() dacå
tului <expN>) sau numårul de coloa- argumentul <expN> are valoarea 0 sau o
ne (pentru valoarea 2 a argumen- valoare mai mare decât 2?
tului <expN>).

1
Numele funcÆiilor folosite pentru operaÆii cu tablouri de memorie încep cu litera a (array).
168 Informatică

PoziÆia unui element din tablou, identificat prin


numårul liniei çi numårul coloanei se obÆine cu ?
ajutorul funcÆiei aelement() care are sintaxa: Ce valoare va furniza funcÆia
aelement(<nume_tablou>,<expN1>[,<expN2>] , aelement() dacå argumentul
unde <expN1> çi <expN2> sunt indicii elementului <expN1> este mai mare
(numårul liniei çi numårul coloanei). FuncÆia furni- decât numårul de linii, iar
argumentul <expN2> este
zeazå un rezultat numeric care reprezintå numå-
mai mare decât numårul de
rul de ordine al elementului în cadrul structurii.
coloane ale unei matrice?
Numårul liniei sau al coloanei unui element din
tablou (adicå unul dintre indicii ele-mentului), identificat prin poziÆia sa în cadrul
tabloului, se obÆine cu ajutorul funcÆiei asubscript() care are sintaxa:
asubscript(<nume_tablou>,<expN1>,<expN2>), unde prin <expN1> se precizeazå
poziÆia elementului çi prin expresia <expN2>, ceea ce doriÆi så aflaÆi. FuncÆia furnizeazå
un rezultat numeric care reprezintå
pentru vectori numårul de ordine al ?
elementului, iar pentru matrice 1. Ce valoare va furniza funcÆia asubscript()
numårul liniei (primul indice) dacå dacå pentru un vector se furnizeazå
<expN2> are valoarea 1 sau numårul argumentul <expN2>?
coloanei (al doilea indice) dacå 2. Ce valoare va furniza funcÆia asubscript()
<expN2> are valoarea 2. dacå pentru o matrice argumentul
<expN2> are valoarea 0 sau o valoare
Cåutarea unui element din tablou mai mare decât 2?
care are o valoare precizatå se face
cu funcÆia ascan():
ascan(<nume_tablou>,<exp>[,<expN1>[,<expN2>]]), unde <exp> este expresia prin
care se specificå valoarea cåutatå. Ea poate fi de orice tip (numeric, çir de caractere,
logic, datå calendaristicå). FuncÆia furnizeazå un rezultat numeric care reprezintå
numårul de ordine al elementului care are valoarea precizatå. Dacå nici un element
nu are aceastå valoare, rezultatul furnizat va fi 0. Implicit cåutarea se face prin toate
elementele tabloului. Explicit se cautå numai printre elementele care încep din poziÆia
precizatå cu argumentul <expN1> çi pânå la elementul din poziÆia 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å operaÆie de actualizare, se mai pot executa urmåtoarele operaÆii:
a. Inserarea unui element (pentru vectori) sau a unei linii/coloane (pentru matrice) se face
cu ajutorul funcÆiei ains(): ains(<nume_tablou>,<expN>[,2]) , unde argumentul
<expN> se foloseçte pentru a preciza poziÆia în care se face inserarea. Argumentul 2
se foloseçte la matrice unde, dacå nu se precizeazå se insereazå o linie, iar dacå se
precizeazå se insereazå o coloanå. FuncÆia furnizeazå un rezultat numeric astfel: 1
dacå operaÆia s-a executat cu succes çi -1 în caz contrar. FuncÆia nu modificå dimen-
siunea tabloului. Elementele care urmeazå poziÆiei, respectiv liniei sau coloanei insera-
te vor fi deplasate spre sfârçitul tabloului, iar ultimul element, respectiv ultima linie sau
coloanå va fi scos în afara tabloului çi se va pierde. În poziÆia 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 funcÆia adel(): adel(<nume_tablou>,<expN>[,2]) , unde argumentele
çi rezultatul furnizat au aceeaçi semnificaÆie ca çi la funcÆia ains(). FuncÆia nu modificå
dimensiunea tabloului. Elementele care urmeazå poziÆiei, respectiv liniei sau coloanei
çterse vor fi deplasate spre începutul tabloului, iar ultimul element, respectiv ultima linie
sau coloanå va fi iniÆalizatå cu valoarea .F..

8.1.5. Copierea unui tablou de memorie:


Se poate realiza o copie a unui tablou de memorie folosind funcÆia acopy() care are
urmåtoare 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 destinaÆie). Dacå tabloul destinaÆie nu existå, el va
fi creat automat de aceeaçi dimensiune çi mårime ca çi tabloul surså. Implicit se copiazå
toate elementele. Explicit se copiazå numai o porÆiune din tabelul surså, çi anume cea care
începe din poziÆia precizatå prin <expN1> çi conÆine urmåtoarele <expN2> elemente.
Implicit copierea se face în tabelul destinaÆie începând din prima poziÆie. Explicit, copierea
se face începând din poziÆia precizatå prin <expN3>. FuncÆia furnizeazå un rezultat
numeric care reprezintå numårul de elemente copiate.

8.1.6. Sortarea unui tablou de memorie:


Folosind funcÆia asort() se pot ordona crescåtor sau descrescåtor elementele unui vector
sau liniile unei matrice în funcÆie de valoarea elementelor dintr-o coloanå precizatå. Pentru
a se putea executa operaÆia de sortare tabloul de memorie trebuie så fie omogen.
FuncÆia are urmåtoarea 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 descrescåtoare, iar dacå este zero sau lipseçte, determinå o
ordonare crescåtoare. FuncÆia furnizeazå un rezultat numeric astfel: 1 dacå operaÆia s-a
executat cu succes çi -1 în caz contrar. Implicit se ordoneazå toate elementele vectorului,
respectiv toate liniile matricei începând cu primul element al tabloului. Explicit se ordoneazå
numai numårul de elemente sau numårul de linii precizate prin <expN2> începând cu
poziÆia precizatå prin <expN1>, respectiv cu linia în care se gåseçte elementul cu numårul
de ordine precizat prin <expN1>. În cazul unei matrice, coloana folositå pentru ordonare
este coloana elementului cu numårul de ordine precizat prin<expN1>.

8.1.7. Salvarea informaÆiilor în tablouri de memorie:


Într-un tablou de memorie pot fi salvate urmåtoarele informaÆii:
a. ConÆinutul directorului curent poate fi salvat într-un tablou de memorie de tip matrice
folosind funcÆia 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 funcÆie, iar dacå existå va fi
170 Informatică

redimensionatå corespunzåtor. Matricea va avea un numår de linii egal cu numårul de


fiçiere çi directoare (dosare=foldere) înregistrate în director çi 5 coloane,
corespunzåtoare celor 5 caracteristici ale unui fiçier sau director: nume fiçier (tip çir de
caractere), dimensiune fiçier (tip numeric), data ultimei actualizåri (tip datå calen-
daristicå), timpul ultimei actualizåri (tip çir de caractere) çi atribute (tip çir de
caractere). Atributele fiçierelor sau directoarelor pot fi: A - arhivat, H - ascuns, R - pro-
tejat la scriere, S - sistem, D - director. Implicit pot fi salvate informaÆii despre toate fiçie-
rele çi dosarele înregistrate. Explicit vor fi salvate informaÆii numai despre fiçierele care
pot fi identificate prin çablonul descris cu argumentul <expC1> sau fiçierele care au
atributele precizate prin argumentul <expC2>: 'D' - numai directoare, 'H' - numai fiçie-
rele ascunse, 'S' - numai fiçierele sistem, 'V' - în primul element al tabloului va fi înre-
gistratå eticheta volumului de disc pe care se gåseçte directorul curent. FuncÆia furni-
zeazå un rezultat numeric care reprezintå numårul de fiçiere çi dosare inventariate.
b. Structura tabelului bazå de date activ poate fi salvatå într-un tablou de memorie de
tip matrice folosind funcÆia 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 funcÆie, iar dacå existå va fi
redimensionatå corespunzåtor. Matricea va avea un numår de linii egal cu numårul de
câmpuri din tabel çi 11 coloane, corespunzåtoare caracteristicilor ale unui câmp: nume
câmp (tip çir de caractere), tip câmp (tip çir de caractere), lungime câmp (tip
numeric), numår poziÆii zecimale (tip numeric), regula de validare (tip çir de carac-
tere), .... . FuncÆia furnizeazå un rezultat numeric care reprezintå numårul de câmpuri.

8.2. Păstrarea variabilelor de memorie şi a tablourilor de memorie


în afara sesiunii de lucru
Tablourile de memorie sunt structuri de date temporare. La terminarea execuÆiei
programului sau la terminarea execuÆiei sesiunii de lucru Visual FoxPro, datele påstrate
în ele se pierd. La fel ca çi în cazul variabilelor de memorie, datele din tablourile de
memorie pot fi salvate într-un fiçier (fiçier cu extensia .mem) folosind comanda save to çi
readuse din fiçier î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å (fiçiere cu tabelele bazei de date). Astfel:
variabile de memorie ⇔ tabel din baza de date :
a. variabilå de memorie ⇔ câmp memo din tabel
Save to memo
memoria internå memoria externå
(variabilå de memorie) (câmp memo din tabel)

Restore from memo


Utilizarea unor instrumente de prelucrare a datelor 171

b. set de variabile de memorie ⇔ câmpuri dintr-o înregistrare din tabel

tablou de memorie ⇔ tabel din baza de date :

Replace
Gather
memoria internå memoria externå
(set de variabile de memorie) (câmpuri dintr-o înregistrare din tabel)

Scatter

Append from array


Gather
memoria internå memoria externå
(tablou de memorie) (tabel din baza de date)

Scatter
Copy to array

ObservaÆie:
Comanda Copy to array cere ca tabloul så fie creat anterior spre deosebire de comanda
Scatter care îçi creeazå singurå tabloul de memorie.
Sintaxa comenzilor:
a. Comanda save to: salveazå variabilele de memorie çi tablourile descrise prin <sablon>
într-un fiçier pentru variabile de memorie (extensia .mem) specificat prin <nume_fisier>
sau într-un câmp memo al tabelului activ specificat prin clauza to memo çi identificat
prin nume <nume_câmp>:
save to <nume_fisier>| to memo <nume_câmp> [all like | except <sablon>]
b. Comanda restore from: restaureazå variabilele de memorie çi tablourile dintr-un fiçier
pentru variabile de memorie specificat prin <nume_fisier> sau într-un câmp memo al
tabelului activ specificat prin clauza to memo çi identificat prin nume <nume_câmp>:
restore from <nume_fisier>| to memo <nume_câmp> [additive]
c. Comanda scatter copiazå datele din
câmpurile înregistrårii curente ale ta- ?
belului activ într-un tablou de memorie
1. În ce ordine se copiazå datele din
identificat prin <nume_tablou> sau într-
câmpurile tabelului în tabloul de memorie?
un set de variabile de memorie, caz 2. Ce se întâmplå dacå numårul de câmpuri
specificat prin clauza memvar. care trebuie copiate este mai mare decât
Variabilele de memorie vor avea numårul de elemente din tabel?
acelaçi nume ca çi câmpurile care se
copiazå. Implicit se copiazå toate câmpurile, mai puÆin câmpurile memo. Explicit se pot
172 Informatică

copia numai câmpurile din lista de câmpuri a clauzei fields çi se pot copia çi câmpurile
memo dacå se precizeazå clauza memo. Clauza blank semnificå faptul cå se creeazå
tabloul de memorie, respectiv setul de variabile de memorie de acelaçi tip çi lungime ca
çi câmpurile, dar în loc så se transfere în ele datele din câmpuri, acestea vor fi vide.
scatter [fields <listå_câmpuri>] [memo] to <nume_tablou> | to <nume_tablou> blank |
memvar | memvar blank
d. Comanda gather copiazå în câmpurile înregistrårii curente a tabelului activ, datele dintr-
un tablou de memorie identificat prin <nume_tablou> sau dintr-un set de variabile de
memorie, caz specificat prin clauza memvar. Variabilele de memorie trebuie så aibå
acelaçi nume ca çi câmpurile. Ele pot fi create cu comanda scatter memvar blank, dupå
care li se pot atribui valori. Dacå pentru un câmp nu existå o variabilå de memorie cu
acelaçi nume, câmpul råmâne neschimbat. Copierea dintr-un tablou de memorie se face
secvenÆial, în fiecare câmp copiindu-se un element al tabloului, pânå când se terminå
elementele din tablou sau pânå când se terminå câmpurile din înregistrare. Implicit
transferul se face în toate câmpurile, mai puÆin câmpurile memo. Explicit transferul se
poate face numai în câmpurile precizate în lista de câmpuri a clauzei fields çi se pot
copia çi câmpurile memo dacå se precizeazå clauza memo.
gather from <nume_tablou> | memvar [fields <listå_câmpuri>] [memo]
e. Comanda copy to array încarcå într-un tablou de memorie creat anterior, identificat prin
<nume_tablou>, datele din câmpurile tabelului activ. Dacå tabloul este de tip vector, se
copiazå numai câmpurile din înregistrarea curentå, iar dacå tabloul este de tip matrice, se
încarcå în fiecare linie a matricei câmpurile dintr-o înregistrare. Dacå existå mai multe
elemente decât câmpuri, restul elementelor råmâne neschimbat, iar dacå existå mai multe
câmpuri decât elemente, câmpurile care nu mai încap nu se copiazå. Dacå existå mai
multe linii decât înregistråri, restul de linii råmâne neschimbat, iar dacå existå mai multe
înregistråri decât linii, înregistrårile care nu mai încap nu se copiazå. Implicit se transferå
toate câmpurile dintr-o înregistrare. Explicit se transferå numai în câmpurile precizate în lista
de câmpuri a clauzei fields. Implicit se transferå toate înregistrårile din tabelul activ. Explicit
se transferå numai înregistrårile precizate prin <domeniu> sau clauzele for sau while.
copy to array <nume_tablou> [fields <listå_câmpuri>] [<domeniu>]
[for <expL1>][while < expL2>][<nooptimize>]
f. Comanda append from array adaugå la sfârçitul tablelului activ înregistråri cu date
preluate dintr-un tablou de memorie identificat prin <nume_tablou>. Dacå tabloul de
memorie este de tip vector, se adaugå o singurå înregistrare astfel: dacå existå mai multe
elemente decât câmpuri, restul elementelor din tablou sunt ignorate, iar dacå sunt mai
multe câmpuri decât elemente, restul câmpurilor se iniÆalizeazå cu elementul neutru
pentru acel tip de datå. Dacå tabloul este de tip matrice, se copiazå în câte o înregistrare
câte o linie a matricei. Linia matricei este tratatå la fel ca un tablou de tip vector. Implicit
se transferå date în toate câmpurile înregistrårii. Explicit se transferå numai în câmpurile
precizate în lista de câmpuri a clauzei fields. Implicit se transferå toate liniile din tablou.
Explicit se transferå numai liniile precizate prin clauza for. Dacå tipul elementului din
tablou nu corespunde cu tipul câmpului în care se transferå, se încearcå transformarea
acelui tip de datå, care poate så reuçeascå sau nu. De exemplu, o datå de tip numeric,
logic sau datå calendaristicå poate fi transformatå într-o datå de tip çir de caractere, iar o
Utilizarea unor instrumente de prelucrare a datelor 173

datå de tip datå calendaristicå poate fi transformatå într-o datå de tip numeric. O datå de
tip çir de caractere nu poate fi transformatå într-o datå de tip numeric, iar o datå de tip
numeric nu poate fi transformatå într-o datå de tip datå calendaristicå.
append from array <nume_tablou> [fields <listå_câmpuri>] [for <expL>]

CreaÆi tablouri de memorie


1. CreaÆi douå structuri de date - a de tip b(1,3)=date()
vector çi b de tip matrice, ambele cu b(1,4)=.T.
10 elemente: b(1,5)=datetime()
b(2,1)=10
declare a(10), b(2,5) b(2,2)=20
b(2,3)=30
2. AfiçaÆi valoarea tuturor elementelor
b(2,5)=50
din tablouri folosind comanda display
display memory like b
memory. store 0 to a
display memory like a display memory like a
display memory like b
5. RedimensionaÆi tablourile:
ObservaÆi cå informaÆia este afiçatå sub declare a(8)
forma unui tabel - pe fiecare linie se afi- display memory like a
çeazå informaÆii despre un element, iar pe dimension a(2,4)
display memory like a
fiecare coloanå câte un tip de informaÆie:
dimension a(2,5)
valoarea indicelui sau valorile indicilor, ti-
display memory like a
pul datei din element, valoarea datei çi, elementele a(2,4) çi a(2,5) au
pentru datele numerice, çi reprezentarea valoarea .F.
internå a valorii. IniÆial toate elementele ta- dimension a(10)
blourilor create au valoarea logicå .F.. dimension b(2,8)
display memory like b
3. AfiçaÆi valoarea unor elemente din
ultimele 6 elemente au valoarea
tablouri: .F. (ca çi cum b ar fi un vector)
? a(5)
6. ConsultaÆi tablouri de memorie (lungi-
.F.
me, indici, existenÆa unui element):
? b(2,4)
? alen(a)
.F.
10
4. AtribuiÆi valori elementelor din tablou- ? alen(b)
rile create çi verificaÆi modul în care 16
s-au executat operaÆiile de atribuire: ? alen(b,1)
2
b(2,4)=40 ? alen(b,2)
? b(2,4) 8
40 ? aelement(b,2,3)
? b(9) 11
40 ? asubscript(b,11,1)
b(1,1)='azi' 2
b(1,2)='maine' ? asubscript(b,11,2)
174 Informatică

3 b(2,1)=10
? aelement(b, asubscript(b,11,1), b(2,2)=20
asubscript(b,11,2)) b(2,3)=30
11 b(2,4)=40
? ascan(b,40) b(2,5)=50
9 ? adel(b,3,2)
? asubscript(b, ascan(b,40),1) 1
2 display memory like b
? asubscript(b, ascan(b,40),2) a fost çtearså coloana 3 çi
1 elementele din ultima coloanå -
? ascan(b,'azi') b(1,5) çi b(2,5) - au valoarea .F.
1 ? ains(b,3,2)
? ascan(b,'zi') 1
0 display memory like b
? ascan(b,date()) a fost inseratå coloana 2 çi
3 elementele din aceastå coloanå
? ascan(b,.T.) -b(1,3) çi b(2,3)- au valoarea .F.
4 b(1,3)=date()
b(2,3)=30
7. ActualizaÆi tablourile de memorie:
display memory like a 8. CopiaÆi tablouri de memorie în alte
elementele a(9) çi a(10) au tablouri de memorie:
valoarea .F. declare d(20)
? ains(a,3) declare e(5)
1 ? acopy(b,d)
display memory like a 10
elementele a(3) çi a(10) au display memory like d
valoarea .F. elementele tabloului b au fost
a(3)='nou' copiate în primele 10 elemente
display memory like a ale tabloului d; restul elemen-
? adel(a,5) telor din d au valoarea .F.
1 ? acopy(b,c)
display memory like a 10
elementele a(9) çi a(10) au display memory like d
valoarea .F. s-a creat tabloul de memorie c
? adel(a,15) care are 10 elemente; elemen-
mesaj de eroare (depåçirea tele tabloului b au fost copiate
rangului indicelui): "Subscript is în tabloul c
outside defined range" ? acopy(b,e)
? ains(a,15) mesaj de eroare (depåçirea
acelaçi mesaj de eroare (depå- rangului indicelui)
çirea rangului indicelui) ? acopy(b,e,1,5)
declare b(2,5) 5
display memory like b display memory like e
? ains(b,3,1) s-au copiat în vectorul e prime-
acelaçi mesaj de eroare (depå- le 5 elemente din matricea b
çirea rangului indicelui) (prima linie)
? ains(b,2,1) ? acopy(b,a,6,5,4)
1 5
display memory like b display memory like a
elementele din ultima linie a s-au copiat în vectorul a, înce-
matricei au valoarea .F. pând de la elementul a(4) pânå
Utilizarea unor instrumente de prelucrare a datelor 175

la elementul a(8) cele 5 elemen- çi dupå coloana în care se gå-


te din ultima linie a matricei b seçte acest element - coloana
3; elementele matricei a sunt:
9. SortaÆi tablourile de memorie: 25 20 15 10
? asort(a) 5 0 300 400
mesaj de eroare (elementele 100 50 40 30
tabloului trebuie så fie de ace-
laçit tip): "Data type mismatch" 10. TransferaÆi date între tablouri de
a(3)=100 memorie çi tabelul bazei de date:
a(9)=15 create ex
a(10)=0 Se creeazå tabelul liber ex cu
a(1)=5 urmåtoarea structurå: c1(C,10),
a(2)=25 c2(N,5,0), c3(D), c4(L)
display memory like a declare a(2,4)
? asort(a) a(1,1))='linia1'
1 a(1,2))=100
display memory like a a(1,3))=date()
elementele vectorului a sunt a(1,4))=.T.
ordonate crescåtor a(2,1))='linia2'
? adel(a,1,alen(a),1) a(2,2))=200
1 a(2,3))=date()+10
display memory like a a(2,4))=.F.
elementele vectorului a sunt append from array a
ordonate descrescåtor list
declare a(3,4) goto 2
a(11)=300 replace c2 with 500
a(12)=400 list
display memory like a goto top
elementele matricei a sunt: scatter to q
100 50 40 30 display memory like q
25 20 15 10 a fost creat vectorul q cu 4 ele-
5 0 300 400 menete; elementele sale conÆin
? asort(a,2) valorile câmpurilor din prima
1 înregistrare a tabelului ex
display memory like a q(1)='linia3'
au fost sortate toate liniile q(2)=1000
matricei a începând cu linia în display memory like q
care se gåseçte elementul 2 - append from array q
prima linie çi dupå coloana în list
care se gåseçte acest element - tabelul conÆine trei înregis-
coloana 2; elementele matricei tråri; ultima înregistrare con-
a sunt: Æine valorile elementelor vecto-
5 0 300 400 rului q:
25 20 15 10 a(1,1))='linia4'
100 50 40 30 a(1,2))=800
? asort(a,3,2) a(1,3))=date()+20
1 a(2,1))='linia5'
display memory like a a(2,2))=900
au fost sortate crescåtor a(2,3))=date()+30
primele douå linii ale matricei a display memory like a
începând cu linia în care se gå- append from array a
seçte elementul 3 - prima linie list
176 Informatică

declare w(5,3) date dupå valoarea crescåtoare a


copy to array w fields c1, c2, c3 câmpului cost_s (coloana 4 a tabloului):
display memory like w open database compania
? asort(w,2) use sedinte
1 release all like a
display memory like w x=reccount()
zap declare a(reccount(),4)
append from array w for c2>400 copy to array a fields nr_s, id_cont,
list id_ng, cost_s
display memory like a
11. SalvaÆi informaÆii în tablouri de memorie:
sau
? adir(alfa,'*.dbf")
?a(1,1), a(1,2), a(1,3), a(1,4)
display memory like alfa
?a(2,1), a(2,2), a(2,3), a(2,4)
?alfa(1,1)
?a(3,1), a(3,2), a(3,3), a(3,4)
? adir(alfa,'*ex.dbf")
..............................................
display memory like alfa
?asort(a,4)
?afields(alfa)
append from array a fields nr_s,
display memory like alfa
id_cont, id_ang, cost_s
help afields()
brow
12. TransferaÆi date între tabele ale bazei de goto x+1
date çi tablouri de memorie. Pentru a- delete rest
ceasta deschideÆi tabelul Sedinte din pack
baza de date Compania. CopiaÆi use
close database
câmpurile nr_s, id_cont, id_ang, cost_s
clear memory
într-un tabel de memorie çi sortaÆi aceste

T est pentru evaluare:


1. CreaÆi structura a douå tablouri de memorie: vectorul b cu 10 elemente çi matricea a cu
douå linii çi cinci coloane.
2. AfiçaÆi conÆinutul acestor tablouri de memorie. AfiçaÆi lungimea lor.
3. AtribuiÆi tuturor elementelor din vectorul b valoarea 0. AtribuiÆi elementelor din matricea
a valorile 1, 2, ..., 10. AfiçaÆi conÆinutul celor douå tablouri de memorie.
4. AfiçaÆi valoarea elementului 8 din vectorul b. AfiçaÆi valoarea elementului 8 din matricea
a. AfiçaÆi valoarea elementului din linia 2 çi coloana 3 din matricea a.
5. AfiçaÆi numårul de ordine al elementului din linia 2 çi coloana 3 a matricei a.
6. AfiçaÆi din matricea a valoarea elementului care are numårul de ordine al elementului
din linia 2 çi coloana 3 a matricei a.
7. MemoraÆi în variabila ak1 numårul de linii ale matricei a. MemoraÆi în variabila ak2
numårul de coloane ale matricei a. MemoraÆi în variabila al numårul de elemente ale
matricei a. MemoraÆi în variabila bl numårul de elemente ale matricei b.
8. Folosind variabilele de memorie definite anterior, afiçaÆi pe ecran urmåtorul text
(prezentaÆi cele trei variante):
Tabloul are <n> linii çi <m> coloane
9. TransformaÆi matricea a într-un vector cu 10 elemente. AfiçaÆi conÆinutul acestui vector.
10. TransformaÆi vectorul a într-o matrice cu 2 linii çi 4 coloane. AfiçaÆi conÆinutul matricei.
11. ComparaÆi numårul de linii ale matricei a cu variabila de memorie ak1. ComparaÆi
numårul de coloane ale matricei a cu variabila de memorie ak2. ComparaÆi numårul de
elemente ale matricei a cu variabila de memorie al.
Utilizarea unor instrumente de prelucrare a datelor 177

12. TransformaÆi matricea a într-o matrice cu 2 linii çi 5 coloane. AfiçaÆi conÆinutul matricei.
13. ComparaÆi numårul de linii ale matricei a cu variabila de memorie ak1. ComparaÆi
numårul de coloane ale matricei a cu variabila de memorie ak2. ComparaÆi numårul de
elemente ale matricei a cu variabila de memorie al.
14. AfiçaÆi valoarea elementului 9 din matricea a. AfiçaÆi valoarea elementului 10 din
matricea a.
15. TransformaÆi matricea a într-un vector cu 10 elemente.
16. RefaceÆi datele din matricea iniÆialå a.
17. SortaÆi descrescåtor vectorul a. AfiçaÆi conÆinutul vectorului sortat.
18. TransformaÆi vectorul a într-o matrice cu 2 linii çi 4 coloane. AfiçaÆi conÆinutul matricei.
19. SortaÆi creascåtor matricea a dupå coloana 3 începând cu prima linie. AfiçaÆi conÆinutul
acestei matrice.
20. TransformaÆi matricea a într-un vector cu 10 elemente. AfiçaÆi conÆinutul acestui vector.
21. SortaÆi crescåtor vectorul a. AfiçaÆi conÆinutul acestui vector.
22. CreaÆi printr-o singurå comandå structura vectorului c cu 5 elemente çi a vectorului d
cu 2 elemente.
23. Folosind datele din matricea a, atribuiÆi elementelor din vectorul c valorile 6, 7, ..., 10,
iar elementelor din vectorul d valorile 3 çi 8. AfiçaÆi conÆinutul celor doi vectori.
24. TransformaÆi vectorul a într-o matrice cu 3 linii çi 5 coloane. AfiçaÆi conÆinutul matricei.
25. ÇtergeÆi linia 2 a matricei a. TransformaÆi matricea a într-o matrice cu 2 linii çi 5 coloane.
AfiçaÆi conÆinutul acestei matrice.
26. TransformaÆi matricea a într-o matrice cu 2 linii çi 6 coloane. AfiçaÆi conÆinutul acestei
matrice. InseraÆi o coloanå vidå în coloana 3. AfiçaÆi conÆinutul acestei matrice.
27. TransformaÆi matricea a într-o matrice cu 2 linii çi 5 coloane. RefaceÆi matricea iniÆialå a.
AfiçaÆi conÆinutul matricei. InseraÆi o coloanå vidå în coloana 3. AfiçaÆi conÆinutul matricei.
28. ÇtergeÆi coloana 3 din matricea a. AfiçaÆi conÆinutul matricei a.
29. CåutaÆi valoarea 6 în matricea a. CåutaÆi valoarea 8 în vectorul c.
30. RefaceÆi matricea iniÆialå a. CåutaÆi valoarea 6 în matricea a.
31. CreaÆi structura a doi vectori cu 5 elemente: a1 çi a2.
32. CopiaÆi în vectorul a1 prima linie din matricea a.
33. CopiaÆi în vectorul a2 a doua linie din matricea a.
34. AfisaÆi printr-o singurå comandå conÆinutul vectorilor a1 çi a2 çi al matricei a.
35. SalvaÆi vectorii a1 çi a2 çi matricea a în fiçierul fa.
36. ÇtergeÆi din memoria internå vectorii a1 çi a2 çi matricea a.
37. AfiçaÆi conÆinutul vectorilor a1 çi a2 çi al matricei a.
38. RefaceÆi în memoria internå vectorii a1 çi a2 çi matricea a prin preluare din fiçierul fa.
39. AfiçaÆi conÆinutul vectorilor a1 çi a2 çi al matricei a.
40. ÇtergeÆi conÆinutul memoriei interne.
41. DeschideÆi tabelul Incasari din baza de date Compania. PåstraÆi în variabila x numårul
de înregistråri din tabel.
42. CopiaÆi din acest tabel, într-un tablou de memorie cu trei coloane, câmpurile nr_i,
id_cont, valoare. VizualizaÆi datele din tabloul de memorie.
43. SortaÆi acest tabel dupå valoarea câmpului valoare. VizualizaÆi datele sortate.
44. AdåugaÆi aceste date la sfârçitul tabelului. VizualizaÆi datele adåugate.
45. ÇtergeÆi datele adåugate. ÎnchideÆi tabelul çi baza de
date. EliberaÆi memoria internå.
178 Informatică

# ÎncercaÆi:
Adevårat/Fals:
1. În Visual FoxPro tablourile de memorie sunt omogene.
2. Un element al unei matrice Visual FoxPro poate fi identificat dupå numårul såu de ordine.
3. Dacå transformaÆi un vector într-o matrice, datele se pierd.
4. În Visual FoxPro se pot defini tablouri de memorie cu trei dimensiuni.
5. Înregistrarea în memoria internå a elementelor unei matrice se face linie dupå linie.
CompletaÆi:
1. Structura tabelului activ se poate salva într-o matrice folosind funcÆia ................
2. FuncÆia alen(a,2) furnizeazå ............................... ale matricei a.
3. Prin comanda de definire a structurii unui tablou de memorie elementele sunt
iniÆializate cu valoarea ..........
4. Pentru a çterge a doua coloanå dintr-o matrice a folosiÆi funcÆia ....................
AlegeÆi råspunsul corect:
1. Pentru copierea elementelor unui tablou de memorie într-un alt tablou de memorie folosiÆi:
a) funcÆia acopy() b) comanda copy to array c) comanda append from array
2. Într-o matrice Visual FoxPro se pot ordona:
a) elementele b) liniile c) coloanele
3. Elementul inserat într-un vector va avea valoarea:
a) .T. b) .F. c) NULL pentru acel tip de datå
4. Pentru a cåuta un element al tabloului de memorie care are o valoare precizatå, folosiÆi
funcÆia:
a) afind() b) afilds() c) ascan()
5. PuteÆi încårca într-un vector câmpurile din înregistrarea curentå a tabelului activ cu
ajutorul comenzii:
a) restore from b) copy to array c) scatter
6. PuteÆi încårca în câmpurile din înregistrarea curentå a tabelului activ datele din elemen-
tele unui vector folosind comanda:
a) save to b) gather c) append from array
RåspundeÆi:
1. CaracterizaÆi structura de date de tip tablou de memorie din Visual FoxPro.
2. Ce operaÆii se pot executa cu tablourile de memorie?
3. Ce operaÆii de transfer se pot executa între datele din memoria internå çi datele din
memoria externå.

R åspunsuri:
Adevårat/Fals: 1-F; 2-A; 3-F; 4-F; 5-A.
CompletaÆi: 1-afields(); 2-numårul de coloane; 3-.F.; 4- adel(a,2,2).
AlegeÆi råspunsul corect: 1) a; 2) b; 3) b;4) c;5) b,c; 6) b.
Capitolul 3
Elaborarea unor
strategii de modularizare
şi abstractizare a
prelucrării datelor
Dupå ce veÆi parcurge acest capitol AÆi învåÆat så folosiÆi interfaÆa unui sistem de ges-
trebuie så çtiÆi: tiune a bazelor de date pentru a crea çi a întreÆine
o bazå de date.
1. Cum puteÆi crea o aplicaÆie Visual
FoxPro. Pentru exploatarea unei baze de date, utilizatorul
2. Cum puteÆi modulariza aplicaÆia. nu interacÆioneazå direct cu baza de date sau cu
3. Cum puteÆi dezvolta o aplicaÆie sistemul de gestiune al bazei de date, ci cu un
folosind elementele programårii software de aplicaÆie. Rolul acestuia este de a
clasice. prezenta informaÆiile din baza de date într-o formå
4. Ce metode puteÆi folosi pentru çi în termeni accesibili utilizatorului. Utilizatorul
construirea interfeÆei unei aplicaÆii. interacÆioneazå cu aplicaÆia prin intermediul inter-
5. Cum puteÆi construi interfaÆa unei feÆei. Açadar, partea vizibilå a oricårei aplicaÆii
aplicaÆii folosind programarea
cu care interacÆioneazå utilizatorul este inter-
orientatå pe obiecte.
faÆa. Din punctul de vedere al utilizatorului, apli-
6. Cum puteÆi construi interfaÆa apli-
caÆiei cu ajutorul obiectelor vizuale. caÆia înseamnå de fapt interfaÆa ei. Pentru el nu
conteazå instrucÆiunile care se gåsesc în spatele
ei çi nici efortul consumat de programator pentru a scrie çi a optimiza codul programului.
Pentru utilizator conteazå modul în care exploateazå aplicaÆia, adicå interfaÆa çi
informaÆiile pe care le obÆine prin intermediul acestei interfeÆe.
Pentru crearea unei aplicaÆii, sistemul de gestiune a bazelor de date Visual FoxPro pune
la dispoziÆia programatorului douå metode de programare:
9 Programarea clasicå în care rezolvarea unei probleme se face cu ajutorul algoritmilor
descriçi prin cele trei structuri de control: structura secvenÆialå, structura alternativå çi
structura repetitivå. Ea este orientatå pe prelucrarea datelor. Folosind aceastå
metodå, programatorul trebuie så construiascå un program care este format din
ansamblul de date çi algoritmul folosit pentru descrierea problemei. Algoritmul este
implementat în calculator cu ajutorul instrucÆiunilor puse la dispoziÆie de limbajul de
programare.
180 Informatică

9 Programarea orientatå pe obiecte în care rezolvarea problemei se face cu ajutorul


obiectelor. Ea este orientatå pe definirea obiectelor. Folosind aceastå metodå, pro-
gramatorul trebuie så construiascå obiecte care sunt formate din date çi procedurile
care prelucreazå aceste date.
Aceeaçi problemå poate fi rezolvatå cu oricare dintre cele douå metode. Metoda
programårii pe obiecte are înså urmåtoarele avantaje: permite un control mai bun al
programelor (în special al programelor de dimensiuni mari) çi permite o mai uçoarå
dezvoltare a programelor. În schimb, programarea clasicå asigurå compatibilitatea cu
programele scrise ca aplicaÆii pentru versiunile anterioare ale sistemului de gestiune a
bazelor de date FoxPro.
Pe lângå cele douå metode de programare Visual FoxPro pune la dispoziÆia utilizatorului
instrumente vizuale pe care le poate folosi pentru a realiza interfaÆa aplicaÆiei.
AplicaÆia Visual FoxPro cuprinde, pe lângå fiçierele surså sau cu module obiect ale
programelor çi ale bibliotecilor de subprograme, çi alte fiçiere care concurå la realizarea
interfeÆei çi la obÆinearea informaÆiilor, cum sunt de exemplu fiçierele cu formularele
folosite pentru introducerea datelor, fiçierele pentru formatul rapoartelor, fiçierele pentru
interogåri etc. Toate aceste elemente necesare la realizarea unei aplicaÆii pot fi organi-
zate î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 modificåri neautorizate,
proiectul poate genera un fiçier executabil independent de mediul Visual FoxPro.

1. Elemente de programare clasică structurată


1.1. Declararea datelor
Atunci când aÆi folosit un limbaj clasic de programare structuratå aÆi våzut cå programul
conÆine o secÆiune declarativå, în care trebuie definite datele elementare çi structurile de
date folosite de algoritmul care rezolvå problema. În aceastå secÆiune datele se definesc
prin precizarea identificatorului çi a tipului datei. Aceastå secÆiune declarativå trebuie så
preceadå secÆiunea de instrucÆiuni care descriu algoritmul, deoarece în faza de compilare
se alocå fiecårei date, în funcÆie de tip, zona de memorie corespunzåtoare. Programul
scris în limbajul gazdå FoxPro nu conÆine o secÆiune declarativå în care så fie definite
datele care vor fi folosite de instrucÆiunile programului. Variabilele de memorie çi
tablourile de memorie pot fi definite oriunde în interiorul programului astfel:
9 variabilele de memorie simple (corespunzând datelor elementare) se creeazå prin
atribuirea unei valori unui identificator, tipul valorii atribuite determinând tipul datei.
9 tablourile de memorie se creeazå cu comanda dimension sau declare.
De exemplu, urmåtoarele 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 prelucrării datelor 181

sum camp1 to c {atribuie variabilei de memorie c valorea obÆinutå prin însumarea


valorilor din câmpul numeric camp1 al tabelului activ}
count to d {atribuie variabilei de memorie d valorea obÆinutå prin numårarea
înregistrårilor din tabelul activ}
Pe parcursul unui program, acelaçi identificator de datå poate så defineascå tipuri diferite
de date. De exemplu, în acelaçi program se pot întâlni 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 funcÆii 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 me-
morie 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


ÇtiÆi deja cå un program reprezintå o succesiune de comennzi de operaÆii numite instruc-
Æiuni, care trebuie så rezolve o anumitå problemå, descriind un anumit algoritm. Structura
de control a algoritmului defineçte ordinea de executare a paçilor, adicå ordinea în care
un pas predå controlul altui pas çi prin care se determinå fluxul controlului. În general,
instrucÆiunile 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 instrucÆiuni de
control. Atunci când aÆi studiat un limbaj de programare clasic aÆi våzut cå pentru a
descrie un algoritm este suficient så folosiÆi 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 instrucÆiuni, iar pentru schimbarea
ordinii secvenÆiale de execuÆie se pot folosi instrucÆiuni de control. Programul surså
devine astfel o colecÆie de comenzi çi instrucÆiuni de control scrise în ordinea în care
trebuie så fie executate. InstrucÆiunile de control sunt instrucÆiuni bloc deoarece conÆin
mai multe instrucÆiuni. De aceea ele trebuie delimitate de cuvinte cheie care marcheazå
începutul çi sfârçitul structurii de control. InstrucÆiunile nu pot fi folosite în modul comandå.
Compilatorul FoxPro trebuie så poatå identifica fiecare instrucÆiune a programului surså.
El considerå ca separator între instrucÆiuni codul ASCII generat la acÆionarea tastei enter.
Se numeçte EOL (End Of Line) çi este format din douå coduri ASCII:
EOL = LF (Line Feed = salt la linia urmåtoare) +
CR (Carriage Return = retur la începutul liniei) = 0DH + 0AH
182 Informatică

Din aceastå cauzå, în fereastra de editare fiecare comandå se va scrie pe câte un rând:

<verb1> <listå_adverbe_1> enter


<verb2> <listå_adverbe_2> enter

instrucÆiune
.......................................................

Dacå doriÆi så scrieÆi o comandå pe mai multe rânduri, pentru a aråta cå ea continuå pe
rândul urmåtor, la sfârçitul liniei, înainte de a acÆiona tasta enter scrieÆi caracterul punct çi
virgulå ( ; ), astfel:

<verb> < adverb_1> ; enter


< adverb_2> ; enter
< adverb_3> enter

sfârçit de comandå
AtenÆie: urmåtoarele linii ale comenzii nu
se scriu din prima coloanå.

InstrucÆiunile de control implementate în limbajul gazdå FoxPro sunt:

simplå if ... endif


structura alternativå

generalizatå do case ... endcase

cu numår
cunoscut de paçi for ... endfor
structura repetitivå

cu numår necunoscut
de paçi, condiÆionatå do while ... enddo
anterior

pentru parcurgerea
înregistrårilor dintr-un scan ... endscan
tabel

ObservaÆii:
1. Spre deosebire de limbajele clasice de programare, în limbajul gazdå FoxPro este imple-
mentatå o structurå repetitivå specificå acestui gen de aplicaÆie (scan ... endscan), care
faciliteazå scrierea unui program ce exploateazå secvenÆial un tabel al bazei de date.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 183

2. Nu este implementatå structura repetitivå cu numår necunoscut de paçi condiÆionatå


posterior (de tip repeat ... until).

1.2.1. Structura liniarå sau secvenÆialå


Structura liniarå sau secvenÆialå 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 uçura urmårirea 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 cåtre sistem ca instrucÆiune, textul este precedat de caracterul **
sau de cuvântul cheie note . La fel ca çi la o comandå, pentru a aråta cå ea continuå
çi pe rândul urmåtor scrieÆi la sfârçitul liniei de comentarii caracterul ;.
9 Comentariu inserat în comandå. Este un text care se scrie pe aceeaçi linie cu comanda,
dar la sfârçitul ei. Pentru a nu fi interpretatå de cåtre sistem ca adverb al comenzii, textul
este precedat de caracterele && . Comentariul poate fi continuat pe rândul urmåtor dacå
scrieÆi la sfârçitul liniei caracterul ;. Nu adåugaÆi comentarii la sfârçitul unei linii de comandå
care se continuå pe rândul urmåtor. De exemplu, nu veÆi scrie pe un rând input 'x= ' to ; &&
Se introduce x iar pe rândul urmåtor continuaÆi comanda scriind x.
Exemplu
Så se genereze aleator un numår cu valoarea cuprinså între douå numere precizate, a
cåror 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å condiÆionat o anumitå secvenÆå de instrucÆiuni, în
funcÆie de valoarea unei condiÆii logice. Limbajul gazdå FoxPro permite folosirea a douå
tipuri de structuri alternative:

a. Structura alternativå simplå


Structura alternativå simplå permite executarea unei acÆiuni (descriså printr-o secvenÆå
de instrucÆiuni: <secvenÆå-instrucÆiuni-1> sau <secvenÆå-instrucÆiuni-2>) din douå acÆiuni
posibile, în funcÆie de valoarea unei condiÆii exprimate printr-o expresie logicå (<expL>):

if <expL>
<secvenÆå-instrucÆiuni-1>
else
<secvenÆå-instrucÆiuni-2>
endif
ObservaÆii:
1. Cuvintele cheie if çi endif delimiteazå structura, iar cuvântul else marcheazå începutul sec-
venÆei de instrucÆiuni care descrie activitatea ce se executå dacå expresia logicå are valoa-
rea „fals”.
2. Cuvântul cheie if împreunå cu condiÆia çi cuvintele cheie else çi endif se scriu fiecare pe
câte un rând.
3. Sunt permise structuri if ... endif imbricate. Dacå sunt mai multe structuri alternative
simple imbricate, else se referå la primul if care îl precede.
4. Se pot construi çi structuri alternative simple cu o ramurå vidå.
Exemplu
Så se scrie un program pentru rezolvarea ecuaÆiei de gradul I cu coeficienÆi numere
reale. CoeficienÆii a çi b se introduc de la tastaturå.
Metoda 1
set talk off else
clear ? 'Ecuatia este imposibila'
store 0 to a,b endif
? 'Programul va furnizeaza; else
solutia ecuatiei de gradul I' x=-b/a
? 'de forma a*x+b=0' ? 'x= ',x
input 'a= ' to a endif
input 'b= ' to b wait 'Actionati orice tasta;
if a=0 pentru continuare'
if b=0 clear
? 'Ecuatia are o infinitate; return
de solutii'
Metoda 2 (care foloseçte structuri if...endif imbricate)
set talk off ? 'Programul va furnizeaza;
clear solutia ecuatiei de gradul I'
store 0 to a,b ? 'de forma a*x+b=0'
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 185

input 'a= ' to a x=-b/a


input 'b= ' to b ? 'x= ',x
if a=0 and b=0 endif
? 'Ecuatia are o infinitate; endif
de solutii' wait 'Actionati orice tasta;
else pentru continuare'
if a=0 and b<>0 clear
? 'Ecuatia este imposibila' return
else
Metoda 3 (care foloseçte funcÆia iif())
set talk off ? iif(a<>0, -b/a,iif(b<>0,
clear 'Ecuatia este imposibila',;
store 0 to a,b 'Ecuatia are o infinitate de;
? 'Programul va furnizeaza solu-; solutii'))
tia ecuatiei de gradul I' wait 'Actionati orice tasta;
? 'de forma a*x+b=0' pentru continuare'
input 'a= ' to a clear
input 'b= ' to b return

b. Structura alternativå generalizatå


Structura alternativå generalizatå permite executarea unei singure acÆiuni din mai multe
acÆiuni posibile (descrise prin secvenÆele de instrucÆiuni: <secvenÆå-instrucÆiuni-1>,
<secvenÆå-instrucÆiuni-2>, ..., <secvenÆå-instrucÆiuni-n+1>). Stabilirea acÆiunii care urmea-
zå så se execute se face în urma evaluårii unei condiÆii care poate lua mai multe valori
exprimate prin expresiile logice (<expL1>, <expL2>, ..., <expLN>):
do case
case <expL1>
<secvenÆå-instrucÆiuni-1>
case <expL2>
<secvenÆå-instrucÆiuni-2>
..............................................
case <expLi>
<secvenÆå-instrucÆiuni-i>
.............................................
case <expLn>
<secvenÆå-instrucÆiuni-n>
[otherwise
<secvenÆå-instrucÆiuni-n+1>]
endcase

ObservaÆii:
1. Cuvintele cheie do case çi endcase delimiteazå structura, iar cuvintele cheie case mar-
cheazå începutul unui caz care urmeazå så fie tratat (condiÆia logicå ce trebuie evaluatå
çi secvenÆa de instrucÆiuni care descrie activitatea ce se va executa atunci când condiÆia
logicå are valoarea „adevårat”). Cuvântul cheie otherwise împreunå cu secvenÆa de in-
strucÆiuni <secvenÆå-instrucÆiuni-n+1> sunt opÆionale çi reprezintå acÆiunea care se va
186 Informatică

executa atunci când nici una dintre expresiile logice din cazurile prezentate nu au avut
valoarea „adevårat”.
2. Cuvântul cheie case împreunå cu condiÆia çi cuvintele cheie do case, otherwise çi
endcase se scriu fiecare pe câte un rând.
3. Se acceptå într-o structurå do case ... endcase structuri alternative sau structuri repetitive
cu condiÆia ca aceste structuri så fie incluse complet în interiorul unui case sau otherwise.
4. Structura alternativå generalizatå do case ... endcase poate fi echivalatå cu mai multe
structuri alternative simple if ... endif imbricate:
if <expL1>
<secvenÆa-instrucÆiuni-1>
else
if <expL2>
<secvenÆa-instrucÆiuni-2>
else
if <expLn>
<secvenÆa-instrucÆiuni-1>
else
......................................
if <expLn>
<secvenÆa-instrucÆiuni-n>
else
<secvenÆa-instrucÆiuni-n>
endif
......................................
endif
endif
endif
Mod de executare a instrucÆiunii:
1. Se evalueazå pe rând expresiile logice <expL1>, <expL2>, <expL3>, ... çi <expLn>.
Când se întâlneçte prima expresie care are valoarea „adevårat”, se executå secvenÆa
de instrucÆiuni cuprinså între condiÆia logicå çi apariÆia unuia dintre cuvintele cheie case,
otherwise sau endcase.
2. Dupå ce s-a întâlnit un caz adevårat çi s-au executat instrucÆiunile corespunzåtoare
cazului, celelalte cazuri nu vor mai fi tratate çi se va trece la executarea primei instrucÆiuni
aflate dupå cuvântul cheie endcase.
3. Dacå nici una dintre expresiile logice evaluate nu a avut valoarea „adevårat”, se executå
secvenÆa de instrucÆiuni delimitatå de cuvintele cheie otherwise çi endcase, dacå existå
sau, în caz contrar, prima instrucÆiune aflatå dupå cuvântul cheie endcase.
Recomandare:
Se recomandå folosirea instrucÆiunii do case ... endcase în locul instrucÆiunii if ... endif
în urmåtoarele cazuri:
1. Din mai multe cazuri unul singur poate fi adevårat.
2. Din mai multe condiÆii numai prima gåsitå adevåratå trebuie executatå.
3. Existå un numår mic de excepÆii la o anumitå condiÆie. În acest caz excepÆiile vor fi puse
în evidenÆå prin case <expL>, iar situaÆia obiçnuitå prin otherwise.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 187

Exemplu
Så se scrie un program pentru rezolvarea ecuaÆiei de gradul I folosind structura repetitivå
generalizatå pornind de la metoda folosirii structurilor alternative simple imbricate:
set talk off case a=0 and b<>0
clear ? 'Ecuatia este imposibila'
? 'Programul va furnizeaza; otherwise
solutia ecuatiei de gradul I' x=-b/a
? 'de forma a*x+b=0' ? 'x= ',x
input 'a= ' to a endcase
input 'b= ' to b wait 'Actionati orice tasta;
do case pentru continuare'
case a=0 and b=0 clear
? 'Ecuatia are o infinitate; return
de solutii'

1.2.3. Structura repetitivå


Prin aceastå structurå se executå repetat o acÆiune (exprimatå printr-o secvenÆå de in-
strucÆiuni - <secvenÆå-instrucÆiuni>) atât timp cât este îndeplinitå o condiÆie pentru execu-
Æia repetatå. Toate structurile repetitive acceptå în
corpul lor (secvenÆa de instrucÆiuni care se executå for
repetat) instrucÆiunile loop çi exit: contor:=<expN1>
9 Loop - forÆeazå reevaluarea condiÆiei de
terminare a structurii repetitive printr-un salt la
începutul structurii (în cazul unei structuri repetitive
to
cu numår cunoscut de paçi, înainte de evaluarea
condiÆiei produce çi incrementarea contorului). <contor> .F.
<= <expN2>
9 Exit - forÆeazå abandonarea structurii repetitive
indiferent de rezultatul evaluårii condiÆiei de endfor
terminare printr-un salt la prima instrucÆiune care .T.
urmeazå dupå terminarea structurii repetitive. <secvenÆå-instrucÆiuni>
InstrucÆiunile loop çi exit se vor folosi într-o structurå
step
alternativå din interiorul structurii repetitive. <contor>=<contor>+<expN3>

În limbajul FoxPro sunt implementate urmåtoarele


tipuri de structuri repetitive:

a. Structura repetitivå cu numår cunoscut de paçi


Permite executarea repetatå a unei secvenÆe de instrucÆiuni de un numår specificat de
ori. Pentru a numåra de câte ori s-a executat secvenÆa de instruc-Æiuni se foloseçte
variabila de memorie <contor> care va avea valoarea iniÆialå precizatå prin <expN1> la
începerea executårii repetate a secvenÆei de instrucÆiuni. Aceastå variabilå va trebui så
aibå valoarea precizatå prin <expN2> pentru a se termina executarea repetatå a
secvenÆei de instrucÆiuni. Dupå fiecare executare a secvenÆei de instrucÆiuni, variabila
contor este incrementatå implicit cu valoarea 1 sau, dacå se precizeazå clauza step, cu
valoarea <expN3>. Sintaxa instrucÆiunii este:
188 Informatică

for <contor>=<expN1> to <expN2> [step <expN3>]


<secvenÆå-instrucÆiuni>
endfor | next

ObservaÆie:
1. Cuvântul cheie for marcheazå începutul structurii, iar cuvântul cheie endfor (sau cuvân-
tul cheie next) marcheazå sfârçitul structurii. Cuvintele cheie for çi to delimiteazå opera-
Æia de atribuire prin care se face iniÆializarea contorului, cuvântul to precede valoarea
finalå a contorului, iar cuvântul step precede valorea cu care se incrementeazå contorul.
2. Cuvântul cheie for împreunå cu expresiile çi cuvintele cheie to çi step se scriu pe acelaçi
rând. Cuvântul cheie endfor, respectiv next se scrie pe un singur rând.
3. Variabila de memorie <contor> trebuie definitå înaintea structurii for ... endfor ca
variabilå de tip numeric întreg printr-o operaÆie de atribuire.
Exemplu:
Så se calculeze suma a n numere introduse de la tastaturå. Valoarea lui n se introduce
de la tastaturå.
set talk off suma=suma+a
clear endfor
store 0 to suma,i ? 'Suma = ', suma
? 'Programul calculeaza suma a n; wait 'Actionati orice tasta;
numere introduse de la tastatura' pentru continuare'
input 'n= ' to n clear
for i=1 to n return
input 'a= ' to a

b. Structura repetitivå cu numår necunoscut de paçi condiÆionatå anterior


Permite executarea repetatå a unei secvenÆe de instrucÆiuni atât timp cât o condiÆie expri-
matå printr-o expresie logicå <expL> are valoarea „adevårat”. Sintaxa instrucÆiunii este:
do while <expL>
<secvenÆå-instrucÆiuni>
enddo
ObservaÆii:
1. Cuvântul cheie while marcheazå începutul structurii iar
iniÆializare
cuvântul cheie enddo sfârçitul ei.
2. Cuvântul cheie while împreunå cu expresia logicå çi
cuvântul cheie enddo se scriu fiecare pe câte un rând.
do while
Exemplu:
.F.
Så se calculeze media aritmeticå a unor numere introduse <expL>
de la tastaturå. Utilizatorul programului este întrebat de
fiecare datå dacå mai doreçte så introducå un numår. .T. enddo
OperaÆia se terminå atunci când acesta råspunde cå nu mai <secvenÆå-instrucÆiuni>
doreçte continuarea operaÆiei de introducerea numerelor.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării 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 çedinÆele care au avut o
valoare mai mare decât o valoare precizatå, care se va introduce de la tastaturå. Så se
afiçeze numårul acestor çedinÆe çi ce procent reprezintå ele din totalul çedinÆelor.
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 înregistrårilor dintr-un tabel


Permite parcurgerea secvenÆialå a înregistrårilor dintr-un tabel, excutând o secvenÆå de
instrucÆiuni. SecvenÆa de instrucÆiuni acÆioneazå implicit asupra tuturor înregistrårilor din
tabel. Explicit, ea se poate executa condiÆionat numai asupra înregistrårilor care aparÆin
unui domeniu precizat prin clauza <domeniu> sau numai asupra înregistrårilor care
îndeplinesc condiÆia precizatå prin expresia logicå <expL1> respectiv <expL2> din clauza
for respectiv while. Sintaxa instrucÆiunii este:
scan [<domeniu>] [for <expL1>] [while <expL2>]
<secvenÆå-instrucÆiuni>
endscan
ObservaÆie:
1. Cuvântul cheie scan marcheazå începutul structurii, iar cuvântul cheie endscan sfârçitul
structurii.
2. Cuvântul cheie scan (împreunå cu adverbele care use <tabel>
precizeazå înregistrårile ce vor fi prelucrate) çi cu-
vântul cheie endscan se scriu fiecare pe câte un rând.
3. Forma implicitå a instrucÆiunii scan ... endscan este do while
echivalentå cu urmåtoarea instrucÆiune do while ...
enddo: .F.
not eof()
goto top
do while not eof()
<secvenÆå-instrucÆiuni> .T. enddo
skip <secvenÆå-instrucÆiuni>
enddo
4. Forma implicitå a instrucÆiunii scan ... endscan este skip
echivalentå cu urmåtoarea instrucÆiune for ... endfor:
goto top
for i=1 to reccount()
<secvenÆå-instrucÆiuni>
skip
endfor
Exemplu:
Så se afiçeze informaÆii despre çedinÆele Æ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 prelucrării 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 execuÆie a unui program Visual FoxPro se parcurg etapele:
1.3.1. Crearea programului surså
Programul surså se scrie într-un fiçier de tip text cu ajutorul editorului de texte încorporat.
Editorul de texte se activeazå cu comanda modify command (care creeazå un fiçier program
surså, cu extensia implicitå .prg) sau modify file (care creeazå un fiçier text, cu extensia
implicitå .txt). Prin aceastå comandå se deschide fereastra de editare, în care se vor scrie
comenzile çi instrucÆiunile 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 instrucÆiune într-un program surså).
Sintaxa celor douå comenzi este:
modify command | modify file [<nume_fiçier> | <ç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 fiçier de tip text al cårui nume se va comunica ulterior prin operaÆia
Save as çi care va avea extensia implicitå comenzii. Dacå veÆi comunica çi numele fiçierului
prin adverbul <nume_fiçier>, în fereastra de editare se va încårca conÆinutul fiçierului pentru a
fi editat (la creare, conÆinutul fiçierului este vid). Çi în acest caz, comanda va avea în vedere
fiçierele care au extensia implicitå. Dacå vreÆi så încårcaÆi un fiçier cu o altå extensie, trebuie
så precizaÆi çi extensia. Dacå nu cunoaçteÆi numele fiçierului, folosiÆi adverbul ? care va
deschide caseta de dialog Open prin intermediul cåreia puteÆi alege numele fiçierului. Pentru
numele fiçierului puteÆi folosi un çablon pentru nume de fiçiere (adverbul <çablon>). În acest
caz se vor deschide mai multe ferestre de editare çi în fiecare fereastrå va fi încårcat câte un
fiçier care corespunde çablonului.
Implicit se pot face modificåri în text. Explicit textul poate fi numai vizualizat dacå se
foloseçte clauza noedit. Implicit în fereastra de editare este încårcat tot textul din fiçier,
Explicit este încårcat numai textul cuprins între caracterele cu numårul de ordine precizat
prin expresiile <expN1> çi <expN2> ale clauzei range.
Dacå se foloseçte comanda într-un program, implicit programul îçi întrerupe execuÆia,
açteptând închiderea ferestrei de editare. Explicit, programul îçi poate continua execuÆia
dacå se precizeazå clauza nowait. Implicit fereastra de editare se închide la påråsirea
editorului. Explicit ea råmâne deschiså dacå se precizeazå clauza save. Implicit, textul
192 Informatică

poate fi încårcat în fereastra standard a editorului. Explicit aceastå fereastrå poate prelua
caracteristicile ferestrei precizate prin clauza window <nume_fereastrå_1>. Fereastra de
editare este deschiså implicit pe ecran çi explicit într-o fereastrå pårinte precizatå prin
clauza in [window] <nume_fereastrå_2>.

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 compilårii se obÆine un fiçier cu extensia .fxp care
conÆine codul obiect al programului. Comanda are sintaxa:
compile <nume_fiçier> | <çablon> [encrypt] [nodebug]
Comanda poate acÆiona asupra unui singur fiçier surså precizat prin adverbul <nume_fiçier>
sau asupra unui grup de fiçiere surså care poate fi identificat prin adverbul <çablon>. Implicit
codul obÆinut în urma compilårii nu este cifrat. Explicit el poate fi cifrat dacå se precizeazå clauza
encrypte. Implicit se genereazå un cod care permite vizualizarea execuÆiei programului în
fereastra trace. Pentru a micçora dimensiunea acestui cod la 2 octeÆi pentru fiecare linie surså
se poate folosi clauza nodebug. În acest caz nu se va mai putea folosi fereastra trace.
Controlul compilårii
PuteÆi controla compilarea folosind urmåtoarele comenzi çi funcÆii:
9 PuteÆi salva mesajele de eroare obÆinute în urma compilårii într-un fiçier de texte
cu acelaçi nume ca çi fiçierul 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 PuteÆi construi capcane pentru erori. O capcanå pentru erori opreçte execuÆia
programului atunci când 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 subpro-
gram: do <nume_program>. Subprogramul poate fi scris în fiçierul surså al progra-
mului (ca procedurå) sau într-un fiçier separat. Dupå executarea subrutinei, programul
va fi reluat cu instrucÆiunea imediat urmåtoare dupå cea în care a apårut eroarea. În
cadrul subrutinei de eroare pot fi obÆinute informaÆii despre eroare utilizând ca
parametri funcÆiile: error(), message(), lineno() çi program():
error() - furnizeazå numårul erorii detectate de capcana on error (rezultat numeric).
message() - furnizeazå mesajul de eroare (fårå parametru) sau conÆinutul liniei
care a cauzat eroarea (dacå se foloseçte parametrul 1). Rezultatul este de tip çir
de caractere.
lineno() - furnizeazå numårul relativ al liniei programului în curs de execuÆie
(rezultat numeric). Se numårå toate liniile, inclusiv liniile de comentarii çi liniile vide.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 193

FuncÆia poate fi utilizatå pentru a crea puncte de întrerupre (breakpoints), adicå


instrucÆiuni la care så se opreascå execuÆia programului pentru a fi depanat. Ea
permite oprirea programului la o linie specificatå prin numårul såu <expN>:
lineno()=<expN>.
program() - furnizeazå numele programului în execuÆie sau al programului care
se executa când a apårut eroarea. Rezultatul este de tip çir de caractere.
InformaÆiile furnizate de aceste funcÆii sunt utile pentru depanarea programului în
fereastra debug.

1.3.3. Lansarea în execuÆie a programului


Pentru a produce rezultate programul trebuie încårcat în memoria internå çi lansat în
execuÆie cu comanda do care are sintaxa:
do <nume_fiçier_1> [ with <listå_parametri>] [in <nume_fiçier_2>]
Comanda lanseazå în execuÆie programul
care se aflå în fiçierul <nume_fiçier_1>. !
Acest fiçier poate så aibå extensia implicitå Folosind facilitatea de autodocumentare aflaÆi
.prg (fiçier program surså FoxPro), .fxp (fi- ordinea în care comanda do alege programul
çier cod obiect FoxPro), .exe (fiçier executa- pe care îl lanseazå în execuÆie în funcÆie de
bil) sau .app (fiçier de aplicaÆii FoxPro). Impli- extensia fiçierului în care este memorat.
cit se executå programul din acest fiçier care
este cåutat pe disc în directorul curent sau în directorul specificat în identificatorul fiçierului. În
acest caz directorul specificat devine director curent. Explicit, se executå procedura cu numele
<nume_fiçier_1> care se gåseçte în fiçierul de programe <nume_fiçier_2> precizat în clauza in.
ObservaÆii:
1. Dacå se doreçte execuÆia unui fiçier care conÆine comenzi pentru meniuri, formate de
ecran sau interogåri trebuie precizatå extensia fiçierului (.mpr, .spr, qpr).
2. ExecuÆia unui program apelat prin comanda do se terminå atunci când se întâlneçte
una dintre urmåtoarele situaÆii:
9 o comandå Return - care redå controlul unui alt modul.
9 o comandå Cancel - care abandoneazå execuÆia programului çi redå controlul
ferestrei de comenzi (comanda elibereazå toate variabilele de memorie);
9 o comandå Quit - care întrerupe execuÆia programului çi redå controlul sistemului
de operare.
9 o comandå Do - care redå controlul modului apelat.
9 sfârçitul fiçierului care conÆine programul (eof()=.T.)

1.4. Modularizarea aplicaţiilor


AÆi învåÆat deja cå atunci când construiÆi o aplicaÆie este avantajos så o descompuneÆi în
subprobleme. Aceastå operaÆie este necesarå deoarece:
a O secvenÆå de instrucÆiuni se repetå de mai multe ori în cadrul unui program.
194 Informatică

b. O anumitå operaÆie este necesarå în mai multe programe, cum sunt de exemplu
diferite operaÆii matematice (extragerea radicalului, extragerea pårÆii întregi sau a pårÆii
fracÆionare dintr-un numår real etc.), diferite operaÆii cu çiruri de caractere (extragerea
unui subçir dintr-un çir, çtergerea unui subçir dintr-un çir, inserarea unui subçir într-un
çir etc.), diferite operaÆii cu fiçiere (deschiderea unui fiçier, închiderea unui fiçier,
testarea sfârçitului de fiçier etc.).
c. Pentru simplificare, orice problemå poate fi descompuså în subprobleme folo-
sind tehnica top-down de proiectare a algoritmilor. Descompunerae poate continua
pânå când se obÆin subprobleme cu rezolvare imediatå çi care sunt independente
unele de altele, astfel încât programele cu care vor fi descrise så fie uçor de conceput
çi depanat, iar ulterior, când se schimbå unele cerinÆe, så fie uçor de dezvoltat.
În anii precedenÆi de studiu aÆi aflat cå subproblemele obÆinute pot fi descrise prin unitåÆi
de programe care se mai numesc çi module. AÆi mai învåÆat cå modulele se clasificå
astfel:
9 Modul apelant. Este modulul care Modul apelant Transfer Modul apelat
pentru rezolvarea propriei probleme control
apeleazå la alte module, fiecare din-
tre ele rezolvând o anumitå subpro-
blemå. La apelare, el transferå con-
trolul modului apelat.
9 Modul apelat. Este un modul la ca- Revenire
re apeleazå un alt modul pentru a-i control
rezolva o subproblemå. Dupå ce îçi
terminå execuÆia, el redå controlul modulului apelant.
În Visual FoxPro, la fel ca çi în versiunile anterioare de FoxPro existå douå metode de a
descompune o problemå în subprobleme (module):
9 ConstruiÆi modulele sub formå de programe independente. Fiecare program va fi
scris într-un fiçier separat. Aceste programe se pot apela unele pe altele folosind
comanda do. Se obÆin astfel comenzi do imbricate. Comanda do acceptå 128 de
niveluri de imbricare (32 de niveluri în variantele anterioare de FoxPro).
9 ConstruiÆi modulele sub formå de subprograme, la fel ca çi în limbajele clasice de
programare. Aceste subprograme pot fi grupate în biblioteci de subprograme.

1.4.1. Controlul execuÆiei modulelor


Folosind comanda return puteÆi så controlaÆi modul în care redaÆi 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 prin-
cipal (nivel 0 pentru comanda do) dacå precizaÆi clauza to master, unui alt modul identificat
prin <nume_program> dacå precizaÆi clauza to sau puteÆi returna cåtre modulul apelant o
valoare precizatå prin <exp> dacå modulul apelat este un subprogram de tip funcÆie.
Executarea unui modul poate fi controlatå prin comenzile Return , Cancel , Quit çi:
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 195

9 Comanda Suspend - care suspendå (întrerupe) execuÆia unui program. În timpul


suspendårii execuÆiei se pot executa alte comenzi, se pot vizualiza variabile de memo-
rie etc. Variabilele de memorie create în timpul suspendårii sunt variabile private
(locale). Comanda este utilå în depanarea programelor. ExecuÆia programului poate fi
reluatå din punctul în care a fost întreruptå cu comanda resume.
9 Comandå Resume - care reia execuÆia unui program suspendat începând 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 doreçte
executarea reptatå a unei comenzi pânå când este îndeplinitå o condiÆie.
Pentru depanarea programelor (detectarea çi eliminarea erorilor) puteÆi urmåri procesul
de execuÆie folosind ferestrele:
9 Trace. Permite urmårirea procesului de execuÆie a unui program sau a unui formular.
ExecuÆia poate fi urmåritå çi pas cu pas.
9 Debug. Permite testarea funcÆiilor, vizualizarea
!
variabilelor de memorie în timpul execuÆiei unui Folosind facilitatea de autodocumen-
modul, verificarea expresiilor etc. Fereastra are tare aflaÆi informaÆii despre modul în care
puteÆi 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 testaÆi în timpul execuÆiei
programului, iar panoul din partea dreaptå pentru vizualizarea valorii lor.
La primele versiuni de Visual FoxPro ferestrele se deschid cu opÆiunea Trace Window,
respectiv Debug Window din meniul Tools. DeschideÆi aceste ferestre înaintea comenzii
do cu care lansaÆi în execuÆie programul pe care vreÆi så-l testaÆi. În versiunile mai mari
de 4, în fereastra Debugger a aplicaÆiei (care poate fi deschiså cu opÆiunea Debugger
din meniul Tools) pot fi deschise mai multe ferestre document care vå ajutå så urmåriÆi
modul în care se executå programul: Trace - în care se afiçeazå instrucÆiunile progra-
mului, Watch - în care sunt afiçate valorile variabilelor de memorie folosite de program,
Locals - în care sunt afiçate valorile variabilelor de memorie locale folosite de subprogra-
mul care se executå, Call Stack - stiva programelor în execuÆie (utilå în cazul unei apli-
caÆii modularizate deoarece permite vizualizarea modului în care se apeleazå modulele).
Indiferent de versiunea de Visual FoxPro folositå, depanatorul de programe vå oferå
urmåtoarele facilitåÆi:
9 Rularea pas cu pas (step over). ExecuÆia programului este suspendatå dupå execuÆia
fiecårei instrucÆiuni permiÆând programatorului så observe modul în care s-a executat in-
strucÆiunea. ExecuÆia urmåtoarei instrucÆiuni se face numai la cererea programatorului.
9 Rularea cu vitezå încetinitå (throttle). ExecuÆia programului se face în mod continuu,
dar dupå execuÆia fiecårei instrucÆiuni este introdus un timp de açteptare (a cårui valoare
este precizatå de programator). Acest mod de rulare a programului permite programa-
torului så vizualizeze valorile unor variabile mai rapid decât în cazul rulårii pas cu pas.
9 Rularea continuå pânå la intâlnirea unui punct de întrerupere (breackpoint). Exe-
cuÆia programului se face în mod continuu pânå la întâlnirea unui punct de întrerupere,
dupå care execuÆia poate fi reluatå (resume) sau anulatå (cancel). Punctele de întreru-
pere sunt create de cåtre programator în interiorul programului prin precizarea urmå-
196 Informatică

toarelor situaÆii: execuÆia unei anumite linii din program (care creeazå puncte de între-
rupere permanente), schimbarea valorii unei expresii, evaluarea unei expresii la o a-
numitå valoare, terminarea execuÆiei unui anumit modul (step out) sau producerea
unui anumit eveniment în timpul execuÆiei programului.

1.4.2. Domeniul de vizibilitate al identificatorilor


Deoarece atât în modulul apelant, cât çi în modulul apelat sunt definiÆi mai mulÆi identi-
1
ficatori pentru variabilele çi tablourile de memorie , apare urmåtoarea problemå: care
este domeniul de vizibilitate al identificatorilor în funcÆie de locul çi modul în care sunt
declaraÆi? AÆi învåÆat deja cå domeniul de vizibilitate al unui identificator este regiu-
nea din interiorul programului în care un identificator este vizibil (poate fi referit în
cadrul unei operaÆii de consultare sau modificare).
În Visual FoxPro în funcÆie de domeniul de vizibilitate, variabilele de memorie se clasificå în:
9 Globale sau publice. Ele sunt vizibile atât în modulul în care au fost declarate, cât çi
în modulele activate de acesta, din momentul în care au fost declarate çi pânå când
modulul îçi terminå execuÆia. Se recomandå folosirea lor atunci când unele date sunt
folosite în comun de mai multe module ale aplicaÆiei. Declararea lor se face cu
instrucÆiunea Public care are urmåtoarea 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.
9 Locale. Sunt vizibile numai în modulul în care au fost create. La terminarea execuÆiei
modulului, ele vor fi distruse, eliberându-se zona de memorie pe care o ocupau.
Folosirea lor este utilå pentru a se elimina confuziile care apar atunci când se
folosesc variabile cu acelaçi nume în douå module diferite. Ele pot fi create cu
instrucÆiunea Local care are urmåtoarea 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.
9 Private. Sunt ascunse de modulele superioare. Se recomandå folosirea lor atunci
când doriÆi så memoraÆi în module diferite, valori diferite, folosind acelaçi identifica-
tor. Ascunzând o variabilå sau un tablou de memorie, operaÆiile de modificare a
valorilor executate în modulul curent nu vor fi percepute de modulele superioare.
Declararea lor se face cu instrucÆiunea Private care are urmåtoarea sintaxå:
private <listå_variabile_memorie>

1
În continuare, se va folosi numai termenul variabile de memorie çi se va subînÆelege cå acele
operaÆii se referå çi la tablouri de memorie.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 197

pentru un grup de variabile çi tablouri de memorie care nu poate fi descris cu ajuto-


rul 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.
9 Regionale. Sunt vizibile într-o anumitå regiune a modulului. Se recomandå folosi-rea
lor atunci când doriÆi så memoraÆi în regiuni diferite ale modulului valori diferite
folosind acelaçi identificator. Pentru aceasta trebuie create mai întâi regiunile
modulului folosind directiva de compilare #Region astfel:
#region <numår_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 instrucÆiunea Regional care are
sintaxa:
regional <listå_variabile_memorie>
ObservaÆii:
1. InstrucÆiunile 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 experienÆa cåpåtatå prin studiul unui limbaj de programare structurat çtiÆi deja cå
transmiterea datelor între modulele unei aplicaÆii 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 cåtre modulul apelat çi prin care
primeçte rezultatele obÆinute în urma executårii 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 sim-
bolicå folositå în interiorul modulului, adicå trebuie precizatå lista de parametri for-
mali. Pentru declararea parametrilor formali veÆi folosi instrucÆiunea Parameterss
sau Lparameters care trebuie scriså ca primå instrucÆiune în modulul apelat. Deo-
sebirea dintre cele douå instrucÆiuni 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. InstrucÆiunile au urmåtoarea sintaxå:
parameters | lparameters <listå_parametri_formali>
9 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 respectând regula de corespondenÆå. De aceea în cele


douå liste de parametri trebuie så se respecte aceeaçi succesiune a parametrilor çi
acelaçi tip de date pentru fiecare pereche de parametri. Se acceptå înså ca lista de
parametri actuali så conÆinå mai puÆini parametri decât lista de parametri formali (dar nu
mai mulÆi parametri). În acest caz, parametrii formali cårora nu li s-a atribuit o valoare
folosind regula de corespondnÆå vor fi iniÆializaÆi cu valoarea logicå .F..
PuteÆi afla numårul de parametri transmiçi unui modul folosind funcÆia 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
modificåri aduse în modulul apelat. La sfârçitul executårii modulului apelat, conÆinutul
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
modificåri aduse în modulul apelat. La sfârçitul executårii modulului apelat, conÆinutul
variabilelor de memorie din modulul apelant, folosite ca parametri, nu este actualizat
cu conÆinutul 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
ÇtiÆi deja cå din punct de vedere al valorilor returnate modulului apelant, subprogramele
se clasificå în proceduri (care returneazå un rezultat, nici un rezultat sau mai multe
rezultate prin intermediul listei de parametri) çi funcÆii (care returneazå un singur rezultat
prin numele såu). Tipul subprogramului determinå çi modul în care este activat (lansat în
execuÆie): procedura printr-o instrucÆiune de apel çi funcÆia în cadrul unei expresii unde
este folositå ca operand. Din punct de vedere al constructorului, subprogramele se
clasificå în subprograme de sistem çi subprograme utilizator.
Limbajul gazdå Visual FoxPro permite lucrul cu:
Proceduri Î utilizator
FuncÆii Î de sistem
Î utilizator (UDF - User Defined Functions)
Construirea unei proceduri sau a unei funcÆii utilizator se face astfel:
procedure | function <nume_procedurå>|<nume_funcÆie>
<corp-procedurå> | <corp_funcÆie>
[return [<expresie>]]

Prin comanda procedure , respectiv function se defineçte antetul subprogramului


(tipul çi numele). Dacå la sfârçitul subprogramului nu se scrie instrucÆiunea return (care
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 199

semnificå terminarea subprogramului) acesta se considerå terminat atunci când se


întâlneçte un alt antet de subprogram sau sfârçitul fiçierului. Adverbul <expresie> din
comanda return reprezintå valoarea întoarså de funcÆie sau procedurå prin numele såu.
Dacå nu se precizeazå valoarea returnatå aceasta va fi .T..
Activarea unei proceduri se face cu instrucÆiunea:
do <nume_procedurå> with <listå_parametri>
iar a unei funcÆii se face fie prin instrucÆiunea do, fie ca operand într-o expresie, fie folosind
comanda =. Dacå o procedurå furnizeazå un singur rezultat, returnat printr-o variabilå de
memorie cåreia i se atribuie valoarea expresiei din comanda return, ea poate fi activatå la
fel ca o funcÆie, ca operand într-o expresie.
Subprogramele pot fi scrise: !
9 În acelaçi fiçier cu programul principal.
Folosind facilitatea de autodocumentare aflaÆi
Subprogramele se vor scrie dupå in- ordinea în care comanda do alege subprogra-
strucÆiunile programului principal. mul pe care îl lanseazå în execuÆie în funcÆie de
9 Într-o bibliotecå de programe. Bibliote- fiçierul în care este memorat.
ca de programe din Visual FoxPro se
numeçte fiçier 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 cårui valoare se stabileçte cu comanda:
set procedure to [<nume_fiçier_proceduri>]
unde <nume_fiçier_proceduri> este numele bibliotecii care se deschide. Comanda:
set procedure to
fårå parametru închide biblioteca deschiså.
Transmiterea parametrilor se va face implicit prin referinÆå dacå activaÆi subprogramul cu
comanda do çi prin valoare, dacå activaÆi subprogramul ca un operand. PuteÆi så
controlaÆi 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 stabileçte cu comanda set:
set udfparms to reference | value
ObservaÆie:
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Æå.

CreaÆi un fiçier care conÆine un program surså çi-l lansaÆi în execuÆie


1. CreaÆi fiçierul surså, îl compilaÆi çi-l lansaÆi în execuÆie folosind meniul aplicaÆiei:
200 Informatică

„ DeschideÆi o fereastrå a editorului de texte încorporat astfel: alegeÆi opÆiunea


New... ∈ File; se deschide caseta de dialog New în care alegeÆi din grupul de bu-
toane radio File Type opÆiunea Program çi apoi acÆionaÆi declançatorul New File.
„ Se deschide fereastra de editare. Folosind operaÆia Save As atribuiÆi fiçierului
numele test1.prg.
„ ScrieÆi în fereastra de editare textul programului din exemplul prezentat la struc-
tura liniarå. CompilaÆi fiçierul surså cu opÆiunea de meniu Compile∈ Program.
„ SalvaÆi çi închideÆi fereastra de editare fie cu opÆiunea de meniu, fie folosind
butonul de închidere al ferestrei, fie apåsând tastele ctrl+w.
„ LansaÆi în execuÆie programul cu opÆiunea de meniu Do...∈ Program.
2. CreaÆi fiçierul surså, îl compilaÆi çi-l lansaÆi în execuÆie folosind limbajul de comandå:
„ DeschideÆi o fereastrå a editorului de texte încorporat cu comanda:
modify command test2
„ Se deschide fereastra de editare care are titlul test2.prg. ScrieÆi în aceastå
fereastrå textul programului din exemplul prezentat la structura alternativå simplå.
SalvaÆi çi închideÆi fereastra de editare.
„ CompilaÆi fiçierul surså cu comanda:
compile test2
„ LansaÆi în execuÆie programul cu comanda:
do test2
„ DeschideÆi fereastra editorului de texte încorporat cu comanda:
modify command test2
„ SalvaÆi conÆinutul acestui fiçier sub numele test3.prg. ÎnchideÆi fereastra de editare.
„ CompilaÆi fiçierul surså cu comanda:
compile test2 encrypt
„ DeschideÆi douå ferestre de editare în care încårcaÆi cele douå fiçiere obiect obÆi-
nute în urma compilårii: test2.fxp çi test3.fxp. Ele s-au obÆinut în urma compilårii
aceluiaçi program surså, dar folosind metode diferite de compilare. ComparaÆi ce-
le douå fiçiere obiect obÆinute.
3. CreaÆi fiçierele surså, le compilaÆi çi le lansaÆi în execuÆie pentru toate exemplele
prezentate la secÆiunea Structuri de control.
CreaÆi o capcanå pentru erori
Så se construiascå o capcanå pentru erori. În fiçierul surså exemplu.prg se vor scrie
instrucÆiunile programului (modulul apelant), iar în fiçierul surså eroare.prg instrucÆiunile
subrutinei de eroare (modulul apelat).
1. CreaÆi fiçierul surså exemplu.prg çi îl compilaÆi:
if set('talk')='on' on error do eroare with;
set talk off error(),message(),message(1),;
endif program(), lineno()
if set('bell')='off' open database compania
set bell on use sedinte
endif apend && In aceasta;
* prin urmatoarea instructiune linie va fi detectata o eroare
* se activeaza un subprogram ? program()
* care a fost scris într-un wait ''
* fisier separat:eroare.prg goto top
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării 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. CreaÆi fiçierul surså eroare.prg çi îl compilaÆi:
parameter nrer, mesaj1,; ?? mesaj2
mesaj2, numeprog, nrlinie ? 'Programul cu eroarea: '
clear ?? numeprog
? 'Eroare cu numarul: ' ? 'Linia cu numarul: '
?? ?? nrlinie
str(nrer,4)+replicate(chr(7),3) wait ''
? 'Mesaj de eroare: ' clear
?? mesaj1 return
? 'Comanda eronata: '
3. LansaÆi în execuÆie programul exemplu. ObservaÆi modul în care sunteÆi informaÆi
despre erorile de compilare.
TestaÆi modul în care pot fi folosite variabilele de memorie ascunse
ScrieÆi urmåtorul program surså în fiçierul ex1.prg çi-l lansaÆi în execuÆie:
set talk off a1 = 100
a1 = 10 a2 = 200
a2 = 20 ? 'Afiseaza variabilele din;
do ascunde procedura'
? 'Afiseaza variabilele din; ? 'a1= '
program dupa revenire din; ?? a1 && Afiseaza 100
procedura' ? 'a2= '
? a1, a2 && Afiseaza 10, 200 ?? a2 && Afiseaza 200
procedure ascunde return
private a1
TestaÆi modul în care pot fi folosite variabilele de memorie publice
ScrieÆi urmåtorul program surså în fiçierul ex2.prg çi-l lansaÆi în execuÆie. ObservaÆi valo-
rile afiçate. ObservaÆi comportamentul variabilelor publice. ComparaÆi acest exemplu de
program (în care variabilele de memorie a1 çi a2 au fost declarate publice) cu exemplul
anterior în care nu au fost declarate publice. Ce concluzie trageÆi? ObservaÆi cå prin co-
manda release all nu sunt eliberate variabilele publice, iar prin comanda release a1,a2
sunt eliberate variabilele de memorie specificate în listå, chiar dacå sunt publice.
set talk off release all
public a1,a2 display memory like a?
a1 = 10 release a1,a2
a2 = 20 display memory like a?
do ascunde procedure ascunde
? 'Afiseaza variabilele din; private a1
program dupa revenire din; a1 = 100
procedura' a2 = 200
? a1, a2 && Afiseaza 10, 200 ? 'Afiseaza variabilele din;
procedura'
202 Informatică

? 'a1 = ' ?? a2 && Afiseaza 200


?? a1 && Afiseaza 100 return
? 'a2 = '
TestaÆi modul în care pot fi folosite variabilele de memorie regionale
ScrieÆi urmåtorul program surså în fiçierul ex3.prg çi-l lansaÆi în execuÆie:
* 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
RezolvaÆi problemele cu ajutorul subprogramelor
Notåm combinåri de n luate câte m cu C(n,m). Calcularea lor se face folosind urmåtoarea
formulå: C(n,m)=n!/(m!*(n-m)!)). ObservaÆi cå în formulå se repetå de trei ori calculul facto-
rialului. Pentru acest calcul se va folosi un subprogram. ScrieÆi urmåtorul program surså în
fiçierul ex4.prg çi-l lansaÆi în execuÆie. Subprogramul folosit este de tip procedurå çi va fi scris
dupå instrucÆiunile 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
ScrieÆi urmåtorul program surså în fiçierul ex5.prg çi-l lansaÆi în execuÆie. Subprogramul
folosit este de tip funcÆie. ObservaÆi modul în care a fost rezolvatå aceeaçi 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 prelucrării datelor 203

function fact fact=fact*i


parameters j endfor
fact=1 return fact
for i=1 to j
TestaÆi modul în care puteÆi folosi informaÆiile furnizate de funcÆia parameters()
ScrieÆi urmåtorul program surså în fiçierul ex6.prg çi-l lansaÆi în execuÆie.
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
TestaÆi modul în care se face transferul parametrilor între module
ScrieÆi urmåtorul program surså în fiçierul ex7.prg çi-l lansaÆi în execuÆie.
clear n=10
if set('talk')='on' ?test(n),n && Afiseaza 70, 70
set talk off return
endif
set udfparms to value function test
n=10 parameters y
?test(n),n && Afiseaza 70, 10 y=2*y+50
set udfparms to reference return y
TestaÆi modul în care puteÆi activa o procedurå la fel ca çi o funcÆie
Procedura data furnizeazå un format românesc de afiçare a datei prin chiar numele såu.
ScrieÆi urmåtorul program surså în fiçierul ex8.prg çi-l lansaÆi în execuÆie.
set talk off set date to british
set century on accept 'Data (zz/ll/aaaa):' to dt
204 Informatică

? data(ctod(dt)) luna='noiembrie'
procedure data case month(d)=12
parameter d luna='decembrie'
do case endcase
case month(d)=1 do case
luna='ianuarie' case lower(cdow(d))='monday'
case month(d)=2 ziua='luni'
luna='februarie' case lower(cdow(d))='tuesday'
case month(d)=3 ziua='marti'
luna='martie' case
case month(d)=4 lower(cdow(d))='wednesday'
luna='aprilie' ziua='miercuri'
case month(d)=5 case lower(cdow(d))='thursday'
luna='mai' ziua='joi'
case month(d)=6 case lower(cdow(d))='friday'
luna='iunie' ziua='vineri'
case month(d)=7 case lower(cdow(d))='saturday'
luna='iulie' ziua='sambata'
case month(d)=8 case lower(cdow(d))='sunday'
luna='august' ziua='duminica'
case month(d)=9 endcase
luna='septembrie' dat=ziua+', '+str(day(d),2)+;
case month(d)=10 ' '+luna+' '+str(year(d),4)
luna='octombrie' return dat
case month(d)=11
ConstruiÆi çi testaÆi o bibliotecå
ConstruiÆi în fiçierul vectori.prg o bibliotecå cu operaÆii pentru vectori care så conÆinå: pro-
ceduri pentru citirea unui vector, pentru afiçarea unui vector, pentru concatenarea doi vectori,
pentru interclasare a doi vectori, pentru divizarea unui vector, o funcÆie pentru cåutarea unui
element cu o valoare precizatå într-un vector (funcÆia va furniza un rezultat numeric: prima po-
ziÆie în care a fost gåsit elementul în vector sau -1 dacå nu a fost gåsit) çi o procedurå de
cåutare care va comunica toate poziÆiile în care a fost gåsit un element cu o valoare precizatå
(se va folosi dacå existå mai multe elemente cu aceeçi valoare în vector). Dupå ce aÆi scris
fiçierul surså, îl veÆi compila ca så fiÆi siguri cå nu aveÆi erori de sintaxå.
procedure creare ?
parameters a,n i=1
local i do while i<=n-1
? 'Creati un vector cu n elemente' for j=1 to 10
input 'n= ' to n ?? str(a(i),6)+', '
dimension a(n) i=i+1
for i=1 to n if i=n
input 'a('+str(i,2)+')= ' to; exit
a(i) endif
endfor endfor
return if i<=n-1
procedure afisare ?
parameters a,n endif
local i,j enddo
? 'Se afiseaza un vector cu ', ?? str(a(n),6)
str(n,2)+' elemente' return
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 205

procedure concatenare k=-1


parameters a,b,c,n,m for i=1 to n
dimension c(n+m) if a(i)=x
?acopy(a,c,1,n,1) k=i
?acopy(b,c,1,m,n+1) exit
procedure divizare endif
parameters a,b,c,n,m endfor
dimension b(m) return k
dimension c(n-m) procedure cautv
?acopy(a,b,1,m,1) parameters a,n,x,t,k
?acopy(a,c,m+1,n-m,1) local i,j
return k=-1
procedure interclasare j=0
parameters a,b,c,n,m for i=1 to n
dimension c(n+m) if a(i)=x
?acopy(a,c,1,n,1) j=j+1
?acopy(b,c,1,m,n+1) dimension t(j)
?asort(c) t(j)=i
return k=j
function caut endif
parameters a,n,x endfor
local i return
TestaÆi apoi biblioteca folosind urmåtoarele programe: test1.prg pentru testarea operaÆiei
de cåutare, test2.prg pentru testarea operaÆiei de concatenare, test3.prg pentru testarea
operaÆiei de interclasare çi test4.prg pentru testarea operaÆiei de divizare.
test1.prg
set talk off else
? 'Cu acest program lucrati cu; ? 'Prima pozitie in care se;
vectori cu elemente numerice' gaseste valoarea este ';
public m,p,x,v(1),u(1) +str(caut(v,m,x),2)
clear do cautv with v,m,x,u,p
note Se deschide biblioteca if p>1
set procedure to vectori ? 'Valoarea apare in mai;
do creare with v,m multe pozitii'
do afisare with v,m ? 'Pozitiile gasite sunt:'
? 'Puteti cauta o valoare; do afisare with u,p
numerica x in vector' endif
input 'x= ' to x endif
?? 'Veti afla prima pozitie in; note Se închide biblioteca
care a fost gasita' set procedure to
if caut(v,m,x)=-1 return
? 'Nu exista elementul cautat'
test2.prg
set talk off vectori numerici'
public p,q,x(1),y(1),z(1) ? 'Comunicati primul vector'
clear do creare with x,p
set procedure to vectori ? 'Comunicati al doilea vector'
? 'Programul concateneaza doi; 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
scrieÆi do interclasare with x,y,z,p,q
test4.prg
set talk off input 'Numarul de elemente;
public p,q,x(1),y(1),z(1) preluate de primul vector = ';
clear to q
set procedure to vectori do divizare with x,y,z,p,q
? 'Programul divizeaza un; ?'Primul vector obtinut'
vector numeric in doi vectori' do afisare with y,q
? 'Comunicati vectorul care se; ?'Al doilea vector obtinut'
divizeaza' do afisare with z,p-q
do creare with x,p 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 afiçeze 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. ScrieÆi un program prin care cåutaÆi un element într-o matrice. Dimensiunea matricei,
elementele matricei çi valoarea cåutatå se introduc de la tastaturå. Programul va
afiça numårul de ordine al elementului, numårul liniei çi numårul coloanei în cazul în
care se gåseçte elementul çi un mesaj dacå nu se gåseçte.
3. Så se scrie un program pentru rezolvarea ecuaÆiei de gradul II cu coeficienÆi numere
reale. CoeficienÆii a,b,c se introduc de la tastaturå. Programul trebuie så permitå
reluarea rezolvårii problemei pentru mai multe seturi de date de intrare (seturi de
coeficienÆi) çi så calculeze atât rådåcinile reale, cât çi cele complexe.
4. Så se scrie un program care så çteargå înregistrårile dintr-un tabel pentru care un
câmp de tip çir de caractere este vid. Se presupune cå tabelul are cel puÆin un câmp de
tip çir de caractere care poate fi vid. Numele tabelului çi numele câmpului se introduc
de la tastaturå (folosiÆi tabele din baza de date Compania pentru a testa programul).
5. Så se scrie un program care så realizeze urmåtoarele prelucråri asupra unui çir de
caractere introdus de la tastaturå:
a) Så se numere cuvintele din text în urmåtoarele douå variante:
a1) cuvintele sunt separate printr-un singur spaÆiu;
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 207

a2) cuvintele sunt separate prin douå sau mai multe spaÆii.
b) Så se numere caracterele din text çi så se precizeze:
b1) câte consoane sunt;
b2) câte vocale sunt;
b3) câte cifre sunt;
b4) câte semne speciale sunt.
c) Så se înlocuiascå în text un çir de caractere cu un alt çir de caractere. Cele douå
çiruri de caractere se introduc de la tastaturå. Se vor înlocui toate apariÆiile çirului
de caractere precizat în urmåtoarele cazuri:
c1) nu conteazå diferenÆa dintre literele mari çi mici;
c2) conteazå diferenÆa dintre literele mari çi mici;
c3) nu conteazå dacå çirul de caractere este un cuvânt+cerinÆa c2;
c4) çirul de caractere este un cuvânt+ cerinÆa c2.
d) Så se afiçeze în ordine alfabeticå cuvintele din text.
e) Så se numere cuvintele care au m caractere. Valoarea lui m se introduce de la
tastaturå.
f) Så se afiçeze pentru fiecare literå, câte litere sunt în text (frecvenÆa de apariÆie a
literelor). Afiçarea se va face pe ecran sub forma:
Literea a sau A ............ 20
Literea b sau B ............ 5
........................................
Lista se va afiça sortat în douå moduri: în ordinea alfabeticå a literelor çi în
ordinea descrescåtoare a frecvenÆei de apariÆie.
g) Så se afiçeze litera care are cea mai mare frecvenÆå de apariÆie în text.
h) Så se afiçeze media apariÆiilor çi abaterea medie påtraticå. Ce informaÆii obÆineÆi
comparând cele douå valori obÆinute.
6. Så se realizeze un tabel bazå de date în care så se memoreze evoluÆia cursului leu-euro
din luna precedentå. Pentru fiecare zi din lunå se vor memora urmåtoarele informaÆii: data,
valoarea cursului, indicele cu bazå fixå (raportul dintre cursul zilei çi cursul din ziua de în-
ceput a perioadei de analizå), indicele cu bazå în lanÆ (raportul dintre cursul zilei çi cursul din
ziua precedentå), sporul cu bazå fixå (diferenÆa dintre cursul zilei çi cursul din ziua de în-
ceput a perioadei de analizå), sporul cu bazå în lanÆ (diferenÆa dintre cursul zilei çi cursul din
ziua precedentå). Crearea structurii tabelului çi încårcarea câmpurilor pentru datå çi curs se
va face la nivel de limbaj de comandå. Pentru calcularea celorlalte câmpuri se va folosi un
program. Så se afiçeze urmåtoarele informaÆii folosind datele din tabel: ziua cu cel mai
mare curs, ziua cu cel mai mic curs, media aritmeticå a cursului çi abaterea medie påtraticå
a cursului. Aceste informaÆii se vor furniza în douå moduri: cu ajutorul limbajului de
comandå çi cu ajutorul unui program.
7. Så se realizeze un tabel bazå de date în care så se memoreze situaÆia notelor çi a mediilor
la disciplina Informaticå a elevilor dintr-o claså. Tabelul va conÆine urmåtoarele informaÆii:
numele çi prenumele elevului, poziÆia lui din catalog, cinci note pentru primul semestru, cinci
note pentru cel de al doilea semestru, douå note pentru tezele de pe cele douå semestre,
mediile de pe cele douå semestre çi media anualå. Crearea structurii tabelului çi încårcarea
câmpurilor pentru numele çi prenumele elevului, pentru poziÆia lui din catalog, pentru cele
maxim 10 note din cele douå semestre çi pentru cele douå note de la tezele semestriale se
va face la nivel de limbaj de comandå. Pentru calcularea mediilor se va folosi un program.
La calcularea mediilor trebuie så ÆineÆi cont de urmåtoarele:
208 Informatică

a) valorile mediilor semestriale sunt de tip întreg, iar valoarea mediei generale este
de tip real;
b) este posibil ca un elev så primeascå mai puÆin de cinci note;
c) teza are ponderea de 25% din media semestrialå.
ScrieÆi un program care så afiçeze urmåtoarele informaÆii:
a) corigenÆii de pe fiecare semestru çi corigenÆii anuali;
b) o listå ordonatå alfabetic dupå numele çi prenumele elevilor care så conÆinå
numele, prenumele, mediile semestriale çi media anualå;
c) o listå ordonatå descrescåtor dupå media anualå care så conÆinå numele, prenu-
mele, mediile semestriale çi media anualå;
d) numele elevului cu cea mai mare medie pe semestrul 1, pe semestrul 2 çi res-
pectiv pe an;
e) media generalå a clasei çi abaterea medie påtraticå a mediilor pe fiecare semes-
tru çi pe an (ce concluzie trageÆi prin compararea acestor medii?).
8. CompletaÆi biblioteca vectori cu urmåtaorele subprograme pentru operaÆii cu vectori:
proceduri pentru adunarea çi produsul vectorial a doi vectori çi funcÆii pentru produsul
scalar a doi vectori çi pentru suma çi produsul elementelor unui vector. TestaÆi noile
subprograme adåugate la bibliotecå.
9. ConstruiÆi o bibliotecå pentru operaÆii cu mulÆimi care så permitå executarea urmåtoare-
lor operaÆii: citirea çi afiçarea unei mulÆimi, reuniunea, intersecÆia, diferenÆa, diferenÆa si-
metricå, produsul cartezian a douå mulÆimi, cardinalul unei mulÆimi (numårul de elemen-
te), apartenenÆa unui element (a cårui valoare o veÆi comunica de la tastaturå) la o mul-
Æime. Pentru mulÆimi veÆi folosi tipul de date vector. Spre deosebire de un vector oarecare,
într-un vector care påstreazå elementele unei mulÆimi nu pot exista douå elemente cu
aceeaçi valoare.
10. ConstruiÆi o bibliotecå cu operaÆii cu çiruri de caractere în care så påstraÆi subpro-
grame pentru rezolvarea cerinÆelor de la problema 5. ConstruiÆi programe pentru
testarea acestei biblioteci.
11. Folosind editorul de texte Notepad vizualizaÆi conÆinutul fiçierelor clienÆi.dbf çi clienÆi.fpt.
ObservaÆi cå orice persoanå care vrea så citeascå datele din tabelele bazei de date poate
face acest lucru cu un simplu editor de texte. Cu puÆin efort poate identifica ce reprezintå
fiecare datå çi poate obÆine anumite informaÆii care pot fi secrete. Pentru a evita acest lucru
puteÆi codifica datele de tip alfanumeric (câmpurile de tip çir de caractere aflate în fiçierul cu
extensia .dbf çi câmpurile memo aflate în fiçierul cu extensia .fpt). VeÆi crea un cod simplu:
translataÆi cu o valoare stabilitå (de exemplu 15) codurile ASCII ale caracterelor. ConstruiÆi
douå subprograme: unul pentru codificare (pe care îl folosiÆi înainte de închiderea bazei de
date) çi unul pentru decodificare (pe care îl folosiÆi la deschiderea bazei de date). Çirurile de
caractere pot conÆine numai cifre, litere çi anumite semne speciale. Pentru a evita afiçarea
în çirurile de caractere codificate a altor caractere, puteÆi complica codul folosind pentru
acelaçi tip de caractere (cifre, litere sau semne speciale) o translatare circularå. De
exemplu, pentru literele mici consideraÆi cå dupå litera z urmeazå litera a; în acest mod,
pentru o translatare cu 15, în locul literei a (cod ASCII: 97) se va folosi litera p (cod ASCII
97+15=112), iar în locul literei z (cod ASCII: 122) se va
folosi litera o (cod ASCII 97-1+15=111).
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 209

# ÎncercaÆi:
Adevårat/Fals:
1. O procedurå utilizator din Visual FoxPro poate fi activatå ca o funcÆie.
2. În limbajul Visual FoxPro este implementatå structura repetitivå de tip repeat ... until.
3. Comenzile care permit redirectarea unei valori de pe ecran într-o variabilå de memorie
folosind clauza to creeazå variabila de memorie.
4. Variabilele de memorie pot fi definite oriunde în interiorul programului.
5. Printr-o comandå modify command puteÆi deschide mai multe ferestre de editare.
6. InstrucÆiunea exit redå controlul sistemului de operare.
7. InstrucÆiunea public creeazå variabile de memorie.
8. Printr-o comandå compile puteÆi compila un singur program.
CompletaÆi:
1. În instrucÆiunea alternativå generalizatå do case ... endcase cuvântul cheie ............ prece-
de instrucÆiunile care se vor executa dacå nici unul dintre cazuri nu a fost „adevårat”.
2. Comentariul inserat într-o linie a programului trebuie precedat de .................
3. InstrucÆiunea prin care puteÆi forÆa reevaluarea condiÆiei de terminare a unei structuri
repetitive este .....................
4. Pentru crearea unei capcane pentru erori folosiÆi comanda ........................
5. ConÆinutul liniei care a cauzat o eroare de compilare este furnizat de funcÆia ...............
6. PuteÆi så urmåriÆi execuÆia pas cu pas a unui program în fereastra ....................
7. Parametrii formali se declarå cu instrucÆiunea .................
8. AflaÆi numårul de parametri actuali transmiçi unui subprogram cu funcÆia ...................
9. DeschideÆi o bibliotecå de subprograme cu comanda ..........................
AlegeÆi råspunsurile corecte:
1. În funcÆie de context, într-un program Visual FoxPro caracterul = poate fi:
a) operator relaÆional
b) operator de atribuire
c) comandå
2. Dacå din mai multe acÆiuni posibile trebuie så se execute una singurå veÆi folosi:
d) instrucÆiuni if ... endif imbricate
e) instrucÆiunea do case ... endcase
f) instrucÆiunea scan ... endscan
3. Fraza „citeçte înregistrårile fiçierului pânå când ajungi la marcajul de sfârçit de fiçier“
poate fi descriså cu instrucÆiunea:
a) for i=1 to reccount() ... endfor
b) do while not eof() ... enddo
c) scan ... endscan
4. O variabilå de memorie declaratå „privatå“ cu instrucÆiunea private este:
a) o variabilå de memorie localå, vizibilå numai în modulul în care a fost creatå;
b) o variabilå vizibilå numai în regiunea de program în care a fost creatå;
c) o variabilå de memorie ascunså de modulele superioare.
5. Comanda return to master redå controlul:
a) modulului apelant b) modulului principal c) sistemului de operare
210 Informatică

6. Linia de comentarii începe cu:


a) note b) * c) &&
7. Dacå scrieÆi numele unui parametru între paranteze rotunde, transferul se va face prin:
a) referinÆå b) valoare c) adresare indirectå
RåspundeÆi:
1. RealizaÆi o comparaÆie între un limbaj de programare structurat studiat çi limbajul
gazdå Visual FoxPro. PuneÆi în evidenÆå asemånårile çi deosebirile referitoare la:
declararea datelor, structurile de control care pot fi folosite, comentarii, modularizarea
unei aplicaÆii (ç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 aplicaÆie în Visual FoxPro? Câte metode existå?
4. Câte tipuri de variabile de memorie sunt în funcÆie de domeniul de vizibilitate?

R åspunsuri:
Adevårat/Fals: 1-A; 2-F; 3-A; 4-A; 5-A; 6-F; 7-A; 8-F.
CompletaÆi: 1-otherwise; 2-&&; 3-loop; 4-on error; 5-message(1); 6-Trace; 7- parameters;
8-parameters(); 9-set procedure to<nume_biblioteca>.
AlegeÆi råspunsurile corecte: 1-a,b,c; 2- a,b; 3- a,b,c; 4-c; 5-b; 6-a,b; 7-b.

2 . P r o g r a m a r e a o r i e n t a tă p e o bi e c t e

2 . 1 . P r i n c i p i i l e p r o g r a m ăr i i o r i e n t a t e p e o b i e c t e

Programele de calculator prelucreazå informaÆii din lumea care ne înconjoarå. Lumea realå
este formatå din obiecte, iar omul interacÆioneazå cu ea prin intermediul acestor obiecte. O
fotografie prezintå çi ea un ansamblu de obiecte care sunt caracterizate înså numai de
proprietåÆi (formå, dimensiuni, culoare etc.), nu çi de acÆiuni. Ea este o reprezentare staticå
a lumii reale. Dar lumea care ne înconjoarå este o lume dinamicå în care fiecare obiect este
determinat de proprietåÆi, metode çi evenimente. Putem så ne gândim la proprietåÆi ca la
atributele obiectului, la metode ca la acÆiuni ale obiectului, iar la evenimente ca la råspun-
suri ale obiectului la acÆiunile omului asupra lui. Pentru a înÆelege mai bine ce înseamnå
proprietåÆile, metodele çi evenimentele så consideråm un obiect din viaÆa de zi cu zi: balo-
nul unui copil. Balonului i se pot asocia proprietåÆi, metode çi evenimente. ProprietåÆile ba-
lonului includ atât atributele vizibile cum sunt înålÆimea, diametrul, culoarea, cele care des-
criu starea lui (umflat sau dezumflat), cât çi atribute invizibile cum este vârsta. Prin definiÆie,
toate baloanele au aceste proprietåÆi. Valorile acestor proprietåÆi diferå de la un balon la al-
tul. Balonului i se pot asocia de asemenea çi acÆiuni pe care le poate executa, adicå meto-
de: metoda de umflare a balonului (acÆiunea prin care se umflå balonul cu aer), metoda de
dezumflare a balonului (acÆiunea prin care se scoate aerul din balon), metoda de înålÆare a
balonului (acÆiunea prin care se ridicå balonul). Toate baloanele sunt capabile så execute
aceste acÆiuni, deci au asociate aceste metode. Baloanele au çi råspunsuri predefinite la
anumite evenimente externe: la evenimentul înÆepåturå, råspunsul este dezumflarea auto-
matå, iar la evenimentul eliberarea balonului råspunsul este înålÆarea lui în aer.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 211

Açadar, baloanele diferå între ele numai prin valorile proprietåÆilor çi au acelaçi comporta-
ment (reacÆioneazå la aceleaçi evenimente prin aceleaçi metode). Putem spune cå balonul
este un tip de obiect din lumea realå, iar mulÆimea baloanelor formeazå o claså de obiecte.
Aça cum o fotografie descrie starea unui obiect la un moment dat, çi o structurå de date
folositå pentru descrierea obiectului nu poate så caracterizeze decât starea acelui obiect la
un moment dat, deci este o descriere staticå a obiectului. TendinÆa limbajelor moderne de
programare este de a pune în corespondenÆå obiectele reale cu obiectele virtuale pentru a
putea evidenÆia transformårile pe care acestea le suferå în mod continuu. Obiectul va încap-
sula atât datele care descriu proprietåÆile, dar çi subprogramele care prelucreazå aceste date
çi care vor defini metodele obiectului.
Domeniul în care programarea orientatå pe obiecte a ajuns indispensabilå este realizarea
interfeÆei. Aça cum obiectele cu care venim în contact reprezintå interfaÆa între noi çi lumea
realå çi interfaÆa graficå dintre utilizator çi programul de aplicaÆie este construitå cu diferite
obiecte virtuale afiçate pe ecran care pot fi acÆionate cu mouse-ul çi tastatura. Putem spune
cå în urma acÆionårii, obiectul declançeazå un anumit eveniment. Deoarece, utilizatorul
poate veni în contact cu mai multe aplicaÆii, s-a cåutat o standardizare a acestor obiecte
atât din punct de vedere al proprietåÆilor, cât çi din punct de vedere al evenimentului
declançat. De exemplu, dacå un utilizator vede pe ecranul calculatorului un buton pe care
scrie OK, çtie cå dacå îl va acÆiona se va închide caseta de dialog çi se va continua
execuÆia aplicaÆiei.
AÆi studiat deja principiile programårii orientate pe obiecte. Dintre conceptele studiate, så
ne reamintim urmåtoarele:
Obiectul (object) reprezintå un ansamblu de date (un numår fix de variabile) çi
subprograme (proceduri çi funcÆii) necesare pentru prelucrarea datelor. Datele poartå
numele de proprietåÆi, iar subprogramele numele de metode sau evenimente. Proprie-
tåÆile, metodele çi evenimentele sunt membrii unui obiect. InterfaÆa de acces la obiect
este realizatå numai prin intermediul metodelor. În acest mod, subprogramele membre
ale unui obiect prelucreazå datele membre ale obiectului care apeleazå metoda.
Proprietatea (property) reprezintå un atribut al unui obiect care defineçte una dintre
caracteristicile sau unul dintre aspectele sale. De exemplu, un obiect vizual poate avea
proprietatea visible care determinå dacå obiectul este vizibil la un moment dat.
Metoda (method) reprezintå acÆiunea pe care o poate executa un obiect. Utilizatorul
unui obiect are acces la date numai prin intermediul metodelor obiectului, iar metoda are
acces implicit la membrii unui obiect. Metodele ascund celui care utilizeazå obiectul
amånunte despre modul în care a fost implementat. De exemplu, un obiect vizual de tip
listå are implementate metode necesare pentru întreÆinerea listei: adåugarea unui articol la listå,
çtergerea unui articol din listå etc.
Evenimentul (event) reprezintå o acÆiune recunoscutå de obiect pentru care se poate scrie un
program ca råspuns. Evenimentele pot fi externe, adicå generate de acÆiuni ale utilizatorului (un
clic cu mouse-ul, miçcarea mouse-ului, apåsarea unei taste) sau interne, adicå generate prin-
tr-un cod de program sau de sistem.
Clasa (class) reprezintå definiÆia unui anumit tip de obiect. DefiniÆia cuprinde descrierea
proprietåÆilor çi a metodelor obiectului. Folosirea claselor permite gestionarea mai multor
obiecte de acelaçi tip. Clasa este înså doar un termen abstract, un çablon care defineçte
caracteristicile unui obiect (cum aratå çi cum se comportå).
212 Informatică

InstanÆa (instance) reprezintå un obiect creat pornind de la definiÆia unei clase. Spre deosebire de
claså care este doar o definiÆie, o instanÆå existå ca un obiect care poate fi folosit pentru a
executa anumite acÆiuni. De exemplu, o casetå de text dintr-un formular este o instanÆå a clasei
TextBox care descrie acest tip de obiecte vizuale.
InstanÆe multiple (multiple instances) reprezintå mai multe obiecte create de aceeaçi claså.
Obiectele au propriile proprietåÆi çi date private, dar folosesc împreunå codul de program.
Încapsularea (encapsulation) reprezintå un mecanism prin care folosind o singurå definiÆie sunt
incluse în obiect datele çi metodele. Datele membre ale unui obiect nu pot fi modificate decât
prin intermediul metodelor proprii obiectului respectiv. Încapsularea izoleazå complexitatea
internå a unui obiect de restul aplicaÆiei.
Moçtenirea (inheritance) este o facilitate oferitå de programarea pe obiecte prin care o claså
nouå numitå claså copil (child class) se poate construi pornind de la o claså existentå numitå
claså pårinte (parent class) prin preluarea caracteristicilor clasei pårinte. Clasa copil se mai
numeçte çi claså derivatå (subclass), iar clasa pårinte claså de bazå (base class). Folosind
aceastå facilitate se poate crea o ierarhie de clase çi se poate dezvolta uçor un software exis-
tent. Clasa copil moçteneçte accesul la datele çi metodele stråmoçilor. La acestea, programato-
rul poate adåuga proprietåÆi çi metode noi, definite explicit în noua claså. Orice modificare într-
un stråmoç se reflectå çi la urmaçi. De exemplu, dacå o claså Text are proprietatea ca textul så
fie scris îngroçat, orice urmaç al acestei clase va avea aceastå proprietate.

Aceeaçi problemå poate fi rezolvatå atât în varianta clasicå a programårii structurate, cât
çi folosind programarea orientatå pe obiecte. Principalele avantaje ale folosirii progra-
mårii orientate pe obiecte sunt:
9 Reutilizarea unui software deja scris. Acest avantaj creçte eficienÆa programatorilor.
În programarea clasicå se realiza prin crearea bibliotecilor de subprograme.
9 Dezvoltarea mai uçoarå a aplicaÆiilor. În programarea orientatå pe obiecte creçte
gradul de modularizare al unei aplicaÆii faÆå de programarea clasicå. Adåugarea sau
modificarea unor module de aplicaÆie se va face mai uçor datoritå organizårii
obiectelor în clase de obiecte çi a facilitåÆii de moçtenire.
9 Controlul mai bun al programelor de dimensiuni mari. AplicaÆia este mai bine
structuratå decât în cazul programårii clasice çi mult mai abstractizatå, permiÆând o
mai uçoarå citire çi urmårire a codului.
9 Dezvoltarea programårii vizuale ca aplicaÆie a programårii orientate pe obiecte. În
varianta clasicå, descrierea unui obiect grafic de pe ecran se fåcea precizând printr-un
set de instrucÆiuni caracteristicile obiectului (coordonatele obiectului, dimensiunile, cu-
loarea, textul afiçat etc.), iar prin subprograme modul în care putea fi manipulat obiectul.
În programarea vizualå existå deja obiecte vizuale predefinite care pot fi folosite pentru
construirea unei intrefeÆe. Obiectul vizual conÆine proprietåÆile obiectului grafic (cu valori
implicite, care înså pot fi modificate) çi metodele çi evenimentele la care poate reacÆiona
obiectul vizual, fårå så mai necesite scrierea codului de cåtre programator.

2 . 2 . L u c r u l c u c l a s e şi o b i e c t e în V i s u a l F o x P r o

2.2.1. Clasele
Visual FoxPro are implementate mai multe clase predefinite care permit crearea unor
obiecte cu care poate fi construitå interfaÆa unei aplicaÆii, cum sunt de exemplu casetele
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 213

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


moçtenire, programatorul poate defini douå categorii de clase:
9 Clase vizuale care permit crearea obiectelor vizuale ce pot fi folosite la realizarea
interfeÆei. DefiniÆia acestor clase se bazeazå pe una dintre clasele predefinite vizuale.
Altfel spus, clasele vor avea ca stråmoç 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 proprietåÆi
modificate çi eventual cu metode noi faÆå de formularul predefinit.
9 Clase nevizuale care permit crearea unor obiecte nevizuale. DefiniÆia 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 numår complex.
Clasa container este formatå dintr-un grup de clase similare (clase predefinite sau deri-
vate 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 conÆine unul sau mai
multe formulare legate între ele. InstanÆa unei clase container este un obiect container.
Obiectul container este un obiect care conÆine pe lângå proprietåÆi, metode çi evenimente
çi alte obiecte. El permite accesul la obiectele pe care le conÆine. Obiectul container este
foarte util la construirea interfeÆelor. De exemplu, un formular de tip casetå de dialog este
un obiect container care poate conÆine 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 urmåtoarele evenimente: Init (se
produce la crearea obiectului), Destroy (se produce la eliberarea obiectului), Error (se pro-
duce la apariÆia unei erori în timpul execuÆiei unei metode) çi metode: AddObject (adaugå un
obiect la un container în timpul execuÆiei), CloneObject (creeazå o copie a obiectului),
RemoveObject (înlåturå un obiect dintr-un container în timpul execuÆiei), SaveAsClass
(salveazå o instanÆå a unui obiect ca o definiÆie de claså într-o bibliotecå de clase),
Fiecare claså se identificå printr-un nume. O claså se poate crea cu instrucÆiunea 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Æå-instrucÆiuni>
endfunc | endproc ] ...
enddefine

Prin aceastå instrucÆiune se defineçte clasa identificatå prin <nume_cls1>. DefiniÆia noii clase
se bazeazå pe clasa pårinte precizatå prin <nume_cls2> din clauza as de la care moçteneçte
proprietåÆile, metodele çi evenimentele. Clasa pårinte poate fi o claså predefinitå, o claså vi-
zualå (care se bazeazå pe o claså predefinitå) sau o claså nevizualå (definitå de utilizator). La
noua claså pot fi adåugate:
214 Informatică

9 ProprietåÆi noi. Ele vor fi precizate printr-o listå de operaÆii de atribuire <nume_pr>=
<exp>, unde <nume_pr> este numele proprietåÆii, iar <exp> este valoarea cu care se
iniÆializeazå proprietatea. ProprietåÆile pot fi protejate, adicå se poate împiedica acce-
sul la proprietate çi se poate împiedica modificarea ei din afara definiÆiei clasei. Prote-
jarea unor proprietåÆi se precizeazå cu clauza protected însoÆitå de lista de proprietåÆi
care vor fi protejate: <nume_pr1>, <nume_pr2>,... .
9 Obiecte noi. Fiecare obiect nou care va fi adåugat la definiÆia clasei este precizat printr-o
clauzå add object. Obiectul va fi identificat prin <nume_ob> çi va fi adåugat dintr-o claså
precizatå prin <nume_cls3> din clauza as. Obiectul adåugat poate fi protejat, adicå se
poate împiedica accesul çi modificarea lui din afara clasei, dacå se precizeazå clauza
protected. Metodele çi evenimentele clasei vor avea înså acces la proprietate. Implicit se
executå metoda de inÆializare a obiectului la adåugarea obiectului. Explicit nu se face
iniÆializarea dacå este precizatå clauza noinit. Explicit se poate preciza cu clauza with
lista proprietåÆilor çi valorile proprietåÆilor care se adaugå obiectului adåugat la claså.
9 Metode çi evenimente noi. Ele sunt create ca un set de subprograme (proceduri çi
funcÆii). Fiecare funcÆie çi procedurå este delimitatå de cuvintele cheie function çi
endfunc çi respectiv procedure çi endproc. Între cuvintele cheie se scrie secvenÆa
de instrucÆiuni care formeazå corpul subprogramului. Se pot folosi parametri de
comunicaÆie între subprogram çi obiect sau între subprogramele aceleiaçi clase.
Parametrii se declarå la începutul fiecårui subprogram cu instrucÆiunea paramaters
sau lparameters. Metodele pot fi protejate (este împiedicat accesul la ele din afara
obiectului) dacå se precizeazå clauza protected înainte de a scrie subprogramul
asociat. Metoda va fi un subprogram care va acÆiona asupra obiectului creat pe baza
clasei çi care poate fi apelat indiferent de îndeplinirea unor condiÆii, iar evenimentul va
fi un subprogram care se va executa numai atunci când se produce o acÆiune (de
exemplu un clic cu mouse-ul) recunoscutå de obiectul creat pe baza clasei.
ObservaÆii:
1. Define class este instrucÆiune deoarece nu poate fi folositå în modul interactiv, ci nu-
mai în programe. InstrucÆiunea are o sintaxå de bloc, deoarece este formatå dintr-un
ansamblu de instrucÆiuni. Blocul de instrucÆiuni începe cu comanda define class çi se
terminå cu cuvântul cheie enddefine. InstrucÆiunile componente sunt scrise în
sintaxa blocului fiecare pe câte un rând çi trebuie scrise pe un singur rând çi în cadrul
unui program (la fel ca orice instrucÆiune independentå).
2. Clauza as precede numele clasei pårinte pe care se bazeazå definiÆia noii clase sau a
unui obiect adåugat la o claså container.
Exemplu:
Se creeazå o claså cu numele formular pe baza clasei vizuale form (clasa formularelor).
Obiectele din aceastå claså vor fi obiecte container, deoarece obiectul formular conÆine
alte trei obiecte: douå care se bazeazå pe clasa CommandButton (adicå vor fi butoane
de comandå), iar unul care se bazeazå pe clasa ListBox (adicå va fi o listå). Clasa formu-
lar va conÆine pe lângå proprietåÆile, metodele çi evenimentele clasei form proprietåÆile
nume çi versiune çi metoda click.
define class formular as form
* Se definesc proprietatile nume si versiune. Ele sunt
* initializate cu 20 de spatii, respectiv cu un sir de caractere.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 215

* 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
ObservaÆie:
Clasele pot fi definite çi modificate interactiv prin intermediul constructorului de clase -
Class Designer pe care îl activaÆi cu comanda create class.

2.2.2. Obiectele
Obiectele se creeazå pe baza claselor definite. Obiectul este instanÆa unei clase. Pen-
tru crearea unui obiect se foloseçte funcÆia createobject() care are sintaxa:
createobject('<nume_cls>' [,<p1>, <p2>, ...]
Rezultatul furnizat de funcÆie este de tip obiect (adicå referinÆå cåtre un obiect). Obiectul se
creeazå pe baza clasei identificate prin <nume_cls>, iar pentru crearea sa se poate face
transfer prin parametrii din lista <p1>, <p2>, ... . Numele clasei va fi scris nu ca un identi-
ficator, ci ca un çir de caractere. Pentru a putea folosi obiectul, trebuie så se atribuie referinÆa
cåtre obiect unei variabile de memorie. În acest mod, numele variabilei de memorie va putea
fi folosit pentru a referi obiectul.
Exemplu:
Se creeazå un obiect pe baza clasei definite anterior. Variabilei de memorie obiect i se
atribuie referinÆa cåtre acest obiect: obiect = createobject('clasa')
În lucrul cu clase çi obiecte se folosesc urmåtorii operatori specifici:
9 Operatorul . (punct). Se foloseçte pentru a separa numele obiectului de numele
pårintelui sau pentru a separa numele unui membru al obiectului (proprietate, metodå
sau eveniment) de numele obiectului.
9 Operatorul :: (delimitarea domeniului). Se foloseçte atunci când doriÆi så apelaÆi
dintr-o claså o metodå din clasa pårinte.
Astfel, sintaxa generalå pentru a avea acces la unul din membrii unui obiect este:
<nume_obiect>.<nume_membru>
unde <nume_membru> este numele unei proprietåÆi, al unei metode sau al unui eveniment al
obiectului.
216 Informatică

În cadrul definiÆiei unei clase se pot folosi urmåtoarele referiri relative la membrii unui obiect
sau la alte clase:
9 Parent - obiectul container al obiectului curent.
9 This - obiectul curent.
9 ThisForm - formularul care conÆine obiectul curent (formularul curent).
9 ThisFormSet - setul de formulare curent care conÆine formularul curent.

Aceste cuvinte cheie se folosesc pentru a se face referiri la obiecte care nu au fost create
încå (ele au fost definite în cadrul clasei) çi implicit nu li s-au atribuit nume pentru a fi referite.
În timpul execuÆiei unui program puteÆi så adåugaÆi sau så înlåturaÆi obiecte dintr-un
obiect container folosind metodele obiectului container: AddObject() pentru adåugarea çi
RemoveObject() pentru înlåturarea unui obiect. Aceste metode sunt implementate
implicit în marea majoritate a claselor predefinite çi în clasa custom. Sintaxa lor este:
<nume_ob1>.addobject('<nume_ob2>' , '<nume_cls>')
unde <nume_ob1> este numele obiectului container la care se adaugå obiectul cu numele
<nume_ob2> ce se creeazå pe baza clasei <nume_cls> çi
<nume_ob1>.removeobject('<nume_ob2>')
unde <nume_ob1> este numele obiectului container din care se înlåturå obiectul cu numele
<nume_ob2>. Obiectul înlåturat nu va mai fi afiçat pe ecran.
ObservaÆii:
În sintaxa celor douå funcÆii numele obiectului container a fost separat prin operatorul punct
de numele metodei membru al obiectului container.
Exemplu:
În acest exemplu puteÆi observa cum este folosit operatorul :: pentru a apela o metodå
din clasa pårinte (în clasa F2 este apelatå metoda click definitå în clasa F1 care este
clasa pårinte a clasei F2) çi referinÆa This pentru a preciza cå este vorba de obiectul
curent, adicå obiectul creat pe baza clasei F2 (This.Backcolor se referå la proprietatea
Backcolor a obiectului curent - culoarea fundalului):
* Se creeaza clasa F1 care are ca parinte clasa Form
define class F1 as Form
procedure click
wait window 'S-a executat clic in formular'
endproc
enddefine
* Se creeaza clasa F2 care are ca parinte clasa F1
define class F2 as F1
procedure click
F1::click
This.BackColor=This.BackColor+1
endproc
enddefine
Exemplu:
În acest exemplu puteÆi observa cum pot fi folosite metodele proprii ale obiectului, cum
pot fi modificate proprietåÆile unui obiect, cum se fac referirile la proprietåÆile çi metodele
unui obiect çi cum este folosit operatorul punct în aceste referiri:
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 217

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 nume-
F1.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å adåugaÆi un obiect la un obiect container el nu va fi vizibil. Pentru a-l face vizibil tre-
buie så i se atribuie proprietåÆii visible valoarea .T.
ObservaÆie:
PuteÆi specifica proprietåÆile multiple pentru un obiect cu instrucÆiunea with ... endwith .
InstrucÆiunea nu poate fi folositå în instrucÆiunea bloc pentru definirea clasei. Ea are sintaxa:
with <nume_ob>
<secvenÆå_instrucÆiuni>
endwith

Astfel, în exemplul precedent puteÆi modifica proprietåÆile obiectelor adåugate astfel:


with F1 with B2
with B1 caption='Nu'
caption='Da' visible=.T.
visible=.T. endwith
endwith L1.visible=.T.
endwith

Mecanismele programårii orientate pe obiecte sunt implementate în Visual


FoxPro astfel:
Încapsularea. Prin folosirea comenzii define class sunt incluse în aceeaçi
claså definiÆiile pentru proprietåÆile, metodele çi evenimentele unui obiect.
Moçtenirea. O claså poate fi definitå pe baza definiÆiei altei clase folosind cla-
uza as <nume_claså_pårinte>. ProprietåÆile clasei pårinte nu vor mai fi definite
în clasa derivatå, în care vor fi definite numai proprietåÆile çi metodele noi.

Accesul la membrii unui obiect


În tratarea accesului la membrii unui obiect pot så aparå urmåtoarele cazuri:
218 Informatică

9 Datele unui obiect pot fi prelucrate prin metodele proprii obiectului. În timpul acestor pre-
lucråri pot så fie necesare diferite variabile temporare. Acestea trebuie definite ca proprie-
tåÆi ale obiectului pentru a putea fi folosite în interiorul obiectului, dar trebuie izolate de
exteriorul lui, deoarece modificarea lor din exterior ar putea afecta prelucrårile din interior.
9 Unele dintre subprograme sunt folosite intern de metodele obiectului çi nu trebuie så
fie folosite çi din exterior.
Din aceste douå cazuri se observå cå este necesar så fie controlat accesul la membrii
unui obiect. De aceea, membrii unui obiect pot fi:
9 Publici. Accesul la aceçti membri este posibil din interiorul clasei, dar çi din exteriorul ei.
9 ProtejaÆi. Accesul la aceçti membri este posibil din interiorul clasei çi din interiorul
unei clase derivate din ea. Aceçti membri vor fi declaraÆi protejaÆi prin intermediul
clauzei protected din definiÆia clasei.
Exemplu
define class ang as Custom
protected data_n
nume=space(20)
pren=space(20)
adresa=space(30)
data_n={ / / }
procedure data_ns
return this.data_n
endproc
enddefine
Proprietatea data_n este protejatå çi nu poate fi modificatå din exteriorul clasei, în schimb
metoda data_ns nu este protejatå çi poate furniza valoarea proprietåÆii data_n.
ObÆinerea de informaÆii despre obiecte
ObÆineÆi informaÆii despre obiecte folosind urmåtoarele funcÆii:
aclass() - plaseazå într-un vector numele clasei unui obiect çi ale stråmoçilor
acestuia. FuncÆia returneazå un rezultat numeric care va reprezenta numårul de
clase plasate în vector. În primul element al vectorului va fi scris numele clasei
obiectului. Sintaxa funcÆiei este: aclass(<nume_vector>,<nume_ob>).
ainstance() - plaseazå într-un vector instanÆele unei clase. FuncÆia retuneazå un
rezultat numeric care va reprezenta numårul de instanÆe plasate în vector. Sintaxa
funcÆiei este: ainstance(<nume_vector>,<nume_cls>).
amembers() - plaseazå într-un tablou de memorie numele membrilor unui obiect
(proprietåÆi, metode, evenimente çi obiecte membre). FuncÆia returneazå un rezultat
numeric care reprezintå numårul de membrii ai obiectului, memoraÆi în tablou.
Sintaxa funcÆiei este: amembers(<nume_tablou>,<nume_ob>[,1|2]). Implicit se
creeazå un vector în care vor fi memorate numai proprietåÆile. Explicit, dacå se
precizeazå argumentul 1 se va crea o matrice bidimensionalå în care în prima
coloanå va fi scris numele membrului çi în coloana a doua tipul membrului (Property,
Event, Method, Object), iar dacå se precizeazå argumentul 2 se va crea un vector
care va conÆine numai numele obiectelor membre.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 219

Afiçarea listei obiectelor active (numele lor, propietåÆile, metodele çi evenimentele asocia-
te) se face cu comanda:
display object [ like <sablon>]
CondiÆia de existenÆå a unui obiect
Dupå eliberarea unui obiect (de exemplu prin închiderea formularului container), variabila de
memorie care a fost folositå pentru referirea lui va conÆine valoarea null. Çtergerea ei din me-
morie se va face printr-o comandå explicitå (release):
release <listå_nume_obiecte>
Pentru a testa dacå existå un obiect, folosiÆi urmåtoarea condiÆie:
type('<nume_ob>')='o' and not isnull (<nume_obiect>)
adicå trebuie îndeplinite douå condiÆii: tipul variabilei de memorie folosite pentru referirea
obiectului trebuie så fie o (object) çi variabila de memorie så nu aibå valoarea null,
deoarece dacå obiectul a fost eliberat, variabila are valoarea null.
Atunci când se creeazå o instanÆå a unei clase se påstreazå în memorie definiÆia clasei.
Aceastå definiÆie råmâne în memorie çi dupå ce obiectul a fost eliberat. Ea trebuie
çtearså explicit cu comanda:
clear <nume_cls>
2.2.3. Studiu de caz
Så se creeze un obiect care så descrie comportamentul unui numår complex. Obiectul va
avea proprietåÆile re (partea realå a numårului), im (partea imaginarå a numårului) çi
modul (modulul unui numår complex) çi metoda m pentru calculul modulului.
Pentru a crea çi a testa un astfel de obiect se vor scrie urmåtoarele linii de program într-un
fiçier surså, la fel ca çi programele pe care le-aÆi scris folosind limbajul gazdå. Blocul in-
strucÆiunii define class se scrie la sfârçit, dupå instrucÆiunile din program, la fel ca çi
subprogramele. Prin instrucÆiunile input atribuiÆi valori proprietåÆilor re çi im.
Exemplul 1
Pentru construirea metodei modul se va folosi un subprogram de tip procedurå. Prin
instrucÆiunea z.m apelaÆi metoda m pentru a calcula modulul, iar prin instrucÆiunea
?z.modul afiçaÆi valoarea proprietåÆii modul.
clear
set talk off
z=CreateObject('Complex')
input 're (partea reala a numarului)= ' to z.re
input 'im (partea imaginara a numarului)= ' to z.im
z.m
?z.modul
define class complex as custom
re=0
im=0
modul=0
procedure m
this.modul=sqrt(this.re**2 +this.im**2)
endproc
enddefine
220 Informatică

Exemplul 2
Pentru construirea metodei modul se va folosi un subprogram de tip funcÆie. Prin instruc-
Æiunea ?z.m() afiçaÆi valoarea furnizatå de metoda m. ObservaÆi cå pentru metodele care re-
turnezå valori folosite în expresii trebuie så scrieÆi între paranteze lista parametrilor actuali (în
acest caz lista este vidå; nu existå parametri pentru transferul datelor).
clear
set talk off
z=CreateObject('Complex')
input 're (partea reala a numarului)= ' to z.re
input 'im (partea imaginara a numarului)= ' to z.im
?z.modul()
define class complex as custom
re=0
im=0
m=0
function modul
this.m=sqrt(this.re**2+this.im**2)
return this.m
endfunc
enddefine
Exemplul 3
Pe baza clasei complex se defineçte o claså nouå complex1 care va conÆine în plus o metodå
pentru afiçarea numårului complex. Pentru definirea acestei metode se va folosi o metodå
internå a clasei nrc (metodå protejatå) pentru calcularea cifrelor unui numår çi proprietatea nc
care are ca valoare numårul de cifre al pårÆii întregi sau imaginare a numårului complex.
Aceastå proprietate este folositå numai intern çi de aceea este protejatå. Ea este necesarå
pentru a stabili numårul de poziÆii afiçabile ale unui numår pentru funcÆia str(). Prin instruc-
Æiunea z.afiçare se apeleazå metoda afisare pentru afiçarea unui numår complex. Clasa
complex1 a moçtenit toate proprietåÆile çi metodele clasei complex.
clear
set talk off
z=CreateObject('Complex1')
input 're (partea reala a numarului)= ' to z.re
input 'im (partea imaginara a numarului)= ' to z.im
?z.modul()
z.afisare
define class complex as custom
re=0
im=0
m=0
function modul
this.m=sqrt(this.re**2+this.im**2)
return this.m
endfunc
enddefine
define class complex1 as complex
protected nr
nr=0
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 221

procedure afisare
? 'Numarul complex este: '+str(this.re,this.nrc(this.re))
do case
case this.im>0
?? ' + i*'+str(this.im,this.nrc(this.im))
case this.im<0
?? ' - i*'+str(abs(this.im),this.nrc(this.im))
endcase
endproc
protected function nrc
parameter v
this.nr=1
do while v<>0
v=int(v/10)
this.nr=this.nr+1
enddo
return this.nr
endfunc
enddefine

2 . 3 . P r i n c i p i i l e p r o g r a m ăr i i c o n d u s e d e ev e n i m e n t e

Programarea orientatå pe obiecte a dus la dezvoltarea programårii conduse de eve-


nimente. Dacå în cazul programårii clasice aplicaÆia era o colecÆie de instrucÆiuni care se
executau în ordinea în care au fost scrise, în cazul programårii conduse de evenimente
aplicaÆia este un ansamblu de subprograme care nu se executå într-o ordine prestabilitå,
ci în funcÆie de producerea unor evenimente (deplasarea mouse-ului, executarea unui clic
cu mouse-ul, glisarea unui obiect, apåsarea unei taste sau a unei combinaÆii de taste
etc). ApariÆia evenimentului este aleatorie çi de aceea programul trebuie så çtie cum så
råspundå la un anumit eveniment. Acest lucru se realizeazå prin asocierea la fiecare
eveniment a unei secvenÆe de cod prin care se descriu operaÆiile care trebuie executate.
Programarea conduså de evenimente se bazeazå pe bucla evenimentului (event loop),
adicå un mediu interactiv în execuÆie care poate fi:
activat cu comanda read events care porneçte procesorul de evenimente care va
sesiza apariÆia unui eveniment çi
dezactivat cu comanda clear events care îl opreçte.
Dupå oprirea procesorului de evenimente programul va continua cu prima instrucÆiune
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

InterfaÆa graficå cu o aplicaÆie afiçeazå mai multe ecrane cu obiecte prin intermediul cårora utili-
zatorul interacÆioneazå cu aplicaÆia pentru a controla evoluÆia ei sau pentru a cere så execute
diferite procese prin care se prelucreazå datele în vederea obÆinerii de informaÆii (de exemplu,
procesul de cåutare într-o bazå de date a unor date care corespund unui anumit criteriu).
222 Informatică

Orice interfaÆå graficå este realizatå din obiecte care au asociate


proprietåÆi, metode çi evenimente.
Obiectul virtual este o sumå de proprietåÆi, metode çi evenimente. Asupra obiectelor
virtuale se pot folosi în general urmåtoarele acÆiuni: clic, dublu clic, glisare çi apåsarea
unei taste. Prin asociere cu balonul så identificåm care sunt proprietåÆile, metodele çi
evenimentele asociate unui obiect, cum ar fi butonul declançator dintr-o casetå de dialog.
ProprietåÆile sale sunt numele såu, poziÆia în care este afiçat faÆå de marginile ca-setei de
dialog, culoarea butonului çi a textului etc. AcÆiunile care se pot executa asupra butonului
sunt: indicare cu mouse-ul çi clic sau apåsarea unei anumite taste. Evenimentul
reprezintå efectul acÆionårii butonului prin intermediul mouse-ului sau al tastaturii, adicå
råspunsul sistemului în urma acÆionårii butonului. De exemplu, evenimentul asociat bu-
tonului Open este deschiderea obiectului selectat în caseta de dialog (fiçier sau dosar).
Programarea orientatå pe obiecte poate fi folositå pentru realizarea unei interfeÆe deoare-
ce sistemul de gestiune a bazelor de date Visual FoxPro pune la dispoziÆia utilizatorului
mai multe clase vizuale predefinite:

Numele clasei Clasa predefinitå SemnificaÆia obiectului vizual


CheckBox Comutator Control care indicå dacå o opÆiune este activå (on)
sau nu (off).
Column Coloanå într-o Container care conÆine antetul de coloanå çi alte
grilå obiecte care pot så aparå într-o coloanå a unei gri-
le; nu poate fi folosit independent, ci numai într-un
container de tip grilå.
ComboBox Listå combinatå Control similar unei combinaÆii dintre o casetå de text
(TextBox) çi o listå (ListBox) în care puteÆi introduce
o valoare sau o puteÆi alege dintr-o listå.
CommandButton Buton de Control asociat unei comenzi: dacå la un moment
comandå dat executaÆi clic pe un buton, se executå comanda
asociatå butonului.
Command Grup de butoane Container care poate conÆine numai un grup de
Group de comandå butoane de comandå care pot fi tratate ca o unitate.
Container Obiect container Container care conÆine alte obiecte neprotejate
(este permis accesul la obiectele conÆinute).
Control Obiect container Container care poate include çi obiecte ale utiliza-
torului, obiectele incluse fiind protejate (nu este per-
mis accesul la obiectele conÆinute).
EditBox Zonå de editare Control care furnizeazå o zonå pentru introducerea
text sau vizualizarea unui text într-un formular (permite
afiçarea pe mai multe linii).
Form Formular Container care poate conÆine o colecÆie de mai
multe pagini (care se pot comporta ca o casetå de
dialog sau ca o fereastrå standard), controale çi
containere pentru afiçarea çi editarea datelor çi
controale utilizator (custom).
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 223

Numele clasei Clasa predefinitå SemnificaÆia obiectului vizual


FormSet Set de formulare Container care poate conÆine unul sau mai multe for-
mulare legate între ele sau bare cu instrumente.
Grid Grilå Container care creeazå o grilå pentru prezentarea da-
telor pe rânduri çi coloane, sub formå de tabel; poate
conÆine numai controale de tip coloanå într-o grilå.
Header Antet de coloanå Obiect care conÆine antetul coloanei çi care nu poa-
te 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
fiçier bitmap (.bmp).
Label Etichetå Control care conÆine 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 de Container cu controale OLE (fiçiere .ocx; au propriul
Control tip OLE set de evenimente) çi obiecte OLE inserabile (obiec-
te OLE create cu o altå aplicaÆie - Word, Excel etc.;
ele nu au propriul set de evenimente).
OLEBound Control container Controale folosite în formulare sau rapoarte care
Control de tip OLE permit afiçarea conÆinutului unui obiect OLE într-un
câmp General al unui tabel.
OptionButton Buton de opÆiuni Obiect care nu poate fi folosit independent, ci într-un
(radio) container de tip grup de butoane de opÆiuni pentru a
reprezenta o opÆiune.
OptionButton Grup cu butoane Container folosit pentru a grupa numai controale de
Group de opÆiuni (radio) tip butoane de opÆiuni; puteÆi folosi un buton pentru
a alege o opÆiune dintr-un set de opÆiuni.
Page Paginå Container folosit pentru crearea casetelor de dialog cu
mai multe secÆiuni (tabs); nu poate fi folosit indepen-
dent, ci într-un container de tip set de pagini çi poate
conÆine orice controale çi containere.
PageFrame Set de pagini Container care conÆine una sau mai multe pagini.
Separator Separator pe bara Obiect care nu poate fi folosit independent, ci într-un
de utilitåÆi container de tip barå cu instrumente; este folosit pen-
tru a introduce spaÆii între controale cu scopul de a
crea grupuri de butoane.
Shape Formå Control care creeazå o formå care poate fi afiçatå ca o
combinaÆie de dreptunghiuri, cercuri çi elipse.
224 Informatică

Numele clasei Clasa predefinitå SemnificaÆia obiectului vizual


Spinner Casetå de text cu Control care permite incrementarea sau decremen-
derulor mentarea unei valori fie prin scrierea valorii noi, fie
executând clic pe sågeata de incrementare sau pe
sågeata de decrementare.
TextBox Casetå de text Control care furnizeazå o zonå pentru introducerea
sau vizualizarea unui text într-un formular; permite
afiçarea pe o singurå linie.
Timer Obiect de tip ceas Control invizibil folosit pentru a executa secvenÆe
de cod la intervale de timp egale (controleazå
evenimentele recurente din aplicaÆie).
ToolBar Barå cu Container care poate conÆine orice controale; este
instrumente format dintr-un set de butoane pe care puteÆi
executa clic ca så cereÆi excutarea unei anumite
sarcini.
AÆi observat cå obiectele vizuale pe care le puteÆi crea pot fi simple sau containere. În
general, obiectele container nu pot conÆine orice obiecte. De exemplu:

Container ConÆinut
grup de butoane de comandå butoane de comandå
grup cu butoane de opÆiuni butoane de opÆiuni
set de pagini pagini
paginå controale, containere, obiecte utilizator
set de formulare formulare, bare de instrumente
formular set de pagini, controale, containere, obiecte utilizator
grilå coloane într-o grilå
coloanå într-o grilå antet de coloanå çi orice obiect cu excepÆia formulare-
lor, a seturilor de formulare, a coloanelor într-o grilå çi a
barelor cu instrumente
barå de instrumente controale, seturi de paginå, containere
AÆi mai observat cå unele obiecte nu pot fi definite independent, ci numai în interiorul unui
container. De exemplu:

Obiect Container
antet de coloanå coloanå într-o grilå
buton pentru opÆiune grup de butoane pentru opÆiuni
coloanå într-o grilå grilå
paginå set de pagini
separator barå de instrumente
Pe lângå aceste obiecte predefinite care creeazå obiecte vizuale într-o aplicaÆie, mai
puteÆi folosi urmåtoarele obiecte predefinite:
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 225

Numele clasei Clasa predefinitå SemnificaÆia obiectului vizual


Cursor Cursor Obiect creat atunci când se adaugå un tabel sau o vi-
zualizare la mediul de date dintr-un tabel, dintr-un for-
mular sau dintr-un set de formulare; permite specifica-
rea proprietåÆilor tabelului sau ale vizualizårii atunci
când este lansat în execuÆie formularul sau raportul.
Relation RelaÆie Obiect creat atunci când se stabileçte o relaÆie între
douå tabele într-un raport, formular sau set de formu-
lare; permite determinarea modului în care sunt legate
cele douå tabele.
Data Mediu de date Obiect container pentru obiectele cursor çi relaÆie asoci-
Environment ate unui formular, raport sau set de formulare; se creea-
zå o datå cu raportul, formularul sau setul de formulare.
Exemplu:
Folosind clasele vizuale predefinite s-au creat trei formulare: primul formular conÆine o
etichetå çi douå butoane de comandå, care dacå vor fi acÆionate vor deschide fiecare
câte un alt formular u o etichetå çi un buton de comandå. Fiecare buton reacÆioneazå
diferit la evenimentul clic cu mouse-ul, çi de aceea a fost scriså câte o procedurå pentru
fiecare eveniment: b1.click, b2.click, b3.click çi b4.click. Metoda release se foloseçte
pentru a çterge din memorie obiectul de tip formular.

forma1=createobject('Form1') * Se definesc proprietatile


forma2=createobject('Form2') * formularului form1:
forma3=createobject('Form3') caption='Intrebare'
* Afiseaza primul formular: closable=.F.
forma1.show height=143
read events width=386
define class form1 as Form
226 Informatică

* Se adauga obiecte la add object text1 as Label


* formular add object b3 as CommandButton
add object text as Label text1.caption='Felicitari;
add object b1 as CommandButton !!!!!!!!!!!!'
add object b2 as CommandButton text1.height=16
* Se definesc proprietatile text1.left=110
* obiectului text: text1.top=34
text.caption='Ati rezolvat; text1.width=376
testul din capitolul; text1.visible=.T.
precedent?' b3.caption='Terminare'
text.height=16 b3.height=33
text.left=45 b3.left=110
text.top=34 b3.top=86
text.width=376 b3.width=114
text.visible=.T. b3.visible=.T.
* Se definesc proprietatile procedure b3.click
* obiectului b1: * Elibereaza formularul si
b1.caption='Da' * dezactiveaza procsorul de
b1.height=33 * evenimente:
b1.left=40 thisform.release
b1.top=96 clear events
b1.width=114 endproc
b1.visible=.T. enddefine
* se definesc proprietatile
* obiectului b2: define class form3 as form
b2.caption='Nu' caption='Raspuns'
b2.height=33 closable=.F.
b2.left=222 height=143
b2.top=96 width=346
b2.width=114 add object text2 as Label
b2.visible=.T. add object b4 as CommandButton
* Se defineste codul evenimen- text2.caption='????????????;
* tului click pe obiectul b1: !!!!'
procedure b1.click text2.height=16
thisform.release text2.left=110
* Afiseaza al doilea formular: text2.top=34
forma2.show text2.width=376
endproc text2.visible=.T.
* Se defineste codul evenimen- b4.caption='Terminare'
* tului click pe obiectul b2: b4.visible=.T.
procedure b2.click b4.height=33
thisform.release b4.left=110
* Afiseaza al treilea formular: b4.top=86
forma3.show b4.width=114
endproc procedure b4.click
enddefine * Elibereaza formularul si
* dezactiveaza procesorul de
define class form2 as Form * evenimente:
caption='Raspuns' thisform.release
closable=.F. clear events
height=143 endproc
width=346 enddefine
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării 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 påstra o colecÆie de clase
vizuale. Se memoreazå într-un fiçier cu extensia .vcx.
Asupra unei biblioteci de clase se pot executa urmåtoarele operaÆii:
crearea bibliotecii

create classlib

adåugarea unei clase


OpreaÆii de
întreÆinere add class

înlåturarea unei clase

remove class
Biblioteca
deschidere bibliotecå

set classlib to
OpreaÆii de
exploatare
biblioteca precizatå

release classlib

închidere
bibliotecå toate bibliotecile

set classlib to
Comanda create classlib are sintaxa:
create classlib <nume_bib>
çi creeazå o bibliotecå de clase cu numele <nume_bib> (implicit çi numele fiçierului).
Biblioteca va fi vidå.
Comanda add class are sintaxa:
add class <nume_cls> [of <nume_bib1>] to <nume_bib1> [overwrite]
La biblioteca precizatå prin <nume_bib1> se adaugå clasa identificatå prin <nume_cls>.
Implicit aceastå claså poate fi în orice bibliotecå deschiså. Explicit ea este preluatå din
biblioteca precizatå prin clauza of çi identificatå prin <nume_bib2>. Biblioteca nu poate fi
adåugatå dintr-un program, dintr-o aplicaÆie sau dintr-un fiçier de proceduri.
Comanda remove class are sintaxa:
remove class <nume_cls> of <nume_bib>]
çi înlåturå definiÆia clasei cu numele <nume_cls> din biblioteca precizatå prin <nume_bib>.
Comanda set classlib to are sintaxa:
set classlib to <nume_bib> [additive]
228 Informatică

când deschide biblioteca precizatå prin <nume_bib> sau sintaxa:


set classlib to
când închide toate bibliotecile deschise.
Comanda release classlib are sintaxa:
release classlib <nume_bib>
çi închide biblioteca precizatå prin <nume_bib>.
ObservaÆie: ?

Dacå aÆi deschis o bibliotecå, toate definiÆiile Ce se întâmplå dacå înlåturaÆi dintr-o
bibliotecå de clase o claså pårinte
claselor vor fi påstrate în memoria internå. Dacå
pentru alte clase din bibliotecå?
vreÆi så le çtergeÆi, puteÆi folosi comanda clear:
clear <nume_bib>
Trebuie så aveÆi grijå ca atunci când executaÆi aceastå operaÆie de çtergere så nu existe
o instanÆå a nici unei clase din bibliotecå.

CreaÆi un fiçier care conÆine un program surså çi-l lansaÆi în execuÆie


1. CreaÆi un obiec care så conÆinå proprietåÆile nume, prenume, adresa, data_n (data
naçterii), vârsta çi metoda pentru calcularea vârstei. Metoda poate fi descriså fie
folosind o procedurå, fie folosind o funcÆie. TestaÆi 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 funcÆie (observaÆi informaÆiile afiçate despre obiect):
*Scrieti secventa corespunza- pren = 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 prelucrării datelor 229

2. TestaÆi funcÆia aclass() cu ajutorul urmåtorului 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. TestaÆi funcÆia ainstance() cu ajutorul urmåtorului 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. TestaÆi funcÆia amembers() cu ajutorul urmåtorului program:
clear
forma=createobject"form") && creeaza un formular
= amembers(a1, forma)
= amembers(a2, forma1, 1)
= amembers(a3, forma1, 2)
display memory like a?
5. TestaÆi 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å urmåtorul program:
clear a=0
set talk off procedure generare
punct=CreateObject("puncte") ? 'Coordonatele punctului:'
punct.generare input 'x= ' to this.x
?'Distanta fata de origine: ' input 'y= ' to this.y
??punct.distanta() endproc
?'Unghiul fata de sistemul de; function distanta
axe: ' this.d=sqrt(this.x**2+;
??punct.argument() this.y**2)
define class puncte as custom return this.d
x=0 endfunc
y=0 function argument
d=0 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. IdentificaÆi clasele çi obiectele, proprietåÆile çi metodele obiectului.
b. ExplicaÆi ce realizeazå programul.
c. Pe baza acestui program definiÆi obiectul dreaptå cu metodele generare çi calculul
lungimii çi obiectul dreptunghi cu metodele generare çi calculul ariei çi al perimetrului.
2. IdentificaÆi çi corectaÆi erorile din urmåtorul program:
clear input 'x= ' to z.c(1)
set talk off input 'y= ' to z.c(2)
z=CreateObject("Complex") endproc
z.citire function modul
?z.modul() this.m=sqrt(this.c(1)**2+;
define class complex as custom this.c(2)**2)
dimension c(2) return this.m
m=0 endfunc
procedure citire enddefine
3. ComparaÆi urmåtoarea variantå de program cu cea prezentatå ca exemplu în studiul
de caz. VerificaÆi dacå aceastå variantå este corectå. Ce concluzie trageÆi din compa-
rarea celor douå versiuni?
clear im=0
set talk off m=0
z=CreateObject("Complex") function modul
input 're= ' to z.re parameter re,im
input 'im= ' to z.im this.modul=sqrt(re**2+im**2)
?z.m(z.re,z.im) return this.m
define class complex as custom endfunc
re=0 enddefine
4. AdåugaÆi obiectului complex metoda pentru citirea numårului complex:
procedure citire
input 're= ' to this.re
input 'im= ' to this.im
endproc
ModificaÆi corespunzåtor programul astfel încât citirea numårului complex så se facå
prin intermediul acestei metode.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 231

5. AdåugaÆi obiectului complex o metodå pentru calculul conjugatului numårului complex


çi pentru calculul argumentului numårului complex. ScrieÆi un program în care folosiÆi
aceste metode.
6. DefiniÆi o claså de obiecte pentru adunarea çi înmulÆirea a douå numere complexe.
ScrieÆi un program în care folosiÆi obiecte din aceastå claså.
7. DefiniÆi o claså de obiecte prin care administraÆi o listå de numere. Clasa trebuie så
conÆinå o metodå pentru adåugarea unui element la listå, çtergerea ultimului element
din listå, afiçarea elementelor listei, cåutarea unui element în listå çi afiçarea elemen-
tului cu valoarea maximå. ScrieÆi un program în care folosiÆi obiecte din aceastå claså.
8. DefiniÆi o claså de obiecte prin care administraÆi fracÆiile. Clasa trebuie så conÆinå metode
pentru citirea numitorului çi a numåråtorului fracÆiei, pentru simplificarea fracÆiei, pentru
afiçarea fracÆiei simplificate, pentru calculul fracÆiei ca numår zecimal, pentru afiçarea
fracÆiei ca numår zecimal. ScrieÆi un program în care folosiÆi obiecte din aceastå claså.
9. DefiniÆi o claså de obiecte prin care administraÆi mulÆimi de numere. Clasa trebuie så
conÆinå metode pentru citirea çi afiçarea mulÆimii, pentru reuniunea, intersecÆia çi dife-
renÆa a douå mulÆimi çi pentru determinarea apartenenÆei unui element la mulÆime.
MulÆimile vor fi descrise prin vectori cu elemente cu valori distincte. ScrieÆi un program
în care folosiÆi obiecte din aceastå claså.
10. DefiniÆi o claså de obiecte prin care administraÆi polinoame. Clasa trebuie så conÆinå
metode pentru citirea çi afiçarea polinoamelor, pentru adunarea çi înmulÆirea a douå
polinoame çi pentru calcularea valorii unui polinom pentru un x precizat. Polinoamele vor
fi descrise prin vectori în care în prima poziÆie se va scrie gradul polinomului, iar în
urmåtoarele n+1 poziÆii, coeficienÆii polinomului. ScrieÆi
un program în care folosiÆi obiecte din aceastå claså.

# ÎncercaÆi:
Adevårat/Fals:
1. În definiÆia unei clase de obiecte metodele se scriu înaintea proprietåÆilor.
2. Într-un program definiÆia clasei de obiecte se face înaintea de a crea obiectul.
3. Într-o metodå nu se poate defini o claså de obiecte.
4. Parametrii metodelor pot avea acelaçi nume ca çi proprietåÆile obiectului.
5. InstrucÆiunea with ... endwith poate fi folositå în instrucÆiunea pentru definirea unei clase.
6. Clasele pot fi adåugate la biblioteci din fiçiere de programe.
7. O claså pårinte moçteneçte proprietåÆile çi metodele de la urmaçi.
8. În definiÆia unei clase trebuie precizatå obligatoriu clasa pårinte.
9. AcÆiunea metodelor çi råspunsul la evenimente se defineçte cu ajutorul subprogramelor.
CompletaÆi:
1. InstrucÆiunea pentru definirea clasei este o instrucÆiune ........... delimitatå de cuvintele
cheie ............................... çi ..............................
2. AcÆiunea metodelor se defineçte prin intermediul .........................
232 Informatică

AlegeÆi råspunsurile corecte:


1. PuteÆi adåuga un obiect la un obiect container cu:
a) instrucÆiunea Add Object
b) metoda AddObject
c) instrucÆiunea Add Class
2. AflaÆi câÆi stråmoçi are o claså folosind funcÆia:
a) aclass() b) ainstance() c) amembers()
3. AflaÆi câte obiecte au fost realizate pe baza aceleiaçi clase folosind funcÆia:
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.
RåspundeÆi:
1. RealizaÆi o comparaÆie între modurile în care este implementatå programarea pe
obiecte în limbajul de programare structurat studiat çi limbajul gazdå Visual FoxPro.
2. Ce tehnici caracteristice programårii pe obiecte sunt implementate în Visual FoxPro?

R åspunsuri:
Adevårat/Fals: 1-F; 2-F; 3-A; 4-A; 5-F; 6-F; 7-F; 8-A; 9-A;.
CompletaÆi: 1-bloc, define class, enddefine; 2-subprogramelor;
AlegeÆi råspunsurile corecte: 1-b; 2- a; 3- b; 4-a; 5-b.

3 . P r o g r a m a r e a v i z u a lă

3 . 1 . R e a l i z a r e a i n t e r f e ţe i

3.1.1. Obiectele vizuale


InterfaÆa 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 interacÆiunea utilizatorului cu aplicaÆia: prin
intermediul lor utilizatorul comunicå aplicaÆiei datele de intrare çi procesele
pe care trebuie så le execute, iar aplicaÆia comunicå utilizatorului datele de
ieçire çi mesaje de informare sau de atenÆionare.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 233

Fiecare tip de control are propriul såu set de proprietåÆi, metode çi evenimente care îl fac
potrivit unui anumit scop. Unele dintre cotroalele pe care le puteÆi folosi în aplicaÆii sunt
cele mai potrivite pentru introducerea çi afiçarea datelor. Altele vå permit så cereÆi exe-
cutarea unui proces în cadrul aplicaÆiei sau vå permit accesul la alte aplicaÆii ca så puteÆi
prelucra unele date ca çi cum ar face parte din propria aplicaÆie.
Într-o interfaÆå pot fi folosite urmåtoarele tipuri de controale:
9 controalele pentru executarea acÆiunilor: butonul de comandå, opÆiunea de meniu;
9 controalele pentru introducerea çi afiçarea datelor: eticheta, caseta de text, zona
de editare, caseta de text cu derulor, grila;
9 controalele care îi permit utilizatorului så aleagå: comutatorul, lista, lista combi-
natå, grupul cu butoane de opÆiuni;
9 controalele grafice: linia, chenarul, imaginea, forma;
9 controalele care îi permit afiçarea obiectelor inserabile create cu alte aplicaÆii.

Formularul este un obiect container care grupeazå alte obiecte. Are


proprietåÆi specifice çi metode care determinå comportamenul såu în diferite
situaÆii.

SuprafaÆa de afiçare a formularelor este împårÆitå în douå zone:


9 bara de titlu (title bar) împreunå cu butoanele de manipulare ale formularului çi
9 spaÆiul de lucru (workspace) în care pot fi afiçate diferite controale cu care poate
interacÆiona utilizatorul.
Formularele pot fi de tip:
9 Fereastrå (window). Utilizatorul interacÆioneazå cu fereastra atunci când lanseazå în
execuÆie aplicaÆia. Ferestrele pot fi redimensionate çi pot fi deplasate pe ecran. În
fereastra de aplicaÆie pot fi deschise alte formulare de tip fereastrå numite ferestre
document în care utilizatorul poate prelucra diferite colecÆii de date ale aplicaÆiei (în
aplicaÆia Visual FoxPro, fereastra care se deschide atunci când prelucraÆi un fiçier
surså este o fereastrå document). Ferestrele asociate unei aplicaÆii pot avea sub bara
de titlu o barå de meniu cu titlurile meniurilor pe care aplicaÆia le pune la dispoziÆia
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
declançarea unui proces. Prin intermediul ei utilizatorul poate så furnizeze datele nece-
sare executårii unui proces pe care l-a activat fie prin acÆionarea unui buton de coman-
då, fie prin alegerea unei opÆiuni de meniu. Mai poate fi folositå pentru ca aplicaÆia så
afiçeze pentru utilizator informaÆii despre desfåçurarea 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 secÆiuni. O casetå de dialog cu secÆiuni (tabs)
poate afiça în aceeaçi zonå a formularului mai multe seturi de obiecte. Fiecare set de
obiecte formeazå o secÆiune. La un moment dat este afiçatå o singurå secÆiune. Se
recomandå acest tip de casetå atunci când într-o casetå trebuie create foarte multe
controale çi ele nu încap în spaÆiul formularului. Controalele se vor grupa dupå anumite
criterii çi fiecare grup va fi afiçat într-o secÆiune a casetei. Un exemplu de casetå de
dialog cu secÆiuni este caseta Option a interfeÆei Visual FoxPro.
234 Informatică

9 Bare cu instrumente (toolbar). Este o casetå de dialog mai specialå care conÆine
numai butoane de comandå reprezentate în general prin pictograme. Ea poate fi
mobilå (float), adicå poate fi afiçatå oriunde în interiorul ferestrei de aplicaÆie sau fixå
(dock), adicå poate fi lipitå de una dintre marginile ferestrei de aplicaÆie. Bara de titlu
este afiçatå numai în barele cu instrumente flotante.
Pentru implementarea acestor obiecte pentru interfaÆå, Visual FoxPro pune la dispoziÆia pro-
gramatorului urmåtoarele obiecte vizuale predefinite:
9 Pentru formulare: FormSet, Form, Page, !
PageFrame çi ToolBar.
AsociaÆi obiectele vizuale predefinite
9 Pentru controale: EditBox, TextBox, Label,
prezentate în capitolul anterior, cu tipu-
Spinner, Grid, OptionButtonGroup, ListBox, rile de controale definite în acest capitol.
ComboBox, CheckBox, CommandButton.
Crearea obiectelor de interfaÆå se poate face în douå moduri:
9 Prin crearea unui program în care obiectele sunt descrise prin intermediul instrucÆiu-
nilor de program. La crearea obiectelor se pot folosi clasele predefinite de obiecte
specifice programårii orientate pe obiecte. Dupå crearea programului surså, pentru a
realiza interfaÆa, trebuie lansat în execuÆie programul cu comanda do <nume_fiçier>.
9 Folosind programarea vizualå. În acest caz, caracteristicile formularelor sunt înre-
gistrate sub forma unui tabel într-un fiçier de date care are extensia .scx. Aceste date
sunt interpretate de un modul al sistemului. Lansarea în execuÆie a acestui modul,
împreunå cu fiçierul care conÆine tabelul (<nume_formular>) se face cu comanda:
do form <nume_formular> with <lista_parametri_actuali>
Comanda de lansare în execuÆie va crea formularul. Ea poate fi scriså într-un modul de
program (modulul apelant al formularului). Adverbul <lista_parametri_actuali> reprezintå o
listå de variabile çi/sau constante de tipuri diferite care se transmit formularului la lansarea
în execuÆie.
3.1.2. Proiectarea interfeÆei
Atunci când se proiecteazå o aplicaÆie, trebuie luate mai multe decizii referitoare la interfaÆå:
Ò ce stil de interfaÆå se va folosi?
Ò de câte formulare este nevoie?
Ò ce comenzi vor fi incluse în meniuri?
Ò se va folosi o barå cu instrumente pentru a dubla opÆiunile
de meniu cu butoane scurtåturi cu pictograme?
Ò ce asistenÆå se va oferi utilizatorului?
Ò ce casete de dialog vor fi folosite pentru a asigura interac-
tivitatea cu utilizatorul?

Elementele de interfaÆå ale unei aplicaÆii sunt dependente de funcÆiile pe care trebuie så
le îndeplineascå aplicaÆia. În plus, atunci când se proiecteazå interfaÆa unei aplicaÆii,
trebuie proiectate çi urmåtoarele elemente:
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 235

Formularul de început (startup form). Este primul formular care se afiçeazå çi reprezintå
ce va vedea prima datå utilizatorul când va porni aplicaÆia. Unele interfeÆe nu au un
formular specific de început. Acest caz apare atunci când aplicaÆia începe cu încårcarea
unui fiçier de date çi testarea unor date, iar primul formular care va fi afiçat va depinde de
rezultatul testului. Formularul de început poate fi o casetå prin care se cere introducerea
unei parole prin care utilizatorul îçi câçtigå dreptul de a folosi aplicaÆia. Asupra parolei se
pot pune restricÆii. De exemplu, dacå utilizatorul nu a introdus parola corectå din trei
încercåri, se va afiça un mesaj de eroare çi se va termina execuÆia programului.
Ecranul introductiv (splash screen). Dacå dureazå foarte mult încårcarea çi lansarea în
execuÆie a unei aplicaÆii, este bine ca în acest timp så fie afiçat un ecran introductiv în
care se poate afiça un mesaj sau emblema firmei.
Formularul de sfârçit (ending form). Este ultimul formular care se afiçeazå la terminarea
aplicaÆiei. Este bine ca acest formular så conÆinå un buton de închidere a aplicaÆiei care
så fie acÆionat de utilizator, operaÆie care så ofere siguranÆa închiderii tuturor fiçierelor çi
descårcårii tuturor formularelor interfeÆei aplicaÆiei. Unele interfeÆe rezolvå închiderea
aplicaÆiei prin opÆiunea de meniu Exit∈File, care terminå execuÆia aplicaÆiei, închide toate
fiçierele çi descarcå toate formularele deschise.
Înainte de a se proiecta interfaÆa trebuie så se cunoascå scopul aplicaÆiei. Unele aplicaÆii sunt
folosite în mod constant, iar altele ocazional pe o perioadå scurtå de timp. De asemenea, o
aplicaÆie care are ca scop principal afiçarea informaÆiilor are cerinÆe diferite faÆå de una care
este folositå pentru a colecta date. InterfaÆa este influenÆatå çi de categoria de utilizatori care
o va folosi. Dacå sunt utilizatori începåtori, interfaÆa trebuie så fie cât mai simplå, iar dacå
utilizatorii sunt experimentaÆi ea poate så fie mai complexå. În plus, dacå aplicaÆia va cunoaç-
te o distribuÆie internaÆionalå, trebuie så Æinå cont de limba çi cultura viitorilor utilizatori.
Orice interfaÆå trebuie så îndeplineascå urmåtoarele cerinÆe ale utilizatorului:
9 InterfaÆa trebuie så-i permitå utilizatorului så controleze evoluÆia programului.
9 Sistemul de meniuri trebuie så fie concis, eficient, logic çi bine structurat.
9 Ecranul nu trebuie aglomerat cu obiecte. Dacå o fereastrå conÆine prea multe butoa-
ne, ele ar trebui înlocuite cu opÆiuni de meniu. Se vor afiça sub formå de butoane
numai controalele care sunt folosite foarte des.
9 InterfaÆa trebuie så-i ofere utilizatorului o reprezentare vizualå complexå a opÆiunilor
de lucru ale aplicaÆiei la momentul respectiv. Folosirea porprietåÆåÆilor de disponibilita-
te sau de vizibilitate ale unui obiect vizual este foarte importantå deoarece împiedicå
accesul uitilizatorului la obiectele care nu pot fi acÆionate în acel moment.
9 Utilizatorul trebuie så fie informat continuu de starea programului. Dacå un proces
dureazå prea mult timp, interfaÆa nu trebuie så îngheÆe, deoarece utilizatorul nu mai
çtie dacå procesul continuå sau s-a blocat. În acest caz, utilizatorul va fi informat cå
procesul continuå fie prin transformarea formei cursorului, fie prin afiçarea unui contor
care numårå paçii parcurçi de proces, fie prin afiçarea unui indicator de evoluÆie, fie
prin imagini grafice animate.
9 InterfaÆa trebuie så permitå anularea unor operaÆii pentru ca utilizatorul så-çi poatå
corecta uçor unele greçeli, fie de introducere a datelor, fie de prelucrare a lor. Pentru
operaÆiile de çtergere este bine så cereÆi confirmarea operaÆiei. Pentru operaÆiile de
introducere a datelor trebuie så prevedeÆi cât mai multe operaÆii de verificare a
236 Informatică

corectitudinii datelor introduse (prin compararea lor cu limitele permise, prin introduce-
rea aceloraçi date de douå ori çi compararea celor douå valori introduse etc.).
9 AplicaÆia trebuie så prevadå cât mai multe cazuri de eroare astfel încât så poatå func-
Æiona în cât mai multe condiÆii ale datelor de intrare. Orice eroare detectabilå trebuie så
declançeze un proces de informare a utilizatorului (prin mesaje care så precizeze
cauzele erorii çi eventual prin sunete pentru atenÆionare) çi de recuperare a datelor.

3.1.3. Stilurile interfeÆei


Existå trei stiluri de interfeÆe:
Ò InterfaÆå cu un singur document (single-document interface - SDI) care permite la un
moment dat deschiderea unui singur document (de exemplu aplicaÆia Notepad). Dacå
vreÆi så deschideÆi un nou document, trebuie închis cel precedent (dacå alegeÆi opÆiunea
New∈File 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 aplicaÆia Word). La un moment dat pot
fi deschise mai multe documente, fiecare document în fereastra sa (dacå este deschis
un document çi alegeÆi opÆiunea New∈File, aplicaÆia va crea un nou formular în care va fi
deschis noul document). Acest stil de interfaÆå poate fi recunoscut prin existenÆa în bara
de meniuri a titlului meniului Window ale cårui opÆiuni sunt folosite la manipularea
ferestrelor cu documente. Unul singur dintre documente este activ, adicå documentul
care primeçte datele introduse de la tastaturå de cåtre utilizator. Formularul
documentului activ este obiectul focalizat din interfaÆa aplicaÆiei.
Ò InterfaÆå de explorare (explorer-style interface) care conÆine o singurå fereastrå
împårÆitå în douå regiuni numite panouri (panel). De obicei, panoul din stânga
conÆine un arbore sau o structurå ierarhicå, iar panoul din dreapta o zonå de afiçare
a unei liste (de exemplu aplicaÆia Windows Explorer). Un astfel de tip de interfaÆå se
foloseçte atunci când trebuie så se caute într-o listå mare cu articole (fiçiere,
documente, imagini etc.) prin operaÆia de råsfoire (browse).

Stilul interfeÆei se alege în funcÆie de tipul aplicaÆiei. Stilul MDI se foloseçte la aplicaÆiile care
necesitå frecvent vizualizarea simultanå a mai multor documente pentru a le compara sau
pentru a face transfer de date între ele cum este de exemplu procesorul de texte (Word). În
cazul altor tipuri de aplicaÆii (cum sunt aplicaÆiile de tip calendar sau calculator) este
suficient så se deschidå un singur document çi de aceea se foloseçte o interfaÆå SDI. În
general, stilul SDI este cel mai råspândit deoarece este un stil de interfaÆå pe care
proiectantul produsului o creeazå mai uçor çi care este mai simplå çi pentru utilizator.
Stilul MDI permite crearea unei interfeÆe care administreazå mai multe formulare într-un
singur formular container. Formularul container se mai numeçte çi fereastrå pårinte
(parent window), iar formularele din interiorul såu se numesc ferestre copil (child
windows). O aplicaÆie MDI poate avea un singur formular pårinte çi mai multe formulare
copil. Formularul pårinte nu poate fi un formular modal. Ferestrele copil pot fi de acelaçi
tip sau de tipuri diferite. Fereastra pårinte furnizeazå un spaÆiu de lucru (workspace)
pentru toate ferestrele copil ale aplicaÆiei. SpaÆiul de lucru este delimitat de bordura
formularului pårinte çi este situat sub bara de meniu.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 237

Formularele interfeÆei MDI au urmåtoarele caracteristici:


9 Formularele copil pot fi afiçate numai în spaÆiul de lucru al formularului pårinte.
Utilizatorul poate muta sau redimensiona formularele copil ca pe orice alt formular, cu
deosebirea cå operaÆiile sunt limitate de spaÆiul de lucru al formularului pårinte.
9 Când un formular copil este minimizat, pictograma sa apare în formularul pårinte çi nu
pe bara de aplicaÆii. Când un formular pårinte este minimizat, formularul pårinte çi
toate formularele copil care îi aparÆin vor fi reprezentate printr-o singurå pictogramå.
Când formularul pårinte este restaurat, sunt restaurate împreunå cu el çi formularele
copil care vor fi afiçate în aceeaçi stare în care erau înainte de minimizare.
9 Când un formular copil este maximizat, legenda sa este combinatå cu legenda
formularului pårinte çi afiçatå în bara de titlu a formularului pårinte.
9 Meniurile care pot fi folosite în formularul copil activ sunt afiçate în bara de meniu a
formularului pårinte ç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).
FiliaÆia formularelor (dacå un formular este formular copil sau formular pårinte) 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 afiçat în acest formular. Atunci când este minimizat nu este afiçat în
bara de aplicaÆii Windows (TaskBar). Se recomandå pentru ferestrele document
ale unei ferestre de aplicaÆie.
2 - As Top Level Form - este un formular independent nemodal în care pot fi
plasate formulare copil. Nu are pårinte çi poate fi folosit fie ca fereastrå într-o
interfaÆå SDI, fie ca fereastrå pårinte într-o interfaÆå MDI. Atunci când este
minimizatå este afiçatå în bara de aplicaÆii Windows. Se recomnadå så o folosiÆi
pentru fereastra aplicaÆiei.
Prin proprietatea de tip logic Desktops controlaÆi locul în care va fi creat formularul: dacå
este .T. se creeazå oriunde pe ecran, iar dacå este .F. se creeazå în fereastra aplicaÆiei
Visual FoxPro (implicit).
Variabila de memorie de sistem _Screens poate fi folositå pentru a referi fereastra
implicitå a aplicaÆiei Visual FoxPro, astfel încât puteÆi manipula aceastå fereastrå ca pe
un obiect: puteÆi så-i modificaÆi proprietåÆile, puteÆi så-i apelaÆi metodele dar nu puteÆi crea
proceduri pentru evenimente.

3.1.4. ProprietåÆile generale ale obiectelor vizuale Visual FoxPro


Obiectele vizuale au proprietåÆi fizice prin care se descrie aspectul lor cum sunt culoa-
rea, dimensiunea çi poziÆia pe ecran, dar çi proprietåÆi care caracterizeazå modul în
care se comportå cum sunt vizibilitatea, disponibilitatea sau numårul de linii dintr-o ca-
setå de text (o linie sau mai multe). Orice obiect vizual are proprietåÆi standard care
sunt comune tuturor obiectelor cum sunt dimensiunea, poziÆia çi vizibilitatea. Pe lângå
aceste proprietåÆi ele mai au çi proprietåÆi specifice, caracteristice obiectului respectiv.
ProprietåÆile sunt descrise printr-un set de date asociate, de un anumit tip.
238 Informatică

ProprietåÆile standard (proprietåÆile comune majoritåÆii obiectelor) sunt:


9 Numele obiectului - Name . Se foloseçte pentru a referi obiectul în program.
9 Dimensiunile obiectului. Sunt de tip numeric çi se exprimå în pixeli. Sunt date de:
Height - înålÆimea (dimensiunea pe verticalå) çi
Width - låÆimea (dimensiunea pe orizontalå).
9 Coordonatele obiectului. Reprezintå un sistem de douå coordonate [x,y] prin care
se stabileçte poziÆia obiectului faÆå de colÆul din stânga sus al reperului (ecranul sau
formularul din care face parte). Pentru stabilirea coordonatelor se folosesc proprie-
tåÆile de tip numeric, exprimate în pixeli :
Left - poziÆia pe orizontalå, faÆå de marginea stângå a reperului (x),
Top - poziÆia 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 foloseçte pentru
afiçatå în bara de titlu. În cazul controale- identificarea obiectului în interior (la nivel
lor, este afiçatå în interiorul lui sau lângå el. de program, de cåtre programator), iar
Au legendå urmåtoarele controale: butonul proprietatea Caption se foloseçte pentru
de comandå, comutatorul, butoanele de identificarea lui în exterior (la nivel de
opÆiuni, cadrele, eticheta, meniul. Proprie- interfaÆå, de cåtre utilizator).
tatea este de tip çir de caractere.
9 Caracteristicile caracterelor folosite în formular. Sunt trei proprietåÆi prin care se carac-
terizeazå 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: Cod SemnificaÆie cod chenar
FontBold - îngroçat, FontItalic - aplecat, Controale
FontUnderline - subliniat, 0 Transparent (invizibil)
FontCondense - condensat, 1 Solid (implicit; linie continuå)
FontExtend - extins, FontOutline - cu 2 Dash (linie întreruptå)
contur, FontStrikethrough - tåiat çi 3 Dot (linie punctatå)
FontShadow - cu umbrå. 4 Dash - Dot (linie formatå din grupuri
9 Culoarea folositå la afiçarea textului este de o linie urmatå de un punct)
specificatå prin proprietåÆile de tip nume-ric 5 Dash - Dot -Dot (linie formatå din gru-
puri de o linie urmatå de douå puncte)
ce reprezintå codul culorii astfel:
6 Inside Solid (linie continuå în interior)
BackColor - culoarea fundalului Formulare
obiectului în care este afiçat textul; 0 No border (fårå chenar)
ForeColor - culoarea primplanului, adicå 1 Fixed Single (chenar simplu)
a textului sau a imaginii din obiect. 2 Fixed Dialog (chenar de tip casetå de
dialog, care nu permite
9 Chenarul (Border) este folosit la unele
redimensionarea formularului)
obiecte (formularul, eticheta, caseta de text,
3 Sizable (implicit; chenar de tip
grila, imaginea, caseta de imagine, linia, fereastrå, care permite redimen-
forma) ca un delimitator. Chenarul poate fi sionarea formularului)
fix sau dimensionabil, trasat cu linie simplå
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 239

sau dublå. Este caracterizat de urmåtoarele proprietåÆi:


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 direcÆiei de
trasare a dreptunghiului care formeazå chenarul: \ - trasarea se face începând de la
colÆul din stânga sus spre colÆul din dreapta jos çi / - trasarea se face începând de la
colÆul din dreapta jos spre colÆul din stânga sus;
Curvature - curbura colÆurilor chenarului stabileçte gradul de rotunjire al colÆurilor çi
este de tip numeric. Poate lua valori de la 0 la 99 determinând aspectul chenarului.
Astfel pentru valoarea 0 chenarul va fi un dreptunghi sau un påtrat, 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 påtrat cu colÆurile rotunjite.
9 Pictograma de glisare - DragIcon . Este de tip çir de caractere çi reprezintå identifi-
catorul fiçierului (calea de director çi numele) care conÆine pictograma ce va fi afiçatå în lo-
cul cursorului de mouse atunci când se executå operaÆia de glisare çi plasare a obiec-
tului.
9 Cursorul de mouse - MousePointer . Este !
de tip numeric çi reprezintå codul asociat Folosind autodocumentarea aflaÆi care
formei cursorului de mouse afiçat atunci sunt valorile asociate proprietåÆii
când este indicatå o zonå a obiectului. MousePointer.
9 Disponibilitatea - Enabled . Este o pro-
prietate de tip logic. Dacå are valoarea .T. controlul este disponibil (enabled), adicå
utilizatorul îl poate acÆiona, iar dacå are valoarea .F. nu este disponibil (disabled), adicå
nu-l poate acÆiona. Un control nu este disponibil atunci când nu sunt îndeplinite condiÆiile
necesare pentru a putea fi folosit. Reprezentarea graficå çi legenda controalelor care nu
sunt disponibile sunt afiçate estompat.
9 Vizibilitatea - Visible . Este o proprietate de tip logic. Dacå are valoarea .T. obiectul este
vizibil, iar când are valoarea .F. nu este vizibil.
Pentru precizarea codului unei culori se foloseçte schema de culori RGB prin care precizaÆi
prin trei numere cuprinse între 0 çi 255 intensitatea pentru fiecare din cele trei culori de bazå:
roçu, verde çi albastru. Pentru a afla codul culorii folosiÆi funcÆia RGB() care are sintaxa
rgb(<r>, <g>,<b>), unde cei trei parametri reprezintå intensitåÆile celor trei culori:
Culoare Parametri RGB() Numår Culoare Parametri RGB() Numår
Alb 255, 255, 255 16777215 Verde 0, 255, 0 65280
Negru 0, 0, 0 0 Verde închis 0, 128, 0 32768
Gri 192, 192, 192 12632256 Cian 0, 255, 255 16776960
Gri închis 128, 128, 128 8421504 Cian închis 0, 128, 128 8421376
Roçu 255, 0, 0 255 Albastru 0, 0, 255 16711680
Roçu închis 128, 0, 0 128 Albastru închis 0, 0, 128 8388608
Galben 255, 255, 0 65535 Magenta 255, 0 ,255 16711935
Galben închis 128, 128, 0 32896 Magenta închis 128, 0, 128 8388736
240 Informatică

3.1.5. Evenimente recunoscute de obiectele vizuale


Atât formularele, cât ç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 secvenÆe de instrucÆiuni prin care
obiectul trebuie så råspundå la diferite evenimente. De exemplu, evenimentele recunos-
cute de majoritatea obiectelor (formulare çi controale) sunt:
9 Evenimente declançate de acÆiunile mouse-ului:
MouseMove - deplasarea mouse-ului pe obiect;
Clicks - clic cu mouse-ul pe obiect cu butonul din stânga (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 opÆiuni
specifice obiectului pe care s-a executat clic);
DblClick - dublu clic cu mouse-ul pe obiect;
MouseDown - apåsarea butonului de mouse;
MouseUp - eliberarea butonului de mouse;
DragOvers - glisarea obiectului cu mouse-ul;
DragDrops - glisarea çi plasarea obiectului cu mouse-ul.
9 Evenimentul declançat la acÆionarea unei taste (apåsarea çi eliberarea ei) -
KeyPress. Procedurii care se va executa la apariÆia acestui eveniment i se pot trans-
mite ca parametri numårul asociat tastei apåsate çi un cod numeric prin care se defineç-
te combinaÆia de taste reci care însoÆeçte tasta apåsatå. Fiecårei taste reci îi cores-
punde un bit poziÆionat pe 1 din codul numeric. Astfel, pentru tasta Shift este bitul 0
(rezultå codul=1), pentru tasta Ctrl bitul 1 PoziÆie 2 1 0
(rezultå codul=2) çi pentru tasta Alt bitul 2 22 21 20
(rezultå codul=4). Se pot combina mai multe ApåsaÆi Alt Ctrl Shift Cod
taste reci. Shift 0 0 1 1
9 Evenimente declançate de crearea çi Ctrl 0 1 0 2
eliberarea obiectului: Ctrl +Shift 0 1 1 3
Alt 1 0 0 4
Init - iniÆializarea obiectului declançatå de
Alt+Shift 1 0 1 5
crearea lui;
Alt+Ctrl 1 1 0 6
Destroys - eliberarea obiectului declança- Alt+Ctrl+Shift 1 1 1 7
tå de metoda de eliberare a zonei de memorie
alocate obiectului.

3.1.6. Focalizarea
Focalizarea (focus) este capacitatea aplicaÆiei de a primi datele de intrare
ale utilizatorului prin intermediul tastaturii sau al mouse-ului.

Ea se manifestå în cadrul interfeÆei prin prezenÆa selectorului. Când selectorul este pozi-
Æionat pe un obiect, acesta va putea primi datele de intrare ale utilizatorului. Pe de o par-
te, sistemul de operare Windows permite lansarea în execuÆie a mai multor aplicaÆii la un
moment dat, dar numai una dintre aplicaÆii are capacitatea de focalizare. Aceasta este
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 241

aplicaÆia activå, adicå aplicaÆia care va primi datele de intrare furnizate de utilizator. Pe
de altå parte, în cadrul unei aplicaÆii la un moment dat pot fi deschise mai multe formu-
lare, înså un singur formular are capacitatea de focalizare çi se numeçte formular activ,
iar în cadrul formularului activ un singur control poate primi focalizarea çi se numeçte
control activ.
Înainte de a focaliza un obiect trebuie activat containerul, acÆiune sesizatå prin eveni-
mentul Activates. Containerul se activeazå:
9 Interactiv: utilizatorul executå clic pe obiectul container.
9 Din program: se apeleazå metoda Show (afiçarea) a obiectului container.
Evenimentul Activate se declançeazå în ordinea de incluziune a formularelor: mai întâi
pentru obiectul FormSet, apoi pentru obiectele Form conÆinute de acesta çi în final pentru
obiectele Page din obiectele Form.
Dupå activarea containerului, un obiect poate fi focalizat:
9 Interactiv: utilizatorul executå clic pe obiect sau apaså repetat tasta Tab pânå
focalizeazå obiectul dorit.
9 Din program: se apeleazå metoda SetFocuss a controlului pe care vreÆi så-l focalizaÆi.
Un obiect îçi poate pierde focalizarea:
9 Interactiv: utilizatorul focalizeazå alt obiect executând clic pe acel obiect.
9 Din program: se apeleazå metoda SetFocuss a controlului pe care-l doriÆi så preia
focali-zarea.
De aceea, formularele çi cele mai multe dintre controale au asociate evenimente de pri-
mire a focalizårii çi de pierdere a focalizårii. Aceste evenimente sunt:
9 Primirea focalizårii declançeazå evenimentul GotFocuss.
9 Pierderea focalizårii declançeazå evenimentul LostFocuss.
Programatorul poate scrie proceduri pentru aceste evenimente, la nivelul fiecårui control.
De exemplu, atunci când un control primeçte focalizarea (evenimentul GotFocus), prin
intermediul procedurii asociate evenimentului pot fi afiçate în casete instrucÆiuni referi-
toare la control sau în bara de stare mesaje de informare despre control.
Obiectul focalizat este evidenÆiat prin diferite metode. De exemplu, un buton declançator
focalizat este evidenÆiat printr-o bordurå care înconjoarå butonul.
Un obiect poate fi focalizat numai dacå are proprietatea de a fi disponibil (de a råspunde
la acÆionåri de la tastaturå sau mouse) çi proprietatea de a fi vizibil pe ecran. Nu pot fi
focalizate urmåtoarele obiecte: eticheta, linia, forma, imaginea çi caseta de imagine.
Focalizarea este controlatå prin douå proprietåÆi de tip referinÆå (adreså), specifice formula-
relor, care sunt protejate la scriere - read-only - çi nu pot fi modificate de programator:
9 ActiveForms - formularul activ. Este o proprietate prin care se face referirea la for-
mularul activ dintr-un set de formulare sau de pe ecran. Poate fi folosit în obiectele
container: Form, FormSet, _Screen. Folosind aceastå referinÆå puteÆi modifica valoa-
rea unei proprietåÆi a formularului activ sau puteÆi apela o metodå a formularului activ:
<nume_obiect_container>.ActiveForm.<proprietate>=<valoare>
<nume_obiect_container>.ActiveForm.<metodå>
242 Informatică

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Æå puteÆi modifica valoarea unei
proprietåÆi a controlului activ:
<nume_obiect_container>.ActiveControl.<proprietate>=<valoare>
Dacå obiectul container nu mai conÆine nici un obiect focalizat, înseamnå cå el este
dezactivat, stare care va fi sesizatå prin evenimentul Deactivates. Evenimentul este
declançat:
9 Interactiv: se mutå focalizarea din obiectul container într-un alt obiect container sau
într-o altå aplicaÆie.
9 Din program: se creeazå un nou obiect care declançeazå evenimentul Activate
pentru noul obiect çi evenimentul Deactivate pentru vechiul obiect.
Transferul controlului focalizårii de la un obiect (formular sau control) se poate face folo-
sind metoda SetFocuss care poate fi apelatå din diferite metode.
Ordinea tabulårii este una dintre proprietåÆile 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å proprietåÆi:
9 TabStops - controlul tabulårii. 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 decât executând clic pe el.
9 TabIndex - indexul tabulårii. Este numårul de ordine al controlului în cadrul formu-
larului atunci când se foloseçte tasta Tab pentru a focaliza un control.
Fomularele pot fi:
9 Modale (modal). Un astfel de formular cere utilizatorului så execute anumite acÆiuni
prin care så închidå formularul activ pentru a putea continua execuÆia aplicaÆiei çi
pentru a putea focaliza un alt formular. Astfel, o casetå de dialog modalå trebuie
închiså prin acÆionarea declançatoarelor OK sau Cancel ca så se poatå continua
lucrul cu restul aplicaÆiei (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 råspuns sau anumite date necesare
pentru continuarea unui proces de prelucrare.
9 Nemodale (modeless). Acest tip de formular nu trebuie închis pentru a ceda focaliza-
rea altui formular. De exemplu, ferestrele cu documente din aplicaÆia Visual FoxPro
sunt ferestre nemodale. Caseta de dialog Find and replace care se deschide cu
opÆiunea Find.../Replace...∈Edit atunci când scrieÆi un program surså cu editorul
încorporat Visual FoxPro permite continuarea lucrului în aplicaÆia curentå (continua-
rea operaÆiei de editare a programului surså) în timp ce caseta de dialog este afiçatå
în continuare pe ecran. Barele cu instrumente sunt çi ele formulare nemodale. Se
recomandå folosirea acestui tip de formular în cazul în care el conÆine 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 prelucrării 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 uçureazå munca programatorului atunci când construieçte interfaÆa cu
ajutorul obiectelor create pe baza claselor vizuale predefinite puse la dispoziÆie de
programarea pe obiecte, din exemplele prezentate se poate vedea cå çi aceastå metodå
este destul de laborioaså. De aceea, pentru construirea interfeÆei se recomandå metoda
vizualå. Açadar:
Programarea vizualå constå în folosirea unor instrumente interactive care ajutå
programatorul så precizeze diferite opÆiuni çi så contruiascå diferite elemente ale
aplicaÆiei, pe baza cårora sistemul genereazå apoi codul programului.
Programarea vizualå se bazeazå pe programarea orientatå pe obiecte (codul de program
este generat folosind programarea orientatå pe obiecte). Metoda vizualå creçte producti-
vitatea programatorului.
Recomandare: Pentru construirea elementelor aplicaÆiei, se recomandå folosirea
metodei vizuale, iar acolo unde nu obÆineÆi efectul dorit folosind aceastå metodå, veÆi
folosi metoda clasicå a programårii structurate pentru a scrie programul.
Programarea vizualå pune la dispoziÆia programatorului douå instrumente interactive:
Ò constructori çi
Ò proceduri asistent.

Cu ajutorul acestor instrumente, programatorul poate construi marea majoritate a elemen-


telor unei aplicaÆii: baza de date, formularele, meniurile, rapoartele, interogårile, vizualizå-
rile etc.
În cazul obictelor de interfaÆå, în procesul de creare a formularului prin intermediul aces-
tor instrumente vizuale, proiectantul trebuie så comunice proprietåÆile 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 fiçier care
are o structurå de tabel çi extensia .scx.
Constructorii de formulare
Principiul folosit de constructorii de formulare este urmåtorul: constructorul pune la dispo-
ziÆia proiectantului de interfaÆå un formular care are proprietåÆi, metode çi evenimente
implicite, iar obiectele care vor fi create în formular vor primi çi ele valori implicite pentru
proprietåÆi (conform clasei de bazå a obiectului respectiv). Rolul proiectantului constå în
modificarea interactivå a valorii unor proprietåÆi ale obiectelor create çi scrierea unor pro-
ceduri asociate metodelor çi evenimentelor, în conformitate cu configuraÆia pe care vrea
så o realizeze pentru interfaÆå. Constructorii de formulare pe care puteÆi så-i folosiÆi sunt:
9 Form Builder - Constructorul rapid - care permite o proiectare rapidå a formularelor
simple. Prin intermediul unei casete de dialog cu mai multe secÆiuni, proiectantul furni-
zeazå constructorului valoarea unor proprietåÆi. El nu are cunoçtinÆå de numele aces-
tor proprietåÆi, ci numai de caracteristicile fomularului pe care le stabilesc. Nu poate
stabili decât valoarea proprietåÆilor asociate acestor caracteristici çi nici nu poate scrie
proceduri asociate evenimentelor çi metodelor. Sunt implementaÆi mai mulÆi construc-
244 Informatică

tori rapizi, fiecare dintre ei specializat pentru un anumit obiect de interfaÆå. Fiecare
constructor rapid afiçeazå anumite secÆiuni, în funcÆie de obiect. Fiecare secÆiune
grupeazå anumite caracteristici ale obiectului care corespund unei categorii de
proprietåÆi. Existå constructori rapizi pentru:
Formulare: Form Builder.
Controale: Combo Box Builder, Command Group Builder, Edit Box Builder,
Text Box Builder, List Box Builder, Option Group Builder.
9 Form Designer - Constructorul normal - care permite construirea unor formulare
complexe. Constructorul pune la dispoziÆia proiectantului diferite instrumente: bara cu
obiectele care pot fi inserate în formular, bara cu instrumente ale aplicaÆiei constructor,
fereastra pentru stabilirea proprietåÆilor, fereastra pentru stabilirea procedurilor
asociate evenimentelor çi metodelor etc. Prin intermediul lor proiectantul atribuie valori
proprietåÆilor (identificate prin numele lor) çi scrie procedurile asociate metodelor çi
evenimentelor.
Pentru lansarea în execuÆie a constructorului folosiÆi comanda:
create form <nume_formular>
unde <nume_formular> este numele fiçierului în care se salveazå formularul.
Pentru modificarea formularului cu ajutorul constructorului folosiÆi comanda:
modify form <nume_formular>
unde <nume_formular> este numele fiçierului în care se salveazå formularul.
Procedura asistent pentru construirea formularelor
Procedura asistent Form Wizard construieçte ea însåçi formularul pe baza unor infor-
maÆii furnizate de proiectant prin intermediul unui dialog desfåçurat în mai mulÆi paçi.
Proiectantul nu modificå proprietåÆile çi nu scrie codurile procedurilor.
Deoarece fiçierul în care este memorat formularul are o structurå de tabel el poate fi
deschis cu comanda use çi vizualizat apoi cu comanda browse. Caracteristicile unui
obiect al formularului sunt memorate în câte o înregistrare fiecare, iar în fiecare coloanå
câte o caracteristicå. De exemplu, coloana Properties conÆine câmpuri de tip memo în
care sunt memorate proprietåÆile care au valori diferite de cele implicite, iar coloana
Methods conÆine câmpuri de tip memo în care sunt memorate procedurile asociate
metodelor çi evenimentelor obiectului.
Pentru a afiça formularul creat pe ecran çi pentru a permite utilizatorului så interacÆioneze
cu obiectele de interfaÆå pe care le conÆine, formularul trebuie lansat în execuÆie prin
comanda:
do form <nume_formular> [with <lista_parametri >] [to < parametru_ieçire>]
Transferul parametrilor se face astfel:
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 245

Formularul
<nume_formular>.scx

Lansarea în execuÆie a procedure init


formularului: parameters <lista_parametri>
............................................
endproc
do form <nume_formular> ............................................
with <lista_parametri > procedure unload
to < parametru_ieçire> ............................................
return <parametru>
endproc

CreaÆi tabelul Agenda1 cu urmåtoarea structurå de câmpuri: nume (C,15), prenume


(C,15) çi telefon (C,10). AdåugaÆi
trei înregistråri de date la tabel. Nu
închideÆi tabelul.
CreaÆi un formular folosind
procedura asistent
„ AlegeÆi opÆiunea Form∈
Wizard8∈Tools. Se deschide
caseta de dialog Wizard Selec-
tion. Din caseta de dialog alegeÆi
opÆiunea Form Wizard. Dacå aÆi
fi creat un formular cu câmpuri
din douå tabele, aÆi fi ales
opÆiunea One-to-Many Form
Wizard. AcÆionaÆi butonul OK.
„ Se deschide caseta de dialog corespunzåtoare primului pas (Step1) în care alegeÆi
câmpurile din tabel pentru care se vor crea obiecte în formular. În acest exemplu veÆi
alege toate câmpurile. Pentru aceste câmpuri, asistentul va crea controale de tip
TextBox asociate cu controale Label. VeÆi circula de la un dialog la altul cu butoanele
Next (dialogul urmåtor) çi Back (dialogul anterior). TerminaÆi dialogul cu butonul Finish.
Dupå ce aÆi selectat toate câmpurile din tabel, treceÆi la urmåtorul dialog Step2.
„ În dialogul Step2 alegeÆi stilul formularului. Din grupul de butoane radio Button Type
activaÆi butonul Text Button, iar din lista Style alegeÆi stilul Chiseled. În acest pas sunt
adåugate controalele pentru editarea câmpurilor din tabel çi suplimentar butoane
pentru administrarea datelor din tabel. Controalele vor avea aspectul fizic stabilit prin
stilul ales. TreceÆi la urmåtorul dialog.
„ În dialogul Step3 alegeÆi criteriul de ordonare a datelor din tabel: ordinea de sortare çi
câmpul cheie pentru sortare care este format dintr-un câmp sau mai multe câmpuri din
246 Informatică

tabel. AlegeÆi pentru criteriul de ordonare


Butoanele adåugate la formular
câmpurile nume çi prenume. TreceÆi la Top Mutå pointerul de înregistrare pe
dialogul urmåtor. prima înregistrare.
„ În dialogul Step4 scrieÆi legenda formularului Prev Mutå pointerul de înregistrare pe
în caseta de text Type a title for your form. înregistrarea precedentå.
Din grupul de butoane radio alegeÆi opÆiunea Next Mutå pointerul de înregistrare pe
Save and run form. AcÆionaÆi apoi butonul înregistrarea urmåtoare.
Finish pentru terminare. Se deschide case- Bottom Mutå pointerul de înregistrare pe
ta de dialog Save As în care comunicaÆi nu- ultima înregistrare.
Find Afiçezå caseta de dialog Search
mele formularului Agenda1.
prin intermediul cåreia construiÆi
„ Dupå închiderea casetei Save as este un criteriu de cåutare a unei
lansat în execuÆie formularul. înregistråri.
„ TestaÆi butoanele formularului executând Print Tipåreçte un raport cu datele din
operaÆii de vizualizare a înregistrårilor, de tabel.
adåugare, de çtergere çi de cåutare a unei Add Adaugå o înregistrare la sfârçitul
tabelului.
înregistråri.
Edit Permite modificarea valorilor din
„ ÎnchideÆi formularul. câmpurile înregistrårii curente.
„ DeschideÆi tabelul asociat formularului cu Delete Çterge înregistrarea curentå.
comanda use Asgnda1.scx. VizualizaÆi cu Exit Închide formularul form.
comanda list stru structura de câmpuri a tabelului asociatå formularului. VizualizaÆi
conÆinutul tabelului cu comanda browse. IdentificaÆi proprietåÆile çi metodele asociate
formularului çi obictelor din formular. ÎnchideÆi fereastra Browse. ÎnchideÆi fiçierul cu
comanda use. DeschideÆi tabelul cu comanda use Agenda1.

CreaÆi un formular folosind constructorul rapid pentru formulare


„ LansaÆi în execuÆie constructorul de formulare fie cu comanda:
create form agenda2
fie prin opÆiunea de meniu New...∈File. Se deschide caseta de dialog New din care
alegeÆi din grupul de butoane radio File Type opÆiunea Form çi apoi executaÆi clic pe
butonul New File.
„ Se deschide fereastra aplicaÆiei Form Designer. În fereastrå este deschiså fereastra
document Form1 în care se vor crea obiectele care aparÆin formularului. SuprafaÆa
formularului este divizatå printr-o grilå care va ajuta utilizatorul la aranjarea obiectului
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 247

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


adåugat un titlu de meniu (Form) cu opÆiuni specifice constructorului de formulare. În

Meniul Form care conÆine opÆiuni specifice


constructorului de formulare

Grila prin care este divizatå


suprafaÆa formularului.

partea inferioarå ferestrei sunt afiçate douå liste ascunse: Form care este disponibilå
numai dacå aÆi creat un set de
formulare çi vå permite så
alegeÆi un formular din set çi
Page care este disponibilå
numai dacå aÆi creat un set de
pagini çi vå permite så alegeÆi
o paginå din set.
„ AlegeÆi opÆiunea
Quick Form...∈Form. Se
deschide caseta de dialog
Form Builder. Caseta de dia-
log conÆine douå secÆiuni: sec-
Æiunea Field Section din care
alegeÆi câmpurile din baza de
date pentru care doriÆi så creaÆi obiecte în formular pentru editarea datelor. AlegeÆi toate
câmpurile din tabel: din lista Available Fields selectaÆi câmpul çi executaÆi clic pe
butonul 8 . Din secÆiunea Style alegeÆi stilul formularului (alegeÆi opÆiunea Embosed din
lista Style). ÎnchideÆi caseta de dialog executând clic pe declançatorul OK.
248 Informatică

„ În proiectul de formular vor fi inserate automat casete de text pentru editarea


câmpurilor din tabel çi etichete asociate acestor câmpuri pentru identificarea lor.
„ ÎnchideÆi aplicaÆia (clic pe butonul de închidere al ferestrei de aplicaÆie).
„ DeschideÆi tabelul asociat formularului cu comanda use Agenda2.scx. VizualizaÆi con-
Æinutul tabelului cu comanda browse. IdentificaÆi obiectele create în formular (coloana
câmpurilor Objectname) çi proprietåÆile asociate acestor obiecte (coloana câmpurilor
Properties). ÎnchideÆi fiçierul cu comanda use.

3.3. For m ularele

3.3.1. Metodele çi evenimentele specifice formularelor


Formularele pot executa acÆiuni (au asociate metode) çi pot råspunde la evenimente.
Evenimentele la care pot råspunde formularele sunt:
9 IniÆializarea obiectului Init declançat de crearea obiectului; procedura asociatå
acestui eveniment se executå automat la crearea formularului çi are ca scop prelua-
rea parametrilor transmiçi de modulul apelant (în cazul unui apel cu parametri, prima
instrucÆiune din metoda init va fi parameters <listå_parametri_formali>).
9 Încårcarea formularului Load ; procedura asociatå acestui eveniment se apeleazå
înaintea procedurii asociate evenimentului de iniÆializare çi poate conÆine instrucÆiuni
care trebuie så se execute înainte de a iniÆializa obiectele din formular (de exemplu
iniÆializarea unor variabile de memorie, deschiderea unor tabele etc.). Evenimentele
Load sunt sesizate în ordinea incluziunii obiectelor. De exemplu, este sesizat eveni-
mentul Load al unui set de formulare çi apoi cele ale formularelor conÆinute.
9 Activarea formularului Activate care då posibilitatea de a interacÆiona cu obiectele din
formular, ca de exemplu evidenÆierea unui text dintr-o casetå de editare.
9 Dezactivarea formularului Deactivate - se produce atunci când este activat un alt
formular.
9 Distrugerea formularului Destroy - are ca efect çtergerea din memoria internå a
tuturor informaÆiilor despre formular çi eliminarea formularului de pe ecran.
9 Descårcarea 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 execuÆie).
ObservaÆii:
1. Procedura asociatå evenimentului Load se executå înainte de cele asociate eveni-
mentelor Init, Activate çi GotFocus.
2. Într-un formular pot fi create mai multe obiecte, fiecare dintre ele având propriul
eveniment Init. Ordinea de execuÆie a procedurilor de iniÆalizare este: mai întâi se
executå iniÆializarea obiectelor din formular (controalele) în ordinea în care au fost
definite çi apoi iniÆializarea formularului. În acest mod puteÆi 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 prelucrării 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
transmiçi ca variabile globale.
4. Procedura asociatå evenimentului Unload se executå dupå procedura asociatå
evenimentului Destroy çi dupå ce au fost eliberate toate obiectele conÆinute. De
exemplu, dacå un formular este creat într-un set de formulare çi conÆine o casetå de
text çi un buton de comandå, la eliberarea unui formular evenimentele sunt tratate în
urmåtoarea 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 afiçare Show - are ca efect afiçarea pe ecran a formularului care a fost
creat sau care a fost ascuns anterior.
9 AcÆiunea de ascundere Hide - are ca efect îndepårtarea formularului de pe ecran,
fårå ca informaÆiile referitoare la el så fie çterse din memoria internå; se pot executa
chiar diferite operaÆii cu formularul ascuns, ca de exemplu crearea în formular a unor
noi controale care vor fi afiçate atunci când formularul va fi reafiçat.
9 Metoda de reactualizare Refresh - are ca efect reîmprospåtarea formularului çi a
obiectelor din formular, astfel încât ele så afiçeze valorile actuale; în aceastå metodå
vor fi scrise instrucÆiunile prin care se pot actualiza valorile unor proprietåÆi ale formu-
larului 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
vizualizårile bazei de date. De aceea, o datå cu crearea formularului se creeazå çi obiec-
tul container nevizual DataEnvironment care conÆine obiectele Cursor (påstreazå evi-
denÆa tabelelor çi a vizualizårilor asociate) çi Relation (påstreazå legåturile dintre tabele).
Prin intermediul acestui control container se deschid tabelele çi vizualizårile asociate çi
se stabilesc legåturile dintre tabele çi se închid tabelele çi vizualizårile atunci când se în-
chide çi formularul. Proprietatea DataEnvironment a formularului conÆine referinÆa cåtre
obiectul DataEnvironment asociat formularului. Dacå nu se foloseçte obiectul
DataEnvironment, comenzile pentru deschiderea tabelelor çi a vizualizårilor se pot scrie
în proecdura asociatå evenimentului Load, iar comenzile pentru închiderea lor în
procedura asociatå evenimentului Unload.
Mediul de date poate conÆine tabele ale bazei de date sau tabele libere. Dacå tabelele
fac parte dintr-o bazå de date, mediul de date preia çi legåturile permanente dintre
tabele. Se pot påstra aceste legåturi, se pot modifica sau pot fi înlocuite cu altele noi.
Dacå tabelele sunt libere, trebuie precizate legåturile dintre ele.
Obiectul DataEnvironment are urmåtoarele proprietåÆi, metode çi evenimente specifice:
9 ProprietåÆile de tip logic se recomandå numai dacå localizarea pe disc a tabelelor çi a
vizualizårilor este cunoscutå de cåtre programator la proiectarea formularului, altfel se vor
folosi metodele asociate obiectului:
250 Informatică

AutoOpen - Dacå are valoarea .T. tabelele çi vizualizårile din mediul de date sunt
deschise automat o datå cu crearea formularului.
AutoClose - Dacå are valoarea .T. tabelele çi vizualizårile din mediul de date sunt
închise automat o datå cu eliberarea formularului.
9 Evenimentele la care poate råspunde mediul datelor sunt:
BeforeOpenTables - Evenimentul este declançat înaintea deschiderii tabelelor çi
a vizualizårilor din mediul de date. Se declançeazå înaintea evenimentului Load al for-
mularului pentru cå tabelele trebuie så fie deschise înainte de iniÆializarea formu-
larului, deoarece în formular trebuie afiçate date din aceste tabele çi vizualizåri. În
procedura asociatå acestui eveniment se pot stabili numele tabelelor çi vizualizårilor
care se vor deschide çi locul în care sunt memorate pe disc.
AfterCloseTables - Evenimentul este declançat dupå închiderea tabelelor çi a vizua-
lizårilor din mediul de date (este provocat de fiecare apel al metodei CloseTables). Se
declançeazå dupå descårcarea formularului (dupå evenimentul Unload al formula-
rului).
9 Metodele pe care le poate executa mediul de date sunt:
OpenTables - dechiderea tabelelor çi vizualizårilor din mediul de date; în aceastå
metodå se scriu instrucÆiunile pentru deschiderea tabelelor în diferite zone de lucru.
CloseTables - închiderea tabelelor çi vizualizårilor din mediul de date; în aceastå
metodå se scriu instrucÆiunile pentru închiderea tabelelor deschise în diferite zone de
lucru.

Sesiunea (session) este intervalul de timp în care o aplicaÆie primeçte date


çi le prelucreazå. Sesiunea de date (data session) este mediul de date
asociat sesiunii (parametrii sistemului, variabile de memorie, fiçiere de date).
În Visual FoxPro un formular poate rula în:
9 sesiunea de date implicitå care preia configurårile implicite ale mediului Visual
FoxPro.
9 sesiunea de date privatå (proprie formularului) în care toate configurårile mediului
trebuie fåcute la crearea formularului; acest tip de sesiune creeazå o mai mare
independenÆå a formularului faÆå de mediu.
OperaÆiile pe care trebuie så le executaÆi pentru a proiecta un formular sunt urmåtoarele:
1. DeschideÆi constructorul pentru proiectarea formularului (Form Designer).
2. DefiniÆi proprietåÆile formularului çi scrieÆi procedurile asociate metodelor çi eveni-
mentelor formularului.
3. DeschideÆi baza de date pentru a se crea obiectul DataEnvironment asociat
formularului.
4. CreaÆi controalele în formular. DefiniÆi proprietåÆile lor çi scrieÆi procedurile asociate
metodelor çi evenimentelor fiecårui control.
5. SalvaÆi formularul.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 251

3.3.3. Obiecte de tip formular

Formularul Formx
Cu ajutorul acestui tip de obiect vizual puteÆi crea formulare de tip fereastrå sau casetå
de dialog.
Formularele au proprietåÆi, metode çi evenimente cu care le este controlat aspectul çi
comportamentul. Pe lângå proprietåÆile standard, formularele mai au urmåtoarele
proprietåÆi specifice care determinå aspectul çi comportamentul lor:
9 Starea ferestrei - WindowStates. Este o proprietatea de tip numeric care con-
troleazå starea în care se gåseçte fereastra: normalå (0), minimizatå (1) sau maxi-
mizatå (2). Fereastra minimizatå ve fi reduså fie la o dimensiune minimå, fie la o picto-
gramå. Fereastra maximizatå va fi måritå astfel încât så ocupe tot ecranul.
9 Dimensiunile ferestrei minimizate sunt specificate prin proprietåÆile de tip numeric:
MinHeight - înålÆimea ferestrei minimizate;
MinWidth - låÆimea ferestrei minimizate.
9 Pictograma ferestrei minimizate - Icon . Este de tip çir de caractere çi reprezintå
identificatorul fiçierului care conÆine pictograma asociatå ferestrei minimizate. Fiçierul
trebuie så fie de tip fiçier de pictograme (.ico).
9 Pictograma meniului de control - Picture . Este de tip çir de caratere çi reprezintå
identificatorul fiçierului sau numele unui câmp de tip General care conÆine pictograma
asociatå butonului meniului de control. Fiçierul trebuie så fie de tip bitmap (.bmp) sau
de pictograme (.ico).
9 Scara de poziÆionare - ScaleMod . Este de tip numeric çi reprezintå un cod pentru
unitatea de måsurå folositå pentru coordonatele obiectului. Are valoarea 0 pentru
unitatea de måsurå Foxels (unitate specificå mediului Visual FoxPro, echivalentå cu
înålÆimea maximå çi låÆimea medie a unui caracter din fontul curent çi 3 pentru pixeli.
9 Coordonatele poziÆiei în care se poate începe scrierea unui text sau desenarea unui
obiect grafic într-un formular sunt specificate prin proprietåÆile de tip numeric:
CurentX - coordonata <x>;
CurentY - coordonata <y>.
9 Centrarea formularului - AutoCenter . Este o proprietate de tip logic. Dacå are
valoarea .T. formularul este afiçat automat în centrul reperului (ecran sau alt formular) fårå
så se Æinå cont de valorile proprietåÆilor Left çi Top.
9 Acoperirea formularului - AlwaysOnTop . Este o proprietate de tip logic. Dacå are
valoarea .T. formularul nu poate fi acoperit de alte formulare.
9 Umplerea este specificatå prin proprietåÆile de tip numeric:
FillStyle - modelul care va fi afiçat în fundalul formularului;
FillColor - culoarea modelului afiçat în fundalul formularului.
9 Butoanele specifice unui formular sunt precizate prin proprietåÆile de tip logic:
MinButton - controleazå dacå formularul are buton de minimizare sau nu;
MaxButton - controleazå dacå formularul are buton de maximizare sau nu;
252 Informatică

ControlBox - controleazå dacå formularul are buton de meniu de control sau nu.
9 ProprietåÆi legate de comportament sunt specificate prin proprietåÆile de tip logic:
Closable - controleazå dacå formularul poate fi închis folosind meniul de control
(opÆiunea Close a meniului sau dublu clic pe butonul meniului) sau nu;
Movable - controleazå dacå formularul poate fi mutat sau nu;
9 Afiçarea casetelor cu informaÆii despre controalele din formular ShowTips este
de tip logic: dacå are valoarea .T. (implicit în ToolBar) se afiçeazå caseta cu informaÆii
despre controlul indicat cu mouse-ul (ToolTip), iar dacå are valoarea .F. (implicit în
Form) nu se afiçeazå caseta.
Evenimentele la care pot råspunde formularele sunt:
9 Redimensionarea formularului Resize - este declançat fie prin schimbarea interac-
tivå a dimensiunii formularului, fie prin modificarea din program a dimensiunii sale
(proprietåÆile Height çi Width).
9 Mutarea formularului Moved - este declançat fie prin mutarea interactivå a formula-
rului, fie prin modificarea din program a poziÆiei sale (proprietåÆile Top çi Left).
Metodele pe care le pot executa formularele sunt:
9 Metoda de mutare a formularului pe ecran Move .
9 Metoda de desenare a unei linii în formular Line ; prin intermediul parametrilor se
vor preciza coordonatele primului punct (x1,y1) çi coordonatele celui de al doilea
punct (x2,y2). Parametrii se vor scrie între paranteze rotunde, dupå numele metodei.
Dupå desenare, coordonatele poziÆiei de desenare vor fi (x2,y2).
9 Metoda de desenare a unui dreptunghi în formular Box ; prin intermediul parametrilor
se vor preciza coordonatele colÆului din stânga sus (x1,y1) çi coordonatele colÆului din
dreapta jos (x2,y2). Dupå desenare, coordonatele poziÆiei de desenare vor fi (x2,y2).
9 Metoda de desenare a unui cerc în formular Circle ; prin intermediul parametrilor se
vor preciza raza cercului çi coordonatele centrului cercului (x,y). Dupå desenare,
coordonatele poziÆiei de desenare vor fi (x,y).
9 Metoda de scrierea a unui text în formular Print ; prin intermediul parametrului se
precizeazå çirul de caractere care va fi scris. Dupå scriere, coordonatele poziÆiei de
desenare vor fi cele de la sfârçitul textului.
9 Metoda de çtergere a textului çi a desenelor din formular Cls . Dupå çtergere,
coordo-natele poziÆiei de desenare vor fi (0,0).

IdentificaÆi instrumentele constructorului de formulare


VeÆi realiza un formular pentru testarea metodelor folosite într-o fereastrå.
„ DeschideÆi fereastra constructorului de aplicaÆii fie cu opÆiunea de meniu New...∈File
(în caseta de dialog New File alegeÆi butonul Form din grupul de butoane radio File
Type çi apoi executaÆi clic pe butonul New File), fie cu comanda create form forma1.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 253

„ Pentru crearea formularului çi a obiectelor din formular Constructorul de formulare


vå pune la dispoziÆie urmåtoarele instrumente:
9 Ferestre:
Fereastra aplicaÆiei. Are titlul Form designer urmat de numele fiçierului în care se
creeazå formularul. Fereastra conÆine spaÆiul formularului în care veÆi defini obiectele.
Fereastra de proprietåÆi. Are titlul Properties çi conÆine mai multe secÆiuni .
Fereastra pentru secvenÆele de cod asociate metodelor çi evenimentelor. Are
titlul <nume_obiect>.<nume_procedura>, unde <nume_obiect> este numele obiec-
tului pentru care scrieÆi procedura (îl puteÆi alege din lista ascunså Object), iar
<nume_procedura> este numele metodei sau evenimentului pentru care scrieÆi
procedura (îl puteÆi alege din lista ascunså Procedure).
Fereastra mediului de proprietåÆi ale formularului. Are titlul Data Environment
çi poate fi folositå pentru precizarea tabelelor, a vizulizårilor çi a relaÆiilor dintre ele.
Tabelele vor fi deschise automat la definirea formularului.
9 Bare cu instrumente:
Bara pentru obiectele de interfaÆå - Form Controls Toolbar. Afiçeazå controale cu
ajutorul cårora selectaÆi obiectul pe care vreÆi så-l creaÆi în cadrul formularului.
Bara pentru manipularea obiectelor - Layout Toolbar. Afiçeazå controale cu
ajutorul cårora manipulaÆi obiectele pe care le-aÆi creat în formular.
Bara aplicaÆiei - Form Designer. Afiçeazå controale cu ajutorul cårora stabiliÆi
instrumentele afiçate de aplicaÆie.
Bara pentru controlul culorilor - Color Palette. Afiçeazå controale cu ajutorul cårora
alegeÆi culorile.
9 OpÆiuni de meniu:
Meniul Form este vizibil numai dacå este deschiså fereastra constructorului de
formulare çi conÆine opÆiuni specifice acestei aplicaÆii. Prin intermediul opÆiunilor
sale puteÆi administra clasele definite de utilizator (crearea çi modificarea unor
proprietåÆi çi metode, includerea unui fiçier de constante), puteÆi administra seturi
de formulare (crearea setului de formulare, adåugarea sau înlåturarea formularelor
din set etc.), puteÆi administra formularul pe care îl creaÆi (deschiderea
constructorului rapid pentru crearea lui, lansarea lui în execuÆie, modificarea lui).
În meniul View devin vizibile opÆiuni prin care puteÆi så stabiliÆi instrumentele
Constructorului de formulare care vreÆi så fie afiçate.
În meniul Format devin vizibile opÆiuni prin care puteÆi så stabiliÆi caracteristicile
grilei folosite pentru alinierea obiectelor în formular.
OpÆiunile de meniu:
OpÆiunea SemnificaÆia
Meniul View
Data OpÆiune de tip comutator. Controleazå afiçarea ferestrei mediului de date.
Environment
Properties OpÆiune de tip comutator. Controleazå afiçarea ferestrei de proprietåÆi.
Code OpÆiune de tip comutator. Controleazå afiçarea ferestrei pentru secvenÆele de cod.
254 Informatică

OpÆiunea SemnificaÆia
Form Controls OpÆiune de tip comutator. Controleazå afiçarea barei cu instrumente pentru
Toolbar crearea obiectelor în formular.
Layout Toolbar OpÆiune de tip comutator. Controleazå afiçarea barei cu instrumente pentru
administrarea obiectelor în formular.
Color Palette OpÆiune de tip comutator. Controleazå afiçarea barei cu instrumente pentru
Toolbar stabilirea culorilor.
Tab Order Permite modificarea ordinii de focalizare cu tasta Tab a obiectelor din formular.
Ordinea implicitå este cea în care au fost proiectate (adåugate la formular).
Grid Lines OpÆiune de tip comutator. Afiçeazå/ascunde grila pentru alinierea obiectelor.
Show Position OpÆiune de tip comutator. Controleazå afiçarea în bara de stare a poziÆiei çi
dimensiunii obiectului selectat.
Meniul Format
Snap To Grid OpÆiune de tip comutator. Controleazå alinierea automatå a obiectelor nou create
la liniile grilei.
Set Grid Scale Permite modificarea distanÆelor (în pixeli) dintre liniile grilei.
Meniul Form
New Property... Creeazå o proprietate nouå pentru o claså definitå de utilizator. Se deschide
caseta de dialog New Property prin intermediul cåreia stabiliÆi numele çi
descrierea proprietåÆii.
New Method... Creeazå o metodå nouå pentru o claså definitå de utilizator. Se deschide caseta de
dialog New Method prin intermediul cåreia stabiliÆi numele çi descrierea metodei.
Edit Property/ Permite modificarea sau çtergerea unei proprietåÆi sau metode definite de utiliza-
Method... tor. Se deschide caseta de dialog Modify Property/Method prin intermediul
cåreia administraÆi proprietåÆile çi metodele definite.
Include File...
Permite specificarea numelui fiçierului cu constante predefinite ale clasei definite
de utilizator.
Create Form Creeazå un set de formulare care va conÆine formularul curent. Dacå existå deja
Set un set de formulare, opÆiunea nu este disponibilå.
Remove Form Înlåturå setul de formulare. OpÆiunea este disponibilå numai dacå existå un set de
Set formulare, iar acesta conÆine numai un formular.
Add New Form Adaugå un formular la setul de formulare. OpÆiunea este disponibilå numai dacå a
fost creat un set de formulare.
Remove Form Înlåturå formularul curent din set. OpÆiunea este disponibilå numai dacå a fost
creat un set de formulare, iar acesta conÆine mai mult de un formular.
Quick Form... Deschide fereastra Constructorului rapid de formulare.
Run Form Lanseazå în execuÆie formularul.
„ IdentificaÆi instrumentele specifice constructorului de formulare: butoanele din barele
de instrumente, ferestrele çi opÆiunile de meniu specifice acestei aplicaÆii.
„ AfiçaÆi barele cu instrumente çi identificaÆi pe fiecare barå controalele pe care le puteÆi
folosi.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 255

Buton Buton Buton


1 Select Object 9 CheckBox 17 OLE Container Control
2 View Classes 10 ComboBox 18 OLE Bound Control
3 Label 11 List 18 Line
4 TextBox 12 Spinner 20 Shape
5 EditBox 13 Grid 21 Container
6 CommandButton 14 Image 22 Separator
7 CommandGroup 15 Timer 23 BuildLock
8 OptionButton 16 PageFrame 24 ButtonLock
Marea majoritate a butoanelor din bara Form controls le veÆi folosi pentru a crea obiecte în
formulare (Label, TextBox etc.). Butonul Select Object îl puteÆi folosi pentru a selecta un
grup de obiecte din formular. Butonul BuildLock îl puteÆi folosi pentru a lansa în execuÆie
Constructorul rapid pentru formulare, iar butonul ButtonLock îl veÆi folosi atunci când veÆi
dori så creaÆi mai multe instanÆe ale aceluiaçi obiect.

1 2 3 4 5 6 7 8 9
Buton Buton Buton
1 Set Tab Order 4 Code Window 7 Layout Toolbar
2 Data Environment 5 Form Control Toolbar 8 Form Builder
3 Properties Windows 6 Color Palette Toolbar 9 Auto Format
Majoritatea butoanelor din bara Form Designer pot fi folosite pentru a stabili ce
instrumente ale aplicaÆiei veÆi afiça (fereastra de proprietåÆi, fereastra de cod etc). Butonul
FormBuilder îl puteÆi folosi pentru lansa în execuÆie Constructorul rapid pentru formulare.
Butonul AutoFormat îl veÆi folosi atunci când veÆi dori så aplicaÆi un anumit stil de formatare
asupra obiectelor de acelaçi tip, selectate. Stilul de formatare se referå la aspectul
chenarului, la culorile folosite, la fonturile caracterelor, la alinierea obiectelor çi la efectul 3D
al obiectelor. La acÆionarea acestui buton se deschide fereastra aplicaÆiei Constructorului
de format: AutoFormat Builder. IdentificaÆi opÆiunile de meniu pentru care butoanele din
aceastå barå sunt scurtåturi.

1 2 3 4 5 6 7 8 9 10 11 12 13

Buton Buton Buton


1 Align Left Sides 5 Align Vertical Centers 10 Center Horizontally
2 Align Right Sides 6 Align Horizontal Centers 11 Center Vertically
3 Align Top Edges 7 Same Width 12 Bring to Front
4 Align Bottom Edges 8 Same Height 13 Send to Back
9 Same Size
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 afiçate (obiectele pot fi
256 Informatică

afiçate în douå straturi). Butoanele Align Left Se stabileçte


Sides, Align Right Sides, Align Top Edges çi culoarea cernelii.
Align Bottom Edges se folosesc pentru alinierea
controalelor faÆå de marginea grupului selectat. Se stabileçte
Butoanele Align Vertical Centers çi Align culoarea hârtiei.
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
Width, Same Height çi Same Size se folosesc pentru l l a i uniformiza dimensiunea
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 afiçat grupul de controale:
deasupra celorlalte sau dedesubt.
Paleta de culori conÆine controale prin care puteÆi så stabiliÆi elementul pentru care alegeÆi
culoarea (hârtia sau cerneala), controale pentru o paletå standard de culori çi controlul
pentru deschiderea unui constructor de culori.
„ În fereastra de proprietåÆi puteÆi stabili çi vizualiza proprietåÆile formularului çi a fie-
cårui obiect din formular. Din lista ascunså alegeÆi formularul sau obiectul pentru
care stabiliÆi proprietåÆile. Dacå deschideÆi aceastå listå puteÆi vedea ierarhia de
obiecte a formularului. Prin intermediul ei identificaÆi relaÆia de filiaÆie a obiectelor în
formular. Existå urmåtoarele convenÆii în scrierea proprietåÆilor î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 conÆine opÆiunea Reset to Default prin
care se atribuie proprietåÆii valoarea implicitå çi Help... care deschide fereastra cu
informaÆii despre proprietate (help dependent de context).
„ DefiniÆi în fereastrå douå obiecte, o etichetå çi o casetå de text astfel: executaÆi clic pe
butonul Label din bara cu controale çi apoi indicaÆi în formular colÆul din stânga sus al
etichetei çi glisaÆi mouse-ul pânå când obÆineÆi dimensiunea doritå pentru obiect.
RepetaÆi operaÆia pentru caseta de text (butonul TextBox). IdentificaÆi pentru aceste
controale valorile implicite pentru proprietåÆile, evenimentele çi metodele asociate.
„ Formularul çi obiectele din formular au fiecare câte un meniu rapid de comenzi pe
care îl deschideÆi executând pe formular sau pe obiect clic cu butonul din dreapta al
mouse-ului. În tabel, opÆiunile disponibile pentru formular sunt marcate cu F, iar cele
disponibile pentru obiecte sunt marcate cu O.
OpÆiunea SemnificaÆie
Run F Lanseazå în execuÆie formularul.
Copy O Copiazå în Clipboard obiectul selectat.
Cut O Mutå în Clipboard obiectul selectat.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 257

OpÆiunea SemnificaÆie
Paste F Insereazå în formular, în poziÆia indicatå, obiectul care fost copiat anterior în
Clipboard.
Data F Deschide fereastra Data Environment
Environment
Properties F,O Afiçeazå în fereastra de proprietåÆi formularul sau obiectul selectat.
Builder F,O Deschide fereastra Constructorului rapid de formulare corespunzåtoare
obiectului selectat.
Code F,O Deschide fereastra pentru scrierea secvenÆei de cod asociate unei metode
sau eveniment al obiectului selectat.
Help F,O Deschide fereastra cu informaÆii despre obiect (help dependent de context).

Lista ascunså din care alegeÆi obiectul


pentru care stabiliÆi prorpietåÆile çi
procedurile pentru metode çi evenimente.

SecÆiunea ConÆine
All Toate proprietåÆile
Data Numai proprietåÆile care carac-
terizeazå data memoratå în control.
Method Numai metodele çi evenimentele
asociate obiectului.
Layout Numai proprietåÆile care
caracterizeazå aspectul controlului.
Other Alte proprietåÆi decât cele care
caracterizeazå datele çi aspectul.

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

„ IdentificaÆi, pentru formular çi obiectele definite în formular, opÆiunile meniului rapid.


„ Cu obiectele din formular puteÆi executa mai multe operaÆii:
Selectare obiect - executaÆi clic pe suprafaÆa obiectului.
Selectare grup de obiecte - executaÆi clic pe butonul Select Object din bara Form
controls çi glisaÆi apoi mouse-ul peste obiectele pe care vreÆi så le selectaÆi.
Mutarea obiectului - fie glisaÆi obiectul cu mouse-ul, fie selectaÆi obiectul çi apoi
folosiÆi operaÆiile Cut çi Paste (din meniul Edit sau din meniul de comenzi rapide).
258 Informatică

Copierea obiectului - selec-taÆi obiectul çi apoi folosiÆi operaÆiile Copy çi Paste (din
meniul Edit sau din meniul de comenzi rapide).
Çtergerea obiectului - selectaÆi obiectul çi apoi apåsaÆi tasta Delete.
CreaÆi instanÆe multiple ale unui obiect - executaÆi clic pe butonul ButtonLock din
bara Form controls, executaÆi apoi clic în aceastå barå pe obiectul pentru care creaÆi
instanÆe multiple, creaÆi obiectul în formular çi apoi executaÆi clic în locul în care vreÆi
så creaÆi o copie a acestui obiect. ExecutaÆi clic pentru fiecare copie pe care vreÆi så o
creaÆi. Dupå ce aÆi terminat de creat copii ale obiectului, dezactivaÆi aceastå funcÆie
executând clic pe butonul ButtonLock.
„ Folosind funcÆia de creare de
instanÆe multiple, mai adåugaÆi
la formular douå casete de
text. SelectaÆi grupul de ca-
sete de text çi aplicaÆi un
anumit stil acestor casete (cu
AutoFormat Builder). AliniaÆi
grupul în diferite maniere folo-
sind butoanele de pe bara
Layout.
„ SchimbaÆi ordinea de par- Structura ierarhizatå
curgere a formularului fie folo- a formularului.
sind opÆiunea de meniu, fie
butonul Sel Tab Order din
bara Form Designer. StabiliÆi
ordinea executând clic în formular, pe obiecte, în ordinea în care vreÆi så fie parcurse:

Noua ordine de parcurgere a


formularului cu tasta Tab.

„ ÎnchideÆi constructorul de formulare fårå så salvaÆi modificårile fåcute.


Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 259

CreaÆi un formular
VeÆi realiza un formular în care textul çi
desenele sunt afiçate numai dacå se indicå
formularul cu mouse-ul çi se apaså butonul
stâng. La eliberarea butonului de mouse
textul çi desenele afiçate se çterg.
„ DeschideÆi fereastra constructorului
de aplicaÆii.
„ În fereastra de proprietåÆi atribuiÆi
urmåtoarele valori proprietåÆilor (ca-
re determinå aspectul çi comportarea
formularului):
Name = "Form1"
ScaleMode = 3 FontBold = .T.
Top = 13 DrawWidth = 5
Left = 14 FillColor = 150,150,150
Height = 300 FillStyle = 7
Width = 450 Closable = .T.
Desktop = .F. Enabled = .T.
BackColor = 220,220,220 Visible = .T.
ForeColor = 0,0,0 ShowTips = .F.
BorderStyle = 2 TabIndex = 1
Caption = "Exemplu" TabStop = .T.
FontName = "Courier New" WindowState = 0
FontSize = 16 WindowType = 0
„ Pentru afiçarea textului çi a desenelor, la apåsarea butonului de mouse s-a scris
procedura asociatå evenimentului MouseDown în care s-au apelat metodele spe-
cifice formularelor - Print (scrierea textului), Line (desenarea liniei), Circle (desena-
rea cercului). Pentru a avea acces la fereastra de cod, deschideÆi în fereastra de
pro-prietåÆi secÆiunea Method çi din lista de metode çi evenimente alegeÆi
evenimentul MouseDown.

Din lista ascunså Din lista ascunså


Object puteÆi alege Procedure puteÆi
obiectul pentru alege evenimentul
care scrieÆi codul sau metoda pentru
procedurii. care scrieÆi
secvenÆa de cod.

Procedure MouseDown ThisForm.CurrentX=10


Lparameters nButton, nShift,; ThisForm.CurrentY=10
nXCoord, nYCoord 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
„ SalvaÆi formularul çi îl lansaÆi în execuÆie executând clic pe butonul Run din bara
standard.
Run - LansaÆi în execuÆie Modify Form - ModificaÆi
formularul formularul
ObservaÆie:
Procedurile asociate evenimentelor MouseMove, MouseUp çi MouseDown primesc din
partea sistemului urmåtoarele informaÆii prin intermediul parametrilor:
nButton - reprezintå butonul de mouse acÆionat: 1 - butonul stâng, 1 - butonul
drept çi 4 -butonul din mijloc.
nShift - este un cod numeric (modul în care se calculeazå a fost prezentat la eve-
nimentul PressKey) prin care se poate determina dacå mouse-ul a fost acÆionat
împreunå cu o tastå rece Shift, Alt çi Ctrl.
nXCoord, nYCoord - reprezintå coordonatele
cursorului de mouse, relative la formular.

Setul de formulare FormSetx


Este un container care conÆine un grup de formulare. Este caracterizat de proprietåÆile
care pot fi folosite pentru parcurgerea ciclicå a formularelor din set:
9 Numårul de formulare din set FormCount . Este de tip numeric.
9 Formularele Forms . Este de tip vector. În elementele vectorului se påstreazå
referinÆele cåtre formularele din grup.
Mai poate fi folsitå çi proprietatea AutoReleased care conÆine o referinÆå cåtre formularul activ
çi proprietatea AutoReleased care determinå cum este eliberat setul de formulare. Este de tip
logic: dacå are valoarea .T. (implicit atunci când 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 când 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 prelucrării datelor 261

CreaÆi seturi de formulare


1. CreaÆi un set de formulare care
conÆine douå formulare. Legende-
le celor douå formulare sunt
Formular 1 çi Formular 2. Pentru
fundalul lor s-au ales douå culori
diferite.
„ CreaÆi setul de formulare cu opÆi-
unea de meniu Create Form Set
∈Form. IniÆial setul va conÆine un
singur formular. AdåugaÆi al doi-
lea formular cu opÆiunea Add
New Form ∈Form.
„ ProprietåÆile setului de formulare
çi ale formularelor se vor stabili
prin intermediul ferestrei de proprietåÆi 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, scrieÆi câte o procedurå asociatå evenimentului Click. La
producerea acestui eveniment, se parcurg ciclic cele douå formulare, çi se scrie în bara
de titlu al fiecårui formular numårul såu.
Procedure Click
for n=1 to thisformset.formcount
thisformSet.Forms(n).Caption= thisformSet.Forms(n).Caption+str(n,2)
endfor
Endproc
„ SalvaÆi setul de formulare çi îl testaÆi lansându-l în execuÆie.
2. Setului de formulare li se va mai adåuga un formular. Formularul Formular 1 va fi
afiçat î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, råspunsuri la evenimentul Click.
„ DeschideÆi formulaul anterior çi îl salvaÆi sub un alt nume. AdåugaÆi la setul de
formulare cel de al treilea formular.
262 Informatică

„ StabiliÆi proprietåÆile pentru cel de la


treilea formular:
* Proprietatile formularului 3
Name = "Form3"
Top = 54
Left = 132
Caption = "Formularul 3"
„ Pentru fiecare formular scrieÆi câte o
procedurå asociatå evenimentului Click.
La producere acestui eveniment, se
parcurg ciclic cele trei formulare çi se
scrie în fiecare formular eticheta formu-
larului î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 conÆine un grup de pagini. Pentru a fi vizibil, setul
de pagini trebuie creat într-un formular (form). El se foloseçte pentru a obÆine un obiect de
interfaÆå de tipul casetå de dialog cu secÆiuni (tabs). Setul de pagini va reprezenta caseta
de dialog, iar paginile secÆiunile casetei. La un moment dat, o singurå paginå (secÆiune a
casetei) este activå. Paginile nu pot fi create decât î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 afiçatå în partea superioarå a paginii. Ea este folositå ca un
identificator al paginii, dar çi ca un element care poate fi acÆionat cu mouse-ul (clic)
pentru a activa pagina. Ca identificator al etichetei paginii se foloseçte textul din proprie-
tatea Caption a paginii.
Setul de formulare are urmåtoarele proprietåÆi specifice care determinå caracteristicile
paginilor din set:
9 Pagina activå ActivePage . Este de tip numeric çi reprezintå numårul paginii active.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 263

9 ProprietåÆile care pot fi folosite pentru parcurgerea ciclicå a paginilor din set:
Numårul de pagini din set PageCount . Este de tip numeric.
Paginile Pages . Este de tip vector. În elementele vectorului se påstreazå
referinÆele cåtre paginile din set.
9 ProprietåÆile de tip numeric care pot fi folosite pentru dimensiunile paginilor din set:
PageHeight - înålÆimea paginii (fårå etichetå);
PageWidth - låÆimea paginii.
9 ProprietåÆile care caracterizeazå etichetele paginilor din set:
PrezenÆa etichetelor Tabs . Este de tip logic çi determinå dacå vor fi afiçate
etichetele. Dacå are valoarea .T. (implicit), etichetele paginilor vor fi afiçate, altfel
zona etichetei va fi ocupatå de paginå.
LåÆimea etichetelor TabStyle . Este de tip numeric. Dacå are valoarea 0 -
(Justified), eticheta este dimensionatå dupå lungimea textului. Dacå are valoarea 1
- (Nonjustified), etichetele paginilor sunt dimensionate astfel încât så ocupe toatå
låÆimea setului de paginå.
Aranjarea etichetelor TabsStretch . Este de tip numeric çi determinå modul în
care vor fi aranjate etichetele în cadrul setului de pagini, atunci când lungimea
textului etichetelor depåçeçte låÆimea setului de pagini. Dacå are valoarea 0 -
(Multiple Rows), etichetele vor fi scrise pe mai multe rânduri. Dacå are valoarea 1 -
(Single Row), etichetele sunt afiçate pe o singurå linie çi textul etichetelor este
secÆionat astfel încât så încapå în etichetå. Valoarea implicitå este 1.
Identificarea unei pagini se poate face în douå moduri:
<nume_set_pagini>.<nume_paginå>
sau
<nume_set_pagini>.Pages(<n>)
unde Pages este numele propritåÆii care påstreazå într-un vector referinÆele fiecårei
pagini a setului, iar <n> indexul paginii din acest vector.
Formularele de tip paginå au proprietatea specificå de tip numeric PageOrder -
numårul de ordine al paginii. Ea este diferitå de indexul paginii din vectorul Pages.
Modificarea unui numår de ordine al unei pagini duce la rearanjarea tuturor pginilor. De
exemplu, dacå existå patru pagini çi vreÆi ca pagina a patra så devinå a doua, îi atroibuiÆi
acesteia numårul de ordine 2. Automat pagina a doua va primi numårul de ordine 3, iar
pagina a treia numårul de ordine 4.

ConstruiÆi un set de pagini


1. ConstruiÆi un set de pagini care så conÆinå 8 pagini:
„ LansaÆi în execuÆie constructorul de formulare çi creaÆi un formular nou.
„ ExecutaÆi clic pe butonul PageFrame din bara Form controls. GlisaÆi apoi mouse-ul
în fereastra formularului, peste suprafaÆa care vreÆi så fie ocupatå de setul de pagini.
Se va crea iniÆial un set de pagini cu douå pagini.
264 Informatică

„ În fereastra Properties, alegeÆi din lista de obiecte obiectul PageFrame1 çi scrieÆi


pentru proprietatea PageCount (numår de pagini) valoarea 8.
„ StabiliÆi apoi çi celelalte prorpietåÆi ale obiectelor. Valorile proprietåÆilor formularului,
setului de pagini çi paginilor sunt:
* Formularul Tabs = .T.
Caption = "Form1" * Paginile
Name = "Form1" Page1.Caption = "Pagina 1"
* Setul de pagini Page1.Name = "P1"
Name = "Pageframe1" Page1.PageOrder = 1
PageCount = 8 Page2.Caption = "Pagina 2"
PageHeight=203 Page2.Name = "P2"
PageWedth=345 Page2.PageOrder = 2
TabStretch = 0 ..............................
Top = 12 Page8.Caption = "Pagina 8"
Left = 12 Page8.Name = "P8"
Width = 349 Page8.PageOrder = 8
Height = 252
2. În fereastra Properties, deschideÆi lista cu obiectele din paginå çi observaÆi structura
ierarhizatå a obiectelor din formular.
3. Cele douå moduri în care sunt afiçate paginile sunt controlate cu proprietatea
TabStretch. TestaÆi efectul acestei proprietåÆi.

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 numårul de ordine 5 (Page2.PageOrder=5), se vor


modifica çi paginile: P3 va primi numårul de ordine 2, P4 va primi numårul de ordine
3 çi P5 va primi numårul de ordine 4. TestaÆi operaÆia de schimbare a ordinii
paginilor.

TabStretch=0

TabStretch=1
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 265

T est pentru evaluare:


1. CreaÆi un set de trei formulare. Formularele vor fi de tip fereastrå. În fiecare formular
veÆi desena câte o formå: un påtrat, un cerc çi o elipså. Forma va fi afiçatå în formular
numai când este activat formularul.
2. CreaÆi un formular cu patru pagini. Când activaÆi o
paginå, în interiorul ei se va scrie legenda sa.

# ÎncercaÆi:
Adevårat/Fals:
1. InterfaÆa de explorare este o interfaÆå container care conÆine mai multe ferestre.
2. Procedura asociatå evenimentului KeyPress primeçte ca parametru codul numeric
asociat tastelor reci apåsate.
3. Focalizarea este o metodå prin care se poate måri un control grafic.
4. Evenimentul Init este declançat de activarea obiectului.
5. Print este o metodå prin care scrieÆi într-un formular.
6. Evenimentul Destroy este declançat de eliberarea zonei de memorie alocate obiectului.
7. Procedura asociatå evenimentului Load se executå dupå cea asociatå evenimentului Init.
CompletaÆi:
1. Dimensiunile, poziÆiile pe ecran, vizibilitatea çi disponibilitatea sunt ...........................
ale unui obiect vizual.
2. Variabila de sistem folositå pentru a referi fereastra implicitå a aplicaÆiei Visual
FoxPro este ....... .
3. FuncÆia care furnizeazå codul unei culori descrise prin intensitatea celor trei culori de
bazå este ........
4. Un obiect poate fi focalizat din program cu metoda ......................
5. Procedura asociatå evenimentului .......... al unui formular este ultima care se executå.
AlegeÆi råspunsurile corecte:
1. Pentru un obiect,Click este:
a) o proprietate b) un eveniment c) o metodå
2. StabiliÆi tipul formularului (modal/nemodal) cu proprietatea:
a) WindowType b) ShowWindow c) MDIForm
3. Ordinea tabulårii este o proprietate specificå:
a) tuturor controalelor b) controalelor grilå c) formularelor
4. Caseta de dialog Open a interfeÆei aplicaÆiei Visual FoxPro este o casetå de dialog:
a) modalå b) nemodalå c) copil d) pårinte
5. Stilul interfeÆei aplicaÆiei Visual FoxPro este de tip:
a) SDI b) MDI c) de explorare
6. Pentru un formular, Release este:
a) o proprietate b) un eveniment c) o metodå
266 Informatică

R åspunsuri:
Adevårat/Fals: 1-F; 2-A; 3-F; 4-F; 5-F; 6-A; 7-F.
CompletaÆi: 1-proprietåÆi; 2-_screen; 3-rgb(); 4-SetFocus ; 5-Unload
AlegeÆi råspunsurile corecte: 1-b; 2-a; 3- c; 4-a; 5-b; 6-c.

3.4. C o n t r o alele

3.4.1. ProprietåÆile çi evenimentele specifice controalelor


Pe lângå proprietåÆile standard comune controalelor çi formularelor, controalele mai au
urmåtoarele proprietåÆi specifice:
9 Valoarea Value . Este o proprietate pe care programatorul interfeÆei o poate folosi ca
så påstreze valoarea unei date prin simpla referire la acel control. Ea permite
proiectantului interfeÆei så foloseascå obiectele de tip control ca o legåturå între
utilizator çi aplicaÆie, prin care utilizatorul comunicå aplicaÆiei datele de intrare çi
procesele pe care trebuie så le execute, iar aplicaÆia, rezultatele obÆinute. În tabelul
alåturat sunt prezentate tipurile de date permise pentru fiecare control predefinit.
9 Sursa controlului ControlSource . Este o proprie-
tate care stabileçte sursa de date a controlului (va- Control Tipuri de date
permise
riabila de memorie sau câmpul referit) care deter-
CheckBox Integer, Numeric,
minå çi tipul datei påstrate în valoarea controlului. Logical
9 Pårintele Parent . Este identificatorul formularului Command Character,
de care aparÆine controlul. Group Integer, Numeric
9 Alinierea Alignment . Caracterizeazå modul în EditBox Character, Memo
care va fi aliniat textul în interiorul unui obiect. Pro- TextBox Orice tip
prietatea este de tip numeric çi poate lua valorile: 0 - Grid Character,
Left (aliniere la stânga; implicit), 1 - Right (aliniere la Numeric
dreapta), 2 - Center (aliniere în centru) çi 3 - ListBox Character,
Integer, Numeric
Automatic (implicit - alinierea este fåcutå de cåtre
Combo Character,
sistem în funcÆie de tipul proprietåÆii Value: pentru
Box Integer, Numeric
tipuri numeric, la stânga, iar pentru celelalte la Spinner Currency, Integer,
dreapta). Numeric
9 AparenÆa SpecialEffect . Este de tip numeric çi Option Integer, Numeric,
defineçte aspectul tridimensional (0) sau plat (1) al Button Logical
obiectului. Option Character,
9 Stilul fundalului BackStyle . Este de tip numeric Group Integer, Numeric
çi defineçte 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 afiçat în bara de stare atunci când este focalizat controlul.
9 InformaÆiile despre control ToolTipText . Este de tip çir de caractere çi reprezintå
textul care va fi afiçat în caseta de informaÆii (ToolTip) atunci când este indicat
controlul cu mouse-ul.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 267

9 Culorile controlului care nu este disponibil sunt determinate de proprietåÆile de tip


numeric:
BackColor - culoarea fundalului;
ForeColor - culoarea textului.
9 Tasta de acces. PuteÆi focaliza rapid un control apåsând o literå împreunå cu tasta Alt.
Tasta literei se numeçte tastå de acces (access key) çi ea este afiçatå subliniat. PuteÆi
så o stabiliÆi, dacå în proprietatea Caption a controlului scrieÆi litera care vreÆi så fie tastå
de acces precedatå de caracterele: \<. De exemplu, dacå legenda unui control este
Telefon çi vreÆi ca litera F så fie tastå de acces, veÆi scrie legenda astfel: Tele\<fon. În
formular legenda va fi afiçatå 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
proprietåÆii este .F..
Evenimentele specifice sunt:
9 Accesul condiÆionat When . Se declançeazå înaintea primirii focalizårii. Procedura
asociatå evenimentului poate fi folositå pentru a focaliza condiÆionat controlul: dacå nu
sunt îndeplinite anumite condiÆii (precizate în procedurå) controlul nu va putea fi focali-
zat. Procedura va întoarce un rezultat de tip logic: valoarea .T. va permite primirea
focalizårii, iar valoarea .F. nu.
9 Validarea Valid . Se declançeazå înainte de pierderea focalizårii. Procedura asociatå
evenimentului poate fi folositå pentru a ceda focalizarea condiÆionat: de exemplu, în
cazul unuei casete de text, dacå valoarea introduså în câmp nu îndeplineçte o anumitå
condiÆie, nu se va putea focaliza urmåtorul control. Procedura va întoarce fie un rezultat
de tip logic (valoarea .T. va permite transferarea focalizårii, iar valoarea .F. va påstra
focalizarea), fie un rezultat numeric (0 - controlul påstreazå focalizarea, diferitå de 0 -
focalizarea va avansa peste n controale, n fiind valoarea furnizatå; avansarea se va
face în sensul acÆionårii tastei Tab, dacå valoarea este pozitivå, çi în sens invers, dacå
valoarea este negativå). Astfel, dacå procedura întoarce valoarea 1, focalizarea este
trecutå controlului urmåtor, iar dacå întoarce valoarea -1, focalizarea este trecutå
controlului anterior.

3.4.2. Controale pentru executarea acÆiunilor


Cea mai simplå cale prin care i se permite unui utilizator så interacÆioneze cu o aplicaÆie
este executarea unui clic pe un buton de pe ecran. Aceste controale pot fi de tip declan-
çator sau buton de comandå (command button) sau opÆiune de meniu (menu option).
Butonul de comandå CommandButtonx
Este folosit pentru a începe, a întrerupe sau a termina un anumit proces în cadrul
aplicaÆiei. De exemplu, în timpul executårii unui proces poate fi afiçat un buton de
comandå de tip Pause care prin acÆionare opreçte temporar executarea procesului. În
timpul opririi temporare a unui proces, butonul de pauzå este înlocuit cu butonul Resume
pentru reluarea execuÆiei procesului din punctul în care a fost întrerupt. Mai poate fi afiçat
268 Informatică

çi un buton Stop care poate opri execuÆia procesului. În general, acestui control nu i se
asociazå valori, ci acÆiuni descrise prin procedura asociatå evenimentului Click.
Butonul de comandå nu are proprietatea BackColor, iar proprietatea Style poate avea
valorile: 0 - standard (implicit) çi 1 - invizibil. Are proprietåÆile WordWrap çi Autosize
(care vor fi prezentate ulterior).
În funcÆie de modul în care este informat utilizatorul despre acÆiunea butonului existå:
9 Butoane în care acÆiunea este descriså printr-un text. În acest caz, textul care descrie
acÆiunea va fi påstrat de proprietatea Caption a controlului.
9 Butoane în care acÆiunea este descriså printr-o imagine. În acest caz, identificatorul
fiçierului care conÆine imaginea care va fi afiçatå va fi påstrat de proprietatea Picture a
controlului (identificatorul fiçierului în care este påstratå imaginea). În cazul în care se
foloseçte imaginea pentru descrierea acÆiunii, trebuie folosite çi urmåtoarele proprietåÆi:
DownPicture - imaginea afiçatå atunci când butonul este focalizat;
DisablePicture - imaginea afiçatå atunci când butonul nu este disponibil.
Declançatorul poate fi acÆionat în mai multe moduri:
9 ExecutaÆi clic pe butonul focalizat.
9 FocalizaÆi butonul apåsând repetat tasta Tab çi apoi apåsaÆi tasta Enter sau SpaÆiu.
9 ApåsaÆi tasta Alt împreunå cu tasta de acces la buton (cu tasta literei de identificare).
9 Dacå butonul de comandå este butonul implicit al formularului, apåsaÆi tasta Enter,
indiferent de poziÆia selectorului.
9 Dacå butonul de comandå este butonul de anulare al formularului, apåsaÆi tasta Esc,
indiferent de poziÆia selectorului.
Indiferent de modul ales, evenimentul este acelaçi (evenimentul Click): prin acÆionarea
butonului se declançeazå operaÆia atribuitå lui.
Într-un formular nu poate fi decât un buton implicit çi un buton de anulare. Tipul butonului
este controlat cu proprietåÆile specifice unui buton de comandå:
9 Implicit Default . Este de tip logic. Dacå are valoarea .T., butonul de comandå este
butonul implicit (default command button). Într-un formular, un singur buton de
comandå poate fi implicit. Valoarea implicitå pentru aceastå proprietate este .F..
9 Anulare Cancel . Este de tip logic. Dacå are valoarea .T., butonul de comandå este
butonul de anulare (cancel command button). Într-un formular, un singur buton de
comandå poate fi de anulare. Valoarea implicitå pentru aceastå proprietate este .F..

Grupul de butoane de comandå CommandButtonGroupx


Se foloseçte pentru a grupa butoanele dintr-un formular çi a uçura administrarea lor.
Grupul de butoane de comandå are urmåtoarele proprietåÆi specifice:
9 Numårul 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 prelucrării datelor 269

ConstruiÆi un formular care conÆine butoane de comandå, folosind metoda


programårii
RealizaÆi un formular care så prezin-
te 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å: Cresca-
tor, Normal, Descrescator. Cel de la
patrulea buton, Terminare, se folo-
seçte pentru a închide formularul.
Toate butoanele au taste de acces.
AcÆiunile realizate la acÆionarea
butonului sunt descrise în procedurile pentru evenimentele Click ale fiecårui buton.
„ ScrieÆi programul surså într-un fiçier 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ă

ThisForm.L.LineSlant ='\' Cancel = .T.


ThisForm.L.Visible = .T. Left = 150
Enddefine Top = 150
Height = 25
Define class Buton4 as; Procedure Click
CommandButton Clear events
Caption = '\<Terminare' Enddefine
„ SalvaÆi programul çi-l lansaÆi în execuÆie cu comanda do forma_p.prg. TestaÆi
butoanele.
ConstruiÆi un formular care conÆine butoane de comandå folosind metoda vizualå
„ CreaÆi un formular nou forma_v. CreaÆi în acest formular un obiect de tip linie:
executaÆi clic pe butonul Line de pe bara Form controls çi glisaÆi apoi mouse-ul în
formular pentru a trasa linia.
„ Pentru a crea cele patru butoane declançtoare, folosiÆi facilitatea de creare de
instan-Æe multiple. ExecutaÆi clic pe butonul ButtonLock pe bara Form controls,
apoi exe-cutaÆi clic pe butonul CommandButton de pe aceeaçi barå. GlisaÆi mouse-
ul în formular pentru a crea un buton de comandå. Apoi executaÆi clic de trei ori în
poziÆiile în care vreÆi så aparå celelalte butoane. DezactivaÆi facilitatea executând clic
pe bu-tonul ButtonLock.
„ ModificaÆi corespunzåtor valorile proprietåÆilor formularului çi obiectelor din formular
(pe baza instrucÆiunilor din programul surså).
„ ScrieÆi câte o procedurå pentru fiecare eveniment Click al celor patru butoane (pe
baza instrucÆiunilor din programul surså).
„ SalvaÆi formularul çi-l lansaÆi în execuÆie cu
comanda do form forma_v. TestaÆi formularul.

3.4.3 Controale pentru introducerea çi afiçarea datelor


Eticheta Labelx
Este un control care afiçeazå un text pe care utilizatorul nu-l poate modifica. Poate fi
folositå ca identificator al unei zone dintr-un formular, pentru furnizarea unor instrucÆiuni
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 afiçat
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 decât o singurå linie de text. Dacå
legenda etichetei este mai mare sau lungimea ei se poate schimba în funcÆie de anumite
condiÆii (prin schimbarea textului), existå douå proprietåÆi specifice etichetei care permit
legendei så încapå în zona alocatå ei:
9 Autodimensionarea AutoSize . Este de tip logic çi stabileçte dacå eticheta va fi re-
dimensionatå automat pe orizontalå (textul va fi scris pe un singur rând), påstrându-i-se
înålÆimea, astfel încât så încapå textul: .T. - eticheta este redimensionatå automat, iar .F.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 271

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


etichetå este tåiat çi nu mai este afiçat.
9 Trunchierea textului WordWrap . Este de tip logic çi stabileçte cum va fi expandatå
eticheta (pe orizontalå sau pe verticalå) pentru a încåpea textul atunci când controlul
este redimensionat: .T. - textul este trunchiat, adicå se måreçte dimensiunea etichetei
pe verticalå, påstrându-i-se låÆimea (textul va fi scris pe mai multe rânduri, separarea
textului pe rânduri fåcându-se la nivel de cuvânt), iar .F. (implicit) - textul nu se
trunchiazå, nu i se modificå înålÆimea, dar este måritå låÆimea. Dacå are valoarea .T.,
proprietatea AutoSize este ignoratå.

ConstruiÆi un formular care conÆine etichete


Caseta de dialog Test mouse conÆine douå secÆiuni pentru testarea mouse-ului:
secÆiunea Deplasare mouse - pentru testarea deplasårii mouse-ului (coordonate, buton
apåsat çi taste apåsate) çi Apåsare buton - pentru testarea butonului apåsat (coordonate,
buton apåsat çi taste apåsate).
Controalele folosite pentru afiçare sunt de tip etichetå (label). În fiecarea secÆiune se
creeazå 11 etichete. De exemplu, în prima secÆiune 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 acÆiunile mouse-ului: douå pentru coordonate, una
pentru butonul apåsat çi trei pentru tastele apåsate.

„ CreaÆi un formular nou. CreaÆi în formular un set de pagini cu douå pagini. CreaÆi în
fiecare secÆiune etichetele astfel: executaÆi clic pe butonul Label de pe bara Form
controls çi glisaÆi apoi mouse-ul în formular pentru a trasa eticheta.
272 Informatică

„ Folosind fereastra Properties stabiliÆi proprietåÆile 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 secÆiunea 1 a casetei se asociazå o procedurå evenimentului MouseMove
(în etichetele L4 çi L5 se afiçeazå coordonatele, în eticheta L7 se afiçeazå butonul
apåsat, iar în etichetele L9, L10 çi L11 se afiçeazå tastele apåsate):
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 prelucrării 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 secÆiunea 2 a casetei se asociazå o procedurå evenimentului MouseDown
(în etichetele L10 çi L11 se afiçeazå coordonatele, în eticheta L2 se afiçeazå butonul
apåsat, iar în etichetele L5, L5 çi L6 se afiçeazå tastele apåsate) çi o procedurå
evenimentului MouseUp:
Procedure Sect2.MouseDown
Lparameters nButton, nShift, nXCoord, nYCoord
ThisForm.Caseta.Pages(2).L10.Caption=str(nXCoord,4,0)
ThisForm.Caseta.Pages(2).L11.Caption=str(nYCoord,4,0)
Do case
case nButton=1
ThisForm.Caseta.Pages(2).L2.Caption='Stanga'
case nButton=2
ThisForm.Caseta.Pages(2).L2.Caption='Dreapta'
case nButton=4
ThisForm.Caseta.Pages(2).L2.Caption='Mijloc'
otherwise
ThisForm.Caseta.Pages(2).L2.Caption=''
Endcase
if inlist(nShift,1,3,5,7)
ThisForm.Caseta.Pages(2).L4.Visible=.T.
else
ThisForm.Caseta.Pages(2).L4.Visible=.F.
endif
if inlist(nShift,2,3,6,7)
ThisForm.Caseta.Pages(2).L5.Visible=.T.
else
ThisForm.Caseta.Pages(2).L5.Visible=.F.
endif
if inlist(nShift,4,5,6,7)
ThisForm.Caseta.Pages(2).L6.Visible=.T.
else
ThisForm.Caseta.Pages(2).L6.Visible=.F.
Endif
ThisForm.Caseta.Refresh
Endproc
Procedure Sect2.MouseUp
Lparameters nButton, nShift, nXCoord, nYCoord
ThisForm.Caseta.Pages(2).L10.Caption=''
ThisForm.Caseta.Pages(2).L11.Caption=''
ThisForm.Caseta.Pages(2).L2.Caption=''
ThisForm.Caseta.Pages(2).L4.Visible=.F.
ThisForm.Caseta.Pages(2).L5.Visible=.F.
274 Informatică

ThisForm.Caseta.Pages(2).L6.Visible=.F.
ThisForm.Caseta.Refresh
Endproc
„ Pentru butonul de comandå s-a asociat o procedurå evenimentului Click:
Procedure Click
ThisForm.Release
Endproc

Caseta de text TextBoxx


Afiçeazå conÆinutul unei variabile de memorie, al unui câmp sau al unui element de
tablou çi permite editarea lui. Pentru editarea textului dipuneÆi de facilitåÆile de editare:
mutarea cursorului de inserare, selectarea textului çi operaÆiile de çteregere, mutare çi
copiere a textului selectat (Cut, Copy çi Paste). Se mai numeçte çi câmp de editare sau
casetå de editare. Ea poate fi folositå çi pentru afiçarea unui text, dar prezintå dezavan-
tajul cå utilizatorul poate modifica voluntar sau involuntar acest text. Pe lângå proprie-
tåÆile standard (dimensiunea, poziÆia, aparenÆa, fontul, dimensiunea çi stilul caracterelor,
stilul bordurii chenarului, alinierea textului în casetå) ea are çi proprietåÆi specifice care
caracterizeazå modul în care se comportå.
ProprietåÆile specifice unei casete de text sunt:
9 Stilul Style . Este de tip numeric çi stabileçte 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., câmpul poate fi
numai vizualizat, nu çi modificat. Câmpul poate fi înså focalizat.
9 Marginile Margin . Este de tip numeric çi stabileçte distanÆa în interior de la text la
bordura controlului. Este bine så fie mai mare decât 0 pentru a face textul mai lizibil.
9 Ascunderea textului PasswordChar . Este de tip çir de caractere çi precizeazå ce
se va afiça î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 doriÆi så fie afiçat). 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 ProprietåÆi folosite la selectarea textului din caseta de text:
Culoarea zonei selectate: SelectedBackColor - culoarea fundalului çi
SelectedForeColor - culoarea textului folosite pentru evidenÆierea textului selectat.
PoziÆia de început a zonei selectate: SelectedStart (tip numeric). Dacå nu este
selectat un text, prorpietatea va furniza poziÆia cursorului de inserare.
Lungimea zonei selectate: SelectedLength (tip numeric) - numårul 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 evidenÆiat dupå ce caseta pierde
focalizarea, altfel el va fi evidenÆiat çi dupå ce a fost focalizat alt control din formular.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 275

9 Lungimea maximå a textului MaxLength (tip numeric) - numårul maxim de carac-


tere care pot fi scrise în caseta de text . Se foloseçte în cazul câmpurilor de tip çir de
caractere pentru ca textul introdus så nu depåçeascå lungimea permiså în câmp.
9 ProprietåÆi prin care se controleazå formatul de introducere çi afiçare a datei memo-
rate în proprietatea Value:
Formatul de introducere: Format (tip çir de caractere). Prin aceastå proprietate se
stabileçte caracteristica întregului câmp de editare. De exemplu, dacå proprietatea are
valoarea 'A', în caseta de text nu veÆi putea scrie decât litere.
Masca de introducere: InputMask (tip çir de caractere). Prin aceastå proprie-
tate se stabileçte un çablon pentru format în care se precizeazå caracteristica
fiecårei poziÆii a formatului. FaÆå de proprietatea anterioarå prezintå avantajul cå
Çablonul Format

Cod SemnificaÆie Cod SemnificaÆie


X Orice caracter. A Numai litere, fårå spaÆii sau semne
9 Numai cifre çi semne (ca de exem- de punctuaÆie.
plu semnul minus -) D Pentru datele calendaristice, se folo-
# Cifre, spaÆii çi semne seçte formatul stabilit prin set date.
$ Afiçeazå simbolul monetar E Datele de tip datå calendaristicå vor
$$ Afiçeazå simbolul monetar mobil. fi editate în format british.
* Afiçeazå asteriscuri la stânga valorii. K Selecteazå textul din câmp atunci
. Reprezintå poziÆia punctului zecimal când este focalizat controlul.
(separatporul între partea întreagå çi L Se foloseçte numai pentru tipul nume-
partea fracÆionarå). ric; afiçeazå zerouri nesemnificative în
, Reprezintå poziÆia separatorului în locul spaÆiilor.
ordinelor de mårime (sute de mii, R Afiçeazå çablonul definit prin proprieta-
sutele de mii de milioane etc.) tea InputMask. Valoarea çablonului nu
va fi memoratå în proprietatea Value.
permite çi precizarea lungimii forma- T Se foloseçte numai pentru tipul çir de
tului. De exemplu, dacå proprietatea are caractere; înlåturå spaÆiile de la începu-
valoa-rea '9999.99', în caseta de text tul çi de la sfârçitul çirului de caractere.
veÆi putea scrie numai o valoare nume- ! Se foloseçte numai pentru tipul çir
ricå; numårul va avea maxim 4 cifre de caractere; converteçte toate
pentru partea întreagå çi douå cifre literele în litere mari.
pentru partea fracÆionarå. $ Se foloseçte numai pentru tipul nume-
ric; afiçeazå simbolul monetar.
9 Selectarea la focalizare:
SelectOnEntry . Este de tip logic; dacå are valoarea .T., conÆinutul câmpului este
selectat la focalizarea controlului. Se recomandå selectarea la focalizare pentru câm-
purile a cåror valoare de obicei trebuie schimbatå des.
9 ProprietåÆi specifice casetelor de text pentru introducerea câmpurilor memo:
Deschiderea ferestrei de editare a câmpului memo: OpenWindow (tip logic). Se
foloseçte pentru a stabili modul în care se face desciderea ferestrei: dacå are valoarea
.T. (implicit), se va deschide automat atunci când este focalizat controlul, altfel trebuie
deschiså de cåtre utilizator prin apåsarea tastelor Ctrl+PageDown.
Fereastra folositå pentru editarea câmpului memo: MemoWindow (tip çir de
caractere). Ea poate fi: fereastra implicitå a interfeÆei Visual FoxPro (valoarea
276 Informatică

proprietåÆii este çirul vid) sau o fereastrå definitå de utilizator (valoarea proprietåÆii va fi
numele ferestrei).

Zona de editare EditBoxx


Spre deosebire de caseta de text care permite scrierea datelor pe un singur rând, zona
de editare permite introducerea lor pe mai multe rânduri. Ea este recomandatå atunci
când datele de intrare sunt formate din texte foarte lungi. FaÆå de casetele de text, zonele
de editare au urmåtoarele proprietåÆi specifice:
9 Barele de derulare: ScrollBars . Este de tip numeric. Se afiçeazå barele de derulare
atunci când dimensiunea textului depåçeçte capacitatea de afiçare 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 afiçatå bara de derulare pe verticalå, care va
permite çi folosirea mouse-ului. Valoarea implicitå este 2.
9 Folosirea tabulårii în text: AlowTabs . Este de tip logic; dacå are valoarea .F., nu
este voie så folosiÆi tasta Tab pentru editarea textului (ea va fi folositå pentru ieçirea din
zona de editare çi predarea focalizårii urmåtorului control), iar dacå are valoarea .T.,
puteÆi folosi tasta Tab pentru editarea textului (pentru ieçirea din zona de editare se va
folosi Ctrl+Tab). Valoarea implicitå este F.

ConstruiÆi un formular care conÆine casete de text folosind metoda programårii


RealizaÆi 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 operaÆii se vor folosi
declançatoarele +, -,*,/. Pentru
operaÆia de împårÆire se va testa
dacå împårÆitorul este 0; dacå are
valoarea 0 se va afiça un mesaj
de atenÆionare, iar focalizarea va fi
mutatå pe operandul b. Cel de al
cincilea buton, Terminare, se folo-
seçte pentru a închide caseta de
dialog.
„ ScrieÆi programul surså Calc_p.prg:
F1 = CreateObject('Form') F1.Width=400
F1.Caption='Operatii' F1.Height=250
F1.Closable = .F. F1.BackColor=RGB(220,220,220)
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 277

F1.C2.Value=0
F1.AddObject('L1','Label') F1.C2.InputMask = "999999"
F1.AddObject('C1','TextBox') F1.C2.Left = 85
F1.AddObject('L2','Label') F1.C2.Top = 84
F1.AddObject('C2','TextBox') F1.C2.Height = 25
F1.AddObject('L3','Label') F1.C2.Width = 108
F1.AddObject('L4','Label') F1.C2.Visible =.T.
F1.AddObject('C3','TextBox') F1.C3.Value=0
F1.AddObject('B1','Buton1') F1.C3.BackColor=RGB(220,220,220)
F1.AddObject('B2','Buton2') F1.C3.Height = 25
F1.AddObject('B3','Buton3') F1.C3.Left = 85
F1.AddObject('B4','Buton4') F1.C3.ReadOnly = .T.
F1.AddObject('B5','Buton5') F1.C3.Top = 144
F1.C3.Width = 108
F1.L1.AutoSize = .T. F1.C3.Style = 1
F1.L1.BackColor=RGB(220,220,220) F1.C3.Visible =.T.
F1.L1.Caption = "a" F1.B1.Visible =.T.
F1.L1.Height = 18 F1.B2.Visible =.T.
F1.L1.Left = 48 F1.B3.Visible =.T.
F1.L1.Top = 36 F1.B4.Visible =.T.
F1.L1.Width = 8 F1.B5.Visible =.T.
F1.L1.Visible =.T.
F1.L2.AutoSize = .T. F1.Show
F1.L2.BackColor=RGB(220,220,220) Read events
F1.L2.Caption = "b"
F1.L2.Height = 18 Define class Buton1 as;
F1.L2.Left = 48 CommandButton
F1.L2.Top = 96 Top = 24
F1.L2.Width = 8 Left = 276
F1.L2.Visible =.T. Height = 25
F1.L3.BackColor=RGB(220,220,220) Width = 61
F1.L3.Caption = "c" Caption = "+"
F1.L3.Height = 18 Procedure Click
F1.L3.Left = 48 ThisForm.C3.Value=;
F1.L3.Top = 144 ThisForm.C1.Value+;
F1.L3.Width = 7 ThisForm.C2.Value
F1.L3.Visible =.T. ThisForm.C3.Refresh
F1.L4.BackColor=RGB(220,220,220) Enddefine
F1.L4.Caption = "Imposibil!!!; Define class Buton2 as;
Impartire la zero" CommandButton
F1.L4.Height = 25 Top = 60
F1.L4.Left = 36 Left = 276
F1.L4.Top = 204 Height = 25
F1.L4.Visible = .F. Width = 61
F1.L4.Width = 181 Caption = "-"
F1.C1.Value=0 Procedure Click
F1.C1.InputMask = "999999" ThisForm.C3.Value=;
F1.C1.Left = 85 ThisForm.C1.Value-;
F1.C1.Top = 36 ThisForm.C2.Value
F1.C1.Height = 25 ThisForm.C3.Refresh
F1.C1.Width = 108 Enddefine
F1.C1.Visible =.T.
278 Informatică

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
„ SalvaÆi fiçierul. LansaÆi în execuÆie programul Calc_p.prg. TestaÆi formularul.

ConstruiÆi un formular care conÆine casete de text folosind metoda vizualå


1. RealizaÆi caseta de dialog din exemplul precedent folosind metoda vizualå.
„ CreaÆi un formular nou, în care creaÆi urmåtoarele obicete: patru etichete, trei casete
de text çi cinci butoane de comandå.
„ StabiliÆi pentru formular çi obiecte urmåtoarele proprietåÆi:
* 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 prelucrării datelor 279

Name = "Command4" && Buton4 Name = "Command5" && Buton5


Caption = "/" Caption = "Terminare"
„ ScrieÆi procedurile asociate urmåtoarelor 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
„ SalvaÆi formularul. Îl lansaÆi în excuÆie
çi-l testaÆi.

2. RealizaÆi caseta de dialog din exemplul


precedent folosind metoda vizualå.
„ SalvaÆi formularul anterior sub un alt
nume. ÇtergeÆi cea de a patra etiche-
tå (cea folositå pentru atenÆionare;
pentru atenÆionare veÆi folosi de data
aceasta o fereastrå de atenÆionare).
AdåugaÆi la formular cele douå noi
butoane (pentru salvare în memorie
280 Informatică

M+ çi pentru readucere din memorie). Pentru memorarea numårului se va folosi


variabila de memorie globalå memorie.
„ Pentru obiectele adåugate stabiliÆi proprietåÆile:
Name = "Command6" && Buton6 Name = "Command7"
Caption = "M+" Caption = "M-"
„ ScrieÆi o procedurå asociatå evenimentului Load al formularului în care iniÆializaÆi
variabila de memorie memorie.
procedure Load && Formular memorie=0
public memorie endproc
„ ModificaÆi 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
„ ScrieÆi 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. RealizaÆi caseta de dialog pentru intro-


ducerea parolei.
„ CreaÆi formularul çi adåugaÆi 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. StabiliÆi pentru formular
çi controale urmåtoarele proprietåÆi:
* 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"
„ ScrieÆi procedurile asociate evenimentelor formularului Load çi Unload (prin care
este returnatå parola cåtre un program):
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 281

Procedure Load && Formular Procedure Unload && Formular


parola=space(6) return parola
endproc endproc
„ ScrieÆi procedura asociatå evenimentului Click al butonului de terminare:
Procedure Click && Buton
ThisForm.Release
endproc
„ SalvaÆi formularul sub numele form_par.
„ DeschideÆi fereastra editorului de texte çi scrieÆi urmåtorul program prin care lansaÆi
în execuÆie 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 stabileçte parola corectå (variabila parola_c) çi se verificå
dacå parola furnizatå este corectå. Se acceptå maxim 3 încercåri.
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
„ SalvaÆi programul. LansaÆi în execuÆie programul çi testaÆi modul în care funcÆionea-
zå programul çi formularul
pentru parolå.
4. RealizaÆi o casetå de dialog care
så simuleze operaÆiile de selec-
tare a textului çi de lucru cu zona
de memorie Clipboard pentru
transferul datelor (operaÆiile Copy,
Cut çi Paste). Pentru aceste
operaÆii se vor folosi butoanele
Copiere (Copy), Mutare (Cut),
Inserare (Paste) çi Stergere
(Delete). Butoanele au taste de
acces. În acest mod scurtåtura
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). OperaÆiile se pot executa în aceeaçi zonå (acelaçi
document) sau între cele douå zone (douå documente diferite). Pentru a çti cu ce zonå de
text se va lucra, se va folosi variabila de memorie text, de tip numeric, care are valoarea 1
pentru prima zonå de text çi valoarea 2 pentru a doua zonå de text.
„ CreaÆi formularul çi adåugaÆi la formular douå etichete, douå zone de editare çi cinci
butoane de comandå. Pentru zona de editare folosiÆi butonul EditBox de pe bara
Form Controls. StabiliÆi pentru formular çi controale urmåtoarele proprietåÆi:
* Formularul * Pentru toate etichetele
Name = "Form1" AutoSize = .T.
BackColor = 192,192,192 BackStyle = 0
Caption = "Prelucrare text" * Butoane
Closable = .F. Name = "Command1"
* Zonele de editare Caption = "\<Stergere"
Name = "Edit1" Name = "Command2"
HideSelection = .F. Caption = "\<Inserare"
Name = "Edit2" Name = "Command3"
HideSelection = .F. Caption = "\<Copiere"
*Etichetele Name = "Command4"
Name = "Label1" Caption = "\<Mutare"
Caption = "Text 1" Name = "Command5"
Name = "Label2" Cancel = .T.
Caption = "Text 2" Caption = "\<Terminare"
„ ScrieÆi procedura asociatå evenimentului Init al formularului. În aceastå procedurå
declaraÆi variabilele globale text çi zona_s çi iniÆializaÆi proprietåÆile Value ale celor
douå zone de editare:
procedure Init && Formular ThisForm.Edit1.Value=''
public text,zona_s ThisForm.Edit2.Value=''
text=1 endproc
zona_s=''
„ ScrieÆi procedurile asociate evenimentului LostFocus pentru cele douå zone de
text, în care memoraÆi în variabila text zona de editare care a pierdut focalizarea.
procedure LostFocus &&Edit1 procedure LostFocus &&Edit1
text=1 text=2
endproc endproc
„ ScrieÆi procedurile asociate evenimentului Click pentru cele cinci butoane:
procedure Click &&Buton1 else
if text=1 ThisForm.Edit2.SelText=zona_s
ThisForm.Edit1.SelText='' endif
else endproc
ThisForm.Edit2.SelText='' procedure Click &&Buton3
endif if text=1
endproc zona_s=ThisForm.Edit1.SelText
procedure Click &&Buton2 else
if text=1 zona_s=ThisForm.Edit2.SelText
ThisForm.Edit1.SelText=zona_s endif
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 283

endproc ThisForm.Edit2.SelText=''
procedure Click &&Buton4 endif
if text=1 endproc
zona_s=ThisForm.Edit1.SelText procedure Click &&Buton5
ThisForm.Edit1.SelText='' ThisForm.Release
else endproc
zona_s=ThisForm.Edit2.SelText
„ SalvaÆi formularul. LansaÆi în execuÆie formularul çi-l testaÆi.
5. RealizaÆi o casetå de dialog care så simuleze operaÆiile de cåutare çi înlocuire într-un text
(operaÆiile Find çi Replace). Pentru aceste operaÆii se vor folosi butoanele Cauta (Find),
Inlocuieste (Replace) çi Inlocuieste toate aparitiile (Replace All). Butoanele au taste de
acces. În acest mod scurtåtura Alt+C este similarå cu Ctrl+F çi Alt+I este similarå cu
Ctrl+H. Butonul Cauta nu este disponibil dacå zona de editare çi caseta de text cu
eticheta Se cautå sunt vide. Butoanele Inlocuieste çi Inlocuieste toate aparitiile nu sunt
disponibile dacå nu a fost gåsit în zona de text textul scris în caseta de text cu eticheta Se
cauta.
„ CreaÆi formularul çi adåugaÆi la formular trei etichete, o zonå de editare, douå casete
de text, un grup de trei butoane de comandå çi un buton de comandå. StabiliÆi

Grupul de butoane de
comandå

pentru formular çi con-


troale urmåtoarele pro-
prietåÆi:
* Formular
Name = "Form1"
Closable = .F.
BackColor = 192,192,192 Name = "Label3"
Caption = "Prelucrare texte" Caption = "Se inlocuieste cu"
* Zona de editare * Pentru toate etichetele
Name = "Edit1" AutoSize = .T.
HideSelection = .F. BackStyle = 0
*Etichete *Casetele de text
Name = "Label1" Name = "Text1"
Caption = "Text" DisabledBackColor = 192,192,192
Name = "Label2" Name = "Text2"
Caption = "Se cauta" 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 scrieÆi 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 scrieÆi 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 prelucrării datelor 285

„ Pentru casetele de text scrieÆi 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 scrieÆi 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
„ SalvaÆi formularul. LansaÆi formularul în execuÆie çi-l testaÆi.

6. CreaÆi tabelul agenda cu urmåtoarea structurå: nume(C,15), prenume(C,15), adresa


(C,40), telefon(C,10) çi data_n(D). RealizaÆi o casetå de dialog care så permitå urmå-
toarele operaÆii cu datele din tabel: parcurgerea tabelului pentru vizualizare (nu se pot
modifica datele din câmpuri) çi adåugarea de noi înregistråri. Butoanele >>> çi <<< se
folosesc pntru parcurgerea tabelului înainte çi înapoi, iar butonul Adauga pentru
adåugarea de noi înregistråri.
„ CreaÆi formularul çi adåugaÆi la
formular cinci etichete, o zonå de
editare (pentru câmpul adresa),
patru casete de text (pentru restul
câmpurilor) çi patru butoane de
comandå. StabiliÆi pentru formular çi
controale urmåtoarele proprietåÆi:
* 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 prelucrării 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"
„ ScrieÆi 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
„ ScrieÆi procedurile asociate evenimentului Init al casetelor de text çi al zonei de edi-
tare:
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=''
„ ScrieÆi 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.Text3.ReadOnly=.F.
ThisForm.Text4.ReadOnly=.T. ThisForm.Text4.ReadOnly=.F.
ThisForm.Edit1.ReadOnly=.T. ThisForm.Edit1.ReadOnly=.F.
ThisForm.Refresh ThisForm.Refresh
endif ThisForm.Text1.SetFocus
endproc endproc
procedure Click &&Buton3 procedure Click &&Buton4
append blank ThisForm.Release
ThisForm.Text1.ReadOnly=.F. endproc
ThisForm.Text2.ReadOnly=.F.
„ SalvaÆi formularul. LansaÆi formularul în execuÆie
çi-l testaÆi.

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å sågeÆi (sus/jos
sau dreapta/stânga) care poate fi acÆionat executând clic cu mouse-ul pe una dintre
sågeÆi. Evenimentul declançat 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 cåruia i se atribuie valoarea.
Pe lângå proprietåÆile standard çi specifice unei casete de text, derulorul mai are çi
urmåtoarele proprietåÆi specifice:
9 Pasul Increment . Este de tip numeric çi reprezintå cu cât se incrementeazå/decre-
menteazå 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 ProprietåÆile 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 numår care depåçeçte aceastå valoare, se
afiçeazå un mesaj de eroare.
Pentru valorile incrementate/decrementate în derulor: SpinnerHighValue - va-
loarea maximå çi SpinnerLowValue - valoarea minimå. Dacå se incrementeazå/
decrementeazå peste limite, nu se afiçeazå un mesaj de eroare, dar valoarea
controlului nu va mai fi modificatå peste limitele admise.
Pentru a controla comportamentul controlului au o fost adåugate urmåtoarele evenimente
specifice:
9 Evenimentele declançate la pierderea focalizårii controlului çi care permit validarea
valorii introduse (de la tastaturå sau cu mouse-ul). Astfel:
Dacå procedura asociatå evenimentului RangeLow întoarce un numår mai mare
decât cel introdus în control, controlul va påstra focalizarea.
Dacå procedura asociatå evenimentului RangeHight întoarce un numår mai mic
decât cel introdus în control, controlul va påstra focalizarea.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 289

9 Evenimentele declançate de acÆionarea derulorului cu mouse-ul:


UpClick - când este acÆionat butonul de incrementare çi
DownClick - când este acÆionat butonul de decrementare.

ConstruiÆi un formular care conÆine casete de text folosind metoda programårii


RealizaÆi 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.
„ CreaÆi un formular nou. În formular
creaÆi urmåtoarele controale: trei
casete de text cu derulor, trei etichete çi un buton de comandå. Pentru caseta de
text cu derulor folosiÆi instrumentul Spinner de pe bara Form Controls.
„ StabiliÆi propritåÆile pentru formular çi controale. Pentru controlul Spinner1 trebuie så
atribuiÆi prorpietåÆilor KeyboardHighValue çi SpinnerHighValue o valoare calcu-
latå: year(date()). Pentru aceasta, în fereastra de proprietåÆi folosiÆi butonul con-
structorului de expresii Expression Builder care deschide caseta de dialog prin
intermediul cåreia construiÆi 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ă

„ DefiniÆi urmåtoarele 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
„ SalvaÆi formularul. LansaÆi în execuÆie formularul çi-l
testaÆi.

Grila Gridx, coloana Columnx çi antetul coloanei Headerx


Grila ca obiect de interfaÆå se foloseçte pentru organizarea datelor sub formå de tabele. Ea
afiçeazå un ansamblu de rânduri çi coloane. IntersecÆia unui rând cu o coloanå se numeçte
celulå (cell). În celulele grilei se pot scrie çi se pot afiça informaÆii atât sub formå de texte, cât
çi sub formå de imagini.
Grila se realizeazå prin intermediul obiectului container Gridx care conÆine obiecte de tip
coloanå Columnx. Obiectul coloanå la rândul såu conÆine un obiect de tip antet Headerx
çi alte controale. Controalele sunt adaptate datelor care trebuie introduse sau afiçate î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. Açadar,
grila este o matrice în celulele cåreia pot fi create diferite obiecte de interfaÆå. Grila se
creeazå într-un formular.
Folosind acest tip de obiect, pot fi afiçate sub forma unui tabel câmpurile dintr-un tabel al
bazei de date. Aspectul afiçårii în grilå este asemånåtor cu cel al ferestrei Browse. FaÆå de
fereastra Browse, grila are avantajul cå poate fi tratatå ca un obiect cu proprietåÆi, care çtie
så execute diferite metode çi care çtie så råspundå la evenimente.
Elementele caracteristice ale unui obiect de interfaÆå de tip grilå sunt:
9 Dimensiunea grilei. Este datå de numårul de rânduri çi de coloane ale grilei.
9 Rândul grilei. Corespunde unei înregistråri dintr-un tabel.
9 Coloana grilei. Corespunde unui câmp din tabel sau unei variabile de memorie a
cårei valoare este datå de o expresie care poate conÆine çi câmpuri din tabel.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 291

9 Antetul coloanei. Este o etichetå afiçatå în partea de sus a coloanei care conÆine un
text explicativ referitor la datele afiçate în coloanå.
9 Celula. Celula curentå (celula activå) este celula care primeçte focalizarea. Ea este
determinatå de numårul rândului çi numårul coloanei la intersecÆia cårora se gåseçte
celula. Utilizatorul poate schimba în orice moment celula curentå folosind mouse-ul
sau tastatura (tasta Tab). Dimensiunea celulei este determinatå de înålÆimea rândului çi
låÆimea coloanei. Aceste proprietåÆi trebuie så fie modificate dacå nu sunt suficiente ca så
încapå textul sau imaginea în celulå.
9 Alinierea. Se referå la alinierea datelor în coloanele tabelului çi în celule.
9 Barele de derulare. Se folosesc pentru a deplasa conÆinutul grilei atunci când nu pot
fi vizualizate toate datele în zona de afiçare a grilei. Se pot folosi bare de derulare pe
verticalå çi pe orizontalå.
9 Liniile folosite ca delimitatori. Pentru delimitarea celulelor se pot folosi linii care pot
fi caracterizate de culoare çi grosime.
9 Coloana cu marcajul pentru çtergere. Este o coloanå care poate fi folositå pentru a
marca o înregistrare pentru çtergere (se executå clic în aceastå coloanå în dreptul
înregistrårii pe care vreÆi så o marcaÆi pentru çtergere sau pentru care vreÆi så anulaÆi
un marcaj pentru çtergere - la fel ca la fereastra Browse).
9 Coloana cu marcajul rândului curent. Este o coloanå care poate fi folositå pentru a
stabili înregistrarea curentå (se executå clic în aceastå coloanå în dreptul înregistrårii
care vreÆi så devinå înregistrare curentå - la fel ca la fereastra Browse).
9 Panourile grilei. La fel ca la fereastra Browse grila poate fi împårÆitå în douå partiÆii
numite panouri. Cele douå panouri pot funcÆiona ca douå grile independente, iar
divizarea lor se face prin intermediul unei bare de divizare (split).

Coloana Antetul

Formularul

Coloana cu
marcajul rândului Barele de
derulare ale grilei

Celula selectatå
Coloana cu
marcajul pentru
çtergere

Grila

Toate aceste elemente pot fi caracterizate cu ajutorul proprietåÆilor grilei, coloanelor çi al


anteturilor, pot fi manipulate cu ajutorul metodelor çi pot råspunde la evenimente spe-
cifice.
292 Informatică

Antetul - obiectul Header


Creeazå un antet al unei coloane dintr-o grilå prin care se afiçeazå o etichetå în partea
de sus a coloanei. Antetul poate råspunde la evenimente. Aspectul antetului poate fi
stabilit prin intermediul proprietåÆilor pentru fontul caracterelor (nume font, dimensiune,
stil), pentru aliniere çi culoare (pentru fond çi pentru text). Obiectul nu are proprietåÆi
pentru dimensiune çi poziÆie. Prin proprietatea Caption a antetului se stabileçte textul
care se afiçeazå ca etichetå a coloanei.
Antetul råspunde la evenimente declançate de acÆiunile mouse-ului (Click, RightClick,
DblClick, MouseUp, MouseDown, MouseMove) çi cunoaçte metoda Refresh.

Coloana - obiectul Column


Creeazå o coloanå într-o grilå. Coloana poate conÆine un obiect antet çi diverse
controale. Coloana poate conÆine date din câmpurile unui tabel sau valori ale unei
expresii. Afiçarea çi editarea lor se poate face cu ajutorul controalelor. Açadar, într-o
coloanå poate fi creat un antet çi pot fi adåugate diferite controale. Controalele pot fi adå-
ugate la coloana unei grile cu metoda AddObject în procedura asociatå evenimentului
Init al formularului care conÆine 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 câmp sau al unei variabile de memorie).
Alinierea controalelor în coloanå poate fi stabilitå cu proprietatea Alignment. Coloanele
nu au decât proprietatea Width (låÆime). ProprietåÆile Width ale controalelor create în co-
loanå sunt protejate la scriere (read-only). ProprietåÆile specifice unei coloane sunt:
9 Numårul de ordine al coloanei ColumnOrder . Este un numår de ordine relativ al co-
loanei în cadrul grilei. La crearea grilei, fiecare coloanå primeçte un index pentru referinÆå,
în ordinea în care au fost create. Numårul de ordine al coloanei este diferit de acest index
çi se referå la ordinea de exploatare a coloanelor într-o grilå (afiçare çi focalizare).
9 ProprietåÆile dinamice pentru aspectul fizic al coloanei. Aceste prorpietåÆi se pot
folosi pentru a stabili dinamic caracteristicile fizice ale unei coloane deoarece ele sunt
reevaluate dupå fiecare execuÆie 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 foloseçte pentru a controla modul în care poate fi focalizatå o celulå din coloanå.
Dacå are valoarea .T., celula este focalizatå atunci când utilizatorul executå clic în celulå
sau apaså repetat tasta Tab pânå este deplasat selectorul în celulå. Dacå are valoarea .F.
(valoarea implicitå), aceste acÆiuni nu vor focaliza celula.
9 ProprietåÆile folosite pentru a administra controalele din coloanå:
Numårul controalelor: ControlCount . Este de tip numeric çi reprezintå numårul de
controale definite într-o coloanå (inclusiv antetul).
ReferinÆele controalelor: Controls - este un vector care conÆine referinÆele pentru
controalele din coloanå.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 293

Controlul curent: CurrentControl - este de tip çir de caractere çi conÆine numele


controlului care afiçeazå çi primeçte date în celula activå a coloanei.
Råspândirea influenÆei: Sparse - este de tip logic çi se foloseçte pentru a controla
modul în care controlul curent influenÆeazå çi celelalte controale din coloanå. Dacå are
valoarea .T. (valoarea implicitå), numai celula activå foloseçte obiectul de interfaÆå
specificat în proprietatea CurrentControl (controlul curent), iar celelalte celule din
coloanå folosesc pentru afiçare ç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. Açadar, dacå vreÆi ca într-o coloanå så
folosiÆi pentru vizualizarea çi editarea datelor un alt tip de control decât caseta de text,
proprietatea Sparse a coloanei trebuie så aibå valoarea .F..
Domeniul sursei de date: Bound - este de tip logic çi se foloseçte pentru a controla
sursa de date a controalelor din coloanå. Dacå are valoarea .T. (valoarea implicitå),
toate controalele din coloanå vor folosi aceeçi surså de date ca çi coloana, iar dacå are
valoarea .F., fiecare control din coloanå va putea folosi propria sa surså de date.
Açadar, dacå vreÆi så obligaÆi toate controalele din coloanå så foloseascå sursa de
date a coloanei (condiÆie necesarå în cazul unui tabel al sursei de date), proprietatea
Bound a coloanei trebuie så aibå valoarea .T..
9 ProprietåÆile 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
cåtre utilizator (cu ajutorul tastaturii sau prin glisarea cu mouse-ul a coloanei), ci numai
din program prin modificarea valorii proprietåÆii 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 låÆime), iar dacå are valoarea .F. (valoarea implicitå), coloana nu poate fi
redimensionatå interactiv de cåtre utilizator (cu ajutorul tastaturii sau prin glisarea cu
mouse-ul a uneia dintre laturile coloanei), ci numai din program prin modificarea valorii
proprietåÆii 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 cåtre utilizator sau prin modificarea din program a proprietåÆilor
Top çi Left ale coloanei) çi Resize (provocat prin redimensionarea interactivå a coloanei de
cåtre utilizator, sau prin modificarea din program a proprietåÆii Width a coloanei).

Grila - obiectul Grid


Adunå într-un container mai multe obiecte de tip coloanå. La nivelul grilei nu existå pro-
prietatea Alignment (alinierea se face la nivelul fiecårei coloane). Existå proprietåÆile
pentru poziÆia grilei, relative la formular (Top çi Left), proprietåÆile pentru dimensiunea
grilei (Hight çi Width), pentru culori çi pentru caracteristicile caracterelor.
Pe lângå aceste proprietåÆi generale existå urmåtoarele proprietåÆi folosite pentru a stabili
aspectul fizic al grilei (sunt proprietåÆi 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 ÎnålÆimea antetului HeaderHeight . Este de tip numeric çi se måsoarå în pixeli.
9 Modificarea interactivå a înålÆimii antetului AllowHeaderSizing . Este de tip logic.
Dacå are valorea .T., permite modificarea interactivå de cåtre utilizator a înålÆimii antetului.
9 ÎnålÆimea rândului RowHeight . Este de tip numeric. Dacå are valoarea -1, înålÆimea
este aleaså automat astfel încât så încapå caracterele corespunzåtoare dimensiunii
stabilite prin proprietåÆile FontSize çi FontName.
9 Modificarea interactivå a înålÆimii rândului AllowRowSizing . Este de tip logic. Dacå
are valorea .T., permite modificarea interactivå de cåtre utilizator a înålÆimii rândului.
9 EvidenÆierea celulei focalizate HeighLight . Este de tip logic çi determinå cum este
afiçatå celula focalizatå: dacå are valoarea .T., celula focalizatå apare evidenÆiatå, iar
dacå are valoarea .F., celula focalizatå nu apare evidenÆiatå.
Alte proprietåÆi 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 afiçate.
afiçate. Pentru valorile diferite de 0 barele de
1 Se afiçeazå numai barele
derulare sunt afiçate automat atunci când în spaÆiul pe orizontalå.
de afiçare al grilei nu pot fi afiçate toate datele din 2 Se afiçeazå numai barele
sursa de date a grilei. AcÆionarea elementelor pe verticalå.
caracteristice ale barei de derulare sunt sesizate de 3 Se afiçeazå barele pe
evenimentul Scrolled. Barele de derulare pot fi (implicit) orizontalå çi pe verticalå.
acÆionate interactiv (clic pe sågeÆi, clic deasupra,
deddesubt, la dreapta sau la stânga casetei de derulare sau glisarea casetei de
derulare) sau pot fi acÆionate din program folosind metoda DoScroll.
9 Coloana cu marcajul înregistrårii curente RecordMark . Este de tip logic çi con-
troleazå dacå este afiçatå coloana care conÆine marcajul pentru înregistrarea curentå:
dacå are valoarea .T. (implicit), este afiçatå, iar dacå are valoarea .F., nu este afiçatå.
9 Coloana cu marcajele pentru çtergere DeleteMark . Este de tip logic çi controleazå
dacå este afiçatå coloana care conÆine marcajele pentru çtergere. Dacå are valoarea .T.
(implicit), este afiçatå, iar dacå are valoarea .F., coloana nu este afiçatå.
9 ProprietåÆile folosite pentru a caracteriza liniile folosite ca delimitatori:
Modul de afiçare a liniilor: GridLines - este de tip Valoare Efect GridLines
numeric. 0 Liniile nu sunt afiçate.
Grosimea liniilor: GridLineWidth - este de tip 1 Liniile se afiçeazå numai
numeric çi determinå grosimea în pixeli a liniilor. pe orizontalå.
Culoarea liniilor: GridLineColor - este de tip 2 Liniile se afiçeazå numai
pe verticalå.
numeric çi reprezintå codul culorii.
3 Liniile se afiçeazå pe
9 ProprietåÆile folosite pentru a caracteriza împårÆirea (implicit) orizontalå çi pe verticalå.
grilei în panouri:
ÎmpårÆirea în panouri: Partition - este de tip numeric çi controleazå dacå grila
este împårÆitå sau nu în panouri. Dacå are valoarea 0, grila nu este împårÆitå în
panouri, dacå are valoarea diferitå de 0, înseamnå cå grila este împårÆitå în
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 295

panouri, iar valoarea proprietåÆii reprezintå distanÆa dintre marginea stângå a grilei
çi bara de divizare a grilei în panouri.
Panoul activ: Panel - este de tip numeric. Dacå are valoarea 0, panoul activ este în
stânga, iar dacå are valoarea 1 (implicit), panoul activ este în dreapta.
Legåtura dintre panouri: PanelLink - este de tip logic çi determinå dacå cele
douå panouri sunt legate între ele (dacå au acelaçi aspect determinat de proprie-
tåÆile HeaderHeight, DeleteMark, GridLines,..., HeightLight, RecordMark,
RowHeight, ScrollBar): dacå are valoarea .T. (implicit), au acelaçi aspect, iar
dacå are valoarea .F., nu au acelaçi aspect.
9 ProprietåÆile folosite pentru a caracteriza coloanele grilei:
Numåul de coloane: ColumnCount - este de tip numeric. Implicit are valoarea -1,
care înseamnå numår suficient de coloane pentru a afiça câmpurile sursei de date.
Referirea coloanei: Columns - este de tip vector çi conÆine referinÆe cåtre coloanele
grilei.
Prima coloanå afiçatå: LeftColumn - este de tip numeric çi reprezintå numårul
coloanei (numåråtoarea se face începând de la stânga) care va fi prima afiçatå. De
exemplu, dacå proprietatea are valoarea 3, afiçarea în grilå va începe cu coloana
3, iar coloanele 1 çi 2 nu vor fi afiçate.
Pe lângå proprietåÆile care caracterizeazå aspectul, grila mai are çi proprietåÆi specifice,
prin care este caracterizat comportamentul ei:
9 ProprietåÆile folosite pentru a caracteriza celula activå (focalizatå):
PoziÆia absolutå furnizatå de numårul rândului ActiveRow çi de numårul coloanei
ActiveColumn . Aceste proprietåÆi sunt de tip numeric çi se calculeazå faÆå de primul
rând, respectiv prima coloanå a grilei. Sunt proprietåÆi protejate la scriere (read-only).
Aceste valori corespund parametrilor metodei ActivateCell.
PoziÆia relativå furnizatå de numårul rândului RelativeRow faÆå de primul rând
afiçat în grilå çi de numårul coloanei RelativeColumn faÆå de prima coloanå
afiçatå în grilå. Aceste proprietåÆi sunt de tip numeric. De exemplu, dacå prima
coloanå afiçatå în grilå este coloana 2, iar proprietatea ActiveColumn are valoarea 5,
înseamnå cå valoarea proprietåÆii RelativeColumn este 3.
9 Adåugarea datelor la grilå este controlatå cu proprietatea de tip logic AllowAddNew,
care dacå are valoarea .T. permite adåugarea de noi rânduri la grilå (dacå se apaså
tasta ↓ se mai adaugå un rând la grilå).
9 ProprietåÆile folosite pentru a caracteriza sursa de date a grilei:
Tipul sursei de date: RecordSourceType este de tip numeric çi caracterizeazå
ce date se vor folosi pentru a popula grila. Dacå datele vor fi preluate dintr-un
tabel, acesta poate fi permanent sau temporar (cusor), poate fi deja construit sau
poate fi construit la iniÆializarea grilei (în procedura asociatå evenimentului Init al
grilei se poate crea un tabel folosind comanda SQL Create table). Înregistrårile
tabelului vor fi rândurile grilei, iar câmpurile lui vor fi coloanele grilei.
Sursa de date: RecordSource este de tip çir de caractere çi furnizeazå numele
tabelului folosit ca surså de date sau numele aliasului cursorului sau numele
fiçierului de interogåri.
296 Informatică

RowSourceType Semnificå: RowSource


0 - Table Sursa de date este un tabel deja construit. El va fi Numele tabelului.
deschis automat la iniÆializarea grilei (evenimentul Init).
1 - Alias (implicit) Tabelul care va fi sursa de date este specificat prin alias. Aliasul tabelului.
2 - Prompt Sursa de date este un tabel al cårui nume va fi Numele tabelului.
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 fiçier de Numele fiçierului de
interogåri (.qpr). interogåri (.qpr)
4 - SQL Statement Sursa de date va fi descriså printr-o instrucÆiune SQL InstrucÆiunea SQL
Select de interogare a bazei de date, care va genera
un tabel permanent sau temporar ce va fi afiçat în grilå.
9 ProprietåÆile folosite pentru a caracteriza grila care afiçeazå date dintr-un tabel al
bazei de date:
Câmpul cheie: RelationalExpr este de tip caracter çi precizeazå câmpul cheie
care asigurå legåtura între tabelul condus çi tabelul conducåtor çi care permite
reunirea celor douå tabele într-un singur tabel.
Aliasul tabelului conducåtor: LinkMaster este de tip çir de caractere çi
furnizeazå aliasul tabelului conducåtor al tabelului afiçat în grilå.
Pe lângå metodele obiçnuite, printre care çi SetAll çi SetFocus, grila mai are urmåtoare-
le metode specifice:
9 Manipularea barelor de derulare DoScroll . Prin aceastå metodå pemite derularea din
program a conÆinutului grilei pentru a simula acÆionarea 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 urmåtoarele valori: 0- derulare cu
un rând în sus, 1- derulare cu un rând în jos, 2- derulare cu o paginå în sus, 3- derulare cu
o paginå în jos, 4- derulare cu o coloanå la stânga, 5- derulare cu o coloanå la dreapta, 6-
derulare cu o paginå la stânga, 7- derulare cu câte 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> - numårul rândului çi
<m> - numårul coloanei. Apelul metodei se face cu ActivateCell(<n>,<m>).
9 Adåugarea unei coloane la grilå AddColumn . Prin aceastå metodå se poate
adåuga un nou obiect Column la grilå. Metoda trebuie så primeascå un parametru <n>
- poziÆia coloanei în grilå; coloanele care urmeazå dupå ea sunt deplasate cu o poziÆie
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> - poziÆia
coloanei care se çterge din grilå, altfel se çterge coloana activå (cea care conÆine
celula activå); coloanele care urmeazå dupå ea sunt deplasate cu o poziÆie spre
stânga. Apelul metodei se face cu DeleteColumn([<n>]).
Evenimentele specifice grilei sunt declançate de:
9 Manipularea barelor de derulare Scrolled . Acest eveniment este declançat fie de
acÆionarea interactivå a barei de derulare, fie prin acÆionarea ei din program cu metoda
DoScroll. Procedura asociatå evenimentului primeçte din partea acestuia parametrul
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 297

<nDirection> care îi comunicå modul în care a fost acÆionatå bara de derulare: 0-


derulare cu un rând în sus (butonul sau tasta ↑), 1- derulare cu un rând în jos (butonul
sau tasta ↓), 2- derulare cu o paginå în sus (clic pe bara verticalå, deasupra casetei), 3-
derulare cu o paginå în jos (clic pe bara verticalå, sub casetå), 4- derulare cu o coloanå
la stânga (butonul sau tasta ←), 5- derulare cu o coloanå la dreapta (butonul sau tasta
→), 6- derulare cu o paginå la stânga (clic pe bara orizontalå, la stânga casetei), 7-
derulare cu o paginå la dreapta (clic pe bara orizontalå, la dreapta casetei).
9 Marcarea pentru çtergere a unei înregistråri Deleted . Acest eveniment este
declançat fie de marcarea interactivå în grilå a înregistrårii pentru çtergere sau refacerea
ei, fie prin marcarea pentru çtergere cu comanda Delete. Procedura asociatå eveni-
mentului primeçte din partea acestuia parametrul <nRecNo> care îi comunicå numå-
rul înregistrårii 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 focalizårii: AfterRowColChange - se produce atunci cînd utilizatorul
mutå focalizarea într-o celulå dintr-o altå coloanå sau un alt rând 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 rândului în care a fost mutatå
focalizarea.
Înaintea mutårii focalizårii: BeforeRowColChange - se produce atunci cînd
utilizatorul mutå focalizarea într-o celulå dintr-o altå coloanå sau un alt rând al grilei,
înainte ca noua celulå så primeascå focalizarea çi înainte de evenimentul Valid al
obiectului din celula din care se mutå focalizarea.

CreaÆi o grilå pentru un tabel


„ CreaÆi un formular nou. În acest formular veÆi crea în mod rapid o grilå pentru
câmpurile din tabelul agenda cu ajutorul obiectului Data Environment.
„ ExecutaÆi clic pe butonul Data Environment din bara Form Designer. Se deschide
caseta de dialog Open din care
alegeÆi tabelul agenda. În fereastra
Data Environment va fi afiçat
tabelul. IndicaÆi titlul tabelului çi îl
glisaÆi în formular. Dupå ce eliberaÆi
butonul mouse-ului, în formular se va
crea o grilå cu o structurå de
coloane care corespunde câmpurilor
din tabel. Legendele din anteturile
coloanelor vor fi numele câmpurilor.
„ FaceÆi urmåtoarele modificåri de pro-
prietåÆi în fereastra Properties:
Pentru obiectul Grid1 modificaÆi proprietatea AllowAddNew = .T., pentru obiectul
298 Informatică

Header1 al coloanei a cincea (controlul Column5) modificaÆi proprietatea Caption=


'Data nasterii'.
„ AdåugaÆi o coloanå la grilå: în obiectul Grid1 modificaÆi proprietatea ColumnCount=6.
„ În coloana a çasea se va afiça un câmp calculat çi anume vârsta persoanei. StabiliÆi
pentru aceastå coloanå proprietåÆile: pentru obiectul Column6 proprietåÆile
ControlSource=int((date()-agenda.data_n)/365) çi ReadOnly=.T.(este protejat la
scriere fiind un câmp calculat), iar pentru controlul Header al acestei coloane
proprietatea Caption='Varsta'.
„ SalvaÆi formularul sub numele agenda_t çi închideÆi constructorul de formulare.
„ Prin aceastå metodå fiecårei 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: deschideÆi tabelul asociat formularului cu comanda:
use agenda_t.scx
„ DeschideÆi fereastra Browse cu comanda browse. CåutaÆi în acest tabel înregistrarea
care coprespunde obiectului Grid1.Column3.Text1 (caseta de text din coloana a treia
a grilei). În aceastå înregistrare faceÆi urmåtoarele modificåri: în coloanele class çi
baseclass înlocuiÆi textbox cu editbox, în coloana objname înlocuiÆi Text1 cu Edit1.
DeschideÆi câmpul Properties çi çtergeÆi conÆinutul. ÎnchideÆi fereastra Browse.
ÎnchideÆi tabelul cu comanda use.
„ DeschideÆi fiçierul pentru modificare cu comanda modi form agenda_t. AdåugaÆi la
formular un buton pentru terminare. FaceÆi modificårile ncesare pentru proprietåÆi,
astfel încât 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 prelucrării 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.
„ ScrieÆi procedurile asociate evenimentelor Init al formularului çi Click al butonului de
închidere (prin care se çterg çi înregistrårile considerate vide - fårå 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
„ SalvaÆi formularul çi-l lansaÆi în execuÆie. TestaÆi grila.

„ AdåugaÆi la tabel câmpul de tip numeric Copii (numårul de copii ai persoanei


respective).
„ ReluaÆi operaÆia de creare a grilei folosind metoda constructorului rapid (deschideÆi
tabelul, creaÆi un formular nou çi apåsaÆi butonul BuilderLock de pe bara Form
Controls. În caseta de dialog care se deschide, în secÆiunea Grid gåsiÆi instrumentele
necesare pentru a alege câmpurile din tabel care vor fi surså de date pentru coloanele
grilei, în secÆiunea Style gåsiÆi instrumentele necesare pentru a alege stilul grilei, iar în
secÆiunea Layout gåsiÆi instrumentele necesare pentru stabilirea unor proprietåÆi pentru
obiectele grilei: proprietatea Caption pentru Header, tipul controlului din lista Control
type). Pentru câmpul Copii alegeÆi un control de tip Spinner).
300 Informatică

T est pentru evaluare:


1. CreaÆi un tabel cu evidenÆa 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. CreaÆi un formular cu urmåtoarele controale: trei casete de text pentru nume,
prenume çi telefon, o casetå de text cu derulor pentru plata parÆialå (cu pasul de
10.0000 çi cu valorile limitå 0 çi 500.000), trei casete de text protejate la scriere în
care afiçaÆi suma totalå achitatå de elev (câmpul suma), diferenÆa råmaså de achitat
çi suma totalå plåtitå de elevi (controlul va deveni vizibil la prima apåsare a butonului
pentru Total), çapte etichete în care så afiçaÆi semnificaÆia casetelor de text din
formular çi 5 butoane declançatoare: 2 pentru parcurgerea tabelului înainte çi înapoi,
unul pentru adåugarea unei noi înregistråri, unul pentru afiçarea sumei totale çi unul
pentru terminare.
2. RezolvaÆi aceeaçi problemå folosind un control de tip grilå. Grila va avea çase
coloane corspunzåtoare celor çase casete de text care se referå la un elev. Pentru
plata parÆialå se va folosi çi în grilå o casetå de text cu derulor. Vor fi protejate la
scriere coloanele care conÆin suma totalå achitatå de elev çi diferenÆa de achitat.
Pentru suma totalå plåtitå de elevi veÆi folosi o casetå de text protejatå la scriere çi o
etichetå. Formularul va avea doar douå butoane declançatoare: unul pentru Total çi
altul pentru Terminare.
3. În variantele prezentate anterior, nu aveÆi posibilitatea så corectaÆi o platå parÆialå pe
care aÆi scris-o greçit (la påråsirea controlului se actualizeazå câmpul suma). Cum
puteÆi îmbunåtåÆi formularul pentru a rezolva aceastå situaÆie?

# ÎncercaÆi:
Adevårat/Fals:
1. Textul afiçat în formular prin care utilizatorul poate identifica rolul controlului se pås-
treazå în proprietatea Name.
2. ProprietåÆile ReadOnly çi Enabled au aceeaçi semnificaÆie: controleazå accesul la un
control.
3. When este un eveniment declançat înaintea primirii focalizårii de cåtre control.
4. Proprietatea Default este specificå unui control de tip CommandButton.
5. Eticheta are proprietatea AutoSize.
6. Câmpul de editare are proprietatea WordWrap.
7. Increment este o propritatea specificå unui control de tip Spinner.
8. Evenimentul UpClick este specific tuturor controalelor.
9. Obiectul Column se poate crea numai în obiectul container Grid.
10. Proprietatea Panel controleazå împårÆirea grilei în panouri.
CompletaÆi:
1. InformaÆiile despre control, afiçate într-o casetå atunci când este indicat controlul, se
påstreazå în proprietatea .............. çi se poate folosi numai dacå proprietatea ..............
a formularului are valoarea .T.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 301

2. Evenimentul Valid se declançeazå .................................... focalizårii.


3. Un formular care conÆine o casetå de text pentru introducerea parolei trebuie så fie ............
4. Evenimentul DownClick este specific unui control de tip ........
5. Obiectul Header se poate crea numai în obiectul ...................
6. Sparse este o proprietate specificå unui control ...........................
7. Textul afiçat ca o etichetå a unei coloane dintr-o grilå se memoreazå în proprietatea
Caption a controlului ...........
8. Proprietatea prin care se stabileçte dacå toate controalele dintr-o coloanå au aceeaçi
surså de date este ..............
AlegeÆi råspunsurile 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 câmp
de editare se stabileçte 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 påstreazå în proprietatea:
a) RecordSourceType b) RecordSource c) RecordMark

R åspunsuri:
Adevårat/Fals: 1-F; 2-F; 3-A; 4-A; 5-A; 6-F; 7-A; 8-F; 9-A; 10-F.
CompletaÆi: 1-ToolTipText, ShowToolTips; 2-dupå pierderea; 3-modal; 4-Spinner; 5- Column; 6-
Column; 7-Header; 8-Bound.
AlegeÆi råspunsurile corecte: 1-b; 2-a,c; 3- a; 4-a; 5-b.

3.4.4. Controale care permit utilizatorului så aleagå


Multe aplicaÆii necesitå ca utilizatorul så aleagå din mai multe variante, de la o simplå
alegere dintre douå opÆiuni Da/Nu pânå la alegerea unei variante dintr-o listå care conÆine
sute de posibilitåÆi. Varianta aleaså este atribuitå ca valoare nouå unei variabile de
memorie sau unui câmp. Controalele care permit utilizatorului så aleagå sunt:

Controlul SemnificaÆie Tipul datelor


Comutatorul Permite utilizatorului så aleagå din douå Logic
variante posibile: adevårat sau fals.
Butoane de opÆiuni Un set de opÆiuni care permite utilizatorului så Çir de caractere
aleagå numai una dintre ele. sau numere
Lista O listå de variante din care utilizatorul poate Çir de caractere
så aleagå una sau mai multe variante. sau numere
Caseta combinatå O combinaÆie î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.
302 Informatică

Comutatorul CheckBoxx

Se foloseçte într-o aplicaÆie pentru a permite utilizatorului så aleagå din douå variante
posibile, adicå så comute între douå variante posibile. Într-un formular, comutatoarele
sunt independente unele de altele. De obicei, legenda comutatorului afiçeazå numele
comutatorului care corespunde datei a cårui valoare va fi stabilitå de utilizator.
Proprietatea de aliniere a comutatorului (Alignment) se referå la modul de aranjare a
legendei faÆå de comutator (la dreapta - 1 sau la stânga - 0). Metoda de acÆionare a unui
comutator este la fel ca çi la butoanele de comnadå: Click. Astfel, procedura asociatå
evenimentului Click trebuie så asigure trecerea comutatorului dintr-o stare în alta çi de a
atribui proprietåÆii Value valoarea corespunzåtoare noii ståri. Valoarea unui comutator
poate fi de tip logic sau numeric:.F. sau 0, dacå este dezactivat, .T. sau 1, dacå este
activat çi NULL sau 2, dacå nu este disponibil.
Stilul de reprezentare a comutatorului poate fi stabilit cu proprietatea Style. Dacå
proprietatea are valoarea 0 - Standard (implicit), controlul este reprezentat grafic printr-o
casetå pentru care, dacå are în interior semnul de validare, valoarea controlului este .T.,
iar dacå nu are semnul de validare are valoarea .F.. De aceea se mai numeçte çi casetå
de validare. Dacå proprietatea are valoarea 1 - Graphic, controlul este reprezentat ca un
buton de comandå: în interiorul såu este afiçatå o imagine care poate fi însoÆitå de text
(textul va fi scris centrat, sub imagine). Pentru acest stil de reprezentare trebuie folositå
proprietatea DownPicture prin care se stabileçte aspectul comutatorului când este
activat. Se recomandå folosirea acestui tip de reprezentare în barele cu instrumente.
În proprietatea Value se memoreazå 0 sau 1 dacå proprietatea ControlSource este tip
numeric sau .T. sau .F. dacå proprietatea ControlSource este de tip logic.

CreaÆi un comutator folosind metoda programårii clasice


În caseta de dialog Test se foloseçte comutatorul Afisare patrat pentru a controla afiçarea
unei forme de tip påtrat.
„ ScrieÆi pogramul surså:
F1 = CreateObject('Form') F1.C1.BackStyle = 0
F1.Closable = .F. F1.C1.Click
F1.Caption='Test'
F1.Height=200 F1.Show
F1.BackColor = RGB(200,200,200) Read events
F1.AddObject('B1','Buton') Define class Comutator asB;
F1.AddObject('C1','Comutator') CheckBox
F1.AddObject('P1','Patrat') Alignment=1
F1.B1.Visible =.T. Top = 40
F1.C1.Value=.F. Left = 10
F1.C1.Visible = .T. Height = 25
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării 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
„ ScrieÆi pogramul. LansaÆi programul în execuÆie çi testaÆi comutatorul.

CreaÆi un comutator folosind metoda programårii vizuale


„ CreaÆi un formular nou. CreaÆi în acest formular urmåtoarele obiecte: un comutator, o
formå çi un buton. Pentru comutator folosiÆi butonul CheckBox, iar pentru formå
butonul Shape de pe bara Form controls.
„ StabiliÆi pentru formular çi controale urmåtoarele proprietåÆi:
*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"
„ ScrieÆi procedurile asociate evnimentelor Init çi Click ale comutatorului çi evenimen-
tului 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
„ SalvaÆi formularul. Îl lansaÆi în execuÆie çi-l testaÆi.
„ AdåugaÆi la tabelul Agenda câmpul de tip logic Are_copii (are valoarea adevårat dacå
persoana respectivå are copii).
„ ReluaÆi operaÆia de creare a grilei folosind metoda
constructorului rapid. Pentru câmpul Are_copii ale-
geÆi un control de tip CheckBox).

Butonul de opÆiune OptionButtonx çi


grupul de butoane de opÆiuni OptionGroupx
Într-un formular, controlul de tip buton de opÆiune nu poate fi folosit independent ci
într-un container de tip grup de butoane de opÆiuni. Se folosesc într-o aplicaÆie pentru a
permite utilizatorului så aleagå din douå sau mai multe variante posibile. ApartenenÆa
butoanelor de opÆiuni 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 funcÆioneazå 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 opÆiuni, fiecare grup având 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å
vreÆi så afiçaÆi numele datei pentru care stabiliÆi o valore cu ajutorul butoanelor de opÆiuni
din grup, va trebui så folosiÆi un control de tip etichetå (label).
Legenda fiecårui buton afiçeazå valoarea care se va atribui datei asociate grupului dacå
se va selecta acel buton. Proprietatea de aliniere a butonului de opÆiuni se referå la
modul de aranjare a legendei faÆå de buton (la dreapta sau la stânga). Butonul de opÆiuni
este reprezentat grafic printr-un cerc care are în interior un punct atunci când butonul
este selectat.
În proprietatea Value se memoreazå:
9 Dacå proprietatea ControlSource este o variabilå de memorie sau un câmp de tip
numeric, se memoreazå poziÆia în grup a butonului selectat.
9 Dacå proprietatea ControlSource este o variabilå de memorie sau un câmp de tip çir
de caractere, se memoreazå textul explicativ (Caption) asociat butonului selectat.
Butonul radio poate fi selectat prin mai multe metode:
9 IndicaÆi cu mouse-ul butonul çi executaÆi clic.
9 MutaÆi selectorul în grupul de butoane radio apåsând repetat tasta Tab çi selectaÆi
apoi butonul activ din grup folosind tastele cu sågeÆi.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 305

9 ApåsaÆi tastele de acces la buton (tasta Alt împreunå cu tasta literei de identificare).
Pentru administrarea butoanelor din grup puteÆi folosi proprietåÆile specifice grupului de
butoane radio:
9 Numårul de butoane din grup ButtonCount . Este de tip numeric.
9 Butoanele Buttons . Este de tip vector çi poate fi folosit pentru referirea butoanelor
din grup.
PuteÆi folosi metoda SetAll pentru a atribui aceeaçi valoare a unei proprietåÆi tuturor
butoanelor din grup. Sintaxa de apelare a metodei este: SetAll('<proprietate>',<valoare>).
Evenimentul Click asociat grupului de butoane radio va atribui datei valoarea asociatå
butonului selectat.

CreaÆi un grup de butoane cu opÆiuni folosind metoda programårii


În caseta de dialog Test se foloseçte
grupul de butoane radio Afisare pentru
a alege figura geometricå afiçatå: cerc,
elipsa sau patrat. În procedura asociatå
evenimentului Click al grupului de
butoane se va testa proprietatea Value
a grupului çi în funcÆie de valoarea ei
se va afiça una dintre figurile geome-
trice. Pentru afiçarea unei legende a
grupului de butoane s-a folosit un
control de tip etichetå.
Obiectele, proprietåÆile obiectelor çi
procedurile asociate evenimentelor
sunt prezentate în programul urmåtor. ScrieÆi programul, îl salvaÆi, îl lansaÆi în execuÆie çi
apoi testaÆi grupul de butoane radio.
dimension a(3) F1.B1.Visible =.T.
a(1)='Cerc ' F1.L1.Caption = 'Afisare'
a(2)='Elipsa ' F1.L1.AutoSize = .T.
a(3)='Patrat ' F1.L1.Top=20
F1 = CreateObject('Form') F1.L1.Left=20
F1.Closable = .F. F1.L1.BackStyle=0
F1.FontSize=14 F1.L1.Visible =.T.
F1.Caption='Test' F1.GO1.Buttons(1).Caption=;
F1.BackColor = RGB(200,200,200) "\<Cerc"
F1.AddObject('B1','Buton') F1.GO1.Buttons(2).Caption=;
F1.AddObject('GO1','GrupOpt') "\<Elipsa"
F1.AddObject('C1','Cerc') F1.GO1.Buttons(3).Caption=;
F1.AddObject('E1','Elipsa') "\<Patrat"
F1.AddObject('P1','Patrat') F1.GO1.SetAll("Width", 100)
F1.AddObject('L1','Label') F1.GO1.SetAll("Left", 10)
306 Informatică

F1.GO1.SetAll("BackStyle", 0) Cancel = .T.


F1.GO1.SetAll("FontSize", 12) Left = 125
F1.GO1.Visible = .T. Top = 200
F1.GO1.BackStyle = 0 Height = 25
F1.GO1.Click Procedure Click
ThisForm.Release
F1.Show clear events
Read events enddefine
Define class Cerc as shape
Define class GrupOpt as; Top = 30
OptionGroup Left = 200
ButtonCount = 3 Width = 100
Top = 40 Height = 100
Left = 20 Curvature = 99
Height = 80 BackColor = RGB(200,200,200)
Width = 100 FillStyle=4
Procedure Click Enddefine
ThisForm.C1.Visible = .F. Define class Elipsa as shape
ThisForm.E1.Visible = .F. Top = 30
ThisForm.P1.Visible = .F. Left = 200
do case Width = 120
case ThisForm.GO1.Value=1 Height = 80
ThisForm.C1.Visible =.T. Curvature = 99
case ThisForm.GO1.Value = 2 BackColor = RGB(150,150,150)
ThisForm.E1.Visible = .T. FillStyle=5
case ThisForm.GO1.Value = 3 Enddefine
ThisForm.P1.Visible = .T. Define class Patrat as shape
endcase Top = 30
ThisForm.CurrentX=20 Left = 200
ThisForm.CurrentY=150 Width = 100
ThisForm.Print; Height = 100
(a(ThisForm.GO1.Value)) Curvature = 0
Enddefine BackColor = RGB(100,100,100)
Define class Buton as; FillStyle=7
CommandButton Enddefine
Caption = '\<Terminarea'

CreaÆi un grup de butoane cu opÆiuni folosind metoda vizualå


„ CreaÆi un formular în care definiÆi apoi o legendå pentru grupul de butoane de opÆiuni,
un grup de butoane de opÆiuni cu trei butoane, trei forme care se vor suprapune în
formular çi un buton.
„ StabiliÆi proprietåÆile 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 prelucrării 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"
„ ScrieÆi procedurile asociate evenimentelor Init al formularului, Init çi Click ale grupului
de butoane de opÆiuni ç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
„ SalvaÆi formularul, îl lansaÆi în execuÆie çi-l testaÆi.

CreaÆi un grup de butoane cu opÆiuni folosind Option Group Builder


CreaÆi acelaçi grup de butoane radio folosind acest constructor rapid. CreaÆi obiectul de tip
grup de butoane de opÆiuni, îl selectaÆi çi deschideÆi caseta de dialog a constructorului rapid
cu opÆiunea Builder a meniului de comenzi rapide al controlului. Caseta de dialog conÆine
trei secÆiuni: Buttons pentru stabilirea butoanelor (numår, tip, etichete), Layout pentru
stabilirea aspectului controlului (modul în care vor fi afiçate butoanele - pe orizontalå sau
verticalå, dimensiunea spaÆiului care separå butoanele,
stilul bordurii) çi Value pentru stabilirea câmpului 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
colecÆie de valori numite articolele listei (item). Ele pot fi folosite pentru administrarea
sistemului sau pot fi folosite pentru introducerea datelor în câmpurile unei baze de date.
Pentru administrarea sistemului, puteÆi construi liste cu unitåÆile de disc din sistem, cu
directoarele çi cu fiçierele dintr-un director.
Aceste controale nu au proprietatea Caption. Din aceastå cauzå ele se pot folosi împre-
unå cu un control Label. Proprietatea Caption a etichetei ataçate poate fi folositå pentru
a afiça numele parametrului a cårui valoare va fi stabilitå de utilizator în urma selectårii
unui articol din listå.
Deosebirea dintre un grup de butoane radio çi o listå este aceea cå, în cazul butoanelor
de opÆiuni, colecÆia de articole din care se alege valoarea este fixå, iar în cazul listei
aceastå colecÆie este variabilå, controlul având încorporate metode suplimentare pentru
actualizarea colecÆiei (adåugarea çi înlåturarea unor articole din listå), pentru sortarea
articolelor din listå çi pentru localizarea unui articol din listå.
Lista ListBoxx afiçeazå colecÆia de valori din care utilizatorul poate så aleagå sub forma
unei liste de articole într-o casetå, afiçate pe verticalå, pe o singurå coloanå sau pe mai
multe coloane (liste multicoloanå). În cazul listei multicoloanå un articol din listå conÆine
mai multe coloane cu valori. Dacå numårul de articole din colecÆie depåçeçte capacitatea
de afiçare 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å permiÆând utilizatorului så aleagå dintr-o colecÆie de valori. Aceste valori sunt afiçate
în listå çi utilizatorul poate fie så aleagå un articol din listå, fie så scrie valoarea de la tas-
taturå î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 conÆine o listå derulantå çi o casetå de text çi 1 -
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 309

Drop-down List, adicå o listå derulantå, care conÆine numai o listå derulantå (se mai
numeçte çi listå ascunså).
Açadar, folosind aceste tipuri de controale puteÆi obÆine urmåtoarele tipuri de liste:
9 Lista simplå (List). Afiçeazå pe ecran mai multe articole (nu neapårat toate articole-
le). Se obÆine cu controlul ListBox .
9 Lista ascunså sau lista derulantå (Drop-down List). Afiçeazå pe ecran numai
articolul curent selectat din listå (ascunde restul articoleleor). Pentru a avea acces çi
la alte elemente, lista trebuie deschiså. În urma operaÆiei de deschidere, lista este
expandatå (se deruleazå conÆinutul), iar utilizatorul are acces la mai multe articole (nu
neapårat toate). Se obÆine cu controlul ComboBox având proprietatea Style=1.
9 Caseta derulantå combinatå (Drop-down List). Combinå o listå ascunså cu o case-
tå de text. Afiçeazå pe ecran numai elementul curent selectat din listå. Pentru a avea
acces çi la alte elemente lista trebuie deschiså. În urma operaÆiei de deschidere, lista
este expandatå (sunt afiçate mai multe articole, nu neapårat toate) çi se activeazå
caseta de text. Utilizatorul fie poate alege un articol din listå, fie scrie valoarea în
caseta de text. Se obÆine cu controlul ComboBox având proprietatea Style=0.
Identificarea articolelor din listå
Articolele listei pot fi precizate, înainte de executarea listei (liste statice), la fel ca çi în
cazul butoanelor radio, prin precizarea sursei de date în momentul proiectårii çi citirea
sursei de date a listei în momentul execuÆiei, dar pot fi stabilite çi în timpul execuÆiei (liste
dinamice), prin adåugarea çi înlåturarea unor articole din listå. În timpul execuÆiei,
articolele listei sunt påstrate în memoria internå sub forma unui tablou de memorie.
Dacå lista are o singurå coloanå, tabloul va fi de tip vector cu elemente de tip çir de
caractere, iar dacå are mai multe coloane, va fi de tip matrice. Fiecare element al
vectorului, respectiv fiecare rând al matricei reprezintå un articol din listå. Articolele listei
pot fi aranjate în ordine alfabeticå (sortate) sau nu.
Fiecårui articol din listå i se atribuie, la crearea listei sau la adåugarea lui la listå, douå
co-duri numerice pentru identificare:
9 Indexul (Index) Reprezintå poziÆia articolului în listå la un moment dat. OperaÆiile de
reordonare a listei, de çtergere sau de adåugare a unui articol au ca efect shimbarea
poziÆiei articolului în listå. În acest caz se modificå çi indexul articolelor, pentru a
reflecta noua situaÆie.
9 Codul de identificare (ItemID). Reprezintå un cod numeric unic asociat articolului
care nu se modificå pe toatå perioada existenÆei articolului în listå (nu se modificå la
schimbarea poziÆiei articolului în listå). De obicei, acest cod este indexul iniÆial al
articolului (atribuit articolului la adåugarea lui la listå). Numele proprietåÆilor care
folosesc acest cod pentru identificarea unui articol în listå conÆin cuvântul cheie ID.
Pentru conversia celor douå coduri numerice se pot folosi metodele:
ItemIDToIndex - furnizeazå codul asociat al unui articol specificat prin index.
IndexToItemID - furnizeazå indexul unui articol specificat prin codul asociat.
De exemplu, dacå într-o listå identificatå prin numele Lista articolul din poziÆia 5 are codul
20, apelarea metodei Lista.IndexToItemID(5) va furniza numårul 20, iar apelarea metodei
Lista.IndexToItemID(20) va furniza numårul 5.
310 Informatică

Selectarea articolelor din listå


A selecta un articol din listå, înseamnå a atribui proprietåÆii Value a obiectului de tip listå
valoarea articolului selctat. Dacå lista este de tip multicoloanå, proprietåÆii Value a listei i
se va atribui numai una dintre valoarile afiçate î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 apåsând tasta Enter). Dacå lista este ascunså, în prealabil ea trebuie deschiså
fie cu mouse-ul (se executå clic pe butonul cu sågeatå 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 când doriÆi så
executaÆi operaÆii cu un grup de articole din listå: så copiaÆi, så mutaÆi sau så çtergeÆi un
grup de articole dintr-o listå în alta (de exemplu så copiaÆi, så mutaÆi sau så çtergeÆi un
grup de fiçiere), så efectuaÆi calcule cu un grup de articole etc. Pentru a avea evidenÆa
articolelor selectate, lista are asociat un vector cu valori logice de aceeaçi lungime ca çi
vectorul listå. Fiecare element al vectorului descrie starea unui articol din listå: dacå are
valoarea adevårat, articolul este selectat, iar dacå are valoarea fals, nu este selectat.
Selectarea unui grup de articole din listå se face prin selectarea fiecårui articol fie cu
mouse-ul (se executå clic pe articol cu tasta Shift sau Ctrl apåsatå), fie cu tastatura (se
deplaseazå selectorul pe articol cu tastele ↓ çi ↑ çi se confirmå alegerea apåsând tasta
Shift sau Ctrl împreunå cu tasta Space). Tasta Shift se foloseçte atunci când grupul de
articole selectat formeazå un bloc continuu în listå, iar tasta Ctrl atunci când articolele
sunt dispersate în listå. Pentru anularea selectårii unui articol din grup se procedeazå la
fel ca çi la selectarea lui.
Dacå lista permite selectarea unui grup de articole, proprietåÆii 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
conÆine fiçiere care pot fi deschise, se va putea selecta un singur fiçier, iar dacå lista conÆi-
ne documente care pot fi copiate sau mutate, se vor putea selecta mai multe documente.
ProprietåÆile specifice listei sunt:
9 ProprietåÆile folosite pentru a controla culoarea de afiçare 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 prelucrării 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 execuÆiei 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 câmpurile unui tabel. Numele tabelului din baza de date
sau a tabelului liber (.dbf).
3 - SQL Statement De o instrucÆiune SQL Select de inte- InstrucÆiunea SQL
rogare a bazei de date, care va ge-
nera un tabel permanent sau tempo-
rar ce va conÆine articolele listei.
4 - Query De o interogare. Numele fiçierului de interogåri (.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 câmpurile unui tabel, enumerate Lista de nume de câmpuri ( separa-te
într-o listå. în listå prin virgulå). Numele câmpului
trebuie precedat de numele tabelului:
<nume_tabel>.<nume_câmp>
7 - Files un grup de fiçiere dintr-un director. Çablonul care descrie grupul de
fiçiere.
8 - Structure numele câmpurilor unui tabel. Numele tabelului.
9 Variabila de memorie sau câmpul în care se memoreazå valoarea elementului
selectat ControlSource . Dacå este de tip numeric, se va memora poziÆia 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 conÆinutul variabilei sau
câmpului specificat de proprietatea ControlSource.
9 Tabloul de memorie care conÆine articolele listei este caracterizat de proprietåÆile:
Numårul de articole din listå: ListCount - este de tip numeric.
Tabloul de memorie (de tip vector sau matrice, în funcÆie de numårul de coloane ale
listei) se påstreazå în proprietåÆile: List - articolele se påstreazå în ordinea poziÆiei
lor curente (ordinea în care sunt afiçate în listå) çi ListItem - articolele se påstreazå
în ordinea datå de codurile de identificare. Ambele proprietåÆi sunt de tip tablou de
memorie. De exemplu, în lista cu numele Lista, Lista.List(5) identificå al cincilea arti-
col din listå, iar Lista.ListItem(5) identificå articolul din listå care are codul de identi-
ficare 5. Dacå lista conÆine mai multe coloane, trebuie precizat çi numårul 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 pânå la ultimul (ListCount).
312 Informatică

Identificatorul articolului selectat este furnizat de proprietåÆile: ListIndex - care


se foloseçte împreunå cu proprietatea List (dacå are valoarea 0, nu este selectat un
articol, iar dacå are o valoare cuprinså între 1 çi ListCount reprezintå poziÆia curentå
a articolului selectat) çi ListItemID - care se foloseçte î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 indecçi asociat listei poate fi folosit de programator pentru a atribui
intern coduri speciale articolelor listei. Fiecare element al vectorului conÆine un cod
special asociat unui articol din listå, diferit de codul de identificare. Dimensiunea vec-
torului este egalå cu numårul de elemente, respectiv cu numårul de rânduri ale tablo-
ului asociat listei. Vectorul este furnizat de proprietåÆile: ItemData - vector în care
identificarea articolului se face prin poziÆia în listå çi ItemIDData - vector în care
identificarea articolului se face prin codul de identificare. De exemplu, în listaLista se
obÆine codul special asociat articolului focalizat cu Lista.ItemData(Lista.ListIndex).
Codul special asociat poate fi folosit pentru a identifica un articol din listå: poziÆia î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 urmåtoarele proprietåÆi:
Autosortarea: Sorted - este de tip logic çi controleazå modul în care sunt afiçate
articolele din listå. Dacå are valoarea .T., articolele din listå sunt automat ordonate
alfabetic, Æinându-se cont de diferenÆa dintre literele mari çi mici. Dacå are valoarea .F.
(implicit), articolele din listå sunt afiçate în ordinea naturalå, ordinea în care au fost
adåugate la creare sau în care au fost preluate dintr-o surså de date. Proprietatea este
disponibilå numai pentru valorile 0 çi 1 ale proprietåÆii RowSourceType.
Ordonarea manualå: MoveBars - este de tip logic çi controleazå dacå articolele pot
fi aranjate manual în listå. Dacå are valoarea .T., este afiçatå bara de mutare care
permite executarea interactivå a operaÆiei de mutare a articolelor în listå. Dacå are
valoarea .F. (implicit), bara nu este afiçatå. Pentru a muta un articol în listå se poate
folosi fie tastatura (se selecteazå articolul çi apoi cu tastat Ctrl apåsatå se deplaseazå
articolul în noua poziÆie cu tastele ↓ çi ↑), fie mouse-ul (pe bara de mutare se gliseazå
butonul din dreptul articolului pe care vreÆi så-l mutaÆi în noua poziÆie). Proprietatea este
specificå numai controlului ListBox.
9 Cåutarea asistatå: IncrementalSearch - este de tip logic çi controleazå dacå se
poate folosi metoda de cåutare asistatå pentru gåsirea unui articol în listå. Dacå are
valoarea .T., se foloseçte cåutarea asistatå, iar dacå are valoarea .F., nu este activatå
aceastå facilitate. Cåutarea asistatå înseamnå cå atunci când este apåsatå o tastå,
sistemul interpreteazå aceastå tastå ca fiind primul caracter al textului afiçat de articolul
cåutat çi deruleazå lista astfel încât så fie afiçat în listå primul articol care îndeplineçte
aceastå condiÆie. Dacå se mai apaså o tastå, aceasta este interpretatå ca fiind al doilea
caracter al textului afiçat de articolul cåutat çi deruleazå lista astfel încât så fie afiçat în listå
primul articol care afiçeazå un text care începe cu cele douå caractere ç.a.m.d. Este util så
activaÆi aceastå facilitate dacå lista are dimensiuni mari.
9 Primul articol vizibil din listå: TopIndex - furnizeazå poziÆia curentå a primului
articol afiçat în partea vizibilå a listei çi TopItemID - furnizeazå codul de identificare a
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 313

primului articol afiçat în partea vizibilå a listei. Aceste proprietåÆi se pot folosi pentru a afla
dacå un articol se gåseçte în zona vizibilå a listei sau pentru a schimba articolele afiçate în
partea vizibilå a listei.
9 Ultimul articol adåugat la listå: NewIndex - furnizeazå poziÆia curentå a ultimului
articol adåugat la listå çi NewItemID - furnizeazå codul de identificare a ultimului articol
adåugat la listå.
9 ProprietåÆi specifice listelor care au ca surså de date tablouri de memorie prin care
se controleazå intervalul de elemente din tablou care sunt preluate în listå (valabil nu-
mai pentru RowSourceType=5). ProprietåÆile sunt de tip numeric çi determinå interva-
lul de elemente, respectiv de rânduri care vor fi folosite ca surså de date, altfel vor fi
folosite toate elementele, respectiv toate rândurile din tabloul.
Primul element: FirstElement - primul element, respectiv primul rând al intervalului.
Implicit are valoarea 1 (primul element, respectiv primul rând al tabloului).
Numårul de elemente: NumberOfElements - numårul de elemente, respectiv de
rânduri preluate din sursa de date începând cu primul element al intervalului. Implicit
are valoarea corespunzåtoare numårului de elemente, respectiv de rânduri ale tablo-
ului.
9 ProprietåÆi specifice selectårii multiple:
Selectarea multiplå: MultipleSelect - este de tip numeric çi controleazå dacå
este permiså (valoarea 1) sau nu (valoarea 0 - implicit) selectarea mai multor arti-
cole în listå.
EvidenÆa articolelor selectate este furnizatå de proprietåÆile Selected çi
SelectedID . Ambele proprietåÆi sunt de tip vector cu elemente de tip logic çi conÆin
atâtea elemente câte articole sunt în listå. Fiecare element din vector reprezintå starea
unui articol: dacå are valoarea .T., articolul este selectat, iar dacå are valoarea .F., arti-
colul nu este selectat. Cei doi vectori se deosebesc dupå modul în care se face identifi-
carea articolelor: dupå poziÆia curentå, respectiv dupå codul de identificare. De
exemplu, dacå vreÆi så aflaÆi dacå în lista Lista a fost selectat al treilea articol din listå,
aflaÆi valoarea proprietåÆii Lista.Selected(3), iar dacå vreÆi så aflaÆi dacå articolul cu
codul de identificare 10 a fost selectat, aflaÆi valoarea proprietåÆii Lista.SelectedID(10).
Aceste proprietåÆi pot fi folosite pentru a selecta un articol sau pentru a anula
selectarea unui articol din program. De exemplu, dacå vreÆi så selectaÆi al treilea articol
în lista Lista, atribuiÆi valoarea corespunzåtoare proprietåÆii: Lista.Selected(3)=.T., iar
dacå vreÆi så anulaÆi selectarea pentru articolul cu codul de identificare 10, atribuiÆi
valoarea corespunzåtoare proprietåÆii: Lista.SelectedID(10)=.F..
9 ProprietåÆi specifice listelor cu mai multe coloane:
Numårul de coloane: ColumnCount - este de tip numeric; dacå are valoarea 0,
nu se afiçeazå coloane.
LåÆimea coloanelor: ColumnWidth - este de o listå de numere, separate prin
virgulå; fiecare numår reprezintå låÆimea unei coloane. De exemplu, în lista Lista
Lista.ColumnCount=3 çi Lista.ColumnWidth='5,7,9'
Afiçarea liniilor separatoare între coloane: ColumnLines - este de tip logic
(dacå are valoarea .T. - implicit - între coloane vor fi afiçate linii separatoare, altfel
liniile de separare sunt invizibile).
314 Informatică

Coloana preluatå de proprietatea Value a controlului: BoundColumn - este de


tip numeric çi reprezintå numårul coloanei al cårui 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 când în proprietatea Value este
preluat textul articolului dintr-o altå coloanå.
Metodele specifice listei sunt:
9 Adåugarea unui articol la listå: AddItem çi AddItemList . Metodelor trebuie så li se
comunice textul afiçat de articol (<text>), poziÆia în care va fi adåugat (<n>) pentru
AddItem, respectiv codul de identificare atribuit pentru AddItemList çi numårul coloanei
(<n>) în cazul unor liste cu coloane: AddItem('<text>'[,<n>[,<c>]])). Dacå poziÆia precizatå
este validå, articolul va fi inserat în poziÆia precizatå. Dacå nu este precizatå poziÆia,
articolul va fi inserat în poziÆia corespunzåtoare dacå lista este sortatå, iar dacå nu este
sortatå, va fi adåugat la sfârçitul 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 cåror surså de date nu este precizatå (RowSourceType=0).
9 Înlåturarea unui articol din listå: RemoveItem çi RemoveItemList . Metodelor
trebuie så li se comunice indexul articolului înlåturat , respectiv codul de identificare al
articolului. De exemplu, apelul metodei RemoveItem(5) înlåturå din listå articolul din
poziÆia a cincea.
9 Çtergerea conÆinutului unei liste: Clear .
9 Reîmprospåtarea 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.

CreaÆi o listå ascunså folosind valorile ca surså de date


În exemplul de formular creat la lecÆia despre butoane radio, veÆi înlocui controlul folosit
pentru alegerea formei afiçate 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 realizaÆi este foarte
asemånåtor cu cel prezentat la acea lecÆie, îl veÆi salva pe acela
sub un alt nume, veÆi çterge obiectul grup de butoane radio çi în
locul lui veÆi crea un control de tip listå folosind instrumentul
ComboBox de pe bara Form Controls.
„ StabiliÆi proprietåÆile listei:
Name = "Combo1"
RowSourceType = 1
RowSource = "Cerc ,Elipsa ,Patrat "
Style = 2
„ ScrieÆi procedurile asociate elementului Init al formularului çi evenimentului Click al
listei (påstraÆi procedura asociatå evenimentului Click al butonului de comandå):
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării 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
„ SalvaÆi formularul, îl lansaÆi în execuÆie çi-l testaÆi.

CreaÆi o listå ascunså folosind ca surså de date tabloul de memorie


În exemplul de formular creat la lecÆia despre comutator, veÆi înlocui controlul comutator
folosit pentru a controla afiçarea påtratului cu o listå ascunså din care veÆi alege culoarea
de umplere a påtratului (obiectul ComboBox cu stilul 2). Lista va conÆine 8 culori çi sursa
de date (numele celor 8 culori) va fi precizatå printr-un vector.
„ SalvaÆi formularul realizat anterior sub un alt nume, çtergeÆi obiectul comutator çi în
locul lui creaÆi un control de tip listå folosind instrumentul ComboBox de pe bara
Form Controls. VeÆi mai adåuga çi un control de tip etichetå pentru legenda listei.
„ StabiliÆi proprietåÆile 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
„ ScrieÆi procedurile asociate evenimentelor Load çi Init ale formularului în care
declaraÆi çi creaÆi 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 adåuga o metodå pentru calculul codului de
culoare corespunzåtor culorii din listå. Metoda se numeçte
Culoarea çi foloseçte o matrice b cu 8 linii çi 3 coloane pentru a
calcula ponderea celor trei culori de bazå: coloana 1 - ponderea
pentru roçu, coloana 2 - ponderea pentru verde çi coloana 3 -
ponderea pentru albastru care corespund parametrilor funcÆiei Rgb(). De exemplu,
culoarea galben este determinatå de valorile din cea de a patra linie a matricei çi,
deoarece codul ei este dat de funcÆia Rgb(255,255,0), conform tabelului prezentat
anterior, elementele de pe linia a patra vor avea valoarea: b(4,1)=1, b(4,2)=1 çi
b(4,3)=0. Pentru constru-irea acestei metode folosiÆi opÆiunea de meniu New
Method... ∈ Form. În caseta de dialog scrieÆi numele metodei Culoarea. Numele
metodei va fi adåugat la lista de metode a formularului. AlegeÆi din lista afiçatå în
secÆiunea Method a ferestrei de proprietåÆi a formularului opÆiunea Culoarea. Se va
deschide fereastra pentru cod. ScrieÆi procedura asociatå metodei:
procedure culoarea && Formular b(i,j)=k%2
parameters n k=int(k/2)
dimension b(8,3) enddo
store 0 to b endfor
for i=1 to 8 cod=rgb(b(n,1)*255,b(n,2)*255,;
k=i-1 b(n,3)*255)
j=0 return cod
do while k <>0 endproc
j=j+1
„ ScrieÆi procedura asociatå evenimentului Click al listei:
procedure Click && Lista
ThisForm.Shape1.BackColor =;
ThisForm.Culoarea(ThisForm.Combo1.ListIndex)
endproc

CreaÆi o listå cu mai multe coloane


Lista va avea douå coloane corespunzåtoare câmpurilor nume çi prenume din tabelul
agenda. La alegerea unui articol din listå, în formular se va afiça numårul de telefon (se
alege ca obiect eticheta) çi a-dresa persoanei (se alege ca obiect zona de editare). CreaÆi
un fiçier index (dupå câmpurile nume çi prenume pentru tabelul agenda.
„ CreaÆi un formular nou. AdåugaÆi în formular patru etichete, o zonå de edita-re, un
buton declançator çi o listå (butonul ListBox de pe bara Form Controls).
„ StabiliÆi proprietåÆile formularului çi ale obiectelor din formular:
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 317

* formularul BackStyle = 0
Name = "Form1" * zona de editare
BackColor = 200,200,200 Name = "Edit1"
Caption = "Test" BackStyle = 0
Closable = .F. Enabled = .T.
FontSize = 14 ReadOnly = .T.
* eticheta folosita pentru * buton de comanda
* legenda listei Name = "Command1"
Name = "Label1" Cancel = .T.
Caption = "Alegeti:" Caption = "\<Terminare"
* etichete folosite pentru * Lista
* informare Name = "List1"
Name = "Label2" BoundColumn = 2
Caption = "Telefon" ColumnCount = 2
Name = "Label4" ColumnWidths = "70,70"
Caption = "Adresa" RowSourceType = 2
* eticheta folosita pentru afi- RowSource = "agenda"
* sarea numarului de telefon ColumnLines = .F.
Name = "Label3" Height = 97
Caption = "" Left = 24
* pentru toate etichetele: Top = 60
AutoSize = .T. Width = 170

„ ScrieÆi procedurile asociate evenimentelor Load, Init çi Unload ale formularului în care
deschideÆi çi închideÆi tabelul, evnimentului Click al butonului de comandå çi
procedura Click a listei:
procedure Load && Formular
use agenda index agenda
endproc
procedure Init && Formular
goto top
ThisForm.List1.ListIndex = 1
locate for agenda.nume=ThisForm.List1.DisplayValue and;
agenda.prenume=ThisForm.List1.Value
ThisForm.Label3.Caption=agenda.telefon
ThisForm.Edit1.Value=agenda.adresa
endproc
318 Informatică

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
„ SalvaÆi formularul, îl lansaÆi în execuÆie çi-l testaÆi.

CreaÆi o listå dinamicå cu selecÆie multiplå


CreaÆi un formular care con-
Æine douå liste. Într-o listå vor
fi afiçate fiçierele de tip pro-
gram din directorul curent
(*.prg). Din aceastå listå veÆi
selecta un grup de fiçiere
care vor fi adåugate la cea
de a doua listå. Cea de a
doua listå este o listå dinami-
cå (se creeazå dinamic în
timpul execuÆiei formularu-
lui). Pentru lucrul cu cele
douå liste vor fi folosite douå
butoane: unul pentru adåugare la cea de a doua listå a fiçierelor selectate în prima listå çi
unul pentru anularea selectårii unor fiçiere din a doua listå. Ambele liste permit selecÆie
multiplå. Dupå ce aÆi selectat grupul de fiçiere, acÆionaÆi cel de al treilea buton, butonul de
terminare care va declança operaÆia de copiere a fiçierelor în directorul Test din rådåcina
discului C.
„ CreaÆi directorul Test.
„ CreaÆi un formular nou. AdåugaÆi în formular douå liste, douå etichete (pentru
legenda celor douå liste) çi trei butoane de comandå. Prima listå va avea ca surså
de date fiçierele de tip *.prg. A doua listå nu va avea surså de date.
„ StabiliÆi prorpietåÆile pentru formular çi obiectele din formular:
* Formularul Name = "Label1"
Name = "Form1" Caption = "Fisiere pentru ;
Caption = "Test" selectare"
Closable = .F. Name = "Label2"
FontSize = 14 Caption = "Fisiere selectate"
WindowType = 1 * Toate tichetele:
BackColor AutoSize = .T.
* Etichetele BackStyle = 0
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării 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 = ""
„ ScrieÆi 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
„ SalvaÆi formularul, îl lansaÆi în execuÆie çi-l testaÆi.

T est pentru evaluare:


1. CreaÆi un tabel cu evidenÆa elevilor din claså. Tabelul are structura: nume (C,15) çi
prenume (C,15). CompletaÆi cu date tabelul. ModificaÆi structura tabelului çi adåugaÆi
câmpul echipa (C,10) care reprezintå echipa din care face parte elevul, presupunând
cå el face parte dintr-o singurå echipå: baschet, handbal, volei sau nici o echipå.
ConstruiÆi un formular prin care så actualizaÆi tabelul. Formularul va conÆine o listå cu
douå coloane (nume çi prenume) din care alegeÆi elevul, un grup de butoane radio
pentru a alege echipa çi un buton de comandå pentru terminare.
320 Informatică

2. CreaÆi un tabel pentru reÆeta unui preparat gastronomic cu urmåtoarea structurå:


ingredient, unitate de måsurå, cantitate. CreaÆi un tabel cu un singur câmp în care
memoraÆi ingredintele care pot fi folosite pentru prepararea lui. CreaÆi un formular
pentru introducerea datelor în tabel, care va conÆine o listå pentru selectarea ingre-
dientelor, un grup de butoane radio pentru alegerea unitåÆii de måsurå, o casetå de
text pentru comunicarea cantitåÆii çi un buton pentru terminare.
3. Din tabelul cu elevii clasei înscriçi la diferite echipe, creaÆi un formular prin care så
extrageÆi numai elevii care fac parte din echipa de baschet. Formularul va conÆine 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å.

# ÎncercaÆi:
Adevårat/Fals:
1. Cu metoda SetAll puteÆi selecta toate articolele dintr-o listå.
2. Identificarea unui articol selectat în listå se face cu proprietatea ListIndex.
3. Proprietatea Value a unui comutator memoreazå starea comutatorului.
4. Proprietatea Value a unui comutator poate fi de tip numeric.
5. Grupul de butoane radio are proprietatea AutoSize.
CompletaÆi:
1. Pentru a atribui aceeaçi valoare unei proprietåÆi pentru toate butoanele dintr-un grup
de butoane radio folosiÆi metoda ...............
2. CreaÆi o listå ascunså cu controlul ............... cu valorea .... a proprietåÆii Style.
3. Reîmprospåtarea listei se face cu metoda ........................
4. IncrementalSearch este o proprietate specificå unui control de tip ..............
5. Numårul de articole din listå se påstreazå în proprietatea ....................
AlegeÆi råspunsurile corecte:
1. Tabloul de memorie în care se påstreazå articolele listei în ordinea poziÆiei lor curente
se memoreazå în proprietatea:
a) List b) ListItem c) ListIndex
2. FirstElement este o proprietate a listei care foloseçte ca surså de date:
a) lista cu nume de câmpuri b) tabloul de memorie c) lista de valori
3. Articolele selectate dintr-o listå cu selecÆie multiplå se påstreazå într-un vector în
proprietatea:
a) MultipleSelect b) Selected c) ListItemID

R åspunsuri:
Adevårat/Fals: 1-F; 2-A; 3-A; 4-A; 5-A.
CompletaÆi: 1-SetAll; 2-ComboBox,1; 3-Requery; 4-listå; 5- ListCount; 6- Column; 7-Header; 8-
Bound.
AlegeÆi råspunsurile corecte: 1-a; 2-b; 3- b.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 321

3.4.5. Alte controale çi obiecte


Bara cu instrumente ToolBarx
Bara cu instrumente este un obiect de interfaÆå care pune la dispoziÆia utilizatorului un cadru
care conÆine un grup de butoane cu ajutorul cårora poate så cearå executarea unor acÆiuni.
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 aplicaÆiei (de exemplu deschiderea, salvarea
çi închiderea unui tabel). Bara cu instrumente are avantajul cå pune la dispoziÆia utilizatorului
reprezentåri grafice ale comenzilor care sunt mai uçor de memorat decât combinaÆiile de
taste folosite pentru scurtåturi. Butoanele de pe bara cu instrumente pot avea proprietatea
informaÆii despre instrument (ToolTips) care afiçeazå o micå etichetå cu numele butonului
atunci când utilizatorul îl indicå cu cursorul de mouse.
Bara de instrumente este construitå ca un formular container ce conÆine mai multe con-
troale care are urmåtoarele caracteristici specifice:
9 Este afiçatå întotdeauna deasupra formularelor de tip fereastrå.
9 Dacå este mutatå, poate fi ancoratå (dock) la marginile ferestrei de aplicaÆie.
9 Când nu este ancoratå, afiçeazå o barå de titlu (cu înålÆimea jumåtate din înålÆimea
obiçnuitå a unei bare de titlu) çi butonul de închidere.
9 Când se modificå dimensiunea cadrului, controalele din interior sunt rearanjate astfel
încât så încapå în cadru.
9 Poate fi mutatå oriunde în freastrå sau pe ecran prin operaÆia 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 când sunt selectate.
Când 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 încât så afiçeze un singur rând de butoane.
9 Fereastra în care este creatå bara este redimensionatå astfel încât bara så nu ascundå
informaÆii din fereastrå.
Pe lângå proprietåÆile specifice unui formular (Caption, Movable, Sizable etc.) sau spe-
cifice unui obiect container (Controls - vectorul cu referinÆele controalelor çi
ControlCount - numårul de controale), obiectul ToolBox are urmåtoarele proprietåÆi
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.
9 PoziÆia ancorårii: DockPosition este de tip numeric 1 (Left) Marginea din stânga.
çi aratå poziÆia ancorårii (marginea ferestrei de care a 2 (Right) Marginea din dreapta.
fost ancoratå). 3 (Bottom) Marginea de jos.
9 ActiveControl: ActiveControl este o referinÆå cåtre
controlul activ al unui obiect. Pentru a avea acces la proprietåÆile sale se foloseçte con-
strucÆia: <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 când se adaugå obiecte noi.
Pe lângå metodele specifice unui formular (Refresh, Show, Move, Hide etc.), obiectul
ToolBox are urmåtoarele metode specifice :
9 Ancorarea barei: Dock ancoreazå bara la una dintre marginile ferestrei. Apelul metodei
se face prin Dock([<poziÆie>[,<x>,<y>]]), unde parametrul reprezintå marginea ferestrei de
care va fi ancoratå çi poate lua aceleaçi valori ca çi proprietatea DockPosition, iar <x> çi
<y> reprezintå coordonatele poziÆiei barei ancorate.
9 Transformarea barei fixe în barå mobilå cu metoda Move . Dacå apelaÆi aceastå
metodå atunci când bara este ancoratå, ea va deveni mobilå.
Pe lângå evenimentele specifice unui formular, obiectul ToolBox råspunde la urmåtoa-
rele evenimente specifice :
9 Dupå ancorarea barei: AfterDock este declançat dupå ce a fost ancoratå bara.
9 Înainte de ancorarea barei: BeforeDock este declançat fie interactiv, prin glisarea
barei de cåtre utilizator pentru a fi ancoratå, fie din program prin apelarea metodei Dock.
Procedura asociatå acestui eveniment primeçte parametrul nLocation care reprezintå
poziÆia în care va fi ancoratå bara (aceleaçi valori ca çi proprietatea DockPosition).
Înainte ca bara så fie redesenatå în poziÆia de ancorare, în procedura asociatå acestui
eveniment se pot scrie instrucÆiuni prin care så fie modificat aspectul barei (de exemplu,
så se înlocuiascå un control cu un alt control).
9 Anularea ancorårii barei: Undock este declançat fie interactiv, prin glisarea barei
de cåtre utilizator din poziÆia în care a fost ancoratå, fie din program prin apelarea
metodei Move.

CreaÆi o barå de instrumente pe ecran Butoanele din barå au efect de comutator.


Bara cu instrumente va conÆine trei controale Atunci când sunt activate, determinå scrierea
pentru stabilirea stilului în care va fi scris pe ecran cu caractere cu stilul respectiv.
Atunci când un buton este activat, textul
textul pe ecran: îngroçat (butonul Italic),
legendei sale este scris cu acel stil.
înclinat çi subliniat (butonul Underline).
Aceste butoane au efect de comutator. Exe-
cutând clic pe ele, proprietatea care cores-
punde stilului este negatå (este o proprietate
logicå). De exemplu, dacå se executå clic pe
butonul Bold se va executa instrucÆiunea
screen.fontbold=!_screen.fontbol,
adicå proprietåÆii FontBold a ecranului i
se va atribui valoarea inverså (este folosit
opera-torul pentru negare !).
Toate Toate
„ ScrieÆi în fiçierul test_bara1 programul comutatoarele comutatoarele
surså: sunt activate sunt dezactivate
public ecran
ecran=createobj('bara')
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării 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
„ LansaÆi în execuÆie programul cu comanda do test_bara1.
„ TestaÆi bara de instrumente. ActivaÆi unul dintre stiluri sau mai multe stiluri. AfiçaÆi pe
ecran un text de fiecare datå (de exemplu, comanda ? 'AAAA'). UrmåriÆi efectul obÆinut.
„ DeplasaÆi bara cu instrumente în interiorul ferestrei Visual FoxPro. AncoraÆi bara în
diferite poziÆii.
„ ÎnchideÆi bara executând clic pe butonul de închidere.
324 Informatică

CreaÆi o barå de instrumente care acÆioneazå asupra unui formular


Bara cu instrumente va conÆine aceleaçi trei controale pentru stabilirea stilului în care va fi
scris textul pe ecran: îngroçat (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. Atât butoanele din bara cu
instrumente, cât çi butoanele din formular vor afiça informaÆii despre instrument
(ToolTips).
„ ScrieÆi în fiçierul 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 prelucrării 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
„ LansaÆi în execuÆie programul cu comanda do test_bara2.
„ TestaÆi bara de instrumente. ActivaÆi unul dintre stiluri sau mai multe stiluri çi exe-
cutaÆi clic pe butonul Test din fereastrå. ObservaÆi informaÆiile afiçate pentru fiecare
instrument selectat.
„ ÎnchideÆi setul de formulare executând clic pe butonul Terminare.
326 Informatică

ModificaÆi formularul creat anterior


AdåugaÆi fomularului creat anterior un buton care så controleze afiçarea barei cu
instrumente:
„ SalvaÆi fiçierul cu programul surså test_bara2 sub numele test_bara3. DeschideÆi
acest fiçier çi faceÆi urmåtoarele modificåri.
„ AdåugaÆi în program, înainte de definirea claselor, instrucÆiunile:
set.f1.addobject("bt3","buton3")
set.f1.bt3.visible=.t.
„ În secÆiunea Define class buton1 modificaÆi:
left=25 width=75
„ În secÆiunea Define class buton2 înlocuiÆi buton 2 cu çi buton 3 modificaÆi:
left=300 width=75
„ AdåugaÆi secÆiunea 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
„ LansaÆi în execuÆie programul cu comanda do test_bara3.

CreaÆi 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 fåcut un mic artificiu: se
construieçte un formular vid care se transformå apoi într-o barå cu instrumente.
„ DeschideÆi fereastra constructorului de formulare cu comanda create form bara.
SalvaÆi çi închideÆi fereastra constructorului.
„ DeschideÆi tabelul asociat formularului cu comanda use bara.scx. AfiçaÆi conÆinutul
tabelului cu comnada browse.

„ În rândul 2 al tabelului sunt înregistrate caracteristicile obiectului DataEnvironment


asociat formularului, iar în rândul 3 caracteristicile formularului Form1. În rândul 3 al
tabelului veÆi face urmåtoarele modificåri în câmpurile memo:
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 327

9 În câmpurile Class çi BaseClass çtergeÆi Form çi scrieÆi ToolBar.


9 În câmpul Objname çtergeÆi Form1 çi scrieÆi Bara.
9 În câmpul Properties çtergeÆi tot conÆinutul.
„ ÎnchideÆi fereastra de editare çi apoi çi fiçierul cu comanda use.
„ DeschideÆi formularul cu comanda Modify Form bara.
„ În fereastra constructorului de formulare Form Design este afiçat obiectul ToolBar.
AdåugaÆi acestui obiect trei comutatoare. Spre deosebire de formular, într-o barå cu
instrumente, poziÆiile obiectelor sunt stabilite automat. Ele vor fi plasate unele lângå
altele. Nu puteÆi stabili decât ordinea în care apar butoanele în barå, nu çi poziÆia exactå
a fiecårui buton. Pentru a adåuga un control, procedaÆi astfel: executaÆi clic pe obiectul
corespunzåtor de pe bara cu obiecte de interfaÆå pentru
a-l selecta (în exemplu, pe obiectul Command Button) çi
apoi în bara pe care o construiÆi executaÆi clic în poziÆia în
care vreÆi så fie inserat obiectul. Între butoane inseraÆi
separatori (obiectul Separator de pe bara cu obiecte).
„ StabiliÆi pentru aceste controale valorile pentru restul pro-prietåÆilor. ScrieÆi procedurile
corespunzåtoare evenimentelor. SalvaÆi modificårile fåcute în formular. ÎnchideÆi
constructorul de formulare.
„ DeschideÆi din nou tabelul asociat formularului. ObservaÆi modificårile care au fost
fåcute. ÎnchideÆi fereastra de editare çi tabelul.
„ LansaÆi în execuÆie formularul cu comanda do form bara.
„ ReluaÆi toate aceste operaÆii çi creaÆi vizual formularul çi o barå de instrumente ca cele
din cel de al doilea exemplu.
„ ReluaÆi toate aceste operaÆii çi creaÆi vizual formu-
larul ç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 puteÆi introduce într-un formular obiecte create cu alte
aplicaÆii (documente, foi de calcul imagini). AplicaÆiile cu care sunt create obiectele se
numesc aplicaÆii server (de exemplu, o aplicaÆie Microsoft: Word, Excel, Paint etc.).
Pentru adåugarea obiectelor OLE într-un formular, aplicaÆia Visual FoxPro vå pune la
dispoziÆie douå obiecte vizuale:
9 obiecte OLE de tip container - OLEContainerx.
9 obiecte OLE asociate câmpurilor de tip General din tabel - OLEBoundControlx
care permit afiçarea çi editarea unui obiect în acest tip de câmp.
Recomandare: Dacå doriÆi så editaÆi un câmp de tip General într-un formular, folosiÆi un
obiect de tip OLEBoundControl. Dacå doriÆi så vizualizaÆi çi eventual så editaÆi într-un for-
mular un obiect care nu este memorat într-un câmp, folosiÆi un obiect de tip OLEContainer.
328 Inormatică

Containerul OLE permite afiçarea çi editarea obiectelor OLE într-o aplicaÆie Visual
FoxPro. Obiectul vizual OLEContainer din Visual FoxPro este un container pentru obiec-
tul creat cu o altå aplicaÆie. Aceste obiecte pot fi:
9 Controale OLE (fiçiere .ocx). Au propriul lor set de proprietåÆi, metode çi evenimente.
9 Obiecte OLE inserabile. Nu au propriul lor set de proprietåÆi, metode çi evenimente
(nu pot råspunde la evenimente).
Containerul OLE care nu are proprietåÆile ControlSource çi Value. În scimb, obiectul vizual
OLEBoundControl are aceste proprietåÆi. Proprietatea ControlSource memoreazå nume-
le câmpului în care se påstreazå obiectul.
ProprietåÆile specifice obiectelor vizuale Valoare Efect Autoactivate
OLE Container çi OLEBoundControl sunt: 0 Activat din program cu
9 Autoactivarea: Autoactivate este de tip (Manual) metoda DoVerb.
numeric çi determinå modul în care poate fi 1 Activat atunci când obiectul
activat obiectul. A activa obiectul înseamnå a (GotFocust) primeçte focalizarea.
2 Activat atunci când se exe-
activa aplicaÆia server care l-a creat. Dacå are
(DoubleClick) cutå dublu clic pe obiect sau
valoarea 2 (valoarea implicitå), nu mai puteÆi
când obiectul este foca-lizat
folosi evenimentul DoubleClick. çi se apaså tasta Enter.
9 Tipul de obiect permis OLETypeAlowed . 3 (Automatic) Activat de evenimentul impli-
Este de tip numeric çi controleazå tipul de cit de activare al obiectului
obiect care poate fi adåugat la cotainer. (de exemplu focalizarea
9 Modul în care se executå redimensionarea formularului).
Stretch . Este de tip numeric çi controleazå modul în care este redimensionat obiectul
pentru a încåpea în zona alocatå lui în cadrul formularului. Valoarea implicitå este 0.
Valoare Efect OLETypeAlowed Valoare Efect Stretch
0 Linked - legat. 0 Clip - Este secÆionat ca så încapå.
1 Embedded - încapsulat. 1 Isometric - Este redimensionat ca
-1 OLE Bound - nu conÆine un så încapå, cu påstrarea proporÆiilor.
obiect OLE. 2 Stretch - Este redimensionat ca så
-2 OLE control - control OLE (.ocx) încapå, fårå påstrarea proporÆiilor.
9 Accesul la obiect Object . Verb Efectul metodei DoVerb
Este o referinÆå cåtre un obiect 0 Este acÆiunea implicitå a obiectului.
OLE care permite accesul la -1 Obiectul va fi activat pentru editare împreunå cu
proprietåÆile çi metodele sale. containerul OLE.
ProprietåÆile çi metodele spe- -2 Deschide fereastra aplicaÆiei server în care se
cifice unui anumit obiect OLE le încarcå obiectul pentru editare.
puteÆi afla din documentaÆia -3 Ascunde aplicaÆia care a creat obiectul (pentru
aplicaÆiei server. De exemplu, obiectele încapsulate).
-4 Obiectul este activat în container pentru editare çi
dacå obiectul OLE este o foaie
sunt afiçate instrumentele specifice aplicaÆiei server.
de calcul (un obiect Excel), in-
-5 La focalizarea obiectului se creeazå o fereastrå
formaÆiile despre proprietåÆile çi pentru editarea obiectului.
metodele lui le puteÆi afla din -6 Obiectul este activat pentru editare dar sunt igno-
documentaÆia aplicaÆiei Microsoft rate toate modificårile pe care aplicaÆia server le
Excel. FolosiÆi aceastå proprie- poate anula.
tate astfel: pentru modificarea
valorii unei proprietåÆi:
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 329

<nume_obiect>.Object.<nume_proprietate>=<valoare>
iar pentru apelarea unei metode:
<nume_obiect>.Object.<nume_metodå>[(<listå-parametri>)]
9 AplicaÆia server cu care a fost creat obiectul: OLEClass (numele aplicaÆiei).
9 Identificatorul fiçierului care conÆine obiectul (unitatea de disc, calea de director, nu-
mele çi extensia): DocumentFile .
9 Redimensionarea zonei alocate obiectului OLE: Sizable . Are aceeaçi semnificaÆie ca
çi la obiectul ToolBar. Dacå are valoarea .T. se poate folosi pro-prietatea AutoSize
pentru a se redimensiona automat zona alo-catå obiectului.
Metoda specificå unui obiect OLE este DoVerb çi are ca efect activarea obiectului çi
stabilirea ope-raÆiilor care se pot executa cu obiectul respectiv. Obiectul poate fi activat prin
acÆionarea standard a obiectului sau prin alte acÆiuni (verbe). Metoda poate fi apelatå prin:
DoVerb[(<verb>)]

InseraÆi un obiect OLE într-un formular


VeÆi insera o foaie de calcul creatå cu aplicaÆia Excel.
„ CreaÆi un dosar Test în rådåcina discului C. CreaÆi în acest dosar o foaie de calcul cu
aplicaÆia Excel pentru cheltuielile casnice din primul trimestru al anului. AtribuiÆi
formule de calcul (sum) pentru celulele care memoreazå totalul pe tip de cheltuialå
(pe orizontalå) çi totalul chltuielilor pe lunå (pe verticalå). RealizaÆi o diagramå cu re-
partiÆia cheltuielilor în luna ianuarie.
„ ScrieÆi în fiçierul 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
„ LansaÆi în execuÆie programul cu comanda do obiect1.

„ Obiectul a fost deschis pentru editare. ModificaÆi valoarea câmpurilor. ObservaÆi cå


valorile din câmpurile pentru care s-a aplicat formula de calcul pentru sumå (sum)
sunt modificate automat pentru a reflecta corect sitiuaÆia din foaia de calcul. Dacå aÆi
fåcut modificårile în coloana corespunzåtoare lunii ianuarie, observaÆi cå s-a modificat
automat çi diagrama. ÎnchideÆi formularul.
„ LansaÆi în execuÆie programul cu comanda do test_bara1.

CreaÆi vizual obiectul inserat în formular


CreaÆi formularul din exemplul anterior folosind Din grupul de butoane radio al casetei
metoda vizualå: de dialog Insert Object mai puteÆi så
activaÆi butonul Create New, dacå vreÆi
„ DeschideÆi fereastra constructorului de for- så creaÆi un obiect nou (din lista Object
mulare cu comanda create form obiect1. Type alegeÆi aplicaÆia server pe care o
„ StabiliÆi pentru formular proprietåÆile din veÆi folosi pentru crearea obiectului çi
program. se va deschide fereastra aplicaÆiei
„ SelectaÆi din bara cu obiecte a constructorului pentru a crea obiectul) sau butonul
obiectul OLEContainer. Insert Control dacå vreÆi så inseraÆi un
„ În zona formularului delimitaÆi zona ocupatå control OLE (se deschide caseta de
de obiect prin glisarea mouse-ului. dialog Browse din care puteÆi alege
fiçierul .ocx).
„ Se deschide caseta de dialog InsertObject
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 331

prin intermediul cåreia stabiliÆi obiectul care va fi adåugat în formular. Din grupul de
butoane radio activaÆi butonul Create From File. AcÆionaÆi butonul Browse pentru a
construi identificatorul fiçierului care conÆine obiectul: discul C, dosarul Test çi fiçierul
Cheltuieli.xls. ÎnchideÆi caseta de dialog (clic pe butonul OK).
„ În caseta de proprietåÆi modificaÆi proprietåÆile controlului OLEControl pentru a
corespunde cu cele din program. ObservaÆi care sunt proprietåÆile, metodele çi
evenimentele acestui tip de control.
„ AdåugaÆi la formular butonul pentru terminare. StabiliÆi proprietåÆile controlului (cele din
program) çi codul evenimentului Click.
„ SalvaÆi formularul çi închideÆi aplicaÆia Constructorului de formulare.
„ LansaÆi în execuÆie formularul cu comanda do form obiect1.

CreaÆi vizual obiectul inserat într-un câmp de tip General


CreaÆi un tabel Sigle care conÆine câmpurile nume (C,15), prenume (C,15) çi sigla (G).
Câmpul Sigla va conÆine fieçiere .bmp în care sunt memorate sigle pentru iniÆialele
persoanelor înregistrate în tabel. CreaÆi aceste fiçiere cu
aplicaÆia Windows Paint. AdåugaÆi date în tabel cu ajutorul
ferestrei Browse. Atunci când vreÆi så adåugaÆi date în câm-
pul de tip General, executaÆi clic pe câmp. Se deschide o fe-
reastrå de editare a câmpului în care veÆi insera obiectul cu
opÆiunea Insert Object... ∈ Edit. Se deschide caseta de dialog
Insert Object. Dacå alegeÆi butonul Create New, veÆi alege
din lista Liste Object Type articolul Bitmap Image dupå care se va deschide o zonå de
editare a obiectului çi se vor afiça instrumentele aplicaÆiei Paint cu care puteÆi crea
obiectul. Dacå alegeÆi butonul Create from File, se va deschide o casetå de editare în
care va trebui så scrieÆi identificatorul fiçierului care conÆine imaginea sau veÆi construi
acest identificator cu ajutorul ferestrei Browse. Dupå ce aÆi completat cu date câmpurile
din tabel, închideÆi tabelul.
CreaÆi un formular pentru acest tabel.
Formularul va conÆine butoanele >>> çi
<<< pentru parcurgerea înregistrårilor
din tabel.
„ DeschideÆi fereastra constructorului
de formulare cu comanda create
form obiect2.
„ AdåugaÆi în fereastrå urmåtoarele
obiecte: trei etichete cu legenda
Nume, Prenume çi Sigla, douå ca-
sete de text pentru câmpurile 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 afiçate transparent.
„ CompletaÆi 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
„ AdåugaÆi la formular un obiect de tip OLEBoundControl: executaÆi clic pe obiectul
din bara de obiecte a constructorului. StabiliÆi proprietåÆile controlului (ControlSource=
sigle.sigla).
„ SalvaÆi formularul. LansaÆi în execuÆie formularul cu comanda do form obiect2. TestaÆi
formularul.

Obiectele grafice çi ceasul


Într-un formular puteÆi så introduceÆi diferite obiecte grafice :

Control SemnificaÆie
Imagea Afiçeazå o imagine preluatå dintr-un fiçier .bmp. Caracteristicile sale pot fi
controlate cu proprietåÆile Top, Left, Height, Width, BackStyle,
BorderColor, Border Style, Enabled, Visible, Stretch.
Linea Afiçeazå o linie. Caracteristicile sale pot fi controlate cu proprietåÆile Top,
Left, Height, Width, BorderWidth, BorderColor, Border Style, Enabled,
Visible, LineSlant.
Shapea Afiçeazå o formå (påtrat, dreptunghi, cerc, elipså). Caracteristicile sale pot fi
controlate cu proprietåÆile Top, Left, Height, Width, BackStyle, BackColor,
BorderWidth, BorderColor, Border Style, FullColor, FullStyle, Enabled,
Visible, ToolTipText, Curvature.
Imaginea (image) poate fi folositå la crearea butoanelor cu pictograme în locul butoa-
nelor cu legendå, care pot fi folosite ca butoane declançatoare. Se recomandå folosirea
lor în cazul barelor cu instrumente. Imaginea graficå are o proprietate specificå Picture
(imaginea) care memoreazå sursa imaginii. Aceasta poate fi: un fiçier bitmap .bmp, un
fiçier de imagini .ico sau un câmp din tabel de tip general.
Formele çi liniile (shape sau line) sunt folosite pentru a se desena elemente grafice pe
suprafaÆa formularelor. Chiar dacå au asociate evenimente (declançate de acÆiuni ale
mouse-ului), au în general numai un rol decorativ, de grupare sau de evidenÆiere.

Ceasul Timer este un obiect nevizual care poate fi folosit în interfaÆa unei aplicaÆii
pentru a måsura timpul. Este un mecanism implementat în interfaÆå care permite progra-
matorului så declançeze un anumit proces dupå un interval de timp. Este caracterizat de:
9 Proprietatea interval - Intervalx. Este de tip numeric çi reprezintå numårul de
milisecunde dupå care este generat evenimentul Timer, adicå intervalul de timp pânå
la apelul procesului. Valoarea sa implicitå este 0 (corespunde dezactivårii ceasului).
9 Evenimentul asociat ceasului - Timerx. Este un eveniment care se declançeazå la
intervale egale de timp (stabilite de proprietatea Interval). În procedura asociatå aces-
tui eveniment se scriu instrucÆiunile acÆiunii care trebuie så se execute dupå un interval
de timp.
9 Metoda de resetare a ceasului - Resetx prin care contorul ceasului este adus la 0.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 333

CreaÆi un formular controlat de ceas


CreaÆi un fiçier bitmap în dosarul Test. Imaginea din formularul alåturat a fost creatå în
fiçierul test.bmp. CreaÆi formularul
AtenÆionare care, la acÆionarea unui
buton Afisare va afiça o imagine çi o
legendå care vor dispårea dupå 2500
de ms. Ele vor fi reafiçate numai dacå
se acÆioneazå din nou butonul Afisare:
„ DeschideÆi fereastra constructorului
de formulare cu comanda create
form imagine1.
„ StabiliÆi pentru formular proprie-
tåÆile:
BackColor=192,192,192
Caption="Atentionare"
Closable=.F.
„ AdåugaÆi în fereastrå urmåtoarele obiecte: o imagine (Image1), o etichetå (Label1),
douå butoane de comandå (Command1 çi Command2) çi un ceas (Timer1). StabiliÆi
pentru aceste controale proprietåÆile:
* 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
„ ScrieÆi 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
„ SalvaÆi formularul. LansaÆi în execuÆie formularul cu comanda do form imagine1.
TestaÆi formularul. ÎnchideÆi formularul.
„ DeschideÆi formularul cu comanda modify form imagine1. SalvaÆi formularul sub
numele imagine2.
„ FaceÆi modificåri în acest formular astfel încât imaginea çi eticheta så fie afiçate
intermitent la un interval de 500 ms (se creeazå un efect dinamic, de animaÆie). Se
modificå urmåtoarele 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
„ SalvaÆi formularul. LansaÆi în execuÆie formularul cu comanda do form imagine2.
TestaÆi formularul. ÎnchideÆi formularul.
CreaÆi un formular care simuleazå un ceas
Fie creaÆi douå fiçiere bitmap .bmp, fie gåsiÆi în sistem douå fiçiere cu pictograme .ico
(de exemplu face01.ico çi face02.ico în imaginile din formularul alåturat). CreaÆi formu-
larul Ceas care, la acÆionarea unui buton Afisare va afiça alternant la un interval de
500 ms o imagine în partea dreaptå çi o imagine în partea stângå, iar sub cele douå
imagini o afiçare numericå a timpului (cu pasul de 500 ms).
„ DeschideÆi fereastra constructorului de formulare cu comanda create form imagine3.
„ StabiliÆi pentru formular proprietåÆile:
BackColor=192,192,192
Caption="Ceas"
Closable=.F.
„ AdåugaÆi în fereastrå urmåtoarele obiecte: douå imagini (Image1 çi Image2), o casetå
de text (TextBox1), douå butoane de comandå (Command1 çi Command2) çi un
ceas (Timer). StabiliÆi pentru aceste controale proprietåÆile:
* Imagnea "Image1" Caption="\<Afisare"
Picture=c:\test\face01.ico * Butonul "Command2"
BackStyle=0 Caption="\<Terminare"
* Imagnea "Image2" * Ceasul "Timer"
Picture=c:\test\face03.ico Interval=0
BackStyle=0 * Caseta de text "TextBox1"
* Butonul "Command1" BackStyle=0

„ ScrieÆi procedurile asociate evenimentelor:


procedure Click && Command1
ThisForm.Text1.Value=0
ThisForm.Timer1.Interval=500
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării 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
„ SalvaÆi formularul. LansaÆi în execuÆie çi testaÆi formularul. ÎnchideÆi formularul.

T est pentru evaluare:


1. CreaÆi un tabel cu elevii din claså cu urmåtoarea structurå: nume (C,15), prenume
(C,15), telefon (C,10), adresa (M), foto (G). În câmpul foto veÆi memora poza elevului.
Crea1i un formular pntru introducerea çi vizualizarea datelor din tabel. VeÆi folosi trei
controale de tip casetå de text pentru câmpurile nume, prenume çi telefon, un control
de tip zonå de editare pentru câmpul adresa, un control de tip OLE pentru câmpul
foto çi cinci comutatoare: pentru adåugarea unei noi înregistråri, pentru çtergerea
unei înregistråri, pentru parcurgere înainte çi înapoi a tabelului çi pentru terminare.
2. CreaÆi o barå cu instrumente care så conÆinå trei butoane prin care se deseneazå o
formå într-un formular: påtrat, cerc, elipså çi linie.
3. ConstruiÆi un formular în care vor fi afiçaÆi, într-un control de tip listå, elevii al cåror
nume începe cu o anumitå literå. Litera o veÆi alege dintr-o barå cu instrumente care
va conÆine butoane cu toate literele alfabetului.
4. DesenaÆi cu ajutorul unui program care prelucreazå imagini, patru imagini care så
sugereze miçcarea unei persoane (patru cadre). CreaÆi într-un formular un efect de
animaÆie afiçând repetat la un anumit interval de
timp, în ordine câte unul dintre cele patru cadre.

# ÎncercaÆi:
Adevårat/Fals:
1. Obiectul ToolBox are proprietatea AutoSize.
2. DocumentFile este o proprietate specificå obiectelor de tip OLE.
3. Obiectul Timer are proprietatea Picture.
CompletaÆi:
1. Evenimentul AfterDock este specific obiectului ............................
2. Modul în care poate fi activat un obiect de tip OLE este controlat cu proprietatea
.........................
3. Metoda prin care contorul ceasului este adus la 0 este ....................
336 Inormatică

AlegeÆi råspunsurile corecte:


1. Pentru un obiect ToolBox, Dock este:
a) o proprietate b) o metodå c) un eveniment
2. Pentru un obiect de tip OLE DoVerb este:
a) o proprietate b) o metodå c) un eveniment
3. Pentru obiectul ceas Timer este:
a) o proprietate b) o metodå c) un eveniment

R åspunsuri:
Adevårat/Fals: 1-A; 2-A; 3-F.
CompletaÆi: 1-ToolBox; 2- Autoactivate; 3-Reset.
AlegeÆi råspunsurile corecte: 1-b; 2- b; 3- c.

4. Proiectarea m e n i u rilor
Dacå aplicaÆia pune la dispoziÆia utilizatorului un set de comenzi, metoda cea mai avan-
tajoaså, mai uçoarå çi mai potrivitå pentru a grupa aceste comenzi astfel încât utilizatorul
så aibå acces la ele o reprezintå meniurile.

Meniul (menu) este un element de interfaÆå prin care i se oferå utilizatorului posibilitatea
de a selecta o opÆiune (menu item) dintr-o mulÆime finitå de opÆiuni posibile, afiçate pe
ecran total sau parÆial. În urma selectårii unei opÆiuni se declançeazå o anumitå acÆiune,
corespunzåtoare opÆiunii alese.

În Visual FoxPro puteÆi folosi douå tipuri de meniu:


9 Meniul sistem - este pus la dispoziÆie de mediul Visual FoxPro pentru a realiza acÆi-
uni corespunzåtoare limbajului de comandå.
9 Meniul utilizator - este creat de programatorul unei aplicaÆii ca element al aplicaÆiei
construite de el.
Tipul de meniu disponibil (modul în care este afiçatå bara de meniu Visual FoxPro în
timpul execuÆiei 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 execuÆiei programului.
9 off - bara de meniu Visual FoxPro nu este disponibilå în timpul execuÆiei programului.
9 automatic - bara de meniu Visual FoxPro este vizibilå în timpul execuÆiei
programului, iar opÆiunile sunt disponibile în funcÆie de comanda care se executå în
program.
9 to default - se revine la afiçarea meniului Visual FoxPro dupå ce programul çi-a ter-
minat execuÆia.
În funcÆie de modul în care este dispuså lista cu opÆiuni, meniurile sunt de douå tipuri:
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 337

9 Meniuri orizontale - afiçeazå lista de opÆiuni pe un rând, pe orizontalå. Meniul ori-


zontal se mai numeçte çi barå de meniu (menu bar), iar opÆiunile 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 numeçte menu, iar
opÆiunile sale se numesc pad.
9 Meniuri verticale - afiçeazå lista de opÆiuni într-o coloanå, pe verticalå. Ele se mai
numesc çi submeniuri. În terminologia Visual FoxPro, meniul vertical se numeçte
popup, iar opÆiunile sale se numesc bar.
Sistemul de meniuri al unei aplicaÆii este o combinaÆie de barå de meniuri, titluri de
meniuri, submeniuri çi opÆiuni de meniu. Forma standard a unui sistem de meniuri este
urmåtoarea:
9 Meniul principal (main menu) este reprezentat printr-o barå de meniu afiçatå sub
bara de titlu a unui formular de tip fereastrå, în care ruleazå aplicaÆia. Atunci când se
executå clic pe un titlu de meniu se deschide un meniu pe verticalå.
9 Meniurile pe verticalå afiçeazå o listå cu opÆiuni. OpÆiunile pot fi comenzi de operaÆii
de prelucrare, titluri de submeniuri sau bare separatoare. Barele separatoare se
folosesc pentru a împårÆi în grupuri opÆiunile din lista meniului. Submeniul este un alt
meniu care afiçeazå o altå listå de opÆiuni. În acest mod se poate crea o structurå
arborescentå de submeniuri.
Pentru a face aplicaÆia mai uçor de utilizat, opÆiunile de meniu sunt grupate dupå funcÆiile
lor. Submeniurile se creeazå atunci când:
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å relaÆie cu o opÆiune de meniu.
Unele opÆiuni de meniu executå direct o acÆiune. Alte opÆiuni afiçeazå o casetå de dia-
log, un fomular prin care aplicaÆia cere utilizatorului så-i furnizeze informaÆii suplimentare
ca så poatå executa acÆiunea cerutå. În marea majoritate a aplicaÆiilor aceste opÆiuni de
meniu sunt urmate de trei puncte. Este bine ca çi în interfaÆa pe care o construiÆi så
respectaÆi acest standard.
Fiecårei opÆiuni de meniu îi corespunde un control de meniu. Controlul meniului este çi el
un obiect. La fel ca orice obiect, çi el are proprietåÆi standard prin care i se poate stabili
aspectul: legenda, disponibilitatea, vizibilitatea etc. Legenda este textul care apare în titlu
sau în opÆiunea de meniu. Controlul meniu are asociat un singur eveniment care este
declançat atunci când opÆiunea de meniu este selectatå de la tastaturå sau cu mouse-ul.
ProprietåÆile specifice unui control meniu sunt:
9 Legenda opÆiunii Prompt - este textul explicativ afiçat de titlul meniului sau de
opÆiunea de meniu.
9 Tasta de acces Access key - este tasta care se apaså pentru a selecta direct titlul
sau opÆiunea respectivå atunci când meniul este activat. Litera tastei de acces este
subliniatå în legendå. Pentru a stabili o tastå de acces, înaintea literei respective din
legendå, scrieÆi caracterele \<.
9 Scurtåtura Shortcut key - este combinaÆia de taste asociatå opÆiunii de meniu care
permite executarea unei comenzi dintr-un meniu fårå så se mai activeze bara de
338 Informatică

meniu çi så se selecteze comanda. Lângå opÆiune, în partea dreaptå este afiçat un


text cu combinaÆia respectivå de taste.
9 Mesajul informativ Message - este un mesaj afiçat în bara de stare atunci când se
selecteazå opÆiunea.
9 Marcajul de verificare Mark character - este un simbol care se afiçeazå în partea
stângå a opÆiunii de meniu în funcÆie de o condiÆie: dacå valoarea condiÆiei este adevårat,
în faÆa opÆiunii este afiçat marcajul de verificare b(bifa), iar dacå este fals, marcajul nu
este afiçat. Aceastå proprietate permite folosirea opÆiunilor de meniu pentru stabilirea
valorii unui parametru. Dacå parametrul poate lua valoarea adevårat sau fals, se foloseçte
o singurå opÆiune care poate fi marcatå sau nu. Numele opÆiunii este numele parametrului.
Deoarece aceastå opÆiune se comportå la fel ca un control comutator, ea se mai numeçte
çi opÆiune comutator. Dacå parametrul poate lua mai multe valori, se folosesc mai multe
opÆiuni de meniu, numele fiecårei opÆiuni reprezentând o valoare posibilå a parametrului.
O singurå opÆiune din grupul de opÆiuni poate fi marcatå çi ea reprezintå valoarea aleaså
pentru parametru. La alegerea unei noi opÆiuni din grup, va fi çters marcajul vechii opÆiuni
çi va fi marcatå noua opÆiune. Deoarece grupul de opÆiuni de meniu se comportå la fel ca
un control de tip butoane radio, el se mai numeçte çi grup de opÆiuni butoane radio.
9 Disponibilitatea Skip for - este determinatå de o condiÆie prin care se controleazå
dacå opÆiunea de meniu este disponibilå sau nu: dacå expresia logicå are valoarea
adevårat, opÆiunea de meniu este disponibilå.
Pentru a controla afiçarea marcajului în faÆa unei opÆiuni se foloseçte comanda:
set mark of popup <nume_opÆiune> to <expL>
unde <nume_opÆiune> este numele atribuit opÆiunii (diferit de legendå) folosit pentru iden-
tificarea sa, iar <expL> exprimå condiÆia care determinå afiçarea marcajului.
Evenimentele specifice unui control meniu sunt:
9 IniÆilizarea Setup - este declançatå de crearea meniului. În procedura asociatå
acestui meniu puteÆi defini variabilele de memorie, puteÆi deschide fiçiere, puteÆi salva
sau restaura un sistem de meniuri. Meniurile pot fi salvate în stiva meniurilor. Pentru
operaÆiile cu stiva puteÆi folosi comenzile push menu pentru salvarea meniului în stivå
çi pop menu pentru extragerea meniului în stivå.
9 Çtergerea Cleanup - este declançatå de activarea meniului. În procedura asociatå
acestui meniu puteÆi scrie secvenÆe de cod prin care çtergeÆi informaÆiile care au fost
afiçate pe ecran çi prin care stabiliÆi ce opÆiuni de meniu sunt disponibile. Dacå meniul
este programul principal al aplicaÆiei, în aceastå procedurå puteÆi activa procesorul de
evenimente cu comanda read events. Comanda prin care dezactivaÆi acest procesor
clear evnts o veÆi scrie în procedura asociatå opÆiunii de meniu prin care terminaÆi
aplicaÆia.
Unele aplicaÆii pun la dispoziÆia utilizatorului meniuri derulante (pop-up menu) care sunt
afiçate deasupra formularului, independent de bara de meniu. OpÆiunile afiçate în acest
meniu depind de context, adicå de locul în care se gåseçte cursorul atunci când este
apåsat butonul din partea dreaptå a mouse-ului. El se numeçte meniul contextului
(context menus) sau meniu de comenzi rapide.
Pentru proiectarea unui meniu se poate folosi limbajul de comandå care vå pune la
dispoziÆie comenzi çi funcÆii pentru realizarea acestei operaÆii. Forma mai rapidå çi mai puÆin
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării 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 opÆiuni de meniu), proprietåÆile lor (legenda, tastele de acces, scurtåtura) çi
acÆiunile asociate unei opÆiuni de meniu: declançarea unei acÆiuni sau deschiderea unui
nou submeniu.
Pentru realizarea unui sistem de meniuri trebuie så parcurgeÆi urmåtorii paçi:
1. ProiectaÆi sistemul de meniuri. În aceastå fazå decideÆi de ce meniuri aveÆi nevoie,
când sunt afiçate în interfaÆå çi când sunt disponibile. StabiliÆi ce elemente veÆi folosi
pentru sistemul de meniuri (titlurile din meniul principal, submeniurile, opÆiunile din
submeniuri), adicå structura sistemului de meniuri. Pentru fiecare element, veÆi stabili
proprietåÆile specifice. Pentru fiecare opÆiune de meniu, veÆi stabili ce acÆiune va
declança în urma selectårii. Când proiectaÆi sistemul de meniuri trebuie så aveÆi în
vedere cå utilizatorul trebuie så-l foloseascå uçor çi trebuie så înveÆe repede så-l
utilizeze. Utilizatorul îçi face o imagine mentalå despre modul în care este organizatå
aplicaÆia pe baza meniului çi a opÆiunilor de meniu. De aceea, atunci când proiectaÆi
un sistem de meniuri este bine så respectaÆi urmåtoarele reguli:
a. OrganizaÆi sistemul de meniuri pornind de la sarcinile pe care trebuie så le
execute utilizatorul programului de aplicaÆii çi nu de la structura de module a
programului de aplicaÆii.
b. Legendele afiçate de titlurile çi opÆiunile de meniuri trebuie så fie sugestive, cu
un înÆeles asociat acÆiunii determinate de titlu sau opÆiune. În general este bine
så folosiÆi verbe prin care descrieÆi acÆiunea ce va rezulta în urma alegerii
opÆiunii. Pentru informarea utilizatorului veÆi folosi construcÆii suplimentare (de
exemplu mesaje în bara de stare) prin care veÆi descrie acÆiunea declançatå de
alegerea unei opÆiuni.
c. În legendele titlurilor çi opÆiunilor de meniu puteÆi folosi atât litere mari, cât çi litere
mici. LimitaÆi folosirea literelor mari numai la evidenÆierea anumitor caracteristici.
d. LimitaÆi numårul de titluri de meniuri la un ecran. Dacå ele depåçesc
capacitatea unui ecran, le veÆi organiza în submeniuri.
e. OpÆiunile de meniu se organizeazå fie Æinând cont de frecvenÆa lor de folosire,
fie într-o secvenÆå logicå de folosire, fie alfabetic. VeÆi alege ultimul criteriu
dacå nu le cunoaçteÆi pe primele douå sau dacå lista de opÆiuni este prea mare
(de regulå peste 8) pentru a uçura parcurgerea listei de cåtre utilizator.
f. PuneÆi bare separatoare între grupuri logice de opÆiuni de meniu.
g. Este bine så nu se foloseascå mai mult de un nivel de submeniuri, pentru ca
utilizatorul så nu-çi piardå timpul cåutând comenzi printr-o structurå arbores-
centå de meniuri.
h. StabiliÆi taste de acces pentru titlurile de meniuri çi opÆiunile de submeniuri çi
scurtåturi pentru opÆiunile de submeniuri.

2. CreaÆi meniurile çi submeniurile çi stabiliÆi sarcinile pe care trebuie så le execute


sistemul. Pentru aceasta lansaÆi în execuÆie constructorul de meniuri cu comanda:
create menu <nume_meniu>
340 Informatică

VeÆi preciza structura arborescentå a meniului çi veÆi specifica acÆiunile pe care tre-
buie så le execute fiecare opÆiune de meniu ca de exemplu afiçarea unei casete de
dialog, a unui formular, a unei bare de instrumente sau a unui alt sistem de meniuri.
Cererea de executare a unei acÆiuni trebuie så se facå numai printr-o singurå co-
mandå. Dacå acÆiunea declançatå de selectarea unei opÆiuni se descrie printr-un
grup de instrucÆiuni, acestea vor fi scrise într-un fiçier de tip program surså çi vor fi
lansate în execuÆie printr-o singurå comandå: do <nume_fiçier>. În urma acestor
acÆiuni ale programatorului constructorul de meniuri va crea un fiçier cu numele me-
niului çi extensia .mnx în care se gåsesc, sub forma unui tabel, componentele unui
meniu çi caracteristicile lor. PuteÆi modifica un meniu cu comanda:
modify menu <nume_meniu>
3. GeneraÆi programul excutabil al meniului. Pentru a putea folosi meniul, trebuie
generat un program care, în urma execuÆiei sale, så activeze meniul. Programul va fi
memorat într-un fiçier cu extensia .mpr. Dupå orice modificare a meniului va trebui så
executaÆi din nou operaÆia de generare.
4. LansaÆi în execuÆie çi testaÆi meniul. Meniul va fi activat prin lansarea în execuÆie a
pogramului generat cu comanda:
do <nume_meniu>.mpr

CreaÆi un sistem de meniuri


Sistemul de meniuri pe care îl veÆi crea reprezintå programul principal de aplicaÆie în care,
în funcÆie de opÆiunile alese, veÆi lansa în execuÆie 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 afiça o barå de meniuri pe
orizontalå cu titlurile Afiseaza figuri, Utilitati çi
Terminare. Titlul Afiseaza figuri va deschide un meniu
pe verticalå care conÆine douå opÆiuni de tip submeniu:
Patrat4 çi Figuri4. Submeniul Patrat4 conÆine doua
opÆiuni de tip comandå: Afiseaza... care va lansa în execuÆie formularul în care este
controlatå afiçarea unui påtrat cu ajutorul unui control de tip comutator çi Coloreaza...
care va lansa în execuÆie formularul în care este controlatå afiçarea culorii de umplere a
unui påtrat cu ajutorul unui control de tip listå. Submeniul Figuri4 conÆine douå opÆiuni de
tip comandå: Grup 1... care va lansa în execuÆie formularul în care este controlatå
afiçarea unei anumite figuri geomtrice cu ajutorul unui control de grup de butoane radio çi
Grup 2... care va lansa în execuÆie formularul în care este controlatå afiçarea unei
anumite figuri geomtrice cu ajutorul unui control de tip listå. Titlul UtilitåÆi va deschide un
meniu pe verticalå care conÆine douå opÆiuni de tip comandå: Ceas... care va lansa în
execuÆie formularul în care este simulat un ceas cu ajutorul controlului de tip Timer çi
Calculator... care va lansa în execuÆie formularul în care este simulat lucrul cu un
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 341

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


aplicaÆiei.
„ LansaÆi în execuÆie constructorul de meniuri fie cu opÆiunea de meniu New...∈File (din
caseta de dialog New alegeÆi butonul radio Menu çi executaÆi apoi clic pe butonul New
File), fie cu comanda:
create menu menu_test
„ Se deschide caseta de dialog New Menu care conÆine douå
butoane: Menu pentru crearea unui sistem de meniuri sub
formå de barå orizontalå pe primul rând al formularului în locul
sau împreunå cu titlurile meniului Visual FoxPro çi Shortcut
pentru crearea unui meniu derulant pe verticalå în interiorul
ferestrei de aplicaÆie. PuteÆi alege butonul Shortcut atunci când
vreÆi så creaÆi un meniu de comenzi rapide asociat unui anumit
element de interfaÆå. VeÆi scrie comanda de lansare în execuÆie a acestui meniu în
procedura asociatå evenimentului RightClick al elementului respectiv. Deoarece vrem
så construim un meniu sub formå de barå pe orizontalå, executaÆi clic pe butonul Menu.
„ Se deschide fereastra constructorului de meniuri Menu Designer, iar în bara de meniuri
este afiçat un titlu de meniu care conÆine opÆiuni specifice constructorului de meniuri:
Menu. DeschideÆi acest meniu çi observaÆi opÆiunile pe care le conÆine. IdentificaÆi
opÆiunile pentru care aveÆi butoane în fereastra Menu Designer. OpÆiunea Quick menu
vå ajutå så creaÆi rapid un sistem de meniuri pornind de la meniul Visual FoPro. Se va
genera automat structura acestui sistem de meniuri, dupå care veÆi putea çterge,
adåuga sau modifica opÆiunile sau meniurile Visual FoxPro. VeÆi construi înså sistemul
de meniuri fårå så folosiÆi aceastå facilitate.
„ Înainte de a specifica structura sistemului de meniuri, îi veÆi stabili caracteristicile gene-
rale prin intermediul casetei de dialog General Option pe care o deschideÆi cu opÆiunea
de meniu General Options...∈View. Ea conÆine urmåtoarele controale:
9 Grupul de butoane radio Location prin
intermediul cårora stabiliÆi poziÆia meniului
pe care îl creaÆi 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å alegeÆi una dintre ultimele douå opÆi-
uni, se va deschide o listå derulantå cu titlu-
rile de meniuri din care puteÆi så alegeÆi titlul
meniului faÆå de care va fi adåugat în meniul
sistemului, meniul creat de dumneavoastrå.
9 Grupul de comutatoare Menu code prin in-
termediul cårora stabiliÆi dacå doriÆi så scrieÆi
o secvenÆå de cod asociatå evenimentului Setup (comutatorul Setup...) çi evenimen-
tului Cleanup (comutatorul Cleanup...). Dacå activaÆi comutatorul se va deschide o
fereastrå de editare în care veÆi scrie secvenÆa de instrucÆiuni.
342 Informatică

9 Zona de editare Procedure çi comutatorul Edit le veÆi folosi dacå vreÆi så definiÆi o
procedurå globalå care va fi folositå implicit în întregul sistem de meniuri. Ea va fi
lansatå în execuÆie de fiecare datå când se va alege o opÆiune cåreia nu i s-a atribuit o
procedurå proprie. Pentru meniul pe care îl construiÆi trebuie så fie activat butonul
Replace. ÎnchideÆi caseta de dialog executând clic pe butonul Ok.
„ AÆi revenit în fereastra Menu Designer în care definiÆi titlurile din meniul principal:
În fereastra Menu Designer puteÆi folosi urmåtoarele controale:
9 Zona de de lucru afiçeazå sub forma unui tabel mai multe controale: pe un rând sunt
afiçate controalele corespunzåtoare definirii caracteristicilor unei opÆiuni de meniu, iar
pe o coloanå controalele corespunzåtoare unei caracteristici a opÆiunii de meniu.
Coloanele sunt urmåtoarele:
Mover Control. Este prima coloanå çi conÆine un buton cu sågeatå dublå¦. Se
foloseçte pentru a schimba locul opÆiunilor în listå (prin glisarea opÆiunii în noua
poziÆie).
Prompt. În aceastå coloanå se scrie textul legendei opÆiunii de meniu. Dacå în
legendå scrieÆi înaintea textului caracterul \, opÆiunea nu va disponibilå. Dacå în
legendå scrieÆi numai caracterele \-, opÆiunea respectivå va fi o linie de demarcare
între grupurile de opÆiuni.

Result. În acestå coloanå este afiçat un control de tip listå ascunså din care puteÆi
alege tipul acÆiunii declançate de selectarea opÆiunii de meniu (tipul rezultatului).
Tipul rezultatului poate fi: Submenu (se deschide un submeniu), Command (se
executå o comandå) sau Procedure (se executå o procedurå). Pentru opÆiunile de
submeniu Afiseaza, Coloreaza, Grup 1, Grup 2, Calculator çi Ceas alegeÆi un rezul-
tat de tip Command, pentru titlul Terminare, rezultatul Procedure, pentru restul
opÆiunilor rezultatul Submenu.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 343

Zona de creare sau editare a rezultatului. Este coloana urmåtoare rezultatului


(coloana a patra). ConÆine un buton Create la creare çi un buton Edit la editare. Da-
cå tipul rezultatului este Submenu, la acÆionarea butonului se deschide o nouå zonå
de lucru în care puteÆi defini opÆiunile submeniului çi caracteristile lor. Dacå tipul
rezultatului este Command, la acÆionarea butonului se activeazå în coloana a patra o
casetå de text în care scrieÆi comanda. Dacå tipul rezultatului este Procedure, la
acÆionarea butonului se deschide o zonå de editare în care scrieÆi secvenÆa de
instrucÆiuni a procedurii. Pentru opÆiunile de meniu pentru care aÆi ales rezultatul de
tip Command, scrieÆi comanda do form <nume_forma>, unde <nume_forma> este
numele fiçierului în care aÆi salvat formularul. Pentru titlul Terminare pentru care aÆi
ales rezultatul Procedure, scrieÆi în zona de editare urmåtoarea secvenÆå de
instrucÆiuni:
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 acÆionaÆi se deschide caseta de dialog Prompt Option în
care stabiliÆi caracteristicile opÆiunii de meniu. CompletaÆi în aceastå casetå de
dialog, pentru fiecare opÆiune de meniu, mesajul çi scurtåtura.
9 Lista ascunså Menu level afiçeazå ierarhic meniurile din care s-a dezvoltat meniul pentru
care se pecizeazå opÆiunile în zona de lucru a ferestrei (filiaÆia meniului). Alegând o
opÆiune din aceastå listå puteÆi reveni într-unul din meniurile superioare lui. De exemplu,
folosind aceastå listå puteÆi så reveniÆi din zona de lucru a meniului Patrat, în zona de
lucru a meniului pårinte Afiseazå figuri sau a meniului principal Menu Bar.

Grupul de zone de editare Shortcut se folo-


seçte pentru a stabili o scurtåturå pentru opÆi-
unea de meniu. CombinaÆia de taste se scrie
în zona de editare Key Label (de exemplu Æi-
nând apåsatå tasta Alt apåsaÆi tasta S;
scurtåtura va fi Alt+S). În zona de editare
Key Text se va scrie textul afiçat lângå opÆi-
unea de meniu prin care se precizeazå scur-
tåtura.
În caseta de editare Skip For scrieÆi expresia
logicå folositå pentru a controla disponibilita-
tea opÆiunii de meniu. PuteÆi folosi construc-
torul de expresii dacå acÆionaÆi butonul ....
În caseta de editare Message scrieÆi mesajul
care va fi afiçat în bara de stare la selectarea
opÆiunii. PuteÆi folosi constructorul de expresii.
În zona de editare Comment puteÆi scrie
comentarii folosite intern, de proiectant.
344 Informatică

9 SecÆiunea de butoane Item conÆine butoane pentru inserarea unei opÆiuni de meniu între
cele existente: Insert (o opÆiune definitå de utilizator) çi Insert Bar... (o opÆiune preluatå
din meniul sistemului Visual FoxPro) çi pentru çtergerea unei opÆiuni Delete.
9 Butonul Preview. Prin acÆionarea lui puteÆi så previzualizaÆi
meniul pe care îl construiÆi: meniul sistemului este înlocuit
de acesta çi se deschide o casetå de dialog Preview în
care sunt prezentate informaÆii despre opÆiunea selectatå
din meniu (numele fiçierul, legenda opÆiunii çi comanda aso-
ciatå).
„ Dupå ce aÆi terminat de construit meniul, îl previzualizaÆi
folosind butonul Preview.
„ GeneraÆi meniul executabil cu opÆiunea Generate...∈Menu.
„ LansaÆi în execuÆie meniul cu comanda: do menu_test. TestaÆi meniul.
„ Structura meniului este memoratå într-un fiçier de tip tabel, care are cu numele meniului
(menu_test) çi extensia .mnx. DeschideÆi acest fiçier cu comanda use menu_test.mnx.
AfiçaÆi conÆinutul såu cu comanda browse. IdentificaÆi în acest tabel semnificaÆia fiecårei
coloane. IdentificaÆi ce element din structura meniului este înregistrat în fiecare rând al
tabelului.

TestaÆi modul în care puteÆi folosi procedura globalå çi procedurile asociate eveni-
mentelor Setup çi Cleanup
VeÆi adåuga sistemului de meniuri o procedurå globalå:
„ DeschideÆi meniul anterior çi-l salvaÆi sub numele menu_1. În noul meniu veÆi face
urmåtoarele modificåri:
„ In caseta de dialog General Option scrieÆi în zona de editare a procedurii globale
instrucÆiunea:
? "Test procedura globala"
ActivaÆi comutatorul Setup çi în fereastra de editare a procedurii scrieÆi:
? "Test eveniment Setup"
„ În fereastra Form Designer în meniul principal adåugaÆi titlul Scrie înainte de titlul de
meniu Terminare. Acestui titlu de meniu îi atribuiÆi un rezultat de tip Command, dar nu
îi atribuiÆi nici o comandå. În meniul Utilitati adåugaÆi la sfârçit douå opÆiuni: Scrie 1 çi
Scrie 2. Ambelor le atribuiÆi un rezultat de tip comandå. OpÆiunii Scrie 1 nu îi atribuiÆi
nici o comandå, iar opÆiunii Scrie 2 îi atribuiÆi comanda:
? "Test optiune Scrie 2"
„ În procedura asociatå titlului Terminare din meniul principal, çtergeÆi instrucÆiunea clear.
„ SalvaÆi modificårile fåcute çi generaÆi meniul executabil. LansaÆi în execuÆie meniul.
TestaÆi meniul Scrie çi opÆiunile Scrie 1 çi Scrie 2. Ce concluzii trageÆi?
„ DeschideÆi meniul menu_1 çi îl salvaÆi sub numele menu_2. În noul meniu deschideÆi
caseta de dialog General Option, activaÆi comutatorul Cleanup çi în fereastra de
editare a procedurii scrieÆi:
clear
? "Test eveniment Cleanup"
„ SalvaÆi modificårile fåcute çi generaÆi meniul executabil. LansaÆi în execuÆie meniul.
TestaÆi meniul Scrie çi opÆiunile Scrie 1 çi Scrie 2. Ce concluzii trageÆi? Când se
executå procedura asociatå evenimentului Cleanup.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 345

T est pentru evaluare:


ConstruiÆi o bazå de date în care profesorul de informatica va Æine evidenÆa 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 ÆineÆi evidenÆa elevilor çi note cu structura identificatorul elevului (id_elev,N,3), nota
(nota,N,2) çi data notårii (data,D) în care ÆineÆi evidenÆa notelor la informaticå. Când
definiÆi baza de date aveÆi grijå så asiguraÆi integritatea referenÆialå a datelor. Separat
creaÆi tabelul liber Clase în care profesorul Æine evidenÆa claselor la care predå. Tabelul
va avea un singur câmp pentru clase (cls,C,3). Acest tabel va fi folosit ca surså de date
pentru un control de tip listå. ConstruiÆi un sistem de meniuri care så-i permitå
profesorului întreÆinerea çi exploatarea acestor date. Sistemul va avea urmåtoarele titluri:
a. Titlurile din meniul principal vor fi: Actualizare, Prelucrare, Listare, Terminare.
b. Meniul Actualizare va deschide un meniu pe verticalå cu opÆiunile Note, Teze, Elevi,
Clase. Selectarea uneia dintre aceste opÆiuni va deschide un formular pentru
actualizarea datelor din tabelul respectiv. Formularele Elevi çi Clase vor avea
urmåtoarele butoane: buton pentru adåugarea unei înregistråri, buton pentru
çtergerea unei înregistråri, buton pentru refacerea unei înregistråri çterse accidental
în timpul lucrului cu formularul, douå butoane pentru parcurgere înregistrårilor din
tabel înainte çi înapoi çi butonul de terminare. În formularul pentru elevi, se vor
actualiza numai urmåtoarele date din tabelul Elevi: numele, prenumele çi clasa.
Clasa se va alege dintr-o listå a cårei surså de date va fi tabelul Clase. Tabelul Note
va conÆine o casetå de text pentru datå çi o casetå de text cu derulor pentru notå, un
control de tip claså din care veÆi alege clasa çi un control de tip listå cu douå coloane
din care veÆi alege numele çi prenumele elevului pentru care înregistraÆi nota.
Formularul va avea butoane de adåugare, çtergere, refacere a unei înregistråri
çterse accidental în timpul lucrului cu formularul, douå butoane pentru parcurgerea
înregsitrårilor 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 opÆiunile SituaÆie elev,
Primii 10, Ultimii 10, Corigentii. OpÆiunea SituaÆie elev va afiça un formular cu situaÆia
unui elev. Formularul va conÆine douå liste din care veÆi alege elevul çi clasa, un
control de tip grilå în care vor fi afiçate 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. OpÆiunile Primii 10 çi Ultimii 10 vor afiça
formulare care vor conÆine un control de tip listå din care veÆi alege perioda
(Semestrul 1, Semestrul 2 sau An) çi un control de tip grilå în care vor fi afiçaÆi 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. OpÆiunea
CorigenÆii va afiça un formular în care, dintr-o listå, veÆi putea alege perioada
(Semestrul 1, Semestrul 2 sau An) çi o listå din care veÆi alege clasa, dupå care se
346 Informatică

va crea o listå dinamicå cu numele elevilor corigenÆi din clasa respectivå, în perioada
aleaså. Toate aceste formulare vor avea un buton de terminare.
d. Meniul Listare va deschide un meniu pe verticalå cu opÆiunile Lista 1, Lista 2, Lista 3,
Lista 4, Lista 5 çi Lista 6. Aceste opÆiuni vor fi grupate logic în douå grupuri de
opÆiuni (fiecare grupå va conÆine 3 opÆiuni) separate printr-o barå separatoare.
Toate aceste opÆiuni de meniu vor afiça rapoarte, în care înregistrårile vor fi grupate
dupå criteriul clasei. Lista 1 (Lista 4) çi Lista 2 (Lista 5) vor afiça rapoarte cu numele
çi prenumele elevului, notele çi media pe primul semestru, respectiv al doilea
semestru, iar Lista 3 ((Lista 6)) va afiça un raport cu numele çi prenumele elevului,
mediile semestriale çi media generalå. În primul grup de rapoarte, în cadrul grupului
clasa, înregistrårile vor fi afiçate în ordine alfabeticå, iar al doilea grup de rapoarte în
ordinea descrescåtoare a mediilor. Utilizatorul programului va cunoaçte semnificaÆia
fiecårei opÆiuni din mesajul afiçat în bara de stare.
e. StabiliÆi scurtåturi çi mesaje pentru toate opÆiunile de meniu.
f. Înainte de a se activa meniul, afiçaÆi pe ecran o casetå de dialog pentru introducerea
parolei. StabiliÆi ce parolå doriÆi. Se vor accepta
numai cinci încercåri de comunicare a parolei
pentru a avea acces la datele din baza de date.

5 . P r o i e c t a r e a a p l i c a ţi i l o r

5 . 1 . P r o g r a m u l m o ni t o r
O aplicaÆie cuprinde mai multe module: pentru introducerea datelor, pentru prelucrarea
lor sau pentru afiçarea unor rapoarte pe ecran sau la imprimantå. Toate aceste module
trebuie asamblate într-o aplicaÆie, în care un modul de program trebuie så le administreze
çi så le coordoneze.

Programul monitor al unei aplicaÆii are rolul de a coordona executarea


modulelor aplicaÆiei ç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 cåror valoare se stabileçte cu co-
manda set. Aceçti parametri au valori implicite, iar în unele aplicaÆii aceste valori
implicite nu sunt tocmai potrivite. De exemplu, parametrul talk trebui så aibå
valoarea off, iar parametrului date, care stabileçte formatul datelor calendaristice, i
se poate atribui un anumit format (set date to british). Se mai poate stabili direc-
torul curent din care se vor prelua baza de date çi alte fiçiere necesare aplicaÆiei cu
parametrul default (set default to <cale_director>). AlÆi parametri pentru care se
stabilesc de obicei valorile sunt century, confirm, console, deleted çi safety.
b. Så personalizeze fereastra de aplicaÆie. AplicaÆia ruleazå în fereastra sistemului
Visual FoxPro, care va deveni fereastra aplicaÆiei. De aceea trebuie så schimbaÆi
anumite proprietåÆi ale acestei ferestre. Obiectul fereastra aplicaÆiei Visual FoxPro
se identificå prin variabila de memorie sistem _screen. De exemplu, dacå vreÆi så
schimbaÆi legenda ferestrei de aplicaÆie veÆi folosi comanda de atribuire:
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 347

_screen.caption=<numele_ferestrei_de_aplicatie>
Înainte înså de a modifica proprietåÆile ferestrei, salvaÆi valorile pe care le modificaÆi
în variabile de memorie (de exemplu: nume_f=_screen.caption) .
c. Så activeze meniul principal al aplicaÆiei. Din meniul principal se vor lansa în
execuÆie modulele de program pentru prelucrarea datelor, formularele pentru
editarea datelor, comenzile pentru afiçarea rapoartele etc.
d. Så activeze procesorul de evenimente. Deoarece programul generat de con-
structorul de meniuri nu conÆine propriul procesor de evenimente, este necesar
ca, dupå ce a fost lansat în execuÆie programul care creeazå meniul, så se
activeze procesorul de evenimente care la rândul såu va activa meniul çi va
permite tratarea evenimentelor.
e. Så dezactiveze procesorul de evenimente çi så refacå starea anterioarå a
mediului de lucru la terminarea execuÆiei aplicaÆiei.
Exemplu
Pentru salvarea çi restaurarea parametrilor care caracterizeazå starea sistemului, puteÆi
folosi douå tabele (câte una pentru fiecare tip de comandå set):
9 stare1 (comenzi set pentru parametrii cu douå valori - on çi off; de exemplu talk,
century, confirm, console, deleted çi safety) cu structura nume C(15), valoarea_s
C(3), valoarea_a C(3);
9 stare2 (comenzi set pentru parametrii cu mai multe valori - set ... to; de exemplu
default çi date) cu structura nume C(15), valoarea_s C(30), valoarea_a C(30);
unde valoarea_s este valoarea parametrului în sistemul Visual FoxPro, iar valoarea_a este
valoarea parametrului în aplicaÆie. ÎncårcaÆi iniÆial tabelul cu numele parameterilor pe care
doriÆi så-i modificaÆi (câmpul nume) çi cu valorile pe care doriÆi så le aibå în aplicaÆie.
Pentru salvarea configurårii sistemului, la începutul sesiunii de lucru veÆi folosi procedura
intrare:
procedure intrare
* se salveaza valorile parametrilor sistemului
* se atribuie parametrilor valorile aplicatiei
use stare1
scan
replace valoare_s with set(alltrim(stare1.nume))
alfa=alltrim(stare1.nume)
beta=alltrim(stare1.valoare_a)
set &alfa &beta
endscan
use
use stare2
scan
replace valoare_s with set(alltrim(stare2.nume))
alfa=alltrim(stare2.nume)
beta=alltrim(stare2.valoare_a)
set &alfa to &beta
endscan
use
endproc
348 Informatică

Pentru restaurarea stårii sitemului, la sfârçitul sesiunii de lucru veÆi folosi procedura ieçire:
procedure iesire
* se restaureaza valorile parametrilor sistemului
use stare1
scan
alfa=alltrim(stare1.nume)
beta=alltrim(stare1.valoare_s)
set &alfa &beta
endscan
use
use stare2
scan
alfa=alltrim(stare2.nume)
beta=alltrim(stare2.valoare_s)
set &alfa to &beta
endscan
use
endproc

5.2. G e s t i o n a r e a c o m p o n e n t e l o r u n e i a p li c a ţii

5.2.1. Proiectul aplicaÆiei


La realizarea unei aplicaÆii concurå mai multe componente: module de program - programs
(programe independente care pot coÆine proceduri çi funcÆii sau subprograme organizate în
fiçiere de proceduri), baze de date - Database, tabele libere - Free Tables, formulare -
Forms, meniuri - Menus, rapoarte - Reports, interogåri - Queries, biblioteci de clase - Class
Libraries, fiçiere text - Text Files, alte tipuri de fiçiere - Other Files. Pentru a manipula uçor
componentele aplicaiÆiei, ele pot fi organizate într-un proiect.

Proiectul (project) este o facilitate prin care proiectantul unei aplicaÆii poate
Æine evidenÆa componentelor aplicaÆiei çi le poate administra. El este un fiçier
care conÆine o colecÆie de fiçiere cu structuri specifice sistemului care le-a creat.

Se recomandå ca înainte de a crea componentele unei aplicaÆii, så creaÆi proiectul çi så adåu-


gaÆi la proiect fiecare nouå componentå. În acest mod evitaÆi så uitaÆi så includeÆi în proiect
una dintre componentele aplicaÆiei. Orice modificare a unei componente se va face în
interiorul proiectului. Propiectul se memoreazå într-un fiçier cu extensia .pjx. Acest fiçier are
structura unui tabel. Într-o înregistare se memoreazå informaÆii despre o componentå a
proiectului. Practic proiectul nu conÆine componentele propriu-zise, ci informaÆii despre ele,
cum este de exemplu locul în care se gåsesc pe disc.
Pentru construirea çi modificarea unui proiect, Visual FoxPro vå pune la dispoziÆie Gestio-
narul de proiecte - Project Manager pe care îl lansaÆi în execuÆie pentru crearea sau
modificarea unui proiect cu comanda:
create | modify project <nume_proiect>

5.2.2. Generarea aplicaÆiei çi a programului executabil


Proiectul conÆine douå categorii de componente:
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 349

9 Componente care nu se modificå în timpul execuÆiei: programele, meniurile, ra-


poartele, formularele etc.
9 Componente care se modificå în timpul execuÆiei: bazele de date, tabelele etc.

AplicaÆia (application) este un fiçier care conÆine componetele unui proiect


care nu se modificå în timpul execuÆiei.

Fiçierul aplicaÆiei are extensia .app.


Pentru a crea o aplicaÆie trebuie parcurse urmåtoarele etape:
a. Se creeazå proiectul aplicaÆiei. Nu se poate crea o aplicaÆie dacå nu aÆi
inclus componentele ei într-un proiect.
b. Se stabileçte programul principal - Set Main. Orice aplicaÆie trebuie så aibå
un program principal. Programul principal este programul care se va executa
atunci când se lanseazå în execuÆie aplicaÆia çi din care vor fi apelate celelalte
componente ale aplicaÆiei: modulele de program, meniurile, formularele etc.
c. Se genereazå aplicaÆia.
AplicaÆia se lanseazå în execuÆie cu comanda:
do <nume_aplicaÆie>.app
AplicaÆia este dependentå de mediul Visual FoxPro. Pentru a crea un program independent
de acest mediu, acesta trebuie så fie un program executabil (fiçier cu extensia .exe) care se
obÆine la fel ca o aplicaÆie, cu deosebirea cå în caseta Build Options se activeazå butonul
Build Executable.
Açadar, pentru a putea rula aplicaÆia pe care aÆi construit-o pe un calculator pe care nu este
instalat Visual FoxPro aveÆi douå posibilitåÆi:
9 CreaÆi fiçierul aplicaÆiei (.app) çi îl distribuiÆi utilizatorului împreunå cu versiunea
„pentru rulare” a sistemului Visual FoxPro care conÆine numai acele elemente care
asigurå execuÆia programelor, nu çi modificarea lor.
9 CreaÆi programul executabil al aplicaÆiei. Acesta nu are nevoie de varianta pentru
rulare, ci îi sunt necesare numai bibliotecile de rulare (fiçiere care conÆin proceduri pentru
rularea programelor).
AplicaÆia çi programul executabil trebuie transportate la destinaÆie (calculatorul utilizatorului)
pe un suport de memorare (discuri flexibile sau CD). Pe acest suport va fi construit kitul de
instalare care va conÆine o imagine a structurii de directoare necesare executårii aplicaÆiei,
directoarele în care se vor gåsi fiçierul executabil çi alte fiçiere necesare aplicaÆiei.
Pentru realizarea kitului de instalare folosiÆi procedura asistent a kitului de instalare
Setup Wizard. Procedura creeazå pe hard discul calculatorului dumneavoastrå, în direc-
torul precizat, o imagine a chitului de instalare. Dupå ce aÆi creat aceastå imagine, o
veÆi copia pe suportul de memorare stabilit pentru destinaÆie în timpul procesului de
generare a kitului (dacå aÆi ales discul flexibil, veÆi copia conÆinutul fiecårui director
rezultat pe o dischetå). La destinaÆie veÆi instala aplicaÆia lansând în execuÆie programul
setup.exe care a fost creat, în cazul suportului de tip disc flexibil, pe primul disc.
350 Informatică

CreaÆi un proiect
Proiectul va cuprinde meniul definit anterior menu_test, formularele care sunt activate de
opÆiunile acestui meniu, çi cele douå fiçiere cu pictograme folosite în formularul care
simuleazå ceasul. La aceste componente trebuie så adåugaÆi programul monitor.
„ CreaÆi în rådåcina discului C directorul AplicaÆie. În acest director veÆi crea proiectul.
„ LansaÆi în execuÆie generatorul de proiecte fie cu opÆiunea de meniu New...∈File (din
caseta de dialog New alegeÆi butonul radio Project çi executaÆi apoi clic pe butonul New
File, dupå care în caseta de dialog Create alegeÆi directoul Aplicatie çi atribuiÆi
proiectului numele Proiect), fie cu comanda:
create project \aplicatie\proiect
„ Se deschide fereastra Project Butonul de restrângere/expandare a ferestrei. În urma
Manager care este împårÆitå în operaÆiei de restrângere fereastra va fi reduså la zona
mai multe secÆiuni, fiecare etichetelor secÆiunilor çi va putea fi ancoratå la fel ca orice
secÆiune reprezentând o cate- barå de instrumente. Executând apoi clic pe o etichetå veÆi
gorie de componente: All - toa- expanda numai secÆiunea corespunzåtoare etichetei.
te componentele, Date - com-
ponentele care conÆin date
(Database, Free Table, Que-
ries), Documents - componen-
tele utile pentru introducerea çi
afiçarea datelor (formularele
Forms çi rapoartele Reports),
Class Libraries - bibliotecile de
clase, Code - componente care
conÆin module de program
(Pro-grams çi Applications) çi
Other - alte componente (meni-
urile Menus, fiçierele de texte
Text Files çi alte fiçiere Other
Files). În zona de lucru a feres-
trei vor fi afiçate componentele
specifice secÆiunii.
Cu ajutorul Gestionarului de proiecte puteÆi executa urmåtoarele operaÆii:
9 Crearea unei componente noi (butonul New...). Se va deschide fereastra construc-
torului corespunzåtor componentei selectate: Menu Designer - pentru meniuri, Query
Designer - pentru interogåri, Report Designer - pentru rapoarte, Form Designer -
pentru formulare ... çi fereastra de editare texte pentru Programs çi Files.
9 Adåugarea unei componente la proiect (butonul Add...). Dacå obiectul a fost
creat în afara proiectului, dupå ce acÆionaÆi acest buton puteÆi så alegeÆi dintr-o listå
componentele pe care doriÆi så le adåugaÆi la proiect.
9 Editarea unei componente a proiectului (butonul Modify). SelectaÆi componenta
din secÆiunea corespunzåtoare a fereastrei çi acÆionaÆi butonul. Se va deschide
fereastra constructoului cu care aÆi creat componenta çi puteÆi så faceÆi modificårile.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 351

9 Lansarea în execuÆie a unei componente a proiectului (butonul Run). SelectaÆi


componenta çi acÆionaÆi butonul. Va fi lansatå în execuÆie componenta (programul,
interogarea, formularul etc.).
9 Înlåturarea unei componente din proiect (butonul Remove...). SelectaÆi compo-
nenta din secÆiunea corespunzåtoare a ferestrei çi acÆionaÆi butonul. În caseta de
dilaog care se deschide, confirmaÆi dacå doriÆi numai înlåturarea componentei din
proiect (Remove) sau înlåturarea çi çtergerea ei de pe disc (Delete).
9 Construirea proiectului (butonul Build...). Dupå ce apåsaÆi butonul, se va des-
chide o casetå de dialog în care veÆi preciza ce veÆi construi (proiect, aplicaÆie,
fiçier executabil sau veÆi recompila toate fiçierele).
„ DeschideÆi secÆiunea Documents în care veÆi adåuga la proiect formularele. SelectaÆi
obiectul Form çi acÆionaÆi butonul Add.... Se deschide caseta de dialog Open în care
cåutaÆi directorul în care se gåseçte formularul çi selectaÆi apoi primul formular apelat în
meniu. AcÆionaÆi apoi butonul Ok. VeÆi repeta aceastå operaÆie pentru fiecare formular
care va fi adåugat la proiect.
„ DeschideÆi secÆiunea Other în care veÆi adåuga la proiect meniul çi fiçierele cu pictograme
necesare pentru simularea ceasului. SelectaÆi mai întâi obiectul Menus çi acÆionaÆi butonul
Add.... Se deschide caseta de dialog Open din care selectaÆi meniul menu_test çi
acÆionaÆi apoi butonul Ok. SelectaÆi apoi obiectul Other Files çi acÆionaÆi butonul Add....
Se deschide caseta de dialog Open din care selectaÆi primul fiçier cu pictogramå
(Face01.ico) çi acÆionaÆi apoi butonul Ok. VeÆi repeta aceastå operaÆie çi pentru al doilea
fiçier cu pictogramå (Face01.ico).
„ FaceÆi modificåri în meniu. SelectaÆi obiectul Menus çi îl dezvoltaÆi executând clic pe buto-
nul +. În lista afiçatå selectaÆi meniul Menu_test çi apoi executaÆi clic pe butonul
Modify. Se deschide fereastra constructorului de meniuri. ExecutaÆi clic pe butonul
Edit al meniului Terminare. În fereastra de editare a procedurii asociate titlului de
meniu çtergeÆi instrucÆiunile:
set sysmenu to default
clear memory
çi adåugaÆi instrucÆiunea:
clear events
ÎnchideÆi fereastra de editare.
„ DeschideÆi secÆiunea code în care veÆi crea programul monitor. SelectaÆi obiectul Pro-
grams çi acÆionaÆi butonul New.... Se deschide fereastra de editare. ScrieÆi în fereastra de
editare instrucÆiunile programului monitor çi apoi îl salvaÆi 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 conÆinutul proiectului, executaÆi clic pe butoanele + din faÆa numelui
obiectului:
AcÆionaÆi butonul Build.... În caseta de dialog Build
Options activaÆi butonul Rebuild Project çi apoi
butonul OK.
„ ÎnchideÆi fereastra aplicaÆiei executând clic pe bu-
tonul de închidere.
„ InformaÆiile proiectului sunt memorate sub forma
unui tabel. DeschideÆi acest tabel cu comanda:
use \aplicatie\proiect.pjx.
VizualizaÆi conÆinutul tabelului cu comanda
browse. IdentificaÆi semnificaÆia informaÆiilor me-
morate în fiecare rând çi în fiecarea coloanå a tabelului. ÎnchideÆi fereastra de vizualizare.
ÎnchideÆi tabelul cu comanda use.

CreaÆi o aplicaÆie
AplicaÆia o veÆi construi pornind de la proiectul construit anterior.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 353

„ DeschideÆi proiectul fie cu opÆiunea de meniu Open...∈File (din lista ascunså Files of
type alegeÆi Project, selectaÆi fiçierul Proiect din directoul AplicaÆie çi executaÆi apoi clic
pe butonul Open), fie cu comanda:
modify project \aplicatie\proiect
„ În secÆiunea Code a ferestrei Project Manager selectaÆi programul monitor care va fi
programul principal. SelectaÆi apoi opÆiunea Set Main∈Project. Numele programului
principal va fi scris cu stilul bold.
„ Pentru a genera aplicaÆia, acÆionaÆi butonul Build... din fereastra Project Manager.
Se deschide caseta de dialog Build Options în care din grupul de butoane radio
Action activaÆi butonul Build Application. AcÆionaÆi apoi comutatorul OK çi în
fereastra Save As scrieÆi numele aplicaÆiei: test.
„ LansaÆi în execuÆie aplicaÆia cu comanda:
do \aplicatie\test.app. TestaÆi aplicaÆia.
CreaÆi kitul pentru distribuirea aplicaÆiei
„ CreaÆi un director Test în care va fi creatå imaginea kitului de distribuÆie.
„ DeschideÆi caseta de dialog a procedurii asistent alegând opÆiunea de meniu Setup∈
Wizard ∈ Tools çi parcurgeÆi urmåtorii paçi (folosind butonul Next):
1. PrecizaÆi locul sursei kitului- Locate Files. Îl comunicaÆi în câmpul de editare
Distribution files. Pentru a uçura cåutarea, executaÆi clic pe butonul .... Din lista
deschiså alegeÆi directorul c:\aplicatie.
2. PrecizaÆi componentele speciale folosite de aplicaÆie - Specify Components.
Componentele pe care le puteÆi preciza (activând comutatorul corespunzåtor) sunt:
Visual FoxPro runtime - versiunea „pentru rulare” necesarå aplicaÆiilor (este
necesarå atunci când kitul conÆine o aplicaÆie), Microsoft Graph 5.0 runtime -
versiunea „pentru rulare” a programului Microsoft Graph 5.0 (este necesarå atunci
când în programele kitului se creeazå grafice), OLE servers (este necesar atunci
când în programele kitului se foloseçte tehnologia OLE). ActivaÆi comutatorul Visual
FoxPro runtime.
3. CreaÆi directorul cu imaginea kitului - Create Disk Image Directory. Procedura
asistent creeazå pe hard disc o imagine a kitului. Aceastå imagine poate fi
segmentatå în grupuri de directoare, fiecare grup corespunzând unui disc flexibil de
de 3.5 inch sau poate fi nesegmentatå. Modul pe care l-aÆi ales pentru memorarea
pe hard disc va determina tipul suportului destinaÆie. AlegeÆi acest mod activând unul
dintre comutatoarele din grupul Disk Image: 1.44 MB 3.5-inch (pentru discheta de
3.5 inch) sau Netsetup (pentru CD). Locul în care va fi memoratå imaginea kitului îl
veÆi comunica în caseta de text Disk Images Directory. Pentru exemplul nostru veÆi
alege varianta discurilor de 3.5 inch çi directorul pentru imagine va fi c:\Test.
4. PrecizaÆi opÆiunile la instalare - Specify Setup Option. Este obligatoriu så
comunicaÆi informaÆiile pentru caseta de text Setup dialog box caption (titlul afiçat
de fereastra în care ruleazå kitul de instalare; scrieÆi de exemplu Instalare) çi
Copyright information (date referitoare la drepturile de copyright ale aplicaÆiei;
scrieÆi de exemplu Autor <nume>). Mai puteÆi completa caseta de text Post-setup
executable cu numele unui program executabil care va fi lansat în execuÆie la
sfârçitul instalårii kitului. PuteÆi folosi acest program pentru a vå proteja aplicaÆia
împotriva copierilor ilegale sau pentru a stabili configuraÆia specificå aplicaÆiei.
354 Informatică

5. PrecizaÆi directorul implicit în care se va instala aplicaÆia la destinaÆie - Specify


Default Destination. Aceastå informaÆie o comunicaÆi în caseta de text Default
Directory. Este posibil ca acest director så fie schimbat la instalarea kitului prin
precizarea unui alt director de cåtre persoana care instaleazå aplicaÆia. ScrieÆi în
caseta de text c:\produs. Mai puteÆi så scrieÆi în caseta de text Program Group
numele grupului care va fi adåugat la meniul de start (implicit este Visual FoxPro
Application). Din grupul de butoane radio User can modify puteÆi activa butonul
Directory and program group (utilizatorul poate modifica la instalare çi numele
directorului în care va fi instalatå aplicaÆia çi numele grupului de programe) sau
butonul Directory only (utilizatorul poate modifica la instalare numai numele
directorului).
6. PrecizaÆi caracteristicile fiçierelor care compun aplicaÆia - Change File Setings.
Se deschide tabelul în care sunt memorate datele referitoare la fiçierele incluse în kitul
de instalare. Fiecare rând reprezintå un fiçier, iar fiecare coloanå o caracteristicå a
fiçie-rului. Titlurile coloanelor sunt: File - numele fiçierului, Target Dir - directorul în
care va fi copiat fiçierul la destinaÆie (din lista ascunså puteÆi alege una dintre opÆiunile:
AppDir - directorul aplicaÆiei, WinDir - directorul sistemului de operarea Windows,
WinSysDir - directorul System al sistemului de operarea Windows), PM Item -
activeazå programul Program Manager cu ajutorul cåruia puteÆi stabili proprietåÆi
suplimentare ale fiçierului (de exemplu pictograma), ActiveX - activeazå instalarea
controlului de tip ActiveX la destinaÆie.

7. TerminaÆi procesul de creare al kitului. Pentru aceasta acÆionaÆi butonul Finish.


Se va afiça 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 distribuÆie, deschideÆi
directorul Test çi observaÆi cå el conÆine un director Disk144 (imagine pe disc flexibil) çi în
acest director trei subdirectoare Disk1, Disk2 çi Disk3. Aceste directoare vor fi copiate
fiecare pe câte un disc flexibil.
Elaborarea unor strategii de modularizare şi abstractizare a prelucrării datelor 355

„ Putem så teståm kitul de instalare pe


propriul calculator. DeschideÆi directorul
Disk1 çi lansaÆi în execuÆie programul

setup. VeÆi påstra ca director pentru


aplicaÆie directorul stabilit în kit, aça cå
veÆi acÆiona 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 fiçierele aplicaÆiei. LansaÆi în execuÆie aplicaÆia.

CreaÆi un program monitor folosind tehnica programårii pe obiecte


VeÆi deschide proiectul, veÆi modifica programul monitor, apoi veÆi crea aplica-Æia. Dupå ce aÆi
salvat noua versiune a aplicaÆiei, veÆi 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:


CreaÆi proiectul, aplicaÆia çi kitul de distribuÆie pentru sistemul de meniuri definit anterior,
care este folosit de un profesor pentru a Æine evidenÆa
notelor çi mediilor la disciplina Informaticå.

# ÎncercaÆi:
Adevårat/Fals:
1. Se poate preciza cazul în care o opÆiune de meniu nu este disponibilå.
2. În procedura Setup a meniului se dezactiveazå procesorul de evenimente.
3. Într-o aplicaÆie Visual FoxPro puteÆi crea un meniu de comenzi rapide.
4. Procedura Cleanup se executå înaintea procedurii Setup.
5. Programul monitor se foloseçte pentru a administra proiectul.
6. Proiectul este un program care, dacå este lansat în execuÆie, monitorizeazå aplicaÆia.
7. AplicaÆia este independentå de mediul Visual FoxPro.
CompletaÆi:
1. Mesajul informativ Message se afiçeazå .............................................................
2. Unei opÆiuni de meniu puteÆi så-i asociaÆi un submeniu, o comandå sau..,....................
3. Fiçierul în care se memoreazå tabelul cu structura meniului are extensia ..........
4. CondiÆia prin care testaÆi disponibilitatea unei opÆiuni de meniu este precizatå prin .............
5. Kitul de instalare conÆine programul ...................... care se foloseçte pentru instalarea
aplicaÆiei pe alt calculator.
AlegeÆi råspunsurile corecte:
1. Pentru revenirea din meniul aplicaÆiei în meniul sistemului, trebuie så atribuiÆi cu comanda
set parametrului sysmenu valoarea :
a) off b) automatic c) to default
2. Extensia fiçierului care conÆine meniul executabil este:
a) mnx b) mnt c) mpr d) mpx
3. Extensia fiçierului care conÆine aplicaÆia este:
a) prj b) api c) exe d) app

R åspunsuri:
Adevårat/Fals: 1-A; 2-F; 3-A; 4-F; 5-F; 6-F; 7-F.
CompletaÆi: 1-bara de stare; 2-o procedurå; 3-.mnx; 4-Skip For ; 5-setup.exe
AlegeÆi råspunsurile corecte: 1-c; 2- c; 3- d.

S-ar putea să vă placă și