ZENOVIC GHERASIM PROGRAMARE ŞI BAZE DE DATE
Universitatea SPIRU HARET
Descrierea CIP a Bibliotecii Naţionale a României GHERASIM, ZENOVIC Programare şi baze de date / Zenovic Gherasim. Bucureşti: Editura Fundaţiei România de Mâine, 2005 236p.; 23,5cm Bibliogr. ISBN: 973-725-096-6 159.91(075.8)
© Editura Fundaţiei România de Mâine, 2005
Redactor: Constantin FLOREA Tehnoredactor: Vasilichia IONESCU Georgiana (GÎRJOI) GHEORGHE Coperta: Maria ANDRONIE Bun de tipar: 16.12.2004; Coli tipar: 14,75 Format: 16/70×100 Editura şi Tipografia Fundaţiei România de Mâine Splaiul Independenţei nr.313, Bucureşti, s. 6, O P. 83 Tel./Fax: 410 43 80; www.spiruharet.ro e-mail:
[email protected]
Universitatea SPIRU HARET
UNIVERSITATEA SPIRU HARET
ZENOVIC GHERASIM
PROGRAMARE ŞI BAZE DE DATE
EDITURA FUNDAŢIEI ROMÂNIA DE MÂINE Bucureşti, 2005
Universitatea SPIRU HARET
Universitatea SPIRU HARET
CUPRINS
Cuvânt înainte ……………………………………………………………………...
9
1. Dată, informaţie şi cunoştinţă. Organizarea datelor în vederea prelucrării automate cu ajutorul calculatoarelor electronice ………………………….… 1.1. Conceptele de societate informaţională – societate a cunoaşterii. Sistem informaţional, sistem informatic, sistem bazat pe cunoştinţe. Dată, informaţie şi cunoştinţă ………………………………………………. 1.2. Noţiuni fundamentale utilizate în organizarea datelor ……………………... 1.3. Relaţiile dintre date …………………………………………………………. 1.4. Structuri de date …………………………………………………………….. 1.5. Modele de date ……………………………………………………………...
11 15 17 19 22
2. Rezolvarea problemelor economice cu ajutorul programelor pe calculator. Programare …………………………………………………………………….. 2.1. Despre necesitatea cunoaşterii şi însuşirii elementelor de bază ale programării 2.2. Noţiuni de bază specifice procesului de prelucrare automată a datelor ……. 2.3. Noţiuni de bază referitoare la programare ………………………………….. 2.4. Elementele de bază ale programării orientate pe obiecte …………………...
25 25 26 28 40
3. Limbajul de programare Visual Basic …………………………………….…. 3.1. Caracteristicile generale ale mediului integrat de dezvoltare Visual Basic … 3.2. Componentele de bază ale mediului integrat de dezvoltare Visual Basic ….. 3.3. Proiectarea aplicaţiilor în limbajul Visual Basic …………………………… 3.3.1. Fişierul proiect ……………………………………………………….. 3.3.2. Crearea interfeţei aplicaţiei …………………………………………... 3.3.3. Precizarea proprietăţilor ……………………………………………… 3.3.4. Scrierea codului ……………………………………………………… 3.3.5. Execuţia aplicaţiei informatice în Visual Basic ……………………… 3.4. Elementele limbajului de programare Visual Basic ………………………... 3.4.1. Unele reguli de scriere ……………………………………………….. 3.4.2. Tipuri de date ………………………………………………………… 3.4.3. Variabile şi constante ………………………………………………… 3.4.4. Instrucţiuni Visual Basic ……………………………………………... 3.4.4.1. Construirea expresiilor ………………………………………. 3.4.4.2. Operatori Visual Basic ………………………………………. 3.4.4.3. Funcţii Visual Basic …………………………………………. 3.4.4.4. Implementarea structurilor de control al execuţiei unui program 3.4.5. Crearea fişierelor în limbajul Visual Basic …………………………... 3.4.6. Exemplu de aplicaţie informatică în limbajul Visual Basic ………….
44 44 45 49 49 51 55 58 60 63 63 64 65 67 67 67 68 70 72 74
11
5
Universitatea SPIRU HARET
4. Teoria bazelor de date şi a sistemelor de gestiune a bazelor de date ……….. 4.1. Organizarea datelor în baze de date. Sisteme de gestiune a bazelor de date .. 4.2. Generaţii de baze de date şi de sisteme de gestiune a bazelor de date asociate 4.3. Baze de date relaţionale …………………………………………………….. 4.4. Baze de date orientate obiect ………………………………………………..
80 80 87 89 93
5. Sistemul de gestiune a bazelor de date Microsoft Access ……………………. 5.1. Prezentarea sistemului Microsoft Access …………………………………… 5.2. Cunoaşterea mediului de lucru Microsoft Access …………………………... 5.2.1. Definirea componentelor principale ale SGBD Microsoft Access …... 5.2.2. Deschiderea şi închiderea unei baze de date în Microsoft Access …... 5.3. Tabelul ……………………………………………………………………… 5.3.1. Crearea unui tabel ……………………………………………………. 5.3.2. Realizarea relaţiilor între tabele ……………………………………… 5.4. Interogarea ………………………………………………………………….. 5.5. Formularul ………………………………………………………………….. 5.6. Raportul …………………………………………………………………….. 5.7. Paginile (Pages) …………………………………………………………….. 5.8. Macroinstrucţiunea (Macro-ul) …………………………………………….. 5.9. Modulul (Module) ………………………………………………………….. 5.9.1. Problematica generală ………………………………………………... 5.9.2. Carateristicile limbajului VBA ………………………………………. 5.9.3. Crearea unui modul standard şi a unei proceduri Sub ……………….. 5.10. Utilizarea evenimentelor într-o bază de date ………………………………
99 99 103 103 105 108 108 114 118 131 140 143 148 153 153 154 155 156
6. Limbajul structurat de interogare, SQL ……………………………………... 6.1. Noţiuni de bază referitoare la SQL …………………………………………. 6.2. Blocurile componente ale operaţiei de regăsire a datelor: SELECT şi FROM 6.3. Operatori utilizaţi în SQL …………………………………………………... 6.3.1. Operatorii aritmetici ………………………………………………….. 6.3.2. Operatorii de comparaţie …………………………………………….. 6.3.3. Operatorii caracter …………………………………………………… 6.3.4. Operatorii logici ……………………………………………………… 6.3.5. Operatorii pentru mulţimi ……………………………………………. 6.3.6. Alţi operatori, IN şi BEETWEEN …………………………………… 6.4. Funcţii în SQL ……………………………………………………………… 6.4.1. Funcţii pentru calculul totalurilor ……………………………………. 6.4.2. Funcţii dedicate pentru dată calendaristică şi oră ……………………. 6.4.3. Funcţii aritmetice …………………………………………………….. 6.4.4. Funcţii caracter ………………………………………………………. 6.5. Clauze utilizate în SQL …………………………………………………….. 6.6. Joncţiuni ……………………………………………………………………. 6.7. Instrucţiuni de manipulare a datelor ………………………………………... 6.8. Crearea şi întreţinerea tabelelor ……………………………………………..
159 159 159 161 161 162 162 163 163 164 164 164 165 165 166 167 168 169 171
7. Elemente fundamentale ale serverelor de baze de date ……………………... 7.1. Arhitectura Client/Server …………………………………………………… 7.2. Serverul de baze de date Microsoft SQL Server …………………………… 7.3. Noţiuni privind limbajul Transact_SQL pentru Microsoft SQL Server ……. 7.4. Serverul de baze de date Oracle ……………………………………………. 7.5. Caracterizarea limbajului PL/SQL pentru serverul de baze de date Oracle ...
173 173 176 180 188 191
6
Universitatea SPIRU HARET
7.6. Noţiuni privind utilitarul SQL*Plus din compunerea serverului de baze de date Oracle ………………………………………………………………. 7.7. Alte servere de baze de date ………………………………………………...
194 196
8. Baze de date distribuite ………………………………………………………... 8.1. Despre necesitatea bazelor de date distribuite în aplicaţiile economice ……. 8.2. Concepte fundamentale …………………………………………………….. 8.3. Fragmentarea datelor în bazele de date distribuite …………………………. 8.4. Gestiunea tranzacţiilor ……………………………………………………… 8.5. Protecţia bazelor de date distribuite ………………………………………... 8.6. Baze de date online …………………………………………………………. 8.6.1. Problematica generală ……………………………………………….. 8.6.2. Pagini Web statice şi dinamice ………………………………………. 8.7 Visual Basic.NET şi bazele de date distribuite ……………………………...
197 197 197 203 205 207 212 212 214 216
9. Baze de date în tehnologii avansate …………………………………………... 9.1. Bazele de date deductive …………………………………………………… 9.2. Bazele de date multidimensionale ………………………………………….. 9.3. Bazele de date multimedia ………………………………………………….. 9.4. Bazele de date relaţionale orientate obiect ………………………………….
219 219 221 223 225
Bibliografie …………………………………………………………………………
227
Anexă: Abrevieri şi noţiuni utilizate în lucrare …………………………………….
231
7
Universitatea SPIRU HARET
8
Universitatea SPIRU HARET
Cuvânt înainte
Această lucrare este destinată studenţilor facultăţilor economice care studiază disciplina Informatică de gestiune (Limbaje şi SGBD). Cartea poate fi utilă şi studenţilor din alte facultăţi care studiază limbaje de programare şi sisteme de gestiune a bazelor de date. În acelaşi timp, ea poate fi utilizată ca punct de plecare pentru revizuirea şi completarea cunoştinţelor de către absolvenţii de facultate care urmează cursurile de masterat. Parcurgerea cărţii presupune ca studentul să-şi fi însuşit deja cursurile de Informatică de gestiune (Bazele informaticii) şi Birotică. Lucrarea conţine noţiunile şi conceptele de bază din teoriile moderne ale programării şi ale bazelor de date, precum şi elementele fundamentale privind aplicarea acestora în domeniul economic prin folosirea limbajului de programare Visual Basic, a sistemului de gestiune a bazelor de date relaţionale Microsoft Access şi a limbajului structurat de interogare SQL. În carte au fost incluse mai puţine aplicaţii economice complexe, deoarece studentul are la dispoziţie lucrarea Aplicaţii economice în Visual Basic şi Access, apărută în Editura Fundaţiei România de Mâine, în anul 2003. De asemenea, în acest volum au fost cuprinse problemele de bază ale serverelor de baze de date, ale bazelor de date distribuite şi ale bazelor de date în tehnologii avansate, inclusiv ale depozitelor de date ca o trecere de la domeniul prelucrărilor tranzacţionale on-line (OLTP) către cel al prelucrărilor analitice on-line (OLAP) şi o introducere pentru disciplina care va fi parcursă în anii următori de studii Sisteme informatice de asistare a deciziei. De altfel, însuşirea cunoştinţelor de la cursul de Informatică de gestiune (Limbaje şi SGBD) condiţionează înţelegerea şi celorlate cursuri de specialitate Informatică de gestiune (Proiectarea sistemelor informatice), Auditarea sistemelor informatice şi Sisteme expert de gestiune. Pentru întocmirea lucrării, s-au folosit numeroase referinţe bibliografice atât din literatura autohtonă, cât şi din cea străină.
Noiembrie 2004
Autorul,
9
Universitatea SPIRU HARET
10
Universitatea SPIRU HARET
1. DATĂ, INFORMAŢIE ŞI CUNOŞTINŢĂ. ORGANIZAREA DATELOR ÎN VEDEREA PRELUCRĂRII AUTOMATE CU AJUTORUL CALCULATOARELOR ELECTRONICE
1.1. Conceptele de societate informaţională – societate a cunoaşterii. Sistem informaţional, sistem informatic, sistem bazat pe cunoştinţe. Dată, informaţie şi cunoştinţă Noţiunea de societate informaţională (Information Society) descrie o economie şi o societate în care colectarea, stocarea, prelucrarea, transmiterea, diseminarea şi utilizarea informaţiilor şi cunoştinţelor, inclusiv dezvoltarea tehnicilor de comunicaţie interactivă, au un rol decisiv. Factorii semnificativi în această dezvoltare sunt: înalta tehnologie (HighTech), industria, lumea lucrului (Work World), precum şi toate formele de cultură în societate. Societatea informatică este o parte a societăţii informaţionale care foloseşte progresele tehnicii de calcul în toate domeniile de activitate economico-socială. Societatea bazată pe cunoştinţe (Knowledge-Based Society) este o parte a societăţii informatice care utilizează IT&C preponderent pentru prelucrarea datelor sub formă de cunoştinţe. Considerând un nivel superior (pe modelul de dezvoltare în spirală al societăţii umane), cel mai cuprinzător concept este cel de societate a cunoaşterii (Knowledge Society). Societatea cunoaşterii este fundamentată pe acumularea şi utilizarea de date sub formă de informaţii şi cunoştinţe la nivel social. După acad. Mihai Drăgănescu [11], societatea cunoaşterii reprezintă mai mult decât societatea informaţională şi decât societatea informatică, înglobându-le de fapt pe acestea. Societatea cunoaşterii foloseşte piese (pieces) ale cunoaşterii. Societatea informaţională are la bază sistemele informaţionale, societatea informatică – sistemele informatice, iar societatea bazată pe cunoştinţe se fundamentează pe sistemele bazate pe cunoştinţe (Knowledge-Based Systems). Sintagma folosită de Romano Prodi, fostul preşedinte al Comisiei Europene, este de economie bazată pe cunoştinţe (Knowledge-Based Economy, KBE); această KBE reprezintă cea mai rafinată parte a noii economii (New Economy), prin noua economie înţelegându-se economia specifică societăţii informaţionale– societăţii cunoaşterii (SI - SC). În Dicţionarul explicativ al limbii române, sistemul este definit ca fiind un ansamblu de elemente dependente (componente, principii, reguli, relaţii etc.) care formează un întreg organizat, pe baza unui plan prestabilit, cu scopul realizării unui anumit obiectiv. 11
Universitatea SPIRU HARET
Sistemul informaţional reprezintă acel sistem de prelucrare a informaţiilor, împreună cu resursele organizaţionale asociate, cum sunt resursele umane, tehnice şi financiare ce furnizează şi distribuie informaţia. Ierarhia informaţională a SI-SC este prezentată în fig.1.1. Sistemul informatic reprezintă partea automatizată a sistemului informaţional ce realizează prelucrarea datelor şi informaţiilor folosind un sistem de calcul; este un ansamblu de echipamente şi programe pe calculator (software) care asigură prelucrarea datelor. Sistemul bazat pe cunoştinţe este o parte a sistemului informatic care procesează cunoştinţe într-o cantitate determinantă şi semnificativă. După acad. Mihai Drăgănescu, cunoştinţa este informaţie cu înţeles şi informaţie care acţionează. Cunoştinţa semnifică ceea ce este cunoscut. Într-o altă percepţie, cunoştinţele sunt informaţii dobândite prin instruire (educaţie) şi practică (experienţă). La modul general, datele sunt reprezentate convenţional prin numere, mărimi, relaţii etc. şi sunt folosite la rezolvarea problemelor sau sunt obţinute printr-o activitate de cercetare. Informaţia reprezintă elementele de noutate despre un fenomen, proces etc. Noutatea caracteristică noţiunii de informaţie este percepută de utilizator numai în momentul intrării în contact cu această informaţie. Ca urmare, din punct de vedere informatic, datele sunt informaţii sau cunoştinţe reprezentate simbolic şi înregistrate în vederea gestionării (evidenţei) şi/sau prelucrării. Rezultatul prelucrării este tot o dată care, prin interpretare, se transformă iniţial în informaţie şi apoi (nu întotdeauna) în cunoştinţă.
SOCIETATEA CUNOAŞTERII
Fig.1.1. Ierarhia informaţională a societăţii informaţionale-societăţii cunoaşterii 12
Universitatea SPIRU HARET
Caracterul de dată, informaţie sau cunoştinţă este relativ (adică se schimbă în funcţie de contextul ce defineşte însuşirea de noutate pentru informaţie şi de înţeles şi utilitate prin acţiune pentru cunoştinţă). De exemplu, şeful Georgescu îi dă ca sarcină subalternului Ionescu să înregistreze zilnic, pe ore, prezentarea clienţilor la filiala băncii, pentru efectuarea diferitelor operaţiuni, pe categorii de clienţi – persoane fizice (retail) şi persoane juridice (corporate). Ionescu îşi desfăşoară activitatea într-un birou la intrarea în sectorul de front-office. El constată că primii clienţi sosiţi la ora 09.01, la deschiderea băncii, sunt în număr de trei, două persoane fizice şi o persoană juridică şi că ora arătată de ceasul electronic din birou este de 9 şi un minut (09.01). 09.01 este o dată pentru că reprezintă informaţia înregistrată de ceas despre momentului efectuării primei observaţii în ziua respectivă de către Ionescu. Interpretată de Ionescu, data (valoarea de 09.01) se transformă în informaţia că ora este de 9 şi un minut. În acest fel, Ionescu intră în posesia unei informaţii despre ora sosirii clienţilor în data de 2 iulie. Data calendaristică 2 iulie, înainte de a fi înregistrată de Ionescu, reprezintă informaţia de identificare a zilei calendaristice. Aceeaşi informaţie este comunicată şi şefului Georgescu. Meticulos, Ionescu întocmeşte un tabel cu următorul cap de tabel: data, ora şi minutul, număr clienţi persoane fizice, număr clienţi persoane juridice. În prima linie a tabelului notează: 2 iulie, 09.01, 2, 1, elemente ce reprezintă date (elemente ce şi-au pierdut caracterul de noutate pentru Ionescu şi Georgescu, dar care sunt informaţii înregistrate sau notate pentru oricare alt utilizator). În ziua de 2 iulie procedează la fel cu toţi clienţii filialei băncii. Pe data de 3 iulie, Ionescu, constată că la ora 09 şi 14 minute sosesc doi clienţi persoane fizice. 09.14 iniţial este o dată, ca informaţie înregistrată de ceasul electronic, care interpretată de Ionescu, devine informaţie. Ionescu comunică imediat informaţiile despre dinamica sosirii clienţilor băncii şefului său, dar nu are timp să le înregistreze în tabel în ziua respectivă, astfel încât, până a doua zi, când le înregistrează, acestea îşi pierd însuşirea de noutate, transformându-se în cunoştinţe despre dinamica sosirii zilnice a clienţilor băncii, cunoştinţe ce sunt utile pentru perfecţionarea serviciilor asigurate de personalul sectorului de front-office al filialei băncii. Pe data de 4 iulie, Ionescu înregistrează, înainte de deschiderea filialei băncii, pe a noua linie din tabel: 3 iulie, 09.14, 2, 0, (similar, pe liniile următoare) elemente ce reprezintă date, cunoştinţe înregistrate sau notate. Tot pe data de 4 iulie, Ionescu înregistrează în tabel datele ce reprezintă informaţiile aferente zilei respective: 4 iulie, 09.08, 2, 3, elemente ce sunt date ce reprezintă informaţii înregistrate sau notate. La sfârşitul lunii, Ionescu prezintă şefului Georgescu tabelul solicitat cu dinamica sosirii zilnice a clienţilor băncii, împreună cu următoarele elemente de sinteză: valorile statistice procentuale clienţi persoane fizice – clienţi persoane juridice şi cu un grafic cu numărul de clienţi sosiţi pe zile şi ore. Tabelul întocmit de Ionescu conţine datele obţinute prin înregistrarea informaţiilor şi/sau cunoştinţelor despre dinamica sosirii clienţilor filialei băncii şi datele statistice obţinute prin prelucrarea acestora, reprezentate valoric sau sub formă de grafic. Interpretate de Georgescu, la prima citire, aceste date devin informaţii, după care documentul ce conţine tabelul, valorile statistice privind categoriile de clienţi şi graficul sosirii clienţilor cu date despre ora şi minutul sosirii acestora este introdus într-un dosar (folder). Este important de precizat că dosarul cu filele documentului conţine date care citite acum, reprezintă cunoştinţe despre dinamica sosirii clienţilor. La sfârşitul anului, 13
Universitatea SPIRU HARET
Ionescu îşi foloseşte abilităţile în utilizarea instrumentelor birotice oferite de calculatorul electronic şi întocmeşte o situaţie de sinteză cu dinamica sosirii clienţilor pentru semestrul II al anului. Concluziile rezultate din sinteză reprezintă, în primul moment, informaţii atât pentru Ionescu, cât şi pentru şeful lui, Georgescu, după care devin cunoştinţe înregistrate sub formă de date în documentul de sinteză. Delimitarea între cele trei concepte înrudite – informaţii, cunoştinţe şi date este fundamentală pentru clarificările conceptuale ale SI-SC. Sistemele de calcul electronic (calculatoarele electronice) au prelucrat, încă de la apariţia lor, date care, uneori, s-au prezentat sub formă de informaţii, alteori sub formă de cunoştinţe. Se apreciază [51] că în ultimii 20 de ani preocupările privind îmbunătăţirea fluxului de informaţii în derularea afacerilor au determinat generalizarea utilizării conceptului de informaţie. La acest lucru au contribuit, în principal, evoluţiile tehnologice care au făcut posibilă înregistrarea masivă a informaţiilor în baze de date, folosind sistemele de calcul, trecându-se astfel direct de la conceptul de informaţie la conceptul de dată şi reciproc, prin obţinerea de noi informaţii prin interpretarea datelor înregistrate şi prelucrate prin utilizarea sistemelor de calcul. Valoarea informaţiei constă în potenţialul acesteia de a fi transformată în cunoaştere [51], prin interpretarea la nivel de individ sau grup de indivizi. Atunci când o persoană interpretează informaţia în aşa fel încât să o poată utiliza, informaţia se transformă în cunoaştere. De exemplu, în cazul unui agent de bursă ce urmăreşte evoluţia indicilor bursieri, informaţia pe care o receptează prin citirea punctajelor respective (date înregistrate electronic) îi asigură cunoaşterea pe baza căreia ia decizia de acţiune pentru clientul său. Cunoaşterea reprezintă un amestec dinamic de experienţe sociale, valori spirituale şi informaţii contextuale, precum şi experienţă personală profesionalizată ce formează cadrul de evaluare şi încorporare de noi experienţe şi informaţii. Cunoaşterea îşi are începuturile şi se foloseşte în mintea cunoscătorilor. În organizaţii, adesea, cunoaşterea este materializată nu numai prin datele din documente sau arhive, ci şi în cutumele, rutina, procesele, practicile şi normele organizaţionale. Acumularea de informaţii şi cunoştinţe conduce, la nivel social, la cunoaştere (în vederea gestionării, prelucrării şi utilizării). Cunoaşterea reprezintă informaţie tezaurizată în experienţa unui individ sau a unei colectivităţi. Ceea ce are mai valoros experienţa umană este depozitat, în acelaşi timp, sub formă de date pe diferitele mijloace de stocare, care, interpretate, generează noi informaţii ce îmbogăţesc cunoaşterea ca proces social. Cunoaşterea nu reprezintă o creaţie originală, ci este procesul de descoperire treptată a complexităţii universului real reprezentat de realitatea înconjurătoare, naturală şi socială, şi de reconfigurare, re-relaţionare continuă a componentelor acesteia descoperite anterior cu informaţii nou primite, în încercarea de a se ajunge la cunoaşterea întregului pe care îl reprezintă realitatea aceasta atât de complexă. Produsele anterioare ale cunoaşterii devin elemente componente ale unei cunoaşteri din ce în ce mai vaste [51]. „Oceanul” informaţional actual necesită nu numai eforturi de stocare a datelor, informaţiilor şi cunoştinţelor, ci mai cu seamă de selecţie, la momentul oportun, a celor mai relevante şi utile dintre acestea. 14
Universitatea SPIRU HARET
Aşa cum s-a arătat, societatea cunoaşterii reprezintă mai mult decât societatea informaţională şi decât societatea informatică, înglobându-le de fapt pe acestea. Cunoaşterea este informaţie cu înţeles şi informaţie care acţionează. De aceea, societatea cunoaşterii nu este posibilă decât inclusă în societatea informaţională şi nu poate fi separată de aceasta (fig.1.1). În acelaşi timp, ea este mai mult decât societatea informaţională prin rolul major care revine informaţiei–cunoaştere în societate. Cel mai bun înţeles al societăţii cunoaşterii este probabil acela de societate informaţională şi a cunoaşterii [11]. Societatea cunoaşterii are în vedere [11]: – extinderea şi aprofundarea cunoaşterii ştiinţifice şi a adevărului despre existenţă; – utilizarea şi managementul cunoaşterii existente sub forma cunoaşterii tehnologice şi organizaţionale; – producerea de cunoaştere tehnologică nouă prin inovare; – diseminarea fără precedent a cunoaşterii către toţi cetăţenii prin mijloace noi, folosind cu prioritate Internetul şi cartea electronică; utilizarea metodelor de învăţare prin procedee electronice (e-learning). În societatea cunoaşterii se formează o nouă economie (New Economy sau e-conomy) care cuprinde şi economia Internet sub forma afacerilor electronice (e-business). De aceea, economia nouă este economia societăţii informaţionale şi a cunoaşterii. În concluzie, informatica este ştiinţa prelucrării automate a datelor. Informatica de gestiune este acea parte a informaticii care prelucrează automat datele de evidenţă şi control vehiculate în cadrul unei organizaţii economice. Ca urmare, esenţa tuturor sistemelor informatice prezentate mai sus este gestionarea datelor care, interpretate de factorul uman, devin uneori, aşa cum s-a arătat în acest paragraf, informaţii sau cunoştinţe. 1.2. Noţiuni fundamentale utilizate în organizarea datelor Datele sunt stocate în memoria internă şi memoria externă a oricărui sistem de calcul. Organizarea datelor se referă la procesul de definire şi structurare a datelor în colecţii de date, precum şi la realizarea legăturilor între elementele unei colecţii şi între colecţiile de date. Organizarea datelor se proiectează în scopul regăsirii automate a acestora după diverse criterii. Obiectivele organizării datelor sunt, în principal, următoarele: • timp de acces minim la date; • apariţia o singură dată a datelor în sistem; • spaţiu de memorie internă şi externă pentru date cât mai mic; • reflectarea prin organizare a tuturor legăturilor dintre procesele economice pe care aceste date le reprezintă; • posibilitatea modificării structurii datelor şi a relaţiilor dintre date fără a produce schimbări în programele care le gestionează. Tehnicile de organizare a datelor în colecţii de date sunt: fişierul de date şi baza de date. 15
Universitatea SPIRU HARET
Fişierul de date reprezintă o colecţie de date memorată pe un suport tehnic într-o succesiune de înregistrări. Accesul la o înregistrare din fişierul de date se obţine prin parcurgerea înregistrărilor fişierului în secvenţa în care au fost stocate (acces secvenţial) sau pe baza unei chei de identificare care să permită regăsirea rapidă a înregistrării (acces direct). Accesul direct se obţine prin indexarea fişierelor, adică prin crearea unor tabele de indecşi care pentru fiecare valoare a atributului cheie primară (atribut care permite identificarea în mod unic a unei înregistrări din fişier) să conţină adresa corespunzătoare (în cadrul fişierului) a fiecărei înregistrări. Sistemele informatice moştenite foloseau cu preponderenţă organizarea datelor în fişiere de date. Această organizare a datelor în fişiere de date prezintă următoarele dezavantaje [18]: • redundanţă mare (stocarea aceloraşi date în mai multe fişiere); • acces dificil la date; exploatarea multiutilizator a datelor necesită operaţii suplimentare de sortare, fuziune, ventilare etc.; • izolarea datelor, adică nu pot fi realizate programe pe calculator care să acceseze datele într-o manieră globală; • actualizarea datelor, prin adăugare, modificare, ştergere, generează conflicte atunci când mai mulţi utilizatori doresc să modifice simultan aceleaşi date; • dependenţa programelor faţă de date; deoarece datele se descriu în programe, modificările din structura datelor obligă la efectuarea de corecturi în programele pe calculator; • problemele neprevăzute nu obţin răspunsuri rapide; • fiecare dată este descrisă independent în toate fişierele în care apare; dacă într-un fişier se modifică formatul şi valoarea unei date, acea modificare nu se transmite automat, pentru aceeaşi dată, în toate fişierele de date; ca urmare, pentru aceeaşi dată se creează posibilitatea apariţiei de valori diferite în fişiere diferite (inconsistenţa datelor); • nu se menţine integritatea datelor, atunci când fişierul este realizat cu limbaje diferite. Creşterea necesarului de date, informaţii şi cunoştinţe pentru agenţii economici şi progresele tehnologiilor informaţiei şi ale comunicaţiilor (IT&C) au determinat organizarea datelor în baze de date (teoria bazelor de date este expusă pe larg în capitolul 4 al lucrării). O bază de date este un fişier format din înregistrări (records) sau rânduri, fiecare conţinând câmpuri (fields) sau coloane şi o mulţime de operaţii de căutare, sortare, recombinare etc. În proiectarea şi înţelegerea unui sistem informatic, organizarea datelor reprezintă o etapă fundamentală care presupune: 1) definirea, structurarea, ordonarea şi gruparea datelor în colecţii de date omogene; 2) stabilirea legăturilor între date, între elementele unei colecţii de date şi între colecţiile de date, după o ierarhie bine precizată; 3) memorarea datelor pe un suport informaţional prelucrabil într-un sistem de calcul. Noţiunile fundamentale folosite în organizarea datelor sunt entitatea, atributul şi valoarea. Între acestea există legături de interdependenţă astfel: – o entitate are mai multe atribute, iar atributele au o anumită mulţime de valori; 16
Universitatea SPIRU HARET
– entitatea reprezintă un obiect concret sau abstract definit prin proprietăţile sale; – orice proprietate a unui obiect este exprimată printr-o pereche (ATRIBUT, VALOARE). Exemplul a) - „materialul M are lungimea mare” unde „lungimea” este atributul, iar „mare” este valoarea. (LUNGIMEA, MARE); Exemplul b) – un client – persoană fizică al unei societăţi comerciale poate fi reprezentat prin mulţimea de perechi: (NUME, POPESCU); (PRENUME, ION); (LOCALITATE, BUCUREŞTI); (TELEFON, 0213211231); (BANCA, BCR); (CONT_BANCAR, RO15RZBR0000070002170022). Mulţimea atributelor M_ATR = (NUME, PRENUME, LOCALITATE, TELEFON, BANCA, CONT_BANCAR) poate fi asociată mai multor clienţi ai societăţii comerciale. Ca urmare, atributele nu caracterizează doar o entitate, ci o clasă de entităţi care este denumită entitate de grup. Elementele unei entităţi de grup prezintă drept caracteristică aceeaşi mulţime de atribute. Ca urmare, entităţile din cadrul unei entităţi de grup sunt de acelaşi tip, definindu-se astfel un tip de entitate. Atributul este denumit şi câmp sau caracteristică. Un câmp poate lua o anumită clasă de valori, fiind caracterizat de natura acestei clase de valori (de exemplu, atributul este numeric dacă ia valori numerice, atributul este alfanumeric dacă clasa de valori este reprezentată de şiruri de caractere etc). Atributele compuse se obţin prin concatenarea mai multor atribute elementare. Atributul care identifică în mod unic o entitate se numeşte atribut-cheie. Caracteristicile care nu identifică în mod unic o entitate se numesc atribute non-cheie. Noţiunea de dată a fost prezentată pe larg în paragraful precedent. Din punctul de vedere al compunerii, datele se clasifică în: date elementare sau scalare, adică data nu se mai divide în raport cu informaţia sau cunoştinţa pe care o reprezintă; date compuse, adică formate din mai multe date elementare. Din punct de vedere logic, o dată este definită prin identificator, atribut şi valoare. De exemplu: MATERIAL – identificator PRET_UNITAR – atribut 120000 – valoare Din punct de vedere fizic, unei date îi corespunde o zonă de memorie de o anumită mărime care se află la o adresă absolută. 1.3. Relaţiile dintre date Între date există relaţii sau legături diferite. Între datele care aparţin unor tipuri de entităţi se pot realiza două feluri de legături: – prima legătură se exprimă prin apartenenţa datelor la entitate; – a doua legătură se defineşte pentru entităţile de acelaşi tip sau de tipuri diferite. 17
Universitatea SPIRU HARET
Exemple: a) Dacă se notează cu SALARIATI mulţimea salariaţilor unei societăţi comerciale, între datele a1 şi a2 ce aparţin acestei mulţimi, se pot defini relaţii de tipul: – a1 are aceeaşi funcţie de încadrare cu a2; – a1 are acelaşi salariu cu a2; – a1 are aceeaşi vârstă cu a2 etc. b) Se consideră două clase de entităţi: PRODUSE_BANCARE şi CLIENTI. Între datele acestor două clase de entităţi se pot defini relaţiile: – un produs bancar poate fi achiziţionat de unul sau mai mulţi clienţi ai băncii; – un client al băncii poate achiziţiona unul sau mai multe produse bancare. Relaţia binară Dacă se notează cu F mulţimea furnizorilor unei societăţi comerciale, se afirmă că relaţia „oferă acelaşi produs cu” asociază fiecărui furnizor din mulţimea F pe toţi cei care oferă acelaşi produs, cu condiţia să facă parte din mulţimea F. Acest aspect poate fi pus în evidenţă prin intermediul unei mulţimi de perechi ordonate (f1, f2) cu proprietatea că elementelor f1 le sunt asociate elementele f2 prin relaţia „oferă acelaşi produs cu”. L = {(f1, f2) ∈FxF/f1,f2 ∈F şi „f1 oferă acelaşi produs cu f2”}. Se face menţiunea că folosirea notaţiilor F şi L pentru definiţiile prezentate mai jos este realizată cu scop didactic şi nu reduce generalitatea acestor definiţii. Definiţie. Fie F o colecţie oarecare de date nevidă. Se numeşte relaţie binară pe F o submulţime L a produsului cartezian F x F care satisface o proprietate (legătură). Prin notaţia (f1, f2) ∈L se înţelege că ”f1 este în relaţia sau legătura L cu f2“ sau”f1 este asociat lui f2 prin relaţia L”. Se foloseşte şi notaţia f1 L f2. Definiţie. Fie F o mulţime nevidă de date. O relaţie binară L definită pe F se numeşte relaţie de echivalenţă dacă este reflexivă, simetrică şi tranzitivă. a. Relaţia sau legătura L definită pe mulţimea F este reflexivă dacă pentru oricare f1∈F, se realizează f1 L f1. b1. Relaţia L definită pe mulţimea F este simetrică dacă (∀) f1, f2 ∈F şi f1 L f2 implică f2 L f1. b2. Relaţia L definită pe mulţimea F este antisimetrică dacă (∀) f1, f2 ∈F, f1 L f2 şi f2 L f1 implică f1=f2. c. Relaţia L definită pe F este tranzitivă dacă (∀) f1, f2, f3 ∈F cu proprietatea că f1 L f2 şi f2 L f3 atunci rezultă că f1L f3. Definiţie. Fie F o colecţie de date. Dacă pentru (∀) f1, f2, ∈F, cu proprietatea că f1 L f2 sau f2 L f1 se afirmă că relaţia dintre elementele colecţiei este relaţie de ordine totală. Definiţie. Fie F o colecţie de date. Dacă o relaţie binară L, definită pe F este reflexivă, antisimetrică şi tranzitivă, atunci relaţia L este o relaţie de ordine. 18
Universitatea SPIRU HARET
Definiţie. Dacă o relaţie binară L, definită pe F este reflexivă şi tranzitivă, atunci relaţia L este o relaţie de preordine. 1.4. Structuri de date Structura de date este o colecţie de date între care s-a stabilit un ansamblu de relaţii pe baza cărora funcţionează un mecanism de selecţie şi identificare a componentelor. Altfel exprimat, o structură de date reprezintă un anumit aranjament al datelor atunci când sunt stocate în memoria unui calculator. Datele din structurile de date pot fi manipulate cu ajutorul algoritmilor, în mai multe moduri, sortând datele sau căutând un anumit element. Structurile de date, în afara situaţiei de instrumente de programare, servesc pentru stocarea şi modelarea unor date din universul real. Mulţimea de date, asociată structurii de date, poate cuprinde datele unui tip sau ale mai multor tipuri de entităţi. Componentele structurii se identifică prin nume sau prin poziţia pe care o deţin în structură în raport cu ordinea specificată. În situaţia în care pentru localizarea unei componente se parcurg toate celelalte componente dinaintea ei, structura are acces secvenţial. În schimb, atunci când o componentă poate fi selectată fără a ţine seama de celelalte, structura are acces direct. Componentele unei structuri de date sunt date elementare sau sunt ele însele structuri de date. Asupra unei structuri de date se pot efectua următoarele operaţii: • crearea (înseamnă memorarea datelor iniţiale pe suportul de stocare); • actualizarea (schimbarea stării structurii prin adăugare, modificare sau ştergere de elemente, modificarea valorii sau relaţiilor dintre elemente); • consultarea (accesarea componentelor structurii de date); • sortarea (aranjarea elementelor unei structuri de date în conformitate cu criterii prestabilite); • ventilarea (divizarea unei structuri de date în două sau mai multe structuri de date); • fuzionarea (formarea unei structuri de date noi din două sau mai multe structuri de date) etc. Structurile de date care prezintă aceeaşi organizare şi asupra cărora se execută aceleaşi operaţii formează un anumit tip de structuri de date. Tipul de structură de date reprezintă o mulţime ordonată de date între care s-au stabilit anumite relaţii şi pentru care realizarea operaţiilor se efectuează cu un grup de operatori de bază care au o anumită semantică. Dacă se ia în considerare tipul componentelor, structurile de date se clasifică în: • omogene (componentele sunt de acelaşi tip); • eterogene (componentele au tipuri diferite). Când structura de date se descompune în structuri de date de acelaşi tip, atunci structura obţinută este denumită recursivă. După nivelul de structurare al datelor, se deosebesc: • structura fizică (structura de date care se referă la modul de implementare pe suporţi tehnici informaţionali); 19
Universitatea SPIRU HARET
• structura logică (modul de ordonare a datelor şi modul de folosire a operatorilor de tratare a datelor). Dacă se ia în considerare posibilitatea modificării valorilor şi a structurilor, se identifică: • structuri statice – pe tot parcursul existenţei acestora prezintă acelaşi număr de componente şi în aceeaşi ordine (adică au cardinalitate finită, prin cardinalitate înţelegând numărul elementelor mulţimii); • structuri dinamice (permit modificarea valorilor şi a structurii de date prin aplicarea unor operatori; aceste structuri de date au cardinalitate infinită deoarece prezintă un număr nelimitat de componente). O structură logică poate fi implementată atât ca structură statică, cât şi ca structură dinamică. Există însă şi structuri logice ce nu pot fi implementate static. În organizarea datelor trebuie definite atât structura logică, cât şi cea fizică, deorece cele două nivele se condiţionează reciproc. Din punctul de vedere al tipului de structură de date, se deosebesc: • structura de date punctuală (o entitate de grup izolată); • structura de date liniară (când există o relaţie de ordine totală între elementele colecţiei de date; primul element nu are predecesori; ultimul element nu are succesori; între date se stabilesc relaţii de tipul ”unu-la-unu”; când ultimul element coincide cu primul element, structura liniară devine structură circulară sau inelară); • structura de date arborescentă (este denumită şi structură de date ierarhică sau descendentă; acest tip de structură de date se defineşte când există o relaţie de ordine între elementele colecţiei de date; există un element unic care este denumit nodul rădăcină (root node);orice nod diferit de nodul rădăcină prezintă un predecessor imediat unic; orice nod care nu este terminal prezintă un număr finit de succesori imediaţi; între noduri se stabilesc relaţii de tipul ”unu-la-mulţi”); • structura de date reţea (acest tip de structură de date se defineşte când există o relaţie de preordine între elementele colecţiei de date; un nod prezintă mai mulţi predecesori; un nod poate fi predecesor pentru propriul său predecesor; între elementele reţelei se stabilesc relaţii de tipul ”mulţi-la-mulţi”); • structura de date relaţională (acest tip de structură de date este formată din mai multe tabele, relaţii sau tablouri de date elementare). Datele şi structurile de date pot fi predefinite sau definite de utilizator. În tabelul 1.1 se prezintă definirea şi caracteristicile principalelor structuri de date, prin evidenţierea avantajelor şi dezavantajelor pe care le prezintă [59]. Aceste structuri de date se folosesc, în special, în programare, iar unele dintre ele sunt fundamentale şi în teoria bazelor de date (cum este, de exemplu, tabloul sau tabelul (table), care este folosit în structurarea bazelor de date relaţionale, aşa cum se prezintă în capitolul 4 al lucrării). La tablou, indexul se referă la o valoare care permite accesul direct la structura de date fără a mai necesita parcurgerea secvenţială a ansamblului de elemente. Indexul poate fi şi o listă cu cuvinte-cheie şi date asociate care indică locaţiile unde se găsesc fişiere sau înregistrări de pe un suport magnetic. La bazele de date, indexul este o listă cu chei de înregistrări dintr-o bază de date. 20
Universitatea SPIRU HARET
Tabelul 1.1. Definirea şi caracteristicile unor structuri de date Denumire Tablou (table) Tablou ordonat
Coadă (queue)
Stivă (stack)
Listă înlănţuită (chain list)
Arbore binar (binary tree) Arbore bicolor (bicolor tree) Arbore 2-3-4 (2-3-4 tree) Tabel de dispersie (hash table)
Movilă (heap)
Graf (graph)
Definire În programare, listă de elemente, implementată sub forma unui vector de înregistrări sau a unei liste înlănţuite. În bazele de date relaţionale, structură cu linii şi coloane. Structură realizată după metoda „primul sosit, primul plecat”, FIFO (First-In, First-Out) Structură realizată după metoda „ultimul sosit, primul plecat”, LIFO (Last-In, First-Out) Structură de date sub formă de listă în care fiecare element al listei asigură o adresă pentru următorul element consecutiv al listei. Structură de date sub forma unui arbore ordonat de gradul doi. Arbori binari la care fiecare nod dispune de caracteristica culoare – roşie sau neagră. Arbori multicăi în care fiecare nod poate prezenta cel mult patru succesori (fii). Structură de date fundamentată pe transformarea unui domeniu de valori ale unei anumite chei într-un domeniu de indici dintr-un tablou. Tip de arbore binar complet implementat printr-un tablou.
Structură formată din noduri şi arce ca legături dintre noduri.
Avantaje Inserare şi acces rapid, când indexul este cunoscut. Căutare mai rapidă în comparaţie cu tablourile neordonate. Accesul la date se execută în ordinea introducerii acestor date. Accesul la date se execută în ordinea inversă introducerii acestor date. Inserare şi ştergere rapide
Dezavantaje Căutare şi ştergere greoaie, dimensiune fixată
Acces greoi la celelalte elemente.
Căutare greoaie.
Căutare, inserare şi ştergere rapide (arbore echilibrat).
Algoritmul de ştergere este complicat.
Structuri de date complexe.
Structura de date cea mai rapidă (inserare rapidă şi acces rapid pe baza unei chei). Inserare, ştergere şi acces rapide la elementul maxim sau minim. Modelează situaţii din universul real.
Ştergere greoaie. Acces lent atunci când nu se cunoaşte cheia. Acces greoi la celelalte elemente. Anumiţi algoritmi sunt greoi şi complicaţi.
21
Universitatea SPIRU HARET
La arbori, fiecare nod al arborelui, cu excepţia nodului rădăcină, este succesorul unui nod unic. Fiecare nod admite unul sau mai mulţi subarbori ca succesori sau nu deţine nici un succesor şi se denumeşte frunză (leaf). Drumul de lungime n-1 de la nodul αi1 la αin reprezintă o succesiune de noduri (αi1, αi2 ..., αin), în care pentru (∀)αik, k ≠ n, αik+1 este un succesor imediat al lui αik. Înălţimea arborelui reprezintă drumul de lungime maximă. Un arbore care are ordinul superior lui doi se numeşte arbore multicăi. Arborele echilibrat este un arbore la care diferenţa dintre drumurile de la rădăcină la orice nod terminal este cel mult unu. Un arbore este ordonat dacă, într-un mod de parcurgere prestabilit, elementele considerate satisfac o relaţie de ordine. Un arbore binar are zero, unul sau cel mult doi succesori. Un arbore complet (full tree) este arborele în care, fiecare nod, cu excepţia frunzelor, prezintă doi succesori (fii). Tabelele de dispersie sunt structuri de date ce semnifică lista tuturor intrărilor într-un fişier în concordanţă cu numerele de dispersie ce le aparţin. Codurile de dispersie (hash codes) folosite la obţinerea tabelelor de dispersie sunt derivate din codurile ASCII pe baza unor funcţii de dispersie. Movila (heap-ul) serveşte pentru implementarea cozilor cu priorităţi (acele cozi care permit ştergerea elementului cu cheia maximă sau minimă). Graful complet este graful ale cărui noduri sunt conectate două câte două prin intermediul unui arc. Graful orientat este graful în care parcursul pe un arc spre nod se efectuează numai într-un singur sens. 1.5. Modele de date Modelarea datelor serveşte pentru prelucrarea datelor cu ajutorul calculatorului electronic. Definirea unui model de date cuprinde următoarele: • structura modelului; • operatorii care se utilizează la manipularea structurilor de date; • stabilirea regulilor de integritate pentru menţinerea corectitudinii datelor. Definirea structurii modelului cuprinde definirea obiectelor (entităţilor) şi a caracteristicilor asociate (atributelor). Se utilizează următoarele elemente: câmpul (cel mai mic element al structurii), grupul simplu sau compus (set compus din câmpuri multiple şi grupuri) şi înregistrarea (ansamblu de câmpuri sau grupuri care constituie şi elementul generic al structurii). Relaţiile dintre înregistrările unei entităţi (obiect) sau mai multor entităţi (obiecte) independente se materializează într-o legătură dintre o realizare a înregistrării părinte şi una sau mai multe realizări ale înregistrării copil. Prin entitate se înţelege un obiect al universului real supus modelării, obiect caraterizat de o identitate proprie, de o existenţă proprie şi de o familie de caracteristici care semnifică proprietăţile acestui obiect. Relaţiile sunt denumite şi asocieri. Pentru realizarea unei reprezentări grafice (sub formă de diagrame) a structurii modelului se utilizează tehnica entitate-asociere, care constă în identificarea componentelor (entităţilor), identificarea asocierilor dintre entităţi şi codificarea lor, identificarea atributelor şi precizarea atributelor de identificare a entităţilor. Fiecare entitate prezintă mai multe realizări. Legăturile dintre entităţi 22
Universitatea SPIRU HARET
sunt reprezentate prin arce neorientate sau orientate (fig.1.2), care stabilesc legătura între nodurile ce reprezintă entităţile participante la asociere. Semnificaţia legăturii este exprimată printr-un nume acordat legăturii. Legătura se reprezintă cu un nod etichetă (sub formă de romb) dispus pe arc ca nod intermediar.
Fig. 1.2. Reprezentarea relaţiei CLIENŢI-PRODUSE şi a cardinalităţii
Tipul sau forma legăturii se evidenţiază cu ajutorul cardinalităţii. În figura 1.2 este reprezentată grafic cardinalitatea legăturii între CLIENŢI-PRODUSE. Cardinalitatea legăturilor semnifică numărul minim şi numărul maxim de realizări (instanţe) de entitate care pot fi asociate cu o realizare a partenerului de asociere. Cardinalitatea se reprezintă prin perechi de numere, câte o pereche pentru fiecare entitate din cadrul legăturii. Din fig.1.2 se observă că un anumit produs poate fi achiziţionat de mai mulţi clienţi şi un client poate cumpăra mai multe produse. Perechea (1,n) este asociată entităţii CLIENTI şi semnifică faptul că un client poate să achiziţioneze un produs sau poate să achiziţioneze mai multe produse. Perechea (0,n) este asociată entităţii PRODUSE şi semnifică faptul că un produs poate să nu fie achiziţionat de nici un client sau poate să fie achiziţionat de mai mulţi clienţi. Între entităţi se pot stabili următoarele tipuri de legături: 1. După cardinalitatea asocierii şi după gradul asocierii (maximele cardinalităţii) se deosebesc: – asocieri de tipul „unu la unu” (one-to-one); – asocieri de tipul „unu la mulţi” (one-to-many); – asocieri de tipul „mulţi la mulţi” (many-to-many). 2. După cardinalitatea asocierii şi după obligativitatea participării entităţilor la asociere (minimele cardinalităţii) se diferenţiază: – asocieri parţiale (acele asocieri care nu obligă participarea la asociere a tuturor entităţilor vizate); – asociere totale (complete). 3. Simultan, după gradul asocierii şi după obligativitatea participării la asociere, tipurile de legături se diferenţiază în: – asocieri parţiale de tip „unu la unu”; – asocieri totale de tip „unu la unu”; – asocieri parţiale de tip „unu la mulţi”; – asocieri totale de tip „unu la mulţi”; – asocieri parţiale de tip „mulţi la mulţi”; – asocieri totale de tip „mulţi la mulţi”. 4. După numărul de entităţi distincte care participă la asociere se definesc: – asocieri binare (asocieri între două entităţi distincte); – asocieri recursive (asocieri ale entităţilor cu ele însele); – asocieri complexe (asocieri între mai mult de două entităţi distincte). 23
Universitatea SPIRU HARET
Atributele reprezintă proprietăţi distincte ale entităţilor, însă ele se pot referi şi la asocierile dintre entităţi. După complexitate, atributele se clasifică în atribute simple sau elementare şi în atribute complexe (compuse din mai multe atribute elementare). După realizările pe care le pot prezenta atributele, acestea pot fi monovaloare, multivaloare, obligatorii sau opţionale. Un atribut de identificare este denumit cheie, atunci când este caracterizat prin unicitatea valorii sale pentru fiecare instanţă a entităţii (de exemplu, cod_client pentru entitatea CLIENTI, cod_produs, pentru entitatea PRODUSE. Atributele cheie se marchează prin subliniere sau printr-o săgeată spre entitatea căreia îi aparţin. Operatorii utilizaţi în modelele de date sunt citire, memorare, modificare, joncţiune etc. Pentru asigurarea corectitudinii datelor se folosesc reguli de integritate. Cele mai importante modele de date sunt modelul ierarhic, modelul reţea, modelul relaţional şi modelul orientat obiect. Modelul ierarhic conţine ca structuri de bază tipuri de înregistrări care grupează toate atributele unei entităţi. Acest model posedă ierarhia ca tip de structură. Această ierarhie dispune de un tip de înregistrare definit ca rădăcină/root şi mai multe tipuri de înregistrări subordonate, legate sub formă de arbore, motiv pentru care modelul este denumit şi arborescent. Nodul din arbore care nu este rădăcină sau nod final, are un singur nod superior şi unul sau mai multe noduri inferioare. Legătura de la un nod superior la unul inferior este de tipul 1→m, iar legătura de la un nod inferior la unul superior este de tipul 1→1. Datorită existenţei celor două structuri, modelul oferă operatori separaţi, şi anume: • operatori de citire pentru tipul de înregistrare; • operatori de citire pentru tipul ierarhie; • operatori de memorare pentru tipuri de înregistrări; • operatori de memorare pentru ierarhie. În cazul modelului reţea, datele sunt reprezentate ca la modelul ierarhic, cu deosebirea că fiecare inferior poate avea mai mulţi superiori. Structurile specifice modelului reţea pot să fie tipul de înregistrări (asigură atributele unei entităţi) şi tipul de set (asigură legăturile între tipurile de înregistrare). Modelul relaţional este fundamentat pe teoria matematică a relaţiilor, caracterizându-se printr-o singură structură de date şi anume relaţia sau tabelul. Un astfel de model poate fi perceput ca o mulţime de tabele obţinute prin metoda normalizării. Normalizarea porneşte de la o mulţime de atribute sau câmpuri de date şi de la o mulţime de dependenţe funcţionale dintre atribute. Normalizarea permite obţinerea unei scheme conceptuale a modelului relaţional într-o formă normalizată în care se elimină anomaliile de actualizare. Modelul orientat obiect este bazat pe structura denumită clasă de obiecte, definită prin abstractizare din entităţile desemnate (mai multe detalii sunt prezentate în capitolul 3).
24
Universitatea SPIRU HARET
2. REZOLVAREA PROBLEMELOR ECONOMICE CU AJUTORUL PROGRAMELOR PE CALCULATOR. PROGRAMARE
2.1. Despre necesitatea cunoaşterii şi însuşirii elementelor de bază ale programării Rezolvarea problemelor, în general, şi a problemelor economice în particular, cu ajutorul programelor pe calculator necesită cunoaşterea şi însuşirea noţiunilor fundamentale referitoare la programare. Problemele economice prezintă o serie de particularităţi legate de caracterul proceselor şi fenomenelor economice din care fac parte: existenţa unor modele (inclusiv bazate pe relaţii matematice), volumul mare de date stocate în baze de date şi în depozite de date, operaţii relativ puţine şi de complexitate redusă (în comparaţie, de exemplu, cu calculele tehnico-inginereşti), prelucrări şi reprezentări statistice etc. Toate aceste particularităţi sunt luate în considerare la rezolvarea problemelor economice, în special a celor de gestiune. Informatica de gestiune reprezintă în esenţă informatica aplicată în domeniul prelucrării automate a datelor asupra evidenţei şi controlului activităţilor şi bunurilor unei organizaţii economice. Gestiunea unei organizaţii economice constă în totalitatea activităţilor desfăşurate pentru evidenţa resurselor acesteia (umane, materiale, financiare şi informaţionale), încredinţate, spre administrare, factorilor de decizie, pentru realizarea scopurilor specifice domeniului său de activitate. În prezent, dar mai cu seamă în viitor, nu există şi nu va exista nici un loc de muncă fără calculator conectat în reţea, în special în domeniile contabilitate şi financiar-bancar. Viitorul economist trebuie să cunoască principiile şi elementele de bază ale programării şi să câştige deprinderi adecvate, cel puţin din următoarele două motive: • economistul este un creator, şi nu un simplu operator pe calculator; complexitatea şi diversitatea proceselor şi fenomenelor economice presupun o permanentă deschidere spre schimbarea şi perfecţionarea aplicaţiilor informatice economice ce pot fi realizate nemijlocit de către economist; • economistul poartă un dialog permanent cu specialistul informatician în ceea ce priveşte perfecţionarea sistemelor şi instrumentelor informatice complexe dedicate rezolvării problemelor economice. Este inutil să se insiste mai mult, la capitolul motivaţie, asupra importanţei programării şi bazelor de date pentru viitorul economist cu specializarea contabilitate şi informatică de gestiune, în care sintagma informatică de gestiune reprezintă a doua jumătate a întregului. Acest fapt îi conferă viitorului economist dreptul de a profesa şi în categoria profesioniştilor în informatică, dar, în acelaşi timp, generează şi obligaţia de a-şi însuşi în mod corespunzător fundamentele programării şi ale bazelor de date. 25
Universitatea SPIRU HARET
2.2. Noţiuni de bază specifice procesului de prelucrare automată a datelor Orice sistem de calcul (adică acel sistem tehnic care asigură execuţia procesului de prelucrare automată a datelor) are în compunere, în esenţă, partea de hardware şi partea de software. Bill Gates, patronul Microsoft, spunea în anul 2002 că, din totalul costurilor unui sistem de calcul, partea de hardware reprezintă 5%, în timp ce partea de software reprezintă 95%. Problema costurilor unui sistem de calcul devine din ce în ce mai importantă în condiţiile cerute de societatea informaţională – societatea cunoaşterii (concepte prezentate în capitolul 1 al lucrării) şi în conformitate cu prevederile legale referitoare la respectarea legii drepturilor de autor în domeniul software. Partea de software a unui sistem de calcul cuprinde, la rândul ei, software-ul de bază (sistemul de operare sau sistemul de programe de bază) şi software-ul de aplicaţie (sau sistemul de programe aplicative). În continuare sunt prezentate noţiunile de bază specifice procesului de prelucrare automată a datelor. În capitolul 1 al lucrării s-a prezentat noţiunea de sistem informatic. A rezultat astfel că orice sistem informatic conţine unul sau mai multe sisteme de calcul (hard şi soft), cărora li se adaugă restul bazei tehnico-materiale, baza ştiinţifico-metodologică, baza informaţională, resursele umane şi cadrul organizatoric. Baza tehnico-materială conţine echipamentele de culegere, verificare şi transmitere date, echipamentele de teleprelucrare, suporturile de stocare a datelor şi calculatorul propriu-zis. Baza ştiinţifico-metodologică cuprinde modelele matematice ale proceselor şi fenomenelor economice şi metodologii de realizare a sistemelor informatice. Baza informaţională se referă la date, fluxuri şi circuite informaţionale, cataloage şi dicţionare de date etc. Un sistem informatic are funcţia de prelucrare automată a datelor pentru obţinerea informaţiilor necesare procesului de conducere sau de informare. Din cele arătate mai sus, rezultă că procesul de prelucrare automată a datelor presupune existenţa simultană a următoarelor elemente: sistemul de echipamente (hardware), sistemul de programe de bază, sistemul de programe aplicative, datele de intrare ce sunt supuse proceselor de prelucrare automată şi datele de ieşire sau rezultatele prelucrărilor. În esenţă, acest proces de prelucrare automată a datelor este format din trei etape: introducerea (citirea) datelor de intrare, prelucrarea datelor (efectuarea calculelor) şi extragerea (scrierea) rezultatelor. Este de reţinut că datele de intrare sunt introduse printr-o operaţie de citire - read, iar datele ce reprezintă rezultate sunt obţinute printr-o operaţie de scriere –write sau de tipărire - print a rezultatelor (fig.2.1).
CITIRE DATE DE INTRARE
PRELUCRĂRI
SCRIERE REZULTATE
Fig.2.1. Etapele procesului de prelucrare a datelor pe calculator 26
Universitatea SPIRU HARET
Sistemul de operare este realizat cu preponderenţă în limbajul de programare C, este livrat cu licenţă, de regulă, de compania producătoare a părţii hardware a calculatorului şi este specific unui anumit tip de platformă de calcul (Windows, Unix, OS/2 etc). Programele aplicative sunt realizate prin utilizarea limbajelor de programare acceptate de către sistemul de calcul şi de sistemul de operare al acestuia. Datele ce sunt prelucrate pe un sistem de calcul sunt organizate într-o formă avantajoasă pentru aplicaţia informatică şi sunt reprezentate într-o structură accesibilă calculatorului. Datele sunt organizate în colecţii de date (detaliile sunt prezentate în capitolul 4) în funcţie de condiţiile specifice impuse de sistemul informaţional existent şi de dorinţele utilizatorilor finali din procesul de decizie. Procesul de prelucrare automată a datelor are loc într-o succesiune controlată de operator, adică, în accepţiunea clasică, de acel utilizator final specializat în operarea pe sistemul de calcul. Etapele procesului de prelucrare a datelor pe calculator, prezentate în fig.2.1, sunt materializate în următoarele operaţii [18]: • pregătirea datelor iniţiale, de regulă manual, în vederea introducerii lor în procesul de prelucrare automată (citire), ce presupune verificarea, sortarea şi codificarea acestor date în funcţie de documentele primare existente; verificarea datelor presupune confirmarea concordanţei între valorile prezente în documentele primare şi valorile care trebuie să existe în conformitate cu aplicaţia informatică concretă sau problema economică cu urmează a fi rezolvată; sortarea datelor semnifică acel tip de prelucrare prin care datele sunt dispuse într-o anumită ordine, în conformitate cu un anumit sistem sau cu anumite precizări ale utilizatorului; codificarea datelor înseamnă operaţia de atribuire de semne numerice, alfabetice sau alfanumerice unor date cu scopul de a optimiza numărul de semne cu care se scriu şi se prelucrează, de exemplu, elementele specifice sistemului informaţional financiar-contabil; noţiunea de document primar (de evidenţă primară) este cea definită în contabilitate, ca primă etapă a funcţiei contabile, adică acel document în care se consemnează pentru prima dată o operaţie economico-financiară (facturi, chitanţe, cecuri etc). Fiecare eveniment ce prezintă un efect economic se înscrie într-un document primar în momentul şi în locaţia în care s-a produs; • introducerea datelor iniţiale în calculator, adică în memoria internă sau memoria externă a sistemului de calcul; introducerea datelor iniţiale poate fi făcută direct de la tastatură (în regim conversaţional) sau de pe un suport tehnic accesibil calculatorului; • prelucrarea propriu-zisă a datelor, ceea ce înseamnă execuţia automată de către calculator a tuturor operaţiilor prestabilite prin program (validări de date, sortări, interclasări, comparări şi testări); validarea de date este tipul de prelucrare ce constă în verificarea datelor de intrare dacă sunt corecte în raport cu un set de reguli prestabilite (dacă sunt reale, coerente, corelate, corect testate, corect transferate dintr-un mediu într-altul); interclasarea datelor reprezintă tipul de prelucrare prin care se obţine un şir (vector) de date ce conţine toate elementele unor vectori iniţiali ordonaţi; compararea datelor este tipul de prelucrare prin care se verifică existenţa unor relaţii de ordine între două date; relaţia de ordine a fost definită la cursul de matematică şi este o relaţie binară pe o mulţime de date ce stabileşte ordinea de parcurgere a elementelor mulţimii; testarea datelor este tipul 27
Universitatea SPIRU HARET
de prelucrare prin care se verifică un ansamblu de date ce sunt pregătite pentru buna funcţionare a unui program; • prezentarea rezultatelor prelucrării, adică afişarea pe ecranul monitorului sau imprimarea pe hârtie; când rezultatele sunt folosite în prelucrări ulterioare, ele sunt stocate pe suporţi magnetici. Etapele şi operaţiile prezentate mai sus se încadrează în ”triada de aur” specifică oricărui sistem de calcul: stocare – prelucrare– prezentare date. 2.3. Noţiuni de bază referitoare la programare Rezolvarea unei probleme reprezintă procesul de concepere şi de implementare a unei strategii de găsire a unei soluţii sau de conversie la normalitate a unor stări generate de condiţii nedorite sau neaşteptate. În activitatea de concepere a programelor destinate calculatoarelor electronice, problema de rezolvat este definită, detaliată şi transformată într-un proiect pe baza căruia se poate realiza un program ce poate fi rulat pe un sistem de calcul. Înainte de a se scrie efectiv programul, se efectuează analiza problemei de rezolvat şi se realizează algoritmul de calcul. Programul pe calculator este un set de instrucţiuni (comenzi) ce se execută de sistemul de calcul cu scopul de a efectua o succesiune de acţiuni sau un tip prestabilit de activitate. Noţiunea de dată a fost prezentată pe larg în capitolul 1. Instrucţiunea sau comanda semnifică un enunţ ce specifică o acţiune într-un limbaj de programare. Programul pe calculator (sau, mai simplu, programul) are în compunere, de regulă, două tipuri de enunţuri: declaraţii şi instrucţiuni. Declaraţia este asocierea dintre un identificator şi anumite informaţii. Această asociere este formală la realizarea programului şi devine efectivă în timpul compilării sau în timpul execuţiei programului. Declaraţia priveşte modul de organizare a datelor de intrare, pe timpul prelucrării, precum şi a datelor de ieşire (rezultatelor). Identificatorul reprezintă orice şir de caractere alfanumerice ce se foloseşte în calitate de: • nume de variabilă sau constantă într-un program; • etichetă de regăsire a unui punct din program; • nume de procedură sau de funcţie; • nume ataşat unei unităţi logice de memorie externă (hard disc, dischetă, compact disc, memorie flash etc.).
PROGRAM
DATE (STRUCTURI DE DATE)
LIMBAJ DE PROGRAMARE
ALGORITMI Fig.2.2. Compunerea unui program pe calculator 28
Universitatea SPIRU HARET
Dintr-o altă perspectivă, orice program pe calculator reprezintă un ansamblu format din date (structuri de date) şi algoritmi prezentate într-un limbaj de programare (fig.2.2). Noţiunea de algoritm nu are o definiţie riguroasă. Algoritmul este o metodă, un procedeu, o reţetă, o soluţionare a unei probleme, fără însă a realiza echivalenţa cu aceşti termeni. Dicţionarele de informatică definesc algoritmul ca: • o descriere a schemei de realizare a unui eveniment cu ajutorul unei mulţimi finite de acţiuni elementare predenumite, realizabile a priori şi având o durată limitată în timp; • un concept folosit pentru a desemna o mulţime finită de operaţii cunoscute care, executate într-o ordine bine stabilită, pornind de la o mulţime de valori (date) de intrare conduc la obţinerea în timp finit a unei alte mulţimi de valori, valori (date) de ieşire; • o secvenţă finită de paşi prin care se rezolvă o problemă logică sau matematică. În realizarea unui algoritm este necesară satisfacerea următoarelor patru condiţii (proprietăţi): • claritatea, ceea ce înseamnă ca algoritmul să fie bine definit (cu specificaţii riguroase şi fără ambiguităţi); • exactitatea (determinismul), adică în fiecare moment al execuţiei algoritmului, se cunosc cu exactitate următoarea operaţie, precum şi modul de execuţie a fiecărei operaţii; descrierea cu exactitate asigură execuţia algoritmului pe un sistem de calcul; • universalitatea, ceea ce semnifică faptul că orice algoritm, fiind cât mai universal cu putinţă, asigură rezolvarea unei clase largi de probleme; • finitudinea, ce constă în faptul că algoritmul este finit în spaţiu (ca descriere) şi asigură obţinerea rezultatului într-un timp determinat de execuţie, adică după un anumit număr finit de paşi. După gândirea algoritmului, acesta se poate reprezenta sub mai multe forme; dintre aceste forme, cele mai uzuale sunt reprezentarea în limbaj pseudocod şi schema logică. Limbajul pseudocod asigură descrierea algoritmilor prin intermediul a două enunţuri: standard şi nestandard; enunţurile nestandard sunt fraze în limbajul natural ce se folosesc, de regulă, în programare pentru reprezentarea formei iniţiale a algoritmilor; enunţurile standard exprimă operaţii ce dispun de corespondenţe directe în instrucţiunile limbajului de programare. Schema logică asigură reprezentarea sub formă grafică a algoritmilor. Schema logică de program se deosebeşte de schema logică de sistem. Schema logică de sistem descrie operaţiile de prelucrare a datelor pe sistemul de calcul, cu focalizare pe sursele de date, documentele primare ce le conţin, activităţile ce se execută asupra lor, modul de stocare şi de prezentare a rezultatelor prelucrării. Schema logică de sistem este utilizată pentru a oferi o imagine de ansamblu a fluxurilor de date din sistemul de calcul, în timp ce schemele logice de program sunt folosite pentru detalierea anumitor procese reprezentate în schema logică de sistem. Schemele logice de program sunt independente de limbajul de programare utilizat. Schemele logice utilizează simboluri cu semnificaţiile prezentate în figura 2.3. 29
Universitatea SPIRU HARET
BLOC INTRODUCERE/EXTRAGERE DATE (INTRARE/IEŞIRE)
BLOC ATRIBUIRE
BLOC PROCEDURĂ
BLOC DESCHIDERE/ ÎNCHIDERE FIŞIERE
BLOC DECIZIE (SALT CONDIŢIONAT)
BLOC ÎNCEPUT /SFÂRŞIT DE PROGRAM (TERMINATOR)
CONECTORI PE PAGINĂ
CONECTORI DE PAGINĂ
BANDĂ MAGNETICĂ
DOCUMENT IMPRIMAT
LINII DE LEGĂTURĂ ÎNTRE BLOCURI Fig.2.3. Tipuri de blocuri din compunerea schemelor logice 30
Universitatea SPIRU HARET
Pentru realizarea unui program sunt necesare trei tipuri de structuri de control, caracterizate prin aceea că au o singură intrare şi o singură ieşire. Această posibilitate se bazează pe teorema lui Boehm şi Jacopini care arată că orice algoritm poate fi reprezentat ca o combinaţie a celor trei structuri de control fundamentale: secvenţială, alternative şi repetitive. Structura de control secvenţială (liniară) cuprinde o succesiune de blocuri care se execută unul după altul, figura 2.4.a. Structurile de control alternative (cu ramificaţii) corespund unui bloc de prelucrare care se execută în functie de satisfacerea unei condiţii (fig. 2.4.b, c şi d). Aceste structuri de control prezintă următoarele forme: • structura de control alternativă cu două ramificaţii (If…Then…Else), fig.2.4 b; • structura de control alternativă cu mai multe ramificaţii (imbricată), fig.2.4 c; • structura de control alternativă generalizată (Case-Of), fig.2.4 d. Structurile de control repetitive (de ciclare) asigură repetarea prelucrării unor secvenţe de program (fig. 2.4.e). Formele structurilor de control repetitive sunt: • structura repetitivă fără contor condiţionată anterior (While Do); • structura repetitivă fără contor condiţionată posterior (Repeat …Until); • structura repetitivă cu contor condiţionată anterior (Do…For); • structura repetitivă cu contor condiţionată posterior (Do…For). Din punct de vedere structural, un program poate avea în compunere mai multe subprograme sau module. Pot constitui subprograme, componentele programului de tipul procedurilor şi/sau al funcţiilor. Mai multe programe alcătuiesc împreună o aplicaţie informatică (fig.2.5). Clasic, aplicaţia informatică are o structură statică arborescentă, adică este formată dintr-un program principal care apelează subprograme. Subprogramele sunt independente în conformitate cu principiile programării structurate (programe constituite din subprograme sau module şi folosirea structurilor de control fundamentale). Aplicaţia informatică este dedicată unui anumit domeniu de activitate economică (de exemplu, aplicaţie informatică de contabilitate, aplicaţie informatică pentru managementul resurselor umane, aplicaţie informatică pentru gestiunea creditelor bancare etc.). Noţiunea de aplicaţie informatică nu este similară cu aceea de sistem informatic (definit în capitolul 1). Limbajul de programare este un limbaj artificial ce se foloseşte pentru definirea unui şir de instrucţiuni care pot fi prelucrate şi executate pe un calculator. Problematica generală a limbajelor de programare este tratată în finalul acestui paragraf. Procedura (procedure) este o parte componentă, cu nume, a unui program, căreia îi sunt associate constante, tipuri de date şi variabile şi care execută, de regulă, un task unic. Task-ul este un subprogram sau aplicaţie autonomă rulată ca o entitate independentă. Funcţia (function) este un subprogram sau rutină care returnează o singură valoare prin însăşi numele funcţiei. Spre deosebire de funcţie, procedura poate returna mai multe valori atunci când este rulată. Variabila este, în programare, o locaţie de memorie în care se stochează date de un anumit tip şi care pot fi modificate pe timpul execuţiei programului. Constanta desemnează o entitate cu nume ce reprezintă o valoare care nu se modifică pe timpul execuţiei unui program. Structura de date este o schemă de organizare a datelor cu scopul de a 31
Universitatea SPIRU HARET
simplifica operaţiile de prelucrare sau de a uşura interpretarea lor. De exemplu, structura de date din fig.2.6 facilitează interpretarea datelor disponibile despre un client. Există mai multe tipuri de structuri de date: vector, înregistrare, mulţime etc.
Fig. 2.4.c. Structura alternativă imbricată 32
Universitatea SPIRU HARET
i=1
i=n
i=2
SECVENŢA 1
SECVENŢA 2
...
SECVENŢA n
STRUCTURA ALTERNATIVĂ GENERALIZATĂ – CAZUL GENERAL– Fig.2.4.d. Structura de control alternativă generalizată
Instrucţiunea este formată din două elemente distincte: codul operatorului şi operanzii (datele supuse operaţiei elementare reprezentate prin cod). În funcţie de tipul prelucrării pe care o execută, instrucţiunile se clasifică în: • instrucţiuni de prelucrare propriu-zisă; • instrucţiuni de organizare (structurare), care realizează concordanţa logică între algoritm şi succesiunea internă a secvenţelor de program. Instrucţiunile de prelucrare propriu-zisă se grupează în: ¾ instrucţiuni de intrare-ieşire, care stabilesc sensul fluxului de date în sistemul de calcul, fişierul de date asupra căruia se efectuează operaţia şi echipamentul periferic pe care se găseşte acest fişier de date; fişierul de date este o colecţie de date stocată pe un suport tehnic într-o succesiune de înregistrări; ¾ instrucţiunile de calcul, ce precizează natura operaţiei, adresele operanzilor care participă la calcul şi a operaţiei aritmetice; ¾ instrucţiunile de transfer (atribuire), ce realizează transferul datelor, precizând sensul transferului şi adresele operanzilor. 33
Universitatea SPIRU HARET
Fig. 2.4.e. Structuri repetive (de ciclare)
34
Universitatea SPIRU HARET
Subprogram 2
Subprogram 1
Subprogram 1
Subprogram 1
Subprogram 2
Subprogram 2
o o o
o o o
o o o
ooo
Subprogram m
Subprogram n
PROGRAM 1
PROGRAM 2
Subprogram z PROGRAM l
APLICAŢIE INFORMATICĂ Fig.2.5. Noţiunea de aplicaţie informatică
Client
Nume
Prenume
Localitatea
Adresa
Strada
Nr
Bloc
Telefon
Scara
Etaj
Banca
Apart
Fig.2.6. Structura de date Client
35
Universitatea SPIRU HARET
36
Universitatea SPIRU HARET
Fig.2.7. Fazele elaborării unui produs-program
Instrucţiunile de organizare sunt următoarele: ¾ instrucţiunile de comparare (decizie logică), care asigură compararea a doi sau mai mulţi operanzi, rezultatul fiind categorisit ca „adevărat” (True) sau „fals” (False); ¾ instrucţiunile de salt, ce realizează trecerea de la secvenţa de instrucţiuni curentă din program la o secvenţă de instrucţiuni situată în alt punct al programului. Indiferent de limbajul de programare folosit pentru rezolvarea problemei, realizarea unui program presupune parcurgerea următoarelor etape (fig.2.7): 1. Analiza problemei de rezolvat şi realizarea algoritmului, etapă ce presupune elaborarea unui enunţ complet al problemei, stabilirea modalităţilor de organizare şi de reprezentare a datelor de intrare şi de ieşire, elaborarea schemei 37
Universitatea SPIRU HARET
logice de sistem care defineşte echipamentele din configuraţia calculatorului ce participă la procesul de prelucrare a datelor, realizarea algoritmului ce presupune elaborarea şi reprezentarea acestuia în limbaj pseudocod sau sub forma schemei logice de program. 2. Scrierea (introducerea) programului, ce are drept scop codificarea algoritmului, adică conversia acestuia în conformitate cu instrucţiunile unui limbaj de programare; pentru această codificare, se foloseşte un editor de texte; acest editor poate fi independent sau poate face parte din mediul integrat de dezvoltare (IDE); se obţine astfel programul-sursă (codul-sursă al programului), care este scris într-un limbaj similar cu limbajul natural, dar încă inaccesibil sistemului de calcul; 3. Compilarea programului, ce realizează traducerea programului-sursă scris într-un limbaj de programare de nivel înalt în program-obiect, exprimat în instrucţiuni cod-maşină. Această operaţie de traducere se obţine, în mod automat, prin folosirea unei componente a sistemului de operare, numită compilator. După compilare, eventualele erori de codificare existente în program (numite erori de sintaxă ce apar datorită nerespectării sintaxei generale a unei instrucţiuni) sunt depistate şi afişate. Erorile de sintaxă sunt eliminate prin corecţii aduse programului-sursă, după care operaţia de compilare este reluată. Este important de menţionat faptul că în etapa de compilare nu se depistează erorile logice din program; erorile logice sunt greşeli produse la realizarea algoritmului de calcul. 4. Editarea de legături (linkeditarea), ce asigură includerea codului obiect al programului (programul-obiect) într-un ansamblu executabil (programul executabil), care cuprinde şi module specifice sistemului de operare, funcţii de bibliotecă etc. cu ajutorul componentei denumită editor de legături (linkeditor). Eventualele erori ce apar conduc la corecţii în programul-sursă. 5. Testarea logică a programului, care realizează verificarea finală a programului pe baza unui set de date de test ce acoperă domeniul real de valori ale datelor de intrare ce se vor folosi în timpul exploatării programului. Problematica generală a limbajelor de programare Limbajul de programare reprezintă un limbaj artificial ce se foloseşte pentru definirea unui şir de instrucţiuni care pot fi prelucrate şi executate pe un sistem de calcul. Noţiunea de instrucţiune a fost prezentată în paragraful 2.2. Spre deosebire de limbajele naturale (umane), limbajele artificiale au fost create cu scopuri precise: limbaje de programare, limbaje de specificare a programelor, limbaje de descriere a documentelor structurate, limbaje de schimb de date electronice, EDI (Electronic Data Interchange) etc. Limbajele de programare se definesc formal prin alfabet, vocabular şi gramatici (fapt ce permite compilarea sau interpretarea lor). Alfabetul reprezintă mulţimea simbolurilor utilizate pentru scriere în limbajul de programare respectiv. Vocabularul este compus din mulţimea cuvintelor întrebuinţate în limbaj. Gramatica limbajului de programare este reprezentată de ansamblul regulilor de scriere, cu preponderenţă sub aspect sintactic (mulţimea regulilor de formare a instrucţiunilor), cu luarea în consideraţie a regulilor de punctuaţie şi a semanticii (semnificaţiilor conferite cuvintelor) şi extrem de puţin sub aspect morfologic (ansamblul regulilor de modificare a formei cuvintelor, în contextul utilizării lor). 38
Universitatea SPIRU HARET
Operaţia de compilare a fost descrisă în paragraful anterior. Operaţia de interpretare asigură execuţia instrucţiune cu instrucţiune (la comanda pas cu pas a operatorului) a unui program. Limbajele de programare au evoluat istoric în concordanţă cu dezvoltarea şi progresele părţii de hard a sistemelor de calcul. În anul 1944, când firma IBM şi Universitatea Harvard au realizat primul calculator electronic denumit MARK 1, programarea s-a efectuat în limbaj cod-maşină (generaţia zero, 0 GL), sub forma unei succesiuni de instrucţiuni în cod binar. Primul limbaj de programare (generaţia 1, 1 GL) este definit după anul 1950, pentru calculatorul electronic UNIVAC 1, sub denumirea de program asamblor, care automatizează programarea calculatoarelor prin simbolizarea instrucţiunilor, operanzilor şi adreselor de memorie sub formă de mnemonice şi prin translatarea programelor din forma scrisă cu mnemonice în limbaj cod-maşină. După anul 1960, sunt puse la punct primele limbaje de nivel înalt sau evoluate (Cobol, ALGOL, FORTRAN). Limbajele de nivel înalt sau evoluate sunt concepute în funcţie de domeniul de aplicaţii informatice căruia îi este destinat (limbaje specializate, pentru aplicaţii economice – limbajul Cobol, pentru aplicaţii tehnico-inginereşti, limbajul FORTRAN, pentru aplicaţii de inteligenţă artificială, limbajele Lisp şi Prolog) sau sunt universale (de exemplu, limbajele de programare PL/1 şi Ada). Tendinţa de „ieşire” a limbajelor de programare din laboratoarele firmelor de calculatoare şi de facilitare a însuşirii acestora de cercuri diverse de utilizatori s-a materializat în dezvoltarea unor limbaje de programare „didactice”, cum sunt Pascal şi Basic. Dintre limbajele de programare de nivel înalt utilizate în prezent pentru realizarea de software profesional de către firmele specializate se menţionează limbajele C (cu variantele sale ulterioare C++, C#), Java, Ada. Dintre limbajele de nivel jos (apropiate de cod-maşină) se menţionează limbajele de macroasamblare (MASM, TASM), ce aparţin generaţiei 2 (2 GL), la care se realizează gruparea unor secvenţe de instrucţiuni realizatoare ale unor operaţii repetitive, de rutină, într-o macroinstrucţiune (instrucţiune a limbajului de macroasamblare). Macroinstrucţiunile sunt standard (specifice limbajului de programare) sau sunt definite de utilizator. Fiecare tip de microprocesor, ce defineşte sistemul de calcul, dispune de propriile său limbaj cod-maşină şi limbaj de asamblare. Limbajele de programare pot fi procedurale şi neprocedurale. Limbajul procedural sau imperativ, ce defineşte generaţia 3 (3 GL), este limbajul de programare în care elementul esenţial al programării este procedura (exemple: Basic, C, Pascal, Cobol, Fortran, Ada etc.). Limbajul procedural necesită o detaliere atentă a ansamblului de instrucţiuni ce urmează a fi executate în scopul realizării unei sarcini (task) precizate şi este independent de sistemul de calcul. Limbajele neprocedurale sunt limbaje de nivel foarte înalt, din generaţia 4 (4 GL), situate deasupra limbajelor de nivel înalt, specializate pe tipuri de aplicatii informatice. Aceste limbaje se caracterizează prin faptul că necesită precizarea problemei de rezolvat, a metodei de rezolvare (şi nu a algoritmului de rezolvare), a referirilor asociative de date (şi nu a adreselor specifice datelor) şi a operatorilor generali necesari operaţiilor cu structuri de date. Limbajele neprocedurale sunt foarte apropiate de limbajele naturale (umane). O ierarhie a limbajelor de programare este prezentată în fig.2.8. 39
Universitatea SPIRU HARET
LIMBAJE DE NIVEL FOARTE ÎNALT (4 GL) LIMBAJE DE NIVEL ÎNALT (3 GL) LIMBAJE DE MACROASAMBLARE (2 GL) LIMBAJ DE ASAMBLARE (1 GL) LIMBAJ COD-MAŞINĂ (0 GL) HARDWARE
Fig.2.8. Ierarhia limbajelor de programare
Fig. 2.8. Ierarhia limbajelor de programare
Un mare grad de utilizare îl prezintă sistemele de gestiune a bazelor de date (SGBD) ce sunt fundamentate pe limbaje de descriere a structurii bazei de date şi pe limbaje de manipulare şi interogare a bazei de date. SGBD-urile lucrează cu date organizate în baze de date şi programele sunt independente în raport cu descrierea datelor. Se dau ca exemple SGBD-urile FoxPro (cu o largă răspândire în România în deceniul 9 al secolului trecut), Informix, Oracle, Sybase, Microsoft Access. Din categoria limbajelor de programare specializate fac parte limbajele inteligenţei artificiale. Se dau ca exemple limbajele Lisp şi Prolog. Limbajele de programare orientate pe obiecte sunt dezvoltate în conformitate cu conceptul de programare orientată pe obiecte, OOP (Object-Oriented Programming). Programarea orientată pe obiecte semnifică programarea bazată pe obiecte la care se adaugă moştenirea şi polimorfismul (paragraful 2.4). Programarea bazată pe obiecte, OBP (Object-Based Programming) utilizează conceptele de clasă şi obiect. Dintre limbajele de programare OOP se menţionează Pascal, C++, C#, SmallTalk, Simula, Java etc. 2.4. Elementele de bază ale programării orientate pe obiecte Programarea orientată pe obiecte, OOP (Object-Oriented Programming). specifică limbajelor de programare orientate pe obiecte, înseamnă programarea bazată pe obiecte, la care se adaugă moştenirea şi polimorfismul. Programarea bazată pe obiecte, OBP (Object-Based Programming) utilizează conceptele de obiect şi clasă. Obiectul este o entitate dinamică (este creat, utilizat şi apoi distrus) constituită din oricare unitate programabilă şi caracterizată prin identitate, metode de comportament şi stare. Identitatea individualizează un obiect în comparaţie cu alte obiecte. Metodele de comportament ale obiectului reprezintă elementele comportamentale ale acestuia în momentul accesării. Prin comportament, obiectul îşi pune în evidenţă apartenenţa la clasă, precum şi individualitatea sa. Starea obiectului este caracterizată cu ajutorul atributelor lui. Orice atribut dispune de nume şi valoare sau realizare ce este asociată ca variabilă de instanţă (ce defineşte proprietăţile obiectului la un anumit moment). Elementele ce aparţin colecţiei de obiecte descrise 40
Universitatea SPIRU HARET
într-o clasă reprezintă instanţe de clasă. Obiectul este definit de un identificator intern unic, independent de valoarea sau adresa de memorie a obiectului. Acest identificator nu este controlat de utilizator şi nu se confundă cu diferitele nume utilizate de utilizator cu scopul de a-l numi. Ca entităţi complexe, obiectele sunt constituite din alte obiecte şi din valori. Distincţia între obiecte şi valori se realizează prin intermediul stării obiectului: obiectele dispun de o stare internă care se poate schimba; valoarea nu se schimbă niciodată. Obiectele sunt create de utilizatori, prin derivare din tipuri de obiecte create anterior sau printr-o operaţie de creare (new). Clasa reprezintă o implementare a unui tip abstract de date ce încapsulează două tipuri de atribute: câmpuri sau proprietăţi şi metode sau operaţii ale tipului respectiv. Câmpurile sunt private adică sunt ascunse în reprezentarea obiectului. Metodele sunt publice adică accesibile utilizatorului. Altfel exprimat, clasa defineşte o categorie de obiecte cu proprietăţi şi metode ce se moştenesc într-o subclasă. Subclasa sau clasa derivată defineşte comportamentul obiectului derivat dintr-o clasă considerată de bază. Clasa este un model de realizare a obiectelor de acelaşi tip şi se defineşte cu ajutorul unui limbaj declarativ sau pe cale grafică. Clasa are un nume, prezintă operaţii externe sau metode, are o reprezentare internă (ca expresie a valorilor diverselor stări ale instanţelor de clasă) şi foloseşte cod ce implementează atât operaţiile externe, cât şi descrierile reprezentării interne a obiectelor. Clasa există conceptual chiar şi atunci când nu conţine obiecte şi este un şablon pentru generarea şi manipularea obiectelor şi este accesată de utilizator cu ajutorul interfeţei specifice clasei. Specificarea metodei se numeşte semnătură, iar modul de implementare constituie corpul metodei. Noţiunea de clasă este asociată în special cu faza de execuţie şi presupune: generarea de obiecte (new) şi memorarea mulţimii de obiecte care reprezintă instanţele claselor. O clasă descrie obiectele, crearea unui obiect realizându-se prin luarea în consideraţie a unei expresii de tip. Tipul reprezintă o descriere abstractă a unui grup de entităţi asemănătoare. Obiectul prezintă valorile lui proprii, lista atributelor şi metodelor fiind gestionate de clasă. Pentru majoritatea limbajelor OOP, ansamblul instanţelor unei clase reprezintă o colecţie care are acelaşi nume cu clasa şi care se numeşte extensie a clasei. Obiectele reprezintă instanţe (manifestări) ale claselor din care fac parte. Tipul de dată este folosit pentru descrierea unei mulţimi de obiecte care au aceeaşi reprezentare. Fiecărui tip de dată i se asociază anumite operaţii cum ar fi de exemplu: operaţii aritmetice pentru date numerice, concatenări pentru şirurile de caractere, modificări pentru anumite articole. Tipul abstract de dată este un tip de dată care este definit prin accentuarea elementelor de precizare a comportamentului şi de specificare a metodelor ce se pot efectua asupra variabilelor de tipul de dată respectiv (se specifică atât structura obiectului, cât şi mesajele aplicabile lui). Tipul abstract de dată ascunde modul în care sunt implementate metodele asociate obiectului, reprezentarea internă a obiectelor şi protejează algoritmii interni care implementează cererile din exterior. Acest tip abstract de dată are două componente: interfaţa (listă de metode) şi implementarea (descrierea structurii interne a datelor obiectului şi realizarea procedurilor de implementare a metodelor interfeţei). Structura aleasă pentru memorarea tipului abstract de dată este ascunsă pentru utilizator; ca urmare, algoritmul de reprezentare este încapsulat. Există o interfaţă publică, la care au acces utilizatorii, şi o interfaţă privată, ce ascunde reprezentarea şi implementarea. 41
Universitatea SPIRU HARET
Diferenţa dintre tipul de dată şi clasă este următoarea: tipul de dată este destinat pentru definirea de declaraţii utilizate pentru controlul static al expresiilor de limbaj, în timp ce clasele sunt şabloane destinate generării şi manipulării obiectelor care prezintă proprietăţi şi comportament comun. Între clase şi obiecte se stabilesc relaţii astfel: asociaţii binare între două clase, asociaţii n-are între mai multe clase, relaţii între obiect şi clasa din care face parte, relaţii între obiectele aceleiaşi clase. În fig.2.9 sunt prezentate, sub forma unei grafici sugestive, relaţiile dintre clase şi obiecte, în conexiune directă cu noţiunea de moştenire ce este prezentată în continuare. Există mai multe paradigme ale modelului folosit de OOP: moştenirea, încapsularea, polimorfismul, abstractizarea datelor, persistenţa, evenimentul. Paradigma este un ansamblu ce detaliază conceptele specifice unui anumit termen utilizat ca model. Paradigma se referă la forme de manifestare ale termenului respectiv. Moştenirea asigură transferarea de proprietăţi şi metode de la clasa-părinte către un obiect nou (fig.2.9). Prin moştenire sunt generate tipuri noi de obiecte şi clase într-o ierarhie. Prin moştenire, în OOP se elimină rescrierea şi recodificarea programelor, asigurându-se reutilizarea codului. Un obiect nou moşteneşte operaţii sau metode, variabile de instanţă, atribute. În cazul metodelor, este vorba de partajarea codului, iar în cazul variabilelor, de partajarea structurii între datele obiectelor. Proiectarea unei aplicaţii prin intermediul OOP constă în gruparea informaţiilor generale în clase care sunt apoi specializate pas cu pas în subclase cu comportament particular. Aşa cum s-a arătat deja, metodele reprezintă operaţii ce pot regăsi sau actualiza starea unui obiect. Această stare a obiectului este memorată în variabilele instanţelor sale. Într-o ierarhie de moşteniri, o metodă definită pentru o clasă este moştenită de subclasele sale. Moştenirea este implementată static sau dinamic. Moştenirea statică înseamnă adăugarea câmpurilor moştenite, situaţie în care redefinirea unei clase obligă la actualizarea tuturor subclaselor. Moştenirea dinamică se realizează fără a se copia câmpurile moştenite şi obligă la parcurgerea legăturilor de moştenire. În cazul moştenirii dinamice, actualizarea se efectuează mai rapid, în timp ce execuţia este mai puţin eficientă. Moştenirea poate fi simplă sau multiplă. Moştenirea simplă se produce atunci când o subclasă moşteneşte proprietăţi şi metode ale unei singure clase-părinte. Moştenirea multiplă se realizează când o subclasă posedă mai multe clase-părinte. Încapsularea reprezintă proprietatea ce defineşte posibilitatea de a ascunde prin mascare atributele proprii unui obiect şi modul în care se execută metodele. Astfel, sunt protejate obiectele în situaţia efectuării greşite a unor manipulări exterioare. Un obiect poate fi accesat numai prin metodele asociate la crearea sa. Polimorfismul defineşte caracteristica unei metode de a se comporta în mod diferit în funcţie de clasa de obiecte căreia îi aparţine. Polimorfismul asigură invocarea pentru obiectele de diferite tipuri a metodelor cu acelaşi nume, dar semantică şi implementare diferită. O metodă se comportă diferit în funcţie de clasa de obiecte căreia îi aparţine. Abstractizarea datelor se realizează prin faptul că înseşi clasele sunt expresia unei abstracţii. Obiectele dintr-o clasă prelucrează datele modelului clasei căreia îi aparţin. Utilizatorul obţine comunicarea cu obiectele prin mesaje ce se transmit prin interfaţa ce specifică metodele posibile. 42
Universitatea SPIRU HARET
Fig. 2.9. Relaţiile între clase şi obiecte
Persistenţa este o proprietate a obiectelor care implică existenţa acestora şi după încetarea procesului ce le-a creat. Starea obiectului şi codul corespunzător metodelor sunt memorate în baza de date. Tipurile obiectelor pot fi declarate persistente prin folosirea cuvântului cheie persistent la momentul declarării, variabila fiind şi ea constrânsă la un tip persistent. Evenimentul reprezintă o acţiune efectuată de sistemul de calcul în cazul în care utilizatorul solicită executarea unei comenzi, este aplicat un mesaj al sistemului sau există o solicitare din partea altei aplicaţii informatice. Ca urmare, evenimentele se pot produce în mod interactiv sau programat. Într-o aplicaţie informatică dirijată prin evenimente, codul nu urmăreşte o cale prestabilită, ci secvenţe de program executate ca răspuns la apariţia evenimentelor. Succesiunea în care se produc aceste evenimente determină secvenţa după care se execută codul, ceea ce înseamnă că, la fiecare rulare a programului, el va parcurge o cale diferită. 43
Universitatea SPIRU HARET
3. LIMBAJUL DE PROGRAMARE VISUAL BASIC
3.1. Caractersticile generale ale mediului integrat de dezvoltare Visual Basic Visual Basic (VB) reprezintă un mediu integrat de dezvoltare, IDE (Integrated Development Environment), în mod interactiv, pentru aplicaţii informatice sub sistemul de operare Microsoft Windows. În general, un mediu de programare este un sistem de programare care asistă utilizatorul în proiectarea şi codificarea algoritmilor şi a datelor, respectiv în editarea şi depanarea programelor. Când acest mediu de programare asistă utilizatorul (programatorul) în toate etapele de realizare a unui program, el se numeşte mediu de dezvoltare. Când toate componentele de asistare a utilizatorului (programatorului) sunt integrate în cadrul aceluiaşi mediu de dezvoltare, el se numeşte mediu integrat de dezvoltare. Termenul visual din denumirea IDE Visual Basic semnifică faptul că aplicaţiile informatice dezvoltate în VB dispun de interfeţe grafice ce sunt proiectate vizual de către utilizator. Pentru aceasta, utilizatorul are la dispoziţie un set de elemente vizuale standard ce pot fi folosite la proiectarea unei interfeţe grafice, denumite elemente de control, sau, pe scurt, controale (Controls). Aceste controale sunt dispuse în ferestrele aplicaţiei, ferestre denumite formulare (Forms), concomitent cu stabilirea proprietăţilor acestora (în fereastra Properties) la dorinţa utilizatorului şi în conformitate cu necesităţile aplicaţiei. Termenul Basic din compunerea IDE Visual Basic arată tipul limbajului de programare utilizat pentru realizarea programelor (secvenţelor de cod) corespunzătoare evenimentelor generate de acţionarea controalelor dispuse în formularul specific aplicaţiei. Limbajul de programare Basic (acronim provenit din denumirea în limba engleză – Beginner’s All-purpose Symbolic Instruction Code), definit la începutul anilor ’60 ai secolului XX, a cunoscut numeroase versiuni şi dezvoltări ulterioare. În anul 1991, firma Microsoft a realizat produsul Visual Basic, care, ulterior, a cunoscut mai multe versiuni, în concordanţă cu dezvoltarea sistemului de operare Windows (Tabelul 3.1). Versiunea Visual Basic 6.0 face parte din pachetul Microsoft Visual Studio 6.0, iar versiunea Visual Basic.NET este parte componentă a pachetului Microsoft Visual Studio.NET. Visual Basic prezintă caracteristici specifice programării structurate (programării bazate pe obiecte), programării dirijate de evenimente, orientării spre prelucrarea bazelor de date (manipulare şi interogare). Versiunile produsului informatic Visual Basic Versiunea
Anul lansării
Standard Edition
Professional Edition
Enterprise Edition
3.0 4.0 5.0 6.0 .NET
1991 1994 1996 1998 2002
DA DA DA DA DA
DA DA DA DA DA
DA DA DA DA
44
Universitatea SPIRU HARET
Control Creation Edition DA -
Tabelul 3.1.
Instrumente BackOffice DA DA
Aplicaţiile informatice realizate cu VB pot interacţiona cu alte aplicaţii Windows prin intermediul unor interfeţe specializate: OLE (Object Linking and Embedding) – legarea şi încapsularea obiectelor, ce asigură afişarea datelor din alte aplicaţii şi modificarea acestor date din interiorul aplicaţiei care le-a generat; COM (Component Object Model) – model de legare şi comunicare între obiecte distribuite Windows; ActiveX – tehnologie soft Microsoft ce reuneşte componente OLE şi COM; DDE (Dynamic Data Exchange) – schimb dinamic de date (conversaţie) între aplicaţii Windows; ODBC (Open DataBase Connectivity) – conectivitatea bazelor de date deschise, adică posibilitatea conectării aplicaţiilor client la multiple servere de fişiere sau de baze de date; Crystal Report sau Data Report – proiectarea vizuală a rapoartelor unei aplicaţii VB; Microsoft Jet Database Engine – motorul sistemului de gestiune a bazelor de date Microsoft Access (capitolul 5) ce asigură acelaşi limbaj de manipulare a datelor între VB şi Access. Visual Basic face parte din clasa de medii de dezvoltare rapidă a aplicaţiilor, RAD (Rapid Application Development), alături de Microsoft Visual C++, Power Builder, Borland Delphi ş.a. ce prezintă următoarele caracteristici: realizare rapidă a aplicaţiilor informatice, necesităţi acceptabile de resurse informatice la execuţie, separarea proiectării prelucrărilor de proiectarea interfeţei, integrează proiectarea interfeţei, scrierea codului, testarea şi depanarea. În cadrul pachetului de birotică Microsoft Office, a fost inclus ca limbaj de dezvoltare un subset al Visual Basic, denumit Visual Basic for Application – VBA. 3.2. Componentele de bază ale mediului integrat de dezvoltare Visual Basic Lansarea în execuţie a VB 6.0 din mediul Windows se execută astfel: a) Se apasă butonul Start de pe bara de task-uri; b) Se parcurge succesiunea Programs (All Programs în sistemul de operare Windows XP) - Microsoft Visual Studio 6.0 - Microsoft Visual Basic 6.0; c) La apariţia ferestrei de creare a unui nou proiect - New Project (din fig.3.1), se apasă butonul Open.
Fig.3.1. Fereastra de creare a unui nou proiect în VB 45
Universitatea SPIRU HARET
După aceste acţiuni, apar simultan fereastra principală a mediului integrat de dezvoltare VB (1), cutia cu instrumente Toolbox (2), fereastra de proiectare a formularului Form Design (3), fereastra de editare a codului Code Editor (4), fereastra Project Explorer (5), fereastra de stabilire a proprietăţilor Properties (6), fereastra Form Layout (7), fereastra Immediate (8), fereastra Locals (9), fereastra Watch (10), utilitarul Object Browser (11), aşa cum sunt prezentate în fig.3.2. Ferestrele care nu apar la pornirea VB şi sunt necesare pentru lucru pot fi activate prin următoarea succesiune de comenzi: bara cu meniuri – View – poziţionare pe denumirea ferestrei – click.
Fig.3.2. Componentele de bază ale IDE Visual Basic
Fereastra principală a mediului integrat de dezvoltare VB (fig.3.3) are patru componente: bara de meniuri (1), bara cu instrumente (2) şi două zone care afişează poziţia (3) şi dimensiunea (4) obiectului ce a fost selectat (obiectul curent). Butoanele de pe bara cu instrumente (Toolbar) dublează cele mai utilizate comenzi din bara de meniuri şi au destinaţia prezentată în fig.3.3. Meniurile contextuale cuprind comenzi rapide pentru acţiunile efectuate în mod frecvent. Pentru deschiderea unui meniu contextual se poziţionează vârful mouse-ului pe obiectul care trebuie folosit, se apasă butonul din dreapta mouse-ului, se selectează comanda dorită concomitent cu click executat cu butonul din stânga mouse-ului. Cutia cu instrumente, Toolbox (fereastra 2 din fig.3.2), asigură instrumentele predefinite folosite în timpul proiectării formularului pentru a introduce controale pe acesta. Utilizatorul poate crea propriile controale, imagini sau grafică prin 46
Universitatea SPIRU HARET
selecţia opţiunii AddTab din meniul contextual. Rolul fiecărui instrument este prezentat în paragraful 3.3.2. Fereastra de proiectare a formularului, Form Design (fereastra 3 din fig.3.2), este fereastra pentru realizarea interfeţei dintre utilizator şi secvenţele de program. Această fereastră este prezentată în detaliu în paragraful 3.3.2. Fereastra de editare a codului, Code Editor (fereastra 4 din fig.3.2), este folosită ca editor de texte pentru a introduce codul aplicaţiei informatice. Fiecare formular sau modul de cod din cadrul aplicaţiei informatice dispune de propria fereastră de editare a codului. Detaliile sunt prezentate în paragraful 3.3.4.
Fig. 3.3. Componentele ferestrei principale a VB 6.0
Fereastra Project Explorer (fereastra 5 din fig.3.2 şi fig.3.4) serveşte numai la proiectarea aplicaţiei pentru afişarea colecţiei de fişiere ce conţin formularele şi modulele din cadrul proiectului aflat în lucru (curent). Unele fişiere sunt încărcate în mod automat de către sistem, iar alte fişiere sunt realizate de către utilizator (programator). Fişierele care se găsesc în fereastră (proiect) se pot grupa pe categorii cu ajutorul butonului Toggle Folders. Butonul View Object serveşte pentru vizualizarea obiectului selectat (current), iar butonul View Code este folosit pentru vizualizarea codului. Fereastra de stabilire a proprietăţilor, Properties (fereastra 6 din fig.3.2) asigură afişarea valorilor proprietăţilor pentru formularul sau controlul selectat. O proprietate reprezintă o caracteristică a unui obiect (titlu, dimensiuni, poziţie, culoare etc.). Această fereastră de stabilire a proprietăţilor este prezentată în detaliu în paragraful 3.3.3. 47
Universitatea SPIRU HARET
Fereastra Form Layout (fereastra 7 din fig.3.2) este folosită pentru vizualizarea aspectului formularului. Fereastra Immediate (fereastra 8 din fig.3.2) este o fereastră suplimentară utilizată în procesul de depanare a aplicaţiilor informatice rulate din interiorul mediului IDE. Mediul VB 6.0 permite funcţionarea în trei moduri de lucru: proiectare (design mode), rulare normală (run mode) şi execuţie cu întrerupere (break mode). Execuţia cu întrerupere (pas cu pas) se utilizează la depanarea aplicaţiei pe baza punctelor de întrerupere (breakpoints) stabilite în prealabil. Fereastra Immediate permite introducerea de secvenţe de cod care se execută imediat sau afişarea valorilor unor expresii. Fereastra Locals (fereastra 9 din fig.3.2) este destinată, la depanarea programelor VB, pentru afişarea valorilor unor expresii din program. Fereastra Watch (fereastra 10 din fig.3.2) este, de asemenea, o fereastră suplimentară utilizată în procesul de depanare a programelor VB, pentru gestiunea variabilelor şi expresiilor watch, adică a valorilor unor variabile şi expresii din program existente în momentul acţiunii (curente). Utilizarea ferestrei Watch este posibilă prin intermediul meniului contextual.
Fig.3.4. Fereastra Project Explorer a VB 6.0
Utilitarul Object Browser (fereastra 11 din fig.3.2) realizează afişarea obiectelor disponibile în IDE ce pot fi utilizate de proiect. Utilitarul serveşte, de asemenea, pentru a examina obiecte din VB şi din alte aplicaţii, pentru a constata ce metode şi proprietăţi sunt disponibile în cazul acestor obiecte şi pentru a prelua coduri de program în propria aplicaţie informatică. Editorul de meniu (Menu Editor) permite proiectarea meniurilor asociate formularelor. Pentru afişarea ferestrei corespunzătoare (fig.3.5), se apasă butonul cu acelaşi nume de pe bara cu instrumente (fig.3.3) sau prin opţiunea Menu Editor din meniul Tools. Fiecare meniu are nume, proprietăţi şi mod de accesare asociat. 48
Universitatea SPIRU HARET
Fig.3.5. Fereastra corespunzătoare editorului de meniu (Menu Editor)
3.3. Proiectarea aplicaţiilor în limbajul Visual Basic Pentru a proiecta o aplicaţie informatică în limbajul Visual Basic, este necesară parcurgerea următoarelor trei etape: 1. Crearea interfeţei. 2. Precizarea proprietăţilor. 3. Scrierea codului. Crearea interfeţei se efectuează cu ajutorul formularelor (Forms). Acestea servesc pentru a genera ferestre şi casete de dialog, în calitate de containere pentru elemente care se găsesc în partea ascunsă a aplicaţiei. Precizarea proprietăţilor se realizează prin intermediul ferestrei Properties, după selecţia prealabilă a obiectului. Scrierea codului se execută folosind fereastra de editare a codului, Code Editor. Crearea aplicaţiilor în VB se face în modul de proiectare Design Mode, iar execuţia acestora se efectuează în modul de rulare normală, Run Mode. Înainte de prezentarea în detaliu a celor trei etape de proiectare a unei aplicaţii în VB, se tratează fişierul proiect. 3.3.1. Fişierul proiect Termenul de proiect în VB este similar cu aplicaţia informatică, astfel că el cuprinde o listă a fişierelor care intră în compunerea aplicaţiei. Fişierul proiect este un fişier text cu extensia .VBP. Mediul de dezvoltare VB 6.0 asigură posibilitatea lucrului cu mai multe proiecte concomitent, proiecte ce sunt reunite într-un grup de proiecte (fişierul grup de proiecte are extensia .VBG). În lista de fişiere a unui proiect pot fi incluse următoarele tipuri de fişiere: ¾ fişier pentru formular (.FRM); ¾ fişier pentru formular care cuprinde controale cu proprietăţi care prezintă ca valori date binare (.FRX); ¾ fişier pentru clasă de module (.CLS); ¾ fişier pentru modul standard (.BAS); ¾ fişier pentru control utilizator (.VBX – DDL-uri pentru controale pe 16 biţi şi .OCX - DDL-uri pentru controale pe 32 de biţi ). 49
Universitatea SPIRU HARET
Din punctul de vedere al utilizatorului, proiectul are în compunere module existente în mediul integrat de dezvoltare (IDE) Visual Basic, în format binar, şi module realizate de utilizator (formular, cod, clasă). Aşa cum s-a precizat în paragraful 2.3 (fig.2.5), modulul reprezintă un termen generic care desemnează entitatea de structurare a unui program. Modulele sunt reutilizabile, ceea ce înseamnă că un modul folosit într-un program, poate fi utilizat ulterior şi în alte programe. Modulul defineşte reguli de vizibilitate adică elementele declarate în interiorul lui pot fi sau nu pot fi vizibile în exteriorul acestui modul. Orice proiect trebuie să includă cel puţin un modul (modul de formular sau modul de cod). Atunci când au fost definite toate componentele unui proiect, acesta poate fi transformat direct într-un fişier executabil (.EXE), astfel: 1) din meniul File (fig.3.6, opţiunea notată 6), se selectează opţiunea Make … EXE…; 2) se introduce numele fişierului executabil în caseta File Name şi se apasă butonul OK.
Fig.3.6. Meniul File
Crearea, deschiderea şi salvarea unui proiect (fig.3.6) se efectuează prin intermediul comenzilor disponibile în meniul File, astfel: • New Project (1) serveşte pentru crearea unui proiect nou, adăugând un nou formular şi, eventual, module, referinţe şi obiecte utilizator cuprinse în fişierul Auto32ld.VBP; • Open Project (2) deschide un proiect existent, cu formularele, modulele şi obiectele utilizator listate în fişierul proiect; • Save Project As…(5) asigură prima salvare a proiectului în lucru sau schimbarea numelui unui proiect existent pentru conservarea stadiului la care s-a ajuns şi continuarea lucrului cu un alt nume de proiect; • Save Project actualizează, prin salvare pe disc, fişierul proiect al aplicaţiei existente împreună cu toate formularele, clasele de module şi modulele standard. 50
Universitatea SPIRU HARET
Aşa cum se deduce din descrierea opţiunilor de salvare a proiectului de mai sus, realizarea aplicaţiei este terminată atunci când se selectează comanda Save Project As…(5) din meniul File sau când se selectează butonul Save Project din linia de butoane. Mediul Visual Basic solicită salvarea, pe rând, a formularului şi apoi a proiectului prin introducerea numelui, dar şi a unităţii logice de memorie, precum şi a căii unde se doreşte a avea loc salvarea. În mod implicit, mediul Visual Basic asigură salvarea în locaţia C:\Program Files\Microsoft Visual Studio\VB98 (Save In). Pentru salvarea unui proiect, se recomandă particularizarea numelui proiectului şi folosirea unei unităţi logice de memorare şi a unei căi personalizate a utilizatorului pentru fiecare proiect, ca, de exemplu: Homes(D:)\Student\Facultatea\Grupa\Nume_prenume_student\Nume proiect. Când se lucrează cu mai multe proiecte, la un anume moment un singur proiect este activ. Între aceste proiecte cu care se lucrează simultan, se pot partaja fişiere. Un fişier, cum este, de exemplu, un formular, poate aparţine mai multor proiecte. Crearea unor formulare, module şi controale noi se efectuează cu comenzile din meniul Project (fig.3.7).
Fig. 3.7. Meniul Project
3.3.2. Crearea interfeţei aplicaţiei Crearea interfeţei unei aplicaţii se realizează cu ajutorul unui obiect denumit formular (Form). În multe lucrări destinate VB, echivalentul românesc pentru Form este formă. În lucrarea de faţă s-a preferat denumirea de formular, deşi cea de formă este mai apropiată de termenul în limba engleză (crearea formularului înseamnă de fapt „turnarea” controalelor într-o formă adecvată interfeţei aplicaţiei). Motivul preferinţei pentru „formular” este asigurarea lizibilităţii apariţiei denumirii acestui obiect în explicaţiile din cuprinsul lucrării, deşi, în dicţionarele limbii române, formularul, în general, este definit ca un imprimat cu mai multe spaţii albe ce se completează în vederea întocmirii unui tabel. 51
Universitatea SPIRU HARET
Formularul este un container de controale care facilitează dialogul dintre utilizator şi aplicaţie. Controalele nu pot funcţiona în afara formularului. Ele sunt obiecte care eliberează programul de sarcinile legate de intrările şi ieşirile generate de acţiunile utilizatorului, concentrând eforturile pe operaţiile de prelucrare a datelor. Avantajul controalelor din VB este că ele se aseamănă foarte mult cu controalele standard ce apar în sistemul de operare Windows (meniuri, butoane, casete). Controalele uşurează munca de programare în sensul că sunt eliminate instrucţiunile care să ghideze utilizatorul asupra acţiunilor pe care acesta trebuie să le întreprindă. La proiectarea interfeţei aplicaţiei (Design Mode), fereastra de proiectare a formularului serveşte pentru dispunerea controalelor necesare proiectului. La rularea programului (Run Mode), formularul îndeplineşte rolul de fereastră principală a proiectului sau de fereastră de dialog. La pornirea mediului VB, fereastra de proiectare a formularului cu numele implicit (default) Form1 este dispusă în centrul ecranului. În interiorul acestei ferestre se găsesc linii punctate cu rolul de a asigura orientarea utilizatorului, iar la marginea ferestrei sunt dispuse mânerele de redimensionare a formularului. Este bine ca, încă de la crearea formularului, să se opteze pentru o dimensiune potrivită a formularului în raport cu numărul de controale introduse şi de dimensiunile acestora; nu este estetic şi nici practic să rămână zone mari nefolosite pe suprafaţa formularului. Un formular include descrierea grafică a acestuia, controalele sale, proprietăţile, constantele, variabilele şi procedurile externe, subrutinele de tratare a evenimentelor, procedurile generale. Fiecărui formular îi corespunde un modul de formular (Form Module). Clasa de module (Class Module) este asemănătoare formularului, dar nu dispune de interfaţă utilizator vizibilă. Clasa de module poate fi folosită pentru crearea obiectelor utilizator, cuprinzând secvenţe de cod pentru metodele şi proprietăţile obiectelor definite. Obiectele care aparţin aceleaşi clase nu sunt înzestrate cu evenimente proprii.
Fig.3.8. Caseta cu instrumente (ToolBox) 52
Universitatea SPIRU HARET
Mediul VB asigură interfaţă pentru un singur document (SDI) sau interfaţa multidocument (MDI). În cazul SDI, toate ferestrele mediului VB pot fi deplasate pe ecran, iar în cazul MDI, toate ferestrele mediului integrat de dezvoltare VB (numite fii) sunt incluse într-o fereastră unică (numită părinte) ce poate fi redimensionată. Pentru a obţine comutarea între modurile de lucru SDI şi MDI se realizează următoarea succesiune de acţiuni: 1) se selectează Options (opţiuni) din meniul Tools; efectul este apariţia casetei de dialog Options; 2) se selectează Advanced; 3) se validează sau se invalidează caseta SDI Developement Environement. În fig.3.8. sunt prezentate controalele implicite incluse în caseta cu instrumente (Toolbox). Controalele standard sunt butoanele de comandă (nr.14, Command Button), casetele cu text (nr.13, TextBox), etichetele (nr.2, Label), casetele de validare (nr.4, Check Box), butoanele de opţiuni (nr.15, Option Button), casetele cu listă (nr.16, ListBox), casetele cu imagine (nr.12, PictureBox), barele de defilare (nr.6 şi nr.17, ScrollBar) orizontale şi verticale, casetele combinate (ComboBox). Se face menţiunea că această casetă cu instrumente (Toolbox) este configurabilă. Adăugarea sau scoaterea de controale din caseta cu instrumente (Toolbox) se obţine din meniul Project, opţiunea Components (opţiunea 8 din fig.3.7), în care se validează controlul dorit (aşa cum este prezentat în fig.3.9 pentru controlul Shockwave Flash).
Fig.3.9. Modul de adăugare a unui control la cutia cu instrumente (Toolbox) 53
Universitatea SPIRU HARET
Introducerea unui control din cutia cu instrumente (Toolbox) pe suprafaţa formularului se obţine prin parcurgerea etapelor următoare: a) se deplasează cursorul mouse-ului în cutia cu instrumente (Toolbox), pe pictograma care reprezintă controlul ce urmează a fi introdus în formular şi se acţionează butonul din stânga al mouse-lui; b) se mută cursorul mouse-ului pe suprafaţa formularului, în poziţia în care va fi colţul stâng al controlului; c) se efectuează succesiunea de operaţii de tipul Drug and Drop până se dimensionează după dorinţă controlul selectat; d) se eliberează butonul stâng al mouse-ului. O altă modalitate de introducere a controlului selectat pe suprafaţa formularului este reprezentată de dublu-click-ul mouse-ului pe pictograma (icon-ul) controlului din cutia cu instrumente (Toolbox). Se generează astfel un control cu dimensiunile implicite, dispus în centrul formularului. Dispunerea controalelor pe suprafaţa formularului se face după o anumită logică legată de succesiunea operaţiilor importante de introducere date, prelucrare şi afişare rezultate. Fiecare control este caracterizat de un ansamblu de proprietăţi ce se referă la descrierea comportamentului sau aspectului unui control. Lăţimea sau înălţimea unui control se măsoară în twip (un twip reprezentând cel mai mic punct adresabil de pe ecran, cu dimensiunea de 1/1440 inch). Aşa cum se va arăta în paragraful următor, fereastra Properties permite modificarea între limite prestabilite a valorilor diferitelor proprietăţi ale controalelor. Focalizarea reprezintă operaţiunea de punere în evidenţă a unui control la un moment dat; mai precis, acel control devine activ prin focalizare. Acel control activ se mai numeşte şi focar (focus). Acest lucru se pune în evidenţă printr-o linie punctată în jurul controlului sau printr-un titlu îngroşat. Mutarea focarului de la un control la altul se efectuează prin intermediul tastelor Tab sau Shift+Tab. Apăsarea tastei Enter va determina acţiunea controlului focar sau focalizat. Ordinea de parcurgere a controalelor în formular reprezintă ordinea în care controalele sunt puse în evidenţă prin focalizare, o dată cu apăsarea succesivă a tastei Tab. În momentul activării formularului, este stabilit primul control care este focalizat. Proprietăţile comune tuturor controalelor din formular care stabilesc ordinea de parcurgere a controalelor sunt TabIndex (poziţia) şi TabStop (oprirea). Ordinea de parcurgere a controalelor este circulară şi în ambele sensuri – înainte (Tab) şi înapoi (Shift+Tab). Un control poate include o tastă „fierbinte” (Hot Key) ce este evidenţiată printr-o literă subliniată. Prin acţiunea Alt+litera subliniată, se provoacă acţiunea controlului respectiv. Litera subliniată se introduce cu ajutorul proprietăţii Caption prin precedare de un ampersand (&). Redimensionarea unui control introdus deja pe suprafaţa formularului se obţine astfel: 1) se selectează controlul de redimensionat prin click executat cu mouse-ul în interiorul suprafeţei acestui control. Pe marginile controlului apar mânerele de redimensionare; 2) se fixează cursorul mouse-ului în dreptul unui mâner de redimensionare şi se mişcă ţinând apăsat butonul stâng al mouse-ului, până se obţine dimensiunea dorită. Mânerele situate în colţurile suprafeţei controlului redimensionează controalele atât pe verticală, cât şi pe orizontală, iar mânerele dispunse pe laturi redimensionează controlul numai într-o singură direcţie; 54
Universitatea SPIRU HARET
3) se eliberează butonul stâng al mouse-ului. Mutarea unui control pe suprafaţa formularului se realizează cu mouse-ul prin tehnica Drug and Drop. După finalizarea proiectării formularului, blocarea tuturor controalelor pe suprafaţa formularului se obţine din meniul Format cu opţiunea Lock Controls sau cu butonul Lock Controls Toggle de pe bara cu instrumente Form Editor. Formularele sau controalele VB au asociate, în cadrul proiectului, proceduri eveniment vide care sunt personalizate în momentul execuţiei aplicaţiei. Pentru exemplificarea etapei de creare a interfeţei aplicaţiei, în continuare se propune să se introducă controalele pentru un formular care să constituie interfaţa pentru următoarea aplicaţie informatică: Să se realizeze un program în limbajul Visual Basic care să calculeze valoarea totală a unei facturi de materiale. Deocamdată, factura conţine un singur material la o rulare a programului. Datele de intrare sunt: număr factură (Nrf), data facturii (Df), codul materialului (Codmat), denumirea materialului (Denmat), cantitate (Cant) şi preţul unitar al materialului (Pu). TVA este de 19%. Datele de intrare vor fi introduse cu ajutorul casetelor text (Text Box) cu etichete pentru fiecare dintre ele. Rezultatele rulării programului se vor afişa în casete text separate pentru valoare material fără TVA (Vmftva), valoare material cu TVA (Vmctva), valoare factură fără TVA (Vfftva) şi valoare factură cu TVA (Vfctva). Se vor prevedea butoane de comandă (Command Button) pentru calculul şi afişarea unui material (fără TVA şi cu TVA) – butonul CALCULEAZA şi pentru calculul valorii facturii (fără TVA şi cu TVA) – butonul AFISEAZA. Pentru afişarea denumirilor pentru datele de intrare (Nrf, Df, Codmat, Denmat, Cant şi Pu), a datelor intermediare (Vmftva şi Vmctva) şi a datelor de ieşire sau rezultatelor (Vfftva şi Vfctva), se folosesc controale de tip etichetă (Label). Aceste controale de tip etichetă se găsesc în caseta cu intrumente (Toolbox) cu simbolul grafic prezentat în fig.3.8. Controalele se introduc în formular prin tehnica Drug and Drop şi se dimensionează cu ajutorul mânerelor de dimensionare (Label1…Label10). În mod similar se procedează cu casetele text (Text Box) cu simbolul grafic prezentat în fig.3.8, casete care servesc, în cazul formulat în enunţul aplicaţiei informatice (un singur material pe factură), pentru introducerea datelor de intrare şi afişarea datelor intermediare şi de ieşire (Text1…Text2), precum şi cu butoanele de comandă (Command Button) ce se vor folosi pentru declanşarea procedurilor de calcul (Command1), de afişare a valorii facturii (Command2) şi de ieşire din program (Command3). Aspectul formularului astfel obţinut este prezentat în fig.3.10. 3.3.3. Precizarea proprietăţilor Precizarea proprietăţilor în etapa de proiectare (Design Mode) a formularului sau a altui obiect vizual se realizează cu ajutorul ferestrei Properties (fig.3.11.). Fereastra Properties este formată din caseta cu obiecte, Objects (afişează numele şi tipul obiectului selectat, adică obiectul curent) şi caseta Settings – setări (afişează alfabetic sau pe categorii lista proprietăţilor – stânga şi lista cu valorile sau setările proprietăţilor – dreapta). 55
Universitatea SPIRU HARET
1 Fig.3.10. Crearea formularului pentru aplicaţia informatică cu factura de materiale
Fig.3.11. Fereastra Properties 56
Universitatea SPIRU HARET
Activarea ferestrei Properties se poate obţine prin succesiunea de comenzi meniu principal – View – Properties Window sau cu ajutorul tastei funcţionale F4. Precizarea proprietăţilor se obţine prin parcurgerea următoarele etape: 1) dacă nu este afişată, se activează fereastra Properties; se selectează obiectul căruia urmează să i se precizeze proprietăţile; în acest moment, se afişează automat proprietăţile cu valorile implicite pentru obiectul selectat; 2) din lista alfabetică sau lista pe categorii a proprietăţilor se selectează denumirea proprietăţii la care se vor modifica valorile sau setările existente; 3) în coloana valorilor sau setărilor din dreapta se tastează sau se selectează valorile dorite pentru proprietate. Pentru a asocia o pictogramă unui formular se atribuie o valoare proprietăţii icon pentru acel formular. Pentru exemplificarea etapei de precizare a proprietăţilor, se continuă aplicaţia cu factura materiale din paragraful 3.3.2, precizându-se proprietăţile de bază – Name şi Caption pentru formular şi controalele introduse de tipul Label, TextBox (numai Name) şi Command Button prin selectarea succesivă a acestora. Personalizarea numelui pentru formular se obţine prin introducerea în fereastra Properties a numelui (Name) frmMat şi a etichetei (Caption) FACTURA MATERIALE. Personalizarea numelui pentru controalele de tip etichetă (Label) se obţine prin introducerea în fereastra Properties a numelui (Name) lblNrf şi a etichetei (Caption) Numar factura, respectiv: • lblDf (Name), Data factura (Caption); • lblCodmat (Name), Cod material (Caption); • lblDenmat (Name), Denumire material (Caption); • lblCant (Name), Cantitate (Caption); • lblPu (Name), Pret unitar (Caption); • lblVmftva (Name), Valoare material fara TVA (Caption); • lblVmctva (Name), Valoare material cu TVA (Caption); • lblVfftva (Name), Valoare factura fara TVA (Caption); • lblVfctva (Name), Valoare factura cu TVA (Caption). Personalizarea numelui pentru controalele de tip caseta cu text (TextBoxl) se obţine prin introducerea în fereastra Properties a: • txtNrf (Name) pentru Numar factura; • txtDf (Name) pentru Data factura; • txtCodmat (Name) pentru Cod material; • txtDenmat (Name) pentru Denumire material; • txtCant (Name) pentru Cantitate; • txtPu (Name) pentru Pret unitar; • txtVmftva (Name) pentru Valoare material fara TVA; • txtVmctva (Name) pentru Valoare material cu TVA; • txtVfftva (Name) pentru Valoare factura fara TVA; • txtVfctva (Name) pentru Valoare factura cu TV. Personalizarea numelui pentru controalele de tip butoane de comandă (Command Button) se obţine prin introducerea în fereastra Properties a: • cmdCalcul (Name), CALCULEAZA (Caption); • cmdAfisare (Name), AFISARE VALOARE FACTURA (Caption); • cmdExit (Name), IESIRE (Caption). 57
Universitatea SPIRU HARET
Explicaţiile privind formarea numelui obiectelor cu prefixe standard vor fi date în paragraful 3.4.1. Aspectul formularului obţinut prin precizarea proprietăţilor formularului şi controalelor incluse este prezentat în fig.3.12.
Fig.3.12. Introducerea proprietăţilor formularului şi controalelor incluse pentru aplicaţia informatică cu factura de materiale
3.3.4. Scrierea codului După proiectarea formularului şi precizarea proprietăţilor, urmează scrierea codului care constă în asocierea unor secvenţe de cod pentru toate controalele din formular, adică moduri de acţiune la diverse evenimente. Codul conţine constante, declaraţii de variabile şi instrucţiuni scrise în limbajul de programare Visual Basic, în conformitate cu algoritmul de calcul. Legarea efectivă de control sau fereastră a secvenţelor de cod se obţine de către utilizator (programator) în mod conversaţional. Pentru scrierea codului se deschide fereastra de editare a codului (Code Editor), fig.3.13., prin dublu-click executat cu butonul stâng al mouse-ului poziţionat pe obiectul selectat. Fereastra de editare a codului (Code Editor) este formată din fereastra principală ce reprezintă zona pentru scrierea codului şi două casete de tip listă din care se selectează controlul pentru care se scrie codul (Object) şi, respectiv, din care se alege evenimentul la care se reacţionează prin codul scris pentru procedură în fereastra principală (Procedure). Codul din proiectele realizate în VB se divide în blocuri de dimensiuni mai mici numite proceduri. Codul care corespunde unui eveniment se numeşte procedură eveniment. Procedura-eveniment asociată unui control are numele alcătuit din numele controlului (stabilit în proprietatea Name), o liniuţă de subliniere (_) şi numele evenimentului. 58
Universitatea SPIRU HARET
Fig.3.13. Fereastra editare a codului, Code Editor
Atunci când se deschide fereastra de cod şi se selectează evenimentul pentru care se scrie codul, se generează automat prima şi ultima linie a procedurii (Private Sub Form_Load () şi End Sub) ce constituie un şablon de lucru. Pentru crearea unei proceduri-eveniment se execută următoarea succesiune de acţiuni: caseta Object → se specifică numele obiectului din formularul curent (adică cel care este focalizat) pentru care se scrie codul → caseta cu listă Procedure → selecţie nume eveniment asociat obiectului selectat (de exemplu, procedura Click implicită pentru controlul buton de comandă, Command Button) → şablon pentru procedura-eveniment → între declaraţiile Private Sub şi End Sub, se introduce de la tastatură codul în conformitate cu algoritmul de calcul. Se poate opta pentru afişarea tuturor procedurilor în aceeaşi fereastră de cod sau pentru afişarea unei singure proceduri la un moment dat. Pentru afişarea tuturor procedurilor în cadrul aceleiaşi fereastre de cod, se execută clic pe butonul de vizualizare a întregului modul, Full Module View (fig.3.13.), în colţul din stânga-jos al ferestrei de editare a codului, Code Editor sau se execută următoarea succesiune de acţiuni: meniul Tools → caseta de dialog Options (fig.3.12.) → secţiunea Editor (1) → grupul de setări pentru fereastră, Window Settings (2), bifă în caseta de validare din stânga lui Default to Full Module View (3). În acelaşi grup de setări pentru fereastră, caseta de validare din stânga lui Procedure Separator (4) serveşte la adăugarea sau eliminarea unei linii de separaţie între proceduri (fig.3.14.). Pentru afişarea unei singure proceduri la un moment dat, se execută click pe butonul de vizualizare a procedurii, Procedure View (fig.3.13.), în colţul din stânga-jos al ferestrei de editare a codului, Code Editor sau se execută următoarea succesiune de acţiuni: meniul Tools → caseta de dialog Options (fig.3.14.) → secţiunea Editor (1) → în grupul de setări pentru fereastră, Window Settings (2), se şterge bifa din caseta de validare din stânga lui Default to Full Module View (3). 59
Universitatea SPIRU HARET
Fig.3.14. Fereastra de opţiuni, Options a meniului de instrumente, Tools
Pentru exemplificarea etapei de scriere a codului unei aplicaţii informatice în Visual Basic, se continuă aplicaţia cu factura de materiale din paragrafele 3.3.2 şi 3.3.3. Codul aferent se introduce în fereastra de editare a codului (Code Editor) care a fost prezentată în fig.3.13. Explicaţiile privind logica scrierii acestui cod vor fi date în paragraful 3.4. Codul pentru aplicaţia cu factura de materiale este prezentat în fig.3.15. 3.3.5. Execuţia aplicaţiei informatice în Visual Basic După parcurgerea etapelor de creare a interfeţei (proiectarea formularului), de precizare a proprietăţilor şi de scriere a codului, toate fişierele aplicaţiei sunt salvate şi se trece de la modul de proiectare (Design Mode) la modul de rulare (execuţie) a proiectului (Run Mode). Pentru a lansa în execuţie aplicaţia, se alege opţiunea Start din meniul Run (fig.3.16) sau se acţionează tasta funcţională F5 sau se execută cu butonul stâng al mouse-ului click pe butonul Start de pe bara cu instrumente. Terminarea rulării proiectului se efectuează cu opţiunea End din meniul Run (fig.3.16) sau prin apăsarea butonului de închidere (Close) a ferestrei aplicaţiei (colţul din dreapta sus al ferestrei) sau prin apăsarea butonului End de la bara cu instrumente (fig.3.3). După terminarea execuţiei aplicaţiei, mediul VB revine în modul de proiectare (Design Mode). Prin rularea proiectului, se obţine fişierul executabil. Aşa cum s-a arătat în paragraful 3.3.1, fişierul executabil se poate obţine direct din meniul File cu opţiunea Make …EXE (fig.3.3). 60
Universitatea SPIRU HARET
Fig.3.15. Codul pentru aplicaţia cu factura de materiale introdus în fereastra de editare a codului
Reluând aplicaţia cu factura de materiale din paragrafele 3.3.2, 3.3.3 şi 3.3.4, această aplicaţie se rulează cu seturile de date de intrare prezentate în tabelul 3.2 (se consideră materiale consumabile pentru tehnica de calcul, iar pentru simplificare nu se introduc unităţile de măsură, acestea fiind topuri, bucăţi, role, cutii) şi se obţin rezultatele prezentate în fig.3.17, pentru setul de date nr.2 din tabelul 3.2. 61
Universitatea SPIRU HARET
Fig.3.16. Comanda execuţiei unei aplicaţii în VB Tabelul 3.2. Exemple de seturi de date de intrare pentru aplicaţia cu factura de materiale consumabile pentru tehnica de calcul Nr. crt. 1 2 3 4 5
Numar factura 16844 16844 16844 16844 16844
Data factura 16/10/2004 16/10/2004 16/10/2004 16/10/2004 16/10/2004
Cod material 41000825 41081320 41061223 41081422 41061154
Denumire material Hirtie xerox Cartus imprimanta Hirtie fax Ribon Toner copiator
Cantitate 30 5 5 10 3
Fig.3.17. Rezultatele rulării aplicaţiei cu factura de materiale cu setul nr.2 de date de intrare din tabelul 3.2. 62
Universitatea SPIRU HARET
Pret unitar 120000 4280000 230000 620000 1200000
3.4. Elementele limbajului de programare Visual Basic 3.4.1. Unele reguli de scriere O proprietate esenţială a unui obiect în Visual Basic este numele (Name). Numele este folosit pentru a referi un obiect particular în cadrul codului. Numele obiectului trebuie să fie sugestiv şi să arate, în cazul controalelor, grupul de controale căruia îi aparţine. Ca urmare, s-a adoptat convenţia conform căreia un nume trebuie să fie format dintr-un prefix din trei litere (dat de notaţia ungară) şi numele propriu-zis cu semnificaţie pentru utilizarea obiectului. Prefixul numelui (Tabelul 3.3) indică, în mod unic, grupul de controale din care face parte. Tabelul 3.3. Stabilirea numelor unor obiecte în Visual Basic Nume obiect Data Form Command Button Label TextBox Menu Check Box Frame Image List Box Option Button Picture Box
Prefix standard dat frm cmd, btn lbl txt mnu chk fra img lst opt pic
Exemple datSalarii frmMateriale, frmClienti cmdCalcul, btnExit lblDobinda, lblSumaInitiala txtDobinda, txtSumaInitiala mnuEvaluare chkImpozit fraSelectie imgOrase, imgProfesori lstDiscipline, lstStudenti optCursuri picTools
Numele obiectelor pot avea maxim 40 de caractere, trebuie să înceapă cu o literă şi pot conţine numai litere, numere şi underscore ( _ ). În cadrul mai larg al întregului limbaj Visual Basic, cu setul de caractere ASCII extins ce formează alfabetul acestui limbaj, se construiesc literalii şi identificatorii. Literalii sunt compuşi din şiruri de caractere. Literalii pot fi de tipul literali şiruri de caractere şi sunt scrişi între ghilimele, şi de tipul literali numerici – zecimali (în baza 10), octali (în baza 8), hexazecimali (în baza 16). Identificatorii pot fi predefiniţi (cuvinte rezervate şi cuvinte-cheie ce desemnează instrucţiuni, funcţii, operatori, metode) sau pot fi definiţi de utilizator (ce desemnează obiecte, variabile, tipuri de date, constante, etichete, proceduri). Instrucţiunile specifice limbajului Visual Basic se obţin prin combinarea literalilor, identificatorilor şi cuvintelor rezervate. Pentru lizibilitatea codului, fiecare instrucţiune se scrie pe o linie separată. Dacă o instrucţiune nu încape pe o linie, se poate continua pe linia următoare prin caracterul underscore (_). Se pot folosi 20 astfel de linii de continuare a unei instrucţiuni. Numele sunt folosite la setarea proprietăţilor la momentul execuţiei şi în stabilirea numelor procedurilor pentru evenimentele obiectelor. Setarea proprietăţilor la momentul execuţiei se obţine prin scrierea unui cod. Formatul acestui cod se scrie prin notarea cu punct şi este: Nume obiect. proprietate = noua valoare (Object Name. Property = New value). 63
Universitatea SPIRU HARET
În Visual Basic, numele obiectelor sunt utilizate în setarea unui cadru de lucru (framework) corespunzător procedurilor eveniment, pentru scrierea codului. Formatul fiecărei subrutine (în Visual Basic nu există program principal; toate procedurile obiectelor sunt subrutine) este: Private Sub Object Name_Event (Optional Arguments) … End Sub. Formularului i se ataşează un obiect. Visual Basic construieşte automat un cadru de lucru (framework) pentru fiecare dintre procedurile eveniment. Utilizatorul care construieşte aplicaţia trebuie să scrie codul procedurilor eveniment la care corespunde aplicaţia. 3.4.2. Tipuri de date Tipurile de date reprezintă natura datelor în cadrul unui limbaj de programare. În limbajul Visual Basic, tipurile de date sunt predefinite (standard) sau definite de utilizator. În tabelul 3.4 sunt prezentate tipurile de date predefinite cele mai utilizate. Tabelul 3.4. Tipurile de date predefinite în Visual Basic Tip română
Tip engleză
Octet
Byte
Întreg Întreg lung
Integer Long (integer) Boolean Single (floating) Double (floating) Currency Date Object String
# @ $
Variant
-
Logic Real simplă precizie Real dublă precizie Monedă Dată Obiect Şir de caractere Nedefinit
Sufix
Interval de valori (domeniu)
-
Memorie ocupată 1
% &
2 4
-32768…+32767 2.147.483.648…+2.147.483.647
-
2 4
True, False -3,40 e38…+3,40 e38
8
-1,8 e308…+1,8 e308
8 8 4 1 octet/ caracter -
-9,22 e14…+9,22 e14 Jan 01/100-dec 31/9999 Adresa unui obiect Şir de caractere alfanumerice
0…255
!
Şir, numere, dată
Tipurile de date definte de utilizator se obţin prin combinarea mai multor tipuri de date existente în structuri de date. Declararea tipurilor de date definite de utilizator se efectuează în secţiunea Declaration (din modulul standard) cu Type…End Type care are sintaxa generală: [Private/Public] Type nume_tip_data_utilizator Nume_1 As tip_data_1 64
Universitatea SPIRU HARET
Nume_2 As tip_data_2 … Nume_n As tip_data_n End Type Tipurile de date definite de utilizator se declară la nivelul modulelor standard, de clasă sau formular (numai Private). Aceste tipuri de date nu pot fi declarate la nivelul unei proceduri. De exemplu, tipul de date definite de utilizator Client are următoarea structură: Type Client Nume_client As String *20 Prenume_client As String *20 Adresa_client As Adresa CNP_client As String *13 End Type unde tipul de date definit de utilizator Adresa are structura: Type Adresa Localitate As String *20 Strada As String *20 Numar As Integer Judet As String *20 End Type 3.4.3. Variabile şi constante Variabilele care se folosesc într-un program desemnează locaţii de memorie în care se stochează valori ce se modifică pe timpul execuţiei programului. O variabilă în limbajul Visual Basic are un nume (identificator) format astfel: • maxim 40 de caractere; • numele include: litere, numere, underscore (–): • primul caracter trebuie să fie o literă; • nu se pot folosi ca nume de variabile, cuvintele rezervate, care fac parte din setul de cuvinte cheie al limbajului. Corespunzător variabilei care se doreşte a fi creată şi utilizată, utilizatorul poate să stabilească tipul de dată asociat prin folosirea unui sufix de natura tip de dată care va putea fi stocat sau prelucrat prin intermediul respectivei variabile. În tabelul 3.4 s-au prezentat tipurile de date, sufixul asociat şi intervalul de valori. Există trei moduri de declarare a unei variabile: a) Prin lipsă (din oficiu). Dacă variabila nu este definită în nici un mod, ea este presupusă Variant, adică un tip de dată Visual Basic care poate conţine: valori numerice, şiruri de caractere sau dată calendaristică. b) Implicit. Declararea implicită este dată prin folosirea sufixului corespunzător. De exemplu, o variabilă de tip String (şir de caractere) poate fi declarată implicit astfel: Material$ = ”Cherestea” iar o variabilă de tip Integer se poate declara implicit astfel: Cantitatea% = 273 c) Explicit. Acest mod de declarare a unei variabile prezintă mai multe avantaje: asigură efectuarea unui calcul corect prin intermediul instrucţiunilor care utilizează variabilele respective şi permite identificarea, gestionarea corectă a 65
Universitatea SPIRU HARET
apariţiei literelor mari sau a literelor mici în numele variabilelor. Datorită acestor avantaje, se preferă lucrul cu tipurile de variabile explicite. Pentru a putea lucra cu variabile declarate explicit trebuie să fie cunoscut domeniul de valabilitate şi anume: 1) domeniul procedurilor; 2) domeniul procedurilor în care variabilele se declară static; 3) domeniul formularelor şi modulelor; 4) domeniul nivelului global. De exemplu, pentru domeniul procedurilor, variabilele sunt declarate folosind cuvântul cheie Dim: Dim Denumire_material As String Dim Cantitate As Integer Dim Pret_unitar As Single. Variabilele declarate la nivelul procedurilor îşi vor păstra valorile numai pe timpul rulării procedurilor respective. Din acest motiv se mai numesc şi variabile locale. Pentru ca variabilele să-şi păstreze valorile şi după terminarea procedurii, se foloseşte domeniul procedurilor în care variabilele se declară static, cuvântul-cheie Dim fiind înlocuit cu Static. De exemplu: Static Denumire_material As String. Static Cantitate As Integer. Static Pret_unitar As Single. Pentru domeniul domeniul formularelor şi modulelor, variabilele îşi menţin valorile la nivelul formularului (modulului), relativ la toate procedurile prin declararea variabilelor cu Dim, dar în partea de declaraţii a obiectului general, în fereastra de cod a formularului. Pentru domeniul domeniul nivelului global, o variabilă este disponibilă tuturor procedurilor prezentate în aplicaţie, prin declararea în partea de declaraţii a obiectului general din fereastra de cod a unui modul cu ajutorul cuvântului cheie Global. De exemplu: Global Nr_factura As Long Global Data_factura As Date. În cazul mai multor variabile cu acelaşi nume, variabilele locale au valabilitate numai în cadrul procedurilor. La părăsirea acestor proceduri se folosesc variabilele cu acelaşi nume, dar definite la nivel superior. Procedura de introducere a acestor variabile globale este următoarea: • se execută dublu-click oriunde în fereastra formularului pentru a deschide fereastra de editare a codului (sau se selectează opţiunea View Code din fereastra Project); • se declară variabilele din formular astfel: Option Explicit (forţează declararea variabilelor) Global Nr_factura As Long Global Data_factura As Date. Constante simbolice utilizate în Visual Basic În cele mai multe situaţii, funcţiile şi obiectele limbajului Visual Basic necesită argumente pentru efectuarea operaţiilor specifice, argumente care reprezintă constante numerice. Acestea sunt greu de interpretat din punct de vedere al utilizatorului. Pentru a le face inteligibile, limbajul Visual Basic asigură nume celor mai utilizate valori şi acestea se numesc constante simbolice. 66
Universitatea SPIRU HARET
De exemplu, pentru setarea fondului formularului frmMat pe culoarea albastră se poate scrie: frmMat. Back Color = 0XFF0000 sau, folosind constanta simbolică pentru albastru: frmMat. Back Color = VBBlue Utilizatorul îşi poate defini propriile constante ca de exemplu: const TVA = 0.19. Constantele de utilizator se scriu cu litere mari, pentru a le distinge de variabile. Domeniul de valabilitate al unei constante este similar cu cel al variabilelor. 3.4.4. Instrucţiuni Visual Basic 3.4.4.1. Construirea expresiilor Cea mai simplă instrucţiune este cea de atribuire, formatul ei este: Let variabilă = expresie. De exemplu: Let Vmftva = Cant *Pu Let Vfftva =Vfftva + Vmftva Let Nume_client = „Georgescu Constantin” Utilizatorul poate tasta sau nu cuvântul Let, dar este obligat să exprime numele variabilei şi expresia pe baza căreia se deduce conţinutul. Vmftva = Cant *Pu Vfftva =Vfftva + Vmftva Nume_client = „Georgescu Constantin” Instrucţiunile se scriu de obicei pe o singură linie fără delimitator. Pentru a putea scrie mai multe instrucţiuni pe o linie se foloseşte separatorul „:”. Observaţie: se recomandă folosirea atentă a acestui delimitator când este folosită structura If …End If. Dacă o instrucţiune este foarte lungă, ea poate continua pe următoarea linie, folosind caracterul de continuare underscore „_”. De exemplu: Print Tab(2); "COD_MATERIAL"; Tab(20); "DEN_MATERIAL"; Tab(41); "CANT"; _ Tab(48); "PRET_UNITAR"; Tab(70); "VAL_M_FARA_TVA"; Tab(100); _ "VAL_M_CU_TVA" Comentariile încep cu cuvântul cheie Rem sau „’ “. De exemplu: Rem Acesta reprezintă un comentariu ’ Acesta reprezinta un exemplu de comentariu. 3.4.4.2. Operatori Visual Basic Operatorii Visual Basic, în ordinea claselor de precedenţă, sunt prezentaţi în tabelul 3.5. Precedenţa operatorilor (clasele de precedenţă) se referă la ordinea în care se execută operaţiile într-o expresie care conţine mai multe tipuri de operatori. Primii sunt executaţi operatorii de concatenare, după care urmează operatorii arithmetic, operatorii de comparare şi, la sfârşit, operatorii logici. Operatorii pot fi unari (se aplică unui singur operand, de exemplu, Not) sau binari (prezintă doi operatori, de exemplu, +. -, *, /, And, Or etc.). 67
Universitatea SPIRU HARET
Tabelul 3.5. Clasele de precedenţă ale operatorilor în Visual Basic Clasa 1. 2. 3.
4. 5.
6.
Operator And, Or, Not Mod ,=,=, + ^ \ * / () [] &, +
Operaţia Logică Modulo Comparare Adunare Scădere Exponenţiere (ridicare la putere) Împărţire întreagă Înmulţire Împărţire Stabilire prioritate calcul Concatenare şir de caractere
3.4.4.3. Funcţii Visual Basic Funcţia (Function) reprezintă o mulţime ordonată de instrucţiuni creată în scopul îndeplinirii unei sarcini (task) bine precizată şi repetabilă. Funcţia returnează un singur rezultat. Funcţiile Visual Basic sunt predefinite sau definite de utilizator. Visual Basic asigură o bibliotecă variată de funcţii predefinite. În tabelul 3.6 sunt prezentate principalele funcţii predefinite specifice limbajului Visual Basic. Tabelul 3.6. Principalele funcţii predefinite ale limbajului Visual Basic Funcţie Abs Asc Chr Cos Date Format Left Len Mid Now Right Rnd Sin Sqr Str Time Timer
Valoare returnată Valoarea absolută a unui număr Codul ASCII sau ANSI al unui caracter Caracterul corespunzător unui cod ASCII sau ANSI Cosinusul unui unghi Data curentă ca şir de caractere Dată sau număr convertite la un şir de caractere Selectează partea stângă a unui şir de caractere Numărul de caractere dintr-un şir de caractere (lungimea şirului de caractere) Selectează o parte din şirul de caractere Data şi ora curentă Selectează partea de sfârşit a unei şir de caractere Generarea aleatoare a unui număr Sinusul unui unghi Rădăcină pătrată dintr-un număr Număr transformat într-un şir de caractere Timpul curent dat ca şir de caractere Număr de secunde rămase până la miezul nopţii (ora „0”)
68
Universitatea SPIRU HARET
Funcţii pentru şiruri de caractere Len (expresie-şir) – returnează lungimea unui şir de caractere. De exemplu: ?Len(“Contabilitate si informatica de gestiune”) ‘39 ?Len(“Finante si Banci”) ‘16 LCase (expresie-şir) – transformă literele mari în litere mici. De exemplu: ?LCase(“PIETE DE CAPITAL”) ‘piete de capital UCase (expresie-şir) – transformă literele mici în litere mari. De exemplu: ?UCase(“bursa”) ‘BURSA Left$ (expresie-şir, N) extrage N caractere dintr-un şir începând cu cel din stânga. De exemplu: ?Left$(“Fiscalitate”,4) ‘Fisc InStr ([Pornire de la], şir-complet, şir-căutat) – returnează poziţia primei apariţii a subşirului căutat dintr-un şir complet. De exemplu: ?InStr(“Informatica de gestiune”, “gest”) ‘16 ?InStr(4,“Informatica de gestiune”, “gest”) ‘12 LTrim (expresie-şir) – elimină spaţiile de la începutul şirului. De exemplu: ?LTrim(“ Moneda”) ‘”Moneda” RTrim (expresie-şir) – elimină spaţiile de la sfârşitul unui şir. De exemplu: ?RTrim(“PROFIT “) ‘”PROFIT” Trim (expresie-şir) – elimină spaţiile de la începutul şi sfârşitul şirului. De exemplu: ?Trim(“ CREDIT “) ‘”CREDIT” Mid (expresie-şir, poziţie, lungime) – returnează o parte a unui şir. De exemplu: ?Mid(“IMOBILIZARI”,4,3) ‘BIL Val (şir) – transformă un şir într-un număr. De exemplu: ?Val(“132.74”) ‘132.74 Funcţii de editare Format – se utilizează pentru a afişa o expresie într-o formă dorită de utilizator, care poate fi: - Fixed – afişează cel puţin o cifră în stânga şi două cifre în dreapta punctului zecimal; - Standard – afişează numărul cu virgule de separare a miilor, cel puţin o cifră în stânga şi două în dreapta punctului zecimal; - Currency – afişează cu semnul $, cu virgule de separare a miilor şi două cifre în dreapta punctului zecimal (9). Funcţii financiare DDB – calculează şi returnează amortismentul pe o perioadă specificată, prin metoda amortismentului regresiv cu rată dublă sau după un coeficient specificat. Formatul general al acestei funcţii este: DDB (cost; valoare reziduală; durată; perioadă; factor) unde: cost – costul iniţial al investiţiei; valoarea reziduală – valoarea rămasă la sfârşitul perioadei de amortizare; durata – durata de funcţionare dată prin număr de perioade în care investiţia se va amortiza; perioada – durata de timp; factor – coeficient de regresie. 69
Universitatea SPIRU HARET
FV (Future Value) – calculează şi returnează valoarea viitoare a unei investiţii. IPMT – calculează şi returnează suma dobânzilor unei investiţii pentru o perioadă dată. IRR – calculează şi returnează rata de rentabilitate internă pentru fluxurile financiare, atât pozitive, cât şi negative finanţate la rate diferite. MIRR – ca şi IRR numai că se referă la rata de rentabilitate internă a unei investiţii fără a ţine seama de costurile de finanţare şi de plusvalorile de reinvestire. NPFR – calculează şi returnează numărul de plăţi pentru o investiţie dată. NPV – se referă la valoarea actuală netă a unei investiţii pe baza fluxurilor financiare variabile. PMT – ajută la obţinerea sumei totale a fiecărei rambursări periodice a unei investiţii şi ratele dobânzii constante. Sintaxa acesteia este: PMT (rate, nper, pv) unde: rate – este rata dobânzii; nper – numărul total de perioade de plată pe perioada de viaţă a anuităţii; pv – valoarea prezentă a împrumutului (o valoare negativă). PPMT – calculează partea vărsământului principal al unui împrumut pentru o perioadă dată . PV (Present Value)– se obţine valoarea actuală a unei investiţii. RATE – se foloseşte pentru obţinerea ratei dobânzii pe perioada unei investiţii date. SLN – se obţine amortismentul liniar al unui bun pentru o perioadă de timp dată. SYD – calculează amortismentul unui bun pentru o perioadă dată pe baza metodei Sum – of – Years Digits. 3.4.4.4. Implementarea structurilor de control al execuţiei unui program În paragraful 2.3. s-au prezentat cele trei structuri de control fundamentale: structura de control secvenţială (liniară), structurile de control alternative (cu ramificaţii) şi structurile de control repetitive (de ciclare). Tuturor acestor structuri de control fundamentale le sunt asociate instrucţiuni specifice în limbajul de programare Visual Basic, cu ajutorul cărora poate fi controlată logica de execuţie a oricărei secvenţe de program în Visual Basic. Acestor instrucţiuni li se alătură comenzile asociate operaţiunilor de intrare/ieşire specifice introducerii datelor de intrare, respectiv extragerii rezultatelor prelucrărilor, precum şi instrucţiunile de transfer. Instrucţiuni alternative (sau cu structură alternativă) • Instrucţiunea If – cea mai simplă formă a acestei instrucţiuni este: If condiţie Then instrucţiune De exemplu: If TVA=0.19 Then Vmctva=Vmftva + TVA * Vmftva Când în instrucţiunea If, după cuvântul cheie Then urmează mai multe instrucţiuni, sintaxa generală a instrucţiunii este: If condiţie Then Secvenţă de instrucţiuni End If De exemplu: If TVA=0.19 Then Vmctva=Vmftva + TVA * Vmftva 70
Universitatea SPIRU HARET
Vfctva = Vfctva + Vmctva Print Tab(70); Vmctva; Tab(100); Vfctva End If O altă formă a instrucţiunii If este: If …Then … Else …End If. De exemplu: If TVA = 0.19 Then Vmctva=Vmftva + TVA * Vmftva Vfctva = Vfctva + Vmctva Print Tab(70); Vmctva; Tab(100); Vfctva Else Print ”TVA diferit de 19%” End If • Instrucţiunea Select Case Instrucţiunea Select Case se foloseşte în cazul când sunt precizate mai multe selecţii. Sintaxa generală a instrucţiunii este următoarea: Select Case variabilă Case Is variabilă sau expresie instrucţiuni … Case Is variabilă sau expresie instrucţiune Case Else instrucţiune End Select De exemplu, pentru selecţia persoanelor după categoria de vârstă (Categoria_varsta) se procedează astfel: Select Case Vârsta Case Is 5 Categoria_varsta = ”Copii sub 12 ani” Case Is 13 TO 19 Categoria_varsta = ”Adolescenţi” Case Is 20 TO 35, 50, 60 TO 65 Categoria_varsta = ”Adulţi” Case Is > 65 Categoria_varsta = ”Bătrâni” Case Else Categoria_varsta = ”Alte categorii” End Select Instrucţiuni repetitive Ciclarea este asigurată prin formatul general Do … Loop. Ciclările implementează operaţiile care se repetă de un anumit număr de ori, ciclarea repetându-se până când se îndeplineşte o condiţie specificată, întâlnită la începutul sau sfârşitul ciclării. • Instrucţiuni care implementează structuri de control repetitive condiţionate anterior Din această categorie fac parte instrucţiunile Do {While|Until}…Loop şi While …Wend care au următoarele sintaxe generale: Do [{While|Until} conditie] Secventa_instructiuni_1 [Exit Do] Secventa_instructiuni_2 Loop, 71
Universitatea SPIRU HARET
respectiv: While conditie Secventa_instructiuni Wend Când conditie este adevărată (True), se execută secvenţa imediată de instrucţiuni. Instrucţiunea While …Wend nu permite ieşirea forţată din ciclare. • Instrucţiuni care implementează structuri de control repetitive condiţionate posterior Din această categorie fac parte instrucţiunile Do …Loop {While|Until}care au următoarea sintaxă generală: Do [Secventa_instructiuni_1] [Exit Do] [Secventa_instructiuni_2] Loop {While|Until} conditie Un exemplu de utilizare a instrucţiunii Do …Loop Until este următorul: Do Cant = InputBox("Introduceti cantitatea materialului: ") Pu = InputBox("Introduceti pretul unitar al materialului: ") Vmftva = Cant * Pu Vmctva = Vmftva + tva * Vmftva Print Cant; Tab(48); Pu; Tab(70); Vmftva; Tab(100); Vmctva Loop Until MsgBox("CONTINUATI?", vbYesNo) = vbNo Ciclarea se repetă până când răspunsul la întrebarea “CONTINUATI?” va fi No (Nu). • Instrucţiuni care implementează structuri de control repetitive cu contor În acest caz, numărul de iteraţii este cunoscut. Din această categorie face parte instrucţiunea For … Next care are următoarea sintaxă generală: For contor=valoare_initiala To valoare_finala [Step pas] [Secventa_instructiuni_1] [Exit For] [Secventa_instructiuni_2] Next [contor]. Un exemplu de folosire a acestei instrucţiuni este următorul: For i = 1 To Nrm Cant = InputBox("Introduceti cantitatea materialului nr: " & i) Pu = InputBox("Introduceti pretul unitar al materialului nr: " & i) Vmftva = Cant * Pu Vmctva = Vmftva + tva * Vmftva txtVmftva = Format(Vmftva, "######0.00") txtVmctva = Format(Vmctva, "######0.00") Next i. 3.4.5. Crearea fişierelor în limbajul Visual Basic Limbajul Visual Basic oferă posibilitatea lucrului cu fişiere (definite în capitolul 1). Fişierele pot stoca date de tipuri diferite (date numerice, text, imagini). Accesul la datele unui fişier poate fi: binar; secvenţial; aleator. Pentru accesul binar, trebuie localizat în fişier numărul de caractere care urmează a fi citite sau scrise. Pentru accesul secvenţial, trebuie parcurse toate 72
Universitatea SPIRU HARET
înregistrările care preced înregistrarea dorită. Accesul aleator este un acces direct la înregistrările de mărime fixă, fără a necesita citirea înregistrărilor precedente. Operaţiile care se pot executa asupra fişierelor sunt: 1) deschiderea fişierelor; 2) închiderea fişierelor; 3) exploatarea fişierelor în acces secvenţial; 4) exploatarea fişierelor în acces aleator. 1. Pentru deschiderea unui fişier se foloseşte comanda OPEN. Orice fişier, înainte de a se lucra cu el, trebuie să fie deschis. Comanda OPEN alocă zone de memorie tampon pentru operaţiile de intrare/ieşire şi specifică modul de acces asociat zonei tampon. Formatul general al acestei comenzi este: OPEN nume-fişier FOR mod deschidere AS # număr-fişier LEN = expresie în care: • nume-fişier – este un şir de caractere care desemnează numele de fişier dar poate cuprinde şi un director şi o unitate de disc. Dacă fişierul nu există în momentul deschiderii lui, el va fi creat când se execută comanda OPEN. • mod de deschidere – specifică modul în care se deschide acel fişier. Pentru accesul secvenţial se poate specifica: APPEND pentru adăugare de noi înregistrări la sfârşitul fişierului deja existent; INPUT – pentru citirea înregistrărilor din fişier; OUTPUT – pentru crearea unui nou fişier. Pentru accesul binar se specifică BINARY, iar pentru accesul aleator, RANDOM. • număr-fişier – este un număr cuprins între 1-511. În modurile Binary, Input sau Random se poate deschide un fişier utilizând un număr nou, fără a închide în prealabil copia deschisă anterior; în modurile Append sau Output trebuie să se închidă în prealabil fişierul pentru a-l putea deschide cu un alt număr; pentru lucrul simultan cu mai multe fişiere în expresia #număr-fişier se utilizează funcţia FREEFILE care returnează următorul număr de fişier care poate fi utilizat în instrucţiunea OPEN; • expresie – este un număr mai mic sau egal cu 32767. În cazul utilizării fişierelor deschise RANDOM, acest număr corespunde lungimii unei înregistrări. 2. Închiderea fişierelor se execută prin intermediul comenzii CLOSE care are urmãtoarea sintaxă generală: CLOSE listă-numere-fişiere în care: • listă-numere-fişiere specifică unul sau mai multe numere separate prin virgulă. Când acest argument este absent, se închid toate fişierele. Când se închid fişierele care au fost deschise în mod Append sau Output toate datele care sunt în zona tampon acordată fişierului vor fi scrise în fişier înainte de a fi închis. La execuţia instrucţiunii CLOSE, asocierea dintre fişier şi numărul lui este dezactivată. 3. Exploatarea fişierelor în acces secvenţial. Tipul de acces secvenţial este utilizat pentru a citi sau scrie o înregistrare de aceeaşi lungime sau pentru fişiere compuse din înregistrări de lungimi diferite. Comanda PRINT # scrie datele linie cu linie într-un fişier secvenţial deschis în mod Output sau Append. Sintaxa generală a acestei comenzi este: Print # număr-fişier, listă-expresii 73
Universitatea SPIRU HARET
unde: • număr-fişier este numele fişierului. • lista-expresii este o expresie şir sau numerică sau o listă de expresii care se scrie în fişier. Pentru a scrie o linie goală după număr-fişier se pune virgulă. Comanda LINE INPUT # este folosită pentru a citi o linie dintr-un fişier secvenţial. Linia citită este atribuită unei variabile şir. Sintaxa comenzii este: LINE INPUT # număr-fişier, nume-variabilă în care: • număr-fişier este numărul fişierului; • nume-variabilă este o variabilă şir. LINE INPUT # citeşte din fişier caracter cu caracter până întâlneşte retur de car, chr (13) sau retur de car şi salt la linie nouă chr (13) + chr (10). 4. Exploatarea fişierelor în acces aleator. La deschiderea fişierului în acces RANDOM se precizează lungimea înregistrării. Scrierea unei înregistrări în fişier se face cu comanda PUT # care scrie dintr-o variabilă într-un fişier. Sintaxa comenzii este: PUT [#] număr-fişier, număr înregistrare, nume-variabilă în care: • număr-fişier este numărul fişierului; • număr înregistrare reprezintă lungimea înregistrării determinând poziţia scrierii; • nume-variabilă este numele variabilei care conţine datele care urmează a fi scrise. Citirea unei înregistrări din fişier se face citind într-o variabilă dată din fişier. Comanda este GET # de forma: GET [#] număr-fişier, număr-înregistrare, nume-variabilă, în care: • număr-fişier este numărul alocat în prealabil fişierului; • număr-înregistrare este numărul înregistrării care înmulţit cu lungimea înregistrării stabileşte poziţia citirii; • nume-variabilă este numele variabilei care conţine datele care urmează a fi citite. 3.4.6. Exemplu de aplicaţie informatică în limbajul Visual Basic Se reia aplicaţia informatică în Visual Basic cu calculul şi afişarea valorii facturii de materiale din paragrafele 3.3.2, 3.3.3, 3.3.4 şi 3.3.5, cu următorul enunţ: Să se realizeze un program în limbajul Visual Basic care să calculeze valoarea totală (fără TVA şi cu TVA) a unei facturi de materiale. Factura conţine un număr precizat de materiale. Datele de intrare sunt: numărul de materiale de pe factură (Nrm), număr factură (Nrf), data facturii (Df), codul materialului (Codmat), denumirea materialului (Denmat), cantitate (Cant) şi preţul unitar al materialului (Pu). TVA este de 19%. Datele de intrare vor fi introduse cu ajutorul casetelor de introducere a datelor prin dialog cu utilizatorul (InputBox). Datele de intrare (Nrm, Nrf, Df, Codmat, Denmat, Cant, Pu), datele intermediare (Vmftva şi Vmctva) şi datele de ieşire sau rezultatele rulării programului (Vfftva şi Vfctva) se vor afişa în casetele text (TextBox) separate din formularul prezentat în fig.3.12. Lucrul cu formularul din fig.3.12 reprezintă o 74
Universitatea SPIRU HARET
primă variantă de rezolvare a problemei cu calculul şi afişarea valorii facturii de materiale cu un număr precizat de materiale. Trebuie arătat faptul că în această variantă de rezolvare a problemei, casetele text servesc numai pentru afişare de date; în rezolvarea din paragraful 3.3.3. casetele text au fost utilizate şi pentru introducere de date. Varianta a doua de rezolvare a problemei constă în afişarea, sub formă de tabel, pe formular, a datelor de intrare, a datelor intermediare şi a rezultatelor rulării aplicaţiei. În această variantă de rezolvare a problemei, nu se mai folosesc casete text (TextBox). În ambele variante de rezolvare a problemei, se prevăd butoane de comandă (Command Button) pentru calculul şi afişarea unui material (fără TVA şi cu TVA) – butonul CALCULEAZA, pentru calculul valorii facturii (fără TVA şi cu TVA) – butonul AFISEAZA (pentru afişarea valorii facturii – fără TVA şi cu TVA) şi pentru ieşirea din program – butonul IESIRE. Varianta 1 de rezolvare a problemei Schema logică este prezentată în fig.3.18. Este folosită o structură de control repetitivă cu contor (i), condiţionată anterior care se implementează cu instrucţiunea For …Next. Codul programului în limbajul Visual Basic, pentru varianta 1 de rezolvare, este următorul: Option Explicit Dim Nr_factura As Long Dim Data_factura As Date Dim Vmftva As Double Dim Vmctva As Double Dim Vfftva As Double Dim Vfctva As Double Dim Nrm As Byte Const tva = 0.19 Private Sub cmdCalcul_Click() Dim Cod_mat As Long Dim Den_mat As String Dim Cant As Integer Dim Pu As Single Dim i As Byte Nr_factura = InputBox("Introduceti numarul facturii: ") txtNrf = Format(Nr_factura, "######0") Data_factura = InputBox("Introduceti data facturii sub forma zz/ll/aaaa") txtDf = Format(Data_factura, "Short Date") Nrm = InputBox("Introduceti numarul de materiale de pe factura: ") Vfftva = 0 Vfctva = 0 For i = 1 To Nrm 75
Universitatea SPIRU HARET
Vfftva = 0; Vfctva = 0; TVA = 0.19; i=1;
Vmftva= Cant * Pu; Vmctva=Vmftva + TVA * Vmftva; Vfftva=Vfftva + Vmftva; Vfctva = Vfctva + Vmctva;
i=i+1
Fig.3.18. Schema logică pentru varianta 1 de rezolvare a problemei 76
Universitatea SPIRU HARET
Cod_mat = InputBox("Introduceti codul materialului nr: " & i) txtCodmat = Format(Cod_mat, "######0") Den_mat = InputBox("Introduceti denumirea materialului nr: " & i) txtDenmat = Format(Den_mat, "######0") Cant = InputBox("Introduceti cantitatea materialului nr: " & i) txtCant = Format(Cant, "######0") Pu = InputBox("Introduceti pretul unitar al materialului nr: " & i) txtPu = Format(Pu, "######0.00") Vmftva = Cant * Pu Vmctva = Vmftva + tva * Vmftva Vfftva = Vfftva + Vmftva Vfctva = Vfctva + Vmctva txtVmftva = Format(Vmftva, "######0.00") txtVmctva = Format(Vmctva, "######0.00") Next i End Sub Private Sub cmdAfisare_Click() txtVfftva = Format(Vfftva, "######0.00") txtVfctva = Format(Vfctva, "######0.00") End Sub Private Sub cmdExit_Click() End End Sub Rezultatele rulării programului în prima variantă de rezolvare a problemei sunt prezentat în fig.3.19.
Fig.3.19. Rezultatele rulării programului realizat în varianta 1
Varianta 2 de rezolvare a problemei Schema logică este prezentată în fig.3.20. Este utilizată o structură de control repetitivă fără contor condiţionată posterior. Implementarea acestei structuri în program se va face cu instrucţiunea Do …Loop Until. Pe baza acestor considerente, nu mai sunt necesare variabilele i şi Nrm folosite în varianta 1 de rezolvare a problemei. 77
Universitatea SPIRU HARET
Codul programului în limbajul Visual Basic, pentru rezolvarea în varianta 2, este următorul: Option Explicit Dim Nrf As Long Dim Df As Date Dim Vmftva As Double Dim Vmctva As Double Dim Vfftva As Double Dim Vfctva As Double Const tva = 0.19 Private Sub cmdCalcul_Click() Dim Cod_mat As Long Dim Den_mat As String Dim Cant As Integer
Vfftva = 0; Vfctva = 0;
Vmftva= Cant * Pu; Vmctva=Vmftva + TVA * Vmftva; Vfftva=Vfftva + Vmftva;
Fig.3.20. Schema logică pentru varianta 2 de rezolvare a problemei 78
Universitatea SPIRU HARET
Dim Pu As Single Nrf = InputBox("Introduceti numarul facturii: ") Df = InputBox("Introduceti data facturii sub forma zz/ll/aaaa") Cls Print Tab(10); "FACTURA NR."; Tab(28); Nrf; Tab(45); "DIN DATA DE "; Tab(70); Df Print String(110, "=") Print Tab(2); "COD_MATERIAL"; Tab(20); "DEN_MATERIAL"; Tab(41); "CANT"; _ Tab(48); "PRET_UNITAR"; Tab(70); "VAL_M_FARA_TVA"; Tab(100); _ "VAL_M_CU_TVA" Print String(110, "=") Vfftva = 0 Vfctva = 0 Do Cod_mat = InputBox("Introduceti codul materialului: ") Den_mat = InputBox("Introduceti denumirea materialului: ") Cant = InputBox("Introduceti cantitatea materialului: ") Pu = InputBox("Introduceti pretul unitar al materialului: ") Vmftva = Cant * Pu Vmctva = Vmftva + tva * Vmftva Vfftva = Vfftva + Vmftva Vfctva = Vfctva + Vmctva Print Tab(2); Cod_mat; Tab(20); Den_mat; Tab(41); Cant; Tab(48); Pu; _ Tab(70); Vmftva; Tab(100); Vmctva Loop Until MsgBox("CONTINUATI?", vbYesNo) = vbNo Print String(110, "=") End Sub Private Sub cmdAfisare_Click() Print Tab(20); "VALOARE FACTURA FARA TVA = "; Tab(60); Vfftva; Print Tab(20); "VALOARE FACTURA CU TVA = "; Tab(60); Vfctva; End Sub Private Sub cmdExit_Click() End End Sub Rezultatele rulării programului în a doua variantă de rezolvare a problemei, cu datele de intrare din tabelul 3.2, sunt prezentate în fig.3.21.
Fig.3.21. Rezultatele rulării programului în a doua variantă de rezolvare a problemei 79
Universitatea SPIRU HARET
4. TEORIA BAZELOR DE DATE ŞI A SISTEMELOR DE GESTIUNE A BAZELOR DE DATE
4.1. Organizarea datelor în baze de date. Sisteme de gestiune a bazelor de date. Un sistem informatic eficace oferă utilizatorilor informaţii relevante, corecte (exacte) şi la timp. Aşa cum s-a arătat în capitolul 1, aceste informaţii sunt memorate sub formă de date în fişiere, care trebuie să fie aranjate (organizate) şi întreţinute astfel încât utilizatorii să obţină cu uşurinţă informaţiile de care au nevoie. Managementul datelor este o parte foarte importantă a sistemului informatic organizaţional economic, deoarece influenţează viteza cu care pot fi obţinute datele şi deci poate fi luată decizia. Există situaţii când viteza de luare a deciziei este o chestiune de supravieţuire pentru organizaţia economică. Un sistem de calcul din compunerea sistemului informatic are organizate datele într-o ierarhie care începe cu biţi şi octeţi (bytes) şi continuă cu câmpuri, înregistrări, fişiere, baze de date şi depozite de date. Sistemul bază de date se defineşte ca fiind ansamblul de colecţii organizate de date, împreună cu descrierea datelor şi a relaţiilor dintre ele, care reprezintă, complet, corect şi coerent, universul real al organizaţie economice (compartimentului specializat al acesteia) prin caracteristicile relevante (reprezentative) ale elementelor sale, percepute de sistem prin semantica lor (semnificaţia lor reală) şi prin legăturile dintre aceste caracteristici (fig. 4.1). Conceptul de bază de date a fost introdus în anul 1969, cu prilejul prezentării primului raport CODASYL. Ulterior, şi alte grupuri de lucru specializate (IIBM, ANSI, DBTG) şi-au adus contribuţia la standardizarea conceptelor din teoria bazelor de date. Percepţie Reprezentare
DOMENIUL CONCEPTUAL DOMENIUL SEMANTIC
UNIVERS
**********
REAL
BAZA DE DATE
COLECŢII DE DATE
CARACTERISTICI
Percepţie, Reprezentare
Fig.4.1. Definirea conceptului de bază de date 80
Universitatea SPIRU HARET
SGBD
Colecţia de date se defineşte ca fiind mulţimea de valori (date) pe care le iau caracteristicile reprezentative ale unui element din universul real al organizaţiei economice, dacă la fiecare moment de timp se aplică asupra lor un predicat, o acţiune din realitatea organizaţiei economice, împreună cu domeniile de definiţie reale ale acestor caracteristici. Într-un sistem bază de date, descrierea datelor constă în descrierea structurii de date a sistemului bază de date şi în descrierea regulilor care asigură coerenţa datelor, în raport cu universul real al organizaţiei economice reprezentat. Se reaminteşte că tipurile de structuri logice de date sunt: punctuală, liniară, arborescentă, reţea, relaţională, orientată pe obiecte (OO). Structura de date a unui sistem bază de date este determinată de modelul abstract de reprezentare a datelor folosit, numit bază de date. În funcţie de tipul stabilit pentru legăturile dintre datele din colecţiile de date (ierarhic, reţea, relaţional, orientat pe obiecte), s-au realizat mai multe modele abstracte de reprezentare a datelor, dar fiecăruia îi corespunde o singură structură de date a sistemului bază de date. Din acest motiv s-a generalizat utilizarea conceptului de bază de date, BD sau DB (DataBase), care este folosit atât pentru denumirea structurii de date a unui sistem bază de date, cât şi pentru denumirea modelului abstract de reprezentare a datelor care o determină. Mai mult chiar, conceptul de bază de date denumeşte atât colecţia organizată, cît şi structura de date folosită pentru reprezentarea acesteia în sistemul bază de date. Sistemul de gestiune a bazei de date, SGBD sau DBMS (Data-Base Management System) reprezintă un ansamblu complex de programe care asigură interfaţa dintre baza de date şi utilizator. O bază de date trebuie să satisfacă următoarele condiţii: • structura bazei de date trebuie să asigure informaţiile necesare şi suficiente pentru îndeplinirea cerinţelor de informare şi decizie; • să asigure o independenţă sporită a datelor faţă de programe şi invers; • să se realizeze o redundanţă (cardinalitatea informaţiilor colecţiilor de date) minimă şi controlată a datelor memorate; • accesul la datele stocate în baza de date să fie rapid şi eficace. O bază de date poate să fie exploatată, de regulă, în regim de prelucrare pe loturi (batch) şi în regim conversaţional. Accesarea bazei de date se realizează prin aplicaţii generale, programe de aplicaţie, limbaje de manipulare autonome (procedurale şi neprocedurale), interfeţe specializate cu limbajele de programare clasice etc., local sau de la distanţă, prin utilizarea calculatoarelor singulare sau a reţelelor de calculatoare. Rezultatele interogărilor utilizatorilor se prezintă sub formă vizuală, listată, prin memorare pe diverşi suporţi tehnic de date, local sau la distanţă. Sistemul bază de date are rolul de organizare şi stocare a unor volume mari de date, în vederea gestionării, prelucrării, distribuirii şi utilizării multiple, folosind sistemele de calcul, programele utilitare şi programele de aplicaţie. Pornind de la funcţia sa, un sistem bază de date este format, ca structură generală, din: colecţii de date, baza de date, SGBD, programe de aplicaţie şi utilitare, precum şi utilizatori. Dacă conceptul de bază de date denumeşte atât 81
Universitatea SPIRU HARET
colecţiile de date, cât şi structura de date folosită pentru reprezentarea acesteia, atunci structura generală a sistemului bază de date este baza de date, SGBD, programe de utilizare, utilizatori. Arhitectura unui sistem bază de date este prezentată în fig.4.2. În conformitate cu specificaţiile utilizatorilor finali (end-users), programatorii de aplicaţie, având la dispoziţie utilitare (programe specializate de proiectare) şi prin colaborarea cu administratorul bazei de date (acesta lucrează nemijlocit cu schema bazei de date), pun la punct programele de aplicaţie. Aşa cum s-a precizat deja, interfaţa dintre baza de date şi schema BD, utilitare şi programele de aplicaţie este sistemul de gestiune a bazei de date, SGBD. Obiectivele unui SGBD sunt, în principal, următoarele: • asigurarea independenţei datelor faţă de aplicaţie; • asigurarea redundanţei minime şi controlate a datelor; • asigurarea tuturor facilităţilor posibile de exploatare a datelor; • asigurarea securităţii şi protecţiei datelor împotriva accesului neautorizat (inclusiv prin criptarea datelor); • asigurarea coerenţei şi integrităţii datelor împotriva ştergerilor accidentaşle sau intenţionate; • asigurarea partajării datelor (accesul concurent al utilizatorilor la baza de date); • asigurarea nivelului de performanţă globală (volum mare de date complexe gestionate cu un timp de răspuns acceptabil la adresarea cererilor de interogare din partea utilizatorilor multipli). Funcţiile generale ale unui SGBD sunt: 1) descrierea datelor (definirea structurii bazei de date prin intermediul limbajului de definire a datelor); 2) manipularea datelor (încărcarea, actualizarea, prelucrarea şi regăsirea datelor cu ajutorul limbajului de manipulare a datelor); 3) utilizarea bazei de date (de către toate categoriile de utilizatori); 4) administrarea bazei de date. Fiecare grup de lucru pentru standardizarea bazelor de date (CODASYL şi ANSI, în principal) a propus o arhitectură proprie a unui SGBD. Comenzile SGBD (DBMS) pot fi grupate în trei categorii de limbaje: a) limbajul de definire a datelor (DDL, Data Definition Language); b) limbajul de manipulare a datelor (DML, Data Manipulation Language); c) limbajul de descriere a stocării datelor (DSDL, Data Storage Description Language). Limbajul de definire a datelor asigură, în principal: • definirea tuturor tipurilor de înregistrări şi de câmpuri de date, precum şi asocierea corespondenţei acestora cu nivelul conceptual; • specificarea ordinii logice a câmpurilor de date; • definirea câmpurilor ce vor fi folosite drept chei de căutare; • definirea drepturilor de acces; • definirea legăturilor între tipurile de înregistrări. 82
Universitatea SPIRU HARET
Limbajul de manipulare a datelor permite: • parcurgerea structurilor şi a legăturilor existente; • accesul la înregistrări prin adresă sau prin conţinutul acestora; • actualizări ale înregistrărilor; • reordonări ale câmpurilor de date; • definirea tranzacţiilor şi a condiţiilor de eroare. Limbajul de descriere a stocării datelor oferă posibilităţi de: • asociere a fişierelor la programele de aplicaţie, a dispozitivelor fizice, alocare de spaţii de memorie; • specificarea zonelor de lucru permanente şi tranzitorii; • definirea şi izolarea datelor confidenţiale; • specificarea structurilor de memorare, a mecanismelor de adresare, a modului de translatare a înregistrării logice în înregistrare fizică; • crearea indecşilor asociaţi cheilor de căutare. Operaţiile ce se execută asupra unei baze de date sunt: • creare; • încărcare (populare); • consultare: căutare (selecţie); • actualizare: modificare, adăugare articole noi, ştergerea unor articole, ordonare (sortare, indexare), prelucrare etc. PROGRAM DE APLICAŢIE
Baza de date
SGBD
UTILIZATORI
SCHEMA BD
ADMINISTRATOR
UTILITARE
PROGRAMATOR DE APLICAŢIE
Fig.4.2. Arhitectura unui sistem bază de date
Dicţionarul de date (Data Dictionary) este un fişier care memorează definiţiile datelor şi caracteristicile lor ca: folosirea, reprezentarea fizică, proprietatea (cine este responsabil pentru întreţinerea lor), autorizarea şi securitatea. Prin faptul că reprezintă un inventar al datelor conţinute într-o bază de date, dicţionarul de date este un important instrument de management organizaţional. În realizarea acestor dicţionare de date se folosesc metadatele. Metadatele reprezintă date despre date (nume, conţinut, semnificaţie, proprietar etc.). O bază de date este compusă dintr-o mulţime de atribute (câmpuri, coloane) şi are asociată o mulţime de date (linii, rânduri, înregistrări, articole). O 83
Universitatea SPIRU HARET
înregistrare (record) reprezintă o asociere a valorilor pentru fiecare câmp (field) al bazei de date. Cele trei nivele de organizare a datelor într-o bază de date sunt logic, virtual şi fizic (fig.4.3). NIVEL LOGIC
NIVEL VIRTUAL
NIVEL FIZIC
SCHEMA EXTERNĂ 1
SCHEMA EXTERNĂ 2
SCHEMA CONCEPTUALĂ
SCHEMA FIZICĂ
SCHEMA EXTERNĂ n Fig.4.3. Niveluri de organizare a datelor într-o bază de date
Nivelul logic sau extern (nivelul programatorului de aplicaţie) califică o structură de date ce are o realitate în planul semnificaţiei sau utilizării, dar nu şi în implementarea fizică; califică forma în care fiecare utilizator vede structurarea datelor, în funcţie de aplicaţia pe care o foloseşte sau în funcţie de resursele de date pe care administratorul bazei de date i le pune la dispoziţie. Nivelul virtual sau conceptual (nivelul administratorului bazei de date) se referă la definirea structurii datelor din baza de date astfel încât aceasta să îndeplinească cerinţele tuturor utilizatorilor, în condiţii de redundanţă minimă şi controlată a acesteia. Nivelul fizic (nivelul inginerului de sistem) priveşte modul de stocare şi de structurare a datelor pe suportul fizic de memorare a datelor (volum magnetic, cilindru, pistă, sector, bloc, octet şi bit). Structura virtuală reprezintă schema bazei de date, iar structura logică este denumită subschema bazei de date (concepţia CODASYL). Astfel, se poate concluziona că SGBD (DBMS) asigură legătura dintre nivelul conceptual (virtual) şi nivelul fizic. O înregistrare virtuală se poate prezenta sub forma unei sau mai multor înregistrări fizice şi poate participa la construirea unei sau mai multor înregistrări logice. Într-o bază de date ideală, datele sunt definite o singură dată şi folosite ori de câte ori este necesar. 84
Universitatea SPIRU HARET
În funcţie de locul în care sunt memorate colecţiile de date ce formează baza de date, se deosebesc: • baze de date centralizate, CDB (Centralized DataBases), în situaţia în care toate colecţiile care formează baza de date sunt stocate pe un singur calculator; • baze de date distribuite, DDB (Distributed DataBases), în situaţia în care colecţiile care formează baza de date sunt răspândite în nodurile unei reţele de calculatoare şi de comunicaţii. Bazele de date distribuite sunt prezentate în capitolul 8 al lucrării. După orientare, bazele de date pot fi generalizate şi specializate. În cadrul DDBMS, accesarea bazelor de date distribuite, DDB se realizează, în principal, prin intermediul limbajului structurat de interogare, SQL (Structured Querry Language) şi al arhitecturii Client/Server (acestea sunt prezentate pe larg în capitolul 7 al lucrării). Realizarea unei baze de date se obţine prin parcurgerea etapelor prezentate în fig.4.4. Conţinutul acestor etape este dependent, de regulă, de tipul bazei de date şi de domeniul în care este ea folosită. Activitatea de analiză a sistemului economic presupune: a) analiza componentelor sistemului şi a legăturilor dintre acestea sau analiza structurală în urma căreia se defineşte modelul structural sau static al sistemului economic; b) analiza stărilor sistemului şi a tranzacţiilor posibile între aceste stări în raport cu anumite evenimente. În urma acestei analize rezultă modelul dinamic sau temporal; c) analiza cerinţelor informaţionale, în urma căreia se defineşte modelul funcţional al sistemului economic; d) integrarea modelelor sistemului economic (structural, dinamic şi funcţional) în scopul corelării şi completării lor. Se face menţiunea că analiza funcţională a sistemului are ca scop determinarea transformărilor de date care se produc în cadrul sistemului în scopul satisfacerii cerinţelor informaţionale specifice acestui sistem. Transformările de date se vor prezenta sub forma unei diagrame de flux a prelucrărilor (modelul funcţional), în care nodurile reflectă procesele de prelucrare informaţională şi arcele fluxurile informaţionale ale datelor în baza de date. La proiectarea unei baze de date, procesul de normalizare ajută proiectantul bazei de date să creeze o structură a bazei de date care poate economisi spaţiul de memorare a datelor şi poate conduce la creşterea eficienţei prelucrării datelor. Scopul normalizării este de a minimiza redundanţa datelor. Erorile de introducere a datelor pot să compromită precizia şi validitatea bazei de date. Utilizatorul poate să fie uneori în situaţia de a nu conştientiza faptul că el introduce date incorecte. Datele incorecte pot proveni, în primul rând, de la apăsarea greşită a unor taste. Cele mai multe SGBD-uri pot preveni, dar nu pot elimina introducerile incorecte de date. Informaţia furnizată de rutinele de prelucrare şi de rapoarte este la fel de precisă şi corectă în măsura în care aceste caracteristici sunt prezente şi la datele stocate în bazele de date. 85
Universitatea SPIRU HARET
ANALIZĂ SISTEM (DOMENIU ECONOMIC ŞI CERINŢE INFORMAŢIONALE ASOCIATE) PROIECTAREA STRUCTURII BAZEI DE DATE (SCHEME CONCEPTUALE) POPULAREA (ÎNCĂRCAREA) BAZEI DE DATE CU DATE
EXPLOATAREA ŞI ÎNTREŢINEREA BAZEI DE DATE
Fig.4.4. Etapele de realizare a bazelor de date
Formatul de câmp menţine consistenţa datelor prin asigurarea unei structuri de introducere a datelor, aşa cum se arată în fig.4.5. X – cifră, A - literă
Format câmp CONT LA BANCĂ
ROXXAAAAXXXXXXXXXXXXXXXX Exemplu
RO96RXBR0000000431267982 Fig.4.5. Formatul de câmp pentru CONT LA BANCA
86
Universitatea SPIRU HARET
Proiectantul bazei de date poate să preîntâmpine introducerea datelor incorecte prin: - specificarea unui anumit format de câmp destinat pentru introducerea datelor (formatul de câmp este de fapt o imagine a modului în care trebuie să arate data atunci când această dată este introdusă în baza de date); - utilizarea regulilor de validare a câmpurilor (acele specificaţii prin care se filtrează datele introduse într-un anumit câmp), a casetelor cu liste sau a formatelor predefinite. 4.2. Generaţii de baze de date şi de sisteme de gestiune a bazelor de date asociate În evoluţia istorică, bazele de date şi sistemele de gestiune a bazelor de date (SGBD) asociate au cunoscut trei generaţii: • sistemele ierarhice şi reţea; • sistemele relaţionale; • sistemele în tehnologie avansată (orientate obiect, relaţionale orientate obiect, deductive, distribuite, multibaze, active, multimedia, online etc.). Sistemele ierarhice şi reţea reprezintă datele la nivel de articol, prin legături ierarhice (arbore) sau de tip graf reţea. Deoarece datele prezintă o slabă independenţă fizică, SGBD (DBMS) este mai complicat şi mai greoi în comparaţie cu celelalte sisteme. Drumurile de acces la date sunt specificate prin intermediul limbajului de manipulare a datelor. Diagrama structurii de date (graf orientat ce reprezintă tipuri de entităţi şi legături funcţionale dintre ele) serveşte pentru descrierea, la nivel logic, a structurilor de date specifice sistemelor ierarhice şi reţea. Sistemele relaţionale tratează entităţile ca nişte relaţii. Modelul relaţional (ce aparţine lui E.F.Codd) reprezintă un model formal de organizare conceptuală a datelor, ce realizează reprezentarea legăturilor dintre date, având la bază teoria matematică a relaţiilor. Un sistem relaţional este compus formal dintr-o bază de date relaţională, o colecţie de operatori relaţionali, regulile de integritate care guvernează utilizarea cheilor în model şi un set de asocieri. Elementele de definire a modelului relaţional corespund celor trei componente ale ingineriei software: informaţie, proces, integritate. Problematica de detaliu a sistemelor de gestiune a bazelor de date relaţionale este tratată în paragraful următor. Sistemele de gestiune a bazelor de date în tehnologii avansate elimină cea mai mare parte a acestor dezavantaje. Aşa cum s-a arătat în capitolul 2, în programarea orientată pe obiecte, OOP (Object-Oriented Programming), efortul esenţial este direcţionat pentru definirea obiectelor. Obiectele de acelaşi tip formează o clasă ce cuprinde, alături de date, şi metodele de acces la aceste date. Datele sunt transparente numai pentru metodele asociate clasei respective (încapsularea datelor). Prin funcţiile denumite constructori şi destructori, se realizează controlul asupra creerii şi ştergerii unui anumit obiect. Prin moştenire, se obţin clase derivate ce moştenesc proprietăţile (date şi funcţii) claselor-părinte. Prin reunirea tehnicilor bazelor de date cu acelea ale limbajelor orientate obiect s-au 87
Universitatea SPIRU HARET
obţinut bazele de date orientate obiect şi sistemele de gestiune aferente acestora, OODBMS (Object-Oriented DBMS). Se realizează astfel o organizare coerentă a obiectelor partajate între utilizatori concurenţi. OODBMS prezintă următoarele avantaje: • integrarea descrierii structurale şi comportamentale; • posibilităţi superioare de deducţie (ierarhie de clase, moştenire); • considerarea aspectelor dinamice în cadrul aplicaţiilor; • îmbunătăţirea interfeţei cu utilizatorii. Se apreciază, totuşi, că administrarea obiectelor complexe este mai dificilă decât accesul la relaţii prin cereri SQL, specific bazelor de date relaţionale. Avantajele incontestabile ale tehnologiei orientate obiect au fost combinate cu acelea ale modelului relaţional, rezultând bazele de date relaţionale orientate obiect. Relaţiile sunt mulţimi de înregistrări ce reprezintă fapte. Cunoştinţele se definesc ca aseţiuni generale şi abstracte asupra faptelor. Pe baza faptelor cunoscute tezaurizate în cunoştinţe, se pot deduce noi fapte printr-un proces de raţionamente. Bazele de date deductive ce folosesc programarea logică (specifică inteligenţei artificiale) administrează cunoştinţe relativ la baze de date ce sunt, de regulă, RDB. Sistemele multibaze de date sunt compuse din mai multe sisteme de baze de date ce sunt integrate pe baza schemelor globale. Se realizează astfel accesul uniform şi integrat la fiecare dintre bazele de date componente. Dacă se consideră scopul esenţial de analiză a datelor, inclusiv istorice, pentru toată organizaţia, o bază de date optimizată în acest scop defineşte o Data Warehouse (depozit de date), după principiul procesării analitice, OLAP (On-Line Analytical Processing). Sistemele tranzacţionale (ce se folosesc pentru prelucrarea datelor operaţionale ale organizaţiei economice) au la bază principiul procesării tranzacţionale online, OLTP (On-Line Transactional Processing), de control la un moment dat al unei singure tranzacţii. Data Warehouse admite interogări ce nu sunt predefinite şi oferă răspunsuri ad-hoc pe baza analizelor datelor ce se referă la întreaga organizaţie. Data Warehouse se subdivide în baze de date departamentale (domenii de gestiune ale organizaţiei), denumite rafturi de date (Data Marts). Realizarea sistemelor de sprijin al deciziilor, DSS (Decision Support Systems), implică un proces laborios de descoperire a informaţiilor utile din cadrul bazelor mari de date. Procesul este denumit Data Mining (« mineritul datelor ») sau de descoperire a cunoştinţelor în baza de date, KDD (Knowledge Discovery in Databases). O bază de date OLAP poate să fie bază de date relaţională, dar şi bază de date multidimensională. Structura unei baze de date multidimensionale conţine obiecte de următoarele tipuri: variabile, dimensiuni, niveluri, ierarhii, atribute. Acestea sunt tratate mai pe larg în capitolul 9 (studenţii de la specializarea Contabilitate şi informatică de gestiune studiază în profunzime aceste baze de date la disciplina Sisteme informatice de asistare a deciziei din anul IV). 88
Universitatea SPIRU HARET
4.3. Baze de date relaţionale Termenul de bază de date relaţională (BDR) a fost introdus de E.F.Codd de la firma IBM în anul 1969. Modelul relaţional este fundamentat pe reguli, structuri şi operaţii. Regulile stabilesc modul de manipulare a datelor, structurile sunt obiecte definite ce conţin date şi care sunt accesibile utilizatorului, iar operaţiile reprezintă acţiuni prin care sunt manipulate datele sau obiectele schemei bazei de date. E.F.Codd a formulat în anul 1985 cele 13 reguli de bază care definesc o bază de date relaţională şi care sunt prezentate în tabelul 4.1. Tabelul 4.1 Nr. regulii R0 R1
R2
R3 R4
R5 R6
R7
R8
Conţinutul regulii SGBD gestionează datele la nivel de relaţie (exclusiv pe baza caracteristicilor relaţionale). Toate datele din baza de date relaţională se reprezintă explicit sub forma unor valori într-un tabel (regula reprezentării logice a datelor). Datele individuale dintr-un tabel sunt accesate prin specificarea numelui tabelului, a valorii cheii primare şi a coloanei (regula garantării accesului la date) Valorile NULL (inexistenţa datelor) sunt tipuri de date acceptate (regula referitoare la valorile NULL). Baza de date relaţională reprezintă descrierea bazei de date în format logic simplificat sub formă de tabele (regula metadatelor). Modelul relaţional permite implementarea mai multor limbaje (regula de permisiune a limbajelor multiple). Dacă vederea curentă reprezintă un tabel, toate vederile (view-urile) sunt actualizabile (regula actualizării vederilor). În operaţiile de schimbare a conţinutului bazelor de date, se lucrează la un moment dat pe toată relaţia (regula referitoare la actualizări, inserări şi ştergeri în baza de date). Structura logică a bazei de date se prezintă complet separată de structura fizică a bazei de date (regula referitoare la independenţa fizică a datelor).
Comentarii Conceptul de bază este relaţia. Catalogul conţine denumiri de tabele, coloane, domenii, restricţii de integritate etc. Datele sunt accesibile prin numele tabelului, a liniei şi a coloanei.
Valoarea NULL semnifică „nimic”. A nu se confunda cu zero (0). Metadatele sunt date despre date. Regula nu face diferenţieri între tratarea datelor şi a metadatelor. SQL este limbajul de bază pentru realizarea interogărilor asupra bazei de date. Toate tabelele virtuale ce teoretic sunt posibil de actualizat, trebuie să fie în mod practic actualizate. Modelul relaţional abordează relaţiile de bază şi pe cele derivate ca pe un singur operand destinat operaţiilor de actualizare (update), inserare (insert) şi ştergere (delete) efectuate asupra datelor. Programele de aplicaţie nu trebuie să fie influenţate de schimbările survenite în modul de reprezentare a datelor sau în metodele de acces. 89
Universitatea SPIRU HARET
R9
R10
R11
R12
Atunci când bazei de date i se aduc modificări neconforme, datele se conservă (regula referitoare la independenţa logică a datelor). Restricţiile de integritate sunt definte în limbajul folosit de sistem (regula referitoare la restricţiile de integritate). Accesarea datelor pe server de către client se produce în mod continuu (regula referitoare la distribuirea geografică a datelor). Regulile şi restricţiile de integritate nu pot fi evitate de nici un limbaj de acces la date (regula referitoare la prelucrarea datelor la nivel de bază).
Programele de aplicaţie nu trebuie să fie influenţate de schimbările efectuate asupra relaţiilor bazelor de date. Restricţiile de integritate sunt create în limbajul SQL şi se stochează în dicţionarul bazei de date şi nu în aplicaţiile individuale. Este presupusă producerea unui proces de copiere a datelor dintr-o bază de date localizată la distanţă. Nu trebuie folosit un limbaj de nivel scăzut orientat pe prelucrarea pe tupluri.
Trebuie precizat faptul că nici un SGBD actual nu respectă în totalitate cele 13 reguli ale lui Codd. Aşa cum s-a arătat, o bază de date relaţională reprezintă o colecţie de relaţii (tabele în accepţiunea uzuală, memorate fizic în fişiere). Coloanele tabelului se numesc atribute, iar liniile se numesc tupluri. Baza de date relaţională (RDB) este compusă dintr-o mulţime de domenii şi o mulţime de relaţii peste care se aplică o mulţime de asocieri. Domeniul este definit ca mulţimea obiectelor de acelaşi tip. Relaţia este o mulţime rezultată ca urmare a agregării (corespondenţei) a două sau mai multe mulţimi. O relaţie în accepţiunea bazelor de date pe domeniile Di constă dintr-un cap de tabel şi un corp de tabel. Asocierea se realizează pe bază de atribute (din capul de tabel). Un astfel de exemplu este tabelul (relaţia) referitor la MATERIALE: Cod_material 01212 03214 04301
Denumire_material Tablă Cornier Cherestea
Cantitate 1200 400 850
Pret_unitar 180000 420000 210000
Fiecare linie descrie un anumit material. Coloanele conţin etichete ce reprezintă nume ale atributelor (Cod_material, Denumire_material, Cantitate, Pret_unitar). Domeniul ce reprezintă codurile materialelor este: D1: {“01212”,”03214”,”04301”}. iar domeniul pentru tipurile de materiale (delimitate prin denumire_material) este: D2: {“TABLA”,”CORNIER”,”CHERESTEA”}. Domeniul pentru cantitate este: D3: {“1200”,”400”,”850”}. Domeniul preţurilor unitare, în acest caz, este: D4: {pret_unitar ⎢pret_unitar∈[180000,420000]}. Mulţimea tuplurilor este definită prin produsul cartezian al domeniilor D1 X D2 X …X Dn. Exemplu de tuplu: . 90
Universitatea SPIRU HARET
Relaţia L se defineşte prin tupluri corespunzătoare din tabel: L:, }. Într-o relaţie, este necesar ca tuplurile să fie distincte (nu se permit valori duplicate). Ca urmare, se observă că relaţia este reprezentată prin tabelul bidimensional în care coloanele sunt domenii iar liniile sunt tupluri. Numărul tuplurilor unei relaţii este cardinalul relaţiei. Numărul valorilor unui tuplu este gradul relaţiei. Schema unei relaţii este formată din numele relaţiei şi lista atributelor (pentru fiecare atribut este necesară specificarea domeniului asociat). Modelul relaţional este format din două mulţimi de operatori pe relaţii: algebra relaţională şi calculul relaţional. E.F.Codd a definit algebra relaţională ca o colecţie de operaţii pe relaţii, astfel încât o anumită operaţie dispune de operanzi de tipul relaţie şi are ca rezultat tot o relaţie. Tipurile de operaţii acceptate de algebra relaţională sunt operaţii de bază (reuniunea, diferenţa, proiecţia, produsul cartezian ş.a.), operaţii derivate (intersecţia şi diviziunea) şi operaţii suplimentare (selecţia, splitarea unei relaţii, complementarea unei relaţii, închiderea tranzitivă, joncţiunea etc.). Algebra relaţională permite derivarea procedurală a relaţiilor. Se prezintă ca exemplu reuniunea. Reuniunea (notată cu OR, ∪, APPEND sau UNION) este o operaţie definită pe relaţiile Rel1 şi Rel2 (cu aceeaşi schemă), ce generează o nouă relaţie Rel3 (cu schema identică cu a relaţiilor Rel1 şi Rel2) care este formată din reuniunea tuplurilor relaţiilor Rel1 şi Rel2 (fig.4.6). Calculul relaţional conţine mulţimea operatorilor din modelul relaţional şi este o adaptare a calculului cu predicate (o relaţie este identificată cu un predicat) pentru domeniul BDR. Calculul relaţional asigură definirea neprocedurală, declarativă a relaţiilor. Relaţiile sunt precizate prin proprietăţile tuplurilor. Iniţial, în BDR, variabilele definite asupra relaţiilor aveau valori care reprezentau tupluri de relaţie (variabile tuplu), obţinându-se calculul relaţional orientat pe tuplu. Când variabilele operează asupra domeniilor – aşa cum se petrec lucrurile în prezent – ele sunt variabile domeniu şi determină calculul relaţional orientat pe domeniu. Regulile de integritate sunt aserţiuni pe care datele ce formează baza de date trebuie să le satisfacă şi sunt în număr de trei: unicitatea cheii (cheia primară trebuie să fie unică şi minimală), integritatea entităţii (atributele cheii primare trebuie să fie diferite de null) şi integritatea referirii (o cheie externă trebuie să fie null în întregime sau să corespundă unei valori a cheii primare asociate). Constrângerile structurale sunt de trei tipuri: de cheie, de referinţă şi de entitate.
Rel1 OR
Rel2
Rel3
Fig.4.6. Diagrama operaţiei reuniune 91
Universitatea SPIRU HARET
Cheia unei relaţii reprezintă o mulţime minimală de atribute ale căror valori identifică în mod unic un tuplu într-o relaţie. Diferitele chei posibile se numesc chei-candidat. Cheia candidat aleasă pentru a identifica efectiv tupluri se numeşte cheie primară. Conceptele folosite pentru descrierea formală, uzuală şi fizică a elementelor de bază ale organizării datelor în baze de date relaţionale sunt prezentate în tabelul 4.2. [44]. Tabelul 4.2 Formal Relaţie Tuplu Atribut Domeniu
Uzual Tablou Linie Coloană Tip de dată
Fizic Fişier Inregistrare Câmp Tip de dată
Definirea proprietăţilor structurale ale relaţiilor se realizează prin tehnica normalizării. Se afirmă că o relaţie se găseşte într-o formă normală particulară dacă îndeplineşte un număr specificat de restricţii. Normalizarea se obţine printr-un număr de paşi succesivi, în cadrul unui proces reversibil, până la realizarea formei dorite. Forma normală a unei relaţii este necesară deoarece formele normale nu produc anomalii în actualizarea datelor unei baze de date relaţionale. Tipurile de restricţii folosite la formele normale ale relaţiilor sunt restricţiile asupra valorilor atributelor, restricţiile referitoare la dependenţa atributelor secundare de chei, restricţiile cu privire la dependenţa atributelor principale de toate atributele. Se folosesc următoarele forme normale: • 1NF (forma normală 1). O relaţie se găseşte în 1NF dacă domeniile pe care sunt definite atributele relaţiei sunt formate numai din valori elementare. Un tuplu nu trebuie să conţină atribute sau grupuri de atribute repetitive (nu se admit duplicate). • 2NF (forma normală 2). O relaţie se află în 2NF dacă este în 1NF şi oricare dintre atributele non-cheie este dependent funcţional complet de cheia primară a relaţiei. • 3NF (forma normală 3). O relaţie se găseşte în 3NF dacă este în 2NF şi atributele non-cheie nu sunt dependente tranzitiv de cheia primară a relaţiei. • BCNF (forma normală Boyce-Codd). O relaţie este în BCNF dacă dependenţele funcţionale netriviale ce pot apare în cadrul relaţiei conţin, în partea stângă, ca determinant, o cheie-candidat. • 4NF (forma normală 4). O relaţie se găseşte în 4NF dacă în cadrul acesteia nu se manifestă mai mult decât o dependenţă multivaloare. • 5NF (forma normală 5). O relaţie L se găseşte în 5NF dacă fiecare dependenţă joncţiune este implicată printr-o cheie-candidat a lui L. Bazele de date relaţionale conţin structuri de date simple şi intuitive. Ele prezintă avantaje legate de existenţa unui ansamblu integrat de utilitare bazat pe un limbaj evoluat de programare (generatoare de meniuri, generatoare de forme, generatoare de aplicaţii, generatoare de etichete), de existenţa unor limbaje speciale 92
Universitatea SPIRU HARET
de definire şi de manipulare a datelor, precum şi de independenţa completă în descrierea logică a datelor (în termeni de relaţii) şi în descrierea fizică a datelor (în termen de fişiere). Dintre dezavantajele bazelor de date relaţionale, se menţionează imposibilitatea utilizării obiectelor complexe şi dinamice, a administrării datelor distribuite şi a cunoştinţelor. 4.4. Baze de date orientate obiect Bazele de date orientate pe obiecte, OODB (Object-Oriented DataBase), şi SGBD asociate asigură crearea de obiecte complexe formate din componente simple, fiecare prezentând atribute şi comportament propriu. Aceste sisteme se mai numesc şi sisteme de obiecte, cu originea în limbajele de programare orientate pe obiecte, OOP. Prin aceste tipuri de baze de date se ridică nivelul de abstractizare. Se face menţiunea că între partea de limbaje de programare şi partea de baze de date există multe elemente comune; cu toate acestea, aceste părţi sunt diferite: • un program pe calculator este gândit să rezolve o anumită problemă; • o bază de date este realizată pentru a rezolva o multitudine de probleme, inclusiv cu elemente de pornire nedeterministe. Pentru un program, obiectele complexe simplifică problema, în timp ce în situaţia bazelor de date orientate pe obiecte, de regulă, problemele se complică. Ca urmare, se cuvine să se judece în mod nuanţat atunci când se încearcă reliefarea avantajelor utilizării OOP şi OODB. Sistemul de gestiune al bazelor de date orientate pe obiect (SGBD-OO sau OODBMS) are ca principale obiective [18]: 1. Modelarea superioară a datelor, ceea ce semnifică dezvoltarea de noi aplicaţii; extinderea posibilităţilor de generalizare şi agregare a relaţiilor; evoluţia către multimedia şi hipermedia (sunet, imagine, texte). 2. Capacitatea de deducţie superioară (ierarhie de clase, moştenire). 3. Îmbunătăţirea interfeţei cu utilizatorul. 4. Capacitatea de tratare dinamică, concomitent cu integrarea descrierii structurale şi comportamentale. Modelul de dată-obiect asigură reprezentarea unor structuri de date complexe şi a unor ierarhii model, creând posibilitatea de definire a unor tipuri de date care combină atât structura de date, cât şi definirea procedurii. Un model de date orientat pe obiecte are la bază noţiunea de entitate conceptuală şi defineşte un obiect ca o colecţie de proprietăţi care descriu entitatea. O comparaţie între noţiunile clasice şi cele asociate bazelor de date orientate pe obiecte este prezentată, după Date [5], în tabelul 4.1. Tabelul 4.3 Nr.crt 1. 2. 3. 4. 5.
Noţiunea specifică obiectelor Obiect nemutabil (care nu se poate muta) Obiect mutabil (care se poate muta) Clasa de obiecte Metoda Mesaj
Noţiunea clasică de comparaţie Valoare Variabilă Tip Operator Invocarea de operator 93
Universitatea SPIRU HARET
Obiectul reprezintă conceptual o unitate identificabilă cu conţinut propriu, care se deosebeşte de ceea ce o înconjoară. Fiecare obiect dispune de un identificator unic, denumit ID al obiectului, OID (Object ID). Două obiecte cu OID diferiţi sunt diferite, chiar dacă sunt identice sub toate aspectele transparente utilizatorului. Deşi tentaţia iniţială este de a considera obiecte doar unităţile ce se pot muta, prin obiecte se desemnează atât unităţile fixe cât şi cele mutabile. Fiecare obiect posedă un tip care semnifică o clasă de obiecte. Instanţa unui obiect reprezintă un obiect individual. Obiectele sunt încapsulate. Structura obiectului şi modul de acţiune al metodelor sale nu pot fi accesate şi actualizate direct de un agent extern, dar pot fi modificate indirect prin intermediul mesajelor. Această caracteristică ascunsă a obiectului se numeşte încapsulare. Încapsularea presupune independenţa fizică de date. Astfel, prin încapsulare, reprezentarea internă a unui obiect poate să fie modificată fără a fi nevoie ca aplicaţiile care utilizează obiectul să fie rescrise. Starea unui obiect este exprimată prin valorile atributelor sale. Colecţia de atribute trebuie aleasă astfel încât să descrie entitatea, adică să cuprindă atribute pe care utilizatorul trebuie să le cunoască. Metoda reprezintă un program care manipulează obiectul sau indică starea sa. Ea este asociată unei clase, iar specificarea metodei se numeşte „semnătură”. Comportamentul unui obiect reprezintă un set de metode sau operaţii care acţionează asupra atributelor sale. Obiectele se clasifică în: • obiecte elementare ca: întreg, boolean, şir de caractere; • obiecte compuse ca: nume, adresă; • obiecte complexe ca: autoturism, angajat. Un obiect înglobează următoarele elemente: a) structura de date; b) specificarea operaţiilor; c) implementarea operaţiilor. Structura unui obiect şi operaţiile (metodele) permise pentru acel obiect sunt definite împreună. Metodele şi atributele nu sunt vizibile din „exteriorul” obiectului. Un obiect răspunde la mesaje care reprezintă cereri adresate obiectului pentru a returna o valoare sau pentru a-şi schimba starea. Un obiect este divizat în interfaţă publică şi în memorie privată. Interfaţa publică este compusă din definiţiile interfeţelor (corespunzătoare semnăturilor specificaţiei). Interfaţa publică nu face parte din obiectul corespunzător. Această interfaţă publică este inclusă în obiectul de definire a clasei, CDO (Class-Defining Object). CDO este obiectul ce defineşte clasa pentru care obiectul considerat reprezintă o instanţă (este similar unui descriptor). Memoria privată este compusă din variabile de instanţă (atribute sau membri) ale căror valori reprezintă starea internă a obiectului. Deoarece sistemele baze de date orientate pe obiecte reale nu sunt „pure” (cu variabile instanţă care sunt netransparente utilizatorului), variabilele de instanţă apar ca transparente utilizatorului. Se deosebesc variabile de instanţă publice (transparente utilizatorului) şi variabile de instanţă private (cele netransparente utilizatorului). Persistenţa este o proprietate a datelor sau a obiectelor care presupune existenţa lor pe o durată mai mare în comparaţie cu aceea a procesului care le-a 94
Universitatea SPIRU HARET
generat. Persistenţa reprezintă proprietatea prin care starea bazei de date asigură execuţia unui proces pentru a fi refolosit ulterior în alt proces. Deoarece face parte integrantă din obiect, codul aferent metodelor este stocat în baza de date (ca şi starea obiectului). Tipuri şi clase Obiectele care prezintă acelaşi fel de atribute şi acelaşi comportament fac parte din acelaşi tip sau clasă. În raport cu această caracteristică există două categorii de sisteme orientate pe obiecte [18]: a) sisteme care admit ca noţiune de bază clasa, cum ar fi: VISION, ORION, G-BASSE; b) sisteme care admit ca noţiune de bază tipul, cum sunt: C++, Simula, O2. Într-un sistem orientat pe obiecte, tipul sintetizează elementele comune ale unui set de obiecte cu aceleaşi caracteristici. Acest sistem are ca şi componente, interfaţa şi implementarea. Interfaţa este partea vizibilă pentru utilizator şi constă într-o listă de operaţii. Implementarea presupune descrierea structurii interne a datelor obiectului şi realizarea procedurilor de implementare a operaţiilor interfeţei. Un tip este construit recursiv, începând cu tipurile de bază: caracter, întreg, real, şir de caractere, boolean. Constructorii de tipuri sunt: tuplul, lista, setul şi clasa. O listă este o colecţie ordonată de obiecte ale aceleiaşi clase sau de valori ale aceluiaşi tip. Elementele unei liste sunt accesibile direct prin rangul lor. Operaţiile permise asupra listelor sunt: afectarea (=), comparaţia (= =), concatenarea (+), accesul direct ([i]), apartenenţa (in), sublista ([i ; j]), numărarea (count ( ) ), înlocuirea, ştergerea (list ( ) ), inserarea ([:i]+=), iteraţia ( { }). Noţiunea de clasă, deşi are aceeaşi specificaţie cu cea de tip, este asociată cu faza de execuţie. Ea presupune generarea de obiecte prin operaţia „new” aplicată unei clase şi stocarea setului de obiecte care reprezintă instanţele clasei. Descrierea clasei serveşte ca şablon pentru crearea obiectele noi. O clasă este un tip abstract de date care defineşte atât structura obiectelor din clasa respectivă, cât şi mulţimea metodelor existente pentru aceste obiecte. Astfel, obiectele din aceeaşi clasă prezintă aceleaşi atribute şi aceleaşi metode şi răspund la acelaşi mesaj. Moştenirea Într-o bază de date orientată pe obiecte, clasele sunt aranjate într-o ierarhie în care fiecare clasă moşteneşte toate atributele şi metodele superclasei din care face parte [18]. Moştenirea conduce la reutilizarea codului. Moştenirea reprezintă mecanismul de realizare a definirii unei clase în care derivă variabilele de instanţă şi metodele din altă definire de clasă. Când o clasă moşteneşte, ea este considerată ca subclasă. Conceptele de subclasă şi superclasă sunt analoge conceptelor de generalizare şi specializare. Obiectele, clasele şi moştenirea formează baza modelului de date orientat pe obiecte şi presupune următoarele aspecte: • obiectele sunt entităţi de bază care înglobează structuri de date şi operaţii; • fiecare obiect are asociat un identificator care este unic şi asigurat de sistem; • clasele descriu tipuri generice de obiecte, toate obiectele sunt membrii unei clase; • clasele sunt înrudite prin moştenire; 95
Universitatea SPIRU HARET
• definirea unei clase este mecanismul de specificare a schemei bazei de date; • definirea unei clase poate include variabile de instanţă, având tipuri de date definite de sistem sau de utilizator; • schema bazei de date poate fi extinsă dinamic prin definirea de noi clase. Operaţiile modelului de date orientat pe obiecte Operaţiile se pot grupa în modul următor: a) obiectele comunică între ele prin mesaje; b) un mesaj poate fi trimis instanţelor mai multor clase; c) metodele pot fi definite, şterse sau modificate; d) clasele pot fi definite şi actualizate prin operaţii de creare, ştergere şi modificare; e) instanţa unei clase poate fi actualizată prin metode care modifică valorile variabilelor propriei instanţe, aceasta modificând starea internă a obiectului. Într-o serie de implementări, definirile de clasă sunt ele însele obiecte, numite obiecte de clasă. Obiectele clasă sunt instanţe ale unei clase generice sau ale unei metaclase. Operaţiile de creare, modificare şi ştergere ale definirilor de clasă pot fi şi implementate ca mesaje. În modelul de date orientat pe obiecte, regulile de integritate reprezintă o consecinţă a structurii modelului şi a următoarelor operaţii: • toate obiectele trebuie să respecte protocolul specificat de definirile lor de clasă; • obiectele sunt încapsulate, acest lucru presupunând accesul limitat la obiecte prin folosirea protocolului de mesaje definit pentru clasa obiectului; • identificatorul obiectului asigură integritatea referirii la un obiect. Ca atare, un obiect nu există fără să aibă asignat un identificator. Dacă un obiect este şters sau mutat, identificatorul său trebuie şi el şters sau mutat. O schemă completă a unei baze de date orientată pe obiecte poate consta din una sau mai multe ierarhii de clasă, împreună cu relaţiile structurale. Modificarea schemei presupune: 1. Definirea unei taxonomii şi a unui model al schimbărilor. Taxonomia defineşte un set de schimbări semnificative ale schemei, iar modelul furnizează o bază pentru specificarea semanticilor schimbărilor schemei; 2. Implementarea schimbărilor schemei. Aceste schimbări pot fi: a) schimbări referitoare la modul de definire a unei clase. Acestea includ schimbările atributelor şi metodelor definite pentru o clasă, cum ar fi: schimbarea numelui sau domeniul unui atribut, adăugarea, ştergerea unui atribut sau a unei metode; b) schimbări referitoare la structura ierarhiei de clase, care includ adăugarea sau ştergerea unei clase şi schimbarea relaţiilor superclasă/subclasă dintre o pereche de clase. Proiectarea bazei de date orientată pe obiecte Pentru proiectarea unei baze de date orientată pe obiecte [18] se foloseşte tehnica top-down, care constă în identificarea componentelor după care se stabilesc corelaţiile între ele şi se rafinează succesiv în „cascadă” componentele sale. Se poate utiliza şi metoda bottom-up, prin care mai întâi se identifică componentele funcţionale pe baza cărora se vor identifica, în colecţiile existente, obiectele, care pot fi reutilizate pentru noul proiect. Componentele care nu există vor fi create ca 96
Universitatea SPIRU HARET
subclase ale unor clase existente. Odată creată o ierarhie potrivită, se testează componentele specifice. Sistemul de gestiune al bazelor de date orientate pe obiecte (SGBD-OO sau OODBMS) conţine structuri şi reguli orientate către lucrul cu obiecte, incluzând: • un sistem de date abstracte pentru construirea de noi tipuri de date; • un constructor de tip şir; • un constructor de tip secvenţă; • un constructor de tip înregistrare; • un constructor de tip set; • funcţii; • un constructor de tip reuniune; • o compunere recursivă a elementelor anterioare. În proiectarea SGBD-OO se au în vedere următoarele: Principiul 1. SGBD-OO utilizează funcţii care conţin metode şi proceduri ale bazei de date, cu restricţia ca acestea să fie cât mai compacte, încapsulate, ermetizate. Încapsularea funcţiilor îl ajută pe programatorul de aplicaţie să asocieze funcţiile pe care şi le creează cu colecţiile utilizate. Principiul 2. SGBD-OO şi în general SGBD–urile din generaţia a treia vor prelua avantajele SGBD–urilor din generaţia a doua. În plus, se caută o modalitate de acces la o înregistrare existentă într-o colecţie oarecare şi aceasta se poate realiza prin utilizarea unui sistem de pointeri către identificatorii de obiecte. Principiul 3. SGBD-OO trebuie să poată conecta şi limbaje din generaţia a patra. Un SGBD-OO lucrează cu obiecte complexe, obiecte care se obţin prin aplicarea de constructori asupra obiectelor simple. Identitatea obiectelor. Orice obiect există independent de valorile atributelor sale, ceea ce conduce la două relaţii posibile: - identitatea a două obiecte, adică sunt unul şi acelaşi obiect; - egalitatea a două obiecte, adică au aceeaşi valoare. Arhitectura SGBD-OO cuprinde trei componente: 1. Gestionarul de obiecte (Object Manager) furnizează interfaţa dintre procesele externe şi SGBD-OO. 2. Server-ul de obiecte (asigură gestiunea tranzacţiei şi gestiunea stocului de obiecte). 3. Stocul rezident de obiecte. Gestionarul de obiecte asigură implementarea completă a modelului de dateobiecte pentru utilizatorul extern. Acest lucru include posibilitatea de a defini structurile şi de a executa operaţiile specificate prin model. El primeşte cereri de creare de definiri de clase, de modificare a definirilor de clase deja existente, de manipulare a mesajelor generate de un program de aplicaţie în execuţie. Server-ul de obiecte asigură refacerea, inserţia, ştergerea şi actualizarea obiectelor în stocul rezident de obiecte. Un singur server poate manipula tranzacţii transmise de la mai mulţi gestionari de obiecte. Limbajul de definire a datelor este realizat prin mecanismul de transmitere a mesajelor. Limbajul pentru cereri ad-hoc se bazează pe transmitere de mesaj pentru selectarea şi regăsirea obiectelor. Prelucrarea mesajelor. Gestionarul de obiecte asigură interfaţa dintre procesele externe şi SGBD-OO. El primeşte mesaje pentru obiecte individuale, 97
Universitatea SPIRU HARET
realizează legături dinamice şi operaţii de verificare a tipului şi expediază cerinţa externă pentru obiecte, către server-ul de obiecte. Transmiterea de mesaje şi prelucrarea cererii pot fi reprezentate astfel: - controlul sesiunii (menţinerea spaţiului local de lucru al utilizatorului extern pentru operaţii efectuate asupra bazei de date); - legătura dinamică (selectarea unei metode pentru un mesaj trimis unui obiect în momentul execuţiei); - crearea de noi obiecte sau instanţe de clasă trebuie iniţiată de gestionarul de obiecte; - transmiterea cerinţelor obiectului şi actualizarea acestuia; - transmiterea cererii. Cererile pot fi translatate în planuri de execuţie în care selecţia şi regăsirea obiectelor sunt realizate prin transmiterea de mesaje. Aceasta presupune că protocolul de mesaje al clasei obiectului este definit pentru a permite accesul la variabilele de instanţă necesare pentru a selecta obiectul. Obiectele, definirile de clasă şi metodele cerute de gestionarul de obiecte sunt regăsite de server-ul de obiecte din stocul rezident de obiecte. Definirea şi modificarea schemei constă din următoarele etape: 1. Asigurarea accesului la definirile de clasă existente. Definirile tuturor claselor asigurate de SGBD-OO, ca şi a claselor create de utilizatorii umani, pot fi stocate permanent în SRO, într-o bibliotecă de clasă sau într-un dicţionar de date. 2. Extensibilitatea schemei bazei de date. Aceasta include prelucrarea declaraţiilor limbajului de baza de date, specificând crearea, mutarea sau identificarea definirilor de clasă. 3. Redefinirea dinamică a clasei (evoluţiei schemei). Gestionarul de obiecte trimite cerinţe pentru regăsirea şi actualizarea definirilor de clasă, server-ului de obiecte. Gestiunea tranzacţiilor este asigurată de server-ul de obiecte. Gestiunea stocului de obiecte se referă la menţinerea nivelului fizic de organizare a bazei de date obiect (ODB) şi la asigurarea căilor de acces necesare realizării accesului eficient la stocul de obiecte. Funcţiile de bază ale stocului de date-obiect se caracterizează ca fiind: 1. Suport pentru rezidenţă, adică obiectele create şi adăugate trebuie reţinute şi după ce se încheie sesiunea. 2. Suport pentru obiecte mari. SGBD-OO trebuie să poată suporta stocarea şi manipularea obiectelor de lungime variabilă şi de orice dimensiune. 3. Facilităţi de arhivare şi asigurare de rezerve (dubluri). Caracteristicile care asigură regăsirea şi actualizarea obiectelor stocate pot fi: a) suport pentru căi de acces care este necesar pentru a asigura regăsirea şi actualizarea eficientă a datelor stocate în baze de date mari. Aceasta include indexarea obiectelor pentru a permite regăsirea eficientă a obiectelor individuale, dar şi indexarea obiectelor prin valorile variabilelor de instanţă, pentru regăsirea subseturilor de obiecte pentru satisfacerea cererilor; b) tipuri de indecşi specializaţi pentru obiecte; c) gruparea obiectelor în acelaşi sector de stoc secundar; d) segmentarea obiectelor stocate.
98
Universitatea SPIRU HARET
5. SISTEMUL DE GESTIUNE A BAZELOR DE DATE MICROSOFT ACCESS
5.1. Prezentarea sistemului Microsoft Access Produsul-program Microsoft Access reprezintă un sistem de gestiune a bazelor de date relaţionale (SGBDR) care este inclus în compunerea pachetului de birotică Microsoft Office si care lucrează sub sistemul de operare Microsoft Windows. Ca urmare, Microsoft Access foloseşte toate facilităţile oferite de sistemul de operare Microsoft Windows. Firma Microsoft a realizat în decursul timpului mai multe versiuni ale produsului Access. În capitolul de faţă, referirile sunt efectuate la versiunile Microsoft Access 2000, 2002 (XP) şi 2003. La baza SGBDR Microsoft Access se află modelul relaţional al datelor ce a fost prezentat pe larg în paragraful 4.3 şi modelul orientat pe obiecte (unui obiect îi sunt asociate evenimente şi proprietăţi). În comparaţie cu alte SGBDR, produsul Microsoft Access dispune de toate componentele unei baze de date stocate într-un fişier cu extensia MDB. Sistemul de gestiune a bazelor de date relaţionale Microsoft Access conservă avantajele sistemelor de gestiune, asigurând astfel interfaţa între baza de date şi utilizator. SGBD Microsoft Access permite definirea, consultarea şi actualizarea bazelor de date şi, în plus, partajarea datelor între mai mulţi utilizatori. Se apreciază că mai mult de 20 de utilizatori pot lucra simultan la o bază de date Access. Pentru execuţia comenzilor prin intermediul interfeţei grafice a SGBD Microsoft Access se asigură următoarele posibilităţi: meniuri, instrumente specifice (unelte ca butoane, casete etc), casete de dialog, combinaţii de taste. Produsul Microsoft Access permite lucrul cu trei limbaje: QBE (Query By Examples), SQL (Structured Query Language) şi VBA (Visual Basic for Applications). Ca urmare, există mai multe modalităţi de realizare a aplicaţiilor pentru baze de date sub SGBD Microsoft Access: interfaţa standard Access, interfaţa SQL, cu ajutorul VBA, interfeţele Access pentru comunicarea cu alte SGBD-uri (Paradox, FoxPro, dBase etc.), interfeţele Access cu alte aplicaţii Windows. Aplicaţiile în sine sunt obiecte ale utilizatorilor destinate pentru o anumită bază de date. Aceste obiecte sunt, de regulă, de tip vizual. Schema bazei de date este formată din ansamblul tabelelor şi poate fi utilizată prin manipularea interogărilor asupra bazei de date. Aceste interogări sunt obţinute prin intermediul limbajului de interogare structurată, SQL. Produsul Microsoft Access este compatibil cu tehnologia ActiveX, care este specifică aplicaţiilor de tipul client/server. 99
Universitatea SPIRU HARET
SGBD Microsoft Access 2000 reprezintă o variantă îmbunătăţită a versiunii anterioare (Access 97) destinată bazelor de date relaţionale, sub sistemul de operare pe 32 biţi Windows 2000 sau Windows NT. Îmbunătăţirile aduse faţă de versiunea anterioară sunt, în esenţă, următoarele [18]: • Caracteristici fundamentale: a) performanţa care este legată, în primul rând, de superioritatea sistemului de operare pe 32 de biţi (dar cu posibilitatea de a avea o memorie RAM de cel puţin 32 MB); b) lansarea în execuţie a sistemului presupune precizarea unui formular cu deschidere automată şi opţiuni de afişare a barelor de instrumente şi a ferestrei Database; c) integrarea este dată de facilitatea SGBD Access de a lucra transparent cu produsele Word şi Excel; d) duplicarea, ce permite unei baze de date să poată fi utilizată în mod multiuser (multiutilizator, adică simultan de către mai mulţi utilizatori) şi la staţiile din reţea neconectate, înregistrările fiind sincronizate şi după încetarea lucrului; e) DatabaseWizard (programul „vrăjitor” pentru baze de date) are posibilitatea de a asigura crearea de tabele, interogări, formulare şi rapoarte pentru mai multe baze de date obişnuite; f) fereastra Database (baza de date) asigură afişarea detaliilor fiecărui obiect (descrierea, data creării, data ultimei modificări). • Posibilităţi de filtrare şi sortare: a) proprietăţile Filter şi OrderBy asigură salvarea şi refolosirea filtrului şi a ordinei de sortare utilizate cel mai recent; b) filtrarea cu ajutorul formularului presupune folosirea formularului curent cu care se lucrează ca o interfaţă obişnuită; c) filtrarea prin selecţie presupune că setul curent de înregistrări poate fi limitat la înregistrările care corespund datelor selectate la momentul respectiv prin executarea unui singur clic de mouse. • Tabele: a) AutoNumber (Număr cu incrementare automată) înlocuieşte tipul Counter (Numărător), facilitând astfel utilizarea valorilor aleatoare şi tipul ReplicationID (Identificator multiplicare), necesare bazelor de date copie; b) controlul modular de afişare permite definirea pentru fiecare câmp a tipului controlului prestabilit (casetă de text, casetă combinată, casetă de validare ş.a.); c) LookupWizard (programul „vrăjitor” de căutare) este utilizat în special pentru a introduce proprietăţile corespunzătoare câmpurilor utilizate în calitate de chei externe (străine). • Formulare: a) imaginile (Images) asigură fundaluri pentru formulare şi rapoarte create pe baza unor imagini redimensionate la scară; b) asigură lucrul cu evenimente de tip filtru (Filter) care apar la crearea unui filtru, precum şi cu evenimentul ApplyFilter, care apare la aplicarea acestuia; 100
Universitatea SPIRU HARET
c) instanţele oferă posibilitatea creării şi deschiderii simultane a mai multor variante ale aceluiaşi formular; d) transformarea unei comenzi macro în cod se realizează cu ajutorul unui utilitar care transformă toate comenzile macro dintr-un formular în cod Visual Basic (VB); e) proprietăţile datelor AllowAdditions (permit adăugările) şi AllowDeletions (permit ştergerile), asigură posibilităţile de control asupra modului de utilizare a unui formular. • Controale: a) apariţia unui nou tip de eveniment, şi anume Change (schimbă), care permite operaţii de căutare între apăsările tastelor; b) apariţia unui text cu explicaţii de utilizare a instrumentelor, care presupune definirea unui text cu explicaţii (ToolTip) pentru toate controalele; c) casetele combinate sunt mult mai rapide decât în versiunile anterioare, îndeosebi în manipularea unui volum foarte mare de date; d) posibilitatea metamorfozării, care presupune schimbarea controalelor dintrun tip într-altul, ca de exemplu schimbarea unei casete de text într-o casetă combinată; e) Memos (câmpurile memo) presupun asocierea automată a barei de derulare verticală şi cu diverse opţiuni de tipul EnterKeyBehavior (introducere a modului de comportare a tastei). • Rapoarte: a) apariţia posibilităţii asocierii unui raport filtrului curent dintr-un formular, prin utilizarea proprietăţilor Filter şi FilterOn; b) NoData reprezintă un eveniment nou folosit pentru detectarea rapoartelor fără date; c) afişările anticipate asigură afişarea simultană a mami multor pagini şi, de asemenea, modificări ale opţiunilor Zoom. Afişările anticipate sunt mult mai rapide, datorită faptului că evenimentele sunt declanşate o singură dată. • Visual Basic pentru aplicaţii (VBA): a) interfaţa presupune fereastra Watch (supraveghere), posibilităţi de anulare a comenzilor anterioare pe mai multe niveluri, alegerea culorilor pentru cuvintele cheie, precum şi comentarii; b) sistemul permite ca tipurile de date definite de utilizator să cuprindă la rândul lor alte tipuri (standard sau definite de utilizator) şi, de asemenea, ca datele returnate prin funcţii să fie de aceste tipuri; c) argumentele opţionale permit crearea de funcţii care utilizează un număr variabil de argumente, prin folosirea opţiunii ParamArray (tablou de parametri); d) utilizarea funcţiilor în aşa fel încât funcţiile pot fi folosite fără a fi desemnate, astfel că se elimină necesitatea apariţiei variabilelor false; e) prin acceptarea valorilor nule, funcţia Nz() transformă o valoare nulă în orice valoare specificată de utilizator; 101
Universitatea SPIRU HARET
f) VBA este mult mai puternic decât AccessBasic, datorită posibilităţilor de compilare condiţionată, operaţiilor OLE (Object Linking and Embedding) extinse şi utilizării noilor tipuri de date (ca, de exemplu, boolean, octet, dată calendaristică). Faţă de versiunea Microsoft Access 2000, versiunea Microsoft Access 2002 (XP) prezintă următoarele îmbunătăţiri: • un nou format de fişiere, cu menţinerea formatului Microsoft Access 2000, din motive de compatibilitate la lucrul în reţeaua în care se găsesc versiuni diferite ale Microsoft Office; • panouri pentru sarcini (task-uri) în format nou care apar în partea dreaptă a aplicaţiei (New File, Office Clipboard, Clip Gallery); • posibilitatea de a anula şi reface mai multe acţiuni atunci când se lucrează cu obiecte ale unei baze de date Microsoft Access (tabele, formulare); • introducerea unei noi componente SQL Server 2000 Desktop Engine, ca versiune compatibilă cu Microsoft SQL Server, care este rulată direct pe un sistemclient (cu salvarea locală a datelor); • adăugarea dictării vocale şi a comenzilor vocale pentru introducerea de date în tabele şi pentru a activa sistemul de meniuri şi barele cu instrumente din Microsoft Access (caracteristica Speech care trebuie, în prealabil, configurată şi instruită). Faţă de versiunile Microsoft Access 2000 şi XP, versiunea Microsoft Access 2003 prezintă următoarele caracteristici noi [26]: • protecţia împortiva macroinstrucţiunilor realizate în Visual Basic pentru aplicaţii, VBA (Visual Basic for Applications); în acest scop, se stabileşte un nivel de securitate, astfel încât se cere o confirmare ori de câte ori se deschide o bază de date ce este posibil să conţină macroinstrucţiuni în cod VBA; • vizualizarea datelor cu privire la dependenţa obiectelor; prin vizualizarea unei liste de obiecte ce sunt dependente unele de altele se creează posibilitatea de a menţine suplimentar o bază de date şi de a elimina astfel o posibilă sursă de erori; • introducerea opţiunilor de corectare automată; în acest scop, butonul AutoCorrectOptions (opţiuni de corectare automată) apare afişat lângă textul ce a fost supus corecturii automate; există şi posibilitatea de dezactivare a butonului AutoCorrectOptions prin intermediul unui click pe buton urmat de selecţia corespunzătoare; • blocarea funcţiilor ce se pot prezenta ca potenţial nesigure; este eliminată astfel posibilitatea de folosire a acestora în expresii ce utilizează modul îmbunătăţit Microsoft Jet Expression Service; • opţiune de actualizare a proprietăţilor pentru toate controalele ce sunt asociate unui câmp; în modul de vizualizare a ferestrei de proiectare, Table Design, este afişată o opţiune de actualizare a proprietăţii pentru controale asociate câmpului; • Etichete inteligente (Smart Tags), adică acele etichete asociate oricărui câmp din tabele, interogări, formulare, rapoarte sau paginilor de acces la datele din baza de date, ce permit integrarea directă în SGBD Access a acţiunilor executate, de 102
Universitatea SPIRU HARET
regulă, în alte programe de aplicaţie; prin intermediul butonului SmartTagActions care apare afişat pe ecran pot fi executate acţiunile dorite. Butonul AutoCorrectOptions prezentat mai sus reprezintă o etichetă inteligentă; • Suport pentru temele Microsoft Windows XP; când se selectează o altă temă decât cea prestabilită, produsul Microsoft Access 2003 aplică tema selectată controalelor, casetelor de dialog, modurilor de vizualizare etc.; • Posibilitatea de creare a unui table local dintr-un tabel legat; • Sortare îmbunătăţită în controale; pagina de sortare asociată programului Lookup Wizard din orice bază de date este similară cu pagina de sortare din programul Report Wizard; • Suport pentru limbajul extins de marcare a hipertextelor, XML (Extensible Markup Language); SGBD Access dispune de facilitatea de import şi export a datelor XML şi de conversie între alte formate de date prin utilizarea fişierelor XML similare; • Posibilităţi extinse de detectare a erorilor din formulare şi din rapoarte; există o funcţie de detectare automată a erorilor; • Suport asigurat pentru dispozitive de scriere de tipul Tablet PC (se realizează introducerea rapidă a datelor în Access şi în celelalte tipuri de fişieredocument Office prin scriere de mână pe dispozitive Tablet PC); • Asigurarea copiilor de siguranţă pentru proiecte sau baze de date; • Realizarea importului, exportului şi legării unei liste Microsoft Windows SharePoint Services din şi în Access; Programul Microsoft Windows SharePoint Services, respectiv serverul Microsoft SharePoint Portal fac parte din noua arhitectură NET; • Asigurarea unor funcţii îmbunătăţite pentru fonturi în modurile de vizualizare SQL; • Includerea unui sistem de asistenţă funcţie de context în modul de vizualizare SQL al unei interogări dintr-o bază de date Access. 5.2. Cunoaşterea mediului de lucru Microsoft Access 5.2.1. Definirea componentelor principale ale SGBD Microsoft Access SGBD Microsoft Access 2003 (XP, 2000) asigură posibilitatea manipulării datelor în conformitate cu cerinţele utilizatorilor. Datele sunt stocate în mod organizat în baze de date. Baza de date permite localizarea rapidă a unui anumit element, compararea statisticilor pe diverse perioade de timp, interogarea anumitor categorii de date şi obţinerea facilă a rezultatelor tipărite. O bază de date Microsoft Access reprezintă o colecţie de obiecte de tipul: tabele, formulare, interogări, rapoarte, pagini, macroinstrucţiuni şi module. Obiectele Microsoft Access sunt percepute prin „ceea ce fac”[42], comportamentul lor mascând elemente de structură internă. În momentul în care obiectul a fost creat, el poate fi utilizat şi în alte aplicaţii, compuse din obiecte care interacţionează prin specificul comportamentului lor. În acest caz, nu mai există un 103
Universitatea SPIRU HARET
program care manipulează datele, ci obiecte care îşi transmit reciproc date. Evenimentele care apar şi schimbările de stare pe care acestea le declanşează determină o schimbare a metodologiei de concepere a sistemului. Tabelele (Tables) sunt obiecte utilizate de Access pentru stocarea datelor. Crearea unei baze de date începe cu definirea tabelelor. Fiecare coloană a tabelului este denumită câmp (field), iar fiecare rând al tabelului constituie o înregistrare (record). Înregistrările unui tabel respectă aceeaşi structură de câmpuri. La crearea unui tabel nou se solicită definirea câmpurilor, atribuindu-se fiecăruia o denumire unică şi indicându-i SGBD Access tipul de date corespunzător. Ulterior se pot adăuga şi alte câmpuri, cu condiţia reproiectării eventualelor formulare şi rapoarte care folosesc datele tabelului în structura anterioară acestei operaţii. Interogarile (Queries) sunt obiecte Access ce reprezintă întrebări pe care utilizatorul le formulează în legătură cu numite informaţii din baza de date. În momentul în care utilizatorul porneşte la construcţia unei interogări, acesta trebuie să aibă deja o viziune de ansamblu asupra datelor pe care doreşte să le regăsească, şi anume: ce câmpuri se vor utiliza, din care tabele se vor extrage datele, ce criterii trebuie să îndeplinească aceste date, în ce ordine vor fi ele sortate. Construirea unei interogări în SGBD Access reprezintă un proces simplu şi rapid de aşezare a tabelelor şi a câmpurilor necesare pe o grilă de tipul QBE (Query by Example). Limbajul QBE a fost lansat pe piaţă în anii ’70 ai secolului XX de firma IBM, care a dorit să pună la dispoziţia utilizatorilor un produs performant de regăsire a datelor într-o bază de date. Succesul limbajului QBE a fost atât de mare, încât acesta este prezent într-o formă sau alta în aproape toate sistemele SGBD, inclusiv în Microsoft Access. Formularele (Forms) reprezintă obiecte Access destinate introducerii datelor într-o bază de date (când formularul este asociat unui tabel), precum şi vizualizării datelor datelor din baza de date (când formularul este asociat unei interogări). Astfel, cu ajutorul formularelor se pot efectua câteva operaţii tipice în baza de date, şi anume operaţii de adăugare, modificare sau de ştergere a unor date din baza de date. Rapoartele (Reports) reprezintă un alt obiect al unei baze de date Microsoft Access, prin intermediul căruia utilizatorul are posibilitatea de a prezenta date selectate în rezumat, inclusiv în format pentru tipărire. Prin intermediul rapoartelor utilizatorul are un control complet asupra dimensiunilor şi modului de prezentare a datelor de ieşire. De asemenea, rapoartele permit prezentarea unor informaţii de sinteză rezultate ca urmare a prelucrărilor executate în baza de date. Rapoartele se diferenţiază de formulare prin faptul că în timp ce formularul este proiectat pentru a avea un acces aleator la date, el bazându-se pe un set dinamic al datelor, rapoartele nu modifică niciodată datele din baza de date, parcurgerea înregistrărilor realizându-se în mod secvenţial (SGBD Microsoft Access utilizează pentru obţinerea unui raport o copie a datelor protejată la scriere). Paginile (Pages) sunt obiecte Access ce asigură accesarea bazelor de date din Internet prin intermediul navigatoarelor (browser-elor) Web. Aceste obiecte sunt necesare ca urmare a prelucrării integrate a datelor care circulă în Internet sub forma unei aplicaţii globale a datelor, inclusiv pentru funcţia de partajare a datelor. 104
Universitatea SPIRU HARET
Macroinstrucţiunile sau macro-urile (Macros) reprezintă obiecte Access care definesc ansamble de comenzi pe care sistemul Microsoft Access le execută automat la apariţia unor evenimente. Macro-urile pot fi ataşate unui formular, raport sau control în scopul automatizării unor operaţii de rutină (deschidere sau închidere de formulare, imprimarea unor rapoarte, filtrarea, verificarea sau validarea unor date etc.). Modulele (Modules) sunt obiecte Access ce sunt create în limbajul Visual Basic pentru aplicaţii, VBA (Visual Basic for Applications), destinate extinderii posibilităţilor funcţionale ale unei baze de date. 5.2.2. Deschiderea şi închiderea unei baze de date în Microsoft Access SGBD Microsoft Access poate fi pornit din meniul Start sau din zona de lucru. La pornirea SGBD Access 2003, panoul de lucru Getting Started este disponibil în partea din dreapta ecranului (Fig.5.1). Din meniul Vizualizare (View) se execută clic pe opţiunea Task Pane de unde se alege panoul de lucru dorit cu clic pe săgeata de listă de pe bara de titlu a panoului respectiv. Comutarea între panourile de lucru se efectuează cu clic pe butoanele Înapoi (Back) şi Înainte (Forward). Închiderea unui panou de lucru se efectuează prin intermediul butonului Închidere (Close).
Fig.5.1. Panoul de lucru al SGBD Microsoft Access 2003
Caseta Search for… serveşte pentru căutarea unui nume sau a unei locaţii de fişier. De asemenea, Search for… poate fi utilă pentru căutarea unei proprietăţi întro bază de date sau a unui anumit şir de caractere. 105
Universitatea SPIRU HARET
Deschiderea unei baze de date existente se execută din panoul de lucru Getting Started, cu opţiunea Open din meniul File sau cu butonul Open de pe bara cu instrumente, urmată de numele bazei de date. Crearea unui nou fişier se face cu opţiunea Task Pane (fig.5.1). Pentru o bază de date nouă se alege opţiunea Blank database… din meniul New (Fig.5.2).
Fig.5.2. Alegerea opţiunii de creare a unei baze de date noi
Deschiderea unei baze de date existente sau noi presupune lucrul cu fereastra Database (bază de date) care afişează obiectele care formează baza de date (fig.5.3). Fereastra Database pune la dispoziţie utilizatorului o metodă simplă de gestionare a obiectelor care compun baza de date. În fereastra Database sunt afişate, în partea stângă a ferestrei, cele şapte tipuri de obiecte care formează baza de date, şi anume: • Tabelul (Table); • Interogarea (Query); • Formularul (Form); • Raportul (Report); • Pagini Web (Pages); • Macro-ul (Macro); • Modulul (Module). Cele trei butoane (butonul Open, butonul Design, butonul New), afişate în partea de sus a ferestrei Database, sunt utilizate pentru crearea, modificarea şi respectiv afişarea obiectului curent. Obiectele create vor fi afişate în lista cu obiecte situată în mijlocul ferestrei Database. În interiorul acestei liste se mai află trei opţiuni rapide de creare a obiectelor. Obiectele gestionate cu SGBD Microsoft Access, împreună cu elementele de control care le sunt asociate, conţin proprietăţi şi declanşează apariţia unor tipuri de evenimente. 106
Universitatea SPIRU HARET
Fig.5.3. Fereastra Database
Pentru modificarea proprietăţilor unui obiect, se selectează din partea stângă a ferestrei Database eticheta corespunzătoare tipului de obiect. Această operaţie are ca efect afişarea în ordine alfabetică (în lista cu obiecte) a tuturor obiectelor de acelaşi tip. Se execută un clic cu butonul din partea dreaptă a mouse-ului pe obiectul a cărui proprietate se doreşte a se modifica, iar din meniul rapid care apare se pot efectua următoarele: – deschiderea obiectului respectiv pentru a consulta datele conţinute în el; – deschiderea obiectului în modul Design pentru a efectua modificări de structură; – salvarea obiectului respectiv sub un alt nume; – vizualizarea conţinutului obiectului înainte de a-l trimite pentru tipărire; – realizarea unei copii a conţinutului obiectului la imprimantă; – ştergerea din baza de date a obiectului, sau redenumirea acestui obiect; – realizarea unui duplicat al obiectului curent prin copierea în clipboard (memorie tampon sau temporară) şi apoi recopierea din această memorie tampon. Această comandă este necesară atunci când este nevoie de un tabel similar cu unul deja creat. SGBD Access cere confirmarea copierii tabelului cu toate datele pe care le conţine, sau numai a structurii acestui tabel; – copierea unui tabel sau a unui obiect de tip interogare în clipboard şi apoi recopierea acestuia în programe ca Excel şi Word; se determină astfel copierea datelor Access în programele respective. Butonul Open (deschide), sau alegerea opţiunii Open din meniul rapid, are ca efect o afişare a obiectului selectat pentru o utilizare normală. Butonul Design (proiectare), sau alegerea opţiunii Design din meniul rapid, asigură ca obiectul selectat să fie deschis în modul de afişare Design în vederea efectuării modificărilor necesare tipului de aplicaţie dorit de utilizator. 107
Universitatea SPIRU HARET
Butonul New (nou) asigură crearea unui obiect nou, de tipul selectat anterior. În timpul lucrului cu SGBD Microsoft Access se pot obţine informaţii de ajutor prin intermediul meniului Help de pe bara cu instrumente. Prin introducerea unui sau mai multor cuvinte-cheie în caseta Search for… se obţin explicaţii detaliate referitoare la subiectul dorit. 5.3. Tabelul 5.3.1. Crearea unui tabel Tabelul (Table) este un obiect specific SGBD Microsoft Access pentru stocarea datelor. Crearea unei baze de date (structurile de date specifice acesteia) începe cu definirea tabelelor. Această definire înseamnă, de fapt, stabilirea structurii tabelului. Fiecare coloană a tabelului este denumită câmp (field), iar fiecare rând al tabelului constituie o înregistrare (record). Înregistrările unui tabel respectă structura de câmpuri a tabelului. La crearea unui tabel nou se solicită definirea câmpurilor, atribuindu-se fiecăruia o denumire unică şi indicându-i SGBD Microsoft Access tipul de date corespunzător. Ulterior, se pot adăuga şi alte câmpuri, cu condiţia reproiectării eventualelor formulare şi rapoarte care folosesc datele tabelului în structura anterioară acestei operaţii. Pentru crearea unui tabel, se poate utiliza una dintre următoarele trei metode: • Create table in Design View (crearea tabelului cu ajutorul ferestrei de proiectare); • Create table by using wizard (crearea tabelului prin folosirea ghidului); • Create table by entering data. (crearea tabelului prin introducerea datelor). Crearea tabelelor prin alegerea opţiunii Create table by using wizard (program „vrăjitor” dedicat tabelelor) asigură asistarea pe întregul parcurs de construcţie a unui tabel, definind prin intermediul unui dialog cu utilizatorul numele şi tipul de câmpuri care definesc tabelul. O altă modalitate de a crea un tabel o constituie executarea unui clic de mouse pe butonul New şi alegerea, din fereastra de dialog New Table, a uneia dintre cele cinci opţiuni disponibile (fig.5.4): 1. Datasheet View – permite crearea unui tabel în modul Datasheet (foaie de date), având 10 câmpuri (coloane) şi 21 de înregistrări (rânduri) libere, pregătit pentru completare.
Fig.5.4. Fereastra New Table 108
Universitatea SPIRU HARET
2. Design View – permite crearea unui tabel în modul Design (proiectare). 3. Table Wizard – permite crearea de tabele cu ajutorul magicienilor bazei de date. 4. Import Table – această facilitate importă tabele şi obiecte aflate în alte baze de date. 5. Link Table – creează tabele în baza de date curentă care sunt legate cu alte tabele din baze de date externe. Crearea tabelelor cu ajutorul opţiunii Design View presupune parcurgerea a trei paşi pentru definirea unui câmp în structura unui tabel: stabilirea numelui câmpului, stabilirea tipului de dată asociată acelui câmp şi stabilirea proprietăţilor acestuia. Când se alege această modalitate de construcţie a unui tabel, pe ecranul monitorului este afişată fereastra de dialog Table (fig.5.5).
Fig.5.5. Fereastra de dialog Table
Fereastra de dialog Table este formată din două zone: zona aflată în partea de sus a ferestrei (zonă folosită pentru declararea câmpurilor), alcătuită dintr-un tabel format din trei coloane, şi o a doua zonă aflată în partea de jos a ferestrei, zonă în care se stabilesc proprietăţile câmpului. 109
Universitatea SPIRU HARET
Zona de declarare a câmpurilor este formată dintr-un tabel compus din trei coloane: • Coloana Field Name – în această coloană se declară numele câmpurilor. SGBD Microsoft Access permite folosirea unor nume de câmpuri de maxim 64 de caractere, inclusiv spaţiile. În construcţia numelui unui câmp se pot folosi litere mari şi mici, avându-se în vedere ca aceste nume să nu prezinte aceeaşi denumire cu numele utilizate ca proprietăţi de SGBD Microsoft Access. • Coloana Data Type – indică ce tip de date vor fi memorate în acel câmp şi câtă memorie se va aloca pentru acel câmp. • Coloana Description (Descriere) – în această coloană se poate scrie de către utilizator un text explicativ cu scopul de a detalia destinaţia câmpului. Tipurile de date asociate câmpurilor definesc tipurile de câmpuri şi sunt următoarele: 1. Text Un câmp text are, implicit, 50 de caractere, dar se poate opta pentru orice lungime cuprinsă între 1 şi 255. 2. Memo Câmpurile memo constau numai din text şi au maxim 255 de caractere, în acestea putând fi incluse şi secvenţele de salt la început de rând/salt la rând nou. Aceste câmpuri sunt utilizate pentru a scrie comentarii. 3. Număr (Number) Tipul Number include mai multe subtipuri de date, care diferă prin modul de stocare şi viteza de răspuns, şi anume: • subtipul Byte (octet) care acceptă numai valori întregi pozitive (fără semn) cuprinse între 0 şi 255; • subtipul Integer (întreg) acoperă domeniul numerelor întregi de la –32768 la +32768; • subtipul Long Integer (întreg lung) acoperă domeniul numerelor întregi dincolo de limitele ± 2.000.000.000; • subtipul Single (numere reale reprezentate în virgulă mobilă simplă precizie) acoperă domeniul numerelor fracţionare cu maxim şapte cifre semnificative; • subtipul Double (numere reale reprezentate în virgulă mobilă dublă precizie) acoperă domeniul numerelor fracţionare cu maxim 14 cifre semnificative; • subtipul ReplicationID (identificator duplicare sau identificator multiplicare); această valoare este reprezentată pe 16 octeţi şi a fost creată cu scopul de a asigura un identificator unic global pentru bazele de date în care trebuie realizate sincronizările unui mare volum de date suplimentare. 4. Dată calendaristică/oră (Date/Time) SGBD Microsoft Access stochează intern datele calendaristice sub forma unor numere în virgulă mobilă pe 8 octeţi, ora fiind reprezentată ca o fracţiune dintr-o zi. Sistemul introduce automat data curentă prin proprietatea Default Value (valoare implicită) a câmpului = Date(). Se poate folosi opţiunea = Now() pentru a stoca ora şi data. Proprietatea Format trebuie să fie stabilită pentru toate câmpurile dată calendaristică/oră (date/time). 110
Universitatea SPIRU HARET
5. Tipul valută (Currency) Tipul Currency acoperă valorile în USD, cu 15 cifre la partea întreagă, iar la partea zecimală până la sutimi de cent. Din punct de vedere al reprezentării interne, tipul valută este un număr în virgulă fixă. 6. Număr cu incrementare automată (AutoNumber) Datele de acest tip au proprietatea că sunt incrementate automat (AutoNumber) şi pot primi valori întregi lungi secvenţiale. Tipul este numit Counter (numărător). 7. Tipul Da/Nu (Yes/No) Datele de acest tip sunt booleene. Ca urmare, primesc valorile True/False (adevărat/fals) şi sunt afişate într-una din formele True/False, respectiv On/Off. 8. Obiect OLE Tipul de câmp OLE (Object Linking and Embedding) este destinat păstrării datelor provenite de la alte programe care s-au înregistrat ca servere OLE în Windows. Aceasta permite bazei de date să stocheze documente create de programe de prelucrare a textelor, seturi de foi de calcul, sunete, videoclipuri ş.a. Zona în care se stabilesc proprietăţile câmpurilor este formată din următoarele opţiuni: 1. Proprietatea Field Size (dimensiunea câmpului) depinde de tipul câmpului (Text, Number şi Autonumber). Această proprietate stabileşte dimensiunea maximă a datelor care pot fi stocate în tipul de câmp respectiv. 2. Proprietatea Format Opţiunea stabilită pentru această proprietate afectează modul în care SGBD Microsoft Access afişează datele. Conţinutul şirului de formatare poate fi un format predefinit, cum ar fi: Currency, Percent (procent) sau Short Data (dată calendaristică în format scurt). În cazul datelor numerice, şirul poate conţine informaţii despre modul de afişare a valorilor pozitive, negative sau nule. Exemple: - $#,##0.00 - afişează numere pozitive în format valută; - ($#,#00)[Red] – afişează numerele negative cu roşu; - “ “ – valorile nule sunt suprimate; - “Unknown”[Green] - cuvântul “unknown” scris în verde indică o valoare nulă. 3. Proprietatea Input Mask (masca de intrare) Prin intermediul acestei proprietăţi este controlată introducerea datelor în cadrul câmpului. Masca de intrare determină, pentru fiecare caracter al câmpului, dacă este opţional sau necesar, precum şi tipul de caracter acceptat (numeric, alfabetic, alfanumeric sau orice tip de caracter). De exemplu, masca de intrare #990,000.0999 impune introducerea unui număr cu valoarea absolută mai mare decât 1000 şi mai mic decât 1.000.000. Este nevoie de cel puţin o zecimală, iar caracterul # permite introducerea caracterelor negative. Masca de intrare Password determină afişarea tuturor caracterelor dintrun câmp cu asteriscuri. 4. Proprietatea Caption Valoarea proprietăţii Caption (titlu) este utilizată pentru a afişa titlurile numelor de câmp în modul de afişare Datasheet. Dacă proprietatea Caption este necompletată, titlul este stabilit de numele câmpului. 111
Universitatea SPIRU HARET
5.Proprietăţile Validation Rule/Validation Text Proprietatea Validation Rule (regula de validare) se utilizează pentru defini anumite cerinţe pe care trebuie să le îndeplinească datele introduse într-un câmp din baza de date. În cazul în care datele introduse nu respectă setarea Validation Rule se utilizează proprietatea Validation Text (text de validare) pentru a specifica un mesaj de avertizare. Setarea proprietătii Validation Rule are scopul de a reduce numărul de erori care pot apare în momentul introducerii datelor de către utilizator. 6.Proprietatea Required Proprietatea Required (necesară) se utilizează în momentul în care se doreşte introducerea în câmpul respectiv a unei valori în mod expres, deci valoarea câmpului respectiv nu poate fi NULL (vidă). 7. Proprietatea Indexed Indecşii asigură mecanismul de regăsire rapidă a datelor. Un câmp se indexează în următoarele condiţii: – câmpul cuprinde valori cu gamă largă de variaţie; – câmpul va fi folosit în mod semnificativ în criteriile de selecţie sau sortare. Indexul cheie primară (Primary Key) prevede câte un pointer (indicator) unic spre fiecare înregistrare şi reprezintă ordinea de afişare prestabilită pentru tabele. Celelalte câmpuri pot fi indexate cu opţiunea No Duplicates (fără duplicate), respectiv Duplicates OK (sunt permise duplicatele). Un index desemnat cu opţiunea Duplicates OK nu va prezenta aceleaşi performanţe ca un index unic. Există şi posibilitatea creării de indecşi pe baza mai multor câmpuri, utilizând fereastra Indexes (din meniul View). Atunci când utilizatorul a stabilit denumirea câmpurilor, tipul de dată ce poate fi acceptat în acel câmp precum şi proprietăţile aferente câmpurilor respective, se închide fereastra de dialog Table. După aceasta, SGBD Access afişează fereastra de dialog Save în interiorul căreia utilizatorul denumeşte tabelul creat. Metoda de creare a tabelelor cu ajutorul opţiunii Table Wizard reprezintă cea mai rapidă metodă de creare a unui tabel. Alegerea opţiunii Table Wizard din fereastra New Table are ca rezultat afişarea pe ecranul monitorului a ferestrei de dialog Table Wizard. Această fereastră, prezentată în figura 5.6, este compusă din: • un grup de două opţiuni Business şi Personal, care oferă posibilitatea de a alege categoria de tabele dorite; • o listă Sample Tables, care conţine exemple de tabele corespunzătoare opţiunii alese; • o listă Sample Fields, care conţine exemple de câmpuri corespunzătoare tipului de tabel ales; • patru butoane pentru activarea câmpurilor (este posibil ca în tabelul final să se transfere toate câmpurile disponibile din lista Sample Fields sau să se transfere numai câmpurile necesare, unu câte unu); • o casetă Fields in my new table, care se vizualizează numele câmpurilor selectate de utilizator; 112
Universitatea SPIRU HARET
• un buton Rename Field cu ajutorul căruia utilizatorul poate modifica denumirea câmpului.
Fig.5.6. Fereastra Table Wizard pentru crearea tabelelor cu ajutorul ghidului
După ce utilizatorul a ales tipul de tabel şi câmpurile care vor face parte din tabelul respectiv, acesta poate să treacă mai departe executând un clic cu pointerul de la mouse pe butonul Next pentru a stabili numele tabelului şi cheia primară, sau poate să execute un clic pe butonul Finish pentru a lăsa SGBD Microsoft Access să stabilească singur numele tabelului şi cheia primară. Modul de lucru cu înregistrările La deschiderea unui tabel, pe ecran apar informaţii similare cu cele prezente într-o foaie de calcul. Acest mod de prezentare în SGBD Microsoft Access este denumit Datasheet (foaie de calcul). Denumirea câmpurilor apare deasupra fiecărei coloane. Pentru a selecta toată coloana se execută clic pe numele unui câmp. Fiecare înregistrare are un buton denumit Record Selector (selectorul înregistrării), dispus în stânga sa. Înregistrarea selectată în mod curent este marcată cu un triunghi în acest buton. Ultimul rând al unei foi de gardă este un rând liber, el fiind marcat cu un asterisc în butonul Record Selector. Acest rând este necesar în cazul în care se adaugă în tabel o înregistrare nouă. Pentru a edita datele dintr-o celulă este suficient un clic pe celula respectivă, după care se pot introduce date de la tastatură. Aspectul butonului de selectare se va schimba de la marcajul triunghi la marcajul stilou, pentru a evidenţia faptul că modificările realizate în cursul editării nu au fost salvate. Când apare simbolul 0, înseamnă că în regimul de lucru multiutilizator o procedură sau un utilizator a blocat înregistrarea, nepermiţând editarea ei (fig.5.7). 113
Universitatea SPIRU HARET
Fig.5.7. Vizualizarea datelor din tabelul Materiale
Când se închide foaia de date sau se trece la o altă înregistrare, modificările făcute asupra unei înregistrări sunt automat salvate. În cazul în care se doreşte salvarea unei înregistrări imediat după ce a fost modificată (fără a trece automat la o alta), se tastează concomitent SHIFT+ENTER sau se selectează opţiunea Save Record din meniul Records (înregistrări). Dacă un tabel are mai multe înregistrări, butoanele de navigare printre acestea (Record Navigation) aflate la capătul din stânga al barei de derulare orizontale sunt foarte utile şi ele sunt următoarele: - First Record (prima înregistrare); - Previous Record (înregistrarea anterioară); - Next Record (înregistrarea următoare); - Last Record (ultima înregistrare); - New Record (înregistrare nouă). Între aceste butoane, SGBD Microsoft Access afişează numărul înregistrării curente, care reflectă doar ordinea curentă de afişare, neputând fi utilizat pentru identificarea unei anumite înregistrări, întrucât se schimbă atunci când înregistrările sunt adăugate, şterse, filtrate sau sortate. 5.3.2. Realizarea relaţiilor între tabele Atunci când se creează tabele într-o bază de date relaţională, acestea prezintă o existenţă de sine stătătoare. Pentru a lega tabelele între ele, pentru a crea o relaţie, se utilizează fereastra Relationships, fereastră pe care se poate activa fie din bara de meniuri standard, fie din meniul Tools. Pentru a defini o relaţie, se adaugă 114
Universitatea SPIRU HARET
în fereastra Relatioships tabelele între care se doreşte să existe legături şi se trage dintr-un tabel câmpul care trebuie legat spre câmpul corespunzător din celălalt tabel. Ca regulă generală, se va lega un câmp care reprezintă o cheie primară din tabelul-părinte cu un câmp care reprezintă cheie externă (străină) în tabelul-fiu. Cheia externă este un atribut sau o mulţime de atribute care are aceleaşi valori cu un atribut sau un grup de atribute aparţinând tabelului-părinte, acest atribut sau grup de atribute jucând rolul de cheie primară în tabelul-părinte. Pentru validarea relaţiei între cele două tabele, cheia externă trebuie să fie de acelaşi tip şi să aibă aceeaşi dimensiune cu a cheii primare. Pentru exemplificare (fig.5.8), se ia în considerare baza de date CONSTRUCT pentru evidenţa materialelor de construcţii, care conţine tabelele Furnizori, Facturi, Materiale, Depozite şi Gestionari.
Fig.5.8. Tabelele bazei de date CONSTRUCT
Tabelele bazei de date CONSTRUCT au următoarele structuri: Furnizori(cod_f, den_f, adresa_f, telefon_f, banca_f, cont_f, pagina Web), Facturi (nr_fact, data_fact, cant, pret_unitar), Materiale (cod_mat, den_mat, cod_f, cod_dep, nr_fact), Depozite (cod_dep, den_dep, cod_gest) şi Gestionari (cod_gest, nume_gest, pren_gest). Aceste cinci tabele au fost create pornind de la şablonul Blank Database, selectând obiectul Tables din fereastra Database, executând un clic pe butonul New şi alegând, pentru definirea tabelelor, modul de lucru cu fereastra de proiectare, Design View. După stabilirea structurii fiecărui tabel şi a proprietăţilor aferente fiecărui câmp în parte (a tipului de date pe care să îl accepte câmpul respectiv, a dimensiunii câmpului, a regulilor de validare pentru anumite câmpuri etc.), se stabileşte, pentru fiecare tabel în parte, care câmp (atribut) va reprezenta cheia 115
Universitatea SPIRU HARET
primară. În exemplul considerat, denumirile de atribute (câmpuri) subliniate reprezintă cheile primare pentru tabelele respective. În continuare, se adaugă în fereastra Relationships cele cinci tabele şi se creează relaţiile dintre acestea prin intermediul câmpurilor chei primare (în tabelele-părinte) – chei externe (în tabelele-fiu). Ca mod de realizare a relaţiilor, în tabelul Furnizori se execută un clic pe cheia primară Cod_f şi se trage către tabelul Materiale unde în dreptul câmpului Cod_f (cheia externă) se eliberează butonul mouse-ului. Cheia primară se recunoaşte după caracterele bolduite. Imediat după această operaţie, se afişează fereastra de editare a relaţiei (Edit Relationship), aşa cum se prezintă în fig.5.9.
Fig.5.9. Fereastra de editare a relaţiei (EditRelationship) dintre tabelele Furnizori şi Materiale
În fereastra de editare a relaţiei dintre tabelele Furnizori şi Materiale în tabelul din stânga sus sunt prezentate cele două tabele prin intermediul cheilor de legătură cod_f. Se forţează integritatea referenţială prin introducerea bifei în caseta din faţa Enforce Referential Integrity apasă apoi butonul Create. Legătura stabilită între tabele este marcată printr-o linie, care se numeşte linie de corelare. Tipul relaţiei stabilite este de unu-la-mulţi (One-To-Many), aspect reflectat prin scrierea pe linia de corelare ce defineşte relaţia a cifrei 1 (pentru One) şi a simbolului infinit, ∞ (pentru Many). Aceste numere şi simboluri indică cardinalitatea relaţiei. În practică, în procesul de modelare a bazei de date, cardinalitatea se evidenţiază printr-un cuplu de numere întregi de forma (x,y), în care x reprezintă cardinalitatea minimală (numărul minim de entităţi care participă la realizarea asocierii), iar y reprezintă cardinalitatea maximală (numărul maxim de entităţi care participă la realizarea asocierii). În exemplul considerat, un furnizor livrează mai multe tipuri 116
Universitatea SPIRU HARET
de materiale, iar un material (de un anumit tip, cu un anumit cod) nu poate fi livrat decât de un singur furnizor. Deci, în procesul de modelare a bazei de date, relaţia care se stabileşte între două tabele trebuie evidenţiată în dublu sens, conform figurii 5.10. În acelaşi mod se procedează şi cu relaţiile dintre celelalte tabele componente ale bazei de date CONSTRUCT. În final, se obţine schema relaţională din fig.5.11.
Cod_f Den_f Adresa_f Telefon_f Banca_f Cont_f Pagina Web
1:1
1:m Livrează
Cod_Mat Den_mat Cod_f Cod_dep Nr_fact
Fig.5.10. Relaţiile dintre tabelele Furnizori şi Materiale
Fig.5.11. Editarea relaţiilor (Relationship) dintre tabelele bazei de date CONSTRUCT
Revenind la fereastra de editare a relaţiei din fig.5.9, în partea de jos a ferestrei Edit Relationship există trei casete de validare: Enforce Referential Integrity (Întărirea integrităţii referenţiale), Cascade Update Related Fields (Reactualizarea în cascadă a câmpurilor legate) şi Cascade Delete Related Records (Ştergerea în cascadă a înregistrărilor legate). Validarea acestor casete va avea următoarele semnificaţii: • validarea casetei Enforce Referential Integrity – atunci când se va întări integritatea referenţială într-o relaţie care leagă două tabele va exista siguranţa că 117
Universitatea SPIRU HARET
înregistrările aflate în tabelele vor fi valabile (vor respecta regulile de integritate referenţială). Dacă se încalcă vreuna dintre regulile asociate tabelelor, aflate în relaţie, SGBD Microsoft Access va afişa un mesaj şi nu va permite modificarea datelor. Restricţiile de integritate referitoare la actualizarea, modificarea sau ştergerea unor date din baza de date, pot fi anulate prin validarea casetelor Cascade Update Related Fields şi Cascade Delete Related Records, păstrându-se în acelaşi timp integritatea referenţială; • validarea casetei Cascade Update Related Fields – atunci când se selectează această casetă, modificarea unei valori a unei chei primare va duce automat la modificarea valorilor din câmpurile asociate; • validarea casetei Cascade Delete Related Records - atunci când se va selecta această casetă, ştergerea unei valori a cheii primare din tabelul-părinte va avea ca efect ştergerea tuturor valorilor din câmpurile asociate aparţinând tabelului-fiu. 5.4. Interogarea Interogarea (Query) este un obiect Access ce reprezintă o întrebare pe care utilizatorul o formulează cu privire la numite informaţii din baza de date. În momentul în care utilizatorul porneşte la construcţia unei interogări, acesta trebuie să aibă deja o viziune de ansamblu asupra datelor pe care doreşte să le regăsească, şi anume: ce câmpuri se vor utiliza, din care tabele se vor extrage datele, ce criterii trebuie să îndeplinească aceste date, în ce ordine vor fi ele sortate. Construirea unei interogări în Microsoft Access reprezintă un proces simplu şi rapid de aşezare a tabelelor şi a câmpurilor necesare pe o grilă QBE (Query by Example). Clasificarea interogărilor Cele mai utilizate interogări sunt interogările denumite interogări de selecţie. O interogare permite: - vizualizarea sau modificarea datelor; - selectarea acelor înregistrări care satisfac criteriile impuse de utilizator; - limitarea unei proceduri la câmpurile care sunt relevante; - sortarea înregistrărilor într-o ordine specificată. Atunci când este executată o interogare de selecţie, rezultatul va fi o mulţime de înregistrări aparţinând unui tabel sau mai multor tabele. Această mulţime poartă numele de dynaset (setul dinamic rezultat al interogării). Un dynaset reprezintă o vedere dinamică asupra datelor care sunt subiectul interogări respective. Aceasta înseamnă că atunci când datele din tabelele sursă ale interogării suferă modificări, automat rezultatul interogării va fi şi el modificat [18]. O a doua mare categorie de interogări este reprezentată de interogările de acţiune. Aceste interogări au rolul de a modifica anumite date, în cadrul unei singure operaţii. Aceste modificări cuprind capacitatea de a şterge, de a adăuga, a modifica anumite valori dintr-un tabel, ca şi de a crea un tabel nou. Aceste interogări de acţiune sunt: interogările pentru ştergere (Delete Query), interogările pentru adăugare (Append Query), interogările pentru reactualizare (Update Query) şi interogările al căror rezultat este crearea unui tabel nou în baza de date (Make-Table Query). 118
Universitatea SPIRU HARET
Crearea interogărilor Atunci când se doreşte să se creeze o interogare, se alege din fereastra Database grupul de obiecte Query, apoi se execută un clic pe butonul New, SGBD Microsoft Access afişând caseta de dialog New Query. Aşa cum se observă din figura 5.12, fereastra New Query permite cinci moduri de realizare a unei interogări şi anume: 1. Design View – alegând această opţiune de creare a unei interogări, utilizatorul va porni de la zero, cu un obiect blanc în definirea interogării; 2. Simple Query Wizard – alegând această opţiune, utilizatorul va fi ajutat, pe tot parcursul creării unei interogări de selecţie, de ghidul de lucru al SGBD de tip Wizard, care adresează întrebări referitoare la tabelele şi câmpurile care se doresc a fi selectate, iar pe baza răspunsurilor obţinute, se va construi interogarea; 3. Crosstab Query Wizard – această opţiune funcţionează similar cu opţiunea Simple Query Wizard, doar că de această dată wizard-ul va construi o interogare prin încrucişarea tabelelor; 4. Find Duplicates Query Wizard – wizard va construi o interogare care va regăsi înregistrări duble; 5. Find Unmatched Query Wizard – funcţionează identic ca şi opţiunea Find Duplicates Query Wizard, dar de această dată rezultatul va fi construirea unei interogări care va găsi înregistrările fără corespondent în cadrul tabelelor.
Fig.5.12. Fereastra de dialog New Query
Construirea interogărilor de selecţie Interogările de selecţie reprezintă cel mai des întâlnit tip de interogare. Cu ajutorul acestui tip de interogare se pot regăsi date din unul sau mai multe tabele, se pot grupa datele după anumite criterii sau se pot efectua anumite calcule. Opţiunea Design View deschide o fereastră Select Query (Interogare de selecţie), precum şi fereastra Show Tables (Prezintă tabelele). Fereastra Select Query este un instrument grafic de interogare prin exemple, QBE (Query-By-Examples), care, datorită caracteristicilor sale grafice, permite utilizatorului să poată defini un 119
Universitatea SPIRU HARET
exemplu al înregistrărilor, pe care le doreşte să le vizualizeze, prin folosirea mouseului pentru a selecta, trage sau manipula obiectele din cadrul ferestrei. Fereastra Select Query este alcătuită din două secţiuni: secţiunea pentru tabele şi o secţiune sub formă de grilă pentru specificarea câmpurilor de vizualizat şi a unor condiţi de selectare a înregistrărilor (fig.5.13). Pentru construcţia interogării se execută dublu-clic pe denumirile tabelelor care vor furniza datele necesare pentru construirea interogării. Fereastra Show Tables are o etichetă pentru selectarea interogărilor şi a tabelelor. De asemenea, se poate crea o interogare stivă, aducând înregistrări dintr-o altă interogare (trăgâdu-le cu mouse-ul). După ce tabelele au fost selectate, fereastra Show Tables este închisă. Pentru a adăuga un alt tabel ulterior, acesta se poate selecta cu mouse-ul în cadrul interogării din fereastra Database, sau se alege opţiunea Show Tables din meniul Query, după care se va selecta tabelul suplimentar. Astfel, câmpurile implicate în interogare sunt adăugate grilei de ieşire. Pentru a adăuga un câmp dintr-un tabel, se execută un dublu-clic pe el şi se trage pe grilă. Acelaşi efect îl are şi selectarea lui din lista derulantă a rândului Field. Pentru a selecta mai multe câmpuri în stilul Windows, se procedează în modul următor: Shift+Clic pentru a selecta o secvenţă continuă de câmpuri sau Ctrl+Clic pentru a selecta câmpuri individuale. Pentru a selecta toate câmpurile dintr-un tabel, se execută dublu-clic pe numele tabelului. Selectarea unui câmp în grila interogării se face executând clic pe bara mică de culoare gri aflată în imediata apropiere, deasupra numelui câmpului. Câmpul poate fi şters, acţionând tasta Del sau câmpul se poate deplasa cu ajutorul mouse-ului către o nouă poziţie. Dacă se lucrează cu mai multe tabele, fereastra Select Query afişează liniile de legătură între câmpurile în care au fost definite relaţiile. Asocierile (Joins) corespunzătoare definesc modul în care interogarea selectează înregistrările. Deoarece câmpurile cheie primară şi cheie secundară au în mod frecvent acelaşi nume, SGBD Microsoft Access prezintă în cadrul grilei numele tabelului imediat sub numele câmpului. Specificarea criteriilor Criteriile reprezintă restricţiile care se stabilesc într-o interogare, pentru a identifica anumite înregistrări din baza de date. Aceasta înseamnă că din întregul set dinamic rezultat al unei interogări se vor selecta pentru afişare doar acele înregistrări care corespund intereselor utilizatorului. Pentru a obţine acest lucru trebuie să se furnizeze SGBD Microsoft Access condiţiile de selectare. Sub rândul Field, grila de interogare conţine un rând Sort. Selectarea opţiunii Ascending (Ascendent) sub numele unui câmp determină sortarea interogării în ordine crescătoare. Opţiunea Descending (Descendent) execută sortarea elementelor în mod descrescător. Dacă este necesară sortarea cu mai multe câmpuri, SGBD Microsoft Access sortează secvenţial de la stânga la dreapta. În cazul unor criterii de selecţie, acestea se vor introduce în rândul Criteria. Dacă se introduc mai multe valori în acelaşi rând de criterii sub câmpuri diferite, SGBD Microsoft Access selectează numai înregistrările care îndeplinesc toate condiţiile menţionate. Dacă aceste criterii sunt introduse pe rânduri diferite, o înregistrare va fi inclusă când va îndeplini oricare dintre criteriile menţionate. Operatorii de comparare admişi de SGBD Microsoft Access sunt evidenţiaţi în tabelul 5.1. 120
Universitatea SPIRU HARET
Tabelul 5.1 Operatorii de comparare în SGBD Microsoft Access Operator > < >= 50 < “P” >=[Maxim]
Rezultat Valori peste 50 Toate valorile de la A la P Cel puţin la fel de mare cu valoarea din câmpul Maxim Mai mic sau egal cu SELECT * FROM MATERIALE; (1) Rezultatul este afişarea unui tabel identic cu cel de mai sus al bazei de date model. Semnul asterisc (*) transmite bazei de date comanda de a returna toate coloanele asociate cu tabelul dat descris în clauza FROM. Ele sunt returnate într-o ordine hotărâtă de baza de date. Semnul punct şi virgulă de la sfârşitul instrucţiunii informează interpretorul că s-a terminat de scris interogarea. Când coloanele nu se afişează în altă ordine, se introduce de la tastatură comanda: Comandă: SQL> SELECT Mat, Cant, Nr_înreg, Cod FROM MATERIALE (2) Numele de coloane sunt separate prin câte o virgulă, cu un spaţiu după ultimul nume de coloană şi înainte de următoarea clauză (în acest caz FROM). Instrucţiunea ar putea fi scrisă, de asemenea, astfel: Comandă: SELECT Mat, Cant, Nr_înreg, Cod FROM MATERIALE; (3) Selectarea coloanelor individuale Dacă selectăm doar două coloane, introducem de la tastatură următoarea instrucţiune: Comandă: SQL> SELECT Mat, Cant, FROM MATERIALE WHERE Mat=’Cherestea’; (4) Condiţii Pentru a regăsi un anumit element sau grup de elemente în baza de date, sunt necesare una sau mai multe condiţii. În exemplul anterior, condiţia este: Mat = ’Cherestea ’. Dacă problema cere să găsim toate materialele care se găsesc în cantitate mai mare de 1000 kg, putem introduce condiţia: Cant >= 1000. Condiţiile fac posibile interogările selective. În cea mai obişnuită formă a lor, ele se compun dintr-o variabilă, o constantă şi un operator de comparare. În primul exemplu variabila este Mat, constanta este Cherestea şi operatorul de comparare este =. În al doilea exemplu, variabila este Cant, constanta este 1000 şi operatorul de comparare este >. Conceptul de interogări selective în SQL se bazează pe ideea submulţimilor. O interogare selectivă returnează o submulţime de date. Clauza WHERE Sintaxa clauzei WHERE este: WHERE S-a văzut în exemplul de mai sus (4) că prin această clauză s-a selectat materialul Cherestea. Împreună cu SELECT şi FROM, WHERE este cea mai folosită clauză în SQL. Această clauză face interogările selective. 160
Universitatea SPIRU HARET
6.3. Operatori utilizaţi în SQL Operatorii se împart în şase grupe distincte: aritmetici, de comparare, caracter, logici, pentru mulţimi şi alţi operatori. 6.3.1. Operatorii aritmetici Operatorii aritmetici sunt plus (+), minus (-), împărţire (/), înmulţire (*) şi modulo (%). Primii patru sunt descrişi chiar prin numele lor. Dacă se plasează câţiva operatori aritmetici într-o expresie fără paranteze, ei sunt trataţi în ordinea următoare: înmulţire, împărţire, modulo, adunare, apoi scădere. Plus (+) Se introduce comanda: SQL> SELECT Mat, Pret_u, Pret_u + 10000 FROM MATERIALE; (5) Această comandă adaugă 10000 de unităţi monetare la fiecare preţ unitar şi generează următorul rezultat: Mat Cherestea Cherestea Cherestea Tabla Tabla Cot Con
Pret_u 150000 140000 180000 120000 140000 120000 130000
Pret_u+10000 160000 150000 190000 130000 150000 130000 140000
Deoarece capul de tabel este neconcludent, acesta se modifică prin introducerea comenzii: SQL> SELECT Mat, Pret_u, (Pret_u + 10000) Pret_modif FROM MATERIALE; (6) Se obţine: Mat Cherestea Cherestea Cherestea Tabla Tabla Cot Con
Pret_u 150000 140000 180000 120000 140000 120000 130000
Pret_modif 160000 150000 190000 130000 150000 130000 140000
Se pot crea noi coloane care se pot redenumi în timpul execuţiei. Redenumirea coloanelor se face folosind sintaxa: alias. Minus (-), Înmulţire (*), Împărţire (/) se folosesc similar cu operatorul Plus(+). 161
Universitatea SPIRU HARET
Modulo (%) este un operator care returneză restul întreg al unei împărţiri. De exemplu: 7%3=2 9%3=0 (7) Operatorul modulo nu acceptă tipuri de date care conţin zecimale, ca, de exemplu, tipul real sau number. 6.3.2. Operatorii de comparaţie Operatorii de comparaţie sunt: Egal (=), Mai mare decât (>), Mai mare sau egal (>=), Mai mic decât (=). Operatorul mai mare decât (>) acţionează în felul următor: Comandă: SELECT Nr_inreg, Cod, Mat, UM, Cant, Pret_u FROM MATERIALE (8) WHERE Cant >1000 AND Mat=’Cherestea’; Nr. înreg 2
Cod 12245
Mat Cherestea
UM kg
Cant 1500
Pret_u 140000
În mod similar acţionează şi ceilalţi operatori de comparaţie Mai mare sau egal (>=), Mai mic decât ( SELECT * FROM MATERIALE WHERE Mat LIKE ’C%’; (10) 162
Universitatea SPIRU HARET
Execuţia acestei comenzi are ca efect apariţia acelor înregistrări în care Mat începe cu litera C. De remarcar că LIKE diferenţiază literele mari de literele mici. UNDERSCORE. este un caracter de înlocuire doar pentru un singur caracter. Pentru tabelul MATERIALE creat anterior se va exemplifica acest operator: SQL> SELECT * FROM MATERIALE WHERE Mat LIKE ’Co_’; (11) Nr. înreg 6 7
Cod 31221 41124
Mat Cot Con
UM kg kg
Cant 1550 15500
Pret_u 120000 130000
Într-o instrucţiune SELECT pot apărea mai multe semne underscore. De asemenea, se poate regăsi o înregistrare sau mai multe după un caracter situat oriunde în şirul de caractere. Concatenarea presupune reunirea a două sau mai multe şiruri de caractere. Pentru concatenare se foloseşte simbolul // sau +. SQL> SELECT Cod // Mat CodDenumire_material FROM MATERIALE; (12) CodDenumire_material 12345Cherestea 12245Cherestea 11145Cherestea 21123Tabla 21124Tabla 31221Cot 41124Con 6.3.4. Operatorii logici Operatorii logici sunt următorii: AND, OR, NOT. Operatorul AND utilizat între două expresii presupune ca ambele să fie adevărate pentru ca acestea să returneze valoarea de adevăr TRUE. Dacă oricare dintre expresii este falsă, AND va returna valoarea FALSE. Acest operator a fost utilizat în exemplul (8). Operatorul OR este utilizat pentru însumarea unei serii de condiţii. Când cel puţin una dintre condiţii este adevărată, OR returnează valoarea TRUE. Operatorul NOT În cazul aplicării unei condiţii care are valoarea TRUE, operatorul NOT o va schimba în FALSE. În situaţia în care condiţia care urmează operatorului NOT are valoarea FALSE, ea va deveni TRUE. 6.3.5. Operatorii pentru mulţimi UNION şi UNION ALL UNION returnează rezultatele a două interogări (selecţii), mai puţin liniile duplicate. UNION ALL returnează rezultatele tuturor interogărilor (selecţiilor), mai puţin liniile duplicate. 163
Universitatea SPIRU HARET
INTERSECT Operatorul INTERSECT (intersecţie) returnează numai liniile comune găsite în ambele interogări (selecţii). MINUS MINUS (cea de DIFERENŢA) returnează liniile din prima interogare (selecţie) care nu fac parte din a doua interogare (selecţie). 6.3.6. Alţi operatori, IN şi BETWEEN Cei doi operatori IN (În) şi BETWEEN asigură folosirea unei forme scurte pentru funcţii diverse. SQL> SELECT * FROM MATERIALE WHERE Mat IN (’Cherestea’, ’Tabla’); (13) SQL> SELECT * FROM MATERIALE WHERE Pret_u BETWEEN 140000 AND 170000; (14) 6.4. Funcţii în SQL Caracteristicile generale ale funcţiilor Funcţiile din SQL permit executarea calculului sumei pe o coloană sau conversia tuturor caracterelor unui şir în litere mari. Ele se clasifică în: ¾ Funcţii pentru calculul totalurilor. ¾ Funcţii pentru data calendaristică şi oră. ¾ Funcţii aritmetice. ¾ Funcţii caracter. ¾ Funcţii de conversie. ¾ Funcţii diverse. Aceste funcţii dezvoltă capacitatea de manipulare a informaţiilor regăsite pe baza funcţiilor de bază ale SQL. Primele cinci funcţii, COUNT, SUM, AVG, MAX şi MIN, sunt funcţii pentru calculul totalurilor şi sunt definite în standardul ANSI. 6.4.1. Funcţii pentru calculul totalurilor Aceste funcţii se mai numesc funcţii de grup. Ele returnează o valoare bazată pe valorile unei coloane. Funcţia COUNT returnează numărul de linii care respectă condiţia din clauza WHERE. SQL> SELECT COUNT(*) FROM MATERIALE WHERE Pret_u < 140000; (15) Nr. înreg 4 6 7
Cod 21123 31221 41124
Mat Tabla Cot Con
UM kg kg kg
164
Universitatea SPIRU HARET
Cant 1221 1550 15500
Pret_u 120000 120000 130000
Funcţia SUM returnează suma tuturor valorilor dintr-o coloană. Pentru tabelul MATERIALE, dacă se calculează suma preţurilor unitare pentru materialele date, se va scrie: SQL> SELECT SUM (Pret_u) Total FROM MATERIALE; (16) Total 980000 Funcţia SUM are efect numai asupra câmpurilor numerice. Funcţia AVG calculează valoarea medie a unei coloane. Funcţia MAX returnează valoarea maximă dintr-o coloană numerică a tabelului. Funcţia MIN operează în acelaşi mod ca MAX, cu excepţia faptului că returnează cea mai mică valoare dintr-o coloană. Funcţia VARIANCE are ca rezultat dispersia, adică pătratul unei deviaţii standard şi operează numai cu numere sau cu variabile de tip numeric. Funcţia STDDEV calculează abaterea sau deviaţia standard a unei coloane de numere (sau variabile numerice). Pentru aceste funcţii se prezintă un exemplu care le înglobează pe toate. SQL> SELECT COUNT (*) AVG (Pret_u) MIN (Pret_u) MAX (Pret_u) STDDEV (Pret_u) VARIANCE (Pret_u) FROM MATERIALE; (17) 6.4.2.Funcţii dedicate pentru dată calendaristică şi oră Funcţia ADD_MONTHS (Adaugă luni) adaugă un număr de luni la o dată calendaristică specificată în cadrul sau în afara instrucţiunii SELECT. Funcţia operează cu tipuri de dată caracter sau numeric, însoţită de o pereche de funcţii ajutătoare, TO CHAR şi TO DATE. Funcţia LAST_DAY întoarce ca rezultat ultima zi a unei luni specificate. MONTHS_BETWEEN (Lunile dintre) Funcţia se foloseşte pentru a afla câte luni sunt între luna x şi luna y. Funcţia NEW_TIME (Ora nouă) serveşte dacă se doreşte a se corecta ora în funcţie de ora unui anumit teritoriu. Funcţia NEXT_DAY găseşte numele primei zile din săptămână egală sau ulterioară unei date calendaristice specificate. Funcţia SYSDATE (data şi ora calendaristică a sistemului) returnează data şi ora calendaristică a sistemului. 6.4.3. Funcţii aritmetice ABS returnează valoarea absolută a unui număr indicat. Această funcţie transformă toate numerele negative în numere pozitive şi lasă numerele pozitive neschimbate. CEIL şi FLOOR. Prima dintre aceste funcţii, CEIL, returnează cel mai mic număr întreg care este mai mare sau egal cu un argument dat. A doua, FLOOR, face exact operaţia inversă, returnând cel mai mare număr întreg care este egal sau mai mic cu un argument dat. 165
Universitatea SPIRU HARET
COS, COSH, SIN, SINH, TAN, TANH Funcţiile COS, SIN, TAN oferă baza pentru numeroase operaţii trigonometrice. Funcţiile COSH, SINH, TANH returnează valorile hiperbolice ale argumentelor primite ca parametri. Toate aceste funcţii operează presupunând că argumentul de intrare are valoarea în radiani. EXP (exponenţială) serveşte pentru a ridica constanta ’e’ la o putere. LN şi LOG sunt două funcţii se referă la logaritmi. Prima, LN, returnează logaritmul natural al argumentului primit ca valoare de intrare, iar LOG returnează logaritmul zecimal primit ca argument. MOD Standardul ANSI pentru operatorul modulo, %, este implementat uneori ca funcţia MOD. Interogarea: POWER Pentru a ridica un număr la putere, se utilizează funcţia POWER. În această funcţie, primul argument este ridicat la puterea exprimată prin al doilea argument. SIGN Funcţia SIGN returnează valoarea –1 dacă argumentul primit este mai mic decât 0, 0 dacă argumentul primit este egal cu 0 şi 1 dacă argumentul său este mai mare decât 0. SQRT Funcţia SQRT returnează rădăcina pătrată a argumentului primit. Deoarece rădăcina pătrată a unui număr negativ nu este definită, nu putem folosi această funcţie pentru numere negative. 6.4.4. Funcţii caracter CHR Funcţia CHR returnează caracterul echivalent cu numărul folosit ca argument. Caracterul este returnat în funcţie de setul de caractere din numele câmpului care aparţine bazei de date. CONCAT Funcţia CONCAT este echivalentă semnului // (concatenare). INITCAP Această funcţie configurează un cuvânt astfel: prima literă din cuvânt este literă mare, iar toate celelalte sunt caractere mici. LOWER şi UPPER LOWER modifică toate caracterele în litere mici, iar UPPER realizează operaţia inversă. LPAD şi RPAD Aceste două funcţii primesc minim două şi maxim trei argumente. Primul este şirul de caractere cu care trebuie să opereze. Al doilea argument este caracterul de umplere al spaţiilor adăugate. Al treilea argument are ca valoare prestabilită spaţiu sau poate fi un singur caracter sau un şir de caractere. LTRIM şi RTRIM Aceste funcţii primesc unul sau două argumente. Primul argument este un şir de caractere. Al doilea argument opţional este un caracter sau un şir de caractere sau are valoarea prestabilită spaţiu. Dacă pentru al doilea argument se utilizează o valoare diferită de spaţiu, aceste funcţii de aliniere vor alinia respectivul caracter în acelaşi mod în care aliniază şi spaţiile. 166
Universitatea SPIRU HARET
REPLACE Funcţia REPLACE execută operaţiuni de înlocuire. Din cele trei argumente ale sale, primul este şirul care trebuie căutat. Al doilea argument este cheia de căutare. Ultimul argument este şirul opţional de înlocuire. Dacă al treilea argument lipseşte sau este NULL, toate secvenţele identice cu cheia de căutare din şirul respectiv sunt eliminate şi nu sunt înlocuite cu nimic. SUBSTR Această funcţie are trei argumente şi permite preluarea unei părţi din şirul destinaţie. Primul argument este şirul destinaţie. Al doilea argument este poziţia primului caracter ce trebuie afişat. Al treilea argument semnifică numărul de caractere care trebuie tipărite la ieşire. TRANSLATE Funcţia TRANSLATE primeşte, de asemenea, trei argumente. Primul este şirul destinaţie. Apoi, este şirul FROM, urmat de şirul TO. Elementele şirului destinaţie, care sunt identice cu şirul FROM, sunt înlocuite cu elementele corespondente din şirul TO. INSTR Se foloseşte pentru a găsi într-un şir un anumit caracter. Primul argument al acestei funcţii este şirul destinaţie. Al doilea argument este caracterul care trebuie găsit. Următoarele două argumente sunt numere ce reprezintă locul de unde începe căutarea în şir şi, respectiv, al câtelea element este cel identic cu caracterul ce trebuie afişat. LENGH Funcţia LENGH returnează lungimea singurului argument (câmp) caracter pe care îl primeşte. FUNCŢII DE CONVERSIE Sunt trei funcţii de conversie care pun la dispoziţie o metodă rapidă de convertire a unui tip de dată în alt tip de dată. TO_CHAR Modul uzual de operare a acestei funcţii este conversia unui număr într-un caracter. Alte implementări ale limbajului folosesc această funcţie pentru a converti în caracter alte tipuri de date, ca de exemplu DATE. TO_NUMBER Această funcţie este perechea funcţiei TO_CHAR şi primeşte ca parametru un şir pe care îl converteşte într-un număr. 6.5. Clauze utilizate în SQL Se prezintă mai întâi sintaxa generală a instrucţiunii SELECT: SELECT [DISTINCT / ALL] { * | { [schema.] {tabel | vedere | instantaneu }.* | expresie} [AS] c_alias] [, {[schema.] {tabel | vedere | instantaneu}.* | expresie} [AS] c_alias] ]…..} FROM [schema.] {tabel | vedere | instantaneu} [@ dblink] [t_alias] [,[schema.] {tabel | vedere | instantaneu} [@ dblink] [t_alias]… [WHERE condiţie] [GROUP BY expresie [, expresie]…[HEAVING condiţie] ] [{UNION | UNION ALL | INTERSECT | MINUS} SELECT comanda] [ORDER BY {expresie | poziţie } [ASC | DESC] [, {expresie | poziţie} [ASC | DESC] ] …] (18) 167
Universitatea SPIRU HARET
Clauza WHERE Utilizând doar SELECT şi FROM, acţiunea este limitată la returnarea tuturor liniilor din tabel. Există însă cuvântul cheie WHERE pentru stabilirea de selecţii asupra tabelului (exemplele 8 şi 9). Clauza STARTING WITH Clauza STARTING WITH este o completare la clauza WHERE şi operează la fel ca LIKE (%). Clauza ORDER BY Când apare necesitatea ca rezultatele interogării să fie prezentate într-o anumită ordine, se utilizează clauza ORDER BY. Instrucţiunea SELECT FROM oferă o listă, iar în cazul în care nu s-a definit o cheie primară, interogarea va apărea în ordinea introducerii înregistrărilor. Clauza ORDER BY oferă o metodă de ordonare a rezultatelor operaţiilor. De exemplu, dacă se doreşte ordonarea listei materialelor după Cod, se procedează în modul următor: SQL> SELECT * FROM MATERIALE ORDER BY Cod; (19) Clauza GROUP BY SQL> SELECT Mat, SUM (Pret_u) Total FROM MATERIALE GROUP BY Mat; (20) Clauza HAVING SQL> SELECT Mat, Pret_u FROM PERSONAL GROUP BY Mat HAVING Pret_u < 140000; (21) Clauza HAVING permite folosirea de funcţii totalizatoare într-o instrucţiune de comparare, asigurând pentru funcţiile totalizatoare ceea ce WHERE asigură pentru înregistrările individuale. 6.6. Joncţiuni Noţiuni şi obiective ale joncţiunilor O caracteristică de bază a SQL-ului este capacitatea de grupare şi manipulare a datelor din mai multe tabele. Tabelele foarte complexe care conţin multe câmpuri şi multe înregistrări sunt mult mai greu de întreţinut decât cele mici şi specifice. Or, tocmai acest avantaj îl oferă funcţia JOIN din SQL. Joncţiunile pe care le pune la dispoziţie SQL-ul sunt ¾ Joncţiuni externe. ¾ Joncţiuni stânga. ¾ Joncţiuni dreapta. ¾ Echi-joncţiuni. ¾ Non-echi-joncţiuni. ¾ Joncţiunea unui tabel cu el însuşi (auto-joncţiunea). Regula de bază a joncţiunilor este aceea că ele „lipesc” tabelele. Pentru tabelele care intră în joncţiune se folosesc alias-uri pentru a le deosebi. Diferenţa între echi-joncţiune şi non-echi-joncţiune este aceea că prima utilizează semnul egal în instrucţiunea WHERE, în timp ce non-echi-joncţiunea foloseşte oricare alt semn de comparaţie în afară de egal. 168
Universitatea SPIRU HARET
Există, de asemenea, joncţiuni externe care sunt complementare joncţiunilor interne. Joncţiunea internă este aceea în care liniile unui tabel sunt combinate cu liniile altui tabel, reprezentând un număr total de linii dat de produsul numărului de linii din fiecare tabel, linii folosite pentru a determina rezultatul unei clauze WHERE. O joncţiune internă are ca format general: SQL> SELECT alias1.câmp1, [alias1.câmp1,...], alias2.câmp2, [alias2.câmp2,...] FROM TABEL alias1 JOIN TABEL2 ON TABEL2.câmp (22) O joncţiune externă are aceeaşi formă, numai că înaintea cuvântului cheie JOIN apare RIGHT OUTHER sau LEFT OUTHER. Joncţiunea unui tabel cu el însuşi se comportă ca JOIN-ul pe două tabele diferite. Subinterogări O subinterogare este o interogare ale cărei rezultate sunt transmise ca argumente unei alte interogări. Ele sunt elementele de legătură între mai multe interogări. Imbricarea subinterogărilor Imbricarea este operaţia de lipire a mai multor subinterogări în serie, forma generală fiind: SQL> SELECT * FROM TABEL WHERE (23) (subinterogare1(subinterogare2(subinterogare3); Există şi subinterogări corelate, care permit folosirea unei referinţe externe. 6.7. Instrucţiuni de manipulare a datelor Instrucţiunea INSERT Instrucţiunea INSERT (Inserează) este asociată operaţiei de introducere a datelor într-o bază de date. Ea poate fi: INSERT...VALUES şi INSERT...SELECT Instrucţiunea INSERT...VALUES este utilizată la introducerea datelor întrun tabel, înregistrare cu înregistrare. Este utilă pentru operaţii care presupun lucrul cu tabele care au înregistrări puţine. Forma generală a comenzii este: SQL> INSERT INTO TABEL (col1, col2, col3,…) VALUES (valoare1, valoare2, valoare3,…) (24) Funcţia principală a acestei instrucţiuni este adăugarea unei înregistrări într-un tabel folosind coloanele menţionate şi valorile corespondente. La inserarea datelor într-un tabel prin folosirea acestei instrucţiuni, trebuie respectate următoarele reguli: ¾ valorile folosite trebuie să aibă acelaşi tip de dată ca şi câmpurile în care sunt adăugate; ¾ dimensiunea datei introduse trebuie să fie mai mică decât dimensiunea coloanei. De exemplu, un şir de 25 de caractere nu poate fi scris într-un câmp de 10 caractere; 169
Universitatea SPIRU HARET
¾ localizarea datei în lista VALUES trebuie să corespundă locaţiei din lista de coloane în care este adăugată (adică, prima valoare trebuie să fie introdusă în prima coloană, a doua Inserarea valorilor NULL Când este creată o coloană, i se poate atribui câteva caracteristici. Una dintre aceste caracteristici este aceea că respectiva coloană ar putea avea (sau nu) capacitatea de a conţine valori NULL. O valoare NULL înseamnă că valoarea este vidă. Nu este nici zero, în cazul unui întreg, nici spaţiu, în cazul unui şir. În locul acestora nu există nici un fel de dată în coloana înregistrării respective. Când coloana are definiţia NOT NULL, înseamnă că acestei coloane nu i se permite să conţină valori NULL, deci ea trebuie să conţină o valoare. Instrucţiunea INSERT este anulată în cazul în care această regulă nu este respectată şi se recepţionează un mesaj de descriere a erorii apărute. Inserarea valorilor unice Multe sisteme de gestiune a bazelor de date permit crearea unei coloane cu atributul UNIQUE. Aceasta înseamnă că, în tabelul respectiv, valorile din coloana respectivă trebuie să fie completate în mod unic şi, ca atare, nu pot apărea mai mult de o singură dată. Această configurare poate genera probleme la inserarea sau actualizarea valorilor într-o bază de date existentă. Instrucţiunea INSERT…SELECT Instrucţiunea INSERT…VALUES este utilă la adăugarea înregistrărilor simple într-un tabel al bazei de date, dar are evident restricţiile sale. În cazul tabelelor cu înregistrări foarte numeroase, este mult mai indicată utilizarea instrucţiunii INSERT…SELECT. Această instrucţiune permite utilizatorului să copieze într-un tabel informaţii dintr-un alt tabel sau grup de tabele. Deseori, pentru creşterea performanţei sunt create tabele de căutare. Tabelele de căutare pot conţine date care cuprind mai multe tabele din mai multe baze de date. Sintaxa unei instrucţiuni INSERT…SELECT este următoarea: SQL> INSERT INTO TABEL (col1, col2,…) SELECT Col1, Col2,… FROM TABEL WHERE condiţie de căutare; (25) Este important de reţinut că ieşirea unei interogări standard de tip SELECT devine intrare într-un alt tabel al unei baze de date. Aceleaşi reguli se aplică în cazul instrucţiunii INSERT...VALUES. Sunt câteva reguli care trebuie respectate la folosirea instrucţiunii INSERT...SELECT: ¾ instrucţiunea SELECT nu poate selecta linii din tabelul care a fost inserat; ¾ numărul de coloane din instrucţiunea INSERT...SELECT trebuie să fie egal cu numărul de coloane returnate de instrucţiunea SELECT; ¾ tipurile de date ale coloanelor din instrucţiunea INSERT SELECT trebuie să fie aceleaşi cu tipurile de date ale coloanelor returnate de instrucţiunea SELECT. Instrucţiunea UPDATE Instrucţiunea UPDATE (Actualizează) are rolul de a actualiza valorile unui tabel, dar este folosită şi pentru modificarea valorilor din înregistrările existente. Sintaxa instrucţiunii UPDATE este următoarea: 170
Universitatea SPIRU HARET
SQL> UPDATE TABEL SET Col1 = Valoare1 [Col2 = Valoare2]… WHERE condiţie de căutare (26) Această instrucţiune verifică în primul rând clauza WHERE. Pentru toate înregistrările din tabelul dat în care clauza WHERE este evaluată la valoarea TRUE., valoarea corespunzătoare este actualizată. Instrucţiunea DELETE La fel de frecvent ca şi adăugarea de date într-o bază de date, apare necesitatea de ştergere a altor date pe baza unei anumite operaţii din program. Sintaxa instrucţiunii DELETE (Şterge) este următoarea: SQL> DELETE FROM TABEL WHERE condiţie (27) Instrucţiunea DELETE are următoarele caracteristici: ¾ Instrucţiunea DELETE nu poate fi folosită pentru ştergerea unei valori dintr-un câmp individual (pentru aceasta se foloseşte instrucţiunea UPDATE). Instrucţiunea DELETE şterge înregistrări complete dintr-un singur tabel. ¾ Ca şi instrucţiunile INSERT şi UPDATE, operaţia de ştergere a înregistrărilor dintr-un singur tabel poate determina apariţia unor probleme de integritate referenţială în cadrul altor tabele. Acest aspect trebuie reţinut atunci când se modifică datele dintr-o bază de date. ¾ Prin folosirea instrucţiunii DELETE se pot şterge numai înregistrări din tabel, nu şi tabelul. Pentru eliminarea unui tabel se foloseşte instrucţiunea DROP TABLE. CREATE TABLE construieşte un tabel nou în formatul dat, iar DROP TABLE şterge tabelul respectiv. Instrucţiunea DROP TABLE elimină un tabel pentru totdeauna, în timp ce DELETE FROM şterge numai înregistrările dintr-un tabel. 6.8. Crearea şi întreţinerea tabelelor Instrucţiunea CREATE DATABASE are sintaxa generală: SQL> CREATE DATABASE NUME_BAZĂ_DE _DATE (28) Instrucţiunea CREATE TABLE are sintaxa generală: SQL> CREATE TABLE NUME_TABEL (Câmp1 tip_de_dată [NOT NULL], Câmp2 tip_de_dată [NOT NULL], Câmp3 tip_de_dată [NOT NULL]…) (29) Instrucţiunea ALTER TABLE În cazul în care baza de date nu poate memora toate datele necesare, instrucţiunea ALTER TABLE permite administratorului de sistem sau proiectantului să modifice structura unui tabel. Sintaxa instrucţiunii ALTER TABLE este următoarea: SQL> ALTER TABLE NUME_TABEL (30) 171
Universitatea SPIRU HARET
Instrucţiunea ALTER TABLE are o serie de restricţii, cum sunt: ¾ instrucţiunea nu poate fi utilizată pentru adăugarea sau ştergerea unor câmpuri din baza de date; ¾ se poate utiliza pentru modificarea atributului din NOT NULL în NULL pentru un câmp al bazei de date, dar nu şi în sens invers; ¾ modificarea unui câmp din NULL în NOT NULL poate fi eficient făcută cu această instrucţiune numai când câmpul respectiv nu conţine valori NULL. Instrucţiunea DROP TABLE serveşte pentru eliminarea unui tabel dintr-o bază de date. Odată executată comanda DROP TABLE, nu se poate reveni asupra ei. Comanda DROP TABLE este folosită de obicei după ce s-a creat un tabel temporar. Comanda DROP TABLE are sintaxa următoare: SQL> DROP TABLE NUME_TABEL; (31)
172
Universitatea SPIRU HARET
7. ELEMENTE FUNDAMENTALE ALE SERVERELOR DE BAZE DE DATE
7.1. Arhitectura Client/Server Într-o reţea de calculatoare şi de comunicaţii dintr-o organizaţie economică, unul dintre modelele de bază pe care se fundamentează funcţionarea reţelei îl constituie modelul client/server, susţinut de arhitecturi adecvate în funcţie de numărul de entităţi componente ale lanţului de lucru în reţea a unei aplicaţii ale cărei elemente – prezentare, procesare şi date – se găsesc pe acelaşi calculator sau sunt distribuite pe calculatoare diferite (în varianta standard, datele sunt stocate pe server, procesarea este divizată între server şi client, iar prezentarea aparţine clientului). Aceste arhitecturi client/server pot fi cu două entităţi (two-tier), cu trei entităţi (three-tier) sau cu mai multe entităţi (n-tier). Toate calculatoarele care se găsesc între server şi client alcătuiesc ceea ce se denumeşte generic middleware (mediul de mijloc). Serverul, ca noţiune de bază, prezintă două accepţiuni: • un calculator dedicat pe care este instalat un soft pentru gestionarea accesului într-o reţea locală de calculatoare (LAN), inclusiv gestionarea accesului la resursele din reţea din partea calculatoarelor – staţii de lucru (workstations); • un program (conceput pe un model de proces distinct) sau un calculator care răspunde cererilor (requests) adresate de entitatea denumită client; clientul, în acest caz, este un proces care are nevoie de un serviciu pe care trebuie să i-l furnizeze serverul. Ca urmare, noţiunea de server trebuie considerată în reţea sub cele două aspecte hard-soft (dualitatea hard-soft). Cea de-a doua accepţiune prezentată mai sus pentru server caracterizează arhitectura client/server ce permite divizarea procesului specific aplicaţiei în două componente distincte, denumite client (« front-end ») şi server (« back-end »). De regulă, componenta client este reprezentată de un calculator mai puţin pretenţios, independent, ce se prezintă utilizatorului cu toate resursele la dispoziţie. Spre deosebire de aceasta, componenta server este un sistem de calcul (microcalculator puternic, minicalculator sau un calculator mare mainframe) cu caracteristici tehnologice maximale momentului implementării în mediu distribuit (gestionare date, partajare resurse între clienţi, securitate sporită, administrare avansată în cadrul reţelei de calculatoare şi de comunicaţii). Cu ajutorul arhitecturii client-server se obţin: conectarea în reţea a mai multe calculatoare de diferite tipuri (mainframe şi microcalculatoare), tratarea unitară a bazelor de date aflate pe diferite calculatoare din reţea, colaborarea categoriilor de utilizatori (utilizatori finali, administratori ai bazelor de date, programatori). 173
Universitatea SPIRU HARET
Între entitatea client şi cea de server se poartă un dialog permanent sau în anumite momente, de tipul cerere (request) - răspuns (response). Clientul, prin adresarea cererii de serviciu către server, interoghează baza de date ce se găseşte stocată pe server. Serverul gestionează baza de date şi răspunde interogării adresate de client. În dialogul client-server, pot exista următoarele cazuri: client-server, client pasiv şi server pasiv. Cazul cu client pasiv se întâlneşte atunci când se realizează conexiuni cu prelucrare gazdă (host procesing) pe un server de tip mainframe, iar clientul este un terminal cu rol neimportant în execuţia operaţiilor necesare efectuării dialogului. Cazul cu server pasiv se constată atunci când cele mai multe aplicaţii se efectuează de către client, serverul îndeplinind doar rolul de server de fişiere (File Server) şi/sau server de imprimare (Print Server). Cel mai eficient este cazul clientserver când activităţile sunt divizate în mod echilibrat între client şi server. Există şi situaţia în care cele două entităţi, server şi client, sub aspect software, pot coexista pe acelaşi calculator. Dacă cele două entităţi sunt instalate pe acelaşi calculator, atunci acest calculator are instalat un sistem de operare pentru multiprocesare, deoarece clientul şi serverul reprezintă procese distincte. În reţeaua de calculatoare şi de comunicaţii, un client poate adresa cereri către mai multe servere. De asemenea, un server poate răspunde la cererile adresate de mai mulţi clienţi. În evoluţia sa, arhitectura client-server a cunoscut mai multe generaţii: • Generaţia I, care se caracterizează prin faptul că server-ul stochează baza de date relaţională, iar clientul stochează şi execută aplicaţia client. Cererile SQL sunt formulate de aplicaţia client către SGBDR de pe server. Execuţia acestor cereri de interogare şi transmiterea răspunsului se efectuează de către entitatea server. Entitatea client poate executa următoarele apeluri la transport: - SendRequest, ceea ce înseamnă: clientul anunţă serverul asupra operaţiilor ce urmează a fi executate; - ReceiveReply, prin care se asigură recepţionarea răspunsului de la server de către client. În acelaşi timp, la entitatea server, apelurile specifice sunt următoarele: - ReceiveRequest, care semnifică faptul că entitatea server recepţionează cereri de interogare de la entitatea client ; - SendReply, care înseamnă că serverul transmite răspunsul către entitatea client, răspuns ce corespunde cererii de interogare adresate anterior. • Generaţia a II-a, caracteristică anilor ’90 ai secolului XX, orientată pe obiecte. Entitatea server asigură mai multe clase de servicii clienţilor: execuţia aplicaţiilor; interfeţe grafice destinate dialogului cu utilizatorul; accesul la fişierele şi bazele de date administrate de SGBDR de pe server. Există mai multe tipuri de client-server, în funcţie de importanţa acordată unei sau alteia dintre componentele « triadei » stocare – prelucrare – prezentare: 1) client - server de prezentare, în care un proces este destinat funcţiei de asigurare a dialogului cu utilizatorul, iar celelalte procese considerate realizează gestionarea datelor şi execuţia aplicaţiilor; 2) client - server de date, în care utilizatorul are acces la datele administrate de server utilizând o aplicaţie-client, cu ajutorul cererilor de interogare SQL; 3) client - server de proceduri pentru prelucrare, în care aplicaţia-client poate realiza controlul execuţiei procedurilor stocate pe server prin intermediul unei interfeţe specializate. 174
Universitatea SPIRU HARET
Cel mai răspândit este tipul combinat client-server de date, de prezentare şi de proceduri pentru prelucrare care prezintă următoarele componente (fig.7.1): • clienţii, care se ocupă cu gestionarea codului aplicaţiei client şi care dispun de interfaţe interactive şi prietenoase cu utilizatorii finali; • serverul, care stochează baza de date, gestionează conectarea şi accesul la baza de date, gestionează logica aplicaţiei, asigură securitatea bazei de date; • reţeaua, care asigură conectarea şi comunicarea dintre clienţi şi server (1) şi între servere (2). În general, aplicaţiile client-server pot fi aplicaţii cu baze de date distribuite, aplicaţii de poştă electronică, aplicaţii groupware (ce permite unui grup de utilizatori dintr-o reţea să colaboreze la realizarea unui anumit proiect şi care oferă servicii de comunicaţii (e-mail), de planificare şi de administrare a proiectelor, de elaborare în comun a documentelor de diferite tipuri – text, multimedia) etc. Avantajele utilizării arhitecturii client-server sunt multiple, dintre acestea menţionându-se: administrarea centralizată, de pe server, a bazei de date; micşorarea dimensiunilor aplicaţiilor; reducerea traficului în reţea; securitate sporită a bazelor de date stocate pe server; manipularea de către utilizatori, conform drepturilor de acces, a procedurilor stocate. În aplicaţiile de baze de date pe Web se utilizează arhitectura cu trei niveluri: client, aplicaţie şi date. Nivelul client permite unui utilizator să comunice cu baza de date prin Web, cu ajutorul unei interfeţe specializate asigurate de către browserul Web la dispoziţie.
• • • •
Stocare bază de date Conectare şi acces la baza de date Gestionare logică aplicaţie Asigurare securitate bază de date
• Gestionare cod aplicaţie client • Interfaţă interactivă cu utilizatorul final
Fig.7.1. Arhitectura client-server de date, de prezentare şi de proceduri pentru prelucrare
Nivelul aplicaţie reprezintă nivelul cu aplicaţii la îndemâna utilizatorului final, pe serverul Web care, prin intermediul protocolului HTTP, recepţionează cererile clienţilor, le prelucrează şi le transmite către o altă aplicaţie sau/şi către nivelul de date. Nivelul date conţine sistemul de gestiune a bazelor de date (SGBD), care conţin, de regulă, date multimedia. 175
Universitatea SPIRU HARET
7.2. Serverul de baze de date Microsoft SQL Server Produsul Microsoft SQL Server face parte din categoria serverelor de baze de date, care lucrează cu aplicaţii de tipul client-server şi care presupune acces concurent la o anumită bază de date. Referirile se efectuează la versiunea Microsoft SQL Server2000 care a fost precedată de versiunea Microsoft SQL Server 7.0. În momentul redactării prezentei lucrări, este anunţată versiunea Microsoft SQL Server 2005. Stocarea informaţiilor pe serverul de baze de date Microsoft SQL Server se face în baze de date, fişiere şi grupuri de fişiere. Microsoft SQL Server dispune de un sistem de securitate propriu, pe bază de identificatori şi conturi de utilizatori ai bazelor de date. SQL Server asigură crearea şi gestionarea rolurilor la nivel de server, la nivelul unei baze de date şi la nivel de aplicaţie; de asemenea, asigură permisiuni, care pot fi alocate utilizatorilor şi rolurilor. Rolurile SQL Server asigură gruparea numelor utilizatorilor bazelor de date (grupuri Windows, utilizatori Windows sau identificatori SQL Server). Atribuirea unui identificator pentru rol la nivel de server se efectuează cu ajutorul SQL Enterprise Manager. Rolurile la nivel de aplicaţie asigură aplicarea permisiunilor la un nivel mai înalt decât nivelul pe care se găseşte fiecare utilizator. Atunci când o aplicaţie activează un rol la nivel de aplicaţie, se produce suspendarea tuturor permisiunilor utilizatorului. Activarea rolurilor necesită parole. Fiecare bază de date cuprinde roluri (există nouă roluri fixe sau predefinite şi pot exista roluri ale utilizatorului) pentru care există proceduri. Fiecare rol al unei baze de date acordă utilizatorilor un număr de permisiuni şi capabilităţi. Numele rolului este necesar să fie unic la baza de date. Apartenenţa la un rol fix al unei baze de date nu are legătură cu permisiunile acordate pentru o altă bază de date. SQL Server permite realizarea salvărilor de siguranţă (backup). SQL Server este însoţit de utilitare şi instrumente care asigură următoarele servicii: 1. MSSQLServer, ce reprezintă serverul propriu-zis de baze de date; 2. MSSearch, care asigură indexarea câmpurilor de tip text care operează sub SQL Server; 3. SQLServerAgent, ce realizează planificarea operaţiilor, gestionarea evenimentelor, replicarea, generarea avertismentelor; 4. MSDTC (Microsoft Distributed Transaction Coordinator), adică coordonatorul tranzacţiilor distribuite pe mai multe servere; 5. MSSQLServerOLAPService, ce asigură serviciile de analiză a datelor prin OLAP; 6. MSSQLServerADHelper, ce realizează integrarea activă a directoarelor pentru SQL Server. Instanţa în SQL reprezintă o copie independentă a unui server de baze de date pe un calculator din categoria platformelor Microsoft Windows. Microsoft SQl Server permite execuţia a cel mult 16 astfel de instanţe. Instanţele SQL Server pot fi prestabilite (este acceptată o singură instanţă prestabilită pe un anumit calculator) sau denumite (acele instanţe cărora li s-a dat un nume la instalare). Două instanţe denumite de pe acelaşi calculator nu sunt acceptate cu acelaşi nume. 176
Universitatea SPIRU HARET
Firma Microsoft a realizat controlul fiecărui serviciu prin mai multe metode realizabile prin utilitare şi instrumente asociate SQL Server (instalate într-o copie unică, indiferent de numărul de instanţe instalate ale SQL Server). Utilitarele asociate SQL Server sunt următoarele: • SQL Server Books OnLine, ce reprezintă manuale electronice sub formă de pagini HTML (de exemplu: Getting Started, SQL Server Architecture, Creating and Maintaining dataBases, Creating and Using Data Warehouses etc.). • SQL Server Service Manager, care este un utilitar pentru controlul serviciilor pentru SQL Server (SQL Server, MSDTC, SQL ServerAgent şi MSSearch). • Client Network, ce reprezintă un utilitar care deserveşte procesul de conectare a unui calculator client la SQL Server). • Server Network, care este un utilitar pentru indicarea bibliotecilor de reţea pe care le poate utiliza SQL Server (pentru bibliotecile ce conţin date confidenţiale la care nu se permite accesul, se execută criptarea de către server a căilor de conectare la bibliotecile respective). • SQL Server Query Analyser, care este utilitarul destinat executării interogărilor sau a procedurilor memorate Transact-SQL. • SQL Server Enterprise Manager, ce reprezintă un utilitar de tipul MMC (Microsoft Management Console), adică consolă de Management Microsoft ce asigură interfaţa grafică de dezvoltare şi administrare din SQL Server. • SQL Server Profiler, ce reprezintă utilitarul pentru monitorizarea întregii activităţi executate de SQL Server. Utilitarele prezentate mai sus se găsesc în meniul Start al SQL Server. În afară de aceste utilitare de bază, au fost realizate instrumente pentru conectare, pentru diagnosticarea serverului şi pentru întreţinere. Noţiunea de replicare a fost explicată parţial în capitolul destinat SGBD Microsoft Access. Procesul de replicare în SQL Server este un proces complex ce utilizează un scenariu de tip editor-abonat la care sunt asociate articole şi publicaţii. Abonaţii sunt calculatoarele utilizatorilor datelor. Un sistem SQL Server poate juca în scenariul de tip editor-abonat unul, două sau trei roluri din mulţimea de roluri {editor, abonat, distribuitor}. Rolul de distribuitor presupune recepţionarea tuturor modificărilor efectuate de abonaţi sau editori, memorarea acestor date şi apoi trimiterea lor la editori sau abonaţi, la un anumit moment. Articolul reprezintă un tabel sau o mulţime de date dintr-un tabel, obţinută prin partiţionare. Publicaţia este ansamblul mai multor articole combinate. Articolele şi publicaţiile pot fi primite de abonaţi prin efectuarea de abonamente. Abonamentele pot fi configurate în abonamente de intrare (configurate la nivelul fiecărui abonat) şi abonamente de ieşire (configurarea abonamentului se produce simultan cu crearea publicaţiei). Replicarea asigură un mediu de lucru ce facilitează duplicarea şi distribuirea mai multor copii (replici) ale aceloraşi date, în mai multe baze de date din reţea (în mai multe locaţii). În distribuirea datelor prin această metodă se au în vedere autonomia locaţiei, consistenţa tranzacţională (care nu trebuie să afecteze consistenţa datelor) şi latenţa distribuirii (întârzierea). SQL Server permite utilizarea următoarelor metode de distribuire a datelor [60]: 177
Universitatea SPIRU HARET
• replicarea cu combinare (fiecare locaţie îşi poate modifica copia locală a datelor replicate, astfel încât editorul combină modificările primite de la aceste locaţii); • replicarea copiilor integrale (prin transferul unei copii de ansamblu a datelor replicate de la editor la abonaţi); • replicarea tranzacţională (adică tranzacţiile sunt copiate de pe serverul editor la abonaţi, fără existenţa reversului de la abonaţi la editor); • abonarea cu actualizare (la care acualizarea poate fi imediată, cu fir de aşteptate sau combinată – imediată şi cu fir de aşteptare); • replicarea copiilor integrale cu actualizare la abonaţi (prin aceasta, abonatul nu este necesar să se afle în contact permanent cu editorul); • replicarea tranzacţională cu actualizare la abonaţi ; • tranzacţiile distribuite (cu MSDTC, cu aplicarea simultană a tranzacţiilor la toţi abonaţii). Replicarea este asigurată de cinci agenţi: agent de distribuţie, agent de citire din jurnalele de tranzacţii specifice tuturor bazelor de date publicate, agent de combinare, agent de copiere şi agent de citire din firul de aşteptare. Datele pot fi publicate pe Internet prin mai multe metode. Se apreciază ([60],[67]) că una dintre cele mai sigure metode este tehnologia reţelei private virtuale, VPN (Virtual Private Network). Prin VPN se pot conecta două reţele prin utilizarea Internetului, cu protocoalele specifice, folosind servere proxy (intermediare) către serverele SQL. SQL Server foloseşte patru baze de date: - master, ce conţine configurările SQL Server-ului, precum şi date care privesc utilizatorii bazei de date; - model, ce reprezintă o bază de date model, care se duplică de fiecare dată când utilizatorul creează o bază de date nouă; - tempdb, ce este o bază de date care stochează tabele temporare şi rezultatele intermediare ale unor interogări; - msdb, ce este utilizată de SQLServerAgent pentru memorarea datelor cu privire la sarcinile periodice (salvarea bazei de date, salvarea jurnalului etc). O bază de date SQL Server este organizată pe mai multe niveluri: componente logice ce sunt transparente utilizatorilor; tabele (tables) care conţin înregistrări ale bazei de date; vederi (views); indecşi (indexes); proceduri stocate (procedures); declanşatori (triggers). Fizic, o bază de date include cel puţin două fişiere (fişier primar de date, primary data file, cu date şi referinţe asupra celorlalte fişiere ale bazei de date; fişierul jurnal care înregistrează toate modificările efectuate în baza de date). În cazul bazelor de date foarte mari, pot exista şi fişiere secundare (secondary data file). La fiecare instalare a produsului Microsoft SQL Server sunt generate mai multe baze de date: master, model, tempdb şi msdb, precum şi baze de date utilizator (pubs, Northwind). Metodele de creare a unei baze de date Microsoft SQL Server 2000 sunt următoarele: • Database Creation Wizard. • SQL Server Enterprise Manager. • Cu ajutorul instrucţiunii CREATE DATABASE. 178
Universitatea SPIRU HARET
Crearea unei noi baze de date este echivalentă cu execuţia unei copii a bazei de date model, prin extinderea până la dimensiunea dorită, spaţiul suplimentar fiind completat cu pagini goale. Baza de date astfel creată utilizează fişiere pentru stocarea fizică a datelor pe discul magnetic. Salvarea bazelor de date în SQL Server se efectuează complet, diferenţial şi prin salvarea jurnalelor de tranzacţii cu ajutorul SQL Server Enterprise Manager sau cu Transact-SQL (ce va fi prezentat în paragraful următor). Copiile de siguranţă (backup) servesc pentru o restaurare a bazelor de date în caz de defectări ale serverului. SQL Server are pus la punct un scenariu de restaurare a bazelor de date în caz de dezastre. Se poate realiza recuperare automată sau manuală. Recuperarea automată reprezintă un proces care se derulează la fiecare pornire a serviciului SQL Server. Ca urmare, atunci când serverul se decuplează din diferite motive, inclusiv la avarii, procesul de recuperare automată se porneşte la repornirea serverului. La terminarea acestui proces de recuperare automată, bazele de date rămân într-o formă consistentă din punct de vedere logic. Pentru recuperarea tuturor bazelor de date, SQL Server utilizează baza de date model, după care se creează baza de date tempdb, se restaurează baza de date msdb şi, în final, bazele de date ale utilizatorilor. Recuperarea manuală reprezintă procesul de recuperare a unei baze de date a utilizatorului, prin restaurarea unei copii complete a bazei de date (sau copie diferenţială) sau restaurarea uneia sau mai multor copii pentru jurnalul de tranzacţii, în ordinea în care au fost generate. În momentul restaurării, baza de date nu trebuie să fie în uz (să nu fie activă comanda USE). Pentru aceasta, trebuie reperat setul corespunzător de copii de siguranţă (cu comenzile RESTORE LABELONLY, RESTORE HEADERONLY, RESTORE FILELISTONLY). În continuare, se verifică dacă setul salvat este utilizabil (RESTORE VERIFYONLY), se restaurează complet sau diferenţiat baza de date şi jurnalul de tranzacţii. Scenariile de recuperare sunt construite pentru diferite situaţii ca recuperarea datelor după defectarea unui disc, recuperarea datelor după pierderea bazei de date master, SQL Server asigură, aşa cum s-a precizat mai sus, servicii de extragere a datelor din bazele de date operaţionale şi de construire a depozitelor de date, după care aceste date din depozite sunt supuse analizei de tip OLAP. Acest serviciu este tratat în capitolul consacrat bazelor de date în tehnologii avansate. Microsoft SQL Server prezintă următoarele avantaje: - portabilitatea – capacitatea de a funcţiona pe o mare varietate de platforme hardware; - compatibilitatea modelului de programare cu modelele folosite în întreaga gamă de sisteme de operare Microsoft Windows (95, 98, 2000, XP); - optimizarea capabilităţilor sale pentru lucrul cu baze de date mari; - execuţia rapidă a interogărilor SQL; - posibilitatea de extragere şi analiză a datelor pentru baze de date multidimensionale; - facilitatea de integrare cu alte produse software Microsoft. 179
Universitatea SPIRU HARET
7.3. Noţiuni privind limbajul Transact_SQL pentru Microsoft SQL Server Limbajul Transact_SQL, notat prescurtat T_SQL reprezintă o variantă (dialect), compatibilă pe scară largă cu standardul SQL-92 pentru limbajul structurat de interogare, SQL (tratat în capitolul anterior) cu care se lucrează pe Microsoft SQL Server. Comenzile T_SQL pot fi grupate, în funcţie de nivelurile SQL Server, în comenzi referitoare la baze de date, la tabele, la vederi (view-uri), la proceduri, la gestionarea tranzacţiilor, la declanşatori. a) Comenzi pentru baze de date Crearea unei baze de date se face cu instrucţiunea CREATE. Sintaxa este următoarea: CREATE DATABASE nume [ON PRIMARY (FILENAME = ′ nume fişier1. mdf’] [LOG ON (FILENAME = ′ nume fişier2. ldf’)] în care: nume reprezintă numele bazei de date; ON PRIMARY arată faptul că nume fişier1. mdf reprezintă fişierul primar al bazei de date; LOG ON specifică numele fişierului jurnal prin nume fişier2. ldf. Datele vor fi regăsite în primul fişier, iar informaţia pentru registrul de tranzacţii se va regăsi în al doilea fişier. Se reaminteşte faptul că registrul de tranzacţii (fişierul jurnal) pentru o bază de date reprezintă zona în care serverul tratează modificările ce au fost efectuate asupra datelor din baza de date. Exemple: 1) CREATE DATABASE MAT S-a creat o bază de date denumită MAT, pentru care fişierul primar şi fişierul jurnal sunt generate automat. 2) CREATE DATABASE CLIENTI ON PRIMARY (FILENAME = ′c\banca\dbCLIENTI.mdf ′). S-a creat o bază de date cu numele CLIENTI, pentru care fişierul primar de date este: ′c\banca\db CLIENTI.mdf ′, iar fişierul jurnal este creat automat. Pentru ştergerea (eliminarea) unei baze de date se foloseşte comanda: DROP DATABASE nume bază de date Cu ajutorul acestei instrucţiuni se şterge complet baza de date, inclusiv datele şi structura fizică de pe disc. Exemplu: DROP DATABASE MAT b) Comenzi pentru tabele Crearea unui tabel se face cu comanda CREATE TABLE, cu sintaxa: CREATE TABLE [nume_baza_date.[proprietar], nume_tabel (câmp 1 [, câmp 2, câmp 3…] …, unde fiecare câmp are sintaxa: nume tip dată [IDENTITY] [NULL⏐NOT NULL] {PRIMARY KEY ⏐FOREIGN KEY REFERENCES tabel_ref (cimp_ref) [ON DELETE{CASCADE ⏐NO ACTION}] [ON UPDATE {CASCADE ⏐NO ACTION}]} 180
Universitatea SPIRU HARET
în care: nume_baza_date - este numele bazei de date din care face parte tabelul; proprietar – este numele utilizatorului ce devine proprietarul tabelului; nume – este numele câmpului (coloanei) din tabel; tip dată – este tipul câmpului (coloanei) din tabel. Datele în SQL Server 2000 reprezintă atribute, variabile, parametri de procedură, expresii, funcţii sau proceduri stocate care returnează o valoare. Aceste date sunt incluse în obiectele SQL şi pot fi de mai multe tipuri. Prin tipurile de date sunt definite valorile pe care le poate stoca obiectul respectiv (natura datelor, dimensiunea valorilor, precizia şi scala – la valori numerice). Tipurile de date în SQL Server 2000 sunt tipuri de date de bază (tipurile acceptate de sistem) şi tipuri de date utilizator (tipurile definite în funcţie de tipurile de bază, cu unele caracteristici suplimentare adăugate). Tipurile de date de bază sunt numerice exacte, numerice aproximative, bit, zecimale, monetare, dată calendaristică, şir de caractere, şir binar, şir de caractere Unicod, cursor, sql_variant etc. Tipurile de date numerice exacte sunt întregi cu următoarele dimensiuni: tinyint (întregi pozitivi reprezentaţi pe 1 octet), smallint (reprezentaţi pe 2 octeţi), int (reprezentaţi pe 4 octeţi) şi bigint (reprezentaţi pe 8 octeţi). Tipurile de date numerice aproximative sunt cu reprezentare în virgulă mobilă: float [(q)], unde parametrul q reprezintă numărul de biţi utilizaţi pentru reprezentarea mantisei (q=1-24 pentru o reprezentare pe 4 octeţi cu o precizie de 7 cifre zecimale şi q=25-53 pentru o reprezentare pe 8 octeţi cu o precizie de 15 cifre zecimale); real cu o reprezentare pe 4 octeţi (este similar cu float (24)). Tipul de dată bit este un întreg cu valorile 1, 0 sau NULL utilizat pentru reprezentarea variabilelor booleene (logice) True, False sau nedefinit. Tipurile de date zecimale sunt destinate pentru reprezentarea numerelor zecimale, cu număr variabil de octeţi, astfel: decimal[(p[,s])] şi numeric[(p[,s])], unde precizia p reprezintă numărul maxim posibil de cifre zecimale la stânga şi la dreapta punctului zecimal (p=1-38), iar scala s reprezintă numărul de zecimale(s=0-p). Tipurile de date monetare sunt folosite pentru reprezentarea sumelor de bani într-o anumită monedă, astfel: money (8 octeţi) şi smallmoney (4 octeţi). Tipul de dată calendaristică asigură cu datetime reprezentarea datei şi orei în intervalul de la 1 ian.1753 până la 31 dec.9999, cu o precizie de 1/3 sec, iar cu smalldatetime reprezentarea datei şi orei în intervalul de la 1 ian.1900 până la 06 iun.2079, cu o precizie de 1 min. Datele constante de tip dată calendaristică se scriu între apostroafe, în formate predefinite (`10 Jully 2004`, `12/28/04` etc.). Tipul de dată şir de caractere asigură reprezentarea şirurilor de caractere de lungime fixă sau variabilă. Tipul char[(n)] defineşte un şir de caractere nonUnicod cu lungimea fixă de n caractere (n=1-8000), iar tipul varchar[(n)] defineşte un şir de caractere non-Unicod cu lungimea variabilă de n caractere. Tipul de dată şir de caractere Unicod defineşte şirurile de caractere Unicod de lungime fixă sau variabilă. Tipul nchar[(n)] defineşte un şir de caractere Unicod cu lungimea fixă de n caractere (n=1-8000), iar tipul nvarchar[(n)] defineşte un şir de caractere Unicod cu lungimea variabilă de n caractere. Acest tip de dată se utilizează când datele pot prezenta dimensiuni dificil de estimat. 181
Universitatea SPIRU HARET
Tipul de dată cursor reprezintă o referinţă la un cursor, iar tipul de dată sql_variant este tipul de dată ce poate memora orice tip de dată specific SQL Server, cu excepţia celor de tip text, imagine, timestamp şi sql_variant. Tipul de dată timestamp permite generarea automată de către sistem a valorilor binare pentru crearea etichetelor unice destinate tuplelor tabelelor bazei de date. Ceea ce urmează în instrucţiunea de creare a tabelului, după nume câmp şi tip dată, sunt constrângerile asociate tabelului. IDENTITY se referă la o coloană (câmp) pentru care SQL Server realizează incrementarea automată cu o unitate a câmpului respectiv. Această opţiune se poate folosi doar pentru tipurile de câmp: tinyint, smallint, int, bigint, decimal sau numeric. IDENTITY se foloseşte, de regulă, asociată cu opţiunea PRIMARY KEY pentru identificarea în mod unic a fiecărei înregistrări din tabel. Un tabel poate conţine numai un singur câmp IDENTITY. Opţiunile NULL şi NOT NULL specifică dacă atributul la care se referă permite sau nu permite valori NULL. PRIMARY KEY arată câmpul care reprezintă cheia primară. FOREIGN KEY arată câmpul care este cheie externă, iar tabel_ref este tabelul la care se face referinţă. Cimp_ref reprezintă câmpul la care cheia externă face referinţă. ON DELETE cere care acţiuni se pot produce când se şterge tabelul. CASCADE arată ştergerea înregistrărilor corespunzătoare din tabelele copil. NO ACTION reprezintă opţiunea asumată prin lipsă. Exemplu: CREATE TABLE MATERIALE (cod_mat int IDENTITY NOT NULL PRIMARY KEY, den_mat char(15) NOT NULL, cant smallint NOT NULL, pret_unitar money NOT NULL) Pentru fiecare câmp s-a specificat NOT NULL, adică nu poate conţine valori de tip NULL. Există posibilitatea să se genereze tabele temporare ce sunt eliminate automat când utilizatorul încheie sesiunea de lucru sau când legătura cu baza de date este închisă. Specificarea unui tabel creat temporar se efectuează prin utilizarea caracterului # (diez) în numele tabelului. Exemplu: CREATE TABLE # TEMP_MAT Pentru a şterge un tabel dintr-o bază de date se utilizează comanda: DROP TABLE nume_tabel c) Comenzi pentru vederi (view-uri) Vederea (view-ul) reprezintă un tabel virtual în care se pot prezenta unitar date provenite prin interogare statică din unul sau mai multe tabele ale unei baze de date. Vederea este formată dintr-o instrucţiune SELECT ce a fost compilată anterior cu ajutorul comenzii CREATE VIEW. După crearea unei vederi (view), aceasta se poate folosi ca orice alt tabel al bazei de date. Nu sunt acceptate vederi temporare. 182
Universitatea SPIRU HARET
Sintaxa comenzii de creare a unei vederi (view) este următoarea: CREATE VIEW nume_vedere AS comanda SQL SELECT Restricţiile impuse în utilizarea acestei comenzi sunt: - nu se pot include clauzele ORDER BY, COMPUTE şi COMPUTE BY; - nu se poate include clauza INTO; - nu se poate face referire la un tabel temporar. Exemplu: USE MAT GO CREATE VIEW MAT_CONSTRUCTII AS SELECT * FROM MAT WHERE cod_mat BETWEEN 1001 AND 3999 GO Pentru a elimina o vedere (view) din baza de date se utilizează comanda: DROP VIEW nume_vedere. Vederile la care criteriile de selecţie sunt modificate pe baza evaluării expresiilor din clauzele WHERE sau HAVING se numesc vederi dinamice. Vederile (view-urile) reprezintă un mecanism eficace pentru divizarea datelor în subseturi, pe orizontală, pe verticală sau pe amândouă direcţiile. Pentru realizarea controlului introducerii şi actualizării datelor, vederile reprezintă alternative la restricţii şi declanşatori. d) Comenzi pentru proceduri O bază de date poate conţine şi proceduri stocate permanent pe server şi pseudo-compilate la utilizare, care reprezintă subprograme formate din pachete de instrucţiuni SQL. Procedurile stocate sunt necesare pentru a înlocui seturi de comenzi ce se execută repetat în cadrul unei aplicaţii. Codul sursă al procedurilor stocate se găseşte, alături de cele ale opţiunilor prestabilite, vederilor şi declanşatorilor, în tabelul de sistem syscomments. Afişarea codului-sursă al unei proceduri stocate se poate efectua cu ajutorul procedurii de sistem sp_helptext. Există proceduri de sistem şi proceduri ale utilizatorului. Procedurile de sistem sunt proceduri care sunt rezidente în baza de date master şi prezintă prefixul sp_. Procedurile de sistem se pot executa din orice bază de date. Sintaxa comenzii de creare a unei proceduri stocate este: CREATE PROCEDURE nume_procedura [@ parametru1 tip dată [ = valoare1] OUTPUT]] [@ parametru2 tip dată [ = valoare2] OUTPUT]] AS instrucţiuni SQL unde: OUTPUT – indică faptul că parametrul este de ieşire, adică va returna o valoare. Parametrii de ieşire pot fi numere întregi, şiruri de caractere, date calendaristice, cursoare. Parametrii sunt trecuţi în procedurile stocate după nume şi după poziţie. Procedurile stocate pot accepta maximum 1024 de parametri. 183
Universitatea SPIRU HARET
Pentru a executa o procedură, se utilizează comanda: EXEC nume_procedura valoare1, valoare2,…. Pentru eliminarea unei proceduri din baza de date se foloseşte comanda: DROP PROCEDURE nume_procedura. Procedurile temporare au prefixul #. Procedurile stocate sunt folosite în conformitate cu patru etape de bază: creare, executare de către utilizator, compilare şi executare de către serverul de baze de date. Procedurile stocate prezintă avantaje legate de: • facilitarea modificării datelor în acelaşi mod pentru toate aplicaţiile de baze de date; • creşterea vitezei de execuţie; • partajarea logicii de aplicaţie între diferite aplicaţii de baze de date; • simplificarea execuţiei interogărilor cu parametri; • modularizarea aplicaţiei; • reducerea cantităţii de cod care circulă în reţea; • contribuţia la realizarea securităţii bazei de date. e) Comenzi pentru gestionarea tranzacţiilor Tranzacţiile sunt seturi formate din una sau mai multe operaţii de baze de date care sunt tratate în mod unitar (fie se termină toate cu succes, fie se termină toate cu eşec). Tranzacţia este apreciată ca fiind unitatea operaţională fundamentală pentru o bază de date. Tranzacţiile SQL asigură unitatea şi recuperabilitatea datelor atunci când se produc deranjamente ale părţii de hardware, erori ale sistemului de operare, erori în aplicaţii sau ale SQL Server. Conceptul de tranzacţie se referă la partea de server şi presupune că un grup de comenzi executate în interiorul unei tranzacţii sunt terminate complet sau nu sunt realizate nici una (nu au efect asupra bazei de date). De asemenea, dacă o comandă afectează mai multe linii, aceasta îşi va produce efectul asupra tuturor liniilor afectate sau nu va modifica nici o linie. În momentul în care tranzacţia este executată în totalitate, atunci se produce şi salvarea modificărilor. Tranzacţiile asigură controlul concurent al mai multor utilizatori la baza de date (tabel, vedere), precum şi menţinerea consistenţei datelor prin îndeplinirea restricţiilor de integritate definite pentru baza de date. O tranzacţie definită de utilizator se poate construi după următorul model: BEGIN TRAN nume_tranzactie comenzi SQL COMMIT TRAN nume_tranzactie] sau ROLLBACK TRAN nume_tranzactie] în care: BEGIN marchează începutul unei tranzacţii, numele acesteia fiind opţional; COMMIT salvează toate modificările executate pe parcursul tranzacţiei în baza de date; ROLLBACK anulează modificările efectuate de comenzile tranzacţiei. Cu ajutorul acestei comenzi, baza de date este adusă în starea iniţială pe care o avea înaintea rulării tranzacţiei. 184
Universitatea SPIRU HARET
Exemplu: SELECT TOP 4 cod_mat, den_mat FROM MAT ORDER BY cod_mat BEGIN TRAN mat_vechi DELETE MAT SELECT TOP 4 cod_mat, den_mat FROM MAT ORDER BY cod_mat GO ROLLBACK TRAN mat_vechi SELECT TOP 4 cod_mat, den_mat FROM MAT ORDER BY cod_mat f) Comenzi pentru declanşatori Declanşatorii (triggers) sunt un tip special de proceduri stocate care se execută automat la apariţia unui eveniment, cum ar fi: INSERT (inserare), UPDATE (modificare) sau DELETE (ştergere de înregistrări din baza de date). Declanşatorii sunt ataşaţi tabelelor. Un declanşator poate fi construit cu comanda: CREATE TRIGGER nume_declansator ON nume_tabel FOR {INSERT, UPDATE, DELETE} AS Comenzi SQL unde: nume_declansator – este numele declanşatorului; nume_tabel – este tabelul la care se ataşează declanşatorul. INSERT, UPDATE, DELETE permit specificarea evenimentului la care este ataşat declanşatorul. Exemplu: USE MAT GO CREATE TRIGGER mat_DELETE ON MAT FOR DELETE AS IF CANT=0 DELETE MAT GO Variabile în limbajul Transact_SQL O variabilă locală în limbajul Transact_SQL reprezintă un obiect ce conţine o valoare de un anumit tip. Variabilele locale servesc în proceduri stocate sau în declanşatori pentru stocarea valorilor ce se testează prin comenzile de control sau se returnează de procedurile stocate, pentru transmiterea valorilor ca parametri la proceduri stocate, pentru numărarea şi controlul numărului de paşi ai unei bucle etc. Declararea variabilelor locale se efectuează cu DECLARE: DECLARE @ variabila_locala tip_dată unde: @ este simbolul folosit de procesorul de interogări pentru a identifica variabilele locale. Exemplu: DECLARE @ cod_mat int, @ den_mat varchar(25), @cod_depozit int Dacă se foloseşte @@ înaintea unei variabile, atunci procesorul de interogări interpretează variabila ca variabilă globală. 185
Universitatea SPIRU HARET
Microsoft SQL Server utilizează şi variabile globale de sistem, ca de exemplu: - @@ rowcount – numărul de linii afectate de ultima comandă; - @@ total_read – numărul de citiri de pe disc când se lansează SQL Server; - @@ total_write – numărul de scrieri pe disc când se lansează SQL Server. Pentru atribuirea unei valori pentru o variabilă, se alege între comanda SET şi comanda SELECT: SET @ variabila = expresie sau SELECT @variabila = expresie … Exemplu: DECLARE @den_mat varchar(25) SET @ den_mat = ciment sau SELECT @ den_mat = ciment FROM MAT Comanda SET este mai eficientă decât comanda SELECT, dar comanda SELECT poate fi folosită pentru a atribui valori mai mutor variabile: SELECT @ cod_mat = 1001, @ den_mat = ciment FROM MAT Afişarea mesajelor se poate obţine prin folosirea comenzii: PRINT @ variabila_locala @@ variabila_globala ⏐′ text′ Elemente de programare Structura secvenţială este evidenţiată prin utilizarea instrucţiunilor BEGIN, pentru marcarea punctului de început, şi END, pentru a marca punctul de sfârşit al unui bloc de comenzi SQL. Sintaxa blocului este: BEGIN comenzi SQL END Pentru implementarea structurii de control alternative cu două ramuri se foloseşte instrucţiunea IF cu următoarea sintaxă: IF (condiţie) comandă SQL ⏐bloc de comenzi SQL [ELSE comandă SQL ⏐bloc de comenzi SQL] Structura de control repetitivă se poate obţine cu ajutorul instrucţiunii WHILE cu următoarea sintaxă: WHILE condiţie comandă care execută comanda atât timp cât condiţia este adevărată. Tipul de date cursor Cursorul, ca mod complementar de lucru, asigură selecţia şi parcurgerea linie de linie a unui set de înregistrări care s-a obţinut ca urmare a execuţiei unei comenzi SELECT. Pentru folosirea cursorului se parcurg următoarele etape: 1) crearea cursorului; 2) deschiderea cursorului; 3) parcurgerea cursorului; 186
Universitatea SPIRU HARET
4) închiderea cursorului; 5) eliberarea memoriei alocate pentru cursor. 1) Crearea cursorului se execută cu instrucţiunea: DECLARE nume_cursor [FORWARD_ONLY ⏐SCROLL⏐CURSOR] FOR comandă SQL_SELECT unde: FORWARD_ONLY – cursorul poate fi parcurs doar de la prima la ultima înregistrare şi este mai rapid decât tipul SCROLL, care permite parcurgerea setului de înregistrări în acest sens. 2) Deschiderea cursorului (popularea cursorului) se obţine cu instrucţiunea: OPEN nume_cursor prin intermediul căreia are loc execuţia comenzii SELECT din clauza FOR. 3) Parcurgerea cursorului este realizată cu comanda: FETCH [NEXT ⏐PRIOR⏐FIRST⏐LAST] FROM nume_cursor INTO @ variabila_1, @ variabila_2,……. Se realizează două operaţiuni, şi anume: a) transfer de valori ale câmpurilor din înregistrarea curentă către @variabila_1, @variabila_2,…..; b) se trece la următoarea înregistrare (NEXT este implicit), la înregistrarea anterioară prin PRIOR, la prima FIRST sau la ultima înregistrare LAST. Pentru parcurgerea cursorului se poate utiliza şi o variabilă globală @@ sqlstatus care este actualizată permanent de SQL Server şi poate avea una din valorile următoare: 0) comanda FETCH s-a executat optim; 1) comanda FETCH a determinat apariţia unei erori; 2) au fost parcurse toate înregistrările din setul de date. 4) Închiderea cursorului se obţine cu comanda: CLOSE nume_cursor. 5) Eliberarea memoriei alocate pentru cursor se face cu instrucţiunea: DEALLOCATE CURSOR nume_cursor Exemplu: Se cere să se afişeze codurile materialelor cu preţul unitar mai mic decât 4.000.000 lei. Se declară două variabile @cod_mat pentru codul materialului ca întreg şi @pret_unitar virgulă mobilă (float). Se creează cursorul cursor_mat şi se parcurg înregistrările din tabelul MAT. DECLARE @ cod_mat int DECLARE @ pret_unitar float PRINT ’Lista preţurilor mai mici ca 4000000’ DECLARE cursor_mat CURSOR SCROLL FOR SELECT * FROM MAT OPEN cursor_mat FETCH FIRST FROM cursor_mat INTO @cod_mat, @pret_unitar 187
Universitatea SPIRU HARET
WHILE (@@ sqlstatus = 0) BEGIN IF (@pret_unitar < 4000000) BEGIN PRINT @ cod_mat END FETCH NEXT FROM cursor_mat INTO @cod_mat, @pret _unitar END 7.4. Serverul de baze de date Oracle Serverul de baze de date Oracle conţine două componente: o bază de date şi o instanţă. Baza de date conţine structura fizică şi structura logică care se prezintă complet separate. Structura fizică a bazei de date este fundamentată pe fişierele care constituie baza de date. Aceste fişiere sunt de mai multe tipuri: fişiere de date (Data Files), fişiere jurnal (Redo Log Files) şi fişiere de control (Control Files). Fişierele de date conţin datele din structurile logice ale bazei de date, tabelele şi indecşii. Fişierele jurnal cuprind modificările înregistrate efectuate asupra datelor. Fişierele de control conţin elemente prin care se specifică structura fizică a bazei de date (nume bază de date, nume fişiere de date, locaţie fişier de date, nume fişier jurnal, locaţie fişier jurnal), data de creare a bazei de date). Structura logică a bazei de date asigură modul în care se foloseşte spaţiul fizic de stocare a bazei de date şi este formată din spaţii-tabel, segmente de memorie, extensii ale segmentelor de memorie şi blocuri de date (de exemplu, de 2KB). Spaţiul-tabel (Tables Space) serveşte pentru memorarea logică a datelor bazei de date. Fişierele de date care conţin, fizic, datele bazei de date, sunt asociate acestor spaţii-tabel. La crearea unui spaţiu-tabel, sunt generate în mod automat spaţiul-tabel System (cu dicţionarul de date al bazei de date) şi fişierele de date asociate. Pentru asigurarea separării între dicţionarul de date şi datele bazei de date, se creează spaţii-tabel suplimentare pentru date (fig.7.2). Spaţiul-tabel Oracle este, de regulă, activ pentru ca utilizatorii bazei de date să poată accesa datele stocate pe server. Obiectele schemei bazei de date Oracle cuprind structuri logice de tipul tabele (tables), vederi (Views), instantanee (Snapshots), proceduri (Procedures), secvenţe (Sequences), sinonime (Synonyms), indecşi (Indexes), clustere şi legături ale bazei de date (Databases Links). Fiecărui utilizator al bazei de date i se atribuie o schemă cu astfel de obiecte ce sunt stocate într-un spaţiu-tabel al bazei de date. Noţiunile de tabel, vedere şi procedură sunt cunoscute. Instantaneele sunt tabele ce conţin răspunsurile la cererile de interogare asupra tabelelor (Master Tables). Secvenţa reprezintă o şir de numere secvenţiale (întregi cu lungimea maximă de 38 de cifre) generate de serverul Oracle şi care sunt folosite pentru generarea cheilor primare ale tabelelor bazei de date. Sinonimul reprezintă un alias al unui obiect Oracle ce nu se găseşte în interiorul unei proceduri. Clusterele sunt grupări de tabele frecvent accesate, memorate fizic în acelaşi blocuri de date. Indecşii reprezintă structuri opţionale asociate tabelelor şi clusterelor şi care servesc pentru accelerarea execuţiei instrucţiunilor SQL. 188
Universitatea SPIRU HARET
Fig.7.2. Memorarea logică şi fizică a datelor pe serverul de baze de date Oracle
Segmentele cuprind extensii ce conţin datele unei structuri logice de memorare dintr-un spaţiu-tabel. În Oracle se definesc patru tipuri de segmente: segment de date, segment de index, segment de revenire şi segment temporar. Segmentul de date memorează datele din tabel, cluster şi instantanee. Segmentul index memorează datele unui index al bazei de date. Segmentul de revenire conţine înregistrări despre acţiunile unei tranzacţii SQL pentru a se putea realiza, la nevoie, derularea înapoi. Segmentul temporar conţine un spaţiu de lucru destinat prelucrării unui tabel ce serveşte pentru stocarea rezultatelor intermediare ale unei tranzacţii SQL. Tranzacţia SQL reprezintă o unitate logică de lucru care cuprinde instrucţiuni SQL ce aparţin unui singur utilizator. Aşa cum s-a arătat şi la Microsoft SQl Server, instanţa reprezintă o copie independentă a serverului de baze de date pe acelaşi calculator cu originalul sau pe alte calculatoare. Atunci când se porneşte o instanţă a unei baze de date Oracle, baza de date este identificată prin intermediul fişierului său de control. Instanţa Oracle este formată din zona de memorie globală a sistemului, SGA (System Global Area) ce conţine datele şi din procesele din fundal (Background Processes). Instanţa Oracle prezintă două tipuri de procese: procese Oracle (ale serverului de baze de date) şi procese-utilizator (rularea aplicaţilor). Arhitectura Oracle este prezentată în fig.7.3 [58]. Nucleul sistemului cuprinde limbajul relaţional de regăsire a datelor (SQL*Plus) şi limbajul procedural propriu-zis (PL/SQL). Interfeţele de dezvoltare a aplicaţiilor cu baze de date sunt: • DEVELOPER – pentru dezvoltarea de aplicaţii; • DESIGNER – pentru analiza aplicaţiilor; • EXPRESS – pentru analiza datelor multidimensionale; • EXPLORER – pentru accesul la date; • ORACLE APPLICATIONS – pentru dezvoltarea aplicaţiilor de întreprindere (financiare, proiecte, de producţie etc.); Instrumentele de întreţinere sunt: • ADMINISTRATOR TOOLS – utilitare pentru administratorul bazei de date; 189
Universitatea SPIRU HARET
• BROWSERE, EDITOARE – utilitare pentru căutare şi întreţinere a bazelor de date. • NET PRODUCTS – utilitare pentru prelucrarea distribuită a datelor. Instrumentele de bază (produse Oracle) asociate DEVELOPER Oracle ca mediu de dezvoltare cooperativ, CDE – Cooperative Development Environment sunt: Oracle Forms (pentru generarea meniurilor şi a formularelor cu interfeţe grafice utilizator complexe), Oracle Reports (crearea rapoartelor ca urmare a interogărilor excutate asupra bazelor de date, inclusiv date de tip imagine), Oracle Graphics (crearea aplicaţiilor pentru vizualizarea datelor în formate grafice personalizate de tipul diagramelor, desenelor şi obiectelor multimedia).
SQL * Plus
DEVELOPER
PL/SQL
DESIGNER
Java EXPRESS
Administrator Tools
Browsere Editoare
Net Products
Fig.7.3. Arhitectura Oracle
Un server Oracle foloseşte structuri de memorie pentru gestionarea bazelor de date: zona globală a sistemului, SGA (System Global Area), zona globală a programului, PGA (Program Global Area) şi zona de context, CA (Context Area). SGA este formată din buffere cache (memorii tampon în care sunt păstrate cele mai frecvent solicitate date în scopul facilitării accesului rapid la ele) ale bazei de date, buffere jurnal şi zona pool partajată. PGA este un buffer de memorie cu date despre un proces server. CA este o zonă de memorie alocată automat de sistem atunci când un client lansează o comandă SQL. Ea conţine informaţii necesare comenzilor referitoare la adrese, format, rezultat etc. În mod similar cu SQL Server, şi în filosofia Oracle se lucrează cu roluri ca grupuri de privilegii înrudite acordate utilizatorilor individuali sau altor roluri. Se deosebesc roluri aplicaţie şi roluri utilizator. Există şi roluri definite de sistem (serverul Oracle dispune de cinci roluri predefinite). 190
Universitatea SPIRU HARET
Grupul de utilizatori Public este compus din toţi utilizatorii bazei de date. Rolurile acordate grupului de utilizatori Public sunt accesibile tuturor utilizatorilor bazei de date. 7.5. Caracterizarea limbajului PL/SQL pentru serverul de baze de date Oracle Aşa cum s-a menţionat în paragraful precedent, în nucleul Oracle este inclus limbajul procedural propriu-zis PL/SQL, Procedural Language SQL, ca o extensie a SQL (ce este un limbaj neprocedural, aşa cum s-a arătat în capitolul precedent), caracteristic sistemului Oracle. Prin acest limbaj, ce aparţine generaţiei a patra (4GL), se realizează accesul la datele standard pentru bazele de date obiectrelaţionale. În acelaşi timp, limbajul prezintă caracteristici ale limbajelor de programare structurate (3GL), cum sunt ciclul şi saltul. Limbajul PL/SQL asigură lucrul orientat pe obiecte, cu blocuri PL/SQL. Aceste blocuri PL/SQL sunt caracteristice acestui limbaj şi se definesc ca grupuri de instrucţiuni SQL şi PL/SQL. Blocurile PL/SQL sunt prelucrate de un motor (engine) PL/SQL prezent pe server sau în utilitare Oracle. Motorul utilizat este funcţie de locul (server sau utilitar) de unde se apelează PL/SQL. Motorul descompune blocul în instrucţiuni SQL (SQL_S) separate ce sunt aplicate unui executor de instrucţiuni SQL ce se găseşte pe serverul Oracle. Comenzile procedurale (PS) sunt prelucrate de către executorul instrucţiunilor procedurale, PSE (Procedural Statement Executor), aşa cum se poate observa în fig.7.4. Prin procesarea datelor la locul aplicaţiei, se micşorează traficul către server, ceea ce se constituie într-un avantaj.
BLOC PL/SQL SERVER ORACLE MOTOR PL/SQL PRELUCRARE INSTRUCŢIUNI
PSE
EXECUTOR INSTRUCŢIUNI SQL
Fig.7.4. Procesul de execuţie a unui bloc PL/SQL
Un bloc PL/SQL este format din patru secţiuni de bază: antet (header, opţională), secţiunea declarativă (opţională), secţiunea executabilă şi secţiunea de tratare a excepţiilor (a erorilor, opţională). Structura generală a unui bloc PL/SQL este: Secţiunea Header IS 191
Universitatea SPIRU HARET
Secţiunea Declarative BEGIN Secţiunea executabilă EXCEPTION Secţiunea de tratare a excepţiilor (erorilor) END; Blocurile pot fi anonime (fără nume, executate o singură dată), neanonime (cu nume), proceduri, funcţii sau declanşatoare (triggere). Declararea şi iniţializarea variabilelor (prefix v), a constantelor (prefix c), a cursoarelor şi excepţiilor se efectuează în secţiunea Declarative (declarativă). Cursorul este o zonă de memorie folosită pentru executarea unor instrucţiuni SQL şi pentru stocarea informaţiilor. Variabila cursor reprezintă un cursor de tip dinamic. Exemple de declarare şi iniţializare variabile şi constante: v_cod_mat NUMBER(5); v _den_mat VARCHAR2(20); v_cant NUMBER(4); c_pret_unitar CONSTANT NUMBER:=200000; v_rezerva_depozit BOOLEAN; v_data_inreg DATE DEFAULT SYSDATE; v_nume_gestionar VARCHAR2 DEFAULT ‘Georgescu’. PL/SQL admite tipuri de date implicite (atributele %TYPE şi %ROWTYPE). Aceste date asigură declararea unei variabile în concordanţă cu declarări de variabile anterioare. Atributul %TYPE realizează asignarea la o variabilă a tipului de dată al unei coloane dintr-un tabel, vedere (view) sau al unei variabile. Atributul %ROWTYPE asigură declararea unei variabile de tip înregistrare (echivalentul unei linii dintr-un tabel). Un exemplu pentru %TYPE este acela în care denumirea tabelului (MATERALE) şi coloana den_mat din tabelul MATERALE prefixează %TYPE astfel: v_den_mat materiale.den_mat%TYPE; Instrucţiunile PL/SQL sunt instrucţiuni de atribuire (:=), condiţionale (IFTHE-ELSE), iterative (LOOP…END LOOP; FOR i IN …LOOP…END LOOP), de control secvenţial (GOTO eticheta). Un exemplu de utilizare a unei instrucţiuni iterative PL/SQL (de ciclare) şi a cursorului ce permite actualizări ale liniilor unui tabel clarifică cele prezentate mai sus. Să se actualizeze preţul unitar al cimentului (pret_unitar), din tabelul MATERIALE, cu coeficientul 1,25. DECLARE CURSOR c1 IS SELECT * FROM materiale WHERE den_mat=’ciment’ FOR UPDATE NOWAIT; BEGIN FOR matc IN c1 LOOP UPDATE materiale SET pret_unitar= pret_unitar*1.25 WHERE CURRENT OF c1; END LOOP; … 192
Universitatea SPIRU HARET
Se observă la declararea cursorului utilizarea clauzei FOR UPDATE. Ca urmare, atunci când se foloseşte comanda UPDATE, clauza WHERE CURRENT OF determină ca, în situaţia în care cursorul este deschis, să se poată efectua actualizarea unor linii din table. În PL/SQL se pot compila proceduri şi funcţii care sunt apoi stocate în baza de date (proceduri stocate); ulterior, aceste proceduri şi funcţii pot fi apelate, de către utilizatorul cu un astfel de privilegiu, din orice bloc. Procedurile şi funcţiile locale sunt compilate ori de câte ori se execută blocul care are în compunere procedurile şi funcţiile respective. O funcţie utilizator achizitii care determină numărul tipurilor de materiale (din tabelul MATERIALE) achiziţionate de un client cu v_nume_client este creată de subprogramul următor. FUNCTION achizitii (v_nume_client.nume_client%TYPE) RETURN INTEGER IS c1_achizitie INTEGER; BEGIN SELECT COUNT (*) INTO c1_achizitie FROM materiale WHERE nume_client=v_nume_client; RETURN (c1_achiziţie) END; Numărul de tipuri de materiale determinat mai sus poate coincide în practică cu numărul de linii ale facturii, dacă se creează, în loc de funcţie o procedură şi se introduce la selecţie, nume_client şi data_factura. Pachetul (package) în PL/SQL asigură încapsularea, ca obiect al bazei de date, sub forma unei unităţi logice, a constantelor, variabilelor, funcţiilor, procedurilor, tipurilor şi cursoarelor. Un pachet nu poate fi apelat ca un subprogram. Un pachet în PL/SQL are două părţi: specificarea pachetului (package specification) şi corpul pachetului (package body). Specificarea pachetului reprezintă interfaţa cu aplicaţii. Corpul pachetului implementează specificaţia ce conţine declararea variabilelor, constantelor, funcţiilor, procedurilor şi excepţiilor ce sunt accesibile utilizatorilor (Public). Declanşatorii (triggers) în PL/SQL, la nivel de bază de date sau la nivel de aplicaţie, sunt proceduri stocate în baza de date şi asociate tabelelor, ce se execută automat când au loc evenimente declanşatoare asociate acestor proceduri. Un declanşator este acţionat de comenzile SQL - INSERT, UPDATE, DELETE şi combinaţii ale acestora de tip sumă logică (OR). Tranzacţiile, ca seturi de operaţii legate logic între ele, privite în mod unitar şi definite de sistem sau de utilizator, sunt implementate cu comenzile COMMIT (finalizarea tranzacţiei), ROLLBACK (anularea tranzacţiei), SAVEPOINT (marcarea subtranziţiilor). Tratarea excepţiilor (erorilor) în PL/SQL se efectuează, aşa cum s-a arătat mai sus, în secţiunea EXCEPTION. Excepţia reprezintă un eveniment specific de tipul eroare Oracle, eroare sistem sau eroare utilizator care determină o acţiune particulară de răspuns la acest eveniment. Când apare o eroare, un bloc al unui program se termină. Pentru tratarea erorilor, se utilizează rutine speciale denumite handlere. Excepţiile PL/SQL pot fi excepţii interne (predefinite şi nepredefinite) şi excepţii externe (definire de utilizator). Erorile nepredefinite corespund unor 193
Universitatea SPIRU HARET
excepţii predefinite şi nu prezintă nume predefinit. Exemple de excepţii interne predefinite: DUP_VAL_ON_INDEX, adică detectarea inserării unei valori duplicate (pe serverul Oracle apare codificată ORA_00001), LOGIN_DENIED, adică nume sau parolă incorectă (ORA_01017) etc. Excepţiile definite de utilizator sunt declarate în secţiunea DECLARE din structura blocului PL/SQL şi sunt declanşate efectiv cu comanda RAISE în secţiunea executabilă. Pentru tratarea excepţiilor, se folosesc funcţiile SQLCODE (returnează valoarea numerică a codului de eroare) şi SQLERRM (întoarce valoarea numerică a codului de eroare). 7.6. Noţiuni privind utilitarul SQL*Plus din compunerea serverului de baze de date Oracle Nucleul Oracle conţine (fig.7.3) limbajul relaţional de regăsire a datelor, sub forma unui utilitar denumit SQL*Plus. Acesta cuprinde toate comenzile SQL şi, în plus, asigură capabilităţi de personalizare a rezultatelor interogărilor, de control şi editare a comenzilor SQL şi a blocurilor PL/SQL, de gestiune a tranzacţiilor. Ca urmare, cu ajutorul acestui utilitar se realizează rapoarte, se creează fişiere (script file), se definesc funcţii de administrare a sistemului. În continuare se prezintă unele dintre funcţionalităţile suplimentare faţă de limbajul SQL, oferite de SQL*Plus. Comenzile utilizatorului de SQL*Plus se introduc interactiv la apariţia prompterului SQL> şi se încadrează într-una din următoarele trei categorii de comenzi: • instrucţiuni SQL destinate accesării bazei de date; • blocuri PL/SQL ce servesc pentru accesarea bazei de date (s-au prezentat în paragraful precedent); • comenzi SQL*Plus. Comenzile SQL pot fi scrise pe mai multe linii. Aceste comenzi sunt stocate într-o memorie tampon SQL (buffer). Salvarea conţinutului buffer-ului într-un fişier de comenzi se efectuează cu comanda SAVE. Rularea unui fişier de comenzi se face cu comenzile START, GET sau RUN nume_fisier. Când se doreşte afişarea pe ecran numai a rezultatului execuţiei comenzilor din bufferul SQL, fără textul acestor comenzi, se foloseşte comanda /. Un fişier de comenzi se poate realiza şi cu ajutorul comenzii INPUT în corelaţie cu SAVE. De exemplu: SQL>CLEAR BUFFER SQL>INPUT 2 SELECT * 3 FROM MAT 4 SQL>SAVE CDA_SEL.SQL SQL>@CDA_SEL Obţinerea informaţiilor cu privire la structura tabelelor, sinonimelor, vederilor (view-urilor) se efectuează cu comanda DESCRIBE. Comentariile se introduc cu comanda REMARK. Editarea comenzilor se face cu ajutorul editorului astfel: SQL>EDIT [nume_fisier[.extensie]]. 194
Universitatea SPIRU HARET
Principalele comenzi de editare a comenzilor SQL*Plus sunt prezentate în tabelul următor: Nr.crt 1. 2. 3. 4. 5. 6. 7. 8.
Comanda L Ln L* I A text C/text_vechi/text_nou DEL CL BUFF
Efectul comenzii Afişează toate liniile din buffer (list) Afişează linia n (list) Afişează linia curentă (list) Adăugare linii (input) Adăugare text la sfârşitul unei linii (append) Schimbă text_vechi cu text_nou (change) Şterge linia curentă (delete) Şterge bufferul (clear buffer)
Formatarea rezultatelor unei cereri de interogare conduce la obţinerea unui raport. Formatarea coloanelor se efectuează cu comanda COLUMN prin care se obţine afişarea atributelor coloanei (fără opţiuni), iar cu opţiuni se obţine schimbarea denumirii coloanei sau splitarea denumirii coloanei (opţiunea HEADING), formatarea coloanelor numerice (opţiunea FORMAT), copierea atributelor specifice unei coloane la altă coloană (opţiunea LIKE) etc. Pentru prezentare, spaţiile şi liniile rezumat se obţin la rapoarte prin intermediul comenzilor BREAK şi COMPUTE. Definirea titlurilor unei pagini (ecran cu date sau pagină tipărită) se efectuează cu comenzile TTITLE (la începutul paginii) şi, respectiv BTITLE (la sfârşitul paginii). Definirea înălţimii paginii se face cu comanda PAGESIZE, iar definirea lăţimii paginii se efectuează cu comanda LINESIZE. Rezultatele cererii de interogare se pot stoca într-un fişier sau se pot tipări la imprimantă cu comanda SPOOL. Gestiunea tranzacţiilor presupune, în primul rând, activarea modului de validare automată a tranzacţiilor cu comanda: SET AUTOCOMMIT ON (cu OFF se produce dezactivarea). Validarea unei tranzacţii se face cu comanda COMMIT, iar anularea acestei tranzacţii se face cu comanda ROLLBACK. În continuare se prezintă un exemplu de utilizare a unor comenzi SQL*Plus, prezentate mai sus, pentru rezolvarea următoarei probleme: Să se creeze un fişier care tipăreşte un raport ce cuprinde, pentru fiecare material selectat, cod_material, den_material, cant, pret_unitar, valoare. COLUMN cod_material HEADING ‘COD⎜MATERIAL’ FORMAT $9999 COLUMN den_material HEADING ‘DENUMIRE⎜MATERIAL’ FORMAT A30 COLUMN cant HEADING ‘CANTITATE⎜MATERIAL’ FORMAT $9999.99 COLUMN pret _unitar HEADING ‘PRET⎜UNITAR’ FORMAT $9,999,999.99 COLUMN valoare HEADING ‘VALOARE⎜MATERIALE’ FORMAT $9,999,999.99 SELECT cod_material, den_material, cant, pret_unitar, cant*pret_unitar valoare FROM MAT WHERE pret_unitar