Sunteți pe pagina 1din 206

Programarea rapid a aplicaiilor pentru baze de date relaionale

Lorentz JNTSCHI Mdlina VLEANU Sorana BOLBOAC

AcademicDirect & Academic Pres 2006

Programarea rapid a aplicaiilor pentru baze de date relaionale

Cuprins
I. Prefa..........................................................................................................................2 II. Despre autori ...............................................................................................................3 1. Baze de date i SGBD .................................................................................................4 2. Formele Backus-Naur................................................................................................10 3. Baze de date relaionale.............................................................................................11 4. Microsoft Visual FoxPro ...........................................................................................14 5. Crearea unei baze de date ..........................................................................................16 6. Normalizarea unei baze de date.................................................................................19 7. Tipuri de relaii ..........................................................................................................22 8. Aspecte ale stocrii datelor n BD relaionale ...........................................................25 9. Lucrul cu Project Manager n VFP............................................................................27 10. Crearea tabelelor i indexurilor .................................................................................28 11. Colectarea tabelelor ntr-o baz de date ....................................................................33 12. Validarea datelor la adugare sau modificare............................................................38 13. Manipularea nregistrrilor n baza de date i integritatea referenial .....................39 14. Interogarea unei baze de date i limbajul SQL..........................................................43 15. Crearea de vederi locale ............................................................................................46 16. Lucrul cu fereastra de comenzi..................................................................................50 17. Expresii......................................................................................................................56 18. Lucrul cu funciile FVP exemple de utilizare.........................................................57 19. Constructorul de expresii...........................................................................................59 20. Programare ................................................................................................................61 21. Proceduri i funcii ....................................................................................................66 22. Rapoarte i etichete....................................................................................................67 23. Macrosubstituie ........................................................................................................72 24. Formulare ..................................................................................................................73 25. Controale ...................................................................................................................83 26. Controale i containere n VFP..................................................................................87 27. Constructoarele de controale i containere................................................................92 28. Meniuri ......................................................................................................................99 29. Dezvoltarea de meniuri pentru aplicaii...................................................................100 30. Baze de date externe i aplicaii client server.......................................................114 31. Configurarea unui client VFP/Win9.x pe un server MyQSL/FreeBSD ..................115 32. Administrarea de la distan a MyQSL/FreeBSD cu VFP/Win9.x .........................122 33. Comenzi SQL pentru accesul la un server de date ..................................................125 34. Aplicaie exemplu....................................................................................................129 35. Documentarea aplicaiilor windows cu Microsoft HTML Help .............................135 36. Crearea unui nou fiier help cu HTML Help Workshop .........................................136 37. Capitole speciale de baze de date ............................................................................142 38. Soluia Microsoft Office: Excel & Access ..............................................................171 39. Probleme propuse ....................................................................................................191 40. Test de cunotine ....................................................................................................195 41. Model de soluie pentru test ....................................................................................196 III. Index de cuvinte cheie .............................................................................................197 IV. Bibliografie..............................................................................................................199 V. Abstract....................................................................................................................203 VI. Contents ...................................................................................................................204

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

I. Prefa

Lucrarea Programarea rapid a aplicaiilor pentru baze de date relaionale este rezultatul experienei didactice de peste 10 ani n domeniul crerii i exploatrii bazelor de date relaionale, a implementrii de aplicaii dedicate domeniilor cercetare tiinific (baze de date pentru chimie i medicin), biblioteconomie (baze de date cu publicaii tiinifice), management (gestiune i contabilitate) i nu n ultimul rnd educaie. Lucrarea se adreseaz celor care doresc s-i formeze priceperile i deprinderile utilizrii aplicaiilor dedicate pentru baze de date, i n special a aplicaiilor din categoria Rapid Application Development (RAD) - n traducere Dezvoltarea rapid a aplicaiilor. Din aceast categorie de aplicaii, cea mai popular este FoxPro; aceasta este i aplicaia care este dezvoltat cel mai n amnunime pe parcursul lucrrii. Din punctul de vedere al stilului programrii, lucrarea ofer soluia Microsoft, fiind discutate trei aplicaii dedicate bazelor de date oferite de firma Microsoft. n ordinea complexitii mediului de programare oferit, acestea sunt: Excel, Access i Visual FoxPro. n ceea ce privete versiunile aplicaiilor discutate, acestea nu sunt nici ultimele versiuni de pe pia, dar nici primele. Referindu-ne strict la Visual FoxPro, discuia este purtat exemplificnd cu aplicaii pentru versiunea 6 (an de apariie 1998), discuia fiind ns perfect valabil i pentru versiunea 5 i pentru 7. Axa demersului didactic al lucrrii este orientat de la problem ctre soluie, trecnd prin model matematic, algoritm i implementare. Noiunile teoretice fundamentale de baze de date nu lipsesc din demersul tiinific al lucrrii; dimpotriv, sunt n amnunt discutate problemele de stocare att la nivel fizic ct i la nivel logic, problemele de consisten i integritate sunt exemplificate pe parcursul lucrrii, iar problemele fundamentale de securitate, coeren, restricii i tranzaciile sunt tratate datorit specificului aparte separat ctre sfritul lucrrii (Capitole speciale de baze de date). Lucrarea are un profund caracter formativ. Abilitile care lucrarea dorete a le forma sunt: proiectarea, implementarea, normalizarea i asigurarea integritii refereniale unei baze de date relaionale i implementarea aplicaiilor de gestiune; utilizarea controalelor puse la dispoziie de un mediu de programare vizual pentru dezvoltarea rapid a aplicaiilor; realizarea de aplicaii complexe client-server pentru gestiunea bazelor de date distribuite. Nu n ultimul rnd se situeaz ingineria programrii, tehnica de abordare a problemei propuse spre rezolvare de sus n jos i de jos n sus (top-down i bottom-up - n englez) folosind binecunoscutul dicton latin divide et impera (desparte i stpnete - n traducere). Cluj-Napoca, August 2006 Lorentz JNTSCHI

Programarea rapid a aplicaiilor pentru baze de date relaionale

II. Despre autori

Sorana Daniela BOLBOAC s-a nscut n 1973, n Cluj-Napoca, Cluj; a absolvit pe rnd Specializarea Medicin General, n 1998, Masterul de Informatic Medical i Biostatistic, n 2001, Facultatea de Medicin la Universitatea de Medicin i Farmacie I. Haieganu Cluj-Napoca; din anul 2006, Doctor n tiine Medicale, Specializarea Informatic Medical, la Universitatea de Medicin i Farmacie I. Haieganu Cluj-Napoca, cu Teza de Doctorat cu titlul Practica Medical Bazat pe Evidene: Logistic i Implementare, efectuat sub ndrumarea Prof. Univ. Dr. Andrei Achima Cadariu; medic stagiar i apoi medic rezident (la Spitalul Clinic Judeean Cluj-Napoca, 1999-20002005), medic specialist (radiologie i imagistic medical, din 2005), asistent i apoi ef de lucrri (informatic medical, 2001, 2006) la Universitatea de Medicin i Farmacie I. Haieganu Cluj-Napoca, cercettor tiinific (chimie, 2006) la Universitatea Tehnic din Cluj-Napoca.

Mdlina Ana VLEANU s-a nscut n 1972, n Sebe, Alba; a absolvit pe rnd Specializarea Informatic, n 1995, Masterul de Informatic Distribuit, n 1996, Facultatea de Matematic i Informatic la Universitatea Babe-Bolyai Cluj-Napoca; din anul 2004, Doctor n Matematic, Specializarea Informatic, la Universitatea BabeBolyai Cluj-Napoca, cu Teza de Doctorat cu titlul Problema integritii n baze de date distribuite, efectuat sub ndrumarea Prof. Univ. Dr. Leon mbulea; analist programator (informatic, la S.C. Nethrom Software Cluj-Napoca, 1995-2001), asistent i apoi ef de lucrri (informatic medical, 2001, 2006) la Universitatea de Medicin i Farmacie I. Haieganu Cluj-Napoca.

Lorentz JNTSCHI s-a nscut n 1973, n Fgra, Braov; a absolvit pe rnd Specializarea Informatic, Facultatea de Matematic i Informatic, n 1995, Specializarea Chimie - Fizic, Facultatea de Chimie i Inginerie Chimic, n 1997, la Universitatea Babe-Bolyai ClujNapoca, Masterul de Ameliorarea plantelor i controlul calitii seminelor i materialului sditor, Facultatea de Agronomie, n 2002, la Universitatea de tiine Agricole i Medicin Veterinar din Cluj-Napoca; din anul 2000, Doctor n Chimie, Specializarea Chimie Organic, la Universitatea BabeBolyai Cluj-Napoca, cu Teza de Doctorat cu titlul Predicia proprietilor fizico-chimice i biologice folosind descriptori matematici, efectuat sub ndrumarea Prof. Univ. Dr. Mircea V. Diudea; profesor de liceu (informatic, titular la Colegiul Naional G. Bariiu Cluj-Napoca, 19951999), doctorand (chimie organic, 1998-2000), preparator i apoi ef de lucrri (chimie, 1999, 2000) la Universitatea Tehnic din Cluj-Napoca, cadru didactic asociat (informatic, 2000-2006) la coala Academic Postuniversitar de Informatic Aplicat i Programare de pe lng UTCN; a nfiinat dou reviste (2002), i o editur (2003), toate n form electronic.
3

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

1. Baze de date i SGBD


Calculatoarele au fost folosite nc din 1950 pentru stocarea i procesarea datelor. Un deziderat major al sistemelor informatice este de a realiza produse software care s localizeze eficient datele pe suportul fizic i s-l ncarce rapid n memoria intern pentru procesare. La baza unui sistem informatic se afl un set de fiiere memorate permanent pe unul sau mai multe suporturi fizice.

Gama larg de aplicaii ale informaticii necesit acces rapid la mari cantiti de date. Iat cteva exemple: sistemele computerizate de marcare din supermarketuri trebuie s traverseze ntreaga linie de produse din magazin; sistemele de rezervare a locurilor la liniile aeriene sunt folosite n mai multe locuri simultan pentru a plasa pasageri la numeroase zboruri la date diferite; calculatoarele din biblioteci stocheaz milioane de intrri i acceseaz citaii din sute de publicaii; sistemele de procesare a tranzaciilor n bnci i casele de brokeraj pstreaz conturi care genereaz fluxul mondial de capital; motoarele de cutare World Wide Web scaneaz sute de pagini Web pentru a produce rspunsuri cantitative la interogri aproape instantaneu; sute de mici ntreprinztori i organizaii utilizeaz bazele de date pentru a stoca orice de la inventare i personal la secvene ADN i informaii despre obiecte provenite din spturi arheologice. Un produs software care presupune managementul fiierelor suport descompunerea logic a unui fiier n nregistrri. Fiecare nregistrare descrie o entitate i const dintr-un numr de cmpuri, unde fiecare cmp d valori unei anumite proprieti (sau atribut) al entitii.
4

Programarea rapid a aplicaiilor pentru baze de date relaionale

Un fiier simplu cu nregistrri este adecvat pentru date comerciale cu complexitate redus, cum ar fi inventarul dintr-un magazin sau o colecie de conturi curente pentru clieni. Un index al unui fiier const dintr-o list de identificatori (care disting nregistrrile) mpreun cu adresele nregistrrilor. De exemplu numele poate fi folosit pentru a identifica nregistrrile unor persoane. Deoarece indexurile pot fi mari ele sunt uzual structurate ntr-o form ierarhic i sunt navigate cu ajutorul pointerilor. Formele ierarhice arborescente sunt frecvent folosite datorit vitezei mari de traversare. Problemele reale ale procesrii datelor solicit frecvent legarea datelor din mai multe fiiere. Astfel, n mod natural s-au conceput structuri de date i programe de manipulare a datelor care s suporte legarea nregistrrilor din fiiere diferite. 3 modele de baze de date au fost create pentru a suporta legarea nregistrrilor de tipuri diferite: modelul ierarhic: tipurile nregistrrilor sunt legate ntr-o structur arborescent (de exemplu nregistrrile unor angajai s-ar putea grupa dup o nregistrare care s descrie departamentele n care acetia lucreaz); IMS (Information Management System produs de IBM) este un exemplu de astfel de sistem; modelul reea: se pot crea legturi arbitrare ntre diferitele tipuri de nregistrri (de exemplu nregistrrile unor angajai s-ar putea lega pe de o parte de o nregistrare care s descrie departamentele n care acetia lucreaz i pe de alt parte supervizorii acestora care sunt de asemenea angajai); modelul relaional: n care toate datele sunt reprezentate ntr-o form tabelat simpl. n modelul relaional descrierea unei entiti particulare este dat de setul valorilor atributelor, stocate sub forma unei linii n tabel i numit relaie. Aceast legare a n valori de atribute furnizeaz cea mai potrivit descriere a entitilor din lumea real.

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

Modelul relaional suport interogri (cereri de informaii) care implic mai multe tabele prin asigurarea unor legturi ntre tabele (operaia join) care combin nregistrri cu valori identice ale unor atribute ale acestora. Statele de plat, de exemplu, pot fi stocate ntr-un tabel iar datele personalului beneficiar n altul. Informaiile complete pentru un angajat pot fi obinute prin reunirea acestor tabele (join) pe baza numrului personal de identificare. Pentru a suporta o varietate de astfel de structuri de baze de date, o larg varietate a software denumit sistem de gestiune a bazelor de date este necesar pentru a stoca i reda datele i pentru a pune la dispoziia utilizatorului posibilitatea de a interoga i actualiza baza de date. Gestiunea datelor presupune o structurare a acestora realizat prin definirea bazelor de date. Pentru ca exploatarea bazelor de date s fie eficient, e necesar ca acestea s aib un grad nalt de abstractizare. Din punct de vedere practic, este normal s se defineasc mai multe nivele de abstractizare. Putem lua n considerare: Nivelul fizic (sau intern). La acest nivel se gsesc toate detaliile legate de reprezentarea datelor pe un suport de memorie; Nivelul logic (sau conceptual). Se ia in considerare aspectul semantic al datelor; conteaz coninutul efectiv al lor, precum i relaiile (legturile) dintre acestea; se descriu toate bazele de date folosind structuri relativ simple n funcie de necesitile impuse de anumite aplicaii; Nivelul extern. Acest nivel de abstractizare este cel n care se poate descrie coninutul unor baze de date; are n vedere simplificarea interaciunii utilizator - baz de date. Pentru descrierea bazelor de date facem apel la noiunea de structur de date care reprezint un ansamblu de instrumente conceptuale care permit descrierea datelor, a legturilor dintre ele, semantica lor sau constrngerile la care ele sunt supuse. Bazele de date evolueaz n timp. Mulimea informaiilor coninute n baza de date la un moment dat definete instanierea bazei de date. n 1970, Ted Codd (IBM, printele SQL), nemulumit de performanele COBOL i IMS formuleaz principiul de lucru al bazelor de date relaionale. Codd afirm c SGBD trebuie s recunoasc comenzi simple i trebuie s fie aproape de utilizatori prin punerea mpreun a comenzilor potrivite pentru gsirea a ceea ce se dorete. Ceea ce Codd numete model relaional se bazeaz pe dou puncte cheie: s furnizeze un mod de descriere a datelor cu numai cu structura lor natural, ceea ce nseamn c trebuie realizat acest lucru fr impunerea nici unei structuri adiionale pentru scopuri de reprezentare n calculator;
6

Programarea rapid a aplicaiilor pentru baze de date relaionale

de asemenea, s furnizeze baza pentru un limbaj de date de nivel nalt care va conduce la o maxim independen ntre programe, pe de o parte, i reprezentarea n calculator, pe de alt parte. O baz de date relaional extinde conceptul de tabele; este compus dintr-o mulime

de tabele ntre care se definesc relaii n sens matematic. S presupunem c avem T1, T2, ..., Tm m tabele ntr-o baz de date. Fiecare dintre aceste tabele are o structur (Ti = {Ci0, Ci1, ...}) ce conine cmpuri (Cij). Pentru a defini relaii (R T1...Tm) ntre aceste tabele, este necesar ca cel puin un cmp din fiecare tabel s suporte o relaie de ordine strict (nota bene: nu e necesar existena logic a acestei construcii; ea se poate construi i din structura fizic a informaiei din tabele, cum ar fi numrul nregistrrii). Fie aceste cmpuri Ci0. Asta nseamn c valorile (vi0k, k=1,...) din nregistrrile corespunztoare acestor cmpuri Ci0 sunt ordonate strict (vi01 < vi02 < ...). Nota bene: nu e necesar ca relaia de ordonare strict s fie strict cresctoare, cum nu e necesar ca valorile vi01, vi02, ... s fie stocate n nregistrri consecutive; este necesar doar existena relaiei de ordine strict, care s permit referirea individual a fiecrei valori, i prin aceasta, identificarea n mod unic a fiecrei nregistrri k: (vi0k, vi1k, ...). Relaia R ntre tabele este n fapt o submulime a C10C20...Cm0. Reprezentarea figurativ a relaiei R este: R ... C10 ... Cm0 ... ... ... r1 c101 ... cm01 rn c10n ... cm0n n mod uzual, pentru mulimea T1...Tm se folosete noiunea de univers (U). Elementele universului U se numesc atribute. Cmpurile Ci0 se noteaz (pentru simplitate) Ai. Mulimea valorilor atributelor Ai (vi0k, k 1) se noteaz cu Di. Elementele relaiei r1,..., rn se numesc tuple i se noteaz cu t1, ..., tn. Folosind aceste notaii, relaia R devine: R A1/D1 ... Am/Dm t1 ... tn a11 ... cn1 ... ... ... a1m ... anm

Coloanele acestui tablou se identific prin atributele Ai i domeniile corespunztoare Di, scriind Ai/Di (1 i m). Mulimea ordonat a atributelor A = A1, ..., Am care definesc relaia R se numete schem relaional. Facem distincie ntre schema relaional A i instanierea acesteia (t1, ... tn). Convenim s notm relaia R de schem A, sub forma: r(A) sau r(A1, A2, , Am). Dac luam n considerare tuplul ti care definete linia i din tabloul R de mai
7

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

sus, adic ti ai1...aim, convenim ca s folosim aceeai notaie ti pentru ti = (ai1, ..., aim) D1...Dm. Convenim, de asemenea s notm ti[Aj] = aij Dj , 1 i n, 1 j m. De asemenea, dac avem K = (Aj1, Aj2, ..., Ajk), k m, atunci ti[K] = (aij1 , aij2 ,..., aijk ) .

ntr-o baz de date relaional noiunea de cheie are un rol important. Numim cheie a unei relaii R de schem A, adic r(A), o submulime minimal K, K A cu proprietatea c ti[K] tj[K], pentru i j, 1 i n, 1 j m. Recapitulnd, principalele concepte utilizate la descrierea logic (conceptual), respectiv formal, apoi uzual i fizic a elementelor de organizare a datelor sunt: formal relaie tuplu atribut domeniu uzual tablou linie coloan tip de dat fizic fiier nregistrare cmp tip de dat

Cu alte cuvinte modelul relaional consist din:


independena datelor fa de hardware i modul de memorare; navigarea automat sau un limbaj de nivel nalt neprocedural pentru accesarea datelor;

n loc ca s se proceseze cte o nregistrare, programatorul utilizeaz limbajul pentru a specifica operaii unice care trebuie realizate asupra ntregului set de date. Limbajele de generaia a 4-a (4th GLs) sunt mai aproape de limbajul uman ca limbajele de nivel nalt (de generaia a 3-a, 3th GLs). Primele dintre acestea sunt FOCUS (Information Builders) SQL (IBM), QBE (Querry by example, IBM), dBASE (succesorul lui SQL). Necesitatea pentru mai mult flexibilitate i performan din partea modelelor de date cum ar fi de a suporta aplicaiile tiinifice sau inginereti a fcut ca s se extind conceptul de model relaional aa nct intrrile n tabele s nu mai fie simple valori ci s poat fi programe, texte, date nestructurate mari n form binar sau orice alt format solicitat de utilizator. Un alt progres s-a fcut prin ncorporarea conceptului de obiect devenit esenial n limbajele de programare. n bazele de date orientate obiect toate datele sunt obiecte. Obiecte se pot lega ntre ele printr-o relaie de apartenen pentru a forma o familie mai larg i mai divers de obiecte (n anii '90 au fost lansate primele sisteme de management orientat obiect OODMS). Datele care descriu un transport pot fi stocate, de exemplu, ca familie mai larg care poate conine automobile, vapoare, vagoane, avioane. Clasele de obiecte pot forma ierarhii n care obiecte individuale pot moteni proprieti de la obiectele situate deasupra n ierarhie. Bazele de date multimedia, n care vocea, muzica i informaia video se stocheaz
8

Programarea rapid a aplicaiilor pentru baze de date relaionale

mpreun cu informaiile de tip text, devin tot mai frecvente i i imprim trendul n dezvoltarea sistemelor de gestiune a bazelor de date orientate obiect. O secven tipic pentru un limbaj 4th GL este: FIND ALL RECORDS WHERE NAME IS "TUCKER" SQL (Structured Query Language) este un limbaj standard industrial pentru crearea, actualizarea i interogarea sistemelor de management ale bazelor de date relaionale. Prima versiune standardizat a SQL a aprut n 1986 i conine construciile de baz ale limbajului pentru definirea i manipularea tabelelor de date. O revizie n 1989 a adugat limbajului extensii pentru integritatea referenial i generalizeaz constrngerile de integritate. O alt extensie n 1992 furnizeaz faciliti n manipularea schemelor i administrarea datelor i de asemenea substaniale mbuntiri n ceea ce privete definirea i manipularea datelor. Dezvoltarea sistemului este n desfurare pentru a face din acesta un limbaj computaional complet pentru definirea i managementul obiectelor complexe persistente. Aceasta include generalizarea i specializarea ierarhiilor, motenire multipl, tipuri de dat utilizator, generatoare i construcii declarative, suport pentru sistemele bazate pe cunotine, expresii interogative recursive i instrumente adiionale de administrare a datelor. Include de asemenea tipuri abstracte de date, identificatori de obiecte, metode, motenire, polimorfism, ncapsulare i toate celelalte faciliti care sunt asociate uzual cu managementul datelor de tip obiect. n prezent, industria bazelor de date, ca segment al industriei de software genereaz anual aproximativ 8 miliarde de dolari. Companiile care dein supremaia pe acest segment de pia sunt IBM, Oracle, Informix, Sybase, Teradata (NCR), Microsoft, Borland.

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

2. Formele Backus-Naur
BNF (Backus-Naur Form, numite originar Backus Normal Form i redenumite apoi la sugestia lui Donald Knuth) formeaz o metasintax utilizat pentru a exprima gramatici independente de context. BNF este unul dintre cele mai utilizate notaii metasintactice pentru specificarea sintaxei limbajelor de programare i seturile de comenzi ale acestora. pentru detalii suplimentare vezi http://src.doc.ic.ac.uk/computing/internet/rfc/rfc2234.txt. Fie o form BNF a unei adrese potale din U.S.:
<postal-address> ::= <name-part> <street-address> <zip-part> <personal-part> ::= <name> | <initial> "." <name-part> ::= <personal-part> <last-name> [<jr-part>] <EOL> | <personal-part> <name-part> <street-address> ::= [<apt>] <house-num> <street-name> <EOL> <zip-part> ::= <town-name> "," <state-code> <ZIP-code> <EOL>

Aceasta se traduce prin: O adres potal const dintr-o parte de nume, urmat de o parte de adres stradal i urmat de o parte de cod potal. O parte personal const din prenume sau dintr-o iniial urmat de un punct. O parte de nume const din urmtoarele: o parte personal urmat de nume urmat de un opional <jr-part> (Jr., Sr., sau numrul dinastiei) i sfrit de linie sau o parte personal urmat de o parte de nume (aceasta ilustreaz recursivitatea n formele BN, acoperind cazul persoanelor care folosesc mai multe nume sau prenume i/sau iniiale). O adres stradal const dintr-un specificator opional de apartament, urmat de numr i numele strzii. Partea de cod potal const din numele oraului, urmat de virgul, urmat de codul statului i oraului urmat de sfrit de linie. De observat c multe lucruri (cum ar fi formatul prii personale, specificatorul de apartament sau de codul oraului au rmas nespecificate. Aceste detalii lexicale sunt presupuse evidente din context sau sunt specificate n alt parte. Sunt multe variante i extensii ale BNF, de exemplu prin introducerea wildcardurilor ? i *. Dou dintre acestea sunt EBNF i ABNF.

10

Programarea rapid a aplicaiilor pentru baze de date relaionale

3. Baze de date relaionale


Fie un simplu exemplu de carte de adrese, nimic prea complex, doar ceva care memoreaz nume, adrese, numere de telefon, emailuri i att. S memorm acum astfel de informaii ntr-un fiier text cu delimitatori. Dac prima linie servete ca cap de tabel i virgula este folosit ca separator, acest fiier ar putea arta ca mai jos:

Nu este mult de vzut la acesta, ns este cel puin ncrcabil n calculator. Utiliznd orice limbaj de programare (din generaia a 3-a) se poate scrie un cod care s deschid acest fiier i s preia informaia. Oricum am pune problema ns n implementarea acestui cod, se arat a fi o bun bucat de cod de scris. Dac se dorete ca aceast informaie s se poat ordona i interoga dup o varietate de criterii, care de exemplu s sorteze alfabetic dup nume sau s gseasc toi oamenii care au o anumit valoare a codului de localitate, este ntr-adevr dureros. Ne putem lovi acum de o alt problem major dac datele dorim s fie utilizate n cadrul unei reele de o mulime de utilizatori, cum ar fi modificrile pe care le-ar efectua un utilizator n timp ce alt utilizator se poziioneaz pe o nregistrare mai jos n fiier. Probabil va trebui s blocm la scriere fiierul atunci cnd mai muli utilizatori l acceseaz. Este evident deci c soluia memorrii acestuia sub form de fiier text nu a fost fericit. Este nevoie de un sistem de stocare care s reduc cantitatea de prelucrri i accesri ale informaiei din fiier de ctre programul responsabil cu gestiunea acestuia. Un tabel simplu ca tabelul 1 ar trebui s funcioneze tocmai bine: Tabelul 1. Tabel simplu pentru stocarea datelor

Acum acesta este aproape convenabil. Este uor de ajuns la sfrit i de verificat dac vreun program acceseaz acest tabel. Este uor de accesat o linie din acest tabel odat fr a afecta pe ceilali. n acest sens, dac 2 sau mai muli utilizatori doresc s insereze informaii n aceast tabel ei nu se vor suprapune n aciunea lor. Dac se va dori extragerea unor informaii din tabel, cum ar fi toate persoanele care sunt din California, nu va fi necesar s se
11

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

prelucreze i ordoneze fiierul. Un program care ar opera pe aceast tabel va trebui doar s rezolve urmtoarea subproblem: afieaz toate liniile la care coninutul coloanei State este egal cu 'CA'. Da, este frumos, ns nu este destul. Obiectivul Dr. Codd, printele SQL, a fost de a avea un model al informaiei care s nu creeze anomalii. Se pot identifica 3 situaii de anomalie: la Actualizare, tergere i Inserare. S presupunem c o structur tabelat poate rapid i uor gestiona cereri multiple i s analiz ce se ntmpl dac informaia devine ceva mai complex, cum ar fi cazul ilustrat n tabelul 2: Tabelul 2. Tabel cu stocare problematic

Ce se ntmpl dac de exemplu, firma BigCo se hotrte s-i schimbe sediul? Va trebui s actualizm adresa sa n dou linii. Poate fi i o surs de erori dac modificarea se face manual n fiecare linie i cineva introduce greit una din cele dou noi adrese. Rezult deci c o cale mai bun de a manipula aceste date este de a lua numele companiei i adresa acesteia i a le pune ntr-o tabel separat. Rezultatul poate fi ca n tabelele 3 i 4. Tabelul 3. Companii

Tabelul 4. Persoane de contact

Ceea ce s-a realizat n acest caz prin separarea celor dou categorii de informaii i introducerea unei coloane de legtur (company_id) este c s-a creat o relaie ntre cele dou tabele i de aici vine numele de baz de date relaional. Dei avem exact aceleai informaii ca la nceput, totui, exist o diferen, faptul c tocmai le-am segmentat. Putem acum schimba adresa att pentru Jay ct i pentru Brad prin modificarea unei singure linii. Acesta este un fapt convenabil, oricum.
12

Programarea rapid a aplicaiilor pentru baze de date relaionale

S presupunem c se ntmpl ca d-nul Doe s fie ters din baza de date n forma din tabelul 2. Dar se poate ntmpla ca cineva s vrea s cear lista tuturor companiilor cu care ai avut contact anul trecut. n forma curent, tergndu-l pe Doe, vom terge i informaia despre companie odat cu el. Aceast problem se numete tergerea anormal. Tabelul 2. Tabel cu tergere anormal

Dac ns se pstreaz structura din tabelele 3 i 4, se poate face tergerea numai din tabela 4, i nregistrarea cu compania poate s rmn n tabela 3, aa nct n acest caz problema tergerii anormale nu mai exist. Privind din nou datele din tabelul 2 putem observa c scopul principal al acestei tabele este de a stoca contacte i nu companii. Situaia devine paradoxal atunci cnd dorim s inserm o companie dar nu i persoana de contact. De cele mai multe ori, ar trebui s ateptm pn cnd avem date specifice de contact pentru ca s putem aduga n baza de date. Este evident o restricie ridicol.

13

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

4. Microsoft Visual FoxPro


Microsoft Visual FoxPro face parte din pachetul Microsoft Visual Studio distribuit de firma Microsoft (TM). ncepnd cu versiunea 6.0, Microsoft Visual Studio este un pachet integrat, care conine Visual Basic, Visual C++, Visual FoxPro, InterDev, Visual J++, SourceSafe i o bogat documentaie denumit MSDN (Microsoft Developer Network Library).

Lansarea aplicaiei n execuie se poate face din Taskbar, StartProgramsMicrosoft Visual Studio 6.0Microsoft Visual FoxPro 6.0 sau dac a fost instalat cu opiunile implicite de instalare din locaia: C:\Program Files\Microsoft Visual Studio\Vfp98\VFP6.EXE". La pornire se activeaz un Wizard opional:

care se poate dezactiva prin marcarea Checkbox-ului. Pentru a ajunge la meniul aplicaiei se alege opiunea Close this screen. Cu ajutorul barei de instrumente se pot crea sau deschide baze de date, tabele, interogri, forme, rapoarte, etichete, programe, clase sau proiecte. Oricare din operaiile efectuate cu ajutorul barei de instrumente se pot efectua i din fereastra de comenzi; ea se activeaz/dezactiveaz ca n fig.

fereastra de comenzi

14

Programarea rapid a aplicaiilor pentru baze de date relaionale

Operaiile asupra bazelor de date create pe care le efectum din bara de instrumente sunt oricum nregistrate n fereastra de comenzi, aceasta pstrnd istoria activitii sesiunii de lucru curente:

15

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

5. Crearea unei baze de date


Cu ajutorul butonului New se activeaz o fereastr cu butoane radio ca n figur:

Se poate alege a se crea o baz de date cu ajutorul wizardului ca n figur n care ntr-o succesiune de 5 pai se precizeaz caracteristicile noii baza de date care se dorete s se creeze. Baza de date aa cum s-a putut constata n exemplul prezentat anterior este compus din mai multe tabele. S presupunem c vrem s memorm informaiile prezentate n tabelele 3 i 4. n acest caz, putem alege s construim o nou baz de date pe baza creri unui nou fiier n care apoi s PERSOANE_CONTACT. Alegem deci New/Database, New File, introducem numele noii baze de date (s spunem CLIENTI cnd se genereaz urmtorul rezultat: adugm cele dou tabele, i anume COMPANII i

16

Programarea rapid a aplicaiilor pentru baze de date relaionale

n Aceast coal avem posibilitatea s construim structura celor dou tabele (COMPANII i PERSOANE_CONTACT). Activarea consecutiv a butoanelor New Table i apoi din nou New Table urmat de introducerea numelui primei tabele (COMPANII) duce la activarea constructorului de tabele:

Se precizeaz succesiv n aceast tabel numele, tipul, lungimea i precizia zecimal acolo unde este cazul pentru fiecare cmp al bazei de date, pn cnd se obine un rezultat ca n figura urmtoare:

Se va aciona butonul Ok i n acest moment se va aduga automat pe foaia de lucru a bazei de date desenul din dreapta care reprezint tabela creat. Se repet procedura i pentru cea de-a doua baz de date, cnd se obine:

17

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

Se poate stabili acum o relaie de validare la completare. Se activeaz cu click dreapta ca n figur proprietile cmpului contact_id din persoane_contact i din fereastra de modify se stabilete regula:
Companii.company_id > 0

Se completeaz apoi bazele de date cu informaiile necesare prin dublu click asupra tabelelor, cnd se activeaz ferestre de tip browse n care se adaug cte o nregistrare cu CTRL+Y sau Table/Append New Record:

Dup aceasta oricnd ne putem ntoarce la foaia tabelei pentru a vizualiza coninutul tabelelor sau pentru a face adugri sau modificri.

18

Programarea rapid a aplicaiilor pentru baze de date relaionale

6. Normalizarea unei baze de date


Aa cum s-a putut vedea n exemplul prezentat, crearea unei baze de date relaionale presupune identificarea tuturor relaiilor ntre atributele entitilor care sunt stocate sau se vor stoca n baza de date. Se poate ca aceste relaii s se identifice dup ce structura bazei de date a fost creat. Oricum, procesul prin care se elimin cele 3 anomalii (la modificare, la tergere i la adugare) se numete normalizare. nelegerea normalizrii este vital pentru lucrul cu baze de date relaionale. Normalizarea nu este un proces cu care se ncepe sau se termin designul bazei de date. Este un proces care se aplic oricnd se identific anomalii. Experiena i instinctul totdeauna joac un rol important n crearea unei bune baze de date. Normalizarea se poate realiza prin trecerea succesiv a datelor prin cteva forme normale. Pn n prezent s-au stabilit 7 astfel de forme normale, dintre care primele 3 asigur o calitate destul de bun a organizrii relaionale a bazei de date i majoritatea bazelor de date relaionale sunt organizate pn la aceast form.
Prima form normal a datelor necesit ca:

datele s fie structurate ntr-un tabel; fiecare coloan trebuie s conin o singur valoare de un singur tip, adic s existe o singur valoare n fiecare celul; nu sunt permise iruri sau alte forme de reprezentare a mai mult de o valoare pe celul;

fiecare coloan trebuie s aib un nume unic; tabelul trebuie s aib un set de valori care identific n mod unic o linie; valorile din aceast coloan se numesc chei primare pentru tabel; nu trebuie s existe dou linii identice n tabel; nu sunt permise grupuri repetitive de date; Ultima afirmaie necesit explicaii. Fie datele din tabelul 5: Tabelul 5. Tabel cu grupuri repetitive de date

Cum se observ, zona marcat conine informaii identice. Ea formeaz un grup repetitiv. Dup ce vom nltura aceste coloane i le plasm n propriul lor tabel se ajunge la prima form normal.

19

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

Cheile primare sunt o coloan sau un set de coloane care au pe fiecare linie o valoare unic n irul valorilor coloanei respective. n tabelul 5 se poate vedea cum s-a inclus o astfel de coloan (company_id). Toate browserele de baze de date posed un instrument de a defini o astfel de coloan. De exemplu, n MySQL aceasta se numete cmp auto_increment. Pot ns fi chei primare seriile de buletin, adresele email sau URL-urile. Singura condiie este ca datele s fie unice. De exemplu, dac informaiile de contact dintr-o astfel de agend de adrese presupun memorarea de informaii pentru companii cu mai multe reprezentane, probabil cea mai bun soluie este de a memora identificatorul reprezentanei i adresa ntr-un tabel separat n care company_id i eventual company_city s formeze cheia primar. Dependena datelor este un element esenial n organizarea lor relaional. O coloan este dependent (de cheia primar) dac ea nu poate exista n tabel cnd cheia primar este nlturat.
A doua form normal intervine cnd la sfritul primei normalizri obinem o cheie

primar format din mai multe coloane. S presupunem c n urma procesului de separare a tabelei de adrese (v. tabelul 5) obinem o tabel n forma: Tabelul 6. Tabel care nu e n forma normal 2

Aici, company_name i company_location formeaz cheia primar multipl. O adugare anormal se produce atunci cnd dorim s adugm o nou adres pentru BigCo Co. Vom avea numele CEO (Chief Executive Officer) repetat n linia adugat. Transformm acest tabel n a doua form normal prin eliminarea liniilor care sunt doar parial dependente de cheia primar. CEO este dependent doar de coloana company_name i nu este dependent de coloana company_location. Pentru a ajunge la a 2-a form normal, se mut liniile care sunt doar parial dependente de cheia primar multicoloan ntr-un tabel propriu. A doua form normal nu se aplic pentru tabelele care au o cheie primar format de o singur coloan.
A 3-a form normal rezolv dependenele tranzitive. O dependen tranzitiv este

atunci cnd o coloan exist n tabel dar nu este condiionat direct de cheia primar. n loc de aceasta, ea este condiionat de alte cmpuri, care la rndul lor sunt condiionate de cheia primar.

20

Programarea rapid a aplicaiilor pentru baze de date relaionale

O cale rapid de a se ajunge la a 3-a form normal este de a ne uita la toate cmpurile din tabel i de a ne ntreba dac aceste cmpuri descriu cheia primar. Dac nu, locul lor nu este aici (n aceast tabel). Dac se dorete ca agenda s memoreze mai multe informaii de contact, ca n tabela urmtoare: Tabelul 7. Tabel care nu e n a 3-a form normal

atunci se pune problema dac nu cumva prin adugarea acestora nu se altereaz normalizarea acesteia. Este posibil, chiar probabil ca un asistent s deserveasc mai multe reprezentane, ceea ce face ca assistant_name i assistant_phone s apar n tabel mai mult dect odat. Acestea vor forma atunci un grup repetitiv, care deja a fost discutat cum se elimin.

21

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

7. Tipuri de relaii
Este esenial a se crea un grup de tabele care s nu aib anomalii. Acestea totdeauna includ coloane care menin (definesc) relaiile ntre aceste tabele. Sunt 3 tipuri de relaii n domeniul bazelor de date:

relaii 1 la n: de departe cel mai frecvent caz, cnd o valoare dintr-o coloan refer mai multe cmpuri ntr-un alt tabel:

Figura urmtoare arat cum tabela de Companii poate fi unul din capetele nc unei relaii 1 la n cu tabela reprezentanelor:

22

Programarea rapid a aplicaiilor pentru baze de date relaionale

relaii 1 la 1: sunt de fapt relaii 1 la n n care o linie dintr-un tabel este legat cu o linie dintr-un alt tabel; ele rezult de obicei n urma proceselor de normalizare, aa cum ar putea rezulta n urma separrii datelor din tabelul 7:

relaii m la n: acestea lucreaz diferit fa de cele dou anterioare; s presupunem c compania pstreaz informaii despre o varietate de publicaii care pot fi distribuite persoanelor de contact, n funcie de cererea acestora; pentru nceput, se creeaz tabela care va memora tipurile de publicaii: Tabelul 8. Tabela publicaiilor

Se poate acum aduga o coloan n tabelul de persoane de contact pentru a preciza publicaiile care se vor trimite, ca n tabelul 9: Tabelul 9. Persoane de contact

Coloana newsletters conine mai mult de o valoare, fiind de fapt un ir de valori. Aa cum s-a menionat la prima form normal aceast situaie nu trebuie s apar niciodat n baza de date. Soluia este crearea nc unei tabele pentru a memora aceste informaii, aa cum se exemplific n tabelul 10.

23

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

Tabelul 10. Clieni ai publicaiilor

Iat acum c aceast tabel constituie baza unei relaii m la n n baza de date:

24

Programarea rapid a aplicaiilor pentru baze de date relaionale

8. Aspecte ale stocrii datelor n BD relaionale


Integritatea referenial. Exemplele discutate pn acum au folosit chei strine. O

cheie strin este o coloan care refer o cheie primar dintr-o alt tabel a bazei de date cu ajutorul creia se realizeaz relaia ntre cele dou tabele. De exemplu, tabelele n 3 i 4:

coloana company_id din tabela de contacte este o cheie strin ctre tabela de companii. n anumite SGBD-uri, ca VFP, Oracle, Sybase sau PostGres, tabelele pot fi create cu definirea explicit a cheilor strine (field validation/rule n VFP) aa nct adugarea va fi acceptat de ctre sistem doar dac valoarea cheii strine exist n tabela referit ca cheie primar. n alte SGBD-uri, ca MySQL, cheile strine nu au aceast semnificaie. n acest caz, programatorul trebuie s efectueze civa pai suplimentari nainte de a aduga sau modifica nregistrri, cum ar fi (pentru tabelele 3 i 4):

preia toate valorile pentru company_id din tabela de companii; verific dac valoarea pentru company_id pe care intenionezi s o inserezi n tabela de contacte exist n irul de date obinut mai sus; dac ea exist, insereaz valorile;
Tranzacii. n BD relaionale au loc schimbri de apartenene n grupuri. Multe

schimbri necesit ca liniile s fie actualizate n mai multe tabele deodat. n unele cazuri acest lucru se face printr-o succesiune de instruciuni care preiau datele acolo unde trebuie s fie stocate. Un site pentru comerul electronic poate conine un cod care s efectueze operaiile: 1. adaug clientul n tabela de clieni; 2. adaug lista de cumprturi n tabela de cumprturi; 3. scade cantitile comandate din tabela de stocuri. Cnd se lucreaz cu o serie de pai ca aceasta, exist un potenial pentru probleme care pot apare. Dac sistemul se blocheaz sau iese n decor ntre paii 2 i 3, atunci baza de date conine date eronate.
25

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

Pentru a preveni o astfel de situaie, unele SGBD-uri folosesc conceptul de tranzacii. Cu acesta, programatorul poate identifica un grup de comenzi. Dac una dintre aceste comenzi eueaz n nregistrare, ntregul grup este respins i baza de date este restaurat la starea sa nainte de efectuarea grupului de comenzi (tehnologia COMMIT/ROLLBACK).
Proceduri de memorare. SGBD-urile cu mai mare flexibilitate permit inserarea de cod

procedural n baza de date (ceva foarte asemntor cu PHP i Perl). Sunt cteva avantaje care acest fapt le confer:

se poate reduce cantitatea de cod necesar pentru aplicaiile de mrime medie; se asigur baza de cunotine (proceduri) pentru execuia interogrilor i tranzaciilor de pe sisteme de operare diferite i din SGBD-uri diferite n ceea ce privete sintaxa.

26

Programarea rapid a aplicaiilor pentru baze de date relaionale

9. Lucrul cu Project Manager n VFP


Project Manager este instrumentul de organizare primar al lucrului cu date i obiecte n VFP. Un proiect este o colecie de fiiere, date, documente i obiecte VFP care sunt salvate ca un fiier cu extensia .PJX. Se poate utiliza Project Manager pentru a organiza i manipula fiiere, crea tabele i baze de date, scrie interogri, defini forme i rapoarte i construi aplicaii. Pentru construcia de aplicaii, un bun ndrumar este Programmers Guide din MSDN. Pentru a crea un nou proiect, se urmeaz succesiunea de pai: 1. Se acioneaz butonul New din bara de instrumente; 2. Se selecteaz Project din caseta de butoane radio; 3. Se apas butonul New File cnd se va activa o fereastr de dialog; 4. n caseta de editare cu eticheta Enter project se introduce numele dorit pentru proiect; 5. Se apas butonul Save cnd se va genera un nou proiect cu numele ales.

Se pot acum aduga proiectului tabele (fiiere .DBF) sau baze de date (fiiere .DBC). n Project Manager datele sunt grupate pe categorii i prezentate ntr-o form ierarhic. Pentru a urmri un tip de fiier sau obiect se activeaz boxa + a grupului corespunztor. Activnd tabulatorul Data putem restrnge domeniul de vizualizare al componentelor proiectului la nivelul de date, i anume: bazele de date, tabelele, interogrile i vizualizrile. Acionnd unul din butoanele New, Add, Modify, Run, Remove sau Build se alege operaia specific asupra componentei sau categoriei selectate. Aciunile care se pot efectua asupra datelor sunt descrise n continuare.

27

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

10. Crearea tabelelor i indexurilor


Aa cum s-a artat, pentru crearea unei tabele se poate folosi Table Wizard sau se poate lucra direct cu Table Designer. Tipurile de date permise sunt descrise n tabelul urmtor. Tabelul 11. Tipuri de date n VFP Tip dat Character Currency Numeric Float Date DateTime Double Integer Logical Memo Descriere Text alfanumeric Uniti monetare Numere ntregi sau cu zecimele La fel cu Numeric Lun, zi i an Lun, zi, an, or, minut i secund Numr n dubl precizie Exemplu Adresa unui client Pre de cumprare Numrul de produse comandate Data la care a fost fcut comanda Data, ora la care un angajat vine la serviciu Date provenite din experimente ce necesit nalt grad de precizie Numrul de nregistrare al unei comenzi Dac o comand a fost sau nu fcut Lista apelurilor telefonice efectuate

Valori numerice fr zecimale True sau False Text alfanumeric de lungime necunoscut General OLE Foaie de calcul din Excel Character La fel cu Character dar valorile nu Parolele unor utilizatori stocate ntr-o (Binary) sunt translatate atunci cnd se tabel i folosite n diferite ri schimb codul de pagin Memo La fel cu Memo dar valorile nu sunt Scriptul de logare al unui utilizator (n (Binary) translatate cu schimbarea codului de diferite ri) pagin Dac se dorete ca cmpul s accepte introducerea de valori nule, se check-eaz butonul de pe coloana NULL din Table Designer. Pentru a aduga nregistrri n tabel din Project Manager se parcurg urmtorii pai: 1. n Project Manager se selecteaz numele tabelei; 2. Se apas butonul Browse; 3. Din meniu, se selecteaz View/Append Mode; 4. Se introduc valorile noii nregistrri n fereastra Browse; Dac se dorete vizualizarea fiecrui cmp pe linie separat se selecteaz din meniu View/Edit; revenirea la starea anterioar se face tot din meniu View/Browse. n formatul View/Browse fiecare linie reprezint o nregistrare iar fiecare coloan reprezint cmpurile nregistrrii. Se pot crea (dup cum se poate vedea din Project Manager) dou tipuri de tabele: tabelele ncorporate ntr-o baz de date (database table) i tabelele libere (free table), care sunt independente de orice baz de date.

28

Programarea rapid a aplicaiilor pentru baze de date relaionale

Deplasarea ntr-o tabel. Utiliznd barele de defilare orizontale i verticale ne putem

deplasa i vizualiza cmpuri diferite i nregistrri diferite. Se pot folosi de asemenea sgeile i TAB-ul. Pentru a accesa o anume nregistrare, pentru a ne deplasa de la o nregistrare la alta, pentru a ajunge la nceputul sau sfritul tabelei se poate accesa din meniu Table/Got o Record > cnd se activeaz un submeniu din care se alege opiunea dorit.
Pentru a edita cmpurile de tip Character, Numeric, Logical, Date sau DateTime este

suficient s plasm cursorul n celula dorit i s scriem valoarea dorit. Editarea cmpurilor Memo se face cu dublu click n cmpul dorit (sau CTRL+PgDn). Atunci se activeaz o fereastr de editare pentru coninutul cmpului memo. Un cmp general conine un obiect OLE (detalii la http://www.microsoft.com/data/oledb/prodinfo.htm) legat sau ncapsulat. Se poate edita acest obiect cu dublu click n celula sa, cnd se va activa (sau se va ncerca activarea) aplicaiei sale asociate pentru editare.
tergerea nregistrrilor. tergerea nregistrrilor dintr-o tabel este un proces n 2

pai n VFP. Primul, marcarea nregistrrilor pentru tergere de exemplu cu click pe boxa din stnga fiecrei nregistrri de ters. Al doilea, din meniu, Table/Remove Deleted Records care va terge nregistrrile marcate pentru tergere. Aceasta este o tergere permanent i nu poate fi restaurat, spre deosebire de prima care este doar o tergere logic i poate fi restaurat prin demarcarea nregistrrilor prin acelai procedeu. Eliminarea nregistrrilor terse va nchide tabela aa nct aceasta trebuie redeschis pentru a putea fi utilizat. Pentru a terge mai multe nregistrri care verific o condiie se poate folosi fereastra de dialog care se activeaz din meniu Table/Delete Records Analog, pentru a restaura nregistrri care verific o condiie se poate accesa din meniu Table/Recall Records... De exemplu, ca n figur, se pot selecta toate nregistrrile care au valoarea UK n cmpul Country, folosind expresia FOR Country = 'UK':

Fereastra de Browse se poate configura dup dorin, prin (re)dimensionarea limii coloanelor, activarea sau dezactivarea liniilor de grid sau divizarea ferestrei de Browse n dou poriuni. Aceste operaiuni nu vor afecta structura actual a tabelei. Pentru a modifica structura unei tabele, se alege n Project Manager opiunea Modify. Structura tabelei este ncrcat atunci n Table Designer i utilizatorul are posibilitatea s
29

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

efectueze modificrile dorite. Pentru a terge un cmp din tabel se selecteaz cmpul i se apas butonul Delete. Afiarea nregistrrilor n fereastra de Browse se poate face selectiv dup o condiie impus nregistrrilor. De asemenea se poate limita accesul la anumite cmpuri ale tabelei prin setarea unui filtru de cmpuri. Pentru impunerea unui filtru, din meniu, Table/Properties:

Odat ce a fost creat o tabel, aceasta se poate ordona pentru a accelera regsirea informaiei prin folosirea indexurilor. Cu indexurile, se pot procesa rapid nregistrrile pentru afiare, interogare sau tiprire. Se pot selecta nregistrri, urmri dac exist valori duplicat ntr-un cmp i suport stabilirea de relaii ntre tabele n cadrul bazelor de date. Un index n VFP este o list de numere de nregistrri care pointeaz ctre nregistrrile corespunztoare i astfel determin ordinea de procesare a nregistrrilor. Un index nu modific ordinea n care nregistrrile sunt stocate n tabel, ci modific doar ordinea n care acestea sunt citite de VFP. Se poate crea mai mult de un index pentru o tabel (fiecare index reprezentnd cte o ordine de procesare a nregistrrilor din tabel). Indexurile care se creaz sunt stocate ntr-un fiier index cu structur compus care este deschis i actualizat oricnd tabela este folosit. Numele fiierului index este identic cu numele tabelei iar extensia sa este .CDX. Un index se poate crea uor, aa nct frecvent se definete cte un index dup fiecare cmp al tabelei. Un index se poate crea dup un cmp sau dup o expresie. Din Project Manager se selecteaz tabela, se apas butonul Modify, apoi n Table Designer se selecteaz tabulatorul Indexes cnd se activeaz o fereastr de forma:

30

Programarea rapid a aplicaiilor pentru baze de date relaionale

1 2 3

4 n care avem posibilitatea:


1 s modificm numele pentru un index; 4 s alegem tipul indexului dup cum urmeaz:
o index primar (cheie primar) unde doar valori unice sunt permise n cmp i

determin ordinea de procesare a nregistrrilor; se pot crea cte un index primar pentru fiecare tabel dintr-o baz de date; dac tabela are deja un index primar, se poate crea atunci un index candidat;
o index candidat care de asemenea necesit valori unice i determin ordinea de

procesare a nregistrrilor; pot exista mai multe indexuri candidate pentru 1 tabel;
o index regular care permite duplicarea valorilor ce intr ntr-un cmp, este folosit

pentru a determina ordinea de procesare i poate exista mai mult de 1 index regular pentru o tabel;
o index unic pstrat pentru compatibilitate cu versiunile mai vechi care selecteaz i

ordoneaz un subset de nregistrri bazat pe prima apariie a unei valori ntr-un cmp specificat;

5 s definim o expresie simpl (format din numele unui cmp) sau compus (o expresie n care intervin nume de cmpuri din tabel) dup cum urmeaz:
o cmpurile sunt evaluate n ordinea n care apar n expresie; o operatorul + aplicat la cmpuri numerice va aduna valorile din cmpuri:

employ.salary + employ.prime
o operatorul + aplicat la cmpuri caracter va concatena irurile de caractere din

cmpuri: customer.country + customer.postalcode + customer.company


o sunt permise conversiile la tipul ir de caractere prin intermediul funciei STR():
31

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

STR(customer.maxordamt,20,4) + customer.company

7 s filtrm nregistrrile supuse indexrii dup o condiie logic: employ.prime > 0 sau customer.country = "Canada" 2 s alegem o ordonare descendent () sau ascendent (); 3 s adugm un nou index; 6 s tergem un index; Indexurile pot ndeplini diferite roluri, n funcie de tipul acestora: Folosete

Dac vrei s

Ordonezi nregistrrile pentru a mri viteza de Un index regular, primar sau candidat afiare, interogare sau tiprire Controlul intrrii valorilor duplicat ntr-un Un index primar sau candidat pentru tabelele cmp i ordonarea nregistrrilor libere Odat creat, un index poate fi folosit la deschiderea unei tabele, n forma: USE customer ORDER Cust_Id cnd la activarea ferestrei de Browse se vor afia nregistrrile n ordinea specificat.

32

Programarea rapid a aplicaiilor pentru baze de date relaionale

11. Colectarea tabelelor ntr-o baz de date


Punnd tabelele ntr-o baz de date, se poate reduce stocarea datelor redundante i se poate proteja integritatea datelor. Un SGBD cum este VFP furnizeaz mediul de lucru pentru:

lucrul cu tabele; stabilirea relaiilor ntre tabele; setarea proprietilor i regulilor de validare pentru date. Urmtorul exemplu arat cum se realizeaz o baz de date.
Problema:

S presupunem c se dorete realizarea unei baze de date care s conin informaii despre universiti i persoane de contact n cadrul acestora. Aa cum s-a discutat pn acum aceasta presupune crearea a cel puin dou tabele n cadrul bazei de date ntre care s se stabileasc relaii.
Obiective:

crearea unui proiect (Project Manager); crearea unei baze de date (Database Designer);
Implementare:

crearea proiectului file;

1. Din meniu sau din bara de instrumente se selecteaz File/New (File Type: Project)/New 2. Se exploreaz calculatorul i se alege locul unde se dorete stocarea proiectului pe disc; 3. Se creeaz un director pentru stocarea componentelor proiectului; 4. Se d nume proiectului; fie de exemplu numele Universitati; acesta se va salva pe disc sub numele Universitati.pjx;

33

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

crearea bazei de date

5. Din Project Manager din categoria Data se selecteaz Databases i se apas butonul New i apoi New Database; 6. Se introduce un nume pentru noua baz de date din cadrul proiectului; fie aceasta Universitati; aceasta se va salva pe disc sub numele Universitati.dbc; se va ncrca n mod automat aplicaia expert Database Designer; cu ajutorul ei se construiesc tabelele bazei de date i se definesc relaiile ntre tabele; Database Designer mai permite crearea de vederi locale i de la distan, editarea procedurilor stocate n baza de date (baza de cunotine pentru execuia interogrilor i tranzaciilor de pe sisteme de operare diferite i din SGBDuri diferite), realizarea de conectri la distan;

crearea tabelelor Se enumer informaiile care se doresc memorate n baza de date. Acestea ar pute fi:

nume universitate, acronim, adres, nume rector, prorectori, adrese email; se identific faptul c pentru o universitate avem de memorat informaii proprii instituiei (nume, acronim, adresa, pagina web) i informaii despre persoanele aflate la conducerea acesteia (nume, funcie, adresa email). Se desprind astfel n mod natural dou tabele n baza de date: tabela institutii i tabela contacte. 7. Din aplicaia expert Database Designer se selecteaz butonul New Table i apoi din nou New Table; se va lansa n execuie n mod automat aplicaia expert Table Designer; 8. Cu ajutorul aplicaiei Table Designer se creeaz tabela institutii cu structura nume char(80), acronim char(10), adresa char(40), web char (20); aceasta se va salva pe disc cu numele Institutii.dbf;
34

Programarea rapid a aplicaiilor pentru baze de date relaionale

9. Se apas butonul Ok cnd se activeaz o fereastr de dialog; aici se poate alege dac s se introduc acum informaiile despre instituii sau mai trziu; s alegem introducerea acum; 10. Se activeaz o fereastr care permite introducerea informaiilor; se introduc informaiile despre universiti;

11. Din Database Designer se ncarc din nou Table Designer pentru crearea celei de-a doua tabele; 12. Se creeaz tabela Contacte cu structura: nume char(25), functia char(25), email char(32); 13. Se alege s se introduc informaiile despre contacte mai trziu; 14. Se pot acum introduce informaii n tabela Contacte activnd click dreapta pe tabel i selectnd opiunea Browse:

35

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

15. Se activeaz o fereastr Browse; se adaug cte o nregistrare (din meniu, Table/Append New Record sau de la tastatur Ctrl+Y); 16. Se dorete stabilirea de relaii ntre instituii i contacte; pentru aceasta este necesar adugarea unor cmpuri numerice n tabele; deoarece la o instituie avem mai multe persoane de contact relaia ntre tabele este de tipul 1 la n; pentru stabilirea relaiei este necesar ca valorile cmpului numeric din tabela institutii (fie acesta nr int) s fie distincte; se modific tabela i se creeaz acest cmp n consecin;

17. Se adaug un cmp numeric (de preferin cu acelai nume) n tabela contacte ale cror valori se vor completa innd seama de apartenena persoanelor de contact la instituii;

crearea indexurilor

18. Cmpul nr din tabela institutii se numete cheie primar; pentru stabilirea unei relaii 1 la n dup acest cmp tabela va trebui s fie indexat dup acest cmp cu un index primar;
36

Programarea rapid a aplicaiilor pentru baze de date relaionale

din nou aplicm Modify la tabela Institutii i i asociem un index primar cu acelai nume cu cmpul dup care se face indexarea: nr; se folosete aici aplicaia expert Expression Builder; se va memora n mod automat pe disc indexul sub numele Institutii.cdx; 19. Cmpul nr din tabela contacte se numete cheie strin; valorile din aceast coloan a tabelei contacte nu sunt toate diferite ntre ele; dup acest cmp tabela se poate indexa cu un index regular; se creeaz indexul; fie numele acestuia nr;

stabilirea relaiei ntre tabele

20. Se selecteaz indexul primar i se efectueaz drag and drop cu mouse-ul peste indexul regular (cheia primar peste cheia strin);

37

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

12. Validarea datelor la adugare sau modificare


Pentru a controla tipul informaiei introduse de utilizator ntr-un cmp dintr-o tabel se poate valida data independent de orice alt intrare n nregistrare, se poate realiza o validare la
nivel de cmp a datelor. De exemplu, pentru a ne asigura c utilizatorul nu introduce o

valoare negativ ntr-un cmp care trebuie s conin doar valori pozitive. Fie cazul cnd dorim s validm printr-o regul de acest tip cmpul nr din tabela Contacte a bazei de date Universitati. O soluie ar arta astfel: Valoarea nu e pozitiva

Butoanele ... lanseaz aplicaia expert Expression Builder cu ajutorul creia se poate construi expresia pentru regula de validare a datelor, valoarea implicit a cmpului la adugarea unei noi nregistrri i mesajul care se va afia n caz de introducere eronat. O alt posibilitate este de a stabili reguli de validare la nivel de nregistrare ntr-o tabel. Presupunnd c ntr-o tabel angajati avem dou cmpuri data_nastere i data_angajare de tip date atunci se poate stabili urmtoarea regul de validare la nivel de nregistrare: data_angajare >= data_nastere + (18 * 365.25) care s verifice c la angajare viitorul angajat are peste 18 ani: data_angajare >= data_nastere + (18 * 365.25) Varsta minima este 18 ani

Incluznd comenzi sau funcii n regulile de validare care ncearc s mute pointerul de nregistrare n zona de lucru se pot provoca erori n stabilirea condiiilor. Se poate defini un nume de cmp care va fi afiat (diferit de numele acestuia din tabel) prin definirea acestuia n caseta de editare Caption din tabulatorul Fields al lui Table Designer:

38

Programarea rapid a aplicaiilor pentru baze de date relaionale

13. Manipularea nregistrrilor n baza de date i integritatea referenial


Dup ce au fost stabilite relaiile, se pot de asemenea defini reguli pentru manipularea nregistrrilor n baza de date. Acestea asigur integritatea referenial. De exemplu, dac se adaug o companie n tabela companii, se dorete adugarea automat a informaiilor despre persoana de contact n tabela persoane_contact. Pentru aceasta se folosete Referential Integrity Builder. Se urmeaz paii:

cu baza de date deschis din meniu se selecteaz Database/Clean Up Database; cu dublu click pe linia ce marcheaz relaia se activeaz fereastra Edit Relationship; se apas butonul Referential Integrity...; n fereastra creat se selecteaz regulile pentru integritatea referenial:

Referential Integrity Builder permite definirea urmtoarelor reguli: Updating Cascade Restrict Ignore Deleting Cascade Restrict Ignore Inserting Restrict Atunci cnd o valoare a cheii primare este modificat actualizeaz toate nregistrrile din tabela cu cheia strin corespunztoare Nu las modificarea valorii cheii primare atunci cnd aceasta are corespondente valori ale cheii strine n tabela cu cheia strin Permite modificrile n tabela cu cheia primar i las nereferite nregistrrile din tabela cu cheia strin Atunci cnd este tears o nregistrare din tabela cu cheia primar terge toate nregistrrile din tabela cu cheia strin a cror valoare a cheii strine corespunde cu valoarea respectiv a cheii primare Nu permite tergerea unei nregistrri din tabela cu cheia primar atunci cnd valoarea cheii acesteia este regsit printre valorile cheii strine din tabela cu cheia strin; Permite tergerile n tabela cu cheia primar i las nereferite nregistrrile din tabela cu cheia strin Atunci cnd o nou nregistrare este adugat sau una existent este
39

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

Ignore

modificat n tabela cu cheia strin se verific dac exist valoarea introdus pentru cheia strin printre valorile cheii primare din tabela cu cheia primar i nu permite inserarea sau modificarea dac aceast valoare nu este gsit Permite adugarea sau modificarea fr respectarea integritii refereniale

Referential Integrity Builder va genera cod de integritate referenial care va fi inclus n baza de date sub form de proceduri, aa cum se vede din Project Manager.

Aplicaie:

S se creeze baza de date cu cursanii unei coli de Informatic Aplicat i Programare.

40

Programarea rapid a aplicaiilor pentru baze de date relaionale

Soluie:

Se creeaz o baz de date ce conine urmtoarele tabele (n care exprim existena unui index dup cmpul specificat; tipul indexului se va stabili n funcie de tipul relaiei tabelului respectiv cu celelalte n cadrul bazei de date).
Fiiere de date 9. Cursuri.dbf COD_CURS DENUMIRE ACRONIM ANUL_UNIV ORE_CURS ORE_LUCR ORE_PROI DURATA 2. Stud.dbf COD_STUD N 5 NUME C 20 INITIALA C 1 PRENUME C 30 NUME_NOU C 20 COD_CENTRU N 5 DATA_NAST D 8 LOCALITATE C 20 JUDET C 20 ADRESA M 10 TELEFON N 10 FORMA_INV C 1 S-scoala M-module

N C C C N N N N

5 70 10 12 2 2 2 2

3. Repart.dbf COD_STUD COD_MODUL FORMA

N N C

5 5 1

4. Taxe.dbf COD_STUD SUMA DATA

N N D

5 10 8
41

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

(Normal sau Distan) 7. Module.dbf COD_MODUL N 5 COD_CENTRU N 5 COD_CURS N 5 COD_PROF N 5 DATA D 8 12. Note.dbf COD_STUD N 5 COD_MODUL N 5 DATA D NOTA N 2

COD_MODUL 8. Prof.dbf COD_PROF NUME TELEFON SALAR_ORAR

N N C N N

5 5 20 10 10 12 5 12

10. Centre.dbf ORAS C COD_CENTRU N REPORT N

Rezultatul analizei problemei se prezint n urmtorul tabel: Nr Nume 12 note.dbf Index Cod_stud Cod_modul 10 centre.dbf Cod_centru Oras 9 cursuri.dbf Cod_curs 8 prof.dbf Cod_prof Nume 7 module.dbf Cod_modul Cod_centru Cod_curs Cod_prof Natura Cod_prof Localitate 4 taxe.dbf Cod_stud Cod_modul 3 repart.dbf Cod_stud Cod_modul 2 stud.dbf Cod_stud Nume Prenume Cod_centru Tip Regular Regular Primar Regular Primar Primar Regular Primar Regular Regular Regular Regular Regular Regular Regular Regular Regular Regular Primar Regular Regular Regular

Analiza se face n modul urmtor (de exemplu pentru tabela 12): Tabela 12 (note.dbf) conine 2 indexuri: unul dup cod student i unul dup cod modul; valorile acestor cmpuri se pot repeta n tabel: un student ia mai multe note (la diferite module) i un modul este frecventat de mai muli studeni; indexurile sunt atunci regulare. Dup ce s-au stabilit relaiile se impun:

regulile de validare pentru cmpuri; regulile de validare pentru nregistrri;

regulile de integritate referenial.


42

Programarea rapid a aplicaiilor pentru baze de date relaionale

14. Interogarea unei baze de date i limbajul SQL


SQL este limbaj structurat pe interogri, baz de date interogativ i limbaj de programare. Utilizarea setului de instruciuni SQL este legat de crearea de interogri (Query Designer), definirea de vederi (View Designer), editarea de rapoarte (Report Designer). De asemenea, o comand SQL poate fi dat n fereastra Command (Window/Command Window) sau inclus n proceduri i programe.
Crearea de interogri i vizualizri

Dup ce a fost creat baza de date, au fost definite tabelele i relaiile ntre acestea, cum este cazul pentru baza de date universitati n care cheia primar pentru tabela institutii este nr iar tabela contacte are asociat cheia strin nr (care este un index regular la tabel), iar relaia ntre cele dou tabele este definit pe baza acestei relaii, se poate crea o nou interogare. Pentru crearea unei noi interogri, din Project Manager se selecteaz Queries, se apas butonul New... apoi New Query. Se lanseaz atunci aplicaia expert Query Designer:

Practic, operaiile efectuate pn n acest moment sunt rezultatul unor instruciuni simple n limbajul SQL, specificate prin intermediul wizard-ului pe care sistemul le-a executat pentru noi, instruciuni care se pot vizualiza de la butonul SQL: FROM clienti!companii INNER JOIN clienti!persoane_contact ; ON Companii.company_id = Persoane_contact.company_id Se poate observa sintaxa acestor instruciuni: FROM <nume_bd>!<nume_tabela_1> INNER JOIN <nume_bd>!<nume_tabela_2>; ON <nume_tabela_1>.<nume_cmp> = <nume_tabela_2>.<nume_cmp>
43

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

Se pot selecta acum cmpurile care s participe la interogare, ca n exemplul:

Din tabulatorul Order By se poate defini criteriul de ordonare n interogare. S alegem Institutii.nr ca criteriu de ordonare. De asemenea, din tabulatorul Group_By se poate defini un criteriu de grupare a rezultatului interogrii. S alegem ca criteriu de grupare Institutii.nr. n acest caz interogarea va furniza ultima persoan de contact nregistrat pentru fiecare instituie. Dac se renun la grupare i se execut din nou interogarea se vor lista toate persoanele de contact mpreun cu nume instituiilor pe care le reprezint. Pn aici, sistemul a complectat pentru noi comenzile SQL corespunztoare: SELECT Contacte.nume, Contacte.functia, Institutii.nume, Institutii.nr,; Contacte.poz, Contacte.nr; FROM universitati!institutii INNER JOIN universitati!contacte ; ON Institutii.nr = Contacte.nr Se poate acum specifica destinaia interogrii din Query Designer, cnd se activeaz o fereastr n forma:

ntre cmpuri numerice din tabele se pot crea grafice de coresponden (Butonul Graph). Astfel, pentru a face o reprezentare grafic din baza de date Universiti s adugm cmpul poz (int) n tabela Contacte, i s atribuim cte o poziie fiecrei nregistrri. Lansarea n execuie a interogrii se poate face din meniu (Query/Run Query) sau din tastatur (ctrl+Q). Astfel, dac se selecteaz cmpurile Institutii.nr i Count(Contacte.poz) se poate obine cu ajutorul lui Graph Wizard un grafic de dependen a identificatorilor din tabele:

44

Programarea rapid a aplicaiilor pentru baze de date relaionale

n Query Destination se poate preciza ca destinaie o fereastr de browse (Butnul Browse), caz n care rezultatul afirii este vizualizat ntr-o fereastr n care se pot parcurge nregistrrile i cmpurile. Opiunea Cursor (Butonul Cursor) doar selecteaz nregistrrile care corespund condiiilor specificate n interogare, fr a efectua afisri. Opiunea Table (Butonul Table) permite salvarea rezultatului interogrii ntr-o tabel al crui nume se va introduce la execuia interogrii. Opiunea Screen (Butonul Screen) permite afiarea rezultatului interogrii la imprimant sau trimiterea sa ntr-un fiier text. Opiunile Report i Label (Butoanele Report i Label) permite trimiterea rezultatului interogrii ctre un raport sau etichet, a cror construcie se va discuta mai trziu. Aceeai pai care au fost urmai n crearea unei interogri se efectueaz i pentru crearea unei vederi. Vederile combin calitile tabelelor cu cele ale interogrilor; la fel ca n cazul interogrilor, se poate crea o vedere pentru extragerea unui set de date din una sau mai multe tabele asociate; la fel ca la o tabel, o vedere poate fi folosit pentru actualizarea informaiilor i stocarea permanent a informaiilor pe hard-disk. Vederile pot fi ns folosite i la culegerea i modificarea datelor off-line n afara sistemului principal. Dac se dorete accesul la date stocate pe un server la distan, trebuie creat o vedere extern. n acest scop, trebuie nti s ne conectm la o surs de date. O surs de date extern este de obicei un server extern pentru care este instalat un driver ODBC (open database connectivity) i s-a atribuit un nume sursei de date ODBC. Pentru a beneficia de o surs de date, trebuie s fie instalat driverul ODBC. Din mediul VFP se poate atunci defini sursa de date i conexiunile.

45

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

15. Crearea de vederi locale


O vedere local permite s extragem nregistrri dintr-o tabel, s efectum modificri asupra nregistrrilor extrase i s transmitem modificrile n tabelele surs. Se pot crea vederi din tabele locale, din alte vederi, din tabele stocate pe un server, din surse de date situate la distan, cum ar fi Serverul SQL Mirosoft prin intermediul protocolului ODBC. Se poate configura VFP s efectueze modificrile n tabelele surs n momentul efecturii modificrilor n vedere. O vedere local se poate crea cu ajutorul aplicaiei expert View Designer. Astfel, avem urmtoarele posibiliti: 1. Din fereastra de comenzi (Window/Command Window) cu comanda create sql view; 2. Din bara de instrumente: New/View/New file sau din meniu File/New/View/New file; 3. Din Project Manager se selecteaz o baz de date, se alege Local Views i butonul New; Se poate folosi View Designer pentru a crea vederi din baza de date Universitati.dbc. Se pot construi dou vederi: una care s redea coninutul bazei de date ordonat alfabetic cresctor dup persoanele de contact i alta care s redea coninutul ordonat alfabetic cresctor dup numele universitii i apoi alfabetic descresctor dup funcie.
Vederea bazei de date Universitati dup persoanele de contact

1. Se deschide proiectul Universitati.pjx (Open/Project); 2. Se selecteaz baza de date Universitati; 3. Se expandeaz coninutul bazei de date (+ ); 4. Se selecteaz din aceasta Local views; 5. Se apas butonul New... i se alege opiunea New View; 6. La fel ca la interogri, se includ tabelele contacte i institutii n View Designer;

7. Se selecteaz toate cmpurile, mai puin Contacte.nr; 8. Se alege relaia de ordine dorit (Order By/Ordering criteria: Contacte.nume ); 9. n tabulatorul Update Criteria se precizeaz cheile primare Contacte.poz i Institutii.nr; 10. Se apas butonul Update All pentru a face posibil modificarea tuturor cmpurilor din tabele pe baza modificrilor efectuate n vedere; comanda SQL transmis sistemului se poate vedea din bara de instrumente a lui View Designer. SELECT Contacte.poz, Contacte.nume, Contacte.functia, Contacte.email,;
46

Programarea rapid a aplicaiilor pentru baze de date relaionale

Institutii.nr, Institutii.nume, Institutii.acronim, Institutii.adresa,; Institutii.web; FROM universitati!institutii INNER JOIN universitati!contacte ; ON Institutii.nr = Contacte.nr; ORDER BY Contacte.nume 11. Se salveaz vederea din bara de instrumente (Save) sau din meniu (File/Save) de exemplu cu numele contacte_institutii; 12. Se pot acum defini opiuni de vizualizare ale cmpurilor vederii; se selecteaz vederea contacte_institutii din Project Manager i se apas Modify;

13. n View Designer la tabulatorul Fields se apas butonul Properties; 14. Se pot aici defini reguli de validare pentru cmpurile din vedere (Field validation) la fel ca la tabele i etichete pentru afiarea lor n fereastra de Browse (Display/Caption); 15. Se seteaz din aceast fereastr de dialog proprietile pentru toate cmpurile vederii;

16. Se pot aduga acum persoane de contact i instituiile corespunztoare dac se lanseaz n execuie vederea creat: Query/Run Query cnd se poate afia n forma Append Mode i Edit din meniu de la View; 17. Se poate seta opiunea pentru a efectua modificrile n tabelele incluse n vedere; pentru aceasta se selecteaz opiunea Send SQL updates din tabulatorul Update Criteria al vederii contacte_institutii cu ajutorul lui View Designer; 18. Se pot acum aduga persoane de contact i instituii, modificarea efectundu-se automat n tabelele bazei de date; pentru aceasta, se execut vederea (Ctrl+Q) i se adaug o nou nregistrare n aceasta (Ctrl+Y); 19. Pentru ca modificrile s devin active trebuie nchis proiectul (Close all data n fereastra de comenzi); 20. La o nou deschidere a acestuia se pot observa modificrile n tabele;

47

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

21. Pentru a insera noile chei pentru instituie i contact este necesar selectarea explicit a modificrii n vedere (View Designer/Update Criteria/Field name); 22. Sistemul salveaz vederea n baza de date sub forma unui tabel liber cu acelai nume cu vederea, care se poate observa n Project Manager la ncrcarea aplicaiei expert Database Designer;
Vederea bazei de date Universitati dup institutii i apoi persoane de contact

23. Se urmeaz accei succesiune de pai ca mai sus, ns se alege la relaia de ordine dorit (Order By/Ordering criteria: Institutii.nume i Contacte.nume );
Stocarea de proceduri n baza de date pentru cmpurile autoincrement

Baza de date Universitati este acum pregtit pentru a construi o metod de autoincrementare a valorilor pentru cheile primare. Este necesar crearea n baza de date a unei tabele care s memoreze viitoarele valori ale cheilor primare pentru fiecare tabel n parte. Ulterior, se folosete aceast tabel de ctre o procedur stocat n baza de date pentru a stabili valorile de increment. Se urmeaz paii: 1. Se adaug n Universitati.bdc tabela auto_id cu structura (id int; tabela char(50)); 2. Se completeaz Auto_id.dbf cu valorile corespunztoare; 3. Se indexeaz Auto_id.dbf dup cele dou cmpuri ale sale cu indeci regulari; 4. Se creeaz o funcie pentru autoincrementare; fie aceasta NouId(); Se poate selecta codul procedurii NewId() din baza de date Books.dbc din subdirectorul de instalare al VFP: Wizards/Template/Books/Data i copia n baza de date Universitati.dbc; Acesta se modific corespunztor, innd cont de numele actuale:
FUNCTION NouID(tcAlias) LOCAL lcAlias, ; lnID, ; lcOldReprocess, ; lnOldArea lnOldArea = SELECT() lnID = 0 IF PARAMETERS() < 1 lcAlias = UPPER(ALIAS()) ELSE lcAlias = UPPER(tcAlias) ENDIF lcOldReprocess = SET('REPROCESS') *-- Lock until user presses Esc SET REPROCESS TO AUTOMATIC IF !USED("AUTO_ID") USE universitati!auto_id IN 0 ENDIF SELECT auto_id IF SEEK(lcAlias, "auto_id", "tabela") IF RLOCK() lnID = auto_id.id REPLACE auto_id.id WITH auto_id.id + 1 UNLOCK ENDIF ENDIF SELECT (lnOldArea) SET REPROCESS TO lcOldReprocess RETURN lnID ENDFUNC

48

Programarea rapid a aplicaiilor pentru baze de date relaionale

5. Se exploateaz funcia NouId() prin definirea autoincrementelor n tabelele Institutii i Contacte; Institutii.dbf Contacte.dbf Auto_Id.dbf

6. Se construiete vederea Nou_Contact pe baza tabelelor Contacte i Institutii; se includ toate cmpurile din tabela Contacte i cmpul nume din tabela Institutii i se procedeaz identic cu cazul anterior; 7. Se construiete vederea Noua_Institutie pe baza tabelei Institutie, n care se includ toate cmpurile din tabel; se procedeaz la fel cu cazurile anterioare;
Utilizarea Wizard-ului pentru crearea de vederi

Pentru vizualizarea tuturor persoanelor care aparin unei instituii cu un anumit acronim se poate realiza o vedere parametrizat care s le includ. Se urmeaz paii: 1. Se selecteaz Local Views; Se activeaz New../View Wizard; 2. Se aleg cmpurile contacte.nume, institutii.nume, contacte.email, institutii.nr i contacte.nr;

3. Se definete relaia institutii.nr = contacte.nr; 4. Se includ toate liniile din tabela Contacte (All Rows from this table); 5. Se definete interogarea n tabela Institutii dup Acronim n forma ?Acronim_Institutie; 6. Se salveaz vederea sub numele CautContact; 7. Se execut interogarea (Run Query); n acelai mod se poate defini vederi care s extrag o persoan de contact pentru o anume universitate sau s gseasc pagina web a unei universiti.

49

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

16. Lucrul cu fereastra de comenzi


Pe lng facilitile oferite de mediul vizual, sistemul VFP pune la dispoziia utilizatorului i o interfa de tip text, n care utilizatorul are posibilitatea s lanseze comenzi sistemului. Exist un set de comenzi pe care sistemul le accept i le execut din fereastra de comenzi. Se pot lansa comenzi practic pentru orice proces care poate fi accesat din meniuri. Cele mai importante comenzi sunt redate n continuare. Vizualizarea structurii tabelei curente se realizeaz cu comenzile:
LIST STRUCTURE [TO PRINTER [PROMPT] | TO FILE <file>] DISPLAY STRUCTURE [IN <expN> | <expC>] [TO PRINTER [PROMPT] | TO FILE <file>]

unde: IN <expN | expC> specific numrul zonei de lucru sau aliasul tabelei, TO PRINTER trimite informaia la imprimant, PROMPT introduce dialog (confirmare) nainte de imprimare, TO FILE <nume_fis> salvare informaie n fiier, Exemplu:
DISPLAY STRUCTURE IN 3 TO FILE <str_baz1.txt>

Aliasul tabelei se poate vizualiza din meniu la opiunea Window/Data Session. Structura unei baze se poate ulterior modifica n sensul adugrii/eliminrii unor cmpuri sau modificarea mrimii cmpurilor prin comanda:
MODIFY STRUCTURE

Comenzile DISPLAY i LIST sunt folosite pentru afiarea coninutului tabelelor.


DISPLAY [ [FIELDS] <lista campurilor> ] [<domeniu>] [FOR <expL1>] [WHILE <expL2>] [OFF] [TO PRINTER [PROMPT] | TO FILE <numefis>] [NOCONSOLE] [NOOPTIMIZE]

Exemplu:
USE Contacte DISPLAY ALL

afieaz toate cmpurile i nregistrrile cu oprire la fiecare pagin. Pentru afiarea numai a cmpurilor specificate lansm de exemplu comanda:
DISPLAY ALL FIELDS NUME, EMAIL

Afiarea nregistrrilor care ndeplinesc o condiie (au valoarea cmpului POZ mai mare dect 10):
DISPLAY ALL FOR POZ > 10

Afiarea nregistrrilor care au irul de caractere din cmpul nume mai mare sau egal dect irul Ha:
50

Programarea rapid a aplicaiilor pentru baze de date relaionale

DISPLAY ALL FOR NUME >= Ha DISPLAY ALL WHILE NUME > Ha

afieaz nregistrrile ct timp expresia logic NUME > Ha este adevrat.


DISPLAY ALL OFF

nu se afieaz coloana 0 ce conine numrul de ordine al nregistrrilor


DISPLAY

afieaz numai nregistrarea curent. n cadrul expresiei logice pot fi folosii operatorii logici AND, OR, NOT
DISPLAY NEXT 5 FOR nume < R AND nume > A

Comanda LIST are sintaxa:


LIST [FIELDS <expr list> ] [<scope>] [FOR <expL1>] [WHILE<expL1>] [OFF] [NOCONSOLE] [NOOPTIMIZE] [TO PRINTER [PROMPT] | TO FILE <file>]

LIST afieaz toate nregistrrile fiind echivalent cu comanda DISPLAY ALL; LIST NEXT 3 afieaz urmtoarele 3 nregistrri i mut indicatorul corespunztor (pe a 3-a nregistrare); Exemple:
LIST FOR NOT NUME= Giurgiu LIST FOR "Gi" $ nume

afieaz nregistrrile ce conin irul Gi n cmpul nume.


LIST FOR LIKE ("*iurg*", nume)

Zona de lucru este o zon de memorie rezervat pentru pstrarea informaiilor necesare lucrului cu o tabel. Zona de lucru 1 este curent implicit dup lansarea FoxPro. La un moment dat o singur zon este activ. Prin comanda SELECT <expN> | <expC> se stabilete zona de lucru curent:
SELECT 7

Zona de lucru indice 7 a devenit curent, activat. Funcia SELECT () returneaz numrul zonei de lucru curente. Operatorul ? este folosit pentru afiarea unei valori pe ecran. Astfel,
? SELECT( )

va afia:
7

Pentru a lucra cu o tabel ea trebuie deschis. Deschiderea tabelei nseamn nscrierea caracteristicilor eseniale ale bazei (structura, numrul nregistrrilor, etc.) ntr-o anumit zon de lucru, nu neaprat cea curent.
51

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

Funcia USED (expN | expC) returneaz .T. dac n zona de lucru specificat prin argument este deschis o tabel (n caz contrar returneaz .F.). Argumentul expC al funciei se refer la aliasul tabelei (un alt nume al tabelei).
? USED(3) .F.

Funcia DBF(expN | expC) returneaz numele tabelei deschise n zona specificat prin argument sau numele bazei de alias expC:
SELECT 3 ? SELECT() USE tabela1 LIST STRUCTURE ? USED(3) ? DBF(3) USE ? USED(3) USE tabela1 IN 4 LIST STRUCTURE USE tabela1 IN 3 AGAIN rmnnd deschis i n zona 4 Close all data && se afieaz .T. && se afieaz tabela1 && se nchide tabela1 din 3 && afieaz .F. && se deschide tabela1 n zona de lucru 4 && nu se listeaz structura && se deschide tabela tabela1 n zona de lucru curent 3 && && se afieaz 3

nchide toate tabelele din mediul de lucru i odat cu acestea toate bazele de date i proiectele ce le utilizeaz. Poziionarea pe o nregistrare se poate face cu ajutorul comenzilor GO, GOTO i SKIP. FoxPro atribuie n mod reflex un numr de nregistrare fiecrui articol din fiierul deschis.
GO [RECORD] <expN1> [IN <expN2> | IN <expC>] GO TOP | BOTTOM [IN <expN2> | IN <expC>] GOTO [RECORD] <expN1> [IN <expN2> | IN <expC>] GOTO TOP | BOTTOM [IN <expN2> | IN <expC>]

Comanda GO numr_articol permite trecerea imediat pe articolul avnd numrul specificat (expN1) :
Go 20 Disp

Este suficient s precizm primele 4 litere din numele comenzii pentru ca sistemul s recunoasc comanda. Pentru saltul peste un anumit numr de nregistrri se poate folosi comanda SKIP SKIP 1 && accept i valori negative, pentru saltul napoi;
52

Programarea rapid a aplicaiilor pentru baze de date relaionale

Cu ajutorul comenzii SET se poate defini o list de cmpuri implicit la afiare. De exemplu:
SET FIELDS TO NUME, EMAIL LIST SET FIELDS OFF LIST

Filtrele pentru nregistrri se definesc tot cu ajutorul comenzii SET:


SET FILTER TO POZ>10 LIST SET FILTER TO LIST

Pentru modificarea nregistrrilor din fiier se pot folosi comenzile EDIT, BROWSE, REPLACE i CHANGE. Comanda EDIT modific nregistrarea curent. Comanda EDIT 4 modific nregistrarea 4.
EDIT FIELDS NUME, EMAIL (restricionare la cmpurile enumerate) EDIT FOR nr = 4 (restricionare la nregistrrile care satisfac condiia).

Comanda REPLACE permite un alt mod de modificare a valorii unor cmpuri. Comanda are sintaxa :
REPLACE <field1> WITH <expr1> [ADDITIVE] [, <field2> WITH <expr2> [ADDITIVE]] ... [<scope>] [FOR <expL1>] [WHILE <expL2>]

unde <scope>: ALL, NEXT <expN>, RECORD <expN>, sau REST Exemple:
use Institutii goto 3 REPLACE nume WITH "Popescu"

use Contacte REPLACE ALL poz WITH poz*2 REPLACE ALL nume WITH UPPER(nume) Opiunea ADITIVE opereaz numai pentru cmpuri de tip memo. Dac ea este folosit, valoarea indicat dup WITH va fi adugat la sfritul coninutului curent al cmpului. Suprimarea nregistrrilor (se realizeaz n doi pai): Comanda DELETE marcheaz nregistrrile ca fiind suprimate dar nu le terge efectiv din fiier, i apoi cu comanda PACK se reorganizeaz fiierul suprimnd efectiv articolele marcate (marcarea nregistrrilor se poate face i din fereastra comenzii BROWSE). Comanda DELETE permite tergerea unuia sau mai multor articole:
53

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

DELETE [<scope>] [FOR <expL1>] [WHILE <expL2>]

<scope>: ALL, NEXT <expN>, RECORD <expN>, sau REST Exemple :


DELETE RECORD 12 DELETE NEXT 4 DELETE ALL FOR nr=4 DELETE ALL DELETE REST terge toate articolele terge articolele de la poziia curent pn la sfritul fiierului. terge articolul 12 terge urmtoarele 4 articole

Comanda RECALL restabilete nregistrrile suprimate cu DELETE.


RECALL [<scope>] [FOR <expL1>] [WHILE <expL2>]

<scope>: ALL, NEXT <expN>, RECORD <expN>, sau REST Indexarea unui tabel se poate realiza din fereastra de comenzi.
INDEX ON cmp TAG cmp DESCENDING

Dac se dorete o indexare dup mai multe cmpuri este necesar o comand de tipul:
INDEX ON cmp1+cmp2 TAG nume

De exemplu, dac se dorete o indexare dup nume i apoi, pentru acelai nume dup cifra de afaceri, se poate folosi o indexare n forma:
INDEX ON nume+STR(ca) TAG x

n exemplu s-a convertit cifra de afaceri ca n ir caractere (cu ajutorul funciei STR) i s-au concatenat irurile de caractere nume i STR(ca). La redeschiderea fiierului astfel indexat se va putea folosi de exemplu :
USE parteneri ORDER TAG x

Dac n timpul exploatrii se dorete trecerea la indexarea dup un alt index se folosete comanda SET ORDER TO:
USE contacte ORDER nume LIST SET ORDER TO poz LIST

ntr-un fiier indexat se pot efectua cutri cu comanda SEEK: USE contacte ORDER nr SEEK 1 n exemplul precedent numrtorul de nregistrri se poziioneaz pe articolul a crui cmp nr = 1. Dac un astfel de articol nu exist contorul rmne neschimbat i funcia FOUND() returneaz .F.. Comenzile SET EXACT ON/OFF modific modul de operare a comenzii SEEK. Dac este activ comanda SET EXACT OFF cutarea se va face numai dup primele caractere ale cmpului cheie.
54

Programarea rapid a aplicaiilor pentru baze de date relaionale

Se poate defini directorul implicit pentru fiiere. Pentru a defini un director implicit pentru sesiunea de lucru curent se folosete comanda:
SET DEFAULT TO <nume_director>

De exemplu:
SET DEFAULT TO C:\UTILIZATORI\STUDENT\VASILE

Pentru a defini directorul implicit care s fie ncrcat la fiecare pornire a VFP, din meniu, Tools/Options/File Locations, cnd se activeaz o fereastr n forma:

Comenzile se pot integra n fiiere de comenzi sau programe, care au faciliti suplimentare fa de facilitile oferite de fereastra de comenzi. Oricum, oricare din succesiunea de comenzi (sau toate la un loc) care au fost lansate n fereastra de comenzi se pot salva ntr-un program. Un nou program se creeaz din New/Program/New File. Se lanseaz n execuie cu comanda DO: DO ProgramName1 | ProcedureName [IN ProgramName2] [WITH ParameterList] Argumente:

ProgramName1 specific numele programului de executat; ProgramName1.exe (versiunea executabil) ProgramName1.app (o aplicaie) ProgramName1.fxp (versiunea compilat) ProgramName1.prg (programul)

Dac nu se include nici o extensie, FVP caut s execute n urmtoarea ordine:

Pentru a executa un program de tip meniu, o form, o interogare, trebuie s i se includ i extensia (.mpr, .spr, sau .qpr). ProcedureName specific numele procedurii de executat din programul curent. IN ProgramName2 clauz care comunic VFP s caute procedura ntr-un fiier anume; WITH ParameterList specific parametrii de transmis programului sau procedurii. Se poate merge ntr-un program la apel recusiv la peste 128 de apeluri DO.
55

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

17. Expresii
Expresiile care pot fi construite cu ajutorul tipurilor de dat predefinite puse la dispoziie de mediul VFP (de exemplu n Expresion Builder) se gsesc documentate n MSDN, Active Subset: Visual Fox Pro Documentation/Contents/Reference/Language Overview/Overview of the Language/Building Expresions, sau dac este instalat versiunea MSDN98, atunci se poate ncrca n Internet Explorer pagina mk:@MSITStore:C:\Program%20Files\Microsoft%20Visual%20Studio\MSDN98\98VSa\103 3\foxhelp.chm::/html/conbuilding_expressions.htm.

Operatorii pe expresii de tip caracter sunt descrii n: foxhelp.chm::/html/tblcharacter_operators.htm Operatorii pe expresii de tip dat i or sunt descrii n: foxhelp.chm::/html/tbldate_and_time_operators.htm Operatorii numerici: foxhelp.chm::/html/tblnumeric_operators.htm Operatorii logici: foxhelp.chm::/html/tbllogical_operators.htm

56

Programarea rapid a aplicaiilor pentru baze de date relaionale

18. Lucrul cu funciile FVP exemple de utilizare


ABS()

? ABS(-45) ? ABS(10-30) ? ABS(30-10)

&& Afieaz 45 && Afieaz 20 && Afieaz 20

STORE 40 TO gnNumber1 STORE 2 TO gnNumber2 ? ABS(gnNumber2-gnNumber1)


CHR() ntr-un program:

&& Afieaz 38

CLEAR FOR nCOUNT = 65 TO 75 ? nCount ?? ' ' + CHR(nCount) ENDFOR


DATE()

&& Display numeric value && Display character

CLEAR SET CENTURY OFF ? DATE( ) && Afieaz today's date without the century SET CENTURY ON ? DATE( ) && Afieaz today's date with the century ? DATE(1998, 02, 16) && Afieaz a year 2000-compliant Date value
DATETIME()

tNewyear = DATETIME(YEAR(DATE( ) ) + 1, 1, 1) && Next New Year tToday = DATETIME( ) nSecondstonewyear = tNewyear - tToday CLEAR ? "There are " + ALLTRIM (STR(nSecondstonewyear)) ; + " seconds to the next New Year." CLEAR SET CENTURY ON SET DATE TO AMERICAN ? DATETIME(1998, 02, 16, 12, 34, 56) && Afieaz 02/16/1998 12:34:56 PM STORE {^1998-03-05} TO gdBDate
57

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

DAY()

CLEAR ? CDOW(gdBDate) && Afieaz Thursday ? DAY(gdBDate) && Afieaz 5 ? 'That date is ', CMONTH(gdBDate), STR(DAY(gdBDate),2)
DBUSED()

&& Returneaz true (.T.) dac baza de date specificat este deschis.

DBUSED('Universitati')
DELETED()

DELETED([cTableAlias | nWorkArea]) Returneaz o valoare logic ce indic dac nregistrarea curent este marcat pentru tergere.
DMY()

&& expresie de tip caracter n formatul day-month-year

CLEAR SET CENTURY OFF ? DMY(DATE( )) SET CENTURY ON ? DMY(DATE( ))

58

Programarea rapid a aplicaiilor pentru baze de date relaionale

19. Constructorul de expresii (Expression Builder)


Constructorul de expresii este un instrument esenial n exploatarea unei baze de date. n elementele discutate el intervine n:

definirea expresiilor pentru indeci; definirea regulilor de validare, mesajelor i valorilor implicite pentru cmpuri i nregistrri; definirea funciilor i expresiilor pentru noi cmpuri n interogri i vederi; definirea etichetelor de cmpuri la vederi;

Constructorul de expresii poate fi accesat din aplicaiile expert, ferestre, constructoare i wizard-uri. Permite definirea de expresii n care intervin cmpuri din tabele i vederi. Tipul expresiei construite trebuie s fie compatibil cu tipul acceptat de caseta de editare din care a fost ncrcat. De exemplu, dac a fost ncrcat dintr-o caset de editare n care se accept o valoare de tip ir de caractere (cum este cazul pentru Fields Caption) atunci valoarea expresiei construite trebuie s fie de tip ir de caractere. O expresie poate fi:

simpl (numele unui cmp); complex (implicnd de exemplu un IF imediat); Pentru a construi expresii, se pot scrie n caseta de editare pentru expresii sau se pot

selecta intrri din lista drop-down a funciilor pentru a se insera n caseta de editare. Pentru operaii cu iruri de caractere sau cmpuri ce conin iruri de caractere, sunt utile funciile ALLTRIM(), LTRIM(), RTRIM(), PADL(), PADR(), PADC(), SUBSTR(), LEFT(), RIGHT(), UPPER(), LOWER(), PROPER(), STR(). S presupunem c avem irul de caractere: " ? ALLTRIM(" ? LTRIM("
ABBA ABBA ss ") ABBA ss"

". Atunci:

&& va afia "ABBA && va afia "ABBA

")

"
59

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

? RTRIM(" ? PADL(" ? PADR(" ? PADC(" ? SUBSTR(" ? SUBSTR(" ? LEFT(" ? RIGHT(" ? LOWER("

ABBA ABBA ABBA ABBA ABBA ABBA ABBA ABBA ABBA

") ",12,"X") ",12,"X") ",12,"X") ",2,4) ",2) ",3) ",5) ")


ABBA ss ")

&& va afia "

ABBA" ABBA

&& va afia "XXX && va afia " && va afia "X

"

ABBA ABBA

XXX" XX"

&& va afia " ABB" && va afia " ABBA && va afia " A" && va afia "BA && va afia " ")) && va afia " && va afia " && va afia " && va afia "*" && va afia "25" && va afia " && va afia "
12" 12.200"

"

" " "


Ss " 25"

abba ABBA Abba

? UPPER(LOWER(" ? PROPER(" ? STR(12+13) ? STR(12+13,1) ? STR(12+13,2) ? STR(12.2) ? STR(12.2,8,3) ? STR(12.2,6,3) ? STR(12.2,5,3)


ABBA

&& va afia "12.200" && va afia "12.20"

Pentru orice funcie selectat din Expression Builder sistemul VFP afieaz pe linia de stare (Status Bar, ultima linie din fereastra aplicaiei VFP) informaii cu privire la aceasta. Din caseta From table a Expression Builder este permis selectarea unei tabele din cele deschise (cu USE). Caseta Variables permite utilizarea n definirea expresiei a variabilelor sistem, a tablourilor i variabilelor obinuite anterior definite de utilizator. Opiunea Verify verific sintaxa expresiei. Este ns doar o verificare formal, n timpul execuiei nu este neaprat ca eroarea semnalat s fie real. De exemplu definirea unei etichete n forma Nume Contact n caseta vederii CautContact nu este o eroare n execuie dei opiunea Verify semnaleaz absena ghilimelelor: "Nume Contact". Aplicaie: se pot lista toate instituiile au ca ultime dou litere n acronim CN: use institutii browse font "Courier New" fields nume, acronim for upper(right(rtrim(acronim),2)) = "CN" Rezultatul este n forma:

60

Programarea rapid a aplicaiilor pentru baze de date relaionale

20. Programare
n general, orice ce poate fi fcut cu un program, se poate face manual dac avem destul timp. De exemplu, dac cutm o persoan de contact n tabela contacte de exemplu Gheorghe Lazea, acest lucru poate fi fcut manual urmnd secvena de instruciuni: 1. Din meniul File selectm Open; 2. Din caseta File of type selectm Table; 3. Selectm tabela Contacte.dbf n lista fiierelor; 4. Din meniul View selectm Browse; 5. Parcurgnd coninutul tabelei, urmrind cmpul Nume identificm nregistrarea pentru Gheorghe Lazea; Din fereastra de comenzi, poate fi fcut acelai lucru scriind urmtoarele instruciuni: USE Customer LOCATE FOR Nume = "Gheorghe Lazea" BROWSE Dup ce am localizat nregistrarea putem s i modificm coninutul pentru a scrie de exemplu numele cu litere mari: REPLACE nume WITH UPPER(nume) sau s revenim la scrierea cu prima liter din nume mare: REPLACE nume WITH PROPER(nume) Instruciunile i comenzile pot fi integrate n programe. Acest fapt confer unele avantaje:

programele pot fi modificate i executate din nou; se pot executa programele din meniuri, forme i bare de instrumente; programele pot executa alte programe; Un program n VFP se poate crea pe calea New/Program,New File sau din fereastra de

comenzi cu comanda modify command. Un program simplu care s schimbe toate numele la litere mari este: use contacte scan replace nume with ; upper(nume) endscan unde scan parcurge toate nregistrrile din tabel i execut instruciunile ntre scan i endscan iar ; indic c o comand (comanda replace) se continu pe linia urmtoare. Pe lng comenzi, programele permit scrierea i de instruciuni (cum este cazul instruciunii scan).
61

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

Pentru a restaura situaia anterioar n fiier este suficient ca s modificm programul nlocuind funcia UPPER(nume) cu funcia PROPER(nume). Pentru a executa o succesiune de comenzi i instruciuni n fereastra de comenzi, se introduc acestea n fereastra de comenzi (de exemplu cu Copy i Paste), se selecteaz (de exemplu de pe tastatur cu Shift i sgei) dup care se apas enter (permite i execuia de instruciuni).

pentru a crea un program: New/Program,New File sau comanda modify command; pentru a salva un program: File/Save; pentru a deschide un program: File/Open/File type: program/Open sau modi comm <nume_program>; se poate face i modi comm ? cnd se activeaz o fereastr de dialog; pentru a executa un program: Program/Do... sau cu comanda do <nume_program>; Din perspectiva VFP exist urmtoarele containere pentru date: variabile (elemente individuale de date stocate n RAM); pentru a crea o variabil este suficient s precizm numele variabilei i valoarea corespunztoare; dac nu exist sau este de tip incompatibil, aceasta va fi creat cnd se distruge variabila anterioar cu acelai nume; alternativa pentru store este operatorul = cu semnificaia cunoscut din limbajul C; variabilele pot fi publice, locale i private;

de exemplu:

STORE DATE( ) TO local gdDate STORE 50 TO gnNumeric STORE 'Hello' TO gcCharacter STORE .T. TO glLogical STORE $19.99 TO gyCurrency DIMENSION gaMyArray(2,2) SET COMPATIBLE OFF STORE 2 TO gaMyArray CLEAR DISPLAY MEMORY LIKE g*

iruri sau matrice (serii ordonate de elemente, stocate n RAM); se declar cu una din comenzile DIMENSION sau DECLARE; de exemplu:

DIMENSION ArrayName[5,2] ArrayName[1,2] = 966789 ? ArrayName[1,2]

tabele i nregistrri; o nregistrare poate avea peste 255 de cmpuri;


62

Programarea rapid a aplicaiilor pentru baze de date relaionale

Pentru lucrul cu tabele sunt utile comenzile SCATTER, GATHER, COPY TO ARRAY, i APPEND FROM ARRAY.
Instruciunea IF are sintaxa:

IF <expresie_logic> [THEN] [<comenzi i instruciuni>] [ELSE <comenzi i instruciuni>] ENDIF Un exemplu de program cu instruciunea IF: s se afieze nregistrrile care ndeplinesc o condiie oarecare. CLOSE DATABASES OPEN DATABASE ('Universitati') USE Contacte TYPE 'L' DEFAULT 'email = ""' LOCATE FOR &gcTemp IF FOUND( ) DISPLAY ELSE ? 'Conditia ' + gcTemp + ' nu a fost gasita' ENDIF USE
Instruciunea CASE are sintaxa:

&& deschide tabela contacte

GETEXPR 'Introdu conditia de localizare ' TO gcTemp; && Enter LOCATE expression && Este gsit? && Dac da, afieaz nregistrarea && Dac nu e gsit && afieaz un mesaj

DO CASE CASE <expresie_logic_1> <comenzi i instruciuni> [CASE <expresie_logic_2> <comenzi i instruciuni> ... CASE <expresie_logic_N> <comenzi i instruciuni>] [OTHERWISE <comenzi i instruciuni>] ENDCASE Un exemplu de folosire al acesteia este urmtorul:
63

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

STORE CMONTH(DATE( )) TO luna DO CASE CASE INLIST(luna,'January','February','March') STORE 'Primul sfert al anului' TO rpt_titlu CASE INLIST(luna,'April','May','June') STORE 'Al doilea sfert al anului' TO rpt_titlu CASE INLIST(luna,'July','August','September') STORE 'Al treilea sfert al anului' TO rpt_titlu OTHERWISE STORE 'Al patrulea sfert al anului' TO rpt_titlu ENDCASE WAIT WINDOW rpt_titlu NOWAIT
Instruciuni de ciclare: SCAN, FOR, DO WHILE

&& luna curent && nceperea buclei case

&& Sfrit bucl case && afiare mesaj && Exemplu SCAN && Deschide tabela Institutii && Deschide tabela Contacte && Permite i EXIT i LOOP (continu)

OPEN DATABASE ('Universitati') USE Institutii in 1 USE Contacte in 2 CLEAR SCAN FOR institutii.nr = 1 and contacte.nr = 1 ? contacte.nume, institutii.nume, contacte.email ENDSCAN SET TALK OFF CLOSE DATABASES OPEN DATABASE ('Universitati') USE Contacte STORE 2 TO gnI STORE 10 TO gnJ STORE 2 TO K FOR gnCount = gnI TO gnJ STEP K GOTO gnCount DISPLAY nume ENDFOR CLOSE DATABASES OPEN DATABASE ('Universitati') USE contacte SET TALK OFF

&& Exemplu FOR

&& Valoare iniial && Valoare final && Pas && Permite i EXIT i LOOP (continu) && Mut pointerul de nregistrare && Afieaz numele && Sau NEXT && Exemplu DO WHILE

64

Programarea rapid a aplicaiilor pentru baze de date relaionale

DIMENSION A(4) STORE 0 TO A max = 0 DO WHILE .T. IF EOF( ) EXIT ENDIF IF poz < 10 SKIP LOOP ENDIF A(nr) = A(nr) + 1 IF max < nr max = nr ENDIF SKIP ENDDO CLEAR ? 'Statistica contactelor inregistrate mai putin primele 10:' FOR zz = 1 TO max ?? A(zz) ENDFOR && Sfrit bucl && Numr ...; cel mult institutii.nr = 9 && Urmrete nr. maxim de instituii && Trece la testarea din nou a condiiei && Startul buclei DO WHILE && Testeaz sfritul de fiier

65

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

21. Proceduri i funcii


n VFP procedurile i funciile au sintaxa n forma: PROCEDURE <nume_procedur> <comenzi i instruciuni> ENDPROC iar apelul acestora este n forma: DO <nume_procedur> de a defini funcii i proceduri: PROCEDURE myproc( cString ) MESSAGEBOX ("myproc" + cString) ENDPROC FUNCTION plus2saptamani PARAMETERS dDate RETURN dDate + 14 ENDFUNC DO <nume_funcie> Urmtoarea procedur afieaz un mesaj iar urmtoarea funcie arat o alt modalitate FUNCTION <nume_funcie> <comenzi i instruciuni> ENDFUNC

n cazul n care procedura are parametrii, cum este cazul: PROCEDURE procedura( dData, cSir, nOriTipar ) FOR nCnt = 1 to nOriTipar ? DTOC(dData) + " " + cSir + " " + STR(nCnt) ENDFOR ENDPROC atunci apelul se face n forma: DO procedura WITH DATE(), "Salut Prieteni!", 10

66

Programarea rapid a aplicaiilor pentru baze de date relaionale

22. Rapoarte i etichete


5 forme de prezentare a rapoartelor sunt frecvente:

raport pe coloane

raport pe linii

raport 1 la n

raport multi coloan

etichet

Un raport se salveaz pe disc cu extensia *.frx i are de asemenea asociat i un fiier cu extensia *.frt. ntr-un raport se specific cmpurile dorite, textul de imprimat i plasarea informaiei n pagin. Informaia efectiv din raport se ncarc n momentul procesrii raportului pentru imprimare i este conform cu modificrile care survin n tabelele i vederile folosite n ntocmirea raportului. Se poate crea un raport pe 3 ci: Report Wizard (pentru rapoarte dintr-o singur tabel sau din mai multe tabele i/sau vederi), Quick Report (dintr-o singur tabel sau vedere) i cu ajutorul lui Report Designer (rapoarte definite n ntregime de utilizator).
Utilizarea lui Report Wizard

n Project Manager se selecteaz Reports/New/Report Wizard. Se selecteaz tipul de raport care se dorete a se crea i apoi se urmresc instruciunile din ferestrele interogative. Aplicaie: realizarea unui raport cu persoanele contact din baza de date Universitati. Rezolvare: se urmeaz paii: 1. Se deschide proiectul Universitati.pjx (File/Open...); 2. Se ncarc baza de date Universitati.dbc (optiunea Modify); 3. Se selecteaz tabulatorul Documents i de aici Reports; 4. Se acioneaz butonul New... i apoi se selecteaz Report Wizard; 5. Se selecteaz One-to-Many Report Wizard i se activeaz Ok; 6. Se selecteaz din tabela printe (Institutii) cmpul nume; 7. Se selecteaz din tabela fiu (Contacte) cmpurile nume i email; 8. Se accept relaia Institutii.nr = Contacte.nr care leag cele dou tabele; 9. Se alege o regul de ordonare n raport; fie aceasta dup acronim; 10. Se alege o form de prezentare; fie aceasta Ledger; 11. Se alege setarea de pagin; fie aceasta Landscape; 12. Se alege titlul raportului; fie acesta institutii.frx; 13. Se activeaz butonul Preview pentru a executa raportul.
67

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

Utilizarea lui Report Designer

Aplicaie: totaluri pe categorii; pentru a realiza totaluri pe categorii este necesar s includem cmpuri numerice n raport, cum ar fi cmpul poz din tabela contacte. Rezolvare: se modific raportul Institutii: 1. Se deschide proiectul Universitati.pjx (File/Open...); 2. Se selecteaz tabulatorul Documents i de aici Reports; 3. Se acioneaz butonul New... i apoi se selecteaz Report Wizard;

4. Se modific raportul cu ajutorul instrumentelor din Report Controls adugnd totalul dup poz n Group Footer.
Realizarea unui raport dintr-o vedere i Quick Report

1. Se deschide proiectul Universitati.pjx (File/Open...); 2. Se ncarc baza de date Universitati.dbc (optiunea Modify); 3. Se selecteaz tabulatorul Documents i de aici Reports; 4. Se acioneaz butonul New... i apoi se selecteaz Report Wizard; 5. Se selecteaz Report Wizard i se activeaz Ok; 6. Se selecteaz vederea contacte_institutii cu structura: contact.nume, contact.email, institutii.nume contacte_institutii.email); 7. Se las negrupate contactele; 8. Se sorteaz dup contacte_institutii.nume_a i apoi dup contacte_institutii.nume_b; 9. Se selecteaz boxa Use display settings stored in the database; 10. Se salveaz raportul; 11. Se selecteaz raportul Contacte_institutii din tabulatorul Docs (Documents);
68

(contacte_institutii.nume_a,

contacte_institutii.email,

Programarea rapid a aplicaiilor pentru baze de date relaionale

12. Se apas butonul Preview...;

Varianta 2

1. Se modific vederea prin definirea ordinii de afiare institutii.nume, contacte.nume; 2. Se urmeaz paii 1-6 ca la varianta 1; 3. Se grupeaz nregistrrile dup nume_b; 4. Se alege stilul Executive; 5. Se sorteaz dup nume_a; 6. Se selecteaz boxa Use display settings stored in the database; 7. Se apas Finish i se salveaz raportul cu numele contacte_institutii1;

Etichete

Se urmeaz paii: 1. Se selecteaz Labels, se apas New...; 2. Se alege vederea contacte_institutii; 3. Se alege sistemul metric; 4. Se alege o form de etichet pe dou coloane (de exemplu L7162); 5. Se definete forma etichetei (plasarea informaiilor n cadrul zonei etichetei);

69

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

6. Se definete fontul (de exemplu Arial 12); 7. Se salveaz raportul; 8. Se vizualizeaz cu preview;

Crearea unei etichete dintr-o vedere cu parametru

Se poate folosi vederea caut_contact din baza de date universitati. Se urmeaz paii: 1. n Label Wizard se alege vederea caut_contact; 2. Se alege sistemul metric i tipul Avey EAL 04; 3. Se definete forma ( de exemplu: nume_a 5. Se salveaz eticheta caut_contact; 6. Se execut vederea de la butonul Preview... cnd se activeaz mesajul interogativ;
de la nume_b : Email);

4. Se alege fontul (de exemplu Monotype Corsiva, 12);

7. Pentru c spaiul alocat implicit de Wizard este insuficient pentru afiarea tuturor informaiilor (email) se alege modificarea raportului (Modify); 8. Se poate definii pagina Landscape (din File/Page Setup/Print Setup/Orientation);
70

Programarea rapid a aplicaiilor pentru baze de date relaionale

9. Se mrete caseta alocat textului din Label Designer;

71

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

23. Macrosubstituie
Macrosubstituia este nlocuirea numelor cu variabile. n VFP se plaseaz operatorul & naintea unei variabile pentru a folosi valoarea acestei variabile (care trebuie s fie un ir de caractere ce respect sintaxa VFP) ca un nume. O comand sau o funcie ce conine un nume se execut mai rapid ca una ce conine o macrosubstituie ns utilizarea macrosubstituiilor confer avantaje de flexibilitate n codul de executat. Un exemplu de macrosubstituie poate fi crearea unei vederi folosind un cod SQL stocat ntr-o variabil din care apoi poate fi chemat. Codul se scrie ntr-un program (fiier de comenzi) sau se copiaz n Command: && definirea vederii con_inst_sql = "SELECT Contacte.nume, Contacte.email, Institutii.nume; FROM universitati!institutii INNER JOIN universitati!contacte ; ON Institutii.nr = Contacte.nr; ORDER BY Institutii.nume, Contacte.nume" && execuia vederii CREATE SQL VIEW con_inst_view AS &con_inst_sql Dup execuie, n Project Manager apare vederea. Aceasta se poate apoi vizualiza (Browse).

72

Programarea rapid a aplicaiilor pentru baze de date relaionale

24. Formulare
Aa cum rapoartele permit facila tiprire a tabelelor, interogrilor i vederilor, formularele sunt o cale eficient pentru afiarea, introducerea i editarea informaiilor din baza de date. Se pot crea formulare interactive din tabele i vederi, utiliznd wizard-ul, constructorul i aplicaia expert Form Designer.
Form Wizard

Din Project Manager din tabulatorul Documents se selecteaz Forms apoi New i Form Wizard dup care se urmeaz instruciunile din ferestrele interogative urmtoare.

Aplicaia 1. S se creeze un formular pentru parcurgerea i modificarea datelor pentru

instituiile existente i pentru introducerea datelor pentru o nou instituie n baza de date universitati.dbc. Rezolvare. Se urmeaz paii: 1. Se alege Form Wizard n fereastra de dialog Wizard Selection; 2. Se alege tabela Institutii.dbc; se includ cmpurile acesteia n caseta Selected Fields mai puin cmpul autoincrement universitati!institutii.nr; 3. Se alege stilul formei; de exemplu Embossed; se alege tipul butoanelor de navigare; de exemplu Text buttons; se alege indexul dup care s se fac ordonarea la afiare; de exemplu acronim; 4. Se salveaz forma pentru a fi utilizat ulterior; se alege numele acesteia institutii; ea se va salva pe disc cu numele institutii.scx;

5. n Project Manager va apare n grupul Forms noua form creat; se selecteaz forma institutii i se lanseaz n execuie (butonul Run).

73

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

Noua form creat conine 5 butoane pentru deplasare (Top, Next, Prev, Bottom, Find), un buton pentru imprimare (Print), 3 butoane pentru operaii de intrare-ieire (Add pentru adugarea unei noi nregistrri, Edit pentru modificarea unei nregistrri existente i Delete pentru tergere) i un buton pentru ieire (Exit).

Pentru tiprirea informaiilor despre instituii se poate crea un raport institutii.frx; se poate folosi wizard-ul pentru generarea raportului incluznd cmpurile nume, acronim, adresa i web, selecta opiunea de preluare a etichetelor pentru cmpuri din tabela institutii.dbf i apoi se poate modifica nct s se prezinte astfel:

Se poate folosi formularul pentru introducerea unei noi instituii (de exemplu Academia de Arte Vizuale Ion Andreescu Cluj-Napoca). Tentativa de a completa adresa web a acesteia este sortit eecului dac cmpul pentru pagina web are 20 de caractere. Sunt necesare atunci urmtoarele operaiuni: 1. Se modific structura tabelei institutii.dbf prin mrirea cmpului de la 20 la 25 de caractere (Project Manager/Databases/Universitati/Tables/Institutii/Modify); 2. Se modific formularul institutii.scx (se mrete caseta de editare pentru pagina web) pe calea Project Manager/Docs/Forms/Institutii/Modify; 3. Se activeaz proprietile casetei de editare WEB1 (click dreapta pe caseta corespunztoare paginii web i apoi Properties); 4. Se modific macheta de introducere a casetei prin inserarea a nc 5 "X";
74

Programarea rapid a aplicaiilor pentru baze de date relaionale

5. Pentru a executa formularul este necesar acum s nchidem tabela institutii.dbf deschis de sistem la modificarea structurii (execuia necesit accesul exclusiv la tabel); se poate face acest lucru din Data Session sau din fereastra de comenzi Close all urmat de Modi Project); 6. Se execut formularul pe calea Project Manager/Docs/Forms/Institutii/Run; 7. Se pot complecta acum datele;

8. Pentru inserarea datelor n tabela institutii.dbf se apas butonul Save i apoi Exit cnd la o nou execuie a formularului sau la o deschidere a tabelei institutii ntr-o fereastr Browse apare noua instituie nregistrat; dac a fost definit funcia de autoincrementare pentru cmpul cheie institutii.nr acesta va avea valoarea generat automat n tabel (vezi fereastra Browse pentru tabela institutii); 9. Tiprirea instituiilor cu ajutorul formei institutii.scx se poate face acum prin selectarea raportului institutii.frx: Project Manager/Docs/Forms/Institutii/Run/Print;

75

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

Aplicaia 2. S se creeze un formular pentru parcurgerea i modificarea datelor simultan

pentru instituiile i persoanele de contact din baza de date universitati.dbc. Rezolvare. Se urmeaz paii: 1. Se alege One-to-many Form Wizard n fereastra de dialog Wizard Selection; 2. Se alege tabela printe: Institutii.dbc; se includ cmpurile acesteia n caseta Selected Fields mai puin cmpul autoincrement universitati!institutii.nr; 3. Se alege tabela fiu: Contacte.dbf; se includ cmpurile acesteia n caseta Selected Fields mai puin cmpurile cheie strin (Contacte.poz) i autoincrement (Contacte.nr); 4. Se accept relaia ntre tabele pe baza cheii primare Institutii.nr i strine Contacte.nr; 5. Se alege stilul formei; de exemplu Stone; se alege tipul butoanelor de navigare; de exemplu Picture buttons; se alege indexul dup care s se fac ordonarea la afiare pentru nregistrrile din tabela printe; de exemplu nr; 6. Se salveaz forma pentru a fi utilizat ulterior; se alege numele acesteia universitati; ea se va salva pe disc cu numele universitati.scx; n Project Manager va apare n grupul Forms noua form creat; se selecteaz forma universitati i se modific ca mai jos (butonul Modify); apoi se lanseaz n execuie;

Adugare i Modificare

Formularul permite modificarea datelor pentru o instituie; prezena codului relaiei de integritate face ca modificrile fcute valorii cheii primare (Institutii.nr) s se transmit i n tabela de contacte, fapt care se poate observa cu ajutorul formularului. De asemenea, modificrile efectuate asupra nregistrrilor din tabela de contacte (mai exact modificrile asupra cheii strine) sunt controlate de codul relaiei de integritate. O modificare a cheii strine la o valoare care nu se regsete n tabela institutii este sortit eecului. Formularul permite adugarea unei instituii sau a unei persoane de contact. Prezena relaiei de integritate interzice ns adugarea nregistrrilor simultan n ambele tabele. Este posibil adugarea simultan numai prin renunarea la codul relaiei de integritate.
76

Programarea rapid a aplicaiilor pentru baze de date relaionale

Form Builder

Constructorul de formulare (Form Builder) se poate activa pe urmtoarea succesiune de pai: 1. Se ncarc proiectul; 2. Se selecteaz opiunea Forms; 3. Se apas New/New form; 4. Din bara de instrumente a lui Form Desiner se selecteaz Form Builder sau din meniul VFP, Form/Quick Form;
Aplicaia 3. S se construiasc un formular pentru modificarea unei persoane de contact.

Rezolvare. Se urmeaz paii: 1. Se ncarc Form Builder; 2. Se deschide universitati.dbc sau contacte.dbf; 3. Se selecteaz cmpurile din contacte.dbf; 4. Se alege stilul (de exemplu Colorful); 5. Se salveaz formularul; 6. Se lanseaz n execuie; Formularul va ncrca din tabela Contacte prima nregistrare care va putea fi modificat dup dorin. La nchiderea formularului modificrile efectuate se vor transmite n tabela Contacte (dac nu a aprut conflict la modificarea cheii strine contacte.nr). Pentru a mbunti formularul creat este necesar s adugm controale pe acesta cu ajutorul barei de instrumente Form Controls. Din aceasta se poate aduga un control Spinner (Spiner1).

La lansarea n execuie a formularului se poate observa c sgeile controlului Spinner1 ( i ) incrementeaz sau decrementeaz valoarea din caseta de editare a acestuia fr ns ca odat cu aceasta s se deplaseze pointerul nregistrrii curente n tabela Contacte i s accesm o alt nregistrare. Este necesar setarea proprietilor controlului Spinner1. O posibilitate este ca mai jos:

ControlSource Contacte.poz DownClick Event (User Procedure) SpinerHighValue = RECCOUNT() SpinnerLowValue = 1 UpClick Event (User Procedure)

v = val(Form2.Spinner1.Text) if v >= 1 and v <= recsize() goto v Form2.NUME1.Text1.refresh Form2.FUNCTIA1.Text1.refresh Form2.EMAIL1.Text1.refresh Form2.NR1.Text1.refresh else return to master endif

77

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

Form Designer

Pentru generarea manual a formularelor sunt necesare bara de instrumente a lui Form Desiner i a lui Form Controls.
Aplicaia 4. S se construiasc un formular dup modelul:

Rezolvare. Se urmeaz paii: 1. Cu Form Designer se insereaz tabelele institutii i contacte (butonul Data Environment);

2. Cu Form Controls se contruiesc butoanele, casetele de editare, listele combinate i etichete; se definete mrimea formularului, se fac alinierile;

3. Se creeaz cte un index dup fiecare cmp din tabelele contacte i institutii (regular sau primar); 4. Se definesc proprietile pentru fiecare Combo i Text; a. Combo1 i. Click Event select institutii set order to nume seek ALLTRIM(Form1.Combo1.Text) Form1.Text1.Refresh Form1.Text2.Refresh Form1.Text3.Refresh Form1.Text4.Refresh
78

Programarea rapid a aplicaiilor pentru baze de date relaionale

Form1.Text5.Refresh select contacte set filter to contacte.nr = institutii.nr Form1.Combo6.Refresh Form1.Combo7.Refresh Form1.Combo8.Refresh Form1.Combo9.Refresh Form1.Combo10.Refresh ii. RowSource: Institutii.nume iii. Row Source Type: 6 Fields b. Combo2 i. Click Event select institutii set order to adresa seek ALLTRIM(Form1.Combo2.Text) Form1.Text1.Refresh Form1.Text2.Refresh Form1.Text3.Refresh Form1.Text4.Refresh Form1.Text5.Refresh select contacte set filter to contacte.nr = institutii.nr Form1.Combo6.Refresh Form1.Combo7.Refresh Form1.Combo8.Refresh Form1.Combo9.Refresh Form1.Combo10.Refresh ii. RowSource: Institutii.adresa iii. Row Source Type: 6 Fields c. Analog Combo3 i Combo5 d. Combo4 select institutii set order to nr seek val(ALLTRIM(Form1.Combo4.Text)) Form1.Text1.Refresh Form1.Text2.Refresh Form1.Text3.Refresh Form1.Text4.Refresh Form1.Text5.Refresh select contacte set filter to contacte.nr = institutii.nr Form1.Combo6.Refresh Form1.Combo7.Refresh Form1.Combo8.Refresh Form1.Combo9.Refresh Form1.Combo10.Refresh e. Command1 (All)
79

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

i. Click Event select contacte set filter to Form1.Combo6.Refresh Form1.Combo7.Refresh Form1.Combo8.Refresh Form1.Combo9.Refresh Form1.Combo10.Refresh ii. Caption: All f. Text1: ControlSource Institutii.nume; g. Text2: ControlSource Institutii.adresa; h. Text3, Text4, Text5 analog; i. Text7: ControlSource Contacte.nume; j. Text6: ControlSource Contacte.email; k. Text8, Text9, Text10 analog; l. Combo7 i. Click Event select contacte set order to nume seek ALLTRIM(Form1.Combo7.Text) Form1.Text6.Refresh Form1.Text7.Refresh Form1.Text8.Refresh Form1.Text9.Refresh Form1.Text10.Refresh ii. RowSource: Contacte.nume iii. Row Source Type: 6 Fields m. Combo6, Combo8 analog; n. Combo9 i. Click Event select contacte set order to poz seek val(ALLTRIM(Form1.Combo9.Text)) Form1.Text6.Refresh Form1.Text7.Refresh Form1.Text8.Refresh Form1.Text9.Refresh Form1.Text10.Refresh ii. RowSource: Contacte.poz iii. Row Source Type: 6 Fields o. Combo10 analog 5. Se salveaz forma i se lanseaz n execuie cnd se obine o fereastr de tipul:
80

Programarea rapid a aplicaiilor pentru baze de date relaionale

6. Se pot aduga butoane pentru adugare instituie i adugare persoan de contact. 7. Pentru adugare instituie: un buton Add care s aplice un Append Blank i un buton Save care s aplice un Replace nume with AllTrim(Form1.Text1.Text) i aa mai departe; 8. Pentru adugare contact: un buton care s aplice un Append Blank urmat de Form1.Text10.Text = Form1.Text5.Text i un buton Save care s aplice un Replace nume with AllTrim(Form1.Text7.Text) i aa mai departe; 9. Noua form creat este n conformitate cu relaia de integritate; pentru protejarea cheilor la adugare se poate seta proprietatea Enabled la .F.; 10. Valorile cmpurilor autoincrement de asemenea pot fi blocate la modificare cu ajutorul aceleiai proprieti; 11. Cu ajutorul controlului Image i apoi a proprietii Picture se pot insera poze n format recunoscut de sistem (bmp, gif, jpg, etc.); Urmtoarele controale sunt disponibile n mod implicit la crearea de formulare:

Label: creeaz un control de tip etichet; Text Box: creeaz un control caset de editare cu introducerea de text pe o singur linie; Edit Box: creeaz un control caset de editare cu introducerea de text pe mai multe linii; Command Button: creeaz un control de tip buton de comand; Command Group: creeaz un control de tip grup de butoane de comand; Option Group: creaz un control de tip grup de butoane radio;
81

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

Check Box: creaz un control de tip caset de selecie (opiuni); Combo Box: control de tip list ascuns; List Box: control de tip list vizibil cu bare de defilare; Spinner: control de tip butoane incrementare/decrementare combinate cu o caset de editare; Grid Control: un control de tip grid (vezi formularele one-to-many generate cu wizard-ul); Image: creaz o imagine grafic; Timer: creaz un control de timp; Page Frame: creaz un grup de tabulatori; Line i Shape: permit trasarea de curbe i suprafee pe formular; Pentru alinierea i ordonarea controalelor pe formular este util bara de instrumente

Layout (View/Toolbars...):

Form Designer conine i controale pentru definirea culorilor i formatrii formularelor. De asemenea, vizualizarea codului asociat unei proprieti a formularului se poate face tot cu Form Designer. Pentru a modifica ordinea de selecie a controalelor pe formular se selecteaz din meniu View/Tab Order cnd va aprea numrul de ordine al fiecrui control pe formular (numai pentru controalele care pot primi focus):

Schimbarea ordinii se face cu click pe control. Renumerotarea ncepnd cu poziia 1 se face cu dublu click pe controlul care se dorete a fi primul; apoi cu click pe al doilea, i aa mai departe. O alt posibilitate este de a seta ordinea pe baza unei liste. Din Tools/Options/Forms/Tab ordering se seteaz By List i apoi la View/Tab Order se activeaz o fereastr n care sunt aezate controalele ntr-o list n ordinea de selecie (Tab Order). Setarea ariei maxime pe ecran (implicit 640480) a unui formular se face din Tools/Options/Forms/Maximum design area.
82

Programarea rapid a aplicaiilor pentru baze de date relaionale

25. Controale
Controalele sunt mediul de baz pentru interaciunea cu utilizatorul. Acestea se aplic pe formulare i pot avea asociate:

Valori: 0 1 este selectat i valoarea implicit 1 dac nu este selectat); dac 1 valori (controlul buton de opiune are valoarea implicit 0 dac Name) atunci iar numele la

numele formularului este Form4 (proprietatea OptionGroup1


grupului de butoane de opiune este accesul valoare se face pe calea Form4.OptionGroup1.Option1.Value; cmpuri (proprietatea ControlSource); variabile ....

Aplicaia1

S se realizeze o aplicaie cu butoane de opiune (radio) care s afieze un mesaj la selectarea unei opiuni din caseta de opiuni. Rezolvare. Se pot urma paii: 1. Din Project Manager se selecteaz Documents (Docs) apoi Forms, New..., New Form; 2. Se stabilete proprietatea Caption pentru formular (din Form Designer, Properties Window); fie Caption Test; acesta va fi afiat la execuia formularului; 3. Se stabilete proprietatea Name pentru formular; acesta va fi folosit pentru a identifica formularul n proceduri; fie Name Form_Test; 4. Se salveaz formularul pe disc (File/Save); se stabilete un nume pentru formular; acesta va fi folosit pentru identificarea formularului n cadrul proiectului i va fi numele sub care acesta se salveaz pe disc; fie acesta Form3.scx; 5. Se adaug acum din Form Controls un control de tipul Option Group; 6. Se selecteaz controlul Option Group creat; dac a fost nchis fereastra de proprieti se activeaz din nou pe aceeai cale; acum avem 4 obiecte: formularul (cu proprietile sale) i OptionGroup1 (cu proprietile sale) i dou obiecte de tip butoane de opiune (Option1 i Option2); din caseta de proprieti a lui OptionGroup1 se selecteaz Click Event i se acceseaz aceast proprietate (dublu click); 7. n fereastra Form_test.Click care se activeaz i care conine codul procedurii care se execut la apsarea unui buton de opiune (vezi: Object: Form_Test; Procedure: Click) se introduce urmtorul cod:
83

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

store "Starea butoanelor de optiune:" to xx For i = 1 to ThisForm.OptionGroup1.ButtonCount xx = xx + chr(13) + ThisForm.OptionGroup1.buttons[i].Caption +; ":" + str(ThisForm.OptionGroup1.Buttons[i].Value) endfor Messagebox(xx) care pentru fiecare buton din grupul de butoane OptionGroup1 extrage titlul acestuia (Caption) din tabloul (irul) de butoane ale acestuia (buttons) i apoi valoarea (Value) pe care o convertete la ir de caractere (funcia str()) i le memoreaz n irul de caractere xx; funcia chr(13) este folosit pentru trecerea la linie nou; la sfrit este afiat un mesaj cu coninutul irului xx iar descriptorul ThisForm este folosit pentru a specifica formularul curent; 8. Se poate seta proprietile BackColor (Red,Green,Blue) ale obiectelor (forma, grup de butoane, butoane); se pot seta acestea la alb (255,255,255), rou (255,0,0), etc.; pentru accesul la butoane se poate merge pe calea ilustrat mai jos:

9. Pentru centrarea grupului de butoane pe formular se poate scrie urmtorul cod la proprietatea Activate Event (evenimentul de activare a formularului): ThisForm.OptionGroup1.Left = (ThisForm.Width ThisForm.OptionGroup1.Width)/2 ThisForm.OptionGroup1.Top = (ThisForm.Height ThisForm.OptionGroup1.Height)/2 10. Pentru ca la redimensionarea formularului la execuie s se centreze automat grupul de butoane n fereastra formularului, este necesar introducerea aceluiai cod i la evenimentul Resize al formularului; 11. Execuia formularului (butonul !) va duce la afiarea unui mesaj n forma:

12. Se pot acum modifica titlurile opiunilor i chiar numrul acestora fr ca codul s sufere modificri; se poate modifica i mesajul implicit din fereastra de mesaj ca n figura:

84

Programarea rapid a aplicaiilor pentru baze de date relaionale

unde alinierea n fereastra de mesaj se poate face dac se inverseaz ordinea de afiare: store "Functia didactica:" to xx For i = 1 to THISFORM.OptionGroup1.ButtonCount xx = xx + chr(13) + str(THISFORM.OptionGroup1.Buttons[i].Value) +; ": " + THISFORM.OptionGroup1.buttons[i].Caption endfor Messagebox(xx)
Aplicaia2

S se modifice formularul Form1 (Aplicaia 4, pag. 54) astfel nct s permit: 12. Pentru adugare instituie: un buton Add care s aplice un Append Blank i un buton Save care s aplice un Replace nume with AllTrim(ThisForm.Text1.Text) i aa mai departe; 13. Pentru adugare contact: un buton care s aplice un Append Blank urmat de Form1.Text10.Text = Form1.Text5.Text i un buton Save care s aplice un Replace nume with AllTrim(ThisForm.Text7.Text) i aa mai departe; 14. Noua form creat este n conformitate cu relaia de integritate; pentru protejarea cheilor la adugare se poate seta proprietatea Enabled la .F.; 15. Valorile cmpurilor autoincrement de asemenea pot fi blocate la modificare cu ajutorul aceleiai proprieti; Rezolvare. Se urmeaz paii: 1. Se modific setarea ariei maxime a formularelor la dimensiunea de 800600 (Tools/Options/Forms/Maximum design area); 2. Se creeaz un nou formular n cadrul proiectului i se salveaz cu un nume; fie acesta form7.scx; 3. Se selecteaz toate obiectele (controalele) de pe forma form1.scx cu ajutorul mouse-ului; 4. Se copiaz n clipboard (Edit/Copy); se copiaz pe forma form7.scx (Edit/Paste); 5. Se salveaz din nou form7; se verific existena tuturor procedurilor asociate evenimentelor de pe form7; 6. Se pot rearanja controalele pe formular; 7. Se includ tabelele institutii i contacte n mediul de lucru al formei form7 (Form Designer/Data Environment/Add Table or View/Add institutii, contacte); 8. Pentru a permite adugarea unei persoane de contact n prezena relaiei de integritate se asociaz o valoare implicit pentru cmpul nr din tabela contacte (contacte/Modify/Fields/nr/Field validation/Default value: 1); 9. Se adaug cte dou controale de tip command button pentru fiecare tabel pe formular;
85

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC Caption: Add Click Event: (User Procedure): select institutii set filter to ThisForm.SetAll("Enabled",.F.) ThisForm.Command3.Enabled = .T. ThisForm.Text1.Enabled = .T. ThisForm.Text2.Enabled = .T. ThisForm.Text3.Enabled = .T. ThisForm.Text4.Enabled = .T. Append blank ThisForm.Refresh Caption: Save Enabled: .F. - False Click Event: (User Procedure): ThisForm.SetAll("Enabled",.T.) ThisForm.Refresh Caption: Save Enabled: .F. - False Click Event: (User Procedure): ThisForm.SetAll("Enabled",.T.) ThisForm.Refresh select institutii set order to nume seek ALLTRIM(ThisForm.Combo1.Text) select contacte set filter to contacte.nr = institutii.nr Click Event: ThisForm.Refresh Caption: Save Enabled: .F. - False Click Event: (User Procedure): select contacte set filter to ThisForm.SetAll("Enabled",.F.) ThisForm.Text6.Enabled = .T. ThisForm.Text7.Enabled = .T. ThisForm.Text8.Enabled = .T. ThisForm.Command5.Enabled = .T. Append Blank repl nr with val(ThisForm.Text5.Text) ThisForm.Refresh

10. Se pot modifica evenimentele asociate controalelor Combo1 Combo5 dup modelul lui Combo1; persoane de contact;

11. Se salveaz i se execut formularul, care permite acum i adugarea unei instituii i/sau

86

Programarea rapid a aplicaiilor pentru baze de date relaionale

26. Controale i containere n FVP


Elementele puse la dispoziie de mediul VFP pentru dezvoltarea de aplicaii se clasific n controale i containere care pot fi vizuale i non-vizuale. Un container poate conine alte containere i controale. Sunt astfel dou tipuri de clase: clasele container i clasele control. Orice container sau control care este folosit n aplicaie reprezint o instaniere a clasei din care face parte i se numete obiect (de tip container sau control). Dezvoltarea unei aplicaii presupune alegerea elementelor potrivite pentru realizarea obiectivelor dorite. Cea mai rapid cale de a dezvolta aplicaii este prin folosirea elementelor standard puse la dispoziie de mediul VFP. Fiecare obiect (container sau control) are asociate proprieti i evenimente accesabile att n faza de construcie prin intermediul ferestrei de proprieti asociate obiectului (Properties Window) ct i n faza de execuie (prin intermediul operatorului "."). Urmtoarea schem clasific i ierarhizeaz obiectele VFP:

Obiecte VFP:
o Controale:

Vizuale (pot fi vizibile la execuie):


Check Box ( Combo Box (

) ) )

Command Button ( Edit Box ( de tip grid) Hyperlink ( )

Control (poate conine orice control) Header (creeaz o caset Header pentru o coloan ntr-un control ) creeaz o legtur ctre un Document Activ prin

intermediul unui Container de Documente Active (ex: Microsoft Internet Explorer), legtur dat printr-un URL (uniform resource locator)

Image ( Label ( Line (

) creeaz o legtur ctre o imagine care este afiat n ) creeaz o etichet care poate afia un text ) creeaz un control care poate afia o linie ) poate afia o list de valori ) poate afia un obiect de tip general ntr-

format BMP

List Box (

OLE Bound Control (

un cmp dintr-un tabel (de exemplu provenit din Word sau Excel)

87

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

OLE Container Control (

)poate afia un obiect de tip general n

aplicaie (de exemplu provenit din Word sau Excel) OptionButton (adaug un buton de opiune ntr-un container de tipul Option Button Group) Shape ( Spinner ( ) creaz un control care poate afia o form geometric ) creeaz un control care poate afia o cast de editare

de tip text pentru o valoare i dou butoane pentru parcurgerea valorilor unui domeniu de valori asociat casetei de tip text

Text Box (

) creeaz un control care poate afia o caset de

editare de tip text Non-vizuale:


o Containere:

Active Doc (Creaz un document activ care poate fi gzduit de un container de documente active ca Microsoft Internet Explorer) Custom (poate conine orice control, Pageframe, container, custom) Project Hook (poate conine fiiere i servere) Timer ( ) creeaz un control de timp

Vizuale:

Container (poate conine orice control,

Form (poate conine Pageframe, orice control, containere, Custom) Grid (poate conine coloane grid; coloanele grid fac legturi la orice tip de obiecte exceptnd formularele, seturile de formulare, barele de instrumente, controalele de timp i alte coloane de grid); cu ajutorul grid-urilor ( ) se pot afia datele n linii i coloane i este similar cu apariia lor ntr-o fereastr Browse

Column (creeaz o coloan ntr-un grid) Page (o pagin poate conine orice controale, containere, Custom) Toolbar (poate conine orice control, pagini, containere) Option Button Group (poate conine butoane de opiune, ) ) Command Button Group (poate conine butoane de comand, Form Set (poate conine formulare i bare de instrumente) PageFrame (poate conine pagini)

Non-vizuale:

Toate obiectele VFP au asociate urmtoarele evenimente (prin proceduri):


88

Programarea rapid a aplicaiilor pentru baze de date relaionale

Init: este executat atunci cnd obiectul este creat; Destroy: este executat atunci cnd obiectul este dealocat din memorie; Error: este executat atunci cnd o eroare apare la execuia procedurilor din obiect;

Pentru accesarea obiectelor VFP din aplicaie n timpul execuiei sunt utile urmtoarele proprieti:

Parent: containerul care conine obiectul care refer procedura; de exemplu pentru formularul Test.scx proprietatea Parent apelat n procedura Option1.Click va returna o referin ctre containerul acestui obiect (OptionGroup1);

This: obiectul curent; ThisForm: formularul curent; ThisFormSet: FormSetul curent;

Exemplu: 1. Se selecteaz obiectul Option1 din formularul Test; 2. n caseta procedurii Option1.Click (Click Event) se introduce MessageBox("Container: "+This.Parent.Name + " Formularul: " + ThisForm.Caption); 3. Se execut formularul; Un control poate fi legat de datele din tabele sau din variabilele din memorie pe baza proprietii

ControlSource.

Schematizarea

efectelor

valorilor

atribuite

proprietii

ControlSource asupra controalelor: caset de validare:


o ControlSource = cmp de tabel:

valorile NULL, valorile logice (.T. i .F.) i valorile numerice 0, 1 i 2 determin: selectarea, deselectarea sau dezactivarea casetei de validare pe msur ce indicatorul de nregistrri parcurge tabela; exemplu: s se construiasc o tabel ce conine un cmp cu valori numerice de 0, 1 i 2 i s se construiasc un formular care conine o caset de validare legat cu ControlSource de acest cmp i s se execute formularul;

coloan:
o ControlSource = cmp de tabel:

utilizatorul editeaz direct valorile cmpului odat cu editarea valorilor din coloan; proprietatea se extinde la ntreaga gril cu ajutorul proprietii RecordSource a grilei; exemplu: proprietatea RecordSource de la formularul Universitati, obiectul grid1;

caset combo sau list:


89

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

o ControlSource = variabil:

valoarea aleas de utilizator este pstrat n variabil; exemplu: se adaug un control de tip List (List1) la formularul Test; la evenimentul de activare a formularului se adaug instruciunile: dimension a(10) public i store 2 to i store " " to a ThisForm.List1.additem(str(1)) la evenimentul DblClick al listei List1 se introduc instruciunile: ThisForm.List1.additem(str(i)) i=i+1 se execut formularul; la dublu click se va insera cte un element n list;

buton de opiune:
o ControlSource = cmp numeric:

n cmp va fi inserat valoarea 0 (dac este selectat butonul) sau 1 (dac nu este selectat butonul);
o ControlSource = cmp logic:

n cmp va fi inserat valoarea .T. (dac este selectat butonul) sau .F. (dac nu este selectat butonul); dac indicatorul de nregistrri parcurge tabela, valoarea butonului de opiune se modific pentru a reflecta noua valoare a cmpului; exemplu: s se insereze un control de tip buton de opiune pentru nregistrrile terse dintr-o tabel;

grup de opiuni:
o ControlSource = cmp de tip caracter:

se pstreaz n cmp titlul butonului selectat; opiunea nu este valabil i pentru butoane individuale de opiuni;

spinner:
o ControlSource = cmp sau variabil numeric:

caseta de incrementare afieaz i scrie valori numerice din/n cmpul sau variabila asociate; exemplu: formularul din aplicaia 3 (pag. 53);

text sau edit:


o ControlSource = cmp:
90

Programarea rapid a aplicaiilor pentru baze de date relaionale

n caset este afiat valoarea cmpului din tabel; modificrile efectuate sunt inserate pe loc n tabel;
Aplicaia3

S se foloseasc controlul Caset de Editare pentru a edita un fiier text. Rezolvare: Se creeaz o form ca n figur:
Click Event: create cursor textfile; (filename c(35), mem m) append blank replace textfile.filename with; getfile("txt") if empty(textfile.filename) return endif append memo mem from; (textfile.filename) overwrite ThisForm.Edit1.ControlSource; = "textfile.mem" ThisForm.Refresh ThisForm.Command2.Enabled; = .T.

Click Event: Release ThisForm

Click Event: copy memo textfile.mem; to (textfile.filename) Enabled: .F. - False

Cu ajutorul grid-urilor se pot crea formulare care s opereze cu informaii din mai multe tabele relatate cu relaii de tipul 1 la n, ca n exemplul:

Cu ajutorul controlului de timp se pot construi formulare ca n exemplele:

91

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

27. Constructoarele de controale i containere


Mediul VFP pune la dispoziia utilizatorului un set de constructoare pentru setarea proprietilor controalelor i containerelor. Astfel exist: Combo Box Builder (pentru liste ascunse), Command Group Builder (pentru grupuri de butoane de comand), Edit Box Builder (pentru casete de tip Edit), List Box Builder (pentru liste), Option Group Builder (pentru casete de opiune), Text Box Builder (pentru casete de tip Text), AutoFormat Builder (pentru grupuri de controale). Pentru a accesa un constructor: 1. Se plaseaz controlul pe formular din bara de instrumente Form Controls; 2. Se selecteaz controlul; se apas click dreapta; 3. Se selecteaz opiunea Builder; 4. Se aleg opiunile dorite din aplicaia expert corespunztoare controlului sau containerului selectat;
Aplicaia 1.

Formular cu 3 butoane de comand care s deschid i s parcurg tabela contacte. La apsarea unuia dintre butoane s se activeze o fereastr de mesaj cu coninutul nregistrrii curente. S se adauge apoi o caset de tip Text care s conin numele persoanei de contact selectate fr a permite modificarea. Rezolvare. Se pot urma paii: 1. Se genereaz un nou formular (Forms/New/New Form); 2. Se adaug un control Text i un container CommandGroup; 3. Se folosete aplicaia expert Text Box Builder pentru a seta proprieti pentru controlul Text1; : 4. Odat selectat tabela contacte, aceasta va fi automat inclus n mediul de lucru cu date al formularului; se poate vedea acest fapt pe calea View/Data Environment ...; de asemenea, n caseta Field name: se poate acum selecta orice cmp din tabel; se las contacte.nume; 5. Se folosete aplicaia expert Command Group Builder pentru a seta proprieti pentru containerul CommandGroup1;

92

Programarea rapid a aplicaiilor pentru baze de date relaionale

6. Se poate lansa n execuie formularul, cnd se observ c butoanele din container nu au asociate evenimente: apsarea butoanelor nu produce aciuni; 7. Se adaug evenimente: a. pentru formular: Activate Event: if not eof() thisform.commandgroup1.enabled = .T. endif b. pentru commandgroup1 doar proprietatea commandgroup1.enabled = .F. c. pentru command1, procedura Command1.Click: if recno() = 1 This.Enabled = .F. else skip -1 ThisForm.Text1.Refresh ThisForm.CommandGroup1.Command2.Enabled = .T. endif d. pentru command2, procedura Command2.Click: if recno() = reccount() This.Enabled = .F. else skip 1 ThisForm.Text1.Refresh ThisForm.CommandGroup1.Command1.Enabled = .T. endif e. pentru command3, procedura Command3.Click: mesaj = alltrim(nume) + chr(13) + alltrim(functia) +; chr(13) +alltrim(email) + chr(13) + "nr=" + alltrim(str(nr)) +; chr(13) + "poz=" + alltrim(str(poz)) MessageBox(mesaj,64) 8. Se execut formularul; acionarea butoanelor de comand produce acum evenimentele dorite.
Aplicaia 2.

Formular care s permit adugarea unei persoane de contact dup o machet predefinit. Rezolvare. Se creeaz un nou formular. Se urmeaz paii: 1. se adaug pe formular un control de list ascuns, un container de tipul butoane de opiune, 4 casete de tip text i un buton de comand; 2. se folosete aplicaia expert Combo Box Builder pentru a seta proprieti pentru Combo1; din baza de date universitati i tabela contacte se alege cmpul nume pentru a i se lega valorile cu lista ascuns; la stilul listei se alege Drop-down list;

93

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

3. se folosete aplicaia expert Option Group Builder pentru a genera containerul OptionGroup1; se introduce numrul de butoane (6) i denumirile acestora (vezi figura); se alege poziionarea vertical a butoanelor, i spaiere de 5 puncte ntre acestea; 4. se folosete aplicaia expert Text Box Builder pentru a seta proprieti pentru controalele Text2-Text4; acestea se seteaz astfel: aliniament: Text2: right; Text3: left, Text4: center; de asemenea, pentru Text4: 1. Format: Make read only; Input Mask: @; 5. se seteaz manual celelalte proprieti i evenimentele pentru controale dup cum urmeaz: 6. procedura Combo1.Click: thisform.optiongroup1.Visible = .T. thisform.text1.Visible = .T. 7. proprietatea OptionGroup1.Visible: .F. False; 8. procedura Text1.GotFocus: thisform.text2.visible = .T. 9. proprietatea Text1.MaxLength: =fsize('nume','contacte') 10. proprietatea Text1.Visible: .F. False; 11. proprietatea Text2.InteractiveChange: if "@" $ this.text thisform.text4.Visible = .T. thisform.text3.Visible = .T. v_email = substr(this.text, 1,at("@",this.text)-1) this.refresh thisform.text3.MaxLength = fsize('email','contacte'); - len(alltrim(v_email)) thisform.text3.setfocus endif if len(alltrim(this.text)) = this.maxlength - 2 MessageBox("Lungimea maxima pentru acest camp a fost atinsa."+; chr(13)+"Pentru a putea adauga noi caractere mariti dimensiunea campului in tabela") endif 12. proprietatea Text2.MaxLength: =fsize('email','contacte'); 13. proprietatea Text2.ControlSource: v_email 14. proprietatea Text2.Visible: .F. False; 15. proprietatea Text4.Visible: .F. False; 16. procedura Text3.GotFocus: thisform.command1.visible = .T. 17. procedura Text3.InteractiveChange: if len(alltrim(this.text)) = this.maxlength - 1 MessageBox("Lungimea maxima pentru acest camp a fost atinsa."+; chr(13)+"Pentru a putea adauga noi caractere mariti dimensiunea campului in tabela") endif 18. proprietatea Text3.Visible: .F. False;
94

Programarea rapid a aplicaiilor pentru baze de date relaionale

19. proprietatea Command1.Caption: Salveaza; 20. procedura Command1.Click: if (len(alltrim(thisform.text1.text))>3)and; (len(alltrim(thisform.text2.text))>0)and; (len(alltrim(thisform.text3.text))>0) select contacte append blank replace nr with institutii.nr,; nume with thisform.text1.text,; email with alltrim(thisform.text2.text)+; thisform.text4.text+alltrim(thisform.text3.text) for i = 1 to thisform.optiongroup1.buttoncount if thisform.optiongroup1.buttons[i].value = 1 replace functia with thisform.optiongroup1.buttons[i].Caption endif endfor else this.visible = .F. MessageBox("Completeaza corect formularul!") if len(alltrim(thisform.text3.text))=0 thisform.text3.visible = .F. thisform.text2.setfocus endif if (len(alltrim(thisform.text2.text))=0)or; (len(alltrim(thisform.text1.text))<4) thisform.text1.setfocus endif endif 21. Se modific formularul adugndu-se etichetele corespunztoare; 22. La execuia formularului, dac se introduc date incorecte (vezi procedura Command1.Click) atunci va apare o fereastr de mesaj i utilizatorul este ntors la completarea casetei cu date incorecte:

Aplicaia 3.

S se foloseasc containerele PageFrame i Grid pentru vizualizarea datelor din baza de date universitati. Rezolvare: se poate construi un formular dup modelul:
95

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

Grid1

Grid2

Page1

Page2

PageFrame1

Se urmeaz paii: 1. Se creeaz un nou formular (Form1); 2. Se adaug un container PageFrame (PageFrame1); 3. Se adaug un container Grid (Grid1); 4. Se adaug al doilea container Grid (Grid2); 5. Se selecteaz din fereastra de proprieti containerul Grid1 (pentru instituii); 6. Se lanseaz aplicaia expert Grid Builder pentru definirea proprietilor containerului Grid1; n tabulatorul Grid Items se selecteaz tabela institutii i din caseta Available fields se includ n caseta Selected fields cmpurile: Nume, Acronim, Adresa, Web; 7. Se selecteaz din fereastra de proprieti containerul Grid2 (pentru contacte); 8. Se lanseaz aplicaia expert Grid Builder pentru definirea proprietilor containerului Grid1; n tabulatorul Grid Items se selecteaz tabela contacte i din caseta Available fields se includ n caseta Selected fields cmpurile: Nume, Functia, Email; 9. n tabulatorul Relationship n caseta Key field in parent table: se selecteaz Institutii.nr iar n caseta Related index in child table: se selecteaz cmpul nr; 10. Se seteaz manual proprietile i evenimentele controalelor i containerelor: 10.1. 10.2. evenimentul Form1.Activate: evenimentul Page1.Click: ThisForm.Grid1.Visible = .T.; ThisForm.Grid2.Visible = .F. ThisForm.Grid1.Visible = .T. 10.3. evenimentul Page2.Click: ThisForm.Grid1.Visible = .F. ThisForm.Grid2.Visible = .T.
96

Programarea rapid a aplicaiilor pentru baze de date relaionale

10.4. 10.5. 10.6. 10.7.

proprietatea Grid1.Visible = .F. proprietatea Grid2.Visible = .F. proprietatea Grid1.ReadOnly = .T. proprietatea Grid2.ReadOnly = .T.

Aplicaia 4. Seturi de formulare

S se realizeze o aplicaie care s foloseasc dou formulare care s conin informaiile din baza de date universitati. Rezolvare. Se urmeaz paii: 1. Din Project Manager se selecteaz Forms/New.../New Form; 2. Din meniu, n categoria Form se selecteaz opiunea Create Form Set; 3. Pe aceeai cale, se adaug un nou formular: Form/Add New Form;

4. Se adaug tabelele institutii i contacte n Data Environment (View/Data Environment...); 5. Se adaug contoale i containere ca n figur:

ThisFormSet.Release ThisFormSet.Release

6. Se folosete aplicaia expert Combo Box Builder pentru a seta proprietile casetei Combo1:
97

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

7. Se execut setul de formulare.

98

Programarea rapid a aplicaiilor pentru baze de date relaionale

28. Meniuri
n VFP, folosirea meniurilor n aplicaii face ca rezultatul obinut (produsul program) s i mreasc calitatea n exploatare. Fiecare parte a unei aplicaii VFP poate avea propriul su meniu sistem sau un set de meniuri. Pentru a crea un meniu, se folosete aplicaia expert Menu Designer.

Crearea unui meniu sistem implic civa pai. n funcie de mrimea aplicaiei i complexitatea meniurilor care se intenioneaz a se folosi, acetia sunt: 1. Planificarea i construcia sistemului (decide ce meniuri ai nevoie, dac acestea vor aprea n interfa, care dintre acestea necesit submeniuri, i aa mai departe); 2. Crearea meniurilor i submeniurilor (definirea titlurilor pentru meniu, pentru elementele din meniu, utiliznd Menu Designer); 3. Asocierea de evenimente astfel nct sistemul s fac ce dorim (specificarea aciunilor pentru meniuri de efectuat; adiional, se poate include cod de iniializare i cod de curire); codul de iniializare se execut nainte ca meniul sistem s apar i se poate include cod pentru deschiderea de fiiere, declararea de variabile; codul de curire conine ceea ce se va executa dup codul de definire a meniului i poate face meniul sau elementele din meniu selectabile sau neselectabile; 4. Generarea programului pentru meniu; 5. Execuia programului pentru a testa sistemul.
Aplicaia 5.

S se creeze un meiul dup modelul:

99

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

29. Dezvoltarea de meniuri pentru aplicaii


Crearea unui meniu pentru o aplicaie este asociat de obicei cu integrarea tuturor componentelor aplicaiei ntr-un ansamblu care s permit execuia fiecrei componente. Finalitatea acestui proces reprezint sistemul de gestiune al bazei (sau bazelor) de date client. Pentru construcia meniului sistemului se poate folosi aplicaia expert Menu Builder sau se poate construi direct prin instruciuni, aa cum se va vedea n codul generat de VFP n urma generrii unui meniu.
Aplicaia 1.

S se construiasc un meniu cu opiuni de comand pentru aciunile: deschidere baza de date Universitati, afiare ferestre de Browse pentru tabelele Institutii i Contacte i o opiune Help About. Rezolvare. Se urmeaz paii: 1. Se creeaz un director pentru stocarea fiierelor aplicaiei; 2. Se creeaz un nou proiect (New/Project/New file); fie acesta proj1.pjx; 3. n fereastra de comenzi se testeaz funcia GetDir(), Sys(5) i Sys(2003): GETDIR(,default for the application) respectiv Sys(5) i Sys(2003); 4. n Project Manager la categoria Code se alege Programs i aici New...; 5. n fereastra pe care sistemul VFP o deschide se va crea un nou program care va gestiona proiectul; fie acesta Program1; 6. Se introduc urmtoarele comenzi: cale_veche = sys(5)+sys(2003) messagebox("cale veche: "+cale_veche) cale = GETDIR("","default for the application") if like(cale,"")=.F. set default to &cale messagebox("noua cale: "+cale) endif * comenzi pentru executia aplicatiei * ... * sfarsit aplicatie 7. Se salveaz fiierul; ne asigurm c acesta a fost salvat n directorul proiectului proj1.pjx; 8. n Project Manager se selecteaz programul program1 i apoi din meniul VFP la Project se verific c programul program1 are opiunea Set Main selectat ( contrar se selecteaz; se execut i testeaz Manager/Code/Programs/Program1/Run); 9. Se creeaz un nou meniu sistem (Project Manager/Other/Menus/New.../Menu) cu ajutorul aplicaiei expert Menu Designer; acesta se poate realiza dup structura:
100

Set Main); n caz (Project

programul

Programarea rapid a aplicaiilor pentru baze de date relaionale

\<File (Submenu) \<Open... (Procedure) \<Quit (Procedure) \<Browse (Command) Browse \<Help (Submenu) \<About... (Procedure) 10. Cu Menu Designer menu1.mnx deschis se selecteaz din meniul VFP Menu/Generate... pentru a genera codul programului de meniu; acesta conine definiiile pentru comenzi (BAR) i submeniuri (PAD/POPUP); dintre fiierele generate de VFP sunt eseniale pentru sistem: menu1.MNX (care este o tabel cu informaii despre structura i coninutul meniului), menu1.MNT (un fiier memo) i menu1.mpr (care conine comenzile generate de aplicaia expert pentru crearea meniului); n acest din urm fiier se pot vedea comenzile generate (se poate deschide cu Notepad); de menionat c sistemul nu permite modificarea direct a acestui fiier, el fiind actualizat la execuie n conformitate cu definiiile din fiierul MNX; 11. n orice moment al construciei sale, se poate vedea configuraia meniului (Menu Designer menu1.mnx/Preview); 12. Execuia meniului (Project Manager/Other/Menus/Menu1/Run) este sortit eecului; sistemul lanseaz meniul n execuie ns nu este pregtit pentru gestiunea acestuia; 13. Se aplic urmtoarele modificri meniului (din Menu Designer menu1): a. Se editeaz coninutul procedurii pentru Help/About: MessageBox("First menu VFP"); b. Se editeaz coninutul procedurii pentru File/Quit: MessageBox("Now exit the application") set default to cale_veche+"\" MessageBox("restaurare cale: "+sys(5)+sys(2003)) Cancel c. Din meniul VFP se selecteaz View/General Options... i apoi din containerul de butoane de opiune Location se selecteaz opiunea Append; d. Se salveaz meniul (File/Save) i se genereaz noul cod (Menu/Generate...); 14. Se aplic urmtoarele modificri programului program1: * comenzi pentru executia aplicatiei do menu1.mpr read events * sfarsit aplicatie 15. Tentativa de a executa meniul este n continuare sortit eecului; se poate ns acum executa program1 (Project Manager/Code/Programs/Program1/Run); 16. Programul produce afiarea casetelor de mesaj dorite (Help/About... i File/Quit); observaie: meniul aplicaiei se adaug meniului sistemului VFP i la ieire rmne activat
101

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

devenind parte integrant a mediului VFP i dup terminarea aplicaiei (comanda Cancel); pentru a ajusta aceast situaie trebuie scrise comenzile corespunztoare n procedura pentru comanda File/Quit; un alt inconvenient este starea activ a comenzii (opiunii) Browse chiar dac nu a fost selectat nici o tabel (File/Open...); 17. Se modific meniul pentru a asocia nume PAD-urilor (Menu Designer menu1); se ine seama de faptul c numele implicite ale meniurilor VFP sunt n forma: (Edit: nume PAD: _MSM_EDIT) i nu se denumesc la fel! 18. Astfel, se pot denumi pe calea: a. \<File (Submenu) Options/Pad Name: File1; b. \<Browse (Command) Options/Pad Name: Browse1; c. \<Help (Submenu) Options/Pad Name: Help1; 19. Se pot asocia (ns numere) i pentru BAR-uri (BAR #); a. b. c. \<Open... (Procedure) Options/Bar #: 101; \<Quit (Procedure) Options/Bar #: 102; \<About... (Procedure) Options/Bar #: 103;

20. Se genereaz codul (Menu/Generate...); 21. Se vizualizeaz codul generat pentru a ne asigura de modificri; 22. Pentru dezactivarea lui Browse din meniu n program1: do menu1.mpr Set Skip of Pad Browse1 of _MSYSMENU .T. read events 23. Se execut programul program1; 24. Pentru revenirea la meniul normal este acum necesar rencrcarea aplicaiei MVFP; 25. Pentru ca aplicaia s restaureze mediul VFP implicit se va modifica sfritul procedurii corespunztoare comenzii File/Quit astfel: messagebox("restaurare cale: "+sys(5)+sys(2003)) SET SYSMENU TO DEFAULT cancel 26. Se poate genera acum aplicaia executabil pe calea Project Manager proj1/Code/Programs/program1/Build...; 27. Se testeaz aplicaia (din Windows Explorer); se completeaz acum cu procedurile lips; 28. La nceputul programului program1 se va aduga o variabil tabela_use:
tabela_use = "" cale_veche = sys(5)+sys(2003)

29. Se ncarc din nou menu1 n Menu Designer; se completeaz procedura pentru File/Open...: tabela_use1 = GetFile('DBF', 'Browse a Table:', 'Browse', 0, 'Browse') if like(tabela_use, tabela_use1) Return && do nothing
102

Programarea rapid a aplicaiilor pentru baze de date relaionale

endif if like(tabela_use1, "") Return && do nothing endif if Used(tabela_use1) use && inchide tabela precedenta i=1 On Error i = 0 USE &tabela_use1 in 0 again shared On Error if (i = 0) use &tabela_use && redeschide tabela precedenta MessageBox("Table opened in exclusive mode by another program") Return else tabela_use = tabela_use1 Set Skip of Pad Browse1 of _MSYSMENU .F. return endif endif use && inchide tabela precedenta i=1 On Error i = 0 USE &tabela_use1 On Error if (i = 0) use &tabela_use && redeschide tabela precedenta MessageBox("Table opened in exclusive mode by another program") Return else tabela_use = tabela_use1 Set Skip of Pad Browse1 of _MSYSMENU .F. endif 30. Se poate aduga un BAR Close (File/Close) a crui procedur s dezactiveze pe Browse: use tabela_use = "" Set Skip of Pad Browse1 of _MSYSMENU .T. 31. Se lanseaz n execuie i se testeaz aplicaia program1; se genereaz executabilul; 32. Se pot elibera din memorie inclusiv elementele sistem, ca n exemplul: RELEASE PAD _MEDIT OF _MSYSMENU
Aplicaia 2.

Un meniu creat fr constructorul de meniuri. Soluie. Se creeaz un nou program (File/New/Program/New file); se salveaz cu numele Definpad.prg. filen = Locfile("definpad", "prg,app,exe", "Locate definpad.prg") set default to substr(filen,1,RAT("DEFINPAD.",filen)-1) Clear
103

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

Set Talk Off Set Sysmenu Save Set Sysmenu To Public Markpad Markpad = .T. Define Pad Syspad Of _Msysmenu Prompt '\<System' Color Scheme 3 ; Key Alt+S, '' Define Pad Editpad Of _Msysmenu Prompt '\<Edit' Color Scheme 3 ; Key Alt+E, '' Define Pad Recordpad Of _Msysmenu Prompt '\<Record' Color Scheme 3 Key Alt+R, '' Define Pad Windowpad Of _Msysmenu Prompt '\<Window' Color Scheme 3 ; Key Alt+W, '' Define Pad Reportpad Of _Msysmenu Prompt 'Re\<Ports' Color Scheme 3 ; Key Alt+P, '' Define Pad Exitpad Of _Msysmenu Prompt 'E\<Xit' Color Scheme 3 ; Key Alt+X, '' On Selection Menu _Msysmenu ; Do Choice In Definpad With Pad( ), Menu( ) Procedure Choice Parameter Mpad, Mmenu Wait Window 'You Chose ' + Mpad + ; ' From Menu ' + Mmenu Nowait Set Mark Of Pad (Mpad) Of _Msysmenu To ; ! Mrkpad('_Msysmenu', Mpad) Markpad = ! Markpad If Mpad = 'EXITPAD' Set Sysmenu To Default Endif
Aplicaia 3.

Un meniu creat fr constructorul de meniuri. Soluie. Se creeaz un nou program (File/New/Program/New file); se salveaz cu numele Definbar.prg. filen = Locfile("definbar", "prg,app,exe", "Locate definbar.prg") set default to substr(filen,1,RAT("DEFINBAR.",filen)-1) CLEAR SET SYSMENU SAVE SET SYSMENU TO DEFINE PAD convpad OF _MSYSMENU PROMPT '\<Conversions' COLOR SCHEME 3 ; KEY ALT+C, '' DEFINE PAD cardpad OF _MSYSMENU PROMPT 'Card \<Info' COLOR SCHEME 3 ; KEY ALT+I, '' ON PAD convpad OF _MSYSMENU ACTIVATE POPUP conversion ON PAD cardpad OF _MSYSMENU ACTIVATE POPUP cardinfo DEFINE POPUP conversion MARGIN RELATIVE COLOR SCHEME 4 DEFINE BAR 1 OF conversion PROMPT 'Ar\<ea' KEY CTRL+E, '^E' DEFINE BAR 2 OF conversion PROMPT '\<Length' ; KEY CTRL+L, '^L' DEFINE BAR 3 OF conversion PROMPT 'Ma\<ss' ; KEY CTRL+S, '^S'
104

Programarea rapid a aplicaiilor pentru baze de date relaionale

DEFINE BAR 4 OF conversion PROMPT 'Spee\<d' ; KEY CTRL+D, '^D' DEFINE BAR 5 OF conversion PROMPT '\<Temperature' ; KEY CTRL+T, '^T' DEFINE BAR 6 OF conversion PROMPT 'T\<ime' ; KEY CTRL+I, '^I' DEFINE BAR 7 OF conversion PROMPT 'Volu\<me' ; KEY CTRL+M, '^M' ON SELECTION POPUP conversion; DO choice IN definbar WITH PROMPT( ), POPUP( ) DEFINE POPUP cardinfo MARGIN RELATIVE COLOR SCHEME 4 DEFINE BAR 1 OF cardinfo PROMPT '\<View Charges' ; KEY ALT+V, '' DEFINE BAR 2 OF cardinfo PROMPT 'View \<Payments' ; KEY ALT+P, '' DEFINE BAR 3 OF cardinfo PROMPT 'Vie\<w Users' KEY ALT+W, '' DEFINE BAR 4 OF cardinfo PROMPT '\-' DEFINE BAR 5 OF cardinfo PROMPT '\<Charges ' DEFINE BAR 6 OF cardinfo PROMPT '\-' DEFINE BAR 7 OF cardinfo PROMPT 'E\<xit ' ON SELECTION POPUP cardinfo; DO choice IN definbar WITH PROMPT( ), POPUP( ) PROCEDURE choice PARAMETERS mprompt, mpopup WAIT WINDOW 'You chose ' + mprompt + ; ' from popup ' + mpopup NOWAIT IF mprompt = 'Exit' SET SYSMENU TO DEFAULT ENDIF
Aplicaia 4.

Un meniu creat fr constructorul de meniuri. Soluie. Se creeaz un nou program (File/New/Program/New file); se salveaz cu numele Definmenu.prg. filen = Locfile("definmenu", "prg,app,exe", "Locate definmenu.prg") set default to substr(filen,1,RAT("DEFINMENU.",filen)-1) CLEAR SET SYSMENU SAVE SET SYSMENU TO ON KEY LABEL ESC KEYBOARD CHR(13) DEFINE MENU example BAR AT LINE 1 DEFINE PAD convpad OF example PROMPT '\<Conversions' COLOR SCHEME 3 ; KEY ALT+C, '' DEFINE PAD cardpad OF example PROMPT 'Card \<Info' COLOR SCHEME 3 ; KEY ALT+I, '' ON PAD convpad OF example ACTIVATE POPUP conversion ON PAD cardpad OF example ACTIVATE POPUP cardinfo DEFINE POPUP conversion MARGIN RELATIVE COLOR SCHEME 4 DEFINE BAR 1 OF conversion PROMPT 'Ar\<ea' ;
105

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

KEY CTRL+E, '^E' DEFINE BAR 2 OF conversion PROMPT '\<Length' ; KEY CTRL+L, '^L' DEFINE BAR 3 OF conversion PROMPT 'Ma\<ss' ; KEY CTRL+S, '^S' DEFINE BAR 4 OF conversion PROMPT 'Spee\<d' ; KEY CTRL+D, '^D' DEFINE BAR 5 OF conversion PROMPT '\<Temperature' ; KEY CTRL+T, '^T' DEFINE BAR 6 OF conversion PROMPT 'T\<ime' ; KEY CTRL+I, '^I' DEFINE BAR 7 OF conversion PROMPT 'Volu\<me' ; KEY CTRL+M, '^M' ON SELECTION POPUP conversion DO choice IN defimenu WITH PROMPT( ), POPUP( ) DEFINE POPUP cardinfo MARGIN RELATIVE COLOR SCHEME 4 DEFINE BAR 1 OF cardinfo PROMPT '\<View Charges' ; KEY ALT+V, '' DEFINE BAR 2 OF cardinfo PROMPT 'View \<Payments' ; KEY ALT+P, '' DEFINE BAR 3 OF cardinfo PROMPT 'Vie\<w Users' ; KEY ALT+W, '' DEFINE BAR 4 OF cardinfo PROMPT '\-' DEFINE BAR 5 OF cardinfo PROMPT '\<Charges ' ON SELECTION POPUP cardinfo; DO choice IN defimenu WITH PROMPT( ), POPUP( ) ACTIVATE MENU example DEACTIVATE MENU example RELEASE MENU example EXTENDED SET SYSMENU TO DEFAULT ON KEY LABEL ESC PROCEDURE choice PARAMETERS mprompt, mpopup WAIT WINDOW 'You chose ' + mprompt + ; ' from popup ' + mpopup NOWAIT
Aplicaia 5.

Un meniu creat fr constructorul de meniuri cu submeniuri. Soluie. Se creeaz un nou program (File/New/Program/New file). Se salveaz i se execut. DEFINE WINDOW wOrder FROM 10,0 TO 13,39 DEFINE MENU mnuDinner DEFINE PAD padOne OF mnuDinner PROMPT '\<Main Course' KEY ALT+M, '' DEFINE PAD padTwo OF mnuDinner PROMPT '\<Dessert' KEY ALT+D, '' ON PAD padOne OF mnuDinner ACTIVATE POPUP popMainCourse ON PAD padTwo OF mnuDinner ACTIVATE POPUP dessert DEFINE POPUP popMainCourse MARGIN MESSAGE ; 'We have burgers and pizza today' DEFINE BAR 1 OF popMainCourse PROMPT '\<Hamburgers' DEFINE BAR 2 OF popMainCourse PROMPT '\<Pizza' ON BAR 1 OF popMainCourse ACTIVATE POPUP burger ON BAR 2 OF popMainCourse ACTIVATE POPUP pizza
106

Programarea rapid a aplicaiilor pentru baze de date relaionale

DEFINE POPUP burger MARGIN MESSAGE ; 'What would you like on your burger?' DEFINE BAR 1 OF burger PROMPT '\<Ketchup' DEFINE BAR 2 OF burger PROMPT '\<Mustard' DEFINE BAR 3 OF burger PROMPT '\<Onions' DEFINE BAR 4 OF burger PROMPT '\<Pickles' DEFINE POPUP pizza MARGIN MESSAGE 'Here are the available toppings' DEFINE BAR 1 OF pizza PROMPT '\<Anchovies' DEFINE BAR 2 OF pizza PROMPT '\<Green Peppers' DEFINE BAR 3 OF pizza PROMPT '\<Olives' DEFINE BAR 4 OF pizza PROMPT '\<Pepperoni' ON BAR 3 OF pizza ACTIVATE POPUP olives DEFINE POPUP olives MARGIN DEFINE BAR 1 OF olives PROMPT '\<Black' MESSAGE 'Black olives?' DEFINE BAR 2 OF olives PROMPT '\<Green' MESSAGE 'Green olives?' DEFINE POPUP dessert MARGIN MESSAGE 'Our dessert offerings' DEFINE BAR 1 OF dessert PROMPT '\<Brownies' DEFINE BAR 2 OF dessert PROMPT '\<Cookies' DEFINE BAR 3 OF dessert PROMPT '\<Ice Cream' DEFINE BAR 4 OF dessert PROMPT '\<Pie' ON BAR 4 OF dessert ACTIVATE POPUP pie DEFINE POPUP pie MARGIN MESSAGE 'What kind of pie?' DEFINE BAR 1 OF pie PROMPT '\<Blueberry' DEFINE BAR 2 OF pie PROMPT '\<Cherry' DEFINE BAR 3 OF pie PROMPT '\<Peach' DEFINE BAR 4 OF pie PROMPT '\<Rhubarb' ON SELECTION POPUP ALL DO yourchoice ACTIVATE MENU mnuDinner PROCEDURE yourchoice ACTIVATE WINDOW wOrder CLEAR DO CASE CASE POPUP( ) = 'BURGER' @ 0,0 SAY 'A ' + POPUP( ) + ' order:' @ 1,0 SAY 'You ordered a burger with ' + LOWER(PROMPT( )) CASE POPUP( ) = 'PIZZA' @ 0,0 SAY 'A ' + POPUP( ) + ' order:' @ 1,0 SAY 'You ordered a pizza with ' + LOWER(PROMPT( )) CASE POPUP( ) = 'OLIVES' @ 0,0 SAY 'A ' + POPUP( ) + ' order:' @ 1,0 SAY 'You ordered a pizza with ' ; + LOWER(PROMPT( )) + ' olives' CASE POPUP( ) = 'DESSERT' @ 0,0 SAY 'A ' + POPUP( ) + ' order:' @ 1,0 SAY 'You ordered ' + LOWER(PROMPT( )) + ' for dessert' CASE POPUP( ) = 'PIE' @ 0,0 SAY 'A ' + POPUP( ) + ' order:' @ 1,0 SAY 'You ordered ' + LOWER(PROMPT( )) + ' pie' ENDCASE WAIT WINDOW DEACTIVATE WINDOW wOrder RETURN
107

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

Aplicaia 6.

Un meniu creat fr constructorul de meniuri. Soluie. Se creeaz un nou program (File/New/Program/New file); se salveaz cu numele Definpop.prg. filen = Locfile("definpop", "prg,app,exe", "Locate definpop.prg") set default to substr(filen,1,RAT("DEFINPOP.",filen)-1) CLEAR SET SYSMENU SAVE SET SYSMENU TO DEFINE PAD convpad OF _MSYSMENU PROMPT '\<Conversions' COLOR SCHEME 3 ; KEY ALT+C, '' DEFINE PAD cardpad OF _MSYSMENU PROMPT 'Card \<Info' COLOR SCHEME 3 ; KEY ALT+I, '' ON PAD convpad OF _MSYSMENU ACTIVATE POPUP conversion ON PAD cardpad OF _MSYSMENU ACTIVATE POPUP cardinfo DEFINE POPUP conversion MARGIN RELATIVE COLOR SCHEME 4 DEFINE BAR 1 OF conversion PROMPT 'Ar\<ea' KEY CTRL+E, '^E' DEFINE BAR 2 OF conversion PROMPT '\<Length' ; KEY CTRL+L, '^L' DEFINE BAR 3 OF conversion PROMPT 'Ma\<ss' ; KEY CTRL+S, '^S' DEFINE BAR 4 OF conversion PROMPT 'Spee\<d' ; KEY CTRL+D, '^D' DEFINE BAR 5 OF conversion PROMPT '\<Temperature' ; KEY CTRL+T, '^T' DEFINE BAR 6 OF conversion PROMPT 'T\<ime' ; KEY CTRL+I, '^I' DEFINE BAR 7 OF conversion PROMPT 'Volu\<me' ; KEY CTRL+M, '^M' ON SELECTION POPUP conversion; DO choice IN definpop WITH PROMPT( ), POPUP( ) DEFINE POPUP cardinfo MARGIN RELATIVE COLOR SCHEME 4 DEFINE BAR 1 OF cardinfo PROMPT '\<View Charges' ; KEY ALT+V, '' DEFINE BAR 2 OF cardinfo PROMPT 'View \<Payments' ; KEY ALT+P, '' DEFINE BAR 3 OF cardinfo PROMPT 'Vie\<w Users' ; KEY ALT+W, '' DEFINE BAR 4 OF cardinfo PROMPT '\-' DEFINE BAR 5 OF cardinfo PROMPT '\<Charges ' DEFINE BAR 6 OF cardinfo PROMPT '\-' DEFINE BAR 7 OF cardinfo PROMPT 'E\<xit ' ON SELECTION POPUP cardinfo; DO choice IN definpop WITH PROMPT( ), POPUP( ) PROCEDURE choice PARAMETERS mprompt, mpopup WAIT WINDOW 'You chose ' + mprompt + ' from popup ' + mpopup NOWAIT IF mprompt = 'Exit' SET SYSMENU TO DEFAULT ENDIF
108

Programarea rapid a aplicaiilor pentru baze de date relaionale

Generarea meniurilor cu Quick Menu

Sistemul VFP pune la dispoziia utilizatorului posibilitatea de a genera meniuri care s includ opiunile de baz din mediul VFP. Este avantajos s se foloseasc aceast facilitate pentru a putea beneficia de resursele sistemului Windows (de exemplu de Clipboard prin intermediul meniului Edit). Pentru a folosi aceast resurs se poate merge pe calea: 1. Se creeaz un nou meniu n cadrul proiectului proj1.pjx; fie acesta menu2.mnx (vezi Aplicaia 1); se salveaz cu numele menu2.mnx; 2. Cu aplicaia expert Menu Designer Menu1 activ se selecteaz Quick Menu din Menu; 3. Sistemul VFP va genera un meniu n forma:

4. Se poate acum personaliza acest meniu prin adugarea de opiuni i asocierea de evenimente; de exemplu se poate aduga la acest meniu opiunea Browse i modifica opiunile File i Help i asocia la acestea evenimente la fel ca n Aplicaia 1 cnd meniul va arta n forma:

5. Se genereaz meniul (din meniul VFP Menu/Generate...); 6. Se modific programul Program1 din proiectul proj1 pentru a ncrca acum meniul menu2.mpr: tabela_use = "" cale_veche = sys(5)+sys(2003) messagebox("cale veche: "+cale_veche) cale = GETDIR("","default for the application") if like(cale,"")=.F. set default to &cale messagebox("noua cale: "+cale)
109

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

endif * comenzi pentru executia aplicatiei do menu2.mpr Set Skip of Pad Browse1 of _MSYSMENU .T. read events * sfarsit aplicatie 7. Se execut programul program1 (Project Manager proj1/Code/Programs/Program1/ Run); se genereaz executabilul (Project Manager proj1/Code/Programs/Program1/ Build...);
Execuia meniurilor din formulare

Odat create meniurile i generat codul surs al programului de meniu se poate folosi acesta pentru a executa meniul din formulare. Urmtoarea aplicaie folosete codul programelor menu1.mpr, Definpad.prg, Definbar.prg, Definmenu.prg, program2.prg (Aplicaia 5), Definpop.prg i menu2.mpr. Se urmeaz paii: 1. Se deschide proiectul proj1.pjx (Aplicaia 1); 2. Se creeaz un nou formular (Project Manager proj1/Documents/Forms/New.../New Form); se salveaz cu numele form1.scx; se adaug un container cu 8 butoane de comand ca n figura:

3. Se asociaz evenimente: a. Command1.Click: Do menu1.mpr Set Skip of Pad Browse1 of _MSYSMENU .T. read events b. Command2.Click: Do Definepad.prg c. Command3.Click: Do Definebar.prg d. Command4.Click: Do Definemenu.prg e. Command5.Click: Do program2.prg
110

Programarea rapid a aplicaiilor pentru baze de date relaionale

f. Command6.Click: Do Definepop.prg g. Command7.Click: Do menu2.mpr Do menu2.mpr Set Skip of Pad Browse1 of _MSYSMENU .T. read events h. Command8.Click: SET SYSMENU TO DEFAULT ThisForm.Release Cancel 4. Se modific programul program1: tabela_use = "" public cale_veche cale_veche = sys(5)+sys(2003) ... * comenzi pentru executia aplicatiei Do Form form1.scx Read events set default to cale_veche+"\" messagebox("restaurare cale: "+sys(5)+sys(2003)) * sfarsit aplicatie 5. Se modific procedurile Menu1/Quit i Menu2/Quit i se regenereaz codul meniurilor:
Messagebox("Now exit the application") SET SYSMENU TO DEFAULT Return to Master

6. Se execut formularul; se genereaz i testeaz executabilul.


Generarea de meniuri contextuale

Un meniu contextual se activeaz atunci cnd se execut click dreapta pe un control sau pe un obiect i reprezint o modalitate rapid de a afia toate funciile aplicabile acelui obiect. Un meniu contextual se realizeaz pe calea Project Manager/Other/Menus/New... Urmtorul exemplu implementeaz un meniu contextual pentru operaii de editare. Poate fi preluat direct pe calea MSDN98\98VSa\1033\Samples\Solution\Vfp98\Solution cnd se copiaz fiierele Edtshort.mnx i Edtshort.MNT dup care se adaug la proiect (Project Manager proj1/Other/Menus/Add.../Edtshort.mnx). Message: "Removes the selection and places it onto the Clipboard"; Key Label: CTRL+X; Key Text: Ctrl+X "Copies the selection onto the Clipboard"; CTRL+C; Ctrl+C "Pastes the contents of the Clipboard"; CTRL+V; Ctrl+V "Removes the selection and does not place it onto the Clipboard"
111

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

IF TYPE("m.oRef") = "O" m.cFont = GetFont() IF EMPTY(m.cFont) RETURN ENDIF m.commaLoc = AT(",",m.cFont) m.comma2Loc = AT(",",m.cFont,2) oRef.FontName = SUBSTR(m.cFont,1,m.commaLoc-1) oRef.FontSize = VAL(SUBSTR(m.cFont,m.commaLoc+1,m.comma2Loc-m.commaLoc)) oRef.FontBold = ATC("B",SUBSTR(m.cFont,m.comma2Loc))#0 oRef.FontItalic = ATC("I",SUBSTR(m.cFont,m.comma2Loc))#0 ENDIF 7. Se genereaz codul meniului; 8. Se modific formularul i se adaug evenimentul: do Edtshort.mpr read events 9. Se genereaz codul executabil i se testeaz aplicaia proj1.
Generarea automat a aplicaiei cu aplicaia expert Application Wizard

Se poate genera automat proiectul unei aplicaii pe calea File/New/Project/Wizard. Urmtorul exemplu genereaz automat proiectul pentru baza de date Universitati. Se urmeaz paii: 1. Se creeaz un nou director; 2. Se copiaz fiierele din directorul proiectului Universitati mai puin Universitati.PJT i Universitati.pjx; 3. Se lanseaz n execuie aplicaia expert Application Wizard; 4. Se definesc atributele proiectului:

112

Programarea rapid a aplicaiilor pentru baze de date relaionale

5. Sistemul VFP va genera un proiect GENERIC ca n figurile anterioare; n continuare cu ajutorul aplicaiei expert Application Builder se pot defini elementele constitutive ale proiectului:

EXE

Noul proiect generat include acum formularele i rapoartele create; se genereaz executabilul i se testeaz aplicaia.
113

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

30. Baze de date externe i aplicaii client server


Aproape toate SGBD-urile care se execut sub sisteme de operare cu nucleu (kernel) client-server (Windows 3.11 NT, 9.x, NT 4.x, XP; Novell Netware 3.x, 4.x, 5.x, Linux, Unix, OS/2, BSD) au prevzute protocoale de comunicare pentru baze de date situate la distan (pe staii sau pe servere). Exist o mare diversitate de sisteme de operare att pentru staii (clieni) ct i pentru servere. Din acest motiv, comunicarea se realizeaz prin intermediul unui protocol, care reprezint de fapt implementarea unor convenii n ceea ce privete comunicarea de date sub form de librrii i pachete de programe.
Staie (Client) SGBD Client LAN WAN LAN Server SGBD Server

Protocoalele de transfer de date (i driverele aferente) ale staiei i serverului sunt furnizate de ctre sistemul de operare, aa cum se poate observa n figurile de mai jos. Acestea se configureaz urmnd prescripiile din documentaia sistemului de operare i ale distribuitorului de internet (pentru WAN).

Win 9.x

Free BSD bash-2.05a$ ifconfig de0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet 193.226.7.140 netmask 0xffffff80 broadcast 193.226.7.255 inet6 fe80::200:c0ff:fe91:ebf5%de0 prefixlen 64 scopeid 0x1 ether 00:00:c0:91:eb:f5 media: Ethernet autoselect (10baseT/UTP) status: active lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2 inet 127.0.0.1 netmask 0xff000000 ppp0: flags=8010<POINTOPOINT,MULTICAST> mtu 1500 sl0: flags=c010<POINTOPOINT,LINK2,MULTICAST> mtu 552 faith0: flags=8002<BROADCAST,MULTICAST> mtu 1500 Cazul cel mai complex este atunci cnd sistemele de operare sunt diferite i SGBDurile trebuiesc configurate pentru comunicare att pe server ct i pe staie.
114

Programarea rapid a aplicaiilor pentru baze de date relaionale

31. Configurarea unui client VFP/Win9.x pe un server MyQSL/FreeBSD


Staie (Client) MVFP Client MySQL client ODBC MySQL server Server MySQL Server

Pentru a ncepe configurarea unui sistem de exploatare a bazelor de date la distan trebuie s ne asigurm c dispunem de toate driverele necesare. n cazul n care am ales s instalm un Server MySQL va trebui s aducem componentele necesare i s le instalm att pe server ct i pe staii. Se parcurg urmtorii pai: 1. Se alege pachetul de drivere i programe corespunztoare sistemului de operare (www.mysql.com/downloads): Win 9.x client Free BSD server

2. Se aduc i se instaleaz acestea; MySQL server va descrca i instala i alte pachete adiionale pentru limbajul perl : post-patch: ${PERL} -pi -e \ "s@^(my $$Libs.*)-lpthread -ldl\";\$$@\1 ${PTHREAD_LIBS}\";@; \ s@^(CFLAGS_GLOB.*)@\1 ${CFLAGS} ${PTHREAD_CFLAGS}@" \ ${WRKSRC}/configure.pl 3. Dac dorim s asigurm o interfa grafic SGBD-ului de pe server, se poate instala acum phpMyAdmin (http://www.phpwizard.net/projects/phpMyAdmin/) care este un sistem care administreaz MySQL prin protocolul http. Acesta ofer interfaa grafic pentru: a. crearea i tergerea bazelor de date; b. crearea, copierea, tergerea i modificarea tabelelor; c. tergerea, editarea i adugarea de cmpuri; d. executarea oricrei secvene n limbajul SQL i chiar a interogrilor nlnuite; e. manipularea cheilor n cmpuri; f. ncrcarea fiierelor text n tabele; g. crearea i citirea de tabele; h. exportul datelor; i. administrarea multipl de servere pe o singur baz de date.
115

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

4. Cu ajutorul lui phpmyadmin se pot crea acum utilizatori care s acceseze bazele de date MySQL din interfaa phpMyAdmin:

5. Interogarea SQL este n forma urmtoare: CREATE TABLE `lejpt` (`nr` TINYINT NOT NULL, `nume` TINYINT(30) NOT NULL, `tip` TINYINT(15) NOT NULL, `functia` TINYINT(20) NOT NULL, `domeniu` TINYINT(20) NOT NULL); 6. Se poate modifica acum structura tabelei. De exemplu se corecteaz cmpurile nume, tip, functia, domeniu din tinyint n char i tipul indexului pentru cmpurile de tip caracter:
[ Browse ] [ Select ] [ Insert ] [ Empty ] [ Drop ] Field Type Attributes Null Default Extra
c d e f g
c d e f g c d e f g c d e f g

Action Change Drop Primary Index Unique Fulltext Change Drop Primary Index Unique Fulltext Change Drop Primary Index Unique Fulltext Change Drop Primary Index Unique Fulltext Change Drop Primary Index Unique Fulltext

nr nume tip functia

tinyint(4) tinyint(30) tinyint(15) tinyint(20)

No 0 No 0 No 0 No 0 No 0 Or
Drop

c d e f g

domeniu tinyint(20) With selected:


Change

116

Programarea rapid a aplicaiilor pentru baze de date relaionale

7. Se poate face o copie a structurii ntr-un nou tabel; fie acesta ljs; comanda SQL generat de phpMyadmin este: CREATE TABLE `referenti`.`ljs` (`nr` tinyint(4) NOT NULL default '0',`nume` char(30) NOT NULL default '0',`tip` char(15) NOT NULL default '0',`functia` char(20) NOT NULL default '0',`domeniu` char(20) NOT NULL default '0',PRIMARY KEY (`nr`),KEY `nume` (`nume`),KEY `tip` (`tip`),KEY `functia` (`functia`),KEY `domeniu` (`domeniu`)) TYPE=MyISAM; 8. Acum baza de date referenti conine cele dou tabele, lejpt i ljs; 9. Se poate defini cmpul nr ca cmp autoincrement: ALTER TABLE `referenti`.`lejpt` CHANGE `nr` `nr` TINYINT(4) DEFAULT '0' NOT NULL AUTO_INCREMENT 10. Se pot completa tabelele cu nregistrri pe calea:

11. Odat definit funcia autoincrement, nu mai este necesar completarea valorii pentru nr:

12. Comanda SQL este n forma: INSERT INTO `lejpt` (`nr`, `nume`, `tip`, `functia`, `domeniu`) VALUES ('', 'Valentin MILITARU', 'referent', 'prof. dr.', 'fizica'); 13. Corectarea unei valori introduse greit se face cu comanda: UPDATE `lejpt` SET `domeniu` = 'physics' WHERE `nr` = '3' LIMIT 1; 14. Rezultatul completrii cu date poate arta n felul urmtor:

15. Se pot acum copia valorile din tabelul lejpt n tabelul ljs: INSERT INTO `referenti`.`ljs` SELECT * FROM `referenti`.`lejpt`
117

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

16. Dac a fost creat un tabel care ulterior nu mai este de dorit a se pstra n baza de date se aplic comanda drop asupra acestuia; 17. Dup ce s-au copiat valorile din tabelul lejpt n tabelul ljs se pot modifica dup dorin (nti browse i apoi edit):

Instalarea i administrarea MySQL pe client

Se poate alege a se instala MyODBC-3.51.01 care dup instalare se va regsi n Control Panel/ODBC Data Sources (32bit); se va selecta i se va configura pentru conectarea implicit pe serverul de date.

Pentru a permite accesul la citire n bazele de date de pe server, cu ajutorul lui phpMyAdmin se creeaz 3 utilizatori dup modelul:

Se testeaz accesul pentru utilizatorul nou creat:

Tentativa de modificare a coninutului tabelelor este soldat eecului:

DELETE FROM `ljs` WHERE `nr` = '1' LIMIT 1 Access denied for user: 'read@localhost' to database 'referenti' Se poate configura acum accesul de la distan n baza de date, astfel nct n urmtoarea etap se configureaz MySQL pe client dup modelul:

118

Programarea rapid a aplicaiilor pentru baze de date relaionale

Se poate acum accesa baza de date i din VFP. Se ncarc Project Manager, se deschide o baz de date sau se creeaz una nou, se selecteaz Connections, apoi New... i se urmeaz schema de mai jos:

read

postuniv

referenti

Se salveaz conexiunea n baza de date (connect1) i se creeaz 2 vederi la distan (Remote Views/New) din baza de date referenti:

Se poate crea o vedere care s conin informaiile din tabelul ljs i o vedere care s conin informaiile din tabelul lejpt. Se vor include toate cmpurile din cele dou tabele i se vor salva acestea n baza de date:
119

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

Se pot executa vederile pe calea Remote Views/View3(4)/Browse. De asemenea, se pot realiza interogri, rapoarte i formulare, acestea fiind tratate n continuare ca elemente aparintoare bazei de date locale.
120

Programarea rapid a aplicaiilor pentru baze de date relaionale

Se pot da i comenzi n fereastra de comenzi sau crea programe care s foloseasc aceste informaii:

select view3 list nume for "ref" $ tip close all data use view3 index on nume tag nume use view4 index on nume tag nume list

SELECT VIEW4.Nume; FROM DATA1!VIEW4 VIEW4; INNER JOIN DATA1!VIEW3 VIEW3 ON VIEW4.NUME = VIEW3.NUME; ORDER BY VIEW4.Nume to screen Se poate acum crea un executabil care s acceseze datele din conexiunea la distan. Se urmeaz paii: 1. Se creeaz un program principal pentru aplicaie (Project Manager proj1/Code/Programs/New...); fie acesta program1.prg; 2. Se introduc n acesta comenzile:
set default to GETDIR("","default for the application") do form form1.scx

3. Se

seteaz

ca

program

principal

al

proiectului:

Project

Manager

proj1/Code/Programs/program1/Project/ Set Main; 4. Se creeaz formularul form1 pe calea Project Manager proj1/Forms/New Form dup modelul: Destroy Event: Cancel do form fview3.scx do form fview3.scx thisform.release cancel

121

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

32. Administrarea de la distan a MyQSL/FreeBSD cu VFP/Win9.x


Dup instalarea MySQL pe server pentru a configura pentru acces partajat i proteja serverul se poate folosi programul mysql_setpermission. Execuia acestui program necesit privilegii de administrator (su-2.05a#). n continuare configurarea serverului cu acest program se face prin intermediul unei interfee de tip text: Password for user to connect to MySQL: ###################################################################### ## Welcome to the permission setter 1.2 for MySQL. ###################################################################### What would you like to do: 1. Set password for a user. 2. Add a database + user privilege for that database. - user can do all except all admin functions 3. Add user privilege for an existing database. - user can do all except all admin functions 4. Add user privilege for an existing database. - user can do all except all admin functions + no create/drop 5. Add user privilege for an existing database. - user can do only selects (no update/delete/insert etc.) 0. exit this program Make your choice [1,2,3,4,5,0]: Prin aceast interfa se poate defini parola pentru superuser (root) i se pot defini parolele i drepturile de acces pentru toi utilizatorii serverului. n continuare, administratorul poate configura i exploata programatic serverul MySQL din interfaa MVFP. Conectarea la server se poate face cu comanda: nConnectionHandle = SQLCONNECT('sqlremote','sa','secret') unde sqlremote este numele conexiunii (MySQL-lori), sa este numele superuserului (root) iar secret este parola acestuia (********). Pentru crearea unei interfee grafice de administrare a serverului (MySQL-lori) n MVPF se pot urma paii: 1. Se creeaz un nou proiect (New/Project/New File); 2. Se creeaz un nou formular (Project Manager Proj1/Documents/Forms/New.../New Form); se construiete formularul:
Command1.Click: sqldisconnect(nCH) Label1: Caption = Server connection name Text3.InteractiveChange: (la fel Text1 i Text2)
if ((len(alltrim(thisform.text1.text))>0) AND; (len(alltrim(thisform.text2.text))>0) AND; (len(alltrim(thisform.text3.text))>0)) thisform.commandgroup1.command1.enabled = .T. endif if ((len(alltrim(thisform.text1.text))=0) OR; (len(alltrim(thisform.text2.text))=0) OR; (len(alltrim(thisform.text3.text))=0)) thisform.commandgroup1.command1.enabled = .F. endif

public nCH release nCH (:form1.destroy) nCH = sqlconnect(; alltrim(thisform.text1.text),; alltrim(thisform.text2.text),; alltrim(thisform.text3.text)) do form form2.scx

Command2.Click:
sqldisconnect(nCH) release nCH thisform.release cancel

122

Programarea rapid a aplicaiilor pentru baze de date relaionale

3. Se construiete formularul form2:


a = alltrim(thisform.edit1.text) b = SQLEXEC(nCH, a, 'MyCursor') if (b>0) messagebox("SQL Query is OK") if upper(substr(a,1,3))='USE' messagebox("database opened") thisform.commandgroup1.command3.enabled = .F. endif if upper(substr(a,1,6))='SELECT' messagebox("select ok") thisform.commandgroup1.command3.enabled = .T. endif endif

browse thisform.release cancel

Form2.Activate: form1.hide SQLSETPROP(nCH,; 'asynchronous', .F.)

4. Se realizeaz programul principal (program1): public nCH do form form1.scx read events 5. Execuia programului se face n modul urmtor (Program Manager proj1/code/programs/program1/Run):

123

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

6. Se poate modifica formularul form1 astfel nct s nu afieze parola la intrare. Se modific proprietatea PasswordChar a casetei Text1: $; 7. Se execut din nou aplicaia:

124

Programarea rapid a aplicaiilor pentru baze de date relaionale

33. Comenzi SQL pentru accesul la un server de date


n aplicaiile client/server sunt utile urmtoarele comenzi VFP: CURSORSETPROP(cProperty [, eExpression] [, cTableAlias | nWorkArea])
Exemplu 1.

Urmtorul exemplu demonstreaz cum se poate deschide optimistic o tabel cu ajutorul funciei CursorSetProp(). Funcia se poate folosi inclusiv pentru tabele locale. Se folosete tabela institutii din baza de date universitati. Variabila de mediu MultiLocks se va seta pe ON, ca o necesitate pentru accesul prin intermediul tampoanelor pe disk. Tabela institutii din baza de date universitati este deschis, iar funcia CursorSetProp() este folosit pentru a seta modul de acces optimistic prin tampoane pe disk (optimistic buffering mode). Este afiat un mesaj informativ despre rezultatul operaiei.
CLOSE DATABASES CLEAR SET MULTILOCKS ON OPEN DATABASE ('universitati') USE institutii lSuccess=CURSORSETPROP("Buffering", 5, "institutii") IF lSuccess = .T. =MESSAGEBOX("Operation successful!",0,"Operation Status") ELSE =MESSAGEBOX("Operation NOT successful!",0,"Operation Status") ENDIF

Lista parametrilor poate accepta mai multe proprieti urmate de valorile lor, aa cum rezult din urmtorul tabel: proprietate (Property) BatchUpdateCount (*) Buffering Valoarea (eExpression) Numrul de comenzi update trimise ctre sursa de date pentru tabelele tampon. 1 seteaz tamponul pentru nregistrri i tabel la Off; 2 seteaz modul pesimistic pentru tamponul la nregistrri la On; 3 seteaz modul optimistic pentru tamponul la nregistrri la On; 4 seteaz modul pesimistic pentru tamponul la tabel la On; 5 seteaz modul optimistic pentru tamponul la tabel la On; CompareMemo FetchAsNeeded .T. face ca cmpurile Memo, General i Picture s fie incluse n clauza Where pentru modificri; .F. nu; .F. pentru vederi la distan numrul nregistrrilor preluate e determinat de proprietatea MaxRecord; pentru vederile locale toate nregistrrile sunt preluate; .T. toate; FetchMemo (*) FetchSize (*) .T. preia i cmpurile memo; .F. nu; Numrul de nregistrri citite progresiv de la distan; implicit 100;
125

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

-1 face ca s se preia ntregul set; KeyFieldList MaxRecords (*) Lista de cmpuri (specificate prin nume) care se dorete a fi preluate n cursor, separate prin virgul; Numrul maxim de nregistrri preluate; -1: toate; 0: nici una (util pentru adugri, cnd se dorete execuia vederii, dar nu se dorete citirea de date de la distan ci doar scrierea); Prepared .T. atunci cnd se face doar o operaie de pregtire a interogrii (vezi aplicaia de la capitolul 32, n care s-a folosit funcia SQLPrepare(), similar ca efect); se folosete apoi REQuery(); SendUpdates Tables UpdatableFieldList UpdateNameList UpdateType UseMemoSize (*) WhereType .T. sau .F. Lista tabelelor la distan separate prin virgul Lista cmpurilor pentru Update (nume cmp n tabela la distan, urmat de nume cmp n cursor); Numele cmpurilor n cursor (pentru redenumiri); 1 vechile date sunt modificate cu cele noi; 2 tergerea datelor vechi i inserarea celor noi; Dimensiunea (n octei) maxim a unui cmp de la care acesta cnd este preluat este stocat ntr-un cmp memo; Clauza Where pentru modificarea tabelelor la distan; valori: 1 sau DB_KEY: doar cmpurile specificate n KeyFieldList; 2 sau DB_KEYANDUPDATABLE: cmpurile specificate n KeyFieldList i cele modificabile; 3 sau DB_KEYANDMODIFIED: cmpurile specificate n KeyFieldList i cele modificate; 4 sau DB_KEYANDTIMESTAMP: cmpurile specificate n KeyFieldList i cele accesate; (*) aceste proprieti au ca destinaie primr utilizarea lor la vederi la distan; setarea acestora pentru vederile locale nu are efect.
Dicionar

pessimistic buffering: previne ca un utilizator n sistem multi-user s acceseze o anume nregistrare sau o tabel cnd un alt utilizator face schimbri asupra ei; asigur cea mai mare securitate de mediu pentru modificarea nregistrrilor dar ncetinete operaiile cu utilizatorii; optimistic buffering: o cale eficient de a modifica nregistrri, deoarece blocarea acestora (lock) intervine doar atunci cnd acestea sunt scrise, i face ca s se minimizeze timpul n care
126

Programarea rapid a aplicaiilor pentru baze de date relaionale

un utilizator monopolizeaz sistemul ntr-un sistem multi-user; cnd se folosete blocarea la nivel de nregistrare sau tabel n sistem multi-user, VFP aplic blocarea optimistic; SQLCONNECT([DataSourceName, cUserID, cPassword | cConnectionName])
Exemplu 2.

STORE SQLCONNECT('MyFoxSQLNT', 'sa') TO gnConnHandle IF gnConnHandle <= 0 = MESSAGEBOX('Cannot make connection', 16, 'SQL Connect Error') ELSE = MESSAGEBOX('Connection made', 48, 'SQL Connect Message) = SQLDISCONNECT(gnConnHandle) ENDIF SQLTABLES(nConnectionHandle [, cTableTypes] [, cCursorName]) Exemplul 3. STORE SQLCONNECT('MyFoxSQLNT', 'sa') TO gnConnHandle IF gnConnHandle < 0 = MESSAGEBOX('Cannot make connection', 16, 'SQL Connect Error') ELSE = MESSAGEBOX('Connection made', 48, 'SQL Connect Message') STORE SQLTABLES(gnConnHandle, 'TABLE', 'mycursor') TO nTables IF nTables = 1 SELECT mycursor LIST ENDIF ENDIF SQLGETPROP(nConnectionHandle, cSetting) Exemplul 4. * Clear environment CLOSE ALL CLEAR ALL CLEAR * Display the Select Connection or Data Source dialog box * to choose a connection nHandle=SQLCONNECT() * Test connection, report results IF nHandle > 0 cSource= SQLGETPROP(nHandle, "datasource") =MESSAGEBOX("Current Data Source = "+cSource,0,"Connection Results") ELSE =MESSAGEBOX("Connection Error = " + ; ALLTRIM(STR(nHandle)),0,"Connection Results") ENDIF =SQLDISCONNECT(nHandle) SQLSETPROP(nConnectionHandle, cSetting [, eExpression])
Exemplul 5. * Clear environment CLOSE ALL CLEAR ALL CLEAR
127

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

* Display the Select Connection or Datasource dialog box * to choose a connection nHandle=SQLCONNECT() * Test connection, report results IF nHandle > 0 * Set PacketSize nSet=SQLSETPROP(nHandle, "PacketSize", 2048 ) * Test setting and display results IF nSet > 0 =MESSAGEBOX("PacketSize was set to 2048",0,"Connection Results") ELSE =MESSAGEBOX("Error setting PacketSize",0,"Connection Results") ENDIF ELSE =MESSAGEBOX("No Connection",0,"Connection Results") ENDIF =SQLDISCONNECT(nHandle) SQLMORERESULTS(nConnectionHandle) Exemplul 6. = SQLSETPROP(gnConnHandle, 'BatchMode', .F.) && Individual result sets = SQLEXEC(gnConnHandle, 'SELECT * FROM authors; SELECT * FROM titles') = SQLMORERES(gnConnHandle) && First result set = SQLMORERES(gnConnHandle) && Second result set

128

Programarea rapid a aplicaiilor pentru baze de date relaionale

34. Aplicaie exemplu


Se consider baza de date cu cursanii colii Academice Postuniversitare de Informatic Aplicat i Programare cu urmtoarea structur:

Obiectivul este crearea interfeei de exploatare a bazei de date. dup crearea bazei de date, a tabelelor i stabilirea relaiilor ntre tabele, coninutul directorului cu baza de date este:

Se creeaz acum formularele i rapoartele:


129

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

1. Formulare pentru adugarea i modificarea unui centru, i curs; tabelele nu au chei strine deci formularele sunt pe baza unei singure tabele; se merge din meniu pe calea: New/Form/Wizard/Form Wizard; se genereaz astfel cele 3 formulare:

2. Se salveaz aceste formulare n directorul cu baza de date. Se creeaz formulare pentru adugarea/modificarea unui student; tabela are cheie strin din tabela centre; se folosete wizard-ul pentru aceasta: New/Form/Wizard/One-to-Many Form Wizard;

130

Programarea rapid a aplicaiilor pentru baze de date relaionale

3. Tabelele note, repart i taxe sunt tabele ce implementeaz relaii (m,n) ntre tabelele module i stud; adugarea unei note presupune selecia studentului din tabela de studeni, selectarea modulului din tabela de module i introducerea datei, formei i notei; adugarea unei repartiii presupune selecia studentului din tabela de studeni, selecia modulului din tabela de module i introducerea formei; adugarea unei taxe presupune selecia studentului din tabela stud, selecia modulului din tabela de module i introducerea sumei i datei; se merge pe calea New/Form/New File;

select "stud.dbf" c_stud = cod_stud select "module.dbf" c_modul = cod_modul select "taxe.dbf" append blank repl taxe.cod_modul with c_modul,; taxe.cod_stud with c_stud,; taxe.data with date(), taxe.suma with val(thisform.text1.text) 4. La fel se procedeaz i pentru celelalte dou formulare:

Form1.activate: thisform.text2.text = dtoc(date())

131

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

select "stud.dbf" c_stud = cod_stud select "module.dbf" c_modul = cod_modul select "note.dbf" append blank repl note.cod_modul with c_modul,; note.cod_stud with c_stud,; note.data with date(), note.nota with val(thisform.text1.text)

Form1.activate: thisform.text2.text = dtoc(date())

132

Programarea rapid a aplicaiilor pentru baze de date relaionale

Command1.Caption: Save; Command1.Click: select "stud.dbf" c_stud = cod_stud select "module.dbf" c_modul = cod_modul select "repart.dbf" append blank repl repart.cod_modul with c_modul, repart.cod_stud with c_stud,; repart.forma with alltrim(thisform.text1.text) 5. Formularul pentru introducerea datelor n tabelele prof i module poate fi fcut cu ajutorul wizard-ului: New/Form/Wizard/One-to-Many Form Wizard, la fel ca la formularul stud, ns s-ar pierde o legtur; se poate face n forma anterioar, se creaz un formular pentru prof:

dup care se creeaz un formular pentru modul: Form1.activate: thisform.text1.text = dtoc(date())

133

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

select "cursuri.dbf" cod_c = cursuri.cod_curs select "prof.dbf" cod_p = prof.cod_prof select "centre.dbf" cod_n = centre.cod_centru select module append blank &&are functie autoincrement replace module.cod_centru with cod_n,; module.cod_curs with cod_c,; module.cod_prof with cod_p,; module.data with date() 6. Se creeaz rapoartele cu ajutorul lui Report Wizard; 7. Se integreaz aplicaiile ntr-n proiect cu ajutorul lui Application Wizard: New/Project/Wizard:

134

Programarea rapid a aplicaiilor pentru baze de date relaionale

35. Documentarea aplicaiilor windows cu Microsoft HTML Help


Microsoft HTML Help const dintr-un program de vizualizare online Help Viewer care folosete componentele lui Microsoft Internet Explorer pentru a afia coninutul helpului. Suport HTML, ActiveX, Java, limbaje de scriptare (JScript, and Microsoft Visual Basic Scripting Edition) i imagini n format HTML (.jpeg, .gif, i .png). HTML Help Workshop este instrumentul cu care se pot crea i exploata proiectele help i fiierele auxiliare. HTML Help project este un fiier text cu extensia .hhp care organizeaz toate elementele unui sistem help. El conine legturile ctre toate topicele HTML (fiiere cu extensiile .html i .htm) , imagini (.jpeg, .gif, .png), index (.hhk), i cuprins (.hhc). HTML Help Workshop combin apoi toate aceste fiiere pentru a genera un singur fiier cu extensia .chm.

135

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

36. Crearea unui nou fiier help (.chm) cu HTML Help Workshop
HTML Help Workshop este un produs free Microsoft i poate fi descrcat de pe situl Microsoft. Se instaleaz n sistem (sunt necesare privilegii de administrator) dup care se ncarc n execuie pe calea Start/Programs/HTML Help Workshop/HTML Help Workshop. Se creeaz un nou help (File/New). Dac au fost deja create fiiere componente ale proiectului, se pot include n el:

Dup generarea proiectului, se pot defini opiunile acestuia, n care se includ topicele, aa cum rezult din figurile urmtoare.

136

Programarea rapid a aplicaiilor pentru baze de date relaionale

Pn n acest moment, coninutul fiierului postuniv.hhp este: [OPTIONS] Auto Index=Yes Compatibility=1.1 or later Compiled file=postuniv.chm Default Font=,12,0 Default topic=data\an_introduction.htm Display compile progress=Yes Enhanced decompilation=Yes Flat=Yes Full-text search=Yes Language=0x409 English (United States) Title=SAPIAP Program Help [FILES] data\t_stud.htm data\an_introduction.htm f_centre.htm f_cursuri.htm f_module.htm f_note.htm f_prof.htm f_stud.htm r_centre.htm r_cursuri.htm r_module.htm r_note.htm r_prof.htm r_stud.htm t_centre.htm t_cursuri.htm t_module.htm t_note.htm t_prof.htm a_documentation.htm
137

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

[INFOTYPES] Fiierele *.htm sunt fiiere (D)HTML standard i pot fi generate cu orice program creator de pagini web (Netscape Composer, Microsoft Word, FrontPage). Iat coninutul fiierelor an_introduction.htm, a_documentation.htm i f_centre.htm: an_introduction.htm <html><head><title>SAPIAP Help</title></head><body> Baza de date a Scolii Academice Postuniversitare de Informatica Aplicata si Programare este in urmatoarea structura:<BR> <img src="bd_all.jpg"><BR> <BR>Vezi si:<BR> tabela <A HRef = "t_centre.htm">centre</A><BR> tabela <A HRef = "t_stud.htm">studenti</A><BR> tabela <A HRef = "t_cursuri.htm">cursuri</A><BR> tabela <A HRef = "t_prof.htm">profesori</A><BR> tabela <A HRef = "t_module.htm">module</A><BR> tabela <A HRef = "t_note.htm">note</A><BR> informatiile despre realizarea <A HRef = "a_documentation.htm">helpului</A> </body></html> a_documentation.htm <html><head><title>SAPIAP Help</title></head><body> Fisierele incluse in topicul acestui help sunt:<BR> <img src="z_doc.jpg"><BR> </body></html> f_centre.htm <html><head><title>Fromularul centre</title></head><body> <BR>Formularul Centre ne permite sa prelucreaza informatiile din tabela de centre de invatamant:<BR> <img src="form_centre.jpg" align=center><BR> <BR>Parcurgerea se realizeaza cu butoanele:<BR> <ul><li>top: inceputul tabelei<li>prev: inregistrarea anterioara <li>next: urmatoarea inregistrare<li>bottom: ultima inregistrare</ul> <img src="find_centre.jpg" align=center><BR> <BR>Cautarea informatiilor se face cu butonul Find:<BR> <img src="result_centre.jpg" align=center><BR> <BR>Tiparirea informatiilor se face cu butonul print:<BR> <img src="result_centre.jpg" align=center><BR> <BR>Adaugarea unui nou centru se face cu butonul Add:<BR> <img src="add_centre.jpg" align=center><BR> <BR>Editarea informatiilor despre un centru se face cu butonul Edit:<BR> <img src="edit_centre.jpg" align=center><BR> <BR>Stergerea unui centru se face cu butonul Delete iar iesirea din formular se face cu butonul Exit.<BR> Vezi si:<BR> tabela <A HRef = "t_centre.htm">centre</A><BR> raportul <A HRef = "r_centre.htm">centre</A><BR> pagina de<A HRef = "an_introduction.htm">inceput</A><BR> </body></html>
138

Programarea rapid a aplicaiilor pentru baze de date relaionale

Se poate acum crea cuprinsul, ncepnd cu repertoarul acestuia:

Se poate schimba iconia implicit asociat unei intrri pe calea: Contents/Edit Selection/Table of Contents Entry/Advanced. Legenda este alturat:

139

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

Se pot crea legaturi ctre pagini n cuprins pe calea:

n mod implicit se genereaz o fereastr de help cu puine controale nglobate. Se poate ns crea o fereastr definit de utilizator. Se merge pe calea:

Se poate acum crea indexul:

140

Programarea rapid a aplicaiilor pentru baze de date relaionale

Se adaug opiunea de index n Widow Types (Add/Modify Window definitions). Se adaug apoi noi intrri n index pe aceeai cale ca pentru paginile din cuprins:

Compilarea helpului are ca rezultat fiierul postuniv.chm. ncrcarea acestuia n execuie duce la:

Se poate acum regenera aplicaia cu Application Builder cnd se specific fiierul help postuniv.chm n pagina Advanced a acestuia.

141

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

37. Capitole speciale de baze de date (securitate, coeren, restricii, tranzacii, concuren)
Alte tipuri de baze de date

O baz de date distribuit (BDD) este reprezentat de o mulime de date corelate logic, mai exact o colecie de baze de date mpreun cu colecia de relaii dintre ele, baze de date care rezid pe maini diferite, ce lucreaz n sisteme de operare de cele mai multe ori diferite, interconectate prin diferite reele de comunicaii. Corelarea (integrarea) logic const n faptul c, din punct de vedere al utilizatorului, o BDD reprezint o singur baz de date, o singur structur conceptual global reprezentnd integrarea logic a mulimilor de date. Astfel, repartiia fizic a datelor este transparent pentru utilizator. Din cele ce s-au menionat mai sus se poate trage concluzia c fiecare calculator mpreun cu baza de date local constituie o staie sau un nod al bazei de date distribuite, iar calculatoarele corespunztoare acestor noduri sunt conectate ntre ele prin sistemul de comunicaie al reelei. n cadrul operaiilor obinuite, cererile de acces ale aplicaiilor unei staii (unui nod) necesit numai accesul la baza de date local. Aceste aplicaii executate n ntregime de ctre calculatorul staiei (nodului) sunt numite aplicaii locale. Ceea ce deosebete o mulime oarecare de baze de date locale de o baz de date distribuit este existena unor aplicaii care acceseaz date din mai multe staii. Aceste aplicaii sunt numite aplicaii globale sau aplicaii distribuite. Gestiunea unei BDD necesit ca n fiecare staie de lucru (n a crei memorie extern rezid o parte din baza de date distribuit) s existe:
sistemul de gestiune al bazelor de date locale (SGBDL), care trebuie s fie un SGBD

standard i trebuie s cuprind propriul dicionar pentru datele din baza de date local;
componenta de comunicaie (CC), care trebuie s realizeze toate legturile n cadrul reelei

de date local ;
dicionarul global de date (DGD), care trebuie s conin informaii despre baza de date

distribuit referitoare la localizarea, structura, disponibilitatea i modul de utilizare a datelor;


sistemul de gestiune a bazei de date distribuite (SGBDD), care asigur interfaa ntre baza

de date distribuit i utilizatorii acesteia;


majoritatea staiilor de lucru (nodurilor) au i un administrator al bazei de date distribuite.

O baz de date distribuit omogen este compus din baze de date locale administrate de acelai SGBD i se obine, de obicei, prin diviziunea unei baze de date mari n baze de date
142

Programarea rapid a aplicaiilor pentru baze de date relaionale

locale, SGBDD-ul care o gestioneaz fiind considerat, evident, omogen. La primirea unei cereri, staia de la care a fost lansat cererea devine staie coordonatoare i este responsabil pentru determinarea numelui entitii i pentru accesarea catalogului. Componenta de gestiune a tranzaciilor elaboreaz, de obicei, un plan global care include att module de acces la distan, ct i module de acces local. Staiile cooperante pstreaz autonomia complet asupra propriilor date (locale). Baza de date distribuit eterogen se obine prin integrarea ntr-o baz de date unic a mai multor baze administrate de SGBD-uri diferite. Exist dou nivele de eterogenitate. O situaie n care bazele de date sunt de acelai tip (de exemplu, relaional) dar sunt gestionate de SGBD-uri diferite i alta n care bazele de date sunt de tipuri diferite (de exemplu, relaional, ierarhic, reea) i, evident, sunt gestionate de SGBD-uri diferite. Problema este deosebit de ambiioas i, evident, este dificil de rezolvat n totalitate.
Bazele de date federale (BDF), numite i multibaze de date, permit interoperabilitatea

n baze de date autonome i eterogene cu ajutorul unui limbaj multibaz i nu cu ajutorul unei scheme globale. Prin aceast abordare se permite asigurarea unei autonomii totale a diferitelor baze de date componente ale BDF i, de asemenea, se ofer posibilitatea administrrii, gestionrii i manipulrii independente a acestor baze. Absena schemei locale implic tolerarea conflictelor semantice. Percepia utilizatorului privind o baza de date federal nu este aceea de baz de date global, ci aceea de mulime de baze de date distincte interoperabile. Noiunea de staie este nlocuit cu cea de baz de date, deoarece BD care fac parte dintr-o federaie (BDF) nu se afl obligatoriu pe staii diferite. Astfel, o arhitectur pe trei nivele a schemei unei baze de date federale (BDF) conine: 1) nivelul privat care conine schemele interne i conceptuale ale fiecrei baze de date BDF; 2) nivelul multibaz (schema exportat) descrie o baz de date existent n federaie ca pe un subansamblu al acesteia. Exis, tot la acest nivel, o schem de dependene interbaze care face legtura ntre schemele exportate ale diferitelor baze de date din baza de date federal; 3) Nivelul extern(schema extern) permite manipularea datelor din diferite baze componente.
Bazele de date paralele (BDP) ncearc mbuntirea performanelor, fiabilitii i

costului gestiunii datelor, bazndu-se pe paralelismul oferit de recentele arhitecturi multiprocesor. Exist variantele:

arhitectura cu memorie comun, n care fiecare procesor poate avea acces, n egal
msur, la fiecare modul de memorie central i la fiecare unitate de disc, prin reelele de interconexiune;
143

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

arhitectura cu memorie privat este format dintr-o mulime de noduri care pot coopera
datorit unei reele de interconexiuni. Fiecare nod conine unul sau mai multe procesoare care au acces exclusiv la modulele memoriei interne i la unitile de discuri proprii nodului respective. Limbajele de programare convenionale ce permit programarea obiectual permit crearea, manipularea i distrugerea obiectelor n memoria intern. Aceasta nseamn c durata de via a unui astfel de obiect (tranzitoriu) nu depete durata de via a programului care la creat. O soluie n prelungirea vieii obiectelor este copierea lor n fiiere, pentru a putea fi citite i manipulate ulterior, aceast abordare fiind evident o form primitiv de persisten a obiectelor. Din pcate ea nu e transparent, trebuind gestionat explicit, iar programarea operaiilor de gestionare este delicat, trebuind transformai pointerii (adrese virtuale) n adrese disc. n aceast situaie, accesul ntr-un set de mai multe obiecte este neperformant, neajuns la care se adaug i problemelor clasice referitoare la gestionarea fiierelor. Abordarea cu baze de date de orientare obiect aduce o soluie nou la problema gertiunii transparente a obiectelor persistente, adic acelor obiecte care, stocate n baza de date, au o durat de via evident mai mare dect programul prin care au fost create obiectele respective. Ideea de baz const n a combina conceptele obiect cu concepte referitoare la bazele de date. Prima motivaie pentru bazele de date orientate obiect este nevoia de acces rapid la obiecte persistente prin programe scrise n limbaje cu faciliti n programarea orientat pe obiecte. A doua motivaie este legat de noile cerine din tehnologiile aplicaiilor complexe cum ar fi CAD (Computer Aided Design), CAM (Computer Aided Manufacturing), CASE (Computer Aided Software Engineering), CAE (Computer Aided Engineering), aplicaii grafice, multimedia, .a. Schema unei BDOO trebuie s cuprind, deci, definiiile structurale (atribute i tipuri) i comportamentale (metode) ale obiectelor, preciznd toate clasele definite pentru o aplicaie. Definiiile claselor includ motenirea, relaiile de nrudire (supraclase-subclase) i relaiile structurale dintre clase (asocierile). Asocierile dintre clase sunt necesare pentru a cuprinde restriciile de integritate referenial la nivel de clas, o asociere ntre dou clase fiind reprezentat natural prin dou legturi, una fiind inversa celeilalte. Schema bazei de date trebuie s specifice, deci, datele care ar putea fi materializate i asocierile dintre ele, fiind definit de ctre proiectantul bazei utiliznd conceptele modelului de date (n cazul obiect: clase, motenire, etc.) Schema unei BDOO poate fi, astfel, modificat dinamic n funcie de necesitile utilizatorilor, ceea ce presupune:

144

Programarea rapid a aplicaiilor pentru baze de date relaionale

definirea unei taxonomii i a unui model al schimbrilor, taxonomia definind un set de


schimbri semnificative ale schemei, iar modelul furnizeaz o baz pentru specificarea semanticilor schimbrilor schemei;

implementarea schimbrii schemei.


Se identific dou tipuri de schimbri n schema unei baze de date orientate obiect:
schimbri referitoare la structura ierarhiei de clase, care includ adugarea sau tergerea

unei clase i modificarea relaiilor supraclas-subclas dintre dou clase;


schimbri referitoare la modul de definire al unei clase, acestea cuprinznd modificri ale

atributelor i metodelor definite pentru o anumit clas (de exemplu, schimbarea numelui sau domeniului unui atribut, adugarea, tergerea unui atribut sau metode din clasa respectiv). Deci, un SGBDOO este un SGBD care trebuie s suporte (gestioneze) conceptele de obiect, motenire i polimorfism. Termenul de obiect trebuie s reprezinte suportul pentru obiecte atomice potenial foarte mari(de exemplu imagini, sunete), pentru obiecte arbitrar de complexe i pentru asigurarea identificrii permanente a fiecrui obiect i a metodelor asociate. Motenirea multipl i trimiterea de mesaje sunt considerate funcionaliti adiionale. Sunt posibile mai multe abordri n construirea unui SGBDOO, n funcie de modul n care sunt combinate tehnologiile specifice bazelor de date i tehnologii specifice limbajelor de programare orientate obiect:
abordarea bazat pe modelul relaional, care presupune extensia unui SGBD relaional i

a limbajelor lui pentru a cuprinde conceptele obiect. Una din variantele extensiei unui SGBD relaional este dotarea acestuia cu un subsistem (translator) pentru memorare relaional aa cum propune produsul OpenDB al firmei Hewlett Packard, derivat din produsul IRIS [Beech88]. O integrare mai puternic const n ideea ca SGBD-ul releional s suporte direct conceptele obiect, abordare folosit n prototipul Postgres. Un astfel de SGBDOO trebuie s ofere, n general, o interfa de tip SQL (extins) pentru accesarea obiectelor i apelarea metodelor. Adic este necesar o extensie SQL care, pe lng definirea i manipularea doar a tabelelor relaionale, s aib comenzi speciale pentru descrierea tipurilor abstracte i a claselor. De asemenea, utilizatorul trebuie s aib posibilitatea de a manipula clasele ca pe nite relaii, clasele putnd avea ca atribute referine de alte clase sau putnd avea atribute complexe;
abordarea cu obiecte persistente, care nseamn extinderea unui mediu de programare

obiectual n vederea definirii i manipulrii obiectelor persistente. ntr-o astfel de abordare, diferit de prima, se pornete de la un limbaj de programare orientat obiect (cum
145

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

ar fi C++ sau Smalltalk) pentru a realiza definirea schemei unei BDO i a programelor aplicaie care s integreze apelurile la rutinele de gestiune a datelor, adic pentru a ajunge la un SGBDOO;
abordarea integrat, n care SGBDOO folosete un model ce integreaz concepte

semantice i obiect, adic nu se bazeaz pe nici un model deja existent, fie el relaional sau obiect. Un SGBDOO integrat poate fi independent de orice limbaj de programare, oferind o interfa multilimbaj, aa cum lucreaz sistemul O2;
pstrarea unui limbaj compatibil SQL (extins), dar fr a folosi modelul relaional, aa

cum propune UniSQL. Aceast ultim abordare este diferit de abordarea bazat pe modelul relaional deoarece SGBDOO i modelul lui consider, pur i simplu, conceptul de relaie ca pe un caz particular de constructor. Caracteristicile obligatorii ale unui SGBDO sunt: 1. manipularea obiectelor atomice i complexe (compuse). Un constructor este o funcie asociat unei clase care permite crearea i iniializarea unui obiect, iar un constructor este de asemenea o funcie asociat unei clase prin care se distruge un obiect. Un obiect complex este realizat din alte obiecte, adic o parte dintre atributele unui astfel de obiect pot fi ele nsele obiecte (instane ale unor clase), un obiect complex (compus) avnd, deci, o structur ierarhic (o ierarhie de pri). Aceast noiune s-a nscut, deci, prin aplicarea de constructori asupra unor obiecte simple. Minimul de constructori pe care un SGBDOO trebuie s i conin sunt constructorii de seturi, liste i tupluri (nregistrri). O alt condiie n cadrul modelului orientat pe obiecte este ortogonalitatea, aceasta nsemnnd c fiecare constructor trebuie s fie aplicabil fiecrui obiect. 2. Identitatea obiectelor. Orice obiect trebuie s primeasc n momentul crerii (prin intermediul sistemului) un identificator, adic o referin unic independent de valorile atributelor lui. 3. ncapsularea. Ea deriv din tipurile de date abstracte i s-a meninut n gestiunea BDOO din dou motive: necesitatea de a diferenia specificarea unei operaii de implementarea acesteia i ideea de modularizare. ncapsularea sugereaz dou pri pentru orice obiect. Partea de interfa reprezentnd specificarea unui set de operaii care se pot aplica asupra unui obiect, fiind singura zon vizibil a obiectului. Implementarea se refer att la componenta de date, ct i la cea de procedur. Partea de date este, de fapt, reprezentarea (cmpurilor) obiectului, n timp ce partea de procedur descrie, cu ajutorul unui limbaj de programare, implementarea fiecrei operaii. Implementarea este mascat (ascuns) n cadrul obiectului.

146

Programarea rapid a aplicaiilor pentru baze de date relaionale

4. Ierarhii de clase sau tipuri (motenire simpl). O clas poate fi specializarea unei alte clase i, prin urmare, o motenete. Motenirea reduce eforturile de programare. Exist patru modaliti de a moteni: prin substituie (dac asupra unui obiect din subtip se pot executa mai multe operaii dect asupra unui obiect din supratip), prin incluziune (dac orice obiect din subtip este i obiect din supratip), prin restricie (caz particular al incluziunii n care obiectele subtipului sunt toate din supratip care satisfac o restricie specificat) i prin specializare (obiectele subtipului aparin i supratipului, dar conin un surplus de informaii specifice). 5. Polimorfismul. Adic, la primirea unui mesaj, stabilirea metodei care se aplic se face n mod dinamic, n funcie de clasa obiectului n cauz. Astfel, obiecte diferite (instane ale unor clase diferite) pot fi adresate uniform (pot primi aceleai mesaje), dar manifest comportamente diferite. Aceasta asigur manipularea simpl i coerent a seturilor eterogene de obiecte. 6. Uurina interogrii. Un obiect poate fi reperat utiliznd valorile atributelor sale, legturile cu alte obiecte sau metodele aplicate obiectului respectiv. 7. Persistena obiectelor. Obiectele au durata de via mai mare dect programul care le-a creat. 8. Concurena acceselor. O BDOO poate fi partajat simultan de ctre tranzacii care o consult i tranzacii care o modific. 9. Fiabilitatea obiectelor. Obiectele trebuie s poat fi restaurate n catul unui incident, adic s poat fi aduse la starea pe care au avut-o naintea manifestrii incidentului. Dintre caracteristicile opionale ale unui SGBDOO menionm: 1. Motenirea multipl. O clas (subclass) poate fi specializarea direct a dou sau mai multe supraclase i, deci, s moteneasc proprietile acestora. 2. Versiuni ale obiectelor. Plecnd de la un anumit obiect, prin modificri succesive ale schemei, pot fi obinute mai multe versiuni ale obiectului. Acestea genereaz un graf al versiunilor unui obiect care trebuie s fie gestionat de sistem. 3. Distribuia obiectelor. Aceasta presupune gestiunea obiectelor dintr-o BDOO n staii de lucru diferite (fragmente BDOO locale). 4. Modelarea tranzaciilor evoluate. Ideea const n acceptarea tranzaciilor imbricate care pot fi descompuse n subtranzacii. Nu exist deocamdat o prere comun privind arhitectura unui SGBDOO, mai mult, arhitectura unui astfel de sistem poate fi o problem de perspectiv, fiind dependent de modul n care este vzut SGBDOO de ctre cercettor, ca utilizator final sau ca administrator de sistem. Totui, arhitectura unui SGBDOO trebuie s cuprind trei componente majore:
147

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

1. gestionarul de obiecte (Obiect Manager) care asigur interfaa dintre procesele (prelucrrile) externe i SGBDOO. Deci, funciile gestionarului de obiecte constau n: a. funcii de prelucrare a mesajelor, incluznd editarea de legturi n momentul lansrii n execuie i verificarea tipului, ca i translatarea cererilor; b. faciliti de definire i modificare a schemei bazei de date, incluznd definiri de clase noi sau corectate n ierarhii sau reele de clase existente; 2. serverul de obiecte care este responsabil cu asigurarea serviciilor de baz corespunztoare oricrui SGBD, cum ar fi: gestiunea tranzaciilor i gestiunea stocului de obiecte. Deci, serverul de obiecte realizeaz recuperarea (refacerea), inseria, tergerea i actualizarea obiectelor stocate n stocul rezident de obiecte. Un astfel de server poate manipula, de unul singur, tranzacii transmise de la mai muli gestionari de obiecte. Deci, funciile unui server de obiecte sunt: a. gestiunea tranzaciilor, incluznd controlul concurenial, gestiunea zonelor buffer i servicii de refacere; b. gestiunea fizic a stocului de obiecte, incluznd plasarea obiectelor i implementarea metodelor de acces; c. eventual servicii de arhivare i de asigurare a rezervelor (dublurilor); 3. stocul resident de obiecte sau, mai exact, baza de date orientat obiect (BDOO) nsi.
Bazele de date funcionale au aprut odat cu definirea modelului funcional al

datelor i cu utilizarea unor limbaje fundamentate pe principiile programrii funcionale ca limbaje de definire i manipulare a datelor den bazele de date. Considernd modelul funcional, o baz de date funcional (BDF) este definit ca un ansamblu de funcii memorate. Funciile sunt utilizate att pentru definirea atributelor de entitate, deci pentru descrierea entitilor, ct i pentru exprimarea asocierilor (relaiilor) dintre entiti. ntr-o BDF, atributele de entitate sunt considerate drept funcii care mapeaz entitatea pe anumite domenii. De exemplu, atributul NUME al unei entiti PERSOANA este vzut ca o funcie care mapeaz PERSOANA pe domeniul irurilor de caractere. Legturile dintre entiti sunt reprezentate, n general, de dou funcii. Considernd, de exemplu, entitile MUNCITOR i SECIE, una dintre funcii aplicat asupra entitii MUNCITOR returneaz o entitate SECIE (secia n care lucreaz muncitorul respectiv), iar a doua funcie aplicat entitii SECIE returneaz o entitate MUNCITOR (muncitorii care lucreaz n secia respectiv) . Din acest motiv, n cadrul BDF funciile nu trebuie s fie definite ntr-o singur direcie, impunndu-se prezena unui mecanism explicit pentru inversarea funciilor. n plus este necesar i un mecanism pentru compunerea funciilor prin
148

Programarea rapid a aplicaiilor pentru baze de date relaionale

care s se asigure navigarea n cadrul modelului funcional. Aceste dou mecanisme stau la baza operaiilor de cpti folosite n cadrul BDF. Prin intermediul bazelor de date inteligente (BDI) s-a urmrit realizarea unei gestionri naturale a datelor, adic a unei memorri, accesri i utilizri fireti i facile a datelor, n scopul satisfacerii depline a cerinelor informaionale a utilizatorilor, deci pentru mbuntirea procesului decizional economic. Se poate afirma, deci, c BDI au aprut ca rezultat al cercetrilor n vederea ameliorrii i perfecionrii tehnologiei bazelor de date. Este de reinut faptul c interesul pentru BDI s-a manifestat, pe lng domeniul bazelor de date, i n domeniul inteligenei artificiale, n legtur cu eforturile de realizare a bazelor de cunotine. Pentru a soluiona problema gestionrii i utilizrii unor volume mari de cunotine s-a ajuns la soluia natural conform creia se organizeaz aceste cunotine sub forma unor baze de cunotine, dup modelul organizrii detelor n baze de date. Cu toate c bazele de cunotine prezint caracteristici structurale i funcionale distincte de cele ale bazelor de date s-a constatat c cercetrile din domeniul bazelor de cunotine i cele din domeniul bazelor de date inteligente (BDI) se susin reciproc, fiind posibil o trecere de la tehnologia bazelor de date la cea a bazelor de cunotine prin intermediul BDI. Uneori, BDI sunt considerate drept baze de cunotine ntr-o form primar sau chiar baze de cunotine propriu-zise. Caracteristicile BDI precum i soluiile de realizare efectiv variaz extrem de mult, ceea ce creeaz dificulti n nsi definirea bazelor de date inteligente (BDI), printre puinele realizri practice semnificative, se numr bazele de date deductive (BDDe). BDI trebuie s permit tratarea unor mari cantiti de date, provenind din diferite surse, sub diferite forme de reprezentare (texte, imagini, sunet, etc.). Aceasta nseamn c BDI cere utilizarea tehnologiilor multimedia, aceasta presupunnd disponibiliti ct mai mari n domeniul suportului extern de date, forma digitizat a imaginilor i sunetelor ocupnd foarte mult spaiu de memorare. Pe lng aceste disponibiliti, tehnologiile multimedia necesit i dispozitive speciale pentru introducerea/extragerea datelor (cititor optic de caractere, scanner, plotter, sintetizator de voce, etc.).
Integritate i coeren

Un aspect important al bazelor de date relaionale este integritatea.


Restricia de integritate este o asertiune care trebuie s fie verificat de ctre date la

momente de timp determinate.


Baza de date coerent este baza de date pentru care mulimea restriciilor de

integritate (explicite sau implicite) este respectat de ctre datele bazei.


149

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

Exist mai mute tipuri de restricii de integritate. Pentru a ilustra aceste tipuri diferite de restricii vom utiliza baza de date relaional din figura 1. Aceast baz de date modeleaz sumar un magazin clasic care stocheaz, vinde si cumpr produse. Mai nti, o restricie de integritate poate viza unicitatea datei. Definirea unui tip elernentar de dat permite adesea exprimarea unor asemenea restrictii, de exemplu (vezi figura 1):
restrictii ale domeniului de variaie (de exemplu data cantitate cumprat este un numr

intreg).
restricii asupra domeniului de valori (de exemplu data cantitate vndut trebuie s fie

cuprins intre 1 i 1000).


Nr. produs Data cumprrii Cantitate cumprat CUMPARARE (NP, DC, CC) Nr. produs Data vnzrii Cantitate vndut VANZARE (NP, DV, CV) Nr. Produs Cantitate in stoc STOC (NP, DS) Nr. produs Nume produs Nume furnizor Nume fabricant PRODUS (NP, NMP, NMF, NMPA)

Figura 1. Exemple de scheme relaionale O restricie de integritate poate de asemenea s acioneze asupra mai multor date. Asemenea restricii pot fi restricii de dependen ntre date:
dependene functionale, cum ar fi numrul produsului determin numele su (NP

NMP).
dependente multivoce, ca de exemplu: numr produs determin multiplu numele

furnizorului independent de numele fabricantului, la rndul sau multideterminat de


150

Programarea rapid a aplicaiilor pentru baze de date relaionale

numrul produsului (NP NMF i NP NMFA).


dependente de incluziune cum ar fi de exemplu faptul c orice tuplu al relaiei STOC

trebuie s corespund unui tuplu in relatia PRODUS; se poate nc vorbi de dependene existeniale sau refereniale in cazul particular de incluziune a cheilor de relaii.
restricii aritmetice care trebuie s fie verificate pentru anumite date; de exemplu, pentru

fiecare produs, cantitatea n stoc (CS) trebuie s rman egal cu suma cantitilor cumprate minus suma cantitilor vndute (CS = CC - CV). Un caz particular al unor asemenea restricii sunt restriciile de duplicare cum at fi A = B, care permit generarea de copii multiple ale unei date.
un alt tip important de restricii de integritate este constituit de anumite valori invariante

existente n baz. De exemplu, suma capitalurilor coninute intr-o baz de date bancar trebuie s rmn constant n timpul executiei unui transfer.
restrictii temporale de integritate, cnd anumite restricii de integritate pot fi dependente

de timp, actionnd de exemplu la sfrsitul unei sptmni sau a unei luni. Este important de notat c toate restriciile de integritate (cu excepia restriciilor temporale) crora li se supune o baz de date pot fi exprimate cu ajutorul logicii predicatelor de ordinul inti. Pstrarea integritii datelor este mult mai dificil n bazele de date distribuite eterogene, dect ntr-o baz de date omogen. Bazele de date distribuite omogene posed un puternic control central care este identic cu schema SGBD. Dac nodurile din reeaua distribuit sunt eterogene, pot aprea cteva probleme care pot amenina integritatea datelor distribuite. Aceste pot fi:

Inconsistene ntre restriciile de integritate locale; Dificulti n specificarea restriciilor de integritate globale; Inconsistene ntre restriciile de integritate locale i globale. Restriciile de integritate locale difer n baze de date distribuite eterogene.

Inconsistenele pot cauza probleme, n mod special interogrile complexe care se bazeaz pe mai mult de o baz de date. Dezvoltarea unor restricii de integritate globale, pot elimina conflictele ntre bazele de date individuale. Totui, acestea nu sunt ntotdeauna simplu ded implementat. Restriciile de integritate globale, pe de alt parte sunt separate n organizaiile individuale. Nu este ntotdeauna practic s schimbi structura organizaiei pentru a face baza de date distribuit consistent. n cele din urm aceasta conduce la inconsistene ntre constrngerile locale i globale. Conflictele depind de nivelul de control central. Dac exist un control global puternic, restriciile de integritate globale au prioritate. Dac controlul central este slab, restriciile de integritate locale nving.
151

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

Controlul concurent ajut la asigurarea integritii datelor. Acest control regularizeaz modul n datele sunt utilizate atunci cnd mai mult de un utilizator acceseaz aceleai date. ntr-un sistem distribuit, de cele mai multe ori, nu doar un singur SGBD controleaz accesul la date. Dac controlul concurenei nu este integrat ntr-un singur sistem distribuit, pot s apar diferite probleme. Astfel, exist trei surse posibile de probleme de acces concurent la date. Acestea sunt:
Actualizri pierdute o actualizare terminat cu succes este tears din neatenie de ctre

un alt utilizator;
Tranzacii nesincronizate care violeaz restriciile de integritate; Datele citite sunt incorecte deoarece sunt obinute n timpul unei actualizri.

Fiecare dintre aceste trei probleme pot fi reduse sau nlturate prin implementarea unei scheme adecvate de blocare (pe durata unei blocri doar un singur subiect are acces la o entitate dat) sau a unei metode de acces timestamp (primesc prioritatea prima dat subiecii care au cerut prima dat acest lucru). Probleme mai deosebite apar n cadrul sistemelor SGBD cu niveluri multiple de acces. ntr-un asemenea sistem, utilizatorii sunt restricionai la accesul complet la date. Politicile de acces restricioneaz accesul utilizatorilor doar la anumite date. Politicile de acces pentru sisteme cu niveluri multiple de securitate sunt de dou tipuri: deschise sau nchise. O politic de acces deschis, presupune un sistem n care toate datele sunt considerate accesibile dac nu accesul la un element de dat particular nu este n mod expres interzis. ntr-un sistem n care avem o politic de acces nchis, accesul la toate datele este n mod implicit interzis dac utilizatorul nu are privilegii de acces pentru datele respective.
Securitatea bazelor de date distribuite Aspecte generale ale securitii bazelor de date

Pe lng multiplele avantaje ale folosirii bazelor de date distribuite, acestea au i cteva dezavantaje: proiectarea i controlul sunt mai complexe iar securitatea este mai sczut datorit faptului c datele sunt pstrate pe mai multe maini. Bazele de date distribuite ntmpin toate problemele de securitate pe care le ntmpin bazele de date centralizate i n plus de acestea mai au i altele n plus. Ne vom opri puin asupra elementelor de securitate comune tuturor bazelor de date i pe urm vom analiza cele specifice bazelor de date distribuite. O baz de date securizat trebuie s satisfac urmtoarele cerine: 1. Trebuie s posede o integritate fizic (protecie mpotriva pierderii datelor cauzate de cderi de tensiune sau dezastre naturale);
152

Programarea rapid a aplicaiilor pentru baze de date relaionale

2. Trebuie s asigure integritatea logic (protecia structurii logice a bazei de date); 3. Datele trebuie s fie disponibile cnd este nevoie de ele; 4. Baza de date trebuie s aib un sistem de auditare; 5. Trebuie s fie asigurat integritatea datelor; 6. Accesul trebuie s se realizeze pe nivele n funcie de tipul datelor coninute; 7. Baza de date trebuie s permit autentificarea utilizatorilor la intrarea n sistem; 8. Datele sensibile trebuie s fie protejate mpotriva accesului neautorizat. Scopul securizrii unei baze de date este de a se asigura faptul c datele stocate n baza de date sunt protejate mpotriva accesului neautorizat, modificri neautorizate i actualizri nepermise. Aceasta poate fi realizat utiliznd controlul accesului, controlul concurent, actualizri utiliznd proceduri care realizeaz actualizarea n dou faze (aceasta rezolv problema integritii bazei de date aprute n urma unei cderi de tensiune n timpul unei tranzacii). Nivelul de restricionare a accesului depinde de sensibilitatea datelor i de gradul n care dezvoltatorul ader la principiul celui mai mic privilegiu (accesul este limitat doar la articolele necesare rezolvrii sarcinilor atribuite). n mod tipic, un grilaj (lattice) este pstrat n SGBD (Sistemul de Gestiune al Bazei de Date), i care stocheaz privilegiile de acces ale utilizatorilor individuali. Astfel, cnd un utilizator se logheaz, interfaa obine de la SGBD privilegiul de securitate specific fiecrui utilizator. Nivelurile de acces pot fi modelate prin satisfacerea uneia sau mai multora dintre urmtoarele criterii: 1. Disponibilitatea datelor indisponibilitatea datelor este o cauz comun a blocrii unui element de date particular de ctre un alt subiect, care foreaz subiectul care face cererea s atepte ntr-o coad; 2. Acceptarea accesului numai utilizatorii autorizai pot vizualiza sau modifica datele. ntrun sistem cu un singur nivel de securitate, acest lucru este relativ uor de implementat. Dac utilizatorul este neautorizat, sistemul de operare nu-i acord accesul n sistem. Pe un sistem cu nivele multiple de securitate, controlul accesului este mult mai dificil de implementat, deoarece SGBD trebuie s impun difereniat privilegiile de acces ale utilizatorilor; 3. Sigurana autenticitii Aceasta include restricia accesului la orele normale de lucru pentru a se asigura c utilizatorul nregistrat este cel care pretinde c este. De asemenea, aceasta include i analiza activitilor utilizatorului n sistem, aceasta reducnd probabilitatea unor atacuri.

153

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

Probleme de securitate specifice bazelor de date distribuite

n dezvoltarea bazelor de date distribuite, una dintre primele ntrebri care necesit un rspuns este unde s se aloce drepturile de acces. Exist astfel trei posibiliti de alocare a drepturilor de acces.

Utilizatorilor le este acordat acces n sistem de la site-ul lor de acas. Aceast strategie este uor de implementat, nefiind cu mult mai dificil de implementat dect o strategie cu acces centralizat. Succesul acestei strategii depinde de ncrederea comunicaiei dintre diferite site-uri (site-ul aflat la distan trebuie s primeasc toate informaiile necesare). Deoarece multe site-uri diferite pot s aloce drepturi de acces, probabilitatea accesurilor neautorizate crete. O dat ce un singur site a fost compromis, ntregul sistem este compromis. Dac fiecare site menine controlul accesului pentru toi utilizatorii, impactul compromiterii unui singur site este redus.

Utilizatorilor le este acordat acces n sistem de la un site aflat la distan. Aceast strategie asigur o securitate ridicat, dar are cteva dezavantaje. Probabil, cel mai important dezavantaj este acela c sunt necesare procese adiionale pe palierele superioare. De asemenea, operaiunile care au loc necesit participarea ctorva site-uri. n plus de aceasta, meninerea corect a copiilor tabelelor este mult mai scump i mult mai predispuns la erori.

Acordarea privilegiilor cu drepturi de acces se face centralizat n anumite noduri ale reelei denumite servere de politici (policy servers). Aceste servere sunt aranjate n reea. Cnd un server de politic primete o cerere de acces toi membrii din reea determin dac accesul utilizatorului este autorizat.
Tranzacii

Atunci cnd unei baze de date i se aplic o prelucrare, n general aceasta trece prin diferite stri tranzitorii n timpul crora anumite restricii de integritate nu mai sunt verificate. Pentru a izola unitile de prelucrare care respect coerenta bazelor de date, se introduce noiunea de tranzacie.
Tranzacia este unitatea de prelucrare secvenial, executat in contul unui utilizator

care aplicat unei baze de date coerent, restituie o baz de date coerent. Restriciile de integritate sunt ntotdeauna invariani pentru tranzacii. Un sistem de baze de date execut in general o mulime de tranzacii simultan pentru diveri utilizatori. Problemele de concuren apar din cauza interferenelor care pot surveni ntre aceste tranzacii diverse asupra datelor partajate. Datele sunt deci actualizate prin uniti de prelucrare care respect coerena bazei de
154

Programarea rapid a aplicaiilor pentru baze de date relaionale

date, numite tranzacii. O tranzacie este compus dintr-o unitate de prelucrare mai fin numit aciune.
Aciunea este o comand invizibil executat de ctre sistem, n cadrul unei tranzacii.

Exemplu: citirea unei date in memorie (READ x x1), sau scrierea in baz (WRITE x1 x) sunt in general aciuni.
Probleme de concuren

Un prim exemplu bine cunoscut de probleme ridicate la execuia simultan a tranzaciilor este pierderea de operaii. Cazul cel mai tipic este pierderea unei actualizri. Aceast problem rezult din faptul c o tranzacie poate, n timpul execuiei unei aciuni ai s citeasc un obiect ntr-un tampon care-i aparine, apoi s modifice acest obiect (sau simplu sl rescrie) in timpul unei aciuni aj (j > i), pornind de la valori citite anterior, in timp ce o actualizare ak a acestui obiect a fost realizat printr-o alt tranzacie ntre aciunile ai si aj. n acest caz, actualizarea ak este pierdut. O asemenea situaie este prezentat in figura 2. O problem similar este confuzia de identitate care poate surveni cnd o tranzacie conserv o referin la o dat distrus printr-o alt tranzacie. Tranzacia T1 a i: Read Xx1 ak : x1+1x1 Write x1X Tranzacia T2 Read Xx2 x2+1x2 Write x2X

a j:

Timp Figura 2. Exemplu de pierdere de operaie Un al doilea tip de problem este ridicat de existenta restriciilor de integritate. Aceast problem, numit inconsisten, survine de fiecare dat cnd o tranzacie observ sau modific greit o stare tranzitorie a bazei de date, fiind caracterizat de faptul c o restricie de integritate nu este verificat. Un prim exemplu de inconsisten este prezentat n figura 3. A i B sunt dou date care trebuie s verifice restricia A=B. Tranzacia T2 observ pe A dup ce ea a fost modificat prin T1 si pe B nainte ca ea s fi fost modificat prin T1. Astfel T2 imprim o valoare pentru A diferit de cea a lui B. Un al doilea exemplu mai grav deoarece el provoac distrugerea bazei de date este prezentat in figura 4. Aici, T actualizeaz o stare tranzitorie incoerent caracterizat prin A=B. Inconsistenele pot fi produse de asemenea prin tranzacii datorit nereproductibilitii citirilor. ntr-adevr, o tranzacie poate citi de dou ori accei dat i poate gsi dou valori diferite datorit faptului c data a fost modificat printr-o tranzacie concurent ntre dou citiri.
155

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

Fig. 5 ilustreaz aceeai situaie: T1 imprim dou valori diferite pentru aceeai dat A. T1 A=B Read Aa1 a1+1a1 Write a1A T2

Timp Figura 3. Exemplu de observare a inconsistenelor T1 A=B Read A a1 a1+1 a1 Write a1 A T2

Read Bb1 b1+1 b1 Write b1 B

Read Aa2 Print a2 Read Bb2 Print b2

Timp Figura 4. Exemplu de introducere de inconsistene ntr-o baz de date T1 Read A a1 Print a1 T2 Read A a2 a2+1 a2 Write a2

Read B b1 b1+1 b1 Write b1 B

Read A a2 a2 *2 a2 Write a2 A Read B b2 b2 *2 b2 Write b2 B

Read A a1 Print a1

Timp Figura 5. Nereproductibilitatea citirilor

Tranzacii n baze de date distribuite

Datele ntr-un sistem de baze de date distribuite sunt stocate pe mai multe maini i datele de pe fiecare main sunt gestionate de un SGBD care poate exista independent de celelalte maini. Concepia clasic despre un sistem de baze de date distribuite este aceea c
156

Programarea rapid a aplicaiilor pentru baze de date relaionale

sistemul ar trebui s fac impactul distribuiei datelor transparent pentru utilizator. n particular, urmtoarele proprieti sunt considerate a fi de dorit:
independena datelor distribuite: Utilizatorii ar trebui s poat interoga baza de date fr

s spun unde sunt localizate tabelele, relaiile referite sau fragmente de relaii. Acest principiu este o extindere natural a independentei logice i fizice a datelor. Mai mult, interogri care se propag asupra mai multor maini ar trebui s fie optimizate n mod sistematic ntr-o manier bazat pe cost, lund n considerare costurile datorate comunicrii i diferenele dintre costurile calculelor locale.
atomicitatea tranzaciilor distribuite: Utilizatorii ar trebui s poat s scrie tranzacii care

acceseaz i actualizeaz datele pe mai multe maini ca i cnd ar fi scris tranzacii asupra datelor locale. n particular, efectele tranzaciilor distribuite pe mai multe maini ar trebui s continue s fie atomice; cu alte cuvinte, toate modificrile rmn valabile dac tranzacia a fcut COMMIT i nici una nu rmne dac ea a fost nereuit. Dei proprietile de mai sus sunt de dorit, n anumite situaii, de exemplu, cnd mainile sunt conectate de o reea nceat pe o distan mare, aceste proprieti nu sunt uor de obinut. Cnd mainile sunt complet distribuite, aceste proprieti nici nu mai sunt de dorit. Dac datele sunt distribuite, dar toate serverele ruleaz acelai SGBD, avem un sistem de baze de date distribuite omogen. Dac pe calculatoare diferite ruleaz SGBD-uri diferite, autonome i sunt conectate mpreun pentru a accesa datele de pe mai multe maini, vom avea un sistem de baze de date distribuite heterogen sau un sistem multi-baz de date. Pentru construcia sistemelor heterogene trebuie s avem standarde general acceptate pentru gateway-uri. Gateway-urile sunt pachete soft care accept cereri (ntr-un format SQL), le trimite la SGBD-ul local i apoi returneaz rspunsul la client (ntr-un format standard). Accesnd servere de date prin gateway-uri, diferenele dintre ele (capabiliti, formatul datelor, etc.) sunt mascate i diferitele servere dintr-un mediu distribuit sunt legate la un grad nalt. Exist, n principiu, dou tipuri de arhitecturi pentru bazele de date distribuite. Prima arhitectur este reprezentat de sistemele client-server. Un sistem client-server are unul sau mai multe procese client i unul sau mai multe procese server, iar clientul poate trimite o interogare la oricare proces server. Clienii sunt responsabili pentru interfaa cu utilizatorul, iar serverele ntrein datele i execut tranzacii. De aceea un proces client poate rula pe un calculator personal i poate trimite datele la un server funcional pe un mainframe. A doua arhitectur de sisteme de baze de date distribuite este format din mai multe servere care colaboreaz ntre ele. n aceast arhitectur, fiecare server este capabil s execute tranzacii asupra datelor locale i prin colaborare ele pot executa i tranzacii care s se ntind
157

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

pe mai multe maini. Cnd un server primete o interogare care necesit accesul la datele de pe alte servere, genereaz subquery-uri care s fie executate de celelalte servere i pune rezultatele mpreun pentru a da un rspuns la interogarea original.
Managementul tranzaciilor distribuite

ntr-un SGBD distribuit, o anumit tranzacie este pornit pe o anumit main, dar ea poate s acceseze datele de pe alt main. n cele ce urmeaz, vom numi subtranzacie, partea din activitatea unei tranzacii care se refer numai la datele de pe un calculator. Cnd o tranzacie este pornit pe un calculator, managerul de tranzacii de aici mparte tranzacia ntro colecie de una sau mai multe subtranzacii care se execut pe maini diferite, le trimite spre execuie managerilor de tranzacii de pe celelalte maini i coordoneaz activitatea lor. Ne propunem ca n continuare s rspundem la urmtoarele ntrebri/aspecte: [HOFFER,2002]
Controlul concurenei distribuite: Cum pot fi gestionate blocrile de obiecte stocate pe alte

maini dect cea local? Cum pot ti detectate deadlock-urile ntr-o baz de date distribuit?
Refacerea datelor n baze de date distribuite: Atomicitatea tranzaciei trebuie s fie

asigurat- cnd o tranzacie face commit, toate aciunile sale de pe toate mainile pe care se execut tranzacia trebuie s fie persistente. Analog, dac o tranzacie face abort (este nereuit), nici una din aciunile sale nu trebuie s fie persistente.
Controlul concurenei distribuite

ntr-un mediu concurent, momentul n care se obine un blocaj asupra unui obiect i momentul n care se renun la el (are loc deblocarea) este determinat de protocolul de control a concurenei. Managementul blocrilor poate fi distribuit pe mai multe maini n multe feluri:
Centralizat: o singur main este responsabil de tratarea cererilor de blocare/deblocare

pentru toate obiectele.


Copie primar: o copie a fiecrui obiect este desemnat ca fiind copia primar. Toate

cererile de blocare/deblocare a unei copii a acestui obiect sunt tratate de managerul de blocaje (lock manager) de pe maina unde este stocat copia primar a obiectului (indiferent de locul unde se afl copia care se vrea blocat).
Complet distribuit: cererile de blocare sau deblocare a unei copii a unui obiect stocat pe o

anumit main sunt tratate de managerul de blocaje de pe maina unde este stocat copia. Schema centralizat este vulnerabil la cderea mainii care controleaz blocajele. Schema cu copie primar evit aceast problem, dar n general, citirea unui obiect, n acest caz, nseamn comunicarea cu dou maini: maina unde este salvat copia primar a obiectului i maina unde se afl copia care se citete. Aceast problem este evitat n schema complet
158

Programarea rapid a aplicaiilor pentru baze de date relaionale

distribuit deoarece blocarea se face pe maina unde este stocat copia care se citete. Cu toate acestea, la scriere, trebuiesc setate blocaje pe toate mainile unde sunt modificate copii n cazul schemei complet distribuite, pe cnd la celelalte dou scheme blocajul e necesar numai la o main.
Deadlock distribuit

Un aspect care necesit atenie sporit cnd se folosete schema cu copie primar sau cea complet distribuit este detecia deadlockurilor. n orice SGBD deadlock-urile trebuie detectate i rezolvate (renunnd la anumite tranzacii care au cauzat deadlock- ul). Fiecare main menine un graf local cu obiectele care ateapt (depind) de alte obiecte i, bineneles, un ciclu n acest graf indic un deadlock. Oricum, un deadlock se poate ntmpla i dac nu exist nici un ciclu ntr-un graf local. S presupunem, de exemplu, c avem dou maini, A i B, amndou coninnd copii ale obiectelor 01 i 02 i c folosim n tranzacii tehnica "readany, write-a1l". Tranzacia T1, care vrea s citeasc 01 i s scrie 02, obine un blocaj pe obiectul 01 i altul pe 02 pe maina A i cere un blocaj pe obiectul 02 la maina B. ntre timp, tranzacia T2 care vrea s citeasc 02 i s scrie 01 obine o blocare pe obiectul 02 i una pe 01 la maina A. Dup cum se vede n figura de mai jos, tranzacia T1 ateapt dup T2 la maina B, iar T2 ateapt dup T1 la maina A; deci avem un deadlock care nu poate fi detectat bazndu-ne numai pe grafe de ateptare locale.

T1 Maina A

T2

T1 Maina B

T2

T1

T2

Graf de ateptare global

Pentru a detecta astfel de deadlock-uri globale trebuie s folosim un algoritm de detecie a deadlock-urilor distribuite. Vom descrie trei astfel de algoritmi.
Primul algoritm este centralizat i consist n trimiterea periodic a tuturor grafelor de

ateptare locale la o main care este responsabil cu detecia deadlock-utilor globale. La aceast main, graful de ateptare global este generat prin combinarea tuturor grafelor de ateptare locale. Mulimea nodurilor este reuniunea nodurilor din grafele locale i exist cte o muchie de la un nod la altul dac exist o muchie de acest fel ntr-unul dintre grafele locale.
Al doilea algoritm este ierarhic i grupeaz mainile din mediul distribuit ntr-o ierarhie.

Fiecare nod din ierarhie construiete un graf de ateptare pentru descoperirea deadlockurilor care implic numai mainile coninute n subarborele acestui nod. Astfel, toate mainile trimit periodic graful de ateptare local la maina responsabil pentru construirea grafului de ateptare global. Acest algoritm se bazeaz pe observaia c deadlock-urile se
159

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

ntmpl n mod frecvent ntre mainile vecine. Toate deadlock-urile vor fi n final detectate, doar c unele mai repede dect altele.
Al treilea algoritm opereaz astfel: dac execuia unei tranzacii dureaz mai mult dect o

valoare de time-out, atunci ea este terminat (aborted). Dei acest algoritm poate cauza multe restartri care nu sunt neaprat necesare, ncrcarea datorat deteciei deadlockurilor este mic i n baze de date distribuite heterogene n care mainile nu pot s schimbe grafe de ateptare ea este singura opiune. O observaie n ce privete detecia deadlock-urilor distribuite: ntrzieri n propagarea informaiilor locale poate determina algoritmul de detectare a deadlock-urilor s identifice deadlock-uri care de fapt nu exist (aa numitele phantom deadlocks) i s provoace abort-uri nenecesare.
Refacerea datelor n urma tranzaciilor euate

Recuperarea datelor ntr-un SGBD distribuit comport o complexitate mai mare dect n cazul SGBD-urilor centralizate datorit urmtoarelor motive:
pot aprea noi tipuri de defecte (cderea reelei, cderea unei staii remote pe care se

execut o subtranzacie etc.) [FRANKLIN,1996]


fie toate subtranzaciile unei tranzacii fac commit, fie nici una i aceast proprietate trebuie

garantat n ciuda cderii unei legturi sau a unui host. Aceast proprietate este garantat prin folosirea unui protocol de commit. Att ntr-un SGBD centralizat ct i ntr-unul distribuit, anumite aciuni trebuiesc efectuate ntr-o execuie normal pentru a se obine informaiile necesare pentru recuperarea datelor n cazul unei erori. Pe lng aceste informaii, ntr-un SGBD distribuit se mai in fiiere de loguri la fiecare main din sistem. Cel mai folosit protocol de commit este TwoPhase Commit (2PC). O variant a acestuia, numit 2PC with presumed abort a fost adoptat ca standard industrial.
Two-Phase Commit Protocol (2PC)

n timpul unei execuii normale, fiecare main din sistem menine loguri ale aciunilor/subtranzaciilor care au loc. Pe lng aceasta, este urmat un protocol de commit pentru a garanta faptul c toate subtranzaciile unei tranzacii date fie fac commit, fie abort n mod uniform. Managerul de tranzacii de pe staia de unde este originar tranzacia se numete coordonator pentru toate tranzaciile; managerii de tranzacii de pe mainile unde se execut subtranzacii se numesc subordonai. Protocolul 2PC presupune un schimb de mesaje ntre hosturi i scrierea de loguri. Cnd utilizatorul decide s realizeze tranzacia, comanda commit este trimis la coordonatorul tranzaciei. Aceasta iniializeaz protocolul 2PC:
160

Programarea rapid a aplicaiilor pentru baze de date relaionale

1. Coordonatorul trimite un mesaj prepare la fiecare subordonat. 2. Cnd un subordonat primete mesajul prepare, decide ce s fac cu subtranzacia: s realizeze commit sau abort. Scrie apoi un log abort sau un log prepare (n cazul n care a decis commit) i apoi trimite un mesaj yes sau no la coordonator. 3. Dac coordonatorul primete rspunsul yes de la toi subordonaii, scrie un log commit i apoi trimite mesajul commit la toi subordonaii. Dac, n schimb, primete cel putin un rspuns no sau nu primete rspuns de la unii subordonai ntr-un interval de timp (timeout), el va scrie un log abort i apoi trimite mesajul abort la toi subordonaii. 4. Cnd un subordonat primete un mesaj abort, scrie un log abort, trimite un mesaj ack la coordonator i termin subtranzacia (abort). Cnd un subordonat primete mesajul commit, scrie un log commit, trimite coordonatorului un mesaj ack i face commit la subtranzacie. 5. Cnd un coordonator primete mesaje ack de la toi subordonaii, scrie un log se sfrit pentru tranzacie. Numele two-phase commit reflect faptul c dou runde de mesaje sunt schimbate: prima dat are loc o faz de pregtire (votare) a commit-ului, apoi o faz de terminare, amndou fiind iniiate de coordonator. Principiul de baz este ca oricare dintre managerii de tranzacii implicai (coordonator i subordonai) pot termina (abort) unilateral tranzacia, dar pentru commit trebuie acordul tuturor. nainte de a trimite un mesaj conform protocolului 2PC se scrie un log cu decizia respectiv tocmai pentru a garanta faptul c decizia supravieuiete chiar dac staia sufer vreo defeciune fatal. O tranzacie este oficial ncheiat (commited) n momentul n care log-ul commit al coordonatorului este scris pe suport. Alte erori/esecuri care mai pot aprea dup acest moment nu mai afecteaz tranzacia; este irevocabil "comis". nregistrrile de log conin tipul nregistrrii, id-ul tranzaciei i identitatea coordonatorului.
Refacerea datelor (recovery) dup o defeciune grav

Cnd o staie revine on-line dup o defeciune grav/restart, SGBD-ul invoc un proces de refacere a datelor care citete logurile i proceseaz toate tranzaciile care executau protocolul de commit cnd a aprut defeciunea. Managerul de tranzacii (Transaction Manager) al acestei staii ar fi putut fi coordonatorul pentru unele din aceste tranzacii i subordonatul pentru altele. Procesul de refacere a datelor urmrete liniile:
dac avem un log de commit sau abort pentru tranzacia T, starea ei este clar; mai

executm odat tranzacia, respectiv refacem datele dinaintea tranzaciei. Dac staia curent este coordonatorul (lucru care poate fi determinat din logurile commit i abort), trebuie s retrimitem n mod periodic - deoarece pot exista alte legturi sau staii czute -

161

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

un mesaj commit sau abort la fiecare subordonat pn cnd primim un ack; dup ce am primit un ack, scriem un log de sfrit de tranzacie pentru T.
dac avem un log prepare pentru tranzacia T, dar nu avem log de commit sau de abort,

nseamn c staia este un subordonat i coordonatorul l aflm din logul prepare. Trebuie, apoi, s contactm n mod repetat pe coordonatorul tranzaciei ca s determinm starea tranzaciei T. Dup ce coordonatorul rspunde fie cu commit, fie cu abort, o s scriem un log corespunztor, re-executm tranzacia sau refacem datele dinaintea tranzaciei - n funcie de rspunsul dinainte - i apoi scriem logul de sfrit de tranzacie pentru T.
dac nu avem n loguri nici prepare, nici commit, nici abort pentru tranzacia T, n mod

sigur T nu a trecut de prima faz a protocolului 2PC pn n momentul n care s-a produs defeciunea; deci putem s facem abort i s refacem datele, iar apoi s scriem un log de sfrit de tranzacie. n cazul acesta nu avem cum s determinm dac staia este coordonator sau subordonat pentru T. Oricum, dac staia aceasta este coordonator, sete posibil s fi trimis un mesaj prepare nainte de defeciune i, dac este aa, alte staii ar fi putut s voteze yes. Dac un asemenea subordonat contacteaz procesul de refacere a datelor de pe staia curent, acum tim c staia curent este un coordonator pentru T i, fiindc nu este nici un log de abort sau commit, rspunsul ctre subordonat trebuie s fie abort T. Se poate observa c dac coordonatorul pentru tranzacia T eueaz, subordonaii care au votat yes nu pot decide ce s fac cu tranzacia T, commit sau abort, pn cnd coordonatorul revine on-line - n acest caz se spune c T este blocat. n principiu, staiile subordonate active pot comunica ntre ele i dac cel puin una dintre ele conine un log de abort sau commit pentru tranzacia T, starea lui T devine global cunoscut. Ca s comunice unul cu celalalt, toi subordonaii trebuie s cunoasc identitatea celorlali subordonai la momentul n care au primit mesajul prepare. Cu toate acestea, protocolul 2PC rmne vulnerabil la defeciunea coordonatorului n timpul procesului de refacere a datelor, deoarece chiar dac toi subordonaii au votat yes, coordonatorul care are i el un vot ar fi putut decide s fac abort la tranzacia T i aceast decizie nu poate fi determinat pn cnd coordonatorul nu revine on-line. Am discutat mai sus modul n care o staie reface datele dup o defeciune fatal, dar ce ar trebui s fac o staie implicat ntr-un protocol de commit dac se pierde legtura cu o alt staie cu care comunic? Dac staia curent este coordonator ar trebui sa fac abort la tranzacie. Dac ns, staia curent este un subordonat i nc nu a rspuns la mesajul prepare al coordonatorului atunci trebuie s fac abort la tranzacie. Dac este un subordonat i a votat yes, atunci nu poate, n mod unilateral, s fac abort la tranzacie i nici nu poate face commit
162

Programarea rapid a aplicaiilor pentru baze de date relaionale

- staia este blocat; ea trebuie s contacteze periodic pe coordonator pn cnd primete un rspuns. Cderile de linii de comunicaie sunt vzute de staiile active ca i defeciuni ale staiilor cu care comunic i, deci, soluiile de mai sus se aplic i n cazul acesta.
Three-Phase Commit

Un protocol de commit numit three-phase commit (3PC) poate evita blocarea chiar dac staia coordonator sufer o defeciune fatal n timpul refacerii datelor (recovery). Ideea de baz este c atunci cnd coordonatorul trimite un mesaj prepare i primete un vot yes de la toi subordonaii, el trimite la toate staiile un mesaj precommit, nu un mesaj commit. Cnd un numr suficient de ack au fost recepionai, coordonatorul scrie un log commit i trimite un mesaj commit la toi subordonaii. n 3PC coordonatorul amn efectiv decizia de a face commit pn cnd este sigur c destule staii tiu despre decizia de a face commit; dac coordonatorul se defecteaz de mai multe ori, aceste staii pot comunica una cu cealalt i pot detecta faptul c tranzacia trebuie "commisa" -sau abort dac nici una dintre ele n-a primit un mesaj precommit - fr s mai atepte pn coordonatorul revine on-line. Protocolul 3PC impune un cost adiional semnificativ n timpul execuiei normale i cere ca cderile de linii de comunicaii s nu duc la o partiionare a reelei (atunci cnd unele staii nu se mai pot conecta la altele prin nici o cale) pentru ca s asigure eliberarea de blocaje. Din acest motiv, nu prea este folosit n practic.
Algoritmi de control al concurenei bazelor de date distribuite

Integritatea bazelor de date distribuite poate fi afectat cel mai des n cazul unui acces concurent la date. Dac cererile de acces la baza de date sunt de tipul regsire, atunci secvenializarea accesului la mediul de memorare este suficient pentru a nu mai fi nevoie de alte precauii. Situaia se schimb atunci cnd se fac modificri asupra datelor, i anume cnd mai muli utilizatori acceseaz aceiai resurs pentru o actualizare. Un exemplu tipic este sistemul de rezervare a locurilor, unde mai muli ageni fac rezervri simultan i deci modific permanent lista locurilor libere i lista rezervrilor. n lipsa unui control adecvat al cererilor de acces exist pericolul ca acelai loc s fie rezervat de mai multe ori. Acest lucru este posibil deoarece n intervalul de timp de la acceptarea unei anumite cereri de rezervare pe un loc anume i pn la rezolvarea acesteia (eliminarea locului cu pricina din lista de locuri libere) ar putea fi acceptate i rezolvate alte cereri de rezervare pentru acelai loc. Deci dou procese care citesc i modific valoarea aceluiai obiect ar putea interaciona n mod nedorit atunci cnd sunt executate simultan. Pentru evitarea acestor interaciuni este necesar impunerea unor restricii asupra execuiei concurente a proceselor care execut operaii de citire i de modificare a datelor.

163

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

Desigur, calea cea mai simpl pentru a realiza acest lucru, este i cea mai ineficient, deoarece minimizeaz eficiena sistemului. Aceasta este de a executa tranzaciile n mod independent, una dup cealalt. Nivelul de concuren (numrul de tranzacii executate concurent), este unul dintre cei mai importani parametrii pentru caracterizarea unui sistem de baze de date, i de aceea mecanismele de control al concurenei urmresc realizarea unui compromis ntre meninerea consistenei bazei de date i obinerea unui nivel de concuren ct mai ridicat.
Anomalii de interferen n bazele de date distribuite

Dou sau mai multe tranzacii asupra unei BDD poate conduce la apariia unor stri inconsistente ale bazei de date dac acestea nu sunt controlate, i la apariia unor rezultate inconsistente. Dac avem dou tranzacii Ti i Tj spunem c sunt susceptibile de interferen dac rezultatul execuiei concurente a acestora poate fi diferit de rezultatul execuiei seriale. Acestea pot aprea atunci cnd Ti i Tj efectueaz operaii asupra unor date comune. Spunem c dou tranzacii Ti i Tj sunt conflictuale, dac ele sunt efectuate n mod concurent. Anomaliile de interferen pot fi:
Anomalii de actualizare pierdute; Anomalii de citire improprie; Anomalii de citire neproductibil. Anomalii de actualizare pierdut

Acest tip de anomalie corespunde unui conflict de tip scriere scriere. Ea const n faptul c rezultatul actualizrii efectuate de o tranzacie se pierde ca urmare a reactualizrii aceleiai date de ctre o alt tranzacie, fr ca reactualizarea s fie influenat de rezultatul primei actualizri. Exemplu: avem dou tranzacii T1 i T2 i urmtoarea secven de execuie concurent: T1 Citete Data; Data = Data + 25; Scrie Data; Data = Data + 10; Scrie Data; n urma acestor instruciuni variabila Data ar trebui mrit cu 25 + 10 = 35, dar la final se observ c aceast variabil este mrit cu 10.
Anomalii de citire improprie

T2 Citete Data;

Acest tip de anomalie corespunde unui conflict de tip citire-scriere i apare atunci cnd o tranzacie surprinde o stare temporar inconsistent a bazei de date.

164

Programarea rapid a aplicaiilor pentru baze de date relaionale

Exemplu: avem urmtoarea secven de instruciuni concurente pentru dou tranzacii T1 i T2 : T1 T2 Citete Data1; Data1 = Data1 - 25; Scrie Data1; Citete Data1; Citete Data2; Data3 = Data1 + Data2; Scrie Data3; Citete Data2; Data2 = Data2+25; Scrie Data2; n aceast secven, valoarea sumei Data1+Data2 este aceiai nainte i dup execuia de mai sus. Se dorete a se reine n Data3 valoarea acestei sume, dar datorit interferenei valoarea Data3 este cu 25 mai mic dect cea real.
Anomalii de citire nereproductibil

Corespunde unui conflict de tip citire-scriere i apare atunci cnd aceeai tranzacie gsete valori diferite la citiri repetate ale aceleiai date. Exemplu: avem urmtoarea execuie concurent a dou tranzacii T1 i T2 : T1 Citete Data1; Data2 = Data1; Citete Data2; T2

Citete Data1; Data1=Data1+25; Scrie Data1; Citete Data1; Data3 = Data1; Scrie Data3; n urma execuiei tranzaciei T1 valorile rezultate pentru Data2 i Data3 ar trebui s fie egale, ns ele sunt diferite datorit interferenei cu tranzacia T1.
Serializabilitatea n bazele de date distribuite

Prin execuia concurent a mai multor tranzacii se pot obine rezultate diferite fa de situaia n care fiecare tranzacie este executat independent. n mod firesc se consider corect rezultatul obinut prin execuia independent a tranzaciilor. O astfel de execuie o numim execuie serial. O planificare a unui set de tranzacii este o ordine de execuie a unor pai elementari (LOCK, READ, WRITE) ai tranzaciei setului. O planificare spunem c este serial dac toi paii oricrei tranzacii apar n poziii consecutive ale planificrii. O asemenea planificare determin o execuie serial, fr interferene a tranzaciilor. O

165

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

planificare se numete serializabil dac i numai dac efectul ei este echivalent cu cel al unei planificri seriale. Exemplu: Dac avem dou tranzacii T1 i T2 definite prin secvenele de operaii: T1: READ A; A=A-10;WRITE A; READ B; B=B+10;WRITE B; T2: READ B; B=B-20;WRITE B; READ C; C=C+20;WRITE C. Orice planificare serial a tranzaciilor celor dou are proprietatea c suma A+B+C rmne nemodificat. n tabelul de mai jos, prezentm trei planificri diferite ale tranzaciilor T1 i T2 :serial, serializabil i neserealizabil: Serial Serializabil Neserializabil T1 T2 T1 T2 T1 T2 READ A READ A READ A A=A-10 READ B A=A-10 WRITE A A=A-10 READ B READ B B=B-20 WRITE A B=B+10 WRITE A B=B-20 WRITE B WRITE B READ B READ B READ B WRITE B B=B-20 READ C B=B+10 WRITE B B=B+10 READ C Serial Serializabil Neserealizabil READ C C=C+20 WRITE B C=C+20 WRITE B C=C+20 WRITE C WRITE C WRITE C Tabel 1 Planificri pentru tranzaciile T1 i T2 Dup execuia planificrii neserealizabile, suma A+B+C este mrit cu 20 ca urmare a pierderii actualizrii lui B (WRITE B) din tranzacia T2 .
Serializibilitatea n baze de date distribuite nereplicate

n cazul bazelor de date distribuite, nereplicate, ordinea de execuie a tranzaciilor n fiecare nod este reprezentat printr-o planificare local. Dac baza de date este nereplicat i planificrile locale ale tuturor nodurilor sunt serializabile, atunci planificarea global, rezultat din reuniunea tuturor planificrilor locale, este la rndul ei serializabil att timp ct planificrile locale prevd aceeai ordine de serializare pentru tranzacii comune.
Serializibilitatea n baze de date distribuite replicate

ntr-o baz de date distribuit replicat (n care pentru aceiai dat apar mai multe copii n noduri diferite) este posibil ca planificrile locale s fie seriale i cu toate acestea consistena mutual a datelor s fie compromis. Consistena mutual a tuturor copiilor datelor replicate presupune faptul c, cel puin din punctul de vedere al utilizatorului, aceste copii sunt permanent identice. Pentru aceasta, nu
166

Programarea rapid a aplicaiilor pentru baze de date relaionale

este suficient ca planificrile locale nodurilor s fie serializabile, ci este necesar ca planificarea global s fie serializabil. Trebuie realizate, astfel urmtoarele condiii: 1. Fiecare planificare local trebuie s fie serializabil; 2. Oricare dou operaii conflictuale trebuie s fie n aceeai ordine relativ n toate planificrile locale care apar mpreun. garanteaz faptul c ordinea de serializare a dou tranzacii este aceeai n toate nodurile n care acestea se execut mpreun. n cazul bazelor de date replicate, apare i problema suplimentar a meninerii consistenei mutuale a copiilor aceleiai date. Aceasta nseamn c orice actualizare a unei copii trebuie propagat i asupra celorlalte n aa fel nct rezultatele s fie identice. Asigurarea acestor condiii este garantat prin protocoale de control al replicilor. n esen un protocol de control al replicilor acioneaz n modul descris n cele ce urmeaz. Dac avem o dat x i x1, x2, , xn copii ale acesteia. Data x va fi referit ca dat logic, iar copiile sale vor fi referite ca date fizice. Utilizatorii vor lansa operaii de acces (citire sau scriere) referindu-se la data logic x. Protocolul de control al replicilor are rolul de a transforma orice operaie de acces la o dat logic n operaii echivalente asupra datelor fizice. Modul concret de realizare a acestei transformri depinde de particularitile fiecrui protocol de control al replicilor. Astfel, pentru bazele de date distribuite replicate este necesar satisfacerea a dou criterii de corectitudine:
Controlul replicilor din punct de vedere al utilizatorilor, setul de copii ale unei date

logice se comport ca i cnd ar fi o singur copie a datelor respective


Controlul concurenei prin care efectul execuiei concurente a mai multor tranzacii este

echivalent cu efectul execuiei seriale ale acelorai tranzacii.


Algoritmi de blocare distribuit

Gestiunea operaiilor de blocare este realizat printr-o component a SGBD numit lock manager. n cazul bazelor de date distribuite replicate aceast gestiune este mai complex deoarece presupune transformarea cererilor de blocare lansate de ctre utilizator asupra unor date logice n operaii de blocare a datelor fizice. Astfel, fiecare nod al unei baze de date are cte un look manager care gestioneaz operaiile de blocare locale, dar care n plus, posed i faciliti de cooperare i cooperare cu look manager-urile locale din celelalte noduri n vederea implementrii protocolului de control al replicilor. Dac o dat are mai multe copii fizice distribuite n diferite noduri, translatarea unei cereri de blocare a acesteia n operaii de blocare a datelor fizice se poate face dup mai multe protocoale de control al replicilor. Cte dintre aceste protocoale sunt prezentate mai jos.
167

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

a) Protocolul Write-Locks-All_Read-Lock-One

Acest protocol, este definit prin urmtoarele reguli impuse tranzaciilor: 1. Pentru ca o tranzacie s obin o blocare pentru citire (RLOCK(x)) asupra unei date logice x, este suficient s obin o blocare pentru citire (RLOCK(xi)) asupra unei copii oarecare xi a lui x. 2. Pentru ca o tranzacie s obin blocarea pentru scriere (WLOCK(x)) a unei date logice x, este necesar s obin blocarea pentru scriere (WLOCK(xi)) a tuturor copiilor xi a lui x. Efectul combinat al regulilor de mai sus, mpreun cu regulile locale din fiecare nod este c nu pot exista dou tranzacii care s blocheze simultan aceiai dat logic x, dac cel puin una dintre blocri este pentru scriere. Acest protocol necesit 2n mesaje de control i n mesaje de date pentru scriere, respectiv 2 mesaje de control i unul de date pentru citire.
b)Protocolul de blocare majoritar

Este un protocol, care este definit prin urmtoarele reguli impuse tranzaciilor: 1. Pentru ca o tranzacie s obin o blocare pentru citire (RLOCK(x)) asupra unei date logice x, este necesar s obin blocarea pentru citire (RLOCK(xi)) a majoritii copiilor xi ale lui x. 2. pentru ca o tranzacie s obin blocarea pentru citire (WLOCK(x)) a unei date logice x, este necesar s obin blocarea pentru scriere (WLOCK(xi)) a majoritii copiilor xi ale lui x. Protocolul de blocare majoritar asigur excluderea mutual la nivelul datei logice x, deoarece nu pot exista dou tranzacii care s blocheze simultan data logic x, dac una dintre blocri este pentru scriere. Acest protocol necesit cel puin n+1 mesaje de control i n mesaje de date pentru o operaiune de scriere. Pentru citire sunt necesare tot n+1 mesaje de control dar numai un singur mesaj de date.
c) Protocolul nodului central

Acest protocol este cel mai simplu dintr-o clas de protocoale a cror caracteristic comun este aceea c responsabilitatea acceptrii sau respingerii unei cereri de blocare pentru o dat logic x revine unui singur nod al reelei distribuite, indiferent de numrul copiilor existente pentru x. Sarcina respingerii sau acceptrii unei cereri de blocare revine unui singur nod din reea desemnat ca nod central. n sistem exist deci un singur look manager care este plasat n nodul central. Procedura pentru o operaie de scriere sau citire a unei date logice x este urmtoarea: 1. Nodul central primete o cerere de blocare (pentru citire sau scriere ) a datei logice x;
168

Programarea rapid a aplicaiilor pentru baze de date relaionale

2. a - Dac cererea de blocare primit nu poate fi satisfcut, atunci nodul central trimite un mesaj de control corespunztor ctre nodul care a lansat cererea; b Dac cererea de blocare a fost satisfcut, i operaia este de citire, atunci nodul central trimite un mesaj de control ctre unul din nodurile n care exist o copie a lui x, mesaj prin care se comand transferarea valorii lui x ctre nodul care a lansat cererea. Dac operaia este de scriere, atunci nodul central trimite un mesaj de control ctre nodul solicitant prin care celui din urm i se acord dreptul de a actualiza toate copiile datei logice x. 3. Dac operaia este de citire, atunci valoarea citit x este transmis printr-un mesaj de date la nodul solicitant. Dac operaia este de scriere, atunci nodul solicitant transmite cte un mesaj de date (cu noua valoarea a lui x) ctre fiecare nod n care exist o copie a datei logice x. De regul, la acestea se mai adaug un mesaj de control, de la nodul solicitant ctre nodul central, pentru deblocarea datei logice x. n cazul acestui protocol sunt necesare 2 mesaje de control pentru operaia de citire i 3 mesaje de control pentru operaia de scriere. Dezavantajul este c n cazul unui trafic de reea intens, nodul central devine suprasolicitat.
d) Protocolul nodului primar

Acest protocol, este asemntor cu protocolul nodului central cu deosebirea c pentru fiecare dat logic x se desemneaz un nod primar care joac rolul nodului central pentru data respectiv. n plus, de regul, n nodul primar al unei date logice exist i o copie a acesteia. Deci, n principiu, n fiecare nod al reelei exist un loog manager responsabil pentru gestionarea cererilor de blocare a unei pri a datelor logice din sistem. O cerere de blocare a unei date logice x, va trebui deci adresat nodului primar asociat lui x. Acest protocol, necesit 2 mesaje de control pentru o operaie de scriere i unul singur pentru citire.
e) Protocolul copiilor primare

Protocolul copiilor primare se bazeaz pe folosirea unor operatori de citire i de scriere care funcioneaz ca privilegii pe care le pot obine nodurile reelei n contul tranzaciilor care solicit accesul la date. ntr-un moment de timp determinat, pentru o dat logic x, poate exista n sistem doar un singur operator de scriere. Dac nu exist nici un operator de scriere, atunci pot exista orici operatori de citire pentru x. Dac un nod deine un operator de scriere pentru x, atunci acesta poate accepta o cerere de blocare pentru scrierea lui x din partea unei tranzacii care se

169

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

execut n acest nod. Un nod care deine doar un operator de citire pentru x poate accepta o cerere de blocare pentru citirea lui x, dar nu i pentru scrierea lui. Dezavantajul acestui protocol este numrul mare de mesaje. Astfel, pentru o operaie de citire sau de scriere sunt necesare 3n mesaje de control.

170

Programarea rapid a aplicaiilor pentru baze de date relaionale

38. Soluia Microsoft Office: Excel & Access


Excel: tabele i grafice

1. Deschidei aplicaia Microsoft Excel (calea Start/Programs/Microsoft Excel) i realizai un tabel cu aspectul de mai jos:

2. Calculai utiliznd formula:


E factor C

= extincie/concentaie*factor valorile din coloana D;

3. Reprezentai grafic legtura dintre concentraie i raport; 4. Salvai fiierul. Instruciuni: 1. Dup ce introducei coninutul unei celule, validai cu [Enter] sau [Tab]; 2. Pentru a edita coninutul unei celule folosii tasta [F2] sau dublu click; 3. Pentru a realiza un grafic selectai valorile pe care dorii s le reprezentai i apoi apasati butonul pentru Chart Wizard: 4. Pentru a introduce o formul ntr-o celul ncepei ntotdeauna cu = i adresai celulele prin numele celulei (litera care desemneaz coloana i cifra care indic linia); n cazul nostru formula este extincie/concentaie*factor ceea ce se traduce prin introducerea n celula D5 a formulei: =B5/C5*D$3; 5. Pentru a copia formula pentru celelalte celule (D6...D14) selectai domeniul D5:D14 i folosii din meniu opiunea Edit-Fill-Down (semnul $ n D$3 specific faptul c valoarea rndului 3 va fi invariabil la copiere);
171

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

6. Selectai domeniul D5:D14 i accesai cu butonul drept al mouse-ului meniul de context FormatCells/Number, iar la Category selectai Number pentru a schimba numrul de zecimale cu care se afieaz valoarea obinut (vei alege 2 zecimale); 7. Selectai n grafic un punct i accesai cu butonul drept al mouse-ului meniul de context AddTrendline pentru a trasa dreapta de regresie. n fereastra care se deschide, la Type selectai dreapta de regresie liniar, iar la Options alegei s se tipreasc pe ecran ecuaia dreptei i valoarea coeficientului de determinare R2:

Coeficientul de determinare se apropie de valoarea 1 atunci cnd ntre cele dou iruri de valori exist o relaie de dependen liniar puternic (0.5 < r2 1) i de 0 atunci cnd nu exist o relaie de dependen liniar ntre cele dou iruri de valori (0 r2 <0.0625).

Excel: formule

1. Deschidei aplicaia Microsoft Excel (calea Start/Programs/Microsoft Excel) i realizai un tabel cu aspectul de mai jos. 2. Determinai valorile minime, maxime i media temperaturilor, TAS, TAD i glicemiei. 3. Reprezentai grafic evoluia mediei zilnice a temperaturii. 4. Salvai fiierul.

172

Programarea rapid a aplicaiilor pentru baze de date relaionale

Instruciuni: 1. Dup ce introducei coninutul unei celule validai cu Enter sau Tab. 2. Pentru a corecta coninutul unei celule folosii tasta F2 sau Dublu click. 3. Pentru a introduce o funcie selectai: Insert-Function, alegei MIN, MAX respectiv AVERAGE dup care alegei domeniul de la C5 la C19 (de exemplu), sau scriei C5:C19. 4. Pentru a micora numrul de zecimale selectai celula cu valoarea pentru care dorii micorarea numrului de zecimale i din Format-Cells-Number alegei opiunea Number iar la caseta cu zecimale scriei numrul de zecimale dorite. Pentru alt variant mai rapid apsai pe butonul: 5. Pentru reunirea mai multor celule ntr-una singura selectai Format-Cells-Alignment, alegei opiunea Merge cells. 6. Pentru alinierea textului n centrul celulei selectai textul dorit iar apoi alegei din meniu comanda Format-Cells-Alignment, alegei opiunea Center din casua derulant. 7. Pentru spargerea textului dintr-o celul pe mai multe rnduri selectai textul dorit iar apoi alegei din meniu comanda Format-Cells-Alignment, alegei opiunea Wrap text. 8. Pentru haurarea conturului celulei selectai Format-Cells-Border, alegei tipul de linie dorit i apoi modul n care dorii haurarea celulei, de pe butoane. 9. Pentru a realiza un grafic selectai valorile pe care dorii s le reprezentai grafic, n cazul nostru G7:G19, i apoi cutai butonul Chart Wizard i selectai tipul de grafic dorit, etc.
173

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

Excel: Formule

Deschidei aplicaia Microsoft Excel (butonul StartProgramsMicrosoft Excel) si realizai un tabel cu aspectul de mai jos:

n coloana H s se calculeze media aritmetic a notelor pentru fiecare student. In coloana I s se calculeze pentru fiecare student media aritmetic ponderat pentru fiecare materie cu numrul de credite (aflate n linia 1 a tabelului). In coloana J s se verifice pentru fiecare student dac i pstreaz bursa sau nu dup cum i ia toate examenele cu note 5 sau nu. Salvai fiierul. Instruciuni: 1. Pentru a micora numrul de zecimale apsai pe butonul: 2. Completai tabelul cu formulele corecte n conformitate cu formulele de mai jos: 1. Pe coloana cu Media pentru celula H3 avei formula: =(C3+D3+E3+F3+G3)/5
174

Programarea rapid a aplicaiilor pentru baze de date relaionale

2. Pe coloana cu Media ponderat pentru celula I3 avei formula: =((C$1*C3)+(D$1*D3)+(E$1*E3)+(F$1*F3)+(G$1*G3))/H$1 3. Pe coloana cu Burs Da/Nu pentru celula J3 avei formula: =IF(OR(C3<5,D3<5,E3<5,F3<5,G3<5),"Nu","Da") 4. Pentru coloanele Medie, Medie ponderat, Burs formula se poate copia astfel : se selecteaz coloana i se alege opiunea din meniu Edit/Fill Down: 3. Pentru formatare selectai domeniul dorit. Alegei din meniu comanda

Format/Cells/Alignment i selectai opiunea Center din caseta derulant pentru aliniere n centrul celulei, selectai opiunea Merge text pentru reuniunea mai multor celule, selectai opiunea Wrap text pentru spargerea textului pe mai multe rnduri. 4. Pentru formatare selectai domeniul dorit. Alegei din meniu comanda

Format/Cells/Border i selectai tipul de linie dorit pentru ncadrarea celulei sau domeniului selectat, apoi apsai butonul pentru tipul de ncadrare dorit.

Excel: Sortare

Realizai un tabel cu aspectul de mai jos n care introducei date pentru 10 pacieni:

Cerine: 1. S se completeze coloana lips dup formula: IMC = Greutate(kg)/Inaltime(m)2 2. S se realizeze un grafic cu distribuia pe sexe a pacienilor. 3. S se ordoneze descresctor tabelul dup coloana Glicemie (ca prima cheie) i apoi dup greutate (a doua cheie).

175

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

4. Realizai o reprezentare grafic care s exprime legtura dintre IMC i vrst. Plasai pe grafic i dreapta de regresie i coeficientul de determinare precum i titlu de grafic i titluri pe axe. Instruciuni: 1. Pentru a introduce o formul n celula respectiv (de exemplu n celula G3) scriei =E3/(F3^2). 2. Pentru a micora numrul de zecimale selectai celula cu valoarea pentru care dorii micorarea numrului de zecimale i din Format/Cells/Number alegei opiunea Number iar la caseta cu zecimale scriei numrul de zecimale dorite. 3. Pentru a realiza graficul alegei butonul Chart Wizard i selectai tipul Pie:

4. Pentru a sorta datele din tabel dup coloana H i E selectai tot tabelul apoi alegei din meniu comanda Data/Sort i alegei ca prim cheie de sortare Glicemia descresctor i apoi dup greutate tot descresctor. 5. Realizai o reprezentare grafic de tip scatter cu datele corespunztoare din coloanele C i G. Graficul respectiv poate fi completat i cu dreapta de regresie liniar i coeficientul de determinare.
Access: gestiunea datelor

n continuare se va ilustra realizarea unei colecii de date medicale precum i unele aplicaii cu aceste date, folosind sistemul de gestiune al bazelor de date Access.
Problem propus. S se realizeze o aplicaie care s gestioneze activitatea unui

cabinet medical, lund n considerare dou categorii de date, de identificare a pacientului i date privind consultaia folosind Microsoft Access.
176

Programarea rapid a aplicaiilor pentru baze de date relaionale

Paii de lucru: analiza problemei; realizarea diagramei entitate relaie; implementarea aplicaiei n Microsoft Access.
Analiza problemei

Specificaia sugereaz folosirea urmtoarelor entiti: Nume Data naterii Sex Consultaie, identificat prin: Pacientul care este consultat Data la care se face consultul Diagnosticul n urma consultului Observaie: entitile stabilite n urma analizei trebuie s acopere aplicaiile care urmeaz s fie realizate cu ajutorul bazei de date.
Realizarea diagramei entitate - relaie

Pacient, identificat prin:

Pacient la o anumit dat> Consultaie Se presupune pentru simplitate c un pacient nu este consultat ntr-o zi de dou ori. Diagrama entitate - relaie este util din urmtoarele puncte de vedere:
diagrama ne d numrul de tabele pe care le va conine baza de date fiecrei entiti i va

corespunde un tabel;
diagrama ne arat care este relaia dintre tabele.

Deci, pe baza diagramei entitate relaie, baza noastr de date va conine dou tabele, tabela cu datele referitoare la pacieni, pe care o vom denumi Pacienti i tabela cu datele referitoare la consultaii, pe care o vom denumi Consultatii. n cadrul aplicaiei noastre, fiecrui pacient i va fi asociat un identificator intern, un cod personal. Acest cod trebuie s fie absolut transparent utilizatorului, utilizatorul nici nu trebuie s tie de prezena lui. Vom numi acest identificator Id_pacient. Tabela Pacienti va avea patru cmpuri: Id_pacient, nume, data_nasterii i sex iar tabela Consultatii trei: Id_pacient, Data_consultatiei, Diagnostic. Cheia primar este elementul care definete unicitatea i consistena datelor ntr-o baz de date. Pentru baza noastr de date cheia primar a tabelului Pacienti este format din cmpul IdPacient iar pentru tabelul Consultatii este format din cmpurile NumPac i Data_consultatiei.
Implementarea aplicaiei

1. Se deschide aplicaia Microsoft Access (calea Start/Programs/Microsoft Access);

177

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

2. Se creaz un nou fiier de date; Dup cum se observ, numele fiierului baz de date este Cabinet , el avnd extensia MDB. Directorul n care se va salva acest fiier este directorul propriu localizat pe server. Identificarea unui fiier Microsoft Access este foarte uoar;

Crearea tabelelor 3. Pentru crearea tabelelor vom folosi opiunea Create table in design view (Fereastra Tables din meniul Microsoft Access)

4. Vom crea pe rnd tabelele Pacienti i Consultatii (utiliznd Table Design):


178

Programarea rapid a aplicaiilor pentru baze de date relaionale

Precum se observ n figura de mai sus, n mod implementare, se introduc numele, tipul i descrierea fiecrui cmp al tabelei (atenie: numele cmpului i tipul acestuia sunt obligatorii!) 5. Structura tabelului Pacienti:

Tipul cmpului poate fi unul din cele afiate n figura de mai jos:

6. Pentru alegerea cheii primare a tabelului Pacienti se selecteaz cmpul care o constituie, Id_pacient, i se face clic pe pictograma specific din bara de instrumente:

179

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

7. Pentru a putea introduce date, tabela trebuie salvat:

8. Observm c n fereastra tabelelor a aprut o entitate nou numit Pacienti. Introducerea datelor n tabela pacienilor se face deschiznd aceast tabel:

9. Analog se creeaz tabela Consultatii:

Atenie: Cheia primar a acestei tabele este o expresie format din dou cmpuri! 10. Vom crea legtura dintre tabele. Fiecrui pacient i corespunde una sau mai multe consultaii. Pentru ca baza noastr de date s fie consistent fiecrui pacient trebuie s i corespund cel puin o consultaie. Legtura dintre cele dou tabele va fi ntre cmpurile Id_pacient al tabelei Pacienti i Id_pacient din tabela Consultatii. Aceast legtur este de

180

Programarea rapid a aplicaiilor pentru baze de date relaionale

tipul unul la mai muli (one-to-many). Realizarea relaiilor se face selectnd pictograma din bara de instrumente: 11. Vom aduga ambele tabele (figura 14) i vom creia relaia utiliznd mouse-ul (drag and drop):

Precum se observ n figur, se selecteaz Enforce Referential Integrity. Aceast opiune se refer la integritatea relaiei din bazei de date. Se asigur faptul c, n momentul n care o nregistrare n tabela printe (Pacienti) se modific, aceast modificare se va regsi i n tabela fiu (Consultatii). La fel, la tergerea unei nregistrri din tabela Pacienti, se vor terge nregistrrile corespunztoare i din tabela Consultatii. 12. Odat creat relaia trebuie salvat. 13. Vom crea un formular pentru introducerea datelor. Pentru aceasta vom deschide fereastra corespunztoare formelor i vom selecta opiunea Create form by using wizard:

181

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

14. Vom urma paii specifici: (1) Selectarea cmpurilor coninute de formular; (2) Selectarea tipului de formular; (3) Selectarea tipului subformularului n care vom introduce consultaiile; (4) Selectarea tipului de obiecte folosite; (5) Selectarea numelui formularului i subformularului;

(1)
182

Programarea rapid a aplicaiilor pentru baze de date relaionale

(2)

(3)

(4)
183

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

(5) 15. Forma noastr este compus din dou pri: antet (datele de identificare a pacientului) i partea de consultaii.

Navigarea precum i introducerea de noi date se face cu ajutorul navigatorului ce conine, n ordine, butoane de salt la prima nregistrare, nregistrarea anterioar, nregistrarea curent, nregistrarea urmtoare, ultima nregistrare, adugare:

184

Programarea rapid a aplicaiilor pentru baze de date relaionale

Ca interogri i rapoarte ne intereseaz lista pacienilor, precum i lista consultaiilor fcute dup o anumit dat. 16. Vom realiza interogrile utiliznd instrumentele oferite de fereastra Query:

Pentru realizarea listei pacienilor vom alege din tabela Pacienti cmpurile nume (sortat alfabetic), sex i data nasterii:

185

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

17. Dup salvare, interogarea poate fi executat ducnd la rezultatul de mai jos:

18. Analog se realizeaz lista consultaiilor efectuate dup o anumit dat. Vom da exemplu lista consultaiilor de la data 1.1.2001:

186

Programarea rapid a aplicaiilor pentru baze de date relaionale

19. Rapoartele vor fi realizate utiliznd interogrile anterioare, n fereastra Reports:

20. Vom realiza raportul corespunztor listei de consultaii, urmnd paii: (1) Alegerea cmpurilor ce vor fi coninute n raport; (2) Modul de prezentare a informaiei n raport; (3) Modul de grupare a informaiei; (4) Modul de sortare a informaiei; (5) Tipul raportului; (6) Stilul titlului; (7) Numele raportului;

(1)
187

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

(2)

(3)

(4)
188

Programarea rapid a aplicaiilor pentru baze de date relaionale

(5)

(6)

(7)
189

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

21. Se obine urmtorul rezultat:

Access: probleme propuse

1. Se cere realizarea unei baze de date Access care s gestioneze activitatea unui grup de practic medical, cuprinznd tabelele: pacieni, consultaii, personal. Proiectai structura tabelelor i a relaiile dintre ele nct s conin datele necesare aplicaiei. Elaborai un raport care s furnizeze lista pacienilor unui medic din grupul de practic. 2. Se cere realizarea unei baze de date Access care s gestioneze activitarea unui cabinet de medic de familie cuprinznd tabelele: Pacieni, Consultaii, Medicamente compensate. Proiectai structura tabelelor i a relaiile dintre ele nct s conin datele necesare aplicaiei. Elaborai un raport care s furnizeze lista medicamentelor compensate prescrise de medicul de familie ntr-o anumit perioad. 3. Se cere realizarea unei aplicaii care s gestioneze activitatea unei farmacii implicnd dou tabele: medicamente, furnizori. Proiectai structura tabelelor i a relaiile dintre ele nct s conin datele necesare aplicaiei. Elaborai un raport care s furnizeze lista medicamentelor compensate furnizate de un furnizor dat ntr-o anumit perioad. 4. Se cere realizarea unei aplicaii care s gestioneze micarea consumabilelor ntr-o instituie spitaliceasc implicnd tabelele: Consumabile, Utilizatori. Proiectai structura tabelelor i a relaiile dintre ele nct s conin datele necesare aplicaiei. Elaborai un raport care s furnizeze lista consumabilelor folosite de un utilizator dat ntr-o anumit perioad.

190

Programarea rapid a aplicaiilor pentru baze de date relaionale

39. Probleme propuse


A. Integrarea aplicaiilor i Project Manager

Efectuai urmtorii pai i identificai elementele acestora: 1. Crearea unui proiect (universiti); 2. Crearea unei baze de date (universiti); 3. Crearea tabelelor bazei de date (instituii, contacte); 4. Introducerea datelor n tabele; 5. Modificarea tabelelor: adugarea cmpului nr n ambele tabele; 6. Indexarea primar (instituii) i regular (contacte); 7. Stabilirea relaiei ntre tabele (JOIN); 8. Introducerea condiiilor de validare a datelor la nivel de cmp; 9. Introducerea condiiilor de validare a datelor la nivel de nregistrare; 10. Definirea de relaii de integritate referenial; 11. Vizualizarea codului de integritate referenial generat (stored procedures); 12. Crearea unei interogri (contacte_institutii); 13. Vizualizarea codului SQL; 14. Selectarea destinaiei i vizualizarea interogrii (browse, table, cursor); 15. Modificarea tabelei contacte (adugarea cmpului i indexului poz);

191

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

16. Crearea unui grafic pe baza interogrii i cpurilor numerice nr i poz (count(poz)/grupul nr); 17. Crearea structurii bazei de date APIAP; 18. Crearea unei vederi locale (persoanele de contact i instituii); 19. Update Criteria i Send SQL Updates; 20. Crearea vederii dup instituii i apoi persoane de contact; 21. Stocarea de proceduri (stored procedures) n baza de date; procedura pentru cpuri autoincrement; 22. Wizard-ul i crearea de vederi; vedere parametrizat (persoane de contact pentru o instituie); 23. Fereastra de comenzi (command window); 24. Zone de lucru (data session); 25. Comenzi; 26. Expresii; 27. Funcii;
B. Utilizarea ferestrei de comenzi (command window) i crearea de programe (New/Program ...)

Efectuai urmtorii pai i identificai elementele acestora: 1. Exerciii demonstrative cu comenzile pe iruri de caractere; 2. Vizualizarea valorii returnate de Expression Builder USE Contacte GETEXPR 'Introdu conditia de localizare ' TO gcTemp; ? gcTemp 3. Crearea unui program (de exemplu cel anterior); urmtoarele comenzi sunt utile:

pentru a crea un program: New/Program,New File sau comanda modify command; pentru a salva un program: File/Save; pentru a deschide un program: File/Open/File type: program/Open sau modi comm <nume_program>; se poate face i modi comm ? cnd se activeaz o fereastr de dialog; pentru a executa un program: Program/Do... sau cu comanda do <nume_program>;

4. Exerciii cu comenzile browse, locate, replace; 5. Program cu replace; 6. Exemple cu variabile; exemplul 1 corect:

local gdDate STORE DATE( ) TO gdDate


192

Programarea rapid a aplicaiilor pentru baze de date relaionale

7. Exerciii cu matrici 8. Exerciii cu IF, CASE, SCAN, FOR, DO WHILE; 9. Exemplu cu o procedur ntr-un program: Do myproc with "aaa" PROCEDURE myproc( cString ) ? "myproc" + cString ENDPROC 10. Exemplu cu o funcie ntr-un program: ? plus2saptamani(date()) FUNCTION plus2saptamani PARAMETERS dDate RETURN dDate + 14 ENDFUNC 11. Exemplu de program cu o procedur cu 3 parametrii GETEXPR 'Introdu o expresie: ' TO gcTemp DO procedura WITH DATE(), gcTemp, 10 PROCEDURE procedura( dData, cSir, nOriTipar ) FOR nCnt = 1 to nOriTipar ? DTOC(dData) + " " + cSir + " " + STR(nCnt) ENDFOR ENDPROC 12. Report Wizard; raportul persoanelor de contact din baza de date universitati; 13. Report Designer; realizarea unui raport cu totaluri pe categorii; 14. Quick Report; raport dintr-o vedere; varianta 1 i varianta 2; 15. Labels; etichete simple i etichete din vedere cu parametru; 16. Generarea unei interogri din program folosind macrosubstituia; 17. Form Wizard; formular pentru parcurgerea i modificarea datelor pentru instituiile existente i pentru introducerea datelor pentru o nou instituie n baza de date universitati.dbc; execuia formularului; 18. Crearea unui raport pentru imprimarea informaiilor din formular; raportul institutii.frx; 19. Modificarea structurii tabelei institutii.dbf; 20. Modificarea formularului institutii.scx; execuia formularului; adugarea unei instituii; 21. Tiprirea informaiilor din formular cu ajutorul raportului institutii.frx; 22. One-to-many Form Wizard; Formular pentru parcurgerea i modificarea datelor simultan pentru instituiile i persoanele de contact din baza de date universitati.dbc;
193

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

23. Form Builder; formular pentru modificarea unei persoane de contact; 24. Form Designer; crearea formularului din aplicaia 4; 25. Execuia formularului; 26. Setarea atributelor la Tab Order i Forms/Maximum design area;

194

Programarea rapid a aplicaiilor pentru baze de date relaionale

40. Test de cunotine


Se consider o baz de date care conine dou tabele relatate pe baza unei relaii de tipul 1 la n (One to Many Relationship). Tabela cu cheia primar a relaiei se va numi tabela printe iar tabela cu cheia strin a relaiei se va numi tabela fiu. 1. S se realizeze o vedere cu parametru care s conin un cmp de identificare din tabela printe (de preferin o cheie candidat) i cel puin dou cmpuri din tabela fiu n la care cutarea s se fac ntr-un cmp din tabela fiu dup o valoare de tip caracter. Ordonarea s se fac dup valorile cmpului din tabela printe i apoi dup valorile unui cmp din tabela fiu. 2. S se realizeze o interogare pe baza tabelei printe i tabelei fiu care s conin dou cmpuri din tabela printe i un cmp care s conin numrul nregistrrilor relatate pe baza relaiei din tabela fiu pentru fiecare nregistrare din tabela printe. S se ordoneze nregistrrile dup un cmp din tabela printe. S se denumeasc cmpul ce conine numrul nregistrrilor din tabela fiu nrc. 3. S se realizeze un raport care s conin un cmp din tabela printe i dou cmpuri din tabela fiu mai puin cheile strine i primare i s se grupeze informaiile dup cheia primar din tabela printe. 4. S se realizeze un formular care s permit introducerea unei nregistrri n tabela fiu pe baza unei selecii a nregistrrii relatate n tabela printe cu ajutorul unei liste combo. 5. S se realizeze un meniu pentru o aplicaie. 6. ntrebri: a. Ce este o cheie primar i o cheie strin; b. Ce este o tabel printe i o tabel fiu; c. Ce este un index primar i ce este un index regular; d. Caracterizai o tabel, o vedere, o interogare i un cursor; e. Cum implementai o relaie m la n ntr-o baz de date; f. Care sunt etapele unei conectri la un server de baze de date; g. Care este diferena ntre un meniu sistem i un meniu contextual; h. Cum se poate realiza un help pentru o aplicaie;

195

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

41. Model de soluie pentru test


Fie baza de date universiti. Soluie:

196

Programarea rapid a aplicaiilor pentru baze de date relaionale

III. Index de cuvinte cheie


algoritm: 159, 160, 163, 167 aplicaii: Access: 176, 177, 178 ale informaticii: 4 client-server: 114, 125 dezvoltare, implementare: 27, 87, 141, 177 documentare: 135 Excel: 28, 87, 88, 171, 172, 174 execuie: 14, 100, 101, 102, 110, 111, 124 exemplu: 40, 60, 67, 68, 73, 76, 77, 78, 83, 85, 91, 92, 93, 95, 97, 99, 100, 102, 104, 105, 106, 108, 129, 176 expert: 34, 37, 59, 73, 92, 93, 94, 96, 97, 99, 100, 109, 112 integrare: 134, 191 locale, distribuite: 142 mrime: 26, 99 OLE: 88 pentru editare: 29 tiinifice, inginereti: 8 testare: 102, 103, 112, 113 VFP: 60, 99 baze de date: coerente: 149, 154, 155 deductive: 149 distribuite: 142, 143, 151, 152, 154, 156, 157, 158, 160, 163, 164, 165, 166, 167 funcionale: 148 inteligente: 149 obiect: 8, 9, 145 relaionale: 7, 8, 9, 11, 12, 19, 25, 143, 149, 150 securizate: 152 chei: cmpuri: 54, 75, 76, 115 integritate referenial: 81, 85 primare, strine, candidate: 19, 20, 21, 25, 36, 37, 39, 40, 43, 46, 48, 76, 130, 175, 177, 179, 180, 195 relaii i scheme: 8, 151 sortare: 176 constructor (i.e. Builder): aplicaie (i.e. Application): 113, 141 caseta de text (i.e. Text Box) 92, 94 expresie (i.e. Expression): 37, 38, 56, 59, 60, 192 formular (i.e. Form): 77, 194 grup de butoane de comand (i.e. Command Group): 92 grup de opiuni (i.e. Option Group): 94 integritate referenial (i.e. Referential Integrity): 39, 40 lista ascuns (i.e. Combo Box) 93, 97 matrice (i.e. Grid): 96 meniu (i.e. Menu): 100 desenator (i.e. Designer): baz de date (i.e. Database): 33, 34, 48 etichet (i.e. Label): 71 formular (i.e. Form): 73, 82, 85, 194 interogare (i.e. Query): 43, 44 meniu (i.e. Menu): 99, 100, 101, 102, 109 raport (i.e. Report): 43, 67, 68, 193 tabel (i.e. Table): 28, 29, 30, 34, 38 vedere (i.e. View): 43, 46, 47, 48 index: analiza problemei: 42, 43 creare: 28, 30, 36, 37, 41, 48, 54, 78, 116, 191 filtrare: 32 fiier: 5, 30 fiiere .hhk: 135, 140, 141 folosire: 30, 32, 54, 73, 76, 96, 195 tipuri: 31 model: BDOO: 8, 144 de soluie: 196 formular: 78, 96, 121 funcional: 148, 149 ierarhic: 5 informaie: 12 integrat: 146 meniu: 99 niveluri de acces: 153

197

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

model: orientat pe obiecte: 146 relaional: 5, 6, 7, 8, 145, 146 reea: 5 securitate: 118 taxonomie: 145 tranzacie: 147 ODBC: driver: 45 MyODBC: 118 protocol: 46 surs de date: 45, 118 ordonare, sortare: ascendent, descendent: 32 cheie: 176 controale: 82 Excel: 175 formulare: 73, 76 informaie: 187 interogri: 44 rapoarte: 67 strict: 7 vederi: 195 PHP: limbaj: 26 phpMyAdmin: 115, 116, 117, 118 relaii: apartenen: 8 asociere: 148 clase: 145 constructor: 146 de validare: 18, 42 dependen liniar: 172 dependene incluziune: 151 diagram entitate-relaie: 176, 177 fragmente: 157 integritatea referenial: 39, 42, 76, 81, 85, 181 nrudire: 144, 145 MVFP: 5

relaii: nivel logic: 6, 41 ordine: 46, 48 schem relaional: 8 structurale: 144 tabele: 7, 12, 30, 33, 36, 49, 67, 76, 91, 129, 131, 142, 180 tipuri: 22 relaional: model: 5, 7, 8, 145, 146 organizare: 20 schem: 8, 150 SQL: actualizare (i.e. update): 47, 192 buton: 43 extensie: 145 fraze: 44, 46, 72, 116, 117 IBM, dBase: 8 interfa: 145 interogri: 43 limbaj: 9, 115, 146, 157 MySQL: 20, 25, 115, 116, 118, 122 server: 46, 122, 125, 126, 127, 128 Ted Codd: 7, 12 vrjitor (i.e. Wizard): aplicaie (i.e. Application): 112, 134 baz de date (i.e. Database): 16 etichete (i.e. Label): 70 formular (i.e. Form): 73, 76, 82, 130, 133, 181, 193 grafice (i.e. Graph, Chart): 44, 171, 173, 176 interogare (i.e. Query): 43 machete (i.e. Template): 48 MVFP: 14 PHP: 115 rapoarte (i.e. Report): 67, 68, 74, 134, 193 tabel (i.e. Table): 28 vederi (i.e. View): 49, 192

198

Programarea rapid a aplicaiilor pentru baze de date relaionale

IV. Bibliografie
[Lucrri de referin n domeniu]

1. Donald Knuth, The art of computer programming. Volume 1: Fundamental algorithms. Third Edition, Addison-Wesley, ISBN 0-201-89683-4, 1997, 650 p. 2. Donald Knuth, The art of computer programming. Volume 2: Seminumerical Algorithms. Third Edition, ISBN 0-201-89684-2, 1997, 762 p. 3. Donald Knuth, The art of computer programming. Volume 3: Sorting and Searching. Second Edition, Addison-Wesley, ISBN 0-201-89685-0, 1998, 780 p. 4. Marcus Egger, Advanced Object Oriented Programming With Visual Foxpro 6.0, Hentzenwerke Publishing, ISBN 0-96550-938-9, 1999, 416 p. 5. Nigel McFarlane, Rapid Application Development with Mozilla, Prentice Hall, Pearson Education, ISBN 0-13-142343-6, 2003, 800 p. 6. Stefan Stanczyk, Bob Champion, Theory and Practice of Relational Databases, Taylor & Francis, ISBN 0-415-24701-2, 2001, 272 p. 7. Terry Halpin, Information Modeling and Relational Databases: From Conceptual Analysis to Logical Design, Academic Press, ISBN 1-55860-672-6, 2001, 761 p.
[Lucrri ale autorilor]

1. Carmen Elena STOENOIU, Lorentz JNTSCHI, Sorana Daniela BOLBOAC, Computer-Based Testing in Physical Chemistry Topic, Third Humboldt Conference on Computational Chemistry, June 24-28, Conference Proceedings, ISBN 954-323-199-0 then 978-954-323-199-7, p. 94, Bulgaria, 2006, Varna 2. Delia Maria GLIGOR, Lorentz JNTSCHI, Periodic System of Elements Database and Its Applications, Oradea University Annals, Chemistry Fascicle, Oradea Univeristy Press, Oradea, Issue 12, 180-194, 2005, ISSN 1224-7626 3. Elena ZAHARIEVA-STOYANOVA, Lorentz JNTSCHI, Application of Software Data Dependency Detection Algorithm in Superscalar Computer Architecture, International Conference on Computer Systems and Technologies (e-Learning), June 19-20, work published in volume CompSysTech'2003 (ISBN 954-9641-33-3) at p. II.61-II.66, Bulgaria, 2003, Sofia 4. Elena ZAHARIEVA-STOYANOVA, Lorentz JNTSCHI, Detection of Software Data Dependency in Superscalar Computer Architecture Execution, CSCS14 International Conference, July 2-5, work published in volume II "CSCS-15 14-th International

199

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

Conference on Control Systems and Computer Science" (ISBN 973-8449-17-0, ISBN 973-8449-19-7) at p. 351-356, Romania, 2003, Bucureti 5. Horea Iustin NACU, Lorentz JNTSCHI, Multiple Choice Examination System 1. Database Design and Implementation for General Chemistry, Leonardo Journal of Sciences, AcademicDirect, Internet, Issue 5, 18-33, 2004, ISSN 1583-0233 6. Horea Iustin NACU, Lorentz JNTSCHI, Multiple Choice Examination System 2. Online Quizzes for General Chemistry, Leonardo Electronic Journal of Practices and Technologies, AcademicDirect, Internet, Issue 5, 26-36, 2004, ISSN 1583-1078 7. Lorentz JNTSCHI, Dana AVRAM, Internet, Local Databases and Browsers, International Conference on Quality Control, Automation and Robotics, May 23-25, work published in volume "AQTR Theta 13" (ISBN 973-9357-11-1) at p. 516-521, Romania, 2002, Cluj-Napoca 8. Lorentz JNTSCHI, Delphi Client - Server Implementation of Multiple Linear Regression Findings: a QSAR/QSPR Application, Applied Medical Informatics, SRIMA, Cluj-Napoca, Issue 15, 48-55, 2004, ISSN 1224-5593 9. Lorentz JNTSCHI, Free Software Development. 1. Fitting Statistical Regressions, Leonardo Journal of Sciences, AcademicDirect, Internet, Issue 1, 31-52, 2002, ISSN 1583-0233 10. Lorentz JNTSCHI, I386-Based Computer Architecture and Elementary Data Operations, Leonardo Journal of Sciences, AcademicDirect, Internet, Issue 3, 9-23, 2003, ISSN 15830233 11. Lorentz JNTSCHI, Installing and Testing a Server Operating System, Leonardo Electronic Journal of Practices and Technologies, AcademicDirect, Internet, Issue 3, 1-30, 2003, ISSN 1583-1078 12. Lorentz JNTSCHI, Mariana MARCU, Sorana Daniela BOLBOAC, SQL Application for Secondary School Leaving Examination, UNITECH'03 International Scientific Conference, November 21-22, work published in volume I "ISC UNITECH'03 GABROVO Proceedings" (ISBN 954-683-167-0) at p. 258-262, Bulgaria, 2003, Gabrovo 13. Lorentz JNTSCHI, Mihaela Ligia UNGUREAN, Parallel processing of data. C++ Applications, Oradea University Annals, Mathematics Fascicle, Oradea University Press, Oradea, VIII, 105-112, 2001, ISSN 1221-1265 14. Lorentz JNTSCHI, Sorana BOLBOAC, Organizing Guidelines Models and Clinical Practice Guidelines, 11th International Symposium for Health Information Management Research, July 14-16, Proceedings, ISBN 0-7703-9016-1, p. 328-338, Nova Scotia, CA, 2006, Halifax
200

Programarea rapid a aplicaiilor pentru baze de date relaionale

15. Lorentz JNTSCHI, Sorana Daniela BOLBOAC, Computer Aided System for Student's Knowledge Assessment, The 10th World Multi-Conference on Systemics, Cybernetics and Informatics, July 16-19, Proceedings, ISBN 980-6560-65-5 (Collection) && ISBN 980-6560-65-3 (Volume 1), p. 97-101, Florida, U.S.A, 2006, Orlando 16. Lorentz JNTSCHI, Sorana Daniela BOLBOAC, Installation and Configuration Issues about FreeBSD Operating System, A&QT-R 2004 (THETA 14) 2004 IEEE-TTTC International Conference on Automation, Quality and Testing, Robotics, May 13-15, volume "II" (ISBN 973-713-047-2) at p. 251-256, Romania, 2004, Cluj-Napoca 17. Lorentz JNTSCHI, SQL by Example. 1. Application for High School Bachelor Examination, Leonardo Electronic Journal of Practices and Technologies, AcademicDirect, Internet, Issue 2, 20-36, 2003, ISSN 1583-1078 18. Mdlina VLEANU, Building Biological Databases, Applied Medical Informatics, Srima, Cluj-Napoca, Nr. 3-4/2002, pag. 67-72, 2002, ISSN 1224-5593 19. Mdlina VLEANU, Global Interity Preservation in Medical Distributed Databases, Applied Medical Informatics, Srima, Cluj-Napoca, Nr. 3-4/2003, pag. 36-45, 2003, ISSN 1224-5593 20. Mdlina VLEANU, Integrity Aspects in Database, Applied Medical Informatics, Srima, Cluj-Napoca, Nr. 3-4/2004, p. 9-15, 2004, ISSN 1224-5593 21. Mdlina VLEANU, Integrity in Distributed Databases, Applied Medical Informatics, Srima, Cluj-Napoca, Nr. 1-2/2003, pag. 3-8, 2003, ISSN 1224-5593 22. Monica TEFU, Mihaela Ligia UNGUREAN, Lorentz JNTSCHI, Free Software Development. 2. Chemical Database Management, Leonardo Electronic Journal of Practices and Technologies, AcademicDirect, Internet, Issue 1, 69-76, 2002, ISSN 15831078 23. Sorana BOLBOAC, Horaiu COLOSI, Tudor DRUGAN, Andrei ACHIMA, tefan IGAN, Elements of Medical Informatics and Biostatistics, SRIMA Publishing House, Cluj-Napoca, Romania, 211 pages, 2003, ISBN 973-85285-0-X. 24. Sorana BOLBOAC, Lorentz JNTSCHI, Computer-Assisted Training and Evaluation System in Evidence-Based Medicine, 11th International Symposium for Health Information Management Research, July 14-16, Proceedings, ISBN 0-7703-9016-1, p. 220-226, Nova Scotia, CA, 2006, Halifax 25. Sorana BOLBOAC, The Computer Revolution in Neurobiology, Applied Medical Informatics, SRIMA, Cluj-Napoca, Issue 11, 32-8, 2002, ISSN 1224-5593 26. Sorana Daniela BOLBOAC, Lorentz JNTSCHI, Andrei ACHIMA CADARIU, SQL by Example. 2. PHP and MySQL Web Application based on Tanner-Whitehouse
201

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

Standard, Leonardo Electronic Journal of Practices and Technologies, AcademicDirect, Internet, Issue 2, 37-52, 2003, ISSN 1583-1078 27. Sorana Daniela BOLBOAC, Lorentz JNTSCHI, Andrei ACHIMA CADARIU, Relational Information in Medicine: A Challenge, Roentgenologia & Radiologia, Bulgarian Association of Radiology, Sofia, Issue XLIV(1), 22-25, 2005, ISSN 0486-400X 28. Sorana Daniela BOLBOAC, Lorentz JNTSCHI, Andrei ACHIMA CADARIU, PHP and MySQL Medical Application Based on Tanner Whitehouse Standard, UNITECH'03 International Scientific Conference, November 21-22, work published in volume I "ISC UNITECH'03 GABROVO Proceedings" (ISBN 954-683-167-0) at p. 304-308, Bulgaria, 2003, Gabrovo 29. Sorana Daniela BOLBOAC, Lorentz JNTSCHI, Assessment of an Computer Based Curriculum in Evidence-Based Medicine, The 10th World Multi-Conference on Systemics, Cybernetics and Informatics, July 16-19, e-Proceedings, ISBN 980-6560-92-2 (CD), paper #3 e-KCC (THEME: Other theme or topic in the domain of KCC 2006), 5 p., Florida, U.S.A, 2006, Orlando 30. Sorana Daniela BOLBOAC, Lorentz JNTSCHI, Carmencita DENE, Andrei ACHIMA CADARIU, Skeletal Maturity Assessment Client-Server Application, Roentgenologia & Radiologia, Bulgarian Association of Radiology, Sofia, Issue XLIV(3), 189-193, 2005, ISSN 0486-400X 31. Tudor DRUGAN, Cosmina BONDOR, Sorana BOLBOAC, Tudor CLINICI, Horaiu COLOSI, Ramona GLTU, Dan ISTRATE, Mdlina VLEANU, Andrei ACHIMA, tefan IGAN, Practical Applications of Medical Informatics and Statistics (in Romanian), ALMA MATER Publishing House, Cluj-Napoca, Romania, 198 pages, 2002, ISBN 973-85354-5-X. 32. Tudor DRUGAN, Sorana BOLBOAC, Horaiu COLOSI, Ramona GLTU, Tudor CLINICI, Dan ISTRATE, Cosmina BONDOR, Mdlina VLEANU, Andrei ACHIMA, tefan IGAN, Applied Medical Informatics (in Romanina), SRIMA Publishing House, Cluj-Napoca, Romania, 204 pages, 2003, ISBN 973-8296-09-9. 33. Tudor DRUGAN, Sorana BOLBOAC, Tudor CLINICI, Dan ISTRATE, Horaiu COLOSI, Ramona GLTU, Cosmina BONDOR, Mdlina VLEANU, Andrei ACHIMA, tefan IGAN, Applications of Medical Informatics and Biostatisctics (in Romanian), SRIMA Publishing House, Cluj-Napoca, Romania, 193 pages, 2004, ISBN 973-85285-3-4.

202

Programarea rapid a aplicaiilor pentru baze de date relaionale

V. Abstract
The work Rapid Programming of Relational Databases Applications is the result of didactic experience of over ten years in field of creating and exploiting relational databases, of implementing of applications dedicated to fields of: scientific research (databases for chemistry and medicine), archiving (databases with scientific publications), management (materials and money) and never the less, education. The work is addressed to which ones which want to acquire skills and abilities to use the applications dedicated to databases, and especially of applications from Rapid Application Development (RAD) category. From this category of applications, most popular is FoxPro; this is also the application which are discussed most deep in the work. From the programming style point of view, the work offer the Microsoft solution, being discussed three applications dedicated to databases provided by Microsoft trust. In the increasing order of programming environment provided, these are: Excel, Access, and Visual FoxPro. Related to the versions of discussed applications, these are neither the last ones from the market, neither the first ones. Regarding strictly to Visual FoxPro, discussion are made exemplifying with applications for version 6 (release year 1998), discussion being then perfectly valid for versions 5 and 7. The axis of didactical exposition of work is directed from problem to solution, passing through mathematical model, algorithm, and implementation. The fundamental theoretical knowledge of databases are not skipped from scientific exposition of work; contrary, are deeply discussed the problems of storage at physical as well as logical level, the problems of consistency and integrity are exemplified through the work, and fundamental problems of security, coherency, restrictions and transactions are treated (because of its apart specificity) near to the end of the work (section Special Chapters of Databases). The work has a profound forming character. The abilities which work wants to create are: projecting, implementation, normalizing and assuring of referential integrity of a relational database and implementation of information management applications; the use of controls provided by a visual programming environment for rapid application development; realizing of client-server complex for management of distributed databases. Never the less, are placed the software engineering, the approaching technique for proposed problem from top to down and from bottom to up (top-down and bottom-up) by using of well known Latin dictum divide et impera (divide and overrule).

203

Lorentz JNTSCHI, Mdlina Ana VLEANU, Sorana Daniela BOLBOAC

VI. Contents
I. Preface .........................................................................................................................2 II. About Authors .............................................................................................................3 1. Databases and DBMS..................................................................................................4 2. Backus-Naur Forms...................................................................................................10 3. Relational Databases..................................................................................................11 4. Microsoft Visual FoxPro ...........................................................................................14 5. Creating of a Database...............................................................................................16 6. Normalizing of a Database ........................................................................................19 7. Types of Relations .....................................................................................................22 8. Aspects of Data Storage in Relational Databases......................................................25 9. Working with Project Manager in VFP.....................................................................27 10. Creating of Tables and Indexes .................................................................................28 11. Collecting of Tables into a Database.........................................................................33 12. Data Validating at Append or Modify.......................................................................38 13. Records Handling and Database Referential Integrity ..............................................39 14. Querying of a Database and SQL language...............................................................43 15. Creating of a Local View...........................................................................................46 16. Working with Command Window ............................................................................50 17. Expressions................................................................................................................56 18. Working with VFP Functions - Examples of Using..................................................57 19. Expression Builder ....................................................................................................59 20. Programming .............................................................................................................61 21. Procedures and Functions..........................................................................................66 22. Reports and Labels ....................................................................................................67 23. Macro Substitution ....................................................................................................72 24. Forms .........................................................................................................................73 25. Controls .....................................................................................................................83 26. Controls and Containers in FVP................................................................................87 27. Builders of Controls and Containers .........................................................................92 28. Menus ........................................................................................................................99 29. Creating of Menus for Applications ........................................................................100 30. External Databases and Client-Server Applications................................................114 31. Configuring of a VFP/Win9.x Client running at MyQSL/FreeBSD Server ...........115 32. From Distance Management of MyQSL/FreeBSD with VFP/Win9.x....................122 33. SQL Phrases for Access to a Data Server................................................................125 34. Example Application ...............................................................................................129 35. Documenting of Windows Applications with Microsoft HTML Help ...................135 36. Creating of a New Help File with HTML Help Workshop.....................................136 37. Special Chapters of Databases.................................................................................142 38. Microsoft Office Solution: Excel & Access ............................................................171 39. Proposed Problems ..................................................................................................191 40. Knowledge Test.......................................................................................................195 41. Model of Solution for the Test ................................................................................196 III. Index of Keywords ..................................................................................................197 IV. Bibliography ............................................................................................................199 V. Abstract....................................................................................................................203 VI. Contents ...................................................................................................................204

204

AcademicDirect ISBN 973-86211-5-1 ISBN13 980-973-86211-5-1 Academic Pres ISBN 973-86211-5-1 ISBN13 980-973-86211-5-1

S-ar putea să vă placă și