You are on page 1of 128

Crearea i exploatarea bazelor de date relaionale

1. Baze de date i SGBD


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

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

Crearea i exploatarea bazelor de date relaionale

numr de cmpuri, unde fiecare cmp d valori unei anumite proprieti (sau atribut) al entitii.

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.

Crearea i exploatarea bazelor de date relaionale

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. 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; 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. Cu alte cuvinte modelul relaional consist din: independena datelor fa de hardware i modul de memorare; navigarea automat sau un limbaj de nivel nalt neprocedural pentru accesarea datelor;

n loc ca s se proceseze cte o nregistrare, programatorul utilizeaz limbajul pentru a specifica operaii unice care trebuie realizate asupra ntregului set de date. Limbajele de generaia a 4-a (4th GLs) sunt mai aproape de limbajul uman ca limbajele de nivel nalt (de generaia a 3-a, 3th GLs). Primele dintre acestea sunt FOCUS (Information Builders) SQL (IBM), QBE (Querry by example, IBM), dBASE (succesorul lui SQL). Necesitatea pentru mai mult flexibilitate i performan din partea modelelor de date cum ar fi de a suporta aplicaiile tiinifice sau inginereti a fcut ca s se extind conceptul de model relaional aa nct intrrile n tabele s nu mai fie simple valori ci s poat fi programe, texte, date nestructurate mari n form binar sau orice alt format solicitat de utilizator. Un alt progres s-a fcut prin ncorporarea conceptului de obiect devenit esenial n limbajele de programare. n bazele de date orientate obiect toate datele sunt obiecte. Obiecte
3

Crearea i exploatarea bazelor de date relaionale

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

Crearea i exploatarea bazelor de date relaionale

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.

3. Baze de date relaionale


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

Nu este mult de vzut la acesta, ns este cel puin ncrcabil n calculator. Utiliznd orice limbaj de programare (din generaia a 3-a) se poate scrie un cod care s deschid acest fiier i s preia informaia. Oricum am pune problema ns n implementarea acestui cod, se
5

Crearea i exploatarea bazelor de date relaionale

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

Crearea i exploatarea bazelor de date relaionale

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

Tabelul 4. Persoane de contact

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

Crearea i exploatarea bazelor de date relaionale

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.

4. Microsoft Visual FoxPro


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

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

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

Crearea i exploatarea bazelor de date relaionale

fereastra de comenzi 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:

5. Crearea unei baze de date


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

Se poate alege a se crea o baz de date cu ajutorul wizardului ca n figur n care ntr-o succesiune de 5 pai se precizeaz caracteristicile noii baza de date care se dorete s se creeze.

