Documente Academic
Documente Profesional
Documente Cultură
Programarea Rapida A Aplicatiilor Pentru Baze de Date Relationale
Programarea Rapida A Aplicatiilor Pentru Baze de Date Relationale
JÄNTSCHI, LORENTZ
Programarea rapidă a aplicaţiilor pentru baze de date
relaţionale / Lorentz Jäntschi, Mădălina Ana Văleanu, Sorana
Daniela Bolboacă. - Cluj-Napoca : AcademicPres :
AcademicDirect, 2006
Bibliogr.
Index.
ISBN (10) 973-744-044-7 ; ISBN (13) 978-973-744-044-0
ISBN (10) 973-86211-5-1 ; ISBN (13) 978-973-86211-5-2
I. Văleanu, Mădălina
II. Bolboacă, Sorana
004.42
Editura AcademicPres
Colegiu editorial:
Director editură: Prof. Dr. Doru PAMFIL
Consilier editorial: Prof. Dr. Radu SESTRAŞ
Editura AcademicDirect
Director editură: Prof. Dr. Ing. Gheorghe LAZEA
Redactor: Ş. L. Dr., Ing. Lorentz JÄNTSCHI
Referenţi ştiinţifici:
Prof. Dr. Ştefan ŢIGAN
Prof. Dr. Ing. Mugur BĂLAN
Editura AcademicPres
Universitatea de Ştiinţe Agricole şi Medicină Veterinară Cluj-Napoca
Calea Mănăştur, Nr. 3-5, 400372, Cluj-Napoca, Romania
Tel. +40-264-596384, Fax +40-264-593792
E-mail: eapcluj@yahoo.com
Editura AcademicDirect
Universitatea Tehnică din Cluj-Napoca
Muncii 103-105, 400641, Cluj-Napoca, Romania
Tel. +40-264-401775, Fax +40-264-592051
E-mail: root@ph.academicdirect.org
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Cuprins
I. Prefaţă..........................................................................................................................2
II. Despre autori ...............................................................................................................3
1. Baze de date şi SGBD .................................................................................................4
2. Formele Backus-Naur................................................................................................10
3. Baze de date relaţionale.............................................................................................11
4. Microsoft Visual FoxPro ...........................................................................................14
5. Crearea unei baze de date ..........................................................................................16
6. Normalizarea unei baze de date.................................................................................19
7. Tipuri de relaţii ..........................................................................................................22
8. Aspecte ale stocării datelor în BD relaţionale ...........................................................25
9. Lucrul cu Project Manager în VFP............................................................................27
10. Crearea tabelelor şi indexurilor .................................................................................28
11. Colectarea tabelelor într-o bază de date ....................................................................33
12. Validarea datelor la adăugare sau modificare............................................................38
13. Manipularea înregistrărilor în baza de date şi integritatea referenţială .....................39
14. Interogarea unei baze de date şi limbajul SQL..........................................................43
15. Crearea de vederi locale ............................................................................................46
16. Lucrul cu fereastra de comenzi..................................................................................50
17. Expresii......................................................................................................................56
18. Lucrul cu funcţiile FVP - exemple de utilizare .........................................................57
19. Constructorul de expresii...........................................................................................59
20. Programare ................................................................................................................61
21. Proceduri şi funcţii ....................................................................................................66
22. Rapoarte şi etichete....................................................................................................67
23. Macrosubstituţie ........................................................................................................72
24. Formulare ..................................................................................................................73
25. Controale ...................................................................................................................83
26. Controale şi containere în VFP..................................................................................87
27. Constructoarele de controale şi containere................................................................92
28. Meniuri ......................................................................................................................99
29. Dezvoltarea de meniuri pentru aplicaţii...................................................................100
30. Baze de date externe şi aplicaţii client - server .......................................................114
31. Configurarea unui client VFP/Win9.x pe un server MyQSL/FreeBSD ..................115
32. Administrarea de la distanţă a MyQSL/FreeBSD cu VFP/Win9.x .........................122
33. Comenzi SQL pentru accesul la un server de date ..................................................125
34. Aplicaţie exemplu....................................................................................................129
35. Documentarea aplicaţiilor windows cu Microsoft HTML Help .............................135
36. Crearea unui nou fişier help cu HTML Help Workshop .........................................136
37. Capitole speciale de baze de date ............................................................................142
38. Soluţia Microsoft Office: Excel & Access ..............................................................171
39. Probleme propuse ....................................................................................................216
40. Test de cunoştinţe ....................................................................................................223
41. Model de soluţie pentru test ....................................................................................224
III. Index de cuvinte cheie .............................................................................................225
IV. Bibliografie..............................................................................................................227
V. Abstract....................................................................................................................232
VI. Contents ...................................................................................................................233
1
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
I. Prefaţă
Din punctul de vedere al stilului programării, lucrarea oferă soluţia Microsoft, fiind
discutate trei aplicaţii dedicate bazelor de date oferite de firma Microsoft. În ordinea
complexităţii mediului de programare oferit, acestea sunt: Excel, Access şi Visual FoxPro. În
ceea ce priveşte versiunile aplicaţiilor discutate, acestea nu sunt nici ultimele versiuni de pe
piaţă, dar nici primele. Referindu-ne strict la Visual FoxPro, discuţia este purtată
exemplificând cu aplicaţii pentru versiunea 6 (an de apariţie 1998), discuţia fiind însă perfect
valabilă şi pentru versiunea 5 şi pentru 7.
Axa demersului didactic al lucrării este orientată de la problemă către soluţie, trecând
prin model matematic, algoritm şi implementare.
Lucrarea are un profund caracter formativ. Abilităţile care lucrarea doreşte a le forma
sunt: proiectarea, implementarea, normalizarea şi asigurarea integrităţii referenţiale unei baze
de date relaţionale şi implementarea aplicaţiilor de gestiune; utilizarea controalelor puse la
dispoziţie de un mediu de programare vizual pentru dezvoltarea rapidă a aplicaţiilor;
realizarea de aplicaţii complexe client-server pentru gestiunea bazelor de date distribuite. Nu
în ultimul rând se situează ingineria programării, tehnica de abordare a problemei propuse
spre rezolvare de sus în jos şi de jos în sus (top-down şi bottom-up - în engleză) folosind
binecunoscutul dicton latin divide et impera (desparte şi stăpâneşte - în traducere).
2
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Lorentz JÄNTSCHI
• s-a născut în 1973, în Făgăraş, Braşov; a absolvit pe rând Specializarea Informatică,
Facultatea de Matematică şi Informatică, în 1995, Specializarea Chimie - Fizică,
Facultatea de Chimie şi Inginerie Chimică, în 1997, la Universitatea „Babeş-Bolyai” Cluj-
Napoca, Masterul de Ameliorarea plantelor şi controlul calităţii seminţelor şi materialului
săditor, Facultatea de Agronomie, în 2002, la Universitatea de Ştiinţe Agricole şi Medicină
Veterinară din Cluj-Napoca;
• din anul 2000, Doctor în Chimie, Specializarea Chimie Organică, la Universitatea „Babeş-
Bolyai” Cluj-Napoca, cu Teza de Doctorat cu titlul Predicţia proprietăţilor fizico-chimice
şi biologice folosind descriptori matematici, efectuată sub îndrumarea Prof. Univ. Dr.
Mircea V. Diudea;
• profesor de liceu (informatică, titular la Colegiul Naţional G. Bariţiu Cluj-Napoca, 1995-
1999), doctorand (chimie organică, 1998-2000), preparator şi apoi şef de lucrări (chimie,
1999, 2000) la Universitatea Tehnică din Cluj-Napoca, cadru didactic asociat
(informatică, 2000-2006) la Şcoala Academică Postuniversitară de Informatică Aplicată şi
Programare de pe lângă UTCN;
• a înfiinţat două reviste (2002), şi o editură (2003), toate în formă electronică.
3
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
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 fişiere memorate permanent pe unul sau mai
multe suporturi fizice.
Gama largă de aplicaţii ale informaticii necesită acces rapid la mari cantităţi de date.
Iată câteva 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 intrări şi accesează citaţii din sute de
publicaţii;
• sistemele de procesare a tranzacţiilor în bănci şi casele de brokeraj păstrează conturi care
generează fluxul mondial de capital;
• motoarele de căutare World Wide Web scanează sute de pagini Web pentru a produce
răspunsuri cantitative la interogări aproape instantaneu;
• sute de mici întreprinzători şi organizaţii utilizează bazele de date pentru a stoca orice de
la inventare şi personal la secvenţe ADN şi informaţii despre obiecte provenite din
săpături arheologice.
Un produs software care presupune managementul fişierelor suportă descompunerea
logică a unui fişier în înregistrări. Fiecare înregistrare descrie o entitate şi constă dintr-un
număr de câmpuri, unde fiecare câmp dă valori unei anumite proprietăţi (sau atribut) al
entităţii.
4
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
5
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Modelul relaţional suportă interogări (cereri de informaţii) care implică mai multe
tabele prin asigurarea unor legături între tabele (operaţia join) care combină înregistrări 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. Informaţiile complete pentru un angajat pot fi obţinute prin reunirea
acestor tabele (join) pe baza numărului 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 dispoziţia utilizatorului posibilitatea de a interoga şi actualiza baza
de date.
Gestiunea datelor presupune o structurare a acestora realizată prin definirea bazelor de
date. Pentru ca exploatarea bazelor de date să fie eficientă, e necesar ca acestea să aibă un
grad înalt de abstractizare. Din punct de vedere practic, este normal să se definească mai
multe nivele de abstractizare. Putem lua în considerare:
• Nivelul fizic (sau intern). La acest nivel se găsesc toate detaliile legate de reprezentarea
datelor pe un suport de memorie;
• Nivelul logic (sau conceptual). Se ia in considerare aspectul semantic al datelor; contează
conţinutul efectiv al lor, precum şi relaţiile (legăturile) dintre acestea; se descriu toate
bazele de date folosind structuri relativ simple în funcţie de necesităţile impuse de anumite
aplicaţii;
• Nivelul extern. Acest nivel de abstractizare este cel în care se poate descrie conţinutul unor
baze de date; are în vedere simplificarea interacţiunii utilizator - bază de date.
Pentru descrierea bazelor de date facem apel la noţiunea de structură de date care
reprezintă un ansamblu de instrumente conceptuale care permit descrierea datelor, a
legăturilor dintre ele, semantica lor sau constrângerile la care ele sunt supuse.
Bazele de date evoluează în timp. Mulţimea informaţiilor conţinute în baza de date la
un moment dat defineşte instanţierea bazei de date.
În 1970, Ted Codd (IBM, părintele SQL), nemulţumit de performanţele COBOL şi
IMS formulează principiul de lucru al bazelor de date relaţionale. Codd afirmă că SGBD
trebuie să recunoască comenzi simple şi trebuie să fie aproape de utilizatori prin punerea
împreună a comenzilor potrivite pentru găsirea a ceea ce se doreşte. Ceea ce Codd numeşte
model relaţional 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 fără impunerea nici unei structuri adiţionale pentru
scopuri de reprezentare în calculator;
6
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
• de asemenea, să furnizeze baza pentru un limbaj de date de nivel înalt care va conduce la
o maximă independenţă între programe, pe de o parte, şi reprezentarea în calculator, pe de
altă parte.
O bază de date relaţională extinde conceptul de tabele; este compusă dintr-o mulţime
de tabele între care se definesc relaţii în sens matematic.
Să presupunem că avem T1, T2, ..., Tm m tabele într-o bază de date. Fiecare dintre
aceste tabele are o structură (Ti = {Ci0, Ci1, ...}) ce conţine câmpuri (Cij). Pentru a defini
relaţii (R ⊆ T1×...Tm) între aceste tabele, este necesar ca cel puţin un câmp din fiecare tabelă
să suporte o relaţie de ordine strictă (nota bene: nu e necesară existenţa logică a acestei
construcţii; ea se poate construi şi din structura fizică a informaţiei din tabele, cum ar fi
numărul înregistrării). Fie aceste câmpuri Ci0. Asta înseamnă că valorile (vi0k, k=1,...) din
înregistrările corespunzătoare acestor câmpuri Ci0 sunt ordonate strict (vi01 < vi02 < ...). Nota
bene: nu e necesar ca relaţia de ordonare strictă să fie strict crescătoare, cum nu e necesar ca
valorile vi01, vi02, ... să fie stocate în înregistrări consecutive; este necesară doar existenţa
relaţiei de ordine strictă, care să permită referirea individuală a fiecărei valori, şi prin aceasta,
identificarea în mod unic a fiecărei înregistrări k: (vi0k, vi1k, ...). Relaţia R între tabele este în
fapt o submulţime a C10×C20×...Cm0. Reprezentarea figurativă a relaţiei R este:
R C10 ... Cm0
r1 c101 ... cm01
... ... ... ...
rn c10n ... cm0n
În mod uzual, pentru mulţimea T1×...Tm se foloseşte noţiunea de univers (U).
Elementele universului U se numesc atribute. Câmpurile Ci0 se notează (pentru simplitate) Ai.
Mulţimea valorilor atributelor Ai (vi0k, k ≥ 1) se notează cu Di. Elementele relaţiei r1,..., rn se
numesc tuple şi se notează cu t1, ..., tn. Folosind aceste notaţii, relaţia R devine:
R A1/D1 ... Am/Dm
t1 a11 ... a1m
... ... ... ...
tn cn1 ... anm
Coloanele acestui tablou se identifică prin atributele Ai şi domeniile corespunzătoare
Di, scriind Ai/Di (1 ≤ i ≤ m). Mulţimea ordonată a atributelor A = A1, ..., Am care definesc
relaţia R se numeşte schemă relaţională. Facem distincţie între schema relaţională A şi
instanţierea acesteia (t1, ... tn). Convenim să notăm relaţia R de schemă A, sub forma: r(A) sau
r(A1, A2, …, Am). Dacă luam în considerare tuplul ti care defineşte linia i din tabloul R de mai
7
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
sus, adică ti ⇔ ai1...aim, convenim ca să folosim aceeaşi notaţie ti pentru ti = (ai1, ..., aim) ∈
D1×...Dm. Convenim, de asemenea să notăm ti[Aj] = aij ∈ Dj , 1 ≤ i ≤ n, 1 ≤ j ≤ m. De
asemenea, dacă avem K = (Aj1, Aj2, ..., Ajk), k ≤m, atunci ti[K] = (aij1 , aij2 ,..., aijk ) .
Într-o bază de date relaţională noţiunea de cheie are un rol important. Numim cheie a
unei relaţii R de schemă A, adică r(A), o submulţime minimală K, K ⊆ A cu proprietatea că
ti[K] ≠ tj[K], pentru i ≠ j, 1 ≤ i ≤ n, 1 ≤ j ≤ m.
Recapitulând, principalele concepte utilizate la descrierea logică (conceptuală),
respectiv formală, apoi uzuală şi fizică a elementelor de organizare a datelor sunt:
formal uzual fizică
relaţie tablou fişier
tuplu linie înregistrare
atribut coloană câmp
domeniu tip de dată tip de dată
8
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
împreună cu informaţiile 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 relaţionale.
Prima versiune standardizată a SQL a apărut în 1986 şi conţine construcţiile de bază
ale limbajului pentru definirea şi manipularea tabelelor de date. O revizie în 1989 a adăugat
limbajului extensii pentru integritatea referenţială şi generalizează constrângerile de
integritate. O altă extensie în 1992 furnizează facilităţi în manipularea schemelor şi
administrarea datelor şi de asemenea substanţiale îmbunătăţiri în ceea ce priveşte definirea şi
manipularea datelor. Dezvoltarea sistemului este în desfăşurare pentru a face din acesta un
limbaj computaţional complet pentru definirea şi managementul obiectelor complexe
persistente. Aceasta include generalizarea şi specializarea ierarhiilor, moştenire multiplă,
tipuri de dată utilizator, generatoare şi construcţii declarative, suport pentru sistemele bazate
pe cunoştinţe, expresii interogative recursive şi instrumente adiţionale de administrare a
datelor. Include de asemenea tipuri abstracte de date, identificatori de obiecte, metode,
moştenire, polimorfism, încapsulare şi toate celelalte facilităţi 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 deţin supremaţia pe acest segment de
piaţă sunt IBM, Oracle, Informix, Sybase, Teradata (NCR), Microsoft, Borland.
9
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
2. Formele Backus-Naur
BNF (Backus-Naur Form, numite originar Backus Normal Form şi redenumite apoi la
sugestia lui Donald Knuth) formează o metasintaxă utilizată pentru a exprima gramatici
independente de context. BNF este unul dintre cele mai utilizate notaţii metasintactice pentru
specificarea sintaxei limbajelor de programare şi seturile de comenzi ale acestora. pentru
detalii suplimentare vezi „http://src.doc.ic.ac.uk/computing/internet/rfc/rfc2234.txt”.
Fie o formă BNF a unei adrese poştale 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ă poştală constă dintr-o parte de nume, urmată de o
parte de adresă stradală şi urmată de o parte de cod poştal. O parte personală constă din
prenume sau dintr-o iniţială urmată de un punct. O parte de nume constă din următoarele: o
parte personală urmată de nume urmat de un opţional <jr-part> (Jr., Sr., sau numărul dinastiei)
şi sfârşit 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 iniţiale). O adresă stradală constă dintr-un specificator opţional de apartament,
urmat de număr şi numele străzii. Partea de cod poştal constă din numele oraşului, urmat de
virgulă, urmat de codul statului şi oraşului urmat de sfârşit de linie.”
De observat că multe lucruri (cum ar fi formatul părţii personale, specificatorul de
apartament sau de codul oraşului au rămas nespecificate. Aceste detalii lexicale sunt
presupuse evidente din context sau sunt specificate în altă parte.
Sunt multe variante şi extensii ale BNF, de exemplu prin introducerea wildcardurilor ?
şi *. Două dintre acestea sunt EBNF şi ABNF.
10
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Nu este mult de văzut la acesta, însă este cel puţin încărcabil în calculator. Utilizând
orice limbaj de programare (din generaţia a 3-a) se poate scrie un cod care să deschidă acest
fişier şi să preia informaţia. Oricum am pune problema însă în implementarea acestui cod, se
arată a fi o bună bucată de cod de scris. Dacă se doreşte ca această informaţie să se poată
ordona şi interoga după o varietate de criterii, care de exemplu să sorteze alfabetic după nume
sau să găsească toţi oamenii care au o anumită valoare a codului de localitate, este într-adevăr
dureros. Ne putem lovi acum de o altă problemă majoră dacă datele dorim să fie utilizate în
cadrul unei reţele de o mulţime de utilizatori, cum ar fi modificările pe care le-ar efectua un
utilizator în timp ce alt utilizator se poziţionează pe o înregistrare mai jos în fişier. Probabil va
trebui să blocăm la scriere fişierul atunci când mai mulţi utilizatori îl accesează.
Este evident deci că soluţia memorării acestuia sub formă de fişier text nu a fost
fericită. Este nevoie de un sistem de stocare care să reducă cantitatea de prelucrări şi
accesări ale informaţiei din fişier de către programul responsabil cu gestiunea acestuia. Un
tabel simplu ca tabelul 1 ar trebui să funcţioneze tocmai bine:
Tabelul 1. Tabel simplu pentru stocarea datelor
Acum acesta este aproape convenabil. Este uşor de ajuns la sfârşit şi de verificat dacă
vreun program accesează acest tabel. Este uşor de accesat o linie din acest tabel odată fără a
afecta pe ceilalţi. În acest sens, dacă 2 sau mai mulţi utilizatori doresc să insereze informaţii în
această tabelă ei nu se vor suprapune în acţiunea lor. Dacă se va dori extragerea unor
informaţii din tabel, cum ar fi toate persoanele care sunt din California, nu va fi necesar să se
11
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
prelucreze şi ordoneze fişierul. Un program care ar opera pe această tabelă va trebui doar să
rezolve următoarea subproblemă: afişează toate liniile la care conţinutul coloanei State este
egal cu 'CA'. Da, este frumos, însă nu este destul.
Obiectivul Dr. Codd, părintele SQL, a fost de a avea un model al informaţiei care să
nu creeze anomalii. Se pot identifica 3 situaţii de anomalie: la Actualizare, Ştergere şi
Inserare.
Să presupunem că o structură tabelată poate rapid şi uşor gestiona cereri multiple şi să
analiză ce se întâmplă dacă informaţia devine ceva mai complexă, cum ar fi cazul ilustrat în
tabelul 2:
Tabelul 2. Tabelă cu stocare problematică
Ceea ce s-a realizat în acest caz prin separarea celor două categorii de informaţii şi
introducerea unei coloane de legătură (company_id) este că s-a creat o relaţie între cele două
tabele şi de aici vine numele de bază de date relaţională.
Deşi avem exact aceleaşi informaţii ca la început, totuşi, există o diferenţă, faptul că
tocmai le-am segmentat. Putem acum schimba adresa atât pentru Jay cât şi pentru Brad prin
modificarea unei singure linii. Acesta este un fapt convenabil, oricum.
12
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Să presupunem că se întâmplă ca d-nul Doe să fie şters din baza de date în forma din
tabelul 2. Dar se poate întâmpla ca cineva să vrea să ceară lista tuturor companiilor cu care ai
avut contact anul trecut. În forma curentă, ştergându-l pe Doe, vom şterge şi informaţia despre
companie odată cu el. Această problemă se numeşte ştergerea anormală.
Tabelul 2. Tabelă cu ştergere anormală
Dacă însă se păstrează structura din tabelele 3 şi 4, se poate face ştergerea numai din
tabela 4, şi înregistrarea cu compania poate să rămână în tabela 3, aşa încât î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. Situaţia devine paradoxală atunci când dorim să
inserăm o companie dar nu şi persoana de contact. De cele mai multe ori, ar trebui să aşteptăm
până când avem date specifice de contact pentru ca să putem adăuga în baza de date. Este
evident o restricţie ridicolă.
13
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
fereastra de comenzi
14
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Operaţiile asupra bazelor de date create pe care le efectuăm din bara de instrumente
sunt oricum înregistrate în fereastra de comenzi, aceasta păstrând istoria activităţii sesiunii de
lucru curente:
15
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Se poate alege a se crea o bază de date cu ajutorul wizardului ca în figură în care într-o
succesiune de 5 paşi se precizează caracteristicile noii baza de date care se doreşte să se
creeze.
Baza de date aşa cum s-a putut constata în exemplul prezentat anterior este compusă
din mai multe tabele. Să presupunem că vrem să memorăm informaţiile prezentate în tabelele
3 şi 4. În acest caz, putem alege să construim o nouă bază de date pe baza creări unui nou
fişier în care apoi să adăugăm cele două tabele, şi anume COMPANII şi
PERSOANE_CONTACT.
Alegem deci New/Database, New File, introducem numele noii baze de date (să
spunem CLIENTI când se generează următorul rezultat:
16
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
17
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Se completează apoi bazele de date cu informaţiile necesare prin dublu click asupra
tabelelor, când se activează ferestre de tip browse în care se adaugă câte o înregistrare cu
CTRL+Y sau Table/Append New Record:
După aceasta oricând ne putem întoarce la foaia tabelei pentru a vizualiza conţinutul
tabelelor sau pentru a face adăugări sau modificări.
18
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
19
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Cheile primare sunt o coloană sau un set de coloane care au pe fiecare linie o valoare
unică în şirul valorilor coloanei respective. În tabelul 5 se poate vedea cum s-a inclus o astfel
de coloană (company_id). Toate browserele de baze de date posedă un instrument de a defini
o astfel de coloană. De exemplu, în MySQL aceasta se numeşte câmp auto_increment. Pot
însă fi chei primare seriile de buletin, adresele email sau URL-urile. Singura condiţie este ca
datele să fie unice.
De exemplu, dacă informaţiile de contact dintr-o astfel de agendă de adrese presupun
memorarea de informaţii pentru companii cu mai multe reprezentanţe, probabil cea mai bună
soluţie este de a memora identificatorul reprezentanţei şi adresa într-un tabel separat în care
company_id şi eventual company_city să formeze cheia primară.
Dependenţa datelor este un element esenţial în organizarea lor relaţională. O coloană
este dependentă (de cheia primară) dacă ea nu poate exista în tabel când cheia primară este
înlăturată.
A doua formă normală intervine când la sfârşitul primei normalizări obţinem o cheie
primară formată din mai multe coloane. Să presupunem că în urma procesului de separare a
tabelei de adrese (v. tabelul 5) obţinem o tabelă în forma:
Tabelul 6. Tabel care nu e în forma normală 2
20
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
O cale rapidă de a se ajunge la a 3-a formă normală este de a ne uita la toate câmpurile
din tabel şi de a ne întreba dacă aceste câmpuri descriu cheia primară. Dacă nu, locul lor nu
este aici (în această tabelă). Dacă se doreşte ca agenda să memoreze mai multe informaţii de
contact, ca în tabela următoare:
Tabelul 7. Tabel care nu e în a 3-a formă normală
atunci se pune problema dacă nu cumva prin adăugarea acestora nu se alterează normalizarea
acesteia. Este posibil, chiar probabil ca un asistent să deservească mai multe reprezentanţe,
ceea ce face ca assistant_name şi assistant_phone să apară în tabel mai mult decât odată.
Acestea vor forma atunci un grup repetitiv, care deja a fost discutat cum se elimină.
21
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
7. Tipuri de relaţii
Este esenţial a se crea un grup de tabele care să nu aibă anomalii. Acestea totdeauna
includ coloane care menţin (definesc) relaţiile între aceste tabele. Sunt 3 tipuri de relaţii în
domeniul bazelor de date:
• relaţii 1 la n: de departe cel mai frecvent caz, când o valoare dintr-o coloană referă mai
multe câmpuri într-un alt tabel:
Figura următoare arată cum tabela de Companii poate fi unul din capetele încă unei relaţii 1 la
n cu tabela reprezentanţelor:
22
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
• relaţii 1 la 1: sunt de fapt relaţii 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, aşa cum ar
putea rezulta în urma separării datelor din tabelul 7:
Coloana newsletters conţine mai mult de o valoare, fiind de fapt un şir de valori. Aşa cum
s-a menţionat la prima formă normală această situaţie nu trebuie să apară niciodată în
baza de date. Soluţia este crearea încă unei tabele pentru a memora aceste informaţii, aşa
cum se exemplifică în tabelul 10.
23
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Iată acum că această tabelă constituie baza unei relaţii m la n în baza de date:
24
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
coloana company_id din tabela de contacte este o cheie străină către tabela de companii.
În anumite SGBD-uri, ca VFP, Oracle, Sybase sau PostGres, tabelele pot fi create cu
definirea explicită a cheilor străine (field validation/rule în VFP) aşa încât adăugarea va fi
acceptată de către sistem doar dacă valoarea cheii străine există în tabela referită ca cheie
primară.
În alte SGBD-uri, ca MySQL, cheile străine nu au această semnificaţie. În acest caz,
programatorul trebuie să efectueze câţiva paşi suplimentari înainte de a adăuga sau modifica
înregistrări, 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 intenţionezi să o inserezi în tabela de
contacte există în şirul de date obţinut mai sus;
• dacă ea există, inserează valorile;
Tranzacţii. În BD relaţionale au loc schimbări de apartenenţe în grupuri. Multe
schimbări necesită ca liniile să fie actualizate în mai multe tabele deodată. În unele cazuri
acest lucru se face printr-o succesiune de instrucţiuni care preiau datele acolo unde trebuie să
fie stocate.
Un site pentru comerţul electronic poate conţine un cod care să efectueze operaţiile:
1. adaugă clientul în tabela de clienţi;
2. adaugă lista de cumpărături în tabela de cumpărături;
3. scade cantităţile comandate din tabela de stocuri.
Când se lucrează cu o serie de paşi ca aceasta, există un potenţial pentru probleme care
pot apare. Dacă sistemul se blochează sau iese în decor între paşii 2 şi 3, atunci baza de date
conţine date eronate.
25
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
26
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Se pot acum adăuga proiectului tabele (fişiere .DBF) sau baze de date (fişiere .DBC).
În Project Manager datele sunt grupate pe categorii şi prezentate într-o formă
ierarhică. Pentru a urmări un tip de fişier sau obiect se activează boxa + a grupului
corespunzător. Activând tabulatorul Data putem restrânge domeniul de vizualizare al
componentelor proiectului la nivelul de date, şi anume: bazele de date, tabelele, interogările şi
vizualizările. Acţionând unul din butoanele New…, Add…, Modify, Run, Remove… sau
Build… se alege operaţia specifică asupra componentei sau categoriei selectate.
Acţiunile care se pot efectua asupra datelor sunt descrise în continuare.
27
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
28
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
29
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
efectueze modificările dorite. Pentru a şterge un câmp din tabelă se selectează câmpul şi se
apasă butonul Delete.
Afişarea înregistrărilor în fereastra de Browse se poate face selectiv după o condiţie
impusă înregistrărilor. De asemenea se poate limita accesul la anumite câmpuri ale tabelei
prin setarea unui filtru de câmpuri. Pentru impunerea unui filtru, din meniu, Table/Properties:
Odată ce a fost creată o tabelă, aceasta se poate ordona pentru a accelera regăsirea
informaţiei prin folosirea indexurilor. Cu indexurile, se pot procesa rapid înregistrările pentru
afişare, interogare sau tipărire. Se pot selecta înregistrări, urmări dacă există valori duplicat
într-un câmp şi suportă stabilirea de relaţii între tabele în cadrul bazelor de date. Un index în
VFP este o listă de numere de înregistrări care pointează către înregistrările corespunzătoare şi
astfel determină ordinea de procesare a înregistrărilor. Un index nu modifică ordinea în care
înregistrările 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 reprezentând câte o
ordine de procesare a înregistrărilor din tabelă). Indexurile care se crează sunt stocate într-un
fişier index cu structură compusă care este deschis şi actualizat oricând tabela este folosită.
Numele fişierului index este identic cu numele tabelei iar extensia sa este .CDX. Un
index se poate crea uşor, aşa încât frecvent se defineşte câte un index după fiecare câmp al
tabelei. Un index se poate crea după un câmp sau după o expresie.
Din Project Manager se selectează tabela, se apasă butonul Modify, apoi în Table
Designer se selectează tabulatorul Indexes când se activează o fereastră de forma:
30
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
1 7
3 6
4 5
în care avem posibilitatea:
• 1 să modificăm numele pentru un index;
• 4 să alegem tipul indexului după cum urmează:
o index primar (cheie primară) unde doar valori unice sunt permise în câmp şi
determină ordinea de procesare a înregistrărilor; se pot crea câte 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 înregistrărilor; pot exista mai multe indexuri candidate pentru 1 tabelă;
o index regular care permite duplicarea valorilor ce intră într-un câmp, este folosit
pentru a determina ordinea de procesare şi poate exista mai mult de 1 index regular
pentru o tabelă;
o index unic păstrat pentru compatibilitate cu versiunile mai vechi care selectează şi
ordonează un subset de înregistrări bazat pe prima apariţie a unei valori într-un
câmp specificat;
• 5 să definim o expresie simplă (formată din numele unui câmp) sau compusă (o expresie
în care intervin nume de câmpuri din tabelă) după cum urmează:
o câmpurile sunt evaluate în ordinea în care apar în expresie;
o operatorul „+” aplicat la câmpuri numerice va aduna valorile din câmpuri:
employ.salary + employ.prime
o operatorul „+” aplicat la câmpuri caracter va concatena şirurile de caractere din
câmpuri:
customer.country + customer.postalcode + customer.company
o sunt permise conversiile la tipul şir de caractere prin intermediul funcţiei STR(·):
31
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
STR(customer.maxordamt,20,4) + customer.company
• 7 să filtrăm înregistrările supuse indexării după o condiţie logică:
employ.prime > 0 sau customer.country = "Canada"
• 2 să alegem o ordonare descendentă (↓) sau ascendentă (↑);
• 3 să adăugăm un nou index;
• 6 să ştergem un index;
Indexurile pot îndeplini diferite roluri, în funcţie de tipul acestora:
Dacă vrei să Foloseşte
Ordonezi înregistrările pentru a mări viteza de Un index regular, primar sau candidat
afişare, interogare sau tipărire
Controlul intrării valorilor duplicat într-un Un index primar sau candidat pentru tabelele
câmp şi ordonarea înregistrărilor libere
32
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
33
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
5. Din Project Manager din categoria Data se selectează Databases şi se apasă butonul New
şi apoi New Database;
6. Se introduce un nume pentru noua bază de date din cadrul proiectului; fie aceasta
Universitati; aceasta se va salva pe disc sub numele Universitati.dbc; se va încărca în mod
automat aplicaţia expert Database Designer; cu ajutorul ei se construiesc tabelele bazei de
date şi se definesc relaţiile între tabele; Database Designer mai permite crearea de vederi
locale şi de la distanţă, editarea procedurilor stocate în baza de date (baza de cunoştinţe
pentru execuţia interogărilor şi tranzacţiilor de pe sisteme de operare diferite şi din SGBD-
uri diferite), realizarea de conectări la distanţă;
• crearea tabelelor
Se enumeră informaţiile 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 informaţii proprii instituţiei (nume, acronim,
adresa, pagina web) şi informaţii despre persoanele aflate la conducerea acesteia (nume,
funcţie, adresa email). Se desprind astfel în mod natural două tabele în baza de date: tabela
institutii şi tabela contacte.
7. Din aplicaţia expert Database Designer se selectează butonul New Table şi apoi din nou
New Table; se va lansa în execuţie în mod automat aplicaţia expert Table Designer;
8. Cu ajutorul aplicaţiei Table Designer se creează tabela institutii cu structura nume
char(80), acronim char(10), adresa char(40), web char (20); aceasta se va salva pe disc
cu numele Institutii.dbf;
34
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
9. Se apasă butonul Ok când se activează o fereastră de dialog; aici se poate alege dacă să se
introducă acum informaţiile despre instituţii sau mai târziu; să alegem introducerea acum;
10. Se activează o fereastră care permite introducerea informaţiilor; se introduc informaţiile
despre universităţi;
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ă informaţiile despre contacte mai târziu;
14. Se pot acum introduce informaţii în tabela Contacte activând click dreapta pe tabelă şi
selectând opţiunea Browse:
35
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
15. Se activează o fereastră Browse; se adaugă câte o înregistrare (din meniu, Table/Append
New Record sau de la tastatură Ctrl+Y);
16. Se doreşte stabilirea de relaţii între instituţii şi contacte; pentru aceasta este necesară
adăugarea unor câmpuri numerice în tabele; deoarece la o instituţie avem mai multe
persoane de contact relaţia între tabele este de tipul 1 la n; pentru stabilirea relaţiei este
necesar ca valorile câmpului numeric din tabela institutii (fie acesta nr int) să fie distincte;
se modifică tabela şi se creează acest câmp în consecinţă;
17. Se adaugă un câmp numeric (de preferinţă cu acelaşi nume) în tabela contacte ale căror
valori se vor completa ţinând seama de apartenenţa persoanelor de contact la instituţii;
• crearea indexurilor
18. Câmpul nr din tabela institutii se numeşte cheie primară; pentru stabilirea unei relaţii 1 la
n după acest câmp tabela va trebui să fie indexată după acest câmp cu un index primar;
36
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
din nou aplicăm Modify la tabela Institutii şi îi asociem un index primar cu acelaşi nume
cu câmpul după care se face indexarea: nr; se foloseşte aici aplicaţia expert Expression
Builder; se va memora în mod automat pe disc indexul sub numele Institutii.cdx;
19. Câmpul nr din tabela contacte se numeşte cheie străină; valorile din această coloană a
tabelei contacte nu sunt toate diferite între ele; după acest câmp tabela se poate indexa cu
un index regular; se creează indexul; fie numele acestuia nr;
• stabilirea relaţiei între tabele
20. Se selectează indexul primar şi se efectuează drag and drop cu mouse-ul peste indexul
regular (cheia primară peste cheia străină);
37
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Valoarea nu e pozitiva
Butoanele „...” lansează aplicaţia expert Expression Builder cu ajutorul căreia se poate
construi expresia pentru regula de validare a datelor, valoarea implicită a câmpului la
adăugarea unei noi înregistrări şi mesajul care se va afişa în caz de introducere eronată.
O altă posibilitate este de a stabili reguli de validare la nivel de înregistrare într-o
tabelă. Presupunând că într-o tabelă angajati avem două câmpuri data_nastere şi
data_angajare de tip date atunci se poate stabili următoarea 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:
Incluzând comenzi sau funcţii în regulile de validare care încearcă să mute pointerul
de înregistrare în zona de lucru se pot provoca erori în stabilirea condiţiilor.
Se poate defini un nume de câmp care va fi afişat (diferit de numele acestuia din
tabelă) prin definirea acestuia în caseta de editare Caption din tabulatorul Fields al lui Table
Designer:
38
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
39
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Aplicaţie:
Să se creeze baza de date cu cursanţii unei Şcoli de Informatică Aplicată şi
Programare.
40
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Soluţie:
Se creează o bază de date ce conţine următoarele tabele (în care ↑ exprimă existenţa
unui index după câmpul specificat; tipul indexului se va stabili în funcţie de tipul relaţiei
tabelului respectiv cu celelalte în cadrul bazei de date).
Fişiere de date
9. Cursuri.dbf 2. Stud.dbf
COD_CURS N 5 Ï COD_STUD N 5 Ï
DENUMIRE C 70 NUME C 20 Ï
ACRONIM C 10 INITIALA C 1
ANUL_UNIV C 12 PRENUME C 30 Ï
ORE_CURS N 2 NUME_NOU C 20 Ï
ORE_LUCR N 2 COD_CENTRU N 5 Ï
ORE_PROI N 2 DATA_NAST D 8
DURATA N 2 LOCALITATE C 20
JUDET C 20
ADRESA M 10
TELEFON N 10
FORMA_INV C 1
S-scoala M-module
3. Repart.dbf 4. Taxe.dbf
COD_STUD N 5 Ï COD_STUD N 5 Ï
COD_MODUL N 5 Ï SUMA N 10
FORMA C 1 DATA D 8
41
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Analiza se face în modul următor (de exemplu pentru tabela 12): Tabela 12 (note.dbf)
conţine 2 indexuri: unul după cod student şi unul după cod modul; valorile acestor câmpuri se
pot repeta în tabelă: un student ia mai multe note (la diferite module) şi un modul este
frecventat de mai mulţi studenţi; indexurile sunt atunci regulare.
După ce s-au stabilit relaţiile se impun:
• regulile de validare pentru câmpuri;
• regulile de validare pentru înregistrări;
• regulile de integritate referenţială.
42
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Practic, operaţiile efectuate până în acest moment sunt rezultatul unor instrucţiuni
simple în limbajul SQL, specificate prin intermediul wizard-ului pe care sistemul le-a executat
pentru noi, instrucţiuni care se pot vizualiza de la butonul SQL:
FROM clienti!companii INNER JOIN clienti!persoane_contact ;
ON Companii.company_id = Persoane_contact.company_id
Se poate observa sintaxa acestor instrucţiuni:
FROM <nume_bd>!<nume_tabela_1> INNER JOIN <nume_bd>!<nume_tabela_2>;
ON <nume_tabela_1>.<nume_câmp> = <nume_tabela_2>.<nume_câmp>
43
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Între câmpuri numerice din tabele se pot crea grafice de corespondenţă (Butonul
Graph). Astfel, pentru a face o reprezentare grafică din baza de date Universităţi să adăugăm
câmpul poz (int) în tabela Contacte, şi să atribuim câte o poziţie fiecărei înregistrări.
Lansarea în execuţie a interogării se poate face din meniu (Query/Run Query) sau din
tastatură (ctrl+Q).
Astfel, dacă se selectează câmpurile Institutii.nr şi Count(Contacte.poz) se poate
obţine cu ajutorul lui Graph Wizard un grafic de dependenţă a identificatorilor din tabele:
44
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
45
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
16. Se pot adăuga acum persoane de contact şi instituţiile corespunzătoare dacă se lansează în
execuţie vederea creată: Query/Run Query când se poate afişa în forma Append Mode şi
Edit din meniu de la View;
17. Se poate seta opţiunea pentru a efectua modificările în tabelele incluse în vedere; pentru
aceasta se selectează opţiunea Send SQL updates din tabulatorul Update Criteria al
vederii contacte_institutii cu ajutorul lui View Designer;
18. Se pot acum adăuga persoane de contact şi instituţii, modificarea efectuându-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 modificările să devină active trebuie închis proiectul (Close all data în fereastra
de comenzi);
20. La o nouă deschidere a acestuia se pot observa modificările în tabele;
47
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
21. Pentru a insera noile chei pentru instituţie şi contact este necesară selectarea explicită a
modificării în vedere (View Designer/Update Criteria/Field name);
22. Sistemul salvează vederea în baza de date sub forma unui tabel liber cu acelaşi nume cu
vederea, care se poate observa în Project Manager la încărcarea aplicaţiei expert
Database Designer;
Vederea bazei de date Universitati după institutii şi apoi persoane de contact
23. Se urmează acceşi succesiune de paşi ca mai sus, însă se alege la relaţia de ordine dorită
(Order By/Ordering criteria: Institutii.nume ↑ şi Contacte.nume ↓);
Stocarea de proceduri în baza de date pentru câmpurile autoincrement
Baza de date Universitati este acum pregătită 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 foloseşte această tabelă de către o procedură stocată în baza de date pentru a
stabili valorile de increment. Se urmează paşii:
1. Se adaugă în Universitati.bdc tabela auto_id cu structura (id int; tabela char(50));
2. Se completează Auto_id.dbf cu valorile corespunzătoare;
3. Se indexează Auto_id.dbf după cele două câmpuri ale sale cu indecşi regulari;
4. Se creează o funcţie 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ă corespunzător, ţinând cont de numele actuale:
FUNCTION NouID(tcAlias) IF !USED("AUTO_ID")
LOCAL lcAlias, ; USE universitati!auto_id IN 0
lnID, ; ENDIF
lcOldReprocess, ; SELECT auto_id
lnOldArea IF SEEK(lcAlias, "auto_id", "tabela")
lnOldArea = SELECT() IF RLOCK()
lnID = 0 lnID = auto_id.id
IF PARAMETERS() < 1 REPLACE auto_id.id WITH auto_id.id + 1
lcAlias = UPPER(ALIAS()) UNLOCK
ELSE ENDIF
lcAlias = UPPER(tcAlias) ENDIF
ENDIF SELECT (lnOldArea)
lcOldReprocess = SET('REPROCESS') SET REPROCESS TO lcOldReprocess
*-- Lock until user presses Esc RETURN lnID
SET REPROCESS TO AUTOMATIC ENDFUNC
48
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
49
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
50
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
51
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Funcţia 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 funcţiei se
referă la aliasul tabelei (un alt nume al tabelei).
? USED(3)
.F.
Funcţia DBF(expN | expC) returnează numele tabelei deschise în zona specificată prin
argument sau numele bazei de alias expC:
SELECT 3
? SELECT() && se afişează 3
USE tabela1
LIST STRUCTURE
? USED(3) && se afişează .T.
? DBF(3) && se afişează tabela1
USE && se închide tabela1 din 3
? USED(3) && afişează .F.
USE tabela1 IN 4 && se deschide tabela1 în zona de lucru 4
LIST STRUCTURE && nu se listează structura
USE tabela1 IN 3 AGAIN && se deschide tabela tabela1 în zona de lucru curentă 3 &&
rămânând deschisă şi în zona 4
Close all data
închide toate tabelele din mediul de lucru şi odată cu acestea toate bazele de date şi proiectele
ce le utilizează.
Poziţionarea pe o înregistrare se poate face cu ajutorul comenzilor GO, GOTO şi
SKIP. FoxPro atribuie în mod reflex un număr de înregistrare fiecărui articol din fişierul
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 număr_articol permite trecerea imediată pe articolul având numărul specificat
(expN1) :
Go 20
Disp
Este suficient să precizăm primele 4 litere din numele comenzii pentru ca sistemul să
recunoască comanda.
Pentru saltul peste un anumit număr de înregistrări se poate folosi comanda SKIP
SKIP –1 && acceptă şi valori negative, pentru saltul înapoi;
52
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
53
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
54
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Se poate defini directorul implicit pentru fişiere. Pentru a defini un director implicit
pentru sesiunea de lucru curentă se foloseşte comanda:
SET DEFAULT TO <nume_director>
De exemplu:
SET DEFAULT TO C:\UTILIZATORI\STUDENT\VASILE
Pentru a defini directorul implicit care să fie încărcat la fiecare pornire a VFP, din
meniu, Tools/Options/File Locations, când se activează o fereastră în forma:
55
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
17. Expresii
Expresiile care pot fi construite cu ajutorul tipurilor de dată predefinite puse la
dispoziţie de mediul VFP (de exemplu în Expresion Builder) se găsesc documentate în
MSDN, Active Subset: Visual Fox Pro Documentation/Contents/Reference/Language
Overview/Overview of the Language/Building Expresions, sau dacă este instalată versiunea
MSDN’98, atunci se poate încărca î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 descrişi în:
foxhelp.chm::/html/tblcharacter_operators.htm
• Operatorii pe expresii de tip dată şi oră sunt descrişi în:
foxhelp.chm::/html/tbldate_and_time_operators.htm
• Operatorii numerici:
foxhelp.chm::/html/tblnumeric_operators.htm
• Operatorii logici:
foxhelp.chm::/html/tbllogical_operators.htm
56
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
DATE()
CLEAR
SET CENTURY OFF
? DATE( ) && Afişează today's date without the century
SET CENTURY ON
? DATE( ) && Afişează today's date with the century
? DATE(1998, 02, 16) && Afişează 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) && Afişează 02/16/1998 12:34:56 PM
STORE {^1998-03-05} TO gdBDate
57
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
DAY()
CLEAR
? CDOW(gdBDate) && Afişează Thursday
? DAY(gdBDate) && Afişează 5
? 'That date is ', CMONTH(gdBDate), STR(DAY(gdBDate),2)
DBUSED() && Returnează true (.T.) dacă baza de date specificată este deschisă.
DBUSED('Universitati')
DELETED()
DELETED([cTableAlias | nWorkArea]) Returnează o valoare logică ce indică dacă
înregistrarea curentă este marcată pentru ştergere.
DMY() && expresie de tip caracter în formatul day-month-year
CLEAR
SET CENTURY OFF
? DMY(DATE( ))
SET CENTURY ON
? DMY(DATE( ))
58
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
59
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
60
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
20. Programare
În general, orice ce poate fi făcut cu un program, se poate face manual dacă avem
destul timp. De exemplu, dacă căutăm o persoană de contact în tabela contacte de exemplu
Gheorghe Lazea, acest lucru poate fi făcut manual urmând secvenţa de instrucţiuni:
1. Din meniul File selectăm Open;
2. Din caseta File of type selectăm Table;
3. Selectăm tabela Contacte.dbf în lista fişierelor;
4. Din meniul View selectăm Browse;
5. Parcurgând conţinutul tabelei, urmărind câmpul Nume identificăm înregistrarea pentru
Gheorghe Lazea;
Din fereastra de comenzi, poate fi făcut acelaşi lucru scriind următoarele instrucţiuni:
USE Customer
LOCATE FOR Nume = "Gheorghe Lazea"
BROWSE
După ce am localizat înregistrarea putem să îi modificăm conţinutul 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)
Instrucţiunile ş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 înregistrările din tabel şi execută instrucţiunile între scan şi endscan
iar ; indică că o comandă (comanda replace) se continuă pe linia următoare. Pe lângă
comenzi, programele permit scrierea şi de instrucţiuni (cum este cazul instrucţiunii scan).
61
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
62
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Pentru lucrul cu tabele sunt utile comenzile SCATTER, GATHER, COPY TO ARRAY,
şi APPEND FROM ARRAY.
Instrucţiunea IF are sintaxa:
IF <expresie_logică> [THEN]
[<comenzi şi instrucţiuni>]
[ELSE
<comenzi şi instrucţiuni>]
ENDIF
Un exemplu de program cu instrucţiunea IF: să se afişeze înregistrările care
îndeplinesc o condiţie oarecare.
CLOSE DATABASES
OPEN DATABASE ('Universitati')
USE Contacte && deschide tabela contacte
GETEXPR 'Introdu conditia de localizare ' TO gcTemp;
TYPE 'L' DEFAULT 'email = ""'
LOCATE FOR &gcTemp && Enter LOCATE expression
IF FOUND( ) && Este găsit?
DISPLAY && Dacă da, afişează înregistrarea
ELSE && Dacă nu e găsit
? 'Conditia ' + gcTemp + ' nu a fost gasita' && afişează un mesaj
ENDIF
USE
Instrucţiunea CASE are sintaxa:
DO CASE
CASE <expresie_logică_1>
<comenzi şi instrucţiuni>
[CASE <expresie_logică_2>
<comenzi şi instrucţiuni>
...
CASE <expresie_logică_N>
<comenzi şi instrucţiuni>]
[OTHERWISE
<comenzi şi instrucţiuni>]
ENDCASE
Un exemplu de folosire al acesteia este următorul:
63
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
64
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
DIMENSION A(4)
STORE 0 TO A
max = 0
DO WHILE .T. && Startul buclei DO WHILE
IF EOF( ) && Testează sfârşitul de fişier
EXIT
ENDIF
IF poz < 10
SKIP
LOOP && Trece la testarea din nou a condiţiei
ENDIF
A(nr) = A(nr) + 1 && Numără ...; cel mult institutii.nr = 9
IF max < nr && Urmăreşte nr. maxim de instituţii
max = nr
ENDIF
SKIP
ENDDO && Sfârşit buclă
CLEAR
? 'Statistica contactelor inregistrate mai putin primele 10:'
FOR zz = 1 TO max
?? A(zz)
ENDFOR
65
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
66
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
67
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
4. Se modifică raportul cu ajutorul instrumentelor din Report Controls adăugând totalul după
poz în Group Footer.
68
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Varianta 2
1. Se modifică vederea prin definirea ordinii de afişare institutii.nume, contacte.nume;
2. Se urmează paşii 1-6 ca la varianta 1;
3. Se grupează înregistrările după nume_b;
4. Se alege stilul Executive;
5. Se sortează după nume_a;
6. Se selectează boxa Use display settings stored in the database;
7. Se apasă Finish şi se salvează raportul cu numele contacte_institutii1;
Etichete
Se urmează paşii:
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 defineşte forma etichetei (plasarea informaţiilor în cadrul zonei etichetei);
69
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
7. Pentru că spaţiul alocat implicit de Wizard este insuficient pentru afişarea tuturor
informaţiilor (email) se alege modificarea raportului (Modify);
8. Se poate definii pagina Landscape (din File/Page Setup/Print Setup/Orientation);
70
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
71
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
23. Macrosubstituţie
Macrosubstituţia 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 funcţie ce conţine un nume
se execută mai rapid ca una ce conţine o macrosubstituţie însă utilizarea macrosubstituţiilor
conferă avantaje de flexibilitate în codul de executat.
Un exemplu de macrosubstituţie 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 (fişier 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"
&& execuţia vederii
CREATE SQL VIEW con_inst_view AS &con_inst_sql
După execuţie, în Project Manager apare vederea.
Aceasta se poate apoi vizualiza (Browse).
72
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
24. Formulare
Aşa cum rapoartele permit facila tipărire a tabelelor, interogărilor şi vederilor,
formularele sunt o cale eficientă pentru afişarea, introducerea şi editarea informaţiilor din
baza de date.
Se pot crea formulare interactive din tabele şi vederi, utilizând wizard-ul, constructorul
şi aplicaţia expert Form Designer.
Form Wizard
Din Project Manager din tabulatorul Documents se selectează Forms apoi New şi
Form Wizard după care se urmează instrucţiunile din ferestrele interogative următoare.
5. În Project Manager va apare în grupul Forms noua formă creată; se selectează forma
institutii şi se lansează în execuţie (butonul Run).
73
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Noua formă creată conţine 5 butoane pentru deplasare (Top, Next, Prev, Bottom,
Find), un buton pentru imprimare (Print), 3 butoane pentru operaţii de intrare-ieşire (Add
pentru adăugarea unei noi înregistrări, Edit pentru modificarea unei înregistrări existente şi
Delete pentru ştergere) şi un buton pentru ieşire (Exit).
Se poate folosi formularul pentru introducerea unei noi instituţii (de exemplu
Academia de Arte Vizuale „Ion Andreescu” Cluj-Napoca). Tentativa de a completa adresa
web a acesteia este sortită eşecului dacă câmpul pentru pagina web are 20 de caractere. Sunt
necesare atunci următoarele operaţiuni:
1. Se modifică structura tabelei institutii.dbf prin mărirea câmpului de la 20 la 25 de
caractere (Project Manager/Databases/Universitati/Tables/Institutii/Modify);
2. Se modifică formularul institutii.scx (se măreşte caseta de editare pentru pagina web) pe
calea Project Manager/Docs/Forms/Institutii/Modify;
3. Se activează proprietăţile casetei de editare WEB1 (click dreapta pe caseta
corespunzătoare paginii web şi apoi Properties);
4. Se modifică macheta de introducere a casetei prin inserarea a încă 5 "X";
74
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
5. Pentru a executa formularul este necesar acum să închidem tabela institutii.dbf deschisă
de sistem la modificarea structurii (execuţia 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 când la o
nouă execuţie a formularului sau la o deschidere a tabelei institutii într-o fereastră Browse
apare noua instituţie înregistrată; dacă a fost definită funcţia de autoincrementare pentru
câmpul cheie institutii.nr acesta va avea valoarea generată automat în tabelă (vezi
fereastra Browse pentru tabela institutii);
9. Tipărirea instituţiilor cu ajutorul formei institutii.scx se poate face acum prin selectarea
raportului institutii.frx: Project Manager/Docs/Forms/Institutii/Run/Print;
75
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Adăugare şi Modificare
76
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Form Builder
Constructorul de formulare (Form Builder) se poate activa pe următoarea succesiune
de paşi:
1. Se încarcă proiectul;
2. Se selectează opţiunea 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;
Aplicaţia 3. Să se construiască un formular pentru modificarea unei persoane de contact.
Rezolvare. Se urmează paşii:
1. Se încarcă Form Builder;
2. Se deschide universitati.dbc sau contacte.dbf;
3. Se selectează câmpurile din contacte.dbf;
4. Se alege stilul (de exemplu Colorful);
5. Se salvează formularul;
6. Se lansează în execuţie;
Formularul va încărca din tabela Contacte prima înregistrare care va putea fi
modificată după dorinţă. La închiderea formularului modificările efectuate se vor transmite în
tabela Contacte (dacă nu a apărut conflict la modificarea cheii străine contacte.nr). Pentru a
îmbunătăţi formularul creat este necesar să adăugăm controale pe acesta cu ajutorul barei de
instrumente Form Controls. Din aceasta se poate adăuga un control Spinner (Spiner1).
Form Designer
Pentru generarea manuală a formularelor sunt necesare bara de instrumente a lui Form
Desiner şi a lui Form Controls.
Aplicaţia 4. Să se construiască un formular după modelul:
Rezolvare. Se urmează paşii:
1. Cu Form Designer se inserează tabelele institutii şi contacte (butonul Data Environment);
3. Se creează câte un index după fiecare câmp din tabelele contacte şi institutii (regular sau
primar);
4. Se definesc proprietăţile pentru fiecare Combo şi Text;
a. Combo1
i. Click Event
select institutii
set order to nume
seek ALLTRIM(Form1.Combo1.Text)
Form1.Text1.Refresh
Form1.Text2.Refresh
Form1.Text3.Refresh
Form1.Text4.Refresh
78
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Form1.Text5.Refresh
select contacte
set filter to contacte.nr = institutii.nr
Form1.Combo6.Refresh
Form1.Combo7.Refresh
Form1.Combo8.Refresh
Form1.Combo9.Refresh
Form1.Combo10.Refresh
ii. RowSource: Institutii.nume
iii. Row Source Type: 6 – Fields
b. Combo2
i. Click Event
select institutii
set order to adresa
seek ALLTRIM(Form1.Combo2.Text)
Form1.Text1.Refresh
Form1.Text2.Refresh
Form1.Text3.Refresh
Form1.Text4.Refresh
Form1.Text5.Refresh
select contacte
set filter to contacte.nr = institutii.nr
Form1.Combo6.Refresh
Form1.Combo7.Refresh
Form1.Combo8.Refresh
Form1.Combo9.Refresh
Form1.Combo10.Refresh
ii. RowSource: Institutii.adresa
iii. Row Source Type: 6 – Fields
c. Analog Combo3 şi Combo5
d. Combo4
select institutii
set order to nr
seek val(ALLTRIM(Form1.Combo4.Text))
Form1.Text1.Refresh
Form1.Text2.Refresh
Form1.Text3.Refresh
Form1.Text4.Refresh
Form1.Text5.Refresh
select contacte
set filter to contacte.nr = institutii.nr
Form1.Combo6.Refresh
Form1.Combo7.Refresh
Form1.Combo8.Refresh
Form1.Combo9.Refresh
Form1.Combo10.Refresh
e. Command1 (All)
79
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
i. Click Event
select contacte
set filter to
Form1.Combo6.Refresh
Form1.Combo7.Refresh
Form1.Combo8.Refresh
Form1.Combo9.Refresh
Form1.Combo10.Refresh
ii. Caption: All
f. Text1: ControlSource Institutii.nume;
g. Text2: ControlSource Institutii.adresa;
h. Text3, Text4, Text5 analog;
i. Text7: ControlSource Contacte.nume;
j. Text6: ControlSource Contacte.email;
k. Text8, Text9, Text10 analog;
l. Combo7
i. Click Event
select contacte
set order to nume
seek ALLTRIM(Form1.Combo7.Text)
Form1.Text6.Refresh
Form1.Text7.Refresh
Form1.Text8.Refresh
Form1.Text9.Refresh
Form1.Text10.Refresh
ii. RowSource: Contacte.nume
iii. Row Source Type: 6 – Fields
m. Combo6, Combo8 analog;
n. Combo9
i. Click Event
select contacte
set order to poz
seek val(ALLTRIM(Form1.Combo9.Text))
Form1.Text6.Refresh
Form1.Text7.Refresh
Form1.Text8.Refresh
Form1.Text9.Refresh
Form1.Text10.Refresh
ii. RowSource: Contacte.poz
iii. Row Source Type: 6 – Fields
o. Combo10 analog
5. Se salvează forma şi se lansează în execuţie când se obţine o fereastră de tipul:
80
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
81
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
82
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
25. Controale
Controalele sunt mediul de bază pentru interacţiunea cu utilizatorul. Acestea se aplică
pe formulare şi pot avea asociate:
Valori:
• valori (controlul buton de opţiune are valoarea implicită 0 dacă 0
este selectat şi valoarea implicită 1 dacă nu este selectat); dacă 1
1
numele formularului este Form4
(proprietatea Name) iar numele
grupului de butoane de opţiune este
OptionGroup1 atunci accesul la
valoare se face pe calea Form4.OptionGroup1.Option1.Value;
• câmpuri (proprietatea ControlSource);
• variabile ....
Aplicaţia1
Să se realizeze o aplicaţie cu butoane de opţiune (radio) care să afişeze un mesaj la
selectarea unei opţiuni din caseta de opţiuni.
Rezolvare. Se pot urma paşii:
1. Din Project Manager se selectează Documents (Docs) apoi Forms, New..., New Form;
2. Se stabileşte proprietatea Caption pentru formular (din Form Designer, Properties
Window); fie Caption Test; acesta va fi afişat la execuţia formularului;
3. Se stabileşte 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 stabileşte 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 proprietăţi se
activează din nou pe aceeaşi cale; acum avem 4 obiecte: formularul (cu proprietăţile sale)
şi OptionGroup1 (cu proprietăţile sale) şi două obiecte de tip butoane de opţiune (Option1
şi Option2); din caseta de proprietăţi 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 conţine codul procedurii care se
execută la apăsarea unui buton de opţiune (vezi: Object: Form_Test; Procedure: Click) se
introduce următorul cod:
83
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
12. Se pot acum modifica titlurile opţiunilor şi chiar numărul acestora fără ca codul să sufere
modificări; se poate modifica şi mesajul implicit din fereastra de mesaj ca în figura:
84
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
unde alinierea în fereastra de mesaj se poate face dacă se inversează ordinea de afişare:
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)
Aplicaţia2
Să se modifice formularul Form1 (Aplicaţia 4, pag. 54) astfel încât să permită:
12. Pentru adăugare instituţie: 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 aşa mai departe;
13. Pentru adăugare 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 aşa mai departe;
14. Noua formă creată este în conformitate cu relaţia de integritate; pentru protejarea cheilor
la adăugare se poate seta proprietatea Enabled la .F.;
15. Valorile câmpurilor autoincrement de asemenea pot fi blocate la modificare cu ajutorul
aceleiaşi proprietăţi;
Rezolvare. Se urmează paşii:
1. Se modifică setarea ariei maxime a formularelor la dimensiunea de 800×600
(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ă existenţa 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 adăugarea unei persoane de contact în prezenţa relaţiei de integritate se
asociază o valoare implicită pentru câmpul nr din tabela contacte
(contacte/Modify/Fields/nr/Field validation/Default value: 1);
9. Se adaugă câte două controale de tip command button pentru fiecare tabelă pe formular;
85
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Caption: Add
Click Event: (User Procedure):
select institutii
set filter to
ThisForm.SetAll("Enabled",.F.)
ThisForm.Command3.Enabled = .T.
ThisForm.Text1.Enabled = .T.
ThisForm.Text2.Enabled = .T.
ThisForm.Text3.Enabled = .T.
ThisForm.Text4.Enabled = .T.
Append blank
ThisForm.Refresh
Caption: Save
Enabled: .F. - False
Click Event: (User Procedure):
ThisForm.SetAll("Enabled",.T.)
ThisForm.Refresh
11. Se salvează şi se execută formularul, care permite acum şi adăugarea unei instituţii şi/sau
persoane de contact;
86
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
87
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
o ControlSource = variabilă:
valoarea aleasă de utilizator este păstrată în variabilă;
exemplu: se adaugă un control de tip List (List1) la formularul Test; la
evenimentul de activare a formularului se adaugă instrucţiunile:
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 instrucţiunile:
ThisForm.List1.additem(str(i))
i=i+1
se execută formularul; la dublu click se va insera câte un element în listă;
• buton de opţiune:
o ControlSource = câmp numeric:
în câmp va fi inserată valoarea 0 (dacă este selectat butonul) sau 1 (dacă nu
este selectat butonul);
o ControlSource = câmp logic:
în câmp va fi inserată valoarea .T. (dacă este selectat butonul) sau .F. (dacă
nu este selectat butonul);
dacă indicatorul de înregistrări parcurge tabela, valoarea butonului de
opţiune se modifică pentru a reflecta noua valoare a câmpului;
exemplu: să se insereze un control de tip buton de opţiune pentru
înregistrările şterse dintr-o tabelă;
• grup de opţiuni:
o ControlSource = câmp de tip caracter:
se păstrează în câmp titlul butonului selectat;
opţiunea nu este valabilă şi pentru butoane individuale de opţiuni;
• spinner:
o ControlSource = câmp sau variabilă numerică:
caseta de incrementare afişează şi scrie valori numerice din/în câmpul sau
variabila asociate;
exemplu: formularul din aplicaţia 3 (pag. 53);
• text sau edit:
o ControlSource = câmp:
90
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Aplicaţia3
Să se folosească controlul Casetă de Editare pentru a edita un fişier text.
Rezolvare: Click Event:
Se creează o formă ca în figură: Release ThisForm
Click Event:
create cursor textfile;
(filename c(35), mem m)
append blank
replace textfile.filename with;
getfile("txt")
if empty(textfile.filename) Click Event:
return copy memo textfile.mem;
endif to (textfile.filename)
append memo mem from; Enabled:
(textfile.filename) overwrite .F. - False
ThisForm.Edit1.ControlSource;
= "textfile.mem"
ThisForm.Refresh
ThisForm.Command2.Enabled;
= .T.
Cu ajutorul grid-urilor se pot crea formulare care să opereze cu informaţii din mai
multe tabele relatate cu relaţii de tipul 1 la n, ca în exemplul:
91
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Aplicaţia 1.
Formular cu 3 butoane de comandă care să deschidă şi să parcurgă tabela contacte. La
apăsarea unuia dintre butoane să se activeze o fereastră de mesaj cu conţinutul înregistrării
curente. Să se adauge apoi o casetă de tip Text care să conţină numele persoanei de contact
selectate fără a permite modificarea.
Rezolvare. Se pot urma paşii:
1. Se generează un nou formular (Forms/New…/New Form);
2. Se adaugă un control Text şi un container CommandGroup;
3. Se foloseşte aplicaţia expert Text Box Builder pentru a seta proprietăţi 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 câmp din tabelă; se lasă contacte.nume;
5. Se foloseşte aplicaţia expert Command Group Builder pentru a seta proprietăţi pentru
containerul CommandGroup1;
92
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Aplicaţia 2.
Formular care să permită adăugarea unei persoane de contact după o machetă
predefinită.
Rezolvare. Se creează un nou formular. Se urmează paşii:
1. se adaugă pe formular un control de listă ascunsă, un container de tipul butoane de
opţiune, 4 casete de tip text şi un buton de comandă;
2. se foloseşte aplicaţia expert Combo Box Builder pentru a seta proprietăţi pentru Combo1;
din baza de date universitati şi tabela contacte se alege câmpul nume pentru a i se lega
valorile cu lista ascunsă; la stilul listei se alege Drop-down list;
93
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Aplicaţia 3.
Să se folosească containerele PageFrame şi Grid pentru vizualizarea datelor din baza de date
universitati.
Rezolvare: se poate construi un formular după modelul:
95
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Grid1 Grid2
Page1 Page2
PageFrame1
Se urmează paşii:
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 proprietăţi containerul Grid1 (pentru instituţii);
6. Se lansează aplicaţia expert Grid Builder pentru definirea proprietăţilor containerului
Grid1; în tabulatorul Grid Items se selectează tabela institutii şi din caseta Available fields
se includ în caseta Selected fields câmpurile: Nume, Acronim, Adresa, Web;
7. Se selectează din fereastra de proprietăţi containerul Grid2 (pentru contacte);
8. Se lansează aplicaţia expert Grid Builder pentru definirea proprietăţilor containerului
Grid1; în tabulatorul Grid Items se selectează tabela contacte şi din caseta Available fields
se includ în caseta Selected fields câmpurile: 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ă câmpul nr;
10. Se setează manual proprietăţile şi evenimentele controalelor şi containerelor:
10.1. evenimentul Form1.Activate:
ThisForm.Grid1.Visible = .T.;
10.2. evenimentul Page1.Click:
ThisForm.Grid2.Visible = .F.
ThisForm.Grid1.Visible = .T.
10.3. evenimentul Page2.Click:
ThisForm.Grid1.Visible = .F.
ThisForm.Grid2.Visible = .T.
96
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
ThisFormSet.Release
ThisFormSet.Release
6. Se foloseşte aplicaţia expert Combo Box Builder pentru a seta proprietăţile casetei
Combo1:
97
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
98
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
28. Meniuri
În VFP, folosirea meniurilor în aplicaţii face ca rezultatul obţinut (produsul program)
să îşi mărească calitatea în exploatare.
Fiecare parte a unei aplicaţii VFP poate avea propriul său meniu sistem sau un set de
meniuri. Pentru a crea un meniu, se foloseşte aplicaţia expert Menu Designer.
Crearea unui meniu sistem implică câţiva paşi. În funcţie de mărimea aplicaţiei şi
complexitatea meniurilor care se intenţionează a se folosi, aceştia sunt:
1. Planificarea şi construcţia sistemului (decide ce meniuri ai nevoie, dacă acestea vor apărea
în interfaţă, care dintre acestea necesită submeniuri, şi aşa mai departe);
2. Crearea meniurilor şi submeniurilor (definirea titlurilor pentru meniu, pentru elementele
din meniu, utilizând Menu Designer);
3. Asocierea de evenimente astfel încât sistemul să facă ce dorim (specificarea acţiunilor
pentru meniuri de efectuat; adiţional, se poate include cod de iniţializare şi cod de
curăţire); codul de iniţializare se execută înainte ca meniul sistem să apară şi se poate
include cod pentru deschiderea de fişiere, declararea de variabile; codul de curăţire
conţine 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. Execuţia programului pentru a testa sistemul.
Aplicaţia 5.
Să se creeze un meiul după modelul:
99
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Aplicaţia 1.
Să se construiască un meniu cu opţiuni de comandă pentru acţiunile: deschidere baza
de date Universitati, afişare ferestre de Browse pentru tabelele Institutii şi Contacte şi o
opţiune Help About.
Rezolvare. Se urmează paşii:
1. Se creează un director pentru stocarea fişierelor aplicaţiei;
2. Se creează un nou proiect (New/Project/New file); fie acesta proj1.pjx;
3. În fereastra de comenzi se testează funcţia 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 următoarele 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ă fişierul; ne asigurăm 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 opţiunea Set Main selectată (9 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
aplicaţiei expert Menu Designer; acesta se poate realiza după structura:
100
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
\<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 conţine definiţiile pentru comenzi
(BAR) şi submeniuri (PAD/POPUP); dintre fişierele generate de VFP sunt esenţiale pentru
sistem: menu1.MNX (care este o tabelă cu informaţii despre structura şi conţinutul
meniului), menu1.MNT (un fişier memo) şi menu1.mpr (care conţine comenzile generate
de aplicaţia expert pentru crearea meniului); în acest din urmă fişier se pot vedea
comenzile generate (se poate deschide cu Notepad); de menţionat că sistemul nu permite
modificarea directă a acestui fişier, el fiind actualizat la execuţie în conformitate cu
definiţiile din fişierul MNX;
11. În orice moment al construcţiei sale, se poate vedea configuraţia meniului (Menu Designer
– menu1.mnx/Preview);
12. Execuţia meniului (Project Manager/Other/Menus/Menu1/Run) este sortită eşecului;
sistemul lansează meniul în execuţie însă nu este pregătit pentru gestiunea acestuia;
13. Se aplică următoarele modificări meniului (din Menu Designer – menu1):
a. Se editează conţinutul procedurii pentru Help/About:
MessageBox("First menu VFP");
b. Se editează conţinutul 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 opţiune Location se selectează opţiunea Append;
d. Se salvează meniul (File/Save) şi se generează noul cod (Menu/Generate...);
14. Se aplică următoarele modificări programului program1:
* comenzi pentru executia aplicatiei
do menu1.mpr
read events
* sfarsit aplicatie
15. Tentativa de a executa meniul este în continuare sortită eşecului; se poate însă acum
executa program1 (Project Manager/Code/Programs/Program1/Run);
16. Programul produce afişarea casetelor de mesaj dorite (Help/About... şi File/Quit);
observaţie: meniul aplicaţiei se adaugă meniului sistemului VFP şi la ieşire rămâne activat
101
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
devenind parte integrantă a mediului VFP şi după terminarea aplicaţiei (comanda Cancel);
pentru a ajusta această situaţie trebuie scrise comenzile corespunzătoare în procedura
pentru comanda File/Quit; un alt inconvenient este starea activă a comenzii (opţiunii)
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. \<Open... (Procedure) Options/Bar #: 101;
b. \<Quit (Procedure) Options/Bar #: 102;
c. \<About... (Procedure) Options/Bar #: 103;
20. Se generează codul (Menu/Generate...);
21. Se vizualizează codul generat pentru a ne asigura de modificări;
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ă reîncărcarea aplicaţiei MVFP;
25. Pentru ca aplicaţia să restaureze mediul VFP implicit se va modifica sfârşitul procedurii
corespunzătoare comenzii File/Quit astfel:
messagebox("restaurare cale: "+sys(5)+sys(2003))
SET SYSMENU TO DEFAULT
cancel
26. Se poate genera acum aplicaţia executabilă pe calea Project Manager –
proj1/Code/Programs/program1/Build...;
27. Se testează aplicaţia (din Windows Explorer); se completează acum cu procedurile lipsă;
28. La începutul programului program1 se va adăuga o variabilă tabela_use:
tabela_use = ""
cale_veche = sys(5)+sys(2003)
29. Se încarcă din nou menu1 în Menu Designer; se completează procedura pentru
File/Open...:
tabela_use1 = GetFile('DBF', 'Browse a Table:', 'Browse', 0, 'Browse')
if like(tabela_use, tabela_use1)
Return && do nothing
102
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
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 adăuga un BAR Close (File/Close) a cărui procedură să dezactiveze pe Browse:
use
tabela_use = ""
Set Skip of Pad Browse1 of _MSYSMENU .T.
31. Se lansează în execuţie şi se testează aplicaţia program1; se generează executabilul;
32. Se pot elibera din memorie inclusiv elementele sistem, ca în exemplul:
RELEASE PAD _MEDIT OF _MSYSMENU
Aplicaţia 2.
Un meniu creat fără constructorul de meniuri.
Soluţie. Se creează un nou program (File/New/Program/New file); se salvează cu numele
Definpad.prg.
filen = Locfile("definpad", "prg,app,exe", "Locate definpad.prg")
set default to substr(filen,1,RAT("DEFINPAD.",filen)-1)
Clear
103
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Aplicaţia 3.
Un meniu creat fără constructorul de meniuri.
Soluţie. Se creează un nou program (File/New/Program/New file); se salvează cu numele
Definbar.prg.
filen = Locfile("definbar", "prg,app,exe", "Locate definbar.prg")
set default to substr(filen,1,RAT("DEFINBAR.",filen)-1)
CLEAR
SET SYSMENU SAVE
SET SYSMENU TO
DEFINE PAD convpad OF _MSYSMENU PROMPT '\<Conversions' COLOR SCHEME 3 ;
KEY ALT+C, ''
DEFINE PAD cardpad OF _MSYSMENU PROMPT 'Card \<Info' COLOR SCHEME 3 ;
KEY ALT+I, ''
ON PAD convpad OF _MSYSMENU ACTIVATE POPUP conversion
ON PAD cardpad OF _MSYSMENU ACTIVATE POPUP cardinfo
DEFINE POPUP conversion MARGIN RELATIVE COLOR SCHEME 4
DEFINE BAR 1 OF conversion PROMPT 'Ar\<ea' KEY CTRL+E, '^E'
DEFINE BAR 2 OF conversion PROMPT '\<Length' ;
KEY CTRL+L, '^L'
DEFINE BAR 3 OF conversion PROMPT 'Ma\<ss' ;
KEY CTRL+S, '^S'
104
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Aplicaţia 4.
Un meniu creat fără constructorul de meniuri.
Soluţie. Se creează un nou program (File/New/Program/New file); se salvează cu numele
Definmenu.prg.
filen = Locfile("definmenu", "prg,app,exe", "Locate definmenu.prg")
set default to substr(filen,1,RAT("DEFINMENU.",filen)-1)
CLEAR
SET SYSMENU SAVE
SET SYSMENU TO
ON KEY LABEL ESC KEYBOARD CHR(13)
DEFINE MENU example BAR AT LINE 1
DEFINE PAD convpad OF example PROMPT '\<Conversions' COLOR SCHEME 3 ;
KEY ALT+C, ''
DEFINE PAD cardpad OF example PROMPT 'Card \<Info' COLOR SCHEME 3 ;
KEY ALT+I, ''
ON PAD convpad OF example ACTIVATE POPUP conversion
ON PAD cardpad OF example ACTIVATE POPUP cardinfo
DEFINE POPUP conversion MARGIN RELATIVE COLOR SCHEME 4
DEFINE BAR 1 OF conversion PROMPT 'Ar\<ea' ;
105
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Aplicaţia 5.
Un meniu creat fără constructorul de meniuri cu submeniuri.
Soluţie. Se creează un nou program (File/New/Program/New file). Se salvează şi se execută.
DEFINE WINDOW wOrder FROM 10,0 TO 13,39
DEFINE MENU mnuDinner
DEFINE PAD padOne OF mnuDinner PROMPT '\<Main Course' KEY ALT+M, ''
DEFINE PAD padTwo OF mnuDinner PROMPT '\<Dessert' KEY ALT+D, ''
ON PAD padOne OF mnuDinner ACTIVATE POPUP popMainCourse
ON PAD padTwo OF mnuDinner ACTIVATE POPUP dessert
DEFINE POPUP popMainCourse MARGIN MESSAGE ;
'We have burgers and pizza today'
DEFINE BAR 1 OF popMainCourse PROMPT '\<Hamburgers'
DEFINE BAR 2 OF popMainCourse PROMPT '\<Pizza'
ON BAR 1 OF popMainCourse ACTIVATE POPUP burger
ON BAR 2 OF popMainCourse ACTIVATE POPUP pizza
106
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
107
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Aplicaţia 6.
Un meniu creat fără constructorul de meniuri.
Soluţie. Se creează un nou program (File/New/Program/New file); se salvează cu numele
Definpop.prg.
filen = Locfile("definpop", "prg,app,exe", "Locate definpop.prg")
set default to substr(filen,1,RAT("DEFINPOP.",filen)-1)
CLEAR
SET SYSMENU SAVE
SET SYSMENU TO
DEFINE PAD convpad OF _MSYSMENU PROMPT '\<Conversions' COLOR SCHEME 3 ;
KEY ALT+C, ''
DEFINE PAD cardpad OF _MSYSMENU PROMPT 'Card \<Info' COLOR SCHEME 3 ;
KEY ALT+I, ''
ON PAD convpad OF _MSYSMENU ACTIVATE POPUP conversion
ON PAD cardpad OF _MSYSMENU ACTIVATE POPUP cardinfo
DEFINE POPUP conversion MARGIN RELATIVE COLOR SCHEME 4
DEFINE BAR 1 OF conversion PROMPT 'Ar\<ea' KEY CTRL+E, '^E'
DEFINE BAR 2 OF conversion PROMPT '\<Length' ;
KEY CTRL+L, '^L'
DEFINE BAR 3 OF conversion PROMPT 'Ma\<ss' ;
KEY CTRL+S, '^S'
DEFINE BAR 4 OF conversion PROMPT 'Spee\<d' ;
KEY CTRL+D, '^D'
DEFINE BAR 5 OF conversion PROMPT '\<Temperature' ;
KEY CTRL+T, '^T'
DEFINE BAR 6 OF conversion PROMPT 'T\<ime' ;
KEY CTRL+I, '^I'
DEFINE BAR 7 OF conversion PROMPT 'Volu\<me' ;
KEY CTRL+M, '^M'
ON SELECTION POPUP conversion;
DO choice IN definpop WITH PROMPT( ), POPUP( )
DEFINE POPUP cardinfo MARGIN RELATIVE COLOR SCHEME 4
DEFINE BAR 1 OF cardinfo PROMPT '\<View Charges' ;
KEY ALT+V, ''
DEFINE BAR 2 OF cardinfo PROMPT 'View \<Payments' ;
KEY ALT+P, ''
DEFINE BAR 3 OF cardinfo PROMPT 'Vie\<w Users' ;
KEY ALT+W, ''
DEFINE BAR 4 OF cardinfo PROMPT '\-'
DEFINE BAR 5 OF cardinfo PROMPT '\<Charges '
DEFINE BAR 6 OF cardinfo PROMPT '\-'
DEFINE BAR 7 OF cardinfo PROMPT 'E\<xit '
ON SELECTION POPUP cardinfo;
DO choice IN definpop WITH PROMPT( ), POPUP( )
PROCEDURE choice
PARAMETERS mprompt, mpopup
WAIT WINDOW 'You chose ' + mprompt + ' from popup ' + mpopup NOWAIT
IF mprompt = 'Exit'
SET SYSMENU TO DEFAULT
ENDIF
108
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
109
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
endif
* comenzi pentru executia aplicatiei
do menu2.mpr
Set Skip of Pad Browse1 of _MSYSMENU .T.
read events
* sfarsit aplicatie
7. Se execută programul program1 (Project Manager – proj1/Code/Programs/Program1/
Run); se generează executabilul (Project Manager – proj1/Code/Programs/Program1/
Build...);
Execuţia meniurilor din formulare
Odată create meniurile şi generat codul sursă al programului de meniu se poate folosi
acesta pentru a executa meniul din formulare. Următoarea aplicaţie foloseşte codul
programelor menu1.mpr, Definpad.prg, Definbar.prg, Definmenu.prg, program2.prg
(Aplicaţia 5), Definpop.prg şi menu2.mpr. Se urmează paşii:
1. Se deschide proiectul proj1.pjx (Aplicaţia 1);
2. Se creează un nou formular (Project Manager – proj1/Documents/Forms/New.../New
Form); se salvează cu numele form1.scx; se adaugă un container cu 8 butoane de comandă
ca în figura:
3. Se asociază evenimente:
a. Command1.Click:
Do menu1.mpr
Set Skip of Pad Browse1 of _MSYSMENU .T.
read events
b. Command2.Click: Do Definepad.prg
c. Command3.Click: Do Definebar.prg
d. Command4.Click: Do Definemenu.prg
e. Command5.Click: Do program2.prg
110
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
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.
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ă aplicaţia proj1.
112
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
EXE
113
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Protocoalele de transfer de date (şi driverele aferente) ale staţiei şi serverului sunt
furnizate de către sistemul de operare, aşa cum se poate observa în figurile de mai jos.
Acestea se configurează urmând prescripţiile din documentaţia 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 când sistemele de operare sunt diferite şi SGBD-
urile trebuiesc configurate pentru comunicare atât pe server cât şi pe staţie.
114
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
4. Cu ajutorul lui phpmyadmin se pot crea acum utilizatori care să acceseze bazele de date
MySQL din interfaţa phpMyAdmin:
6. Se poate modifica acum structura tabelei. De exemplu se corectează câmpurile nume, tip,
functia, domeniu din tinyint în char şi tipul indexului pentru câmpurile de tip caracter:
[ Browse ] [ Select ] [ Insert ] [ Empty ] [ Drop ]
Field Type Attributes Null Default Extra Action
c
d
e
f
g nr tinyint(4) No 0 Change Drop Primary Index Unique Fulltext
c
d
e
f
g nume tinyint(30) No 0 Change Drop Primary Index Unique Fulltext
c
d
e
f
g tip tinyint(15) No 0 Change Drop Primary Index Unique Fulltext
c
d
e
f
g functia tinyint(20) No 0 Change Drop Primary Index Unique Fulltext
c
d
e
f
g domeniu tinyint(20) No 0 Change Drop Primary Index Unique Fulltext
Change Drop
With selected: Or
116
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
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 conţine cele două tabele, lejpt şi ljs;
9. Se poate defini câmpul nr ca câmp autoincrement:
ALTER TABLE `referenti`.`lejpt` CHANGE `nr` `nr`
TINYINT(4) DEFAULT '0' NOT NULL AUTO_INCREMENT
11. Odată definită funcţia autoincrement, nu mai este necesară completarea valorii pentru nr:
15. Se pot acum copia valorile din tabelul lejpt în tabelul ljs:
INSERT INTO `referenti`.`ljs` SELECT * FROM `referenti`.`lejpt`
117
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
16. Dacă a fost creat un tabel care ulterior nu mai este de dorit a se păstra î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ţă
(întâi browse şi apoi edit):
118
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
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 poate crea o vedere care să conţină informaţiile din tabelul ljs şi o vedere care să
conţină informaţiile din tabelul lejpt. Se vor include toate câmpurile din cele două tabele şi se
vor salva acestea în baza de date:
119
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
120
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
select view3
list nume for "ref" $ tip
thisform.release
cancel
121
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
123
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
6. Se poate modifica formularul form1 astfel încât să nu afişeze parola la intrare. Se modifică
proprietatea PasswordChar a casetei Text1: $;
7. Se execută din nou aplicaţia:
124
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
125
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
126
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
127
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
SQLMORERESULTS(nConnectionHandle)
Exemplul 6.
= SQLSETPROP(gnConnHandle, 'BatchMode', .F.) && Individual result sets
= SQLEXEC(gnConnHandle, 'SELECT * FROM authors;
SELECT * FROM titles')
= SQLMORERES(gnConnHandle) && First result set
= SQLMORERES(gnConnHandle) && Second result set
128
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Obiectivul este crearea interfeţei de exploatare a bazei de date. după crearea bazei de
date, a tabelelor şi stabilirea relaţiilor între tabele, conţinutul directorului cu baza de date este:
129
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
1. Formulare pentru adăugarea şi modificarea unui centru, şi curs; tabelele nu au chei străine
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:
130
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
3. Tabelele note, repart şi taxe sunt tabele ce implementează relaţii (m,n) între tabelele
module şi stud; adăugarea unei note presupune selecţia studentului din tabela de studenţi,
selectarea modulului din tabela de module şi introducerea datei, formei şi notei; adăugarea
unei repartiţii presupune selecţia studentului din tabela de studenţi, selecţia modulului din
tabela de module şi introducerea formei; adăugarea unei taxe presupune selecţia
studentului din tabela stud, selecţia 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 Form1.activate:
repl taxe.cod_modul with c_modul,; thisform.text2.text = dtoc(date())
taxe.cod_stud with c_stud,;
taxe.data with date(),
taxe.suma with val(thisform.text1.text)
4. La fel se procedează şi pentru celelalte două formulare:
131
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
select "stud.dbf"
c_stud = cod_stud
select "module.dbf"
c_modul = cod_modul
select "note.dbf"
append blank
repl note.cod_modul with c_modul,; Form1.activate:
note.cod_stud with c_stud,; thisform.text2.text = dtoc(date())
note.data with date(),
note.nota with val(thisform.text1.text)
132
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
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 făcut cu ajutorul
wizard-ului: New/Form/Wizard/One-to-Many Form Wizard, la fel ca la formularul stud,
însă s-ar pierde o legătură; se poate face în forma anterioară, se crează un formular pentru
prof:
Form1.activate:
thisform.text1.text = dtoc(date())
133
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
select "cursuri.dbf"
cod_c = cursuri.cod_curs
select "prof.dbf"
cod_p = prof.cod_prof
select "centre.dbf"
cod_n = centre.cod_centru
select module
append blank &&are functie autoincrement
replace module.cod_centru with cod_n,;
module.cod_curs with cod_c,;
module.cod_prof with cod_p,;
module.data with date()
134
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
135
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
36. Crearea unui nou fişier help (.chm) cu HTML Help Workshop
HTML Help Workshop este un produs free Microsoft şi poate fi descărcat de pe situl
Microsoft. Se instalează în sistem (sunt necesare privilegii de administrator) după care se
încarcă în execuţie pe calea Start/Programs/HTML Help Workshop/HTML Help Workshop.
Se creează un nou help (File/New). Dacă au fost deja create fişiere componente ale
proiectului, se pot include în el:
După generarea proiectului, se pot defini opţiunile acestuia, în care se includ topicele,
aşa cum rezultă din figurile următoare.
136
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
137
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
[INFOTYPES]
Fişierele *.htm sunt fişiere (D)HTML standard şi pot fi generate cu orice program
creator de pagini web (Netscape Composer, Microsoft Word, FrontPage).
Iată conţinutul fişierelor an_introduction.htm, a_documentation.htm şi f_centre.htm:
an_introduction.htm
<html><head><title>SAPIAP Help</title></head><body>
Baza de date a Scolii Academice Postuniversitare de Informatica Aplicata si Programare este
in urmatoarea structura:<BR>
<img src="bd_all.jpg"><BR>
<BR>Vezi si:<BR>
tabela <A HRef = "t_centre.htm">centre</A><BR>
tabela <A HRef = "t_stud.htm">studenti</A><BR>
tabela <A HRef = "t_cursuri.htm">cursuri</A><BR>
tabela <A HRef = "t_prof.htm">profesori</A><BR>
tabela <A HRef = "t_module.htm">module</A><BR>
tabela <A HRef = "t_note.htm">note</A><BR>
informatiile despre realizarea <A HRef = "a_documentation.htm">helpului</A>
</body></html>
a_documentation.htm
<html><head><title>SAPIAP Help</title></head><body>
Fisierele incluse in topicul acestui help sunt:<BR>
<img src="z_doc.jpg"><BR>
</body></html>
f_centre.htm
<html><head><title>Fromularul centre</title></head><body>
<BR>Formularul Centre ne permite sa prelucreaza informatiile din tabela de centre de
invatamant:<BR>
<img src="form_centre.jpg" align=center><BR>
<BR>Parcurgerea se realizeaza cu butoanele:<BR>
<ul><li>top: inceputul tabelei<li>prev: inregistrarea anterioara
<li>next: urmatoarea inregistrare<li>bottom: ultima inregistrare</ul>
<img src="find_centre.jpg" align=center><BR>
<BR>Cautarea informatiilor se face cu butonul Find:<BR>
<img src="result_centre.jpg" align=center><BR>
<BR>Tiparirea informatiilor se face cu butonul print:<BR>
<img src="result_centre.jpg" align=center><BR>
<BR>Adaugarea unui nou centru se face cu butonul Add:<BR>
<img src="add_centre.jpg" align=center><BR>
<BR>Editarea informatiilor despre un centru se face cu butonul Edit:<BR>
<img src="edit_centre.jpg" align=center><BR>
<BR>Stergerea unui centru se face cu butonul Delete iar iesirea din formular se face cu
butonul Exit.<BR>
Vezi si:<BR>
tabela <A HRef = "t_centre.htm">centre</A><BR>
raportul <A HRef = "r_centre.htm">centre</A><BR>
pagina de<A HRef = "an_introduction.htm">inceput</A><BR>
</body></html>
138
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
139
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
140
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Se poate acum regenera aplicaţia cu Application Builder când se specifică fişierul help
postuniv.chm în pagina Advanced a acestuia.
141
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
142
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
locale, SGBDD-ul care o gestionează fiind considerat, evident, omogen. La primirea unei
cereri, staţia de la care a fost lansată cererea devine staţie coordonatoare şi este responsabilă
pentru determinarea numelui entităţii şi pentru accesarea catalogului.
Componenta de gestiune a tranzacţiilor elaborează, de obicei, un plan global care
include atât module de acces la distanţă, cât şi module de acces local. Staţiile cooperante
păstrează autonomia completă asupra propriilor date (locale).
Baza de date distribuită eterogenă se obţine prin integrarea într-o bază de date unică a
mai multor baze administrate de SGBD-uri diferite. Există două nivele de eterogenitate. O
situaţie în care bazele de date sunt de acelaşi tip (de exemplu, relaţional) dar sunt gestionate
de SGBD-uri diferite şi alta în care bazele de date sunt de tipuri diferite (de exemplu,
relaţional, ierarhic, reţea) şi, evident, sunt gestionate de SGBD-uri diferite. Problema este
deosebit de ambiţioasă şi, evident, este dificil de rezolvat în totalitate.
Bazele de date federale (BDF), numite şi multibaze de date, permit interoperabilitatea
în baze de date autonome şi eterogene cu ajutorul unui limbaj multibază şi nu cu ajutorul unei
scheme globale. Prin această abordare se permite asigurarea unei autonomii totale a diferitelor
baze de date componente ale BDF şi, de asemenea, se oferă posibilitatea administrării,
gestionării şi manipulării independente a acestor baze. Absenţa schemei locale implică
tolerarea conflictelor semantice.
Percepţia utilizatorului privind o baza de date federală nu este aceea de bază de date
globală, ci aceea de mulţime de baze de date distincte interoperabile. Noţiunea de staţie este
înlocuită cu cea de bază de date, deoarece BD care fac parte dintr-o federaţie (BDF) nu se află
obligatoriu pe staţii diferite. Astfel, o arhitectură pe trei nivele a schemei unei baze de date
federale (BDF) conţine:
1) nivelul privat care conţine schemele interne şi conceptuale ale fiecărei baze de date BDF;
2) nivelul multibază (schema exportată) descrie o bază de date existentă în federaţie ca pe un
subansamblu al acesteia. Exisă, tot la acest nivel, o schemă de dependenţe interbaze care
face legătura între schemele exportate ale diferitelor baze de date din baza de date
federală;
3) Nivelul extern(schema externă) permite manipularea datelor din diferite baze componente.
Bazele de date paralele (BDP) încearcă îmbunătăţirea performanţelor, fiabilităţii şi
costului gestiunii datelor, bazându-se pe paralelismul oferit de recentele arhitecturi
multiprocesor. Există variantele:
• arhitectura cu memorie comună, în care fiecare procesor poate avea acces, în egală
măsură, la fiecare modul de memorie centrală şi la fiecare unitate de disc, prin reţelele de
interconexiune;
143
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
• arhitectura cu memorie privată este formată dintr-o mulţime de noduri care pot coopera
datorită unei reţele de interconexiuni. Fiecare nod conţine unul sau mai multe procesoare
care au acces exclusiv la modulele memoriei interne şi la unităţile de discuri proprii
nodului respective.
Limbajele de programare convenţionale ce permit programarea obiectuală permit
crearea, manipularea şi distrugerea obiectelor în memoria internă. Aceasta înseamnă că durata
de viaţă a unui astfel de obiect (tranzitoriu) nu depăşeşte durata de viaţă a programului care l-
a creat. O soluţie în prelungirea vieţii obiectelor este copierea lor în fişiere, pentru a putea fi
citite şi manipulate ulterior, această abordare fiind evident o formă primitivă de persistenţă a
obiectelor. Din păcate ea nu e transparentă, trebuind gestionată explicit, iar programarea
operaţiilor de gestionare este delicată, trebuind transformaţi pointerii (adrese virtuale) în
adrese disc. În această situaţie, accesul într-un set de mai multe obiecte este neperformant,
neajuns la care se adaugă şi problemelor clasice referitoare la gestionarea fişierelor.
Abordarea cu baze de date de orientare obiect aduce o soluţie nouă la problema gertiunii
transparente a obiectelor persistente, adică acelor obiecte care, stocate în baza de date, au o
durată de viaţă evident mai mare decât programul prin care au fost create obiectele respective.
Ideea de bază constă în a combina conceptele obiect cu concepte referitoare la bazele de date.
Prima motivaţie pentru bazele de date orientate obiect este nevoia de acces rapid la
obiecte persistente prin programe scrise în limbaje cu facilităţi în programarea orientată pe
obiecte.
A doua motivaţie este legată de noile cerinţe din tehnologiile aplicaţiilor complexe
cum ar fi CAD (Computer Aided Design), CAM (Computer Aided Manufacturing), CASE
(Computer Aided Software Engineering), CAE (Computer Aided Engineering), aplicaţii
grafice, multimedia, ş.a.
Schema unei BDOO trebuie să cuprindă, deci, definiţiile structurale (atribute şi tipuri)
şi comportamentale (metode) ale obiectelor, precizând toate clasele definite pentru o aplicaţie.
Definiţiile claselor includ moştenirea, relaţiile de înrudire (supraclase-subclase) şi relaţiile
structurale dintre clase (asocierile). Asocierile dintre clase sunt necesare pentru a cuprinde
restricţiile de integritate referenţială la nivel de clasă, o asociere între două clase fiind
reprezentată natural prin două legături, una fiind inversa celeilalte. Schema bazei de date
trebuie să specifice, deci, datele care ar putea fi materializate şi asocierile dintre ele, fiind
definită de către proiectantul bazei utilizând conceptele modelului de date (în cazul obiect:
clase, moştenire, etc.) Schema unei BDOO poate fi, astfel, modificată dinamic în funcţie de
necesităţile utilizatorilor, ceea ce presupune:
144
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
145
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
ar fi C++ sau Smalltalk) pentru a realiza definirea schemei unei BDO şi a programelor
aplicaţie care să integreze apelurile la rutinele de gestiune a datelor, adică pentru a ajunge
la un SGBDOO;
• abordarea integrată, în care SGBDOO foloseşte un model ce integrează concepte
semantice şi obiect, adică nu se bazează pe nici un model deja existent, fie el relaţional sau
obiect. Un SGBDOO integrat poate fi independent de orice limbaj de programare, oferind
o interfaţă multilimbaj, aşa cum lucrează sistemul O2;
• păstrarea unui limbaj compatibil SQL (extins), dar fără a folosi modelul relaţional, aşa
cum propune UniSQL. Această ultimă abordare este diferită de abordarea bazată pe
modelul relaţional deoarece SGBDOO şi modelul lui consideră, pur şi simplu, conceptul de
relaţie ca pe un caz particular de constructor.
Caracteristicile obligatorii ale unui SGBDO sunt:
1. manipularea obiectelor atomice şi complexe (compuse). Un constructor este o funcţie
asociată unei clase care permite crearea şi iniţializarea unui obiect, iar un constructor este
de asemenea o funcţie asociată unei clase prin care se distruge un obiect. Un obiect
complex este realizat din alte obiecte, adică o parte dintre atributele unui astfel de obiect
pot fi ele însele obiecte (instanţe ale unor clase), un obiect complex (compus) având, deci,
o structură ierarhică (o ierarhie de părţi). Această noţiune s-a născut, deci, prin aplicarea
de constructori asupra unor obiecte simple. Minimul de constructori pe care un SGBDOO
trebuie să îi conţină sunt constructorii de seturi, liste şi tupluri (înregistrări). O altă
condiţie în cadrul modelului orientat pe obiecte este ortogonalitatea, aceasta însemnând
că fiecare constructor trebuie să fie aplicabil fiecărui obiect.
2. Identitatea obiectelor. Orice obiect trebuie să primească în momentul creării (prin
intermediul sistemului) un identificator, adică o referinţă unică independentă de valorile
atributelor lui.
3. Încapsularea. Ea derivă din tipurile de date abstracte şi s-a menţinut în gestiunea BDOO
din două motive: necesitatea de a diferenţia specificarea unei operaţii de implementarea
acesteia şi ideea de modularizare. Încapsularea sugerează două părţi pentru orice obiect.
Partea de interfaţă reprezentând specificarea unui set de operaţii care se pot aplica asupra
unui obiect, fiind singura zonă vizibilă a obiectului. Implementarea se referă atât la
componenta de date, cât şi la cea de procedură. Partea de date este, de fapt, reprezentarea
(câmpurilor) obiectului, în timp ce partea de procedură descrie, cu ajutorul unui limbaj de
programare, implementarea fiecărei operaţii. Implementarea este mascată (ascunsă) în
cadrul obiectului.
146
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
4. Ierarhii de clase sau tipuri (moştenire simplă). O clasă poate fi specializarea unei alte
clase şi, prin urmare, o moşteneşte. Moştenirea reduce eforturile de programare. Există
patru modalităţi de a moşteni: prin substituţie (dacă asupra unui obiect din subtip se pot
executa mai multe operaţii decât asupra unui obiect din supratip), prin incluziune (dacă
orice obiect din subtip este şi obiect din supratip), prin restricţie (caz particular al
incluziunii în care obiectele subtipului sunt toate din supratip care satisfac o restricţie
specificată) şi prin specializare (obiectele subtipului aparţin şi supratipului, dar conţin un
surplus de informaţii specifice).
5. Polimorfismul. Adică, la primirea unui mesaj, stabilirea metodei care se aplică se face în
mod dinamic, în funcţie de clasa obiectului în cauză. Astfel, obiecte diferite (instanţe ale
unor clase diferite) pot fi adresate uniform (pot primi aceleaşi mesaje), dar manifestă
comportamente diferite. Aceasta asigură manipularea simplă şi coerentă a seturilor
eterogene de obiecte.
6. Uşurinţa interogării. Un obiect poate fi reperat utilizând valorile atributelor sale,
legăturile cu alte obiecte sau metodele aplicate obiectului respectiv.
7. Persistenţa obiectelor. Obiectele au durata de viaţă mai mare decât programul care le-a
creat.
8. Concurenţa acceselor. O BDOO poate fi partajată simultan de către tranzacţii care o
consultă şi tranzacţii care o modifică.
9. Fiabilitatea obiectelor. Obiectele trebuie să poată fi restaurate în catul unui incident, adică
să poată fi aduse la starea pe care au avut-o înaintea manifestării incidentului.
Dintre caracteristicile opţionale ale unui SGBDOO menţionăm:
1. Moştenirea multiplă. O clasă (subclassă) poate fi specializarea directă a două sau mai
multe supraclase şi, deci, să moştenească proprietăţile acestora.
2. Versiuni ale obiectelor. Plecând de la un anumit obiect, prin modificări succesive ale
schemei, pot fi obţinute mai multe versiuni ale obiectului. Acestea generează un graf al
versiunilor unui obiect care trebuie să fie gestionat de sistem.
3. Distribuţia obiectelor. Aceasta presupune gestiunea obiectelor dintr-o BDOO în staţii de
lucru diferite (fragmente BDOO locale).
4. Modelarea tranzacţiilor evoluate. Ideea constă în acceptarea tranzacţiilor imbricate care
pot fi descompuse în subtranzacţii.
Nu există deocamdată o părere comună privind arhitectura unui SGBDOO, mai mult,
arhitectura unui astfel de sistem poate fi o problemă de perspectivă, fiind dependentă de
modul în care este văzut SGBDOO de către cercetător, ca utilizator final sau ca administrator
de sistem. Totuşi, arhitectura unui SGBDOO trebuie să cuprindă trei componente majore:
147
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
148
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
care să se asigure navigarea în cadrul modelului funcţional. Aceste două mecanisme stau la
baza operaţiilor de căpătâi folosite în cadrul BDF.
Prin intermediul bazelor de date inteligente (BDI) s-a urmărit realizarea unei
gestionări naturale a datelor, adică a unei memorări, accesări şi utilizări fireşti şi facile a
datelor, în scopul satisfacerii depline a cerinţelor informaţionale a utilizatorilor, deci pentru
îmbunătăţirea procesului decizional economic. Se poate afirma, deci, că BDI au apărut ca
rezultat al cercetărilor în vederea ameliorării şi perfecţionării tehnologiei bazelor de date.
Este de reţinut faptul că interesul pentru BDI s-a manifestat, pe lângă domeniul
bazelor de date, ţi în domeniul inteligenţei artificiale, în legătură cu eforturile de realizare a
bazelor de cunoştinţe. Pentru a soluţiona problema gestionării şi utilizării unor volume mari
de cunoştinţe s-a ajuns la soluţia naturală conform căreia se organizează aceste cunoştinţe sub
forma unor baze de cunoştinţe, după modelul organizării detelor în baze de date. Cu toate că
bazele de cunoştinţe prezintă caracteristici structurale şi funcţionale distincte de cele ale
bazelor de date s-a constatat că cercetările din domeniul bazelor de cunoştinţe şi cele din
domeniul bazelor de date inteligente (BDI) se susţin reciproc, fiind posibilă o trecere de la
tehnologia bazelor de date la cea a bazelor de cunoştinţe prin intermediul BDI. Uneori, BDI
sunt considerate drept baze de cunoştinţe într-o formă “primară” sau chiar baze de cunoştinţe
propriu-zise.
Caracteristicile BDI precum şi soluţiile de realizare efectivă variază extrem de mult,
ceea ce creează dificultăţi în însăşi definirea bazelor de date inteligente (BDI), printre puţinele
realizări practice semnificative, se numără bazele de date deductive (BDDe).
BDI trebuie să permită tratarea unor mari cantităţi de date, provenind din diferite
surse, sub diferite forme de reprezentare (texte, imagini, sunet, etc.). Aceasta înseamnă că
BDI cere utilizarea tehnologiilor multimedia, aceasta presupunând disponibilităţi cât mai mari
în domeniul suportului extern de date, forma digitizată a imaginilor şi sunetelor ocupând
foarte mult spaţiu de memorare. Pe lângă aceste disponibilităţi, tehnologiile multimedia
necesită şi dispozitive speciale pentru introducerea/extragerea datelor (cititor optic de
caractere, scanner, plotter, sintetizator de voce, etc.).
Integritate şi coerenţă
Un aspect important al bazelor de date relaţionale este integritatea.
Restricţia de integritate este o asertiune care trebuie să fie verificată de către date la
momente de timp determinate.
Baza de date coerentă este baza de date pentru care mulţimea restricţiilor de
integritate (explicite sau implicite) este respectată de către datele bazei.
149
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Există mai mute tipuri de restricţii de integritate. Pentru a ilustra aceste tipuri diferite
de restricţii vom utiliza baza de date relaţională din figura 1. Această bază de date modelează
sumar un magazin clasic care stochează, vinde si cumpără produse.
Mai întâi, o restricţie de integritate poate viza unicitatea datei. Definirea unui tip
elernentar de dată permite adesea exprimarea unor asemenea restrictii, de exemplu (vezi
figura 1):
• restrictii ale domeniului de variaţie (de exemplu data cantitate cumpărată este un număr
intreg).
• restricţii asupra domeniului de valori (de exemplu data cantitate vândută trebuie să fie
cuprinsă intre 1 şi 1000).
Nr. produs
Data cumpărării
Cantitate cumpărată
151
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
152
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
153
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Tranzacţii
Atunci când unei baze de date i se aplică o prelucrare, în general aceasta trece prin
diferite stări tranzitorii în timpul cărora anumite restricţii de integritate nu mai sunt verificate.
Pentru a izola unităţile de prelucrare care respectă coerenta bazelor de date, se introduce
noţiunea de tranzacţie.
Tranzacţia este unitatea de prelucrare secvenţială, executată in contul unui utilizator
care aplicată unei baze de date coerentă, restituie o bază de date coerentă.
Restricţiile de integritate sunt întotdeauna invarianţi pentru tranzacţii. Un sistem de
baze de date execută in general o mulţime de tranzacţii simultan pentru diverşi utilizatori.
Problemele de concurenţă apar din cauza interferenţelor care pot surveni între aceste tranzacţii
diverse asupra datelor partajate.
Datele sunt deci actualizate prin unităţi de prelucrare care respectă coerenţa bazei de
154
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
date, numite tranzacţii. O tranzacţie este compusă dintr-o unitate de prelucrare mai fină
numită acţiune.
Acţiunea este o comandă invizibilă executată de către sistem, în cadrul unei tranzacţii.
Exemplu: citirea unei date in memorie (READ x →x1), sau scrierea in bază (WRITE
x1→ x) sunt in general acţiuni.
Probleme de concurenţă
Un prim exemplu bine cunoscut de probleme ridicate la execuţia simultană a
tranzacţiilor este pierderea de operaţii. Cazul cel mai tipic este pierderea unei actualizări.
Această problemă rezultă din faptul că o tranzacţie poate, în timpul execuţiei unei acţiuni ai să
citească un obiect într-un tampon care-i aparţine, apoi să modifice acest obiect (sau simplu să-
l rescrie) in timpul unei acţiuni aj (j > i), pornind de la valori citite anterior, in timp ce o
actualizare ak a acestui obiect a fost realizată printr-o altă tranzacţie între acţiunile ai si aj. În
acest caz, actualizarea ak este pierdută. O asemenea situaţie este prezentată in figura 2. O
problemă similară este confuzia de identitate care poate surveni când o tranzacţie conservă o
referinţă la o dată distrusă printr-o altă tranzacţie.
Tranzacţia T1 Tranzacţia T2
a i: Read X→x1
ak: Read X→x2
x2+1→x2
Write x2→X
a j: x1+1→x1
Write x1→X
Timp
Figura 2. Exemplu de pierdere de operaţie
Un al doilea tip de problemă este ridicat de existenta restricţiilor de integritate. Această
problemă, numită inconsistenţă, survine de fiecare dată când o tranzacţie observă sau
modifică greşit o stare tranzitorie a bazei de date, fiind caracterizată de faptul că o restricţie de
integritate nu este verificată. Un prim exemplu de inconsistenţă este prezentat în figura 3. A şi
B sunt două date care trebuie să verifice restricţia A=B. Tranzacţia T2 observă pe A după ce ea
a fost modificată prin T1 si pe B înainte ca ea să fi fost modificată prin T1. Astfel T2 imprimă o
valoare pentru A diferită de cea a lui B. Un al doilea exemplu mai grav deoarece el provoacă
distrugerea bazei de date este prezentat in figura 4. Aici, T actualizează o stare tranzitorie
incoerentă caracterizată prin A=B. Inconsistenţele pot fi produse de asemenea prin tranzacţii
datorită nereproductibilităţii citirilor. Într-adevăr, o tranzacţie poate citi de două ori acceşi
dată şi poate găsi două valori diferite datorită faptului că data a fost modificată printr-o
tranzacţie concurentă între două citiri.
155
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Fig. 5 ilustrează aceeaşi situaţie: T1 imprimă două valori diferite pentru aceeaşi dată A.
T1 A=B T2
Read A→a1
a1+1→a1
Write a1→A
Read A→a2
Print a2
Read B→b2
Print b2
Read B→b1
b1+1→ b1
Write b1→ B
Timp
Figura 3. Exemplu de observare a inconsistenţelor
T1 A=B T2
Read A→ a1
a1+1→ a1
Write a1→ A
Read A→ a2
a2 *2→ a2
Write a2→ A
Read B→ b2
b2 *2→ b2
Write b2→ B
Read B→ b1
b1+1→ b1
Write b1→ B
Timp
Figura 4. Exemplu de introducere de inconsistenţe într-o bază de date
T1 T2
Read A→ a1
Print a1
Read A→ a2
a2+1→ a2
Write a2
Read A→ a1
Print a1
Timp
Figura 5. Nereproductibilitatea citirilor
156
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
157
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
pe mai multe maşini. Când un server primeşte o interogare care necesită accesul la datele de
pe alte servere, generează subquery-uri care să fie executate de celelalte servere şi pune
rezultatele împreună pentru a da un răspuns la interogarea originală.
158
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
distribuită deoarece blocarea se face pe maşina unde este stocată copia care se citeşte. Cu
toate acestea, la scriere, trebuiesc setate blocaje pe toate maşinile unde sunt modificate copii
în cazul schemei complet distribuite, pe când la celelalte două scheme blocajul e necesar
numai la o maşină.
Deadlock distribuit
Un aspect care necesită atenţie sporită când se foloseşte schema cu copie primară sau
cea complet distribuită este detecţia deadlockurilor. În orice SGBD deadlock-urile trebuie
detectate şi rezolvate (renunţând la anumite tranzacţii care au cauzat deadlock- ul). Fiecare
maşină menţine un graf local cu obiectele care aşteaptă (depind) de alte obiecte şi, bineînţeles,
un ciclu în acest graf indică un deadlock. Oricum, un deadlock se poate întâmpla şi dacă nu
există nici un ciclu într-un graf local. Să presupunem, de exemplu, că avem două maşini, A şi
B, amândouă conţinând copii ale obiectelor 01 şi 02 şi că folosim în tranzacţii tehnica "read-
any, write-a1l". Tranzacţia T1, care vrea să citească 01 şi să scrie 02, obţine un blocaj pe
obiectul 01 şi altul pe 02 pe maşina A şi cere un blocaj pe obiectul 02 la maşina B. Între timp,
tranzacţia T2 care vrea să citească 02 şi să scrie 01 obţine o blocare pe obiectul 02 şi una pe
01 la maşina A. După cum se vede în figura de mai jos, tranzacţia T1 aşteaptă după T2 la
maşina B, iar T2 aşteaptă după T1 la maşina A; deci avem un deadlock care nu poate fi
detectat bazându-ne numai pe grafe de aşteptare locale.
T1 T2 T1 T2 T1 T2
Maşina A Maşina B Graf de aşteptare global
Pentru a detecta astfel de deadlock-uri globale trebuie să folosim un algoritm de
detecţie a deadlock-urilor distribuite. Vom descrie trei astfel de algoritmi.
• Primul algoritm este centralizat şi consistă în trimiterea periodică a tuturor grafelor de
aşteptare locale la o maşină care este responsabilă cu detecţia deadlock-utilor globale. La
această maşină, graful de aşteptare global este generat prin combinarea tuturor grafelor de
aşteptare locale. Mulţimea nodurilor este reuniunea nodurilor din grafele locale şi există
câte o muchie de la un nod la altul dacă există o muchie de acest fel într-unul dintre grafele
locale.
• Al doilea algoritm este ierarhic şi grupează maşinile din mediul distribuit într-o ierarhie.
Fiecare nod din ierarhie construieşte un graf de aşteptare pentru descoperirea deadlock-
urilor care implică numai maşinile conţinute în subarborele acestui nod. Astfel, toate
maşinile trimit periodic graful de aşteptare local la maşina responsabilă pentru construirea
grafului de aşteptare global. Acest algoritm se bazează pe observaţia că deadlock-urile se
159
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
întâmplă în mod frecvent între maşinile vecine. Toate deadlock-urile vor fi în final
detectate, doar că unele mai repede decât altele.
• Al treilea algoritm operează astfel: dacă execuţia unei tranzacţii durează mai mult decât o
valoare de time-out, atunci ea este terminată (aborted). Deşi acest algoritm poate cauza
multe restartări care nu sunt neapărat necesare, încărcarea datorată detecţiei deadlock-
urilor este mică şi în baze de date distribuite heterogene în care maşinile nu pot să schimbe
grafe de aşteptare ea este singura opţiune.
O observaţie în ce priveşte detecţia deadlock-urilor distribuite: întârzieri în propagarea
informaţiilor locale poate determina algoritmul de detectare a deadlock-urilor să identifice
deadlock-uri care de fapt nu există (aşa numitele phantom deadlocks) şi să provoace abort-uri
nenecesare.
160
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
161
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
un mesaj commit sau abort la fiecare subordonat până când primim un ack; după ce am
primit un ack, scriem un log de sfârşit de tranzacţie pentru T.
• dacă avem un log prepare pentru tranzacţia T, dar nu avem log de commit sau de abort,
înseamnă că staţia este un subordonat şi coordonatorul îl aflăm din logul prepare. Trebuie,
apoi, să contactăm în mod repetat pe coordonatorul tranzacţiei ca să determinăm starea
tranzacţiei T. După ce coordonatorul răspunde fie cu commit, fie cu abort, o să scriem un
log corespunzător, re-executăm tranzacţia sau refacem datele dinaintea tranzacţiei - în
funcţie de răspunsul dinainte - şi apoi scriem logul de sfârşit de tranzacţie pentru T.
• dacă nu avem în loguri nici prepare, nici commit, nici abort pentru tranzacţia T, în mod
sigur T nu a trecut de prima fază a protocolului 2PC până în momentul în care s-a produs
defecţiunea; deci putem să facem abort şi să refacem datele, iar apoi să scriem un log de
sfârşit de tranzacţie. În cazul acesta nu avem cum să determinăm dacă staţia este
coordonator sau subordonat pentru T. Oricum, dacă staţia aceasta este coordonator, sete
posibil să fi trimis un mesaj prepare înainte de defecţiune şi, dacă este aşa, alte staţii ar fi
putut să voteze yes. Dacă un asemenea subordonat contactează procesul de refacere a
datelor de pe staţia curentă, acum ştim că staţia curentă este un coordonator pentru T şi,
fiindcă nu este nici un log de abort sau commit, răspunsul către subordonat trebuie să fie
“abort T”.
Se poate observa că dacă coordonatorul pentru tranzacţia T eşuează, subordonaţii care
au votat yes nu pot decide ce să facă cu tranzacţia T, commit sau abort, până când
coordonatorul revine on-line - în acest caz se spune că T este blocată. În principiu, staţiile
subordonate active pot comunica între ele şi dacă cel puţin una dintre ele conţine un log de
abort sau commit pentru tranzacţia T, starea lui T devine global cunoscut. Ca să comunice
unul cu celalalt, toţi subordonaţii trebuie să cunoască identitatea celorlalţi subordonaţi la
momentul în care au primit mesajul prepare. Cu toate acestea, protocolul 2PC rămâne
vulnerabil la defecţiunea coordonatorului în timpul procesului de refacere a datelor, deoarece
chiar dacă toţi subordonaţii au votat yes, coordonatorul – care are şi el un vot – ar fi putut
decide să facă abort la tranzacţia T şi această decizie nu poate fi determinată până când
coordonatorul nu revine on-line.
Am discutat mai sus modul în care o staţie reface datele după o defecţiune fatală, dar
ce ar trebui să facă o staţie implicată într-un protocol de commit dacă se pierde legătura cu o
altă staţie cu care comunică? Dacă staţia curentă este coordonator ar trebui sa facă abort la
tranzacţie. Dacă însă, staţia curentă este un subordonat şi încă nu a răspuns la mesajul prepare
al coordonatorului atunci trebuie să facă abort la tranzacţie. Dacă este un subordonat şi a votat
yes, atunci nu poate, în mod unilateral, să facă abort la tranzacţie şi nici nu poate face commit
162
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
- staţia este blocată; ea trebuie să contacteze periodic pe coordonator până când primeşte un
răspuns. Căderile de linii de comunicaţie sunt văzute de staţiile active ca şi defecţiuni ale
staţiilor cu care comunică şi, deci, soluţiile de mai sus se aplică şi în cazul acesta.
Three-Phase Commit
Un protocol de commit numit three-phase commit (3PC) poate evita blocarea chiar
dacă staţia coordonator suferă o defecţiune fatală în timpul refacerii datelor (recovery). Ideea
de bază este că atunci când coordonatorul trimite un mesaj prepare şi primeşte un vot yes de
la toţi subordonaţii, el trimite la toate staţiile un mesaj precommit, nu un mesaj commit. Când
un număr suficient de ack au fost recepţionaţi, coordonatorul scrie un log commit şi trimite un
mesaj commit la toţi subordonaţii. În 3PC coordonatorul amână efectiv decizia de a face
commit până când este sigur că destule staţii ştiu despre decizia de a face commit; dacă
coordonatorul se defectează de mai multe ori, aceste staţii pot comunica una cu cealaltă şi pot
detecta faptul că tranzacţia trebuie "commisa" -sau abort dacă nici una dintre ele n-a primit un
mesaj precommit - fără să mai aştepte până coordonatorul revine on-line.
Protocolul 3PC impune un cost adiţional semnificativ în timpul execuţiei normale şi
cere ca căderile de linii de comunicaţii să nu ducă la o partiţionare a reţelei (atunci când unele
staţii nu se mai pot conecta la altele prin nici o cale) pentru ca să asigure eliberarea de blocaje.
Din acest motiv, nu prea este folosit în practică.
Algoritmi de control al concurenţei bazelor de date distribuite
Integritatea bazelor de date distribuite poate fi afectată cel mai des în cazul unui acces
concurent la date. Dacă cererile de acces la baza de date sunt de tipul „regăsire”, atunci
secvenţializarea accesului la mediul de memorare este suficientă pentru a nu mai fi nevoie de
alte precauţii. Situaţia se schimbă atunci când se fac modificări asupra datelor, şi anume când
mai mulţi utilizatori accesează aceiaşi resursă pentru o „actualizare”. Un exemplu tipic este
sistemul de rezervare a locurilor, unde mai mulţi agenţi fac rezervări simultan şi deci modifică
permanent lista locurilor libere şi lista rezervărilor. În lipsa unui control adecvat al cererilor de
acces există pericolul ca acelaşi loc să fie rezervat de mai multe ori. Acest lucru este posibil
deoarece în intervalul de timp de la acceptarea unei anumite cereri de rezervare pe un loc
anume şi până la rezolvarea acesteia (eliminarea locului cu pricina din lista de locuri libere)
ar putea fi acceptate şi rezolvate alte cereri de rezervare pentru acelaşi loc. Deci două procese
care citesc şi modifică valoarea aceluiaşi obiect ar putea interacţiona în mod nedorit atunci
când sunt executate simultan. Pentru evitarea acestor interacţiuni este necesară impunerea
unor restricţii asupra execuţiei concurente a proceselor care execută operaţii de citire şi de
modificare a datelor.
163
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Desigur, calea cea mai simplă pentru a realiza acest lucru, este şi cea mai ineficientă, deoarece
minimizează eficienţa sistemului. Aceasta este de a executa tranzacţiile în mod independent,
una după cealaltă. Nivelul de concurenţă (numărul de tranzacţii executate concurent), este
unul dintre cei mai importanţi parametrii pentru caracterizarea unui sistem de baze de date, şi
de aceea mecanismele de control al concurenţei urmăresc realizarea unui compromis între
menţinerea consistenţei bazei de date şi obţinerea unui nivel de concurenţă cât mai ridicat.
Anomalii de interferenţă în bazele de date distribuite
Două sau mai multe tranzacţii asupra unei BDD poate conduce la apariţia unor stări
inconsistente ale bazei de date dacă acestea nu sunt controlate, şi la apariţia unor rezultate
inconsistente.
Dacă avem două tranzacţii Ti şi Tj spunem că sunt susceptibile de interferenţă dacă
rezultatul execuţiei concurente a acestora poate fi diferit de rezultatul execuţiei seriale.
Acestea pot apărea atunci când Ti şi Tj efectuează operaţii asupra unor date comune. Spunem
că două tranzacţii Ti şi Tj sunt conflictuale, dacă ele sunt efectuate în mod concurent.
Anomaliile de interferenţă pot fi:
• Anomalii de actualizare pierdute;
• Anomalii de citire improprie;
• Anomalii de citire neproductibilă.
Anomalii de actualizare pierdută
Acest tip de anomalie corespunde unui conflict de tip scriere – scriere. Ea constă în
faptul că rezultatul actualizării efectuate de o tranzacţie se pierde ca urmare a reactualizării
aceleiaşi date de către o altă tranzacţie, fără ca reactualizarea să fie influenţată de rezultatul
primei actualizări.
Exemplu: avem două tranzacţii T1 şi T2 şi următoarea secvenţă de execuţie concurentă:
T1 T2
Citeşte Data;
Citeşte Data;
Data = Data + 25;
Scrie Data;
Data = Data + 10;
Scrie Data;
În urma acestor instrucţiuni variabila Data ar trebui mărită cu 25 + 10 = 35, dar la
final se observă că această variabilă este mărită cu 10.
Anomalii de citire improprie
Acest tip de anomalie corespunde unui conflict de tip citire-scriere şi apare atunci când
o tranzacţie surprinde o stare temporar inconsistentă a bazei de date.
164
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
165
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
planificare se numeşte serializabilă dacă şi numai dacă efectul ei este echivalent cu cel al unei
planificări seriale.
Exemplu:
Dacă avem două tranzacţii T1 şi T2 definite prin secvenţele de operaţii:
T1: READ A; A=A-10;WRITE A; READ B; B=B+10;WRITE B;
T2: READ B; B=B-20;WRITE B; READ C; C=C+20;WRITE C.
Orice planificare serială a tranzacţiilor celor două are proprietatea că suma A+B+C
rămâne nemodificată. În tabelul de mai jos, prezentăm trei planificări diferite ale tranzacţiilor
T1 şi T2 :serială, serializabilă şi neserealizabilă:
167
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
a) Protocolul Write-Locks-All_Read-Lock-One
Acest protocol, este definit prin următoarele reguli impuse tranzacţiilor:
1. Pentru ca o tranzacţie să obţină o blocare pentru citire (RLOCK(x)) asupra unei date
logice x, este suficient să obţină o blocare pentru citire (RLOCK(xi)) asupra unei copii
oarecare xi a lui x.
2. Pentru ca o tranzacţie să obţină blocarea pentru scriere (WLOCK(x)) a unei date logice x,
este necesar să obţină blocarea pentru scriere (WLOCK(xi)) a tuturor copiilor xi a lui x.
Efectul combinat al regulilor de mai sus, împreună cu regulile locale din fiecare nod
este că nu pot exista două tranzacţii care să blocheze simultan aceiaşi dată logică x, dacă cel
puţin una dintre blocări este pentru scriere.
Acest protocol necesită 2n mesaje de control şi n mesaje de date pentru scriere, respectiv 2
mesaje de control şi unul de date pentru citire.
b)Protocolul de blocare majoritară
Este un protocol, care este definit prin următoarele reguli impuse tranzacţiilor:
1. Pentru ca o tranzacţie să obţină o blocare pentru citire (RLOCK(x)) asupra unei date
logice x, este necesar să obţină blocarea pentru citire (RLOCK(xi)) a majorităţii copiilor xi
ale lui x.
2. pentru ca o tranzacţie să obţină blocarea pentru citire (WLOCK(x)) a unei date logice x,
este necesar să obţină blocarea pentru scriere (WLOCK(xi)) a majorităţii copiilor xi ale lui
x.
Protocolul de blocare majoritară asigură excluderea mutuală la nivelul datei logice x,
deoarece nu pot exista două tranzacţii care să blocheze simultan data logică x, dacă una dintre
blocări este pentru scriere.
Acest protocol necesită cel puţin n+1 mesaje de control şi n mesaje de date pentru o
operaţiune de scriere. Pentru citire sunt necesare tot n+1 mesaje de control dar numai un
singur mesaj de date.
c) Protocolul nodului central
Acest protocol este cel mai simplu dintr-o clasă de protocoale a căror caracteristică
comună este aceea că responsabilitatea acceptării sau respingerii unei cereri de blocare pentru
o dată logică x revine unui singur nod al reţelei distribuite, indiferent de numărul copiilor
existente pentru x. Sarcina respingerii sau acceptării unei cereri de blocare revine unui singur
nod din reţea desemnat ca nod central. În sistem există deci un singur look manager care este
plasat în nodul central.
Procedura pentru o operaţie de scriere sau citire a unei date logice x este următoarea:
1. Nodul central primeşte o cerere de blocare (pentru citire sau scriere ) a datei logice x;
168
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
2.
a - Dacă cererea de blocare primită nu poate fi satisfăcută, atunci nodul central trimite un
mesaj de control corespunzător către nodul care a lansat cererea;
b – Dacă cererea de blocare a fost satisfăcută, şi operaţia este de citire, atunci nodul
central trimite un mesaj de control către unul din nodurile în care există o copie a lui x,
mesaj prin care se comandă transferarea valorii lui x către nodul care a lansat cererea.
Dacă operaţia este de scriere, atunci nodul central trimite un mesaj de control către nodul
solicitant prin care celui din urmă i se acordă dreptul de a actualiza toate copiile datei
logice x.
3. Dacă operaţia este de citire, atunci valoarea citită x este transmisă printr-un mesaj de date
la nodul solicitant. Dacă operaţia este de scriere, atunci nodul solicitant transmite câte un
mesaj de date (cu noua valoarea a lui x) către fiecare nod în care există o copie a datei
logice x. De regulă, la acestea se mai adaugă un mesaj de control, de la nodul solicitant
către nodul central, pentru deblocarea datei logice x.
În cazul acestui protocol sunt necesare 2 mesaje de control pentru operaţia de citire şi
3 mesaje de control pentru operaţia de scriere. Dezavantajul este că în cazul unui trafic de
reţea intens, nodul central devine suprasolicitat.
d) Protocolul nodului primar
Acest protocol, este asemănător cu protocolul nodului central cu deosebirea că pentru
fiecare dată logică x se desemnează un nod primar care joacă rolul nodului central pentru data
respectivă. În plus, de regulă, în nodul primar al unei date logice există şi o copie a acesteia.
Deci, în principiu, în fiecare nod al reţelei există un loog manager responsabil pentru
gestionarea cererilor de blocare a unei părţi a datelor logice din sistem. O cerere de blocare a
unei date logice x, va trebui deci adresată nodului primar asociat lui x.
Acest protocol, necesită 2 mesaje de control pentru o operaţie de scriere şi unul singur
pentru citire.
e) Protocolul copiilor primare
Protocolul copiilor primare se bazează pe folosirea unor operatori de citire şi de scriere
care funcţionează ca privilegii pe care le pot obţine nodurile reţelei în contul tranzacţiilor care
solicită accesul la date.
Într-un moment de timp determinat, pentru o dată logică x, poate exista în sistem doar
un singur operator de scriere. Dacă nu există nici un operator de scriere, atunci pot exista
oricâţi operatori de citire pentru x. Dacă un nod deţine un operator de scriere pentru x, atunci
acesta poate accepta o cerere de blocare pentru scrierea lui x din partea unei tranzacţii care se
169
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
execută în acest nod. Un nod care deţine doar un operator de citire pentru x poate accepta o
cerere de blocare pentru citirea lui x, dar nu şi pentru scrierea lui.
Dezavantajul acestui protocol este numărul mare de mesaje. Astfel, pentru o operaţie
de citire sau de scriere sunt necesare 3n mesaje de control.
170
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Microsoft Excel
Microsoft Excel este un pachet de programe destinat tratării datelor în formă tabelară
şi prezentării grafice a informaţiei conţinută în aceste tabele. Pe lângă aceasta, Microsoft
Excel este dotat cu o funcţie pentru tratarea datelor tabelei ca baza de date.
Printr-o bază de date Excel se înţelege o regiune compactă de date care ocupă ca
suprafaţă cel puţin două rânduri (denumite articole) şi două coloane (denumite câmpuri)
adiacente, coloane consecutive şi rânduri ne-consecutive sau rânduri consecutive şi coloane
ne-consecutive. Prima linie dintr-o astfel de regiune poartă numele de antet şi conţine
denumiri de câmpuri.
Dimensiunea maximă a unei baze de date Excel este dată de dimensiunea unei foi de
calcul, fiind egală cu 256 coloane × 65536 rânduri. Numărul maxim de foi de calcul care pot
fi conţinute într-un fişier Excel este de 256.
Microsoft Excel este programul de baze de date cel mai ieftin şi cel mai simplu.
utilizatorul poate alege unul din antetele sau notele de subsol sugerate prin selectare din
listă sau îşi poate defini propriul antet (Custom header...) sau propria notă de subsol
(Custom Footer...):
Antetul va apărea la nivelul marginii de sus a unui document iar nota de subsol la nivelul
marginii de jos.
• Selectarea:
o unei celule: clic stânga pe celulă;
o unei coloane: clic stânga pe eticheta coloanei (idem şi pentru selectarea unui rând, de
această dată clic stânga pe eticheta rândului);
o unui domeniu aleator de celule: clic stânga pe o celulă, simultan activarea tastei CTRL
în combinaţie cu clic stânga celulele dorite a fi selectate.
• Modificarea conţinutului unei celule: F2 sau dublu clic stânga pe celula respectivă.
• Căutarea şi înlocuirea datelor din celule: [Edit - Find] pentru căutarea datelor şi [Edit -
Find - Replace] pentru înlocuirea informaţiilor din celule.
• Copiere [Edit - Copy - Paste], mutarea [Edit - Cut - Paste] sau ştergerea [Edit - Cut] datelor
din celule. Atenţie! Este necesară selectarea prealabilă a datelor.
• Copierea sau mutarea unor date respectând anumite opţiuni: [Edit - Paste Speciale...]. Tipul
informaţiei care se copiază în locaţia aleasă poate fi:
172
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Operaţiunea de Paste Special mai oferă şi opţiunile Skip blanks (celulele vide din
selecţie nu vor înlocui celulele de destinaţie) şi Transpose (liniile din selecţie vor deveni
coloane în zona de destinaţie).
• Formatarea celulelor şi a conţinutului acestora [Format - Cells ...]:
o Formatarea caracterelor în conformitate cu tipul datelor [Format - Cells ... - Number].
Cele mai utilizate tipuri de date în Excel sunt:
Denumire Tip Observaţii
Number numeric aliniate implicit la dreapta
Date calendaristic aliniate implicit la dreapta
Time timp aliniat implicit la dreapta
Text non numeric aliniate implicit la stânga
Scientific 1.0E-01 aliniate implicit la
Pentru datele de tip numeric se poate defini numărul de zecimale afişate prin activarea
categoriei [Number] şi selectarea numărului de zecimale dorit.
o Alinierea datelor din celule: selectarea celulei sau a regiunii de interes, [Format Cells
... - Alignment - Text alignment] şi alegerea din listă a variantei dorite pentru alinierea
orizontală (Text alignment - Horizontal) şi verticală (Text alignment - Vertical).
Tipurile de aliniere orizontală permise sunt:
÷ aliniere implicită pentru toate tipurile de date (General);
÷ aliniere la stânga celulei (Left);
÷ centrarea datelor în celulă (Center);
173
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
174
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
o Utilizarea chenarelor: [Format - Cells ... - Border] şi a culorilor [Format - Cells ... -
Pattern];
o Protejarea datelor dintr-o celulă sau ascunderea de formule: [Format - Cells ... -
Protection] este posibilă doar pentru foile de calcul protejate [Tools - Protection -
Protect Sheet...] sau pentru documentele protejate [Tools - Protection - Protect
Workbook...];
o Orientarea valorilor conţinute în celule poate fi determinată de către utilizator după un
anumit unghi (±90° - orientarea textului pe verticală, 0° - orientarea textului pe
orizontală).
• Formatarea condiţionată [Format - Conditional Formatting...]: permite formatarea diferită
a conţinutului celulei în funcţie de criteriile impuse de utilizator (se pot folosi maxim trei
criterii). Căsuţa de dialog [Conditional Formatting...]:
permite alegerea condiţiei sau a condiţiilor care vor sta la baza formatării celulei sau
celulelor. De exemplu, pentru variabila IMC (indice de masă corporală) avem următoarele
criterii: valorile cuprinse între 20 şi 24.9 corespund valorilor normale, valorile mai mari
sau egale cu 25 şi mai mici sau egale cu 29.9 corespund supraponderalităţii, valorile mai
mari sau egale cu 30 corespund obezităţii:
Ştergerea unei condiţii este posibilă prin activarea butonului Delete şi alegerea condiţiei
pe care dorim să o ştergem.
Formatarea condiţionată se poate folosi şi pentru a ascunde date în momentul imprimării
unui document. În exemplul următor conţinutul celulelor C3:Q4 va fi scris cu font alb
dacă în celula Q1 există valoarea "y". Pentru aceasta, selectăm regiunea de celule C3:Q4
şi în căsuţa de dialog Conditional Formating includem formula:
175
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
şi selectăm culoarea albă pentru fond. Datele astfel formatate se pot vizualiza doar la
selectarea regiunii:
176
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Căutarea unei înregistrări în baza de date după unul sau mai multe criterii este posibilă
prin activarea căutării (clic pe butonul Criteria). Se elimină astfel conţinutul tuturor
câmpurilor din formular, ceea ce permite specificarea criteriilor de căutare în casetele de text
goale. În specificarea criteriilor de căutare se pot folosi următorii operatori: egal cu (=), mai
mare decât (>), mai mare sau egal cu (>=), mai mic decât (<), mai mic sau egal cu (<=),
diferit de (<>), precum şi următoarele caractere de înlocuire: ? (semnul întrebării) şi *
(asterix).
177
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Data (data înscrierii). Atenţie! Pentru a permite legătura dintre baza de date şi formularul
individualizat denumirile câmpurilor trebuie să fie cât mai scurte posibil.
Realizarea formularului individualizat se face parcurgând etapele:
• Deschiderea editorului Visual Basic: deschidem fişierul Excel denumit DocUnivBD.xls şi
[Alt +F11];
• Crearea formularului: [Insert - UserForm] (va apărea un formular gol care implicit va fi
denumit UserForm1). Se activează fereastra proiectului cu ajutorul tastei F4 şi în fereastra
acesta devenind .
• Denumirea noului formular: identificarea în fereastra de proprietăţi a proprietăţii care
determină denumirea acestuia în bara de titlu (Caption) şi prin dublu clic modificăm titlul
în Doctoranzi: .
• Construirea formularului:
o Crearea unei căsuţe text standard pentru primul câmp din formular (Id): [Toolbox -
TextBox] pe care o denumim txtStdId (în bara de proprietăţi);
o Crearea etichetei căsuţa de text pentru câmpul Id: [Toolbox - Label];
o ... (se procedează identic pentru restul câmpurilor din formular);
o Formatarea conţinutului formularului: meniul [Format].
• Adăugarea de butoane care să permită managementul datelor: [Toolbox-
CommandButton]
Vom crea un buton care să permită adăugarea informaţiei din formular în baza de date.
După includerea butonului în baza de date, în fereastra de proprietăţi îi vom da denumirea
de cmdAdd (proprietate (Name)). Pentru a afişa pe butonul nou creat care sunt atribuţiile
178
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
lui vom completa proprietatea Caption cu descrierea butonului (de exemplu Adaugă
înregistrarea).
Urmăm aceiaşi paşi pentru crearea butonului de închidere a formularului (cmdClose.)
• Formatarea butonului Adaugă înregistrare: [View - Code] (Microsoft Visual Basic) după
selectarea prealabilă a butonului. Codul necesar operaţiunii de înregistrare a datelor în
baza de date este:
Private Sub cmdAdd_Click()
Dim iRow As Long
Dim ws As Worksheet
Set ws = Worksheets("DocUniv")
End Sub
Întoarcerea la formular se face prin selectarea opţiunii [Object] din meniul [View]
(Microsoft Visual Basic).
179
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
180
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
End Sub
o Includem în fişier o nouă foaie de calcul DateDoctoranzi şi îi definim un background
alb;
o Activăm bara Drawing [View - Toolbars - Drawing] şi desenăm în centrul foii o
căsuţă de text în care vom scrie Adăugare date Doctoranzi.
o Clic dreapta pe o margine a noului buton şi selectăm opţiunea Assign Macro... . Vom
alege opţiunea ShowDocUnivForm; Validăm operaţia cu OK.
• Ascunderea foii de calcul DocUniv:
o Deschidem baza de date DocUnivBD.xls;
o Selectăm foaia de calcul DocUniv;
o [Format - Sheet - Hide…];
o Salvăm modificările.
Formularul individualizat va arăta ca şi în figura următoare:
181
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
selectăm opţiunea List şi specificăm denumirea listei (în cazul nostru Judeţ). Pentru a
nu permite utilizatorului să introducă alte date decât cele din listă selectaţi opţiunile ca
şi în figura alăturată:
Pentru a avertiza utilizatorul asupra tipului de date care se pot introduce în anumite
câmpuri se poate crea un mesaj de introducere (Input Message):
182
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Operaţiunea de sortare
Primul pas în sortarea conţinutului unei baze de date Excel este selectarea unei celule
din cadrul acesteia. Operaţiunea de sortare se realizează prin alegerea opţiunii [Sort...] din
meniul [Data] (meniul [Data] conţine operaţiile specifice de manipulare a datelor din bazele
de date Excel). Efectul este apariţia căsuţei de dialog [Sort] care permite alegerea câmpului
sau câmpurilor (maxim trei) după care să se realizeze sortarea precum şi alegerea criteriului
de sortare corespunzător fiecărui câmp în parte (Ascending - Ascendent / Descending -
Descendent):
183
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Dacă sortarea se realizează după mai multe câmpuri prioritatea scade de la primul spre ultimul
câmp. Pentru includerea în sortare a mai unor criterii suplimentare se activează opţiunea
[Options...]: Case sensitive permite sortarea strictă în funcţie conţinutul celulelor (cu caractere
mari sau mici, cu primul caracter din cuvânt mare, etc. ale cheii de sortare), Sort top to bottom
realizează o sortare de sus în jos (pentru o bază de date cu rânduri consecutive), iar Sort left to
right realizează o sortare de la stânga la dreapta (pentru o bază de date cu coloane
consecutive).
Operaţiunea de filtrare
Operaţiunea de filtrare a unei baze de date Excel are ca efect afişarea conţinutului care
satisface criteriile de filtrare impuse de utilizator, articolele care nu satisfac criteriile fiind
ascunse (Notă! Articolele care nu satisfac criteriile nu sunt şterse din baza de date). Microsoft
Excel permite două operaţiuni distincte de filtrare în baze de date: auto-filtrarea [Data - Filter
- AutoFilter] şi filtrarea avansată [Data - Filter - Advanced Filter...].
Autofiltrarea
Activarea opţiunii de filtrare automată a datelor se face prin selectarea unei celule din
baza de date pe calea şi [Data - Filter - AutoFilter]. Prin activarea auto-filtrării, în fiecare
celulă din linia de antet se inseră în mod automat un buton de control care transformă
opţiunile din coloană în listă:
Lista afişată va conţine şi valorile Blanks şi NonBlanks dacă în coloana respectivă există
valori vide.
184
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Odată activată opţiunea de auto-filtrare, filtrarea se poate realiza după unul sau mai
multe criterii în funcţie de dorinţa utilizatorului. Dacă filtrăm datele din exemplul anterior
după variabile FUMAT (valoarea TRUE) şi variabila SEX (valoarea F) datele vor arăta în
felul următor:
Prin selectarea iniţială a operatorului dorit în filtrare şi a valorii câmpului respectiv se pot
include maxim două condiţii care să fie îndeplinite simultan (AND) sau nu (OR).
185
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Filtrarea avansată
Activarea opţiunii de filtrare avansată se face pe cale [Data - Filter - Advanced Filter
...]. Este posibilă filtrarea listei în locaţia curentă sau copierea listei filtrate într-o locaţie nouă,
specificată de utilizator şi diferită de cea a bazei de date.
Pentru realizarea unei filtrări avansate a bazei de date:
• În foaia de calcul unde a fost salvată baza de date se inseră după respectarea a cel puţin
unui rând gol criteriile după care se doreşte filtrarea avansată. Criteriile trebuie să aibă
etichete şi trebuie să fie realizate după modelul:
SEX ETNIE MEDIU TIPUL LAPTELUI STCIVILA
M R U Robebi cas
F Tig R Milumil necas
186
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
TIPUL LAPTELUI
Robebi
Milumil
Humana
va afişa toate înregistrările din baza de date care conţin unul din tipurile de lapte
specificate.
o O condiţie în două sau mai multe coloane (criteriile se introduc în acelaşi rând).
Filtrarea cu următoarele criterii:
SEX ETNIE MEDIU TIPUL LAPTELUI STCIVILA
M R U Robebi cas
va afişa înregistrările din baza de date care au valoarea "M" pentru variabila SEX, "R"
pentru variabila ETNIE, "U" pentru variabila MEDIU, "Robebi" pentru variabila
TIPUL LAPTELUI şi "cas" pentru variabila STCIVILA.
o O condiţie într-o coloană sau alta (pentru acesta criteriile se introduc în rânduri
diferite). Filtrarea cu următoarele criterii:
ETNIE MEDIU TIPUL LAPTELUI
R
R
Humana
187
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Se alege opţiunea [Filter the list, in-place] dacă se doreşte filtrarea în baza de date sau
opţiunea [Copy to another location] dacă se doreşte copierea datelor filtrate într-o locaţie
nouă. Se includ referinţele criteriilor impuse de utilizator în căsuţa corespunzătoare
[Criteria range] şi se validează cu OK.
188
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
189
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
190
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Odată activată bara Formula Auditing sunt permise următoarele acţiuni (privind butoanele din
bară de la stânga la dreapta):
• căutarea erorilor. Tipurile de erori posibile sunt:
Afişare Semnificaţie
##### Coloana nu este destul de lată sau
Datele calendaristice negative sau
Date de tip timp negative
#VALUE! Argument greşit sau
Operator greşit
#DIV/0! Împărţire cu zero
#NAME? Formula conţine date non-numerice
#REF! Formula conţine o referinţă de celulă invalidă
• afişarea săgeţilor dinspre celulele la care funcţia din celula selectată face referinţă;
• ascunderea săgeţilor dinspre celulele la care funcţia din celula selectată face referinţă;
• afişarea săgeţilor către celulele la care funcţia din celula selectată face referinţă;
• ascunderea săgeţilor către celulele la care funcţia din celula selectată face referinţă;
• ascunderea tuturor săgeţilor;
• indicarea celulelor care produc eroare într-o celulă deţinătoare de funcţie;
• ataşarea unui comentariu;
• identificarea celulelor cu date invalide;
• păstrarea rezultatelor în cazul unor recalculări şi evaluarea formulei din celula curentă.
191
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
• Specificarea destinaţiei tabelului rezultat (în aceeaşi foaie de calcul - Existing worksheet,
sau într-o foia de calcul nouă - New worksheet) (pasul 3). Implicit Excel va selecta
opţiunea de includere a tabelului pivot într-o foaie de calcul nouă, iar acesta va avea forma
generală din figura alăturată:
192
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
permite reactualizarea legăturii dintre datele din tabelul pivot şi datele din baza de date,
operaţiune utilă ori de câte ori se modifică datele din baza de date.
• Realizarea de calcule derivate din sub-totaluri în tabelul pivot (vom lucra pe un tabel pivot
care pe rânduri va avea variabila "Cine?" şi pe coloane variabile "Numar ore"):
o Includem în tabelul pivot încă o coloană cu variabila "Numar ore";
o Folosind opţiunea „drag-and-drop” mutăm datele de pe rânduri pe coloane. Tabelul
pivot va avea următoarea formă:
193
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
o Activarea opţiunii Field Settings pentru cea de-a doua coloană de date cu sume a
numărului de ore prin clic dreapta de mouse pe eticheta acesteia. În căsuţa de dialog
care se deschide realizăm modificările în conformitate cu figura următoare:
Notă! Activarea meniului Show data as: se face prin clic pe butonul Options >>.
o Tabelul pivot va arăta ca în figura alăturată:
unde formula OFFSET defineşte mărimea bazei de date pe baza numărului de coloane
cu celule nevide şi are următoarele argumente:
194
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
195
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
196
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
• Tabela Programare:
o IdProg - cheie primară
o IdPac
o IdMD
o Data programării
o Ora programării
o Durata
• Tabela Medic:
o IdMD - cheie primară
o Nume
o Prenume
o Cod parafă
o Telefon.
În urma analizei problemei, entităţile stabilite (câmpurile şi asociaţia dintre acestea şi
tabele) trebuie să înglobeze toate aplicaţiile dorite de utilizator. Pentru problema propusă vom
avea următorul tip de relaţie între tabele (pasul 5):
Pacient Programare Medic
Atenţie! Un pacient va avea mai multe programări.
şi denumirea acesteia .
Crearea tabelelor
Microsoft Access oferă trei posibilităţi de creare a unui tabel: definirea design-ului
acestuia (Create table in design view), cu ajutorul vrăjitorului (Create table by using wizard)
şi prin introducerea directă a datelor (Create table by entering data).
Vom exemplifica crearea tabelei Pacient prin folosirea vrăjitorului. Din fereastra
bazei de date vom activa obiectul Tables şi respectiv opţiunea Create table by using wizard:
197
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Pentru crearea restul câmpurilor se vor folosi următoarele câmpuri predefinite ale căror
denumiri se vor schimba în conformitate cu următoarele specificaţii:
Denumire câmp Denumire la
ContactSecondName Nume
ContactFirstName Prenume
StateOrProvince Judeţ
BillingAddress Adresă
PhoneNumber Telefon
EmailAddress E-mail
Salvarea tabelului creat se face după includerea tuturor câmpurilor necesare prin
apăsarea butonului [Next] al căsuţei de dialog [Table Wizard]. Tabelul se va numi Pacient,
iar cheia primară o vom specifica ulterior (la întrebarea Do you want the wizard to set a
primary key for you alegeţi opţiunea No, I’ll set the primary key):
198
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Deoarece dorim ca datele din câmpul IdPac să reprezinte codul numeric personal al
pacientului vom defini tipul de date al câmpului cele introduse de utilizator la adăugarea unei
noi înregistrări (bifăm opţiunea Number I enter when I add new records). Clic pe butonul
[Next] şi în fereastra de dialog care apare alegem opţiunea de modificare a desig-ului
tabelului Pacient:
Tabelul Pacient a fost creat dar mai trebuie inclus în tabel un câmp, data naşterii. Pentru
aceasta vom selecta în fereastra design primul rând gol (clic stânga de mouse pe eticheta
rândului:
199
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Numele câmpului va fi Data naşterii iar tipul de date din acest câmp va fi Date/Time, în
format ll/zz/aaaa (unde l = luna, z = ziua, a = anul):
200
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Pentru fiecare câmp creat există posibilitatea de a specifica textul care descrie câmpul
respectiv, descrierea fiind opţională:
În următoarea căsuţă de dialog putem opta pentru afişarea numărului de telefon cu afişarea
sau nu a simbolurilor incluse în formatare.
Pentru a impune o mască de formatul xxxxxxxxxxxxx câmpului IdPac, vom parcurge
paşii descrişi anterior şi vom alege masca Social Security Number specificând numărul de
caractere la 13.
• Definirea de către utilizator a valorilor dintr-o listă. Pentru câmpul Judeţ vom crea o listă
cu cele 42 de judeţe ale României: Alba, Arad, Argeş, Bacău, Bihor, Bistriţa-Năsăud,
Botoşani, Brăila, Braşov, Bucureşti, Buzău, Călăraş, Caraş-Severin, Cluj, Constanţa,
201
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Covasna, Dâmboviţa, Dolj, Galaţi, Giurgiu, Gorj, Harghita, Hunedoara, Ialomiţa, Iaşi,
Ilfov, Maramureş, Mehedinţi, Mureş, Neamţ, Olt, Prahova, Sălaj, Satu-Mare, Sibiu,
Suceava, Teleorman, Timiş, Tulcea, Vâlcea, Vaslui, Vrancea.
o Vizualizăm tabela Pacient în format design;
o Selectam câmpul căruia dorim să-i creăm lista de valori. În cazul nostru selectăm
câmpul Judeţ;
o Din fereastra de proprietăţi alegem opţiunea Lookup;
o Alegem controler-ul corespunzător listei ascunse (Combo Box);
o La sursa datelor din listă (Row Source Type) vom selecta opţiunea Value List;
o La sursa datelor (Row Source) vom introduce valorile pe care dorim să le conţină lista,
respectiv judeţele specificate mai sus;
o Vom specifica numărul de rânduri pe care dorim să le vizualizăm la activarea listei ca
fiind egal cu 10 (implicit mediul Access permite vizualizarea a 8 rânduri).
Pentru operaţiile specificate anterior, fereastra de proprietăţi a câmpului Judeţ a avea
specificaţiile din figura următoare:
Crearea tabelei Programare o vom exemplifica prin folosirea opţiunii Create table in
Design view, pe care o activăm prin dublu clic. Va apărea o machetă goală a unui tabel în care
definim câmpurile după cum urmează:
202
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Vom defini câmpul IdProg ca şi cheie primară prin selectarea acestuia şi clic pe
pictograma butonului [Primary Key] din bara de butoane ( ) sau selectare şi clic dreapta
cu alegerea din meniul derulant a opţiunii Primary Key.
Notă! Cheia primară a unui tabel poate să conţină mai mult de un câmp. Pentru aceasta
selectăm toate câmpuri pe care dorim să le definim ca şi cheie primară (dacă nu sunt
adiacente folosim pentru selecţie tasta CTRL) şi clic pe pictograma butonului [Primary
Key] din bara de butoane.
• Data: câmp de tip Date/Time. Alegem un format al datei de tipul ll/zz/aaaa (Short Data),
format pe care îl impunem prin setarea lui ca şi mască (Input Mask). Specificăm titlul
câmpului ca fiind DataExaminării şi respectiv obligativitarea completării acestuia
(opţiunea Required, valoarea Yes). Proprietăţile câmpului Data vor fi:
• Ora: câmp de tip Date/Time. Alegem un format al orei de tipul: oo:mm AM/PM (Medium
Time), unde o = ore, m = minutul, AM = înainte de amiază (ora 12) iar PM = după amiază
(după ora 12). Specificăm titlul câmpului da OraExaminării şi respectiv obligativitarea
completării acestuia (opţiunea Required, valoarea Yes). Proprietăţile câmpului Ora vor fi:
203
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
• Durata: câmp de tip Number. Pentru acest câmp vom folosi numere întregi, fără zecimale
deoarece dorim exprimarea acestuia în minute. Titlul câmpului va fi definit ca
DurataExaminarii iar valoarea afişată implicit la 15 minute:
204
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Crearea formularului
Pentru a crea un formular vom selecta din fereastra de obiecte (Objects) opţiunea
[Forms] şi vom crea un formular cu ajutorul vrăjitorului:
205
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
În prima fereastră de dialog [Form Wizard] alegem din listă tabela Pacient şi
includem în formular cu ajutorul butonului toate câmpurile acestei tabele:
Optăm pentru modificarea formularului (Modify the form’s design). Modificăm locul
câmpurilor după dorinţa noastă. Formularul de introducere a datelor pacienţilor poate lua
astfel următoarea formă:
206
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Selector
formular
Acţiune va avea ca rezultat afişarea tabelei Programare cu toate câmpurile pe care aceasta le
conţine:
207
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Prin operaţiunea „drag-and-drop” vom include în formular câmpurile Data şi Ora. Pentru
includerea câmpului Durata (câmp care înregistrează durata programării şi care poate fi 5, 10,
15 sau 20 de minute de exemplu) vom folosi o listă ascunsă (combo box) care să permită
selectarea valorii. Din bara de instrumente vom alege opţiunea Combo Box ( ) şi în
căsuţa de dialog care se deschide vom specifica că dorim să introducem lista de valori:
Următoarea căsuţă de dialog ne permite să selectăm câmpul în care dorim să stocăm datele şi
denumirea listei ascunse:
208
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
folosind câmpurile IdPac, Nume şi Prenume. În căsuţa de dialog care urmează deselectăm
opţiunea Hide key colomn deoarece este câmpul care ne dă unicitatea pacientului (pot exista
mai mulţi pacienţi care au acelaşi nume şi prenume, condiţie în care codul numeric personal
care este stocat în câmpul IdPac ne va spune despre care pacient este vorba):
Similar cu exemplul anterior, vom opta pentru a stoca datele din câmpul IdPac şi vom denumi
lista ascunsă Pacient.
În mod similar creăm şi lista ascunsă pentru câmpul Medic dar de data aceasta câmpul
cheie primară poate să rămână ascuns.
Formularul de introducere a datelor de programare va avea forma:
209
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Vom folosi operatorii mai mare (>) şi respectiv egal (=) pentru a restricţiona includerea unei
date a programării care să fie mai mare sau egală cu data curentă. Introducem ca şi text
asociat regulii de validare „Data programării nu este corectă!”. Căsuţa de text a câmpului Data
va arăta aşa:
210
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
(1) (2)
(3) (4)
(5)
211
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Pentru a finaliza aplicaţia activăm pe calea [Tool - Startup option] căsuţa de dialog
Startup. Selectăm opţiunile ca şi în figura următoare:
212
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Rezultatul obţinut se poate îmbunătăţii prin folosirea unor câmpuri ale tabelei Pacient
şi Medic. Cu clic dreapta pe jumătatea superioară a ferestrei design a interogării
ProgramareQ, selectăm opţiunea Show Table... şi includem tabelele specificate anterior.
Vom include în interogare câmpuri care conţin următoarele date: numele şi prenumele
pacientului, numele medicului examinator şi durata examinării. Optăm pentru ascunderea
câmpurilor chei primare prin deselectarea opţiunii Show. Rezultatul interogării va fi:
213
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Crearea rapoartelor
Rapoartele sunt o formă de prezentare a datelor dintr-un tabel sau dintr-o interogare.
Pentru a crea un raport alegem din lista de obiecte opţiunea Reports. Vom crea un raport pe
baza interogării ProgramareQ folosindu-ne de ajutorul vrăjitorului.
Includem în raport toate câmpurile din interogare şi sortăm datele după data şi ora
programării:
214
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
215
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
216
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
16. Crearea unui grafic pe baza interogării şi câpurilor numerice nr şi poz (count(poz)/grupul
nr);
17. Crearea structurii bazei de date ŞAPIAP;
18. Crearea unei vederi locale (persoanele de contact şi instituţii);
19. Update Criteria şi Send SQL Updates;
20. Crearea vederii după instituţii şi apoi persoane de contact;
21. Stocarea de proceduri (stored procedures) în baza de date; procedura pentru câpuri
autoincrement;
22. Wizard-ul şi crearea de vederi; vedere parametrizată (persoane de contact pentru o
instituţie);
23. Fereastra de comenzi (command window);
24. Zone de lucru (data session);
25. Comenzi;
26. Expresii;
27. Funcţii;
217
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
7. Exerciţii cu matrici
8. Exerciţii cu IF, CASE, SCAN, FOR, DO WHILE;
9. Exemplu cu o procedură într-un program:
Do myproc with "aaa"
PROCEDURE myproc( cString )
? "myproc" + cString
ENDPROC
10. Exemplu cu o funcţie într-un program:
? plus2saptamani(date())
FUNCTION plus2saptamani
PARAMETERS dDate
RETURN dDate + 14
ENDFUNC
11. Exemplu de program cu o procedură cu 3 parametrii
GETEXPR 'Introdu o expresie: ' TO gcTemp
DO procedura WITH DATE(), gcTemp, 10
PROCEDURE procedura( dData, cSir, nOriTipar )
FOR nCnt = 1 to nOriTipar
? DTOC(dData) + " " + cSir + " " + STR(nCnt)
ENDFOR
ENDPROC
12. Report Wizard; raportul persoanelor de contact din baza de date universitati;
13. Report Designer; realizarea unui raport cu totaluri pe categorii;
14. Quick Report; raport dintr-o vedere; varianta 1 şi varianta 2;
15. Labels; etichete simple şi etichete din vedere cu parametru;
16. Generarea unei interogări din program folosind macrosubstituţia;
17. Form Wizard; formular pentru parcurgerea şi modificarea datelor pentru instituţiile
existente şi pentru introducerea datelor pentru o nouă instituţie în baza de date
universitati.dbc; execuţia formularului;
18. Crearea unui raport pentru imprimarea informaţiilor din formular; raportul institutii.frx;
19. Modificarea structurii tabelei institutii.dbf;
20. Modificarea formularului institutii.scx; execuţia formularului; adăugarea unei instituţii;
21. Tipărirea informaţiilor din formular cu ajutorul raportului institutii.frx;
22. One-to-many Form Wizard; Formular pentru parcurgerea şi modificarea datelor simultan
pentru instituţiile şi persoanele de contact din baza de date universitati.dbc;
218
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
219
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
34. Introducerea în baza de date a patru câmpuri noi: IMC (indice de masă corporală), HTA
(definirea statutului de hiper- sau normotensiune arterială), RISC ATEROGEN şi COST
SPITALIZARE;
35. Calcularea datelor pentru câmpul IMC conform formulei: IMC = GREUTATE
(kg)/ÎNĂLŢIME(m2). Validarea formulei de calcul.
36. Copierea formulei de calcul a variabilei IMC pentru restul pacienţilor.
37. Formatarea condiţionată a variabilei IMC cu identificarea persoanelor cu greutate normală
(20 ≤ IMC ≤ 24.9; negru, bold), supraponderale (25≤ IMC ≤ 29.9; albastru, bold)) şi obeze
(IMC ≥ 30; roşu, bold).
38. Calcularea datelor pentru câmpul HTA. Se consideră hipertensiv un pacient care are o
valoare a TAS (tensiune arterială sistolică) mai mare sau egală cu 140 mmHg sau o
valoare a TAD (tensiune arterială diastolică) mai mare sau egală cu 90 mmHg. Validarea
formulei de calcul.
39. Multiplicarea formulei de calcul a HTA pentru restul pacienţilor.
40. Calcularea riscului aterogen (variabilă dihotomială cu valori posibile DA, NU). Se
consideră că un pacient are risc aterogen dacă una din următoarele condiţii este
îndeplinită: supraponderalitate sau obezitate (IMC - indice de masă corporală >=25),
hipertensiune arterială, fumător, consumator de alcool, vârsta >= 55 ani,
hipercolesterolemie (colesterol >=220), valori crescute ale HDL colesterol (>=40).
Validarea formulei de calcul.
41. Multiplicarea formulei de calcul a riscului aterogen pentru întreg eşantionul.
42. Calcularea costului de spitalizare. Costul de spitalizare pentru o persoană cu grad 1 este de
100 RON/zi, a unei persoane de grad 2 de 80 RON/zi iar a unei persoane de grad 3 de
50RON/zi. Validarea formulei.
43. Multiplicarea formulei de calcul a costului de spitalizare pentru întreg eşantionul.
44. Filtrarea avansată a datelor după următorul criteriu:
COST SPITALIZARE COST SPITALIZARE
> 700 < 2000
<= 500
220
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
Scop: Se doreşte realizarea unei baze de date Access care să gestioneze activitarea
unui serviciu ambulator de medicină de urgenţă.
Cerinţe:
• Definiţi câmpurile şi tabelele bazei de date.
• Proiectaţi structura tabelelor.
• Realizaţi legătura dintre tabele.
• Realizaţi un raport care să furnizele pentru un anumit pacient manoperele care s-au
efectuat, materialele folosite, costul fiecărui material în parte şi respective costul total al
inetrvenţiei.
• Realizaţi o interogare care să sumarizeze materialele folosite într-o zi de activitate şi preţul
acestora.
221
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
Scop: Se doreşte realizarea unei aplicaţii care să gestioneze activitatea unei biblioteci
universitare.
Cerinţe:
• Definiţi câmpurile şi tabelele bazei de date.
• Proiectaţi tabelele şi legăturile dintre acestea.
• Alegeţi mediul cel mai bun pentru crearea bazei de date. Argumentaţi alegerea.
• Realizaţi formularele necesare pentru introducerea datelor în baza de date.
• Proiectaţi interogările necesare gestiunii unui astfel de serviciu.
• Proiectaţi rapoartele necesare managementului unui astfel de serviciu.
222
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
223
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
224
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
225
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
• model: • relaţii:
÷ orientat pe obiecte: 146 ÷ schemă relaţională: 8
÷ relaţional: 5, 6, 7, 8, 145, 146 ÷ structurale: 144
÷ reţea: 5 ÷ tabele: 7, 12, 30, 33, 36, 49, 67, 76,
÷ securitate: 118 91, 129, 131, 142, 197, 221-2
÷ taxonomie: 145 ÷ tipuri: 22
÷ tranzacţie: 147 • relaţional:
• ODBC: ÷ model: 5, 7, 8, 145, 146
÷ driver: 45 ÷ organizare: 20
÷ MyODBC: 118 ÷ schemă: 8, 150
÷ protocol: 46 • SQL:
÷ sursă de date: 45, 118 ÷ actualizare (i.e. update): 47, 217
• ordonare, sortare: ÷ buton: 43
÷ ascendentă, descendentă: 32 ÷ extensie: 145
÷ controale: 82 ÷ fraze: 44, 46, 72, 116, 117
÷ Excel: 183 ÷ IBM, dBase: 8
÷ formulare: 73, 76 ÷ interfaţă: 145
÷ interogări: 44 ÷ interogări: 43
÷ rapoarte: 67 ÷ limbaj: 9, 115, 146, 157
÷ strictă: 7 ÷ MySQL: 20, 25, 115, 116, 118, 122
÷ vederi: 223 ÷ server: 46, 122, 125, 126, 127, 128
• PHP: ÷ Ted Codd: 7, 12
÷ limbaj: 26 • vrăjitor (i.e. Wizard):
÷ phpMyAdmin: 115, 116, 117, 118 ÷ aplicaţie (i.e. Application): 112, 134
• relaţii: ÷ bază de date (i.e. Database): 16
÷ apartenenţă: 8 ÷ etichete (i.e. Label): 70
÷ asociere: 148 ÷ formular (i.e. Form): 73, 76, 82, 130,
÷ clase: 145 133, 181, 205
÷ constructor: 146 ÷ grafice (i.e. Graph, Chart): 44
÷ de validare: 18, 42 ÷ interogare (i.e. Query): 43, 212
÷ dependenţe incluziune: 151 ÷ machete (i.e. Template): 48
÷ fragmente: 157 ÷ MVFP: 14
÷ integritatea referenţială: 39, 42, 76, ÷ PHP: 115
81, 85, 205 ÷ rapoarte (i.e. Report): 67, 68, 74,
÷ înrudire: 144, 145 134, 214
÷ MVFP: ÷ tabelă (i.e. Table): 28
÷ 5 nivel logic: 6, 41 ÷ vederi (i.e. View): 49, 217
÷ ordine: 46, 48
226
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
IV. Bibliografie
227
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
228
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
14. Lorentz JÄNTSCHI, Sorana BOLBOACĂ, Organizing Guidelines Models and Clinical
Practice Guidelines, 11th International Symposium for Health Information Management
Research, July 14-16, Proceedings, ISBN 0-7703-9016-1, p. 328-338, Nova Scotia, CA,
2006, Halifax
15. Lorentz JÄNTSCHI, Sorana Daniela BOLBOACĂ, Computer Aided System for Student's
Knowledge Assessment, The 10th World Multi-Conference on Systemics, Cybernetics
and Informatics, July 16-19, Proceedings, ISBN 980-6560-65-5 (Collection) && ISBN
980-6560-65-3 (Volume 1), p. 97-101, Florida, U.S.A, 2006, Orlando
16. Lorentz JÄNTSCHI, Sorana Daniela BOLBOACĂ, Installation and Configuration Issues
about FreeBSD Operating System, A&QT-R 2004 (THETA 14) 2004 IEEE-TTTC -
International Conference on Automation, Quality and Testing, Robotics, May 13-15,
volume "II" (ISBN 973-713-047-2) at p. 251-256, Romania, 2004, Cluj-Napoca
17. Lorentz JÄNTSCHI, Sorana BOLBOACĂ, Auto-calibration Online Evaluation: Database
Design and Implementation, Leonardo Electronic Journal of Practices and Technologies,
AcademicDirect, Internet, Issue 9, 179-192, 2006, ISSN 1583-1078
18. Lorentz JÄNTSCHI, SQL by Example. 1. Application for High School Bachelor
Examination, Leonardo Electronic Journal of Practices and Technologies,
AcademicDirect, Internet, Issue 2, 20-36, 2003, ISSN 1583-1078
19. Mădălina VĂLEANU, Building Biological Databases, Applied Medical Informatics,
Srima, Cluj-Napoca, Nr. 3-4/2002, pag. 67-72, 2002, ISSN 1224-5593
20. Mădălina VĂLEANU, Global Interity Preservation in Medical Distributed Databases,
Applied Medical Informatics, Srima, Cluj-Napoca, Nr. 3-4/2003, pag. 36-45, 2003, ISSN
1224-5593
21. Mădălina VĂLEANU, Integrity Aspects in Database, Applied Medical Informatics,
Srima, Cluj-Napoca, Nr. 3-4/2004, p. 9-15, 2004, ISSN 1224-5593
22. Mădălina VĂLEANU, Integrity in Distributed Databases, Applied Medical Informatics,
Srima, Cluj-Napoca, Nr. 1-2/2003, pag. 3-8, 2003, ISSN 1224-5593
23. Monica ŞTEFU, Mihaela Ligia UNGUREŞAN, Lorentz JÄNTSCHI, Free Software
Development. 2. Chemical Database Management, Leonardo Electronic Journal of
Practices and Technologies, AcademicDirect, Internet, Issue 1, 69-76, 2002, ISSN 1583-
1078
24. Sorana BOLBOACĂ, Horaţiu COLOSI, Tudor DRUGAN, Andrei ACHIMAŞ, Ştefan
ŢIGAN, Elements of Medical Informatics and Biostatistics, SRIMA Publishing House,
Cluj-Napoca, Romania, 211 pages, 2003, ISBN 973-85285-0-X.
229
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
230
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
231
Lorentz JÄNTSCHI, Mădălina Ana VĂLEANU, Sorana Daniela BOLBOACĂ
V. Abstract
232
Programarea rapidă a aplicaţiilor pentru baze de date relaţionale
VI. Contents
I. Preface .........................................................................................................................2
II. About Authors .............................................................................................................3
1. Databases and DBMS..................................................................................................4
2. Backus-Naur Forms...................................................................................................10
3. Relational Databases..................................................................................................11
4. Microsoft Visual FoxPro ...........................................................................................14
5. Creating of a Database...............................................................................................16
6. Normalizing of a Database ........................................................................................19
7. Types of Relations .....................................................................................................22
8. Aspects of Data Storage in Relational Databases......................................................25
9. Working with Project Manager in VFP.....................................................................27
10. Creating of Tables and Indexes .................................................................................28
11. Collecting of Tables into a Database.........................................................................33
12. Data Validating at Append or Modify.......................................................................38
13. Records Handling and Database Referential Integrity ..............................................39
14. Querying of a Database and SQL language...............................................................43
15. Creating of a Local View...........................................................................................46
16. Working with Command Window ............................................................................50
17. Expressions................................................................................................................56
18. Working with VFP Functions - Examples of Using..................................................57
19. Expression Builder ....................................................................................................59
20. Programming .............................................................................................................61
21. Procedures and Functions..........................................................................................66
22. Reports and Labels ....................................................................................................67
23. Macro Substitution ....................................................................................................72
24. Forms .........................................................................................................................73
25. Controls .....................................................................................................................83
26. Controls and Containers in FVP................................................................................87
27. Builders of Controls and Containers .........................................................................92
28. Menus ........................................................................................................................99
29. Creating of Menus for Applications ........................................................................100
30. External Databases and Client-Server Applications................................................114
31. Configuring of a VFP/Win9.x Client running at MyQSL/FreeBSD Server ...........115
32. From Distance Management of MyQSL/FreeBSD with VFP/Win9.x....................122
33. SQL Phrases for Access to a Data Server................................................................125
34. Example Application ...............................................................................................129
35. Documenting of Windows Applications with Microsoft HTML Help ...................135
36. Creating of a New Help File with HTML Help Workshop.....................................136
37. Special Chapters of Databases.................................................................................142
38. Microsoft Office Solution: Excel & Access ............................................................171
39. Proposed Problems ..................................................................................................216
40. Knowledge Test.......................................................................................................223
41. Model of Solution for the Test ................................................................................224
III. Index of Keywords ..................................................................................................225
IV. Bibliography ............................................................................................................227
V. Abstract....................................................................................................................232
VI. Contents ...................................................................................................................233
233
AcademicDirect
ISBN 973-86211-5-1
ISBN13 980-973-86211-5-1
Academic Pres
ISBN 973-86211-5-1
ISBN13 980-973-86211-5-1