Documente Academic
Documente Profesional
Documente Cultură
HTTP Lori - Academicdirect
HTTP Lori - Academicdirect
HTTP Lori - Academicdirect
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
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).
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
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
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.
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
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
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
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
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
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.
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Iat acum c aceast tabel constituie baza unei relaii m la n n baza de date:
24
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
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
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
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
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
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
1 2
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
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:
Dac vrei s
Folosete
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
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
1. Din meniu sau din bara de instrumente se selecteaz File/New (File Type: Project)/New file; 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
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
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
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
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;
20. Se selecteaz indexul primar i se efectueaz drag and drop cu mouse-ul peste indexul regular (cheia primar peste cheia strin);
37
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
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 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
Restrict
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:
40
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
N N C
5 5 1
N N D
5 10 8
41
(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
N N C N N
5 5 20 10 10
12 5 12
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:
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
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
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
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
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
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
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;
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
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
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
DISPLAY ALL FOR NUME >= Ha DISPLAY ALL WHILE NUME > Ha
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
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
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
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
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
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
<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
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:
Dac nu se include nici o extensie, FVP caut s execute n urmtoarea ordine: ProgramName1.exe (versiunea executabil) ProgramName1.app (o aplicaie) ProgramName1.fxp (versiunea compilat) ProgramName1.prg (programul) 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
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
&& Afieaz 38
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
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()
58
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:
")
"
59
ABBA" ABBA
"
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"
"
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
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
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:
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 && deschide tabela contacte
GETEXPR 'Introdu conditia de localizare ' TO gcTemp; TYPE 'L' DEFAULT 'email = ""' LOCATE FOR &gcTemp IF FOUND( ) DISPLAY ELSE ? 'Conditia ' + gcTemp + ' nu a fost gasita' ENDIF USE
Instruciunea CASE are sintaxa:
&& 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
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
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 SCAN && Deschide tabela Institutii && Deschide tabela Contacte && Permite i EXIT i LOOP (continu)
&& Valoare iniial && Valoare final && Pas && Permite i EXIT i LOOP (continu) && Mut pointerul de nregistrare && Afieaz numele && Sau NEXT && Exemplu DO WHILE
64
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
Urmtoarea procedur afieaz un mesaj iar urmtoarea funcie arat o alt modalitate
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
raport pe coloane
raport pe linii
raport 1 la n
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).
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
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,
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
6. Se definete fontul (de exemplu Arial 12); 7. Se salveaz raportul; 8. Se vizualizeaz cu preview;
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
de la nume_b : Email);
4. Se alege fontul (de exemplu Monotype Corsiva, 12); 5. Se salveaz eticheta caut_contact; 6. Se execut vederea de la butonul Preview... cnd se activeaz mesajul interogativ;
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
71
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
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.
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
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
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
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
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
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
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
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
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
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
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 numele formularului este Form4 (proprietatea Name) iar numele
atunci
accesul
la
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
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
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;
11. Se salveaz i se execut formularul, care permite acum i adugarea unei instituii i/sau persoane de contact;
86
Obiecte VFP:
o Controale:
) ) )
Command Button (
Header (creeaz o caset Header pentru o coloan ntr-un control de tip grid) Hyperlink ( ) 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 (
format BMP Label ( Line ( ) 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-
List Box (
un cmp dintr-un tabel (de exemplu provenit din Word sau Excel)
87
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 (
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:
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
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:
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);
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
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;
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);
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.
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:
91
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
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
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
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
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. evenimentul Form1.Activate:
ThisForm.Grid2.Visible = .F. ThisForm.Grid1.Visible = .T. 10.3. evenimentul Page2.Click: ThisForm.Grid1.Visible = .F. ThisForm.Grid2.Visible = .T.
96
proprietatea Grid1.Visible = .F. proprietatea Grid2.Visible = .F. proprietatea Grid1.ReadOnly = .T. proprietatea Grid2.ReadOnly = .T.
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
98
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.
99
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 Set Main); n caz (Project
programul
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
\<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
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
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
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
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
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
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
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
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
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
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
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
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.
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
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
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
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
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
No 0 No 0 No 0 No 0 No 0 Or
Drop
c d e f g
116
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
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):
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:
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
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
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
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
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
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
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
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
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 (*) Valoarea (eExpression) Numrul de comenzi update trimise ctre sursa de date pentru tabelele tampon. Buffering 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 .T. face ca cmpurile Memo, General i Picture s fie incluse n clauza Where pentru modificri; .F. nu; FetchAsNeeded .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
-1 face ca s se preia ntregul set; KeyFieldList Lista de cmpuri (specificate prin nume) care se dorete a fi preluate n cursor, separate prin virgul; MaxRecords (*) 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 .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); UpdateNameList UpdateType Numele cmpurilor n cursor (pentru redenumiri); 1 vechile date sunt modificate cu cele noi; 2 tergerea datelor vechi i inserarea celor noi; UseMemoSize (*) Dimensiunea (n octei) maxim a unui cmp de la care acesta cnd este preluat este stocat ntr-un cmp memo; WhereType 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
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
* 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
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:
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
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:
131
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)
132
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:
133
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
135
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
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
[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
Se poate schimba iconia implicit asociat unei intrri pe calea: Contents/Edit Selection/Table of Contents Entry/Advanced. Legenda este alturat:
139
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:
140
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
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
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
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
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
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
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
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
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
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
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
CUMPARARE
(NP, DC,
VANZARE
(NP,
STOC
(NP,
PRODUS
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
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
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
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
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
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
Fig. 5 ilustreaz aceeai situaie: T1 imprim dou valori diferite pentru aceeai dat A. T1 A=B Read Aa1 a1+1a1 Write a1A T2
T2
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 A a1 Print a1
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
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
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.
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.
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
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
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
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
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.
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
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
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
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
- 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
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
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
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
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
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
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
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
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
1. Deschidei aplicaia Microsoft Excel (calea Start/Programs/Microsoft Excel) i realizai un tabel cu aspectul de mai jos:
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
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
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
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
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
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.
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
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 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
177
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)
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
8. Observm c n fereastra tabelelor a aprut o entitate nou numit Pacienti. Introducerea datelor n tabela pacienilor se face deschiznd aceast tabel:
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
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
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
(2)
(3)
(4)
183
(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
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
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
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
(2)
(3)
(4)
188
(5)
(6)
(7)
189
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
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
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;
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:
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
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
195
196
197
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
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.
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
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
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
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
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
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