Crearea i exploatarea bazelor de date relaionale

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 adugm cele dou tabele, i anume COMPANII i PERSOANE_CONTACT. Alegem deci New/Database, New File, introducem numele noii baze de date (s spunem CLIENTI cnd se genereaz urmtorul rezultat:

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:

10

Crearea i exploatarea bazelor de date relaionale

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:

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:
11

Crearea i exploatarea bazelor de date relaionale

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

6. Normalizarea unei baze de date


Aa cum s-a putut vedea n exemplul prezentat, crearea unei baze de date relaionale presupune identificarea tuturor relaiilor ntre atributele entitilor care sunt stocate sau se vor stoca n baza de date. Se poate ca aceste relaii s se identifice dup ce structura bazei de date a fost creat. Oricum, procesul prin care se elimin cele 3 anomalii (la modificare, la tergere i la adugare) se numete normalizare. nelegerea normalizrii este vital pentru lucrul cu baze de date relaionale. Normalizarea nu este un proces cu care se ncepe sau se termin designul bazei de date. Este un proces care se aplic oricnd se identific anomalii. Experiena i instinctul totdeauna joac un rol important n crearea unei bune baze de date. Normalizarea se poate realiza prin trecerea succesiv a datelor prin cteva forme normale. Pn n prezent s-au stabilit 7 astfel de forme normale, dintre care primele 3 asigur o calitate destul de bun a organizrii relaionale a bazei de date i majoritatea bazelor de date relaionale sunt organizate pn la aceast form. Prima form normal a datelor necesit ca: datele s fie structurate ntr-un tabel; fiecare coloan trebuie s conin o singur valoare de un singur tip, adic s existe o singur valoare n fiecare celul; nu sunt permise iruri sau alte forme de reprezentare a mai mult de o valoare pe celul; fiecare coloan trebuie s aib un nume unic; tabelul trebuie s aib un set de valori care identific n mod unic o linie; valorile din aceast coloan se numesc chei primare pentru tabel; nu trebuie s existe dou linii identice n tabel; nu sunt permise grupuri repetitive de date; Ultima afirmaie necesit explicaii. Fie datele din tabelul 5:
12

Crearea i exploatarea bazelor de date relaionale

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

Crearea i exploatarea bazelor de date relaionale

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

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:

14

Crearea i exploatarea bazelor de date relaionale

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

15

Crearea i exploatarea bazelor de date relaionale

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

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

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

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

16

Crearea i exploatarea bazelor de date relaionale

Tabelul 10. Clieni ai publicaiilor

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

8. Alte aspecte ale stocrii datelor n BD relaionale


Integritatea referenial. Exemplele discutate pn acum au folosit chei strine. O cheie strin este o coloan care refer o cheie primar dintr-o alt tabel a bazei de date cu ajutorul creia se realizeaz relaia ntre cele dou tabele. De exemplu, tabelele n 3 i 4:

17

Crearea i exploatarea bazelor de date relaionale

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

18

Crearea i exploatarea bazelor de date relaionale

9. Lucrul cu Project Manager n VFP


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

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

19

Crearea i exploatarea bazelor de date relaionale

10. Crearea tabelelor i indexurilor


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

Valori numerice fr zecimale True sau False Text alfanumeric de lungime necunoscut General OLE Foaie de calcul din Excel Parolele unor utilizatori stocate ntr-o Character La fel cu Character dar valorile nu tabel i folosite n diferite ri (Binary) sunt translatate atunci cnd se schimb codul de pagin Scriptul de logare al unui utilizator (n Memo La fel cu Memo dar valorile nu diferite ri) (Binary) sunt translatate cu schimbarea codului de 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;
20

Crearea i exploatarea bazelor de date relaionale

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. Deplasarea ntr-o tabel. Utiliznd barele de defilare orizontale i verticale ne putem deplasa i vizualiza cmpuri diferite i nregistrri diferite. Se pot folosi de asemenea sgeile i TAB-ul. Pentru a accesa o anume nregistrare, pentru a ne deplasa de la o nregistrare la alta, pentru a ajunge la nceputul sau sfritul tabelei se poate accesa din meniu Table/Got o Record > cnd se activeaz un submeniu din care se alege opiunea dorit. Pentru a edita cmpurile de tip Character, Numeric, Logical, Date sau DateTime este suficient s plasm cursorul n celula dorit i s scriem valoarea dorit. Editarea cmpurilor Memo se face cu dublu click n cmpul dorit (sau CTRL+PgDn). Atunci se activeaz o fereastr de editare pentru coninutul cmpului memo. Un cmp general conine un obiect OLE (detalii la http://www.microsoft.com/data/oledb/prodinfo.htm) legat sau ncapsulat. Se poate edita acest obiect cu dublu click n celula sa, cnd se va activa (sau se va ncerca activarea) aplicaiei sale asociate pentru editare. tergerea nregistrrilor. tergerea nregistrrilor dintr-o tabel este un proces n 2 pai n VFP. Primul, marcarea nregistrrilor pentru tergere de exemplu cu click pe boxa din stnga fiecrei nregistrri de ters. Al doilea, din meniu, Table/Remove Deleted Records care va terge nregistrrile marcate pentru tergere. Aceasta este o tergere permanent i nu poate fi restaurat, spre deosebire de prima care este doar o tergere logic i poate fi restaurat prin demarcarea nregistrrilor prin acelai procedeu. Eliminarea nregistrrilor terse va nchide tabela aa nct aceasta trebuie redeschis pentru a putea fi utilizat. Pentru a terge mai multe nregistrri care verific o condiie se poate folosi fereastra de dialog care se activeaz din meniu Table/Delete Records Analog, pentru a restaura nregistrri care verific o condiie se poate accesa din meniu Table/Recall Records... De exemplu, ca n figur, se pot selecta toate nregistrrile care au valoarea UK n cmpul Country, folosind expresia FOR Country = 'UK':

21

Crearea i exploatarea bazelor de date relaionale

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

22

Crearea i exploatarea bazelor de date relaionale

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:

1 2 3

4 n care avem posibilitatea: 1 s modificm numele pentru un index; 4 s alegem tipul indexului dup cum urmeaz:

o index primar (cheie primar) unde doar valori unice sunt permise n cmp i determin ordinea de procesare a nregistrrilor; se pot crea cte un index primar pentru fiecare tabel dintr-o baz de date; dac tabela are deja un index primar, se poate crea atunci un index candidat; o index candidat care de asemenea necesit valori unice i determin ordinea de procesare a nregistrrilor; pot exista mai multe indexuri candidate pentru 1 tabel; o index regular care permite duplicarea valorilor ce intr ntr-un cmp, este folosit pentru a determina ordinea de procesare i poate exista mai mult de 1 index regular pentru o tabel; o index unic pstrat pentru compatibilitate cu versiunile mai vechi care selecteaz i ordoneaz un subset de nregistrri bazat pe prima apariie a unei valori ntr-un cmp specificat; 5 s definim o expresie simpl (format din numele unui cmp) sau compus (o expresie n care intervin nume de cmpuri din tabel) dup cum urmeaz: o cmpurile sunt evaluate n ordinea n care apar n expresie; o operatorul + aplicat la cmpuri numerice va aduna valorile din cmpuri:
23

Crearea i exploatarea bazelor de date relaionale

employ.salary + employ.prime o operatorul + aplicat la cmpuri caracter va concatena irurile de caractere din cmpuri: customer.country + customer.postalcode + customer.company o sunt permise conversiile la tipul ir de caractere prin intermediul funciei STR(): 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 Un index regular, primar sau candidat de 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.

11. Colectarea tabelelor ntr-o baz de date


Punnd tabelele ntr-o baz de date, se poate reduce stocarea datelor redundante i se poate proteja integritatea datelor. Un SGBD cum este VFP furnizeaz mediul de lucru pentru: lucrul cu tabele; stabilirea relaiilor ntre tabele; setarea proprietilor i regulilor de validare pentru date. Urmtorul exemplu arat cum se realizeaz o baz de date. Problema: S presupunem c se dorete realizarea unei baze de date care s conin informaii despre universiti i persoane de contact n cadrul acestora. Aa cum s-a discutat pn acum aceasta presupune crearea a cel puin dou tabele n cadrul bazei de date ntre care s se stabileasc relaii.
24

Crearea i exploatarea bazelor de date relaionale

Obiective: crearea unui proiect (Project Manager); crearea unei baze de date (Database Designer); Implementare: crearea proiectului 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; 1. Din meniu sau din bara de instrumente se selecteaz File/New (File Type: Project)/New

crearea bazei de date

5. Din Project Manager din categoria Data se selecteaz Databases i se apas butonul New i apoi New Database;

25

Crearea i exploatarea bazelor de date relaionale

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;

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;

26

Crearea i exploatarea bazelor de date relaionale

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:

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;

27

Crearea i exploatarea bazelor de date relaionale

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

Crearea i exploatarea bazelor de date relaionale

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

12. Validarea datelor la adugare sau modificare


Pentru a controla tipul informaiei introduse de utilizator ntr-un cmp dintr-o tabel se poate valida data independent de orice alt intrare n nregistrare, se poate realiza o validare la nivel de cmp a datelor. De exemplu, pentru a ne asigura c utilizatorul nu introduce o valoare negativ ntr-un cmp care trebuie s conin doar valori pozitive. Fie cazul cnd dorim s validm printr-o regul de acest tip cmpul nr din tabela Contacte a bazei de date Universitati. O soluie ar arta astfel: Valoarea nu e pozitiva

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

29

Crearea i exploatarea bazelor de date relaionale

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:

13. Manipularea nregistrrilor n baza de date i integritatea referenial


Dup ce au fost stabilite relaiile, se pot de asemenea defini regului pentru manipularea nregistrrilor n baza de date. Acestea asigur integritatea referenial. De exemplu, dac se adaug o companie n tabela companii, se dorete adugarea automat a informaiilor despre persoana de contact n tabela persoane_contact. Pentru aceasta se folosete Referential Integrity Builder. Se urmeaz paii: cu baza de date deschis din meniu se selecteaz Database/Clean Up Database; cu dublu click pe linia ce marcheaz relaia se activeaz fereastra Edit Relationship; se apas butonul Referential Integrity...; n fereastra creat se selecteaz regulile pentru integritatea referenial:

30

Crearea i exploatarea bazelor de date relaionale

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

Ignore

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.

31

Crearea i exploatarea bazelor de date relaionale

Aplicaie: S se creeze baza de date cu cursanii colii Academice Postuniversitare de Informatic Aplicat i Programare.

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 LOCALITATE C 20 JUDET C 20 ADRESA M 10 TELEFON N FORMA_INV C S-scoala M-module

N C C C N N N N

5 70 10 12 2 2 2 2

8

10 1

32

Crearea i exploatarea bazelor de date relaionale

3. Repart.dbf COD_STUD N 5 COD_MODUL N 5 FORMA C 1 (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

4. Taxe.dbf COD_STUD SUMA DATA COD_MODUL 8. Prof.dbf COD_PROF NUME TELEFON SALAR_ORAR

N N D N N C N N

5 10 8 5 5 20 10 10 12 5 12

10. Centre.dbf ORAS C COD_CENTRU N REPORT N

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

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

Crearea i exploatarea bazelor de date relaionale

regulile de validare pentru nregistrri; regulile de integritate referenial.

14. Interogarea unei baze de date i limbajul SQL


SQL este limbaj structurat pe interogri, baz de date interogativ i limbaj de programare. Utilizarea setului de instruciuni SQL este legat de crearea de interogri (Query Designer), definirea de vederi (View Designer), editarea de rapoarte (Report Designer). De asemenea, o comand SQL poate fi dat n fereastra Command (Window/Command Window) sau inclus n proceduri i programe. Crearea de interogri i vizualizri Dup ce a fost creat baza de date, au fost definite tabelele i relaiile ntre acestea, cum este cazul pentru baza de date universitati n care cheia primar pentru tabela institutii este nr iar tabela contacte are asociat cheia strin nr (care este un index regular la tabel), iar relaia ntre cele dou tabele este definit pe baza acestei relaii, se poate crea o nou interogare. Pentru crearea unei noi interogri, din Project Manager se selecteaz Queries, se apas butonul New... apoi New Query. Se lanseaz atunci aplicaia expert Query Designer:

Practic, operaiile efectuate pn n acest moment sunt rezultatul unor instruciuni simple n limbajul SQL, specificate prin intermediul wizard-ului pe care sistemul le-a executat pentru noi, instruciuni care se pot vizualiza de la butonul SQL: FROM clienti!companii INNER JOIN clienti!persoane_contact ; ON Companii.company_id = Persoane_contact.company_id
34

Crearea i exploatarea bazelor de date relaionale

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> Se pot selecta acum cmpurile care s participe la interogare, ca n exemplul:

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

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

35

Crearea i exploatarea bazelor de date relaionale

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

36

Crearea i exploatarea bazelor de date relaionale

15. Crearea de vederi locale


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

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

Crearea i exploatarea bazelor de date relaionale

SELECT Contacte.poz, Contacte.nume, Contacte.functia, Contacte.email,; 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;
38

Crearea i exploatarea bazelor de date relaionale

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 39

Crearea i exploatarea bazelor de date relaionale

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

6. Se construiete vederea Nou_Contact pe baza tabelelor Contacte i Institutii; se includ toate cmpurile din tabela Contacte i cmpul nume din tabela Institutii i se procedeaz identic cu cazul anterior; 7. Se construiete vederea Noua_Institutie pe baza tabelei Institutie, n care se includ toate cmpurile din tabel; se procedeaz la fel cu cazurile anterioare; Utilizarea Wizard-ului pentru crearea de vederi Pentru vizualizarea tuturor persoanelor care aparin unei instituii cu un anumit acronim se poate realiza o vedere parametrizat care s le includ. Se urmeaz paii: 1. Se selecteaz Local Views; Se activeaz New../View Wizard; 2. Se aleg cmpurile contacte.nume, institutii.nume, contacte.email, institutii.nr i contacte.nr;

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

40

Crearea i exploatarea bazelor de date relaionale

16. Lucrul cu fereastra de comenzi


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

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

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

Comenzile DISPLAY i LIST sunt folosite pentru afiarea coninutului tabelelor.


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

Exemplu:
USE Contacte DISPLAY ALL

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

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

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

Crearea i exploatarea bazelor de date relaionale

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

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


DISPLAY ALL OFF

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


DISPLAY

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

Comanda LIST are sintaxa:


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

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

afieaz nregistrrile ce conin irul Gi n cmpul nume.


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

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

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

va afia:
7

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

Crearea i exploatarea bazelor de date relaionale

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;
43

Crearea i exploatarea bazelor de date relaionale

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

Filtrele pentru nregistrri se definesc tot cu ajutorul comenzii SET:


SET FILTER TO POZ>10 LIST SET FILTER TO LIST

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

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

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

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

Crearea i exploatarea bazelor de date relaionale

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

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


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

Comanda RECALL restabilete nregistrrile suprimate cu DELETE.


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

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

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

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

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

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

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

Crearea i exploatarea bazelor de date relaionale

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

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

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

Comenzile se pot integra n fiiere de comenzi sau programe, care au faciliti suplimentare fa de facilitile oferite de fereastra de comenzi. Oricum, oricare din succesiunea de comenzi (sau toate la un loc) care au fost lansate n fereastra de comenzi se pot salva ntr-un program. Un nou program se creeaz din New/Program/New File. Se lanseaz n execuie cu comanda DO: DO ProgramName1 | ProcedureName [IN ProgramName2] [WITH ParameterList] Argumente: ProgramName1 specific numele programului de executat; ProgramName1.exe (versiunea executabil) ProgramName1.app (o aplicaie) ProgramName1.fxp (versiunea compilat) ProgramName1.prg (programul) 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.
46

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

Crearea i exploatarea bazelor de date relaionale

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

18. Lucrul cu funciile FVP exemple de utilizare


ABS() ? ABS(-45) ? ABS(10-30) ? ABS(30-10) && Afieaz 45 && Afieaz 20 && Afieaz 20

STORE 40 TO gnNumber1 STORE 2 TO gnNumber2 ? ABS(gnNumber2-gnNumber1) CHR() ntr-un program: CLEAR FOR nCOUNT = 65 TO 75 ? nCount ?? ' ' + CHR(nCount) ENDFOR DATE() CLEAR SET CENTURY OFF
47

&& Afieaz 38

&& Display numeric value && Display character

Crearea i exploatarea bazelor de date relaionale

? 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 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() CLEAR SET CENTURY OFF ? DMY(DATE( )) SET CENTURY ON ? DMY(DATE( )) && expresie de tip caracter n formatul day-month-year

48

Crearea i exploatarea bazelor de date relaionale

19. Constructorul de expresii (Expression Builder)


Constructorul de expresii este un instrument esenial n exploatarea unei baze de date. n elementele discutate el intervine n: definirea expresiilor pentru indeci; definirea regulilor de validare, mesajelor i valorilor implicite pentru cmpuri i nregistrri; definirea funciilor i expresiilor pentru noi cmpuri n interogri i vederi; definirea etichetelor de cmpuri la vederi;

Constructorul de expresii poate fi accesat din aplicaiile expert, ferestre, constructoare i wizard-uri. Permite definirea de expresii n care intervin cmpuri din tabele i vederi. Tipul expresiei construite trebuie s fie compatibil cu tipul acceptat de caseta de editare din care a fost ncrcat. De exemplu, dac a fost ncrcat dintr-o caset de editare n care se accept o valoare de tip ir de caractere (cum este cazul pentru Fields Caption) atunci valoarea expresiei construite trebuie s fie de tip ir de caractere. O expresie poate fi: simpl (numele unui cmp); complex (implicnd de exemplu un IF imediat); Pentru a construi expresii, se pot scrie n caseta de editare pentru expresii sau se pot selecta intrri din lista drop-down a funciilor pentru a se insera n caseta de editare. Pentru operaii cu iruri de caractere sau cmpuri ce conin iruri de caractere, sunt utile funciile ALLTRIM(), LTRIM(), RTRIM(), PADL(), PADR(), PADC(), SUBSTR(), LEFT(), RIGHT(), UPPER(), LOWER(), PROPER(), STR(). S presupunem c avem irul de caractere: " ? ALLTRIM(" ? LTRIM(" ABBA ABBA ss ") ") ABBA ss" "
49

". Atunci:

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

Crearea i exploatarea bazelor de date relaionale

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

ABBA ABBA ABBA ABBA ABBA ABBA ABBA ABBA ABBA ABBA

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

&& va afia "

ABBA" ABBA " ABBA ABBA " XXX" XX"

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

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

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

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

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

50

Crearea i exploatarea bazelor de date relaionale

20. Programare
n general, orice ce poate fi fcut cu un program, se poate face manual dac avem destul timp. De exemplu, dac cutm o persoan de contact n tabela contacte de exemplu Gheorghe Lazea, acest lucru poate fi fcut manual urmnd secvena de instruciuni: 1. Din meniul File selectm Open; 2. Din caseta File of type selectm Table; 3. Selectm tabela Contacte.dbf n lista fiierelor; 4. Din meniul View selectm Browse; 5. Parcurgnd coninutul tabelei, urmrind cmpul Nume identificm nregistrarea pentru Gheorghe Lazea; Din fereastra de comenzi, poate fi fcut acelai lucru scriind urmtoarele instruciuni: USE Customer LOCATE FOR Nume = "Gheorghe Lazea" BROWSE Dup ce am localizat nregistrarea putem s i modificm coninutul pentru a scrie de exemplu numele cu litere mari: REPLACE nume WITH UPPER(nume) sau s revenim la scrierea cu prima liter din nume mare: REPLACE nume WITH PROPER(nume) Instruciunile i comenzile pot fi integrate n programe. Acest fapt confer unele avantaje: programele pot fi modificate i executate din nou; se pot executa programele din meniuri, forme i bare de instrumente; programele pot executa alte programe; Un program n VFP se poate crea pe calea New/Program,New File sau din fereastra de comenzi cu comanda modify command. Un program simplu care s schimbe toate numele la litere mari este: use contacte scan replace nume with ; upper(nume) endscan unde scan parcurge toate nregistrrile din tabel i execut instruciunile ntre scan i endscan iar ; indic c o comand (comanda replace) se continu pe linia urmtoare. Pe lng comenzi, programele permit scrierea i de instruciuni (cum este cazul instruciunii scan).
51

Crearea i exploatarea bazelor de date relaionale

Pentru a restaura situaia anterioar n fiier este suficient ca s modificm programul nlocuind funcia UPPER(nume) cu funcia PROPER(nume). Pentru a executa o succesiune de comenzi i instruciuni n fereastra de comenzi, se introduc acestea n fereastra de comenzi (de exemplu cu Copy i Paste), se selecteaz (de exemplu de pe tastatur cu Shift i sgei) dup care se apas enter (permite i execuia de instruciuni). pentru a crea un program: New/Program,New File sau comanda modify command; pentru a salva un program: File/Save; pentru a deschide un program: File/Open/File type: program/Open sau modi comm <nume_program>; se poate face i modi comm ? cnd se activeaz o fereastr de dialog; pentru a executa un program: Program/Do... sau cu comanda do <nume_program>; Din perspectiva VFP exist urmtoarele containere pentru date: variabile (elemente individuale de date stocate n RAM); pentru a crea o variabil este suficient s precizm numele variabilei i valoarea corespunztoare; dac nu exist sau este de tip incompatibil, aceasta va fi creat cnd se distruge variabila anterioar cu acelai nume; alternativa pentru store este operatorul = cu semnificaia cunoscut din limbajul C; variabilele pot fi publice, locale i private; de exemplu: STORE DATE( ) TO local gdDate STORE 50 TO gnNumeric STORE 'Hello' TO gcCharacter STORE .T. TO glLogical STORE $19.99 TO gyCurrency DIMENSION gaMyArray(2,2) SET COMPATIBLE OFF STORE 2 TO gaMyArray CLEAR DISPLAY MEMORY LIKE g* iruri sau matrice (serii ordonate de elemente, stocate n RAM); se declar cu una din comenzile DIMENSION sau DECLARE; de exemplu: DIMENSION ArrayName[5,2] ArrayName[1,2] = 966789 ? ArrayName[1,2] tabele i nregistrri; o nregistrare poate avea peste 255 de cmpuri;

52

Crearea i exploatarea bazelor de date relaionale

Pentru lucrul cu tabele sunt utile comenzile SCATTER, GATHER, COPY TO ARRAY, i APPEND FROM ARRAY. Instruciunea IF are sintaxa: IF <expresie_logic> [THEN] [<comenzi i instruciuni>] [ELSE <comenzi i instruciuni>] ENDIF Un exemplu de program cu instruciunea IF: s se afieze nregistrrile care ndeplinesc o condiie oarecare. CLOSE DATABASES OPEN DATABASE ('Universitati') USE Contacte TYPE 'L' DEFAULT 'email = ""' LOCATE FOR &gcTemp IF FOUND( ) DISPLAY ELSE ? 'Conditia ' + gcTemp + ' nu a fost gasita' ENDIF USE Instruciunea CASE are sintaxa: 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:
53

&& deschide tabela contacte

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

Crearea i exploatarea bazelor de date relaionale

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

&& luna curent && nceperea buclei case

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

&& Exemplu FOR

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

54

Crearea i exploatarea bazelor de date relaionale

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

21. Proceduri i funcii


n VFP procedurile i funciile au sintaxa n forma: PROCEDURE <nume_procedur> <comenzi i instruciuni> ENDPROC iar apelul acestora este n forma: DO <nume_procedur> de a defini funcii i proceduri: PROCEDURE myproc( cString ) MESSAGEBOX ("myproc" + cString) ENDPROC FUNCTION plus2saptamani PARAMETERS dDate RETURN dDate + 14 ENDFUNC
55

FUNCTION <nume_funcie> <comenzi i instruciuni> ENDFUNC DO <nume_funcie>

Urmtoarea procedur afieaz un mesaj iar urmtoarea funcie arat o alt modalitate

Crearea i exploatarea bazelor de date relaionale

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

22. Rapoarte i etichete


5 forme de prezentare a rapoartelor sunt frecvente:

raport pe coloane

raport pe linii

raport 1 la n

raport multi coloan

etichet

Un raport se salveaz pe disc cu extensia *.frx i are de asemenea asociat i un fiier cu extensia *.frt. ntr-un raport se specific cmpurile dorite, textul de imprimat i plasarea informaiei n pagin. Informaia efectiv din raport se ncarc n momentul procesrii raportului pentru imprimare i este conform cu modificrile care survin n tabelele i vederile folosite n ntocmirea raportului. Se poate crea un raport pe 3 ci: Report Wizard (pentru rapoarte dintr-o singur tabel sau din mai multe tabele i/sau vederi), Quick Report (dintr-o singur tabel sau vedere) i cu ajutorul lui Report Designer (rapoarte definite n ntregime de utilizator). Utilizarea lui Report Wizard n Project Manager se selecteaz Reports/New/Report Wizard. Se selecteaz tipul de raport care se dorete a se crea i apoi se urmresc instruciunile din ferestrele interogative. Aplicaie: realizarea unui raport cu persoanele contact din baza de date Universitati. Rezolvare: se urmeaz paii: 1. Se deschide proiectul Universitati.pjx (File/Open...); 2. Se ncarc baza de date Universitati.dbc (optiunea Modify); 3. Se selecteaz tabulatorul Documents i de aici Reports; 4. Se acioneaz butonul New... i apoi se selecteaz Report Wizard; 5. Se selecteaz One-to-Many Report Wizard i se activeaz Ok;
56

Crearea i exploatarea bazelor de date relaionale

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

4. Se modific raportul cu ajutorul instrumentelor din Report Controls adugnd totalul dup poz n Group Footer. Realizarea unui raport dintr-o vedere i Quick Report 1. Se deschide proiectul Universitati.pjx (File/Open...); 2. Se ncarc baza de date Universitati.dbc (optiunea Modify); 3. Se selecteaz tabulatorul Documents i de aici Reports; 4. Se acioneaz butonul New... i apoi se selecteaz Report Wizard;
57

Crearea i exploatarea bazelor de date relaionale

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); 12. Se apas butonul Preview...; (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;

58

Crearea i exploatarea bazelor de date relaionale

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

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

Crearea unei etichete dintr-o vedere cu parametru Se poate folosi vederea caut_contact din baza de date universitati. Se urmeaz paii: 1. n Label Wizard se alege vederea caut_contact; 2. Se alege sistemul metric i tipul Avey EAL 04; 3. Se definete forma ( de exemplu: nume_a 5. Se salveaz eticheta caut_contact; 6. Se execut vederea de la butonul Preview... cnd se activeaz mesajul interogativ;
59

de la

nume_b : Email);

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

Crearea i exploatarea bazelor de date relaionale

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); 9. Se mrete caseta alocat textului din Label Designer;

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

60

Crearea i exploatarea bazelor de date relaionale

24. Formulare
Aa cum rapoartele permit facila tiprire a tabelelor, interogrilor i vederilor, formularele sunt o cale eficient pentru afiarea, introducerea i editarea informaiilor din baza de date. Se pot crea formulare interactive din tabele i vederi, utiliznd wizard-ul, constructorul i aplicaia expert Form Designer. Form Wizard Din Project Manager din tabulatorul Documents se selecteaz Forms apoi New i Form Wizard dup care se urmeaz instruciunile din ferestrele interogative urmtoare.

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

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

61

Crearea i exploatarea bazelor de date relaionale

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";
62

Crearea i exploatarea bazelor de date relaionale

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

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

63

Crearea i exploatarea bazelor de date relaionale

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

Adugare i Modificare

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

Crearea i exploatarea bazelor de date relaionale

Form Builder Constructorul de formulare (Form Builder) se poate activa pe urmtoarea succesiune de pai: 1. Se ncarc proiectul; 2. Se selecteaz opiunea Forms; 3. Se apas New/New form; 4. Din bara de instrumente a lui Form Desiner se selecteaz Form Builder sau din meniul VFP, Form/Quick Form; Aplicaia 3. S se construiasc un formular pentru modificarea unei persoane de contact. Rezolvare. Se urmeaz paii: 1. Se ncarc Form Builder; 2. Se deschide universitati.dbc sau contacte.dbf; 3. Se selecteaz cmpurile din contacte.dbf; 4. Se alege stilul (de exemplu Colorful); 5. Se salveaz formularul; 6. Se lanseaz n execuie; Formularul va ncrca din tabela Contacte prima nregistrare care va putea fi modificat dup dorin. La nchiderea formularului modificrile efectuate se vor transmite n tabela Contacte (dac nu a aprut conflict la modificarea cheii strine contacte.nr). Pentru a mbunti formularul creat este necesar s adugm controale pe acesta cu ajutorul barei de instrumente Form Controls. Din aceasta se poate aduga un control Spinner (Spiner1).

La lansarea n execuie a formularului se poate observa c sgeile controlului Spinner1 ( i ) incrementeaz sau decrementeaz valoarea din caseta de editare a acestuia fr ns ca odat cu aceasta s se deplaseze pointerul nregistrrii curente n tabela Contacte i s accesm o alt nregistrare. Este necesar setarea proprietilor controlului Spinner1. O posibilitate este ca mai jos: ControlSource Contacte.poz DownClick Event (User Procedure) SpinerHighValue = RECCOUNT() SpinnerLowValue = 1 UpClick Event (User Procedure)
v = val(Form2.Spinner1.Text) if v >= 1 and v <= recsize() goto v Form2.NUME1.Text1.refresh Form2.FUNCTIA1.Text1.refresh Form2.EMAIL1.Text1.refresh Form2.NR1.Text1.refresh else return to master endif

65

Crearea i exploatarea bazelor de date relaionale

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
66

Crearea i exploatarea bazelor de date relaionale

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

Crearea i exploatarea bazelor de date relaionale

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:
68

Crearea i exploatarea bazelor de date relaionale

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

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

Crearea i exploatarea bazelor de date relaionale

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

Crearea i exploatarea bazelor de date relaionale

25. Controale
Controalele sunt mediul de baz pentru interaciunea cu utilizatorul. Acestea se aplic pe formulare i pot avea asociate: valori (controlul buton de opiune are valoarea implicit 0 dac Valori: 0 1 este selectat i valoarea implicit 1 dac nu este selectat); dac 1 numele formularului este Form4 (proprietatea OptionGroup1 Name) atunci iar numele la grupului de butoane de opiune este accesul valoare se face pe calea Form4.OptionGroup1.Option1.Value; cmpuri (proprietatea ControlSource); variabile ....

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

Crearea i exploatarea bazelor de date relaionale

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:

72

Crearea i exploatarea bazelor de date relaionale

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

Crearea i exploatarea bazelor de date relaionale

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 replace nr with val(ThisForm.Text5.Text) ThisForm.Refresh

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

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

26. Controale i containere n FVP


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

Crearea i exploatarea bazelor de date relaionale

Obiecte VFP: o Controale: Vizuale (pot fi vizibile la execuie): Check Box ( ) Combo Box ( ) Command Button ( ) Control (poate conine orice control) Edit Box ( ) 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 ( ) creeaz o legtur ctre o imagine care este afiat n format BMP Label ( ) creeaz o etichet care poate afia un text Line ( ) creeaz un control care poate afia o linie List Box ( ) poate afia o list de valori OLE Bound Control ( ) poate afia un obiect de tip general ntr-un cmp dintr-un tabel (de exemplu provenit din Word sau Excel) OLE Container Control ( )poate afia un obiect de tip general n aplicaie (de exemplu provenit din Word sau Excel) OptionButton (adaug un buton de opiune ntr-un container de tipul Option Button Group) Shape ( ) creaz un control care poate afia o form geometric Spinner ( ) creeaz un control care poate afia o cast de editare de tip text pentru o valoare i dou butoane pentru parcurgerea valorilor unui domeniu de valori asociat casetei de tip text Text Box ( ) creeaz un control care poate afia o caset de editare de tip text Non-vizuale: 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 o Containere: Vizuale: Container (poate conine orice control, ) Form (poate conine Pageframe, orice control, containere, Custom) Grid (poate conine coloane grid; coloanele grid fac legturi la orice tip de obiecte exceptnd formularele, seturile de formulare, barele de instrumente, controalele de timp i alte coloane de grid); cu ajutorul gridurilor ( ) se pot afia datele n linii i coloane i este similar cu apariia lor ntr-o fereastr Browse Column (creeaz o coloan ntr-un grid) Page (o pagin poate conine orice controale, containere, Custom) Toolbar (poate conine orice control, pagini, containere) Option Button Group (poate conine butoane de opiune, ) Command Button Group (poate conine butoane de comand, ) Non-vizuale: Form Set (poate conine formulare i bare de instrumente) PageFrame (poate conine pagini)
75

Crearea i exploatarea bazelor de date relaionale

Toate obiectele VFP au asociate urmtoarele evenimente (prin proceduri): Init: este executat atunci cnd obiectul este creat; Destroy: este executat atunci cnd obiectul este dealocat din memorie; Error: este executat atunci cnd o eroare apare la execuia procedurilor din obiect;

Pentru accesarea obiectelor VFP din aplicaie n timpul execuiei sunt utile urmtoarele proprieti: Parent: containerul care conine obiectul care refer procedura; de exemplu pentru formularul Test.scx proprietatea Parent apelat n procedura Option1.Click va returna o referin ctre containerul acestui obiect (OptionGroup1); This: obiectul curent; ThisForm: formularul curent; ThisFormSet: FormSetul curent;

Exemplu: 1. Se selecteaz obiectul Option1 din formularul Test; 2. n caseta procedurii Option1.Click (Click Event) se introduce MessageBox("Container: "+This.Parent.Name + " Formularul: " + ThisForm.Caption); 3. Se execut formularul; Un control poate fi legat de datele din tabele sau din variabilele din memorie pe baza proprietii ControlSource. Schematizarea efectelor valorilor atribuite proprietii ControlSource asupra controalelor: caset de validare: o ControlSource = cmp de tabel: valorile NULL, valorile logice (.T. i .F.) i valorile numerice 0, 1 i 2 determin: selectarea, deselectarea sau dezactivarea casetei de validare pe msur ce indicatorul de nregistrri parcurge tabela; exemplu: s se construiasc o tabel ce conine un cmp cu valori numerice de 0, 1 i 2 i s se construiasc un formular care conine o caset de validare legat cu ControlSource de acest cmp i s se execute formularul; coloan: o ControlSource = cmp de tabel: utilizatorul editeaz direct valorile cmpului odat cu editarea valorilor din coloan; proprietatea se extinde la ntreaga gril cu ajutorul proprietii RecordSource a grilei; exemplu: proprietatea RecordSource de la formularul Universitati, obiectul grid1;
76

Crearea i exploatarea bazelor de date relaionale

caset combo sau list: 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: spinner: o ControlSource = cmp sau variabil numeric: text sau edit:
77

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

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

Crearea i exploatarea bazelor de date relaionale

o ControlSource = cmp: 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.

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

Click Event: Release ThisForm

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

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

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

78

Crearea i exploatarea bazelor de date relaionale

27. Constructoarele de controale i containere


Mediul VFP pune la dispoziia utilizatorului un set de constructoare pentru setarea proprietilor controalelor i containerelor. Astfel exist: Combo Box Builder (pentru liste ascunse), Command Group Builder (pentru grupuri de butoane de comand), Edit Box Builder (pentru casete de tip Edit), List Box Builder (pentru liste), Option Group Builder (pentru casete de opiune), Text Box Builder (pentru casete de tip Text), AutoFormat Builder (pentru grupuri de controale). Pentru a accesa un constructor: 1. Se plaseaz controlul pe formular din bara de instrumente Form Controls; 2. Se selecteaz controlul; se apas click dreapta; 3. Se selecteaz opiunea Builder; 4. Se aleg opiunile dorite din aplicaia expert corespunztoare controlului sau containerului selectat; Aplicaia 1. Formular cu 3 butoane de comand care s deschid i s parcurg tabela contacte. La apsarea unuia dintre butoane s se activeze o fereastr de mesaj cu coninutul nregistrrii curente. S se adauge apoi o caset de tip Text care s conin numele persoanei de contact selectate fr a permite modificarea. Rezolvare. Se pot urma paii: 1. Se genereaz un nou formular (Forms/New/New Form); 2. Se adaug un control Text i un container CommandGroup; 3. Se folosete aplicaia expert Text Box Builder pentru a seta proprieti pentru controlul Text1; : 4. Odat selectat tabela contacte, aceasta va fi automat inclus n mediul de lucru cu date al formularului; se poate vedea acest fapt pe calea View/Data Environment ...; de asemenea, n caseta Field name: se poate acum selecta orice cmp din tabel; se las contacte.nume; 5. Se folosete aplicaia expert Command Group Builder pentru a seta proprieti pentru containerul CommandGroup1;

79

Crearea i exploatarea bazelor de date relaionale

6. Se poate lansa n execuie formularul, cnd se observ c butoanele din container nu au asociate evenimente: apsarea butoanelor nu produce aciuni; 7. Se adaug evenimente: a. pentru formular: Activate Event: if not eof() thisform.commandgroup1.enabled = .T. endif b. pentru commandgroup1 doar proprietatea commandgroup1.enabled = .F. c. pentru command1, procedura Command1.Click: if recno() = 1 This.Enabled = .F. else skip -1 ThisForm.Text1.Refresh ThisForm.CommandGroup1.Command2.Enabled = .T. endif d. pentru command2, procedura Command2.Click: if recno() = reccount() This.Enabled = .F. else skip 1 ThisForm.Text1.Refresh ThisForm.CommandGroup1.Command1.Enabled = .T. endif e. pentru command3, procedura Command3.Click: mesaj = alltrim(nume) + chr(13) + alltrim(functia) +; chr(13) +alltrim(email) + chr(13) + "nr=" + alltrim(str(nr)) +; chr(13) + "poz=" + alltrim(str(poz)) MessageBox(mesaj,64) 8. Se execut formularul; acionarea butoanelor de comand produce acum evenimentele dorite. Aplicaia 2. Formular care s permit adugarea unei persoane de contact dup o machet predefinit. Rezolvare. Se creeaz un nou formular. Se urmeaz paii: 1. se adaug pe formular un control de list ascuns, un container de tipul butoane de opiune, 4 casete de tip text i un buton de comand; 2. se folosete aplicaia expert Combo Box Builder pentru a seta proprieti pentru Combo1; din baza de date universitati i tabela contacte se alege cmpul nume pentru a i se lega valorile cu lista ascuns; la stilul listei se alege Drop-down list;

80

Crearea i exploatarea bazelor de date relaionale

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;
81

Crearea i exploatarea bazelor de date relaionale

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

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

82

Crearea i exploatarea bazelor de date relaionale

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); Grid1; n tabulatorul Grid Items se selecteaz tabela contacte i din caseta Available fields se includ n caseta Selected fields cmpurile: Nume, Functia, Email; 9. n tabulatorul Relationship n caseta Key field in parent table: se selecteaz Institutii.nr iar n caseta Related index in child table: se selecteaz cmpul nr; 10. Se seteaz manual proprietile i evenimentele controalelor i containerelor: 10.1. 10.2. evenimentul Form1.Activate: evenimentul Page1.Click: ThisForm.Grid1.Visible = .T.; ThisForm.Grid2.Visible = .F. ThisForm.Grid1.Visible = .T. 10.3. evenimentul Page2.Click: ThisForm.Grid1.Visible = .F. ThisForm.Grid2.Visible = .T.
83

8. Se lanseaz aplicaia expert Grid Builder pentru definirea proprietilor containerului

Crearea i exploatarea bazelor de date relaionale

10.4. 10.5. 10.6. 10.7.

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

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

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

ThisFormSet.Release ThisFormSet.Release

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

Crearea i exploatarea bazelor de date relaionale

7. Se execut setul de formulare.

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);
85

