Documente Academic
Documente Profesional
Documente Cultură
Baze de Date Access Curs Mocian Ioan
Baze de Date Access Curs Mocian Ioan
Baze de date
- pentru uzul studenţilor -
- 2008 -
Tehnoredactare computerizată: Ioan Mocian
Tiparul executat la Atelierul de multiplicare al Universităţii Petru Maior
Copyright © Ioan Mocian
Cuvânt înainte
O carte despre bazele de date nu e uşor de scris, cel puţin din două motive: sunt
foarte multe astfel de cărţi şi sunt foarte mulţi cunoscători ai domeniului. Pe de
altă parte sunt şi multe persoane care ar dori să se iniţieze în domeniu, dar cărţile
pe care le-au deschis i-au descurajat, datorită nivelului ridicat de prezentare.
Acestora li se adresează această carte, oameni cu pregătire academică într-un
domeniu conex, dar care au nevoie de cunoştinţe pentru a înţelege bazele de date,
fie pentru cultura generală, fie pentru necesităţi profesionale.
3
Exemplele prezentate sunt inspirate din situaţii concrete, reale, care sunt bune
modele pentru propriile aplicaţii. Expresiile SQL vor fi acum testate „pe viu”
putându-se verifica imediat corectitudinea lor şi rezultatele obţinute.
4
Cuprins
5
Etapa 1 – Definirea unei declaraţii de intenţie şi a obiectivelor misiunii .. 40
Compunerea unei declaraţii de intenţie ................................................ 41
Definirea obiectivelor misiunii ............................................................. 42
Întrebări pentru autoevaluare ................................................................ 43
Etapa 2 - Analiza bazei de date curente .................................................... 44
Întrebări pentru autoevaluare ................................................................ 46
Etapa 3 - Crearea structurilor de date ........................................................ 46
Definirea listei finale de tabele ............................................................. 47
Asocierea câmpurilor fiecărui tabel ...................................................... 50
Utilizarea unui câmp ideal pentru rezolvarea anomaliilor .................... 52
Stabilirea cheilor pentru fiecare tabel ................................................... 53
Întrebări pentru autoevaluare ................................................................ 56
Revizuirea structurilor iniţiale de tabel ................................................ 57
Specificaţii de câmp ............................................................................. 58
Anatomia unei specificaţii de câmp .................................................. 60
Întrebări pentru autoevaluare ............................................................... 66
Etapa 4 - Determinarea şi instituirea relaţiilor între tabele ...................... 67
Diagrama relaţiilor unu cu unu ............................................................ 67
Diagrama relaţiilor unu cu mai mulţi ................................................... 70
Diagrama relaţiilor mai mulţi cu mai mulţi ......................................... 73
Relaţii cu autoreferire .......................................................................... 77
Identificarea relaţiilor existente ........................................................... 80
Stabilirea caracteristicilor relaţiilor ..................................................... 87
Definirea unei reguli de ştergere ....................................................... 87
Identificarea tipului de participare a fiecărui tabel ........................... 88
Identificarea gradului de participare a fiecărui tabel ........................ 90
Integritatea la nivel de relaţie .............................................................. 92
Etapa 5 - Determinarea şi definirea regulilor de desfăşurare a activităţii 93
Reguli specifice câmpurilor ................................................................. 93
Reguli specifice relaţiilor ..................................................................... 96
Tabele de validare ................................................................................ 97
Etapa 6 - Determinarea şi definirea vederilor .......................................... 98
Etapa 7 - Revizuirea integrităţii datelor ................................................... 102
Revizuirea şi îmbunătăţirea integrităţii datelor ................................... 103
6
Alcătuirea documentaţiei bazei de date ............................................... 105
Studiu de caz. Proiectarea unei baze de date ............................................ 106
Declaraţia de intenţie ........................................................................... 106
Obiectivele misiunii ............................................................................. 106
Analiza bazei de date curente .............................................................. 106
Crearea structurilor de date ................................................................. 107
Determinarea şi instituirea relaţiilor între tabele ................................. 110
Determinarea şi definirea regulilor de desfăşurare a activităţii ........... 111
Determinarea şi definirea vederilor ..................................................... 115
Verificarea integrităţii datelor ............................................................. 118
Concluzii privind proiectarea bazelor de date relaţionale ................... 118
Capitolul 4. Iniţiere în limbajul SQL ......................................................... 120
Prezentare generală ................................................................................... 120
Operaţiuni simple folosind limbajul SQL ................................................. 122
Regăsirea datelor ............................................................................... 122
Sortarea datelor ................................................................................. 123
Filtrarea datelor ................................................................................. 124
Operatorii clauzei WHERE .................................................. 125
Filtrare avansată ................................................................... 126
Operaţiuni avansate folosind limbajul SQL .............................................. 132
Câmpuri calculate ............................................................................. 132
Funcţii pentru manipularea datelor ................................................... 134
Gruparea datelor ............................................................................... 137
Crearea grupurilor ................................................................ 137
Filtrarea grupurilor ............................................................... 139
Lucrul cu subselecţii ......................................................................... 141
Unirea tabelelor ................................................................................ 147
Crearea unei uniri simple ..................................................... 147
Uniri avansate ...................................................................... 138
Compunerea interogărilor ................................................................. 151
Inserarea, actualizarea şi ştergerea datelor ........................................ 155
Inserarea datelor ................................................................... 155
Actualizarea datelor ............................................................. 157
Ştergerea datelor .................................................................. 159
7
Principii privind actualizarea şi ştergerea datelor ................ 160
Crearea şi manipularea tabelelor ....................................................... 162
Elemente performante ale limbajului SQL ................................................ 164
Concluzii ........................................................................................... 167
Capitolul 5. Utilizarea programului ACCESS .......................................... 168
Prezentare generală ................................................................................... 168
Interfaţa programului Access ..................................................................... 170
Crearea tabelelor ....................................................................................... 172
Relaţii între tabele ............................................................................. 174
Crearea relaţiilor cu Lookup Wizard ................................................ 177
Introducerea datelor în tabele ........................................................... 179
Formulare .................................................................................................. 181
Crearea unui formular ....................................................................... 181
Crearea automată a unui formular ......................................... 182
Crearea manuală a unui formular ......................................... 185
Formulare cu subformulare ............................................................... 189
Interogări ................................................................................................... 195
Crearea interogărilor folosind limbajul SQL .................................... 195
Crearea interogărilor cu aplicaţia Wizard(Design view) .................. 196
Legarea permanentă a două tabele .................................................... 200
Interogări cu parametri ...................................................................... 203
Rapoarte .................................................................................................... 206
Crearea unui raport simplu ................................................................ 206
Crearea unui raport cu Report Wizard .............................................. 208
Particularizarea unui raport ............................................................... 214
Macro-uri ................................................................................................... 217
Crearea macrocomenzilor cu o singură acţiune ................................. 218
Crearea macrocomenzilor cu mai multe acţiuni ................................ 220
Rularea macrocomenzilor .................................................................. 221
Rularea unei macrocomenzi din fereastra Database ............ 222
Rularea unei macrocomenzi dintr-un grup ........................... 222
Utilizarea acţiunii RunMacro ............................................... 222
Macrocomenzi ataşate evenimentelor .................................. 223
Utilizarea macrocomenzilor AutoExec şi AutoKeys ........... 223
8
Metodă rapidă de pornire a aplicaţiilor ............................... 224
Publicarea datelor pe Internet ................................................................... 225
Pagini Web statice ............................................................................ 226
Pagini Web dinamice ........................................................................ 228
Crearea unei pagini dinamice de date cu AutoPage .......... 228
Crearea paginilor dinamice cu Page Wizard ....................... 229
Comunicarea între aplicaţiile pachetului Office ....................................... 231
Exportul şi importul de date ............................................................. 232
Recomandări privind crearea aplicaţiilor Access ..................................... 232
Anexe ............................................................................................................. 235
Anexa A. Administratorul de bază de date .......................................... 235
Anexa B. Sintaxa instrucţiunilor SQL ................................................. 237
Bibliografie ..................................................................................................... 239
9
Pagină goală
10
Baze de date Capitolul 1
Există mai multe definiţii ale bazelor de date, dar cea mai simplă pentru această
fază de studiu este: baza de date este un set de date stocate într-un mod organizat.
Înţelegerea acestei definiţii va fi uşurată de un exemplu. Astfel, cărţile dintr-o
bibliotecă nu sunt puse la întâmplare, ele sunt aşezate pe rafturi, după o anumită
logică, împărţite pe domenii, pentru ca atunci vrem să ajungem la o carte, ea să
poată fi localizată uşor. Prin urmare, este clar că atunci când căutăm o carte în
biblioteca personală, o găsim mai uşor dacă este ordine şi o găsim greu sau deloc
dacă ne ţinem cărţile în dezordine. Această idee o să fie aplicată în proiectarea
bazelor de date, unde este foarte importantă organizarea corectă a informaţiilor.
Termenul de bază de date este folosit de multe ori în mod eronat, confundându-se
cu softul pentru bază de date care este utilizat. În realitate, softul pentru baze de
date este numit sistem de gestiune a bazelor de date (SGBD), iar baza de date este
recipientul care conţine informaţiile, recipient creat şi manipulat prin intermediul
SGBD. Conţinutul acestui recipient se schimbă foarte des, atunci când se lucrează
cu baza de date (adăugări, ştergeri şi modificări de informaţii).
Baza de date este percepută de multe persoane ca fiind un simplu tabel. Acest
lucru nu este greşit, atâta vreme cât la studiul limbajului Excel am descoperit
tabele la care le spuneam şi baze de date. Într-adevăr, acele tabele erau baze de
date foarte simple care aveau nişte comenzi şi funcţii cu care le putem sorta, filtra
şi chiar făceam unele calcule cu ele. Cu aceste baze de date puteam rezolva multe
probleme de gestionare a unor informaţii.
Bazele de date clasice conţin mai multe tabele care sunt legate între ele prin relaţii
care vor fi studiate mai târziu. Există mai multe modele de baze de date clasice:
Model de bază de date ierarhică
Model de bază de date reţea
11
Baze de date Capitolul 1
Model de bază de date relaţională
Primele două modele au numai valoare istorică, se mai folosesc foarte puţin sau
deloc, aşa că nu ne vom opri asupra lor. Modelul relaţional este cel care se
foloseşte astăzi datorită avantajelor pe care îl prezintă şi care va fi studiat în
această carte.
Modelul relaţional clasifică relaţiile ca fiind de tip: unu la unu, unu la mai mulţi şi
mai mulţi la mai mulţi. Aceste relaţii vor fi studiate în detaliu mai târziu. O relaţie
dintre două tabele este stabilită în mod implicit prin intermediul valorilor
echivalente ale unui anumit câmp. În figura 1, tabelele tblStudenti şi
tblSectii sunt corelate prin intermediul câmpului SectiaID; un anumit
student este corelat cu o secţie prin intermediul unui identificator de secţie identic.
Atâta timp cât utilizatorul cunoaşte relaţiile dintre tabelele incluse într-o bază de
date, poate avea acces la date într-un mare număr de moduri. De exemplu, după
cum se vede în figura 1.1, prin intermediul acelei relaţii, putem afla numele secţiei
şi cărei facultăţi aparţine. Dacă tabelul ar conţine mai multe coloane, am avea
acces la toate coloanele, aşa cum vom vedea mai târziu.
12
Baze de date Capitolul 1
tblSectii
SectiaID Denumire Facultate
1 TCM Inginerie
2 IEI Inginerie
3 Informatica Stiinte
4 Istorie Stiinte
tblStudenti
StudentID Nume Prenume SectiaID Telefon
1 Pop Ioan 1 234675
2 Ban Lucia 2 234375
3 Pop Dorin 3 234076
4 Lazar Liviu 2 233777
Regăsirea datelor
Datele stocate într-o bază de date trebuie regăsite rapid ori de câte ori este nevoie
de ele. Datele dintr-o bază de date relaţională se regăsesc prin intermediul unui
limbaj specializat de interogare numit SQL(Structured Query Language). SQL
este limbajul standard folosit pentru crearea, modificarea, întreţinerea şi
interogarea bazelor de date relaţionale. În figura 1.2 este prezentat un exemplu de
interogare SQL pe care o putem utiliza pentru a obţine o listă cu studenţii de la
IEI.
Această instrucţiune s-ar putea traduce astfel: extrage din tabelul tblStudenti
câmpurile Nume, Prenume şi Telefon, înregistrările care au valoarea
câmpului SectiaID egală cu 2, ceea ce corespunde secţiei IEI. Ordonează lista
după câmpul Nume.
13
Baze de date Capitolul 1
Cele trei componente fundamentale ale unei interogări SQL le reprezintă
instrucţiunea SELECT…FROM, clauza WHERE şi clauza ORDER BY. Dar
despre toate acestea vom discuta detaliat în capitolul 4.
14
Baze de date Capitolul 1
Microsoft SQL Server este un SGBDR de tip client-server care acceptă baze de
date foarte mari şi un număr foarte mare de tranzacţii şi rulează numai pe
sistemele de operare Windows. Este soluţia ideală pentru firmele mari, la un preţ
de cost relativ scăzut.
MySQL este un SGBDR din categoria open-source(codul sursă este pus gratuit la
dispoziţia utilizatorilor) fiind unul din liderii pieţei. MySQL este rapid, stabil şi
acceptă baze de date de mari dimensiuni, dar îi lipsesc câteva din caracteristicile
importante ale limbajului SQL. Versiunile viitoare îşi propun includerea acestor
caracteristici. Rulează pe mai multe sisteme de operare şi este gratuit pentru
utilizarea în scopuri personale(care nu aduc un câştig).
PostgreSQL este un SGBDR din categoria open-source, fiind unul din liderii
pieţei. Acceptă baze de date de mari dimensiuni, este recunoscut pentru setul său
bogat de caracteristici.
Deşi este un pas înainte, modelul orientat spre obiect nu întruneşte consensul
tuturor specialiştilor din domeniu. Viitorul va da însă verdictul în această
problemă delicată.
15
Baze de date Capitolul 1
Modelul relaţional obiect a extins modelul bazei de date relaţionale prin
încorporarea a diferite elemente şi caracteristici orientate spre obiect, precum
clase, încapsulare şi moştenire. Ideea era ca aceste extensii să permită unei baze
de date relaţionale să gestioneze şi să manipuleze tipuri de date complexe, precum
secvenţe audio sau video şi desene sau reprezentări grafice.
Cu toate noile orientări prezentate, bazele de date relaţionale pe care le vom studia
nu vor dispare în viitorul apropiat.
16
Baze de date Capitolul 2
În acest capitol vom clarifica termenii folosiţi în teoria şi practica bazelor de date
relaţionale, pentru a evita confuziile făcute de unii membri implicaţi în procesul
de proiectare sau exploatare.
Importanţa terminologiei
Este important să înţelegem termenii prezentaţi în acest capitol înainte de a
începe studiul bazelor de date relaţionale. Proiectarea bazelor de date are
un set de termeni specifici ca, de altfel, orice profesie, meserie sau
disciplină.
17
Baze de date Capitolul 2
Termeni referitori la valoare
Date şi informaţii
Figura 2.2 demonstrează un mod în care datele din exemplul precedent pot
fi prelucrate şi transformate în iformaţii. Datele respective au fost
manipulate încât au ajuns într-o factură pentru un pacient – încât acum au
sens pentru oricine le citeşte.
George Fodor 6582421 12/05/2004
57.50
Spitalul Municipal Tg. Mures Pacient: George Fodor
Str. Clinicilor nr.66 Cod pacient: 6582421
Sectia Cardiologie Data consultaţiei: 12/05/2004
Medic: dr. Hipocrate B.
Consultaţii Analize
General 30.00 Sânge
x
EKG 27.50 Urina
x
Ultrasunete Glicemie
Total plată: 57.50
George Fodor 6582421 12/05/2004
57.50 Total plată:
Fig. 2.2. Exemplu de date transformate în informaţii
57.50
18
Total plată:
57.50
Baze de date Capitolul 2
Este foarte important să înţelem diferenţa dintre date şi informaţii. O bază
de date este proiectată astfel încât să furnizeze informaţii semnificative
pentru orice persoană abilitată din cadrul unei firme sau organizaţii. Aceste
informaţii pot fi puse la dispoziţie numai dacă datele corespunzătore există
în baza de date şi dacă aceasta din urmă este astfel structurată încât să
permită obţinerea informaţiilor respective.
Dacă uitaţi vreodată care este diferenţa dintre date şi informaţii, reţineţi
următoarea axiomă:
Valoare nulă
Principalul dezavantaj al valorilor nule este acela că pot avea efect negativ
asupra calculelor matematice, ştiut fiind că rezultatul unei operaţii
matematice în care este implicată o valoare nulă, este o valoare nulă.
Problema valorilor absente, necunoscute, precum şi faptul că vor fi folosite
19
Baze de date Capitolul 2
sau nu în expresii matematice sau funcţii agregat, vor fi luate în
considerare în decursul procesului de proiectare a bazelor de date
relaţionale.
Tabel
Câmpuri
20
Baze de date Capitolul 2
Subiectul pe care îl reprezintă un tabel dat poate fi un obiect sau un
eveniment. Când subiectul este un obiect, tabelul reprezintă o cantitate
palpabilă, precum o persoană, un produs sau un lucru oarecare. Indiferent
de tipul său, un obiect are caracteristici care pot fi stocate sub formă de
date, care vor putea fi prelucrate ulterior într-un număr mare de moduri.
21
Baze de date Capitolul 2
În loc să introducem greşit într-un alt tabel, numele unei secţii, vom
introduce codul său, asigurând în acest fel integritatea datelor.
Câmp
Un câmp reprezintă cea mai mică structură din baza de date şi reprezintă o
caracteristică a subiectului tabelului căruia îi aparţine. Câmpurile sunt
structurile care stochează efectiv datele, care apoi pot fi regăsite şi
prezentate ca informaţii în aproape orice configuraţie pe care o puteţi
imagina.
Calitatea informaţiilor pe care o veţi obţine din datele pe care le aveţi este
direct proporţională cu timpul dedicat asigurării integrităţii structurale şi de
date a câmpurilor înseşi.
Într-o bază de date slab proiectată sau proiectată inadecvat, veţi întâlni în
mod caracteristic alte trei tipuri de câmpuri, după cum urmează:
Un câmp multiplu (numit şi câmp cu mai multe părţi) care conţine două sau
mai multe elemente distincte în cadrul valorii acestuia.
Un câmp cu valori multiple (numit şi câmp cu mai multe valori) care
conţine mai multe apariţii ale aceluiaşi tip de valoare.
Un câmp calculat, care conţine o valoare de text concatenat sau rezultatul
unei expresii matematice.
În figura 2.6 este prezentat un tabel care conţine câte un câmp din fiecare
tip amintit mai sus.
22
Baze de date Capitolul 2
Valori multiple
Câmp calculat Câmp multiplu
Înregistrare
23
Baze de date Capitolul 2
Vedere
O vedere este un tabel “virtual” compus din câmpuri dintr-unul sau mai
multe tabele ale bazei de date; tabelele care alcătuiesc vederea sunt
cunoscute sub numele de tabele de bază. Modelul relaţional îi atribuie unei
vederi atributul de virtuală deoarece îşi preia datele din tabele de bază, nu-
şi stochează propriile sale date. De fapt, singurele informaţii referitoare la o
vedere care sunt stocate în baza de date se referă la structura vederii
respective. Numeroase programe SGBDR principale lucrează cu vederi,
dar unele (precum Microsoft Access) le denumesc interogări salvate.
Programul SGBDR pe care îl utilizaţi va determina dacă obiectul respectiv
va fi denumit interogare sau vedere.
24
Baze de date Capitolul 2
Studenti
StudentID Nume Prenume Telefon <<alte câmpuri>>
60001 Crişan Ovidiu 0745-328092 …..
60002 Lazăr Denisa 0722-7575823 …..
60003 Mocean Gabriel 0744-7575939 …..
60004 Mocean Olimpiu 0723-6564321 …..
Imprumuturi
StudentID CarteID Data
60001 1001 3/10/2004
60002 1001 3/10/2004
60003 1099 5/10/2004
60004 1099 5/11/2004
Carti
CarteID Denumire Categorie <<alte câmpuri>>
1001 PUC P1 ......
1099 Baze de date P1 ......
1023 Fizica F1 .....
1009 Chimie F1 …..
25
Baze de date Capitolul 2
Vederile se pot utiliza pentru implementarea integrităţii datelor, numite în
acest caz vederi de validare.
Chei
Cheile sunt acele câmpuri speciale care îndeplinesc roluri foarte bine
determinate în cadrul unui tabel, iar tipul cheii defineşte rolul acesteia în
interiorul tabelului. Un tabel poate conţine numeroase tipuri de chei, dar
cele mai importante sunt cheia primară şi cheia externă.
Reţineţi faptul că o cheie primară are valori unice în cadrul unui, aceasta
fiind cea mai importantă proprietate a acesteia. De regulă, cheile primare
vor fi nişte coduri numerice, uneori generate chiar de sistemul de gestiune
a bazei de date, cum ar fi sistemul Access, pe care o să-l studiem în cadrul
acestui curs şi care tipul de dată AutoNumber, special gândit pentru
generarea cheilor primare.
O cheie externă dintr-un tabel este acea cheie care este cheie primară în alt
tabel. Ea nu trebuie să fie unică după cum veţi observa în următorul
exemplu, rolul ei este, în special, de a asigura legătura cu alt tabel. În
figura 2.8 se pot vedea o cheie primară şi o cheie externă.
26
Baze de date Capitolul 2
Impresari
Cheie primară ImpresarID Nume Prenume Telefon
100 Becali Ioan 0745-655482
101 Popescu Gică 0745-658312
Cheie primară 102 Becali Victor 0744-547212
Sportivi
SportivID ImpresarID Nume sportiv Telefon <<alte câmpuri>>
8001 100 Mutu Adrian 0745-657329
8002 101 Neaga Ioan 0744-768432
8003 100 Chivu Cristian 0723-546291
Cheie externă
27
Baze de date Capitolul 2
înregistrarea unei comenzi fără un client asociat. Dacă nu ştiţi cine a emis
comanda, nu o puteţi prelucra şi, evident, nu o puteţi factura, iar asta o să
vă ducă de râpă vânzările trimestriale.
Câmpurile cheie joacă un rol important într-o bază de date relaţională, iar
dumneavoastră trebuie să învăţaţi să le creaţi şi să le utilizaţi.
Index
Index şi cheie reprezintă o altă pereche de termeni folosiţi eronat în mod frecvent
şi pe scară largă în industria bazelor de date. (Mai ţineţi minte deosebirile dintre
date şi informaţii?). Veţi sesiza întotdeauna diferenţa dintre cei doi termeni dacă
reţineţi că, în timp ce cheile sunt structuri logice pe care la identificarea
înregistrărilor dintr-un tabel, indecşii reprezintă structuri fizice utilizate la
optimizarea procesului de prelucrare a datelor.
Prin folosirea indecşilor, sortările şi filtrările unei baze de date se face într-un
timp mult mai scurt.
28
Baze de date Capitolul 2
Relaţii
Între două tabele există o relaţie atunci când înregistrările din primul tabel
pot fi asociate cu înregistrările din al doilea tabel. Relaţia se poate stabili
prin intermediul unui set de chei primare şi chei externe sau cu ajutorul
unui al treilea tabel, numit tabel de legătură (cunoscut şi sub numele de
tabel asociativ).
Studenti
StudID Nume Prenume OrasStudent <<alte câmpuri>>
6001 Pop Remus Reghin ........
6002 Szabo Zoltan Oradea ........
6003 Costea Florian Zalau ........
6004 Timocea Sebastian Brasov ........
6004 Mocean Vasile Fagaras ........
29
Baze de date Capitolul 2
O relaţie este o componentă importantă a unei baze de date relaţionale. O
relaţie permite crearea de vederi din tabele multiple şi este crucială pentru
integritatea datelor, întrucât contribuie la cantităţii de date redundante şi la
eliminarea datelor duplicate. Puteţi caracteriza o relaţie în trei moduri: în
funcţie de tipul relaţiei dintre tabele, de maniera în care fiecare tabel
participă la relaţie şi de gradul de participare al fiecărui tabel.
Două tabele au o relaţie unu cu unu când o singură înregistrare din primul
tabel este corelată cu o singură înregistrare din al doilea tabel şi o singură
înregistrare din al doilea tabel este corelată cu o singură înregistrare din
primul tabel. În figura 2.10 este reprezentată o astfel de relaţie.
Salariu
SalariatID Salar orar Sporuri <<alte câmpuri>>
100 34.50 10% …..
101 23.00 5% …..
102 17.45 20% …..
103 16.00 18% …..
30
Baze de date Capitolul 2
Între două tabele există o relaţie unu cu mai mulţi când o înregistrare din
primul tabel poate fi corelată cu una sau mai multe înregistrări din al doilea
tabel, în timp ce o înregistrare din al doilea tabel poate fi corelată cu o
singură înregistrare din primul tabel. Să studiem un exemplu generic
pentru acest tip de relaţie.
Exemplul din figura 2.11 ilustrează o relaţie de tip unu cu mai mulţi
caracteristică.
Clienti
ClientID Nume Prenume <alte câmp.> Imprumuturi
9001 Pop Dorin ....... ClientID CarteID Data
9002 Ban Ion ....... 9002 5648 ....
9003 Lazăr Ana ....... 9001 690423 ....
9004 Buzan Maria ....... 9004 6563 ....
9005 Beldean Vian ....... 9003 65323 ....
9003 09542 ....
9003 64823 ....
9002 75001 ....
9005 10045 ....
9005 76100 ....
Fig. 2.11. Exemplu de relaţie „unu cu mai mulţi”
31
Baze de date Capitolul 2
O singură înregistrare din tabelul CLIENTI poate fi corelată cu una sau
mai multe înregistrări din tabelul IMPRUMUTURI, dar o înregistrare din
tabelul IMPRUMUTURI este corelată cu o singură înregistrare din tabelul
CLIENTI. După cum probabil aţi dedus, câmpul ClientID este o cheie
externă în tabelul IMPRUMUTURI.
Relaţia unu cu mai mulţi este cea mai obişnuită relaţie care există între
două tabele dintr-o bază de date şi este cea mai uşor de identificat. Relaţia
este extrem de importantă din punct de vedere al integrităţii datelor,
deoarece ea vă ajută să eliminaţi datele duplicate.
Între două tabele există o relaţie de mai mulţi cu mai mulţi când o
înregistrare din primul tabel poate fi corelată cu una sau mai multe
înregistrări din al doilea tabel şi o înregistrare din al doilea tabel poate fi
corelată cu una sau mai multe înregistrări din primul tabel. O relaţie din
această categorie se stabileşte cu ajutorul unui tabel de legătură. Un tabel
de legătură facilitează asocierea înregistrărilor dintr-un tabel cu
înregistrările din celălalt tabel şi asigură lipsa oricăror probleme la
operaţiile de adăugare, ştergere sau modificare a datelor corelate.
Un tabel de legătură se defineşte prin preluarea unor cópii ale cheii primare
din fiecare tabel şi utilizarea lor pentru a forma structura noului tabel. În
realitate, aceste câmpuri îndeplinesc două roluri distincte: împreună
formează cheia primară compozită a tabelului de legătură, iar separat,
fiecare poate fi asimilată unei chei externe.
O relaţie de tip mai mulţi cu mai mulţi care nu este stabilită în mod
corespunzător se numeşte „nerezolvată”. Figura 2.12 prezintă un exemplu
clasic şi clar de relaţie de tip mai mulţi cu mai mulţi nerezolvată. În acest
exemplu, o înregistrare din tabelul STUDENTI poate fi corelată cu mai
multe înregistrări din tabelul CURSURI, în timp ce o singură înregistrare
din tabelul CURSURI poate fi corelată cu mai multe înregistrări din tabelul
STUDENTI.
32
Baze de date Capitolul 2
Studenti
StudID Nume Prenume OrasStudent <<alte câmpuri>>
6001 Pop Remus Reghin ........
6002 Szabo Zoltan Oradea ........
6003 Costea Florian Zalau ........
6004 Timocea Sebastian Brasov ........
6004 Mocean Vasile Fagaras ........
Cursuri
CursID Denumire Credite ProfesorID Sala <<alte câmpuri>>
C001 PUC 5 25461 208 ........
C213 Baze de date 5 25461 208 ........
C032 SIM 4 56821 209 ........
C015 GD 5 12843 207 ........
G001 AutoCAD 4 32584 207 ........
G004 Inventor 5 3212 208 ........
G007 Intellicad 4 25461 208 ........
33
Baze de date Capitolul 2
Studenti
Cursuri
Orar CursID Denumire Credite ProfID
StudID CursID C001 PUC 5 25461
6001 C001 C213 Baze de date 5 25461
6002 C213 C032 SIM 4 56821
6002 C001 C015 GD 5 12843
6001 C213 G001 AutoCAD 4 32584
6002 C015 G004 Inventor 5 3212
6003 C001 G007 Intellicad 4 25461
6003 C213
6001 C015
6003 G001
6001 G001
Tipuri de participare
Când stabiliţi o relaţie între două tabele, fiecare tabel participă la relaţie
într-o manieră particulară. Tipul de participare pe care îl atribuiţi unui
tabel dat determină dacă în respectivul tabel trebuie să existe o înregistrare
înainte de a putea introduce înregistrări în tabelul corelat. Există două
tipuri de participări:
Obligatorie - tabelul trebuie să conţină cel puţin o înregistrare înainte de a
putea introduce înregistrări în tabelul corelat.
Opţională – nu este obligatoriu ca tabelul să conţină vreo înregistrare
înainte de a putea introduce înregistrări în tabelul corelat.
34
Baze de date Capitolul 2
De obicei, pentru majoritatea tabelelor, veţi determina tipul de participare
după ce definiţi regulile de lucru cu baza de date. În majoritatea cazurilor,
tipul de participare este evident, este de bun simţ sau este în concordanţă
cu un anumit set de standarde.
Gradul de participare
Să luă din nou exemplul din figura 2.11, care reprezintă două tabele care se
găsesc într-o relaţie unu cu mai mulţi. Dacă se impune (de către conducere)
35
Baze de date Capitolul 2
ca un cititor (client) să poată împrumuta între 1 şi 4 cărţi, atunci gradul de
participare al tabelului IMPRUMUTURI este 1,4. Dacă doriţi să impuneţi
ca un cititor să poată împrumuta numai o carte, atunci veţi indica gradul de
participare ca fiind 1,1.
Specificaţii de câmp
Integritatea datelor
36
Baze de date Capitolul 2
când baza dumneavoastră de date e folosită pentru tranzacţii comerciale
sau financiare.
38
Baze de date Capitolul 3
Acest capitol va defini paşii prin care trebuie să trecem pentru a proiecta corect o
bază de date relaţională. Cunoştinţele dobândite vă vor permite să puteţi proiecta
singuri o astfel de bază de date.
39
Baze de date Capitolul 3
Fiecare bază de date este creată cu un anumit rost, fie pentru rezolvarea
unei anumite probleme de afaceri, gestiunea unor tranzacţii zilnice,
gestiunea unei magazii, fie pentru a fi utilizată ca parte a unui sistem
informaţional. Destinaţia bazei dumneavoastră de date este identificată şi
definită într-o declaraţie de intenţie. Aceasta contribuie la asigurarea
dezvoltării unei structuri de baze de date adecvate, precum şi identificarea
acelor date care duc la atingerea scopului propus.
Această declaraţie este foarte generală, nu conţine date inutile, este scurtă
şi se vede clar la ce va fi folosită: să furnizeze informaţii despre starea unui
client sau furnizor, atât de importante în activitatea unei firme. Faceţi
analogia dintre o declaraţie de intenţie şi o lumânare cu care traversăm un
tunel întunecos, adică lumânarea nu ne dă amănunte despre cum să
traversăm tunelul dar ne ghidează spre capătul lui.
Rolul bazei de date a firmei SC AZUR SRL constă din a păstra evidenţa
aplicaţiilor pentru utilizarea terenurilor, păstrarea datelor cu privire la
solicitanţi, păstrarea unei înregistrări a tuturor audierilor, a tuturor
deciziilor, a tuturor apelurilor, păstrarea datelor referitoare la angajaţii
departamentului şi întreţinerea datelor în vederea utilizării generale în
cadrul biroului.
Rolul bazei de date a firmei SC AZUR SRL constă din a păstrarea datelor
utilizate de biroul judecătorului de instrucţie pentru luarea de decizii
privind solicitările de utilizare a terenurilor trimise de cetăţenii judeţului X.
41
Baze de date Capitolul 3
Se observă că finalitatea bazei de date a devenit mult mai clară, s-au
eliminat operaţiile şi nu dă impresia că ar fi incompletă.
Cel mai important aspect care trebuie reţinut este acela că declaraţia de
intenţie trebuie să fie logică pentru dumneavoastră (dezvoltatorul bazei de
date) şi beneficiarii bazei de date. Tipul de declaraţii diferă de la un grup
de persoane la altul, iar formularea depinde mult de terminologia specifică
domeniului de activitate. Declaraţia dumneavoastră de intenţie este
completă atunci când conţine o propoziţie care descrie finalitatea concretă
a bazei de date, care este înţeleasă şi aplicată de toate părţile implicate.
42
Baze de date Capitolul 3
Dorim să păstrăm informaţii complete despre studenţi.
Dorim să păstrăm evidenţa tuturor facturilor emise.
Dorim să păstrăm evidenţa tuturor recepţiilor.
Dorim să ne asigurăm că un agent de vânzări nu răspunde de mai mult
de 15 clienţi.
Dorim să păstrăm evidenţa tuturor reparaţiilor maşinilor din dotare.
Dorim să generăm agende cu numerele de telefon ale angajaţilor.
Baze de date moştenite – sunt acele baze de date care au existat şi au fost
folosite mai mulţi ani. Ele sunt alcătuite din diferite tipuri de structuri de
date şi ecrane de interfaţă cu utilizatorul, care se găsesc toate într-un
calculator personal. Randamentul, funcţionalitatea şi eficienţa structurilor
şi ecranelor sunt extrem de dependente de limbajul de programare şi
programele de gestiune a bazelor de date folosit. În general, structurile şi
44
Baze de date Capitolul 3
ecranele sunt nefinisate conform standardelor moderne, deoarece au fost
create atunci când aceste standarde nu existau.
După cum se ştie, nimic nu este niciodată finalizat, aşa că nici lista noastră
de câmpuri, oricât de rafinată ar fi, va fi modificată de multe ori. După ce
aţi finalizat lista de câmpuri, trimiteţi-o utilizatorilor şi personalului de
conducere, pentru o examinare succintă şi posibile modificări. Încurajaţi
opiniile celorlalţi şi luaţi în considerare sugestiile lor de modificare.
46
Baze de date Capitolul 3
Tipul tabelului – tabel de date, tabel de legătură, tabel subset sau
tabel de validare;
Descrierea tabelului – care cuprinde o definire clară a subiectului
reprezentat de tabel şi precizează de ce este important acest
subiect pentru organizaţia care utilizează baza de date. Există
câteva principii de bază care vă ghidează în descrierea tabelului.
Iată câteva linii directoare care vă vor ajuta să alegeţi numele tabelelor:
Creaţi un nume unic, descriptiv, care să fie semnificativ pentru
întreaga organizaţie. Utilizarea numelor unice vă ajută să vă
asiguraţi că fiecare tabel reprezintă clar un subiect diferit şi că
toată lumea va înţelege ce reprezintă tabelul. Alegeţi nume
suficient de descriptive pentru a fi înţelese de la sine. “Întretinere
aparate” este un nume bun şi descriptiv.
Creaţi un nume care identifică cu precizie, clar şi fără
ambiguităţi subiectul tabelului. Numele vagi sau ambigue indică
de obicei faptul că tabelul reprezintă mai mult de un subiect, ceea
ce nu este de dorit. Când întâlniţi astfel de nume, identificaţi
subiectele reprezentate cu adevărat de tabel, apoi trataţi fiecare
subiect ca tabel separat. “Date” este un exemplu de nume de tabel
ambiguu, care poate însemna orice fel de date, referitoare la
facturi, persoane, aparate, parametri tehnologici etc.
Utilizaţi numărul minim de cuvinte necesar comunicării
subiectului tabelului. Orice persoană din organizaţie trebuie să
poată înţelege ce reprezintă un tabel, fără a citi descrierea
acestuia. Cu toate că obiectivul dumneavoastră este de a crea un
nume cât mai scurt, nu este indicat să folosiţi un nume ca de
exemplu “TD_1”, care este exagerat de scurt şi generează
neclaritate.
Nu folosiţi cuvinte care comunică anumite caracteristici fizice. În
numele tabelelor evitaţi folosirea unor cuvinte ca “fisier”, “tabel”,
“câmp”, deoarece ele ar putea introduce un grad de confuzie de
care nu aveţi nevoie.
47
Baze de date Capitolul 3
Nu folosiţi acronime şi abrevieri. Acronimele sunt greu de
descifrat, abrevierile rareori reuşesc să comunice subiectul unui
tabel, iar împreună încalcă primul principiu prezentat.
Folosiţi forma de plural a numelui. După cum ştiţi, un tabel
reprezintă un singur subiect, care poate fi un obiect sau
eveniment. Puteţi extinde această definiţie spunând că un tabel
reprezintă o colecţie de obiecte sau evenimente similare. Prin
urmare, puteţi da nume de tabel de forma “Calculatoare” sau
“Consultatii”.
Evitaţi folosirea diacriticelor în numele de tabele. Diacriticele ş,
ţ, ă, î, â pot influenţa negativ dezvoltarea aplicaţiilor de bază de
date, deoarece unele funcţii ar putea să nu înţeleagă aceste
caractere speciale, caracteristice numai limbii române.
48
Baze de date Capitolul 3
Orar Student – orarul unui student.
49
Baze de date Capitolul 3
respectivului tabel. Repetaţi această procedură pentru toate tabelele din
lista finală de tabele. Se poate întâmpla ca un câmp sau un set de câmpuri
să fie cerut de mai multe tabele, aceasta este un lucru acceptat.
50
Baze de date Capitolul 3
singură dată în toată baza de date; singura excepţie de la această
regulă apare în cazul în care câmpul serveşte la stabilirea unei
relaţii între două tabele. Asiguraţi-vă că numele este suficient de
descriptiv pentru a comunica exact înţelesul câmpului pentru
oricine îl vede.
Creaţi un nume care să identifice cu precizie, clar şi fără
ambiguităţi caracteristica reprezentată de câmp. “Număr de
telefon” este un exemplu clasic de nume de câmp ambiguu pentru
că nu ştim la ce telefon se referă, la cel de acasă, de la birou sau
la telefonul mobil. Învăţaţi să fiţi exact. Acest nume de câmp ar
putea să fie foarte exact dacă ar avea numele “Numar telefon
acasa” sau “Numar telefon birou”.
Utilizaţi numărul minim de cuvinte necesar comunicării
înţelesului caracteristicii reprezentate de câmp. Este bine să
evitaţi numele de câmpuri lungi, dar în acelaşi timp ar fi bine să
evitaţi utilizarea unui singur cuvânt ca nume de câmp, dacă acel
cuvânt este necorespunzător. De exemplu “Angajare” este prea
scurt pentru un nume de câmp, iar “Data la care a fost angajata
persoana” este mult prea lung! Însă “Data angajarii” este un nume
de câmp foarte bun.
Nu folosiţi acronime, iar abrevierile trebuie utilizate judicios.
Acronimele pot fi greu de descifrat şi deseori duc la neînţelegeri.
Imaginaţi-vă un câmp „CAD-UPM”. Ce aţi înţelege din această
denumire? Abrevierile se pot folosi doar dacă îmbunătăţesc
numele câmpului, o abreviere nu trebuie să facă ambiguu un
nume de câmp.
Utilizaţi forma de singular a numelor. Un câmp cu nume de
plural, cum ar fi “Functii”, implică faptul că acel câmp ar putea
conţine două sau mai multe valori pentru o înregistrare dată, ceea
ce nu e de loc o idee bună. Un nume de câmp este la singular
deoarece el reprezintă o singură caracteristică a subiectului
tabelului căruia îi aparţine.
Mai departe se vor prezenta elementele unui câmp ideal pentru a ne ajuta
să rezolvăm anomaliile legate de câmpuri.
51
Baze de date Capitolul 3
Utilizarea unui câmp ideal pentru rezolvarea anomaliilor
52
Baze de date Capitolul 3
utilizatorului sau programului aplicaţiei de bază de date să
actualizeze aceste câmpuri. Din această cauză trebuie să vă
ocupaţi separat de câmpurile calculate, în cadrul rapoartelor.
Este unic în interiorul structurii întregii baze de date. Singurele
câmpuri duplicate care apar într-o bază de date corect proiectată
sunt cele care stabilesc relaţiile dintre tabele.
53
Baze de date Capitolul 3
Într-un paragraf anterior (Cap 1/Chei), am văzut că fiecare tabel trebuie să
aibă o cheie, altfel nu putem spune că acesta este corect definit. De
asemenea, ştim că rolul de cheie poate fi îndeplinit de un anume câmp al
tabelului sau o combinaţie de câmpuri. Am spus un anume câmp, deoarece
nu orice câmp poate fi cheie într-un tabel, acesta trebuie să îndeplinească
anumite condiţii.
54
Baze de date Capitolul 3
câmp artificial care nu are nici o legătură cu tabelul, putem să-i impunem
foarte uşor condiţiile pentru a fi cheie primară.
55
Baze de date Capitolul 3
Din practică pot spune (nu numai eu) că pentru a avea cât mai puţine
probleme cu cheile primare, este înţelept să introducem de la început o
cheie candidată artificială, imediat ce avem dubii că un anumit câmp vizat
ar putea încălca regulile. Pentru aceasta mulţi proiectanţi de baze de date
aleg pentru cheia primară un câmp introdus artificial care are un nume
compus din literele “ID” şi numele tabelului.
Iată câteva sugestii pentru alegerea cheii primare artificiale (figura 3.4):
56
Baze de date Capitolul 3
11. Care sunt elementele unei chei primare?
12. Ce este o cheie externă? Daţi exemple.
Acum avem deja tabelele şi înainte de a merge mai departe vom arunca o
privire peste ce am lucrat până acum. Primul lucru de care trebuie să avem
grijă este integritatea la nivel de tabel. Acest tip de integritate este o
componentă majoră a integrităţii generale a datelor.
57
Baze de date Capitolul 3
obicei multe discuţii, care vor duce în final la armonizarea
acestora.
Verificaţi dacă la fiecare tabel au fost atribuite toate câmpurile
corespunzătoare. Acum aveţi cea mai bună oportunitate de a vă
asigura că toate caracteristicile necesare, referitoare la subiectul
unui tabel se găsesc la locul lor. Nu este neobişnuit să descoperiţi
că aţi uitat una sau două caracteristici. Dacă s-a întâmplat,
identificaţi respectivele caracteristici şi transformaţi-le în câmpuri
adăugate tabelului.
Specificaţii de câmp
58
Baze de date Capitolul 3
Definirea specificaţiilor de câmp pentru fiecare îmbunătăţeşte
integritatea generală a datelor. Nu uitaţi că integritatea la nivel
de câmp este una din cele patru componente ale integrităţii
generale a datelor.
Definirea specificaţiilor de câmp vă obligă să ajungeţi la o
înţelegere totală a naturii şi scopului datelor din baza de date.
Înţelegerea datelor înseamnă că puteţi hotărî dacă anumite date
sunt cu adevărat necesare şi importante pentru organizaţie şi
puteţi învăţa cum să le utilizaţi în avantajul dumneavoastră.
Specificaţiile de câmp constituie „dicţionarul de date” al bazei
de date. Fiecare specificaţie de câmp stochează date despre
caracteristicile unui câmp dintr-o bază de date. Acest dicţionar de
date este util, în special la implementarea bazei de date într-un
program SGBDR – îl puteţi folosi drept ghid pentru crearea
câmpurilor şi stabilirea proprietăţilor fundamentale. De
asemenea, aceste specificaţii vă ajută să stabiliţi ce tip de
proceduri de introducere şi validare a datelor trebuie să
implementaţi în orice tip de aplicaţie de interfaţă cu utilizatorul
pe care o creaţi pentru baza de date.
59
Baze de date Capitolul 3
Anatomia unei specificaţii de câmp
60
Baze de date Capitolul 3
Specificaţii de câmp
Elemente generale
Nume câmp: StatComer Tip specificaţie: □ Unică □ Generică □ Copie
Tabel părinte: Comercianti
Specificaţie sursă: Stat
Eticheta: Stat
Partajat de:
Alias(-uri):
Descriere: Statul in care se afla cartierul general al producatorului.Aceasta informatie este o
componenta a adresei postale generale a producatorului.
Elemente fizice
Tip de date:Alfanumeric Suport caractere:
Lungime : 2 □ Litere(A-Z) □ De pe tastatura (., /, $, #, %)
Numar de cifre zecimale: □ Cifre (0-9) □ Speciale (©, ®, ™, ∞)
Masca de introducere: AA
Format de afisare: Ambele litere trebuie sa fie majuscule.
Elemente logice
61 Specificaţie câmp
Fig. 3.5. Formular
Baze de date Capitolul 3
Elementele generale reprezintă atributele fundamentale ale câmpului. Ele
oferă informaţii despre scopul câmpului, numele tabelului în care apare
câmpul etc. În tabelul 3.1 sunt prezentate aceste elemente generale.
62
Baze de date Capitolul 3
un câmp generic sau pentru un câmp care joacă rol de cheie
externă într-o relaţie între tabele şi ea preia majoritatea
parametrilor de element dintr-o specificaţie existentă. Puteţi in-
clude elementele care nu sunt încorporate în specificaţia sursă
şi puteţi altera orice parametri de element preluaţi din
specificaţia sursă.
Specificaţie sursă Acest element este precizat doar într-o specificaţie copie şi indică
numele specificaţiei unui anumit câmp pe care se bazează
specificaţia curentă.
63
Baze de date Capitolul 3
introducere calen-daristică în câmp. Există mai multe moduri de introducere a
unei date calendaristice, cum ar fi „01/03/05”, „01-03-05” şi „01-
mar-2005”. Utilizarea unei măşti de introducere vă ajută să vă
asiguraţi că un utilizator va introduce valorile în câmp în mod
unitar. Iată un exemplu de introducere a unei măşti: „zz/ll/aa”,
pentru o dată de forma „01/03/05”.
Format de afişare Acest element gestionează aspectul valorii câmpului atunci când
este afişată pe ecran sau este tipărită într-un raport. Un format de
afişare vă permite să afişaţi valorile într-un mod mai firesc, mai
lizibil, ca de exemplu „18/04/05” ar putea fi afişat „18 aprilie
2005” care este mult mai uşor de citit şi înţeles.
Suport de Acest element indică tipul de caractere pe care un utilizator le
caractere poate introduce într-o valoare de câmp dată. Stabilirea şi
impunerea acestui element vă ajută să vă asiguraţi că utilizatorul
nu poate introduce în câmp date lipsite de sens, iar prin acest lucru
îmbunătăţiţi integritatea la nivel de câmp. Puteţi opta pentru
includerea sau excluderea oricăruia dintre următoarele tipuri de
caractere:
Litere – toate literele alfabetului inclusiv cele speciale ş, ţ, ă, î.
Cifre – de la 0 la 9.
Caractere de pe tastatură - &, ^, =, virgula, !, (, ), %, $ etc.
Caractere speciale – orice caracter pe care îl puteţi produce
prin combinaţii specifice de taste standard şi tastele Ctrl, Alt şi
Shift.
64
Baze de date Capitolul 3
diţi-vă ce urmări ar avea necompletarea acelui câmp (valoare
nulă). Utilizaţi judicios valorile nule şi nu folosiţi spaţii goale.
Valori introduse de Acest element indică sursa valorilor câmpului. Această sursă poate
fi un operator, fie programul de aplicaţie al bazei de date care îl
completează automat.
Valoare obligatorie Acest element precizează dacă utilizatorul este obligat să
introducă o valoare pentru câmpul respectiv.
Valoare Aceasta este valoare pe care utilizatorul o poate introduce într-un
prestabilită câmp atunci când nu este disponibilă o valoare mai bună şi când
nu sunt permise valorile nule.
Interval de valori Acest element precizează toate posibilele valori valide pentru un
câmp. Acest lucru se poate face prin mai multe căi, ca de exemplu
cu un interval (1-999) sau cu ajutorul unei liste (CJ, MS, BN, AB).
Reguli de editare Acest element precizează în ce moment utilizatorul poate introdu-
ce o valoare într-un câmp şi dacă poate modifica respectiva
valoare. Momentul de referinţă este momentul când se creează o
nouă înregistrare.
Comparaţii Acest element indică tipurile de comparaţii pe care utilizatorul le
permise poate aplica asupra unei valori de câmp date, atunci când preia
informaţie din câmp. Există 6 tipuri de comparaţii, =, diferit de, >,
<, >=, <=, aşa cum se poate observa din formular. De asemenea,
se indică dacă un utilizator poate compara o valoare de câmp dată
cu una din următoarele:
Altă valoare din acelaşi câmp.
Valoarea unui alt câmp din tabelul părinte sau dintr-un alt tabel
al bazei de date.
O valoare de expresie, care este o operaţie oarecare în care este
inclusă valoarea câmpului.
Controlul asupra tipului de comparaţii îl împiedică pe utilizator să
facă anumite comparaţii lipsite de sens.
Operaţii permise Acest element precizează tipurile de operaţii pe care utilizatorul le
poate efectua cu valorile unui câmp. Există 5 tipuri de operaţii:
adunare, scădere, înmulţire, împărţire şi concatenare. De
asemenea, acest element indică dacă o operaţie poate include
vreuna din următoarele:
Altă valoare din acelaşi câmp.
Valoarea unui alt câmp din tabelul părinte sau dintr-un alt tabel
al bazei de date.
Rezultatul unei expresii în care este implicată valoarea
câmpului.
Controlul asupra tipului de operaţii previne efectuarea unor
operaţii fără sens, limitând tipurile de operaţii care se pot face cu
valorile unui câmp.
65
Baze de date Capitolul 3
astfel economisit este iluzoriu, deoarece pierderile cu repararea mai târziu a
bazei de date va fi înzecit. Acordaţi acestei faze importanţa cuvenită, altfel
tot efortul dumneavoastră de până acum va fi zadarnic.
66
Baze de date Capitolul 3
Etapa 4 - Determinarea şi instituirea relaţiilor între
tabele
Suntem în faza în care avem tabelele definitivate, completate cu câmpurile
lor bine definite şi cu cheile lor primare. Sarcina noastră următoare este de
a stabili relaţiile existente între aceste tabele. Ne reamintim că între două
tabele poate exista NUMAI o relaţie. De asemenea, un tabel poate avea
relaţii cu mai multe tabele, aşa cum să vedem în studiile de caz viitoare.
Două tabele au o relaţie unu cu unu când o singură înregistrare din primul
tabel este corelată cu o singură înregistrare din al doilea tabel şi o singură
înregistrare din al doilea tabel este corelată cu o singură înregistrare din
primul tabel. Figura 3.6 prezintă un exemplu generic de relaţie „unu cu
unu”.
Tabel A Tabel B
Retributii
SalariatID Salar orar Sporuri <<alte câmpuri>>
100 34.50 10% …..
101 23.00 5% …..
102 17.45 20% …..
103 16.00 18% …..
Deşi câmpurile din aceste tabele pot fi combinate într-un singur tabel,
proiectantul bazei de date a ales să plaseze în tabelul ANGAJATI
câmpurile ce pot fi văzute de orice membru al organizaţiei şi în tabelul
RETRIBUTII câmpurile ce pot fi văzute doar de personalul autorizat.
Pentru stocarea datelor privitoare la retribuţia unui angajat dat este
necesară doar o singură înregistrare, deci între o înregistrare din tabelul
ANGAJATI şi una din tabelul RETRIBUTII există o relaţie distinctă „unu
cu unu”.
68
Baze de date Capitolul 3
Această linie arată că o înregistrare din Această linie arată că o înregistrare din
TABELUL B este corelată cu o singură TABELUL A este corelată cu o singură
înregistrare din TABELUL A înregistrare din TABELUL B
Tabel A Tabel B
Angajati Retributii
Nume tabel 69
Baze de date Capitolul 3
Observaţi că cele două tabele sunt simbolizate diferit, un dreptunghi şi un
dreptunghi cu colţurile rotunjite, primul fiind considerat tabel de date iar al
doilea este considerat tabel subset.
Între două tabele există o relaţie “unu cu mai mulţi” când o înregistrare din
primul tabel poate fi corelată cu una sau mai multe înregistrări din al doilea
tabel, în timp ce o înregistrare din al doilea tabel poate fi corelată cu o
singură înregistrare din primul tabel. Să studiem un exemplu generic
pentru acest tip de relaţie.
Tabel A Tabel B
Tabel A Tabel B
70
Baze de date Capitolul 3
Relaţia “unu cu mai mulţi” este cea mai obişnuită relaţie care există între
două tabele dintr-o bază de date şi este cea mai uşor de identificat. Relaţia
este extrem de importantă din punct de vedere al integrităţii datelor,
deoarece ea vă ajută să eliminaţi datele duplicate. Figura 3.11 prezintă un
exemplu obişnuit de relaţie “unu cu mai mulţi” pe care o puteţi întâlni la o
secţie de împrumut a unei biblioteci.
Imprumuturi
Clienti ClientID CarteID Data
ClientID Nume Prenume <<alte câmp.>> 9002 5648 ....
9001 Pop Dorin ....... 9001 690423 ....
9002 Ban Ion ....... 9004 6563 ....
9003 Lazăr Ana ....... 9003 65323 ....
9004 Buzan Maria ....... 9003 09542 ....
9005 Beldean Vian ....... 9003 64823 ....
9002 75001 ....
9005 10045 ....
9005 76100 ....
71
Baze de date Capitolul 3
Tabel A Tabel B
Nume tabel
Nume tabel
Nume
tabel(A) 72
Între două tabele există o relaţie de “mai mulţi cu mai mulţi” când o
înregistrare din primul tabel poate fi corelată cu una sau mai multe
înregistrări din al doilea tabel şi o înregistrare din al doilea tabel poate fi
corelată cu una sau mai multe înregistrări din primul tabel.
Tabel A Tabel B
Tabel A Tabel B
Tabel A Tabel B
Tabel A Tabel B
Fig. 3.14. O relaţie „mai mulţi cu mai mulţi” din perspectiva ambelor tabele
Tabel A Tabel B
Tabel A
Acest tip de relaţie este al doilea ca frecvenţă de apariţie
Tabel B între două tabele
dintr-o bază de date. Ea este ceva mai dificil de identificat decât o relaţie
„unu cu mai mulţi”, deci trebuie să vă asiguraţi că aţi examinat tabelele cu
atenţie.
Tabel A Tabel B
Figura 3.15 prezintă un exemplu tipic de relaţie
Tabel A “maiB mulţi cu mai mulţi”
Tabel
pe care o puteţi întâlni în baza de date a unei instituţii de învăţământ,
respectiv tabelul cu studenţii şi tabelul cu toate cursurile care se ţin în acea
universitate.
Tabel A Tabel B
Tabel A Tabel B
73
Tabel A Tabel B
Baze de date Capitolul 3
Studenti
StudentID Nume Prenume OrasStudent <<alte câmpuri>>
6001 Pop Remus Reghin .....
6002 Szabo Zoltan Oradea .....
6003 Costea Florian Zalau .....
6004 Timocea Sebastian Brasov .....
6005 Mocean Vasile Fagaras .....
Cursuri
CursID Denumire Credite ProfesorID Sala <<alte câmpuri>>
C001 PUC 5 2001 208 .....
C213 Baze de date 5 2001 208 .....
C032 SIM 4 2045 208 .....
C015 GD 5 2014 207 .....
G001 AutoCAD 4 2009 207 .....
G004 Inventor 5 2006 209 .....
G007 IntelliCAD 5 2032 209 .....
74
Baze de date Capitolul 3
Tabel A Tabel B
Studenti Cursuri
Studenti
StudID Nume Prenume OrasStudent <<alte câmpuri>>
6001 Pop Remus Reghin .....
6002 Szabo Zoltan Oradea .....
6003 Costea Florian Zalau .....
6004 Timocea Sebastian Brasov .....
6005 Mocean Vasile Fagaras .....
Orar(tabel de legătură)
StudID CursID
6001 C001 Cursuri
6002 C213 CursID Denumire Credite ProfID
6002 C032 C001 PUC 5 2001
6001 C213 C213 SIM 5 2001
6002 C015 C032 Baze de date 4 2045
6003 C001 C015 GD 5 2014
6004 C213 G001 AutoCAD 4 2009
6001 C015 G004 Inventor 5 2006
6003 G001 G007 IntelliCAD 5 2032
6001 G004
6005 G007
76
Baze de date Capitolul 3
Se observă că tabelul de legătură are mai multe înregistrări decât oricare
din tabelele pe care le leagă. De asemenea, între fiecare din cele două
tabele şi tabelul de legătură există o relaţie de tip unu cu mai mulţi. Prin
urmare, o relaţie de tip mai mulţi cu mai mulţi s-a transformat în două
relaţii unu cu mai mulţi, aşa cum se poate vedea în figura 3.19.
Relaţii cu autoreferire
Acest tip particular de relaţie nu există între două tabele, motiv pentru care
nu a fost amintit la tipuri de relaţii. Acest tip de relaţie există însă
înregistrările dintr-un tabel. Pe parcursul procesului de proiectare o vom
considera, totuşi, ca fiind o relaţie între tabele.
Relaţia „unu cu unu” există când o înregistrare dată dintr-un tabel poate
fi corelată cu o singură înregistrare din acelaşi tabel. Tabelul MEMBRII
din figura 3.20 este un exemplu de tabel care are acest tip de relaţie. Astfel,
un membru dat poate sponsoriza un singur alt membru din organizaţie;
câmpul SponsorID stochează numărul de identificare al membrului care
77
Baze de date Capitolul 3
joacă rolul de sponsor. Observaţi că Mocean Pavel sponsorizează pe
Obădău Anica.
Membrii
MembruID Nume Prenume SponsorID <<alte câmpuri>>
1001 Pop Dorin ------
1002 Mocean Pavel 1001 ------
1003 Ban Ionel ------
1004 Ban Lucia 1003 ------
1005 Obădău Anica 1002 ------
Membrii
78
Baze de date Capitolul 3
Figura 3.23 arată diagrama acestei relaţii.
Personal
În acest caz, o anumit subansamblu poate fi compus din mai multe piese
componente diferite şi poate fi la rândul lui component al unui alt
subansamblu.
Piese
PiesaID Denumire piesa <<alte câmpuri>>
7001 Clema superioară .....
7002 Clema inferioară .....
7003 Şurub de strângere .....
7004 Piulită .....
7005 Ansamblu clemă .....
7006 Scaun .....
7007 Ansamblu scaun .....
7008 Corp tubular .....
7009 Suport spate .....
7010 Ansamblu cadru .....
7011 Şa .....
Subansamblu clemă (7005) este compus din patru piese (7001, 7002, 7003,
7004), deci înregistrarea respectivă poate fi corelată cu 4 înregistrări din
acelaşi tabel. În plus, subansamblu clemă intră în componenţa ansamblului
79
Baze de date Capitolul 3
scaun (7007) şi al ansamblului cadru (7010), deci 2 înregistrări din tabel
pot fi corelate cu ea. Figura 3.25 prezintă diagrama pentru acest tip de
relaţie.
Piese
Pasul următor pe care trebuie să-l facem este identificarea relaţiilor care
există în mod curent între tabelele dintr-o bază de date.
În analiza pe care aţi făcut-o în timpul proiectării bazei de date, aţi stat de
vorbă cu multe persoane din organizaţia beneficiară, atât din conducere cât
şi din compartimentele care vor folosi nemijlocit baza de date. Ei bine,
aceste persoane vă vor fi de un real folos în identificarea relaţiilor dintre
tabele, chiar dacă ele nu au o viziune completă asupra problemei în cauză.
80
Baze de date Capitolul 3
SALI
PERSONAL
STUDENTI
Scrieţi tabelele în partea de sus a matricei şi încă o dată în partea stângă a
matricei, ca în figura 3.26.
Selectaţi câte un tabel din partea stângă a matricei şi verificaţi dacă el are
vreo relaţie cu vreunul din tabelele din partea de sus, parcurgând matricea
pe linie. Ţineţi minte că nu căutaţi decât relaţiile directe – între tabelele
care participă la relaţie trebuie să existe o conexiune specifică. De
exemplu, tabelul CURSURI are o relaţie directă cu tabelul STUDENTI,
deoarece cursurile există ca să fie urmate de studenţi. Tabelul CURSURI
are o relaţie indirectă cu tabelul PERSONAL, prin intermediul tabelului
CATEDRA; un curs este predat de un membru al catedrei, nu de un
membru al personalului. Nu trebuie să vă ocupaţi încă de relaţiile indirecte.
Dacă nu vedeţi de la început relaţia dintre două tabele, o bună metodă este
de a „popula” tabelele cu câteva înregistrări care vă vor ajuta în depistarea
acestor relaţii. În şedinţa de lucru pentru stabilirea relaţiilor între tabele veţi
pune întrebări de genul:
Poate o înregistrare din CURSURI să fie asociată cu una sau mai
multe înregistrări din tabelul CLADIRI?
Se poate găsi o legătură între PERSONAL şi STUDENTI?
Reţineţi că pentru a stabili relaţia corectă dintre două tabele, veţi pune două
întrebări, una din perspectiva primului tabel şi una din perspectiva celuilalt
tabel. Răspunsurile la aceste două întrebări vor identifica tipul de relaţie
care există între cele două tabele.
81
Baze de date Capitolul 3
După ce aţi identificat relaţia, indicaţi tipul relaţiei în celula aflată la
intersecţia dintre liniile celor două tabele. Pentru tipurile de relaţii folosiţi
următoarele prescurtări:
1:1 - pentru relaţia unu cu unu.
1:M - pentru relaţia unu cu mai multi.
M:M - pentru relaţia mai mulţi cu mai mulţi.
Iată cum putem comenta notaţiile din figura 3.21, începând din stânga sus:
1:M - într-o clădire se pot ţine mai multe cursuri.
1:M - o clădire are mai multe săli.
1:1 - un curs se poate ţine numai într-o clădire.
1:M - un curs poate aparţine mai multor catedre
1:1 - un curs se ţine numai într-o sală.
Dacă între tabele nu există nici un fel de relaţie, lucru perfect normal,
celula corespunzătoare va fi goală. Deseori, relaţiile între două tabele vor
diferi de la o perspectivă la alta (depinde din ce parte privesc) şi trebuie să
ştiţi cum să determinaţi tipul oficial de relaţie dintre fiecare pereche de
tabele din matrice. Veţi stabili acest lucru utilizând următorul set de
formule:
1:1 + 1:1 = 1:1
1:M + 1:1 = 1:M
1:M + 1:M = M:M
82
Baze de date Capitolul 3
Iată, în rezumat, procedura specifică pe care o veţi utiliza la identificarea
relaţiei oficiale între două tabele din matrice, procedura incluzând
formulele de relaţie de mai sus:
1. Selectaţi o pereche de tabele şi notaţi intrarea de la intersecţia dintre
linia primului tabel şi coloana celui de-al doilea.
2. Localizaţi al doilea tabel pe aceeaşi parte a matricei pe care lucraţi şi
notaţi intrarea de la intersecţia liniei acestuia cu coloana primului
tabel.
3. Asupra celor două intrări aplicaţi una din formulele de mai sus şi
stabiliţi relaţia oficială dintre cele două tabele.
4. Construiţi diagrama relaţiei în mod corespunzător.
5. Tăiaţi ambele intrări din matrice.
Relaţia oficială rezultată este 1:M – unu cu mai mulţi, rezultată din
compunerea relaţiilor din cele două sensuri.
83
Baze de date Capitolul 3
cheie externă. De fapt, acesta este şi mecanismul cu care se relaţiile unu cu
unu.
Iată un caz concret de construcţie a unei relaţii unu cu unu (figura 3.29).
Presupunem că avem tabelul Personal, care conţine toate câmpurile legate
de descrierea unui angajat. Acest tabel se va „rupe” în două pentru a separa
datele confidenţiale de cele publice.
Personal-1
AngajatID ChP
Personal Nume
AngajatID ChP
Prenume
Nume Data nasterii
Prenume Data angajarii
Data nasterii
Specializare
Data angajarii
Adresa
Specializare
Telefon acasa
Adresa
Mobil
Telefon acasa E-mail
Mobil Web
E-mail
Web
Salariu Personal-2
Indemnizatie AngajatID ChE
Asigurare Salariu
Tip plan medical Indemnizatie
Asigurare
Tip plan medical
În unele cazuri, mai pot fi forţate unele relaţii unu cu unu, fără ca aceste
tabele sa aibă altceva comun decât cheia primară a unuia copiată în celălalt
tabel. Practica o să vă scoată în cale şi un astfel de caz.
84
Baze de date Capitolul 3
tabelul aflat în partea „unu” a relaţiei şi o veţi include în structura tabelului
din partea „mai mulţi”, unde va deveni cheie externă.
Cladiri Sali
Relaţia logică între aceste tabele este că o clădire are mai multe săli, dar o
sală se găseşte numai într-o clădire. Utilizând procedura anterioară, veţi
stabili această relaţie luând o copie a cheii primare (CladireID) din tabelul
CLADIRI pe care o includeţi drept cheie externă în tabelul SALI.
Diagrama revizuită trebuie să fie ca cea prezentată în figura 3.31.
Sali
Cladiri
SalaID ChP
CladireID ChP CladireID ChE
Numar etaje Tip sala
Acces lift Nr locuri
Acces parcare Acces Intrenet
Figura 3.32 vă arată cum stabiliţi o relaţie „mai mulţi cu mai mulţi” între
tabelele STUDENTI şi CURSURI. (Observaţi noul simbol de diagramă
pentru tabelul de legătură.)
Studenti Cursuri
Cursuri Student
StudentID ChP CursID ChP
Nume StudentID ChPC/ChE Denumire
Prenume CursID ChPC/ChE Credite
Data nasterii ProfesorID
Adresa Categorie
Telefon
E-mail
86
Baze de date Capitolul 3
Astfel, cazul tabelului prezentat la paragraful „Relaţii cu autoreferire”, cel
din figura 3.22, se poate rezolva mai simplu dacă introducem în baza de
date un nou tabel numit SEFI, cu care să stabilim o relaţie „unu cu mai
mulţi”. În acest fel câmpul SEF ar putea deveni cheie externă, numindu-se
SefID.
După ce aţi stabilit toate relaţiile care se găsesc între tabelele bazei
dumneavoastră de date, urmează să stabiliţi caracteristicile fiecărei relaţii.
Aceste caracteristici arată ce se întâmplă atunci când ştergeţi o înregistrare,
care este tipul de participare şi gradul de participare a fiecărui tabel în
relaţie.
87
Baze de date Capitolul 3
înregistrărilor corelate din tabelul copil. Dacă intenţionaţi să
utilizaţi această regulă de ştergere, trebuie să modificaţi
specificaţia de câmp a cheii externe şi să atribuiţi elementul logic
Suport valori nule, valoarea “Se acceptă valori nule”.
Folosire valoare prestabilită. Programul SGBDR va şterge
înregistrarea din tabelul părinte apoi va actualiza valoarea cheii
externe ale înregistrărilor corelate din tabelul copil la valoarea
curentă a elementului logic Valoare prestabilită din specificaţia
de câmp a cheii externe. Evident, ca să puteţi utiliza această
regulă, trebuie să fi introdus o valoare la elementul Valoare
prestabilită.
După cum se ştie de la capitolul 1, când stabiliţi o relaţie între două tabele,
fiecare tabel participă la relaţie într-o manieră particulară. Tipul de
participare pe care îl atribuiţi unui tabel dat determină dacă în respectivul
tabel trebuie să existe o înregistrare înainte de a putea introduce înregistrări
în tabelul corelat. Există 2 tipuri de participări:
Obligatorie - tabelul trebuie să conţină cel puţin o înregistrare înainte de a
putea introduce înregistrări în tabelul corelat.
Opţională – nu este obligatoriu ca tabelul să conţină vreo înregistrare
înainte de a putea introduce înregistrări în tabelul corelat.
88
Baze de date Capitolul 3
Angajati Clienti
ClientID ChP
AngajatID ChP AngajatID ChE
............
89
Baze de date Capitolul 3
90
Baze de date Capitolul 3
Să luăm din nou tabelele ANGAJATI şi CLIENTI. Între aceste 2 tabele
există o relaţie „unu cu mai mulţi”, ceea ce înseamnă că un client dat poate
fi asociat cu singur angajat şi un angajat dat poate fi asociat cu orice număr
de clienţi. Judecând după o regulă de bun simţ sau decizie a conducerii
organizaţiei, un angajat nu poate să răspundă de mai mult de 10 clienţi
simultan. Pe baza acestui scenariu, puteţi deduce că gradul de participare
pentru tabelul ANGAJATI este (1,1) şi gradul de participare pentru tabelul
CLIENTI este (0,10).
Clienti
Angajati
(1,1) (0,10) ClientID ChP
AngajatID ChP AngajatID ChE
............
Următoarea sarcină pe care o aveţi este să parcurgeţi toate relaţiile din baza
de date la care lucraţi şi să stabiliţi caracteristicile fiecăruia, după modelul
prezentat mai sus. Pe măsură ce finalizaţi munca la o relaţie dată, nu uitaţi
să actualizaţi diagrama relaţiei, astfel încât aceasta să reflecte rezultatele
obţinute.
91
Baze de date Capitolul 3
Integritatea la nivel de relaţie
92
Baze de date Capitolul 3
Etapa 5 - Determinarea şi definirea regulilor de
desfăşurare a activităţii
În această etapă vom determina regulile care trebuie să fie cunoscute şi
respectate de toţi utilizatorii bazei de date. Cea mai bună abordare a acestei
etape este definirea şi stabilirea regulilor de desfăşurare a activităţii
specifice câmpurilor, urmate de regulile de desfăşurare a activităţii
specifice relaţiilor. Această abordare vă ajută să rămâneţi concentrat pe
tipul de regulă pe care o definiţi. De asemenea, se evită saltul înainte şi
înapoi, de la un tip de regulă la altul, fapt care poate determina confuzie şi
sentimente de frustrare.
93
Baze de date Capitolul 3
95
Baze de date Capitolul 3
Tabele de validare
Se pune firesc întrebarea, cum stabilim acel set distinct de valori pe care le
poate lua un anumit câmp. O soluţie ar fi enumerarea valorilor într-un
„Interval de valori” de pe Foaia de specificaţii a câmpului. Acest lucru
merge bine când avem puţine valori (ex. Sex: M/F, Note: 1-10), dar nu în
cazul judeţelor ca în exemplul amintit mai sus.
Iată cum apare tabelul de validare pentru judeţele ţării noastre, figura 3.37.
97
Baze de date Capitolul 3
către un operator uman, dar dacă se introduce cheia primară (JudetID),
sigur nu vor fi mai multe denumiri ale acestuia.
98
Baze de date Capitolul 3
Le puteţi utiliza în scopuri de securitate sau confidenţialitate.
Puteţi determina ce date sunt disponibile unui anumit grup de
utilizatori.
Vederile sunt create cu ajutorul limbajului SQL, aşa cum veţi învăţa în
capitolul 4.
99
Baze de date Capitolul 3
100
Fig. 3.38. Formular pentru vedere
Baze de date Capitolul 3
Documentarea unei vederi se face prin 2 documente de bază: foaie de
specificaţii şi diagrama de vedere. Foaia de specificaţii a fost prezentată în
figura 3.38, iar pentru diagrama de vedere, cea mai bună explicaţie este
prezentarea unui exemplu concret, aşa cum se va vedea în continuare.
tblSectii
tblStudenti
SectiaID
StudentID Sectia
Nume ……..
Prenume
SectiaID
Telefon
………
Lista studenti
Student
Sectia
Telefon
101
Baze de date Capitolul 3
102
Baze de date Capitolul 3
103
Baze de date Capitolul 3
Aţi stabilit corect relaţia;
Aţi definit regulile de ştergere adecvate;
Aţi identificat tipul de participare pentru fiecare tabel al relaţiei;
Aţi stabilit corect gradul de participare pentru fiecare tabel.
104
Baze de date Capitolul 3
După ce aţi toate aceste revizuiri, puteţi fi încredinţat că baza de date pe
care aţi proiectat-o are o structură solidă, datele pe care le va conţine sunt
unitare şi acceptabile, iar informaţiile pe care le veţi extrage din ea vor fi
exacte.
105
Baze de date Capitolul 3
Studiu de caz. Proiectarea unei baze de date
Declaraţia de intenţie
Dorim o bază de date pentru o bibliotecă cu ajutorul căruia să gestionăm
cărţile, cititorii şi împrumuturile care se fac de către această bibliotecă.
Obiectivele misiunii
În urma discuţiilor şi analizării documentelor obţinute de la diferite
persoane aparţinând bibliotecii, împreună cu directorul ei am convenit că
baza de date care va fi proiectată va îndeplini următoarele obiective:
O evidenţă a cărţilor din bibliotecă.
O evidenţă a cititorilor cu posibilitatea de a obţine informaţii despre natura
profesiilor lor, a preocupărilor etc.
Dorim să avem evidenţa împrumuturilor de cărţi.
Alte informaţii utile.
106
Baze de date Capitolul 3
În urma analizării obiectivelor misiunii au rezultat tabelele cu date,
stabilindu-se câmpurile şi cheile, primare sau externe. În această etapă se
vor definitiva şi specificaţiile de câmp, completând formularul Specificaţii
de câmp care se găseşte în anexa acestei cărţi.
Lista cu tabelele bazei de date este prezentată în tabelul care urmează.
Tabel Cimp Tip data Constringeri Observatii
tblAutori AutorID ChP AutoNumber Not Null
Nume Character(150) Not Null
Prenume Character(150) Not Null
Nationalitate Character(15)
DataN Data/Time zz-lll-aa
DataD Data/Time zz-lll-aa
tblEdituri EdituraID ChP AutoNumber Not Null
Denumire Character(150) Not Null
Localitate Character(150)
Tara Character(50)
tblCarti CarteID ChP AutoNumber Not Null
AutorID ChE Long Integer Not Null
EdituraID ChE Long Integer Not Null
Denumire Character(250) Not Null
DomeniuID ChE Long Integer Not Null
AnAparitie Integer
Pagini Integer
Valoare Single
Stoc Integer
tblDomenii DomeniuID ChP AutoNumber Not Null
Denumire Character(50) Not Null
Explicatii Character(250)
tblImprumuturi ImprumutID ChP AutoNumber Not Null
CarteID ChE Long Integer Not Null
CititorID ChE Long Integer Not Null
DataImprumut Data/Time zz-lll-aa
Perioada Integer
DataRestituire Data/Time zz-lll-aa
tblCititori CititorID ChP AutoNumber Not Null
Nume Character(150) Not Null
Prenume Character(150) Not Null
ProfesiaID ChE Long Integer Not Null
DataN Data/Time zz-lll-aa
Adresa Character(150)
Localitate Character(150)
JudetID ChE Long Integer Not Null
Observatii Character(150)
tblJudete JudetID ChE AutoNumber Not Null
Denumire Character(75) Not Null
Abreviere Character(2) Not Null
tblProfesii ProfesiaID ChP AutoNumber Not Null
Denumire Character(75) Not Null
Explicatii Character(200)
107
Baze de date Capitolul 3
În acest moment avem toate tabelele bazei de date, cu cheile principale şi
externe, cu specificaţiile de câmp pentru toate câmpurile existente în toată
baza de date. Urmează partea ca mai spectaculoasă a proiectului nostru,
stabilirea relaţiilor dintre tabelele bazei de date.
108
Baze de date Capitolul 3
În cazul de faţă, s-a optat pentru o diagrama de relaţii scoasă din mediul
Access, cu un program de captare de imagini (figura 3.41). Această
imagine o să mai fie întâlnită cu ocazia aplicaţiilor pe care le veţi face în
Access (cap. 5).
Observaţi că relaţia 1:N, partea ”mai mulţi”, este aici notată cu simbolul
”infinit”.
110
Baze de date Capitolul 3
După ce s-a creat diagrama bazei de date urmează stabilirea regulilor de
desfăşurare a activităţii, care va fi abordată în pasul următor.
111
Baze de date Capitolul 3
112
Baze de date Capitolul 3
113
Baze de date Capitolul 3
114
Baze de date Capitolul 3
Iată câteva vederi care n-ar trebui să lispsească din proiectul nostru:
Cititorii cu profesiile lor;
Cărţile;
Editurile;
Aceste vederi îşi extrag datele dintr-unul sau mai multe tabele. Pentru
exemplificare să luăm vederea ”Lista cititorilor bibliotecii” a cărei
structură o vedem în figura 3.44.
tblCititori
tblProfesii
tblJudete
JudetID CititorID ProfesiaID
Denumire Nume Denumirea
Abreviere Prenume Explicatii
ProfesiaID
……..
JudetID
Lista cititori
Cititor
Profesia
Adresa
116
Baze de date Capitolul 3
118
Baze de date Capitolul 3
putea lucra la completarea formularelor de specificaţii pentru câmp, relaţie,
vedere şi reguli de desfăşurare a activităţii. Un rol important aţi putea avea
în culegerea de informaţii de la viitorii utilizatori ai bazei de date.
119
Baze de date Capitolul 4
Prezentare generală
Limbajul SQL este abrevierea de la Structured Query Language (limbaj
structurat de interogare) şi este un limbaj conceput special pentru
comunicarea cu bazele de date.
După cum spuneam, instrucţiunile SQL sunt puţine, dar ele sunt
completate cu clauze care le măresc puterea. Practic, noi trebuie să
înţelegem şi să folosim clauzele care însoţesc instrucţiunile. Sintaxa
folosită nu este pretenţioasă, singura noastră grijă este să folosim expresii
lizibile, prin evidenţierea instrucţiunilor şi a parametrilor lor.
Metoda pe care o vom folosi pentru a învăţa limbajul SQL este cea a
învăţării „din mers” a instrucţiunilor şi clauzelor, adică executăm
operaţiuni şi învăţăm instrucţiunile folosite. Operaţiunile vor fi în aşa fel
alese ca să acopere tot spectrul practic pe care o să-l întâlniţi în realitate.
Într-o anexă vor fi sistematizate instrucţiunile SQL cu clauzele şi sintaxa
lor. Această anexă vă va fi de un real folos după ce veţi dobândi o anumită
experienţă în utilizarea limbajului SQL.
121
Baze de date Capitolul 4
Operaţiuni simple folosind limbajul SQL
Regăsirea datelor
Expresie SQL:
SELECT Nume, Prenume
FROM tblStudenti;
Rezultat:
Nume Prenume
Bogdan Mircea Florin
Meruta Cosmin
Pop Marius Traian
Bucur Mihaela
Chirila Laura
Cotirla Raluca Adina
Cotoara Ovidiu
Cozma Dumitru
Damian Daniel
Farcas Calin Florin
122
Baze de date Capitolul 4
Observaţi expresia SQL care se citeşte astfel: selectează coloanele Nume şi
Prenume din tabelul tblStudenti. S-a folosit şi clauza FROM, aşa cum se
vede. Rezultatul obţinut este evident.
Expresie SQL:
SELECT *
FROM tblStudenti
Sortarea datelor
Expresie SQL:
SELECT Nume, Prenume
FROM tblStudenti
ORDER BY Nume;
Rezultat:
Nume Prenume
Bogdan Mircea Florin
Bucur Mihaela
Chirila Laura
Cotirla Raluca Adina
Cotoara Ovidiu
Cozma Dumitru
Damian Daniel
Farcas Calin Florin
Meruta Cosmin
Pop Marius Traian
123
Baze de date Capitolul 4
Observaţi clauza ORDER BY care ordonează înregistrările în ordine
alfabetică după valorile din câmpul Nume. Se pune întrebare, ce ne facem
dacă vrem să ordonăm invers alfabetic (de la Z la A)? Sau dacă avem un
câmp numeric şi dorim să ordonăm descrescător după acest câmp. Iată
răspunsul:
Pentru a indica ordinea descrescătoare de sortare se foloseşte
cuvântul cheie DESC.
Dacă câmpul după care se face sortarea este alfanumeric, sortarea
se face alphabetic, iar dacă este numeric sau de dată
calendaristică, sortarea se face crescător/descrescător.
Dacă nu se indică direcţia de sortare, se ia sortarea crescătoare
care este implicită. (Cazul prezentat.)
Iată cum arată o expresie SQL în care apare şi cuvântul cheie DESC:
Expresie SQL:
SELECT Nume, Prenume
FROM tblStudenti
ORDER BY Nume DESC
Reţineţi că rezultatul sortării datelor este un tabel care are acelaşi număr de
înregistrări ca şi originalul.
Filtrarea datelor
124
Baze de date Capitolul 4
Ne propunem să filtrăm studenţii din anul 2. expresia SQL este
următoarea:
Expresie SQL:
SELECT StudID, Nume, Init, Prenume, Sectia, Grupa
FROM tblStudenti
WHERE An = ”2”;
Rezultat:
StudID Nume Init Prenume Sectia Grupa
3 Pop T. Marius Traian IEI 1321
4 Bucur P. Mihaela IEI 1321
8 Cozma D. Dumitru TCM 1121
125
Baze de date Capitolul 4
Iată câteva cazuri concrete de folosire a operatorilor:
Interval de valori: WHERE Pret BETWEEN 2.5 AND 10; (afişează toate
înregistrările care au în coloana „Pret” valori între 2.5 şi 10).
Filtrare avansată
Filtrările prezentate mai sus se întâlnesc mai rar în practică deoarece sunt
foarte simple. Filtrările pe care le veţi folosi în mod curent, sunt filtrări mai
complicate la care criteriile sunt exprimate prin expresii complexe. Aceste
criterii creează condiţii puternice de căutare. Vom folosi alţi operatori cum
sunt AND, OR, NOT şi IN.
126
Baze de date Capitolul 4
Operatorul AND. Prima filtrare ar fi studenţii de la IEI din anul 1. Iată
expresia SQL:
Expresie SQL:
SELECT Nume, Prenume, Grupa, Stare
FROM tblStudenti
WHERE Sectia=”IEI” AND An = ”1”;
Rezultat:
Nume Prenume Grupa Stare
Bogdan Mircea Florin 1311 Bugetar
Meruta Cosmin 1312 Taxa
Expresie SQL:
SELECT Nume, Prenume,Sectia, Grupa, Stare
FROM tblStudenti
WHERE (Sectia=”IEI” OR Sectia=”TCM”) AND An = ”2”;
Rezultat:
Nume Prenume Sectia Grupa Stare
Pop Marius Traian IEI 1321 Bugetar
Cozma Dumitru TCM 1121 Bugetar
Ne propunem să alegem din tabelul din figura 4.2 toţi studenţii care au
numele Pop şi Cozma.
Expresie SQL:
SELECT Nume, Prenume,Sectia, Grupa, Stare
FROM tblStudenti
WHERE Nume IN (“Pop”, “Cozma”);
Rezultat:
Nume Prenume Sectia Grupa Stare
Pop Marius Traian IEI 1321 Bugetar
Pop Laura IEI 1331 Taxa
Cozma Dumitru TCM 1121 Bugetar
Cozma Calin Florin MEC 1241 Taxa
Expresie SQL:
SELECT Nume, Prenume,Sectia, Grupa, Stare
FROM tblStudenti
WHERE NOT Stare=”Bugetar”;
Rezultat:
Nume Prenume Sectia Grupa Stare
Meruta Cosmin IEI 1312 Taxa
Pop Laura IEI 1331 Taxa
Cozma Calin Florin MEC 1241 Taxa
129
Baze de date Capitolul 4
130
Baze de date Capitolul 4
Ne propunem să filtrăm toate înregistrările în care numele studenţilor, din
tabelul din figura 4.3, începe cu „Pop”.
Expresie SQL:
SELECT Nume, Prenume,Sectia, Grupa, Stare
FROM tblStudenti
WHERE Nume LIKE ”Pop*”
ORDER BY Nume;
Rezultat:
Nume Prenume Sectia Grupa Stare
Pop Laura IEI 1331 Taxa
Popa Ovidiu TCM 1111 Bugetar
Popescu Marius Traian IEI 1321 Bugetar
Popovici Dumitru TCM 1121 Bugetar
Folosind tabelul din figura 4.3, scrieţi expresii SQL care să ilustreze
folosirea acestui caracter de înlocuire.
131
Baze de date Capitolul 4
Operaţiuni avansate folosind limbajul SQL
Câmpuri calculate
132
Baze de date Capitolul 4
Expresie SQL:
SELECT Nume + “ “ + Init + “ “ + Prenume AS Student, Sectia, An, Grupa, Stare
FROM tblStudenti
ORDER BY Nume;
Rezultat:
133
Baze de date Capitolul 4
Expresie SQL:
SELECT Cod, Denumire, Furnizor, PU, Cantitate, PU*Cantitate AS Valoare
FROM tblProduse;
134
Baze de date Capitolul 4
Funcţii de dată şi timp sunt folosite la manipularea valorilor
calendaristice de dată şi oră, şi la extragerea unor componente
caracteristice din aceste valori (an, lună, zi, oră) pentru a verifica
validitatea unor date introduse.
Funcţiile text. În această categorie vom regăsi clasicele funcţii de text care
se găsesc în toate limbajele de programare. Iată-le pe cele mai folosite:
LEFT() - returnează caracterele indicate din stânga
şirului.
RIGHT() - returnează caracterele indicate din dreapta şirului.
LENGTH() - returnează lungimea unui şir.
LOWER() - transformă toate caracterele şirului în minuscule.
UPPER() - transformă toate caracterele şirului în majuscule.
LTRIM() - înlătură spaţiile albe din stânga şirului.
RTRIM() - înlătură spaţiile albe din stânga şirului.
135
Baze de date Capitolul 4
Ultimele cinci funcţii se mai numesc şi funcţii agregat, deoarece au în
spate algoritmi complecşi.
Funcţiile de dată şi timp. Valorile datei şi orei sunt stocate în baza de date
în formate speciale, de aceea este nevoie de funcţii speciale pentru a le
manipula. Ele sunt cele mai importante funcţii din limbajul SQL. Aceste
funcţii ne ajută să extrageţi ora, luna, ziua, anul dintr-o astfel de dată şi să
faceţi diferenţa dintre două date calendaristice. Cele mai importante sunt:
Date() - returnează data curentă a sistemului.
DateAdd(interval, numar, data) – returnează o dată rezultată din
adăugarea unui interval la data specificată. Parametrul “interval”
poate avea valorile: yyyy – an, q – trimestru, m – lună, d – zi etc.
Exemple: DateAdd(„yyyy‟,3,#22/11/2003#) – returnează 22/11/2006
DateAdd(„m‟,5,#22/11/2003#) – returnează 22/04/2004
136
Baze de date Capitolul 4
Gruparea datelor
Crearea grupurilor
Toate calculele de până acum au fost efectuate asupra tuturor datelor dintr-
un tabel, sau asupra datelor ce corespundeau clauze WHERE specifice.
Dacă aţi dori să faceţi asemenea calcule asupra unor seturi logice se
înregistrări? Aici intervine gruparea datelor. De exemplu, gruparea
vânzărilor săptămânale după numele vânzătorului care le-a făcut.
Expresie SQL:
SELECT Cod_vinzator, COUNT(*) AS Numar_vinzari
FROM tblProduse
GROUP BY Cod_vinzator;
137
Baze de date Capitolul 4
Rezultat:
Cod_vinzator Numar_vinzari
MR-01 3
KL-02 1
PR-02 1
GH-04 1
Deoarece aţi folosit clauza GROUP BY, n-a trebuit să specificaţi fiecare
grup care trebuie evaluat şi calculat, acest lucru s-a făcut în mod automat.
Clauza GROUP BY instruieşte sistemul de gestionare a bazei de date să
grupeze datele şi apoi să aplice funcţia agregat fiecărui grup, nu asupra
întregului set de rezultate.
138
Baze de date Capitolul 4
Filtrarea grupurilor
După cum ştim clauza WHERE filtrează liniile întregului tabel, nu a unui
grup aşa cum am dori noi. Pentru filtrarea grupurilor, limbajul SQL ne
pune la dispoziţie clauza HAVING, care este foarte asemănătoare cu
clauza WHERE. Prin urmare, clauzele WHERE şi HAVING se ocupă de
acelaşi lucru, filtrare, singura diferenţă este că prima filtrează linii, iar a
doua grupuri.
Expresie SQL:
SELECT Cod_vinzator, COUNT(*) AS Numar_vinzari
FROM tblProduse
GROUP BY Cod_vinzator
HAVING COUNT(*) > 2;
Rezultat:
Cod_vinzator Numar_vinzari
MR-01 3
139
Baze de date Capitolul 4
De multe ori, în practică, apare necesitatea folosirii ambelor clauze, ceea ce
duce la mărirea vitezei de execuţie. În acest caz ordinea de execuţie ar fi
WHERE, GROUP BY şi HAVING. De exemplu, un caz real ar fi acela de
a vedea ce cumpărători au depus la noi mai mult de 2 comenzi în ultimele
12 luni. E clar că nu vom face grupuri din tot tabelul de cumpărători, ci
numai după ce i-am filtrat cu o clauză WHERE numai pe cei din ultimul
an. Încercaţi să concepeţi un astfel de tabel şi să-i aplicaţi expresia SQL
care să facă aceste lucruri.
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
140
Baze de date Capitolul 4
Lucrul cu subselecţii
tblDetaliiCom
tblComenzi
DetComID ChP
Nr_comanda ChP Nr_comanda ChE
DataCom ArticolID ChE
CumparatorID ChE PretArt
Cantitate
tblCumparatori
Fig. 4.6. Diagrama de relaţii
CumparatorID ChP
NumeCump
Oras
141
Baze de date Capitolul 4
tblComenzi
ComandaID DataCom CumparatorID
10010 16.04.2005 6001
10011 16.04.2005 6083
10012 16.04.2005 6014
10013 16.04.2005 6025
10014 16.04.2005 6001
10015 20.04.2005 6083
10016 20.04.2005 6001
10017 20.04.2005 6014
tblDetaliiCom
DetComID ComandaID ArticolID PretArt Cantitate
20010 10010 1001 250.50 10
20011 10010 1002 115.00 12
20012 10011 1001 95.25 8
20013 10011 1052 65.00 50
20014 10012 1008 147.00 16
tblCumparatori
CumparatorID NumeCump Oras <<alte cimpuri>>
6001 ROMBAT SRL Tg. Mures ......
6002 AutoNET SRL Tg. Mures ......
6025 COMPACT SA Brasov ......
6083 ANCONA SA Sibiu ......
6014 SAVINA SRL Ludus ......
Aceste 3 tabele fac parte dintr-o bază de date a unei firme de comerţ.
Cumpărătorii sunt firme, care comandă diferite articole produse de firma
noastră. În tabelul tblComenzi sunt ţinute comenzile, în tabelul
tblDetaliiCom sunt ţinute articolele tuturor comenzilor, iar în tabelul
tblCumparatori sunt stocaţi toţi cumpărătorii.
Expresie SQL:
SELECT ComandaID
FROM tblDetaliiCom
WHERE ArticolID = „1001‟;
Rezultat:
ComandaID
..........
10010
10011
Expresie SQL:
SELECT CumparatorID
FROM tblComenzi
WHERE ComandaID IN (10010, 10011);
Rezultat:
CumparatorID
..........
6001
6083
143
Baze de date Capitolul 4
Remarcaţi folosirea clauzei IN pe care aţi studiat-o puţin mai înainte.
Expresie SQL:
SELECT CumparatorID, NumeCump
FROM tblCumparatori
WHERE CumparatorID IN (6001, 6083);
Rezultat:
CumparatorID NumeCump
.......... .........
6001 ROMBAT SRL
6083 ANCONA SA
V-aţi descurcat foarte bine până aici, dar nu cred că sunteţi mulţumiţi cu
această metodă „băbească” de găsi informaţiile dorite. Aţi observat cum s-
au transferat rezultatele unei interogări în parametrii altei interogări.
Soluţia este să încercaţi să uniţi aceste 3 interogări într-una singură. Iată
această cale:
Expresie SQL:
SELECT CumparatorID, NumeCump
FROM tblCumparatori
WHERE CumparatorID IN (SELECT CumparatorID
FROM tblComenzi
WHERE ComandaID IN (SELECT ComandaID
FROM tblDetaliiCom
WHERE ArticolID =
„1001‟));
Rezultat:
CumparatorID NumeCump
.......... .........
6001 ROMBAT SRL
6083 ANCONA SA
Rezultatul obţinut este identic cu cel obţinut pas cu pas, dar aici aţi folosit
o singură expresie SQL. Observaţi că pentru a putea citi şi înţelege mai
144
Baze de date Capitolul 4
bine această expresie am grupat-o într-un anume fel. Este o idee bună, mai
ales atunci când expresiile pe care le folosiţi sunt complicate.
Iată cum trebuie procedat (tabelele sunt cele din figura 4.7):
Expresie SQL:
SELECT NumeCump, Oras, (SELECT COUNT(*) FROM tblComenzi AS C
WHERE C.CumparatorID=tblCumparatori.CumparatorID)
AS Comenzi
FROM tblCumparatori
ORDER BY NumeCump;
Rezultat:
NumeCump Oras Comenzi
.......... ......... ........
ANCONA SA Tg. Mures 2
AutoNET SRL Tg. Mures 0
COMPACT SA Brasov 1
ROMBAT SRL Bistrita 3
SAVINA SRL Ludus 2
145
Baze de date Capitolul 4
numele tabelului din care face parte, ca de exemplu,
tblComenzi.CumparatorID sau tblCumparatori.CumpatatorID. Se vede
clar că câmpul CumparatorID face parte din două tabele.
146
Baze de date Capitolul 4
Unirea tabelelor
Crearea unei uniri este foarte simplă. În exemplul următor, vom uni două
tabele tblProduse şi tblVinzatori, al cărui rezultat este produsul cartezian al
acestora, având un număr de înregistrări egal cu produsul numerelor
acestora (figura 4.8).
tblProduse
ProdusID VinzatorID DenumireProdus PretProdus
1001 V01 Piine 2.00
1002 V03 Banane 2.50
1003 V01 Biscuiti 1.25
tblVinzatori
VinzatorID NumeVinzator OrasVinzator <<alte cimpuri>>
V01 Ban Lucia Naoiu ......
V02 Pop Mariana Sarmasel ......
147
Baze de date Capitolul 4
Expresia SQL:
SELECT NumeVinzator, DenumireProdus, PretProdus
FROM tblVinzatori, tblProduse;
Rezultat:
Expresia SQL:
SELECT NumeVinzator, DenumireProdus, PretProdus
FROM tblVinzatori, tblProduse;
WHERE tblVinzatiri.VinzatorID=tblProduse.VinzatorID;
Rezultat:
Acest tip de uniri, bazate pe verificarea egalităţii dintre două tabele, se mai
numesc şi uniri interioare. Unele SGBGR-uri au sintaxe diferite,
specificând explicit tipul de unire. Studiaţi cu atenţie documentaţia
SGBDR-ului cu care lucraţi pentru a-i folosi corect sintaxa.
148
Baze de date Capitolul 4
O altă variantă de unire este cea făcută în clauza FROM prin folosirea
clauzei speciale INNER JOIN ... ON, după cum se vede mai jos:
SELECT NumeVinzator, DenumireProdus, PretProdus
FROM tblVinzatori INNER JOIN tblProduse
ON tblVinzatiri.VinzatorID=tblProduse.VinzatorID;
149
Baze de date Capitolul 4
Uniri avansate
tblDetaliiComenzi
DetComID ComandaID ProdusID Cantitate
20010 10010 1001 10
20011 10010 1002 12
20012 10010 1078 8
20013 10010 1052 50
20014 10012 1008 16
tblVinzatori
VinzatorID NumeVinzator Oras <<alte cimpuri>>
V01 Ban Lucia Naoiu ......
V02 Pop Mariana Sarmasel ......
V03 Baciu Mia Naoiu ......
V04 Ban Ionel Roma ......
Expresie SQL:
SELECT DenumireProdus, NumeVinzator, PretProdus, Cantitate
FROM tblProduse, tblDetaliiCom, tblVinzatori
WHERE tblDetaliiComenzi.ProdusID=tblProduse.ProdusID
150
Baze de date Capitolul 4
AND tblProduse.VinzatorID=tblVinzatori.VinzatorID
AND ComandaID= „10010‟;
Rezultat:
DenumireProdus NumeVinzator PretProdus Cantitate
Piine Ban Lucia 2.00 10
Inghetata Baciu Mia 1.25 12
Banane Ban Lucia 2.50 8
Bricheta Pop Mariana 0.35 50
Primele două rânduri ale clauzei WHERE fac legătura între perechile de
tabele tblDetaliiComenzi-tblProduse şi tblProduse-tblVinzatori, iar al
treilea filtrează doar produsele pentru comanda 10010.
Compunerea interogărilor
Interogarea bazelor de date este chiar sensul existenţei lor. Nimeni n-a
creat vreo bază de date fără să o interogheze cândva, când se adună
suficiente date în ea. Până acum noi am făcut interogări folosind o singură
instrucţiune SELECT, care returna date din unul sau mai multe tabele.
Limbajul SQL vă permite să efectuaţi mai multe interogări (mai multe
151
Baze de date Capitolul 4
instrucţiuni SELECT) şi să returnaţi rezultatele sub forma unui singur set
de rezultate de interogare. De obicei, aceste interogări sunt cunoscute drept
reuniuni sau interogări compuse.
După cum ştiţi deja, folosirea operatorului UNION implică scrierea mai
multor instrucţiuni SELECT, de aceea veţi crea mai întâi fiecare
instrucţiune SELECT, apoi le veţi compune.
152
Baze de date Capitolul 4
Prima instrucţiune SELECT va căuta cumpărătorii din cele 3 judeţe
amintite.
Expresie SQL:
SELECT NumeCumparator, JudCump, PersContact, Email
FROM tblCumparatori
WHERE JudetCumparator IN ('BN', 'BV','CJ');
Rezultat:
NumeCumparator JudCump PersContact Email
ROMBAT SA BN Pop Petru ppop@rmbat.ro
COMPACT SRL BV Pietroi Sorina sorina@yahoo.ro
ANCONA SA CJ Crisan Ovidiu covi@ancona.ro
Expresie SQL:
SELECT NumeCumparator, JudCump, PersContact, Email
FROM tblCumparatori
WHERE NumeCumparator= 'ANCONA SA';
Rezultat:
NumeCumparator JudCump PersContact Email
ANCONA SA MS Palade Sorin sorin@ancona.ro
ANCONA SA CJ Crisan Ovidiu covi@ancona.ro
După cum se vede, există două locaţii pentru firma ANCONA SA, una în
judeţul Mureş şi una în judeţul Cluj.
Expresie SQL:
SELECT NumeCumparator,JudCump, PersContact, Email
FROM tblCumparatori
WHERE JudetCumparator IN ('BN', 'BV','CJ')
UNION
SELECT NumeCumparator, JudCump, PersContact, Email
FROM tblCumparatori
WHERE NumeCumparator= 'ANCONA SA';
153
Baze de date Capitolul 4
Rezultat:
NumeCumparator JudCump PersContact Email
ROMBAT SA BN Pop Petru ppop@rmbat.ro
COMPACT SRL BV Pietroi Sorina sorina@yahoo.ro
ANCONA SA CJ Crisan Ovidiu covi@ancona.ro
ANCONA SA MS Palade Sorin sorin@ancona.ro
Expresie SQL:
SELECT NumeCumparator, PersContact, Email
FROM tblCumparatori
WHERE JudetCumparator IN ('BN', 'BV','CJ')
UNION ALL
SELECT NumeCumparator, PersContact, Email
FROM tblCumparatori
WHERE NumeCumparator= 'ANCONA SA'
ORDER BY NumeCumparator;
Rezultat:
NumeCumparator JudCump PersContact Email
ANCONA SA CJ Crisan Ovidiu covi@ancona.ro
ANCONA SA CJ Crisan Ovidiu covi@ancona.ro
ANCONA SA MS Palade Sorin sorin@ancona.ro
COMPACT SRL BV Pietroi Sorina sorina@yahoo.ro
ROMBAT SA BN Pop Petru ppop@rmbat.ro
154
Baze de date Capitolul 4
Coloanele, expresiile şi funcţiile agregat trebuie să apară exact în
aceeaşi ordine în fiecare instrucţiune SELECT din operaţia
UNION.
Tipurile de date din coloane trebuie să fie compatibile. Nu este
necesar ca datele să fie exact de acelaşi tip, dar trebuie să fie de
un tip pe care SGBDR-ul îl poate transforma implicit (de
exemplu tipuri de date numerice diferite sau tipuri de date
calendaristice diferite).
Inserarea datelor
155
Baze de date Capitolul 4
Inserarea unei linii complete.
Cel mai simplu mod de a insera o linie într-un tabel este folosirea sintaxei
de bază a instrucţiunii INSERT, care cere numele tabelului şi valorile care
vor fi inserate în noua linie. Iată un exemplu:
INSERT INTO tblProduse ( ProdusID, CodProdus, Denumire, UM, Pret, Observatii )
VALUES ('32', '20033', 'Cafea_Jacobs', 'kg', '12.23', 'Conform normelor UE');
156
Baze de date Capitolul 4
Aceste inserări se pot face manual de către administratorul bazei de date,
dar cel mai probabil mod de a insera într-un tabel înregistrările provenite
dintr-o interogare, este folosirea limbajului VBA, în cadrul unor aplicaţii
integrate.
Actualizarea datelor
Datele unei baze de date suferă dese modificări. Cum datele se găsesc în
tabele, este nevoie ca aceste tabele să fie periodic actualizate. Ca să
modificaţi datele dintr-un tabel, trebuie să folosiţi instrucţiunea UPDATE.
Ea poate fi folosită în două moduri:
Pentru actualizarea numai a anumitor linii dintr-un tabel;
Pentru actualizarea tuturor liniilor unui tabel.
157
Baze de date Capitolul 4
Tabelul care trebuie actualizat;
Numele coloanelor şi noile lor valori;
Condiţia filtru care determină liniile care trebuie actualizate.
158
Baze de date Capitolul 4
Pentru a şterge valoarea unei coloane, tehnica este ca acea coloană să fie
setată pe valoarea NULL (condiţia este ca acel câmp să accepte valoarea
NULL). Iată expresia SQL care face acest lucru:
UPDATE tblClienti
SET E_mail = NULL
WHERE ClientID = ’1000245’;
Ştergerea datelor
Să presupunem că printre clienţi, există câţiva care şi-au închis firma, deci
nu mai e necesar să-i avem în tabelul tblClienti, aşa că trebuie să-i ştergem
din tabel. De exemplu, clientul cu codul 1000378 trebuie şters din tabel.
Expresia SQL care face acest lucru este următoarea:
159
Baze de date Capitolul 4
De asemenea, instrucţiunea DELETE nu şterge tabele, ci numai înregistrări
din tabele. Chiar dacă şterge toate înregistrările unui tabel, aceste rămâne,
dar va fi gol.
160
Baze de date Capitolul 4
Nu vă apucaţi să executaţi operaţiuni de actualizare sau ştergere,
înainte să faceţi o copie de siguranţă a bazei de date. Veţi fi astfel
mai relaxaţi, iar în caz de o manevră greşită (oameni suntem,
nu?), puteţi reveni la ce a fost, fără nici o problemă.
Nu executaţi operaţii de ştergere printre „alte activităţi” pentru că
aici aveţi nevoie de concentrare maximă (amintiţi-vă că aici nu
este Undo şi „ce aţi făcut, făcut rămâne”).
161
Baze de date Capitolul 4
Crearea şi manipularea tabelelor
Iată cum arată o expresie SQL de creare a unui tabel (în Access):
CREATE TABLE tblProduse
(
ProdusID Integer NOT NULL,
CodProdus Text(50) NOT NULL,
Denumire Text(80) NOT NULL,
UM Text(10) NOT NULL,
PretUnitar Number NOT NULL,
Observatii Text(255)
);
162
Baze de date Capitolul 4
folosite, întreg, text şi număr real (Number). De asemenea, pentru a
specifica faptul că un câmp cere valoare obligatorie trebuie pusă expresia
NOT NULL, iar dacă lipseşte se consideră că s-a pus NULL, adică acel
câmp poate să rămână necompletat. Din cele 6 câmpuri, numai Observatii
nu este obligatoriu de completat.
Între numele coloanei, tipul de dată şi cuvântul cheie NOT NULL se pune
spaţiu. Modul de aranjare a expresiei SQL nu este important, deoarece
spaţiile suplimentare sunt ignorate, se poate folosi un singur rând pentru
definirea tuturor coloanelor sau se pot aranja pe mai multe rânduri ca în
exemplul prezentat mai înainte, pentru lizibilitate.
Ştergerea unei coloane. Dacă diagrama de relaţii permite, adică acel câmp
nu este implicat în vreo relaţie, coloana (câmpul) poate fi ştearsă dintr-un
tabel. Această manevră se face cu ajutorul instrucţiunii ALTER TABLE şi
clauza DROP COLUMN. Iată un exemplu de folosire a acestei
instrucţiuni:
ALTER TABLE tblProduse
DROP COLUMN Furnizor;
Ştergerea unui tabel. Aşa cum se poate crea un tabel într-o bază de date
cu ajutorul limbajului SQL, tot aşa se poate şi înlătura un tabel din baza de
date. Operaţiunea este foarte simplă, chiar periculos de simplă.
164
Baze de date Capitolul 4
Cum trebuie scrise aceste instrucţiuni? Am putea să scriem individual
fiecare instrucţiune SQL, apoi pe baza rezultatului să executăm alte
instrucţiuni condiţionate. Acţiunea ar trebui repetată pentru fiecare
comandă, iar persoana care face acest lucru trebuie să aibă cunoştinţe şi
experienţă corespunzătoare.
165
Baze de date Capitolul 4
De exemplu, dacă se adaugă o comandă în tabelul tblComenzi, în tabelul
tblDetaliiComenzi trebuie introduse articolele acelei comenzi. Mai întâi se
completează tabelul tblComenzi, apoi se completează tabelul
tblDetaliiComenzi. Se pune întrebarea, ce se întâmplă dacă în timpul
completării articolelor comenzii în tabelul tblDetaliiComenzi, se întrerupe
curentul sau nu există suficient spaţiu pe hard-disc?
166
Baze de date Capitolul 4
Concluzii
SQL este limbajul cel mai răspândit în lucrul cu bazele de date. Indiferent
dacă sunteţi programator de aplicaţii, administrator de baze de date (vezi
Anexa A), designer de aplicaţii Web sau utilizator al suitei Microsoft
Office, o bună cunoaştere a limbajului SQL, constituie o parte importantă a
interacţiunii cu bazele de date.
Sunt azi o mulţime de cărţi despre limbajul SQL şi unele sunt chiar foarte
bune, toate au însă un lucru comun: conţin prea multe informaţii pentru
majoritatea utilizatorilor. Lipsesc exemplele simple, sugestive care, de
multe ori, fac mai mult decât pagini întregi de explicaţii sterile.
167
Baze de date Capitolul 5
În acest capitol veţi învăţa să folosiţi cel mai popular sistem de gestiune a bazelor
de date relaţionale, numit Access. Acesta face parte din produsul Microsoft Office
al firmei Microsoft. Veţi aplica „pe viu” tot ce aţi învăţat în capitolele precedente,
veţi da viaţă bazelor de date pe care le-aţi proiectat. Acum veţi înţelege cu
adevărat unele lucruri peste care aţi trecut mai uşor în faza de proiectare.
Prezentare generală
Microsoft ACCESS este baza de date folosită la birou de mii de utilizatori,
care doresc să-şi stocheze şi să-şi acceseze cu uşurinţă datele de interes
personal, precum şi în medii cu mai mulţi utilizatori. În această prezentare
se va lucra cu varianta ACCESS 2002 din pachetul MS OFFICE XP, al
cărui format standard este de ACCESS 2000.
168
Baze de date Capitolul 5
Tot ce aţi învăţat în capitolele precedente, începând cu terminologia,
relaţiile între tabele, integritatea datelor şi diagrame veţi regăsi în ACCESS
într-o formă specifică acestui program. Mulţi începători sunt frustraţi de
faptul că tabelele ACCESS, deşi seamănă oarecum cu cele din Excel, au un
comportament total diferit. Dacă aceştia încearcă să facă vreo analogie cu
tabelele din Excel, înseamnă că au mari lacune în înţelegerea bazelor de
date.
169
Baze de date Capitolul 5
Permite utilizarea obiectelor ACCESS în alte aplicaţii rulate sub
Windows.
Permite utilizarea de adrese şi legături Internet.
170
Baze de date Capitolul 5
Formulare (forms)
Rapoarte (reports)
Pagini Web (pages)
Comenzi macro (macros)
Module (modules)
171
Baze de date Capitolul 5
obiectelor) a căror înţelegere şi rol este uşor de dedus, de aceea nu vor mai
fi prezentate.
Crearea tabelelor
Înainte de a începe să creaţi tabele, este de la sine înţeles că aveţi deja un
proiect de bază de date, sau dacă sunteţi la început de studiu, măcar o
diagramă de relaţii şi structurile tabelelor. Spuneam la începutul acestui
curs, cât de important e să aveţi un proiect corect de bază de date, pentru a
nu avea probleme la faza de implementare.
Revenind la primul mod de creare a unui tabel, daţi un dublu clic pe Create
table in design view şi pe ecran va apare fereastra Table din figura 5.2.
172
Baze de date Capitolul 5
În toolbar-ul de sub meniul din figura 5.2, există mai multe butoane, unele
cunoscute din alte aplicaţii Windows. Există un buton (cel cu o cheiţă) pe
care nu l-aţi mai întâlnit până acum. Acest buton vă ajută să stabiliţi cheia
principală a tabelului pentru câmpul curent (cel cu săgeata din stânga),
printr-un simplu clic pe el.
Default Value este o valoare care este atribuită automat, în momentul când
utilizatorul nu introduce nici o valoare în acel câmp.
173
Baze de date Capitolul 5
Validation Rule este criteriul care va fi verificat înainte de validarea
valorii introduse în acel câmp. Criteriul este introdus sub formă de expresii
care folosesc:
Operatorii: =, +, -, *, /, <, >, <=, >=, AND, OR, BETWEEN, IN,
IS NULL;
Identificatorii se dau în paranteze drepte [];
Funcţii;
Constante;
Indexed este proprietatea care stabileşte dacă acel câmp are un index care
acceptă valori duplicat sau numai valori unice. Dacă nu dorim un index
pentru acel câmp se alege valoare No.
Relaţiile dintre tabele sunt lucruri cunoscute, deja, de către oricare dintre
dumneavoastră, nu-i aşa? Să vedem acum ce modalitate foloseşte
ACCESS-ul pentru a face legătura între tabele. Din punct de vedere al
momentului creării acestora, există 2 tipuri de relaţii între tabelele unei
baze de date ACCESS şi anume:
Relaţii permanente – se stabilesc după definirea tabelelor şi sunt
cerute de modelul relaţional făcând parte din structura bazei de
174
Baze de date Capitolul 5
date. Aceasta se realizează, de obicei, prin corespondenţa cheie
primară – cheie externă şi sunt memorate în baza de date.
Relaţii temporare – se stabilesc între tabele cu ocazia definirii
unor cereri de interogare, nefiind înregistrate în structura bazei de
date.
După cum ştim, între două tabele între care există o relaţie, datele nu pot fi
introduse oricum. De exemplu, dacă într-o bază de date avem tabelele
tblFacturiPrimite şi tblFurnizori între care există o relaţie „unu cu mai
mulţi”, nu putem introduce date în tabelul tblFacturiPrimite până nu avem
cel puţin un furnizor în tabelul tblFurnizori. Cum rezolvă ACCESS-ul
această prevedere din proiectul bazei de date (tipul de participare)? Prin
impunerea integrităţii referenţiale (Enforce Referential Integrity), după
cum se vede în figura 5.3.
În urma acestei setări, s-a făcut o legătură unu cu mai mulţi între cele două
tabele, a cărei reprezentare se vede în figura 5.4.
175
Baze de date Capitolul 5
Stabilirea legăturilor între tabele se face, fie în faza de creare a tabelului
(folosind Lookup Wizard), fie în fereastra Relationship care se afişează cu
butonul , din toolbar-ul din fereastra Database. Printr-un clic pe acest
buton se deschide tabela Relationship prezentată în figura 5.5.
176
Baze de date Capitolul 5
Tabelele nu sunt de la început aşa frumos aranjate. O să vedeţi cum veţi
găsi aceste tabele, dar prin „tragere” cu mouse-ul se pot aranja ca să fie mai
uşor de urmărit. Încercaţi aceste manevre pentru a vă obişnui cu ele.
Cea mai comodă cale de a crea relaţii permanente între două tabele este
folosirea facilităţii Lookup Wizard, pusă la dispoziţia noastră de programul
ACCESS. Această metodă constă în „legarea” tabelelor în faza de
proiectare prin intermediul unei chei primare şi a unei chei externe. Prima
dată de proiectează tabelul din partea „unu” a relaţiei unu cu mai mulţi. La
cel de-al doilea tabel, când se defineşte câmpul de legătură, pentru tipul de
dată (Data Type) se alege opţiunea Lookup Wizard... (ultima dintre
opţiuni). În urma acestei manevre se deschide caseta de dialog din figura
5.6.
Se alege prima opţiune, cea care ne spune că vom lega câmpul nostru cu un
alt câmp dintr-un tabel sau o interogare, I want the lookup.... Merită
explicată şi opţiunea a doua I will type in the values that I want, care ne
spune că putem lega acest câmp cu o listă de valori introduse de noi chiar
în această fază. Această opţiune este indicat să o folosiţi când aveţi un
număr mic de valori pe care poate să le ia un anumit câmp. Încercaţi şi
această variantă pentru a-i înţelege rolul.
177
Baze de date Capitolul 5
178
Baze de date Capitolul 5
Diferenţa între cele două tipuri de legături permanente, legarea prin metoda
”tragerii” (drag and drop) în fereastra Relationship şi legarea prin metoda
Lookup Wizard..., nu prea iese în evidenţă decât la crearea formularelor de
introducere a datelor. La prima metodă Access-ul va pune automat o casetă
de text (textBox) în care trebuie să introducem manual valori de la
tastatură, iar la a doua metodă va apare în formular o casetă combinată
(comboBox), din care putem alege elegant valoarea din lista afişată.
Dacă aţi reuşit să înţelegeţi aceste diferenţe, înseamnă că aţi făcut un pas
important spre a putea crea aplicaţii Access tot mai performante. Poate în
acest moment nu sesizaţi diferenţele dintre cele două metode, dar cu
siguranţă, le veţi înţelege atunci când veţi crea formulare, puţin mai târziu.
După ce s-au definit tabelele, s-au creat legăturile între ele, urmează, firesc,
completarea acestora cu date. Cea mai simplă metodă este să faceţi un
dublu-clic pe numele tabelului, ceea ce face să se deschidă tabelul, care
seamănă mult cu un tabele Excel, şi să introduceţi pur şi simplu date.
Un filtru poate fi aplicat unui tabel, unei cereri de interogare, unui formular
sau unui raport. Filtrul este salvat împreună cu fiecare obiect şi poate fi
activat sau nu, după nevoie.
179
Baze de date Capitolul 5
În momentul în care un tabel sau un formular este vizualizat, în cadrul
barei de meniuri va apare opţiune Records care permite operaţiile de
filtrare. Există mai multe opţiuni de filtrare, dar cele mai folosite sunt
următoarele două:
Filtrarea by Selection – filtrare conform selecţiei, este cea mai
rapidă şi mai simplă metodă de aplicare a unui filtru. Pentru a
stabili criteriul de filtrare, se selectează un set de date dintr-unul
din câmpurile unui tabel, după care se apasă butonul ,
rezultând tabelul filtrat. Pentru revenire se apasă butonul
(Remove Filter). Cu această metodă se pot filtra înregistrările
numai pe baza unui criteriu aplicat unui singur câmp al tabelului.
Filter by Form – filtrare conform formularului, este metoda în
care criteriul de filtrare se introduce într-un tabel gol. Pentru a
aplica această metodă apăsaţi butonul , care va deschide
tabelul fără nici o înregistrare. Nu aveţi decât să alegeţi valorile
dorite din câmpurile vizate, rezultând un criteriu de filtrare oricât
de complex, poate (atenţie) aşa de complex că nu vă afişează
nimic, având în vedere că toate condiţiile trebuie îndeplinite în
acelaşi timp. Pentru revenire se apasă butonul (Remove
Filter).
Puteţi schimba numele unui tabel făcând un clic dreapta pe numele său. De
asemenea, puteţi face oricâte cópii ale unui tabel pentru diferite acţiuni,
mai ales când încercaţi expresii SQL, având în vedere că după ce aţi
executat o operaţie SQL nu mai puteţi reveni la starea iniţială a tabelului.
180
Baze de date Capitolul 5
Formulare
Formularele sunt obiecte de comunicaţie între un utilizator şi o aplicaţie de
baze de date ACCESS. Ele permit atât introducerea, cât şi vizualizarea
datelor într-o manieră cât mai atractivă.
Un formular se poate crea prin mai multe moduri, dar cele mai utilizate
sunt cele pe care o să le folosim şi noi:
Creare automată – prin utilizarea instrumentului wizard;
Creare manuală – cu ajutorul ferestrei de proiectare.
181
Baze de date Capitolul 5
În continuare vor fi prezentate pe larg cele două metode de creare a
formularelor.
Această metodă este cea mai facilă, practic, calculatorul face tot, noi
trebuie să alegem numai anumite opţiuni care sunt foarte sugestive şi clare.
Pentru a crea formularul, în fereastra Database se apasă, în ordine,
butoanele Forms (din stânga) şi New (de sus).
În urma acestei acţiuni va apare fereastra New Form, aşa cum se vede în
figura 5.11.
182
Baze de date Capitolul 5
Din această fereastră alegem opţiunea Form Wizard şi alegem tabelul
tblGrupe din caseta comboBox, apoi apăsăm butonul OK.
În fereastra următoare putem selecta modul cum vor apare datele în cadrul
formularului, aşa cum se vede în figura 5.13.
Puteţi încerca mai multe opţiuni pentru a vedea diferenţele dintre ele. După
ce v-aţi decis asupra unei opţiuni şi aţi apăsat butonul Next, va apare
fereastra cu ajutorul căreia puteţi alege fundalul formularului, după cum se
vede în figura 5.14.
183
Baze de date Capitolul 5
După ce v-aţi decis asupra unui fundal şi aţi apăsat butonul Next, va apare
ultima fereastră a acestui scenariu, în care puteţi alege numele noului
formular pe care tocmai l-aţi creat.
184
Baze de date Capitolul 5
Deşi crearea automată a formularului este mai rapidă şi mai uşoară,
adevăraţii profesionişti o folosesc mai rar, deoarece este mai rigidă şi îşi
cam impune punctul de vedere. Formularele cu adevărat profesionale se fac
manual, aşa cum se va vedea în continuare.
185
Baze de date Capitolul 5
Bara de titlu
Toolbox – caseta
cu obiecte
Detail este secţiunea de bază a fiecărui formular care nu poate lipsi, spre
deosebire de celelalte care pot lipsi. Aici sunt afişate, practic, informaţiile
pentru care a fost conceput formularul.
186
Baze de date Capitolul 5
În exemplul nostru, mergem mai departe şi populăm formularul cu
obiectele potrivite, etichete, casete de text, butoane de navigare etc. Mai
întâi scăpăm de secţiunile de antet şi subsol ale formularului şi paginilor
dând comanda View şi deselectând opţiunile Page Hedear/Footer şi Form
Hedear/Footer.
187
Baze de date Capitolul 5
Se observă că acest formular este mai arătos, are un titlu pus şi are
introdusă şi data la care se foloseşte – Data curenta:, în care s-a folosit
funcţia Now() ataşată de caseta de text respectivă, care-l face mai util.
Exemplul prezentat nu este unul spectaculos, dar este un bun început care
vă poate folosi ca model.
188
Baze de date Capitolul 5
Formulare cu subformulare
Dintre acestea, ultima variantă este cea mai simplă, aşa că pe aceasta o
vom folosi şi noi. În acest sens se parcurg următoarele etape:
Se creează formularul principal şi se salvează;
Se creează subformularul, la fel ca şi formularul principal;
Se face legătura între formularul principal şi subformular;
Se testează rezultatul.
tblFacturi tblDetaliiFacturi
FacturaID ChP FacturaID ChE tblProduse
NrFactura ProdusID ChE ProdusID ChP
Data Cantitate Denumire
FurnizorID ChE Observatii UM
Pret
..............
tblFurnizori
FurnizorID ChP
Furnizor
CodFiscal
...........
190
Baze de date Capitolul 5
la o interogare. Noi ştim deja să facem interogări cu limbajul SQL, învăţat
în capitolul precedent, nu-i aşa?
Prin urmare, vom scrie 2 interogări SQL, una pentru formularul principal
(cel cu facturile) şi alta pentru subformular (cel cu detaliile facturilor). Iată
cele 2 interogări:
Interogarea 2. Subformular:
SELECT FacturaID, Denumire, UM, Cantitate, Pret, Cantitate*Pret AS Valoare
FROM tblDetaliiFacturi AS df INNER JOIN tblProduse AS pr ON df.ProdusID=pr.ProdusID;
191
Baze de date Capitolul 5
Apăsăm butonul Queries, apoi dublu-click pe opţiunea Create
query in Design view.
Se deschide fereastra cu cele 4 tabele.
Apăsăm butonul Close.
Interogarea 2
Câteva precizări:
La subformularul frmDetaliiFacturi se va alege modul de
prezentare Datasheet, adică sub formă de tabel.
Pentru a elimina butoanele de navigare din subformular,
proprietatea Navigation Buttons se va seta la valoarea No.
193
Baze de date Capitolul 5
frmFacturi
frmDetaliiFacturi
Butoane de navigare
Fig. 5.24.
Formularul nostru
în stare de
funcţionare
194
Baze de date Capitolul 5
Interogări
Fără îndoială, interogările sunt acţiunile cele mai numeroase acţiuni pe care
o să le faceţi asupra unei baze de date. Prin interogări nu facem altceva
decât să extragem informaţii dintr-o bază de date, motivul pentru care
acestea au fost create, nu-i aşa?
195
Baze de date Capitolul 5
În fereastra Database se apasă butonul Queries apoi se dă dublu-
click pe opţiunea Create query in Design view .
Se va deschide fereastra Show table unde se apasă butonul Close.
197
Baze de date Capitolul 5
În caseta de dialog se dă dublu-click pe tabelul care dorim să fie
implicat în interogare, iar acesta va apare în zona de sus a
formularului. Dacă e nevoie de mai multe tabele, se repetă
acţiunea iar la sfârşit se închide caseta cu butonul Close.
Grila de proiectare seamănă cu un tabel, a căror rânduri au
următoarele semnificaţii:
198
Baze de date Capitolul 5
Se observă că primul câmp a fost folosit numai pentru sortare, el nefiind
vizibil în interogare. Pentru vizualizarea interogării se apasă butonul Run (
), iar rezultatul se vede în figura 5.30.
Practica spune că metoda cea mai eficientă, din punct de vedere al însuşirii
cunoştinţelor, este varianta SQL pentru că ajută la înţelegerea deplină a
creării interogărilor şi a rolului fiecărei clauze. Deci nu ezitaţi să o folosiţi
chiar dacă vi se pare la început mai grea.
199
Baze de date Capitolul 5
Încă din faza de proiectare a unei baze de date am văzut că între tabelele
sale există legături. Aceste legături se fac între două câmpuri fiecare
aparţinând unui tabel, aşa cum se vede din diagrama bazei de date. Ne
punem problema „traducerii” acestor legături arătate în diagrame, în cadrul
programului Access.
200
Baze de date Capitolul 5
201
Baze de date Capitolul 5
202
Baze de date Capitolul 5
Interogări cu parametri
tblFacturi tblDetaliiFacturi
FacturaID ChP FacturaID ChE tblProduse
NrFactura ProdusID ChE ProdusID ChP
Data Cantitate Denumire
FurnizorID ChE Observatii UM
Pret
..............
tblFurnizori
FurnizorID ChP
Furnizor
CodFiscal
...........
203
Baze de date Capitolul 5
Ne propunem mai întâi să construim o interogare care să găsească toate
facturile primite de la un furnizor, al cărui nume să-l dăm în momentul
interogării. Pentru aceasta executăm paşii următori:
204
Baze de date Capitolul 5
SELECT tblFurnizori.Furnizor, tblFacturi.NrFactura, tblFacturi.Data
FROM tblFacturi INNER JOIN tblFurnizori ON tblFacturi.FurnizorID =
tblFurnizori.FurnizorID
WHERE (((tblFurnizori.Furnizor)=[Introduceti furnizorul:]));
205
Baze de date Capitolul 5
Rapoarte
Rapoartele nu sunt altceva decât nişte formulare cu informaţii extrase din
baza de date, care se tipăresc pe hârtie şi sunt folosite ca documente care se
pot pune în dosare sau se arhivează. Tehnica de lucru este asemănătoare cu
cea de la formulare. Ca şi formularele, rapoartele au o sursă de date care
poate fi un tabel sau o interogare.
Un raport în format tabelar, cel mai uzual de altfel, este asemănător unei
foi de date Excel. Dezavantajul procedurii AutoReport este că raportul se
bazează pe un singur tabel sau interogare. De asemenea, forma de
prezentarea este una rigidă, impusă.
Cel mai indicat lucru pentru a înţelege cum se creează rapoartele este să
luăm un exemplu practic. Pentru aceasta, luăm ca exemplu baza de date pe
care am folosit-o la crearea formularelor. Această bază de date are
structura prezentată în figura 5.40.
206
Baze de date Capitolul 5
tblFacturi tblDetaliiFacturi
FacturaID ChP FacturaID ChE tblProduse
NrFactura ProdusID ChE ProdusID ChP
Data Cantitate Denumire
FurnizorID ChE Observatii UM
Pret
..............
tblFurnizori
FurnizorID ChP
Furnizor Fig. 5.40. Diagrama bazei de
CodFiscal
...........
date
Vom crea un raport simplu care să ne afişeze toate produsele din tabelul
tblProduse, folosind procedura AutoReport. Pentru aceasta vom parcurge
următorii paşi:
1. Deschidem baza de date din figura 5.40 care are completate tabelele
cu date.
207
Baze de date Capitolul 5
4. Selectăm opţiunea AutoReport: Tabular.
5. Din lista derulantă din partea de jos, alegem tabelul tblProduse care
va fi sursa pentru raportul nostru.
După cum se vede, acest raport ar mai trebui aranjat puţin, în special la
alinierea coloanelor, dar pentru că l-am obţinut atât de uşor, îl putem
accepta şi aşa.
208
Baze de date Capitolul 5
Se ştie că în spatele fiecărui raport se află, fie un tabel, fie o interogare.
Prin urmare, primul pas care trebuie să îl facem este identificarea acelui
tabel sau crearea interogării. La primul exemplu de raport am folosit un
tabel, la următorul exemplu vom folosi o interogare.
209
Baze de date Capitolul 5
Pentru a crea raportul propus vom parcurge etapele următoare:
1. Deschidem baza de date, care conţine interogarea de mai sus.
2. Executăm clic pe pictograma Reports.
3. În fereastra care s-a deschis, execută, dublu-clic pe opţiunea Create
Report by Using Wizard, pentru a lansa aplicaţia Report Wizard, după cum se
vede în figura 5.44.
210
Baze de date Capitolul 5
Se observă că prima grupare se face după câmpul NrFactura, iar a doua
după câmpul Furnizor. Se trece la ecranul următor apăsând butonul Next.
7. În ecranul următor, putem sorta înregistrările din detalii după un anumit
câmp. Noi am ales sortarea ascendentă după câmpul Denumire, după cum
se vede în figura 5.46.
211
Baze de date Capitolul 5
8. În acest ecran aplicaţia ne cere să alegem un model de aranjare a datelor
în raport, figura 5.48.
Alegem prima opţiune Steped, care este mai potrivită pentru raportul
nostru. Tot în acest ecran putem alege forma paginii, Portrait sau
Landscape. Se apasă butonul Next.
9. În ecranul următor aplicaţia ne cere să alegem o formă de prezentare a
raportului, figura 5.49. Alegem opţiunea Formal.
212
Baze de date Capitolul 5
213
Baze de date Capitolul 5
Din analiza acestui raport, se poate afla ce facturi are fiecare furnizor, ce
conţine fiecare factură, se văd totalurile facturilor şi totalul general pe
fiecare furnizor. Este un document util pentru managerii firmei respective.
214
Baze de date Capitolul 5
În principiu, pentru elaborarea rapoartelor performante, se pleacă cu una
din cele 2 metode amintite AutoReport sau Report Wizard, după care se
procedează la editarea acestora pentru a le aduce la forma finală. Prin
editare se pot adăuga sau şterge anumite elemente, conform cerinţelor
practice.
215
Baze de date Capitolul 5
Este evident faptul că obţinerea unor rapoarte aspectuoase şi performante
este legată direct de experienţa pe care o veţi dobândi. Această experienţă
nu e greu de obţinut, trebuie numai să faceţi cât mai multe rapoarte şi să
aveţi răbdarea de a le perfecţiona cât mai mult. Este o muncă migăloasă dar
merită, deoarece formularele sunt cele care se văd din întreaga aplicaţie, şi
pe care le înţelege toată lumea şi de aici pericolul de a fi mereu criticate.
216
Baze de date Capitolul 5
Macrouri
Din cele studiate până acum, am văzut că o bază de date Access este o
colecţie de obiecte, tabele, interogări, formulare, rapoarte etc. Noi am
învăţat să construim aceste obiecte. Toate obiectele unei baze de date
trebuie legate într-un flux continuu de operaţii, care împreună se constituie
într-o aplicaţie de baze de date. Exploatarea unei aplicaţii de baze de date
presupune o mulţime de operaţii manuale care sunt executate de orice
operator implicat.
217
Baze de date Capitolul 5
Deschiderea sau închiderea unor tabele, interogări, formulare sau
rapoarte;
Vizualizarea sau tipărirea rapoartelor;
Rularea cererilor de interogare de acţiune;
Apelarea altor comenzi macro;
Efectuarea condiţionată a anumitor acţiuni;
Căutarea anumitor date în tabele;
Deschiderea sau închiderea unor meniuri din Access;
Afişarea anumitor mesaje;
Ştergerea, redenumirea, copierea sau salvarea diferitelor obiecte ale
aplicaţiei;
Comunicarea cu alte produse soft, cum ar fi Word şi Excel.
De multe ori în practică, este necesar de mai multe acţiuni grupate sub
aceeaşi macrocomandă. Pentru a defini acţiuni multiple, care să se execute
una după alta, trebuie doar să le adăugaţi pe următoarele linii ale ferestrei
Macro Design.
Rularea macrocomenzilor
221
Baze de date Capitolul 5
Rularea unei macrocomenzi din fereastra Database
222
Baze de date Capitolul 5
introduce acţiunea RunMacro care va lansa în execuţie macrocomanda
nominalizată de argumentul Macro Name.
223
Baze de date Capitolul 5
Observaţie importantă!! Dacă doriţi să evitaţi rularea macrocomenzii
AutoExec, menţineţi apăsată tasta Shift în timp ce deschideţi baza de date.
224
Baze de date Capitolul 5
Având deschisă aplicaţia ale cărei opţiuni de pornire vrem să le
automatizăm, dăm comanda Tools – Startup, care va deschide caseta de
dialog din figura 5.60.
Setările din această casetă de dialog sunt destul de evidente. Practic, putem
să înlocuim toată ”faţada” programului Access.
În cele ce urmează vom încerca să creăm câteva pagini HTML direct din
programul Access. Există 2 tipuri de documente pe Internet:
Pagini Web statice;
Pagini Web dinamice.
Pagina Web statică este un document de tip prospect, adică are tot timpul
acelaşi conţinut, cum a avut la crearea sa. Acest tip de documente se pot
crea cel mai simplu dintr-un obiect al bazei de date, folosind metoda
Export. Această metodă creează o pagină Web bazată pe un singur tabel
sau interogare din baza de date curentă.
226
Baze de date Capitolul 5
Această pagină afişează în format HTML rezultatul unei interogări. Tot aşa
puteţi afişa conţinutul unui tabel. Reţineţi că dacă se schimbă ceva în
tabelele de bază ale interogării, această modificare nu se reflectă în pagina
HTML. Când folosiţi această tehnică trebuie să aveţi în vedere acest lucru.
Paginile Web statice, chiar dacă provin din exportul de obiecte din Access,
nu sunt obiecte Access, ele vor fi salvate ca pagini independente cu
extensia *.html, într-un director pe care îl puteţi alege.
227
Baze de date Capitolul 5
Pagina web dinamică este acel document care poate oferi mai multe
informaţii, în funcţie de cererile lansate de utilizator. Un exemplu ar putea
fi formularul creat într-o aplicaţie Access care ne permite să parcurgem
înregistrările unui tabel. Orice modificare în tabelele de bază se va reflecta
în pagina Web dinamică. Acest tip de documente o să ne preocupe în
continuare.
Există două moduri de creare a unei pagini Web dinamice din Access: prin
utilizarea instrumentului Wizard şi constructia lui de la zero în cadrul
ferestrei de proiectare. La fel ca la formulare, nu?
228
Baze de date Capitolul 5
229
Baze de date Capitolul 5
1. Din fereastra Database selectaţi Pages – New.
2. În caseta de dialog New Data Access Page, selectaţi Page wizard, apoi
apăsaţi butonul OK. Puteţi selecta şi o sursă de date, dar nu este obligatoriu.
3. În caseta Page Wizard, selectaţi sursa de date, un tabel sau o interogare,
şi câmpurile pe care doriţi să le afişaţi, apoi apăsaţi butonul OK.
4. În următoarea casetă de dialog puteţi selecta opţiunile de grupare. Dacă
selectaţi o asemenea opţiune, pagina va deveni read-only. Când sunteţi
gata, apoi apăsaţi butonul OK.
5. Următoarea casetă de dialog vă cere să specificaţi o ordine de sortare.
6. Ultima casetă de dialog vă permite să acordaţi paginii un nume, să
selectaţi o temă (fundal) şi să deschideţi pagina în modul Design sau View.
Dacă deschideţi pagina în modul de afişare View, Access o va salva în
dosarul prestabilit; de aceea, dacă doriţi să specificaţi şi locaţia fişierului,
recomandarea este să afişaţi mai întâi pagina în modul Design. Executaţi
clic pe butonul Finish pentru a vă putea vizualiza pagina.
7. Când sunteţi mulţumit de aspectul paginii şi doriţi să o salvaţi, daţi
comanda File – Save As, astfel încât să puteţi specifica şi locaţia fişierului.
În figura 5.65 este prezentată o pagină Web dinamică, obţinută prin această
metodă.
230
Baze de date Capitolul 5
231
Baze de date Capitolul 5
ActiveX este o facilitate avansată a sistemului de operare Windows care
permite crearea unor anumite legături între obiecte precum şi includerea lor
în cadrul bazelor de date Access. Prin obiecte înţelegem fotografii, desene,
grafice, foi de calcul Excel şi documente.
Un alt caz des utilizat este exportul din Access către Excel al unui tabel sau
interogări. În ambele cazuri se foloseşte comanda File - Export. Încercaţi
această comandă pentru cazuri concrete. De multe ori este nevoie ca
anumite informaţii să fie prelucrate şi sintetizate în Excel, înainte de a fi
cuprinse într-un raport.
Importul este operaţia inversă care se execută cu comanda File – Get External
Data – Import. Încercaţi şi funcţionarea acestei comenzi.
232
Baze de date Capitolul 5
argumenteze. Ei folosesc baze de date cum ar fi Oracle, SQL
Server, MySQL care sunt mult mai scumpe.
Ceilalţi dezvoltatori de aplicaţii, au probleme cu folosirea
Access-ului din cauza lipsei de pregătire, deci sunt mai puţin
dispuşi să se aventureze într-un domeniu necunoscut.
Prin urmare, pentru unii este prea simplu iar pentru alţii prea complicat.
Posibilităţile oferite de Access, mai ales ultimele versiuni, sunt de-a dreptul
extraordinare, aşa încât utilizarea lui în firmele mici şi mijlocii pe scară
largă ar fi benefică, mai ales că aplicaţiile ar putea fi abordate cu resurse
proprii.
Exemplele care sunt prezentate în carte sunt inspirate din realitate, au fost
testate înainte de a ajunge aici, aşa că pot fi folosite fără nici o reţinere, ca
modele pentru aplicaţiile pe care le veţi face.
234
Baze de date Anexe
ANEXE
235
Baze de date Anexe
probleme, de genul „nu merge bine”, rezultatele rapoartelor nu sunt corecte
etc., şi toate astea se întâmplă pentru că nu există acel administrator de
bază de date sau de sistem informatic.
SELECT
Este instrucţiunea SQL cea mai utilizată, prima cu care luaţi contact. Se
foloseşte pentru regăsirea(interogarea) datelor din unul sau mau multe
tabele sau vederi. Sintaxa este următoarea:
SELECT NumeColoana1, NumeColoana2, ...
FROM tblTabel1, tblTabel2, ...
[WHERE ...]
[GROUP BY ...]
[HAVING ...]
[ORDER BY ...];
UPDATE
INSERT
INSERT SELECT
237
Baze de date Anexe
DELETE
Instrucţiunea DELETE şterge una sau mai multe linii dintr-un tabel.
Sintaxa este următoarea:
DELETE FROM NumeTabel
[WHERE ...];
DROP
CREATE TABLE
ALTER TABLE
DROP TABLE
238
Baze de date Anexe
Instrucţiunea DROP TABLE este folosită pentru eliminarea unui tabel din
baza de date. Sintaxa este următoarea(exemplu, ştergerea tabelului
tblProduse):
DROP TABLE tblProduse;
CREATE VIEW
Instrucţiunea CREATE VIEW este folosită pentru crearea unei vederi noi a
unuia sau mai multor tabele. Sintaxa este următoarea:
CREATE VIEW NumeVedere AS
SELECT Coloana1, Coloana2, …
FROM Tabel1, Tabel2, ...
[WHERE ...]
[GROUP BY ...]
[HAVING ...] ;
Bibliografie
[3] Susan Sales Harkins, Ken Hensen, Tom Gerhart, Utilizare Microsoft Access
2000, traducere din limba engleză, Editura Teora, 2000.
[4 Năstase Pavel, s.a., Baze de date Microsoft Access 2000, Editura Teora,
2004.
[5] Ben Forta, SQL pentru începători, traducere din limba engleză,
Editura Teora, 2002.
239