Sunteți pe pagina 1din 356

Capitolul

Identificarea i clasificarea unor tipuri de structuri de date


Dup ce vei parcurge acest capitol trebuie s tii: 1. 2. 3. 4.

n anii precedeni de studiu, ai nvat c un calculator este o unealt electronic ce v poate ajuta s prelucrai informaia. Informaia prelucrat poate fi format din Cum folosii datele pentru a texte, numere, imagini sau sunete. Ea este pstrat pe prelucra informaiile. diferite medii de memorare, n diferite formate, sub Ce tipuri de date putei folosi. form de date. Aadar, orice rezolvare de problem Cum putei organiza datele ncepe prin definirea datelor, continu cu prelucrarea lor sub form de colecii de date. Ce colecii de date putei folosi (de exemplu atribuirea de valori) i se termin fie cu afiarea valorii lor, fie cu stocarea lor pe un mediu de n procesul de prelucrare a memorare n vederea prelucrrii lor ulterior. datelor.
Ce este o baz de date i cum sunt organizate datele ntr-o baz de date. Ce operaii putei executa pentru a obine informaii n urma prelucrrii datelor dintr-o baz de date.

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

5.

4 Informatic
alocat, algoritmul de codificare, operatorii admii pentru prelucrare i implicit timpul necesr prelucrrii. Analiza datelor se poate face n dou moduri: 9 Logic (la nivelul conceptual). De exemplu, o dat este un numr ntreg pozitiv, cu valori cuprinse ntre 0 i 100. 9 Fizic (la nivelul reprezentrii ei n memoria intern). De exemplu, n limbajul Pascal o dat de tip integer, iar n limbajul C o dat de tip int (dat numeric de tip ntreg) este reprezentat n 2 octei de memorie i permite memorarea datelor cu valori cuprinse ntre -32768 32767. La nivelul limbajului de programare este necesar s fie implementai diferii algoritmi care s permit folosirea acestui tip de dat: algoritmi de ncrcare a valorii datei n zona de memorie, algoritmi de adresare a zonei de memorie alocate, algoritmi de extragere a valorii din zona de memorie etc. Ai mai nvat c exist: 9 Date simple sau date elementare. Sunt date independente unele de altele din punct de vedere al reprezentrii lor n memorie. Chiar dac ele pot depinde din punct de vedere logic (valoarea unei date este dependent de valoarea altei date), ele nu depind din punct de vedere fizic (localizarea unei date pe suportul de memorare nu se face n funcie de locaia unei alte date pe suport). 9 Date compuse sau structuri de date. Sunt colecii de date ntre care exist anumite relaii (relaii structurale). Fiecare component a structurii are o anumit poziie n cadrul structurii, iar toate componentele formeaz un ntreg, astfel nct prelucrarea se poate face att la nivelul structurii de date (care poate fi considerat o entitate de sine stttoare), ct i la nivelul fiecrei componente. Pentru fiecare tip de structur de date n limbajul de programare trebuie s fie definii algoritmi de localizare a componentelor n cadrul structurii de date. ntre componentele structurii exist i legturi de coninut, adic ntregul ansamblu de date din colecie poate caracteriza un obiect, o persoan, un fenomen, un proces etc. De exemplu, un vector cu 12 elemente n care se memoreaz valorile lunare ale unui contor electric. Structura de date caracterizeaz n acest caz un proces: consumul lunar de curent electric. Aadar orice obiect, proces sau fenomen din lumea real poate fi caracterizat printr-o list de atribute. Valorile atributelor din list pot fi reprezentate fizic n calculator (lumea virtual) sub forma unei structuri de date. n anii precedeni de studiu ai lucrat cu urmtoarele structuri fizice de date: Structuri de date n memoria intern n memoria extern

Tabloul de memorie (vectori i matrici)

nregistrarea

Fiierul de date

Structurile de date create n memoria intern sunt temporare dar permit o vitez de prelucrare mult mai mare dect a celor organizate n memorie extern. Pe de alt parte, structurile de date organizate n memoria extern sunt permanente i permit stocarea i prelucrarea unei cantiti mari de date.

Identificarea i clasificarea unor tipuri de structuri de date

Aadar, scopul programelor de calculator este de a prelucra datele pentru a furniza informaii. Aceast informaie poate fi pstrat pe diferite medii de memorare, n diferite formate, sub form de date. ntre datele prelucrate de un program exist diferite relaii. Modul n care vor fi aranjate aceste date n mediul de memorare depinde de legtura dintre ele.

1. Baza de date
Principalele probleme pe care le implic ns o colecie de date format dintr-un ansamblu de fiiere de date sunt: 9 Redundana datelor. Redundana reprezint o proprietate a unei colecii de date i se refer la faptul c unele componente ale coleciei sunt memorate de mai multe ori pe suportul de memorare. Date care reprezint aceeai informaie pot s apar n fiiere de date diferite, de multe ori cu formate de reprezentare diferite. Folosind mai multe copii ale acelorai date se consum inutil suport de memorare. Pe lng acest dezavantaj, mai exist i alte dezavantaje: se consum timpi suplimentari cu actualizarea datelor, deoarece se actualizeaz de mai multe ori acelai set de date (actualizarea se face n fiecare fiier de date n care setul de date apare), actualizarea datelor n toate fiierele de date este un proces dificil (fiecare posesor al unui fiier de date trebuie s fie informat de schimbrile survenite) i nu pot fi controlate erorile aprute n procesul de actualizare a datelor. 9 Actualizarea fiierelor i pstrarea integritii datelor. Actualizarea datelor trebuie s se fac n toate fiierele n care apar. Dac se omite un singur fiier, nu mai este asigurat integritatea datelor, iar rapoartele obinute cu aceste date vor conine informaii greite. 9 Dependena programelor de fiierele de date. Pentru exploatarea i ntreinerea fiecrui fiier de date, programatorii vor scrie cte un program. Orice modificare n structura fiierului de date va avea ca efect modificarea programului de aplicaie. n plus, n loc s se scrie un singur program pentru o colecie de date unic, se scriu mai multe programe, cte unul pentru fiecare colecie. Efectul este creterea costurilor pltite de ctre organizaie pentru programele care trebuie s-i furnizeze informaiile din fiierele de date. Ansamblurile independente de date erau folosite n general n folosul unui singur departament al organizaiei i mai puin n folosul ntregii organizaii. Soluia care poate rezolva aceast problem este reunirea datelor ntr-o colecie unic numit baza de date. n acest mod, organizaia i poate exercita controlul asupra tuturor datelor. Controlul se execut prin intermediul administratorului bazei de date (database administrator - DBA) care este o poziie n cadrul administraiei (ocupat de una sau mai multe persoane) ce are ca atribuie stabilirea datelor care sunt necesare n cadrul organizaiei sau la nivelul fiecrui departament. Administratorul bazei de date mai poate s stabileasc i modul n care se execut accesul la date, adic s hotrasc pentru fiecare persoan din organizaie setul de date din colecia de date la care are acces. Pe parcursul exploatrii bazei de date, el poate s hotrasc modificarea structurii bazei de date n funcie de noile cerine ale utilizatorilor.

6 Informatic

Obiectul: realizarea bazei de date a unei companii.


Analiza sistemului iniial, format din mai multe fiiere de date Relaii cu clienii

Resurse umane

Salarizare

Producie

Marketing

Aprovizionare

Produse Angajai Salarii Vnzri Catalog produse

Stocuri

Furnizori

Clieni

Comenzi

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

Identificarea i clasificarea unor tipuri de structuri de date

Deoarece datele companiei se gsesc n mai multe fiiere de date independente, apar urmtoarele dezavantaje: 1. Departamentele nu pot folosi n comun datele de care au nevoie. ntre fiierele cu date ale departamentelor nu exist posibilitatea de comunicare, iar departamentele nu pot folosi n comun aceste date. De exemplu, dac angajaii implicai n vnzri sunt pltii n funcie de coeficientul vnzrilor lunare i nu conform unui salariu tarifar, informaiile necesare calculrii drepturilor salariale ale acestor persoane se gsesc n fiierul Vnzri. La acest fiier nu are acces funcionarul din departamentul Salarizare care are nevoie de ele pentru a calcula salariul lunar al angajailor ce se ocup cu vnzarea produselor. Aceasta nseamn c o persoan din departamentul Marketing va extrage din fiierul Vnzri o list cu angajaii implicai n vnzri n luna respectiv i cu volumul valoric al vnzrilor fiecruia dintre ei. La rndul su, persoana din departamentul Salarizare va trebui s actualizeze fiierul Salarii pe baza listei primite. 2. Ansamblul de fiiere de date are o redundan foarte mare. Colecia de fiiere de date are o redundan mare deoarece foarte multe din date sunt duplicate, fiind memorate n mai multe fiiere de date. De exemplu, unele informaii despre angajai sunt memorate i n fiierul Salarii aflat n ntreinerea compartimentului Salarizare, dar i n fiierul Angajai aflat n ntreinerea compartimentului Resurse umane sau unele informaii despre produsele realizate pot s apar att n fiierul Produse aflat n ntreinerea compartimentului Producie, ct i n fiierul Catalog_produse aflat n ntreinerea compartimentului Marketing. 3. Orice micare n cadrul companiei necesit intervenia n mai multe fiiere de date. De exemplu, datele despre un client pot s apar att n fiierul Clieni, ct i n fiierul Vnzri. Dac un client i schimb adresa, modificarea trebuie fcut n ambele fiiere. Deci, o persoan din cadrul companiei trebuie s aib grij s informeze cele dou persoane care se ocup de actualizarea celor dou fiiere din cele dou departamente ca s fac aceste modificri. Aceasta nseamn c la nivelul companiei ar trebui s existe o persoan care s aib cunotine despre toate aceste fiiere de date, de structura lor i de toate schimbrile care apar n cadrul companiei i care pot afecta aceste date. Aceast persoan ar trebui s informeze, atunci cnd este cazul, departamentele care trebuie s-i actualizeze datele, ce date trebuie s actualizeze i cu ce valori, altfel nu ar mai putea fi asigurat integritatea datelor. Deficiene pot s apar chiar dac aceast persoan informeaz corect departamentele. Persoana care face modificri ntr-un fiier de date poate s scrie greit o valoare, astfel nct la nivelul companiei, aceeai dat va avea valori diferite, n fiiere diferite. Soluia este reunirea acestor fiiere de date ntr-o singur colecie de date: baza de date. n aceast colecie pot fi eliminate datele duplicate (de exemplu informaiile des-pre un client care apar i n fiierul Clieni i n fiierul Vnzri i n fiierul Comenzi), micorndu-se foarte mult redundana datelor. Deoarece datele se vor gsi o singur dat, n aceeai colecie, actualizarea lor se poate face mult mai uor, asigurndu-se astfel integritatea datelor. n plus, angajaii unui departament pot avea acces i la datele produse de un alt departament. Principala problem care apare n acest caz este ca angajaii unui departament s aib acces numai la datele care le sunt strict necesare i nu la toate datele companiei. De exemplu, persoana care se ocup de coresponden trebuie s aib acces numai la

8 Informatic
adresele angajailor, ale clienilor i ale furnizorilor pentru a putea expedia corespondena, nu i la alte date despre acetia: salariile angajailor, conturile bancare ale clienilor, facturile emise ctre clieni i alte tranzacii financiare fcute de companie. Aadar, principalul avantaj al bazelor de date l reprezint partajarea datelor unei organizaii ntre membrii ei, iar principalul dezavantaj este necesitatea controlrii accesului la datele importante din colecie.

T T

est pentru evaluare:

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

est pentru evaluare:

Considerai c coala voastr este o organizaie format din mai multe compartimente. Analizai activitatea din coala voastr i punei n eviden fiierele de date care pot fi folosite pentru a ine evidena activitilor care au loc la nivelul colii i la nivelul fiecrei clase. Artai care sunt deficienele acestei colecii de fiiere de date.

1.1. Definirea bazei de date


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

Baza de date (database) este o colecie de fiiere i nregistrri legate ntre ele.
Pentru a permite accesul difereniat la datele din colecia de date, se poate defini o schem general a bazei de date care descrie ntreaga colecie de date i diferite scheme pariale care descriu seturile de date din colecie la care pot avea acces anumii utilizatori sau anumite grupuri de utilizatori. Aadar, avantajele folosirii bazelor de date n locul fiierelor de date sunt: 9 Partajarea informaiilor. Spre deosebire de datele din fiierele de date la care au acces numai utilizatorii care le-au creat i le ntrein, la datele din baza de date pot avea acces toi membrii unei organizaii, care i vor partaja datele din baza de date. Pot fi create aplicaii noi care s foloseasc datele din mai multe colecii de date i care s furnizeze informaii noi folosind tot ansamblul de date. n acest mod, fiecare utilizator are senzaia c este beneficiarul unic al coleciei de date.

Identificarea i clasificarea unor tipuri de structuri de date

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

10 Informatic
nevoie de ele. n plus, baza de date poate fi reorganizat (pot fi regrupate cmpurile din nregistrri) pentru a face fa cerinelor unui nou utilizator, fr a fi afectai vechii utilizatori. Eliminarea unor entiti din baza de date poate afecta ns utilizatorii care fac referiri la acele entiti.

1.2. Stratificarea bazei de date


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

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

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

Identificarea i clasificarea unor tipuri de structuri de date


Sistemul de gestiune a bazelor de date

11

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

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


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

12 Informatic
9 Programele de aplicaii sunt uor de scris deoarece ele descriu datele folosind modelul conceptual al bazei de date (numele entitilor care formeaz baza de date) i nu structura fizic a datelor nregistrate pe suportul de memorare.
Sistemul de gestiune a bazelor de date furnizeaz instrumentele necesare pentru manipularea datelor, dintre care cele mai importante sunt: 9 cutarea uneia sau a mai multor entiti care ndeplinesc anumite criterii, 9 sortarea n diferite moduri a diferitelor entiti din baza de date, 9 generarea unor raporte folosind datele stocate n baza de date, 9 generarea unor formulare pentru introducerea i validarea datelor. Baza de date Reprezint un model de organizare a datelor oferit de sistemul de gestiune a bazelor de date folosit. n cazul fiierelor de date exist dou niveluri de organizare a datelor: nivelul logic care const n descrierea structurii de cmpuri de ctre programator i nivelul fizic care const n metodele de nregistrare i regsire a datelor la nivelul suportului de date. n cazul bazelor de date, pentru asigurarea independenei datelor, organizarea trebuie s se fac pe cel puin trei niveluri:

Nivelul extern
(modelul extern) vizualizrile

Nivelul conceptual
(modelul conceptual) descrierea bazei de date

Nivelul intern
(modelul intern) baza de date fizic

Utilizatori Calculator Sistemul e gestiune a bazelor de date

9 Nivelul intern sau baza de date fizic este reprezentat de colecia de fiiere nregistrate pe suportul de memorare, fiiere care conin datele propriu-zise dar i informaiile suplimentare, necesare accesului la datele din baza de date. 9 Nivelul conceptual reprezint descrierea unitilor logice din care este format baza de date i a legturilor dintre ele. Tot n modelul conceptual sunt specificate constrngerile aplicate asupra datelor, care determin restricii ale operaiilor de actualizare. Ele sunt necesare pentru a asigura integritatea datelor. 9 Nivelul extern reprezint modelul extern cu care opereaz utilizatorul bazei de date. Acesta este format din unitile logice de la nivelul conceptual cu care opereaz un utilizator sau un grup de utilizatori. Pentru modelul extern se mai folosete i termenul de vizualizare (view) sau tabel virtual, deoarece se definete pe baza unei expresii

Identificarea i clasificarea unor tipuri de structuri de date

13

relaionale aplicate cmpurilor din tabelele reale ale bazei de date. Vizualizarea pstreaz numai schema prin care este definit, nu i datele propriu-zise, pe care le preia din tabelele reale de fiecare dat cnd este folosit. Cea mai important utilitate a unei vizualizri este aceea c prin intermediul ei se poate controla accesul unui grup de utilizatori la baza de date. Deoarece utilizatorul are acces la baza de date nu prin modelul conceptual, ci prin vizualizri, acestea pot s ascund unui utilizator acele uniti logice la care nu are drept de acces. Vizualizrile pot s controleze i operaiile pe care le poate executa cu unitile logice: unele vizualizri i permit s actualizeze unele uniti logice, altele i permit numai s le consulte. De exemplu, dac se construiete o baz de date a companiei, n tabelul Angajai este nregistrat data naterii pentru fiecare angajat. Dac o anumit categorie de utilizatori (de exemplu personalul din compartimentul Resurse Umane) dorete o list cu angajaii dintr-un compartiment i vrsta lor, nu se recomand nregistrarea vrstei ca unitate logic n modelul conceptual deoarece ar trebui actualizat zi de zi. Cel mai simplu este s se creeze o vizualizare pentru aceast categorie de utilizatori n care se definete entitatea vrst. Aceast entitate se calculeaz ca diferen dintre data curent furnizat de sistem i data naterii nregistrat ntr-unul din tabelele bazei de date. est pentru evaluare:

n baza de date avei un tabel cu notele elevilor, care are urmtoarele cmpuri: codul elevului, disciplina, data notrii, nota. Pentru a afla mediile semestriale ale elevilor dintr-o clas la fiecare disciplin, ce soluie se poate alege: s se creeze un tabel cu mediile elevilor (care s aib urmtoarea structur: codul elevului, codul disciplinei, media) sau s se creeze o vizualizare cu aceeai structur? Modelul de date ofer instrumentele necesare interpretrii datelor din colecia de date. El este format din dou componente: 9 un set de reguli pentru organizarea i structurarea datelor, 9 un set de reguli care definesc operaiile pentru manipularea datelor. Se pot folosi mai multe modele pentru organizarea bazelor de date.

1.3. Clasificarea bazelor de date


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

14 Informatic
Baze de date ierarhice (hierarchical database). n acest model de organizare a bazelor de date entitile (cmpurile i nregistrrile) sunt structurate sub form de noduri. Nodurile sunt puncte care conecteaz ramurile unui arbore descendent. Un nod de pe nivelul inferior este subordonat unui singur nod din nivelul ierarhic imediat superior, dar poate fi n relaie cu n noduri aflate la nivelul inferior. Altfel spus fiecare entitate are un singur nod printe (parent node), dar un printe poate avea mai multe noduri copil (child nodes). Pentru a gsi un anumit cmp trebuie s se porneasc cu nodul printe de pe primul nivel i s se coboare pe arbore pn la copilul care conine acel cmp. Un exemplu de organizare ierarhic este baza de date pentru sistemul de rezervri la liniile aeriene, structurat pe 4 niveluri. Nodul printe de pe primul nivel este oraul de plecare Bucureti. Acest printe are patru copii: Cluj, Constana, Iai i Timioara, care reprezint oraele de sosire. Nodul Timioara are la rndul su doi copii: 210 i 211 care reprezint numrul zborurilor. Zborul 210 are la rndul su trei copii, pasagerii.
plecare
Cluj Constana Bucureti

sosire numr zbor pasager

Iai

Timioara

210

211

Ionescu Alexandru

Clin Mircea

Andronescu Ana

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

Identificarea i clasificarea unor tipuri de structuri de date

15

bluri, iar fiecare ansamblu poate intra n componena mai multor produse. n acest exemplu se poate observa c organizarea de tip reea este mai flexibil i n multe cazuri mai eficient dect cea ierarhic. Baze de date relaionale (relational database). Cel mai flexibil model de organizare l reprezint bazele de date relaionale, n care nu exist o cale de acces ierarhizat la o anumit dat. Baza de date este format din mai multe tabele, fiecare dintre ele fiind format din linii i coloane. Un tabel este numit o relaie. elevi
identif. elev nume prenume ... adresa identif. dat elev absen

absene
identif. identif. disciplin profesor

discipline
identif. nume disciplin ........... identif. profesor

profesori
nume .............

S construim o baz de date a colii. S considerm tabelul elevi care conine date despre elevii colii: identificatorul elevului, numele, prenumele, data naterii, numrul de telefon i adresa. Un alt tabel, absene, conine date despre absenele elevilor din toat coala: identificatorul elevului, data absenei, identificatorul disciplinei i identificatorul profesorului. Aceste dou tabele sunt legate printr-un cmp comun numit cmp cheie. n acest caz, cmpul cheie este identificatorul elevului. Aceasta nseamn c ntre tabelul elevi i tabelul absene s-a stabilit o relaie prin intermediul unui cmp cheie care conine o informaie comun ambelor tabele i anume identificatorul elevului. n tabelul profesori se pstreaz date despre profesorii din coal: nume, prenume, discipline la care predau, grad didactic, adres, numr telefon etc. Tabelul profesori se leag de tabelul absene prin cmpul cheie identificatorul profesorului. n tabelul discipline se pstreaz date despre disciplinele predate n coal: nume, profilul clasei i anul de studiu, numrul de ore etc. Tabelul discipline se leag de tabelul absene prin cmpul cheie identificatorul disciplinei. Aceste patru tabele formeaz mpreun o baz de date relaional (relational database). Baza de date a colii mai poate fi completat i cu alte tabele ca de exemplu, tabelul cu date despre prinii elevilor (prini) care se va lega de tabelul elevi prin cmpul cheie identificatorul elevului, tabelul cu date despre notele elevilor (note) care se va lega de tabelul elevi prin cmpul cheie identificatorul elevului, de tabelul profesori prin cmpul cheie identificatorul profesorului i de tabelul discipline prin cmpul cheie identificatorul disciplinei, tabelul cu date despre clase (clase) care conine date despre clasele din coal (identificator clas, an de studiu, identificatorul profesorului diriginte) care se va lega de tabelul elevi prin cmpul cheie identificatorul clasei, iar de tabelul profesori prin cmpul cheie identificatorul profesorului etc.

16 Informatic
Fiecare rnd din tabel n care se gsesc informaii despre un elev corespunde unei nregistrri de date. Fiecare coloan cu informaii corespunde unui cmp (de exemplu, coloana adres). Capul de tabel (antetul tabelului) definete structura tabelului i se mai numete i nregistrare de structur. Datele sunt nregistrate n baza de date prin intermediul structurii definite n nregistrarea de structur. La crearea unui tabel trebuie definit mai nti structura tabelului (capul de tabel), adic trebuie precizate cmpurile care o compun, ct i caracteristicile acestora.

2. Bazele de date relaionale


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

Deoarece interfeele puse la dispoziie de sistemele de gestiune a bazelor de date relaionale folosesc n general termenii de tabel (table), cmp (field) i nregistrare (record), vom folosi n continuare aceti termeni pentru a defini obiectele corespunztoare ale bazei de date.

Identificarea i clasificarea unor tipuri de structuri de date

17

Coloane = Cmpuri Relaii ntre tabele Rnduri = nregistrri

Tabelele Baza de date relaional


Procesul de construire a unei baze de date se desfoar n dou etape: 1. Construirea tabelelor care compun baza de date. Aceasta nseamn c pentru fiecare tabel din baza de date trebuie definit structura, adic ansamblul de cmpuri mpreun cu proprietile lor. Dup definirea structurii ncepe ncrcarea datelor n tabel. La nivelul tabelului entitatea prelucrat este nregistrarea: se pot aduga nregistrri, se pot terge nregistrri, se pot modifica nregistrri. Se poate modifica structura unui tabel chiar dup ce a fost ncrcat cu date. Sistemul de gestiune a bazelor de date nu opereaz modificarea de structur direct n tabel, ci execut urmtoarele operaii: creeaz noua structur de tabel (rezultat n urma modificrilor cerute), ncarc n noul tabel datele din vechiul tabel i terge vechiul tabel. Toate aceste operaii sunt executate automat de ctre sistem, fr intervenia utilizatorului i fr a fi vizibile pentru utilizator. 2. Stabilirea relaiilor ntre tabele. Relaiile care se vor stabili ntre tabele sunt unidirecionale, adic ntre dou tabele nu se stabilete o relaie de egalitate ci o relaie de subordonare: unul dintre tabele este tabelul conductor sau principal (tabelul de la care pornete legtura), iar cellalt este tabelul condus sau secundar (tabelul la care ajunge legtura). Tabelul condus este subordonat tabelului conductor. Aceasta nseamn c dac utilizatorul selecteaz o nregistrare n tabelul conductor, sistemul va selecta automat nregistrarea de care este legat din tabelul condus. De obicei, modelul relaional cel mai des ntlnit este cel descris printr-un arbore cu o singur rdcin, adic n baza de date exist un singur tabel conductor care reprezint rdcina arborelui. Celelalte tabele sunt legate de tabelul conductor direct sau indirect (prin intermediul altor tabele).

18 Informatic

Tabelul conductor nregistrarea 1 nregistrarea 2 nregistrarea 3 nregistrarea 4 nregistrarea 5 nregistrarea 6

Tabelul condus nregistrarea 1 nregistrarea 2 nregistrarea 3 nregistrarea 4 nregistrarea 5 nregistrarea 6

Definirea unei relaii ntre cele dou tabele are ca efect stabilirea unor legturi ntre nregistrrile celor dou tabele.

nregistrarea este selectat printr-o comand a utilizatorului.

nregistrarea este selectat automat de sistem.

Pentru a putea stabili legturi ntre tabele, se definesc n tabele chei de identificare. Cheia de identificare este format din numrul minim de cmpuri alese astfel nct ansamblul lor de valori s fie unic n cadrul unui tabel pentru a permite identificarea nregistrrilor din tabel. Aadar, fiecare nregistrare va putea fi identificat n mod unic prin valorile cheii astfel definite. Este posibil ca ntr-un tabel s poat fi evideniate mai multe grupuri de cmpuri care s permit identificarea n mod unic a nregistrrilor tabelului, deci pot fi definite mai multe chei de identificare. Deoarece un tabel nu poate avea dou nregistrri identice, orice tabel poate avea cel puin o cheie de identificare, format n cel mai ru caz din toate cmpurile nregistrrii. Cheia primar este aleas din mulimea cheilor de identificare pe baza anumitor criterii i este folosit pentru a face legtura ntre nregistrrile mai multor tabele ale bazei de date. Cheia primar va fi folosit de sistemul de gestiune a bazelor de date pentru a identifica unic nregistrrile n procesul de cutare i regsire a datelor. Se recomand ca din mulimea cheilor de identificare s se aleag, pentru cheia primar, cheia care este format din cele mai puine cmpuri. Cheia secundar este format dintr-unul sau mai multe cmpuri dintr-un tabel, care sunt folosite ca o cheie primar n alt tabel, valorile cmpurilor din cheie fiind identice n ambele tabele. Se mai numete i cheie strin. Legtura dintre tabelele bazei de date se realizeaz prin mecanismul de propagare a cheilor. n tabelul surs, tabelul de la care ncepe propagarea cheii (tabelul conductor), se gsete cheia primar, iar n tabelul destinaie, tabelul pn la care se propag cheia (tabel condus), se gsete cheia secundar. Se spune c a avut loc propagarea cheii din tabelul surs n tabelul destinaie. Acest mecanism permite stabilirea legturii ntre o nregistrare din tabelul surs i o nregistrare din tabelul destinaie. Condiia care trebuie respectat pentru a putea fi asigurat aceast legtur se numete condiia de integritate referenial.

Identificarea i clasificarea unor tipuri de structuri de date

19

Integritatea referenial
Este specific relaiilor dintre tabelele bazei de date. Ea nseamn o colecie de reguli i restricii impuse tabelelor ntre care s-au stabilit relaii. Astfel, a asigura integritatea referenial nseamn ca atunci cnd se fac modificri ale valorii unui cmp dintr-un tabel s nu fie afectat relaia dintre tabele. Aceast problem apare n cazul cmpurilor care fac parte dintr-o cheie primar sau secundar. Ele trebuie s respecte condiia de integritate referenial.

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

20 Informatic

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


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

Identificarea i clasificarea unor tipuri de structuri de date

21

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

Obiectul: baza de date a unei companii.


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

22 Informatic
9 Tabelul Produse n care sunt pstrate date despre produsele realizate: codul produsului, denumirea produsului, unitatea de msur, cantitatea, data la care a fost realizat produsul, preul de fabricaie etc. 9 Tabelul Catalog_produse n care sunt pstrate date despre produsele oferite de companie: codul produsului, denumirea produsului, descrierea produsului, unitatea de msur, preul etc.
n aceste tabele apar mai multe cmpuri de tip: cod produs, cod angajat, cod client sau cod furnizor. Ele se folosesc pentru a identifica unic nregistrrile din tabele. Pentru aceste tabele pot fi definite diferite chei de identificare. De exemplu, pentru tabelul Angajai se poate folosi pentru cheie cmpul cod_angajat sau cod_numeric_personal deoarece ele identific unic un angajat din tabel. Cmpurile nume_prenume, funcie sau departament nu pot fi folosite pentru cheia de identificare pentru c ele nu pot identifica unic nregistrrile din tabel (angajaii) deoarece pot exista mai muli angajai care au acelai nume i prenume sau care au aceeai funcie ori lucreaz n acelai departament. Cmpurile cod_angajat i cod_numeric_personal nu pot forma mpreun o cheie de identificare deoarece cheia presupune numrul minim de cmpuri necesar identificrii, iar n acest exemplu, fiecare cmp n parte este suficient pentru identificarea angajatului. Pentru tabelul Stocuri sunt necesare dou cmpuri pentru a obine cheia de identificare a unei nregistrri: cod_material i cod_depozit, deoarece fiecare dintre aceste cmpuri luate separat nu pot identifica unic o nregistrare din tabel: exist mai multe cmpuri cod_material cu aceeai valoare, cte unul pentru fiecare depozit n care se gsete n stoc acel material i mai multe cmpuri cod_depozit cu aceeai valoare, cte unul pentru fiecare material care exist n acel depozit. Dac n tabelul Clieni cmpul cod_client este cheie primar deoarece el identific unic un client, n tabelul Comenzi el va fi cheie secundar i va permite stabilirea unei relaii ntre tabelul Clieni i tabelul Comenzi. Pentru a fi ndeplinit condiia de integritate referenial, nu trebuie s existe nici o comand n tabelul Comenzi care s nu corespund unui client din tabelul Clieni.

Salarii

Catalog produse

Clieni

Catalog materiale

Furnizori

Angajai

Vnzri

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 legturi. De exemplu, ntre tabelul Catalog_produse i tabelul Produse sau ntre tabelul Catalog_produse i tabelul Vnzri prin intermediul cheii cod_produs. Baza de date poate conine: 9 Tabele corelate. Sunt tabele ntre care se stabilesc legturi. De exemplu, ntre tabelele Clieni i Comenzi exist o legtur realizat prin intermediul codului clientului care a emis comanda (cheia cod_client). 9 Tabele necorelate. Sunt tabele ntre care nu se stabilesc legturi. De exemplu, ntre tabelele Stocuri i Salarii nu exist nici un fel de legtur. n acest caz tabelele se folosesc pentru a separa date diferite ntre ele.

est pentru evaluare:

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

Relaia
Este o legtur dintre un cmp sau o combinaie de cmpuri dintr-un tabel (cheia primar) i cmpurile corespunztoare dintr-un alt tabel (cheia secundar). Exist mai multe tipuri de relaii: 1. Una-la-una (one-to-one). nseamn c o nregistrare din primul tabel este legat la o singur nregistrare din al doilea tabel. Este posibil i cazul n care o nregistrare din primul tabel nu este legat cu nici o nregistrare din al doilea tabel. Aceast relaie este similar cu un tabel care conine ambele tabele. Se folosesc ns dou tabele din urmtoarele motive: Tabelul A Tabelul B 9 Un tabel unic ar fi un tabel foarte mare, cu o structur care poate depi numrul maxim de cmpuri a1 b1 acceptat de sistemul de gestiune a a2 b2 bazelor de date (de exemplu, 255 de cmpuri n Visual FoxPro). a3 b3 9 Numrul de cmpuri din nregisa4 b4 trrile tabelului nu sunt fixe (unele nregistrri au nevoie de mai multe a5 cmpuri dect alte nregistrri). 9 Dac se lucreaz ntr-o reea de calculatoare, se prefer ca anumite cmpuri din tabel s se pstreze pe calculatorul local i nu pe serverul de fiiere. 9 Un grup de date dintr-un tabel sunt legate de un tabel, iar un alt grup de date din tabel sunt legate de un alt tabel sau nu sunt legate de nici un tabel.

24 Informatic
9 Asupra unui grup de date din tabel se execut un anumit gen de operaii, iar asupra altui grup de date din tabel se execut alt gen de operaii.
De exemplu, relaia stabilit ntre tabelele Salarii i Angajai este de una-la-una deoarece unui angajat i corespunde un singur salariu, iar un salariu corespunde unui singur angajat. Legtura ntre cele dou tabele se face prin intermediul cmpului cod_angajat. Chiar dac cele dou tabele ar putea fi reunite ntr-unul singur, nu se recomand acest lucru deoarece asupra acestor date nu se execut acelai gen de operaii n cadrul organizaiei. Datele din tabelul Agajai sunt folosite de departamentul Personal atunci cnd trebuie luate decizii referitoare la angajaii companiei. Acest tabel conine datele generale ale fiecrui angajat care sunt necesare atunci cnd trebuie promovat, penalizat, disponibilizat sau cnd trebuie localizat (adres, telefon) pentru a i se transmite o anumit informaie. Datele din tabelul Salarii sunt folosite de departamentul Salarizare atunci cnd trebuie calculate drepturile salariale ale fiecrui angajat sau datoriile companiei ctre bugetul statului i ctre asigurri, legate de angajaii si. Acest tabel conine informaii necesare pentru calculul lunar al salariului fiecrui angajat. (one-to-many). 2. Una-la-mai-multe nseamn c o nregistrare din primul tabel poate fi legat cu mai multe nregistrri din al doilea tabel. Tabelul A a1 Tabelul B b1

b2 Este cel mai rspndit tip de relaie. b3 Primul tabel trebuie s aib un cmp cheie primar, iar al doilea tabel a2 b4 trebuie s conin un cmp similar, prin care s se poat identifica nregistrarea din primul tabel de care este legat nregistrarea din al doilea tabel. Un exemplu de relaie una la mai multe este cea stabilit ntre tabelul Clieni i tabelul Comenzi. Unui client i corespund mai multe comenzi, dar o comand poate fi emis de ctre un singur client. Cmpul cheie folosit pentru legtur este cod_client. 3. Mai-multe-la-mai-multe (many-to-many). nseamn c o nregistrare din primul tabel poate fi legat de mai multe nregistrri din al doilea tabel, i invers, o nregistrare din cel de-al doilea tabel poate fi legat de una sau mai multe nregistrri din primul tabel. De exemplu, ntre tabelul Vnztori i Tabelul A Tabelul B tabelul Produse poate fi stabilit o relaie de mai-multe-la-mai-multe: un angajat comercial poate vinde mai multe a1 b1 produse, iar un produs este vndut de a2 b2 mai muli angajai comerciali. Relaia mai-multe-la-mai-multe poate fi desa3 b3 compus n dou relaii una-la-maia4 b4 multe. n acest caz se construiete un tabel suplimentar care s realizeze aceast descompunere. De exemplu, n baza de date coala pot fi definite un tabel Elevi cu elevii din coal i un alt tabel Discipline cu disciplinele predate n coal. Fiecrei nregistrri din tabelul Elevi i corespund mai multe nregistrri n tabelul Discipline (un elev studiaz mai multe discipline) i fiecrei nregistrri

Identificarea i clasificarea unor tipuri de structuri de date

25

din tabelul Discipline i corespund mai multe nregistrri n tabelul Elevi (o disciplin este studiat de mai muli elevi). Aceast relaie se poate descompune n dou relaii una-la-maimulte prin crearea unui tabel suplimentar ncadrri care s conin nregistrri cu dou cmpuri: cod_elev i cod_disciplin. Relaiile vor fi de una-la-mai-multe ntre tabelul Elevi i tabelul ncadrri (unui elev i corespund mai multe ncadrri, cte una pentru fiecare disciplin pe care o studiaz) i ntre tabelul Discipline i tabelul ncadrri (unei discipline i corespund mai multe ncadrri, cte una pentru fiecare elev care o studiaz).

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


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

Unele firme, cum este Microsoft, produc i alte SGBD-uri relaionale (FoxPro). Toate aceste sisteme de gestiune a bazelor de date sunt orientate pe microcalculatoare i reele de microcalculatoare. ns cel mai utilizat SGBD relaional din ntreaga lume rmne n continuare Oracle produs de firma Oracle Corporation, deoarece are urmtoarelor avantaje: 9 Poate fi folosit cu diferite sisteme de operare: Windows pentru microcalculatoarele compatibile IBM i System pentru calculatoarele Macintosh, Unix pentru microcalculatoare i minicalculatoare i sisteme de operare pentru calculatoare mari (mainframe). 9 Permite dezvoltarea unor baze de date de orice dimensiune (de la civa octei pn la gigaoctei). 9 Respect standardele n vigoare referitoare la limbajele de accesare a datelor (SQL). 9 Accept un numr mare de utilizatori simultani, minimiznd conflictele care pot s apar n cererile simultane de acces la date. 9 Asigur o securitate mrit datorit siguranei foarte mari la limitarea i monitorizarea accesului la date. Funciile unui sistem de gestiune a bazelor de date relaionale sunt: 9 memorarea, actualizarea (adugarea, tergerea i modificarea) i regsirea datelor din baza de date (utilizatorul poate crea i manipula datele fr s cunoasc modul n care sunt stocate pe mediul de memorare), 9 crearea i ntreinerea dicionarului de date, 9 asigurarea acesului rapid la datele din colecia de date, 9 pstrarea unei copii de siguran a datelor pentru a putea fi recuperate n cazul n care au loc ntreruperi accidentale ale funcionrii sistemului,

26 Informatic
9 asigurarea securitii datelor, 9 asigurarea accesului simultan al mai multor utilizatori la o nregistrare din baza de date (eventual asigurarea accesului concurent), 9 asigurarea integritii datelor (se pot introduce n baza de date numai date valide, iar operaiile de actualizare nu distrug legturile dintre tabele).
Sistemele de gestiune a bazelor de date relaionale v pot pune la dispoziie urmtoarele metode prin care s asigurai securitatea bazei de date: Parol la nivelul ntregii baze de date Aceast metod permite asigurarea securitii la nivelul bazei de date. Este cea mai simpl metod de asigurare a securitii i cel mai rapid de realizat. Se atribuie o singur parol pentru ntreaga baz de date. Orice persoan care dorete s foloseasc baza de date trebuie mai nti s introduc parola. Dac parola este corect, se obine accesul la baza de date i toate obiectele bazei de date i vor fi disponibile. Metoda este eficient numai n cazul unui birou mic i cu un numr foarte mic de utilizatori ai bazei de date (eventual unul singur). Acetia se pot asigura astfel c nici o persoan neautorizat (din afara biroului) nu are acces la baza de date. Drepturi specifice acordate utilizatorilor sau grupurilor de utilizatori Aceast metod permite asigurarea securitii la nivelul utilizatorului. Utilizatorii pot avea drepturi diferite asupra aceleiai baze de date prin folosirea schemelor pariale. Fiecare utilizator deine propria parol, care este unic i nu are legtur cu parolele celorlali utilizatori. La nceperea sesiunii de lucru, utilizatorul introduce numele de utilizator i parola. Sistemul de gestiune a bazelor de date verific dac sunt corecte i dac da, determin drepturile asociate utilizatorului respectiv (schema parial la care are acces). Utilizatorii pot fi organizai pe grupuri i pot fi atribuite drepturi la nivel de grup, la nivel de utilizator sau la ambele niveluri. Grupurile sunt categorii de utilizatori care au aceleai drepturi de a folosi baza de date. Utilizatorul poate s fac parte dintr-un grup sau din mai multe grupuri. El va moteni drepturile grupului cel mai puin restrictiv din care face parte. La aceste drepturi se vor aduga drepturile proprii. Prin aceast metod pot fi personalizate uor drepturile fiecrui utilizator asupra obiectelor din baza de date. Informaiile despre utilizatori i grupurile de utilizatori se pstreaz la nivelul bazei de date, iar drepturile de folosire a obiectelor bazei de date se pstreaz n cadrul tabelelor. Folosirea grupurilor de utilizatori uureaz mult munca de asigurare a securitii bazei de date. Mai nti se organizeaz drepturile de acces pe grupuri logice i apoi se ataeaz utilizatorii la aceste grupuri. Drepturile unui utilizator pot fi uor modificate prin simpla mutare a utilizatorului dintr-un grup n altul. De exemplu, pot fi definite trei grupuri de utilizatori ai unei baze de date relaionale Angajai: primul grup poate vizualiza i actualiza (modifica, aduga, terge) baza de date, al doilea grup poate doar vizualiza baza de date, iar al treilea grup poate vizualiza numai anumite cmpuri ale bazei de date (de exemplu, numai numele i adresa). Dac utilizatorul este promovat n funcie i primete noi drepturi de folosire a bazei de date, el va fi mutat n grupul corespunztor acestor drepturi. Criptarea bazei de date Primele dou metode se refer la protejarea folosirii bazei de date de ctre persoane neautorizate prin intermediul sistemului de gestiune a bazelor de date, dar ele nu

Identificarea i clasificarea unor tipuri de structuri de date

27

mpiedic vizualizarea datelor din tabele cu ajutorul altor aplicaii care pot s citeasc texte (procesoare de texte, editoare de texte etc.). Singura metod prin care se poate mpiedica vizualizarea datelor este cea de criptare a datelor. Elementele folosite de sistemul de gestiune a bazelor de date relaionale pentru ai realiza funciile sunt: Dicionarul de date (Data Dictionary) conine descrierea structurii datelor folosite n baza de date. El este generat automat la crearea bazei de date i conine informaii referitoare la tabelele bazei de date, la fiierele ajuttoare folosite n exploatarea tabelelor i la modul n care pot fi localizate pe disc. De obicei aceste informaii sunt despre: 9 ce date sunt disponibile, 9 unde sunt localizate datele, 9 descrierea datelor, 9 legturile dintre date, 9 cum pot fi folosite datele, 9 cine este proprietarul lor, 9 cui i se permite accesul la consultarea datelor, 9 cui i se permite accesul la actualizarea datelor, 9 limitrile n exploatare generate din necesitatea de a asigura securitatea i confidenialitatea datelor. n dicionarul de date se gsesc tabele care conin datele bazei de date n formatul intern al sistemului de gestiune a bazelor de date folosit, precum i vizualizrile (tabele virtuale) care sintetizeaz datele din tabelele reale i prezint informaia ntr-un format accesibil utilizatorului. Actualizarea dicionarului de date se face folosind limbajul dicionarului de date (Data Dictionary Language). Accesul la dicionarul de date este permis numai dac baza de date este deschis. Limbajul de manipulare a datelor (Data Manipulation Language). Este un limbaj folosit de sistemul de gestiune a bazelor de date pentru gestionarea dicionarului de date prin operaii de inserare i actualizare a datelor. El permite efectuarea calculelor matematice i statistice care pot fi folosite apoi n generarea rapoartelor. Limbajul de interogare (Query Language). Este un limbaj accesibil, uor de neles i de folosit de marea majoritate a utilizatorilor. Deseori el se confund cu limbajul de manipulare a datelor. El asigur accesul la datele din baza de date, regsirea i afiarea lor.

Interogarea (query) sau cererea de nregistrri este un proces prin care se extrag din
baza de date i sunt prezentate n vederea utilizrii acele nregistrri care satisfac anumite criterii. Iat cteva exemple de interogri ale bazei de date a companiei: 9 Identificarea tuturor clienilor dintr-un jude. 9 Afiarea tuturor comenzilor dintr-o perioad de timp pentru un anumit produs sau pentru toate produsele. 9 Afiarea informaiilor despre un client identificat dup numrul su de cod sau dup numele su.

28 Informatic
Interogare Terminal

Sistemul de gestiune a bazelor de date

9 Stabilirea volumului mediu de comenzi ntr-o perioad de timp pentru un anumit produs. 9 Stabilirea produsului care a fost cel mai bine vndut ntr-o anumit perioad de timp. 9 Afiarea pentru fiecare produs a cantitii maxime vndute ntr-o anumit perioad de timp. 9 Afiarea listei de materiale care au stocul 0. 9 Afiarea listei de materiale care sunt sub stocul de siguran admis pentru a asigura fluxul produciei.
Rspuns Terminal

Identificarea cererii de date

Dicionarul de date

Determinarea locaiilor n baza de date

Limbajul de manipulare a datelor

Baza de date

9 Afiarea listei cu clienii care au comandat produse care nu exist n acest moment n stoc (numele clientului, numele persoanei de contact i numrul de telefon). 9 Afiarea unei liste cu clienii care nu au avut comenzi ntr-o perioad de timp precizat. 9 Afiarea unitilor vndute pentru fiecare produs ntr-o perioad de timp. 9 Afiarea informaiilor despre un client identificat dup numrul su de cod sau dup nume.

SQL (Structured Query Language - limbaj structurat de interogare) este cel mai rspndit limbaj de interogare a bazelor de date relaionale. Este un limbaj standardizat care a fost creat special pentru a putea fi folosit la interogarea, actualizarea i gestionarea bazelor de date. Instruciunile SQL descriu operaiile relaionale ntre tabele, ca de exemplu Select, Project i Join. Limbajul SQL nu opereaz cu datele propriu-zise (variabile de memorie i cmpuri) ci cu relaiile dintre tabele. Limbajul SQL poate fi folosit mpreun cu un limbaj gazd sau n unele cazuri este inclus n limbajul gazd (cum este de exemplu limbajul gazd al sistemului de gestiune a bazelor de date FoxPro). Limbajul SQL este deosebit de un limbaj procedural (aa cum sunt limbajele Pascal, C, Basic etc.). Limbajul procedural duce la construirea unor programe prin care i se arat calculatorului ce trebuie s fac n conformitate cu algoritmul de rezolvare a problemei, descris prin instruciuni (prin care i se spune calculatorului pas cu pas ce trebuie s execute). Pe baza acestor programe, calculatorul execut instruciune dup instruciune respectnd cele trei tipuri de structuri de control: secvenial, alternativ i repetitiv. Limbajul SQL este un limbaj de rezultate: el i spune calculatorului ce dorete utilizatorul s obin i nu ce aciuni trebuie s efectueze ca s obin acele rezultate. Elementul fundamental al

Identificarea i clasificarea unor tipuri de structuri de date

29

oricrei interogri SQL este cuvntul cheie Select cu care ncepe fiecare instruciune SQL folosit pentru interogarea bazei de date. De exemplu, sistemul de gestiune a bazelor de date relaionale FoxPro are implementat un limbaj propriu specializat, dar nelege i limbajul SQL.

2.2. Normalizarea unei bazei de date


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

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


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

30 Informatic
de date a unui client care are dou adrese. Prin eliminarea dependenelor funcionale se micoreaz redundana datelor i anomaliile care pot s apar atunci cnd se adaug i se terg nregistrri sau atunci cnd se modific valoarea cmpurilor. Principala cale prin care se pot elimina dependeele funcionale din cadrul tabelelor este descompunerea lor n tabele din ce n ce mai simple. Dependena multivaloric se refer la faptul c valoarea unui cmp x poate forma cte o nregistrare cu toate combinaiile posibile ale valorilor cmpurilor y i z - cu toate perechile de valori (y,z) din produsul cartezian al mulimilor Y i Z, mulimi care specific domeniul de definiie al cmpurilor y i z pentru valoarea cmpului x. De exemplu, pentru obinerea unui atestat, o mulime Y de elevi trebuie s fie ndrumat de o mulime Z de profesori, fiind posibil pentru acelai tip de atestat orice combinaie de elev-profesor din cele dou mulimi. Tabelul format din cele trei cmpuri: tip_atestat, nume_elev, nume_profesor conine dependene multivalorice. Pentru a elimina anomaliile de exploatare a unei baze de date, ntr-un tabel trebuie s existe o singur dependen multivaloare, adic trebuie descompus tabelul astfel nct s fie respectat aceast condiie. n acest caz se obin trei tabele: Atestat_elevi (conine cmpurile tip_atestat, nume_elev, adic atribuiri prin care se poate afla ce atestat va susine fiecare elev), Atestat_profesori (conine cmpurile tip_atestat, nume_profesor, adic atribuiri prin care se poate afla ce atestat poate ndruma fiecare profesor) i Atestat (conine cmpurile nume_elev, nume_profesor, adic atribuiri prin care se poate afla ce profesor ndrum fiecare elev pentru atestat). Toate aceste dependene care exist n cadrul unui tabel pot genera diferite anomalii n timpul executrii operaiilor de actualizare a bazei de date, anomalii care sunt generate n special din cauza redundanei datelor. Pentru a evita aceste anomalii trebuie nlocuit tabelul care le genereaz cu alte tabele n care dependenele sunt supuse unor restricii. Formele echivalente astfel obinute se numesc forme normale. Exist cinci niveluri de normalizare: primele trei acioneaz asupra dependenelor funcionale i ultimele dou asupra dependenelor multivalorice. De obicei baza de date se gndete iniial sub forma unui singur tabel, dup care tabelul respectiv se normalizeaz trecndu-l prin cele cinci forme normale. Deoarece n proiectarea unei baze de date primele trei forme sunt cele mai des ntlnite, n continuare vor fi prezentate numai acestea, pentru a nelege ce nseamn procesul de normalizare a bazei de date.

Prima form normal


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

Identificarea i clasificarea unor tipuri de structuri de date

31

n care a evoluat profesional n cadrul companiei (funcia, departamentul, data la care a fost angajat n funcie, data la care a fost schimbat din funcie i motivul: promovare, retrogradare din cauza absenelor nemotivate, retrogradare din cauza incompetenei etc.). Se observ c pentru acelai angajat exist mai multe ansambluri de cmpuri (funcie, departament, data_inial, data_final, motiv_schimbare), n cazul n care a ocupat mai multe posturi n cadrul companiei, cte un ansamblu pentru fiecare post ocupat. Vom numi post acest ansamblu de cmpuri. Numrul de repetri ale ansamblului post pentru un angajat nu poate fi precizat. Unii angajai au ocupat aceeai funcie de la angajare, alii i-au schimbat funcia de cinci ori. Deci exist mai multe cmpuri compuse post cu aceeai semnificaie pentru informaia pe care o reprezint (funcie, perioada ocuprii funciei i motivul schimbrii funciei).
Cod_angajat Nume_prenume Cod_numeric ... Post1 ... Post5

Informaii generale despre salariat. Fiecrui salariat i corespunde o singur nregistrare n tabel.

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

Funcie

Departament

Data_iniial

Data_final

Motiv_schimbare

Cod_ angajat

Nume_ prenume

Cod_ numeric

...

Funcie

Departament

...

Motiv_ schimbare

Fiecare nregistrare conine informaii generale despre salariat i informaii despre un post ocupat. Pentru un salariat pot exista mai multe nregistrri, cte una pentru fiecare post ocupat.

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

32 Informatic
acelai angajat, cte una pentru fiecare schimbare de funcie. Cmpul schimbare_funcie va nregistra cronologic a cta schimbare de funcie reprezint nregistrarea. Se observ c n tabelul Angajai, pentru funcie i pentru departament exist un singur cmp care nu poate identifica unic aceste date deoarece sunt dependente de irul de caractere introdus de la tastatur (persoane diferite pot scrie diferit acelai nume de funcie sau acelai nume de departament). Din aceast cauz se atribuie fiecrei funcii un cod numeric unic cod_funcie i fiecrui departament un cod numeric unic cod_departament. n acest mod cmpurile funcie i departament vor deveni cmpuri compuse fiecare din cte dou cmpuri elementare. Cmpul compus funcie poate fi descompus n cmpurile elementare cod_funcie i denumire_funcie, iar cmpul compus departament poate fi descompus n cmpurile elementare cod_departament i denumire_departament. n acest mod vor aprea dou noi tabele: tabelul Funcii care conine cmpurile cod_funcie, denumire_funcie i tabelul Departamente care conine cmpurile cod_departament, denumire_departament. n acest caz tabelul Angajaii va fi format din: cod_angajat, nume_prenume, cod_numeric, adres, telefon, studii, data_naterii, data_angajrii, schimbare_funcie, cod_funcie, cod_departament, data_inial, data_final, motiv_schimbare. ntre tabelul Angajat i tabelul Funcii va exista o legtur prin intermediul cmpului cod_funcie care este cheie primar n tabelul Funcii i cheie secundar n tabelul Angajat. ntre tabelul Angajai i tabelul Departamente va exista o legtur prin intermediul cmpului cod_departament care este cheie primar n tabelul Departamente i cheie secundar n tabelul Angajai.

A doua form normal


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

Angajat

Funcii angajat

Funcii

Departamente

Se observ c n tabelul Angajaii exist pentru acelai angajat (codul angajatului fiind cheia primar) mai multe nregistrri n cazul n care a ocupat mai multe posturi n cadrul companiei, cte una pentru fiecare post ocupat. Deci, n mai multe nregistrri se vor repeta valori ale cmpurilor: cod_angajat, nume_prenume, cod_numeric, adres, telefon, studii, data_naterii, data_angajrii. Valorile cmpurilor care pot diferi de la o nregistrare la alta pentru aceeai valoare a cmpurilor enumerate anterior sunt: schimbare_funcie, cod_funcie, cod_departament, data_inial, data_final, motiv_schimbare. Pentru a elimina cmpurile care nu pot fi identificate unic prin intermediul cmpului cod_angajat

Identificarea i clasificarea unor tipuri de structuri de date

33

(cheia primar a tabelului) se va diviza acest tabel n dou tabele: Angajat care conine cmpurile cod_angajat, nume_prenume, cod_numeric, adres, telefon, studii, data_naterii, data_angajrii i Funcii_angajat care conine cmpurile cod_angajat, cod_funcie, cod_departament, data_inial, data_final, motiv_schimbare. n tabelul Funcii_angajat cheia primar (cea care identific unic o nregistrare) este format din cmpurile cod_angajat, cod_funcie i cod_departament. Acest tabel este legat de mai multe tabele: Angajat (legtura ntre cele dou tabele va fi fcut prin cmpul cod_angajat), Funcii (prin cheia cod_funcie care este cheie primar n tabelul Funcii i cheie secundar n tabelul Angajat) i Departamente (prin cheia cod_departament care este cheie primar n tabelul Departamente i cheie secundar n tabelul Angajat).
Cod_ angajat Nume_ prenume Cod_ numeric ... Funcie Departament ... Motiv_ schimbare

Tabelul Angajaii va fi descompus n dou tabele. Tabelul Angajat va conine informaii generale despre angajai. Exist o singur nregistrare pentru fiecare angajat. Cod_ angajat Nume_ prenume Cod_ numeric

Cod_ angajat

Cod_ funcie

Cod_ departament

...

Motiv_ schimbare

...

Tabelul Funcii_angajat va conine informaii despre posturile ocupate de fiecare angajat. Pentru fiecare angajat exist attea nregistrri. cte posturi a ocupat n cadrul organizaiei.

A treia form normal


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

34 Informatic
n acest caz, documentul ce leag toate aceste informaii este factura care pstreaz urma tranzaciei comerciale. n ea se gsesc date generale despre tranzacie (numrul_facturii, data_facturii), dar i date despre angajatul care a negociat tranzacia (denumire_vnztor, cod vnztor), date despre client (persoana care a cumprat produsele, identificat prin cod_client, denumire_client, cod_fiscal, adres etc.) i date despre fiecare produs vndut (numr_produs_factur, cod_produs, denumire_produs, unitate, pre_unitar, cantitate, valoare_cantitate1). Se observ c n cadrul unei facturi, produsul vndut depinde de clientul care l-a cumprat (care pltete toat factura), care la rndul su depinde de vnztorul cu care a negociat achiziionarea produselor. Pentru a elimina aceste dependene funcionale tranzitive: produs client vnztor din datele furnizate de o factur, vor fi construite mai multe tabele: tabelul Factur care conine date generale despre factur (numr_factur, dat, serie), tabelul Vnztor care conine date despre tranzaciile efectuate de angajaii comerciali ai companiei i care sunt necesare pentru salarizarea lor (numr_factur, cod_angajat_vnztor), tabelul Cumprtor care conine date pentru identificarea clientului implicat n tranzacie (numr_factur, cod_client), presupunnd c exist deja tabelul Clieni care furnizeaz informaii complete depre fiecare client obinuit al companiei (nume, cod fiscal, adres etc.), tabelul Produs_vndut care identific produsul vndut prin factur i care conine date pentru identificarea fiecrui produs vndut (numr_factur, cod_produs, cantitate), presupunnd c exist deja tabelul Catalog_produse care furnizeaz informaii complete despre fiecare produs vndut de companie (denumire, cod, unitate de msur, pre unitar etc.). Factur (document)

Factura

Vnztor

Cumprtor

Produs_vndut

Salarii

Clieni

Catalog_produse

est pentru evaluare:

Considerai c coala voastr este o organizaie care trebuie informatizat, iar colecia de date pe care o vei folosi va fi de tipul unei baze de date relaionale. Analiza voastr trebuie s porneasc de la entitatea Elev. Vei identifica toate datele caracteristice unui elev, att din punct de vedere al datelor personale (numr matricol, nume i prenume, iniiala tatlui, datele despre prini, adresa, numrul de telefon), ct i din punct de vedere al situaiei colare (anul de studiu, clasa, profilul clasei, profesorul diriginte, profesorul pe care l are la fiecare disciplin, disciplinele pe care le studiaz n acest an colar, notele i absenele la fiecare disciplin, pe fiecare semestru, media la fiecare
1

Pentru a simplifica analiza, s-au eliminat din structura unei facturi toate datele referitoare la TVA.

Identificarea i clasificarea unor tipuri de structuri de date

35

disciplin obinut semestrial, media anual la fiecare disciplin, media semestrial i media anual a elevului). Construii cu aceste date primul tabel. Normalizai tabelul.

est pentru evaluare:

n urmtorul exemplu, pentru proiectarea unei baze de date s-a pornit de la lista cu comenzile clienilor. Trecnd prin mai multe forme normale s-au obinut tabelele: Comenzi, Clieni, Produse_comandate. Identificai formele normale prin care a trecut tabelul iniial. Etapa 1. Se construiete tabelul Total_comenzi care conine urmtoarele cmpuri: numr_comand, dat_comand, nume_client, adres_client i 6 cmpuri compuse produs_comandat. Cmpul compus este format din cmpurile denumire_produs, unitate_msur, cantitate, pre_unitar, valoare. Fiecare nregistrare reprezint o comand. Cmpul numr_comand poate identifica unic o nregistrare. Etapa 2. Se construiete tabelul Comenzi care conine urmtoarele cmpuri: numr_comand, dat_comand, nume_client, adres_client, denumire_produs, unitate_msur, cantitate, pre_unitar, valoare. Pentru fiecare comand vor fi mai multe nregistrri, cte una pentru fiecare podus din comand. Cmpul numr_comand i denumire_produs identific unic o nregistrare. Etapa 3. Pentru a uura identificarea unui produs se atribuie acestuia un cod_produs. Se construiete tabelul Catalog_produse care conine urmtoarele cmpuri: cod_produs, denumire_produs, unitate_msur, pre_unitar. Fiecare produs din catalog va fi identificat unic prin cmpul cod_produs. n tabelul Comenzi vor rmne cmpurile: numr_comand, dat_comand, nume_client, adres_client, cod_produs, cantitate, valoare. nregistrrile vor fi identificate unic prin cheia format din dou cmpuri numr_comand i cod_produs. Etapa 4. Din tabelul Comenzi se construiesc dou tabele: tabelul Comanda i tabelul Produse. Tabelul Comanda conine cmpurile: numr_comand, dat_comand, nume_client, adres_client, valoare. Pentru fiecare comand va fi o singur nregistrare identificat unic prin cmpul numr_comand. Tabelul Produse conine cmpurile: numr_comand, cod_produs, nume_client, adres_client, cantitate, valoare. Pentru fiecare comand vor exista mai multe nregistrri. nregistrrile vor fi identificate unic prin cheia format din dou cmpuri: numr_comand i cod_produs. Etapa 5. Din tabelul Comanda se construiesc dou tabele: tabelul Comenzi i tabelul Clieni. Tabelul Comenzi conine cmpurile: numr_comand, dat_comand, cod_client, valoare. Pentru fiecare comand va fi o singur nregistrare identificat unic prin cmpul numr_comand. Tabelul Clieni conine cmpurile: cod_client, nume_client, adres_client. Pentru fiecare client va fi o singur nregistrare. nregistrrile vor fi identificate unic prin cmpul: cod_client.

36 Informatic

2.3. Fundamentul matematic al bazelor de date relaionale


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

1.

Selecia (Select2). Operatorul se aplic pe un tabel surs. Rezultatul este un tabel nou, cu aceeai structur de cmpuri ca i a tabelului surs, ce conine ns numai acele nregistrri din tabelul surs care ndeplinesc o condiie precizat: au aceeai valoare pentru un anumit cmp. Angajai
Cod-a 1111 1112 1113 1114 Nume_prenume Ionescu Maria Popescu Ion Andronescu Ana Ene Magda Cod_num 2030361403457 1020260403456 2040469402458 2050570403453 Departament Marketing Marketing Salarizare Salarizare Funcia Casier Vnzator Casier Contabil

Nou1

Select from Angajai where cod_num=1020260403456


Nume_prenume Popescu Ion Cod_num 1020260403456 Departament Marketing Funcia Vnzator

Cod-a 1112

Nou2

Select from Angajai where departament='Salarizare'


Nume_prenume Andronescu Ana Ene Magda Cod_num 2040469402458 2050570403453 Departament Salarizare Salarizare Funcia Casier Contabil

Cod-a 1113 1114

Nou3

Select from Angajai where funcia='Casier'


Nume_prenume Ionescu Maria Andronescu Ana Cod_num 2030361403457 2040469402458 Departament Marketing Salarizare Funcia Casier Casier

Cod-a 1111 1113

Operatorul relaional 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 Angajai. Prin operaia select se pot crea noi tabele: 9 Tabelul Nou1. Conine o singur nregistrare corespunztoare unui angajat care are un anumit cod numeric personal: Select from Angajai where Cod_num=1020260403456 9 Tabelul Nou2. Conine mai multe nregistrri care corespund angajailor din departamentul Salarizare: Select from Angajai where Departament='Salarizare' 9 Tabelul Nou3. Conine mai multe nregistrri care corespund angajailor care au funcia de casier: Select from Angajai where Funcia='Casier' 2. Proiecia (Project). Operatorul se aplic pe un tabel surs din care creeaz un tabel nou ce va conine numai cmpurile specificate din tabloul surs. Angajai
Cod-a 1111 1112 1113 1114 Nume_prenume Ionescu Maria Popescu Ion Andronescu Ana Ene Magda Cod_num 2030361403457 1020260403456 2040469402458 2050570403453 Departament Marketing Marketing Salarizare Salarizare Funcia Casier Vnzator Casier Contabil

Nou4 Project Nume_prenume, Cod_num from Angajai


Nume_prenume Ionescu Maria Popescu Ion Andronescu Ana Ene Magda Cod_num 2030361403457 1020260403456 2040469402458 2050570403453

Nou5 Project Nume_prenume, Departament from Angajai


Nume_prenume Ionescu Maria Popescu Ion Andronescu Ana Ene Magda Departament Marketing Marketing Salarizare Salarizare

De exemplu, putem considera ca tabel surs tabelul Angajai. Prin operaia project se pot crea noi tabele: 9 Tabelul Nou4. Conine dou cmpuri: Nume_prenume i Cod_num: Project Nume_prenume, Cod_num from Angajai 9 Tabelul Nou5. Conine dou cmpuri: Nume_prenume i Departament: Project Nume_prenume, Departament from Angajai 3. Compunerea (Join). Operatorul se aplic pe dou tabele surs din care creeaz un tabel nou astfel: din produsul cartezian al celor dou tabele se pstreaz numai nregistrrile care ndeplinesc o anumit condiie.

38 Informatic
Exemplu de operaie Join Tabel A
Cmpuri RA1 RA2

Tabel B
C1 1 2 C2 a b C3 x y Cmpuri RB1 RB2 RB3

Rndurile tabelului A

C4 1 2 3

C5 m n p

Rndurile tabelului B

Tabel A B (produs cartezian)


Cmpuri RA1 RA1 RA1 RA2 RA2 RA2

C1 1 1 1 2 2 2

C2 a a a b b b

C3 x x x y y y

C4 1 2 3 1 2 3

C5 m n p m n p

RB1 RB2 RB3 RB1 RB2 RB3

Rndurile tabelului A

Rndurile tabelului B

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


Cmpuri RA1 RA2

C1 1 2

C2 a b

C3 x y

C4 1 2

C5 m n

RB1 RB2

Rndurile tabelului A

Rndurile tabelului B

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

Identificarea i clasificarea unor tipuri de structuri de date

39

i se obine tabelul Casieri care conine toi angajaii care au funcia de casier. Apoi pe tabelul astfel obinut se aplic operaia de proiecie: Project Nume_prenume, Departament from Casieri i se obine n tabelul Casieri_departamente informaia dorit (lista cu numele persoanelor i departamentul n care lucreaz). 9 Lista cu numele furnizorului, numele i numrul de telefon al persoanei de contact pentru materialele care sunt sub stocul de siguran, pentru a se putea comanda aceste materiale. n tabelul Stocuri se execut o operaie de selecie: Select from Stocuri where stoc<=stoc_sig i se obine tabelul Siguran care conine toate materialele care sunt sub stocul de siguran. Apoi pe tabelul astfel obinut se aplic operaia de proiecie: Project cod_material, denumire from Siguran i se obine tabelul Comenzi_materiale. Se compun tabelele Furnizori i Comenzi_materiale cu operaia Join Furnizori and Comenzi_materiale where furnizori.cod_material = comenzi_materiale. cod_material i se obine tabelul Comanda. Apoi pe tabelul astfel obinut se aplic operaia de proiecie Project denumire, den_furnizor, nume_pers, telefon from Comanda i se obine tabelul Comanda_furnizori care conine denumirea furnizorului, numele persoanei de contact, numrul de telefon i denumirea materialului pentru materialele care sunt sub stocul de siguran. Se poate verifica prin telefon dac furnizorul poate primi comanda de livrare pentru materialele care sunt sub stocul de siguran.

est pentru evaluare:

Pornind de la tabelele A i B, precizai coninutul tabelului C obinut ca rezultat al operaiei relaionale: a) Project X,Z from A Tabelul A Tabelul B b) Select from A where Y=1 X Y Z U V c) Project U from B m 1 a i 2 d) Select from B where V=2 n 2 b j 4 e) Join A and B where A.Y=B.V o 3 c k 2
p 1 d

est pentru evaluare:

Tabelul A conine informaii generale despre angajai: nume angajat, adres, numr de telefon. Tabelul B conine informaii despre ocuparea posturilor de ctre angajai: nume angajat, nume funcie, departament, data iniial, data final. Ce operaii relaionale trebuie s executai ca s obinei informaiile: a) Ce angajai au ocupat postul X? b) Ce angajai au lucrat n departamentul X? c) Ce posturi a ocupat angajatul X i n ce departamente? d) Ce adrese au angajaii care au ocupat postul X din departamentul Y?

40 Informatic
n afara limbajelor care au la baz algebra relaional (care folosesc interogri exprimate prin operatori relaionali specifici aa cum este limbajul SQL), mai exist i limbaje care se bazeaz pe calculul relaional (care exprim interogrile prin intermediul condiiilor pe care trebuie s le ndeplineasc mulimea nregistrrilor care corespund cererii). Din aceast categorie face parte limbajul QBE (Query By Example - Interogare prin exemple) care este standardul prin care pot fi formulate interactiv interogrile bazei de date folosind calculul relaional. De obicei limbajul QBE pune la dispoziia utilizatorului o interfa prin intermediul creia utilizatorul i poate asambla interogarea, incluznd operatori pentru calculul: 9 sumei valorilor unui cmp din tabel - sum, 9 mediei aritmetice a valorilor unui cmp din tabel - avg, 9 celei mai mari valori a unui cmp din tabel - max, 9 celei mai mici valori a unui cmp din tabel - min, 9 numrului de nregistrri dintr-un tabel - cnt. n sistemul de gestiune a bazelor de date Visual FoxPro interogrile se pot construi prin intermediul interfeei folosind interogarea prin exemple (QBE). n culise, aceste comenzi sunt transformate n instruciuni SQL.

ncercai:

date format din dou tabele B i C. Tabelul A conine urmtoarele cmpuri: nume angajat, funcie, departament. Tabelul B conine cmpurile nume angajat i funcie, iar tabelul C cmpurile funcie i departament. Comparai cele dou baze de date. Ele conin aceleai categorii de date, dar nu sunt identice din punct de vedere al informaiilor pe care le furnizeaz. Artai cum rspund cele dou baze de date la urmtoarele cereri de informaii: a) n ce departament lucreaz angajatul X. b) Care sunt angajaii dintr-un departament. c) Care sunt angajaii cu funcia X din departamentul Y. Ce concluzie tragei? Reproiectai cea de-a doua baz de date astfel nct s poat rspunde la aceste ntrebri.

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

date format din dou tabele B i C. Tabelul A conine urmtoarele cmpuri: nume angajat, funcie, departament, numr de telefon. Tabelul B conine cmpurile nume angajat i departament, iar tabelul C cmpurile funcie i numr de telefon. Comparai cele dou baze de date. Ele conin aceleai categorii de date, dar nu sunt identice din punct de vedere al informaiilor pe care le furnizeaz. Artai cum rspund cele dou baze de date la urmtoarele cereri de informaii: a) Ce numr de telefon are angajatul X. b) Ce angajat are numrul de telefon Y. c) Care sunt angajaii cu funcia X din departamentul Y.

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

Identificarea i clasificarea unor tipuri de structuri de date

41

Ce concluzie tragei? Reproiectai cea de-a doua baz de date astfel nct s poat rspunde la aceste ntrebri. Presupunnd c exist o companie care asigur distribuia ctre abonai a mai multor publicaii, descriei n ce mod vor putea fi reprezentate ntr-o baz de date relaionale (tabele i relaii ntre tabele) urmtoarele informaii referitoare la editori i abonai: a) Exist mai multe edituri. Informaiile referitoare la o editur sunt: nume, adres, persoan de contact, numr de telefon. b) Fiecare editur are mai multe publicaii. Informaiile referitoare la o publicaie sunt: nume, tip publicaie, pre. c) Fiecrui abonat i se pot distribui mai multe publicaii. Informaiile referitoare la un abonat sunt: nume, adres, numr de telefon. Artai ce condiii trebuie ndeplinite pentru a fi asigurat integritatea referenial a bazei de date.

M iniproiect.

M iniproiect.

Descriei n ce mod vor putea fi reprezentate ntr-o baz de date relaional (tabele i relaii ntre tabele) urmtoarele informaii referitoare la cursele aeriene dintr-o zi i pasagerii acestor curse : a) Exist mai multe linii aeriene, fiecare identificat printr-un nume. b) Pe fiecare linie aerian exist mai multe curse identificate printr-un nume. Fiecare curs are o destinaie. c) Fiecare curs are o anumit capacitate (numr de locuri) i folosete un anumit tip de avion. d) La fiecare curs exist mai muli pasageri care rezerv locuri. Un pasager poate rezerva mai multe locuri. Pasagerii se identific dup nume, iar locurile dup numr. Artai ce condiii trebuie ndeplinite pentru a fi asigurat integritatea referenial a bazei de date. Verificai dac baza de date rspunde la urmtoarele interogri (exprimai interogrile prin cei trei operatori relaionali): a) Lista cu pasagerii de la cursa X. b) Locurile rezervate de pasagerul X la cursa Y. c) Tipul avionului folosit de cursa X. d) Lista curselor care aparin liniei aeriene X. e) Lista curselor care au destinaia X.

M iniproiect.

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

42 Informatic
d) Crile pot fi mprumutate de cititori. Pentru fiecare mprumut se in urmtoarele evidene: cartea mprumutat, cititorul care a mprumutat-o, data mprumutului, data la care trebuie s o napoieze, data la care a napoiat-o. Artai ce condiii trebuie ndeplinite pentru a fi asigurat integritatea referenial a bazei de date. Verificai dac baza de date rspunde la urmtoarele interogri (exprimai interogrile prin cei trei operatori relaionali): a) Ce cri a mprumutat cititorul X n perioada D. b) Lista cu crile care sunt mprumutate la data D. c) Lista cu crile care aparin unui autor X. d) Lista cu crile din domeniul Y. e) Lista cu crile din domeniul X aprute la editura Y. f) Lista cu crile aprute n anul X la editura Y.

M iniproiect.

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

M iniproiect. Baza de date a unei coli este format din urmtoarele tabele:
Clase: cod_clas, profil_clas. Discipline: cod_disciplin, denumire_disciplin. Profesori: cod_profesor, nume_profesor, adres, telefon. Elevi: cod_elev, cod_clas, nume_elev, adres, telefon. Prini: cod_elev, nume_printe, tip_printe, telefon. Note: cod_elev, cod_disciplin, dat, not. Absene: cod_elev, cod_disciplin, dat.

Identificarea i clasificarea unor tipuri de structuri de date


Dirigini: cod_profesor, cod_clas. ncadrare_discipline: cod_clas, cod_ disciplin, numr_ore. ncadrare_profesori: cod_profesor, cod_disciplin, cod_clas.
Clase Elevi Note Absene

43

Prini

Discipline

Profesori

Dirigini

ncadrare_ profesori

ncadrare_ discipline

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

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

est pentru evaluare:

Artai corespondenele: Prima grup (1 10) v prezint mai muli termeni. A doua grup (a j) v prezint afirmaii sau definiii posibile pentru aceti termeni. Legai corespunztor obiectele din prima grup cu obiectele din a doua grup: 1. baza de date 6. administratorul bazei de date 2. nregistrarea 7. sistemul de gestiune a bazelor de date 3. schema 8. relaia una-la-mai-multe 4. redundana datelor 9. independena datelor 5. dicionarul de date 10. modelul relaional de baze de date a. b. c. d. Conine toate informaiile despre entitile memorate n baza de date. Cel mai popular model de baze de date folosit pe microcalculatoare. Instrument software care faciliteaz crearea i ntreinerea bazelor de date. O persoan sau un grup de persoane care coordoneaz i controleaz toate activitile legate de baza de date a unei organizaii. e. O colecie de fiiere i nregistrri legate ntre ele. f. Unul dintre cele mai mari avantaje ale folosirii bazelor de date. g. O colecie de cmpuri care sunt legate logic. h. Descrierea ntregii colecii de date din baza de date. i. Una dintre proprietile datelor care creeaz deficiene mari coleciilor de fiiere de date. j. O nregistrare din primul tabel poate fi legat de mai multe nregistrri din al doilea tabel. Adevrat/Fals: 1. Un avantaj al folosirii fiierelor de date este partajarea datelor ntre mai muli utilizatori. 2. Un avantaj al folosirii bazelor de date este asigurarea integritii datelor. 3. Dicionarul de date descrie structura datelor din baza de date.

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

Identificarea i clasificarea unor tipuri de structuri de date

45

5.

6.

7.

8.

9.

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

Rspundei: 1. De ce este necesar un administrator de baze de date? 2. Care este deosebirea dintre schema general a bazei de date i o schem parial? 3. Ce este un sistem de gestiune a bazelor de date? Care este rolul su? 4. Care sunt cele mai importante avantaje ale unei baze de date? 5. Care sunt cele mai importante dezavantaje ale unei baze de date? 6. Ce este limbajul de interogare a unei baze de date? 7. Ce nseamn independena datelor ntr-o baz de date? 8. Ce tipuri de limbaje pot fi folosite pentru interogarea unei baze de date relaionale?

Artai corespondenele: 1-e; 2-g; 3-h; 4-i; 5-a; 6-d; 7-c; 8-j; 9-f; 10-b. Adevrat/Fals: 1-F; 2-A; 3-A; 4-F; 5-A; 6-A; 7-F; 8-F; 9-F; 10-F. Completai: 1- cheie de identificare; 2-nregistrri, fiiere; 3- schema parial; 4- condus; 5- legtura; 6-inclus n; 7-simplificare, divizarea; 8-redundana. Alegei rspunsurile corecte: 1-a,b,d; 2-b,c; 3-b,d; 4-b; 5-a; 6-a,d; 7-c; 8-a; 9-b. Condiiile sunt: a) E := alfa <> " " and alfa <> "," and fa <> "."

spunsuri:

46 Informatic

3. Tipuri de date folosite de sistemele de gestiune a bazelor de date relaionale


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

tipul numeric tipul alfanumeric tipul logic tipul pentru gestionarea timpului tipul special

Pentru a asigura o mai mare flexibilitate n manipularea i stocarea datelor, n sistemele de gestiune a datelor, ca i n alte sisteme care permit prelucrarea datelor, sunt implementate subtipuri de date. Aceste subtipuri pot fi folosite pentru datele elementare stocate n memorie (variabilele de memorie) i/sau pentru datele elementare stocate n memoriile externe (cmpurile tabelelor care formeaz baza de date). Subtipurile de date difer ntre ele prin modul de stocare a datelor i prin domeniul de definiie al lor. n continuare, pentru a v putea crea o imagine asupra varietii de subtipuri de date pe care le putei ntlni atunci cnd lucrai cu bazele de date, sunt prezentate subtipurile implementate n sistemul de gestiune a bazelor de date Visual FoxPro. n acest sistem structurile de date de tip tablou de memorie sunt neomogene. Pentru operatorul de atribuire se folosete simbolul = : <nume> = <expresie> De exemplu, n=n+100 nseamn c variabilei n i se atribuie valoarea expresiei n+100, adic valoarea obinut prin adugarea numrului 100 la valoarea avut anterior operaiei de atribuire.
3

3.1. Tipul numeric


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

Numele unei variabile de memorie sau al unui cmp.

Identificarea i clasificarea unor tipuri de structuri de date

47

pentru reprezentarea numrului (un caracter pentru semnul minus folosit de numerele negative, numrul de cifre pentru partea ntreag, numrul de cifre pentru partea zecimal i un caracter pentru punctul folosit ca separator ntre partea ntreag i partea zecimal) i numrul de caractere folosite numai pentru partea zecimal. Deoarece numrul maxim de octei este 20 (deci numrul maxim de caractere folosite pentru numr este 20), acest subtip poate fi folosit pentru reprezentarea cu precizie sczut a numerelor raionale mici. Subtipul double (dublu) poate fi folosit i el pentru numerele reale. Reprezentarea numrului pe suportul de memorare se face n virgul mobil, dubl precizie (o metod optim de reprezentare a numerelor reale) i are o lungime fix de 8 octei. Acest subtip poate fi folosit pentru reprezentarea cu precizie mrit (pn la 15 cifre zecimale) a 4 numerelor reale foarte mari (pn la ordinul 10308) . Deoarece lungimea sa este fix, pentru o bun gestionare a spaiului de memorare nu se recomand folosirea acestui subtip pentru numere reale mici cu precizie sczut. Subtipul integer (ntreg) poate fi folosit numai pentru numerele ntregi. Reprezentarea numrului pe suportul de memorare se face n binar pe o lungime fix de 4 octei, folosindu-se un bit pentru semn i 31 de bii pentru numr. Deoarece 231 - 1 este egal cu 2147483647, domeniul de definiie al acestui subtip este [-2147483648, 2147483647]. Subtipul currency (monetar) poate fi folosit pentru memorarea valorilor numerice exprimate n uniti monetare. naintea numrului se introduce simbolul monetar ($). Poate fi folosit pentru date reale, cu o precizie de maxim 4 cifre zecimale i cu valori 5 cuprinse aproximativ n domeniul [-91014, 91014] . Este specific domeniului contabil, pentru a se preveni erorile de rotunjire. Pentru reprezentarea sa se folosesc 8 octei. Operatorii matematici care pot fi aplicai pe datele de tip numeric sunt:

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


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

R = {>, >=, <, <=, =, #|<>|!=7} 3.2. Tipul alfanumeric


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

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

48 Informatic
un octet, prin codul su ASCII. Lungimea maxim a irului de caractere este 254 de caractere. Lungimea irului de caractere dintr-un cmp este fix pentru ntregul tabel i poate fi stabilit de ctre utilizator pn la maxim 254 de caractere. Lungimea irului de caractere dintr-o variabil de memorie este variabil, n funcie de valoarea atribuit datei. Pentru constanta ir de caractere se pot folosi ambele tipuri de delimitatori: apostrof ('Caracter') i ghilimele ("Caracter"). Operatorii de concatenare care pot fi aplicai pe datele de tip ir de caractere sunt:

C = {+,-}
Operatorul + se numete operator de concatenare simplu, iar operatorul - se numete operator de concatenare special. Deosebirea dintre operatorul de concatenare simplu i operatorul de concatenare special este aceea c cel de-al doilea operator mut spaiile de la sfritul primului ir de caractere la sfritul irului de caractere concatenat. De exemplu: 'Pop ' + ' Ana' = 'Pop Ana' P o p + 'Pop ' - ' Ana' = 'Pop Ana P o p ' A n a = P o p A n a

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

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


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

Identificarea i clasificarea unor tipuri de structuri de date

49

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

3.3. Tipul logic


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

L = {and, or, not|!}


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

3.4. Tipul pentru gestionarea timpului


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

D = {+, -}
Dac notm cu a primul operand, cu b al doilea operand i cu c rezultatul, aceti operatori se aplic astfel:

50 Informatic
Operator Tip a ++ --D
8

Tip b
9

Tip c D D

D D

Execut Exemplu incrementeaz data din operandul a cu {08/31/01}+1= numrul de zile din operandul b {09/01/01} decrementeaz data din operandul a {08/01/01}-1= cu numrul de zile din operandul b {07/31/01} calculeaz diferena n zile dintre {08/01/01}primul operand i al doilea operand {07/01/01}=31

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

T = {+, -}
Dac notm cu a primul operand, cu b al doilea operand i cu c rezultatul, aceti operatori se aplic astfel: Operator Tip a Tip b Tip c +T
11

--

--

Execut Exemplu incrementeaz timpul din {08/31/01 01:01:10 AM}+10 ={08/31/01 01:01:20 AM} operandul a cu numrul de secunde din operandul b {08/31/01 01:01:10 AM}-5 decrementeaz timpul din ={08/31/01 01:01:5 AM} operandul a cu numrul de secunde din operandul b {08/31/01 01:01:15 AM} calculeaz diferena n {08/31/01 01:01:10 AM} = 5 secunde dintre primul operand i al doilea operand

8 9

Tip dat calendaristic. Tip ntreg. 10 Parantezele [ ] semnific faptul c este opional coninutul 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 cmpurile din tabelele bazei de date i permite stocarea unor entiti create cu alte aplicaii (foi de calcul, imagini grafice, sunete etc.). n Visual FoxPro se folosete numai tipul general (date generale) care permite pstrarea n tabelele bazei de date a unor entiti de tip document, foaie de calcul sau imagine. Aceste entiti sunt considerate obiecte i pot fi stocate n baza de date folosind protocolul OLE de ncapsulare i legare a obiectelor. Ele trebuie s fie create cu o aplicaie OLE server. Memorarea obiectelor din cmpul general se face ntr-un fiier asociat tabelului. n tabel, n cmpul general se pstreaz pe 4 octei doar adresa la care se gsete obiectul. Cmpurile de tip general nu pot fi cmpuri cheie.

3.6. Proprietile cmpurilor bazei de date


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

formatul masca de introducere eticheta valoarea implicit regula de validare textul regulii de validare indexarea valoarea nul
Formatul (format). Aceast proprietate controleaz modul n care sistemul de gestiune a bazelor de date afiez valoarea memorat n cmp. Pentru fiecare tip sau subtip de dat exist mai multe formate de afiare. Masca de introducere (input mask). Aceast proprietate controleaz valorile datelor introduse n cmp. Ea determin numrul de poziii ale cmpului i, pentru fiecare poziie din cmp, tipul caracterului acceptat: numeric, alfabetic, alfanumeric, caracter special, un anumit caracter, orice caracter. Pentru caracterele alfabetice se poate stabili dac sunt litere mici sau litere mari. Se mai poate stabili dac introducerea datelor se face de la stnga la dreapta (pentru cmpurile aliniate la stnga, cum sunt de exemplu irurile de caractere) sau de la dreapta la stnga (pentru cmpurile aliniate la dreapta, cum sunt de exemplu numerele ntregi). O masc de introducere special este masca password care afieaz pe ecran cte un asterisc pentru fiecare caracter introdus. Eticheta (caption). Aceast proprietate controleaz titlul afiat pe ecran pentru cmp. Valoarea implicit pentru aceast proprietate este numele cmpului. Utilizatorul poate schimba aceast valoare.

52 Informatic
Valoarea implicit (default value). Aceast proprietate controleaz iniializarea cmpului. Prin ea se poate stabili valoarea iniial atribuit unui cmp la adugarea unei nregistrri n tabel. De exemplu, pentru cmpurile de tip dat calendaristic se poate stabili ca valoare iniial data curent, iar pentru cmpurile logice valoarea true. Regula de validare (validation rule). Aceast proprietate controleaz valorile datelor introduse n cmp. Regula de validare se exprim printr-o condiie logic, ce trebuie s aib valoarea true dup ce se introduce valoarea cmpului. Regula de validare se poate aplica la nivel de: 9 cmp, i anume se verific dac valoarea introdus pentru cmp se ncadreaz ntr-un anumit interval de valori sau ntr-o anumit mulime de valori. Aceast validare se declaneaz la introducerea sau modificarea valorii cmpului. 9 nregistrare, i anume se verific dac valoarea introdus pentru cmp respect anumite corelaii cu valorile altor cmpuri din nregistrare. Aceast validare se declaneaz dup validarea la nivel de cmp, n urma introducerii sau modificrii valorii unui cmp sau a tergerii valorii cmpului. Nu se declaneaz dac se terge toat nregistrarea. n expresia din condiia de validare pot fi folosite i funcii de sistem sau definite de utilizator. Textul regulii de validare (validation text). Aceast proprietate controleaz textul afiat n cazul n care datele introduse n cmp nu respect regula de validare (n cazul n care condiia logic pentru validare are valoarea false dup introducerea valorii cmpului). De obicei, prin acest text i se explic utilizatorului regulile de validare pe care trebuie s le respecte datele introduse n cmp. Indexarea (index). Aceast proprietate controleaz dac acel cmp este folosit pentru indexare. Indexarea este o tehnologie utilizat de sistemele de gestiune a bazelor de date care permite ordonarea logic, dup un anumit criteriu, a nregistrrilor dintr-un tabel, la exploatarea sau vizualizarea datelor din tabel, fr s fie afectat ordinea fizic a nregistrrilor din tabel (ordinea n care sunt scrise). Cmpul devine cheie de indexare. Valoarea nul (NULL). Aceast proprietate controleaz dac n cmp a fost memorat sau nu o valoare nul (NULL). Aceast proprietate este util pentru a putea face deosebirea dintre un cmp n care utilizatorul nu a introdus date i un cmp n care utilizatorul a introdus o dat neutr pentru acel tip de dat, cum ar fi: 0 pentru datele numerice, irul vid - irul de caractere de lungime zero ("") - pentru datele alfabetice, false pentru datele logice sau data vid ({ / / }) pentru datele de tip dat calendaristic. De exemplu, dac ai declarat cmpul telefon numeric, respectiv ir de caractere, valoarea NULL indic faptul c nu se cunosc detalii despre numrul de telefon al acelei persoane, iar valoarea 0, respectiv irul vid arat c acea persoan nu are telefon.

3.7. Crearea unei variabile de memorie n Visual FoxPro


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

Identificarea i clasificarea unor tipuri de structuri de date

53

Adresarea indirect
Unele comenzi sau funcii Visual FoxPro cer s li se furnizeze un nume, cum ar fi: numele unui fiier baz de date, numele unui cmp, numele unui alias, numele unui fiier index, numele unei variabile de memorie, numele unui tablou de memorie etc. Folosind adresarea indirect, numele poate fi furnizat prin intermediul unei variabile de memorie sau al unui tablou de memorie, astfel nct s se poat generaliza comanda. Pentru adresarea indirect se poate folosi macrosubstituia: se memoreaz numele ntr-o variabil de memorie, dup care poate fi substituit ntr-o comand sau ntr-o funcie prin numele variabilei de memorie sau al elementului de tablou, precedat de semnul & (ampersand):

&<nume_variabil_de memorie>
sau

&<nume_variabil_de memorie>.<x>
unde <x> este o expresie de tip ir de caractere. n acest caz, irul de caractere x va fi concatenat cu numele memorat n variabila de memorie. Pentru adresarea indirect se mai poate folosi i expresia nume: se memoreaz numele ntr-o variabil de memorie dup care poate fi substituit ntr-o comand sau ntr-o funcie prin numele variabilei de memorie sau al elementului de tablou, nchis ntre paranteze rotunde:

(<nume_variabil_de memorie>)

Evaluai expresii Vei evalua mai multe tipuri de expresii folosind aplicaia Visual FoxPro. n expresii vei folosi i variabile de memorie. Deschidei fereastra aplicaiei Visual FoxPro. n fereastra aplicaiei este deschis o fereastr document care are numele Command. Aceasta este fereastra de comenzi n care putei s editai diferite comenzi. Pentru nceput vei scrie diferite comenzi pentru evaluarea unor expresii. Pentru a cere evaluarea unei expresii vei scrie naintea ei semnul ? care semnific operaia de afiare. Rezultatul evalurii va fi afiat n spaiul liber al ferestrei de aplicaie. 1. Evaluai expresia: E= pentru a=1, b=2, c=3 i d=3. a+b b +d a+c + + c c + a (a + b )3

Vei folosi cinci variabile de memorie a, b, c, d, i e. Atribuii valori primelor patru variabile de memorie. Scriei patru operaii de atribuire, cte una pe fiecare rnd. Terminai fiecare operaie de atribuire apsnd tasta Enter.

54 Informatic
a=1 b=2 c=3 d=4 Atribuii variabilei de memorie e valoarea expresiei. Scriei pe un rnd operaia de atribuire i apsai la sfrit tasta Enter. e=(a+b)/c + (b+d)/(c+a)+(a+c)/((a+b)**3) Afiai valoarea variabilei de memorie e. Scriei pe un rnd comanda i apsai la sfrit tasta Enter: ?e n fereastra aplicaiei va fi afiat valoarea 2.65.

? afieaz

Aici se afieaz rezultatul evalurii.

Fereastra de comenzi. Aici scriei comenzile.

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


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

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


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

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


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

4. Evaluai expresia logic: e = a and b or (not a or not b)

Identificarea i clasificarea unor tipuri de structuri de date


e= a and b or (not a or not b) ?e .T. .T. ? a>b .F. ? a==b .F. ? a$b .F. ? b$a .T. b='abc ' ? a<b .T.

55

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

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

9. Folosii macrosubstituia. Memorai n variabila a valoarea 1 i n variabila b numele variabilei a.


a=1 b=a ?b a ?a 1 ? &b 1

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


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

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

7. Comparai dou iruri de caractere:


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

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

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

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

ncercai:

Adevrat/Fals: 1. Visual FoxPro accept pentru numere ntregi subtipul longinteger. 2. Operatorul relaional != folosit n Visual FoxPro se numete operatorul diferit. 3. Operatorul relaional $ se folosete pentru a verifica dac valoarea unei expresii este cuprins ntre dou valori v1 i v2. 4. Subtipul memo poate fi folosit n Visual FoxPro pentru iruri de caractere care au o lungime mai mare de 254 de caractere. 5. Subtipul datetime se reprezint n Visual FoxPro pe 16 octei. 6. Valoarea nul este o proprietate a cmpului care controleaz dac ntr-un cmp nu s-a introdus nici o dat. 7. Cmpurile care n Visual FoxPro au tipul general pot fi cmpuri cheie. 8. Macrosubstituia este o metod folosit pentru a defini proprietatea unui cmp. Completai: 1. Operatorul $ folosit n Visual FoxPro se numete i se aplic pe date de tip ....................................... 2. Subtipul Date poate fi folosit pentru a reprezenta date calendaristice cuprinse ntre ..................... i .................. 3. Operatorii care pot fi folosii pentru subtipul Datetime sunt: ................ 4. n Visual FoxPro constanta de tip dat calendaristic se delimiteaz folosind caracterele ........ 5. Expresia nume se folosete pentru ........................... Alegei rspunsul corect: 1. Dac trebuie s memorai ntr-un cmp al unei baze de date Visual FoxPro media general a unui elev, vei alege un cmp numeric cu subtipul: a) simplu b) dublu c) monetar

2. Dac folosii subtipul numeric simplu pe 4 octei pentru reprezentarea unui numr ntreg ntr-o baz de date Visual FoxPro, valoarea maxim pe care o vei putea reprezenta este:

Identificarea i clasificarea unor tipuri de structuri de date


a) 24 -1 b) 9999 c) 2147483646 c) 3.00

57

3. Rezultatul expresiei 3^2*35%5**2 este: a) 0.00 b) 15.00

4. Reprezentarea subtipului float folosit pentru cmpurile numerice din Visual FoxPro are lungimea de: a) 1 octet b) 20 octei c) cuprins ntre 1 octet i 20 de octei 5. Reprezentarea subtipului integer folosit pentru cmpurile numerice din Visual FoxPro are lungimea de: a) 4 octei b) 8 octei c) 16 octei 6. Operatorul folosit n Visual FoxPro pentru operaia modulo este : a) MOD b) \ c) % 7. n Visual FoxPro numrul maxim de caractere dintr-un ir de caractere este: a) 254 b) 255 c) 256 8. n Visual FoxPro rezultatul evalurii expresiei 12 + {08/15/01} - {07/15/01} = 43 este: a) .T. b) .F. c) eroare 9. n Visual FoxPro operatorul ! este un operator: a) relaional b) logic c) de concatenare Rspundei: 1. Ce subtipuri numerice se folosesc pentru cmpurile din Visual FoxPro? 2. n Visual FoxPro ce operatori relaionali se folosesc n plus pentru datele de tip ir de caractere fa de cele de tip numeric? 3. Ce operatori de concatenare se folosesc n Visual FoxPro? Care este deosebirea dintre ei? 4. Pentru ce tip de date a fost implementat subtipul memo? n ce caz se recomand folosirea lui? 5. Ce subtipuri de date se folosesc n Visual FoxPro pentru gestionarea timpului? 6. Pentru ce se folosete tipul de date general n Visual FoxPro? 7. Ce este valoarea nul a unui cmp? 8. Care sunt proprietile cmpurilor dintr-o baz de date? 9. Ce este regula de validare? La cte niveluri se poate aplica?

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

spunsuri:

Capitolul

Utilizarea unor instrumente de prelucrare a datelor

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

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

Utilizarea unor instrumente de prelucrare a datelor

59

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

1. Interfaa aplicaiei Visual FoxPro


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

60 Informatic
9 Permite o adaptare uoar la lucrul cu mai muli utilizatori, fr s necesite implementarea unei variante speciale pentru lucrul n reea. 9 Are implementat conceptul de colecie de date definit ca un depozit cu informaii despre tabele, care permite folosirea numelor lungi pentru tabele i pentru cmpuri i implementarea integritii refereniale direct n tabelele bazei de date n loc s fie descris n programele de aplicaie. 9 Permite comunicarea i cu alte aplicaii folosind mecanisme DDE, cum este de exemplu, comunicarea cu aplicaia Excel. Orice modificare fcut ntr-o foaie de calcul Excel se va reflecta i n tabelul bazei de date FoxPro. 9 Are implementat protocolul OLE care permite schimbul de date ntre aplicaii diferite. Aplicaiile FoxPro sunt aplicaii client i n ele pot fi legate i ncapsulate diferite obiecte produse de aplicaiile server: texte, sunete, imagini, foi de calcul. 9 Permite importul i exportul diferitelor tipuri de date pstrate n diferite formate de fiiere: Access, dBase, Paradox, Oracle, Excel etc. 9 Dispune de un limbaj procedural puternic ce permite descrierea datelor i a aplicaiilor pe baza modelului programrii structurate, n care orice algoritm de rezolvare a unei probleme poate fi descris cu ajutorul a trei structuri de control: liniar, alternativ, repetitiv. 9 Are implementat pentru interogarea bazei de date, pe lng limbajul propriu, att limbajul de interogare de tip SQL, ct i limbajul de tip QBE (interogarea prin exemple, exemplele fiind create interactiv prin diferite obiecte puse la dispoziie de interfa). Aceste limbaje uureaz folosirea sistemului de ctre utilizatorii neinformaticieni. 9 ncepnd cu versiunea 3.0, n limbajul FoxPro este implementat i modelul programrii orientate pe obiecte. Dac n programarea clasic datele i programele care le prelucrau erau separate, n programarea orientat pe obiecte programul este definit ca un obiect care nglobeaz att ansamblul de date, ct i algoritmii care prelucreaz aceste date. n cadrul algoritmilor se folosete n continuare modelul programrii structurate. 9 Limbajul de programare propriu sistemului de gestiune a bazelor de date FoxPro are implementat i modelul programrii conduse de evenimente. n cadrul acestui model, programul este considerat un ansamblu de proceduri care nu se execut ntr-o ordine descris de programator, ci numai atunci cnd apar n sistem anumite evenimente. Un exemplu de astfel de eveniment este apsarea unei combinaii de taste, care se poate produce n orice moment n sistem i nu la momente determinate de programator. 9 Permite programarea vizual a aplicaiilor. Acest tip de proiectare ofer programatorilor posibilitatea de a realiza mai simplu aplicaii de exploatare a bazelor de date, deoarece ei nu mai sunt obligai s precizeze cum trebuie realizat aplicaia (s descrie algoritmul de rezolvare a problemei), ci ce trebuie s realizeze aplicaia. Pentru aceasta, FoxPro pune la dispoziia utilizatorilor diferite instrumente vizuale numite generatoare sau constructori. Acestea sunt programe care permit proiectarea interactiv a bazelor de date, a interogrilor, a rapoartelor, a elementelor de interfa (formulare de introducere a datelor, meniuri, ferestre), a aplicaiilor i a proiectelor. n plus, utilizatorul poate apela i la procedurile asistent (wizard) care l ndrum interactiv, pas cu pas n construirea acestor elemente. Elementul va fi realizat pe baza datelor furnizate de ctre programator n cadrul dialogului interactiv. 9 Are o vitez de lucru foarte mare, deoarece folosete o tehnologie special denumit tehnologie Rushmore care reduce timpul de acces la date prin optimizarea interogrilor.

Utilizarea unor instrumente de prelucrare a datelor

61

1.2. Moduri de lucru n Visual FoxPro


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

modul de lucru interactiv, modul de lucru programat.

1.2.1. Modul de lucru interactiv


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

prin intermediul interfeei grafice, prin intermediul limbajului de comand.

Interfaa grafic
Interfaa grafic este de tip MDI (interfa cu mai multe documente), adic n fereastra aplicaiei pot fi deschise mai multe ferestre document. Ea este compatibil cu interfaa de tip Microsoft Office (meniurile, barele de instrumente, scurtturile de la tastatur). Fereastra aplicaiei prezint un sistem de meniuri care pun la dispoziia utilizatorului marea majoritate a comenzilor care formeaz limbajul de comand. n general, opiunea de meniu reprezint verbul comenzii, iar adverbele sunt precizate prin intermediul controalelor din caseta de dialog. Comenzile, n funcie de modul n care pot aciona, sunt grupate n meniuri. Astfel: Titlurile meniurilor Barele cu instrumente

Meniul Edit conine operaiile pentru editarea textelor, inclusiv a comenzilor din fereastra document Command.

n fereastra Command putei s editai comenzile. Pentru editare putei folosi aceleai tehnici ca i n cazul editoarelor de texte.

9 File conine opiuni pentru operaii cu fiiere: creare, deschidere, salvare, tiprire. Mai conine i opiunea pentru nchiderea aplicaiei Visual FoxPro: Exit.

62 Informatic
9 Edit conine opiuni pentru editarea textelor: operaii de selectare, operaii de copiere (Cut, Copy, Paste), operaii de cutare i nlocuire (Find i Replace), inserarea sau legarea obiectelor. 9 View conine opiuni pentru modificarea obiectelor afiate n fereastra aplicaiei. Cea mai important opiune este Toolbars... care v permite s alegei barele cu instrumente care vor fi afiate. 9 Format conine opiuni pentru formatarea textelor afiate n ferestrele document ale aplicaiei (fontul, dimensiunea i stilul caracterelor, indentarea i spaiul dintre liniile paragrafelor). 9 Tools conine opiuni prin care putei alege diferite instrumente: proceduri asistent, editorul de macrocomenzi, ferestrele pentru depanarea programului (Debug) sau pentru executarea pas cu pas a programului (Trace). 9 Program conine opiuni pentru compilarea i executarea programelor. 9 Window conine opiuni pentru operaii cu ferestrele document: aranjarea ferestrelor (Arrange All), ascunderea ferestrei active (Hide), tergerea ferestrei active (Clear), comutarea ntre ferestre (Cycle), deschiderea ferestrei de comenzi (Command Window), deschiderea ferestrei pentru vizualizarea tabelelor din baza de date deschis i a legturilor dintre tabele (View Window). 9 Help conine opiuni pentru asigurarea asistenei utilizatorului.
Sistemul de meniuri este dependent de context. n funcie de operaiile care se execut, mai pot s apar meniurile: Titlul meniului Database este afiat n bara de meniuri numai dac n fereastra aplicaiei este deschis o fereastr document de tip baz de date n care sunt afiate tabelele bazei de date i relaiile dintre ele.

Utilizarea unor instrumente de prelucrare a datelor

63

9 Table conine opiuni pentru manipularea nregistrrilor din tabel: adugarea de noi nregistrri - Append New Record i Append Records..., marcarea pentru tergere a nregistrrilor (tergerea logic) - Delete, refacerea nregistrrilor terse logic - Recall tergerea fizic a nregistrrilor marcate pentru tergere - Remove Deleted Records, poziionarea pe o nregistrare din tabel - Go to Record..., nlocuirea valorilor unor cmpuri cu alte valori - Replace Field..., actualizarea indexului tabelului pentru a reflecta situaia actual - Rebuild Indexes etc. Meniul mai conine i opiuni pentru stabilirea proprietilor tabelului (Properties...) i pentru alegerea fontului, a dimensiunii i a stilului caracterelor cu care se afieaz datele din tabel (Font...) etc. 9 Database conine opiuni pentru manipularea tabelelor din baza de date: crearea unui tabel nou i adugarea lui la baza de date - New Table, adugarea unui tabel la baza de date - Add Table, crearea unei noi vizualizri i adugarea ei la baza de date New Local View, modificarea structurii tabelului selectat din baza de date - Modify, afiarea coninutului tabelului selectat din baza de date ntr-o fereastr de editare Browse, nlturarea unui tabel din baze de date - Remove, actualizarea indexului tabelului selectat din baza de date - Rebuild Table Indexes, tergerea fizic a nregistrrilor marcate logic pentru tergere din tabelul selectat din baza de date Remove Deleted Records..., editarea relaiei selectate dintre dou tabele ale bazei de date - Edit Relationship... deschiderea ferestrei generatorului pentru integritatea referenial a bazei de date - Referential Integrity... etc.
Titlul meniului Table este afiat n bara de meniuri numai dac n fereastra aplicaiei este deschis o fereastr document de tip tabel al bazei de date.

64 Informatic
Bara de stare furnizeaz informaii despre obiectul focalizat (titlu de meniu, opiune de meniu, buton din bara cu instrumente etc.), despre programul care se execut (numele programului) sau despre tabelul bazei de date selectat. n acest ultim caz, furnizeaz informaii despre identificatorul tabelului (<nume_baz_date> ! <nume tabel>) i aliasul tabelului, despre numrul nregistrrii curente x din numrul total de nregistrri y. Afiarea se face sub forma <x>/<y>. Aceste informaii sunt afiate n partea stng a barei de stare:

Identificatorul tabelului i al bazei de date din care face parte

Numrul nregistrrii curente i numrul total de nregistrri din tabel

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

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

Obiectul indicat cu mouse-ul a fost spaiul liber al ferestrei generatorului de baz de date. Meniul contextului conine opiuni care se refer la baza de date.

Obiectul indicat cu mouse-ul a fost un tabel al bazei de date. Meniul contextului conine opiuni care se refer la tabel.

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

Utilizarea unor instrumente de prelucrare a datelor

65

9 Ferestrele pentru constructori i generatoare. Se folosesc pentru crearea i modificarea diferitelor elemente Visual FoxPro: baze de date (Database Designer), tabele ale bazei de date i indeci (Table Designer), vizualizri (View Designer), interogri (Query Designer), formulare pentru introducerea datelor (Form Designer), rapoarte (Report Designer), meniuri (Menu Designer). 9 Fereastra pentru administratorul de proiecte (Project Manager). Proiectul este o colecie de fiiere, date, documente i obiecte Visual FoxPro folosite de o aplicaie. 9 Fereastra pentru editarea fiierelor cu texte, a fiierelor de programe i a cmpurilor memo. Numele ferestrei va fi numele fiierului, iar n cazul cmpului memo numele va fi format din numele tabelului i numele cmpului memo, separate prin punct. 9 Fereastra pentru editarea unui tabel. Poate s fie de tip Browse cnd sunt afiate mai multe nregistrri din tabel, cte o nregistrare pe fiecare rnd sau de tip Edit cnd este afiat o singur nregistrare, cte un cmp pe fiecare rnd. Numele ferestrei este numele tabelului. 9 Fereastra Debug. Se folosete pentru depanarea programelor. 9 Fereastra Trace. Se folosete pentru executarea pas cu pas a unui program.
Deschiderea unei ferestre document se face automat la alegerea unei opiuni de meniu sau printr-o comand. Operaiile cu ferestrele document (redimensionarea, minimizarea, maximizarea, mutarea, defilarea coninutului) se execut la fel ca la orice aplicaie Microsoft Office. Pentru operaia de ascundere a unei ferestre alegei opiunea Hide Window.

Barele cu instrumente grupeaz dup funcii butoanele scurtturi pentru opiunile din meniuri. Bara standard conine aceleai butoane ca orice bar standard din aplicaiiile Microsoft Office. Celelalte bare grupeaz n general butoane care corespund ferestrelor document ale generatoarelor (Database Designer, Form Designer, Report Designer, View Designer i Query Designer) sau butoane prin care pot fi inserate diferite controale n formulare sau rapoarte (Form Controls i Report Controls). Controalele care pot fi inserate ntr-un formular pot fi: etichete, casete de text, deruloare, butoane de comand, comutatoare, butoane de opiuni, liste, casete combinate, grile etc.

Limbajul de comand
Comenzile vor fi editate n fereastra Command. Fiecare comand se scrie pe un rnd. Terminarea unei comenzi se marcheaz prin acionarea tastei Enter. Acionarea acestei taste semnific faptul c interpretorul de comenzi poate prelua aceast comand s o analizeze, s o decodifice i s o lanseze n execuie.

Comanda este o succesiune de caractere organizate conform sintaxei limbajului, prin care i se cere calculatorului s execute o aciune. Sintaxa se refer la structura liniei de comand. Linia de comand are urmtoarea sintax: verb list adverbe
Enter

definete aciunea

precizeaz modul n care se execut aciunea comandat de verb

Observaii: 1. Cuvintele comenzii (verbe i adverbe) se separ prin spaiu.

66 Informatic
2. n general, adverbele din list pot fi scrise n orice ordine. 3. Cuvintele din comand pot fi scrise cu litere mari sau mici sau combinaie de astfel de litere. 4. Verbul comenzii poate fi prescurtat la primele patru caractere ale cuvntului. 5. Comanda trebuie scris pe un singur rnd. Dac vrei s o scriei pe mai multe rnduri, nainte de acionarea tastei Enter (care semnific terminarea comenzii), trebuie s scriei caracterul ; . Prezena lui nseamn c prin acionarea tastei Enter comanda nu se termin, ci se continu pe rndul urmtor. 6. Lungimea maxim a unei linii de comand este de 1024 caractere. 7. Adverbele pot fi: 9 nume de cmpuri, nume de variabile de memorie, nume de fiiere, aliasuri, expresii. 9 o list - reprezint un grup de elemente asemntoare (nume de cmpuri, nume de variabile de memorie etc.). Separarea lor n list se face prin virgul. 9 un domeniu (scope) - reprezint un grup de nregistrri dintr-un tabel. Domeniul poate fi precizat prin: a. cuvinte cheie: Record <n> - nregistrarea cu numrul n, Next <n> - urmtoarele n nregistrri, ncepnd cu nregistrarea curent, All - toate nregistrrile, Rest - toate nregistrrile pn la sfritul tabelului ncepnd cu nregistrarea curent. b. clauze (precizeaz un anumit tip de aciune): For <x> - numai nregistrrile care satisfac condiia precizat prin expresia logic x, ncepnd cu prima nregistrare a tabelului. While <x> - toat secvena de nregistrri care urmeaz nregistrrii curente pentru care expresia logic x este adevrat, pn la prima nregistrare pentru care expresia nu este adevrat. Alte clauze care pot fi folosite ca adverbe sunt: All/Like/Except <ablon> - poate fi folosit pentru a preciza un grup de variabile de memorie, tablouri de memorie sau fiiere, al cror nume corespunde ablonului. Comanda va aciona asupra tuturor (All), numai asupra celor care corespund ablonului (Like) sau numai asupra celor care nu corespund ablonului (Except). To - controleaz ieirea unei comenzi, redirecionnd-o fa de ieirea standard (care este ecranul). Ieirea poate fi: un fiier: File <nume_fiier> un tablou de memorie: Array <nume_tablou> imprimanta: Printer In <alias> - permite manipularea unui tabel ntr-o alt zon de lucru precizat prin alias. Alias este un nume care se atribuie unui tabel, diferit de numele pe care l-a primit acesta la crearea sa. Poate fi folosit pentru identificarea tabelului. Additive - controleaz modul n care se scriu date ntr-un fiier; prezena acestei clauze precizeaz c datele vor fi adugate la fiier (scrise la sfritul fiierului), iar absena clauzei precizeaz c datele vor fi scrise la nceputul fiierului (vechile date din fiier se vor distruge).

Utilizarea unor instrumente de prelucrare a datelor


For <x> Schemele logice descriu modul n care clauzele For i While definesc domeniul nregistrrilor.
BOF

67

While <x>

nregistrarea curent

nu Not EOF da nu da x=.T. sfrit

Not EOF and x=.T. da comanda care acioneaz asupra nregistrrii

nu sfrit

comanda care acioneaz asupra nregistrrii

salt la urmtoarea nregistrare

salt la urmtoarea nregistrare

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

1.2.2. Modul de lucru programat


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

Utilizarea unor instrumente de prelucrare a datelor


For <x> Schemele logice descriu modul n care clauzele For i While definesc domeniul nregistrrilor.
BOF

67

While <x>

nregistrarea curent

nu Not EOF da nu da x=.T. sfrit

Not EOF and x=.T. da comanda care acioneaz asupra nregistrrii

nu sfrit

comanda care acioneaz asupra nregistrrii

salt la urmtoarea nregistrare

salt la urmtoarea nregistrare

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

1.2.2. Modul de lucru programat


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

68 Informatic
memorat n fiier. n plus, de fiecare dat cnd se dorete executarea acelor comenzi, ele nu vor mai fi scrise, ci lansate direct n execuie din fiierul de comenzi. Pentru crearea unui fiier de comenzi se deschide fereastra editorului de texte folosind comanda: Modify command <nume_fiier> n fereastra de editare vei scrie comenzile, cte una pe fiecare rnd, aa cum le scriai i n fereastra de comenzi. Operaiile pentru editare (selectare, copiere sau mutare text selectat, cutare sau cutare cu nlocuire a unui ir de caractere, anularea ultimei operaii) sunt operaiile obinuite ale unui editor de texte Windows. Comenzile pentru aceste operaii se gsesc sub form de opiuni n meniul Edit. Dup ce ai scris comenzile, salvai fiierul cu opiunea SaveFile. Pentru nchiderea ferestrei de editare putei folosi scurtturile: Ctrl+W pentru nchiderea cu salvare sau Esc pentru nchiderea fr salvare. Lansai n execuie programul cu comanda: Do <nume_fiier>

1.3. Configurarea mediului de lucru Visual FoxPro


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

Set <parametru> On|Off


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

Set <parametru> to <valoare>

Utilizarea unor instrumente de prelucrare a datelor

69

Aceast form se folosete pentru parametrii care pot lua o valoare dintr-un domeniu de mai multe valori. Ei vor fi precizai prin valoare. De exemplu: Set Default to <cale_director> Schimb directorul curent n cel precizat prin <cale_director>. Set Clock to [<x>,<y>] Controleaz parametrul Clock care reprezint poziia afirii ceasului pe ecran. Ea poate fi precizat prin coordonatele <x> - numrul rndului i <y> - numrul coloanei. Poziia implicit de afiare este colul din dreapta sus al spaiului de lucru din fereastra de aplicaie Visual FoxPro. Set Hours to [12/24] Controleaz parametrul Hours care reprezint formatul de afiare al orei. El poate considera ziua ca fiind format din dou grupe de 12 ore (cu precizarea am sau pm) sau dintr-un grup de 24 de ore. Valoarea implicit este 12. Set Path to <list_ci_director> Permite stabilirea unei liste de cutare; aceast list conine mai multe ci de director n care se va cuta fiierul precizat n comand, dac nu va fi gsit n directorul curent. Pentru a vizualiza starea parametrilor care pot fi stabilii prin comenzi Set, folosii comanda: Display status Obinei informaii despre starea unui parametru care poate fi stabilit prin comenzi Set folosind funcia: Set (<nume parametru>[,1|2]) Numele parametrului se scrie ca un ir de caractere. Dac numele parametrului este folosit cu ambele forme ale comenzii Set (cum este de exemplu parametrul Clock), el reprezint doi parametri cu semnificaie diferit. n acest caz se folosete 1 sau 2 pentru a afla informaii despre fiecare parametru.

1.3.2. Configurarea mediului pentru diferite tipuri de date


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

Tipul numeric. Putei folosi comenzile:


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

70 Informatic
Tipul ir de caractere. Putei folosi comanda:
Set Exact On|Off Controleaz modul n care se execut operaia de comparare a dou iruri. Dac are valoarea on, dou iruri pentru a fi egale trebuie s aib aceeai lungime i s fie identice la nivelul fiecrei poziii a caracterelor. Dac are valoarea off, irurile pot avea lungimi diferite. Ele vor fi egale numai dac se potrivesc pn cnd se termin irul din dreapta. Valoarea implicit este on.

1.3.3. Redirectarea ieirii n mediul Visual FoxPro


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

1.3.4. Configurarea interactiv a mediului Visual FoxPro


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

Utilizarea unor instrumente de prelucrare a datelor

71

9 Internationals pentru parametrii care stabilesc formatul datelor calendaristice, al datelor moment de timp i al datelor numerice.

1.4. Comenzi pentru gestionarea fiierelor n Visual FoxPro


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

72 Informatic

1.5. Asistena utilizatorului n Visual FoxPro


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

Help dependent de context


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

Help independent de context


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

Utilizarea unor instrumente de prelucrare a datelor

73

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

74 Informatic
nchidei caseta de dialog cu glosarul executnd clic pe butonul de nchidere. nchidei fereastra Help executnd clic pe butonul de nchidere.
2. Vizualizai informaii despre controalele din caseta de dialog Toolbars (help dependent de context): Deschidei caseta de dialog Toolbars. Executai clic pe butonul Help. Se deschide fereastra Help. n fereastr este afiat subiectul Toolbar (View Menu). nchidei fereastra Help. n caseta de dialog Toolbars apsai tasta F1. Observai c aceast aciune are acelai efect ca i apsarea butonului Help. nchidei fereastra Help. 3. Lucrai cu controalele din fereastra Help (help independent de context): Deschidei fereastra Help cu ContentsHelp. n spaiul de lucru al ferestrei este prezentat o list de capitole cu subiecte. Fiecare titlu de capitol reprezint un salt ctre o list cu subcapitole. Executai clic pe numele capitolului Language Reference. n fereastr va fi afiat lista cu subcapitolele. Executai clic pe numele subcapitolului Language Reference A-Z. Se deschide caseta de dialog Help Index. Executai clic pe subiectul = Command. n fereastra Help va fi afiat coninutul subiectului = Command (Comanda =; operaia de atribuire). nchidei fereastra executnd clic pe butonul de nchidere. Lucrai cu ferestrele document ale constructorilor 1. Alegei opiunea OpenFile. Se deschide caseta de dialog Open. n list este afiat coninutul dosarului Vfp (Visual FoxPro). Deschidei din list dosarul cu exemple Sample. Deschidei apoi dosarul Data. Din lista ascuns Files of type alegei valoarea Database. Executai clic n lista cu fiiere i dosare pe numele fiierului Testdata.dbc. Executai clic pe declanatorul Ok. 2. Se deschide fereastra Database Designer (generatorul bazei de date). n fereastr este afiat baza de date a unei organizaii: tabelele i relaiile dintre tabele. n fereastr nu este activat nici un obiect. Observai c meniul Format a fost nlocuit cu meniul Database. 3. Deschidei meniul Database. Identificai opiunile disponibile. De ce nu sunt disponibile opiunile Modify..., Browse i Remove? nchidei lista meniului. 4. Executai clic pe tabelul Products. Observai informaiile din bara de stare. Deschidei meniul Database. Identificai opiunile disponibile. De ce nu este disponibil opiunea Edit Relationship...? nchidei lista meniului. 5. Executai clic pe legtura dintre tabelele Orders i Orditems. Deschidei meniul Database. De ce este acum disponibil opiunea Edit Relationship...? De ce nu sunt disponibile opiunile Modify..., Browse i Remove? nchidei lista meniului. 6. Executai dublu clic pe tabelul Products. Se deschide fereastra Table Designer (generatorul de tabele). Fereastra are numele tabelului - Products, iar n fereastr sunt afiate datele din acest tabel. n partea superioar a ferestrei sunt afiate numele cmpurilor din tabel (numele fiecrei coloane). Putei s derulai coninutul ferestrei folosind barele de derulare. Observai c meniul Database a fost nlocuit cu meniul Table. 7. Deschidei meniul Table. Identificai opiunile de meniu care pot fi folosite pentru administrarea nregistrrilor dintr-un tabel. nchidei lista meniului.

Utilizarea unor instrumente de prelucrare a datelor

75

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

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


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

3. Identificai modul n care putei modifica interactiv diferii parametri Set. Deschidei caseta de dialog Options la diferite seciuni i verificai controalele din urmtorul tabel n care este prezentat o comparaie ntre modul de lucru comand i modul de

76 Informatic
lucru interactiv. Reluai operaiile de la punctele anterioare folosind controalele din caseta de dialog Options. Parametru Mod comand Bell Set Bell On|Off Mod interactiv Seciunea General; grupul de butoane radio Off (fr sunet), Default (cu sunet implicit), Play (cu sunet ales prin intermediul unei casete de text). Seciunea View; caseta Show; comutatorul Clock. Seciunea International; grupul de butoane radio 12-Hour i 24-Hour. Seciunea International; caseta de text cu derulor Decimals Digit. Seciunea International; caseta de text Decimals Separator. Seciunea Data; comutatorul SET EXACT. Seciunea View; caseta Show; comutatorul Status Bar. Seciunea View; caseta Show; comutatorul Command Result.

Clock Clock Decimals Point

Set Clock On|Off Set Clock to [12|24] Set Decimals to Set Point to

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

Lucrai cu fereastra document a editorului de texte 1. Scriei n fereastra Command urmtoarele comenzi pe care le executai:
set fixed on set decimals to 4 set point to ',' x=4*30 ?x

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

Utilizarea unor instrumente de prelucrare a datelor

77

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

78 Informatic
Selectai fiierul a1.prg i executai clic pe declanatorul Edit. Se deschide fereastra de editare n care este ncrcat fiierul a1.prg. nchidei fereastra de editare. n list exist fiierul a1.bak. El a fost creat automat de ctre sistem atunci cnd ai fcut modificarea n acest fiier. Acest tip de fiier conine penultima versiune a fiierului. Selectai acest fiier i executai clic pe declanatorul Delete ca s l tergei. Executai clic pe declanatorul Tree. Se afieaz structura arborescent a directoarelor. n locul acestui declanator este afiat acum declanatorul Files. Nu mai sunt afiate declanatoarele Find, Sort, Edit i Attr. n locul lor sunt afiate declanatoarele Chdir (pentru schimbarea directorului curent) i Mkdir (pentru crearea unui director). Executai clic pe declanatorul Files pentru a afia lista cu fiiere i directoare. Selectai toate fiierele create n aceast sesiune de lucru i executai clic pe declanatorul Delete.

ncercai:

Adevrat/Fals: 1. Meniul Database conine opiuni pentru manipularea tabelelor din baza de date. 2. ntr-o comand putei preciza grupul de nregistrri care ncepe cu nregistrarea curent i se termin cu ultima nregistrare folosind cuvntul cheie Next. 3. n general, adverbele dintr-o comand pot fi scrise n orice ordine. 4. Verbul comenzii poate fi prescurtat la primele patru caractere. 5. Configurarea mediului de lucru Visual FoxPro se poate face prin ansamblul de comenzi Set. 6. Folosind comanda Display status afiai informaii despre starea monitorului. 7. Numrul de zecimale dintr-un numr l stabilii cu comanda Set Fixed. 8. Formularul prin intermediul cruia putei s modificai interactiv parametrii sistemului este de tip fereastr document. Completai: 1. Informaiile despre activarea/dezactivarea tastelor comutator se gsesc n ............. 2. Fereastra folosit pentru editarea comenzilor se numete .................................. 3. Fereastra generatorului de tabele ale bazei de date se numete ................................. 4. Cuvntul cheie prin care putei preciza ntr-o comand un grup de n nregistrri, ncepnd cu nregistrarea curent este ...................... 5. Pentru redirectarea ieirii unei comenzi la imprimant folosii clauza ..................... 6. Comanda prin care cerei s aflai informaii despre operaia de tergere a fiierelor Erase este ................................ 7. Formularul prin intermediul cruia putei s administrai fiierele este de tip ................ ............................. i se numete .................................... 8. Autodocumentarea declanat prin acionarea butonului Help dintr-o caset de dialog se numete help ............................... de context. Alegei rspunsul corect: 1. Meniul Table conine opiuni pentru: a) crearea i formatarea tabelelor

Utilizarea unor instrumente de prelucrare a datelor


b) manipularea nregistrrilor dintr-un tabel c) crearea legturilor ntre tabele

79

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

5. n adverbul de tip list, separarea elementelor se face prin: a) punct i virgul b) virgul 6. Lansai n execuie un program cu comanda: a) Modi Comm b) Do 7. Comanda Set clock status: a) afieaz starea ceasului b) afieaz ceasul n bara de stare c) este greit 8. Putei stabili interactiv parametrii sistemului prin intermediul: a) ferestrei document Trace b) casetei de dialog Option c) ferestrei document Project Manager

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

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

spunsuri:

80 Informatic

2. Funcii folosite pentru datele din Visual FoxPro


Tipuri de date

Numeric

Alfanumeric

Logic

Timp

Special

Logical Character ntreg Monetar Real Currency Integer Float Double Memo Date DateTime

General

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

2.1. Funcii pentru date de tip numeric


Pentru aceste funcii argumentul este de tip numeric (ntreg sau real). Argumentul poate fi o variabil sau un cmp numeric, sau o expresie al crui rezultat este numeric. Funcia Sign Abs Mod Int Ceiling Floor Sintaxa Sign(x) Abs(x) Mod(x,y) Int(x) Ceiling(x) Floor(x) Ce reprezint? Funcii pentru semnul expresiei Furnizeaz semnul argumentului x: +1 dac x>0, 0 dac x=0 i -1 dac x<0. Furnizeaz valoarea absolut (modulul) argumentului x. Funcii folosite ca operatori matematici Furnizeaz restul mpririi argumentului x la argumentul y. Funcii care aproximeaz datele Furnizeaz partea ntreag a argumentului. Furnizeaz cel mai apropiat ntreg mai mare sau egal cu argumentul. Furnizeaz cel mai apropiat ntreg mai mic sau egal cu argumentul.

Utilizarea unor instrumente de prelucrarea datelor


Funcia Round Sintaxa Round(x,y) Ce reprezint? Furnizeaz valoarea numeric a numrului precizat prin argumentul x, rotunjit la numrul de zecimale precizat prin argumentul y. Funcii matematice Furnizeaz rdcina ptrat din argument. Furnizeaz exponenialul argumentului. Furnizeaz logaritmul natural din argument. Furnizeaz logaritmul zecimal din argument.

81

Sqrt Exp Log Log10 Sin Cos Tan Asin Acos Atan Rtod Dtor Pi

Sqrt(x) Exp(x) Log(x) Log10(x) Sin(x) Cos(x) Tan(x) Asin(x) Acos(x) Atan(x) Rtod(x) Dtor(x) Pi()

Funcii trigonometrice Furnizeaz sinusul argumentului exprimat n radiani. Furnizeaz cosinusul argumentului exprimat n radiani. Furnizeaz tangenta argumentului exprimat n radiani. Furnizeaz arcsinusul argumentului exprimat n radiani. Furnizeaz arccosinusul argumentului exprimat n radiani. Furnizeaz arctangenta argumentului exprimat n radiani. Realizeaz conversia din radiani n grade. Realizeaz conversia din grade n radiani. Furnizeaz valoarea constantei (3,141592).

Observaii:
1. Putei exprima relaia dintre un numr, modulul su i semnul su astfel: x = abs(x)*sign(x) 2. Pentru a afla partea fracionar a unui numr x putei folosi expresia: x - int(x) 3. Putei folosi funciile exp() i log() pentru a calcula valoarea expresiei ab, adic a^b. tii deja c din punct de vedere matematic: ab = eb*ln(a). Putei exprima operatorul matematic pentru ridicare la putere folosind aceste funcii: a^b = exp(b*log(a)) 4. Putei folosi funciile log() i log10() pentru a calcula valoarea oricrui logaritm. tii deja c din punct de vedere matematic: logb(a)= log(a)/log(b) = log10(a)/log10(b) 5. Argumentele funciilor trigonometrice sin(x), cos(x) i tan(x) sunt specificate n radiani i nu n grade. Rezultatul furnizat de funciile asin(x), acos(x) i atan(x) Dtor() este n radiani. Pentru a transforma gradele (Degree) n radiani (Radian), i invers, se pot folosi funciile Dtor() i Rtod().

radiani

grade

Rtod()

Prelucrai date numerice cu ajutorul funciilor 1. Evaluai expresii numerice folosind funcia sqrt():

82 Informatic
a + 1- a 1 a + 1+ a 1 pentru a=4. Scriei comenzile:
a=4 e=((sqrt(a+1)-sqrt(a-1))/ (sqrt(a+1)+sqrt(a-1)))*(2-a) ?e -0.25 (rezultatul afiat)

(2 a )

2. Evaluai expresia: x2 1 pentru x=3.


x=3 e=sqrt(sqrt(sqrt(x^2-1))) ?e 1.30

3. Evaluai semnul expresiei numerice cu funciile: sign(), abs():


? abs(-1000) 1000 ? sign(-1000) -1 alfa=-1000 ? alfa=sign(alfa)*abs(alfa) .T.

-1 ? round(x,2) -5.25

5. Extragei partea fracionar dintr-un numr:


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

4.

Aproximai expresia numeric folosind funciile: ceiling(), floor(), round(), int():


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

6. Calculai modulo (restul mpririi) folosind operatorul % i funcia mod():


? mod(5,2) 1 ? 5%2 1 ? mod(5,2) = 5%2 .T. ? mod(6.5,3) 0.5 ? 6.5%3 0.5

7. Evaluai expresii numerice folosind funcia sqrt(), log(),log10(), exp():


a=2 b=3 ? a^b=exp(b*log(a)) .T.

Utilizarea unor instrumente de prelucrarea datelor


? exp(0) 1 ? exp(1) 2.72 ? log(1) 0.00 ? log(exp(5)) 5.00 ? exp(log(5)) 5.00 ? log10(1000) 3.00 ? log10(1000^2) 6.00 1.00 ? sin(dtor(90)) 1.00 ? asin(1) 1.57 ? rtod(asin(1)) 90.00 ? tan(pi()/4) 1.00 ? rtod(atan(1)) 45.00 ? rtod(atan(-1)) -45.00 ? rtod(asin(-1)) -90.00 ? rtod(acos(-1)) 180.00 ? rtod(asin(sqrt(2)/2)) 45.00

83

8. Evaluai funcii trigonometrice folosind funciile: sin(), cos(), tan(), asin(), acos(), atan(), pi(), rtod(), dtor():
? sin(pi()/2)

2.2. Funcii pentru date de tip ir de caractere


Pentru aceste funcii argumentul este de tip ir de caractere. Argumentul poate fi o variabil sau un cmp ir de caractere, ori o expresie al crei rezultat este un ir de caractere. Funcia Asc Chr Sintaxa Asc(x) Chr(x) Ce reprezint? Funcii pentru conversii Argumentul x este de tip ir de caractere. Funcia furnizeaz codul ASCII al primului caracter din argument. Argumentul x este de tip numeric ntreg cuprins ntre 0 i 255. Funcia furnizeaz caracterul al crui cod ASCII este argumentul x. Funcia furnizeaz un rezultat de tip ir de caractere.

Len Isalpha

Isupper

Islower

Isdigit

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

84 Informatic
Funcia Replicate Sintaxa Ce reprezint?

Space

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

Funcii pentru eliminarea spaiilor sau pentru inserarea spaiilor sau a altor caractere ntr-un ir de caractere Alltrim Alltrim(x) Elimin spaiile din faa i din spatele (din stnga i din dreapta) irului de caractere x. Ltrim Ltrim(x) Elimin spaiile suplimentare din faa (din stnga - left) irului de caractere x. Rtrim, Rtrim(x) Elimin spaiile din spatele (din dreapta - right) irului de Trim Trim(x) caractere x. Padc Padc(x,n[,y]) Argumentele sunt x,y de tip ir de caractere i n de tip numeric. Funcia completeaz irul de caractere x la stnga i la dreapta cu irul de caractere y astfel nct irul rezultat s aib lungimea n. Padl Padl(x,n[,y]) Argumentele sunt x,y de tip ir de caractere i n de tip numeric. Funcia completeaz irul de caractere x n fa (la stnga - left) cu irul de caractere y astfel nct irul rezultat s aib lungimea n. Padr Padr(x,yn[,y]) Argumentele sunt x,y de tip ir de caractere i n de tip numeric. Funcia completeaz irul de caractere x la sfrit (la dreapta - right) cu irul de caractere y astfel nct irul rezultat s aib lungimea n. Lower Upper Proper Funcii pentru transformarea unui ir de caractere Lower(x) Furnizeaz un ir de caractere n care literele din irul de carractere x sunt transformate n litere mici. Upper(x) Furnizeaz un ir de caractere n care literele din irul de caractere x sunt transformate n litere mari. Proper(x) Furnizeaz un ir de caractere n care literele din irul de caractere x sunt transformate astfel: prima liter este mare, iar celelalte sunt mici. Chrtran(x,y,z) Argumentele x, y, z sunt de tip ir de caractere. Furnizeaz un ir de caractere obinut prin transformarea irului de caractere x astfel: toate apariiile primului caracter din irul de caractere y sunt nlocuite cu primul caracter din irul z, toate apariiile celui de-al doilea caracter din irul y sunt nlocuite cu al doilea caracter din irul z etc. Dac expresia y are mai multe caractere dect expresia z, atunci caracterele care sunt n plus vor fi transformate n caracterul NULL. Dac expresia z are mai multe caractere dect expresia y, atunci caracterele care sunt n plus vor fi ignorate.

Chrtran

Utilizarea unor instrumente de prelucrarea datelor


Funcia Strtran Sintaxa Strtran(x,y [,z,n,m])

85

Stuff

Ce reprezint? Argumentele x, y, z sunt de tip ir de caractere, iar argumentele n i m sunt de tip numeric. Furnizeaz un ir de caractere prin nlocuirea n irul de caractere x a irului de caractere y cu irul de caractere z. nlocuirea ncepe cu apariia n a irului y i se vor nlocui numai m apariii. Dac nu se precizeaz irul z, el va fi considerat irul vid, iar efectul va fi tergerea a m apariii ale irului y ncepnd cu apariia n. Dac nu se precizeaz argumentul n, nlocuirea ncepe cu prima apariie, iar dac nu se precizeaz argumentul m, se vor nlocui toate apariiile. Stuff(x,n,m,y) Argumentele x i y sunt de tip ir de caractere, iar argumentele n i m sunt de tip numeric. Furnizeaz un ir de caractere obinut prin nlocuirea n irul de caractere x a unui subir, care ncepe din poziia n i are lungimea m, cu irul de caractere y.

Left

Right

Substr

At

Rat

Atc

Atline

Funcii pentru operaii cu subiruri de caractere Left(x,n) Argumentul x este de tip ir de caractere, iar argumentul n este de tip numeric. Furnizeaz un ir de caractere obinut prin extragerea a n caractere de la stnga irului x. Right(x,n) Argumentul x este de tip ir de caractere, iar argumentul n este de tip numeric. Furnizeaz un ir de caractere obinut prin extragerea a n caractere de la dreapta irului x. Substr(x,m,n) Argumentul x este de tip ir de caractere, iar argumentele n i m sunt de tip numeric. Furnizeaz un ir de caractere obinut prin extragerea unui subir de lungime n din irul x, ncepnd cu poziia m. At(x,y[,n]) Argumentele x iy sunt de tip ir de caractere, iar argumentul n este de tip numeric. Furnizeaz un rezultat numeric care reprezint poziia n irul y a subirului x. Cutarea se face de la stnga la dreapta, innd cont de diferena dintre literele mari i mici. Dac se precizeaz argumentul n, se caut apariia n. Rat(x,y[,n]) Argumentele x iy sunt de tip ir de caractere, iar argumentul n este de tip numeric. Furnizeaz un rezultat numeric care reprezint poziia n irul y a subirului x. Cutarea se face de la dreapta la stnga, innd cont de diferena dintre literele mari i mici. Dac se precizeaz argumentul n, se caut apariia n. Atc(x,y[,n]) Argumentele x iy sunt de tip ir de caractere, iar argumentul n este de tip numeric. Furnizeaz un rezultat numeric care reprezint poziia n irul y a subirului x. Cutarea se face de la stnga la dreapta, fr s in cont de diferena dintre literele mari i mici. Dac se precizeaz argumentul n, se caut apariia n. Atline(x,y) Argumentele x iy sunt de tip ir de caractere. Furnizeaz un rezultat numeric care reprezint linia de text din irul y n care apare prima dat subirul x. Cutarea se face innd

86 Informatic
Funcia Sintaxa Ce reprezint? cont de diferena dintre literele mari i mici i de la stnga la dreapta. Argumentele x i y sunt de tip ir de caractere. Furnizeaz un rezultat numeric care reprezint linia de text din irul y n care apare prima dat subirul x. Cutarea se face innd cont de diferena dintre literele mari i mici i de la dreapta la stnga. Argumentele x iy sunt de tip ir de caractere. Furnizeaz un rezultat numeric care reprezint linia de text din irul y n care apare prima dat subirul x. Cutarea se face innd cont de diferena dintre literele mari i mici i de la stnga la dreapta. Argumentele x iy sunt de tip ir de caractere. Furnizeaz un rezultat numeric care reprezint numrul de apariii al subirului x n irul y.

Ratline

Ratline(x,y)

Atcline

Atcline(x,y)

Occurs

Occurs(x,y)

Asc() 1. Putei folosi urmtoarele funcii pencod ASCII caracter tru conversia numr caracter: 2. Pentru irul vid funcia Len() furniChr() zeaz valoarea 0. 3. Funciile Replicate( ,n) i Space(n) furnizeaz acelai rezultat. 4. Funciile Alltrim(), Ltrim(), Trim(), Rtrim(), Padc(), Padl() i Padr() pot fi sintetizate n urmtoarele diagrame: a. Funciile pot fi folosite pentru dou tipuri de operaii: 9 eliminarea spaiilor: Alltrim(), Ltrim(), Trim(), Rtrim() 9 inserarea spaiilor sau a altor caractere: Padc(), Padl(), Padr() Padc(), Padl(), Padr()

Observaii:

ir cu spaii

ir fr spaii

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

b. Funciile acioneaz n diferite zone ale irului de caractere: 9 la stnga irului: Ltrim(),Padl() 9 la dreapta irului: Trim(), Rtrim(), Padr() 9 la ambele capete ale irului: Alltrim(), Padc()
Ltrim(),Padl() Trim(), Rtrim(),Padr()

Alltrim(), Padc()

5. Transformarea unui ir de caractere se poate face prin dou tipuri de operaii. a. transformarea din litere mari n litere mici i invers: Lower(), Upper(), Proper() b. nlocuirea unor caractere cu alte caractere: Chrtran(), Strtran(), Stuff()

Utilizarea unor instrumente de prelucrarea datelor


De exemplu, pentru funcia Strtran():
y - subirul care se nlocuiete

87

x - irul n care se nlocuiete n = 2; nlocuirea se face ncepnd cu a doua apariie m = 3; numrul de apariii care se nlocuiesc

z - subirul cu care se nlocuiete

i pentru funcia Stuff():


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

x - irul n care se nlocuiete n y - subirul cu care se nlocuiete

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

Left(x,n)

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

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

88 Informatic
fr s se in cont de diferena dintre literele mari i mici Atcline() cutarea se face n urmtoarele sensuri: de la stnga la dreapta At (), Atc(), Atline(), Atcline() sau de la dreapta la stnga Rat (), Ratline()

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

Rat(), Ratline()

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

Prelucrai iruri de caractere cu ajutorul funciilor Vei folosi mai multe funcii pentru iruri de caractere i vei observa rezultatul furnizat de aceste funcii: 1. Folosii funciile de conversie: asc(), chr():
? asc ('123') 49 codul ASCII al caracterului 1 ? asc ('abc') 97 codul ASCII al caracterului a ? asc('abc')>asc('123') .T. deoarece 97>49 ? asc ('A') 65 codul ASCII al caracterului A ? chr (65) A ? chr (7) bip semnal sonor ? asc ('1') = asc('123') .T. ? 'z'==chr (asc('z')) .T. ? 122=asc (chr(122)) .T. ? chr(asc('Z')+32) z 0 irul vid ? len ('Ana '+'Maria') 10 ? isalpha (x) .T. y='123' z=123 ? isalpha (y) .F. ? isdigit (y) .T. ? isalpha (z) mesaj de eroare ? isupper (x) .T. ? islower (x) .F.

3. Generai iruri de caractere folosind funciile: replicate (), space():


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

2. Obinei informaii despre un ir de caractere folosind funciile len(), isalpha(), isdigit(), isupper(), islower():
x='Albastru' ? len (x) 8 ? len ('')

Utilizarea unor instrumente de prelucrarea datelor


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

89

5. Transformai un ir de caractere folosind funciile: lower(), upper(), proper(), chrtran(), strtran(), stuff():
x= 'abc' y='ABC' ? upper (x) ABC ? lower (y) abc ? lower(y) = x .T. ? upper(x) = y .T.

? proper(x) Abc ? proper(y) Abc ? proper(y) = proper(upper(x)) .T. ? proper(lower(y)) = proper(x) .T. ? proper('AlFaBeT') Alfabet ? upper(x) = lower(y) .F. ? upper(y) = lower(x) .F. ? chrtran ('abcdef','bdf','111') a1c1e1 ? chrtran ('abcdef','bdf','xyz') axcyez ? chrtran ('abcdef','bdf','12') a1c2e ? len (chrtran('abcdef','bdf','12')) 5 ? chrtran ('abcdef','bdf','xyzu') axcyez ? chrtran ('mosor','ms','tp') topor ? chrtran ('cotor','cor','nal') natal a='Am cumparat bilet la "Ala Bala Portocala"' b='la' c='na' d='vala' e=strtran(a,b,c,2) ?e Am cumparat bilet la "Ana Bana Portocana" e=strtran(a,b,d,2,1) ?e Am cumparat bilet la "Avala Bala Portocala" ?stuff('parcare',4,1,'taj') partajare ?stuff('caviar',3,3,'') car s-a ters subirul 'via' ?stuff('car',3,0,'via') caviar s-a inserat subirul 'via' a=stuff('cod',4,0,'are') ?a codare a=stuff(a,1,0,'dec') ?a

90 Informatic
decodare ? at ('nr', a) 16 ? at ('Nr', a) 0 ? atc ('Nr', a) 16 ? rat('nr', a) 16 a='Ala Bala Portocala' ? at ('la',a,1) 2 ? at ('la',a,2) 7 ? at ('la',a,3) 17 ? rat ('la',a,3) 2 ? occurs('co','cocor') 2 ? occurs('la',a) 3

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

2.3. Funcii pentru date folosite pentru gestionarea timpului


Pentru aceste funcii argumentul este de tip dat pentru gestionarea timpului sau de tip dat calendaristic. Reprezentarea datei calendaristice se poate face n mai multe formate, conform tabelului. Tipul American/MDY Ansi British/French/DMY German Italian Japan/YMD USA Formatul de reprezentare ll/zz/aa aa.ll.zz zz/ll/aa zz.ll.aa zz-ll-aa aa/ll/zz ll-zz-aa

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

Utilizarea unor instrumente de prelucrarea datelor

91

Set hours to 12|24 care permite stabilirea unui format cu ziua format din 24 de ore sau a unui format cu ziua mprit n dou perioade de 12 ore (am i pm) i : Set seconds on|off care permite afiarea timpului cu secunde (on) sau fr secunde (off). Funcia Date DateTime Time Sintaxa Date() DateTime() Time() Ce reprezint? Funcii pentru aflarea timpului Furnizeaz data curent preluat din sistem. Rezultatul este de tip dat calendaristic. Furnizeaz data curent i momentul de timp preluate din sistem. Rezultatul este de tip ir de caractere. Furnizeaz numai momentul de timp preluat din sistem. Rezultatul este de tip ir de caractere.

Funcii pentru extragerea informaiilor din dat


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

Day Dow Cdow Week Month Cmonth Year Hours Minute Sec Seconds

Day(x) Dow(x) Cdow(x) Week(x) Month(x) Cmonth(x) Year(x) Hours(y) Minute(y) Sec(y) Seconds()

Furnizeaz numrul zilei din lun. Rezultatul este de tip N. Furnizeaz numrul zilei din sptmn. Rezultatul este de tip N. Furnizeaz numele zilei din sptmn. Rezultatul este de tip C. Furnizeaz numrul sptmnii din an. Rezultatul este de tip N. Furnizeaz numrul lunii din an. Rezultatul este de tip N. Furnizeaz numele lunii. Rezultatul este de tip C. Furnizeaz numrul anului. Rezultatul este de tip N (cu patru cifre). Furnizeaz numrul orei. Rezultatul este de tip N. Furnizeaz numrul minutelor. Rezultatul este de tip N. Furnizeaz numrul secundelor. Rezultatul este de tip N. Furnizeaz numrul secundelor scurse de la miezul nopii. Rezultatul este de tip N (real, n care partea ntreag reprezint secundele, iar partea fracionar milisecundele). Funcii pentru modificarea datei Argumentul x este de tip dat calendaristic, iar argumentul n de tip numeric ntreg. Funcia furnizeaz un rezultat de tip dat calendaristic a crei lun este incrementat cu n, dac n este pozitiv i decrementat cu n, dac n este negativ.

Gomonth

Gomonth(x,n)

Prelucrai date folosite pentru gestionarea timpului: 1. Extragei informaii din timpul sistemului folosind funciile: date(), time(), timedate():
? date() 03/02/01 set date to british ? date()

92 Informatic
02/03/01 set century on ? date() 02/03/2001 set century off ? time() 16:52:50 ? datetime() 02/03/01 04:53:00 PM set hours to 24 ? datetime() 02/03/01 16:54:23

4.

Extragei informaii despre luna din dat folosind funciile: month(), cmonth():
? month (d) 5 ? cmonth (d) May ? gomonth(d,3) 10/08/01

5. Extragei informaii despre an din dat folosind funcia: year():


? year(d) 2001

2. Extragei informaii despre ziua din dat folosind funciile: day(), dow(), cdow():
d={10/05/01} ? day(d) 10 ? dow(d) 5 ? cdow(d) Thursday

6. Extragei informaii despre or, minute i secunde din dat folosind funciile: hours(), minute(), sec(), seconds():
d=datetime() ? hours(d) 17 ? minute(d) 14 ? sec(d) 12 ? seconds() 62135.20

3. Extragei informaii despre sptmna din dat folosind funcia: week():


? week(d) 19

2.4. Funcii folosite pentru conversii


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

a. tip numeric tip ir de caractere


Val() tip numeric Str() tip ir de caractere

Funcia Str

Sintaxa Str(m,n,p)

Ce reprezint? Argumentele m,n i p sunt de tip numeric. Funcia convertete numrul m ntr-un ir de caractere de lungime n care conine p poziii pentru zecimale (cifre situate dup punctul zecimal). Dac numrul conine mai multe poziii dect argumentul n, rezultatul va

Utilizarea unor instrumente de prelucrarea datelor


Funcia Sintaxa

93

Val

Val(x)

Ce reprezint? fi un ir de asteriscuri. Dac numrul conine mai puine poziii dect argumentul n, irul de caractere va fi completat cu spaii pn la obinerea lungimii n. Dac numrul p este mai mic dect numrul de poziii zecimale, partea zecimal va fi trunchiat. Argumentul x este de tip ir de caractere. El trebuie s conin numai caracterele: cifre, punctul zecimal sau semnul minus, altfel conversia se va face eronat. Funcia convertete irul de caractere x ntr-un numr.

b. tip dat calendaristic tip ir de caractere


Ctod() tip dat calendaristic tip ir de caractere

Dtoc(), Dtos()

Funcia Dtoc

Sintaxa Dtoc(x)

Dtos

Dtos(x)

Ctod

Ctod(x)

Ce reprezint? Argumentul x este de tip dat calendaristic. Funcia furnizeaz un ir de 8 caractere care reprezint data. Are forma ll/zz/aa (dou caractere pentru numrul lunii, dou pentru numrul zilei i dou pentru numrul anului, separarea fcndu-se cu caracterul /). Argumentul x este de tip dat calendaristic. Funcia furnizeaz un ir de 8 caractere care reprezint data. Are forma aaaallzz (patru caractere pentru an, dou pentru numrul lunii i dou pentru numrul zilei). Argumentul x este de tip ir de caractere care formeaz o dat calendaristic. Funcia furnizeaz data calendaristic precizat prin irul de caractere.

c. tip dat pentru timp tip ir de caractere


Ctot() tip dat pentru timp Ttoc() tip ir de caractere

Funcia Ttoc Ctot

Sintaxa Ttoc(x) Ctot(x)

Ce reprezint? Argumentul x este de tip dat pentru gestionarea timpului. Funcia convertete aceast dat ntr-un ir de caractere. Argumentul x este de tip ir de caractere. irul de caractere este de forma zz/ll/aa hh:mm:ss apm (cte dou caractere pentru fiecare element: zi, lun, an, or, minut, secund i am/pm). Funcia convertete irul de caractere ntr-o dat pentru gestionarea timpului.

94 Informatic
d. tip dat pentru timp tip dat calendaristic
Dtot() tip dat pentru timp Ttod() tip dat calendaristic

Funcia Ttod Dtot

Sintaxa Ttoc(x) Ctot(x)

Ce reprezint? Argumentul x este de tip dat pentru gestionarea timpului. Funcia convertete aceast dat ntr-o dat calendaristic. Argumentul x este de tip dat calendaristic. Funcia convertete aceast dat ntr-o dat pentru gestionarea timpului, considernd ora 12:00:00 am.

Observaie:
Avantajul folosirii funciei Dtos() n locul funciei Dtoc() este acela c formatul furnizat de ea permite compararea corect a dou date calendaristice.

Facei conversii ntre tipuri de date: 1. Convertii numere iruri de caractere folosind funciile: val(), str():
a='10' b='15' ? a+b 1015 ? val(a)+val(b) 25.00 c='-10' ? val(c) -10 x=val ('10,25') ? type('x') N ?x 10.00 ? val ('10a10') 10.00 a=10 b=15 ? a+b 25 ? str(a)+str(b) 10 15 ? len(str(a)+str(b)) 20 ? str(a,2)+str(b,2) 1015 ? len(str(a,2)+str(b,2)) 4 a=12.5 ? str(a) 13 ? len(str(a)) 10 a=12345123451 ? str(a) .1234E+11 ? len(str(a)) 10

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

Utilizarea unor instrumente de prelucrarea datelor


?y 07/04/01 ?x>y .T. x=dtos(d1) ?x 20010308 y=dtos(d2) ?y 20010407 ?x>y .F. 02/03/01 00:00:00 set hour to 12 ? dtot(b) 02/03/01 12:00:00 AM

95

4.

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


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

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


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

2.5. Funcii de uz general


Aceste funcii se pot aplica pe mai multe tipuri de date: Funcia Min() Max() Between() Sintaxa Min(x1,x2,) Max(x1,x2,) Ce reprezint? Argumentele x1, x2, trebuie s fie de acelai tip. Funcia compar ntre ele toate argumentele i furnizeaz ca rezultat valoarea cea mai mic, respectiv cea mai mare. Between(x,y,z) Argumentul x, y i z trebuie s fie de acelai tip. Funcia testeaz dac valoarea argumentului x se gsete ntre valorile y i z. Funcia furnizeaz un rezultat logic (.T. dac este ndeplinit relaia y<x<z). Iif(x,y,z) Argumentul x trebuie s fie de tip logic. Rezultatul furnizat depinde de valoarea lui x. Dac x=.T., funcia afieaz valoarea lui y, iar dac x=.F., funcia afieaz valoarea lui z. Inlist(x1,x2, Funcia furnizeaz un rezultat logic. Ea testeaz dac x2,) primul argument x1 se gsete n lista descris de ceilali parametri, x2, x3, . n cazul n care valoarea se gsete n list, rezultatul este .T.. Type(x) Testeaz tipul unui argument x scris ca un ir de caractere. n funcie de coninutul irului de caractere funcia va furniza printr-o liter rezultatul: N-numeric, C-ir de caractere, L-logic, D-dat calendaristic, T-timp calendaristic, M-memo, Y-monetar, O-obiect, G-general, U-necunoscut. Empty(x) Testeaz dac o dat este vid. Rezultatul furnizat este de tip logic. Dac data este vid, rezultatul este .T..

Iif()

Inlist()

Type()

Empty

96 Informatic
Funcia Evaluate Sintaxa Evaluate(x) Ce reprezint? Funcia evalueaz un argument x scris ca un ir de caractere. n funcie de coninutul irului de caractere, funcia va furniza un rezultat de tip ir de caractere, numeric, dat calendaristic.

Observaii:
1. O dat vid este o dat care conine elementul neutru (nul) pentru acel tip de dat. De aceea, coninutul unei date vide difer n funcie de tipul datei. Astfel: Tipul datei ir de caractere Formatul de reprezentare irul vid sau irul de caractere format numai din spaii (Chr(30)), caractere nul (Chr(0)), caractere Tab (Chr(9)) i caractere sfrit de linie (Chr(13), Chr(10)). 0 {} sau {//} .F.

numeric dat calendaristic logic

2. Funcia Evaluate poate identifica tipul datelor din irul de caractere. De exemplu, evaluate(2*5+5) furnizeaz un rezultat de tip numeric egal cu 15, funcia evaluate(2>5) furnizeaz un rezultat de tip logic egal cu .F., funcia evaluate({05/03/01}+2) furnizeaz un rezultat de tip dat calendaristic egal cu data 05/05/01, iar funcia evaluate("abc"+"123") furnizeaz un rezultat de tip ir de caractere egal cu abc123. 3. Funcia Type poate identifica tipul expresiei scrise ca ir de caractere. De exemplu, type(5+5) furnizeaz tipul numeric (N), funcia type(2>5) furnizeaz tipul logic (L), funcia type({05/05/01}+10) furnizeaz tipul dat calendaristic (D), iar funcia type($20.00) furnizeaz tipul monetar (Y). 4. Funcia Iif(x,y,z) poate fi folosit pentru o structur alternativ care este descris n pseudocod astfel: if x then write y else write z endif. nu x z y da

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

2. Testai dac o variabil de memorie este vid:

Utilizarea unor instrumente de prelucrare a datelor


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

97

3. Calculai maximul i minimul:


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

4. Testai dac un element exist n list:


a=1 c=inlist(a,1,2,3,4,5) b1='Elementul este in lista' b2='Elementul nu este in lista' ?iif(c,b1,b2) Elementul este in lista a=10 c=inlist(a,1,2,3,4,5) ?iif(c,b1,b2) Elementul nu este in lista a='A' c=inlist(lower(a),'a','e','i','o','u') b1='Este vocala' b2='Nu este vocala' ?iif(c,b1,b2) Este vocala a='B' c=inlist(lower(a),'a','e','i','o','u') ?iif(c,b1,b2) Nu este vocala

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


a='a' c=between(a, 'a','z') b1='litera mica' b2='litera mare' ? iif(c,b1,b2) litera mica a='M' c=between(a, 'a','z') ? iif(c,b1,b2) litera mare varsta=10 b1='minor' b2='major' ? iif(between(varsta,0,17), b1, b2) minor varsta=18 ? iif(between(varsta,0,17), b1, b2) major

3 . C o m e n z i p e nt r u v a r i a b i l e d e m e m o r i e
tii c o variabil de memorie reprezint o zon de memorie creia i se atribuie un nume i n care se poate memora valoarea unei date elementare de un anumit tip. Referirea la variabila de memorie se face prin numele su.

98 Informatic
Visual Fox Pro folosete 9 variabile de memorie utilizator, 9 variabile de memorie sistem. Variabilele de memorie sistem sunt variabile proprii aplicaiei, pe care aceasta le creeaz automat la lansarea n execuie i pe care le pstreaz n memorie att timp ct este n execuie. Aceste variabile nu sunt terse de comenzile obinuite de tergere a variabilelor de memorie. Identificatorul lor ncepe cu caracterul linie de subliniere _. Variabilele de sistem sunt folosite de ctre aplicaie pentru configurarea mediului Visual FoxPro (de exemplu, configurarea formatelor de ieire ctre ecran sau ctre imprimant). Variabilele de memorie utilizator sunt create de ctre utilizatorul aplicaiei. Crearea lor nseamn: atribuirea unui nume, stabilirea tipului datelor pentru a se rezerva corespunztor o zon de memorie i atribuirea unei valori iniiale. Asupra unei variabile de memorie se pot executa operaii de creare i consultare. Crearea unei variabile de memorie se face prin:

1. iniializare folosind
9 operaia de atribuire a unei valori (constant sau valoare obinut prin evaluarea unei expresii) 9 comanda Store care are sintaxa:
Store <expresie> to <list_nume_variabile>

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


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

Utilizarea unor instrumente de prelucrare a datelor

99

Putei obine informaii complexe despre un grup de variabile de memorie (nume, dac 1 sunt publice - public sau particulare - private, tip, valoare) folosind comenzile List Memory i Display Memory: List | Display Memory [Like <ablon>] [ to print | to file <nume_fiier>] <ablon> reprezint descrierea grupului de variabile folosind conveniile clasice pentru caracterele de nlocuire ? i *. Lista de variabile de memorie poate fi afiat pe ecran sau la imprimant (to print) ori salvat ntr-un fiier (to file <nume_fiier>). Chiar dac sistemul v permite s definii 65.000 de variabile de memorie, este bine s tergei variabilele de memorie pe care nu le mai folosii. Operaia se numete eliberarea memoriei interne. Putei folosi urmtoarele comenzi:

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


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

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


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

O variabil public sau global poate fi folosit de orice subprogram al aplicaiei, iar o variabil particular sau local poate fi folosit numai n subprogramul n care a fost creat. Toate variabilele create n fereastra de comenzi sunt publice.

100 Informatic
9 Comanda Restore from readuce n memoria intern variabilele de memorie dintr-un fiier identificat prin nume; dac nu se precizeaz clauza additive, variabilele de memorie i tablourile de memorie care existau n memorie naintea restaurrii vor fi distruse: Restore from <nume_fiier> [Additive]

Prelucrai variabile de memorie 1. Creai variabile de memorie; nainte de a crea aceste variabile de memorie eliberai memoria de orice alte variabile de memorie create anterior:
clear memory store 0 to a1, a2, a3 store .T. to b1, b2 x1='alfa' x2='beta' a1=2 a2=7 store a1*a2 to a3 accept 'Scrieti numele: ' to nume Scrieti numele: Popescu input 'Scrieti varsta: ' to varsta Scrieti varsta: 18 wait 'Raspundeti cu o litera: ' to b3 Raspundeti cu o litera: x

2. Consultai variabilele de memorie:


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

3. Eliberai memoria intern :


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

Utilizarea unor instrumente de prelucrare a datelor

101

4. Testai urmtoarea secven de instruciuni pentru mai multe valori ale variabilelor a, b i c, definite astfel: (a,b,c) {(2,3,4), (2,3,3), (3,3,3), (2,1,4)}.
input 'a= ' to a input 'b= ' to b input 'c= ' to c b1='Nu este triunghi' b2='Triunghi oarecare' b3='Triunghi echilateral' b4='Triunghi isoscel' c1=a+b>c and b+c>a and c+a>b c2= a=b and b=c c3= a=b or a=c or b=c ? iif(c1, iif(c2, b3, iif(c3 b4,b2)),b1)

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

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

102 Informatic

ncercai:

Artai corespondenele: Se evalueaz funcia: ?iif(inlist(n,1,2,3,4,5,6), iif(2**n=a,'1 octet', iif(2**n=b, ' 2 octeti', iif(2**n=c, '8 octeti', 'incorect'))), 'incorect') unde a=8, b=16, c=64. Legai prin linii fiecare element din coloana n de elementul corespunztor din coloana Afieaz: n: Afieaz: 1 2 3 4 5 6 7 8 Adevrat/Fals: 1. Funcia isdigit('123') furnizeaz rezultatul adevrat. 2. Pentru a afia irul de caractere 12345 din numrul ntreg 12345 folosii funcia str(12345,5,0). 3. Rezultatul funciei max(day(d)+2,month(d)+5) este 7 pentru valoarea {02/04/01} a variabilei de memorie d afiat n formatul american. 4. Funcia prin care convertii un caracter n codul su ASCII se numete val. 5. Eliminai spaiile din stnga unui ir de caractere cu funcia left(). 6. Funcia at() nlocuiete ntr-un ir de caractere un subir cu un alt subir. 7. Funcia floor() se folosete pentru aproximarea unui numr. 8. Comanda ?? se folosete pentru a afia la imprimant un ir de caractere. Completai: 1. 2. 3. 4. 5. 6. 7. 8. Funcia mod(10,5) furnizeaz rezultatul Funcia len(padc(5,'alfa')) afieaz valoarea ...... Funcia occurs('a','calamar') afieaz rezultatul ............... Funcia prin care convertii un numr ntr-un ir de caractere se numete ........ Pentru a extrage n caractere dintr-un ir de caractere folosii funcia .............. Funcia str() cu care putei s obinei irul de caractere 123 din numrul 123.45 este .... Pentru a obine valoarea numeric 23 din irul de caractere .1234 vei folosi funciile: ...... Pentru a obine valoarea 23 din numrul 1234 vei folosi funciile ............. a b c d 1 octet 2 octei 8 octei incorect

Alegei rspunsurile corecte: 1. Funcia ceiling(-3.5) afieaz: a) -3 b) -4 2. Funcia round(3.5) afieaz: a) 3 b) 4 c) 4 c) eroare

Utilizarea unor instrumente de prelucrare a datelor

103

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

104 Informatic
11. Ce funcie putei folosi pentru a testa dac valoarea unei date aparine unui interval? Dar pentru a testa dac aparine unei mulimi de valori? 12. Ce funcie putei folosi pentru a descrie o structur alternativ? 13. Scriei funciile prin care putei s realizai urmtoarele transformri de cuvinte: cor color covor cotor color cosor cosar covor cotor motor mosor calculator calator abator abatere 14. Scriei funciile prin care descompunei n cuvintele componente urmtoarele cuvinte compuse i expresii: via de vie, Spitalul de Urgen, Delta Dunrii i cocoul de munte. 15. Trebuie s tergei un grup de variabile de memorie. Ce operaie vei folosi dac putei s descriei grupul printr-un ablon? Ce operaie vei folosi dac nu putei s descriei grupul printr-un ablon?

Artai corespondenele: 1-d; 2-d; 3-a; 4-b; 5-d; 6-c; 7-d; 8-d. Adevrat/Fals: 1-A; 2-A; 3-A; 4-F; 5-F; 6-F; 7-A; 8-F. Completai: 1-0; 2-5; 3-3; 4-str(); 5-substr(); 6-str(123.45,3); 7-int(val(substr('.1234',3,2))); 8-int(val(substr(str(1234,4),2,2))) Alegei rspunsurile corecte: 1-a; 2-c; 3-a; 4-a; 5-c;6-b; 7-b; 8-c; 9-b; 10-b; 11-c;12-b,c; 13-b; 14-a,b,c.

spunsuri:

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

est pentru evaluare:

Utilizarea unor instrumente de prelucrare a datelor

105

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

106 Informatic

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

spunsuri:

Utilizarea unor instrumente de prelucrare a datelor

107

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


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

Cutarea unei nregistrri dup valoarea unui cmp se face mult mai rapid atunci cnd nregistrrile sunt ordonate dup acel cmp, deoarece n cazul unei structuri ordonate se pot folosi diferii algoritmi de cutare. De exemplu, pentru a gsi nregistrarea care ndeplinete condiia a=34 (valoarea cmpului a este 34), n cazul unei parcurgeri secveniale se vor executa 8 operaii de verificare, cte una pentru fiecare nregistrare. n cazul ordonrii structurii se poate folosi, de exemplu, algoritmul de njumtire a intervalului. Cutarea se

108 Informatic
va face n fiierul index folosind acest algoritm. Se mparte fiierul n dou: n prima jumtate se vor gsi nregistrrile pentru care a[10,34], iar n a doua jumtate se vor gsi nregistrrile pentru care a[40,90]. Se verific i se vede c valoarea 34 a cmpului a aparine primului interval. Se mparte i acest interval n dou: n prima jumtate se vor gsi nregistrrile pentru care a[10,12], iar n a doua jumtate se vor gsi nregistrrile pentru care a[23,34]. Se verific i se vede c valoarea 34 a cmpului a aparine celui de-al doilea interval. Se mparte i acest interval n dou: n prima jumtate se va gsi o singur valoare (23), iar n a doua jumtate se va gsi o singur valoare (34), care este valoarea cutat. Pentru aceast valoare, n index exist numrul nregistrrii: 8. Se poziioneaz n tabel pointerul de nregistrare direct pe nregistrarea 8. n acest caz s-au executat numai trei operaii de verificare (de apartenen a valorii cmpului a la un interval). Start Indiferent de modul n care este exploatat tabelul, algoritmul de exploatare cuprinde urmtorii pai: deschiderea tabelului, prelucrarea i nchiderea. Open Tabelul este memorat ntr-un fiier de date care are acelai nume ca i tabelul i extensia .dbf. Pentru a se putea prelucra nregistrrile dintr-un Prelucrare tabel, trebuie deschis fiierul n care acesta este pstrat. Prin operaia de deschidere i se aloc o zon de memorie intern n care urmeaz s fie transferate de pe disc nregistrrile care vor fi prelucrate. Deschiderea Close fiierului se face fie folosind opiunea de meniu Open...File, fie prin intermediul comenzii: Stop use <nume_fiier> Dup ce ai prelucrat nregistrrile din tabel trebuie nchis fiierul. Prin operaia de nchidere se elibereaz zona de memorie intern alocat fiierului. nchiderea fiierului se face prin intermediul comenzii: use Mai putei s nchidei tabelul din fereastra View (pe care o deschidei cu opiunea View WindowWindow). Selectai numele tabelului i executai clic pe declanatorul Close. Operaiile puse la dispoziie de Visual FoxPro pentru administrarea datelor dintr-un tabel al bazei de date pot fi grupate astfel:

1. Crearea unui tabel care cuprinde operaii pentru:


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

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


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

Utilizarea unor instrumente de prelucrare a datelor

109

4.1. Crearea tabelului


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

4.1.1. Crearea structurii tabelului


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

110 Informatic
unde <nume_tabel> este numele tabelului care se creeaz i a crui structur se definete prin precizarea pentru fiecare cmp a numelui su <nume_cmp>, a tipului <tip>, a dimensiunii <lime> i a numrului de poziii din partea fracionar <poz_zec> (numai pentru cmpurile reale numeric, float i double). 2. Prin preluarea structurii dintr-un alt tabel: 9 Prin preluarea structurii dintr-un tabel de structur. Tabelul de structur este un tabel n care se pstreaz informaii despre structura unui alt tabel (proprietile cmpurilor). El a fost creat cu comanda copy structure extended. Sintaxa comenzii este: create <nume_tabel1> from <nume_tabel2> unde <nume_tabel1> este numele tabelului a crui structur se creeaz prin preluarea structurii din tabelul de structur care are numele <nume_tabel2>. 9 Prin preluarea structurii dintr-un tabel deschis. Pot fi preluate toate cmpurile din structur sau numai o parte din ele. Sintaxa comenzii este: copy structure to <nume_tabel> [fields <list_nume_cmpuri>] unde <nume_tabel> este numele tabelului care se creeaz i a crui structur se preia din tabelul deschis n acel moment; se pot prelua toate cmpurile sau numai cmpurile precizate n lista clauzei fields.

4.1.2. Manipularea structurii tabelului


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

Utilizarea unor instrumente de prelucrare a datelor

111

adugate din aceste fiiere la noua structur de tabel. Putei s pstrai i vechea versiune, redenumind fiierele nume.bak cu nume_nou.dbf i nume.tbk cu nume_nou.fpt. Mai putei s deschidei caseta de dialog i din fereastra View. Selectai numele tabelului i executai clic pe declanatorul Properties.... n caseta de dialog Work Area Properties executai clic pe declanatorul Modify.... 3. Copierea structurii tabelului: Putei s copiai structura tabelului deschis: 9 ntr-un tabel de structur. Acest tabel are o structur predefinit. El conine 11 cmpuri, cte un cmp pentru fiecare proprietate a cmpului (de exemplu, field_name pentru numele cmpului, field_type pentru tipul cmpului, field_len pentru lungimea cmpului, field_dec pentru numrul de poziii ale prii fracionare, field_null pentru a stabili dac se accept valoarea null n cmp, field_defa pentru valoare implicit a cmpului etc.). n tabel exist cte o nregistrare pentru fiecare cmp (aadar, va avea attea nregistrri, cte cmpuri are tabelul pentru care pstreaz structura). Sintaxa comenzii este: copy to <nume_tabel> structure extended unde <nume_tabel> este numele tabelului n care se va pstra structura. 9 ntr-un tabel precizat prin <nume_tabel>. Pot fi copiate toate cmpurile din structur sau numai o parte din ele. Sintaxa comenzii este: copy structure to <nume_tabel> [fields <list_nume_cmpuri>] Observaie: Pentru a vedea ce conin tabelele n care au fost copiate structurile, trebuie s le deschidei. Observaie: Dac ntr-o comand nu se specific numele unui tabel, nseamn c ea se refer la tabelul deschis. De exemplu, comenzile list structure, modify structure etc.

4.1.3. Manipularea i controlarea cmpurilor dintr-un tabel


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

112 Informatic
2. Prin intermediul funciilor se pot obine informaii despre cmpuri: 9 numele cmpului dintr-o poziie precizat se obine cu funcia field(<n>), unde <n> este numrul de ordine al cmpului; 9 numrul de cmpuri din tabel se obine cu funcia fcount(); 9 lungimea unui cmp din tabel se obine cu funcia fsize(<nume>) unde <nume> este numele cmpului; 9 dimensiunea nregistrrii din tabel se obine cu funcia recsize().

4.1.4. Cmpurile memo


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

Obiectul: realizarea bazei de date a unei companii care ofer servicii de consultan.
Scopul bazei de date: gestionarea serviciilor de consultan asigurate clienilor de ctre angajaii companiei.

Utilizarea unor instrumente de prelucrare a datelor

113

Cerine: 9 Fiecare angajat al companiei are o persoan din cadrul companiei care i monitorizeaz i i supervizeaz activitatea. 9 Atunci cnd un client solicit pentru prima dat serviciile acestei companii, i se repartizeaz un angajat care s se ocupe de el. De obicei angajatul se ntlnete cu clientul pn cnd i se rezolv problema. 9 n cadrul primei discuii, angajatul stabilete obiectivele consultanei, termenele i costul estimativ. Aceste date se pot modifica pe parcursul desfurrii consultanei. Toate aceste modificri trebuie pstrate n baza de date. 9 Pentru fiecare edin de consultan trebuie s se pstreze date despre modul n care serviciile prestate de angajat ndeplinesc obiectivele consultanei, n conformitate cu termenele stabilite. Pentru fiecare edin se vor nregistra urmtoarele date: data edinei, angajatul cu care s-a ntlnit clientul, durata edinei, suma facturat pentru edin, rezumatul modului n care a decurs ntlnirea. 9 Costul unui serviciu de consultan este n funcie de ore. Tariful orar depinde de angajatul care s-a ocupat de client: cu ct acesta are mai mult experien, cu att tariful este mai mare. Pentru fiecare edin de consultan se emite o not de plat. 9 Totalul sumelor facturate prin notele de plat trebuie s fie comparate cu valoarea estimat pentru costul consultanei. 9 Unii clieni sunt ntmpltori, alii devin permaneni, solicitnd frecvent diferite servicii de consultan. Compania poate derula la un moment dat dou sau mai multe contracte de consultan cu acelai client. Pentru fiecare contract se va ine o eviden separat a notelor de plat. 9 Pe lng notele de plat, baza de date trebuie s furnizeze un raport lunar al activitilor cu fiecare client. 9 Un angajat al companiei are mai muli clieni, iar un client poate lucra cu mai muli angajai ai companiei. Pentru a putea rspunde la toate aceste cerine, baza de date va fi format din urmtoa13 rele tabele : Tabelul Angajai care va trebui s conin urmtoarele date (sub form de cmpuri): 9 Identificatorul angajatului (id_ang, I). Este un numr care identific unic angajatul i este folosit pentru cheia primar. 9 Numele angajatului (nume, C, 20). Deoarece pot s apar cutri n tabel i dup numele angajatului, acest cmp va fi cheie de indexare mpreun cu cmpul prenume. 9 Preumele angajatului (pren, C, 20). 9 Tip angajat (tip_ang, C, 1). Acesta este un cod care folosete un singur caracter prin care se identific tipul angajatului: permanent cu norm ntreag (a), permanent cu jumtate de norm (b), temporar cu norm ntreag (c), temporar cu jumtate de norm (d), colaborator cu ora (e) sau cu angajamentul terminat (f).

13

n descrierea structurii de date a tabelelor se vor folosi pentru tipul datelor: I - integer, F - float, C - character, M - memo, D - date, T - DateTime, L - logic. n cazul n care lungimea cmpului nu este determinat de tipul datelor, se va preciza i lungimea cmpului. De exemplu, nume,C,20 nseamn cmpul nume este de tip Character i are lungimea 20.

114 Informatic
9 Identificatorul superiorului (id_sup, I). Este un numr care identific angajatul cruia i este subordonat. Trebuie s fie de acelai tip ca i cmpul identificatorul angajatului. deoarece superiorul este i el angajat al companiei. 9 Data naterii (data_n, D). Este data naterii angajatului. 9 Data angajrii (data_a, D). Este data angajrii. 9 Data ncetrii angajrii (data_i, D). Este data de la care angajatul nu mai face parte din firm (demisie, demitere, restrngere de activitate, pensionare etc.). El va fi pstrat n continuare n evidenele companiei. 9 Tariful orar (tarif, I). Este tariful perceput clientului pentru o or de consultan asigurat (prestat) de angajat. 9 Adresa angajatului (adresa, M). Deoarece adresa este un ir de caractere cu lungime care poate varia foarte mult de la un angajat la altul, pentru a nu se risipi spaiul de memorie se va folosi cmpul de tip Memo. 9 Localitatea (loc, C, 15). Deoarece compania are sucursale i birouri de reprezentan n mai multe localiti, i angajaii pot avea domiciliile n mai multe localiti. 9 Codul judeului (c_jud, C, 2). Pentru jude se nregistreaz numai codul. Separat, n tabelul Judee vor fi nregistrate i numele judeelor. 9 Codul potal (cp, C, 5). Este codul potal al adresei angajatului. 9 Telefonul fix (tel_f, C, 9). Este numrul telefonului fix al angajatului. 9 Telefonul mobil (tel_m, C, 9). Este numrul telefonului mobil al angajatului. 9 Observaii (obs, M). Conine informaii biografice ale angajatului sau referitoare la activitatea lui n cadrul companiei.
Tabelul Clieni care va trebui s conin urmtoarele date (sub form de cmpuri): 9 Identificatorul clientului (id_cl, I). Este un numr care identific unic clientul i este folosit pentru cheia primar. Este de acelai tip ca i cmpul id_ang din tabelul Angajai. 9 Numele clientului (nume, C, 20). Deoarece pot s apar cutri n tabel i dup numele clientului, acest cmp va fi cheie de indexare. Este de acelai tip ca i cmpul nume din tabelul Angajai. 9 Prenumele clientului (pren, C, 20). Este de acelai tip ca i cmpul pren din tabelul Angajai. 9 Tip client (Tip_cl, L). Cmpul va avea valoarea .T. n cazul unui client curent (are un contract de consultan n derulare). 9 Identificatorul angajatului (id_ang, I). Este un numr care identific angajatul atribuit clientului s se ocupe de el. Este de acelai tip ca i cmpul id_ang din tabelul Angajai. 9 Data intrrii (data_i, D). Este data de la care a devenit clientul companiei de consultan. 9 Adresa clientului (adresa, M). Este adresa clientului. Este de acelai tip ca i cmpul adresa din tabelul Angajai. 9 Localitatea clientului (loc, C, 15). Este localitatea de reziden a clientului. Este de acelai tip ca i cmpul loc din tabelul Angajai. 9 Codul judeului (c_jud, C, 2). Este codul judeului de reziden al clientului. Este de acelai tip ca i cmpul c_jud din tabelul Angajai. 9 Codul potal (cp, C, 5). Este codul potal al adresei clientului. Este de acelai tip ca i cmpul cp din tabelul Angajai. 9 Fax (fax, C, 9). Este numrul de fax al clientului. 9 Telefonul fix (tel_f, C, 9). Este numrul telefonului fix al clientului. Este de acelai tip ca i cmpul tel_f din tabelul Angajai. 9 Telefon mobil (tel_m, C, 9). Este numrul telefonului mobil al clientului. Este de acelai tip ca i cmpul tel_m din tabelul Angajai.

Utilizarea unor instrumente de prelucrare a datelor

115

9 Observaii (obs, M). Conine scurte informaii despre client i relaiile sale cu compania de consultan.
Tabelul Judee care va trebui s conin urmtoarele date (sub form de cmpuri): 9 Codul judeului (c_jud, C, 2). Este folosit pentru cheia secundar. 9 Numele judeului (n_jud, C, 15). Un angajat poate s aib mai muli clieni, iar de un client se pot ocupa mai muli angajai. Aadar, ntre tabelele Angajai i Clieni, tipul de relaie este de mai-multe-lamai-multe. Din aceast cauz trebuie creat un tabel intermediar Contracte, care ine evidena contractelor de consultan: 9 Identificatorul contractului (id_cont, I). Este un numr unic folosit pentru identificarea contracului de consultan. 9 Identificatorul clientului (id_cl, I) care beneficiaz de contractul de consultan. 9 Tipul contractului (tip_c, C, 1). Este un cod atribuit contractului care definete categoria de consultan: instruire, proiectare etc. 9 Observaii (obs_c, C, 254). Conine o scurt descriere a contractului de consultan. 9 Data nceperii (data_i, D). Este data la care ncepe derularea contractului de consultan. 9 Terminat (term_c, L). Are valoarea .T. dac s-a ncheiat consultana. Deoarece estimrile se modific pe parcursul derulrii contractului (vor fi mai multe estimri pentru acelai contract) i deoarece se dorete pstrarea unui istoric al acestor estimri, ele vor fi nregistrate ntr-un tabel separat Estimri care are urmtoarea structur: 9 Identificatorul contractului (id_cont, I). Este identificatorul contractului pentru care se face estimarea. El va fi o cheie secundar, propagat din tabelul Contracte. 9 Numrul estimrii (nr_est, I). Reprezint a cta estimare este pentru acelai contract. 9 Identificatorul angajatului (id_ang, I). Este identificatorul angajatului care a fcut estimarea. 9 Obiectivul estimrii (obiectiv, C, 254). Este descrierea obiectivelor pentru aceast estimare a derulrii contractului. Descrierea trebuie s se fac precis i concis. 9 Termene (term, I). Este numrul estimativ de edine n care se va derula contractul. 9 Cost estimat (cost_e, I). Este costul estimativ al contractului de consultan. 9 Data estimriii (data_e, D). Este data la care s-a fcut estimarea. 9 Data terminrii (data_t, D). Este data estimat pentru terminarea contractului de consultan. Dar fiecare contract de consultan se desfoar pe parcursul mai multor edine de consultan. Din aceast cauz trebuie creat un tabel intermediar edine care s in evidena acestora i care are urmtoarea structur: 9 Numrul edinei (nr_s, I). Este un numr unic atribuit edinei i este folosit ca o cheie primar a tabelului care ajut la identificarea unei nregistrri din tabel (a unei edine). 9 Identificatorul contractului (id_cont, I). Este identificatorul contractului pentru care se desfoar edina de consultan. Va fi o cheie secundar propagat din tabelul Contracte. 9 Identificatorul angajatului (id_ang, I) care s-a ocupat de aceast edin de consultan. 9 Data edinei (data_s, D). 9 Durata edinei (timp_s, I). Este timpul n care s-a derulat edina. Se msoar n minute. 9 Costul edinei (cost_s, I). Se calculeaz ca produs ntre durat i tariful angajatului. 9 Rezumat (rez_s, C, 254). Este un rezumat scurt al edinei, care va fi tiprit pe notele de plat ale clientului. 9 Observaii (obs_s, M). Sunt observaii despre modul n care a decurs edina. Sunt folosite numai n interiorul companiei.

116 Informatic
Aadar, tabelul Contracte leag ntre ele toate edinele prestate pentru o consultan, iar tabelul edine leag ntre ei clientul i angajatul care au participat la acea edin. Pentru serviciile prestate, compania ncaseaz bani de la client. Clientul nu pltete o singur dat valoarea final a contractului de consultan. El va face mai multe pli pe parcursul derulrii contractului. Din aceast cauz, ncasarea nu va fi nregistrat n tabelul Contracte. Clientul nu pltete nici la fiecare edin. Din aceast cauz, ncasarea nu va fi nregistrat nici n tabelul edine. Clientul poate s aib cu compania mai multe contracte de consultan. Din aceast cauz, ncasarea nu va fi nregistrat nici n tabelul Clieni. Va trebui creat un tabel separat, tabelul ncasri, cu urmtoarea structur: 9 Numrul ncasrii (nr_i, I). Este un numr unic atribuit ncasrii. El este folosit ca o cheie primar a tabelului i ajut la identificarea unei nregistrri din tabel (a unei ncasri). 9 Identificatorul contractului (id_cont, I). Este identificatorul contractului pentru care se face ncasarea. El va fi o cheie secundar propagat din tabelul Contracte. 9 Data plii (data_p, D). 9 Modul plii (mod_p, C,50). Se folosete pentru a descrie modul n care s-a fcut plata: numerar (chitana ncasrii), ordin de plat (banc, numr), fil cec (banc, numr) etc. 9 Valoare (valoare, I). Este valoarea ncasrii i reprezint o parte din valoarea total a consultanei. 9 Observaii (obs_i, C, 254). Sunt detalii referitoare la obiectivul plilor. ntre aceste tabele s-au stabilit urmtoarele relaii: Tabelul 1 Judee Angajai Judee Clieni Contracte Contracte Contracte Tabelul 2 Angajai edine Clieni Contracte edine Estimri ncasri Tipul relaiei una-la-mai-multe una-la-mai-multe una-la-mai-multe una-la-mai-multe una-la-mai-multe una-la-mai-multe una-la-mai-multe Cmpul de legtur codul judeului codul angajatului codul judeului codul clientului numrul contractului numrul contractului numrul contractului

Angajai

Clieni

Judee Contracte

edine

Estimri

ncasri

Utilizarea unor instrumente de prelucrare a datelor

117

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

Comutatoare: Insert - insereaz un cmp deasupra cmpului selectat; Delete - terge cmpul selectat;

Bara de stare afieaz informaii despre tabel: identificatorul tabelului, numrul de nregistrri - Records (are valoarea 0 pentru c nu s-au introdus date), numrul de cmpuri definite - Fields (s-au definit 16) i lungimea nregistrrii n octei - Length (reprezint suma lungimilor tuturor cmpurilor) .

Definii un index structural pentru acest tabel, cmpul de indexare fiind cmpurile nume i prenume (nregistrrile vor fi aranjate logic n ordinea alfabetic a numelui i

118 Informatic
prenumelui; adic, atunci cnd numele este acelai, vor fi aranjate n ordinea alfabetic a prenumelui). Executai clic pe seciunea Index. n grila derulant scriei n caseta Name numele etichetei index: Nume. n stnga acestei casete de text se gsete butonul cu sgeat. Sgeata indic ordinea de aranjare: cresctor sau descresctor . Verificai ca simbolul s corespund ordonrii cresctoare. Dac este necesar, schimbai ordinea executnd clic pe buton. Putei alege din lista ascuns Type tipul de index: Primary, Candidate, Unique sau Regular (cheia obinuit). Alegei pentru acest index valoarea Regular.

Tipul de index ales Scriei expresia cheii de este Regular. indexare: nume+prenume. Butonul Move care v permite s mutai un rnd care definete un index.

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

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

Utilizarea unor instrumente de prelucrare a datelor

119

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

200, Petrescu Radu, a, 200, 280000, 03/08/1964, 06/15/1998, / / , Soseaua Mangalia nr. 34, Constanta, Ct, 34512, 041123123, 092134567, 201, Popescu Mihai, a, 200, 250000, 01/01/1965, 09/15/1998, / / , Str. Lujerului nr. 56, Constanta, Ct, 34562, 041237893, 092341561,

nchidei apoi fereastra de editare.

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

120 Informatic

Aflai cum se numete cmpul din poziia 10 folosind funcia (rspunsul este cp): ?field(10) Aflai ce dimensiune are nregistrarea folosind funcia (rspunsul este 126): ?recsize() nchidei tabelul folosind comanda use.

4.2. Poziionarea pe o nregistrare din tabel


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

4.2.1. Poziionarea dup numrul nregistrrii


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

4.2.2. Poziionarea dup un criteriu logic de cutare


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

Utilizarea unor instrumente de prelucrare a datelor


Comanda continue se folosete numai mpreun cu comanda locate. Sintaxa comenzii este: continue Dac nu se mai gsete nici o nregistrare, n bara de stare se afieaz mesajul End of locate scope. Putei s folosii aceste comenzi de poziionare i prin intermediul interfeei. Alegei opiunea Goto Record4 Table. Se deschide un submeniu cu opiuni pentru poziionarea pe o anumit nregistrare: Top (prima nregistrare), Bottom (ultima nregistrare), Next (urmtoarea nregistrare), Previous (nregistrarea precedent), Record#... (nregistrarea cu numrul precizat), Locate... (adverbele comenzii locate vor fi definite prin intermediul controalelor din caseta de dialog Locate).

121

locate for <cond>

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

continue

4.2.3. Controlarea poziionrii n tabel


Prin intermediul funciilor se pot obine informaii despre nregistrrile din tabel: 9 numrul de nregistrri din tabel se obine cu funcia reccount(); 9 numrul nregistrrii curente din tabel se obine cu funcia recno(); 9 sfritul de fiier eof() - funcia furnizeaz un rezultat logic care este .T. dac pointerul este poziionat pe ultima nregistrare din tabel; 9 nceputul de fiier bof() - funcia furnizeaz un rezultat logic care este .T. dac pointerul este poziionat pe prima nregistrare din tabel; 9 modul n care a decurs cutarea found() funcia furnizeaz un rezultat logic care este .T. dac a avut succes operaia de cutare. Aceste funcii pot fi folosite pentru a testa dac mai continuai sau nu procesul de cutare.
locate for <cond>

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

continue

Poziionai pointerul de nregistrare folosind numrul nregistrrii: Deschidei tabelul Angajai cu comanda: use angajati Executai mai multe operaii de poziionare folosind comenzile goto i skip. Observai informaia afiat n bara de stare dup fiecare operaie de poziionare.
?recno() 1 ?reccount() 5 ?bof() .F. skip-1 ?bof() .T.

122 Informatic
goto 3 ?recno() 3 goto bottom ?recno() 5 goto top ?recno() 1 skip 2*3 ?recno() 6 ?eof() .T. skip 2 End of file encountered ?recno() 6 skip -7 ?recno() 1 skip -10 Beginning of file encountered ?recno() 1

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

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

Poziionai pointerul de nregistrare folosind un criteriu de cutare:

Folosii pentru poziionare comenzile locate i continue. Urmrii efectul lor observnd informaiile afiate n bara de stare.
locate for id_ang=100 (Se caut angajatul cu codul 100.) ? nume, pren, adresa, loc (Se afieaz numele, prenumele, adresa i localitatea angajatului.) Popescu Andrei Str. Morilor nr. 50 sector 2 Bucureti continue (Se continu cutarea angajatului cu codul 100.) End of locate scope (Nu s-a mai gsit un angajat cu codul 100.) ? found() (Se testeaz dac s-a mai gsit o nregistrare.) .F (Nu s-a mai gsit un angajat cu codul 100.) locate for id_sup=100 (Se caut angajaii care au ca superior angajatul cu codul 100.) ? nume, pren, adresa, loc (Se afieaz numele, prenumele, adresa i localitatea angajatului.) Popescu Andrei Str. Morilor nr. 50 sector 2 Bucureti continue (Se continu cutarea angajailor care au superiorul cu codul 100.) ? found() (Se testeaz dac s-a mai gsit o nregistrare.) .T. (S-a mai gsit angajatul care are ca superior angajatul 100.) ? nume, pren, adresa, loc (Se afieaz numele, prenumele, adresa i localitatea angajatului.) Andronesu Ana Str. Cuza Vod nr. 20 sector 1 Bucureti continue (Se continu cutarea angajailor care au superiorul cu codul 100.) ? found() (Se testeaz dac s-a mai gsit o nregistrare.) .T. (S-a mai gsit angajatul care are ca superior angajatul 100.) ? nume, pren, adresa, loc (Se afieaz numele, prenumele, adresa i localitatea angajatului.) Ionescu Maria Str. Zorilor nr. 23 sector 4 Bucureti continue (Se continu cutarea angajailor care au superiorul cu codul 100.) End of locate scope (Nu s-au mai gsit angajai subordonai angajatului 100.) ? found() (Se testeaz dac s-a mai gsit o nregistrare.) .F. (Nu s-au mai gsit angajai subordonai angajatului cu codul 100.) ? eof() (Se testeaz dac s-a ajuns la sfritul fiierului.)

Utilizarea unor instrumente de prelucrare a datelor

123

.T. (S-a ajuns la sfritul fiierului.) locate for day(data_n)=day(date()) and month(date_n) = month(date()) Se caut angajatul care are data de natere astzi. Dac s-a gsit, afiai-i numele i prenumele. locate for upper(nume)='ANDRONESCU' and upper(pren)='ANA' Se caut angajatul care are numele Andronescu i prenumele Ana. Deoarece nu tii cu ce tip de caractere au fost scrise numele i prenumele, le transformai n litere mari. ?tel_f, tel_m (se afieaz numerele de telefon) 012345678 921222222

Executai comanda locate folosind opiunea de meniu.


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

nchidei fereastra de editare. Observai n fereastra Command comenzile corespunztoare aciunilor executate:
locate all locate for Angajati.pren= proper('Maria')

4.3. Actualizarea tabelului


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

4.3.1. Adugarea de noi nregistrri


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

124 Informatic
9 dintr-un alt tabel - se realizeaz fie prin intermediul opiunii de meniu Append Records...Table, fie prin intermediul comenzii:
append from <nume_tabel> [fields <list_cmpuri>] [for <cond>] unde <nume_tabel> este numele tabelului din care se adaug nregistrri. Implicit se adaug toate nregistrrile i toate cmpurile din tabel, dar se poate explicita numai adugarea anumitor cmpuri (cmpurile precizate n lista de cmpuri a clauzei fields) i/sau numai a anumitor nregistrri (cele care ndeplinesc condiia precizat prin expresia <cond> a clauzei for). 2. Prin inserarea n interiorul tabelului: 9 Operaia se realizeaz prin comanda: insert [before] [blank] Implicit se insereaz o nregistrare vid dup nregistrarea curent i se deschide fereastra de editare pentru a completa valorile cmpurilor. Explicit, inserarea se poate face naintea nregistrrii curente, folosind clauza before, sau se poate insera numai o nregistrare vid folosind clauza blank.

4.3.2. tergerea nregistrrilor


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

Utilizarea unor instrumente de prelucrare a datelor

125

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

Controlarea operaiei de tergere se face prin:


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

4.3.3. Modificarea nregistrrilor


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

126 Informatic
:B = <val_1>,<val_2> - se verific dac dup editare cmpul aparine intervalului definit de valorile <val_1> (limita inferioar) i <val_2> (limita superioar). Cele dou valori trebuie s fie de acelai tip. n cazul n care valoarea cmpului nu se ncadreaz ntre cele dou limite, se afieaz un mesaj de eroare care poate fi personalizat cu opiunea :F. :H = <nume_cmp> - numele cmpului afiat n fereastra de editare este nlocuit cu '<nume_cmp>' de tip ir de caractere. :W = <cond> - se va intra n operaia de editare cu cmpul respectiv numai dac este ndeplinit condiia <cond>. font - permite stabilirea fontului caracterelor afiate n fereastra de editare prin nume font i dimensiune font (de exemplu, font 'arial',12). style - permite stabilirea stilului caracterelor afiate n fereastra de editare (de exemplu, 'b' - bold, 'u' - underline, 'i' - italic, 'o' - outline, 's' - shadow). freeze - permite selectarea pentru editare a unui singur cmp (precizat prin <nume_cmp>); restul cmpurilor sunt numai pentru informare. last | noinit - fereastra este deschis cu configuraia pe care a avut-o la ultima operaie de editare. noappend - nu permite utilizatorului s adauge noi nregistrri n tabel. nodelete - nu permite utilizatorului s tearg logic nregistrri din tabel. noedit | nomodify - nu permite utilizatorului s modifice nregistrrile din tabel (numai s adauge sau s tearg). normal - deschide fereastra de editare cu valori implicite pentru parametri (culoare, dimensiune, poziie, titlu etc.). title - modific titlul ferestrei de editare cu numele <nume_t> de tip ir de caractere. partition - precizeaz coloana <m> n care se mparte fereastra n dou partiii: una de tip browse, alta de tip edit; fiecare dintre ele poate fi vzut independent. lpartition - la deschiderea ferestrei de editare, cursorul va fi afiat n partiia din partea stng, n primul cmp, altfel este poziionat n partea dreapt. nolink - cele dou partiii nu sunt legate, altfel ele sunt legate, adic atunci cnd se deruleaz coninutul unei partiii se deruleaz i coninutul celeilalte partiii. ledit - partiia din partea stng este de tip invers fa de fereastra de editare (de tip browse pentru fereastra edit i de tip edit pentru fereastra browse). redit - partiia din partea dreapt este de tip invers fa de fereastra de editare (de tip browse pentru fereastra edit i de tip edit pentru fereastra browse). valid - valideaz valorile introduse n cmpuri (validarea se face la nivelul nregistrrii i nu la nivelul cmpului cum face opiunea V); dac este adevrat condiia <cond_3>, se trece la urmtoarea nregistrare, altfel se rmne la nregistrarea care se modific i se afieaz un mesaj de eroare. Mesajul de eroare poate fi personalizat cu <mesaj> (de tip ir de caractere) cu clauza error. Opiunea :f foreaz executarea operaiei de validare chiar dac nu s-au fcut modificri n nregistrare. when - are acelai efect ca i opiunea w, cu deosebirea c se aplic la nivelul ntregii nregistrri, i nu numai la nivelul unui cmp. width - limiteaz limea cmpurilor la <p> caractere; afecteaz numai formatul de afiare din fereastr, nu i structura tabelului.

9 9 9 9 9 9 9 9 9 9 9 9 9 9 9

9 9

Utilizarea unor instrumente de prelucrare a datelor

127

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

4.3.4. Controlarea accesului la nregistrri


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

Adugai nregistrri:
use angajati Se deschide tabelul Angajai care conine deja cinci nregistrri. append Se deschide fereastra de editare. Adugai cinci nregistrri. use judete Se deschide tabelul Judee care nu conine nregistrri. append Adugai numai nregistrarea pentru Bucureti. browse fields c_jud:v=isalpha(left(c_jud,1)) and isalpha(right(c_jud,1)) :e='cod gresit':h='cod judet', n_jud:h='nume_judet' Executai clic pe opiunea Append Mode View (putei s adugai nregistrri i n fereastra de editare de tip Browse). Adugai restul nregistrrilor n fereastra Browse. Verificai mesajele de eroare care apar atunci cnd nu scriei codul judeului format din dou litere. use angajati Se deschide tabelul Angajai care conine zece nregistrri. copy structure to ang Copiai structura tabelului ntr-un tabel nou ang. use ang Se deschide tabelul Ang care nu conine nregistrri. append blank (de 5 ori) Se adaug cinci nregistrri vide. browse n fereastra de editare sunt afiate cele 5 nregistrri vide.

128 Informatic
replace all tip_ang with 'a' Se completeaz pentru toi angajaii cmpul tip_ang cu 'a'. goto top Poziionai pointerul la nceputul tabelului, deoarece comanda replace all l-a pozionat la sfritul tabelului. replace next 3 id_sup with 300, loc with 'Buzau', c_jud with 'Bz',tel_f with '038' Primii trei angajai sunt din Buzu i sunt subordonai aceleiai persoane. Pentru numrul de telefon se scrie prefixul pentru Buzu. Pointerul de nregistrare va fi poziionat pe nregistrarea 3. skip Salt la urmtoarea nregistrare (nregistrarea 4) replace rest id_sup with 100, loc with 'Bucuresti', c_jud with 'B',tel_f with '01' Ultimii doi angajai sunt din Bucureti i sunt subordonai aceleiai persoane. Pentru numrul de telefon se scrie prefixul pentru Bucureti. Pointerul de nregistrare va fi poziionat pe nregistrarea 5. browse n fereastra de editare completai cu valori restul cmpurilor. use angajati Se deschide tabelul Angajai. append from ang for c_jud='B' Se adaug din tabelul Ang la sfritul tabelului, angajaii din Bucureti. append from ang for c_jud='Bz' Se adaug din tabelul Ang la sfritul tabelului, angajaii din Buzu. browse Deschidei fereastra de editare. Observai cum s-au executat operaiile. use clienti Se deschide tabelul Clieni. browse Nu conine nici o nregistrare. appen blank (de 6 ori) Adugai 6 nregistrri vide. browse Se completeaz pentru toate nregistrrile codul clientului i codul angajatului care se ocup de el. replace for id_ang>=100 and id_ang<200 loc with 'Bucuresti', c_jud with 'B', tel_f with '01', fax with '01' Se completeaz pentru clienii de care se ocup angajaii din Bucureti localitatea, codul judeului i prefixul pentru telefon i fax. replace for id_ang>=200 and id_ang<300 loc with 'Constanta', c_jud with 'Ct', tel_f with '041', fax with '041' Se completeaz pentru clienii de care se ocup angajaii din Constana localitatea, codul judeului i prefixul pentru telefon i fax. replace for id_ang>=300 and id_ang<400 loc with 'Buzau', c_jud with 'Bz', tel_f with '038', fax with '038' Se completeaz pentru clienii de care se ocup angajaii din Buzu localitatea, codul judeului i prefixul pentru telefon i fax. brow Completai restul cmpurilor.

Modificai valoarea cmpurilor din nregistrri:


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

Utilizarea unor instrumente de prelucrare a datelor

129

browse Se afieaz modificrile fcute n fereastra de editare. replace id_sup with 100 for id_sup=1000 Se nlocuiete n tot tabelul codul superiorului 1000 cu 100. browse Se afieaz modificrile fcute n fereastra de editare. browse fields nume, pren:h='prenume', varsta= int((date()-data_n)/365) Se afieaz n fereastra browse numai cmpurile nume, pren i varsta (un cmp calculat). Pentru cmpul pren se afieaz eticheta prenume. replace for id_ang=104 tip_ang with 'c' Se modific pentru angajatul cu identificatorul 104 tipul angajatului din a n c. replace for id_ang=302 tip_ang with 'b' Se modific pentru angajatul cu identificatorul 104 tipul angajatului din a n b. browse Se afieaz modificrile fcute n fereastra de editare.

tergei nregistrri:
delete for lower(c_jud)='ct' browse nregistrrile din judeul Constana sunt marcate logic pentru tergere. set deleted on browse nregistrrile marcate logic pentru tergere nu mai sunt afiate. set deleted off browse nregistrrile marcate logic pentru tergere sunt afiate. Poziionai cursorul pe o nregistrare marcat logic pentru tergere. ?deleted() .T. Poziionai cursorul pe o nregistrare care nu este marcat pentru tergere. ?deleted() .F. recall for lower(c_jud)='ct' Refacei nregistrrile marcate logic pentru tergere. delete record 1 Marcai logic pentru tergere nregistrarea 1. set deleted on browse nregistrarea 1 nu este afiat n fereastra de editare. recall record 1 Refacei nregistrarea marcat logic pentru tergere. browse nregistrarea 1 este afiat n fereastra de editare. set deleted off

4 . 4 . C o n s u l t a r e a t a be l u l u i

Bazele de date se construiesc pentru a obine informaii ntr-un timp mai scurt. Informaiile obinute dintr-un tabel pot fi: 1. Detaliate - sub forma unor liste: Se pot folosi comenzile list sau display . Sintaxa lor este: list | display [ [fields] <list_cmpuri>] [<domeniu>] [for <cond_1>] [while <cond_2>] [to printer | to file <nume_fiier>] [noconsole] [off] Deosebirile dintre comanda list i display sunt:

Utilizarea unor instrumente de prelucrare a datelor

129

browse Se afieaz modificrile fcute n fereastra de editare. replace id_sup with 100 for id_sup=1000 Se nlocuiete n tot tabelul codul superiorului 1000 cu 100. browse Se afieaz modificrile fcute n fereastra de editare. browse fields nume, pren:h='prenume', varsta= int((date()-data_n)/365) Se afieaz n fereastra browse numai cmpurile nume, pren i varsta (un cmp calculat). Pentru cmpul pren se afieaz eticheta prenume. replace for id_ang=104 tip_ang with 'c' Se modific pentru angajatul cu identificatorul 104 tipul angajatului din a n c. replace for id_ang=302 tip_ang with 'b' Se modific pentru angajatul cu identificatorul 104 tipul angajatului din a n b. browse Se afieaz modificrile fcute n fereastra de editare.

tergei nregistrri:
delete for lower(c_jud)='ct' browse nregistrrile din judeul Constana sunt marcate logic pentru tergere. set deleted on browse nregistrrile marcate logic pentru tergere nu mai sunt afiate. set deleted off browse nregistrrile marcate logic pentru tergere sunt afiate. Poziionai cursorul pe o nregistrare marcat logic pentru tergere. ?deleted() .T. Poziionai cursorul pe o nregistrare care nu este marcat pentru tergere. ?deleted() .F. recall for lower(c_jud)='ct' Refacei nregistrrile marcate logic pentru tergere. delete record 1 Marcai logic pentru tergere nregistrarea 1. set deleted on browse nregistrarea 1 nu este afiat n fereastra de editare. recall record 1 Refacei nregistrarea marcat logic pentru tergere. browse nregistrarea 1 este afiat n fereastra de editare. set deleted off

4 . 4 . C o n s u l t a r e a t a be l u l u i

Bazele de date se construiesc pentru a obine informaii ntr-un timp mai scurt. Informaiile obinute dintr-un tabel pot fi: 1. Detaliate - sub forma unor liste: Se pot folosi comenzile list sau display . Sintaxa lor este: list | display [ [fields] <list_cmpuri>] [<domeniu>] [for <cond_1>] [while <cond_2>] [to printer | to file <nume_fiier>] [noconsole] [off] Deosebirile dintre comanda list i display sunt:

130 Informatic
diferene domeniul implicit de aciune modul de afiare efectul valorii on a parameterului deleted list toate nregistrrile defilare nu afieaz nregistrrile terse logic display nregistrarea curent paginat (ecran plin) afieaz nregistrrile terse logic

Aadar, comanda list este echivalent cu comanda display rest, iar comanda display este echivalent cu comanda list next 1 sau list record recno(). Implicit sunt afiate pe ecran toate cmpurile, inclusiv numrul nregistrrii. Explicit se poate afia numai un grup de nregistrri precizat prin <domeniu> sau clauzele for sau while, numai anumite cmpuri precizate prin clauza fields, fr numrul nregistrrii folosind clauza off, iar ieirea poate fi redirectat la imprimant sau ntr-un fiier. 2. Sintetizate - sub forma unor valori: Se pot folosi comenzi sau funcii: Comanda count sum average calculate Funcia Efectul cnt() furnizeaz numrul de nregistrri sum(<expn>) furnizeaz suma unor cmpuri numerice avg(<expn>) furnizeaz media aritmetic a unor cmpuri numerice furnizeaz rezultatul evalurii funciilor cnt(), sum() i avg().

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

Aflai media aritmetic: Deschidei tabelul Angajai. Aflai media aritmetic a tarifului folosind comanda:
average tarif average tarif to v ?v calculate avg(tarif) average for tip_ang='a' Se calculeaz i se afieaz media aritmetic a tarifului pentru toi angajaii. Se calculeaz media aritmetic a tarifului pentru toi angajaii i se pstreaz n variabila de memorie v al crui coninut se afieaz ulterior. Calculai media aritmetic cu ajutorul funciei avg(). Se afieaz media aritmetic pentru toate cmpurile numerice (inclusiv pentru cele care conin codurile angajailor i ale superiorilor; din aceast cauz cererea de informaie nu s-a fcut corect)

Utilizarea unor instrumente de prelucrare a datelor


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

131

Se afieaz media aritmetic a tarifului pentru angajaii permaneni cu norm ntreag (tip 'a'). Se afieaz media aritmetic a tarifului pentru angajaii care nu sunt permaneni cu norm ntreag (tip diferit de 'a').

Numrai nregistrri: Prin numrarea nregistrrilor care corespund unui criteriu, putei s aflai ci angajai ndeplinesc acel criteriu:
count for id_sup=100 count for id_sup=100 to v ?v count for lower(c_jud)='ct' count for tarif > 250000 Se numr i se afieaz ci angajai sunt subordonai angajatului cu identificatorul 100. Se numr ci angajai sunt subordonai angajatului cu identificatorul 100 i rezultatul se pstreaz n variabila de memorie v al crui coninut se afieaz ulterior. Se numr i se afieaz ci angajai sunt din Constana. Se numr i se afieaz ci angajai au tariful mai mare dect 250000 lei.

Afiai liste: n liste putei s afiai anumite cmpuri precizate prin lista de cmpuri i anumite nregistrri precizate prin domeniu sau clauzele for sau while:
list nume, pren, data_n for month(data_n)=03 Se afieaz numele, prenumele i data naterii pentru toi angajaii nscui n luna martie. list for id_sup=100 Se afieaz toate cmpurile pentru angajaii subordonai angajatului cu codul 100. list nume, pren, id_ang for id_sup=100 Se afieaz numele, prenumele i identificatorul pentru angajaii subordonai angajatului cu codul 100. list nume, pren, id_ang for id_sup=id_ang Se afieaz numele, prenumele i identificatorul pentru angajaii care nu sunt subordonai altor angajai. display nume, pren, id_ang for id_sup=id_ang list id_ang, nume, pren to file alfa Lista, care conine numai cmpurile cu identificatorul angajatului, numele i prenumele pentru toi angajaii, este copiat ntr-un fiier. dir alfa.* Se afieaz lista fiierelor care au numele alfa din directorul curent. Fiierul n care s-a transferat lista are extensia .txt. type alfa.txt Se afiez coninutul fiierului alfa.txt care conine lista.

Testai modul n care sunt tratate nregistrrile terse logic: Controlul se face prin parametrul deleted:
delete for lower(c_jud)='ct' set deleted on display list display all set deleted off display Se marcheaz pentru tergere logic nregistrrile angajailor din Constana. Se atribuie parametrului deleted valoarea on. Se afieaz nregistrarea curent cu comanda display. Se afieaz toate nregistrrile cu comanda list. Se afieaz toate nregistrrile cu comanda display all. Se atribuie parametrului deleted valoarea off. Se afieaz nregistrarea curent cu comanda display.

132 Informatic
list display all recall for lower(c_jud)='ct' Se afieaz toate nregistrile cu comanda list. Se afieaz toate nregistrile cu comanda display all. Se refac nregistrrile marcate logic pentru tergere.

Testai efectul filtrului definit pentru nregistrri: Putei s definii filtre pentru nregistrri cu ajutorul parametrului filter:
Se construiete un filtru. Scopul este de a lsa s treac numai angajaii din Bucureti. ?filter() Se cere afiarea filtrului. upper(c_jud)='B' Se afieaz condiia logic din filtru. list id_ang, nume, pren, loc Se afieaz att angajaii din Bucureti ct i cei din Buzu. browse Aadar, filtrul nu a fost construit corect. set filter to upper(c_jud)=='B' Se definete din nou filtrul, cu o alt condiie logic. ?filter() Se cere afiarea filtrului. upper(c_jud)=='B' Se afieaz condiia logic din filtru. list id_ang, nume, pren, loc Nu se afieaz nici o nregistrare. Din nou filtrul nu a fost definit browse corect. set filter to upper(c_jud)=='B ' Se definete din nou filtrul, cu o alt condiie logic. ?filter() Se cere afiarea filtrului. (c_jud)=='B ' Se afieaz condiia logic din filtru. list id_ang, nume, pren, loc Se afieaz numai angajaii din Bucureti. Condiia din filtru a browse fost definit corect. set filter to Se anuleaz filtrul. list id_ang, nume, pren, loc Se afieaz toate nregistrrile. browse set filter to upper(c_jud)='B'

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

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

n urma sortrii unui tabel se creeaz un alt tabel n care nregistrrile sunt rearanjate conform criteriului de sortare folosit. Operaia acioneaz asupra tabelului deschis. Sintaxa comenzii este: sort to <nume_tabel> on <cmp_1> [/a | /d] [ /c] [, <cmp_1> [/a | /d] [ /c].... ] [ascending | descending] [<domeniu>] [for <cond_1>] [while <cond_2>] [fields <list_cmpuri>] Forma implicit a comenzii este: sort to <nume_tabel> on <cmp>

Utilizarea unor instrumente de prelucrare a datelor

133

unde <nume_tabel> este numele tabelului obinut n urma sortrii tuturor nregistrrilor din tabelul deschis, iar <cmp> este numele cmpului folosit pentru cheia de sortare. Sortarea se face n ordinea cresctoare a cmpului cheie de sortare. Tabelul sortat va avea aceeai structur ca i tabelul surs. Explicit, se pot sorta din tabelul surs numai nregistrrile precizate prin <domeniu> sau clauzele for sau while i pot fi folosite mai multe chei de sortare <cmp_1>, <cmp_2> etc. Sortarea se poate face descresctor, dup toat lista de cmpuri cheie de sortare folosind clauza descending, sau poate fi controlat ordinea de sortare la nivelul fiecrui cmp, folosind adverbele /a - cresctor, /d - descresctor sau /c fr s se in cont de diferena dintre literele mari sau mici. Tabelul sortat poate s conin numai cmpurile precizate prin lista din clauza fields.
4 . 6 . I n d e x a r e a t a b e lu l u i

Pentru a putea exploata un tabel n acces direct, trebuie organizat astfel nct s avei acces direct la o nregistrare n funcie de valoarea unui cmp sau a unor cmpuri care vor forma cheia de acces. Soluia este de ordonare logic a nregistrrilor prin intermediul fiierelor index, iar cheia de acces se mai numete cheie de indexare. Visual FoxPro permite crearea a dou tipuri de fiiere de index pe lng indexul structural: 9 index simplu care conine o singur cheie de indexare ntr-un fiier (numele diferit de al tabelului i extensia idx), 9 index compus care conine mai multe chei de indexare (etichete index) ntr-un fiier (numele diferit de al tabelului i extensia cdx). Cheia de indexare poate fi format dintr-un singur cmp sau din mai multe cmpuri legate printr-o expresie de concatenare. Din aceast cauz, dac nu sunt de tip ir de caractere, cmpurile trebuie convertite ntr-un ir de caractere cu ajutorul funciilor de conversie. Am notat cp1 - cmpul 1, cp2 - cmpul 2 i e(cp1,cp2) - expresia format din cele dou cmpuri. tip cp1 C C C C N N N D D T tip cp2 C N D T N D T D T T cp1 convertit cp1 cp1 cp1 cp1 str(cp1) str(cp1) str(cp1) dtos(cp2) dtos(cp2) ttoc(cp2) cp2 convertit cp2 str(cp2) dtos(cp2) ttoc(cp2) str(cp2) dtos(cp2) ttoc(cp2) dtos(cp2) ttoc(cp2) ttoc(cp2) e(cp1,cp2) cp1+cp2 cp1+ str(cp2) cp1+ dtos(cp2) cp1+ ttoc(cp2) str(cp1)+ str(cp2) str(cp1)+ dtos(cp2) str(cp1)+ ttoc(cp2) dtos(cp1)+ dtos(cp2) dtos(cp1)+ ttoc(cp2) ttoc(cp1)+ ttoc(cp2)

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

4.6.1. Crearea unui index


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

134 Informatic
Forma implicit a comenzii este: 9 pentru indexul simplu: index on <expresie_index> to <nume_fiier.idx> 9 pentru indexul compus: index on <expresie_index> tag <nume_etichet> of <nume_fiier.cdx> Implicit, se ordoneaz cresctor toate nregistrrile din tabel, iar la crearea noului index toate celelalte fiiere index asociate tabelului sunt nchise (cu excepia indexului structural). Explicit, prin fiierul index putei avea acces numai la nregistrrile precizate cu clauza for, ordonarea logic poate fi cresctoare (ascending) sau descresctoare (descending) i se pot pstra deschise fiierele index deschise anterior (folosind clauza additive).

4.6.2. Deschiderea unui index


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

4.6.3. Alte operaii cu indeci


9
schimbarea indexului activ din lista de indeci deschii: set order to <nume_fiier.idx>| tag <nume_etichet> of <nume_fiier.cdx> [ascending | descending] tergerea etichetelor dintr-un index compus: delete tag <nume_etichet_1> of <nume_fiier_1.cdx> [,<nume_etichet_1> of <nume_fiier_1.cdx> ...]

4.6.4. Exploatarea unui tabel mpreun cu indexul


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

Utilizarea unor instrumente de prelucrare a datelor

135

Funcia testeaz dac exist o nregistrare care are cheia de indexare egal cu expresia <expresie>. Dac o gsete, poziioneaz pointerul pe aceast nregistrare i furnizeaz valoarea .T., altfel poziioneaz pointerul la sfritul fiierului i furnizeaz valoarea .F..

Sortai tabele: Deschidei tabelul Angajai. Sortai acest tabel dup urmtoarele criterii:
use angajati Se deschide tabelul Angajai. browse Se afieaz coninutul tabelului n fereastra de editare. sort on nume, pren to a1 Se sorteaz tabelul dup cmpurile nume i pren. Rezultatul sortrii este n tabelul a1. sort on id_ang to a2 Se sorteaz tabelul dup cmpul id_ang. Rezultatul sortrii este n tabelul a2. sort on id_sup to a3 Se sorteaz tabelul dup cmpul id_sup. Rezultatul sortrii este n tabelul a3. sort on loc, id_ang to a4 Se sorteaz tabelul dup cmpurile loc i id_ang. Rezultatul sortrii este n tabelul a4. use a1 Se deschide tabelul a1. list nume, pren, id_ang, id_sup, loc browse nregistrrile sunt aranjate alfabetic dup valoarea cmpurilor nume i pren. Pentru acelai nume, sunt ordonate alfabetic dup prenume. use a2 Se deschide tabelul a2. list nume, pren, id_ang, id_sup, loc browse nregistrrile sunt aranjate cresctor dup valoarea cmpului id_ang. use a3 Se deschide tabelul a3. list nume, pren, id_ang, id_sup, loc browse nregistrrile sunt aranjate cresctor dup valoarea cmpului id_ang. use a4 Se deschide tabelul a4. list nume, pren, id_ang, id_sup, loc browse nregistrrile sunt aranjate alfabetic dup localitate. Pentru aceeai localitate, sunt aranjate n ordinea cresctoare a identificatorului de angajat.

Indexai tabele:
use judete S-a deschis tabelul Judee. modify structure n caseta de dialog Table Designer, deschidei seciunea Index. Observai c pentru acest tabel nu s-a definit la creare nici un index structural. index on c_jud tag cod of judete S-a definit un index structural. Conine o singur etichet cod, iar cheia de indexare a etichetei este cmpul c_jud (codul judeului). modify structure n caseta de dialog Table Designer, deschidei seciunea Index. Observai c indexul definit este de tip Regular. Schimbai tipul n Candidate. list nregistrrile sunt afiate n ordinea alfabetic a codului judeului. browse n fereastra de editare, nregistrrile sunt afiate n ordinea alfabetic a codului judeului. seek 'ct' Caut nregistrarea pentru care codul judeului este ct. ?iif (found(),n_jud, 'nu a gasit')

136 Informatic
Constanta S-a gsit nregistrarea. ?iif(seek('bz'),n_jud,'nu a gasit') Buzau S-a gsit nregistrarea. use angajati S-a deschis tabelul Angajai. browse nregistrrile sunt afiate n ordinea n care le-ai creat. modify structure n caseta de dialog Table Designer, deschidei seciunea Index. Observai c pentru acest tabel este definit deja de la creare indexul nume care are cheia determinat de expresia nume+pren. Definii un nou index cu numele cod, de tip Candidate i cu expresia de indexare id_ang. Mutai acest index pe prima poziie n list. Definii un nou index cu numele data, de tip Regular i cu expresia de indexare dtos(data_n)+ dtos(data_a). set order to tag cod Ordinea de indexare este dat de eticheta cod. browse Observai ordinea n care sunt afiate nregistrrile. list id_ang, nume, pren set order to tag nume Ordinea de indexare este dat de eticheta cod. list id_ang, nume, pren browse Observai ordinea n care sunt afiate nregistrrile.

#
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.

ncercai:

T est pentru evaluare:


Adevrat/Fals: Ordonarea logic nseamn o ordonare dup o condiie logic. Cheia de indexare poate conine mai multe cmpuri legate printr-o expresie de concatenare. Un tabel poate avea mai muli indeci structural compui. ntr-un tabel putei defini mai multe etichete de tipul Primary. Numrul nregistrrii curente din tabel l obinei cu funcia reccount(). Domeniul implicit al comenzii list este all. Domeniul implicit al comenzii display este all. Funcia cnt() nu poate fi folosit dect n comanda calculate. Comanda delete tag terge o etichet dintr-un index compus. Se poate crea un singur index simplu. Un index compus conine mai multe .......................... Pentru crearea unui tabel putei folosii comanda SQL ............................ Putei s modificai structura unui tabel cu comanda .............................................. Cu comanda set fields to controlai accesul la .................................... Obinei numrul de cmpuri dintr-o nregistrare cu funcia .............................. Obinei numrul de nregistrri dintr-un tabel cu funcia ................................... n acces secvenial, cutarea unei nregistrri dup un criteriu logic se face cu comanda ..... n comanda list, pentru a afia anumite cmpuri folosii clauza ...................... Pentru a calcula media aritmetic folosii funcia .......................... Stabilii eticheta activ dintr-un index compus cu comanda ..........................................

Completai:

Utilizarea unor instrumente de prelucrare a datelor

137

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

138 Informatic

5. Operaii cu datele dintr-o baz de date


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

1. Crearea bazei de date care cuprinde urmtoarele operaii:


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

Utilizarea unor instrumente de prelucrare a datelor


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

139

Open (baza de date) Open (tabele) Prelucrare

5.1. Crearea bazei de date


5.1.1. Crearea bazei de date
n urma operaiei de creare, baza de date este deschis automat. Putei crea baza de date prin urmtoarele metode: 1. Interactiv: Alegei opiunea New...File i n caseta de dialog New activai Stop butonul radio Database din lista File Type i executai clic pe controlul New File. Se deschide caseta de dialog Create n care scriei numele bazei de date n caseta de text Enter i apoi executai clic pe declanatorul Save. Se deschide fereastra generatorului de baze de date Database Designer, n care putei vedea arhitectura bazei de date: tabele i relaii ntre tabele. Iniial ea afieaz containerul gol al bazei de date nou create. 2. Prin comanda: create database <nume_baz_de_date> Comanda creeaz baza de date i o deschide. Deschidei apoi fereastra Database Designer cu comanda: modify database Close (tabele) Close (baza de date)

5.1.2. Adugarea la baza de date a tabelelor libere


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

5.1.3. Adugarea la baza de date a tabelelor noi


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

140 Informatic 5.1.4. Obinerea informaiilor despre baza de date deschis


Putei folosi comenzile: list | display databases Afieaz numele bazei de date, identificatorul cii de director n care se gsete fiierul, versiunea i lista tabelelor mpreun cu cmpurile lor. list | display tables Afieaz pe dou coloane lista tabelelor din baza de date: n coloana Name - numele tabelului, iar n coloana Source identificatorul fiierului n care se gsete tabelul.

5.1.5. Alte operaii cu baza de date


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

5.2. Exploatarea bazei de date


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

Utilizarea unor instrumente de prelucrare a datelor

141

se vor nchide toate bazele de date deschise, toate tabelele ncorporate n bazele de date sau libere i toate fiierele asociate exploatrii bazelor de date care erau deschise n acel moment.

5.2.2. Deschiderea i nchiderea tabelelor


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

142 Informatic
Operaiile care se pot executa n zonele de lucru sunt: 9 n zona activ se poate citi din tabel i se poate scrie n tabel. 9 n celelalte zone se poate numai citi din tabel. Identificarea tabelelor se face astfel: 9 n zona activ, numele tabelului se subnelege (este implicit n comenzi). 9 n celelalte zone, prin aliasul su sau prin numele zonei. Identificarea cmpurilor dintr-un tabel se face astfel: 9 n zona activ prin numele cmpului. 9 n celelalte zone prin identificatorul <alias>.<nume_cmp> sau <alias>-><nume_cmp>. Putei s obinei informaii despre zonele de lucru i tabelele deschise n aceste zone cu funciile: 9 select([1]) furnizeaz implicit numrul zonei de lucru active; dac folosii parametrul 1, va furniza numrul ultimei zone de lucru nefolosite. 9 used([<zona>]) furnizeaz un rezultat logic prin care se precizeaz dac zona este ocupat (.T.) sau liber (.F.). Implicit, rezultatul funciei se refer la zona curent, explicit, se refer la zona precizat prin parametrul <zona>. 9 used(<nume_tabel>) furnizeaz un rezultat logic prin care se precizeaz dac tabelul este deschis ntr-o zon de lucru (.T.) sau nu (.F.). 9 dbf([<zona>]) furnizeaz un rezultat de tip ir de caractere care poate conine numele fiierului deschis n zona de lucru sau irul vid, dac nu este deschis nici un fiier. Implicit, rezultatul funciei se refer la zona curent, explicit, se refer la zona precizat prin parametrul <zona>. 9 alias([<zona>]) furnizeaz un rezultat de tip ir de caractere care poate conine aliasul fiierului deschis n zona de lucru sau irul vid, dac nu este deschis nici un fiier. Implicit, rezultatul funciei se refer la zona curent, explicit, se refer la zona precizat prin parametrul <zona>. nchiderea unui tabel se face cu comanda: use [in <zona>] Implicit, se nchide tabelul din zona curent, explicit, se nchide tabelul din zona precizat cu clauza in. Tabelul mai poate fi nchis i cu comanda de nchidere a bazei de date (close databases) sau comanda de nchidere a tuturor fiierelor (close all).

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

Utilizarea unor instrumente de prelucrare a datelor

143

Deschidei caseta de dialog Open executnd clic pe declanatorul Open din fereastra View. Lista ascuns din care alegei baza de date.

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

Deschidei pe rnd toate tabelele din baza de date: fie executai dublu clic n fereastra Database Designer pe fiecare tabel pentru a deschide fereastra de editare a tabelului i implicit tabelul, fie n fereastra View executai clic pe declanatorul Open i n caseta de

144 Informatic
dialog Open executai clic pe rnd pe numele fiecrui tabel din lista Tables in Database. Deschidei pe rnd, ncepnd cu zona 1 i terminnd cu zona 5 tabelele: Customer, Products, Orditems, Orders i Employee. Dup ce ai deschis tabelele, ele vor fi afiate n fereastra View. Selectai pe rnd fiecare tabel din list. n bara de stare a ferestrei vor fi afiate informaii despre tabelul selectat: numrul zonei de lucru i numrul total de nregistrri. nchidei fereastra de comenzi. Obinei informaii despre tabelele deschise: select 1 ?used() .T. ?used(5) .T. ?used(10) .F. ?used('orders') .T. Creai baza de date din exemplu: ?dbf(3) c:\vfp\samples\data\orditems.dbf ?alias(3) orditems ?dbf(10) nimic ?alias(10) nimic

Creai baza de date Compania cu comanda: create database compania Afiai informaii despre baza de date nou creat cu comanda: display database Se vor afia numele bazei de date, calea fiierului baz de date i versiunea. Afiai baza de date n fereastra Database Designer cu comanda modify database Fereastra este vid.

Observaie: Tabelele din baza de date trebuie s conin urmtoarele chei, astfel nct s putei stabili legturi ntre ele: 9 Tabelul Angajai - cmpul id_ang cheie primar; cmpul cheie c_jud se va declara de tipul regular deoarece un tabel nu poate avea dect o cheie primar. 9 Tabelul Clieni - cmpul id_cl cheie primar; cmpul cheie c_jud se va declara de tipul regular deoarece un tabel nu poate avea dect o cheie primar. 9 Tabelul Contracte - cmpul id_cont cheie primar; cmpul cheie id_cl de tipul regular. 9 Tabelul edine - cmpul nr_s cheie primar; cmpurile cheie id_ang i id_cont se vor declara de tipul regular. 9 Tabelul Estimri - cmpul id_cont cheie de tipul regular. 9 Tabelul ncasri - cmpul nr_i cheie primar; cmpul cheie id_cont de tipul regular. 9 Tabelul Judee - cmpul c_jud se va declara de tipul cheie primar.

Adugai la baza de date tabelele libere create fie folosind opiunea de meniu, fie cu butonul din bara de instrumente, fie cu comenzile: add table angajati add table clienti add table judete Afiai informaii despre baza de date cu comanda:

Utilizarea unor instrumente de prelucrare a datelor

145

display database Se vor afia numele bazei de date, calea fiierului baz de date, versiunea i, pentru fiecare tabel adugat la baza de date, numele, calea fiierului i structura de cmpuri.

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

Adugai la baza de date i celelalte tabele cu comenzile : create estimari create sedinte create incasari Dup fiecare comand se deschide fereastra Table Designer n care definii structura tabelului i indecii. Modificai structura tabelelor create liber, adugndu-le reguli de validare i indeci. Executai pentru fiecare tabel deschiderea cu comanda use i apoi modificarea cu comanda modify structure. Dup ce ai adugat tabelele n baza de date, fereastra Database Designer va conine aceste tabele:

146 Informatic

ntre tabele nu sunt stabilite relaii permanente. n prealabil, n tabelele conductoare s-a stabilit cte un index primar, iar n tabelele conduse indeci de tip regular. Vei stabili interactiv relaii n fereastra Database Designer, glisnd indexul primar din tabelul conductor peste indexul regular din tabelul condus. De exemplu, glisai cheia cu numele angajat din tabela Angajai (cmpul index este id_ang) peste cheia angajat din tabela edine (cmpul index este id_ang). Se deschide caseta de dialog Edit Relationship n care executai clic pe declanatorul OK. Dup ce ai definit relaiile, fereastra Database Designer va afia:

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

Utilizarea unor instrumente de prelucrare a datelor

147

Deoarece tabelele din baza de date trebuie gestionate mpreun, trebuie asigurat integritatea referenial. Definii pentru fiecare relaie regula de integritate referenial astfel: n fereastra Database Designer executai dublu clic pe o relaie. Se deschide caseta de dialog Edit Relationship n care executai clic pe declanatorul Referential Integrity.... Se deschide caseta de dialog Referential Integrity Builder care conine trei seciuni:

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

148 Tehnologii asistate de calculator

nchidei baza de date cu comanda: close databases

#
1. 2. 3. 4. 5.

ncercai:

T est pentru evaluare:


Adevrat/Fals: Visual FoxPro v permite crearea unor relaii permanente ntre tabelele bazei de date. La o baz de date nu putei aduga tabele libere. Dac nchidei o baz de date, se nchid automat i tabelele pe care le conine. Dac deschidei un tabel dintr-o baz de date, se deschide automat i baza de date. Nu putei ndeprta un tabel dintr-o baz de date.

Completai: 1. Putei vedea arhitectura bazei de date n fereastra .......................... 2. Putei verifica integritatea bazei de date cu comanda ............................ 3. Dac ai deschis mai multe baze de date, putei activa o baz de date cu comanda .............................................. 4. Putei nchide o baz de date cu comanda .................................... 5. Putei s deschidei fereastra Database Designer pentru o baz de date deschis cu comanda .............................. Alegei rspunsul corect: 1. Adugai un tabel liber la o baz de date cu comanda: a) add table b) new table 2. Adugai un tabel nou la o baz de date cu comanda: a) add table b) new table 3. Stabilii zona de lucru activ cu comanda: a) open b) select 4. Aflai dac un tabel este deschis cu funcia: a) dbf() b) used() 5. Aflai numrul zonei de lucru active cu funcia: a) select() b) used() Rspundei: 1. Care sunt etapele de creare a unei baze de date? 2. Prin ce metode putei vedea arhitectura bazei de date?

c) create table c) create c) alias c) alias() c) alias()

R spunsuri:

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

Utilizarea unor instrumente de prelucrarea datelor

149

6. Obinerea informaiilor din baza de date


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

6.1. Interogrile
Interogarea este operaia prin care extragei date din baza de date fr s le tergei sau s le modificai i pe care le afiai ntr-un anumit format. Extragerea se face n funcie de un anumit criteriu numit criteriu de interogare. Acesta trebuie s defineasc datele pe care vrei s le extragei: numele cmpurilor, tabelele din care fac parte, criteriile prin care se extrag nregistrrile i n ce ordine sunt pezentate. Interogarea este scopul bazei de date. Cnd un utilizator interogheaz baza de date, el pune de fapt o ntrebare: Ce date din baza de date ndeplinesc aceste condiii?". Folosind o interogare putei: 9 s combinai nregistrri din mai multe tabele ntr-un singur tabel, 9 s selectai numai nregistrrile care ndeplinesc un anumit criteriu, 9 s afiai nregistrrile n ordinea dorit, 9 s afiai cmpuri calculate. Interogrile pot afia nregistrri din mai multe tabele. Dac relaia dintre cele dou tabele este de una-la-mai-multe, interogarea va afia pe mai multe rnduri cmpurile corespunztoare nregistrrilor din al doilea tabel (mai-multe) legate de o singur nregistrare din primul tabel (una), iar n aceste rnduri se vor repeta cmpurile din primul tabel.

150 Informatic
Pentru operaia de interogare, orice sistem de gestiune a bazelor de date are implementate diferite instrumente prin care s se comunice sistemului criteriul de interogare. Unul dintre aceste instrumente este limbajul SQL, care este limbajul standard de interogare. n Visual FoxPro putei crea o interogare: 9 interactiv folosind generatorul de interogri (Query Designer); 1 9 prin limbajul de comand SQL (instruciunea select ). n urma operaiei de creare, interogarea este salvat ntr-un fiier cu extensia .qpr care conine specificaiile criteriului de interogare. Acest fiier este un fiier de tip ASCII n care se memoreaz comanda SQL asociat. Deoarece fiierul conine o comand SQL, pentru a o executa trebuie s lansai n execuie fiierul cu comanda: do <nume_fiier>.qpr Ai vzut c operatorul relaional select aplicat pe un tabel creeaz un alt tabel care conine submulimi de date din tabelul surs. Aadar i rezultatul unei interogri va fi tot un tabel, care va conine datele specificate de criteriul de interogare. Destinaia interogrii (destinaia datelor din tabelul obinut) poate fi: 9 fereastra de editare Browse, 9 diagrama (graph), 9 ecranul (screen), 9 raportul (report), 9 tabelul permanent (table) sau temporar (cursor). Aadar, interogarea se aplic pe mai multe tabele ale bazei de date numite tabele surs, iar rezultatul unei interogri este un tabel numit tabel destinaie; modificrile fcute n tabelul destinaie nu se reflect i n tabelele surs. Parametrii folosii n construirea unei interogri sunt: 9 Cmpurile (fields) din tabelele bazei de date (tabelele surs). Se recomand s se preia din tabelele surs numai cmpurile strict necesare. 9 Legtura (join) dintre tabelele bazei de date (tabelele surs). Pe lng legturile stabilite ntre tabele n cadrul bazei de date, care vor fi preluate automat, se mai pot stabili noi legturi cu tabele care nu au fost legate la baza de date. Dac definii dou legturi ntre tabele, le putei lega cu operatorii logici or sau and. 9 Filtrul (filter) prin care se precizeaz condiiile de filtrare, adic modul n care vor fi selectate datele din tabelele bazei de date. Un criteriu de selecie sau de filtrare trebuie s precizeze cmpul sau expresia care conine cmpul, operatorul relaional i valoarea cu care se compar. Pot fi definite mai multe criterii de filtrare legate ntre ele prin operatorii logici or sau and (ordinea de evaluare este and i apoi or). 9 Ordonarea (order by) prin care se precizeaz ordinea n care vor fi prezentate rezultatele interogrii (n tabelul destinaie). Ordinea este dat de un criteriu de ordonare determinat de un cmp din tabel sau de mai multe criterii de ordonare determinate de mai multe cmpuri. n acest caz, un criteriu de ordonare este luat n consideraie numai dac cele definite anterior au aceeai valoare a cmpurilor pentru dou nregistrri.

Este diferit de comanda select folosit pentru selectarea unei zone de lucru.

Utilizarea unor instrumente de prelucrarea datelor

151

9 Gruparea (group by) prin care se precizeaz un criteriu de grupare a datelor. Acest criteriu este dat de cheia de grupare format din unul sau mai multe cmpuri ale tabelului. Conform acestei chei, nregistrrile care au aceeai valoare a cheii de grupare vor fi cumulate n tabelul destinaie ntr-o singur nregistrare, n care fiecare cmp numeric va fi calculat prin nsumarea valorilor corespunztoare cmpului din toate nregistrrile grupului. Mai pot fi definite i criterii de selecie la nivel de grup prin care se precizeaz condiia pe care trebuie s o ndeplineasc grupul de nregistrri pentru a face parte din tabelul destinaie. Condiia este precizat prin cmpul sau expresia care conine cmpul, operatorul relaional i valoarea cu care se compar.

6.2. Vizualizrile
Vizualizrile sunt tabele virtuale, construite pe baza datelor din tabelele bazei de date, care pot fi legate prin relaii i care permit modificarea lor de ctre utilizator. Aadar, dac n cazul unei interogri utilizatorul poate vedea numai un rezultat, n cazul vizualizrii utilizatorul poate interveni i poate modifica valoarea datelor. Orice modificare fcut ntr-o vizualizare se va regsi i n tabelul real al bazei de date. Cnd se creeaz o vizualizare, se pune de fapt ntrebarea: Cu ce date din baza de date poate interaciona utilizatorul?". Construirea unei vizualizri const, ca i n cazul unei interogri, n extragerea anumitor date din baza de date, pe baza unui criteriu. Rezultatul va fi memorat n fiierul bazei de date (.dbc). De aceea, pentru a folosi o vizualizare, trebuie deschis mai nti baza de date i apoi vizualizarea, ca orice tabel din baza de date. Aadar, vizualizarea este o structur de date, la fel ca i tabelele bazei de date, iar interogarea este un fiier care conine o comand i care trebuie lansat n execuie la fel ca orice fiier de program. Dac n cazul interogrilor datele circul ntr-un singur sens, de la tabelele bazei de date la formatul ales pentru afiare, n cazul vizualizrilor ele pot circula n ambele sensuri ntre tabelele bazei de date i vizualizare. Vizualizrile se pot construi cu constructorul de vizualizri (View Designer). Vizualizarea folosete, pe lng parametrii ntlnii la interogri, urmtorii parametri: 9 Cmpurile cheie. Aceste cmpuri sunt alese astfel nct s identifice unic relaia dintre vizualizare i tabelele surs. Pentru fiecare tabel surs trebuie s se defineasc unul sau mai multe cmpuri cheie care s identifice unic fiecare nregistrare din acel tabel. 9 Cmpurile actualizate i cmpurile neactualizate. Acest parametru stabilete modul n care se transmit datele ntre vizualizare i tabelele surs. Astfel, dac n vizualizare se face modificarea ntr-un cmp actualizat, modificarea va fi transmis i n tabelele surs, altfel, dac modificarea se face ntr-un cmp nemodificat, ea nu se va transmite i ctre tabelele surs.

6.3. Rapoartele
Raportul este o colecie de informaii obinute din datele stocate n tabelele bazei de date, prezentate utilizatorului ntr-o form ct mai clar i mai concis. El poate fi tiprit la

152 Informatic
imprimant sau afiat pe ecran i prezint un set de date legate ntre ele, preluate din tabelele bazei de date. Permite descrierea elementelor care pot s apar: textul afiat deasupra coloanelor, cmpurile din coloane, la care pot fi adugate i alte texte sau imagini grafice (linii, chenare, imagini bitmap sau vectoriale etc.). Raportul nu modific datele din tabele. El parcurge secvenial nregistrrile din tabele pentru: 9 obinerea unor date sintetice: subtotaluri i totaluri, 9 obinerea unor rezumate, 9 gruparea datelor pe mai multe niveluri, fiecare nivel cu propriile sale informaii sintetice i rezumate, 9 analize complexe i grafice. n general, raportul este conceput sub forma unui tabel. n plus are i funcia de sortare i grupare a datelor. Raportul se compune din: 9 Seciunea de date (Detail) conine date care se repet pentru fiecare nregistrare. 9 Antetul paginii (Page Header) definete elementele care trebuie s apar n partea de sus a fiecrei pagini a raportului. 9 Subsolul paginii (Page Footer) definete elementele care trebuie s apar n partea de jos a fiecrei pagini a raportului. 9 Antetul raportului (Report Header sau Title) apare numai pe prima pagin a raportului. El este ca un titlu pentru ntregul raport i poate conine texte i imagini (de exemplu sigla firmei). 9 Subsolul raportului (Report Footer sau Summary) apare numai pe ultima pagin a raportului i cuprinde de obicei un rezumat al datelor din diferite seciuni ale raportului. 9 Grupul (Group). Un raport poate prezenta coninutul unui tabel sau al mai multor tabele din baza de date. Aceste date pot fi grupate dup diferite criterii i totalizate la nivel de grup. n linia totalului pot fi inserate totaluri ale unor cmpuri, adic date n care sunt cumulate valorile aceluiai cmp pentru ntreg grupul de nregistrri. Pot fi definite mai multe niveluri de grupare. Pentru fiecare nivel trebuie definit un criteriu de grupare caracterizat printr-o expresie care este evaluat la fiecare nregistrare. Dac exist un singur nivel de grupare, numrul de grupuri va fi egal cu numrul de valori diferite ale cheii de grupare. 9 Antetul grupului (Group Header) afieaz un titlu al grupului (criteriul de grupare). 9 Subsolul grupului (Group Footer) afieaz date sintetice despre grup. Raportul conine informaii utile personalului care are atribuii de conducere n cadrul organizaiei. n funcie de nivelul de conducere pentru care se produce raportul, cantitatea de date prezentat difer. La nivelul inferior de conducere, nivelul operaional, la care personalul de conducere are rolul de a monitoriza i a controla activitile zilnice ale angajailor, rapoartele trebuie s fie detaliate i s conin informaii specifice despre activitile zilnice (de exemplu rapoartele de ncasri). La nivelul mediu de conducere (director tehnic, director de vnzri, director de resurse umane etc.) ele trebuie s conin mai puine detalii i mai multe treceri n revist, rezumate i analize ale datelor din istoric. Aceste date trebuie s-i ajute s planifice i s controleze operaiile i s implementeze strategii care trebuie s fie bine formulate i argumentate. De exemplu, aceste rapoarte pot prezenta un rezumat al activitilor (ncasrile rezultate din contractele de consultan cu un client, ncasrile rezultate

Utilizarea unor instrumente de prelucrarea datelor

153

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

Creai o interogare Interogarea trebuie s rspund la urmtoarea ntrebare: Ce angajai (identificai prin nume, prenume i numele judeului) au tariful cuprins ntre 260.000 i 300.000?". Afiarea se va face ntr-o fereastr de editare Browse. Fiierul n care vei salva interogarea va fi a1.qry. Deschidei baza de date Compania cu comanda: open database compania. Alegei opiunea NewFile. Se deschide caseta de dialog New n care din grupul de butoane cu opiuni File Type activai butonul Query dup care executai clic pe butonul New File. Se deschide caseta de dialog Add Table or View. Din lista Tables in Database selectai mai nti tabelul Angajai i executai clic pe butonul Add Table din bara de instrumente Query Designer, apoi selectai tabelul Judee i executai clic pe butonul Add Table. Se deschide fereastra generatorului de interogri Query Designer. n partea superioar este afiat un panou care conine tabelele care au fost selectate din baza de date pentru a face parte din interogare. Fiecare tabel este reprezentat ntr-o fe-

154 Informatic
reastr redimensionabil n care sunt afiate cmpurile i indecii tabelului. Dac ntre tabele exist legturi, sunt afiate i acestea. Pe lng aceste legturi definite deja n baza de date, putei crea noi legturi fie glisnd un cmp index de la tabelul surs la tabelul destinaie, fie prin intermediul obiectelor din caseta de dialog Join Condition pe care o deschidei executnd dublu clic pe butonul Add Join din bara de instrumente Query Designer. n partea inferioar este afiat un panou cu mai multe seciuni: 9 Selection Criteria - conine controale pentru a stabili criteriul de selectare a nregistrrilor. Criteriul poate conine anumite valori ale unui cmp i condiii pentru legturile temporare dintre tabele. 9 Fields - conine controale pentru a stabili cmpurile din tabel sau cmpurile calculate care vor fi afiate de interogare. 9 Order By - conine controale pentru a stabili cmpurile din tabel sau cmpurile calculate care vor determina ordinea de afiare n interogare. 9 Group By - conine controale pentru a stabili modul n care vor fi grupate nregistrrile afiate de interogare. Deschidei seciunea Fields. n lista Available Fields sunt afiate cmpurile disponibile n tabelele selectate. Selectai din aceast list grupul de cmpuri Angajai.nume, Angajai.pren, Angajai.tarif i Judee.n_jud (executai clic pe numele cmpului cu tasta Ctrl apsat). Executai apoi clic pe declanatorul Add>. Cmpurile selectate vor fi copiate n lista cu cmpurile selectate pentru a fi afiate - Selected Output. n seciune mai putei folosi urmtoarele controale: butoanele Add All>> (copiaz toate cmpurile din tabele n lista Selected Output), <Remove (nltur cmpul selectat), i <<Remove All (nltur toate cmpurile din lista Selected Output) precum i caseta combinat Functions/Expressions prin care putei defini cmpurile calculate. Bara de instrumente Query Designer conine urmtoarele butoane:
Adaug un tabel nou la interogare. nltur tabelul selectat din interogare. Implicit vor fi nlturate cmpurile, criteriile de selectare, criteriile de sortare i criteriile de grupare definite de cmpurile din acest tabel. Adaug noi legturi ntre tabelele interogrii. Deschide fereastra de editare n care este afiat comanda SQL asociat interogrii definite interactiv. Maximizeaz panoul cu tabele. Panoul cu seciuni nu va mai fi afiat. Deschide o caset de dialog care conine controale pentru a alege destinaia interogrii: o fereastr Browse, ecranul, o diagram etc.

1 Add Table 2 Remove Table

3 Add Join 4 Show the SQL Window 5 Maximize the table Window 6 Query Destination

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

Utilizarea unor instrumente de prelucrarea datelor

155

260000. Executai din nou clic pe declanatorul Insert, alegei din lista Field Name din nou numele cmpului Angajai.tarif, din lista Criteria operatorul Less Than i scriei n caseta de text Example valoarea 300000. Cele dou condiii au fost adugate n gril. Condiiile sunt legate implicit prin operatorul logic and. Dac trebuie schimbat operatorul logic and cu or se execut clic pe declanatorul Add Or. Dac vrei s schimbai ordinea n care sunt afiate condiiile n gril selectai condiia pe care vrei s o mutai i executai clic pe butonul (Mover Box). Dac vrei s nlturai o condiie, o selectai n gril i executai clic pe declanatorul Remove.

condiia pentru legtura dintre tabele butonul Condition lista cmpurilor din interogare

Deschidei seciunea Order By pentru a stabili ordinea n care vor fi afiate nregistrrile. Selectai, din lista Selected Output care afieaz cmpurile din interogare, cmpurile Angajai.nume i Angajai.pren dup care acionai declanatorul Add>. Cmpurile vor fi adugate n lista Ordering Criteria. n grupul de butoane radio Order Options este activat butonul Ascending (ordinea alfabetic a numelui i prenumelui). Ordinea cmpurilor din cheia de sortare este Angajai.nume i Angaja1i.pren, adic ordinea din lista Ordering Criteria (ordinea este dat de ordinea de adugare la aceast list). Dac vrei s nlturai un criteriu de sortare, l selectai n lista Ordering Criteria i acionai declanatorul <Remove. Deschidei seciunea Group By numai pentru a identifica controalele, deoarece interogarea nu conine grupuri de nregistrri. n seciune sunt dou liste Available Fields (cmpurile disponibile) din care putei selecta cmpul folosit pentru cheia de grupare, lista Group By Fields n care vor fi afiate cheile de grupare, declanatoarele Add> i <Remove cu care putei aduga sau nltura chei de grupare. Prin acionarea declanatorului Having... se deschide caseta de dialog Having prin intermediul creia putei stabili criterii de selecie la nivelul unui grup.

156 Informatic

Executai clic pe butonul Query Destination din bara de instrumente Query Designer. Se deschide caseta de dialog Query Destination n care executai clic pe butonul Browse pentru ca rezultatul interogrii s se afieze ntr-o fereastr de editare Browse. Vizualizai comanda SQL asociat acestei interogri. Executai clic pe butonul Show the SQL Window din bara de instrumente. Se deschide fereastra de editare care afieaz comanda SQL:
SELECT Angajati.nume, Angajati.pren, Angajati.tarif, Judete.n_jud; FROM compania!angajati, compania!judete; WHERE UPPER(Judete.c_jud) = UPPER(Angajati.c_jud); AND (Angajati.tarif > 260000; AND Angajati.tarif < 300000); ORDER BY Angajati.nume, Angajati.pren

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

Modificai interogarea astfel nct rezultatul s fie afiat pe ecran. Deschidei interogarea pentru modificare, fie cu opiunea OpenFile, fie cu comanda: modify query c:\vfp\a1.qpr Se deschide fereastra generatorului de interogri Query Designer. Executai clic pe butonul Query Destination din bara de instrumente. Se deschide caseta de dialog Query Destination n care executai clic pe butonul Screen. Vizualizai comanda SQL asociat acestei interogri. Executai clic pe butonul Show the SQL Window din bara de instrumente. Se deschide fereastra de editare care afieaz comanda SQL, la care observai c a fost adugat opiunea to screen. nchidei fereastra de editare a comenzii. nchidei fereastra generatorului cu salvare. Afiai rezultatul interogrii cu comanda: do a1.qri

Utilizarea unor instrumente de prelucrarea datelor

157

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

nchidei fereastra de editare. Afiai din nou rezultatul interogrii. Observai modificrile aprute n fereastra Browse. nchidei interogarea i baza de date cu comanda close all.

Creai o vizualizare Vizualizarea trebuie s rspund la urmtoarea ntrebare: Cu ce date din baza de date poate interaciona utilizatorul pentru angajaii (identificai prin nume, prenume, vrst i numele judeului) care au tariful cuprins ntre 260.000 i 300.000?". Utilizatorului i se va permite s interacioneze doar cu cmpul tarif. Deschidei baza de date Compania. Alegei opiunea NewFile. Se deschide caseta de dialog New n care din grupul de butoane cu opiuni File Type activai butonul View, dup care executai clic pe butonul New File. Se deschide caseta de dialog Add Table or View. Din acest moment vei urma aceiai pai pe care i-ai executat atunci cnd ai creat o interogare. Bara de instrumente View Designer conine primele cinci butoane din bara Query Designer. Fereastra generatorului de vizualizri conine n plus seciunea Update Criteria. Prin intermediul controalelor din aceast seciune putei stabili cmpurile cheie (cmpurile care realizeaz legtura ntre vizualizare i tabelele surs) i cmpurile actualizate (cmpurile a cror modificare se transmite i ctre tabelele surs). Deschidei aceast seciune pentru a stabili parametrii vizualizrii. Lista Field Name conine lista cmpurilor din vizualizare disponibile pentru actualizare, din tabelul Angajai. Se stabilesc mai nti cmpurile cheie (care vor identifica unic relaia vizualizare-tabel surs). Aceste

158 Informatic
cmpuri sunt nume i pren. Se selecteaz fiecare dintre aceste cmpuri i se activeaz comutatorul pentru cmpul cheie. Se pot stabili acum cmpurile care pot fi actualizate (ele nu pot fi cmpuri cheie). Singurul cmp care a mai rmas este cmpul tarif. l vom marca pentru actualizare fie executnd clic pe comutatorul de actualizare din dreptul su din lista Field Name, fie executnd clic pe declanatorul Update All. Actualizarea cmpului marcat se poate face n dou moduri, pe care le stabilii cu butoanele radio Update using: prin tergerea vechilor nregistrri i reinserarea celor modificate (SQL DELETE then INSERT) sau prin scrierea modificrilor direct n nregistrare (SQL UPDATE). Activai butonul radio SQL UPDATE. Activai comutatorul Send SQL updates (dac vrei ca aceste actualizri s se i realizeze). Salvai vizualizarea sub numele a1. Deschidei vizualizarea (ca pe un tabel cu comanda use). Afiai vizualizarea n fereastra de editare Browse (cu comanda browse). Facei modificri n cmpurile vizualizrii.

coloana de comutatoare pentru cmpuri actualizate coloana de comutatoare pentru cmpuri cheie

Deschidei tabelul Angajai. Afiai coninutul acestui tabel ntr-o fereastr browse. Observai ce modificri fcute n vizualizare se regsesc n tabel. nchidei baza de date.

Creai un raport Se construiete un raport n care se prezint situaia ncasrilor cu subtotaluri pentru fiecare contract. Deschidei baza de date Compania. Alegei opiunea NewFile. Se deschide caseta de dialog New n care, din grupul de butoane cu opiuni File Type, activai butonul Report, dup care executai clic pe butonul New File. Se deschide fereastra generatorului de rapoarte care este

Utilizarea unor instrumente de prelucrarea datelor

159

mprit n mai multe benzi, fiecare band reprezentnd o zon din raport. Putei modifica dimensiunea unei zone pe vertical, glisnd bara delimitatoare a zonei. Definii mediul de date al raportului (tabelele din care preia datele). Alegei opiunea Data Environment...View. Se deschide fereastra care este vid. Alegei opiunea Add... Data Environment. Se deschide caseta de dialog Add Table or View. Alegei din list tabelul ncasri. Reluai operaia i alegei din list tabelul Contracte. Tabelele i relaia dintre ele vor fi adugate n fereastr. Adugai n fereastra generatorului de rapoarte benzile pentru antetul i subsolul raportului. Alegei opiunea Title/Summary... Report. Se deschide caseta de dialog Title/Summary n care activai comutatorul Title band pentru antetul raportului i comutatorul Summary band pentru subsolul raportului. Stabilii caracteristicile caracterelor din raport. Alegei opiunea Default Font... Report. Alegei n caseta de dialog Font fontul Arial.

Banda pentru antet de pagin

Banda pentru datele din raport (Detail)

Banda pentru

subsol de pagin

1 1 2 3 4 5 6 7 8

Select Object Label Field Line Rectangle Rounded Rectangle Data Grouping Report Controls Toolbar

Selecteaz un obiect. Activeaz scrierea textului. Activeaz inserarea unui cmp Activeaz trasarea unei linii. Activeaz trasarea unui dreptunghi. Activeaz trasarea unui dreptunghi cu coluri rotunjite. Permite gruparea datelor. Activeaz bara cu instrumente Report Controls.

Scriei titlul raportului. Executai clic pe instrumentul Label, executai clic n banda pentru antetul raportului n locul n care vrei s scriei titlul i scriei: Situaia ncasrilor pe contracte. Executai clic n banda de antet de pagin i scriei titlurile coloanelor: Nr. ncasare, Nr. contract, Client, Data i Valoare. Adugai la raport cmpurile care vor fi afiate. Executai clic pe instrumentul Field. Executai apoi clic n banda Detail, sub titlul coloanei Nr. ncasare n poziia n care vrei s apar valoarea cmpului. Se deschide caseta de dialog Report Expression. Executai clic pe butonul Expression i se deschide caseta de dialog Expression

160 Informatic
Builder n care alegei din lista Fields cmpul ncasri.nr_i. Reluai operaia pentru cmpurile ncasri.id_cont, Contracte.id_cl, ncasri.data_p, ncasri.valoare. Creai grupuri de nregistrri dup numrul contractului. Alegei opiunea Data Grouping...Report. Se deschide caseta de dialog Data Grouping n care vei defini un singur nivel pentru grup. Executai clic pe butonul primului grup. Se deschide caseta de dialog Expression Builder n care alegei din lista Fields cmpul ncasari.id_cont. Definii totalul la nivelul raportului i subtotal la nivelul fiecrui grup pentru cmpul valoare. Executai clic pe instrumentul Field. Executai apoi clic n banda Group, sub cmpul Valoare. Se deschide caseta de dialog Report Expression. Executai clic pe butonul Expression i din caseta de dialog Expression Builder alegei cmpul incasari.valoare. n caseta de dialog Report Expression executai clic pe butonul Calculations.... Se deschide caseta de dialog Subtotal or Calculate Field n care activai n grupul de butoane radio Subtotal or Calculate butonul Sum. Reluai aceleai operaii i pentru banda subsolului de raport.

Salvai raportul sub numele a1. nchidei caseta de dialog. n fereastra Command este afiat comanda cu care a fost creat raportul: create report. Previzualizai raportul cu comanda: report form a1 preview. Putei modifica raportul cu comanda: modify report a1. Vei modifica raportul astfel: deoarece cmpurile pentru numrul contractului i pentru identificatorul clientului se repet la nivelul grupului, vei aduga aceste date n antetul grupului i le vei scoate din seciunea de date a raportului. Putei tipri un raport cu comanda: Report form <nume_fiier> [heading <exp_C>] [summary] [<domeniu>][for <expL1>][ while <expL2>][to printer | to file <nume_fiier>] unde clauza heading permite afiarea unui antet suplimentar la nceputul fiecrei pagini, iar clauza summary inhib afiarea rndurilor cu date i afieaz numai rndurile cu totaluri i subtotaluri.

Utilizarea unor instrumente de prelucrarea datelor

161

7. Transferul datelor ntre un sistem de gestiune a bazelor de date i o alt aplicaie


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

7.1. Importul i exportul


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

162 Informatic
with blank - cmpurile sunt separate prin spaiu; with <delimitator> - cmpurile de tip caracter vor fi delimitate de caracterul <delimitator> n locul ghilimelelor. 1. Importul datelor este operaia prin care se preiau date create cu alte aplicaii i sunt transformate ntr-un tabel al bazei de date Visaul FoxPro. Se realizeaz cu comenzile: Import i Append from . a. Sintaxa comenzii Import este: Import from <nume_fiier> type <tip>
extensie produs de Tabele din baz de date fox2x .dbf versiuni anterioare FoxPro (pentru MS-DOS sau Windows pdox .db Paradox versiuni 3.5/4.0 Foi de calcul wk1/wk3/ wk1/wk3/ Lotus 1-2-3 - diferite wks wks versiuni xls/xl5 xls Excel vers. 2.0/5.0 Fiiere text sdf txt fiiere ASCII delimited txt fiiere ASCII <tip>

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

Utilizarea unor instrumente de prelucrarea datelor

163

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

Poziionai cursorul n document n poziia n care vrei s inserai datele din tabel. Afiai bara de instrumente Database cu opiunea DatabaseToolbarsView. Executai clic pe butonul Insert Database. Se deschide caseta de dialog Database. Executai clic pe declanatorul Get Data... Din caseta de dialog Open Data Source alegei numele tabelului, de exemplu Angajai. Se revine n caseta de dialog Database. Executai clic pe declanatorul Query Options... Se deschide caseta de dialog Query Options care conine trei seciuni pentru stabilirea unui criteriu de interogare. Deschidei seciunea Filter Records pentru a stabili criteriul de filtrare (de exemplu numai angajaii din Bucureti). Din lista ascuns Field alegei cmpul c_jud, din lista Comparison operatorul Equal to, iar n caseta de text Compare to scriei B. Deschidei seciunea Sort Records pentru a stabili cheia de sortare (de exemplu dup nume i prenume). Putei alege maxim trei chei de sortare. Alegei din lista ascuns Sort by cmpul nume etc. Deschidei seciunea Select Fields pentru a stabili cmpurile care vor fi preluate din baza de date. Alegei din list cmpurile nume, pren, tel_f i tel_m. nchidei caseta de dialog Query Options. Executai clic pe declanatorul Table Auto Format dac vrei s alegei unul dintre formatele predefinite pentru tabele. Executai clic pe declanatorul Insert Data.... Se deschide caseta de dialog Insert Data din care putei alege domeniul nregistrrilor. Datele din tabelul bazei de date vor fi inserate n document sub forma unui tabel.

Exportai date dintr-un tabel al bazei de date

Deschidei baza de date Compania i apoi tabelul Clienti. open database compania use clienti
Exportai datele din tabel n diferite formate de fiier text ASCII:

copy to cl1.txt sdf copy to cl2.txt delimited copy to cl3.txt; delimited with blank modi file cl1.txt ................ modi file cl5.txt

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

Vizualizai coninutul fiierelor text create i comparai rezultatul exporturilor.

T est pentru evaluare:


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

164 Informatic
Creai un raport cu evidena edinelor. edinele vor fi grupate dup numrul contractului i pentru acelai contract vor fi afiate n ordine cronologic. Afiai subtotaluri la nivel de grup i un total la nivel de raport pentru durata edinelor i pentru costul edinelor. 4. Importai fiierele cu texte cl1.text, ..., cl5.txt n tabele. Vizualizai coninutul acestor tabele. 5. Exportai tabelul Clieni ntr-o foaie de calcul Excel. Vizualizai coninutul foii de calcul. 6. Importai foaia de calcul ntr-un tabel. Vizualizai coninutul tabelului. 3.

#
1. 2. 3. 4. 5. 6. 7.

ncercai:

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

Completai: 1. Criteriul de interogare este salvat ntr-un fiier sub form de .......................... 2. Vizualizarea este salvat ntr-un fiier sub form de .......................... 3. Obinei rezultatul unei interogri cu comanda .............................................. 4. Putei construi interactiv un raport folosind .................................... 5. Datele din cmpurile nregistrrii vor fi inserate n raport n banda............................ 6. Pentru a obine n urma exportului dintr-un tabel un fiier text n care cmpurile sunt separate prin tabulatori folosii clauza............................. 7. Putei introduce o imagine ntr-un cmp de tip General folosind .................... Rspundei: 1. Ce este o interogare a bazei de date? 2. Ce este o vizualizare a bazei de date?

R spunsuri:

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

Utilizarea unor instrumente de prelucrare a datelor

165

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

8.1. Operaii cu tablouri de memorie:


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

1. Crearea tabloului de memorie:


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

2. Redimensionarea tabloului comenzile declare/dimension

9 schimbarea dimensiunii: din vector n matrice i din matrice n vector; 9 mrirea (creterea numrului de elemente) sau micorarea (diminuarea numrului de elemente) tabloului.

3. Consultarea tablourilor const n:


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

4. Actualizarea tablourilor const n:


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

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

166 Informatic
8.1.1. Crearea unui tablou de memorie:
Crearea unui tablou de memorie se face prin dou operaii: a. Definirea structurii cu ajutorul comenzilor declare/define. Comenzile au sintaxa: declare | define <nume_tablou1> (<expN11>[,<expN12>]) [,<nume_tablou2> (<expN21>[,<expN22>]) ....... ]
Numele tabloului de memorie Numrul de elemente dup prima dimensiune Numrul de elemente dup a doua dimensiune

Observaii: 9 Nu exist nici o diferen ntre comenzile declare i define (exist ambele comenzi pentru a crea compatibilitate cu versiunile anterioare de limbaje de comand specifice sistemelor de gestiune a bazelor de date compatibile dBase). 9 Printr-o comand pot fi definite mai multe tablouri de memorie identificate prin nume <nume_tablou1>, <nume_tablou2>, .... Tablourile definite pot fi att de tip vector, ct i de tip matrice. 9 Comenzile au un singur adverb: lista de tablouri de memorie care se definesc. Separarea tablourilor n list se face prin virgul. Pentru fiecare tabel se precizeaz numele i numrul de elemente dup o dimensiune, dac se definete un vector (<expN11>, <expN21>, ...), respectiv numrul de elemente dup dou dimensiuni, dac se definete o matrice (<expN11> i <expN12>, <expN21> i <expN22>, ...). Dup ce ai definit structura tabloului, putei identifica orice element din tablou astfel: pentru vectori : <nume_tablou>(<expN>), unde <expN> reprezint numrul de ordine al elementului n cadrul vectorului; pentru matrice : <nume_tablou>(expN1,<expN2>), unde identificarea elementului se face prin numrul liniei <expN1> i numrul coloanei <expN2>. Elementele unei matrice se pot identifica i prin numrul de ordine. innd cont c n Visual FoxPro o matrice se memoreaz n ordinea liniilor i dac notm cu n numrul de linii ale matricei, cu m numrul de coloane, iar cu i i j cei doi indici ai unui element, atunci numrul de ordine al unui element va fi m(i-1)+j. b. Atribuirea de valori elementelor se poate face n dou moduri: Se atribuie aceeai valoare tuturor elementelor cu ajutorul comenzii store care are sintaxa: store <exp> to <nume_tablou> Se atribuie cte o valoare fiecrui element folosind operaia de atribuire: <element_tablou>= <exp> sau comanda store care are sintaxa: store <exp> to <element_tablou>

Utilizarea unor instrumente de prelucrare a datelor

167

8.1.2. Redimensionarea tablourilor de memorie:


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

8.1.3. Consultarea tablourilor:


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

Numele funciilor folosite pentru operaii cu tablouri de memorie ncep cu litera a (array).

168 Informatic
Poziia unui element din tablou, identificat prin numrul liniei i numrul coloanei se obine cu ajutorul funciei aelement() care are sintaxa: aelement(<nume_tablou>,<expN1>[,<expN2>] , unde <expN1> i <expN2> sunt indicii elementului (numrul liniei i numrul coloanei). Funcia furnizeaz un rezultat numeric care reprezint numrul de ordine al elementului n cadrul structurii.

?
Ce valoare va furniza funcia aelement() dac argumentul <expN1> este mai mare dect numrul de linii, iar argumentul <expN2> este mai mare dect numrul de coloane ale unei matrice?

Numrul liniei sau al coloanei unui element din tablou (adic unul dintre indicii ele-mentului), identificat prin poziia sa n cadrul tabloului, se obine cu ajutorul funciei asubscript() care are sintaxa: asubscript(<nume_tablou>,<expN1>,<expN2>), unde prin <expN1> se precizeaz poziia elementului i prin expresia <expN2>, ceea ce dorii s aflai. Funcia furnizeaz un rezultat numeric care reprezint ? pentru vectori numrul de ordine al elementului, iar pentru matrice 1. Ce valoare va furniza funcia asubscript() dac pentru un vector se furnizeaz numrul liniei (primul indice) dac argumentul <expN2>? <expN2> are valoarea 1 sau numrul 2. Ce valoare va furniza funcia asubscript() coloanei (al doilea indice) dac dac pentru o matrice argumentul <expN2> are valoarea 2. Cutarea unui element din tablou mai mare dect 2? care are o valoare precizat se face cu funcia ascan(): ascan(<nume_tablou>,<exp>[,<expN1>[,<expN2>]]), unde <exp> este expresia prin care se specific valoarea cutat. Ea poate fi de orice tip (numeric, ir de caractere, logic, dat calendaristic). Funcia furnizeaz un rezultat numeric care reprezint numrul de ordine al elementului care are valoarea precizat. Dac nici un element nu are aceast valoare, rezultatul furnizat va fi 0. Implicit cutarea se face prin toate elementele tabloului. Explicit se caut numai printre elementele care ncep din poziia precizat cu argumentul <expN1> i pn la elementul din poziia precizat cu argumentul <expN2>.
<expN2> are valoarea 0 sau o valoare

8.1.4. Actualizarea tablourilor de memorie:


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

Utilizarea unor instrumente de prelucrare a datelor

169

b. tergerea unui element (pentru vectori) sau a unei linii/coloane (pentru matrice) se face folosindu-se funcia adel(): adel(<nume_tablou>,<expN>[,2]) , unde argumentele i rezultatul furnizat au aceeai semnificaie ca i la funcia ains(). Funcia nu modific dimensiunea tabloului. Elementele care urmeaz poziiei, respectiv liniei sau coloanei terse vor fi deplasate spre nceputul tabloului, iar ultimul element, respectiv ultima linie sau coloan va fi inializat cu valoarea .F..

8.1.5. Copierea unui tablou de memorie:


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

8.1.6. Sortarea unui tablou de memorie:


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

8.1.7. Salvarea informaiilor n tablouri de memorie:


ntr-un tablou de memorie pot fi salvate urmtoarele informaii: a. Coninutul directorului curent poate fi salvat ntr-un tablou de memorie de tip matrice folosind funcia adir(): adir(<nume_tablou>,<expC1>[,<expC2>]) . Salvarea se face n tabloul precizat prin argumentul <nume_tablou>. Aceast matrice are o structur bine definit i dac nu a fost creat anterior, va fi creat de funcie, iar dac exist va fi

170 Informatic
redimensionat corespunztor. Matricea va avea un numr de linii egal cu numrul de fiiere i directoare (dosare=foldere) nregistrate n director i 5 coloane, corespunztoare celor 5 caracteristici ale unui fiier sau director: nume fiier (tip ir de caractere), dimensiune fiier (tip numeric), data ultimei actualizri (tip dat calendaristic), timpul ultimei actualizri (tip ir de caractere) i atribute (tip ir de caractere). Atributele fiierelor sau directoarelor pot fi: A - arhivat, H - ascuns, R - protejat la scriere, S - sistem, D - director. Implicit pot fi salvate informaii despre toate fiierele i dosarele nregistrate. Explicit vor fi salvate informaii numai despre fiierele care pot fi identificate prin ablonul descris cu argumentul <expC1> sau fiierele care au atributele precizate prin argumentul <expC2>: 'D' - numai directoare, 'H' - numai fiierele ascunse, 'S' - numai fiierele sistem, 'V' - n primul element al tabloului va fi nregistrat eticheta volumului de disc pe care se gsete directorul curent. Funcia furnizeaz un rezultat numeric care reprezint numrul de fiiere i dosare inventariate. b. Structura tabelului baz de date activ poate fi salvat ntr-un tablou de memorie de tip matrice folosind funcia afields(): afields(<nume_tablou>) . Salvarea se face n tabloul precizat prin argumentul <nume_tablou>. Aceast matrice are o structur bine definit i dac nu a fost creat anterior, va fi creat de funcie, iar dac exist va fi redimensionat corespunztor. Matricea va avea un numr de linii egal cu numrul de cmpuri din tabel i 11 coloane, corespunztoare caracteristicilor ale unui cmp: nume cmp (tip ir de caractere), tip cmp (tip ir de caractere), lungime cmp (tip numeric), numr poziii zecimale (tip numeric), regula de validare (tip ir de caractere), .... . Funcia furnizeaz un rezultat numeric care reprezint numrul de cmpuri.

8.2. Pstrarea variabilelor de memorie i a tablourilor de memorie n afara sesiunii de lucru


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

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

memoria extern
(cmp memo din tabel)

Restore from memo

Utilizarea unor instrumente de prelucrare a datelor


b. set de variabile de memorie cmpuri dintr-o nregistrare din tabel tablou de memorie tabel din baza de date : Replace Gather memoria intern
(set de variabile de memorie)

171

memoria extern
(cmpuri dintr-o nregistrare din tabel)

Scatter

Append from array Gather memoria intern


(tablou de memorie)

memoria extern
(tabel din baza de date)

Scatter Copy to array Observaie: Comanda Copy to array cere ca tabloul s fie creat anterior spre deosebire de comanda Scatter care i creeaz singur tabloul de memorie. Sintaxa comenzilor: a. Comanda save to: salveaz variabilele de memorie i tablourile descrise prin <sablon> ntr-un fiier pentru variabile de memorie (extensia .mem) specificat prin <nume_fisier> sau ntr-un cmp memo al tabelului activ specificat prin clauza to memo i identificat prin nume <nume_cmp>: save to <nume_fisier>| to memo <nume_cmp> [all like | except <sablon>] b. Comanda restore from: restaureaz variabilele de memorie i tablourile dintr-un fiier pentru variabile de memorie specificat prin <nume_fisier> sau ntr-un cmp memo al tabelului activ specificat prin clauza to memo i identificat prin nume <nume_cmp>: restore from <nume_fisier>| to memo <nume_cmp> [additive] c. Comanda scatter copiaz datele din cmpurile nregistrrii curente ale ta? belului activ ntr-un tablou de memorie 1. n ce ordine se copiaz datele din identificat prin <nume_tablou> sau ntrcmpurile tabelului n tabloul de memorie? un set de variabile de memorie, caz 2. Ce se ntmpl dac numrul de cmpuri specificat prin clauza memvar. care trebuie copiate este mai mare dect Variabilele de memorie vor avea numrul de elemente din tabel? acelai nume ca i cmpurile care se copiaz. Implicit se copiaz toate cmpurile, mai puin cmpurile memo. Explicit se pot

172 Informatic
copia numai cmpurile din lista de cmpuri a clauzei fields i se pot copia i cmpurile memo dac se precizeaz clauza memo. Clauza blank semnific faptul c se creeaz tabloul de memorie, respectiv setul de variabile de memorie de acelai tip i lungime ca i cmpurile, dar n loc s se transfere n ele datele din cmpuri, acestea vor fi vide. scatter [fields <list_cmpuri>] [memo] to <nume_tablou> | to <nume_tablou> blank | memvar | memvar blank d. Comanda gather copiaz n cmpurile nregistrrii curente a tabelului activ, datele dintrun tablou de memorie identificat prin <nume_tablou> sau dintr-un set de variabile de memorie, caz specificat prin clauza memvar. Variabilele de memorie trebuie s aib acelai nume ca i cmpurile. Ele pot fi create cu comanda scatter memvar blank, dup care li se pot atribui valori. Dac pentru un cmp nu exist o variabil de memorie cu acelai nume, cmpul rmne neschimbat. Copierea dintr-un tablou de memorie se face secvenial, n fiecare cmp copiindu-se un element al tabloului, pn cnd se termin elementele din tablou sau pn cnd se termin cmpurile din nregistrare. Implicit transferul se face n toate cmpurile, mai puin cmpurile memo. Explicit transferul se poate face numai n cmpurile precizate n lista de cmpuri a clauzei fields i se pot copia i cmpurile memo dac se precizeaz clauza memo. gather from <nume_tablou> | memvar [fields <list_cmpuri>] [memo] e. Comanda copy to array ncarc ntr-un tablou de memorie creat anterior, identificat prin <nume_tablou>, datele din cmpurile tabelului activ. Dac tabloul este de tip vector, se copiaz numai cmpurile din nregistrarea curent, iar dac tabloul este de tip matrice, se ncarc n fiecare linie a matricei cmpurile dintr-o nregistrare. Dac exist mai multe elemente dect cmpuri, restul elementelor rmne neschimbat, iar dac exist mai multe cmpuri dect elemente, cmpurile care nu mai ncap nu se copiaz. Dac exist mai multe linii dect nregistrri, restul de linii rmne neschimbat, iar dac exist mai multe nregistrri dect linii, nregistrrile care nu mai ncap nu se copiaz. Implicit se transfer toate cmpurile dintr-o nregistrare. Explicit se transfer numai n cmpurile precizate n lista de cmpuri a clauzei fields. Implicit se transfer toate nregistrrile din tabelul activ. Explicit se transfer numai nregistrrile precizate prin <domeniu> sau clauzele for sau while. copy to array <nume_tablou> [fields <list_cmpuri>] [<domeniu>] [for <expL1>][while < expL2>][<nooptimize>] f. Comanda append from array adaug la sfritul tablelului activ nregistrri cu date preluate dintr-un tablou de memorie identificat prin <nume_tablou>. Dac tabloul de memorie este de tip vector, se adaug o singur nregistrare astfel: dac exist mai multe elemente dect cmpuri, restul elementelor din tablou sunt ignorate, iar dac sunt mai multe cmpuri dect elemente, restul cmpurilor se inializeaz cu elementul neutru pentru acel tip de dat. Dac tabloul este de tip matrice, se copiaz n cte o nregistrare cte o linie a matricei. Linia matricei este tratat la fel ca un tablou de tip vector. Implicit se transfer date n toate cmpurile nregistrrii. Explicit se transfer numai n cmpurile precizate n lista de cmpuri a clauzei fields. Implicit se transfer toate liniile din tablou. Explicit se transfer numai liniile precizate prin clauza for. Dac tipul elementului din tablou nu corespunde cu tipul cmpului n care se transfer, se ncearc transformarea acelui tip de dat, care poate s reueasc sau nu. De exemplu, o dat de tip numeric, logic sau dat calendaristic poate fi transformat ntr-o dat de tip ir de caractere, iar o

Utilizarea unor instrumente de prelucrare a datelor

173

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

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

2. Afiai valoarea tuturor elementelor din tablouri folosind comanda display memory.
display memory like a display memory like b

b(1,3)=date() b(1,4)=.T. b(1,5)=datetime() b(2,1)=10 b(2,2)=20 b(2,3)=30 b(2,5)=50 display memory like b store 0 to a display memory like a

5. Redimensionai tablourile:
declare a(8) display memory like a dimension a(2,4) display memory like a dimension a(2,5) display memory like a elementele a(2,4) i a(2,5) au valoarea .F. dimension a(10) dimension b(2,8) display memory like b ultimele 6 elemente au valoarea .F. (ca i cum b ar fi un vector)

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

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


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

4. Atribuii valori elementelor din tablourile create i verificai modul n care s-au executat operaiile de atribuire:
b(2,4)=40 ? b(2,4) 40 ? b(9) 40 b(1,1)='azi' b(1,2)='maine'

174 Informatic
3 ? aelement(b, asubscript(b,11,1), asubscript(b,11,2)) 11 ? ascan(b,40) 9 ? asubscript(b, ascan(b,40),1) 2 ? asubscript(b, ascan(b,40),2) 1 ? ascan(b,'azi') 1 ? ascan(b,'zi') 0 ? ascan(b,date()) 3 ? ascan(b,.T.) 4 b(2,1)=10 b(2,2)=20 b(2,3)=30 b(2,4)=40 b(2,5)=50 ? adel(b,3,2) 1 display memory like b a fost tears coloana 3 i elementele din ultima coloan b(1,5) i b(2,5) - au valoarea .F. ? ains(b,3,2) 1 display memory like b a fost inserat coloana 2 i elementele din aceast coloan -b(1,3) i b(2,3)- au valoarea .F. b(1,3)=date() b(2,3)=30

7. Actualizai tablourile de memorie:


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

8. Copiai tablouri de memorie n alte tablouri de memorie:


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

Utilizarea unor instrumente de prelucrare a datelor


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

175

9. Sortai tablourile de memorie:


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

i dup coloana n care se gsete acest element - coloana 3; elementele matricei a sunt: 25 20 15 10 5 0 300 400 100 50 40 30

10. Transferai date ntre tablouri de memorie i tabelul bazei de date:


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

176 Informatic
declare w(5,3) copy to array w fields c1, c2, c3 display memory like w ? asort(w,2) 1 display memory like w zap append from array w for c2>400 list

date dup valoarea cresctoare a cmpului cost_s (coloana 4 a tabloului):


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

11. Salvai informaii n tablouri de memorie:


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

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

T est pentru evaluare:


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

Utilizarea unor instrumente de prelucrare a datelor

177

12. Transformai matricea a ntr-o matrice cu 2 linii i 5 coloane. Afiai coninutul matricei. 13. Comparai numrul de linii ale matricei a cu variabila de memorie ak1. Comparai numrul de coloane ale matricei a cu variabila de memorie ak2. Comparai numrul de elemente ale matricei a cu variabila de memorie al. 14. Afiai valoarea elementului 9 din matricea a. Afiai valoarea elementului 10 din matricea a. 15. Transformai matricea a ntr-un vector cu 10 elemente. 16. Refacei datele din matricea iniial a. 17. Sortai descresctor vectorul a. Afiai coninutul vectorului sortat. 18. Transformai vectorul a ntr-o matrice cu 2 linii i 4 coloane. Afiai coninutul matricei. 19. Sortai creasctor matricea a dup coloana 3 ncepnd cu prima linie. Afiai coninutul acestei matrice. 20. Transformai matricea a ntr-un vector cu 10 elemente. Afiai coninutul acestui vector. 21. Sortai cresctor vectorul a. Afiai coninutul acestui vector. 22. Creai printr-o singur comand structura vectorului c cu 5 elemente i a vectorului d cu 2 elemente. 23. Folosind datele din matricea a, atribuii elementelor din vectorul c valorile 6, 7, ..., 10, iar elementelor din vectorul d valorile 3 i 8. Afiai coninutul celor doi vectori. 24. Transformai vectorul a ntr-o matrice cu 3 linii i 5 coloane. Afiai coninutul matricei. 25. tergei linia 2 a matricei a. Transformai matricea a ntr-o matrice cu 2 linii i 5 coloane. Afiai coninutul acestei matrice. 26. Transformai matricea a ntr-o matrice cu 2 linii i 6 coloane. Afiai coninutul acestei matrice. Inserai o coloan vid n coloana 3. Afiai coninutul acestei matrice. 27. Transformai matricea a ntr-o matrice cu 2 linii i 5 coloane. Refacei matricea iniial a. Afiai coninutul matricei. Inserai o coloan vid n coloana 3. Afiai coninutul matricei. 28. tergei coloana 3 din matricea a. Afiai coninutul matricei a. 29. Cutai valoarea 6 n matricea a. Cutai valoarea 8 n vectorul c. 30. Refacei matricea iniial a. Cutai valoarea 6 n matricea a. 31. Creai structura a doi vectori cu 5 elemente: a1 i a2. 32. Copiai n vectorul a1 prima linie din matricea a. 33. Copiai n vectorul a2 a doua linie din matricea a. 34. Afisai printr-o singur comand coninutul vectorilor a1 i a2 i al matricei a. 35. Salvai vectorii a1 i a2 i matricea a n fiierul fa. 36. tergei din memoria intern vectorii a1 i a2 i matricea a. 37. Afiai coninutul vectorilor a1 i a2 i al matricei a. 38. Refacei n memoria intern vectorii a1 i a2 i matricea a prin preluare din fiierul fa. 39. Afiai coninutul vectorilor a1 i a2 i al matricei a. 40. tergei coninutul memoriei interne. 41. Deschidei tabelul Incasari din baza de date Compania. Pstrai n variabila x numrul de nregistrri din tabel. 42. Copiai din acest tabel, ntr-un tablou de memorie cu trei coloane, cmpurile nr_i, id_cont, valoare. Vizualizai datele din tabloul de memorie. 43. Sortai acest tabel dup valoarea cmpului valoare. Vizualizai datele sortate. 44. Adugai aceste date la sfritul tabelului. Vizualizai datele adugate. 45. tergei datele adugate. nchidei tabelul i baza de date. Eliberai memoria intern.

178 Informatic

ncercai:

Adevrat/Fals: 1. n Visual FoxPro tablourile de memorie sunt omogene. 2. Un element al unei matrice Visual FoxPro poate fi identificat dup numrul su de ordine. 3. Dac transformai un vector ntr-o matrice, datele se pierd. 4. n Visual FoxPro se pot defini tablouri de memorie cu trei dimensiuni. 5. nregistrarea n memoria intern a elementelor unei matrice se face linie dup linie. Completai: 1. Structura tabelului activ se poate salva ntr-o matrice folosind funcia ................ 2. Funcia alen(a,2) furnizeaz ............................... ale matricei a. 3. Prin comanda de definire a structurii unui tablou de memorie elementele sunt iniializate cu valoarea .......... 4. Pentru a terge a doua coloan dintr-o matrice a folosii funcia .................... Alegei rspunsul corect: 1. Pentru copierea elementelor unui tablou de memorie ntr-un alt tablou de memorie folosii: a) funcia acopy() b) comanda copy to array c) comanda append from array c) coloanele

2. ntr-o matrice Visual FoxPro se pot ordona: a) elementele b) liniile

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

R spunsuri:

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

Capitolul

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor


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

Dup ce vei parcurge acest capitol trebuie s tii:

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

1. Cum putei crea o aplicaie Visual 2. Cum putei modulariza aplicaia. 3. Cum putei dezvolta o aplicaie

Pentru crearea unei aplicaii, sistemul de gestiune a bazelor de date Visual FoxPro pune la dispoziia programatorului dou metode de programare: 9 Programarea clasic n care rezolvarea unei probleme se face cu ajutorul algoritmilor descrii prin cele trei structuri de control: structura secvenial, structura alternativ i structura repetitiv. Ea este orientat pe prelucrarea datelor. Folosind aceast metod, programatorul trebuie s construiasc un program care este format din ansamblul de date i algoritmul folosit pentru descrierea problemei. Algoritmul este implementat n calculator cu ajutorul instruciunilor puse la dispoziie de limbajul de programare.

180 Informatic
9 Programarea orientat pe obiecte n care rezolvarea problemei se face cu ajutorul obiectelor. Ea este orientat pe definirea obiectelor. Folosind aceast metod, programatorul trebuie s construiasc obiecte care sunt formate din date i procedurile care prelucreaz aceste date.
Aceeai problem poate fi rezolvat cu oricare dintre cele dou metode. Metoda programrii pe obiecte are ns urmtoarele avantaje: permite un control mai bun al programelor (n special al programelor de dimensiuni mari) i permite o mai uoar dezvoltare a programelor. n schimb, programarea clasic asigur compatibilitatea cu programele scrise ca aplicaii pentru versiunile anterioare ale sistemului de gestiune a bazelor de date FoxPro. Pe lng cele dou metode de programare Visual FoxPro pune la dispoziia utilizatorului instrumente vizuale pe care le poate folosi pentru a realiza interfaa aplicaiei. Aplicaia Visual FoxPro cuprinde, pe lng fiierele surs sau cu module obiect ale programelor i ale bibliotecilor de subprograme, i alte fiiere care concur la realizarea interfeei i la obinearea informaiilor, cum sunt de exemplu fiierele cu formularele folosite pentru introducerea datelor, fiierele pentru formatul rapoartelor, fiierele pentru interogri etc. Toate aceste elemente necesare la realizarea unei aplicaii pot fi organizate ntr-un proiect care s permit o mai bun gestionarea a lor din punct de vedere al programatorului. Pentru a proteja aceste elemente mpotriva unor modificri neautorizate, proiectul poate genera un fiier executabil independent de mediul Visual FoxPro.

1. Elemente de programare clasic structurat


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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor


sum camp1 to c count to d

181

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

Pe parcursul unui program, acelai identificator de dat poate s defineasc tipuri diferite de date. De exemplu, n acelai program se pot ntlni comenzile: store 0 to a {se creeaz variabila de memorie a de tip numeric prin atribuirea ........................... unei valori numerice} a=date() {se creeaz variabila de memorie a de tip dat calendaristic prin ........................... atribuirea valorii unei funcii de tip dat calendaristic} accept 'a=' to a {se creeaz variabila de memorie a de tip ir de caractere prin atribuirea irului de caractere introdus de la tastatur} n general, pentru marea majoritate a comenzilor nu este necesar ca variabilele de memorie s fie definite anterior comenzii (de exemplu comenzile de atribuire sau comenzile care permit redirectarea unor valori de pe ecran ntr-o variabil de memorie folosind clauza to: accept, input, sum, count etc. creeaz ele nsele variabila de memorie).

1.2. Structuri de control


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

structura liniar, structura alternativ, structura repetitiv.


Limbajul gazd Visual FoxPro (ca i limbajele gazd din versiunile anterioare FoxPro) poate fi folosit la fel ca orice limbaj de programare structurat. La construirea unui program, comenzile studiate anterior pot fi folosite ca instruciuni, iar pentru schimbarea ordinii secveniale de execuie se pot folosi instruciuni de control. Programul surs devine astfel o colecie de comenzi i instruciuni de control scrise n ordinea n care trebuie s fie executate. Instruciunile de control sunt instruciuni bloc deoarece conin mai multe instruciuni. De aceea ele trebuie delimitate de cuvinte cheie care marcheaz nceputul i sfritul structurii de control. Instruciunile nu pot fi folosite n modul comand. Compilatorul FoxPro trebuie s poat identifica fiecare instruciune a programului surs. El consider ca separator ntre instruciuni codul ASCII generat la acionarea tastei enter. Se numete EOL (End Of Line) i este format din dou coduri ASCII: EOL = LF (Line Feed = salt la linia urmtoare) + CR (Carriage Return = retur la nceputul liniei) = 0DH + 0AH

182 Informatic
Din aceast cauz, n fereastra de editare fiecare comand se va scrie pe cte un rnd: <verb1> <list_adverbe_1> enter <verb2> <list_adverbe_2> enter instruciune ....................................................... Dac dorii s scriei o comand pe mai multe rnduri, pentru a arta c ea continu pe rndul urmtor, la sfritul liniei, nainte de a aciona tasta enter scriei caracterul punct i virgul ( ; ), astfel: <verb> < adverb_1> ; enter < adverb_2> ; enter < adverb_3> enter sfrit de comand Atenie: urmtoarele linii ale comenzii nu se scriu din prima coloan.

Instruciunile de control implementate n limbajul gazd FoxPro sunt:


simpl structura alternativ generalizat

if ... endif do case ... endcase

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

for ... endfor

do while ... enddo

scan ... endscan

1. Spre deosebire de limbajele clasice de programare, n limbajul gazd FoxPro este implementat o structur repetitiv specific acestui gen de aplicaie (scan ... endscan), care faciliteaz scrierea unui program ce exploateaz secvenial un tabel al bazei de date.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

183

2. Nu este implementat structura repetitiv cu numr necunoscut de pai condiionat posterior (de tip repeat ... until).

1.2.1. Structura liniar sau secvenial


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

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

184 Informatic
1.2.2. Structura alternativ
Prin aceast structur se execut condiionat o anumit secven de instruciuni, n funcie de valoarea unei condiii logice. Limbajul gazd FoxPro permite folosirea a dou tipuri de structuri alternative: a. Structura alternativ simpl Structura alternativ simpl permite executarea unei aciuni (descris printr-o secven de instruciuni: <secven-instruciuni-1> sau <secven-instruciuni-2>) din dou aciuni posibile, n funcie de valoarea unei condiii exprimate printr-o expresie logic (<expL>): if <expL> <secven-instruciuni-1> else <secven-instruciuni-2> endif Observaii: 1. Cuvintele cheie if i endif delimiteaz structura, iar cuvntul else marcheaz nceputul secvenei de instruciuni care descrie activitatea ce se execut dac expresia logic are valoarea fals. 2. Cuvntul cheie if mpreun cu condiia i cuvintele cheie else i endif se scriu fiecare pe cte un rnd. 3. Sunt permise structuri if ... endif imbricate. Dac sunt mai multe structuri alternative simple imbricate, else se refer la primul if care l precede. 4. Se pot construi i structuri alternative simple cu o ramur vid. Exemplu S se scrie un program pentru rezolvarea ecuaiei de gradul I cu coeficieni numere reale. Coeficienii a i b se introduc de la tastatur. Metoda 1

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

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

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

set talk off clear store 0 to a,b

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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor input 'a= ' to a input 'b= ' to b if a=0 and b=0 ? 'Ecuatia are o infinitate; de solutii' else if a=0 and b<>0 ? 'Ecuatia este imposibila' else
Metoda 3 (care folosete funcia iif())

185

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

set talk off clear store 0 to a,b ? 'Programul va furnizeaza solu-; tia ecuatiei de gradul I' ? 'de forma a*x+b=0' input 'a= ' to a input 'b= ' to b
b. Structura alternativ generalizat

? iif(a<>0, -b/a,iif(b<>0, 'Ecuatia este imposibila',; 'Ecuatia are o infinitate de; solutii')) wait 'Actionati orice tasta; pentru continuare' clear return

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

186 Informatic
executa atunci cnd nici una dintre expresiile logice din cazurile prezentate nu au avut valoarea adevrat. 2. Cuvntul cheie case mpreun cu condiia i cuvintele cheie do case, otherwise i endcase se scriu fiecare pe cte un rnd. 3. Se accept ntr-o structur do case ... endcase structuri alternative sau structuri repetitive cu condiia ca aceste structuri s fie incluse complet n interiorul unui case sau otherwise. 4. Structura alternativ generalizat do case ... endcase poate fi echivalat cu mai multe structuri alternative simple if ... endif imbricate: if <expL1> <secvena-instruciuni-1> else if <expL2> <secvena-instruciuni-2> else if <expLn> <secvena-instruciuni-1> else ...................................... if <expLn> <secvena-instruciuni-n> else <secvena-instruciuni-n> endif ...................................... endif endif endif Mod de executare a instruciunii: 1. Se evalueaz pe rnd expresiile logice <expL1>, <expL2>, <expL3>, ... i <expLn>. Cnd se ntlnete prima expresie care are valoarea adevrat, se execut secvena de instruciuni cuprins ntre condiia logic i apariia unuia dintre cuvintele cheie case, otherwise sau endcase. 2. Dup ce s-a ntlnit un caz adevrat i s-au executat instruciunile corespunztoare cazului, celelalte cazuri nu vor mai fi tratate i se va trece la executarea primei instruciuni aflate dup cuvntul cheie endcase. 3. Dac nici una dintre expresiile logice evaluate nu a avut valoarea adevrat, se execut secvena de instruciuni delimitat de cuvintele cheie otherwise i endcase, dac exist sau, n caz contrar, prima instruciune aflat dup cuvntul cheie endcase. Recomandare: Se recomand folosirea instruciunii do case ... endcase n locul instruciunii if ... endif n urmtoarele cazuri: 1. Din mai multe cazuri unul singur poate fi adevrat. 2. Din mai multe condiii numai prima gsit adevrat trebuie executat. 3. Exist un numr mic de excepii la o anumit condiie. n acest caz excepiile vor fi puse n eviden prin case <expL>, iar situaia obinuit prin otherwise.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor


Exemplu

187

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

1.2.3. Structura repetitiv


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

Loop - foreaz reevaluarea condiiei de terminare a structurii repetitive printr-un salt la nceputul structurii (n cazul unei structuri repetitive cu numr cunoscut de pai, nainte de evaluarea condiiei produce i incrementarea contorului). Exit - foreaz abandonarea structurii repetitive indiferent de rezultatul evalurii condiiei de terminare printr-un salt la prima instruciune care urmeaz dup terminarea structurii repetitive.

to <contor> <= <expN2> .T. <secven-instruciuni> <contor>=<contor>+<expN3> step .F.

endfor

Instruciunile loop i exit se vor folosi ntr-o structur alternativ din interiorul structurii repetitive. n limbajul FoxPro sunt implementate urmtoarele tipuri de structuri repetitive: a. Structura repetitiv cu numr cunoscut de pai

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

188 Informatic
for <contor>=<expN1> to <expN2> [step <expN3>] <secven-instruciuni> endfor | next Observaie: 1. Cuvntul cheie for marcheaz nceputul structurii, iar cuvntul cheie endfor (sau cuvntul cheie next) marcheaz sfritul structurii. Cuvintele cheie for i to delimiteaz operaia de atribuire prin care se face iniializarea contorului, cuvntul to precede valoarea final a contorului, iar cuvntul step precede valorea cu care se incrementeaz contorul. 2. Cuvntul cheie for mpreun cu expresiile i cuvintele cheie to i step se scriu pe acelai rnd. Cuvntul cheie endfor, respectiv next se scrie pe un singur rnd. 3. Variabila de memorie <contor> trebuie definit naintea structurii for ... endfor ca variabil de tip numeric ntreg printr-o operaie de atribuire. Exemplu: S se calculeze suma a n numere introduse de la tastatur. set talk off clear store 0 to suma,i ? 'Programul calculeaza suma a n; numere introduse de la tastatura' input 'n= ' to n for i=1 to n input 'a= ' to a de la tastatur. Valoarea lui n se introduce

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

tasta;

b. Structura repetitiv cu numr necunoscut de pai condiionat anterior Permite executarea repetat a unei secvene de instruciuni att timp ct o condiie exprimat printr-o expresie logic <expL> are valoarea adevrat. Sintaxa instruciunii este: do while <expL> <secven-instruciuni> enddo Observaii: 1. Cuvntul cheie while marcheaz nceputul structurii iar cuvntul cheie enddo sfritul ei. 2. Cuvntul cheie while mpreun cu expresia logic i cuvntul cheie enddo se scriu fiecare pe cte un rnd. Exemplu: S se calculeze media aritmetic a unor numere introduse de la tastatur. Utilizatorul programului este ntrebat de fiecare dat dac mai dorete s introduc un numr. Operaia se termin atunci cnd acesta rspunde c nu mai dorete continuarea operaiei de introducerea numerelor.
<expL> iniializare

do while .F.

enddo .T. <secven-instruciuni>

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

189

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

190 Informatic
c. Structura repetitiv pentru parcurgerea nregistrrilor dintr-un tabel Permite parcurgerea secvenial a nregistrrilor dintr-un tabel, excutnd o secven de instruciuni. Secvena de instruciuni acioneaz implicit asupra tuturor nregistrrilor din tabel. Explicit, ea se poate executa condiionat numai asupra nregistrrilor care aparin unui domeniu precizat prin clauza <domeniu> sau numai asupra nregistrrilor care ndeplinesc condiia precizat prin expresia logic <expL1> respectiv <expL2> din clauza for respectiv while. Sintaxa instruciunii este: scan [<domeniu>] [for <expL1>] [while <expL2>] <secven-instruciuni> endscan Observaie: 1. Cuvntul cheie scan marcheaz nceputul structurii, iar cuvntul cheie endscan sfritul structurii. 2. Cuvntul cheie scan (mpreun cu adverbele care use <tabel> precizeaz nregistrrile ce vor fi prelucrate) i cuvntul cheie endscan se scriu fiecare pe cte un rnd. 3. Forma implicit a instruciunii scan ... endscan este do while echivalent cu urmtoarea instruciune do while ... .F. enddo: not eof() goto top do while not eof() enddo <secven-instruciuni> .T. skip <secven-instruciuni> enddo 4. Forma implicit a instruciunii scan ... endscan este skip echivalent cu urmtoarea instruciune for ... endfor: goto top for i=1 to reccount() <secven-instruciuni> skip endfor Exemplu: S se afieze informaii despre edinele inute de un angajat al firmei de consultan. Identificatorul angaja-tului se introduce de la tastatur.

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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor 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

191

1.3. Construirea programului


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

1.3.1. Crearea programului surs


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

192 Informatic
poate fi ncrcat n fereastra standard a editorului. Explicit aceast fereastr poate prelua caracteristicile ferestrei precizate prin clauza window <nume_fereastr_1>. Fereastra de editare este deschis implicit pe ecran i explicit ntr-o fereastr printe precizat prin clauza in [window] <nume_fereastr_2>.

1.3.2. Compilarea programului surs


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

Controlul compilrii
Putei controla compilarea folosind urmtoarele comenzi i funcii: 9 Putei salva mesajele de eroare obinute n urma compilrii ntr-un fiier de texte cu acelai nume ca i fiierul surs i cu extensia .err. Aceast facilitate este controlat de parametrul logerrors care trebuie s aib valoarea on. Valoarea parametrului poate fi stabilit cu comanda set logerrors care are sintaxa: set logerrors on | off 9 Putei construi capcane pentru erori. O capcan pentru erori oprete execuia programului atunci cnd apare o eroare i d controlul unei subrutine (subprogram sau program). Activarea i dezactivarea subrutinei se face cu comanda on errorr care are sintaxa: on error <comand> pentru activarea rutinei i on error pentru dezactivarea ei. Adverbul <comand> este o comand de apel a unui subprogram: do <nume_program>. Subprogramul poate fi scris n fiierul surs al programului (ca procedur) sau ntr-un fiier separat. Dup executarea subrutinei, programul va fi reluat cu instruciunea imediat urmtoare dup cea n care a aprut eroarea. n cadrul subrutinei de eroare pot fi obinute informaii despre eroare utiliznd ca parametri funciile: error(), message(), lineno() i program(): error() - furnizeaz numrul erorii detectate de capcana on error (rezultat numeric). message() - furnizeaz mesajul de eroare (fr parametru) sau coninutul liniei care a cauzat eroarea (dac se folosete parametrul 1). Rezultatul este de tip ir de caractere. lineno() - furnizeaz numrul relativ al liniei programului n curs de execuie (rezultat numeric). Se numr toate liniile, inclusiv liniile de comentarii i liniile vide.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

193

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

1.3.3. Lansarea n execuie a programului


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

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

1.4. Modularizarea aplicaiilor


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

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

194 Informatic b. O anumit operaie este necesar n mai multe programe, cum sunt de exemplu
diferite operaii matematice (extragerea radicalului, extragerea prii ntregi sau a prii fracionare dintr-un numr real etc.), diferite operaii cu iruri de caractere (extragerea unui subir dintr-un ir, tergerea unui subir dintr-un ir, inserarea unui subir ntr-un ir etc.), diferite operaii cu fiiere (deschiderea unui fiier, nchiderea unui fiier, testarea sfritului de fiier etc.).

c. Pentru simplificare, orice problem poate fi descompus n subprobleme folosind tehnica top-down de proiectare a algoritmilor. Descompunerae poate continua pn cnd se obin subprobleme cu rezolvare imediat i care sunt independente unele de altele, astfel nct programele cu care vor fi descrise s fie uor de conceput i depanat, iar ulterior, cnd se schimb unele cerine, s fie uor de dezvoltat. n anii precedeni de studiu ai aflat c subproblemele obinute pot fi descrise prin uniti de programe care se mai numesc i module. Ai mai nvat c modulele se clasific astfel: Modul apelant Transfer Modul apelat 9 Modul apelant. Este modulul care pentru rezolvarea propriei probleme apeleaz la alte module, fiecare dintre ele rezolvnd o anumit subproblem. La apelare, el transfer controlul modului apelat. control

9 Modul apelat. Este un modul la care apeleaz un alt modul pentru a-i rezolva o subproblem. Dup ce i termin execuia, el red controlul modulului apelant.

Revenire control

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

1.4.1. Controlul execuiei modulelor


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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

195

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

196 Informatic
toarelor situaii: execuia unei anumite linii din program (care creeaz puncte de ntrerupere permanente), schimbarea valorii unei expresii, evaluarea unei expresii la o anumit valoare, terminarea execuiei unui anumit modul (step out) sau producerea unui anumit eveniment n timpul execuiei programului.

1.4.2. Domeniul de vizibilitate al identificatorilor


Deoarece att n modulul apelant, ct i n modulul apelat sunt definii mai muli identi1 ficatori pentru variabilele i tablourile de memorie , apare urmtoarea problem: care este domeniul de vizibilitate al identificatorilor n funcie de locul i modul n care sunt declarai? Ai nvat deja c domeniul de vizibilitate al unui identificator este regiunea din interiorul programului n care un identificator este vizibil (poate fi referit n cadrul unei operaii de consultare sau modificare). n Visual FoxPro n funcie de domeniul de vizibilitate, variabilele de memorie se clasific n: 9 Globale sau publice. Ele sunt vizibile att n modulul n care au fost declarate, ct i n modulele activate de acesta, din momentul n care au fost declarate i pn cnd modulul i termin execuia. Se recomand folosirea lor atunci cnd unele date sunt folosite n comun de mai multe module ale aplicaiei. Declararea lor se face cu instruciunea Public care are urmtoarea sintax: public <list_variabile_memorie> pentru variabilele de memorie i public [array] <nume_tablou_1>(<expN11>[,<expN12>]) [<nume_tablou_2>(<expN21>[,<expN22>])] ... pentru tablourile de memorie. Locale. Sunt vizibile numai n modulul n care au fost create. La terminarea execuiei modulului, ele vor fi distruse, eliberndu-se zona de memorie pe care o ocupau. Folosirea lor este util pentru a se elimina confuziile care apar atunci cnd se folosesc variabile cu acelai nume n dou module diferite. Ele pot fi create cu instruciunea Local care are urmtoarea sintax: local <list_variabile_memorie> pentru variabilele de memorie i local [array] <nume_tablou_1>(<expN11>[,<expN12>]) [<nume_tablou_2>(<expN21>[,<expN22>])] ... pentru tablourile de memorie. Private. Sunt ascunse de modulele superioare. Se recomand folosirea lor atunci cnd dorii s memorai n module diferite, valori diferite, folosind acelai identificator. Ascunznd o variabil sau un tablou de memorie, operaiile de modificare a valorilor executate n modulul curent nu vor fi percepute de modulele superioare. Declararea lor se face cu instruciunea Private care are urmtoarea sintax: private <list_variabile_memorie>

n continuare, se va folosi numai termenul variabile de memorie i se va subnelege c acele operaii se refer i la tablouri de memorie.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

197

pentru un grup de variabile i tablouri de memorie care nu poate fi descris cu ajutorul unui ablon i private all [like <ablon> | except <ablon>] pentru un grup de variabile i tablouri de memorie care poate fi descris cu un ablon. Regionale. Sunt vizibile ntr-o anumit regiune a modulului. Se recomand folosi-rea lor atunci cnd dorii s memorai n regiuni diferite ale modulului valori diferite folosind acelai identificator. Pentru aceasta trebuie create mai nti regiunile modulului folosind directiva de compilare #Region astfel: #region <numr_regiune> Se pot crea maxim 32 de regiuni numerotate de la 0 la 31. Dup declararea regiunii se pot declara i variabilele din acea regiune cu instruciunea Regional care are sintaxa: regional <list_variabile_memorie> Observaii: 1. Instruciunile public, local i regional creeaz variabile de memorie. O variabil de memorie trebuie declarat global, local respectiv regional nainte de a i se atribui valori i de a fi folosit n cadrul modulului. 2. Comanda private nu creeaz variabile de memorie; ea schimb numai statutul variabilelor de memorie precizate. 3. Variabilele i tablourile de memorie create n fereastra de comenzi sunt publice.

1.4.3. Parametrii de comunicare


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

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

198 Informatic
Atribuirea valorilor se face respectnd regula de coresponden. De aceea n cele dou liste de parametri trebuie s se respecte aceeai succesiune a parametrilor i acelai tip de date pentru fiecare pereche de parametri. Se accept ns ca lista de parametri actuali s conin mai puini parametri dect lista de parametri formali (dar nu mai muli parametri). n acest caz, parametrii formali crora nu li s-a atribuit o valoare folosind regula de corespondn vor fi iniializai cu valoarea logic .F.. Putei afla numrul de parametri transmii unui modul folosind funcia parameters() .

1.4.4. Modul de transmitere al parametrilor


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

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

1.4.5. Subprogramele
tii deja c din punct de vedere al valorilor returnate modulului apelant, subprogramele se clasific n proceduri (care returneaz un rezultat, nici un rezultat sau mai multe rezultate prin intermediul listei de parametri) i funcii (care returneaz un singur rezultat prin numele su). Tipul subprogramului determin i modul n care este activat (lansat n execuie): procedura printr-o instruciune de apel i funcia n cadrul unei expresii unde este folosit ca operand. Din punct de vedere al constructorului, subprogramele se clasific n subprograme de sistem i subprograme utilizator. Limbajul gazd Visual FoxPro permite lucrul cu: Proceduri Funcii

utilizator de sistem utilizator (UDF - User Defined Functions)

Construirea unei proceduri sau a unei funcii utilizator se face astfel: procedure | function <nume_procedur>|<nume_funcie> <corp-procedur> | <corp_funcie> [return [<expresie>]] Prin comanda procedure , respectiv function se definete antetul subprogramului (tipul i numele). Dac la sfritul subprogramului nu se scrie instruciunea return (care

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

199

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

Creai un fiier care conine un program surs i-l lansai n execuie 1. Creai fiierul surs, l compilai i-l lansai n execuie folosind meniul aplicaiei:

200 Informatic
Deschidei o fereastr a editorului de texte ncorporat astfel: alegei opiunea New... File; se deschide caseta de dialog New n care alegei din grupul de butoane radio File Type opiunea Program i apoi acionai declanatorul New File. Se deschide fereastra de editare. Folosind operaia Save As atribuii fiierului numele test1.prg. Scriei n fereastra de editare textul programului din exemplul prezentat la structura liniar. Compilai fiierul surs cu opiunea de meniu Compile Program. Salvai i nchidei fereastra de editare fie cu opiunea de meniu, fie folosind butonul de nchidere al ferestrei, fie apsnd tastele ctrl+w. Lansai n execuie programul cu opiunea de meniu Do... Program.
2. Creai fiierul surs, l compilai i-l lansai n execuie folosind limbajul de comand: Deschidei o fereastr a editorului de texte ncorporat cu comanda: modify command test2 Se deschide fereastra de editare care are titlul test2.prg. Scriei n aceast fereastr textul programului din exemplul prezentat la structura alternativ simpl. Salvai i nchidei fereastra de editare. Compilai fiierul surs cu comanda: compile test2 Lansai n execuie programul cu comanda: do test2 Deschidei fereastra editorului de texte ncorporat cu comanda: modify command test2 Salvai coninutul acestui fiier sub numele test3.prg. nchidei fereastra de editare. Compilai fiierul surs cu comanda: compile test2 encrypt Deschidei dou ferestre de editare n care ncrcai cele dou fiiere obiect obinute n urma compilrii: test2.fxp i test3.fxp. Ele s-au obinut n urma compilrii aceluiai program surs, dar folosind metode diferite de compilare. Comparai cele dou fiiere obiect obinute. 3. Creai fiierele surs, le compilai i le lansai n execuie pentru toate exemplele prezentate la seciunea Structuri de control. Creai o capcan pentru erori S se construiasc o capcan pentru erori. n fiierul surs exemplu.prg se vor scrie instruciunile programului (modulul apelant), iar n fiierul surs eroare.prg instruciunile subrutinei de eroare (modulul apelat). 1. Creai fiierul surs exemplu.prg i l compilai:

if set('talk')='on' set talk off endif if set('bell')='off' set bell on endif * prin urmatoarea instructiune * se activeaza un subprogram * care a fost scris ntr-un * fisier separat:eroare.prg

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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor 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

201

2. Creai fiierul surs eroare.prg i l compilai: parameter nrer, mesaj1,; ?? mesaj2 mesaj2, numeprog, nrlinie ? 'Programul cu eroarea: ' clear ?? numeprog ? 'Eroare cu numarul: ' ? 'Linia cu numarul: ' ?? ?? nrlinie str(nrer,4)+replicate(chr(7),3) wait '' ? 'Mesaj de eroare: ' clear ?? mesaj1 return ? 'Comanda eronata: ' 3. Lansai n execuie programul exemplu. Observai modul n care suntei informai despre erorile de compilare. Testai modul n care pot fi folosite variabilele de memorie ascunse Scriei urmtorul program surs n fiierul ex1.prg i-l lansai n execuie: set talk off a1 = 100 a1 = 10 a2 = 200 a2 = 20 ? 'Afiseaza variabilele din; do ascunde procedura' ? 'Afiseaza variabilele din; ? 'a1= ' program dupa revenire din; ?? a1 && Afiseaza 100 procedura' ? 'a2= ' ? a1, a2 && Afiseaza 10, 200 ?? a2 && Afiseaza 200 procedure ascunde return private a1 Testai modul n care pot fi folosite variabilele de memorie publice Scriei urmtorul program surs n fiierul ex2.prg i-l lansai n execuie. Observai valorile afiate. Observai comportamentul variabilelor publice. Comparai acest exemplu de program (n care variabilele de memorie a1 i a2 au fost declarate publice) cu exemplul anterior n care nu au fost declarate publice. Ce concluzie tragei? Observai c prin comanda release all nu sunt eliberate variabilele publice, iar prin comanda release a1,a2 sunt eliberate variabilele de memorie specificate n list, chiar dac sunt publice.

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

release all display memory like a? release a1,a2 display memory like a? procedure ascunde private a1 a1 = 100 a2 = 200 ? 'Afiseaza variabilele din; procedura'

202 Informatic
? 'a1 = ' ?? a1 ? 'a2 = ' ?? a2 return && Afiseaza 200

&& Afiseaza 100

Testai modul n care pot fi folosite variabilele de memorie regionale Scriei urmtorul program surs n fiierul ex3.prg i-l lansai n execuie:

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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor function fact parameters j fact=1 for i=1 to j fact=fact*i endfor return fact

203

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

clear if set('talk')='on' set talk off endif set udfparms to value n=10 ?test(n),n && Afiseaza 70, 10 set udfparms to reference

n=10 ?test(n),n return function test parameters y y=2*y+50 return y

&& Afiseaza 70, 70

Testai modul n care putei activa o procedur la fel ca i o funcie Procedura data furnizeaz un format romnesc de afiare a datei prin chiar numele su. Scriei urmtorul program surs n fiierul ex8.prg i-l lansai n execuie.

set talk off set century on

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

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

luna='noiembrie' case month(d)=12 luna='decembrie' endcase do case case lower(cdow(d))='monday' ziua='luni' case lower(cdow(d))='tuesday' ziua='marti' case lower(cdow(d))='wednesday' ziua='miercuri' case lower(cdow(d))='thursday' ziua='joi' case lower(cdow(d))='friday' ziua='vineri' case lower(cdow(d))='saturday' ziua='sambata' case lower(cdow(d))='sunday' ziua='duminica' endcase dat=ziua+', '+str(day(d),2)+; ' '+luna+' '+str(year(d),4) return dat

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor procedure concatenare parameters a,b,c,n,m dimension c(n+m) ?acopy(a,c,1,n,1) ?acopy(b,c,1,m,n+1) procedure divizare parameters a,b,c,n,m dimension b(m) dimension c(n-m) ?acopy(a,b,1,m,1) ?acopy(a,c,m+1,n-m,1) return procedure interclasare parameters a,b,c,n,m dimension c(n+m) ?acopy(a,c,1,n,1) ?acopy(b,c,1,m,n+1) ?asort(c) return function caut parameters a,n,x local i k=-1 for i=1 to n if a(i)=x k=i exit endif endfor return k procedure cautv parameters a,n,x,t,k local i,j k=-1 j=0 for i=1 to n if a(i)=x j=j+1 dimension t(j) t(j)=i k=j endif endfor return

205

Testai apoi biblioteca folosind urmtoarele programe: test1.prg pentru testarea operaiei de cutare, test2.prg pentru testarea operaiei de concatenare, test3.prg pentru testarea operaiei de interclasare i test4.prg pentru testarea operaiei de divizare. test1.prg

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

else ? 'Prima pozitie in care se; gaseste valoarea este '; +str(caut(v,m,x),2) do cautv with v,m,x,u,p if p>1 ? 'Valoarea apare in mai; multe pozitii' ? 'Pozitiile gasite sunt:' do afisare with u,p endif endif note Se nchide biblioteca set procedure to return

vectori numerici' ? 'Comunicati primul vector' do creare with x,p ? 'Comunicati al doilea vector' do creare with y,q

206 Informatic
do concatenare with x,y,z,p,q set procedure to do afisare with z,p+q return test3.prg La fel ca la test2.prg numai c n loc de do concatenare with x,y,z,p,q scriei do interclasare with x,y,z,p,q
test4.prg set talk off public p,q,x(1),y(1),z(1) clear set procedure to vectori ? 'Programul divizeaza un; vector numeric in doi vectori' ? 'Comunicati vectorul care se; divizeaza' do creare with x,p

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

T est pentru evaluare:


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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

207

a2) cuvintele sunt separate prin dou sau mai multe spaii. b) S se numere caracterele din text i s se precizeze: b1) cte consoane sunt; b2) cte vocale sunt; b3) cte cifre sunt; b4) cte semne speciale sunt. c) S se nlocuiasc n text un ir de caractere cu un alt ir de caractere. Cele dou iruri de caractere se introduc de la tastatur. Se vor nlocui toate apariiile irului de caractere precizat n urmtoarele cazuri: c1) nu conteaz diferena dintre literele mari i mici; c2) conteaz diferena dintre literele mari i mici; c3) nu conteaz dac irul de caractere este un cuvnt+cerina c2; c4) irul de caractere este un cuvnt+ cerina c2. d) S se afieze n ordine alfabetic cuvintele din text. e) S se numere cuvintele care au m caractere. Valoarea lui m se introduce de la tastatur. f) S se afieze pentru fiecare liter, cte litere sunt n text (frecvena de apariie a literelor). Afiarea se va face pe ecran sub forma: Literea a sau A ............ 20 Literea b sau B ............ 5 ........................................ Lista se va afia sortat n dou moduri: n ordinea alfabetic a literelor i n ordinea descresctoare a frecvenei de apariie. g) S se afieze litera care are cea mai mare frecven de apariie n text. h) S se afieze media apariiilor i abaterea medie ptratic. Ce informaii obinei comparnd cele dou valori obinute. 6. S se realizeze un tabel baz de date n care s se memoreze evoluia cursului leu-euro din luna precedent. Pentru fiecare zi din lun se vor memora urmtoarele informaii: data, valoarea cursului, indicele cu baz fix (raportul dintre cursul zilei i cursul din ziua de nceput a perioadei de analiz), indicele cu baz n lan (raportul dintre cursul zilei i cursul din ziua precedent), sporul cu baz fix (diferena dintre cursul zilei i cursul din ziua de nceput a perioadei de analiz), sporul cu baz n lan (diferena dintre cursul zilei i cursul din ziua precedent). Crearea structurii tabelului i ncrcarea cmpurilor pentru dat i curs se va face la nivel de limbaj de comand. Pentru calcularea celorlalte cmpuri se va folosi un program. S se afieze urmtoarele informaii folosind datele din tabel: ziua cu cel mai mare curs, ziua cu cel mai mic curs, media aritmetic a cursului i abaterea medie ptratic a cursului. Aceste informaii se vor furniza n dou moduri: cu ajutorul limbajului de comand i cu ajutorul unui program. S se realizeze un tabel baz de date n care s se memoreze situaia notelor i a mediilor la disciplina Informatic a elevilor dintr-o clas. Tabelul va conine urmtoarele informaii: numele i prenumele elevului, poziia lui din catalog, cinci note pentru primul semestru, cinci note pentru cel de al doilea semestru, dou note pentru tezele de pe cele dou semestre, mediile de pe cele dou semestre i media anual. Crearea structurii tabelului i ncrcarea cmpurilor pentru numele i prenumele elevului, pentru poziia lui din catalog, pentru cele maxim 10 note din cele dou semestre i pentru cele dou note de la tezele semestriale se va face la nivel de limbaj de comand. Pentru calcularea mediilor se va folosi un program. La calcularea mediilor trebuie s inei cont de urmtoarele:

7.

208 Informatic
a) valorile mediilor semestriale sunt de tip ntreg, iar valoarea mediei generale este de tip real; b) este posibil ca un elev s primeasc mai puin de cinci note; c) teza are ponderea de 25% din media semestrial. Scriei un program care s afieze urmtoarele informaii: a) corigenii de pe fiecare semestru i corigenii anuali; b) o list ordonat alfabetic dup numele i prenumele elevilor care s conin numele, prenumele, mediile semestriale i media anual; c) o list ordonat descresctor dup media anual care s conin numele, prenumele, mediile semestriale i media anual; d) numele elevului cu cea mai mare medie pe semestrul 1, pe semestrul 2 i respectiv pe an; e) media general a clasei i abaterea medie ptratic a mediilor pe fiecare semestru i pe an (ce concluzie tragei prin compararea acestor medii?). 8. Completai biblioteca vectori cu urmtaorele subprograme pentru operaii cu vectori: proceduri pentru adunarea i produsul vectorial a doi vectori i funcii pentru produsul scalar a doi vectori i pentru suma i produsul elementelor unui vector. Testai noile subprograme adugate la bibliotec. 9. Construii o bibliotec pentru operaii cu mulimi care s permit executarea urmtoarelor operaii: citirea i afiarea unei mulimi, reuniunea, intersecia, diferena, diferena simetric, produsul cartezian a dou mulimi, cardinalul unei mulimi (numrul de elemente), apartenena unui element (a crui valoare o vei comunica de la tastatur) la o mulime. Pentru mulimi vei folosi tipul de date vector. Spre deosebire de un vector oarecare, ntr-un vector care pstreaz elementele unei mulimi nu pot exista dou elemente cu aceeai valoare. 10. Construii o bibliotec cu operaii cu iruri de caractere n care s pstrai subprograme pentru rezolvarea cerinelor de la problema 5. Construii programe pentru testarea acestei biblioteci. 11. Folosind editorul de texte Notepad vizualizai coninutul fiierelor clieni.dbf i clieni.fpt. Observai c orice persoan care vrea s citeasc datele din tabelele bazei de date poate face acest lucru cu un simplu editor de texte. Cu puin efort poate identifica ce reprezint fiecare dat i poate obine anumite informaii care pot fi secrete. Pentru a evita acest lucru putei codifica datele de tip alfanumeric (cmpurile de tip ir de caractere aflate n fiierul cu extensia .dbf i cmpurile memo aflate n fiierul cu extensia .fpt). Vei crea un cod simplu: translatai cu o valoare stabilit (de exemplu 15) codurile ASCII ale caracterelor. Construii dou subprograme: unul pentru codificare (pe care l folosii nainte de nchiderea bazei de date) i unul pentru decodificare (pe care l folosii la deschiderea bazei de date). irurile de caractere pot conine numai cifre, litere i anumite semne speciale. Pentru a evita afiarea n irurile de caractere codificate a altor caractere, putei complica codul folosind pentru acelai tip de caractere (cifre, litere sau semne speciale) o translatare circular. De exemplu, pentru literele mici considerai c dup litera z urmeaz litera a; n acest mod, pentru o translatare cu 15, n locul literei a (cod ASCII: 97) se va folosi litera p (cod ASCII 97+15=112), iar n locul literei z (cod ASCII: 122) se va folosi litera o (cod ASCII 97-1+15=111).

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

209

ncercai:

Adevrat/Fals: 1. O procedur utilizator din Visual FoxPro poate fi activat ca o funcie. 2. n limbajul Visual FoxPro este implementat structura repetitiv de tip repeat ... until. 3. Comenzile care permit redirectarea unei valori de pe ecran ntr-o variabil de memorie folosind clauza to creeaz variabila de memorie. 4. Variabilele de memorie pot fi definite oriunde n interiorul programului. 5. Printr-o comand modify command putei deschide mai multe ferestre de editare. 6. Instruciunea exit red controlul sistemului de operare. 7. Instruciunea public creeaz variabile de memorie. 8. Printr-o comand compile putei compila un singur program. Completai: 1. n instruciunea alternativ generalizat do case ... endcase cuvntul cheie ............ precede instruciunile care se vor executa dac nici unul dintre cazuri nu a fost adevrat. 2. Comentariul inserat ntr-o linie a programului trebuie precedat de ................. 3. Instruciunea prin care putei fora reevaluarea condiiei de terminare a unei structuri repetitive este ..................... 4. Pentru crearea unei capcane pentru erori folosii comanda ........................ 5. Coninutul liniei care a cauzat o eroare de compilare este furnizat de funcia ............... 6. Putei s urmrii execuia pas cu pas a unui program n fereastra .................... 7. Parametrii formali se declar cu instruciunea ................. 8. Aflai numrul de parametri actuali transmii unui subprogram cu funcia ................... 9. Deschidei o bibliotec de subprograme cu comanda .......................... Alegei rspunsurile corecte: 1. n funcie de context, ntr-un program Visual FoxPro caracterul = poate fi: a) operator relaional b) operator de atribuire c) comand 2. Dac din mai multe aciuni posibile trebuie s se execute una singur vei folosi: d) instruciuni if ... endif imbricate e) instruciunea do case ... endcase f) instruciunea scan ... endscan 3. Fraza citete nregistrrile fiierului pn cnd ajungi la marcajul de sfrit de fiier poate fi descris cu instruciunea: a) for i=1 to reccount() ... endfor b) do while not eof() ... enddo c) scan ... endscan 4. O variabil de memorie declarat privat cu instruciunea private este: a) o variabil de memorie local, vizibil numai n modulul n care a fost creat; b) o variabil vizibil numai n regiunea de program n care a fost creat; c) o variabil de memorie ascuns de modulele superioare. 5. Comanda return to master red controlul: a) modulului apelant b) modulului principal c) sistemului de operare

210 Informatic
6. Linia de comentarii ncepe cu: a) note b) * c) && 7. Dac scriei numele unui parametru ntre paranteze rotunde, transferul se va face prin: a) referin b) valoare c) adresare indirect Rspundei: 1. Realizai o comparaie ntre un limbaj de programare structurat studiat i limbajul gazd Visual FoxPro. Punei n eviden asemnrile i deosebirile referitoare la: declararea datelor, structurile de control care pot fi folosite, comentarii, modularizarea unei aplicaii (i tot ce presupune acest prooces - transferul datelor, domeniul de vizibilitate al identificatorilor etc.), bibliotecile de subprograme etc. 2. Ce tipuri de structuri de control sunt implementate n limbajul gazd Visual FoxPro? 3. Cum poate fi modularizat o aplicaie n Visual FoxPro? Cte metode exist? 4. Cte tipuri de variabile de memorie sunt n funcie de domeniul de vizibilitate? spunsuri: R Adevrat/Fals: 1-A; 2-F; 3-A; 4-A; 5-A; 6-F; 7-A; 8-F.
Completai: 1-otherwise; 2-&&; 3-loop; 4-on error; 5-message(1); 6-Trace; 7- parameters; 8-parameters(); 9-set procedure to<nume_biblioteca>. Alegei rspunsurile corecte: 1-a,b,c; 2- a,b; 3- a,b,c; 4-c; 5-b; 6-a,b; 7-b.

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

Programele de calculator prelucreaz informaii din lumea care ne nconjoar. Lumea real este format din obiecte, iar omul interacioneaz cu ea prin intermediul acestor obiecte. O fotografie prezint i ea un ansamblu de obiecte care sunt caracterizate ns numai de proprieti (form, dimensiuni, culoare etc.), nu i de aciuni. Ea este o reprezentare static a lumii reale. Dar lumea care ne nconjoar este o lume dinamic n care fiecare obiect este determinat de proprieti, metode i evenimente. Putem s ne gndim la proprieti ca la atributele obiectului, la metode ca la aciuni ale obiectului, iar la evenimente ca la rspunsuri ale obiectului la aciunile omului asupra lui. Pentru a nelege mai bine ce nseamn proprietile, metodele i evenimentele s considerm un obiect din viaa de zi cu zi: balonul unui copil. Balonului i se pot asocia proprieti, metode i evenimente. Proprietile balonului includ att atributele vizibile cum sunt nlimea, diametrul, culoarea, cele care descriu starea lui (umflat sau dezumflat), ct i atribute invizibile cum este vrsta. Prin definiie, toate baloanele au aceste proprieti. Valorile acestor proprieti difer de la un balon la altul. Balonului i se pot asocia de asemenea i aciuni pe care le poate executa, adic metode: metoda de umflare a balonului (aciunea prin care se umfl balonul cu aer), metoda de dezumflare a balonului (aciunea prin care se scoate aerul din balon), metoda de nlare a balonului (aciunea prin care se ridic balonul). Toate baloanele sunt capabile s execute aceste aciuni, deci au asociate aceste metode. Baloanele au i rspunsuri predefinite la anumite evenimente externe: la evenimentul neptur, rspunsul este dezumflarea automat, iar la evenimentul eliberarea balonului rspunsul este nlarea lui n aer.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

211

Aadar, baloanele difer ntre ele numai prin valorile proprietilor i au acelai comportament (reacioneaz la aceleai evenimente prin aceleai metode). Putem spune c balonul este un tip de obiect din lumea real, iar mulimea baloanelor formeaz o clas de obiecte. Aa cum o fotografie descrie starea unui obiect la un moment dat, i o structur de date folosit pentru descrierea obiectului nu poate s caracterizeze dect starea acelui obiect la un moment dat, deci este o descriere static a obiectului. Tendina limbajelor moderne de programare este de a pune n coresponden obiectele reale cu obiectele virtuale pentru a putea evidenia transformrile pe care acestea le sufer n mod continuu. Obiectul va ncapsula att datele care descriu proprietile, dar i subprogramele care prelucreaz aceste date i care vor defini metodele obiectului. Domeniul n care programarea orientat pe obiecte a ajuns indispensabil este realizarea interfeei. Aa cum obiectele cu care venim n contact reprezint interfaa ntre noi i lumea real i interfaa grafic dintre utilizator i programul de aplicaie este construit cu diferite obiecte virtuale afiate pe ecran care pot fi acionate cu mouse-ul i tastatura. Putem spune c n urma acionrii, obiectul declaneaz un anumit eveniment. Deoarece, utilizatorul poate veni n contact cu mai multe aplicaii, s-a cutat o standardizare a acestor obiecte att din punct de vedere al proprietilor, ct i din punct de vedere al evenimentului declanat. De exemplu, dac un utilizator vede pe ecranul calculatorului un buton pe care scrie OK, tie c dac l va aciona se va nchide caseta de dialog i se va continua execuia aplicaiei.
Ai studiat deja principiile programrii orientate pe obiecte. Dintre conceptele studiate, s ne reamintim urmtoarele:

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


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

Proprietatea (property) reprezint un atribut al unui obiect care definete una dintre
caracteristicile sau unul dintre aspectele sale. De exemplu, un obiect vizual poate avea proprietatea visible care determin dac obiectul este vizibil la un moment dat.

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


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

Evenimentul (event) reprezint o aciune recunoscut de obiect pentru care se poate scrie un
program ca rspuns. Evenimentele pot fi externe, adic generate de aciuni ale utilizatorului (un clic cu mouse-ul, micarea mouse-ului, apsarea unei taste) sau interne, adic generate printr-un cod de program sau de sistem.

Clasa (class) reprezint definiia unui anumit tip de obiect. Definiia cuprinde descrierea
proprietilor i a metodelor obiectului. Folosirea claselor permite gestionarea mai multor obiecte de acelai tip. Clasa este ns doar un termen abstract, un ablon care definete caracteristicile unui obiect (cum arat i cum se comport).

212 Informatic
Instana (instance) reprezint un obiect creat pornind de la definiia unei clase. Spre deosebire de
clas care este doar o definiie, o instan exist ca un obiect care poate fi folosit pentru a executa anumite aciuni. De exemplu, o caset de text dintr-un formular este o instan a clasei TextBox care descrie acest tip de obiecte vizuale.

Instane multiple (multiple instances) reprezint mai multe obiecte create de aceeai clas.
Obiectele au propriile proprieti i date private, dar folosesc mpreun codul de program.

ncapsularea (encapsulation) reprezint un mecanism prin care folosind o singur definiie sunt
incluse n obiect datele i metodele. Datele membre ale unui obiect nu pot fi modificate dect prin intermediul metodelor proprii obiectului respectiv. ncapsularea izoleaz complexitatea intern a unui obiect de restul aplicaiei.

Motenirea (inheritance) este o facilitate oferit de programarea pe obiecte prin care o clas
nou numit clas copil (child class) se poate construi pornind de la o clas existent numit clas printe (parent class) prin preluarea caracteristicilor clasei printe. Clasa copil se mai numete i clas derivat (subclass), iar clasa printe clas de baz (base class). Folosind aceast facilitate se poate crea o ierarhie de clase i se poate dezvolta uor un software existent. Clasa copil motenete accesul la datele i metodele strmoilor. La acestea, programatorul poate aduga proprieti i metode noi, definite explicit n noua clas. Orice modificare ntrun strmo se reflect i la urmai. De exemplu, dac o clas Text are proprietatea ca textul s fie scris ngroat, orice urma al acestei clase va avea aceast proprietate.

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

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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

213

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

214 Informatic
9 Proprieti noi. Ele vor fi precizate printr-o list de operaii de atribuire <nume_pr>=

<exp>, unde <nume_pr> este numele proprietii, iar <exp> este valoarea cu care se iniializeaz proprietatea. Proprietile pot fi protejate, adic se poate mpiedica accesul la proprietate i se poate mpiedica modificarea ei din afara definiiei clasei. Protejarea unor proprieti se precizeaz cu clauza protected nsoit de lista de proprieti care vor fi protejate: <nume_pr1>, <nume_pr2>,... . 9 Obiecte noi. Fiecare obiect nou care va fi adugat la definiia clasei este precizat printr-o clauz add object. Obiectul va fi identificat prin <nume_ob> i va fi adugat dintr-o clas precizat prin <nume_cls3> din clauza as. Obiectul adugat poate fi protejat, adic se poate mpiedica accesul i modificarea lui din afara clasei, dac se precizeaz clauza protected. Metodele i evenimentele clasei vor avea ns acces la proprietate. Implicit se execut metoda de inializare a obiectului la adugarea obiectului. Explicit nu se face iniializarea dac este precizat clauza noinit. Explicit se poate preciza cu clauza with lista proprietilor i valorile proprietilor care se adaug obiectului adugat la clas. 9 Metode i evenimente noi. Ele sunt create ca un set de subprograme (proceduri i funcii). Fiecare funcie i procedur este delimitat de cuvintele cheie function i endfunc i respectiv procedure i endproc. ntre cuvintele cheie se scrie secvena de instruciuni care formeaz corpul subprogramului. Se pot folosi parametri de comunicaie ntre subprogram i obiect sau ntre subprogramele aceleiai clase. Parametrii se declar la nceputul fiecrui subprogram cu instruciunea paramaters sau lparameters. Metodele pot fi protejate (este mpiedicat accesul la ele din afara obiectului) dac se precizeaz clauza protected nainte de a scrie subprogramul asociat. Metoda va fi un subprogram care va aciona asupra obiectului creat pe baza clasei i care poate fi apelat indiferent de ndeplinirea unor condiii, iar evenimentul va fi un subprogram care se va executa numai atunci cnd se produce o aciune (de exemplu un clic cu mouse-ul) recunoscut de obiectul creat pe baza clasei. Observaii: 1. Define class este instruciune deoarece nu poate fi folosit n modul interactiv, ci numai n programe. Instruciunea are o sintax de bloc, deoarece este format dintr-un ansamblu de instruciuni. Blocul de instruciuni ncepe cu comanda define class i se termin cu cuvntul cheie enddefine. Instruciunile componente sunt scrise n sintaxa blocului fiecare pe cte un rnd i trebuie scrise pe un singur rnd i n cadrul unui program (la fel ca orice instruciune independent). 2. Clauza as precede numele clasei printe pe care se bazeaz definiia noii clase sau a unui obiect adugat la o clas container. Exemplu: Se creeaz o clas cu numele formular pe baza clasei vizuale form (clasa formularelor). Obiectele din aceast clas vor fi obiecte container, deoarece obiectul formular conine alte trei obiecte: dou care se bazeaz pe clasa CommandButton (adic vor fi butoane de comand), iar unul care se bazeaz pe clasa ListBox (adic va fi o list). Clasa formular va conine pe lng proprietile, metodele i evenimentele clasei form proprietile nume i versiune i metoda click.

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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

215

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

2.2.2. Obiectele
Obiectele se creeaz pe baza claselor definite. Obiectul este instana unei clase. Pentru crearea unui obiect se folosete funcia createobject() care are sintaxa: createobject('<nume_cls>' [,<p1>, <p2>, ...] Rezultatul furnizat de funcie este de tip obiect (adic referin ctre un obiect). Obiectul se creeaz pe baza clasei identificate prin <nume_cls>, iar pentru crearea sa se poate face transfer prin parametrii din lista <p1>, <p2>, ... . Numele clasei va fi scris nu ca un identificator, ci ca un ir de caractere. Pentru a putea folosi obiectul, trebuie s se atribuie referina ctre obiect unei variabile de memorie. n acest mod, numele variabilei de memorie va putea fi folosit pentru a referi obiectul. Exemplu: Se creeaz un obiect pe baza clasei definite anterior. Variabilei de memorie obiect i se obiect = createobject('clasa') atribuie referina ctre acest obiect: n lucrul cu clase i obiecte se folosesc urmtorii operatori specifici: 9 Operatorul . (punct). Se folosete pentru a separa numele obiectului de numele printelui sau pentru a separa numele unui membru al obiectului (proprietate, metod sau eveniment) de numele obiectului. 9 Operatorul :: (delimitarea domeniului). Se folosete atunci cnd dorii s apelai dintr-o clas o metod din clasa printe. Astfel, sintaxa general pentru a avea acces la unul din membrii unui obiect este: <nume_obiect>.<nume_membru> unde <nume_membru> este numele unei proprieti, al unei metode sau al unui eveniment al obiectului.

216 Informatic
n cadrul definiiei unei clase se pot folosi urmtoarele referiri relative la membrii unui obiect sau la alte clase: 9 Parent - obiectul container al obiectului curent. 9 This - obiectul curent. 9 ThisForm - formularul care conine obiectul curent (formularul curent). 9 ThisFormSet - setul de formulare curent care conine formularul curent. Aceste cuvinte cheie se folosesc pentru a se face referiri la obiecte care nu au fost create nc (ele au fost definite n cadrul clasei) i implicit nu li s-au atribuit nume pentru a fi referite. n timpul execuiei unui program putei s adugai sau s nlturai obiecte dintr-un obiect container folosind metodele obiectului container: AddObject() pentru adugarea i RemoveObject() pentru nlturarea unui obiect. Aceste metode sunt implementate implicit n marea majoritate a claselor predefinite i n clasa custom. Sintaxa lor este: <nume_ob1>.addobject('<nume_ob2>' , '<nume_cls>') unde <nume_ob1> este numele obiectului container la care se adaug obiectul cu numele <nume_ob2> ce se creeaz pe baza clasei <nume_cls> i <nume_ob1>.removeobject('<nume_ob2>') unde <nume_ob1> este numele obiectului container din care se nltur obiectul cu numele <nume_ob2>. Obiectul nlturat nu va mai fi afiat pe ecran. Observaii: n sintaxa celor dou funcii numele obiectului container a fost separat prin operatorul punct de numele metodei membru al obiectului container. Exemplu: n acest exemplu putei observa cum este folosit operatorul :: pentru a apela o metod din clasa printe (n clasa F2 este apelat metoda click definit n clasa F1 care este clasa printe a clasei F2) i referina This pentru a preciza c este vorba de obiectul curent, adic obiectul creat pe baza clasei F2 (This.Backcolor se refer la proprietatea Backcolor a obiectului curent - culoarea fundalului): * Se creeaza clasa F1 care are ca parinte clasa Form define class F1 as Form procedure click wait window 'S-a executat clic in formular' endproc enddefine * Se creeaza clasa F2 care are ca parinte clasa F1 define class F2 as F1 procedure click F1::click This.BackColor=This.BackColor+1 endproc enddefine Exemplu: n acest exemplu putei observa cum pot fi folosite metodele proprii ale obiectului, cum pot fi modificate proprietile unui obiect, cum se fac referirile la proprietile i metodele unui obiect i cum este folosit operatorul punct n aceste referiri:

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

217

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

Accesul la membrii unui obiect


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

218 Informatic
9 Datele unui obiect pot fi prelucrate prin metodele proprii obiectului. n timpul acestor pre-

lucrri pot s fie necesare diferite variabile temporare. Acestea trebuie definite ca proprieti ale obiectului pentru a putea fi folosite n interiorul obiectului, dar trebuie izolate de exteriorul lui, deoarece modificarea lor din exterior ar putea afecta prelucrrile din interior. 9 Unele dintre subprograme sunt folosite intern de metodele obiectului i nu trebuie s fie folosite i din exterior. Din aceste dou cazuri se observ c este necesar s fie controlat accesul la membrii unui obiect. De aceea, membrii unui obiect pot fi: 9 Publici. Accesul la aceti membri este posibil din interiorul clasei, dar i din exteriorul ei. 9 Protejai. Accesul la aceti membri este posibil din interiorul clasei i din interiorul unei clase derivate din ea. Aceti membri vor fi declarai protejai prin intermediul clauzei protected din definiia clasei. Exemplu define class ang as Custom protected data_n nume=space(20) pren=space(20) adresa=space(30) data_n={ / / } procedure data_ns return this.data_n endproc enddefine Proprietatea data_n este protejat i nu poate fi modificat din exteriorul clasei, n schimb metoda data_ns nu este protejat i poate furniza valoarea proprietii data_n.

Obinerea de informaii despre obiecte


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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

219

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

Condiia de existen a unui obiect


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

2.2.3. Studiu de caz


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

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

220 Informatic
Exemplul 2 Pentru construirea metodei modul se va folosi un subprogram de tip funcie. Prin instruciunea ?z.m() afiai valoarea furnizat de metoda m. Observai c pentru metodele care returnez valori folosite n expresii trebuie s scriei ntre paranteze lista parametrilor actuali (n acest caz lista este vid; nu exist parametri pentru transferul datelor).

clear set talk off z=CreateObject('Complex') input 're (partea reala a numarului)= ' to z.re input 'im (partea imaginara a numarului)= ' to z.im ?z.modul() define class complex as custom re=0 im=0 m=0 function modul this.m=sqrt(this.re**2+this.im**2) return this.m endfunc enddefine
Exemplul 3 Pe baza clasei complex se definete o clas nou complex1 care va conine n plus o metod pentru afiarea numrului complex. Pentru definirea acestei metode se va folosi o metod intern a clasei nrc (metod protejat) pentru calcularea cifrelor unui numr i proprietatea nc care are ca valoare numrul de cifre al prii ntregi sau imaginare a numrului complex. Aceast proprietate este folosit numai intern i de aceea este protejat. Ea este necesar pentru a stabili numrul de poziii afiabile ale unui numr pentru funcia str(). Prin instruciunea z.afiare se apeleaz metoda afisare pentru afiarea unui numr complex. Clasa complex1 a motenit toate proprietile i metodele clasei complex.

clear set talk off z=CreateObject('Complex1') input 're (partea reala a numarului)= ' to z.re input 'im (partea imaginara a numarului)= ' to z.im ?z.modul() z.afisare define class complex as custom re=0 im=0 m=0 function modul this.m=sqrt(this.re**2+this.im**2) return this.m endfunc enddefine define class complex1 as complex protected nr nr=0

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor 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

221

Programarea orientat pe obiecte a dus la dezvoltarea programrii conduse de evenimente. Dac n cazul programrii clasice aplicaia era o colecie de instruciuni care se executau n ordinea n care au fost scrise, n cazul programrii conduse de evenimente aplicaia este un ansamblu de subprograme care nu se execut ntr-o ordine prestabilit, ci n funcie de producerea unor evenimente (deplasarea mouse-ului, executarea unui clic cu mouse-ul, glisarea unui obiect, apsarea unei taste sau a unei combinaii de taste etc). Apariia evenimentului este aleatorie i de aceea programul trebuie s tie cum s rspund la un anumit eveniment. Acest lucru se realizeaz prin asocierea la fiecare eveniment a unei secvene de cod prin care se descriu operaiile care trebuie executate. Programarea condus de evenimente se bazeaz pe bucla evenimentului (event loop), adic un mediu interactiv n execuie care poate fi: activat cu comanda read events care pornete procesorul de evenimente care va sesiza apariia unui eveniment i dezactivat cu comanda clear events care l oprete. Dup oprirea procesorului de evenimente programul va continua cu prima instruciune care urmeaz dup comanda read event.
2 . 4 . F o l o s i r e a p r o g r a m r i i o r i e n t a t e p e o b i e c t e n r e a l i z a r e a i n t e r f e e i u n e i a p l i c a i i

Interfaa grafic cu o aplicaie afieaz mai multe ecrane cu obiecte prin intermediul crora utilizatorul interacioneaz cu aplicaia pentru a controla evoluia ei sau pentru a cere s execute diferite procese prin care se prelucreaz datele n vederea obinerii de informaii (de exemplu, procesul de cutare ntr-o baz de date a unor date care corespund unui anumit criteriu).

222 Informatic
Orice interfa grafic este realizat din obiecte care au asociate proprieti, metode i evenimente. Obiectul virtual este o sum de proprieti, metode i evenimente. Asupra obiectelor virtuale se pot folosi n general urmtoarele aciuni: clic, dublu clic, glisare i apsarea unei taste. Prin asociere cu balonul s identificm care sunt proprietile, metodele i evenimentele asociate unui obiect, cum ar fi butonul declanator dintr-o caset de dialog. Proprietile sale sunt numele su, poziia n care este afiat fa de marginile ca-setei de dialog, culoarea butonului i a textului etc. Aciunile care se pot executa asupra butonului sunt: indicare cu mouse-ul i clic sau apsarea unei anumite taste. Evenimentul reprezint efectul acionrii butonului prin intermediul mouse-ului sau al tastaturii, adic rspunsul sistemului n urma acionrii butonului. De exemplu, evenimentul asociat butonului Open este deschiderea obiectului selectat n caseta de dialog (fiier sau dosar). Programarea orientat pe obiecte poate fi folosit pentru realizarea unei interfee deoarece sistemul de gestiune a bazelor de date Visual FoxPro pune la dispoziia utilizatorului mai multe clase vizuale predefinite: Numele clasei CheckBox Column Clasa predefinit Semnificaia obiectului vizual Comutator Coloan ntr-o gril Control care indic dac o opiune este activ (on) sau nu (off). Container care conine antetul de coloan i alte obiecte care pot s apar ntr-o coloan a unei grile; nu poate fi folosit independent, ci numai ntr-un container de tip gril. Control similar unei combinaii dintre o caset de text (TextBox) i o list (ListBox) n care putei introduce o valoare sau o putei alege dintr-o list. Control asociat unei comenzi: dac la un moment dat executai clic pe un buton, se execut comanda asociat butonului.

ComboBox

List combinat

CommandButton Buton de comand Command Group Container Control

Grup de butoane Container care poate conine numai un grup de de comand butoane de comand care pot fi tratate ca o unitate. Obiect container Obiect container Container care conine alte obiecte neprotejate (este permis accesul la obiectele coninute). Container care poate include i obiecte ale utilizatorului, obiectele incluse fiind protejate (nu este permis accesul la obiectele coninute). Control care furnizeaz o zon pentru introducerea sau vizualizarea unui text ntr-un formular (permite afiarea pe mai multe linii). Container care poate conine o colecie de mai multe pagini (care se pot comporta ca o caset de dialog sau ca o fereastr standard), controale i containere pentru afiarea i editarea datelor i controale utilizator (custom).

EditBox

Zon de editare text Formular

Form

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

223

Numele clasei FormSet Grid

Clasa predefinit Semnificaia obiectului vizual Set de formulare Gril Container care poate conine unul sau mai multe formulare legate ntre ele sau bare cu instrumente. Container care creeaz o gril pentru prezentarea datelor pe rnduri i coloane, sub form de tabel; poate conine numai controale de tip coloan ntr-o gril.

Header

Antet de coloan Obiect care conine antetul coloanei i care nu poate fi folosit independent, ci numai ntr-un container de tip coloan ntr-o gril. Imagine Control care permite introducerea unei imagini ntr-un formular; imaginea este memorat ntr-un fiier bitmap (.bmp). Control care conine un text ce descrie o zon de formular sau un control. Control care deseneaz ntr-un formular o linie pe vertical, pe orizontal sau pe diagonal. Control care furnizeaz o list de articole din care utilizatorul poate alege unul dintre ele. Container cu controale OLE (fiiere .ocx; au propriul set de evenimente) i obiecte OLE inserabile (obiecte OLE create cu o alt aplicaie - Word, Excel etc.; ele nu au propriul set de evenimente).

Image

Label Line ListBox OLEContainer Control

Etichet Linie List Control de tip OLE

OLEBound Control OptionButton

Control container Controale folosite n formulare sau rapoarte care de tip OLE permit afiarea coninutului unui obiect OLE ntr-un cmp General al unui tabel. Buton de opiuni (radio) Grup cu butoane de opiuni (radio) Pagin Obiect care nu poate fi folosit independent, ci ntr-un container de tip grup de butoane de opiuni pentru a reprezenta o opiune. Container folosit pentru a grupa numai controale de tip butoane de opiuni; putei folosi un buton pentru a alege o opiune dintr-un set de opiuni. Container folosit pentru crearea casetelor de dialog cu mai multe seciuni (tabs); nu poate fi folosit independent, ci ntr-un container de tip set de pagini i poate conine orice controale i containere. Container care conine una sau mai multe pagini.

OptionButton Group Page

PageFrame Separator

Set de pagini

Separator pe bara Obiect care nu poate fi folosit independent, ci ntr-un de utiliti container de tip bar cu instrumente; este folosit pentru a introduce spaii ntre controale cu scopul de a crea grupuri de butoane. Form Control care creeaz o form care poate fi afiat ca o combinaie de dreptunghiuri, cercuri i elipse.

Shape

224 Informatic
Numele clasei Spinner Clasa predefinit Semnificaia obiectului vizual Caset de text cu Control care permite incrementarea sau decremenderulor mentarea unei valori fie prin scrierea valorii noi, fie executnd clic pe sgeata de incrementare sau pe sgeata de decrementare. Caset de text Control care furnizeaz o zon pentru introducerea sau vizualizarea unui text ntr-un formular; permite afiarea pe o singur linie.

TextBox

Timer

Obiect de tip ceas Control invizibil folosit pentru a executa secvene de cod la intervale de timp egale (controleaz evenimentele recurente din aplicaie). Bar cu instrumente Container care poate conine orice controale; este format dintr-un set de butoane pe care putei executa clic ca s cerei excutarea unei anumite sarcini.

ToolBar

Ai observat c obiectele vizuale pe care le putei crea pot fi simple sau containere. n general, obiectele container nu pot conine orice obiecte. De exemplu: Container grup de butoane de comand grup cu butoane de opiuni set de pagini pagin set de formulare formular gril coloan ntr-o gril Coninut butoane de comand butoane de opiuni pagini controale, containere, obiecte utilizator formulare, bare de instrumente set de pagini, controale, containere, obiecte utilizator coloane ntr-o gril antet de coloan i orice obiect cu excepia formularelor, a seturilor de formulare, a coloanelor ntr-o gril i a barelor cu instrumente controale, seturi de pagin, containere

bar de instrumente

Ai mai observat c unele obiecte nu pot fi definite independent, ci numai n interiorul unui container. De exemplu: Obiect antet de coloan buton pentru opiune coloan ntr-o gril pagin separator Container coloan ntr-o gril grup de butoane pentru opiuni gril set de pagini bar de instrumente

Pe lng aceste obiecte predefinite care creeaz obiecte vizuale ntr-o aplicaie, mai putei folosi urmtoarele obiecte predefinite:

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

225

Numele clasei Clasa predefinit Semnificaia obiectului vizual Cursor Cursor Obiect creat atunci cnd se adaug un tabel sau o vizualizare la mediul de date dintr-un tabel, dintr-un formular sau dintr-un set de formulare; permite specificarea proprietilor tabelului sau ale vizualizrii atunci cnd este lansat n execuie formularul sau raportul. Obiect creat atunci cnd se stabilete o relaie ntre dou tabele ntr-un raport, formular sau set de formulare; permite determinarea modului n care sunt legate cele dou tabele. Obiect container pentru obiectele cursor i relaie asociate unui formular, raport sau set de formulare; se creeaz o dat cu raportul, formularul sau setul de formulare.

Relation

Relaie

Data Environment Exemplu:

Mediu de date

Folosind clasele vizuale predefinite s-au creat trei formulare: primul formular conine o etichet i dou butoane de comand, care dac vor fi acionate vor deschide fiecare cte un alt formular u o etichet i un buton de comand. Fiecare buton reacioneaz diferit la evenimentul clic cu mouse-ul, i de aceea a fost scris cte o procedur pentru fiecare eveniment: b1.click, b2.click, b3.click i b4.click. Metoda release se folosete pentru a terge din memorie obiectul de tip formular.

forma1=createobject('Form1') forma2=createobject('Form2') forma3=createobject('Form3') * Afiseaza primul formular: forma1.show read events define class form1 as Form

* Se definesc proprietatile * formularului form1: caption='Intrebare' closable=.F. height=143 width=386

226 Informatic
* Se adauga obiecte la * formular add object text as Label add object b1 as CommandButton add object b2 as CommandButton * Se definesc proprietatile * obiectului text: text.caption='Ati rezolvat; testul din capitolul; precedent?' text.height=16 text.left=45 text.top=34 text.width=376 text.visible=.T. * Se definesc proprietatile * obiectului b1: b1.caption='Da' b1.height=33 b1.left=40 b1.top=96 b1.width=114 b1.visible=.T. * se definesc proprietatile * obiectului b2: b2.caption='Nu' b2.height=33 b2.left=222 b2.top=96 b2.width=114 b2.visible=.T. * Se defineste codul evenimen* tului click pe obiectul b1: procedure b1.click thisform.release * Afiseaza al doilea formular: forma2.show endproc * Se defineste codul evenimen* tului click pe obiectul b2: procedure b2.click thisform.release * Afiseaza al treilea formular: forma3.show endproc enddefine define class form2 as Form caption='Raspuns' closable=.F. height=143 width=346 add object text1 as Label add object b3 as CommandButton text1.caption='Felicitari; !!!!!!!!!!!!' text1.height=16 text1.left=110 text1.top=34 text1.width=376 text1.visible=.T. b3.caption='Terminare' b3.height=33 b3.left=110 b3.top=86 b3.width=114 b3.visible=.T. procedure b3.click * Elibereaza formularul si * dezactiveaza procsorul de * evenimente: thisform.release clear events endproc enddefine define class form3 as form caption='Raspuns' closable=.F. height=143 width=346 add object text2 as Label add object b4 as CommandButton text2.caption='????????????; !!!!' text2.height=16 text2.left=110 text2.top=34 text2.width=376 text2.visible=.T. b4.caption='Terminare' b4.visible=.T. b4.height=33 b4.left=110 b4.top=86 b4.width=114 procedure b4.click * Elibereaza formularul si * dezactiveaza procesorul de * evenimente: thisform.release clear events endproc enddefine

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

227

2 . 5 . B i b l i o t e c i l e d e c la s e

Biblioteca de clase (class library) este folosit pentru a pstra o colecie de clase vizuale. Se memoreaz ntr-un fiier cu extensia .vcx. Asupra unei biblioteci de clase se pot executa urmtoarele operaii: crearea bibliotecii

create classlib
adugarea unei clase Opreaii de ntreinere

add class
nlturarea unei clase

remove class
Biblioteca deschidere bibliotec

set classlib to
Opreaii de exploatare biblioteca precizat

release classlib
nchidere bibliotec toate bibliotecile

set classlib to
Comanda create classlib are sintaxa: create classlib <nume_bib> i creeaz o bibliotec de clase cu numele <nume_bib> (implicit i numele fiierului). Biblioteca va fi vid. Comanda add class are sintaxa: add class <nume_cls> [of <nume_bib1>] to <nume_bib1> [overwrite] La biblioteca precizat prin <nume_bib1> se adaug clasa identificat prin <nume_cls>. Implicit aceast clas poate fi n orice bibliotec deschis. Explicit ea este preluat din biblioteca precizat prin clauza of i identificat prin <nume_bib2>. Biblioteca nu poate fi adugat dintr-un program, dintr-o aplicaie sau dintr-un fiier de proceduri. Comanda remove class are sintaxa: remove class <nume_cls> of <nume_bib>] i nltur definiia clasei cu numele <nume_cls> din biblioteca precizat prin <nume_bib>. Comanda set classlib to are sintaxa: set classlib to <nume_bib> [additive]

228 Informatic
cnd deschide biblioteca precizat prin <nume_bib> sau sintaxa: set classlib to cnd nchide toate bibliotecile deschise. Comanda release classlib are sintaxa: release classlib <nume_bib> i nchide biblioteca precizat prin <nume_bib>. Observaie:
?
Ce se ntmpl dac nlturai dintr-o Dac ai deschis o bibliotec, toate definiiile bibliotec de clase o clas printe claselor vor fi pstrate n memoria intern. Dac pentru alte clase din bibliotec? vrei s le tergei, putei folosi comanda clear: clear <nume_bib> Trebuie s avei grij ca atunci cnd executai aceast operaie de tergere s nu existe o instan a nici unei clase din bibliotec.

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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

229

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

T est pentru evaluare:


1. Se consider urmtorul program:

clear set talk off punct=CreateObject("puncte") punct.generare ?'Distanta fata de origine: ' ??punct.distanta() ?'Unghiul fata de sistemul de; axe: ' ??punct.argument() define class puncte as custom x=0 y=0 d=0

a=0 procedure generare ? 'Coordonatele punctului:' input 'x= ' to this.x input 'y= ' to this.y endproc function distanta this.d=sqrt(this.x**2+; this.y**2) return this.d endfunc function argument if this.x=0

230 Informatic
if this.y=0 this.a=-this.a+pi() this.a=0 endif else else this.a=pi()/2 if this.y<0 endif this.a=-a+2*pi() else endif this.a=atan(abs(this.x/; endif this.y)) endif if this.x<0 this.a=this.a*180/pi() if this.y<=0 return this.a this.a=this.a+pi() endfunc else enddefine a. Identificai clasele i obiectele, proprietile i metodele obiectului. b. Explicai ce realizeaz programul. c. Pe baza acestui program definii obiectul dreapt cu metodele generare i calculul lungimii i obiectul dreptunghi cu metodele generare i calculul ariei i al perimetrului.
2. Identificai i corectai erorile din urmtorul program:

clear set talk off z=CreateObject("Complex") z.citire ?z.modul() define class complex as custom dimension c(2) m=0 procedure citire

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

3. Comparai urmtoarea variant de program cu cea prezentat ca exemplu n studiul de caz. Verificai dac aceast variant este corect. Ce concluzie tragei din compararea celor dou versiuni?

clear set talk off z=CreateObject("Complex") input 're= ' to z.re input 'im= ' to z.im ?z.m(z.re,z.im) define class complex as custom re=0

im=0 m=0 function modul parameter re,im this.modul=sqrt(re**2+im**2) return this.m endfunc enddefine

4. Adugai obiectului complex metoda pentru citirea numrului complex:

procedure citire input 're= ' to this.re input 'im= ' to this.im endproc
Modificai corespunztor programul astfel nct citirea numrului complex s se fac prin intermediul acestei metode.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

231

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

ncercai:

Adevrat/Fals: 1. n definiia unei clase de obiecte metodele se scriu naintea proprietilor. 2. ntr-un program definiia clasei de obiecte se face naintea de a crea obiectul. 3. ntr-o metod nu se poate defini o clas de obiecte. 4. Parametrii metodelor pot avea acelai nume ca i proprietile obiectului. 5. Instruciunea with ... endwith poate fi folosit n instruciunea pentru definirea unei clase. 6. Clasele pot fi adugate la biblioteci din fiiere de programe. 7. O clas printe motenete proprietile i metodele de la urmai. 8. n definiia unei clase trebuie precizat obligatoriu clasa printe. 9. Aciunea metodelor i rspunsul la evenimente se definete cu ajutorul subprogramelor. Completai: 1. Instruciunea pentru definirea clasei este o instruciune ........... delimitat de cuvintele cheie ............................... i .............................. 2. Aciunea metodelor se definete prin intermediul .........................

232 Informatic
Alegei rspunsurile corecte: 1. Putei aduga un obiect la un obiect container cu: a) instruciunea Add Object b) metoda AddObject c) instruciunea Add Class 2. Aflai ci strmoi are o clas folosind funcia: a) aclass() b) ainstance() c) amembers() 3. Aflai cte obiecte au fost realizate pe baza aceleiai clase folosind funcia: a) aclass() b) ainstance() c) amembers() 4. Form este: a) o clas vizual de tip container predefinit b) o clas vizual simpl predefinit c) un obiect vizual din clasa predefinit PageFrame. 5. Header este: a) un obiect independent predefinit b) un obiect predefinit dependent de clasa Column c) un obiect predefinit dependent de clasa Grid. Rspundei: 1. Realizai o comparaie ntre modurile n care este implementat programarea pe obiecte n limbajul de programare structurat studiat i limbajul gazd Visual FoxPro. 2. Ce tehnici caracteristice programrii pe obiecte sunt implementate n Visual FoxPro?

R spunsuri:

Adevrat/Fals: 1-F; 2-F; 3-A; 4-A; 5-F; 6-F; 7-F; 8-A; 9-A;. Completai: 1-bloc, define class, enddefine; 2-subprogramelor; Alegei rspunsurile corecte: 1-b; 2- a; 3- b; 4-a; 5-b.

3 . P r o g r a m a r e a v i z u a l
3 . 1 . R e a l i z a r e a i n t e r f e e i

3.1.1. Obiectele vizuale


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

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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

233

Fiecare tip de control are propriul su set de proprieti, metode i evenimente care l fac potrivit unui anumit scop. Unele dintre cotroalele pe care le putei folosi n aplicaii sunt cele mai potrivite pentru introducerea i afiarea datelor. Altele v permit s cerei executarea unui proces n cadrul aplicaiei sau v permit accesul la alte aplicaii ca s putei prelucra unele date ca i cum ar face parte din propria aplicaie. ntr-o interfa pot fi folosite urmtoarele tipuri de controale: 9 controalele pentru executarea aciunilor: butonul de comand, opiunea de meniu; 9 controalele pentru introducerea i afiarea datelor: eticheta, caseta de text, zona de editare, caseta de text cu derulor, grila; 9 controalele care i permit utilizatorului s aleag: comutatorul, lista, lista combinat, grupul cu butoane de opiuni; 9 controalele grafice: linia, chenarul, imaginea, forma; 9 controalele care i permit afiarea obiectelor inserabile create cu alte aplicaii.

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

234 Informatic
9 Bare cu instrumente (toolbar). Este o caset de dialog mai special care conine numai butoane de comand reprezentate n general prin pictograme. Ea poate fi mobil (float), adic poate fi afiat oriunde n interiorul ferestrei de aplicaie sau fix (dock), adic poate fi lipit de una dintre marginile ferestrei de aplicaie. Bara de titlu este afiat numai n barele cu instrumente flotante.
Pentru implementarea acestor obiecte pentru interfa, Visual FoxPro pune la dispoziia programatorului urmtoarele obiecte vizuale predefinite: 9 Pentru formulare: FormSet, Form, Page, ! PageFrame i ToolBar. Asociai obiectele vizuale predefinite 9 Pentru controale: EditBox, TextBox, Label, prezentate n capitolul anterior, cu tipuSpinner, Grid, OptionButtonGroup, ListBox, rile de controale definite n acest capitol. ComboBox, CheckBox, CommandButton. Crearea obiectelor de interfa se poate face n dou moduri: 9 Prin crearea unui program n care obiectele sunt descrise prin intermediul instruciunilor de program. La crearea obiectelor se pot folosi clasele predefinite de obiecte specifice programrii orientate pe obiecte. Dup crearea programului surs, pentru a realiza interfaa, trebuie lansat n execuie programul cu comanda do <nume_fiier>. 9 Folosind programarea vizual. n acest caz, caracteristicile formularelor sunt nregistrate sub forma unui tabel ntr-un fiier de date care are extensia .scx. Aceste date sunt interpretate de un modul al sistemului. Lansarea n execuie a acestui modul, mpreun cu fiierul care conine tabelul (<nume_formular>) se face cu comanda: do form <nume_formular> with <lista_parametri_actuali> Comanda de lansare n execuie va crea formularul. Ea poate fi scris ntr-un modul de program (modulul apelant al formularului). Adverbul <lista_parametri_actuali> reprezint o list de variabile i/sau constante de tipuri diferite care se transmit formularului la lansarea n execuie.

3.1.2. Proiectarea interfeei


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

de meniu cu butoane scurtturi cu pictograme?


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

tivitatea cu utilizatorul? Elementele de interfa ale unei aplicaii sunt dependente de funciile pe care trebuie s le ndeplineasc aplicaia. n plus, atunci cnd se proiecteaz interfaa unei aplicaii, trebuie proiectate i urmtoarele elemente:

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

235

Formularul de nceput (startup form). Este primul formular care se afieaz i reprezint ce va vedea prima dat utilizatorul cnd va porni aplicaia. Unele interfee nu au un formular specific de nceput. Acest caz apare atunci cnd aplicaia ncepe cu ncrcarea unui fiier de date i testarea unor date, iar primul formular care va fi afiat va depinde de rezultatul testului. Formularul de nceput poate fi o caset prin care se cere introducerea unei parole prin care utilizatorul i ctig dreptul de a folosi aplicaia. Asupra parolei se pot pune restricii. De exemplu, dac utilizatorul nu a introdus parola corect din trei ncercri, se va afia un mesaj de eroare i se va termina execuia programului. Ecranul introductiv (splash screen). Dac dureaz foarte mult ncrcarea i lansarea n execuie a unei aplicaii, este bine ca n acest timp s fie afiat un ecran introductiv n care se poate afia un mesaj sau emblema firmei. Formularul de sfrit (ending form). Este ultimul formular care se afieaz la terminarea aplicaiei. Este bine ca acest formular s conin un buton de nchidere a aplicaiei care s fie acionat de utilizator, operaie care s ofere sigurana nchiderii tuturor fiierelor i descrcrii tuturor formularelor interfeei aplicaiei. Unele interfee rezolv nchiderea aplicaiei prin opiunea de meniu ExitFile, care termin execuia aplicaiei, nchide toate fiierele i descarc toate formularele deschise. nainte de a se proiecta interfaa trebuie s se cunoasc scopul aplicaiei. Unele aplicaii sunt folosite n mod constant, iar altele ocazional pe o perioad scurt de timp. De asemenea, o aplicaie care are ca scop principal afiarea informaiilor are cerine diferite fa de una care este folosit pentru a colecta date. Interfaa este influenat i de categoria de utilizatori care o va folosi. Dac sunt utilizatori nceptori, interfaa trebuie s fie ct mai simpl, iar dac utilizatorii sunt experimentai ea poate s fie mai complex. n plus, dac aplicaia va cunoate o distribuie internaional, trebuie s in cont de limba i cultura viitorilor utilizatori. Orice interfa trebuie s ndeplineasc urmtoarele cerine ale utilizatorului: 9 Interfaa trebuie s-i permit utilizatorului s controleze evoluia programului. 9 Sistemul de meniuri trebuie s fie concis, eficient, logic i bine structurat. 9 Ecranul nu trebuie aglomerat cu obiecte. Dac o fereastr conine prea multe butoane, ele ar trebui nlocuite cu opiuni de meniu. Se vor afia sub form de butoane numai controalele care sunt folosite foarte des. 9 Interfaa trebuie s-i ofere utilizatorului o reprezentare vizual complex a opiunilor de lucru ale aplicaiei la momentul respectiv. Folosirea porprietilor de disponibilitate sau de vizibilitate ale unui obiect vizual este foarte important deoarece mpiedic accesul uitilizatorului la obiectele care nu pot fi acionate n acel moment. 9 Utilizatorul trebuie s fie informat continuu de starea programului. Dac un proces dureaz prea mult timp, interfaa nu trebuie s nghee, deoarece utilizatorul nu mai tie dac procesul continu sau s-a blocat. n acest caz, utilizatorul va fi informat c procesul continu fie prin transformarea formei cursorului, fie prin afiarea unui contor care numr paii parcuri de proces, fie prin afiarea unui indicator de evoluie, fie prin imagini grafice animate. 9 Interfaa trebuie s permit anularea unor operaii pentru ca utilizatorul s-i poat corecta uor unele greeli, fie de introducere a datelor, fie de prelucrare a lor. Pentru operaiile de tergere este bine s cerei confirmarea operaiei. Pentru operaiile de introducere a datelor trebuie s prevedei ct mai multe operaii de verificare a

236 Informatic
corectitudinii datelor introduse (prin compararea lor cu limitele permise, prin introducerea acelorai date de dou ori i compararea celor dou valori introduse etc.). 9 Aplicaia trebuie s prevad ct mai multe cazuri de eroare astfel nct s poat funciona n ct mai multe condiii ale datelor de intrare. Orice eroare detectabil trebuie s declaneze un proces de informare a utilizatorului (prin mesaje care s precizeze cauzele erorii i eventual prin sunete pentru atenionare) i de recuperare a datelor.

3.1.3. Stilurile interfeei


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

moment dat deschiderea unui singur document (de exemplu aplicaia Notepad). Dac vrei s deschidei un nou document, trebuie nchis cel precedent (dac alegei opiunea NewFile pentru a deschide un nou document, documentul curent va fi nchis).
Interfa cu mai multe documente (multiple-document interface - MDI) care permite

deschiderea mai multor documente (de exemplu aplicaia Word). La un moment dat pot fi deschise mai multe documente, fiecare document n fereastra sa (dac este deschis un document i alegei opiunea NewFile, aplicaia va crea un nou formular n care va fi deschis noul document). Acest stil de interfa poate fi recunoscut prin existena n bara de meniuri a titlului meniului Window ale crui opiuni sunt folosite la manipularea ferestrelor cu documente. Unul singur dintre documente este activ, adic documentul care primete datele introduse de la tastatur de ctre utilizator. Formularul documentului activ este obiectul focalizat din interfaa aplicaiei.
Interfa de explorare (explorer-style interface) care conine o singur fereastr

mprit n dou regiuni numite panouri (panel). De obicei, panoul din stnga conine un arbore sau o structur ierarhic, iar panoul din dreapta o zon de afiare a unei liste (de exemplu aplicaia Windows Explorer). Un astfel de tip de interfa se folosete atunci cnd trebuie s se caute ntr-o list mare cu articole (fiiere, documente, imagini etc.) prin operaia de rsfoire (browse). Stilul interfeei se alege n funcie de tipul aplicaiei. Stilul MDI se folosete la aplicaiile care necesit frecvent vizualizarea simultan a mai multor documente pentru a le compara sau pentru a face transfer de date ntre ele cum este de exemplu procesorul de texte (Word). n cazul altor tipuri de aplicaii (cum sunt aplicaiile de tip calendar sau calculator) este suficient s se deschid un singur document i de aceea se folosete o interfa SDI. n general, stilul SDI este cel mai rspndit deoarece este un stil de interfa pe care proiectantul produsului o creeaz mai uor i care este mai simpl i pentru utilizator. Stilul MDI permite crearea unei interfee care administreaz mai multe formulare ntr-un singur formular container. Formularul container se mai numete i fereastr printe (parent window), iar formularele din interiorul su se numesc ferestre copil (child windows). O aplicaie MDI poate avea un singur formular printe i mai multe formulare copil. Formularul printe nu poate fi un formular modal. Ferestrele copil pot fi de acelai tip sau de tipuri diferite. Fereastra printe furnizeaz un spaiu de lucru (workspace) pentru toate ferestrele copil ale aplicaiei. Spaiul de lucru este delimitat de bordura formularului printe i este situat sub bara de meniu.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

237

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

3.1.4. Proprietile generale ale obiectelor vizuale Visual FoxPro


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

238 Informatic
Proprietile standard (proprietile comune majoritii obiectelor) sunt: 9 Numele obiectului - Name . Se folosete pentru a referi obiectul n program. 9 Dimensiunile obiectului. Sunt de tip numeric i se exprim n pixeli. Sunt date de: Height - nlimea (dimensiunea pe vertical) i Width - limea (dimensiunea pe orizontal). 9 Coordonatele obiectului. Reprezint un sistem de dou coordonate [x,y] prin care se stabilete poziia obiectului fa de colul din stnga sus al reperului (ecranul sau formularul din care face parte). Pentru stabilirea coordonatelor se folosesc proprietile de tip numeric, exprimate n pixeli : Left - poziia pe orizontal, fa de marginea stng a reperului (x), Top - poziia pe vertical, fa de marginea de sus a reperului (y), 9 Legenda - Caption . Este un text prin care utilizatorul poate identifica rolul obiec! tului. n cazul formularelor, legenda este Proprietatea Name se folosete pentru afiat n bara de titlu. n cazul controaleidentificarea obiectului n interior (la nivel lor, este afiat n interiorul lui sau lng el. de program, de ctre programator), iar Au legend urmtoarele controale: butonul proprietatea Caption se folosete pentru identificarea lui n exterior (la nivel de de comand, comutatorul, butoanele de interfa, de ctre utilizator). opiuni, cadrele, eticheta, meniul. Proprietatea este de tip ir de caractere. 9 Caracteristicile caracterelor folosite n formular. Sunt trei proprieti prin care se caracterizeaz textele: FontName - numele fontului, de tip ir de caractere: Arial, Courier New, Times New Roman etc., FontSize - dimensiunea, de tip numeric, exprimat n pixeli. stilul caracterelor de tip logic: FontBold - ngroat, FontItalic - aplecat, FontUnderline - subliniat, FontCondense - condensat, FontExtend - extins, FontOutline - cu contur, FontStrikethrough - tiat i FontShadow - cu umbr. 9 Culoarea folosit la afiarea textului este specificat prin proprietile de tip nume-ric ce reprezint codul culorii astfel: BackColor - culoarea fundalului obiectului n care este afiat textul; ForeColor - culoarea primplanului, adic a textului sau a imaginii din obiect. 9 Chenarul (Border) este folosit la unele obiecte (formularul, eticheta, caseta de text, grila, imaginea, caseta de imagine, linia, forma) ca un delimitator. Chenarul poate fi fix sau dimensionabil, trasat cu linie simpl
Cod 0 1 2 3 4 5 6 0 1 2 Semnificaie cod chenar Controale Transparent (invizibil) Solid (implicit; linie continu) Dash (linie ntrerupt) Dot (linie punctat) Dash - Dot (linie format din grupuri de o linie urmat de un punct) Dash - Dot -Dot (linie format din grupuri de o linie urmat de dou puncte) Inside Solid (linie continu n interior) Formulare No border (fr chenar) Fixed Single (chenar simplu) Fixed Dialog (chenar de tip caset de dialog, care nu permite redimensionarea formularului) Sizable (implicit; chenar de tip fereastr, care permite redimensionarea formularului)

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor


sau dubl. Este caracterizat de urmtoarele proprieti: BorderStyle - stilul chenarului este de tip numeric i exprim codul chenarulu. BorderColor - culoarea liniei cu care este trasat chenarul;

239

BorderWidth - grosimea liniei cu care este trasat chenarul este de tip numeric i este exprimat n puncte: 1 punct, 3 puncte etc.; LineSlant - modul de trasare este de tip caracter i exprim codul direciei de trasare a dreptunghiului care formeaz chenarul: \ - trasarea se face ncepnd de la colul din stnga sus spre colul din dreapta jos i / - trasarea se face ncepnd de la colul din dreapta jos spre colul din stnga sus; Curvature - curbura colurilor chenarului stabilete gradul de rotunjire al colurilor i este de tip numeric. Poate lua valori de la 0 la 99 determinnd aspectul chenarului. Astfel pentru valoarea 0 chenarul va fi un dreptunghi sau un ptrat, pentru valoarea 99 chenarul se va transforma ntr-un cerc, respectiv o elips, iar pentru o valoare cuprins ntre cele dou limite, de exemplu 30, se va transforma ntr-un dreptunghi, respectiv ntr-un ptrat cu colurile rotunjite. Pictograma de glisare - DragIcon . Este de tip ir de caractere i reprezint identificatorul fiierului (calea de director i numele) care conine pictograma ce va fi afiat n locul cursorului de mouse atunci cnd se execut operaia de glisare i plasare a obiectului. Cursorul de mouse - MousePointer . Este ! de tip numeric i reprezint codul asociat Folosind autodocumentarea aflai care formei cursorului de mouse afiat atunci sunt valorile asociate proprietii cnd este indicat o zon a obiectului. MousePointer. Disponibilitatea - Enabled . Este o proprietate de tip logic. Dac are valoarea .T. controlul este disponibil (enabled), adic utilizatorul l poate aciona, iar dac are valoarea .F. nu este disponibil (disabled), adic nu-l poate aciona. Un control nu este disponibil atunci cnd nu sunt ndeplinite condiiile necesare pentru a putea fi folosit. Reprezentarea grafic i legenda controalelor care nu sunt disponibile sunt afiate estompat. Vizibilitatea - Visible . Este o proprietate de tip logic. Dac are valoarea .T. obiectul este vizibil, iar cnd are valoarea .F. nu este vizibil.

Pentru precizarea codului unei culori se folosete schema de culori RGB prin care precizai prin trei numere cuprinse ntre 0 i 255 intensitatea pentru fiecare din cele trei culori de baz: rou, verde i albastru. Pentru a afla codul culorii folosii funcia RGB() care are sintaxa rgb(<r>, <g>,<b>), unde cei trei parametri reprezint intensitile celor trei culori:
Culoare Alb Negru Gri Gri nchis Rou Rou nchis Galben Galben nchis Parametri RGB() 255, 255, 255 0, 0, 0 192, 192, 192 128, 128, 128 255, 0, 0 128, 0, 0 255, 255, 0 128, 128, 0 Numr 16777215 0 12632256 8421504 255 128 65535 32896 Culoare Verde Verde nchis Cian Cian nchis Albastru Albastru nchis Magenta Magenta nchis Parametri RGB() 0, 255, 0 0, 128, 0 0, 255, 255 0, 128, 128 0, 0, 255 0, 0, 128 255, 0 ,255 128, 0, 128 Numr 65280 32768 16776960 8421376 16711680 8388608 16711935 8388736

240 Informatic
3.1.5. Evenimente recunoscute de obiectele vizuale
Att formularele, ct i marea majoritate a controalelor sunt capabile s primeasc din partea sistemului semnale prin care sunt informate de producerea unui eveniment. La proiectarea formularului programatorul poate specifica secvene de instruciuni prin care obiectul trebuie s rspund la diferite evenimente. De exemplu, evenimentele recunoscute de majoritatea obiectelor (formulare i controale) sunt: 9 Evenimente declanate de aciunile mouse-ului: MouseMove - deplasarea mouse-ului pe obiect; Clicks - clic cu mouse-ul pe obiect cu butonul din stnga (are ca efect focalizarea obiectului). RightClicks - clic cu mouse-ul pe obiect cu butonul din dreapta (are ca efect n general deschiderea unui meniu dependent de context, adic un meniu cu opiuni specifice obiectului pe care s-a executat clic); DblClick - dublu clic cu mouse-ul pe obiect; MouseDown - apsarea butonului de mouse; MouseUp - eliberarea butonului de mouse; DragOvers - glisarea obiectului cu mouse-ul; DragDrops - glisarea i plasarea obiectului cu mouse-ul. 9 Evenimentul declanat la acionarea unei taste (apsarea i eliberarea ei) KeyPress. Procedurii care se va executa la apariia acestui eveniment i se pot transmite ca parametri numrul asociat tastei apsate i un cod numeric prin care se definete combinaia de taste reci care nsoete tasta apsat. Fiecrei taste reci i corespunde un bit poziionat pe 1 din codul numeric. Astfel, pentru tasta Shift este bitul 0 (rezult codul=1), pentru tasta Ctrl bitul 1 Poziie 2 1 0 (rezult codul=2) i pentru tasta Alt bitul 2 22 21 20 (rezult codul=4). Se pot combina mai multe Apsai Alt Ctrl Shift Cod taste reci. Shift 0 0 1 1 Ctrl 0 1 0 2 9 Evenimente declanate de crearea i Ctrl +Shift 0 1 1 3 eliberarea obiectului: Init - iniializarea obiectului declanat de crearea lui; Destroys - eliberarea obiectului declanat de metoda de eliberare a zonei de memorie alocate obiectului.
Alt Alt+Shift Alt+Ctrl Alt+Ctrl+Shift 1 1 1 1 0 0 1 1 0 1 0 1 4 5 6 7

3.1.6. Focalizarea
Focalizarea (focus) este capacitatea aplicaiei de a primi datele de intrare ale utilizatorului prin intermediul tastaturii sau al mouse-ului. Ea se manifest n cadrul interfeei prin prezena selectorului. Cnd selectorul este poziionat pe un obiect, acesta va putea primi datele de intrare ale utilizatorului. Pe de o parte, sistemul de operare Windows permite lansarea n execuie a mai multor aplicaii la un moment dat, dar numai una dintre aplicaii are capacitatea de focalizare. Aceasta este

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

241

aplicaia activ, adic aplicaia care va primi datele de intrare furnizate de utilizator. Pe de alt parte, n cadrul unei aplicaii la un moment dat pot fi deschise mai multe formulare, ns un singur formular are capacitatea de focalizare i se numete formular activ, iar n cadrul formularului activ un singur control poate primi focalizarea i se numete control activ. nainte de a focaliza un obiect trebuie activat containerul, aciune sesizat prin evenimentul Activates . Containerul se activeaz: 9 Interactiv: utilizatorul execut clic pe obiectul container. 9 Din program: se apeleaz metoda Show (afiarea) a obiectului container. Evenimentul Activate se declaneaz n ordinea de incluziune a formularelor: mai nti pentru obiectul FormSet, apoi pentru obiectele Form coninute de acesta i n final pentru obiectele Page din obiectele Form. Dup activarea containerului, un obiect poate fi focalizat: 9 Interactiv: utilizatorul execut clic pe obiect sau apas repetat tasta Tab pn focalizeaz obiectul dorit. 9 Din program: se apeleaz metoda SetFocuss a controlului pe care vrei s-l focalizai. Un obiect i poate pierde focalizarea: 9 Interactiv: utilizatorul focalizeaz alt obiect executnd clic pe acel obiect. 9 Din program: se apeleaz metoda SetFocuss a controlului pe care-l dorii s preia focali-zarea. De aceea, formularele i cele mai multe dintre controale au asociate evenimente de primire a focalizrii i de pierdere a focalizrii. Aceste evenimente sunt: 9 Primirea focalizrii declaneaz evenimentul GotFocuss. 9 Pierderea focalizrii declaneaz evenimentul LostFocuss. Programatorul poate scrie proceduri pentru aceste evenimente, la nivelul fiecrui control. De exemplu, atunci cnd un control primete focalizarea (evenimentul GotFocus), prin intermediul procedurii asociate evenimentului pot fi afiate n casete instruciuni referitoare la control sau n bara de stare mesaje de informare despre control. Obiectul focalizat este evideniat prin diferite metode. De exemplu, un buton declanator focalizat este evideniat printr-o bordur care nconjoar butonul. Un obiect poate fi focalizat numai dac are proprietatea de a fi disponibil (de a rspunde la acionri de la tastatur sau mouse) i proprietatea de a fi vizibil pe ecran. Nu pot fi focalizate urmtoarele obiecte: eticheta, linia, forma, imaginea i caseta de imagine. Focalizarea este controlat prin dou proprieti de tip referin (adres), specifice formularelor, care sunt protejate la scriere - read-only - i nu pot fi modificate de programator: 9 ActiveForms - formularul activ. Este o proprietate prin care se face referirea la formularul activ dintr-un set de formulare sau de pe ecran. Poate fi folosit n obiectele container: Form, FormSet, _Screen. Folosind aceast referin putei modifica valoarea unei proprieti a formularului activ sau putei apela o metod a formularului activ: <nume_obiect_container>.ActiveForm.<proprietate>=<valoare> <nume_obiect_container>.ActiveForm.<metod>

242 Informatic
9 ActiveControl - controlul activ. Este o proprietate prin care se face referirea la controlul activ dintr-un obiect container. Poate fi folosit n obiectele container: Form, Page, ToolBar, _Screen. Folosind aceast referin putei modifica valoarea unei proprieti a controlului activ: <nume_obiect_container>.ActiveControl.<proprietate>=<valoare>
Dac obiectul container nu mai conine nici un obiect focalizat, nseamn c el este dezactivat, stare care va fi sesizat prin evenimentul Deactivates. Evenimentul este declanat: 9 Interactiv: se mut focalizarea din obiectul container ntr-un alt obiect container sau ntr-o alt aplicaie. 9 Din program: se creeaz un nou obiect care declaneaz evenimentul Activate pentru noul obiect i evenimentul Deactivate pentru vechiul obiect. Transferul controlului focalizrii de la un obiect (formular sau control) se poate face folosind metoda SetFocuss care poate fi apelat din diferite metode. Ordinea tabulrii este una dintre proprietile unui formular i reprezint ordinea n care utilizatorul se poate deplasa de la un control la altul pentru a-l focaliza, folosind tasta Tab. Pentru a stabili aceast ordine, fiecare control din formular are dou proprieti: 9 TabStops - controlul tabulrii. Are valoare logic i este folosit pentru a determina dac utilizatorul poate focaliza controlul folosind tasta Tab. Dac valoarea este .F., controlul nu va putea fi focalizat dect executnd clic pe el. 9 TabIndex - indexul tabulrii. Este numrul de ordine al controlului n cadrul formularului atunci cnd se folosete tasta Tab pentru a focaliza un control. Fomularele pot fi: 9 Modale (modal). Un astfel de formular cere utilizatorului s execute anumite aciuni prin care s nchid formularul activ pentru a putea continua execuia aplicaiei i pentru a putea focaliza un alt formular. Astfel, o caset de dialog modal trebuie nchis prin acionarea declanatoarelor OK sau Cancel ca s se poat continua lucrul cu restul aplicaiei (de exemplu, n Visual FoxPro casetele de dialog Open sau Save As sunt modale). Se recomand folosirea acestui tip de formular n cazul n care prin intermediul lui se solicit utilizatorului un rspuns sau anumite date necesare pentru continuarea unui proces de prelucrare. 9 Nemodale (modeless). Acest tip de formular nu trebuie nchis pentru a ceda focalizarea altui formular. De exemplu, ferestrele cu documente din aplicaia Visual FoxPro sunt ferestre nemodale. Caseta de dialog Find and replace care se deschide cu opiunea Find.../Replace...Edit atunci cnd scriei un program surs cu editorul ncorporat Visual FoxPro permite continuarea lucrului n aplicaia curent (continuarea operaiei de editare a programului surs) n timp ce caseta de dialog este afiat n continuare pe ecran. Barele cu instrumente sunt i ele formulare nemodale. Se recomand folosirea acestui tip de formular n cazul n care el conine date care trebuie vizualizate pentru a fi comparate cu date din alte formulare. Tipul formularului este controlat cu proprietatea WindowType care este de tip numeric. Ea poate lua valoarea 0 (nemodal) sau 1 (modal).

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor


3 . 2 . P r i n c i p i i l e p r o gr a m r i i v i z u a l e

243

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

Cu ajutorul acestor instrumente, programatorul poate construi marea majoritate a elementelor unei aplicaii: baza de date, formularele, meniurile, rapoartele, interogrile, vizualizrile etc. n cazul obictelor de interfa, n procesul de creare a formularului prin intermediul acestor instrumente vizuale, proiectantul trebuie s comunice proprietile formularului i ale obiectelor componente i procedurile asociate evenimentelor i metodelor care vor fi folosite de formulare i controale. Aceste caracteristici se memoreaz ntr-un fiier care are o structur de tabel i extensia .scx. Constructorii de formulare Principiul folosit de constructorii de formulare este urmtorul: constructorul pune la dispoziia proiectantului de interfa un formular care are proprieti, metode i evenimente implicite, iar obiectele care vor fi create n formular vor primi i ele valori implicite pentru proprieti (conform clasei de baz a obiectului respectiv). Rolul proiectantului const n modificarea interactiv a valorii unor proprieti ale obiectelor create i scrierea unor proceduri asociate metodelor i evenimentelor, n conformitate cu configuraia pe care vrea s o realizeze pentru interfa. Constructorii de formulare pe care putei s-i folosii sunt: 9 Form Builder - Constructorul rapid - care permite o proiectare rapid a formularelor simple. Prin intermediul unei casete de dialog cu mai multe seciuni, proiectantul furnizeaz constructorului valoarea unor proprieti. El nu are cunotin de numele acestor proprieti, ci numai de caracteristicile fomularului pe care le stabilesc. Nu poate stabili dect valoarea proprietilor asociate acestor caracteristici i nici nu poate scrie proceduri asociate evenimentelor i metodelor. Sunt implementai mai muli construc-

244 Informatic
tori rapizi, fiecare dintre ei specializat pentru un anumit obiect de interfa. Fiecare constructor rapid afieaz anumite seciuni, n funcie de obiect. Fiecare seciune grupeaz anumite caracteristici ale obiectului care corespund unei categorii de proprieti. Exist constructori rapizi pentru: Formulare: Form Builder. Controale: Combo Box Builder, Command Group Builder, Edit Box Builder, Text Box Builder, List Box Builder, Option Group Builder. 9 Form Designer - Constructorul normal - care permite construirea unor formulare complexe. Constructorul pune la dispoziia proiectantului diferite instrumente: bara cu obiectele care pot fi inserate n formular, bara cu instrumente ale aplicaiei constructor, fereastra pentru stabilirea proprietilor, fereastra pentru stabilirea procedurilor asociate evenimentelor i metodelor etc. Prin intermediul lor proiectantul atribuie valori proprietilor (identificate prin numele lor) i scrie procedurile asociate metodelor i evenimentelor. Pentru lansarea n execuie a constructorului folosii comanda: create form <nume_formular> unde <nume_formular> este numele fiierului n care se salveaz formularul. Pentru modificarea formularului cu ajutorul constructorului folosii comanda: modify form <nume_formular> unde <nume_formular> este numele fiierului n care se salveaz formularul. Procedura asistent pentru construirea formularelor Procedura asistent Form Wizard construiete ea nsi formularul pe baza unor informaii furnizate de proiectant prin intermediul unui dialog desfurat n mai muli pai. Proiectantul nu modific proprietile i nu scrie codurile procedurilor. Deoarece fiierul n care este memorat formularul are o structur de tabel el poate fi deschis cu comanda use i vizualizat apoi cu comanda browse. Caracteristicile unui obiect al formularului sunt memorate n cte o nregistrare fiecare, iar n fiecare coloan cte o caracteristic. De exemplu, coloana Properties conine cmpuri de tip memo n care sunt memorate proprietile care au valori diferite de cele implicite, iar coloana Methods conine cmpuri de tip memo n care sunt memorate procedurile asociate metodelor i evenimentelor obiectului. Pentru a afia formularul creat pe ecran i pentru a permite utilizatorului s interacioneze cu obiectele de interfa pe care le conine, formularul trebuie lansat n execuie prin comanda: do form <nume_formular> [with <lista_parametri >] [to < parametru_ieire>] Transferul parametrilor se face astfel:

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

245

Formularul <nume_formular>.scx Lansarea n execuie a formularului: procedure init parameters <lista_parametri> ............................................ endproc ............................................ procedure unload ............................................ return <parametru> endproc

do form <nume_formular> with <lista_parametri > to < parametru_ieire>

Creai tabelul Agenda1 cu urmtoarea structur de cmpuri: nume (C,15), prenume (C,15) i telefon (C,10). Adugai trei nregistrri de date la tabel. Nu nchidei tabelul. Creai un formular procedura asistent folosind

Alegei opiunea Form Wizard8Tools. Se deschide caseta de dialog Wizard Selection. Din caseta de dialog alegei opiunea Form Wizard. Dac ai fi creat un formular cu cmpuri din dou tabele, ai fi ales opiunea One-to-Many Form Wizard. Acionai butonul OK. Se deschide caseta de dialog corespunztoare primului pas (Step1) n care alegei cmpurile din tabel pentru care se vor crea obiecte n formular. n acest exemplu vei alege toate cmpurile. Pentru aceste cmpuri, asistentul va crea controale de tip TextBox asociate cu controale Label. Vei circula de la un dialog la altul cu butoanele Next (dialogul urmtor) i Back (dialogul anterior). Terminai dialogul cu butonul Finish. Dup ce ai selectat toate cmpurile din tabel, trecei la urmtorul dialog Step2. n dialogul Step2 alegei stilul formularului. Din grupul de butoane radio Button Type activai butonul Text Button, iar din lista Style alegei stilul Chiseled. n acest pas sunt adugate controalele pentru editarea cmpurilor din tabel i suplimentar butoane pentru administrarea datelor din tabel. Controalele vor avea aspectul fizic stabilit prin stilul ales. Trecei la urmtorul dialog. n dialogul Step3 alegei criteriul de ordonare a datelor din tabel: ordinea de sortare i cmpul cheie pentru sortare care este format dintr-un cmp sau mai multe cmpuri din

246 Informatic

tabel. Alegei pentru criteriul de ordonare cmpurile nume i prenume. Trecei la dialogul urmtor.

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

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

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

Lansai n execuie constructorul de formulare fie cu comanda:


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

Se deschide fereastra aplicaiei Form Designer. n fereastr este deschis fereastra document Form1 n care se vor crea obiectele care aparin formularului. Suprafaa formularului este divizat printr-o gril care va ajuta utilizatorul la aranjarea obiectului

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

247

n cadrul formularului (alinierea obiectelor la liniile grilei). n bara de meniu a fost adugat un titlu de meniu (Form) cu opiuni specifice constructorului de formulare. n
Meniul Form care conine opiuni specifice constructorului de formulare

Grila prin care este divizat suprafaa formularului.

partea inferioar ferestrei sunt afiate dou liste ascunse: Form care este disponibil numai dac ai creat un set de formulare i v permite s alegei un formular din set i Page care este disponibil numai dac ai creat un set de pagini i v permite s alegei o pagin din set.

Alegei opiunea Quick Form...Form. Se deschide caseta de dialog Form Builder. Caseta de dialog conine dou seciuni: seciunea Field Section din care alegei cmpurile din baza de date pentru care dorii s creai obiecte n formular pentru editarea datelor. Alegei toate cmpurile din tabel: din lista Available Fields selectai cmpul i executai clic pe butonul 8 . Din seciunea Style alegei stilul formularului (alegei opiunea Embosed din lista Style). nchidei caseta de dialog executnd clic pe declanatorul OK.

248 Informatic
n proiectul de formular vor fi inserate automat casete de text pentru editarea cmpurilor din tabel i etichete asociate acestor cmpuri pentru identificarea lor. nchidei aplicaia (clic pe butonul de nchidere al ferestrei de aplicaie). Deschidei tabelul asociat formularului cu comanda use Agenda2.scx. Vizualizai coninutul tabelului cu comanda browse. Identificai obiectele create n formular (coloana cmpurilor Objectname) i proprietile asociate acestor obiecte (coloana cmpurilor Properties). nchidei fiierul cu comanda use.

3.3. For m ularele

3.3.1. Metodele i evenimentele specifice formularelor


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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

249

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

3.3.2. Mediul de date al formularelor


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

250 Informatic
AutoOpen - Dac are valoarea .T. tabelele i vizualizrile din mediul de date sunt deschise automat o dat cu crearea formularului. AutoClose - Dac are valoarea .T. tabelele i vizualizrile din mediul de date sunt nchise automat o dat cu eliberarea formularului. 9 Evenimentele la care poate rspunde mediul datelor sunt: BeforeOpenTables - Evenimentul este declanat naintea deschiderii tabelelor i a vizualizrilor din mediul de date. Se declaneaz naintea evenimentului Load al formularului pentru c tabelele trebuie s fie deschise nainte de iniializarea formularului, deoarece n formular trebuie afiate date din aceste tabele i vizualizri. n procedura asociat acestui eveniment se pot stabili numele tabelelor i vizualizrilor care se vor deschide i locul n care sunt memorate pe disc. AfterCloseTables - Evenimentul este declanat dup nchiderea tabelelor i a vizualizrilor din mediul de date (este provocat de fiecare apel al metodei CloseTables). Se declaneaz dup descrcarea formularului (dup evenimentul Unload al formularului). 9 Metodele pe care le poate executa mediul de date sunt: OpenTables - dechiderea tabelelor i vizualizrilor din mediul de date; n aceast metod se scriu instruciunile pentru deschiderea tabelelor n diferite zone de lucru. CloseTables - nchiderea tabelelor i vizualizrilor din mediul de date; n aceast metod se scriu instruciunile pentru nchiderea tabelelor deschise n diferite zone de lucru. Sesiunea (session) este intervalul de timp n care o aplicaie primete date i le prelucreaz. Sesiunea de date (data session) este mediul de date asociat sesiunii (parametrii sistemului, variabile de memorie, fiiere de date). n Visual FoxPro un formular poate rula n: 9 sesiunea de date implicit care preia configurrile implicite ale mediului Visual FoxPro. 9 sesiunea de date privat (proprie formularului) n care toate configurrile mediului trebuie fcute la crearea formularului; acest tip de sesiune creeaz o mai mare independen a formularului fa de mediu. Operaiile pe care trebuie s le executai pentru a proiecta un formular sunt urmtoarele: 1. Deschidei constructorul pentru proiectarea formularului (Form Designer). 2. Definii proprietile formularului i scriei procedurile asociate metodelor i evenimentelor formularului. 3. Deschidei baza de date pentru a se crea obiectul DataEnvironment asociat formularului. 4. Creai controalele n formular. Definii proprietile lor i scriei procedurile asociate metodelor i evenimentelor fiecrui control. 5. Salvai formularul.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

251

3.3.3. Obiecte de tip formular Formularul Formx


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

252 Informatic
ControlBox - controleaz dac formularul are buton de meniu de control sau nu. 9 Proprieti legate de comportament sunt specificate prin proprietile de tip logic: Closable - controleaz dac formularul poate fi nchis folosind meniul de control (opiunea Close a meniului sau dublu clic pe butonul meniului) sau nu; Movable - controleaz dac formularul poate fi mutat sau nu; 9 Afiarea casetelor cu informaii despre controalele din formular ShowTips este de tip logic: dac are valoarea .T. (implicit n ToolBar) se afieaz caseta cu informaii despre controlul indicat cu mouse-ul (ToolTip), iar dac are valoarea .F. (implicit n Form) nu se afieaz caseta. Evenimentele la care pot rspunde formularele sunt: 9 Redimensionarea formularului Resize - este declanat fie prin schimbarea interactiv a dimensiunii formularului, fie prin modificarea din program a dimensiunii sale (proprietile Height i Width). 9 Mutarea formularului Moved - este declanat fie prin mutarea interactiv a formularului, fie prin modificarea din program a poziiei sale (proprietile Top i Left). Metodele pe care le pot executa formularele sunt: 9 Metoda de mutare a formularului pe ecran Move . 9 Metoda de desenare a unei linii n formular Line ; prin intermediul parametrilor se vor preciza coordonatele primului punct (x1,y1) i coordonatele celui de al doilea punct (x2,y2). Parametrii se vor scrie ntre paranteze rotunde, dup numele metodei. Dup desenare, coordonatele poziiei de desenare vor fi (x2,y2). 9 Metoda de desenare a unui dreptunghi n formular Box ; prin intermediul parametrilor se vor preciza coordonatele colului din stnga sus (x1,y1) i coordonatele colului din dreapta jos (x2,y2). Dup desenare, coordonatele poziiei de desenare vor fi (x2,y2). 9 Metoda de desenare a unui cerc n formular Circle ; prin intermediul parametrilor se vor preciza raza cercului i coordonatele centrului cercului (x,y). Dup desenare, coordonatele poziiei de desenare vor fi (x,y). 9 Metoda de scrierea a unui text n formular Print ; prin intermediul parametrului se precizeaz irul de caractere care va fi scris. Dup scriere, coordonatele poziiei de desenare vor fi cele de la sfritul textului. 9 Metoda de tergere a textului i a desenelor din formular Cls . Dup tergere, coordo-natele poziiei de desenare vor fi (0,0).

Identificai instrumentele constructorului de formulare Vei realiza un formular pentru testarea metodelor folosite ntr-o fereastr.

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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

253

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

9 Bare cu instrumente:
Bara pentru obiectele de interfa - Form Controls Toolbar. Afieaz controale cu ajutorul crora selectai obiectul pe care vrei s-l creai n cadrul formularului. Bara pentru manipularea obiectelor - Layout Toolbar. Afieaz controale cu ajutorul crora manipulai obiectele pe care le-ai creat n formular. Bara aplicaiei - Form Designer. Afieaz controale cu ajutorul crora stabilii instrumentele afiate de aplicaie. Bara pentru controlul culorilor - Color Palette. Afieaz controale cu ajutorul crora alegei culorile.

9 Opiuni de meniu:
Meniul Form este vizibil numai dac este deschis fereastra constructorului de formulare i conine opiuni specifice acestei aplicaii. Prin intermediul opiunilor sale putei administra clasele definite de utilizator (crearea i modificarea unor proprieti i metode, includerea unui fiier de constante), putei administra seturi de formulare (crearea setului de formulare, adugarea sau nlturarea formularelor din set etc.), putei administra formularul pe care l creai (deschiderea constructorului rapid pentru crearea lui, lansarea lui n execuie, modificarea lui). n meniul View devin vizibile opiuni prin care putei s stabilii instrumentele Constructorului de formulare care vrei s fie afiate. n meniul Format devin vizibile opiuni prin care putei s stabilii caracteristicile grilei folosite pentru alinierea obiectelor n formular. Opiunile de meniu:
Opiunea Data Environment Properties Code Semnificaia Meniul View Opiune de tip comutator. Controleaz afiarea ferestrei mediului de date. Opiune de tip comutator. Controleaz afiarea ferestrei de proprieti. Opiune de tip comutator. Controleaz afiarea ferestrei pentru secvenele de cod.

254 Informatic
Opiunea Semnificaia Form Controls Opiune de tip comutator. Controleaz afiarea barei cu instrumente pentru Toolbar crearea obiectelor n formular. Layout Toolbar Opiune de tip comutator. Controleaz afiarea barei cu instrumente pentru administrarea obiectelor n formular. Color Palette Opiune de tip comutator. Controleaz afiarea barei cu instrumente pentru Toolbar stabilirea culorilor. Tab Order Grid Lines Show Position Permite modificarea ordinii de focalizare cu tasta Tab a obiectelor din formular. Ordinea implicit este cea n care au fost proiectate (adugate la formular). Opiune de tip comutator. Afieaz/ascunde grila pentru alinierea obiectelor. Opiune de tip comutator. Controleaz afiarea n bara de stare a poziiei i dimensiunii obiectului selectat. Meniul Format Opiune de tip comutator. Controleaz alinierea automat a obiectelor nou create la liniile grilei. Permite modificarea distanelor (n pixeli) dintre liniile grilei.

Snap To Grid Set Grid Scale

Meniul Form New Property... Creeaz o proprietate nou pentru o clas definit de utilizator. Se deschide caseta de dialog New Property prin intermediul creia stabilii numele i descrierea proprietii. New Method... Edit Property/ Method... Include File... Creeaz o metod nou pentru o clas definit de utilizator. Se deschide caseta de dialog New Method prin intermediul creia stabilii numele i descrierea metodei. Permite modificarea sau tergerea unei proprieti sau metode definite de utilizator. Se deschide caseta de dialog Modify Property/Method prin intermediul creia administrai proprietile i metodele definite.

Permite specificarea numelui fiierului cu constante predefinite ale clasei definite de utilizator. Create Form Creeaz un set de formulare care va conine formularul curent. Dac exist deja Set un set de formulare, opiunea nu este disponibil. Remove Form nltur setul de formulare. Opiunea este disponibil numai dac exist un set de Set formulare, iar acesta conine numai un formular. Add New Form Adaug un formular la setul de formulare. Opiunea este disponibil numai dac a fost creat un set de formulare. Remove Form Quick Form... Run Form nltur formularul curent din set. Opiunea este disponibil numai dac a fost creat un set de formulare, iar acesta conine mai mult de un formular. Deschide fereastra Constructorului rapid de formulare. Lanseaz n execuie formularul.

Identificai instrumentele specifice constructorului de formulare: butoanele din barele de instrumente, ferestrele i opiunile de meniu specifice acestei aplicaii. Afiai barele cu instrumente i identificai pe fiecare bar controalele pe care le putei folosi.

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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

255

Buton
1 2 3 4 5 6 7 8 Select Object View Classes Label TextBox EditBox CommandButton CommandGroup OptionButton 9 10 11 12 13 14 15 16

Buton
CheckBox ComboBox List Spinner Grid Image Timer PageFrame 17 18 18 20 21 22 23 24

Buton
OLE Container Control OLE Bound Control Line Shape Container Separator BuildLock ButtonLock

Marea majoritate a butoanelor din bara Form controls le vei folosi pentru a crea obiecte n formulare (Label, TextBox etc.). Butonul Select Object l putei folosi pentru a selecta un grup de obiecte din formular. Butonul BuildLock l putei folosi pentru a lansa n execuie Constructorul rapid pentru formulare, iar butonul ButtonLock l vei folosi atunci cnd vei dori s creai mai multe instane ale aceluiai obiect.

1 Buton
1 2 3

4
4 5 6

9 Buton
7 8 9 Layout Toolbar Form Builder Auto Format

Buton
Code Window Form Control Toolbar Color Palette Toolbar

Set Tab Order Data Environment Properties Windows

Majoritatea butoanelor din bara Form Designer pot fi folosite pentru a stabili ce instrumente ale aplicaiei vei afia (fereastra de proprieti, fereastra de cod etc). Butonul FormBuilder l putei folosi pentru lansa n execuie Constructorul rapid pentru formulare. Butonul AutoFormat l vei folosi atunci cnd vei dori s aplicai un anumit stil de formatare asupra obiectelor de acelai tip, selectate. Stilul de formatare se refer la aspectul chenarului, la culorile folosite, la fonturile caracterelor, la alinierea obiectelor i la efectul 3D al obiectelor. La acionarea acestui buton se deschide fereastra aplicaiei Constructorului de format: AutoFormat Builder. Identificai opiunile de meniu pentru care butoanele din aceast bar sunt scurtturi.

10 11 12 13

Buton
1 2 3 4 Align Left Sides Align Right Sides Align Top Edges Align Bottom Edges 5 6 7 8 9

Buton
Align Vertical Centers Align Horizontal Centers Same Width Same Height Same Size 10 11 12 13

Buton
Center Horizontally Center Vertically Bring to Front Send to Back

Butoanele din bara Layout sunt disponibile numai dac au fost selectate mai multe controale i se folosesc pentru a stabili alinierea grupului de controale, modul n care se uniformizeaz dimensiunea lor i stratul din formular n care vor fi afiate (obiectele pot fi

256 Informatic
afiate n dou straturi). Butoanele Align Left Se stabilete Sides, Align Right Sides, Align Top Edges i culoarea cernelii. Align Bottom Edges se folosesc pentru alinierea Se stabilete controalelor fa de marginea grupului selectat. Butoanele Align Vertical Centers i Align culoarea hrtiei. Horizontal Centers se folosesc pentru alinierea centrat fa de axa vertical, respectiv orizontal a Paleta de culori grupului selectat, iar Center Horizontally i Center Vertically se folosesc pentru alinierea centrat fa Se deschide o de axa vertical, respectiv orizontal a grupului palet de culori selectat, n mijlocul formularului. Butoanele Same pentru a alege l l a i uniformiza dimensiunea Width, Same Height i Same Size se folosesc pentru controalelor din grupul selectat: la cel mai lat, la cel mai nalt i la cel mai mare. Butoanele Bring to Front i Send to Back stabilesc stratul n care va fi afiat grupul de controale: deasupra celorlalte sau dedesubt. Paleta de culori conine controale prin care putei s stabilii elementul pentru care alegei culoarea (hrtia sau cerneala), controale pentru o palet standard de culori i controlul pentru deschiderea unui constructor de culori.

n fereastra de proprieti putei stabili i vizualiza proprietile formularului i a fiecrui obiect din formular. Din lista ascuns alegei formularul sau obiectul pentru care stabilii proprietile. Dac deschidei aceast list putei vedea ierarhia de obiecte a formularului. Prin intermediul ei identificai relaia de filiaie a obiectelor n formular. Exist urmtoarele convenii n scrierea proprietilor n list:
Normal - proprietatea are valoarea implicit i nu este protejat la scriere (este de tip Read-Write). Bold - proprietatea are valoarea modificat fa de cea implicit. Italic - proprietatea are valoarea implicit i nu este protejat la scriere (este de tip Read-Only). Fiecare proprietate are un meniu rapid care conine opiunea Reset to Default prin care se atribuie proprietii valoarea implicit i Help... care deschide fereastra cu informaii despre proprietate (help dependent de context).

Definii n fereastr dou obiecte, o etichet i o caset de text astfel: executai clic pe butonul Label din bara cu controale i apoi indicai n formular colul din stnga sus al etichetei i glisai mouse-ul pn cnd obinei dimensiunea dorit pentru obiect. Repetai operaia pentru caseta de text (butonul TextBox). Identificai pentru aceste controale valorile implicite pentru proprietile, evenimentele i metodele asociate. Formularul i obiectele din formular au fiecare cte un meniu rapid de comenzi pe care l deschidei executnd pe formular sau pe obiect clic cu butonul din dreapta al mouse-ului. n tabel, opiunile disponibile pentru formular sunt marcate cu F, iar cele disponibile pentru obiecte sunt marcate cu O.
Opiunea Run Copy Cut F O O Semnificaie Lanseaz n execuie formularul. Copiaz n Clipboard obiectul selectat. Mut n Clipboard obiectul selectat.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor


Opiunea Paste Data Environment Properties Builder Code Help

257

F F F,O F,O F,O

Semnificaie Insereaz n formular, n poziia indicat, obiectul care fost copiat anterior n Clipboard. Deschide fereastra Data Environment Afieaz n fereastra de proprieti formularul sau obiectul selectat. Deschide fereastra Constructorului rapid de formulare corespunztoare obiectului selectat. Deschide fereastra pentru scrierea secvenei de cod asociate unei metode sau eveniment al obiectului selectat.

F,O Deschide fereastra cu informaii despre obiect (help dependent de context). Lista ascuns din care alegei obiectul pentru care stabilii prorpietile i procedurile pentru metode i evenimente.

Seciunea All Data Method Layout Other

Conine Toate proprietile Numai proprietile care caracterizeaz data memorat n control. Numai metodele i evenimentele asociate obiectului. Numai proprietile care caracterizeaz aspectul controlului. Alte proprieti dect cele care caracterizeaz datele i aspectul.

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

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

258 Informatic
Copierea obiectului - selec-tai obiectul i apoi folosii operaiile Copy i Paste (din meniul Edit sau din meniul de comenzi rapide). tergerea obiectului - selectai obiectul i apoi apsai tasta Delete. Creai instane multiple ale unui obiect - executai clic pe butonul ButtonLock din bara Form controls, executai apoi clic n aceast bar pe obiectul pentru care creai instane multiple, creai obiectul n formular i apoi executai clic n locul n care vrei s creai o copie a acestui obiect. Executai clic pentru fiecare copie pe care vrei s o creai. Dup ce ai terminat de creat copii ale obiectului, dezactivai aceast funcie executnd clic pe butonul ButtonLock.

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

Noua ordine de parcurgere a formularului cu tasta Tab.

nchidei constructorul de formulare fr s salvai modificrile fcute.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor


Creai un formular Vei realiza un formular n care textul i desenele sunt afiate numai dac se indic formularul cu mouse-ul i se apas butonul stng. La eliberarea butonului de mouse textul i desenele afiate se terg.

259

Deschidei fereastra constructorului de aplicaii. n fereastra de proprieti atribuii urmtoarele valori proprietilor (care determin aspectul i comportarea formularului): Name = "Form1" ScaleMode = 3 Top = 13 Left = 14 Height = 300 Width = 450 Desktop = .F. BackColor = 220,220,220 ForeColor = 0,0,0 BorderStyle = 2 Caption = "Exemplu" FontName = "Courier New" FontSize = 16 FontBold = .T. DrawWidth = 5 FillColor = 150,150,150 FillStyle = 7 Closable = .T. Enabled = .T. Visible = .T. ShowTips = .F. TabIndex = 1 TabStop = .T. WindowState = 0 WindowType = 0 Pentru afiarea textului i a desenelor, la apsarea butonului de mouse s-a scris procedura asociat evenimentului MouseDown n care s-au apelat metodele specifice formularelor - Print (scrierea textului), Line (desenarea liniei), Circle (desenarea cercului). Pentru a avea acces la fereastra de cod, deschidei n fereastra de pro-prieti seciunea Method i din lista de metode i evenimente alegei evenimentul MouseDown.

Din lista ascuns Object putei alege obiectul pentru care scriei codul procedurii.

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

Procedure MouseDown Lparameters nButton, nShift,; nXCoord, nYCoord

ThisForm.CurrentX=10 ThisForm.CurrentY=10 for i=1 to 25

260 Informatic
ThisForm.Print('Exemplu') y2=50 ThisForm.CurrentX=; for i=1 to 8 ThisForm.CurrentX+10 ThisForm.Line(x1,y1,x2,y2) ThisForm.CurrentY=; ThisForm.Line(x2,y2,x1,y2+50) ThisForm.CurrentY+10 x1=x1+50 endfor x2=x2+50 x1=25 endfor y1=10 ThisForm.Circle(75,225,225) x2=65 Endproc Pentru tergerea textului i a desenelor, la eliberarea butonului de mouse s-a scris procedura asociat evenimentului MouseUp n care s-a apelat metoda Cls (tergerea): Procedure MouseUp Lparameters nButton, nShift, nXCoord, nYCoord ThisForm.Cls Endproc Salvai formularul i l lansai n execuie executnd clic pe butonul Run din bara standard.
Run - Lansai n execuie formularul Modify Form - Modificai formularul

Observaie: Procedurile asociate evenimentelor MouseMove, MouseUp i MouseDown primesc din partea sistemului urmtoarele informaii prin intermediul parametrilor: nButton - reprezint butonul de mouse acionat: 1 - butonul stng, 1 - butonul drept i 4 -butonul din mijloc. nShift - este un cod numeric (modul n care se calculeaz a fost prezentat la evenimentul PressKey) prin care se poate determina dac mouse-ul a fost acionat mpreun cu o tast rece Shift, Alt i Ctrl. nXCoord, nYCoord - reprezint coordonatele cursorului de mouse, relative la formular.

Setul de formulare FormSetx


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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

261

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

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

Deschidei formulaul anterior i l salvai sub un alt nume. Adugai la setul de formulare cel de al treilea formular.

262 Informatic
Stabilii proprietile pentru cel de la treilea formular: * Proprietatile formularului 3 Name = "Form3" Top = 54 Left = 132 Caption = "Formularul 3" Pentru fiecare formular scriei cte o procedur asociat evenimentului Click. La producere acestui eveniment, se parcurg ciclic cele trei formulare i se scrie n fiecare formular eticheta formularului n care s-a produs evenimentul Click: * Procedura pentru formularul 1 Procedure Click for n=1 to thisformset.formcount thisformSet.Forms(n).Print('Formularul 1') endfor Endproc * Procedura pentru formularul 2 Procedure Click for n=1 to thisformset.formcount thisformSet.Forms(n).Print('Formularul 2') endfor Endproc * Procedura pentru formularul 3 Procedure Click for n=1 to thisformset.formcount thisformSet.Forms(n).Print('Formularul 3') endfor Endproc

Setul de pagini PageFramex i pagina Pagex


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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor 9 Proprietile care pot fi folosite pentru parcurgerea ciclic a paginilor din set:
Numrul de pagini din set PageCount . Este de tip numeric.

263

Paginile Pages . Este de tip vector. n elementele vectorului se pstreaz referinele ctre paginile din set. 9 Proprietile de tip numeric care pot fi folosite pentru dimensiunile paginilor din set: PageHeight - nlimea paginii (fr etichet); PageWidth - limea paginii. 9 Proprietile care caracterizeaz etichetele paginilor din set: Prezena etichetelor Tabs . Este de tip logic i determin dac vor fi afiate etichetele. Dac are valoarea .T. (implicit), etichetele paginilor vor fi afiate, altfel zona etichetei va fi ocupat de pagin. Limea etichetelor TabStyle . Este de tip numeric. Dac are valoarea 0 (Justified), eticheta este dimensionat dup lungimea textului. Dac are valoarea 1 - (Nonjustified), etichetele paginilor sunt dimensionate astfel nct s ocupe toat limea setului de pagin. Aranjarea etichetelor TabsStretch . Este de tip numeric i determin modul n care vor fi aranjate etichetele n cadrul setului de pagini, atunci cnd lungimea textului etichetelor depete limea setului de pagini. Dac are valoarea 0 (Multiple Rows), etichetele vor fi scrise pe mai multe rnduri. Dac are valoarea 1 (Single Row), etichetele sunt afiate pe o singur linie i textul etichetelor este secionat astfel nct s ncap n etichet. Valoarea implicit este 1. Identificarea unei pagini se poate face n dou moduri: <nume_set_pagini>.<nume_pagin> sau <nume_set_pagini>.Pages(<n>) unde Pages este numele propritii care pstreaz ntr-un vector referinele fiecrei pagini a setului, iar <n> indexul paginii din acest vector. Formularele de tip pagin au proprietatea specific de tip numeric PageOrder numrul de ordine al paginii. Ea este diferit de indexul paginii din vectorul Pages. Modificarea unui numr de ordine al unei pagini duce la rearanjarea tuturor pginilor. De exemplu, dac exist patru pagini i vrei ca pagina a patra s devin a doua, i atroibuii acesteia numrul de ordine 2. Automat pagina a doua va primi numrul de ordine 3, iar pagina a treia numrul de ordine 4.

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

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

264 Informatic
n fereastra Properties, alegei din lista de obiecte obiectul PageFrame1 i scriei pentru proprietatea PageCount (numr de pagini) valoarea 8. Stabilii apoi i celelalte prorpieti ale obiectelor. Valorile proprietilor formularului, setului de pagini i paginilor sunt: * Formularul Caption = "Form1" Name = "Form1" * Setul de pagini Name = "Pageframe1" PageCount = 8 PageHeight=203 PageWedth=345 TabStretch = 0 Top = 12 Left = 12 Width = 349 Height = 252 Tabs = .T. * Paginile Page1.Caption = "Pagina 1" Page1.Name = "P1" Page1.PageOrder = 1 Page2.Caption = "Pagina 2" Page2.Name = "P2" Page2.PageOrder = 2 .............................. Page8.Caption = "Pagina 8" Page8.Name = "P8" Page8.PageOrder = 8

2. n fereastra Properties, deschidei lista cu obiectele din pagin i observai structura ierarhizat a obiectelor din formular. 3. Cele dou moduri n care sunt afiate paginile sunt controlate cu proprietatea TabStretch. Testai efectul acestei proprieti.
Setul de pagini se identific prin: Form1.Pageframe1

O pagin (de exemplu pagina P4) se identific prin: Form1.Pageframe1.P1

4. Dac paginii P2 i se atribuie numrul de ordine 5 (Page2.PageOrder=5), se vor modifica i paginile: P3 va primi numrul de ordine 2, P4 va primi numrul de ordine 3 i P5 va primi numrul de ordine 4. Testai operaia de schimbare a ordinii paginilor.

TabStretch=0 TabStretch=1

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

265

T est pentru evaluare:


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

ncercai:

Adevrat/Fals: 1. Interfaa de explorare este o interfa container care conine mai multe ferestre. 2. Procedura asociat evenimentului KeyPress primete ca parametru codul numeric asociat tastelor reci apsate. 3. Focalizarea este o metod prin care se poate mri un control grafic. 4. Evenimentul Init este declanat de activarea obiectului. 5. Print este o metod prin care scriei ntr-un formular. 6. Evenimentul Destroy este declanat de eliberarea zonei de memorie alocate obiectului. 7. Procedura asociat evenimentului Load se execut dup cea asociat evenimentului Init. Completai: 1. Dimensiunile, poziiile pe ecran, vizibilitatea i disponibilitatea sunt ........................... ale unui obiect vizual. 2. Variabila de sistem folosit pentru a referi fereastra implicit a aplicaiei Visual FoxPro este ....... . 3. Funcia care furnizeaz codul unei culori descrise prin intensitatea celor trei culori de baz este ........ 4. Un obiect poate fi focalizat din program cu metoda ...................... 5. Procedura asociat evenimentului .......... al unui formular este ultima care se execut. Alegei rspunsurile corecte: 1. Pentru un obiect,Click este: a) o proprietate b) un eveniment c) o metod 2. Stabilii tipul formularului (modal/nemodal) cu proprietatea: a) WindowType b) ShowWindow c) MDIForm 3. Ordinea tabulrii este o proprietate specific: a) tuturor controalelor b) controalelor gril c) formularelor 4. Caseta de dialog Open a interfeei aplicaiei Visual FoxPro este o caset de dialog: a) modal b) nemodal c) copil d) printe 5. Stilul interfeei aplicaiei Visual FoxPro este de tip: a) SDI b) MDI c) de explorare 6. Pentru un formular, Release este: a) o proprietate b) un eveniment c) o metod

266 Informatic
spunsuri: R Adevrat/Fals: 1-F; 2-A; 3-F; 4-F; 5-F; 6-A; 7-F.
Completai: 1-proprieti; 2-_screen; 3-rgb(); 4-SetFocus ; 5-Unload Alegei rspunsurile corecte: 1-b; 2-a; 3- c; 4-a; 5-b; 6-c.

3.4. C o n t r o alele

3.4.1. Proprietile i evenimentele specifice controalelor


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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

267

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

3.4.2. Controale pentru executarea aciunilor


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

Butonul de comand CommandButtonx


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

268 Informatic
i un buton Stop care poate opri execuia procesului. n general, acestui control nu i se asociaz valori, ci aciuni descrise prin procedura asociat evenimentului Click. Butonul de comand nu are proprietatea BackColor, iar proprietatea Style poate avea valorile: 0 - standard (implicit) i 1 - invizibil. Are proprietile WordWrap i Autosize (care vor fi prezentate ulterior). n funcie de modul n care este informat utilizatorul despre aciunea butonului exist: 9 Butoane n care aciunea este descris printr-un text. n acest caz, textul care descrie aciunea va fi pstrat de proprietatea Caption a controlului. 9 Butoane n care aciunea este descris printr-o imagine. n acest caz, identificatorul fiierului care conine imaginea care va fi afiat va fi pstrat de proprietatea Picture a controlului (identificatorul fiierului n care este pstrat imaginea). n cazul n care se folosete imaginea pentru descrierea aciunii, trebuie folosite i urmtoarele proprieti: DownPicture - imaginea afiat atunci cnd butonul este focalizat; DisablePicture - imaginea afiat atunci cnd butonul nu este disponibil. Declanatorul poate fi acionat n mai multe moduri: 9 Executai clic pe butonul focalizat. 9 Focalizai butonul apsnd repetat tasta Tab i apoi apsai tasta Enter sau Spaiu. 9 Apsai tasta Alt mpreun cu tasta de acces la buton (cu tasta literei de identificare). 9 Dac butonul de comand este butonul implicit al formularului, apsai tasta Enter, indiferent de poziia selectorului. 9 Dac butonul de comand este butonul de anulare al formularului, apsai tasta Esc, indiferent de poziia selectorului. Indiferent de modul ales, evenimentul este acelai (evenimentul Click): prin acionarea butonului se declaneaz operaia atribuit lui. ntr-un formular nu poate fi dect un buton implicit i un buton de anulare. Tipul butonului este controlat cu proprietile specifice unui buton de comand: 9 Implicit Default . Este de tip logic. Dac are valoarea .T., butonul de comand este butonul implicit (default command button). ntr-un formular, un singur buton de comand poate fi implicit. Valoarea implicit pentru aceast proprietate este .F.. 9 Anulare Cancel . Este de tip logic. Dac are valoarea .T., butonul de comand este butonul de anulare (cancel command button). ntr-un formular, un singur buton de comand poate fi de anulare. Valoarea implicit pentru aceast proprietate este .F..

Grupul de butoane de comand CommandButtonGroupx


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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

269

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

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

270 Informatic
ThisForm.L.LineSlant ='\' ThisForm.L.Visible = .T. Enddefine Cancel = .T. Left = 150 Top = 150 Height = 25 Define class Buton4 as; Procedure Click CommandButton Clear events Caption = '\<Terminare' Enddefine Salvai programul i-l lansai n execuie cu comanda do forma_p.prg. Testai butoanele.
Construii un formular care conine butoane de comand folosind metoda vizual

Creai un formular nou forma_v. Creai n acest formular un obiect de tip linie: executai clic pe butonul Line de pe bara Form controls i glisai apoi mouse-ul n formular pentru a trasa linia. Pentru a crea cele patru butoane declantoare, folosii facilitatea de creare de instan-e multiple. Executai clic pe butonul ButtonLock pe bara Form controls, apoi exe-cutai clic pe butonul CommandButton de pe aceeai bar. Glisai mouseul n formular pentru a crea un buton de comand. Apoi executai clic de trei ori n poziiile n care vrei s apar celelalte butoane. Dezactivai facilitatea executnd clic pe bu-tonul ButtonLock. Modificai corespunztor valorile proprietilor formularului i obiectelor din formular (pe baza instruciunilor din programul surs). Scriei cte o procedur pentru fiecare eveniment Click al celor patru butoane (pe baza instruciunilor din programul surs). Salvai formularul i-l lansai n execuie cu comanda do form forma_v. Testai formularul.

3.4.3 Controale pentru introducerea i afiarea datelor Eticheta Labelx


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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

271

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

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

Creai un formular nou. Creai n formular un set de pagini cu dou pagini. Creai n fiecare seciune etichetele astfel: executai clic pe butonul Label de pe bara Form controls i glisai apoi mouse-ul n formular pentru a trasa eticheta.

272 Informatic

Folosind fereastra Properties stabilii proprietile formularului, a setului de pagini, ale paginilor i ale obiectelor folosite:

* Formularul Page2.Caption = "Apasare buton" Name = "Formular" * Etichetele Top = 11 * proprietati comune: Left = 33 Name = .... Height = 296 AutoSize = .T. Width = 375 BackStyle = 0 BackColor = 200,200,200 Caption = .... Caption = "Test mouse" Height = ... WindowState = 0 Left = ... * Setul de pagini Top = ... Name = "Caseta" Width = ... PageCount = 2 *Exemplu: TabStretch = 1 Name = "L2" ActivePage = 1 AutoSize = .T. Top = 0 BackStyle = 0 Left = -12 Caption = "x= " Width = 408 Height = 18 Height = 253 Left = 47 * Sectiunea 1 Top = 72 Page1.Name = "Sect1" Width = 20 Page1.Caption="Deplasare mouse" * Butonul de comanda * Sectiunea 2 Name = "Buton" Page2.Name = "Sect2" Caption = "\<Terminare" Pentru seciunea 1 a casetei se asociaz o procedur evenimentului MouseMove (n etichetele L4 i L5 se afieaz coordonatele, n eticheta L7 se afieaz butonul apsat, iar n etichetele L9, L10 i L11 se afieaz tastele apsate): Procedure Sect1.MouseMove Lparameters nButton, nShift, nXCoord, nYCoord ThisForm.Caseta.Pages(1).L4.Caption=str(nXCoord,4,0) ThisForm.Caseta.Pages(1).L5.Caption=str(nYCoord,4,0) Do case case nButton=1 ThisForm.Caseta.Pages(1).L7.Caption='Stanga' case nButton=2 ThisForm.Caseta.Pages(1).L7.Caption='Dreapta' case nButton=4 ThisForm.Caseta.Pages(1).L7.Caption='Mijloc' otherwise nButton=0 ThisForm.Caseta.Pages(1).L7.Caption='' Endcase if inlist(nShift,1,3,5,7) ThisForm.Caseta.Pages(1).L9.Visible=.T. else ThisForm.Caseta.Pages(1).L9.Visible=.F. endif if inlist(nShift,2,3,6,7) ThisForm.Caseta.Pages(1).L10.Visible=.T. else

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

273

ThisForm.Caseta.Pages(1).L10.Visible=.F. endif if inlist(nShift,4,5,6,7) ThisForm.Caseta.Pages(1).L11.Visible=.T. else ThisForm.Caseta.Pages(1).L11.Visible=.F. Endif ThisForm.Caseta.Refresh Endproc Pentru seciunea 2 a casetei se asociaz o procedur evenimentului MouseDown (n etichetele L10 i L11 se afieaz coordonatele, n eticheta L2 se afieaz butonul apsat, iar n etichetele L5, L5 i L6 se afieaz tastele apsate) i o procedur evenimentului MouseUp: Procedure Sect2.MouseDown Lparameters nButton, nShift, nXCoord, nYCoord ThisForm.Caseta.Pages(2).L10.Caption=str(nXCoord,4,0) ThisForm.Caseta.Pages(2).L11.Caption=str(nYCoord,4,0) Do case case nButton=1 ThisForm.Caseta.Pages(2).L2.Caption='Stanga' case nButton=2 ThisForm.Caseta.Pages(2).L2.Caption='Dreapta' case nButton=4 ThisForm.Caseta.Pages(2).L2.Caption='Mijloc' otherwise ThisForm.Caseta.Pages(2).L2.Caption='' Endcase if inlist(nShift,1,3,5,7) ThisForm.Caseta.Pages(2).L4.Visible=.T. else ThisForm.Caseta.Pages(2).L4.Visible=.F. endif if inlist(nShift,2,3,6,7) ThisForm.Caseta.Pages(2).L5.Visible=.T. else ThisForm.Caseta.Pages(2).L5.Visible=.F. endif if inlist(nShift,4,5,6,7) ThisForm.Caseta.Pages(2).L6.Visible=.T. else ThisForm.Caseta.Pages(2).L6.Visible=.F. Endif ThisForm.Caseta.Refresh Endproc Procedure Sect2.MouseUp Lparameters nButton, nShift, nXCoord, nYCoord ThisForm.Caseta.Pages(2).L10.Caption='' ThisForm.Caseta.Pages(2).L11.Caption='' ThisForm.Caseta.Pages(2).L2.Caption='' ThisForm.Caseta.Pages(2).L4.Visible=.F. ThisForm.Caseta.Pages(2).L5.Visible=.F.

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

Caseta de text TextBoxx


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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

275

9 Lungimea maxim a textului MaxLength (tip numeric) - numrul maxim de caractere care pot fi scrise n caseta de text . Se folosete n cazul cmpurilor de tip ir de caractere pentru ca textul introdus s nu depeasc lungimea permis n cmp. 9 Proprieti prin care se controleaz formatul de introducere i afiare a datei memorate n proprietatea Value:
Formatul de introducere: Format (tip ir de caractere). Prin aceast proprietate se stabilete caracteristica ntregului cmp de editare. De exemplu, dac proprietatea are valoarea 'A', n caseta de text nu vei putea scrie dect litere. Masca de introducere: InputMask (tip ir de caractere). Prin aceast proprietate se stabilete un ablon pentru format n care se precizeaz caracteristica fiecrei poziii a formatului. Fa de proprietatea anterioar prezint avantajul c
ablonul Cod Semnificaie X Orice caracter. 9 Numai cifre i semne (ca de exemplu semnul minus -) # Cifre, spaii i semne $ Afieaz simbolul monetar $$ Afieaz simbolul monetar mobil. * Afieaz asteriscuri la stnga valorii. . Reprezint poziia punctului zecimal (separatporul ntre partea ntreag i partea fracionar). , Reprezint poziia separatorului ordinelor de mrime (sute de mii, sutele de mii de milioane etc.) Format Cod Semnificaie A Numai litere, fr spaii sau semne de punctuaie. D Pentru datele calendaristice, se folosete formatul stabilit prin set date. E Datele de tip dat calendaristic vor fi editate n format british. K Selecteaz textul din cmp atunci cnd este focalizat controlul. L Se folosete numai pentru tipul numeric; afieaz zerouri nesemnificative n n locul spaiilor. R Afieaz ablonul definit prin proprietatea InputMask. Valoarea ablonului nu va fi memorat n proprietatea Value. T Se folosete numai pentru tipul ir de caractere; nltur spaiile de la nceputul i de la sfritul irului de caractere. ! Se folosete numai pentru tipul ir de caractere; convertete toate literele n litere mari. $ Se folosete numai pentru tipul numeric; afieaz simbolul monetar.

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

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

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

Zona de editare EditBoxx


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

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

Scriei programul surs Calc_p.prg: F1 = CreateObject('Form') F1.Caption='Operatii' F1.Closable = .F.

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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

277

F1.AddObject('L1','Label') F1.AddObject('C1','TextBox') F1.AddObject('L2','Label') F1.AddObject('C2','TextBox') F1.AddObject('L3','Label') F1.AddObject('L4','Label') F1.AddObject('C3','TextBox') F1.AddObject('B1','Buton1') F1.AddObject('B2','Buton2') F1.AddObject('B3','Buton3') F1.AddObject('B4','Buton4') F1.AddObject('B5','Buton5') F1.L1.AutoSize = .T. F1.L1.BackColor=RGB(220,220,220) F1.L1.Caption = "a" F1.L1.Height = 18 F1.L1.Left = 48 F1.L1.Top = 36 F1.L1.Width = 8 F1.L1.Visible =.T. F1.L2.AutoSize = .T. F1.L2.BackColor=RGB(220,220,220) F1.L2.Caption = "b" F1.L2.Height = 18 F1.L2.Left = 48 F1.L2.Top = 96 F1.L2.Width = 8 F1.L2.Visible =.T. F1.L3.BackColor=RGB(220,220,220) F1.L3.Caption = "c" F1.L3.Height = 18 F1.L3.Left = 48 F1.L3.Top = 144 F1.L3.Width = 7 F1.L3.Visible =.T. F1.L4.BackColor=RGB(220,220,220) F1.L4.Caption = "Imposibil!!!; Impartire la zero" F1.L4.Height = 25 F1.L4.Left = 36 F1.L4.Top = 204 F1.L4.Visible = .F. F1.L4.Width = 181 F1.C1.Value=0 F1.C1.InputMask = "999999" F1.C1.Left = 85 F1.C1.Top = 36 F1.C1.Height = 25 F1.C1.Width = 108 F1.C1.Visible =.T.

F1.C2.Value=0 F1.C2.InputMask = "999999" F1.C2.Left = 85 F1.C2.Top = 84 F1.C2.Height = 25 F1.C2.Width = 108 F1.C2.Visible =.T. F1.C3.Value=0 F1.C3.BackColor=RGB(220,220,220) F1.C3.Height = 25 F1.C3.Left = 85 F1.C3.ReadOnly = .T. F1.C3.Top = 144 F1.C3.Width = 108 F1.C3.Style = 1 F1.C3.Visible =.T. F1.B1.Visible =.T. F1.B2.Visible =.T. F1.B3.Visible =.T. F1.B4.Visible =.T. F1.B5.Visible =.T. F1.Show Read events Define class Buton1 as; CommandButton Top = 24 Left = 276 Height = 25 Width = 61 Caption = "+" Procedure Click ThisForm.C3.Value=; ThisForm.C1.Value+; ThisForm.C2.Value ThisForm.C3.Refresh Enddefine Define class Buton2 as; CommandButton Top = 60 Left = 276 Height = 25 Width = 61 Caption = "-" Procedure Click ThisForm.C3.Value=; ThisForm.C1.Value-; ThisForm.C2.Value ThisForm.C3.Refresh Enddefine

278 Informatic
Define class Buton3 as; ThisForm.B4.StatusBarText=; CommandButton 'ImposibiI!!! -; Top = 96 Impartire la 0' Left = 276 ThisForm.L4.Visible=.T. Height = 25 ThisForm.C2.SetFocus Width = 61 else Caption = "*" ThisForm.C3.Value=; Procedure Click ThisForm.C1.Value/; ThisForm.C3.Value=; ThisForm.C2.Value ThisForm.C1.Value*; ThisForm.C3.Refresh ThisForm.C2.Value endif ThisForm.C3.Refresh Enddefine Enddefine Define class Buton5 as; Define class Buton4 as; CommandButton CommandButton Top = 204 Top = 132 Left = 264 Left = 276 Height = 25 Height = 25 Width = 84 Width = 61 Caption = "\<Terminare" Caption = "/" Procedure Click Procedure Click ThisForm.Release ThisForm.B4.StatusBarText='' clear events ThisForm.L4.Visible=.F. Enddefine if ThisForm.C2.Value=0 Salvai fiierul. Lansai n execuie programul Calc_p.prg. Testai formularul.
Construii un formular care conine casete de text folosind metoda vizual 1. Realizai caseta de dialog din exemplul precedent folosind metoda vizual.

Creai un formular nou, n care creai urmtoarele obicete: patru etichete, trei casete de text i cinci butoane de comand.

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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

279

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

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

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

Pentru obiectele adugate stabilii proprietile: Name = "Command6" && Buton6 Name = "Command7" Caption = "M+" Caption = "M-" Scriei o procedur asociat evenimentului Load al formularului n care iniializai variabila de memorie memorie. procedure Load && Formular memorie=0 public memorie endproc Modificai procedura asociat evenimentului Clic al butonului Buton4. procedure Click && Buton4 ThisForm.Command4.StatusBarText='' if ThisForm.Text2.Value=0 ThisForm.Command4.StatusBarText='ImposibiI!!! -Impartire la 0' Wait Windows 'ImposibiI!!! -Impartire la 0' ThisForm.Text2.SetFocus else ThisForm.Text3.Value=ThisForm.Text1.Value/ThisForm.Text2.Value ThisForm.Text3.Refresh endif endproc Scriei procdurile asociate evenimentului Clic pentru cele dou noi butoane: procedure Click && Buton6 procedure Click && Buton7 Memorie=ThisForm.Text3.Value ThisForm.Text1.Value=Memorie endproc endproc
3. Realizai caseta de dialog pentru introducerea parolei. Creai formularul i adugai la formular o etichet, o caset de text i un buton de comand. Sursa controlului caset de text va fi variabila de memorie m.parola. Pentru a permite introducerea unei parole caseta de dialog trebuie s fie un formular modal. Stabilii pentru formular i controale urmtoarele proprieti: * Formularul AutoSize = .T. Name = "Form1" BackStyle = 0 BackColor = 192,192,192 Caption = "Parola" Caption = "Parola" Name = "Text1" Closable = .F. ControlSource = "m.parola" WindowType = 1 && Modal PasswordChar = "*" * Obiectele Name = "Command1" Name = "Label1" Caption = "\<Terminare" Scriei procedurile asociate evenimentelor formularului Load i Unload (prin care este returnat parola ctre un program):

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor Procedure Load && Formular Procedure Unload && Formular parola=space(6) return parola endproc endproc Scriei procedura asociat evenimentului Click al butonului de terminare: Procedure Click && Buton ThisForm.Release endproc Salvai formularul sub numele form_par.

281

Deschidei fereastra editorului de texte i scriei urmtorul program prin care lansai n execuie formularul. Formularul va furniza programului apelant parola introdus de utilizator. Parola corect este alfa plus dou caractere pentru ziua din lun (de exemplu, dac parola se introduce pe 12 februarie, parola corect este alfa12). n programul principal se stabilete parola corect (variabila parola_c) i se verific dac parola furnizat este corect. Se accept maxim 3 ncercri. set talk off if day(date())<10 parola_c='alfa0'+str(day(date()),1) else parola_c='alfa'+str(day(date()),2) endif for i=1 to 3 do form form_par to parola if parola=parola_c wait window 'Felicitari!!! Parola este corecta' exit else wait window 'Parola gresita !!! Mai aveti '+str(3-i,1)+'; incercari' endif endfor Salvai programul. Lansai n execuie programul i testai modul n care funcioneaz programul i formularul pentru parol. 4. Realizai o caset de dialog care s simuleze operaiile de selectare a textului i de lucru cu zona de memorie Clipboard pentru transferul datelor (operaiile Copy, Cut i Paste). Pentru aceste operaii se vor folosi butoanele Copiere (Copy), Mutare (Cut), Inserare (Paste) i Stergere (Delete). Butoanele au taste de acces. n acest mod scurttura Alt+C este similar cu Ctrl+C, Alt+M este similar cu Ctrl+X, Alt+I este similar cu Ctrl+V, iar Alt+S este similar cu Delete. Transferul textului se va face prin intermediul unei variabile de memorie zona_s care simuleaz zona de memorie Clipboard. Butoanele

282 Informatic
Stergere, Copiere i Mutare nu vor fi disponibile dac nu a fost selectat un text, iar butonul Inserare nu va fi disponibil dac variabila de memorie zona_s este vid (n Clipboard nu au fost transferate date). n caseta de dialog se vor crea dou zone pentru editarea textului (dou controale de tip EditBox). Operaiile se pot executa n aceeai zon (acelai document) sau ntre cele dou zone (dou documente diferite). Pentru a ti cu ce zon de text se va lucra, se va folosi variabila de memorie text, de tip numeric, care are valoarea 1 pentru prima zon de text i valoarea 2 pentru a doua zon de text. Creai formularul i adugai la formular dou etichete, dou zone de editare i cinci butoane de comand. Pentru zona de editare folosii butonul EditBox de pe bara Form Controls. Stabilii pentru formular i controale urmtoarele proprieti: * Formularul * Pentru toate etichetele Name = "Form1" AutoSize = .T. BackColor = 192,192,192 BackStyle = 0 Caption = "Prelucrare text" * Butoane Closable = .F. Name = "Command1" * Zonele de editare Caption = "\<Stergere" Name = "Edit1" Name = "Command2" HideSelection = .F. Caption = "\<Inserare" Name = "Edit2" Name = "Command3" HideSelection = .F. Caption = "\<Copiere" *Etichetele Name = "Command4" Name = "Label1" Caption = "\<Mutare" Caption = "Text 1" Name = "Command5" Name = "Label2" Cancel = .T. Caption = "Text 2" Caption = "\<Terminare" Scriei procedura asociat evenimentului Init al formularului. n aceast procedur declarai variabilele globale text i zona_s i iniializai proprietile Value ale celor dou zone de editare: procedure Init && Formular ThisForm.Edit1.Value='' public text,zona_s ThisForm.Edit2.Value='' text=1 endproc zona_s='' Scriei procedurile asociate evenimentului LostFocus pentru cele dou zone de text, n care memorai n variabila text zona de editare care a pierdut focalizarea. procedure LostFocus &&Edit1 procedure LostFocus &&Edit1 text=1 text=2 endproc endproc Scriei procedurile asociate evenimentului Click pentru cele cinci butoane: procedure Click &&Buton1 else if text=1 ThisForm.Edit2.SelText=zona_s ThisForm.Edit1.SelText='' endif else endproc ThisForm.Edit2.SelText='' procedure Click &&Buton3 endif if text=1 endproc zona_s=ThisForm.Edit1.SelText procedure Click &&Buton2 else if text=1 zona_s=ThisForm.Edit2.SelText ThisForm.Edit1.SelText=zona_s endif

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor endproc ThisForm.Edit2.SelText='' procedure Click &&Buton4 endif if text=1 endproc zona_s=ThisForm.Edit1.SelText procedure Click &&Buton5 ThisForm.Edit1.SelText='' ThisForm.Release else endproc zona_s=ThisForm.Edit2.SelText Salvai formularul. Lansai n execuie formularul i-l testai.

283

5. Realizai o caset de dialog care s simuleze operaiile de cutare i nlocuire ntr-un text (operaiile Find i Replace). Pentru aceste operaii se vor folosi butoanele Cauta (Find), Inlocuieste (Replace) i Inlocuieste toate aparitiile (Replace All). Butoanele au taste de acces. n acest mod scurttura Alt+C este similar cu Ctrl+F i Alt+I este similar cu Ctrl+H. Butonul Cauta nu este disponibil dac zona de editare i caseta de text cu eticheta Se caut sunt vide. Butoanele Inlocuieste i Inlocuieste toate aparitiile nu sunt disponibile dac nu a fost gsit n zona de text textul scris n caseta de text cu eticheta Se cauta.

Creai formularul i adugai la formular trei etichete, o zon de editare, dou casete de text, un grup de trei butoane de comand i un buton de comand. Stabilii
Grupul de butoane de comand

pentru formular i controale urmtoarele proprieti: * Formular Name = "Form1" Closable = .F. BackColor = 192,192,192 Caption = "Prelucrare texte" * Zona de editare Name = "Edit1" HideSelection = .F. *Etichete Name = "Label1" Caption = "Text" Name = "Label2" Caption = "Se cauta"

Name = "Label3" Caption = "Se inlocuieste cu" * Pentru toate etichetele AutoSize = .T. BackStyle = 0 *Casetele de text Name = "Text1" DisabledBackColor = 192,192,192 Name = "Text2" DisabledBackColor = 192,192,192

284 Informatic
* Grupul de butoane Command1.Caption = "\<Cauta" Name = "Commandgroup1" Command1.Style = 0 AutoSize = .T. Command2.Name = "Command2" ButtonCount = 3 Command2.AutoSize = .F. BackStyle = 0 Command2.Caption="\<Inlocuieste" Value = 1 Command3.Name = "Command3" Height = 106 Command3.AutoSize = .T. Left = 288 Command3.Caption = "Inlocuieste; Top = 36 toate \<aparitiile" Width = 198 * Butonul de comanda Command1.Name = "Command1" Name = "Command1" Command1.AutoSize = .F. Caption = "\<Terminare" Pentru formular scriei procedura asociat evenimentului Init: procedure Init &&Formular public x store 0 to x ThisForm.Edit1.Value='' ThisForm.Text1.Value='' ThisForm.Text2.Value='' ThisForm.Text1.Enabled=.F. ThisForm.Text2.Enabled=.F. ThisForm.Commandgroup1.Command1.Enabled=.F. ThisForm.Commandgroup1.Command2.Enabled=.F. ThisForm.Commandgroup1.Command3.Enabled=.F. endproc Pentru zona de editare scriei proceduri asociate evenimentelor GotFocus, LostFocus i Valid: procedure GotFocus && EditBox ThisForm.Text1.Enabled=.T. ThisForm.Text2.Enabled=.F. ThisForm.Commandgroup1.Command1.Enabled=.F. ThisForm.Commandgroup1.Command2.Enabled=.F. ThisForm.Commandgroup1.Command3.Enabled=.F. endproc procedure LostFocus && EditBox ThisForm.Text2.Enabled=.F. ThisForm.Commandgroup1.Command1.Enabled=.F. ThisForm.Commandgroup1.Command2.Enabled=.F. ThisForm.Commandgroup1.Command3.Enabled=.F. endproc procedure Valid && EditBox if len(ThisForm.Edit1.Value)<>0 ThisForm.Text1.Enabled=.T. Return .T. else ThisForm.Text1.Enabled=.F. Return .F. endif endproc

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

285

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

286 Informatic
endproc procedure Command2.Click && Grup.Buton1 ThisForm.Edit1.SelText=alltrim(ThisForm.Text2.Value) ThisForm.Text2.Value='' ThisForm.Text2.Enabled=.F. ThisForm.Commandgroup1.Command2.Enabled=.F. ThisForm.Commandgroup1.Command3.Enabled=.F. endproc procedure Command3.Click && Grup.Buton1 ThisForm.Edit1.SelText=alltrim(ThisForm.Text2.Value) x=at(alltrim(ThisForm.Text1.Value),ThisForm.Edit1.Value) do while x<>0 ThisForm.Edit1.SelStart=at(alltrim(ThisForm.Text1.Value),; ThisForm.Edit1.Value)-1 ThisForm.Edit1.SelLength=Len(alltrim(ThisForm.Text1.Value)) ThisForm.Edit1.SelText=alltrim(ThisForm.Text2.Value) x=at(alltrim(ThisForm.Text1.Value),ThisForm.Edit1.Value) enddo ThisForm.Text2.Value='' ThisForm.Text2.Enabled=.F. ThisForm.Commandgroup1.Command1.Enabled=.F. ThisForm.Commandgroup1.Command2.Enabled=.F. ThisForm.Commandgroup1.Command3.Enabled=.F. endproc procedure Click && Buton1 ThisForm.Release endproc Salvai formularul. Lansai formularul n execuie i-l testai.
6. Creai tabelul agenda cu urmtoarea structur: nume(C,15), prenume(C,15), adresa (C,40), telefon(C,10) i data_n(D). Realizai o caset de dialog care s permit urmtoarele operaii cu datele din tabel: parcurgerea tabelului pentru vizualizare (nu se pot modifica datele din cmpuri) i adugarea de noi nregistrri. Butoanele >>> i <<< se folosesc pntru parcurgerea tabelului nainte i napoi, iar butonul Adauga pentru adugarea de noi nregistrri. Creai formularul i adugai la formular cinci etichete, o zon de editare (pentru cmpul adresa), patru casete de text (pentru restul cmpurilor) i patru butoane de comand. Stabilii pentru formular i controale urmtoarele proprieti: * Formular Name = "Form1" BackColor = 220,220,220 Caption = "Agenda" Closable = .F. * Casetele de text Name = "Text1" ControlSource = "agenda.nume"

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

287

Name = "Text2" Name = "Label4" ControlSource="agenda.prenume" "Tele\<fon" Name = "Text3" Name = "Label5" ControlSource="agenda.telefon" Caption = "\<Data nasterii" Name = "Text4" *pentru toate etichetele: ControlSource="agenda.data_n" AutoSize = .T. Format = "E" BackStyle = 0 * Zona de editare * Butoane Name = "Edit1" Name = "Command1" ControlSource="agenda.adresa" Caption = ">>>" *Etichetele Name = "Command2" Name = "Label1" Caption = "<<<" Caption = "\<Numele" Name = "Command3" Name = "Label2" Caption = "\<Adauga" Caption = "\<Preumele" Name = "Command4" Name = "Label3" Caption = "\<Terminare" "Adre\<sa" Scriei procedurile asociate evenimentelor Load, Unload i Init ale formularului: procedure Load &&Formular ThisForm.Text3.ReadOnly=.T. use agenda ThisForm.Text4.ReadOnly=.T. goto top ThisForm.Edit1.ReadOnly=.T. endproc ThisForm.Text1.SetFocus procedure Init &&Formular endproc set date to british procedure Unload &&Formular ThisForm.Text1.ReadOnly=.T. use ThisForm.Text2.ReadOnly=.T. endproc Scriei procedurile asociate evenimentului Init al casetelor de text i al zonei de editare: procedure Init &&Text1 endif if eof() endproc ThisForm.text1.Value='' procedure Init &&Text3 endif if eof() endproc ThisForm.Text3.Value='' procedure Init &&Text2 endif if eof() endproc ThisForm.Text2.Value='' procedure Init &&Text4 endif if eof() endproc ThisForm.Text4.Value={ / / } procedure Init &&Edit1 endif if eof() endproc ThisForm.Edit1.Value='' Scriei procedurile asociate evenimentelor Click ale butoanelor: procedure Click &&Buton1 ThisForm.Refresh if not eof() endif skip endproc ThisForm.Text1.ReadOnly=.T. procedure Click &&Buton2 ThisForm.Text2.ReadOnly=.T. if not bof() ThisForm.Text3.ReadOnly=.T. skip -1 ThisForm.Text4.ReadOnly=.T. ThisForm.Text1.ReadOnly=.T. ThisForm.Edit1.ReadOnly=.T. ThisForm.Text2.ReadOnly=.T.

288 Informatic
ThisForm.Text3.ReadOnly=.T. ThisForm.Text4.ReadOnly=.T. ThisForm.Edit1.ReadOnly=.T. ThisForm.Refresh endif endproc procedure Click &&Buton3 append blank ThisForm.Text1.ReadOnly=.F. ThisForm.Text2.ReadOnly=.F. Salvai formularul. Lansai formularul n i-l testai. ThisForm.Text3.ReadOnly=.F. ThisForm.Text4.ReadOnly=.F. ThisForm.Edit1.ReadOnly=.F. ThisForm.Refresh ThisForm.Text1.SetFocus endproc procedure Click &&Buton4 ThisForm.Release endproc
execuie

Caset de text cu derulor Spinnerx


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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor 9 Evenimentele declanate de acionarea derulorului cu mouse-ul:
UpClick - cnd este acionat butonul de incrementare i DownClick - cnd este acionat butonul de decrementare.

289

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

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

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

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

Grila Gridx, coloana Columnx i antetul coloanei Headerx


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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

291

9 Antetul coloanei. Este o etichet afiat n partea de sus a coloanei care conine un text explicativ referitor la datele afiate n coloan. 9 Celula. Celula curent (celula activ) este celula care primete focalizarea. Ea este determinat de numrul rndului i numrul coloanei la intersecia crora se gsete celula. Utilizatorul poate schimba n orice moment celula curent folosind mouse-ul sau tastatura (tasta Tab). Dimensiunea celulei este determinat de nlimea rndului i limea coloanei. Aceste proprieti trebuie s fie modificate dac nu sunt suficiente ca s ncap textul sau imaginea n celul. 9 Alinierea. Se refer la alinierea datelor n coloanele tabelului i n celule. 9 Barele de derulare. Se folosesc pentru a deplasa coninutul grilei atunci cnd nu pot fi vizualizate toate datele n zona de afiare a grilei. Se pot folosi bare de derulare pe vertical i pe orizontal. 9 Liniile folosite ca delimitatori. Pentru delimitarea celulelor se pot folosi linii care pot fi caracterizate de culoare i grosime. 9 Coloana cu marcajul pentru tergere. Este o coloan care poate fi folosit pentru a marca o nregistrare pentru tergere (se execut clic n aceast coloan n dreptul nregistrrii pe care vrei s o marcai pentru tergere sau pentru care vrei s anulai un marcaj pentru tergere - la fel ca la fereastra Browse). 9 Coloana cu marcajul rndului curent. Este o coloan care poate fi folosit pentru a stabili nregistrarea curent (se execut clic n aceast coloan n dreptul nregistrrii care vrei s devin nregistrare curent - la fel ca la fereastra Browse). 9 Panourile grilei. La fel ca la fereastra Browse grila poate fi mprit n dou partiii numite panouri. Cele dou panouri pot funciona ca dou grile independente, iar divizarea lor se face prin intermediul unei bare de divizare (split).
Coloana Antetul Formularul
Coloana cu marcajul rndului

Barele de derulare ale grilei

Celula selectat Coloana cu marcajul pentru tergere

Grila Toate aceste elemente pot fi caracterizate cu ajutorul proprietilor grilei, coloanelor i al anteturilor, pot fi manipulate cu ajutorul metodelor i pot rspunde la evenimente specifice.

292 Informatic
Antetul - obiectul Header
Creeaz un antet al unei coloane dintr-o gril prin care se afieaz o etichet n partea de sus a coloanei. Antetul poate rspunde la evenimente. Aspectul antetului poate fi stabilit prin intermediul proprietilor pentru fontul caracterelor (nume font, dimensiune, stil), pentru aliniere i culoare (pentru fond i pentru text). Obiectul nu are proprieti pentru dimensiune i poziie. Prin proprietatea Caption a antetului se stabilete textul care se afieaz ca etichet a coloanei. Antetul rspunde la evenimente declanate de aciunile mouse-ului (Click, RightClick, DblClick, MouseUp, MouseDown, MouseMove) i cunoate metoda Refresh.

Coloana - obiectul Column


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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

293

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

Grila - obiectul Grid


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

294 Informatic
grilei, dar care nu se stabilesc la nivelul componentei, deoarece trebuie s existe un aspect unitar al acestor componente la nivelul grilei): 9 nlimea antetului HeaderHeight . Este de tip numeric i se msoar n pixeli. 9 Modificarea interactiv a nlimii antetului AllowHeaderSizing . Este de tip logic. Dac are valorea .T., permite modificarea interactiv de ctre utilizator a nlimii antetului. 9 nlimea rndului RowHeight . Este de tip numeric. Dac are valoarea -1, nlimea este aleas automat astfel nct s ncap caracterele corespunztoare dimensiunii stabilite prin proprietile FontSize i FontName. 9 Modificarea interactiv a nlimii rndului AllowRowSizing . Este de tip logic. Dac are valorea .T., permite modificarea interactiv de ctre utilizator a nlimii rndului. 9 Evidenierea celulei focalizate HeighLight . Este de tip logic i determin cum este afiat celula focalizat: dac are valoarea .T., celula focalizat apare evideniat, iar dac are valoarea .F., celula focalizat nu apare evideniat. Alte proprieti se folosesc pentru a stabili aspectul fizic al elementelor specifice grilei: 9 Barele de derulare ScrollBars . Este de tip Valoare Efect ScrollBars numeric i controleaz ce bare de derulare sunt 0 Barele nu sunt afiate. afiate. Pentru valorile diferite de 0 barele de 1 Se afieaz numai barele derulare sunt afiate automat atunci cnd n spaiul pe orizontal. de afiare al grilei nu pot fi afiate toate datele din 2 Se afieaz numai barele sursa de date a grilei. Acionarea elementelor pe vertical. caracteristice ale barei de derulare sunt sesizate de 3 Se afieaz barele pe evenimentul Scrolled. Barele de derulare pot fi (implicit) orizontal i pe vertical. acionate interactiv (clic pe sgei, clic deasupra, deddesubt, la dreapta sau la stnga casetei de derulare sau glisarea casetei de derulare) sau pot fi acionate din program folosind metoda DoScroll. 9 Coloana cu marcajul nregistrrii curente RecordMark . Este de tip logic i controleaz dac este afiat coloana care conine marcajul pentru nregistrarea curent: dac are valoarea .T. (implicit), este afiat, iar dac are valoarea .F., nu este afiat. 9 Coloana cu marcajele pentru tergere DeleteMark . Este de tip logic i controleaz dac este afiat coloana care conine marcajele pentru tergere. Dac are valoarea .T. (implicit), este afiat, iar dac are valoarea .F., coloana nu este afiat. 9 Proprietile folosite pentru a caracteriza liniile folosite ca delimitatori: Modul de afiare a liniilor: GridLines - este de tip Valoare numeric. 0 Grosimea liniilor: GridLineWidth - este de tip numeric i determin grosimea n pixeli a liniilor. Culoarea liniilor: GridLineColor - este de tip numeric i reprezint codul culorii. 9 Proprietile folosite pentru a caracteriza mprirea grilei n panouri:
Efect GridLines Liniile nu sunt afiate. 1 Liniile se afieaz numai pe orizontal. 2 Liniile se afieaz numai pe vertical. 3 Liniile se afieaz pe (implicit) orizontal i pe vertical.

mprirea n panouri: Partition - este de tip numeric i controleaz dac grila este mprit sau nu n panouri. Dac are valoarea 0, grila nu este mprit n panouri, dac are valoarea diferit de 0, nseamn c grila este mprit n

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

295

panouri, iar valoarea proprietii reprezint distana dintre marginea stng a grilei i bara de divizare a grilei n panouri. Panoul activ: Panel - este de tip numeric. Dac are valoarea 0, panoul activ este n stnga, iar dac are valoarea 1 (implicit), panoul activ este n dreapta. Legtura dintre panouri: PanelLink - este de tip logic i determin dac cele dou panouri sunt legate ntre ele (dac au acelai aspect determinat de proprietile HeaderHeight, DeleteMark, GridLines,..., HeightLight, RecordMark, RowHeight, ScrollBar): dac are valoarea .T. (implicit), au acelai aspect, iar dac are valoarea .F., nu au acelai aspect. 9 Proprietile folosite pentru a caracteriza coloanele grilei: Numul de coloane: ColumnCount - este de tip numeric. Implicit are valoarea -1, care nseamn numr suficient de coloane pentru a afia cmpurile sursei de date. Referirea coloanei: Columns - este de tip vector i conine referine ctre coloanele grilei. Prima coloan afiat: LeftColumn - este de tip numeric i reprezint numrul coloanei (numrtoarea se face ncepnd de la stnga) care va fi prima afiat. De exemplu, dac proprietatea are valoarea 3, afiarea n gril va ncepe cu coloana 3, iar coloanele 1 i 2 nu vor fi afiate. Pe lng proprietile care caracterizeaz aspectul, grila mai are i proprieti specifice, prin care este caracterizat comportamentul ei: 9 Proprietile folosite pentru a caracteriza celula activ (focalizat): Poziia absolut furnizat de numrul rndului ActiveRow i de numrul coloanei ActiveColumn . Aceste proprieti sunt de tip numeric i se calculeaz fa de primul rnd, respectiv prima coloan a grilei. Sunt proprieti protejate la scriere (read-only). Aceste valori corespund parametrilor metodei ActivateCell. Poziia relativ furnizat de numrul rndului RelativeRow fa de primul rnd afiat n gril i de numrul coloanei RelativeColumn fa de prima coloan afiat n gril. Aceste proprieti sunt de tip numeric. De exemplu, dac prima coloan afiat n gril este coloana 2, iar proprietatea ActiveColumn are valoarea 5, nseamn c valoarea proprietii RelativeColumn este 3. 9 Adugarea datelor la gril este controlat cu proprietatea de tip logic AllowAddNew , care dac are valoarea .T. permite adugarea de noi rnduri la gril (dac se apas tasta se mai adaug un rnd la gril). 9 Proprietile folosite pentru a caracteriza sursa de date a grilei: Tipul sursei de date: RecordSourceType este de tip numeric i caracterizeaz ce date se vor folosi pentru a popula grila. Dac datele vor fi preluate dintr-un tabel, acesta poate fi permanent sau temporar (cusor), poate fi deja construit sau poate fi construit la iniializarea grilei (n procedura asociat evenimentului Init al grilei se poate crea un tabel folosind comanda SQL Create table). nregistrrile tabelului vor fi rndurile grilei, iar cmpurile lui vor fi coloanele grilei. Sursa de date: RecordSource este de tip ir de caractere i furnizeaz numele tabelului folosit ca surs de date sau numele aliasului cursorului sau numele fiierului de interogri.

296 Informatic
RowSourceType Semnific: 0 - Table Sursa de date este un tabel deja construit. El va fi deschis automat la iniializarea grilei (evenimentul Init). 1 - Alias (implicit) Tabelul care va fi sursa de date este specificat prin alias. 2 - Prompt Sursa de date este un tabel al crui nume va fi specificat de utilizator pin intermediul unei casete de dialog; dac este deschis o baz de date poate alege un tabel din ea. 3 - Query Sursa de date este generat dintr-un fiier de interogri (.qpr). 4 - SQL Statement Sursa de date va fi descris printr-o instruciune SQL Select de interogare a bazei de date, care va genera un tabel permanent sau temporar ce va fi afiat n gril. RowSource Numele tabelului. Aliasul tabelului. Numele tabelului.

Numele fiierului de interogri (.qpr) Instruciunea SQL

9 Proprietile folosite pentru a caracteriza grila care afieaz date dintr-un tabel al bazei de date:
Cmpul cheie: RelationalExpr este de tip caracter i precizeaz cmpul cheie care asigur legtura ntre tabelul condus i tabelul conductor i care permite reunirea celor dou tabele ntr-un singur tabel. Aliasul tabelului conductor: LinkMaster este de tip ir de caractere i furnizeaz aliasul tabelului conductor al tabelului afiat n gril. Pe lng metodele obinuite, printre care i SetAll i SetFocus, grila mai are urmtoarele metode specifice: 9 Manipularea barelor de derulare DoScroll . Prin aceast metod pemite derularea din program a coninutului grilei pentru a simula acionarea interactiv a barelor de derulare. Metoda are parametrul <n>. Apelul metodei se face cu DoScroll(<n>). Parametrul <n> determin modul n care se face derularea i poate avea urmtoarele valori: 0- derulare cu un rnd n sus, 1- derulare cu un rnd n jos, 2- derulare cu o pagin n sus, 3- derulare cu o pagin n jos, 4- derulare cu o coloan la stnga, 5- derulare cu o coloan la dreapta, 6derulare cu o pagin la stnga, 7- derulare cu cte o pagin la dreapta. 9 Activarea celulei ActiveCell . Prin aceast metod se poate schimba din program celula activ. Metoda trebuie s primeasc doi parametri: <n> - numrul rndului i <m> - numrul coloanei. Apelul metodei se face cu ActivateCell(<n>,<m>). 9 Adugarea unei coloane la gril AddColumn . Prin aceast metod se poate aduga un nou obiect Column la gril. Metoda trebuie s primeasc un parametru <n> - poziia coloanei n gril; coloanele care urmeaz dup ea sunt deplasate cu o poziie spre drepata. Apelul metodei se face cu AddColumn(<n>). 9 tergerea unei coloane din gril DeleteColumn . Prin aceast metod se poate terge un obiect Column din gril. Metoda poate primi un parametru <n> - poziia coloanei care se terge din gril, altfel se terge coloana activ (cea care conine celula activ); coloanele care urmeaz dup ea sunt deplasate cu o poziie spre stnga. Apelul metodei se face cu DeleteColumn([<n>]).

Evenimentele specifice grilei sunt declanate de:


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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

297

<nDirection> care i comunic modul n care a fost acionat bara de derulare: 0derulare cu un rnd n sus (butonul sau tasta ), 1- derulare cu un rnd n jos (butonul sau tasta ), 2- derulare cu o pagin n sus (clic pe bara vertical, deasupra casetei), 3derulare cu o pagin n jos (clic pe bara vertical, sub caset), 4- derulare cu o coloan la stnga (butonul sau tasta ), 5- derulare cu o coloan la dreapta (butonul sau tasta ), 6- derulare cu o pagin la stnga (clic pe bara orizontal, la stnga casetei), 7derulare cu o pagin la dreapta (clic pe bara orizontal, la dreapta casetei). 9 Marcarea pentru tergere a unei nregistrri Deleted . Acest eveniment este declanat fie de marcarea interactiv n gril a nregistrrii pentru tergere sau refacerea ei, fie prin marcarea pentru tergere cu comanda Delete. Procedura asociat evenimentului primete din partea acestuia parametrul <nRecNo> care i comunic numrul nregistrrii marcate pentru tergere. 9 Schimbarea celulei focalizate (fie interactiv prin deplasarea selectorului de celul cu mouse-ul sau cu tastatura, fie din program cu metoda ActivateCell): Dup mutarea focalizrii: AfterRowColChange - se produce atunci cnd utilizatorul mut focalizarea ntr-o celul dintr-o alt coloan sau un alt rnd al grilei, dup ce a fost focalizat noua celul i numai dac procedura asociat evenimentului When a obiectului din celula nou focalizat furnizeaz un rezultat .T.. Evenimentul furnizeaz un parametru care corespunde indexului coloanei sau rndului n care a fost mutat focalizarea. naintea mutrii focalizrii: BeforeRowColChange - se produce atunci cnd utilizatorul mut focalizarea ntr-o celul dintr-o alt coloan sau un alt rnd al grilei, nainte ca noua celul s primeasc focalizarea i nainte de evenimentul Valid al obiectului din celula din care se mut focalizarea.

Creai o gril pentru un tabel

Creai un formular nou. n acest formular vei crea n mod rapid o gril pentru cmpurile din tabelul agenda cu ajutorul obiectului Data Environment. Executai clic pe butonul Data Environment din bara Form Designer. Se deschide caseta de dialog Open din care alegei tabelul agenda. n fereastra Data Environment va fi afiat tabelul. Indicai titlul tabelului i l glisai n formular. Dup ce eliberai butonul mouse-ului, n formular se va crea o gril cu o structur de coloane care corespunde cmpurilor din tabel. Legendele din anteturile coloanelor vor fi numele cmpurilor. Facei urmtoarele modificri de proprieti n fereastra Properties: Pentru obiectul Grid1 modificai proprietatea AllowAddNew = .T., pentru obiectul

298 Informatic
Header1 al coloanei a cincea (controlul Column5) modificai proprietatea Caption= 'Data nasterii'.

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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

299

Name = "Header1" ReadOnly = .T. Caption = "prenume" Name = "Header1" Name = "Text1" Caption = "adresa" ReadOnly = .F. Name = "Edit1" Name = "Header1" ReadOnly = .F. Caption = "telefon" * pentru toate controalele Name = "Text1" * caseta de text: ReadOnly = .F. BorderStyle = 0 Name = "Header1" Margin = 0 Caption = "data nasterii" ForeColor = 0,0,0 Name = "Text1" BackColor = 255,255,255 ReadOnly = .F. * Butonul de comanda Name = "Header1" Name = "Command1" Caption = "varsta" Caption = "\<Termina" Name = "Text1" Default = .T. Scriei procedurile asociate evenimentelor Init al formularului i Click al butonului de nchidere (prin care se terg i nregistrrile considerate vide - fr nume pentru persoan - i cele care au fost marcate pentru tergere): procedure Init && formular delete set date to british endscan endproc pack procedure Click && Buton ThisForm.Release scan for nume=space(15) endproc Salvai formularul i-l lansai n execuie. Testai grila.

Adugai la tabel cmpul de tip numeric Copii (numrul de copii ai persoanei respective). Reluai operaia de creare a grilei folosind metoda constructorului rapid (deschidei tabelul, creai un formular nou i apsai butonul BuilderLock de pe bara Form Controls. n caseta de dialog care se deschide, n seciunea Grid gsii instrumentele necesare pentru a alege cmpurile din tabel care vor fi surs de date pentru coloanele grilei, n seciunea Style gsii instrumentele necesare pentru a alege stilul grilei, iar n seciunea Layout gsii instrumentele necesare pentru stabilirea unor proprieti pentru obiectele grilei: proprietatea Caption pentru Header, tipul controlului din lista Control type). Pentru cmpul Copii alegei un control de tip Spinner).

300 Informatic

T est pentru evaluare:


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

ncercai:

Adevrat/Fals: 1. Textul afiat n formular prin care utilizatorul poate identifica rolul controlului se pstreaz n proprietatea Name. 2. Proprietile ReadOnly i Enabled au aceeai semnificaie: controleaz accesul la un control. 3. When este un eveniment declanat naintea primirii focalizrii de ctre control. 4. Proprietatea Default este specific unui control de tip CommandButton. 5. Eticheta are proprietatea AutoSize. 6. Cmpul de editare are proprietatea WordWrap. 7. Increment este o propritatea specific unui control de tip Spinner. 8. Evenimentul UpClick este specific tuturor controalelor. 9. Obiectul Column se poate crea numai n obiectul container Grid. 10. Proprietatea Panel controleaz mprirea grilei n panouri. Completai: 1. Informaiile despre control, afiate ntr-o caset atunci cnd este indicat controlul, se pstreaz n proprietatea .............. i se poate folosi numai dac proprietatea .............. a formularului are valoarea .T.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor


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

301

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

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

3.4.4. Controale care permit utilizatorului s aleag


Multe aplicaii necesit ca utilizatorul s aleag din mai multe variante, de la o simpl alegere dintre dou opiuni Da/Nu pn la alegerea unei variante dintr-o list care conine sute de posibiliti. Varianta aleas este atribuit ca valoare nou unei variabile de memorie sau unui cmp. Controalele care permit utilizatorului s aleag sunt: Controlul Comutatorul Butoane de opiuni Lista Caseta combinat Semnificaie Permite utilizatorului s aleag din dou variante posibile: adevrat sau fals. Tipul datelor Logic

Un set de opiuni care permite utilizatorului s ir de caractere aleag numai una dintre ele. sau numere O list de variante din care utilizatorul poate s aleag una sau mai multe variante. ir de caractere sau numere

O combinaie ntre o list i o caset de text. ir de caractere Utilizatorul poate fie s aleag din list, fie s sau numere scrie alegerea n zona de editare a casetei.

302 Informatic

Comutatorul CheckBoxx
Se folosete ntr-o aplicaie pentru a permite utilizatorului s aleag din dou variante posibile, adic s comute ntre dou variante posibile. ntr-un formular, comutatoarele sunt independente unele de altele. De obicei, legenda comutatorului afieaz numele comutatorului care corespunde datei a crui valoare va fi stabilit de utilizator. Proprietatea de aliniere a comutatorului (Alignment) se refer la modul de aranjare a legendei fa de comutator (la dreapta - 1 sau la stnga - 0). Metoda de acionare a unui comutator este la fel ca i la butoanele de comnad: Click. Astfel, procedura asociat evenimentului Click trebuie s asigure trecerea comutatorului dintr-o stare n alta i de a atribui proprietii Value valoarea corespunztoare noii stri. Valoarea unui comutator poate fi de tip logic sau numeric:.F. sau 0, dac este dezactivat, .T. sau 1, dac este activat i NULL sau 2, dac nu este disponibil. Stilul de reprezentare a comutatorului poate fi stabilit cu proprietatea Style. Dac proprietatea are valoarea 0 - Standard (implicit), controlul este reprezentat grafic printr-o caset pentru care, dac are n interior semnul de validare, valoarea controlului este .T., iar dac nu are semnul de validare are valoarea .F.. De aceea se mai numete i caset de validare. Dac proprietatea are valoarea 1 - Graphic, controlul este reprezentat ca un buton de comand: n interiorul su este afiat o imagine care poate fi nsoit de text (textul va fi scris centrat, sub imagine). Pentru acest stil de reprezentare trebuie folosit proprietatea DownPicture prin care se stabilete aspectul comutatorului cnd este activat. Se recomand folosirea acestui tip de reprezentare n barele cu instrumente. n proprietatea Value se memoreaz 0 sau 1 dac proprietatea ControlSource este tip numeric sau .T. sau .F. dac proprietatea ControlSource este de tip logic.

Creai un comutator folosind metoda programrii clasice n caseta de dialog Test se folosete comutatorul Afisare patrat pentru a controla afiarea unei forme de tip ptrat. Scriei pogramul surs:

F1 = CreateObject('Form') F1.Closable = .F. F1.Caption='Test' F1.Height=200 F1.BackColor = RGB(200,200,200) F1.AddObject('B1','Buton') F1.AddObject('C1','Comutator') F1.AddObject('P1','Patrat') F1.B1.Visible =.T. F1.C1.Value=.F. F1.C1.Visible = .T.

F1.C1.BackStyle = 0 F1.C1.Click F1.Show Read events Define class Comutator asB; CheckBox Alignment=1 Top = 40 Left = 10 Height = 25

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor Width = 130 Cancel = .T. FontSize=12 Left = 125 Caption = "\<Afisare patrat" Top = 150 Procedure Click Height = 25 ThisForm.P1.Visible =; Procedure Click !ThisForm.P1.Visible ThisForm.Release ThisForm.CurrentX=55 Clear events ThisForm.CurrentY=100 Enddefine If This.Value Define class Patrat as Shape ThisForm.Print("Patrat") Top = 30 else Left = 220 ThisForm.Print(space(12)) Width = 100 endif Height = 100 Enddefine Curvature = 0 Define class Buton as; BackColor = RGB(100,100,100) CommandButton FillStyle=7 Caption = '\<Terminarea' Enddefine Scriei pogramul. Lansai programul n execuie i testai comutatorul.

303

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

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

304 Informatic
procedure Init &&Check1 ThisForm.Print("Patrat") ThisForm.Check1.Value=.T. else endproc ThisForm.Print(space(12)) procedure Click &&Check1 endif ThisForm.Shape1.Visible=; endproc !ThisForm.Shape1.Visible procedure Click &&Buton ThisForm.CurrentX=55 ThisForm.Release ThisForm.CurrentY=100 endproc if ThisForm.Check1.Value Salvai formularul. l lansai n execuie i-l testai.
Adugai la tabelul Agenda cmpul de tip logic Are_copii (are valoarea adevrat dac persoana respectiv are copii). Reluai operaia de creare a grilei folosind metoda constructorului rapid. Pentru cmpul Are_copii alegei un control de tip CheckBox).

Butonul de opiune OptionButtonx i grupul de butoane de opiuni OptionGroupx


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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

305

9 Apsai tastele de acces la buton (tasta Alt mpreun cu tasta literei de identificare).
Pentru administrarea butoanelor din grup putei folosi proprietile specifice grupului de butoane radio: 9 Numrul de butoane din grup ButtonCount . Este de tip numeric. 9 Butoanele Buttons . Este de tip vector i poate fi folosit pentru referirea butoanelor din grup. Putei folosi metoda SetAll pentru a atribui aceeai valoare a unei proprieti tuturor butoanelor din grup. Sintaxa de apelare a metodei este: SetAll('<proprietate>',<valoare>). Evenimentul Click asociat grupului de butoane radio va atribui datei valoarea asociat butonului selectat.

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

dimension a(3) a(1)='Cerc ' a(2)='Elipsa ' a(3)='Patrat ' F1 = CreateObject('Form') F1.Closable = .F. F1.FontSize=14 F1.Caption='Test' F1.BackColor = RGB(200,200,200) F1.AddObject('B1','Buton') F1.AddObject('GO1','GrupOpt') F1.AddObject('C1','Cerc') F1.AddObject('E1','Elipsa') F1.AddObject('P1','Patrat') F1.AddObject('L1','Label')

F1.B1.Visible =.T. F1.L1.Caption = 'Afisare' F1.L1.AutoSize = .T. F1.L1.Top=20 F1.L1.Left=20 F1.L1.BackStyle=0 F1.L1.Visible =.T. F1.GO1.Buttons(1).Caption=; "\<Cerc" F1.GO1.Buttons(2).Caption=; "\<Elipsa" F1.GO1.Buttons(3).Caption=; "\<Patrat" F1.GO1.SetAll("Width", 100) F1.GO1.SetAll("Left", 10)

306 Informatic
F1.GO1.SetAll("BackStyle", 0) F1.GO1.SetAll("FontSize", 12) F1.GO1.Visible = .T. F1.GO1.BackStyle = 0 F1.GO1.Click F1.Show Read events Define class GrupOpt as; OptionGroup ButtonCount = 3 Top = 40 Left = 20 Height = 80 Width = 100 Procedure Click ThisForm.C1.Visible = .F. ThisForm.E1.Visible = .F. ThisForm.P1.Visible = .F. do case case ThisForm.GO1.Value=1 ThisForm.C1.Visible =.T. case ThisForm.GO1.Value = 2 ThisForm.E1.Visible = .T. case ThisForm.GO1.Value = 3 ThisForm.P1.Visible = .T. endcase ThisForm.CurrentX=20 ThisForm.CurrentY=150 ThisForm.Print; (a(ThisForm.GO1.Value)) Enddefine Define class Buton as; CommandButton Caption = '\<Terminarea' Cancel = .T. Left = 125 Top = 200 Height = 25 Procedure Click ThisForm.Release clear events enddefine Define class Cerc as shape Top = 30 Left = 200 Width = 100 Height = 100 Curvature = 99 BackColor = RGB(200,200,200) FillStyle=4 Enddefine Define class Elipsa as shape Top = 30 Left = 200 Width = 120 Height = 80 Curvature = 99 BackColor = RGB(150,150,150) FillStyle=5 Enddefine Define class Patrat as shape Top = 30 Left = 200 Width = 100 Height = 100 Curvature = 0 BackColor = RGB(100,100,100) FillStyle=7 Enddefine

Creai un grup de butoane cu opiuni folosind metoda vizual

Creai un formular n care definii apoi o legend pentru grupul de butoane de opiuni, un grup de butoane de opiuni cu trei butoane, trei forme care se vor suprapune n formular i un buton. Stabilii proprietile formularului i ale controalelor din formular: * Formular AutoSize = .T. Name = "Form1" BackStyle = 0 BackColor = 200,200,200 Caption = "Afisare" Caption = "Test" * Grupul de optiuni Closable = .F. Name = "Optiongroup1" FontSize = 14 AutoSize = .T. * Eticheta grupului ButtonCount = 3 Name = "Label1" BackStyle = 0

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

307

Value = 1 BackColor = 150,150,150 Option1.Name = "Option1" Curvature = 90 Option1.Caption = "\<Cerc" FillStyle = 5 Option2.Name = "Option2" Height = 80 Option2.Caption = "\<Elipsa" Left = 195 Option3.Name = "Option3" Top = 24 Option3.Caption = "\<Patrat" Width = 120 * Formele Name = "Shape3" Name = "Shape1" BackColor = 100,100,100 BackColor = 200,200,200 FillStyle = 7 Curvature = 99 Height = 120 FillStyle = 4 Left = 195 Height = 120 Top = 24 Left = 195 Width = 120 Top = 24 Name = "Command1" Width = 120 Cancel = .T. Name = "Shape2" Caption = "\<Terminare" Scriei procedurile asociate evenimentelor Init al formularului, Init i Click ale grupului de butoane de opiuni i Click al butonului de comenzi: procedure Init &&Formular ThisForm.Optiongroup1.Value=1 ThisForm.Shape1.Visible=.T. ThisForm.Shape2.Visible=.F. ThisForm.Shape3.Visible=.F. endproc procedure Init &&Grup optiuni public a dimension a(3) a(1)='Cerc ' a(2)='Elipsa ' a(3)='Patrat ' ThisForm.Optiongroup1.SetAll("Width",100) ThisForm.Optiongroup1.SetAll("Left",100) ThisForm.Optiongroup1.SetAll("BackStyle",0) ThisForm.Optiongroup1.SetAll("FontSize",12) endproc procedure Click &&Grup optiuni ThisForm.Shape1.Visible = .F. ThisForm.Shape2.Visible = .F. ThisForm.Shape3.Visible = .F. do case case ThisForm.Optiongroup1.Value=1 ThisForm.Shape1.Visible=.T. case ThisForm.Optiongroup1.Value=2 ThisForm.Shape2.Visible =.T. case ThisForm.Optiongroup1.Value=3 ThisForm.Shape3.Visible =.T. endcase ThisForm.CurrentX=20 ThisForm.CurrentY=150 ThisForm.Print(a(ThisForm.Optiongroup1.Value))

308 Informatic
endproc procedure Click &&Buton ThisForm.Release endproc Salvai formularul, l lansai n execuie i-l testai.
Creai un grup de butoane cu opiuni folosind Option Group Builder Creai acelai grup de butoane radio folosind acest constructor rapid. Creai obiectul de tip grup de butoane de opiuni, l selectai i deschidei caseta de dialog a constructorului rapid cu opiunea Builder a meniului de comenzi rapide al controlului. Caseta de dialog conine trei seciuni: Buttons pentru stabilirea butoanelor (numr, tip, etichete), Layout pentru stabilirea aspectului controlului (modul n care vor fi afiate butoanele - pe orizontal sau vertical, dimensiunea spaiului care separ butoanele, stilul bordurii) i Value pentru stabilirea cmpului dintr-un tabel n care se va memora valoarea asociat controlului.

Lista ListBoxx i caseta combinat ComboBoxx


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

Lista ListBoxx afieaz colecia de valori din care utilizatorul poate s aleag sub forma unei liste de articole ntr-o caset, afiate pe vertical, pe o singur coloan sau pe mai multe coloane (liste multicoloan). n cazul listei multicoloan un articol din list conine mai multe coloane cu valori. Dac numrul de articole din colecie depete capacitatea de afiare a casetei, apar automat barele de derulare. Articolele listei pot s fie derulate numai pe vertical. Caseta combinat ComboBox este un control care combin o caset de text cu o list permind utilizatorului s aleag dintr-o colecie de valori. Aceste valori sunt afiate n list i utilizatorul poate fie s aleag un articol din list, fie s scrie valoarea de la tastatur n caseta de text. Fa de list, caseta combinat are i proprietatea stil Style . Proprietatea este de tip numeric i poate lua valorile: 0 - Drop-down Combo, adic o caset derulant combinat care conine o list derulant i o caset de text i 1 -

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

309

Drop-down List, adic o list derulant, care conine numai o list derulant (se mai numete i list ascuns). Aadar, folosind aceste tipuri de controale putei obine urmtoarele tipuri de liste: 9 Lista simpl (List). Afieaz pe ecran mai multe articole (nu neaprat toate articolele). Se obine cu controlul ListBox . 9 Lista ascuns sau lista derulant (Drop-down List). Afieaz pe ecran numai articolul curent selectat din list (ascunde restul articoleleor). Pentru a avea acces i la alte elemente, lista trebuie deschis. n urma operaiei de deschidere, lista este expandat (se deruleaz coninutul), iar utilizatorul are acces la mai multe articole (nu neaprat toate). Se obine cu controlul ComboBox avnd proprietatea Style=1. 9 Caseta derulant combinat (Drop-down List). Combin o list ascuns cu o caset de text. Afieaz pe ecran numai elementul curent selectat din list. Pentru a avea acces i la alte elemente lista trebuie deschis. n urma operaiei de deschidere, lista este expandat (sunt afiate mai multe articole, nu neaprat toate) i se activeaz caseta de text. Utilizatorul fie poate alege un articol din list, fie scrie valoarea n caseta de text. Se obine cu controlul ComboBox avnd proprietatea Style=0. Identificarea articolelor din list Articolele listei pot fi precizate, nainte de executarea listei (liste statice), la fel ca i n cazul butoanelor radio, prin precizarea sursei de date n momentul proiectrii i citirea sursei de date a listei n momentul execuiei, dar pot fi stabilite i n timpul execuiei (liste dinamice), prin adugarea i nlturarea unor articole din list. n timpul execuiei, articolele listei sunt pstrate n memoria intern sub forma unui tablou de memorie. Dac lista are o singur coloan, tabloul va fi de tip vector cu elemente de tip ir de caractere, iar dac are mai multe coloane, va fi de tip matrice. Fiecare element al vectorului, respectiv fiecare rnd al matricei reprezint un articol din list. Articolele listei pot fi aranjate n ordine alfabetic (sortate) sau nu. Fiecrui articol din list i se atribuie, la crearea listei sau la adugarea lui la list, dou co-duri numerice pentru identificare: 9 Indexul (Index) Reprezint poziia articolului n list la un moment dat. Operaiile de reordonare a listei, de tergere sau de adugare a unui articol au ca efect shimbarea poziiei articolului n list. n acest caz se modific i indexul articolelor, pentru a reflecta noua situaie. 9 Codul de identificare (ItemID). Reprezint un cod numeric unic asociat articolului care nu se modific pe toat perioada existenei articolului n list (nu se modific la schimbarea poziiei articolului n list). De obicei, acest cod este indexul iniial al articolului (atribuit articolului la adugarea lui la list). Numele proprietilor care folosesc acest cod pentru identificarea unui articol n list conin cuvntul cheie ID. Pentru conversia celor dou coduri numerice se pot folosi metodele: ItemIDToIndex - furnizeaz codul asociat al unui articol specificat prin index. IndexToItemID - furnizeaz indexul unui articol specificat prin codul asociat. De exemplu, dac ntr-o list identificat prin numele Lista articolul din poziia 5 are codul 20, apelarea metodei Lista.IndexToItemID(5) va furniza numrul 20, iar apelarea metodei Lista.IndexToItemID(20) va furniza numrul 5.

310 Informatic
Selectarea articolelor din list A selecta un articol din list, nseamn a atribui proprietii Value a obiectului de tip list valoarea articolului selctat. Dac lista este de tip multicoloan, proprietii Value a listei i se va atribui numai una dintre valoarile afiate n coloanele articolului. Selectarea unui articol din list se poate face fie cu mouse-ul (se execut clic pe articol), fie de la tastatur (se deplaseaz selectorul pe articol cu tastele i i se confirm alegerea apsnd tasta Enter). Dac lista este ascuns, n prealabil ea trebuie deschis fie cu mouse-ul (se execut clic pe butonul cu sgeat din partea dreapt), fie de la tastatur (se apas tastele Alt+). Mecanismul implementat pentru listele Visual FoxPro permite selectarea unui grup de articole din list. Aceast metod de selectare multipl este util atunci cnd dorii s executai operaii cu un grup de articole din list: s copiai, s mutai sau s tergei un grup de articole dintr-o list n alta (de exemplu s copiai, s mutai sau s tergei un grup de fiiere), s efectuai calcule cu un grup de articole etc. Pentru a avea evidena articolelor selectate, lista are asociat un vector cu valori logice de aceeai lungime ca i vectorul list. Fiecare element al vectorului descrie starea unui articol din list: dac are valoarea adevrat, articolul este selectat, iar dac are valoarea fals, nu este selectat. Selectarea unui grup de articole din list se face prin selectarea fiecrui articol fie cu mouse-ul (se execut clic pe articol cu tasta Shift sau Ctrl apsat), fie cu tastatura (se deplaseaz selectorul pe articol cu tastele i i se confirm alegerea apsnd tasta Shift sau Ctrl mpreun cu tasta Space). Tasta Shift se folosete atunci cnd grupul de articole selectat formeaz un bloc continuu n list, iar tasta Ctrl atunci cnd articolele sunt dispersate n list. Pentru anularea selectrii unui articol din grup se procedeaz la fel ca i la selectarea lui. Dac lista permite selectarea unui grup de articole, proprietii Value a listei i se va atribui valoarea ultimului articol selectat (chiar dac ntre timp i s-a anulat selectarea, dar dup el nu a mai fost selectat un alt articol din list). Lista poate s permit sau nu selectarea unui grup de articole. De exemplu, dac lista conine fiiere care pot fi deschise, se va putea selecta un singur fiier, iar dac lista conine documente care pot fi copiate sau mutate, se vor putea selecta mai multe documente. Proprietile specifice listei sunt: 9 Proprietile folosite pentru a controla culoarea de afiare a articolelor i a listei: Lista nu este disponibil: DisabledBackColor - pentru fundal i DisabledForeColor - pentru text. Chenarul listei: BorderColor - pentru fundal i DisabledItemForeColor - pentru text. Articolele din list (care nu au fost selectate): ItemBackColor - pentru fundal i ItemForeColor - pentru text. Articolele selectate din list: SelectedItemBackColor - pentru fundal i SelectedItemForeColor - pentru text. Articolele din list care nu sunt disponibile: DisabledItemBackColor - pentru fundal i DisabledItemForeColor - pentru text.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor 9 Sursa de date a listei:

311

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

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

312 Informatic
Identificatorul articolului selectat este furnizat de proprietile: ListIndex - care se folosete mpreun cu proprietatea List (dac are valoarea 0, nu este selectat un articol, iar dac are o valoare cuprins ntre 1 i ListCount reprezint poziia curent a articolului selectat) i ListItemID - care se folosete mpreun cu proprietatea ListItem (dac are valoarea -1, nu este selectat un articol, iar dac are o valoare pozitiv reprezint codul de identificare al articolului selectat). Ambele sunt de tip numeric. De exemplu, pentru a face referire la articolul selectat n lista Lista se poate folosi Lista.List(Lista.ListIndex), dar i Lista.ListItem(Lista.ListIItemID). Vectorul cu indeci asociat listei poate fi folosit de programator pentru a atribui intern coduri speciale articolelor listei. Fiecare element al vectorului conine un cod special asociat unui articol din list, diferit de codul de identificare. Dimensiunea vectorului este egal cu numrul de elemente, respectiv cu numrul de rnduri ale tabloului asociat listei. Vectorul este furnizat de proprietile: ItemData - vector n care identificarea articolului se face prin poziia n list i ItemIDData - vector n care identificarea articolului se face prin codul de identificare. De exemplu, n listaLista se obine codul special asociat articolului focalizat cu Lista.ItemData(Lista.ListIndex). Codul special asociat poate fi folosit pentru a identifica un articol din list: poziia n list a unui articol cu codul special asociat cu valoarea12345 se poate afla cu Lista.ItemIDData(12345). 9 Ordonarea articolelor n list este controlat cu urmtoarele proprieti: Autosortarea: Sorted - este de tip logic i controleaz modul n care sunt afiate articolele din list. Dac are valoarea .T., articolele din list sunt automat ordonate alfabetic, inndu-se cont de diferena dintre literele mari i mici. Dac are valoarea .F. (implicit), articolele din list sunt afiate n ordinea natural, ordinea n care au fost adugate la creare sau n care au fost preluate dintr-o surs de date. Proprietatea este disponibil numai pentru valorile 0 i 1 ale proprietii RowSourceType. Ordonarea manual: MoveBars - este de tip logic i controleaz dac articolele pot fi aranjate manual n list. Dac are valoarea .T., este afiat bara de mutare care permite executarea interactiv a operaiei de mutare a articolelor n list. Dac are valoarea .F. (implicit), bara nu este afiat. Pentru a muta un articol n list se poate folosi fie tastatura (se selecteaz articolul i apoi cu tastat Ctrl apsat se deplaseaz articolul n noua poziie cu tastele i ), fie mouse-ul (pe bara de mutare se gliseaz butonul din dreptul articolului pe care vrei s-l mutai n noua poziie). Proprietatea este specific numai controlului ListBox. 9 Cutarea asistat: IncrementalSearch - este de tip logic i controleaz dac se poate folosi metoda de cutare asistat pentru gsirea unui articol n list. Dac are valoarea .T., se folosete cutarea asistat, iar dac are valoarea .F., nu este activat aceast facilitate. Cutarea asistat nseamn c atunci cnd este apsat o tast, sistemul interpreteaz aceast tast ca fiind primul caracter al textului afiat de articolul cutat i deruleaz lista astfel nct s fie afiat n list primul articol care ndeplinete aceast condiie. Dac se mai apas o tast, aceasta este interpretat ca fiind al doilea caracter al textului afiat de articolul cutat i deruleaz lista astfel nct s fie afiat n list primul articol care afieaz un text care ncepe cu cele dou caractere .a.m.d. Este util s activai aceast facilitate dac lista are dimensiuni mari. 9 Primul articol vizibil din list: TopIndex - furnizeaz poziia curent a primului articol afiat n partea vizibil a listei i TopItemID - furnizeaz codul de identificare a

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

313

primului articol afiat n partea vizibil a listei. Aceste proprieti se pot folosi pentru a afla dac un articol se gsete n zona vizibil a listei sau pentru a schimba articolele afiate n partea vizibil a listei. 9 Ultimul articol adugat la list: NewIndex - furnizeaz poziia curent a ultimului articol adugat la list i NewItemID - furnizeaz codul de identificare a ultimului articol adugat la list. 9 Proprieti specifice listelor care au ca surs de date tablouri de memorie prin care se controleaz intervalul de elemente din tablou care sunt preluate n list (valabil numai pentru RowSourceType=5). Proprietile sunt de tip numeric i determin intervalul de elemente, respectiv de rnduri care vor fi folosite ca surs de date, altfel vor fi folosite toate elementele, respectiv toate rndurile din tabloul. Primul element: FirstElement - primul element, respectiv primul rnd al intervalului. Implicit are valoarea 1 (primul element, respectiv primul rnd al tabloului). Numrul de elemente: NumberOfElements - numrul de elemente, respectiv de rnduri preluate din sursa de date ncepnd cu primul element al intervalului. Implicit are valoarea corespunztoare numrului de elemente, respectiv de rnduri ale tabloului. 9 Proprieti specifice selectrii multiple: Selectarea multipl: MultipleSelect - este de tip numeric i controleaz dac este permis (valoarea 1) sau nu (valoarea 0 - implicit) selectarea mai multor articole n list. Evidena articolelor selectate este furnizat de proprietile Selected i SelectedID . Ambele proprieti sunt de tip vector cu elemente de tip logic i conin attea elemente cte articole sunt n list. Fiecare element din vector reprezint starea unui articol: dac are valoarea .T., articolul este selectat, iar dac are valoarea .F., articolul nu este selectat. Cei doi vectori se deosebesc dup modul n care se face identificarea articolelor: dup poziia curent, respectiv dup codul de identificare. De exemplu, dac vrei s aflai dac n lista Lista a fost selectat al treilea articol din list, aflai valoarea proprietii Lista.Selected(3), iar dac vrei s aflai dac articolul cu codul de identificare 10 a fost selectat, aflai valoarea proprietii Lista.SelectedID(10). Aceste proprieti pot fi folosite pentru a selecta un articol sau pentru a anula selectarea unui articol din program. De exemplu, dac vrei s selectai al treilea articol n lista Lista, atribuii valoarea corespunztoare proprietii: Lista.Selected(3)=.T., iar dac vrei s anulai selectarea pentru articolul cu codul de identificare 10, atribuii valoarea corespunztoare proprietii: Lista.SelectedID(10)=.F.. 9 Proprieti specifice listelor cu mai multe coloane: Numrul de coloane: ColumnCount - este de tip numeric; dac are valoarea 0, nu se afieaz coloane. Limea coloanelor: ColumnWidth - este de o list de numere, separate prin virgul; fiecare numr reprezint limea unei coloane. De exemplu, n lista Lista Lista.ColumnCount=3 i Lista.ColumnWidth='5,7,9' Afiarea liniilor separatoare ntre coloane: ColumnLines - este de tip logic (dac are valoarea .T. - implicit - ntre coloane vor fi afiate linii separatoare, altfel liniile de separare sunt invizibile).

314 Informatic
Coloana preluat de proprietatea Value a controlului: BoundColumn - este de tip numeric i reprezint numrul coloanei al crui text va fi preluat de proprietatea Value. Implicit se preia textul din prima coloan. Textul din prima coloan este preluat de proprietatea DisplayValue - este de tip ir de caratere. Proprietatea este util atunci cnd n proprietatea Value este preluat textul articolului dintr-o alt coloan. Metodele specifice listei sunt: 9 Adugarea unui articol la list: AddItem i AddItemList . Metodelor trebuie s li se comunice textul afiat de articol (<text>), poziia n care va fi adugat (<n>) pentru AddItem, respectiv codul de identificare atribuit pentru AddItemList i numrul coloanei (<n>) n cazul unor liste cu coloane: AddItem('<text>'[,<n>[,<c>]])). Dac poziia precizat este valid, articolul va fi inserat n poziia precizat. Dac nu este precizat poziia, articolul va fi inserat n poziia corespunztoare dac lista este sortat, iar dac nu este sortat, va fi adugat la sfritul listei. Dac lista are mai multe coloane i nu se precizeaz coloana, se va considera coloana 1. Aceste metode se pot folosi numai pentru listele a cror surs de date nu este precizat (RowSourceType=0). 9 nlturarea unui articol din list: RemoveItem i RemoveItemList . Metodelor trebuie s li se comunice indexul articolului nlturat , respectiv codul de identificare al articolului. De exemplu, apelul metodei RemoveItem(5) nltur din list articolul din poziia a cincea. 9 tergerea coninutului unei liste: Clear . 9 Remprosptarea listei: Requery . Acest metod trebuie s fie apelat dup orice modificare a sursei de date. Prin aceast metod este recitit sursa de date a listei. Metoda este similar metodei Refresh.

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

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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

315

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

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

316 Informatic
a(3)='Verde' a(4)='Galben' a(5)='Albastru' a(6)='Magenta' a(7)='Cian' a(8)='Alb' ThisForm.Combo1.ListIndex = 8 ThisForm.Shape1.BackColor=rgb(255,255,255) ThisForm.Shape1.Visible=.T. endproc Formularului i vom aduga o metod pentru calculul codului de culoare corespunztor culorii din list. Metoda se numete Culoarea i folosete o matrice b cu 8 linii i 3 coloane pentru a calcula ponderea celor trei culori de baz: coloana 1 - ponderea pentru rou, coloana 2 - ponderea pentru verde i coloana 3 ponderea pentru albastru care corespund parametrilor funciei Rgb(). De exemplu, culoarea galben este determinat de valorile din cea de a patra linie a matricei i, deoarece codul ei este dat de funcia Rgb(255,255,0), conform tabelului prezentat anterior, elementele de pe linia a patra vor avea valoarea: b(4,1)=1, b(4,2)=1 i b(4,3)=0. Pentru constru-irea acestei metode folosii opiunea de meniu New Method... Form. n caseta de dialog scriei numele metodei Culoarea. Numele metodei va fi adugat la lista de metode a formularului. Alegei din lista afiat n seciunea Method a ferestrei de proprieti a formularului opiunea Culoarea. Se va deschide fereastra pentru cod. Scriei procedura asociat metodei: procedure culoarea && Formular b(i,j)=k%2 parameters n k=int(k/2) dimension b(8,3) enddo store 0 to b endfor for i=1 to 8 cod=rgb(b(n,1)*255,b(n,2)*255,; k=i-1 b(n,3)*255) j=0 return cod do while k <>0 endproc j=j+1 Scriei procedura asociat evenimentului Click al listei: procedure Click && Lista ThisForm.Shape1.BackColor =; ThisForm.Culoarea(ThisForm.Combo1.ListIndex) endproc
Creai o list cu mai multe coloane Lista va avea dou coloane corespunztoare cmpurilor nume i prenume din tabelul agenda. La alegerea unui articol din list, n formular se va afia numrul de telefon (se alege ca obiect eticheta) i a-dresa persoanei (se alege ca obiect zona de editare). Creai un fiier index (dup cmpurile nume i prenume pentru tabelul agenda.

Creai un formular nou. Adugai n formular patru etichete, o zon de edita-re, un buton declanator i o list (butonul ListBox de pe bara Form Controls). Stabilii proprietile formularului i ale obiectelor din formular:

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor * formularul Name = "Form1" BackColor = 200,200,200 Caption = "Test" Closable = .F. FontSize = 14 * eticheta folosita pentru * legenda listei Name = "Label1" Caption = "Alegeti:" * etichete folosite pentru * informare Name = "Label2" Caption = "Telefon" Name = "Label4" Caption = "Adresa" * eticheta folosita pentru afi* sarea numarului de telefon Name = "Label3" Caption = "" * pentru toate etichetele: AutoSize = .T. BackStyle = 0 * zona de editare Name = "Edit1" BackStyle = 0 Enabled = .T. ReadOnly = .T. * buton de comanda Name = "Command1" Cancel = .T. Caption = "\<Terminare" * Lista Name = "List1" BoundColumn = 2 ColumnCount = 2 ColumnWidths = "70,70" RowSourceType = 2 RowSource = "agenda" ColumnLines = .F. Height = 97 Left = 24 Top = 60 Width = 170

317

Scriei procedurile asociate evenimentelor Load, Init i Unload ale formularului n care deschidei i nchidei tabelul, evnimentului Click al butonului de comand i procedura Click a listei: procedure Load && Formular use agenda index agenda endproc procedure Init && Formular goto top ThisForm.List1.ListIndex = 1 locate for agenda.nume=ThisForm.List1.DisplayValue and; agenda.prenume=ThisForm.List1.Value ThisForm.Label3.Caption=agenda.telefon ThisForm.Edit1.Value=agenda.adresa endproc

318 Informatic
procedure Unload && Formular use endproc procedure Click && Buton ThisForm.Release endproc procedure Click &&Lista goto top locate for agenda.nume=ThisForm.List1.DisplayValue and; agenda.prenume=ThisForm.List1.Value ThisForm.Label3.Caption=agenda.telefon ThisForm.Edit1.Value=agenda.adresa endproc Salvai formularul, l lansai n execuie i-l testai.
Creai o list dinamic cu selecie multipl Creai un formular care conine dou liste. ntr-o list vor fi afiate fiierele de tip program din directorul curent (*.prg). Din aceast list vei selecta un grup de fiiere care vor fi adugate la cea de a doua list. Cea de a doua list este o list dinamic (se creeaz dinamic n timpul execuiei formularului). Pentru lucrul cu cele dou liste vor fi folosite dou butoane: unul pentru adugare la cea de a doua list a fiierelor selectate n prima list i unul pentru anularea selectrii unor fiiere din a doua list. Ambele liste permit selecie multipl. Dup ce ai selectat grupul de fiiere, acionai cel de al treilea buton, butonul de terminare care va declana operaia de copiere a fiierelor n directorul Test din rdcina discului C.

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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

319

* Listele MultiSelect = .T. Name = "List1" * Butoanele BoundColumn = 1 Name = "Command1" RowSourceType = 7 Cancel = .T. RowSource = "*.prg" Caption = "\<Terminare" MultiSelect = .T. Name = "Command2" Name = "List2" Caption = "\<Selecteaza>>>" BoundColumn = 1 Name = "Command3" RowSourceType = 0 Caption="<<<\<Anuleaza selectare" RowSource = "" Scriei procedurile asociate evenimentelor Click ale celor trei butoane: procedure Click && Buton1 for i=1 to ThisForm.List2.Listcount numef=ThisForm.List2.List(i) copy file &numef to c:\test endfor ThisForm.Release endproc procedure Click && Buton2 for i=1 to ThisForm.List1.Listcount if ThisForm.List1.Selected(i) ThisForm.List2.AddItem(ThisForm.List1.List(i)) endif endfor ThisForm.List1.Requery ThisForm.List2.Requery endproc procedure Click && Buton3 for i=1 to ThisForm.List2.Listcount if ThisForm.List2.Selected(i) ThisForm.List2.RemoveItem(i) endif endfor ThisForm.List1.Requery ThisForm.List2.Requery endproc Salvai formularul, l lansai n execuie i-l testai.

T est pentru evaluare:


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

320 Informatic
2. Creai un tabel pentru reeta unui preparat gastronomic cu urmtoarea structur: ingredient, unitate de msur, cantitate. Creai un tabel cu un singur cmp n care memorai ingredintele care pot fi folosite pentru prepararea lui. Creai un formular pentru introducerea datelor n tabel, care va conine o list pentru selectarea ingredientelor, un grup de butoane radio pentru alegerea unitii de msur, o caset de text pentru comunicarea cantitii i un buton pentru terminare. 3. Din tabelul cu elevii clasei nscrii la diferite echipe, creai un formular prin care s extragei numai elevii care fac parte din echipa de baschet. Formularul va conine o list cu dou coloane cu elevii din clas i va permite crearea unei liste dinamice cu elevii din echipa de baschet, prin selectarea lor din lista surs.

ncercai:

Adevrat/Fals: 1. Cu metoda SetAll putei selecta toate articolele dintr-o list. 2. Identificarea unui articol selectat n list se face cu proprietatea ListIndex. 3. Proprietatea Value a unui comutator memoreaz starea comutatorului. 4. Proprietatea Value a unui comutator poate fi de tip numeric. 5. Grupul de butoane radio are proprietatea AutoSize. Completai: 1. Pentru a atribui aceeai valoare unei proprieti pentru toate butoanele dintr-un grup de butoane radio folosii metoda ............... 2. Creai o list ascuns cu controlul ............... cu valorea .... a proprietii Style. 3. Remprosptarea listei se face cu metoda ........................ 4. IncrementalSearch este o proprietate specific unui control de tip .............. 5. Numrul de articole din list se pstreaz n proprietatea .................... Alegei rspunsurile corecte: 1. Tabloul de memorie n care se pstreaz articolele listei n ordinea poziiei lor curente se memoreaz n proprietatea: a) List b) ListItem c) ListIndex 2. FirstElement este o proprietate a listei care folosete ca surs de date: a) lista cu nume de cmpuri b) tabloul de memorie c) lista de valori 3. Articolele selectate dintr-o list cu selecie multipl se pstreaz ntr-un vector n proprietatea: a) MultipleSelect b) Selected c) ListItemID spunsuri: R Adevrat/Fals: 1-F; 2-A; 3-A; 4-A; 5-A.
Completai: 1-SetAll; 2-ComboBox,1; 3-Requery; 4-list; 5- ListCount; 6- Column; 7-Header; 8Bound. Alegei rspunsurile corecte: 1-a; 2-b; 3- b.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

321

3.4.5. Alte controale i obiecte Bara cu instrumente ToolBarx


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

322 Informatic
tatatea logic AutoSize pentru a determina dac se redimensioneaz automat cadrul containerului atunci cnd se adaug obiecte noi. Pe lng metodele specifice unui formular (Refresh, Show, Move, Hide etc.), obiectul ToolBox are urmtoarele metode specifice : 9 Ancorarea barei: Dock ancoreaz bara la una dintre marginile ferestrei. Apelul metodei se face prin Dock([<poziie>[,<x>,<y>]]), unde parametrul reprezint marginea ferestrei de care va fi ancorat i poate lua aceleai valori ca i proprietatea DockPosition, iar <x> i <y> reprezint coordonatele poziiei barei ancorate. 9 Transformarea barei fixe n bar mobil cu metoda Move . Dac apelai aceast metod atunci cnd bara este ancorat, ea va deveni mobil. Pe lng evenimentele specifice unui formular, obiectul ToolBox rspunde la urmtoarele evenimente specifice : 9 Dup ancorarea barei: AfterDock este declanat dup ce a fost ancorat bara. 9 nainte de ancorarea barei: BeforeDock este declanat fie interactiv, prin glisarea barei de ctre utilizator pentru a fi ancorat, fie din program prin apelarea metodei Dock. Procedura asociat acestui eveniment primete parametrul nLocation care reprezint poziia n care va fi ancorat bara (aceleai valori ca i proprietatea DockPosition). nainte ca bara s fie redesenat n poziia de ancorare, n procedura asociat acestui eveniment se pot scrie instruciuni prin care s fie modificat aspectul barei (de exemplu, s se nlocuiasc un control cu un alt control). 9 Anularea ancorrii barei: Undock este declanat fie interactiv, prin glisarea barei de ctre utilizator din poziia n care a fost ancorat, fie din program prin apelarea metodei Move.

Creai o bar de instrumente pe ecran

Butoanele din bar au efect de comutator.

Bara cu instrumente va conine trei controale Atunci cnd sunt activate, determin scrierea pe ecran cu caractere cu stilul respectiv. pentru stabilirea stilului n care va fi scris Atunci cnd un buton este activat, textul textul pe ecran: ngroat (butonul Italic), legendei sale este scris cu acel stil. nclinat i subliniat (butonul Underline). Aceste butoane au efect de comutator. Executnd clic pe ele, proprietatea care corespunde stilului este negat (este o proprietate logic). De exemplu, dac se execut clic pe butonul Bold se va executa instruciunea screen.fontbold=!_screen.fontbol, adic proprietii FontBold a ecranului i se va atribui valoarea invers (este folosit opera-torul pentru negare !). Toate Toate Scriei n fiierul test_bara1 programul comutatoarele comutatoarele surs: sunt activate sunt dezactivate public ecran ecran=createobj('bara')

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor ecran.show define class bara as toolbar add object b1 as commandbutton add object s1 as separator add object b2 as commandbutton add object s2 as separator add object b3 as commandbutton b1.height = 20 b1.width = 50 b1.caption = "Bold" b2.height = 20 b2.width = 50 b2.caption = "Italic" b2.fontbold = .f. b2.fontitalic = .t. b3.height = 20 b3.width = 50 b3.caption = "subliniat" b3.fontbold = .f. b3.fontunderline = .t. left=1 top=1 width=25 caption="afisare ecran" procedure activate This.b1.FontBold=_screen.FontBold This.b2.FontItalic=_screen.FontItalic This.b3.FontUnderline=_screen.FontUnderline endproc procedure b1.click _ screen.FontBold =!_screen.FontBold This.FontBold =_screen.FontBold endproc procedure b2.click _ screen.FontItalic=!_screen.FontItalic This.FontItalic=_screen.FontItalic endproc procedure b3.click _ screen.FontUnderline=!_screen.FontUnderline This.FontUnderline=_screen.FontUnderline endproc enddefine Lansai n execuie programul cu comanda do test_bara1.

323

Testai bara de instrumente. Activai unul dintre stiluri sau mai multe stiluri. Afiai pe ecran un text de fiecare dat (de exemplu, comanda ? 'AAAA'). Urmrii efectul obinut. Deplasai bara cu instrumente n interiorul ferestrei Visual FoxPro. Ancorai bara n diferite poziii. nchidei bara executnd clic pe butonul de nchidere.

324 Informatic
Creai o bar de instrumente care acioneaz asupra unui formular Bara cu instrumente va conine aceleai trei controale pentru stabilirea stilului n care va fi scris textul pe ecran: ngroat (butonul Bold), nclinat (butonul Italic) i subliniat (butonul Underline). Aceste butoane au efect de comutator. Se va crea un set de formulare care va cuprinde un formular pentru fereastr i o bar cu instrumente. Butonul Test al formularului va testa stilul ales prin scrierea unui text n formular. Att butoanele din bara cu instrumente, ct i butoanele din formular vor afia informaii despre instrument (ToolTips). Scriei n fiierul test_bara2 programul surs: set=createobj('formset') set.addobject("bara1","bara") set.addobject("f1","form") set.f1.addobject("bt1","buton1") set.f1.addobject("bt2","buton2") set.f1.top=8 set.f1.left=44 set.f1.height=250 set.f1.width=400 set.f1.backcolor=rgb(190,190,190) set.f1.borderstyle=1 set.f1.caption="test" set.f1.showtips=.T. set.f1.closable=.F. set.f1.bt1.visible=.t. set.f1.bt2.visible=.t. set.f1.show set.bara1.show read events define class buton1 as commandbutton top = 200 left = 50 height = 25 width = 100 caption = "T\<est" ToolTipText = "Test scriere" procedure click ThisForm.print('test ') endproc enddefine define class buton2 as commandbutton top = 200 left = 250 height = 25 width = 100 ToolTipText = "Termina aplicatia" caption = "\<Terminare" procedure click ThisFormSet.Release clear events endproc

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor enddefine define class bara as toolbar add object b1 as commandbutton add object s1 as separator add object b2 as commandbutton add object s2 as separator add object b3 as commandbutton left = 1 top = 1 width = 25 showtips = .T. caption = "Afisare ecran" b1.height = 20 b1.width = 50 b1.ToolTipText="Ingrosat" b1.caption = "Bold" b2.height = 20 b2.width = 50 b2.ToolTipText="Aplecat" b2.caption = "Italic" b2.fontbold = .f. b3.height = 20 b3.width = 50 b3.ToolTipText="Subliniat" b3.caption = "Underline" b3.fontbold = .f. procedure activate This.b1.FontBold = ThisFormSet.f1.FontBold This.b2.FontItalic = ThisFormSet.f1.FontItalic This.b3.FontUnderline = ThisFormSet.f1.FontUnderline endproc procedure b1.click ThisFormSet.f1.FontBold = !ThisFormSet.f1.FontBold This.FontBold =ThisFormSet.f1.FontBold endproc procedure b2.click ThisFormSet.f1.FontItalic = !ThisFormSet.f1.FontItalic This.FontItalic = ThisFormSet.f1.FontItalic endproc procedure b3.click ThisFormSet.f1.FontUnderline = !ThisFormSet.f1.FontUnderline This.FontUnderline =ThisFormSet.f1.FontUnderline endproc enddefine Lansai n execuie programul cu comanda do test_bara2.

325

Testai bara de instrumente. Activai unul dintre stiluri sau mai multe stiluri i executai clic pe butonul Test din fereastr. Observai informaiile afiate pentru fiecare instrument selectat. nchidei setul de formulare executnd clic pe butonul Terminare.

326 Informatic
Modificai formularul creat anterior Adugai fomularului creat anterior un buton care s controleze afiarea barei cu instrumente:

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

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

n rndul 2 al tabelului sunt nregistrate caracteristicile obiectului DataEnvironment asociat formularului, iar n rndul 3 caracteristicile formularului Form1. n rndul 3 al tabelului vei face urmtoarele modificri n cmpurile memo:

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor 9 n cmpurile Class i BaseClass tergei Form i scriei ToolBar. 9 n cmpul Objname tergei Form1 i scriei Bara. 9 n cmpul Properties tergei tot coninutul. nchidei fereastra de editare i apoi i fiierul cu comanda use. Deschidei formularul cu comanda Modify Form bara.

327

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

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

328 Inormatic
Containerul OLE permite afiarea i editarea obiectelor OLE ntr-o aplicaie Visual FoxPro. Obiectul vizual OLEContainer din Visual FoxPro este un container pentru obiectul creat cu o alt aplicaie. Aceste obiecte pot fi: 9 Controale OLE (fiiere .ocx). Au propriul lor set de proprieti, metode i evenimente. 9 Obiecte OLE inserabile. Nu au propriul lor set de proprieti, metode i evenimente (nu pot rspunde la evenimente). Containerul OLE care nu are proprietile ControlSource i Value. n scimb, obiectul vizual OLEBoundControl are aceste proprieti. Proprietatea ControlSource memoreaz numele cmpului n care se pstreaz obiectul.

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

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

Verb Efectul metodei DoVerb 0 Este aciunea implicit a obiectului. -1 Obiectul va fi activat pentru editare mpreun cu containerul OLE. -2 Deschide fereastra aplicaiei server n care se ncarc obiectul pentru editare. -3 Ascunde aplicaia care a creat obiectul (pentru obiectele ncapsulate). -4 Obiectul este activat n container pentru editare i sunt afiate instrumentele specifice aplicaiei server. -5 La focalizarea obiectului se creeaz o fereastr pentru editarea obiectului. -6 Obiectul este activat pentru editare dar sunt ignorate toate modificrile pe care aplicaia server le poate anula.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

329

<nume_obiect>.Object.<nume_proprietate>=<valoare> iar pentru apelarea unei metode: <nume_obiect>.Object.<nume_metod>[(<list-parametri>)] 9 Aplicaia server cu care a fost creat obiectul: OLEClass (numele aplicaiei). 9 Identificatorul fiierului care conine obiectul (unitatea de disc, calea de director, numele i extensia): DocumentFile . 9 Redimensionarea zonei alocate obiectului OLE: Sizable . Are aceeai semnificaie ca i la obiectul ToolBar. Dac are valoarea .T. se poate folosi pro-prietatea AutoSize pentru a se redimensiona automat zona alo-cat obiectului. Metoda specific unui obiect OLE este DoVerb i are ca efect activarea obiectului i stabilirea ope-raiilor care se pot executa cu obiectul respectiv. Obiectul poate fi activat prin acionarea standard a obiectului sau prin alte aciuni (verbe). Metoda poate fi apelat prin: DoVerb[(<verb>)]

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

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

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

Obiectul a fost deschis pentru editare. Modificai valoarea cmpurilor. Observai c valorile din cmpurile pentru care s-a aplicat formula de calcul pentru sum (sum) sunt modificate automat pentru a reflecta corect sitiuaia din foaia de calcul. Dac ai fcut modificrile n coloana corespunztoare lunii ianuarie, observai c s-a modificat automat i diagrama. nchidei formularul. Lansai n execuie programul cu comanda do test_bara1.
Creai vizual obiectul inserat n formular Creai formularul din exemplul anterior folosind metoda vizual:
Din grupul de butoane radio al casetei de dialog Insert Object mai putei s activai butonul Create New, dac vrei s creai un obiect nou (din lista Object Type alegei aplicaia server pe care o vei folosi pentru crearea obiectului i se va deschide fereastra aplicaiei pentru a crea obiectul) sau butonul Insert Control dac vrei s inserai un control OLE (se deschide caseta de dialog Browse din care putei alege fiierul .ocx).

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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

331

prin intermediul creia stabilii obiectul care va fi adugat n formular. Din grupul de butoane radio activai butonul Create From File. Acionai butonul Browse pentru a construi identificatorul fiierului care conine obiectul: discul C, dosarul Test i fiierul Cheltuieli.xls. nchidei caseta de dialog (clic pe butonul OK). n caseta de proprieti modificai proprietile controlului OLEControl pentru a corespunde cu cele din program. Observai care sunt proprietile, metodele i evenimentele acestui tip de control. Adugai la formular butonul pentru terminare. Stabilii proprietile controlului (cele din program) i codul evenimentului Click. Salvai formularul i nchidei aplicaia Constructorului de formulare. Lansai n execuie formularul cu comanda do form obiect1.

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

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

332 Inormatic
thisform.refresh skip -1 endproc endif procedure click && butonul <<< thisform.refresh if not bof() endproc Adugai la formular un obiect de tip OLEBoundControl: executai clic pe obiectul din bara de obiecte a constructorului. Stabilii proprietile controlului (ControlSource= sigle.sigla). Salvai formularul. Lansai n execuie formularul cu comanda do form obiect2. Testai formularul.

Obiectele grafice i ceasul


ntr-un formular putei s introducei diferite obiecte grafice : Control Imagea Semnificaie Afieaz o imagine preluat dintr-un fiier .bmp. Caracteristicile sale pot fi controlate cu proprietile Top, Left, Height, Width, BackStyle, BorderColor, Border Style, Enabled, Visible, Stretch. Afieaz o linie. Caracteristicile sale pot fi controlate cu proprietile Top, Left, Height, Width, BorderWidth, BorderColor, Border Style, Enabled, Visible, LineSlant. Afieaz o form (ptrat, dreptunghi, cerc, elips). Caracteristicile sale pot fi controlate cu proprietile Top, Left, Height, Width, BackStyle, BackColor, BorderWidth, BorderColor, Border Style, FullColor, FullStyle, Enabled, Visible, ToolTipText, Curvature.

Linea

Shapea

Imaginea (image) poate fi folosit la crearea butoanelor cu pictograme n locul butoanelor cu legend, care pot fi folosite ca butoane declanatoare. Se recomand folosirea lor n cazul barelor cu instrumente. Imaginea grafic are o proprietate specific Picture (imaginea) care memoreaz sursa imaginii. Aceasta poate fi: un fiier bitmap .bmp, un fiier de imagini .ico sau un cmp din tabel de tip general. Formele i liniile (shape sau line) sunt folosite pentru a se desena elemente grafice pe suprafaa formularelor. Chiar dac au asociate evenimente (declanate de aciuni ale mouse-ului), au n general numai un rol decorativ, de grupare sau de evideniere. Ceasul Timer este un obiect nevizual care poate fi folosit n interfaa unei aplicaii pentru a msura timpul. Este un mecanism implementat n interfa care permite programatorului s declaneze un anumit proces dup un interval de timp. Este caracterizat de: 9 Proprietatea interval - Intervalx. Este de tip numeric i reprezint numrul de milisecunde dup care este generat evenimentul Timer, adic intervalul de timp pn la apelul procesului. Valoarea sa implicit este 0 (corespunde dezactivrii ceasului). 9 Evenimentul asociat ceasului - Timerx. Este un eveniment care se declaneaz la intervale egale de timp (stabilite de proprietatea Interval). n procedura asociat acestui eveniment se scriu instruciunile aciunii care trebuie s se execute dup un interval de timp. 9 Metoda de resetare a ceasului - Resetx prin care contorul ceasului este adus la 0.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

333

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

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

334 Inormatic
endproc procedure Timer ThisForm.Image1.Visible=!ThisForm.Image1.Visible ThisForm.Label1.Visible=!ThisForm.Label1.Visible endproc Salvai formularul. Lansai n execuie formularul cu comanda do form imagine2. Testai formularul. nchidei formularul.
Creai un formular care simuleaz un ceas Fie creai dou fiiere bitmap .bmp, fie gsii n sistem dou fiiere cu pictograme .ico (de exemplu face01.ico i face02.ico n imaginile din formularul alturat). Creai formularul Ceas care, la acionarea unui buton Afisare va afia alternant la un interval de 500 ms o imagine n partea dreapt i o imagine n partea stng, iar sub cele dou imagini o afiare numeric a timpului (cu pasul de 500 ms).

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

Scriei procedurile asociate evenimentelor: procedure Click && Command1 ThisForm.Text1.Value=0 ThisForm.Timer1.Interval=500

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

335

ThisForm.Image1.Visible=.T. ThisForm.Image2.Visible=.F. endproc procedure Click && Command2 ThisForm.Release endproc procedure Timer ThisForm.Text1.Value=ThisForm.Text1.Value+ ThisForm.Timer1.Interval ThisForm.Image1.Visible=!ThisForm.Image1.Visible ThisForm.Image2.Visible=!ThisForm.Image2.Visible endproc Salvai formularul. Lansai n execuie i testai formularul. nchidei formularul.

T est pentru evaluare:


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

ncercai:

Adevrat/Fals: 1. Obiectul ToolBox are proprietatea AutoSize. 2. DocumentFile este o proprietate specific obiectelor de tip OLE. 3. Obiectul Timer are proprietatea Picture. Completai: 1. Evenimentul AfterDock este specific obiectului ............................ 2. Modul n care poate fi activat un obiect de tip OLE este controlat cu proprietatea ......................... 3. Metoda prin care contorul ceasului este adus la 0 este ....................

336 Inormatic
Alegei rspunsurile corecte: 1. Pentru un obiect ToolBox, Dock este: a) o proprietate b) o metod 2. Pentru un obiect de tip OLE DoVerb este: a) o proprietate b) o metod 3. Pentru obiectul ceas Timer este: a) o proprietate b) o metod

c) un eveniment c) un eveniment c) un eveniment

R spunsuri:

Adevrat/Fals: 1-A; 2-A; 3-F. Completai: 1-ToolBox; 2- Autoactivate; 3-Reset. Alegei rspunsurile corecte: 1-b; 2- b; 3- c.

4. Proiectarea m e n i u rilor
Dac aplicaia pune la dispoziia utilizatorului un set de comenzi, metoda cea mai avantajoas, mai uoar i mai potrivit pentru a grupa aceste comenzi astfel nct utilizatorul s aib acces la ele o reprezint meniurile. Meniul (menu) este un element de interfa prin care i se ofer utilizatorului posibilitatea de a selecta o opiune (menu item) dintr-o mulime finit de opiuni posibile, afiate pe ecran total sau parial. n urma selectrii unei opiuni se declaneaz o anumit aciune, corespunztoare opiunii alese. n Visual FoxPro putei folosi dou tipuri de meniu: 9 Meniul sistem - este pus la dispoziie de mediul Visual FoxPro pentru a realiza aciuni corespunztoare limbajului de comand. 9 Meniul utilizator - este creat de programatorul unei aplicaii ca element al aplicaiei construite de el. Tipul de meniu disponibil (modul n care este afiat bara de meniu Visual FoxPro n timpul execuiei programului) este controlat de parametrul Sysmenu cu comanda: set sysmenu on| off | automatic | to default unde: 9 on - bara de meniu Visual FoxPro este disponibil n timpul execuiei programului. 9 off - bara de meniu Visual FoxPro nu este disponibil n timpul execuiei programului. 9 automatic - bara de meniu Visual FoxPro este vizibil n timpul execuiei programului, iar opiunile sunt disponibile n funcie de comanda care se execut n program. 9 to default - se revine la afiarea meniului Visual FoxPro dup ce programul i-a terminat execuia. n funcie de modul n care este dispus lista cu opiuni, meniurile sunt de dou tipuri:

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

337

9 Meniuri orizontale - afieaz lista de opiuni pe un rnd, pe orizontal. Meniul orizontal se mai numete i bar de meniu (menu bar), iar opiunile sale se mai numesc i titluri de meniuri (menu titles). Ele pot fi reprezentate prin cuvinte, expresii sau pictograme. n terminologia Visual FoxPro, meniul orizontal se numete menu, iar opiunile sale se numesc pad. 9 Meniuri verticale - afieaz lista de opiuni ntr-o coloan, pe vertical. Ele se mai numesc i submeniuri. n terminologia Visual FoxPro, meniul vertical se numete popup, iar opiunile sale se numesc bar.
Sistemul de meniuri al unei aplicaii este o combinaie de bar de meniuri, titluri de meniuri, submeniuri i opiuni de meniu. Forma standard a unui sistem de meniuri este urmtoarea: 9 Meniul principal (main menu) este reprezentat printr-o bar de meniu afiat sub bara de titlu a unui formular de tip fereastr, n care ruleaz aplicaia. Atunci cnd se execut clic pe un titlu de meniu se deschide un meniu pe vertical. 9 Meniurile pe vertical afieaz o list cu opiuni. Opiunile pot fi comenzi de operaii de prelucrare, titluri de submeniuri sau bare separatoare. Barele separatoare se folosesc pentru a mpri n grupuri opiunile din lista meniului. Submeniul este un alt meniu care afieaz o alt list de opiuni. n acest mod se poate crea o structur arborescent de submeniuri. Pentru a face aplicaia mai uor de utilizat, opiunile de meniu sunt grupate dup funciile lor. Submeniurile se creeaz atunci cnd: 9 bara de meniu este plin cu titluri de meniu i nu mai ncape un nou titlu de meniu; 9 lista submeniului este format din comenzi care sunt folosite mai rar; 9 lista de comenzi din submeniu este ntr-o anumit relaie cu o opiune de meniu. Unele opiuni de meniu execut direct o aciune. Alte opiuni afieaz o caset de dialog, un fomular prin care aplicaia cere utilizatorului s-i furnizeze informaii suplimentare ca s poat executa aciunea cerut. n marea majoritate a aplicaiilor aceste opiuni de meniu sunt urmate de trei puncte. Este bine ca i n interfaa pe care o construii s respectai acest standard. Fiecrei opiuni de meniu i corespunde un control de meniu. Controlul meniului este i el un obiect. La fel ca orice obiect, i el are proprieti standard prin care i se poate stabili aspectul: legenda, disponibilitatea, vizibilitatea etc. Legenda este textul care apare n titlu sau n opiunea de meniu. Controlul meniu are asociat un singur eveniment care este declanat atunci cnd opiunea de meniu este selectat de la tastatur sau cu mouse-ul. Proprietile specifice unui control meniu sunt: 9 Legenda opiunii Prompt - este textul explicativ afiat de titlul meniului sau de opiunea de meniu. 9 Tasta de acces Access key - este tasta care se apas pentru a selecta direct titlul sau opiunea respectiv atunci cnd meniul este activat. Litera tastei de acces este subliniat n legend. Pentru a stabili o tast de acces, naintea literei respective din legend, scriei caracterele \<. 9 Scurttura Shortcut key - este combinaia de taste asociat opiunii de meniu care permite executarea unei comenzi dintr-un meniu fr s se mai activeze bara de

338 Informatic
meniu i s se selecteze comanda. Lng opiune, n partea dreapt este afiat un text cu combinaia respectiv de taste. 9 Mesajul informativ Message - este un mesaj afiat n bara de stare atunci cnd se selecteaz opiunea. 9 Marcajul de verificare Mark character - este un simbol care se afieaz n partea stng a opiunii de meniu n funcie de o condiie: dac valoarea condiiei este adevrat, n faa opiunii este afiat marcajul de verificare b(bifa), iar dac este fals, marcajul nu este afiat. Aceast proprietate permite folosirea opiunilor de meniu pentru stabilirea valorii unui parametru. Dac parametrul poate lua valoarea adevrat sau fals, se folosete o singur opiune care poate fi marcat sau nu. Numele opiunii este numele parametrului. Deoarece aceast opiune se comport la fel ca un control comutator, ea se mai numete i opiune comutator. Dac parametrul poate lua mai multe valori, se folosesc mai multe opiuni de meniu, numele fiecrei opiuni reprezentnd o valoare posibil a parametrului. O singur opiune din grupul de opiuni poate fi marcat i ea reprezint valoarea aleas pentru parametru. La alegerea unei noi opiuni din grup, va fi ters marcajul vechii opiuni i va fi marcat noua opiune. Deoarece grupul de opiuni de meniu se comport la fel ca un control de tip butoane radio, el se mai numete i grup de opiuni butoane radio. 9 Disponibilitatea Skip for - este determinat de o condiie prin care se controleaz dac opiunea de meniu este disponibil sau nu: dac expresia logic are valoarea adevrat, opiunea de meniu este disponibil. Pentru a controla afiarea marcajului n faa unei opiuni se folosete comanda: set mark of popup <nume_opiune> to <expL> unde <nume_opiune> este numele atribuit opiunii (diferit de legend) folosit pentru identificarea sa, iar <expL> exprim condiia care determin afiarea marcajului. Evenimentele specifice unui control meniu sunt: 9 Iniilizarea Setup - este declanat de crearea meniului. n procedura asociat acestui meniu putei defini variabilele de memorie, putei deschide fiiere, putei salva sau restaura un sistem de meniuri. Meniurile pot fi salvate n stiva meniurilor. Pentru operaiile cu stiva putei folosi comenzile push menu pentru salvarea meniului n stiv i pop menu pentru extragerea meniului n stiv. 9 tergerea Cleanup - este declanat de activarea meniului. n procedura asociat acestui meniu putei scrie secvene de cod prin care tergei informaiile care au fost afiate pe ecran i prin care stabilii ce opiuni de meniu sunt disponibile. Dac meniul este programul principal al aplicaiei, n aceast procedur putei activa procesorul de evenimente cu comanda read events. Comanda prin care dezactivai acest procesor clear evnts o vei scrie n procedura asociat opiunii de meniu prin care terminai aplicaia. Unele aplicaii pun la dispoziia utilizatorului meniuri derulante (pop-up menu) care sunt afiate deasupra formularului, independent de bara de meniu. Opiunile afiate n acest meniu depind de context, adic de locul n care se gsete cursorul atunci cnd este apsat butonul din partea dreapt a mouse-ului. El se numete meniul contextului (context menus) sau meniu de comenzi rapide. Pentru proiectarea unui meniu se poate folosi limbajul de comand care v pune la dispoziie comenzi i funcii pentru realizarea acestei operaii. Forma mai rapid i mai puin

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

339

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

340 Informatic
Vei preciza structura arborescent a meniului i vei specifica aciunile pe care trebuie s le execute fiecare opiune de meniu ca de exemplu afiarea unei casete de dialog, a unui formular, a unei bare de instrumente sau a unui alt sistem de meniuri. Cererea de executare a unei aciuni trebuie s se fac numai printr-o singur comand. Dac aciunea declanat de selectarea unei opiuni se descrie printr-un grup de instruciuni, acestea vor fi scrise ntr-un fiier de tip program surs i vor fi lansate n execuie printr-o singur comand: do <nume_fiier>. n urma acestor aciuni ale programatorului constructorul de meniuri va crea un fiier cu numele meniului i extensia .mnx n care se gsesc, sub forma unui tabel, componentele unui meniu i caracteristicile lor. Putei modifica un meniu cu comanda: modify menu <nume_meniu> 3. Generai programul excutabil al meniului. Pentru a putea folosi meniul, trebuie generat un program care, n urma execuiei sale, s activeze meniul. Programul va fi memorat ntr-un fiier cu extensia .mpr. Dup orice modificare a meniului va trebui s executai din nou operaia de generare. 4. Lansai n execuie i testai meniul. Meniul va fi activat prin lansarea n execuie a pogramului generat cu comanda: do <nume_meniu>.mpr

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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

341

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

Lansai n execuie constructorul de meniuri fie cu opiunea de meniu New...File (din caseta de dialog New alegei butonul radio Menu i executai apoi clic pe butonul New File), fie cu comanda:
create menu menu_test

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

342 Informatic
9 Zona de editare Procedure i comutatorul Edit le vei folosi dac vrei s definii o procedur global care va fi folosit implicit n ntregul sistem de meniuri. Ea va fi lansat n execuie de fiecare dat cnd se va alege o opiune creia nu i s-a atribuit o procedur proprie. Pentru meniul pe care l construii trebuie s fie activat butonul Replace. nchidei caseta de dialog executnd clic pe butonul Ok. Ai revenit n fereastra Menu Designer n care definii titlurile din meniul principal:
n fereastra Menu Designer putei folosi urmtoarele controale: 9 Zona de de lucru afieaz sub forma unui tabel mai multe controale: pe un rnd sunt afiate controalele corespunztoare definirii caracteristicilor unei opiuni de meniu, iar pe o coloan controalele corespunztoare unei caracteristici a opiunii de meniu. Coloanele sunt urmtoarele: Mover Control. Este prima coloan i conine un buton cu sgeat dubl. Se folosete pentru a schimba locul opiunilor n list (prin glisarea opiunii n noua poziie). Prompt. n aceast coloan se scrie textul legendei opiunii de meniu. Dac n legend scriei naintea textului caracterul \, opiunea nu va disponibil. Dac n legend scriei numai caracterele \-, opiunea respectiv va fi o linie de demarcare ntre grupurile de opiuni.

Result. n acest coloan este afiat un control de tip list ascuns din care putei alege tipul aciunii declanate de selectarea opiunii de meniu (tipul rezultatului). Tipul rezultatului poate fi: Submenu (se deschide un submeniu), Command (se execut o comand) sau Procedure (se execut o procedur). Pentru opiunile de submeniu Afiseaza, Coloreaza, Grup 1, Grup 2, Calculator i Ceas alegei un rezultat de tip Command, pentru titlul Terminare, rezultatul Procedure, pentru restul opiunilor rezultatul Submenu.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

343

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

344 Informatic
9 Seciunea de butoane Item conine butoane pentru inserarea unei opiuni de meniu ntre cele existente: Insert (o opiune definit de utilizator) i Insert Bar... (o opiune preluat din meniul sistemului Visual FoxPro) i pentru tergerea unei opiuni Delete. 9 Butonul Preview. Prin acionarea lui putei s previzualizai meniul pe care l construii: meniul sistemului este nlocuit de acesta i se deschide o caset de dialog Preview n care sunt prezentate informaii despre opiunea selectat din meniu (numele fiierul, legenda opiunii i comanda asociat). Dup ce ai terminat de construit meniul, l previzualizai folosind butonul Preview. Generai meniul executabil cu opiunea Generate...Menu. Lansai n execuie meniul cu comanda: do menu_test. Testai meniul. Structura meniului este memorat ntr-un fiier de tip tabel, care are cu numele meniului (menu_test) i extensia .mnx. Deschidei acest fiier cu comanda use menu_test.mnx. Afiai coninutul su cu comanda browse. Identificai n acest tabel semnificaia fiecrei coloane. Identificai ce element din structura meniului este nregistrat n fiecare rnd al tabelului.
Testai modul n care putei folosi procedura global i procedurile asociate evenimentelor Setup i Cleanup Vei aduga sistemului de meniuri o procedur global: Deschidei meniul anterior i-l salvai sub numele menu_1. n noul meniu vei face urmtoarele modificri: In caseta de dialog General Option scriei n zona de editare a procedurii globale instruciunea: ? "Test procedura globala" Activai comutatorul Setup i n fereastra de editare a procedurii scriei: ? "Test eveniment Setup" n fereastra Form Designer n meniul principal adugai titlul Scrie nainte de titlul de meniu Terminare. Acestui titlu de meniu i atribuii un rezultat de tip Command, dar nu i atribuii nici o comand. n meniul Utilitati adugai la sfrit dou opiuni: Scrie 1 i Scrie 2. Ambelor le atribuii un rezultat de tip comand. Opiunii Scrie 1 nu i atribuii nici o comand, iar opiunii Scrie 2 i atribuii comanda: ? "Test optiune Scrie 2" n procedura asociat titlului Terminare din meniul principal, tergei instruciunea clear. Salvai modificrile fcute i generai meniul executabil. Lansai n execuie meniul. Testai meniul Scrie i opiunile Scrie 1 i Scrie 2. Ce concluzii tragei? Deschidei meniul menu_1 i l salvai sub numele menu_2. n noul meniu deschidei caseta de dialog General Option, activai comutatorul Cleanup i n fereastra de editare a procedurii scriei: clear ? "Test eveniment Cleanup" Salvai modificrile fcute i generai meniul executabil. Lansai n execuie meniul. Testai meniul Scrie i opiunile Scrie 1 i Scrie 2. Ce concluzii tragei? Cnd se execut procedura asociat evenimentului Cleanup.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

345

T est pentru evaluare:


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

346 Informatic
va crea o list dinamic cu numele elevilor corigeni din clasa respectiv, n perioada aleas. Toate aceste formulare vor avea un buton de terminare. d. Meniul Listare va deschide un meniu pe vertical cu opiunile Lista 1, Lista 2, Lista 3, Lista 4, Lista 5 i Lista 6. Aceste opiuni vor fi grupate logic n dou grupuri de opiuni (fiecare grup va conine 3 opiuni) separate printr-o bar separatoare. Toate aceste opiuni de meniu vor afia rapoarte, n care nregistrrile vor fi grupate dup criteriul clasei. Lista 1 (Lista 4) i Lista 2 (Lista 5) vor afia rapoarte cu numele i prenumele elevului, notele i media pe primul semestru, respectiv al doilea semestru, iar Lista 3 ((Lista 6)) va afia un raport cu numele i prenumele elevului, mediile semestriale i media general. n primul grup de rapoarte, n cadrul grupului clasa, nregistrrile vor fi afiate n ordine alfabetic, iar al doilea grup de rapoarte n ordinea descresctoare a mediilor. Utilizatorul programului va cunoate semnificaia fiecrei opiuni din mesajul afiat n bara de stare. e. Stabilii scurtturi i mesaje pentru toate opiunile de meniu. f. nainte de a se activa meniul, afiai pe ecran o caset de dialog pentru introducerea parolei. Stabilii ce parol dorii. Se vor accepta numai cinci ncercri de comunicare a parolei pentru a avea acces la datele din baza de date.

5 . P r o i e c t a r e a a p l i c a i i l o r
5 . 1 . P r o g r a m u l m o ni t o r

O aplicaie cuprinde mai multe module: pentru introducerea datelor, pentru prelucrarea lor sau pentru afiarea unor rapoarte pe ecran sau la imprimant. Toate aceste module trebuie asamblate ntr-o aplicaie, n care un modul de program trebuie s le administreze i s le coordoneze. Programul monitor al unei aplicaii are rolul de a coordona executarea modulelor aplicaiei i a asigura colaborarea ntre ele. Sarcinile unui program monitor sunt: a. S configureze mediul de lucru. Sistemul de gestiune a bazelor de date poate fi configurat prin intermediul unor parametri a cror valoare se stabilete cu comanda set. Aceti parametri au valori implicite, iar n unele aplicaii aceste valori implicite nu sunt tocmai potrivite. De exemplu, parametrul talk trebui s aib valoarea off, iar parametrului date, care stabilete formatul datelor calendaristice, i se poate atribui un anumit format (set date to british). Se mai poate stabili directorul curent din care se vor prelua baza de date i alte fiiere necesare aplicaiei cu parametrul default (set default to <cale_director>). Ali parametri pentru care se stabilesc de obicei valorile sunt century, confirm, console, deleted i safety. b. S personalizeze fereastra de aplicaie. Aplicaia ruleaz n fereastra sistemului Visual FoxPro, care va deveni fereastra aplicaiei. De aceea trebuie s schimbai anumite proprieti ale acestei ferestre. Obiectul fereastra aplicaiei Visual FoxPro se identific prin variabila de memorie sistem _screen. De exemplu, dac vrei s schimbai legenda ferestrei de aplicaie vei folosi comanda de atribuire:

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor


_screen.caption=<numele_ferestrei_de_aplicatie>

347

nainte ns de a modifica proprietile ferestrei, salvai valorile pe care le modificai n variabile de memorie (de exemplu: nume_f=_screen.caption) . c. S activeze meniul principal al aplicaiei. Din meniul principal se vor lansa n execuie modulele de program pentru prelucrarea datelor, formularele pentru editarea datelor, comenzile pentru afiarea rapoartele etc. d. S activeze procesorul de evenimente. Deoarece programul generat de constructorul de meniuri nu conine propriul procesor de evenimente, este necesar ca, dup ce a fost lansat n execuie programul care creeaz meniul, s se activeze procesorul de evenimente care la rndul su va activa meniul i va permite tratarea evenimentelor. e. S dezactiveze procesorul de evenimente i s refac starea anterioar a mediului de lucru la terminarea execuiei aplicaiei. Exemplu Pentru salvarea i restaurarea parametrilor care caracterizeaz starea sistemului, putei folosi dou tabele (cte una pentru fiecare tip de comand set): 9 stare1 (comenzi set pentru parametrii cu dou valori - on i off; de exemplu talk, century, confirm, console, deleted i safety) cu structura nume C(15), valoarea_s C(3), valoarea_a C(3); 9 stare2 (comenzi set pentru parametrii cu mai multe valori - set ... to; de exemplu default i date) cu structura nume C(15), valoarea_s C(30), valoarea_a C(30); unde valoarea_s este valoarea parametrului n sistemul Visual FoxPro, iar valoarea_a este valoarea parametrului n aplicaie. ncrcai iniial tabelul cu numele parameterilor pe care dorii s-i modificai (cmpul nume) i cu valorile pe care dorii s le aib n aplicaie. Pentru salvarea configurrii sistemului, la nceputul sesiunii de lucru vei folosi procedura intrare: procedure intrare * se salveaza valorile parametrilor sistemului * se atribuie parametrilor valorile aplicatiei use stare1 scan replace valoare_s with set(alltrim(stare1.nume)) alfa=alltrim(stare1.nume) beta=alltrim(stare1.valoare_a) set &alfa &beta endscan use use stare2 scan replace valoare_s with set(alltrim(stare2.nume)) alfa=alltrim(stare2.nume) beta=alltrim(stare2.valoare_a) set &alfa to &beta endscan use endproc

348 Informatic
Pentru restaurarea strii sitemului, la sfritul sesiunii de lucru vei folosi procedura ieire: procedure iesire * se restaureaza valorile parametrilor sistemului use stare1 scan alfa=alltrim(stare1.nume) beta=alltrim(stare1.valoare_s) set &alfa &beta endscan use use stare2 scan alfa=alltrim(stare2.nume) beta=alltrim(stare2.valoare_s) set &alfa to &beta endscan use endproc
5.2. G e s t i o n a r e a c o m p o n e n t e l o r u n e i a p li c a ii

5.2.1. Proiectul aplicaiei


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

5.2.2. Generarea aplicaiei i a programului executabil


Proiectul conine dou categorii de componente:

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

349

9 Componente care nu se modific n timpul execuiei: programele, meniurile, rapoartele, formularele etc. 9 Componente care se modific n timpul execuiei: bazele de date, tabelele etc.
Aplicaia (application) este un fiier care conine componetele unui proiect care nu se modific n timpul execuiei. Fiierul aplicaiei are extensia .app. Pentru a crea o aplicaie trebuie parcurse urmtoarele etape: a. Se creeaz proiectul aplicaiei. Nu se poate crea o aplicaie dac nu ai inclus componentele ei ntr-un proiect. b. Se stabilete programul principal - Set Main. Orice aplicaie trebuie s aib un program principal. Programul principal este programul care se va executa atunci cnd se lanseaz n execuie aplicaia i din care vor fi apelate celelalte componente ale aplicaiei: modulele de program, meniurile, formularele etc. c. Se genereaz aplicaia. Aplicaia se lanseaz n execuie cu comanda: do <nume_aplicaie>.app Aplicaia este dependent de mediul Visual FoxPro. Pentru a crea un program independent de acest mediu, acesta trebuie s fie un program executabil (fiier cu extensia .exe) care se obine la fel ca o aplicaie, cu deosebirea c n caseta Build Options se activeaz butonul Build Executable. Aadar, pentru a putea rula aplicaia pe care ai construit-o pe un calculator pe care nu este instalat Visual FoxPro avei dou posibiliti: 9 Creai fiierul aplicaiei (.app) i l distribuii utilizatorului mpreun cu versiunea pentru rulare a sistemului Visual FoxPro care conine numai acele elemente care asigur execuia programelor, nu i modificarea lor. 9 Creai programul executabil al aplicaiei. Acesta nu are nevoie de varianta pentru rulare, ci i sunt necesare numai bibliotecile de rulare (fiiere care conin proceduri pentru rularea programelor). Aplicaia i programul executabil trebuie transportate la destinaie (calculatorul utilizatorului) pe un suport de memorare (discuri flexibile sau CD). Pe acest suport va fi construit kitul de instalare care va conine o imagine a structurii de directoare necesare executrii aplicaiei, directoarele n care se vor gsi fiierul executabil i alte fiiere necesare aplicaiei. Pentru realizarea kitului de instalare folosii procedura asistent a kitului de instalare Setup Wizard. Procedura creeaz pe hard discul calculatorului dumneavoastr, n directorul precizat, o imagine a chitului de instalare. Dup ce ai creat aceast imagine, o vei copia pe suportul de memorare stabilit pentru destinaie n timpul procesului de generare a kitului (dac ai ales discul flexibil, vei copia coninutul fiecrui director rezultat pe o dischet). La destinaie vei instala aplicaia lansnd n execuie programul setup.exe care a fost creat, n cazul suportului de tip disc flexibil, pe primul disc.

350 Informatic

Creai un proiect Proiectul va cuprinde meniul definit anterior menu_test, formularele care sunt activate de opiunile acestui meniu, i cele dou fiiere cu pictograme folosite n formularul care simuleaz ceasul. La aceste componente trebuie s adugai programul monitor.

Creai n rdcina discului C directorul Aplicaie. n acest director vei crea proiectul. Lansai n execuie generatorul de proiecte fie cu opiunea de meniu New...File (din caseta de dialog New alegei butonul radio Project i executai apoi clic pe butonul New File, dup care n caseta de dialog Create alegei directoul Aplicatie i atribuii proiectului numele Proiect), fie cu comanda: create project \aplicatie\proiect Se deschide fereastra Project Butonul de restrngere/expandare a ferestrei. n urma Manager care este mprit n operaiei de restrngere fereastra va fi redus la zona mai multe seciuni, fiecare etichetelor seciunilor i va putea fi ancorat la fel ca orice seciune reprezentnd o cate- bar de instrumente. Executnd apoi clic pe o etichet vei gorie de componente: All - toaexpanda numai seciunea corespunztoare etichetei. te componentele, Date - componentele care conin date (Database, Free Table, Queries), Documents - componentele utile pentru introducerea i afiarea datelor (formularele Forms i rapoartele Reports), Class Libraries - bibliotecile de clase, Code - componente care conin module de program (Pro-grams i Applications) i Other - alte componente (meniurile Menus, fiierele de texte Text Files i alte fiiere Other Files). n zona de lucru a ferestrei vor fi afiate componentele specifice seciunii.
Cu ajutorul Gestionarului de proiecte putei executa urmtoarele operaii: 9 Crearea unei componente noi (butonul New...). Se va deschide fereastra constructorului corespunztor componentei selectate: Menu Designer - pentru meniuri, Query Designer - pentru interogri, Report Designer - pentru rapoarte, Form Designer pentru formulare ... i fereastra de editare texte pentru Programs i Files. 9 Adugarea unei componente la proiect (butonul Add...). Dac obiectul a fost creat n afara proiectului, dup ce acionai acest buton putei s alegei dintr-o list componentele pe care dorii s le adugai la proiect. 9 Editarea unei componente a proiectului (butonul Modify). Selectai componenta din seciunea corespunztoare a fereastrei i acionai butonul. Se va deschide fereastra constructoului cu care ai creat componenta i putei s facei modificrile.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

351

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

352 Informatic
Pentru a vizualiza coninutul proiectului, executai clic pe butoanele + din faa numelui obiectului:
Acionai butonul Build.... n caseta de dialog Build Options activai butonul Rebuild Project i apoi butonul OK.

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

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

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor

353

Deschidei proiectul fie cu opiunea de meniu Open...File (din lista ascuns Files of type alegei Project, selectai fiierul Proiect din directoul Aplicaie i executai apoi clic pe butonul Open), fie cu comanda: modify project \aplicatie\proiect n seciunea Code a ferestrei Project Manager selectai programul monitor care va fi programul principal. Selectai apoi opiunea Set MainProject. Numele programului principal va fi scris cu stilul bold. Pentru a genera aplicaia, acionai butonul Build... din fereastra Project Manager. Se deschide caseta de dialog Build Options n care din grupul de butoane radio Action activai butonul Build Application. Acionai apoi comutatorul OK i n fereastra Save As scriei numele aplicaiei: test. Lansai n execuie aplicaia cu comanda: do \aplicatie\test.app. Testai aplicaia.
Creai kitul pentru distribuirea aplicaiei

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

354 Informatic
5. Precizai directorul implicit n care se va instala aplicaia la destinaie - Specify Default Destination. Aceast informaie o comunicai n caseta de text Default Directory. Este posibil ca acest director s fie schimbat la instalarea kitului prin precizarea unui alt director de ctre persoana care instaleaz aplicaia. Scriei n caseta de text c:\produs. Mai putei s scriei n caseta de text Program Group numele grupului care va fi adugat la meniul de start (implicit este Visual FoxPro Application). Din grupul de butoane radio User can modify putei activa butonul Directory and program group (utilizatorul poate modifica la instalare i numele directorului n care va fi instalat aplicaia i numele grupului de programe) sau butonul Directory only (utilizatorul poate modifica la instalare numai numele directorului). 6. Precizai caracteristicile fiierelor care compun aplicaia - Change File Setings. Se deschide tabelul n care sunt memorate datele referitoare la fiierele incluse n kitul de instalare. Fiecare rnd reprezint un fiier, iar fiecare coloan o caracteristic a fiie-rului. Titlurile coloanelor sunt: File - numele fiierului, Target Dir - directorul n care va fi copiat fiierul la destinaie (din lista ascuns putei alege una dintre opiunile: AppDir - directorul aplicaiei, WinDir - directorul sistemului de operarea Windows, WinSysDir - directorul System al sistemului de operarea Windows), PM Item activeaz programul Program Manager cu ajutorul cruia putei stabili proprieti suplimentare ale fiierului (de exemplu pictograma), ActiveX - activeaz instalarea controlului de tip ActiveX la destinaie.

7. Terminai procesul de creare al kitului. Pentru aceasta acionai butonul Finish. Se va afia caseta de dialog Setup Progress care v informeaz despre modul n care decurge procesul de creare a kitului.

Dup ce s-a terminat procesul de creare a imaginii kitului de distribuie, deschidei directorul Test i observai c el conine un director Disk144 (imagine pe disc flexibil) i n acest director trei subdirectoare Disk1, Disk2 i Disk3. Aceste directoare vor fi copiate fiecare pe cte un disc flexibil.

Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor Putem s testm kitul de instalare pe propriul calculator. Deschidei directorul Disk1 i lansai n execuie programul

355

setup. Vei pstra ca director pentru aplicaie directorul stabilit n kit, aa c vei aciona butonul Install all files for Instalare.

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

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

T est pentru evaluare:


Creai proiectul, aplicaia i kitul de distribuie pentru sistemul de meniuri definit anterior, care este folosit de un profesor pentru a ine evidena notelor i mediilor la disciplina Informatic.

ncercai:

Adevrat/Fals: 1. Se poate preciza cazul n care o opiune de meniu nu este disponibil. 2. n procedura Setup a meniului se dezactiveaz procesorul de evenimente. 3. ntr-o aplicaie Visual FoxPro putei crea un meniu de comenzi rapide. 4. Procedura Cleanup se execut naintea procedurii Setup. 5. Programul monitor se folosete pentru a administra proiectul. 6. Proiectul este un program care, dac este lansat n execuie, monitorizeaz aplicaia. 7. Aplicaia este independent de mediul Visual FoxPro. Completai: 1. Mesajul informativ Message se afieaz ............................................................. 2. Unei opiuni de meniu putei s-i asociai un submeniu, o comand sau..,.................... 3. Fiierul n care se memoreaz tabelul cu structura meniului are extensia .......... 4. Condiia prin care testai disponibilitatea unei opiuni de meniu este precizat prin ............. 5. Kitul de instalare conine programul ...................... care se folosete pentru instalarea aplicaiei pe alt calculator. Alegei rspunsurile corecte: 1. Pentru revenirea din meniul aplicaiei n meniul sistemului, trebuie s atribuii cu comanda set parametrului sysmenu valoarea : a) off b) automatic c) to default 2. Extensia fiierului care conine meniul executabil este: a) mnx b) mnt c) mpr d) mpx 3. Extensia fiierului care conine aplicaia este: a) prj b) api c) exe d) app spunsuri: R Adevrat/Fals: 1-A; 2-F; 3-A; 4-F; 5-F; 6-F; 7-F.
Completai: 1-bara de stare; 2-o procedur; 3-.mnx; 4-Skip For ; 5-setup.exe Alegei rspunsurile corecte: 1-c; 2- c; 3- d.

S-ar putea să vă placă și