Crearea i exploatarea bazelor de date relaionale

3. Asocierea de evenimente astfel nct sistemul s fac ce dorim (specificarea aciunilor pentru meniuri de efectuat; adiional, se poate include cod de iniializare i cod de curire); codul de iniializare se execut nainte ca meniul sistem s apar i se poate include cod pentru deschiderea de fiiere, declararea de variabile; codul de curire conine ceea ce se va executa dup codul de definire a meniului i poate face meniul sau elementele din meniu selectabile sau neselectabile; 4. Generarea programului pentru meniu; 5. Execuia programului pentru a testa sistemul. Aplicaia 5. S se creeze un meiul dup modelul:

86

Crearea i exploatarea bazelor de date relaionale

29. Dezvoltarea de meniuri pentru aplicaii


Crearea unui meniu pentru o aplicaie este asociat de obicei cu integrarea tuturor componentelor aplicaiei ntr-un ansamblu care s permit execuia fiecrei componente. Finalitatea acestui proces reprezint sistemul de gestiune al bazei (sau bazelor) de date client. Pentru construcia meniului sistemului se poate folosi aplicaia expert Menu Builder sau se poate construi direct prin instruciuni, aa cum se va vedea n codul generat de VFP n urma generrii unui meniu. Aplicaia 1. S se construiasc un meniu cu opiuni de comand pentru aciunile: deschidere baza de date Universitati, afiare ferestre de Browse pentru tabelele Institutii i Contacte i o opiune Help About. Rezolvare. Se urmeaz paii: 1. Se creeaz un director pentru stocarea fiierelor aplicaiei; 2. Se creeaz un nou proiect (New/Project/New file); fie acesta proj1.pjx; 3. n fereastra de comenzi se testeaz funcia GetDir(), Sys(5) i Sys(2003): GETDIR(,default for the application) respectiv Sys(5) i Sys(2003); 4. n Project Manager la categoria Code se alege Programs i aici New...; 5. n fereastra pe care sistemul VFP o deschide se va crea un nou program care va gestiona proiectul; fie acesta Program1; 6. Se introduc urmtoarele comenzi: cale_veche = sys(5)+sys(2003) messagebox("cale veche: "+cale_veche) cale = GETDIR("","default for the application") if like(cale,"")=.F. set default to &cale messagebox("noua cale: "+cale) endif * comenzi pentru executia aplicatiei * ... * sfarsit aplicatie 7. Se salveaz fiierul; ne asigurm c acesta a fost salvat n directorul proiectului proj1.pjx; 8. n Project Manager se selecteaz programul program1 i apoi din meniul VFP la Project se verific c programul program1 are opiunea Set Main selectat ( Set Main); n caz contrar se selecteaz; se execut i testeaz programul (Project 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:
87

Crearea i exploatarea bazelor de date relaionale

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

Crearea i exploatarea bazelor de date relaionale

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
89

Crearea i exploatarea bazelor de date relaionale

endif if like(tabela_use1, "") Return && do nothing endif if Used(tabela_use1) use && inchide tabela precedenta i=1 On Error i = 0 USE &tabela_use1 in 0 again shared On Error if (i = 0) use &tabela_use && redeschide tabela precedenta MessageBox("Table opened in exclusive mode by another program") Return else tabela_use = tabela_use1 Set Skip of Pad Browse1 of _MSYSMENU .F. return endif endif use && inchide tabela precedenta i=1 On Error i = 0 USE &tabela_use1 On Error if (i = 0) use &tabela_use && redeschide tabela precedenta MessageBox("Table opened in exclusive mode by another program") Return else tabela_use = tabela_use1 Set Skip of Pad Browse1 of _MSYSMENU .F. endif 30. Se poate aduga un BAR Close (File/Close) a crui procedur s dezactiveze pe Browse: use tabela_use = "" Set Skip of Pad Browse1 of _MSYSMENU .T. 31. Se lanseaz n execuie i se testeaz aplicaia program1; se genereaz executabilul; 32. Se pot elibera din memorie inclusiv elementele sistem, ca n exemplul: RELEASE PAD _MEDIT OF _MSYSMENU Aplicaia 2. Un meniu creat fr constructorul de meniuri. Soluie. Se creeaz un nou program (File/New/Program/New file); se salveaz cu numele Definpad.prg. filen = Locfile("definpad", "prg,app,exe", "Locate definpad.prg") set default to substr(filen,1,RAT("DEFINPAD.",filen)-1) Clear
90

Crearea i exploatarea bazelor de date relaionale

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

Crearea i exploatarea bazelor de date relaionale

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

Crearea i exploatarea bazelor de date relaionale

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
93

Crearea i exploatarea bazelor de date relaionale

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

Crearea i exploatarea bazelor de date relaionale

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
95

Crearea i exploatarea bazelor de date relaionale

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

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

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

Crearea i exploatarea bazelor de date relaionale

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
97

Crearea i exploatarea bazelor de date relaionale

f. Command6.Click: Do Definepop.prg g. Command7.Click: Do menu2.mpr Do menu2.mpr Set Skip of Pad Browse1 of _MSYSMENU .T. read events h. Command8.Click: SET SYSMENU TO DEFAULT ThisForm.Release Cancel 4. Se modific programul program1: tabela_use = "" public cale_veche cale_veche = sys(5)+sys(2003) ... * comenzi pentru executia aplicatiei Do Form form1.scx Read events set default to cale_veche+"\" messagebox("restaurare cale: "+sys(5)+sys(2003)) * sfarsit aplicatie 5. Se modific procedurile Menu1/Quit i Menu2/Quit i se regenereaz codul meniurilor: Messagebox("Now exit the application") SET SYSMENU TO DEFAULT Return to Master 6. Se execut formularul; se genereaz i testeaz executabilul. Generarea de meniuri contextuale Un meniu contextual se activeaz atunci cnd se execut click dreapta pe un control sau pe un obiect i reprezint o modalitate rapid de a afia toate funciile aplicabile acelui obiect. Un meniu contextual se realizeaz pe calea Project Manager/Other/Menus/New... Urmtorul exemplu implementeaz un meniu contextual pentru operaii de editare. Poate fi preluat direct pe calea MSDN98\98VSa\1033\Samples\Solution\Vfp98\Solution cnd se copiaz fiierele Edtshort.mnx i Edtshort.MNT dup care se adaug la proiect (Project Manager proj1/Other/Menus/Add.../Edtshort.mnx). Message: "Removes the selection and places it onto the Clipboard"; Key Label: CTRL+X; Key Text: Ctrl+X "Copies the selection onto the Clipboard"; CTRL+C; Ctrl+C "Pastes the contents of the Clipboard"; CTRL+V; Ctrl+V "Removes the selection and does not place it onto the Clipboard"
98

Crearea i exploatarea bazelor de date relaionale

IF TYPE("m.oRef") = "O" m.cFont = GetFont() IF EMPTY(m.cFont) RETURN ENDIF m.commaLoc = AT(",",m.cFont) m.comma2Loc = AT(",",m.cFont,2) oRef.FontName = SUBSTR(m.cFont,1,m.commaLoc-1) oRef.FontSize = VAL(SUBSTR(m.cFont,m.commaLoc+1,m.comma2Loc-m.commaLoc)) oRef.FontBold = ATC("B",SUBSTR(m.cFont,m.comma2Loc))#0 oRef.FontItalic = ATC("I",SUBSTR(m.cFont,m.comma2Loc))#0 ENDIF 7. Se genereaz codul meniului; 8. Se modific formularul i se adaug evenimentul: do Edtshort.mpr read events 9. Se genereaz codul executabil i se testeaz aplicaia proj1. Generarea automat a aplicaiei cu aplicaia expert Application Wizard Se poate genera automat proiectul unei aplicaii pe calea File/New/Project/Wizard. Urmtorul exemplu genereaz automat proiectul pentru baza de date Universitati. Se urmeaz paii: 1. Se creeaz un nou director; 2. Se copiaz fiierele din directorul proiectului Universitati mai puin Universitati.PJT i Universitati.pjx; 3. Se lanseaz n execuie aplicaia expert Application Wizard; 4. Se definesc atributele proiectului:

99

Crearea i exploatarea bazelor de date relaionale

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

EXE

6.

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

Crearea i exploatarea bazelor de date relaionale

30. Baze de date externe i aplicaii client server


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

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

Win 9.x

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

Crearea i exploatarea bazelor de date relaionale

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


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

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

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

Crearea i exploatarea bazelor de date relaionale

4. Cu ajutorul lui phpmyadmin (http://www.lejpt.utcluj.ro/phpmyadmin) se pot crea acum utilizatori care s acceseze bazele de date MySQL din interfaa phpMyAdmin:

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

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

nr nume tip functia

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

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

c d e f g

domeniu tinyint(20) With selected:


Change

103

Crearea i exploatarea bazelor de date relaionale

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

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

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

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

Crearea i exploatarea bazelor de date relaionale

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

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

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

Se testeaz accesul pentru utilizatorul nou creat:

Tentativa de modificare a coninutului tabelelor este soldat eecului:

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

105

Crearea i exploatarea bazelor de date relaionale

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

read

postuniv

referenti

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

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

106

Crearea i exploatarea bazelor de date relaionale

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

Crearea i exploatarea bazelor de date relaionale

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

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

SELECT VIEW4.Nume; FROM DATA1!VIEW4 VIEW4; INNER JOIN DATA1!VIEW3 VIEW3 ON VIEW4.NUME = VIEW3.NUME; ORDER BY VIEW4.Nume to screen Se poate acum crea un executabil care s acceseze datele din conexiunea la distan. Se urmeaz paii: 1. Se creeaz un program principal pentru aplicaie (Project Manager proj1/Code/Programs/New...); fie acesta program1.prg; 2. Se introduc n acesta comenzile: set default to GETDIR("","default for the application") do form form1.scx 3. Se seteaz ca program principal al proiectului: Project Manager proj1/Code/Programs/program1/Project/Set Main; 4. Se creeaz formularul form1 pe calea Project Manager proj1/Forms/New Form dup modelul: Destroy Event: Cancel do form fview3.scx do form fview3.scx thisform.release cancel

108

Crearea i exploatarea bazelor de date relaionale

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


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

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

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

109

Crearea i exploatarea bazelor de date relaionale

3. Se construiete formularul form2:


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

browse thisform.release cancel

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

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

110

Crearea i exploatarea bazelor de date relaionale

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:

33. Comenzi SQL pentru accesul la un server de date


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

Crearea i exploatarea bazelor de date relaionale

Lista parametrilor poate accepta mai multe proprieti urmate de valorile lor, aa cum rezult din urmtorul tabel: proprietate (Property) BatchUpdateCount (*) Buffering Valoarea (eExpression) Numrul de comenzi update trimise ctre sursa de date pentru tabelele tampon. 1 seteaz tamponul pentru nregistrri i tabel la Off; 2 seteaz modul pesimistic pentru tamponul la nregistrri la On; 3 seteaz modul optimistic pentru tamponul la nregistrri la On; 4 seteaz modul pesimistic pentru tamponul la tabel la On; 5 seteaz modul optimistic pentru tamponul la tabel la On; CompareMemo FetchAsNeeded .T. face ca cmpurile Memo, General i Picture s fie incluse n clauza Where pentru modificri; .F. nu; .F. pentru vederi la distan numrul nregistrrilor preluate e determinat de proprietatea MaxRecord; pentru vederile locale toate nregistrrile sunt preluate; .T. toate; FetchMemo (*) FetchSize (*) KeyFieldList MaxRecords (*) .T. preia i cmpurile memo; .F. nu; Numrul de nregistrri citite progresiv de la distan; implicit 100; -1 face ca s se preia ntregul set; Lista de cmpuri (specificate prin nume) care se dorete a fi preluate n cursor, separate prin virgul; Numrul maxim de nregistrri preluate; -1: toate; 0: nici una (util pentru adugri, cnd se dorete execuia vederii, dar nu se dorete citirea de date de la distan ci doar scrierea); Prepared .T. atunci cnd se face doar o operaie de pregtire a interogrii (vezi aplicaia de la capitolul 32, n care s-a folosit funcia SQLPrepare(), similar ca efect); se folosete apoi REQuery(); SendUpdates Tables UpdatableFieldList UpdateNameList UpdateType UseMemoSize (*) .T. sau .F. Lista tabelelor la distan separate prin virgul Lista cmpurilor pentru Update (nume cmp n tabela la distan, urmat de nume cmp n cursor); Numele cmpurilor n cursor (pentru redenumiri); 1 vechile date sunt modificate cu cele noi; 2 tergerea datelor vechi i inserarea celor noi; Dimensiunea (n octei) maxim a unui cmp de la care acesta

112

Crearea i exploatarea bazelor de date relaionale

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

Crearea i exploatarea bazelor de date relaionale

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

114

Crearea i exploatarea bazelor de date relaionale

33. Aplicaie exemplu


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

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

Se creeaz acum formularele i rapoartele:

115

Crearea i exploatarea bazelor de date relaionale

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;

116

Crearea i exploatarea bazelor de date relaionale

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

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

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

117

Crearea i exploatarea bazelor de date relaionale

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

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

118

Crearea i exploatarea bazelor de date relaionale

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

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

119

Crearea i exploatarea bazelor de date relaionale

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:

120

Crearea i exploatarea bazelor de date relaionale

34. Documentarea aplicaiilor windows cu Microsoft HTML Help


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

35. Crearea unui nou fiier help (.chm) cu HTML Help Workshop
HTML Help Workshop este un produs free Microsoft i poate fi descrcat de la adresa: http://lori.east.utcluj.ro/JLorentz/free/htmlhelp.exe. 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.
121

Crearea i exploatarea bazelor de date relaionale

Pn n acest moment, coninutul fiierului postuniv.hhp este: [OPTIONS] Auto Index=Yes Compatibility=1.1 or later Compiled file=postuniv.chm Default Font=,12,0 Default topic=data\an_introduction.htm Display compile progress=Yes Enhanced decompilation=Yes Flat=Yes Full-text search=Yes Language=0x409 English (United States) Title=SAPIAP Program Help [FILES] data\t_stud.htm data\an_introduction.htm
122

Crearea i exploatarea bazelor de date relaionale

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 [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>
123

Crearea i exploatarea bazelor de date relaionale

<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> Se poate acum crea cuprinsul, ncepnd cu repertoarul acestuia:

124

Crearea i exploatarea bazelor de date relaionale

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

Se pot crea legaturi ctre pagini n cuprins pe calea:

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

125

Crearea i exploatarea bazelor de date relaionale

Se poate acum crea indexul:

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.

126

Crearea i exploatarea bazelor de date relaionale

36. Test de Crearea i Exploatarea Bazelor de Date Relaionale


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

127

Crearea i exploatarea bazelor de date relaionale

37. Model de soluie pentru testul de Crearea i Exploatarea Bazelor de Date Relaionale
Fie baza de date universiti. Soluie:

128

You might also like