Documente Academic
Documente Profesional
Documente Cultură
1
Universitatea Babeș-Bolyai din Cluj-Napoca SUPORT DE CURS
Baze de date și programe
Facultatea de Științe Economice și Gestiunea Afacerilor
Departamentul de Informatica Economică
Aceste puncte slabe ale fişierelor clasice au creat premisele pentru apariţia a ceva nou
în sfera informaticii, şi anume bazele de date. Naşterea lor a avut loc în anii 60, odată
cu lansarea programului Appolo, în 1964. Punctul de pornire a fost reprezentat de
sistemul de fişiere înlănţuite dezvoltat de IBM, dar care a fost înlocuit în foarte scurt
timp. Prima apariţie a termenului de “bază de date” a fost în 1969, când CODASYL
a realizat un raport tehnic la o conferinţă pe tema limbajelor de programare destinate
gestiunii datelor. Modelul propus era unul care promova independenţa datelor faţă de
programare. Bazele de date trebuie să conţină un fişier care să descrie întreaga
structură a acestora.
O bază de date reprezintă o colecţie de date organizate într-o schemă definită de un
model conceptual; sau o colecţie de date intercorelate, împreună cu descrierea şi
relaţiile dintre ele.
Bazele de date sunt potrivite mediului economic şi de afaceri deoarece acestea implică
un volum mare de informaţii ce trebuie stocate sau regăsite, cărora li se aplică un set
de operaţii de prelucrare relativ simple, spre deosebire de domeniul ingineriei unde
accentul se pune mai degrabă pe complexitatea şi volumul de calcul, decât pe stocare
şi regăsire. Mai mult decât atât, independenţa procesării faţă de memorarea datelor
este mult mai bine evidenţiată în cazul sistemelor client-server şi/sau multi-tier1 ale
zilelor noastre.
Toate informaţiile stocate la un moment dat într-o bază de date la un moment
dat reprezintă conţinutul acelei baze de date. Structura datelor împreună cu relaţiile
dintre entităţi, precum şi constrângerile de integritate formează schema bazei de date.
Conţinutul poate diferi de la un moment de timp la altul datorită operaţiunilor de
actualizare efectuate asupra bazei de date, în timp ce schema rămâne în general
invariabilă pe toată durata de existenţă a bazei de date. Aceste modificări se realizează
1
Reprezintă un model arhitectural întâlnit în ingineria software potrivit căruia prezentarea, procesarea şi
stocarea datelor sunt separate la nivel logic
2
Universitatea Babeș-Bolyai din Cluj-Napoca SUPORT DE CURS
Baze de date și programe
Facultatea de Științe Economice și Gestiunea Afacerilor
Departamentul de Informatica Economică
2
Data Manipulation Language
3
Data Definition Language
4
Query Language
3
Universitatea Babeș-Bolyai din Cluj-Napoca SUPORT DE CURS
Baze de date și programe
Facultatea de Științe Economice și Gestiunea Afacerilor
Departamentul de Informatica Economică
Nivelul Schema
conceptual conceptuală
Nivelul extern este cel mai apropiat de utilizatorul final. Datorită acestui
aspect i se mai spune şi nivelul logic al utilizatorului şi indică modul în care datele
5
American National Standards Institute
6
Standards Planning And Requirements Committee
7
Există o serie de alte arhitecturi de referinţă – precum cele întâlnite la sistemele distribuite sau federative –
care sunt derivate însă din cea prezentată
4
Universitatea Babeș-Bolyai din Cluj-Napoca SUPORT DE CURS
Baze de date și programe
Facultatea de Științe Economice și Gestiunea Afacerilor
Departamentul de Informatica Economică
8
Universal Product Code este un element de terminologie folosit la codurile de bare. Este larg răspândit în
USA şi Canada pentru urmărirea produselor produse sau comercializate [Wikie]
9
European Article Number reprezintă un standard pentru codurile de bare, fiind un supraset al originalului
sistem UPC din 12 cifre. Prin prefixarea cu o cifră suplimentară, ar putea fi coduri suficiente pentru reprezentări
în toate ţările [Wikie]
10
În limba engleză views, adică tabele virtuale (sau chiar materializate în unele accepţiuni mai recente)
5
Universitatea Babeș-Bolyai din Cluj-Napoca SUPORT DE CURS
Baze de date și programe
Facultatea de Științe Economice și Gestiunea Afacerilor
Departamentul de Informatica Economică
6
Universitatea Babeș-Bolyai din Cluj-Napoca SUPORT DE CURS
Baze de date și programe
Facultatea de Științe Economice și Gestiunea Afacerilor
Departamentul de Informatica Economică
Modelul reţea
Modelul relaţional.
Ultima clasificare a fost considerată ca fiind de referinţă şi în stabilirea generaţiilor
bazelor de date [Miranda&Busta 1986], [Gardarin 1986].
Generaţia a doua este reprezentată de bazele de date tip reţea, care simulează relaţia
mai multe-la-mai multe (many-to-many, n:n sau m:n) din lumea reală. A existat o
tentativă de standardizare din partea CODASYL11, acesta fiind motivul principal
pentru care aceste sisteme mai poartă numele de sisteme CODASYL. În România au
fost cunoscute şi exploatate sistemele Socrate şi DBMS-11, drept SGBD-uri reţea.
În zilele noastre, cel mai răspândit model de bază de date este modelul relaţional. A
fost propus de matematicianul E.F. Codd, de la laboratoarele IBM, fiind dezvoltat la
începutul anilor 70. Scopul acestuia era să simplifice modalitatea de acces şi
vizualizare a utilizatorilor, dar şi să creeze premisele necesare pentru viitoarea posibilă
distribuire fizică a bazei de date. Bazele de date relaţionale fac parte din generaţia a
treia de baze de date şi surprind relaţii de tipul mai multe-la-una (many-to-one
n:1). Reprezentanţi ai acestei generaţii sunt: SGBD-uri ca: xBase, FoxPro, Oracle,
Access etc.
În ultimii 15 ani şi-au făcut apariţia aşa-numitele sisteme de baze de date orientate
obiect sau obiect-relaţionale, fără a le clasifica într-o generaţie distinctă, superioară
sistemelor relaţionale. Unii autori le consideră pe acestea ca fiind de generaţia a treia,
iar alţii le consideră sisteme postrelaţionale.
7
Universitatea Babeș-Bolyai din Cluj-Napoca SUPORT DE CURS
Baze de date și programe
Facultatea de Științe Economice și Gestiunea Afacerilor
Departamentul de Informatica Economică
Pentru a face o distincţie clară între cele două noţiuni, vom da câteva exemple.
Astfel, PRODUS poate fi un tip de entitate şi reprezintă toate produsele realizate în
acea fabrică. Aceste produse au caracteristici intensionale generale (atribute sau
proprietăţi) precum Denumire, Lungime, UnitateMasura, Greutate, Diametru.
Există două tipuri de entităţi, şi anume cele puternice, dominante, fundamentale, sau
părinte, precum şi slabe, subordonate, derivate, sau fiu. Ca exemplu, PRODUS sau
CLIENT sunt tipuri de entitate-părinte, în timp ce COMANDA, TRANZACTIA sunt
de tip fiu. COMANDA, TRANZACTIA sunt dependente de PRODUS şi CLIENT şi
nu pot exista fără acestea. Vom întâlni similarităţi ale acestor concepte atunci când
vom discuta de modelul relaţional.
numai. Systemul R a fost primul SGBDR12 şi a fost elaborat în laboratorul IBM din
San Jose. Succesul acestui proiect a avut un impact remarcabil asupra evoluţiei
fenomenului IT&C, din cel puţin două motive:
adevărată explozie în ceea ce priveşte crearea unui limbaj neprocedural foarte
puternic – SQL – care a devenit în scurt timp standard pentru sist. relaţionale;
Dezvoltarea intensivă şi extensivă a o serie de aplicaţii software comerciale,
care să fie destinate procesării bazelor de date (începând cu DB2, Oracle etc).
12
Sistem de Gestiunea Bazelor de Date Relaţionale (în limba engleză RDBMS – Relational DataBase
Management System)
9
Universitatea Babeș-Bolyai din Cluj-Napoca SUPORT DE CURS
Baze de date și programe
Facultatea de Științe Economice și Gestiunea Afacerilor
Departamentul de Informatica Economică
ale unei astfel de colecţii nu este aleatoriu de la un tuplu la altul, ci este exact aritatea,
adică numărul de atribute ale relaţiei.
O definiţie mai academică a tuplului este cea întâlnită în [Date 2005]. Domeniul este
o tripletă de forma (Ai, Di, vi), unde Ai este numele atributului i, care este declarat pe
un domeniu (tip) Di şi are o valoare vi la un moment de timp dat.
Numărul total de tuple dintr-o relaţie reprezintă cardinalitatea. Tuplele sunt de fapt
entităţi sau instanţe ale unui tip de entitate. Toate tuplele formează extensia, corpul
sau conţinutul relaţiei.
Setul de atribute al unei relaţii care permite identificarea unui tuplu (entitate)
reprezintă cheia relaţiei. Există mai multe tipuri de chei, noţiuni ce vor fi discutate
ulterior.
Pentru o relaţie R, având atributele A1, A2, …, An definite pe domeniile D1, D2, …, Dn,
putem utiliza fie notaţia R(A1, A2, …, An), fie R(A1:D1, A2:D2, …, An:Dn).
Revenind la exemplul nostru, putem avea
PRODUSE(Cod13, Denumire, Lungime, Unitate masura, Greutate, Diametru),
ţinând cont de convenţia menţionată anterior.
13
Stilul subliniat indică faptul că atributul Cod este cheia relaţiei
10
Universitatea Babeș-Bolyai din Cluj-Napoca SUPORT DE CURS
Baze de date și programe
Facultatea de Științe Economice și Gestiunea Afacerilor
Departamentul de Informatica Economică
Cardinalitate = 3
Relaţie Atribut Cheie Ordin = 6
Intensie
PRODUSE
Cod Denumire Lungime Unitate Greutate Diametru
Masura
Extensie
C001 CUI 5 cm 2 3
S001 SURUB 3 inch 6 8
S002 SURUB 5 cm 6 3
Tuplu
Figura 1. 2 – Relaţia PRODUSE
În cazul în care există mai multe astfel de combinaţii în aceeaşi relaţie, acestea se
numesc chei candidate. Un atribut, sau un set K de atribute ale unei relaţii R, este o
cheie candidată, dacă şi numai dacă acesta îndeplineşte următoarele proprietăţi
[Gardarin 1986]:
Identificarea unică: setul K e capabil să identifice în mod unic fiecare tuplu
din R;
Ireductibilitatea: orice subset din K nu va fi capabil să asigure identificarea
unică;
Valorile NULL: niciun atribut din K nu poate lua valoarea NULL (valoare
neatribuită).
11
Universitatea Babeș-Bolyai din Cluj-Napoca SUPORT DE CURS
Baze de date și programe
Facultatea de Științe Economice și Gestiunea Afacerilor
Departamentul de Informatica Economică
Atunci când cheia este compusă doar dintr-un singur atribut, aceasta este o cheie
candidată simplă, altfel avem de-a face cu una compozită.
Există un tip special de cheie candidată. Cheia primară este acea cheie candidată
selectată să asigure identificarea unică la un moment dat. Restul cheilor candidate se
numesc chei alternative şi pot suplini oricând rolul cheii primare.
O bază de date relaţională conţine una sau mai multe relaţii. Tipurile de chei amintite
anterior sunt capabile să gestioneze doar o singură relaţie, cea din care fac parte. Dar,
cum într-o bază de date avem mai multe relaţii, iar prin definiţia bazei de date acestea
nu trebuie să fie izolate, ceea ce înseamnă că trebuie să existe un mecanism de
stabilire a relaţiilor dintre relaţii.
Stabilirea acestor relaţii se face pe baza conceptului de cheie străină sau externă. O
cheie străină este o referinţă la o cheie din altă relaţie, ceea ce înseamnă că tuplul
referit trebuie să aibă pentru unul din atributele sale, o valoare a cheii din tuplul de
referinţă. [Wikie] Având două relaţii R1 şi R2, o cheie străină este un atribut din R2
dacă şi numai dacă valoarea sa este identică cu una din valorile cheii candidate
(primare) corespondente din R1, sau să fie NULL. R1 este denumită relaţie-părinte, în
timp ce R2 este relaţie-fiu în corespondenţă cu acest atribut. Uneori se mai întâlnesc
termenii de principală sau secundară, sau altele întâlnite la tipurile de entităţi.
Observaţie: Uneori, relaţiile R1 şi R2 pot fi una şi aceeaşi relaţie. Deci, atunci când
se discută de chei străine nu e absolut necesar să avem două relaţii distincte, însă este
cel mai frecvent caz. Celălalt caz se întâlneşte în general în relaţii ierarhice, precum în
aceeaşi relaţie am avea atât angajaţii, cât şi superiorii lor; imobile: blocuri, scări
diferite, etaje, apartamente, camere; zone: localităţi, judeţe, regiuni, ţări, continente
etc. În acest material nu vom insista pe aceste exemple particulare.
12
Universitatea Babeș-Bolyai din Cluj-Napoca SUPORT DE CURS
Baze de date și programe
Facultatea de Științe Economice și Gestiunea Afacerilor
Departamentul de Informatica Economică
VANZARI
Cod Data Cantitate
C001 25/11/2008 100000
S002 25/11/2008 100000
S002 30/09/2009 50000
S002 21/06/2010 100000
Figura 1. 3 – Relaţia VANZARI
relaţională, vom spune că un tuplu din relaţia SEFI (DEPARTMENTE) este asociat cu
un tuplu şi cel mult unul din relaţia DEPARTMENTE (SEFI);
Relaţia una-la-mai multe (1:n). Fiecare entitate dintr-un set S1 este conectată
la una sau mai multe entităţi din setul S2 şi fiecare entitate din setul S2 este conectată
la cel mult o entitate din setul S1. În exemplul nostru cu PRODUS şi VANZARE,
fiecare entitate din PRODUS trebuie/poate să (nu) fie vândut niciodată, o dată, sau de
mai multe ori (în funcţie de numărul de apariţii al unui anumit cod din VANZARE),
dar orice entitate din VANZARE trebuie/poate să fie asociată cu una sau mai multe
entităţi din PRODUS. Uneori literatura menţionează ca un tip separat de relaţie, şi
anume relaţia mai multe-la-una (n:1);
Relaţia mai multe-la-mai multe (n:n sau m:n). Mai multe entităţi din S1 sunt
în relaţie cu una sau mai multe entităţi din S2. Spre exemplu, fiecare produs sau
serviciu trebuie/poate să (nu) fie valorificat niciodată, o dată, sau de mai mulţi
furnizori şi fiecare furnizor trebuie/poate să (nu) comercializeze niciunul, unul sau mai
multe produse sau servicii. Acest tip de relaţie nu este suportat în mod direct de către
modelul relaţional, dar poate fi simulată prin adăugarea unei entităţi intermediare (S3)
între cele două. În aceste circumstanţe vom avea o relaţie de tip 1:n între S1 şi S3 şi
una n:1 între S3 şi S2.
Cele mai frecvente tipuri de relaţii ce pot fi întâlnite în bazele de date relaţionale sunt
1:n şi n:1.
14
Universitatea Babeș-Bolyai din Cluj-Napoca SUPORT DE CURS
Baze de date și programe
Facultatea de Științe Economice și Gestiunea Afacerilor
Departamentul de Informatica Economică
PRODUSE
Rec Cod Denumire Lungime Unitate Greutate Diametru
# masura
1 C001 CUI 5 cm 2 3
2 S001 SURUB 3 inch 6 8
3 S002 SURUB 5 cm 6 3
VANZARI
Rec # Cod Date Cantitate
1 C001 25/11/2008 100000
2 S002 25/11/2008 100000
3 S002 30/09/2009 50000
4 S002 21/06/2010 100000
Figura 1. 4 – Tabelele PRODUSE şi VANZARI
REGULI LA INSERARE
Tabela părinte. Se poate adăuga orice tuplu, dar cu evitarea duplicatelor şi a valorilor
NULL pentru cheia candidată. În caz contrar se încalcă integritatea entităţii, NU cea
referenţială. Exemplu: În PRODUSE, un nou tuplu poate avea codul C002, S003 etc.,
dar nu C001, S001 sau S002, şi nici NULL.
Tabela fiu.
Regula de restricţionare spune că nu putem insera un tuplu care să aibă o
valoare a cheii străine pe care să n-o regăsim printre valorile cheii candidate, dar poate
fi în mod excepţional NULL. Exemplu: În VANZARI, se poate introduce orice
înregistrare având C001, S001, S002, sau NULL în Cod, dar nimic altceva.
Introducând spre exemplu C002, ar însemna că intenţionăm să vindem un produs
inexistent. Setând regula de restricţie la inserare se vor stopa astfel de încercări.
REGULI LA ŞTERGERE/ACTUALIZARE
15
Universitatea Babeș-Bolyai din Cluj-Napoca SUPORT DE CURS
Baze de date și programe
Facultatea de Științe Economice și Gestiunea Afacerilor
Departamentul de Informatica Economică
Tabela părinte. Putem şterge/actualiza orice tuplu care nu este conectat la vreun
tuplu din tabela-fiu, dar cu respectarea integrităţii entităţii în cazul actualizărilor.
Această „conectare” se traduce în acest caz particular ca „efectuarea a cel puţin unei
vânzări din produsul respectiv”. Exemplu: În PRODUSE, doar înregistrarea #2 poate
fi ştearsă/actualizată, în raport cu atributul Cod – nu au existat vânzări pentru S001 –
la actualizare evitându-se însă ca noile valori să fie diferite de C001, S002, sau NULL.
Orice altă încercare de ştergere/actualizare va implica alegerea uneia din următoarele
reguli:
Regula de restricţionare. Se va interzice orice încercare de
ştergere/actualizare a vreunui tuplu care este în legătură cu orice tuplu din tabela-fiu.
Exemplu: Tuplele #1 şi #3 nu pot fi şterse/actualizate.
Regula de cascadare. Dacă un astfel de tuplu este şters/actualizat, atunci
toate tuplele din tabela-fiu cu care acesta relaţionează, vor fi la rândul lor
actualizate/şterse. Exemplu: În cazul în care se va şterge înregistrarea #3 din
PRODUSE, atunci înregistrările #2-#4 din tabela VANZARI vor fi şterse automat.
Atunci când valoarea cheii candidate dintr-un astfel de tuplu se actualizează, atunci
toate valorile cheii străine corespondente din tabela-fiu, vor fi şi ele automat
actualizate. Exemplu: Dacă în PRODUSE modificăm codul lui S002 în S005, atunci
înregistrările #2-#4 din VANZARI vor avea şi ele S005, în loc de S002, în cadrul
atributului Cod; respectiv, dacă se actualizează codul C001 în C002 din PRODUSE,
automat se va actualiza şi înregistrarea #1 din VANZARI, codul devenind C002.
Tabela fiu. În ceea ce priveşte ştergerea, nu există nicio restricţie, putând şterge orice
tuplu. Exemplu: În VANZARI se poate şterge înregistrarea #1, pentru care codul este
N001; la fel oricare din celelalte înregistrări. Se poate actualiza orice valoare a
vreunei chei candidate, însă noua valoare trebuie să fie, fie una din valorile cheii
candidate corespondente din tabela-părinte, fie NULL. Exemplu: În VANZARI, la
înregistrarea #3, putem schimba codul S002, fie în C001 sau S001, fie în NULL.
16
Capitolul 2 – Primii paşi în Access
1
Visual Basic for Applications
2
GUI – Graphic User Interface
Deschiderea unei sesiuni de lucru Access se poate face prin mai multe modalităţi:
Pentru a părăsi cele două aplicaţii pot fi utilizate oricare din modurile obişnuite de a
ieşi din ferestrele aplicaţiilor Windows:
File → Exit sau Exit Access;
Opţiunea Close din meniul sistem sau de control al ferestrei aplicaţiei sau din bara de
sarcini (după activarea meniului contextual);
Utilizarea combinaţiei de taste Alt + F4 sau clic pe butonul Close ;
Din Task Manager (Ctrl + Alt + Del) → End Task5;
2.3. Termeni
În capitolul anterior au fost deja expuşi o serie de termeni din domeniul bazelor
de date. Aceştia sunt Baza de date şi Tabela. În acest material la termenii amintiţi
adăugăm şi:
Formular (Form) – un obiect ce are legătură cu baza de date, o fereastră ce
permite vizualizarea şi/ sau introducerea de date într-o bază de date. Poate conţine o
varietate de controale;
Interogare (Query) – un obiect ce are legătură cu baza de date ce facilitează
modul de regăsire a informaţiilor dintr-o bază de date în funcţie de anumite criterii.
Există de asemenea şi anumite interogări ce pot fi utilizate să se creeze, populeze sau
actualizeze baza de date;
Raport (Report) – reprezintă un tip de document care colectează informaţii
dintr-o bază de date şi le afişează utilizatorilor, într-o formă detaliată sau sintetică, şi
în general într-un format şi o aranjare în pagină atractive;
Pagină (Page) – este o structură specială destinată publicării bazei de date în
internet sau intranet;
3
Aceste căi de acces sunt interpretabile, deoarece în general utilizatorii în sistemul de operare Windows pot să
le personalizeze, de obicei la instalare
4
Aceeaşi personalizare se poate aplica şi în acest caz
5
În general, FoxPro crează anumite probleme atunci când se încearcă oprirea de această manieră. Mesajul
“Cannot Quit FoxPro” apare afişat pe ecran în aceste circumstanţe
Cod (Code) – acestea sunt fişiere text conţinând secvenţe de programare VFP
sau SQL. Acestea sunt seturi de instrucţiuni care sunt executate când intervine un
eveniment pentru un obiect anume;
Modul (Module) – este suportul pentru introducerea unei sau mai multor
proceduri sau funcţii VBA în MS Office.
File. Începand cu Access 2007 avem atunci când nu este deschisă vreo bază de date,
nu avem nicio filă disponibilă (vezi Figura 2. 1). În schimb există categoriile de
şabloane de baze de date stocate local sau online şi panoul de sarcini cu ultimele
fişiere de baze de date deschise. Pe lângă acestea avem posibilitatea de creare a unei
noi baze de date, fără a se apela la vreun şablon; respectiv accesarea diferitelor
facilităţi (training, informaţii de ultimă oră, posibilităţi de suport tehnic şi actualizări
etc.) online oferite de Microsoft pentru acest tip de produs şi cele înrudite.
Figura 2. 2 – Panglica Access 2007
În cele ce urmează vom prezenta câteva din opţiunile cel mai frecvent utilizate.
Buton/Opţiune Funcţionalitate
New… Deschide o fereastră de dialog care ajută la crearea unui nou
(Ctrl+N) fişier
Open… Deschide o fereastră de dialog ce permite navigarea printre
(Ctrl+O) directoarele sistemului în vederea găsirii şi deschiderii unui fişier
existent
Save (Ctrl+S) Salvarea modificărilor în cadrul fişierului sau obiectului activ
sub un anumit nume, sau înlocuire versiunii precedente a
acestuia
Print … Imprimă conţinutul obiectului curent sau a unei selecţii din
(Ctrl+P) acesta
Print Preview Previzualizarea în aceiaşi parametri ca ai imprimării
Buton/Opţiune Funcţionalitate
Cut (Ctrl+X) Şterge selecţia curentă şi o transferă în memoria-tampon
(clipboard). Se foloseşte atunci când se doreşte mutarea
informaţiei dintr-o zonă într-alta
Copy (Ctrl+C) Copiază obiectul selecţiei în clipboard
Paste (Ctrl+V) Preia din memoria-tampon ultima intrare – rezultată din una din
cele două acţiuni precedente – şi o plasează în locaţia curentă
Undo (Ctrl+Z) Anulează ultima acţiune
Redo (Ctrl+Y) Anihilează efectul ultimei comenzi Undo
Grup Funcţionalitate
Permite comutarea între diferite moduri
de vizualizare ale obiectului curent
6
Grupul Clipboard nu va fi prezentat deoarece butoanele acestuia apar la punctual a)
Suprafaţa de lucru. Aceasta reprezintă cea mai mare zonă din cadrul ecranului
principal, locul care oferă „suport” pentru afişarea rezultatelor generate de comenzi
sau programe, precum şi pentru ferestre, bare de instrumente, diverşi constructori (de
formulare, rapoarte etc.) şi alte obiecte.
Bara de stare. Este localizată în partea de jos a ferestrei principale şi oferă indicii în
legătură cu operaţiunile sau stările contextuale (ex. mesaje furnizate de sistem,
descrierea succintă a opţiunilor de meniu), precum şi stadiul de execuţie a unor acţiuni
care sunt executate (ex. în timpul rulării unor interogări).
Fereastra de comandă. Microsoft Access are pe lângă interfaţa grafică şi una mod
comandă interactivă destinată scrierii de cod VBA în cadrul macrocomenzilor de sine
stătătoare sau asociate controalelor din formulare sau alte tipuri de obiecte. Şi codul
SQL al interogărilor poate fi vizualizat sau editat direct – cu respectarea dialectului
SQL utilizat de Access – atunci când modul SQL View este activ.
Meniul File– creează, deschide, salvează, trimite mesaje electronice (dacă un client
implicit de mail este instalat şi configurat), tipăreşte şi închide aplicaţiile. Opţiunile pe
care acestea le conţin permit gestiunea tuturor fişierelor pe care cele două SGBD-uri
le suportă. Este facilitat şi import/exportul de fişiere către şi pentru alte SGBD-uri.
Pentru acest scop Access are submeniul Save As, restul instrumentelor de acest tip
găsindu-se într-o filă specializată acestui schimb, şi anume External Data, grupurile
Import şi Export. Compatibilitatea cu versiunile precedente MS Access se realizează
cu al doilea grup – Save the database in another format – al submeniului Save As.
Tot aici există câteva instrumente destinate întreţinerii şi depanării bazei de date
(opţiunile submeniului Manage).
Meniul View/ Fila Home → grupul Views – afişează/ascunde bare de instrumente sau
comută între modurile de lucru. In Access nu este nicio filă disponibilă. În Access,
grupul– a cărui opţiuni sunt prezentate în imagine – are ca scop comutarea între
diferite moduri de operare asupra obiectului curent. Gestionarea modurilor de lucru se
poate realiza şi cu ajutorul grupului de butoane din partea dreaptă a
barei de stare.
Meniul Help/– oferă diverse tipuri de asistenţă: online sau offline, generală sau
contextuală, informaţii de contact pentru obţinere asistenţă tehnică, training-uri,
demonstraţii, grupuri de discuţii sau comunităţi tematice. În Access, diferite tipuri de
asistenţă sunt disponibile direct din pagina de introducere în aplicaţie, iar apoi se poate
folosi la nevoie butonul , aflat în colţul din dreapta sus al panglicii Microsoft
Office Fluent, sub butonul de închidere al aplicaţiei. Fereastra îmbunătăţită de
asistenţă din Access arată precum în Figura 2. 4. Setări suplimentare relative la
aplicabilitatea căutărilor se pot face din lista verticală a butonului .
Solicitarea asistenţei în cele două aplicaţii ce urmează a fi prezentate mai în detaliu se
realizează şi cu tasta F1, tradiţională acestui scop în familia produselor Microsoft.
Butonul de opţiuni (sau buton radio) se întâlneşte individual doar în Access, sub
forma obiectelor Option Button şi Toggle Button,
diferenţiate doar prin reprezentarea grafică (cerc versus
buton). Option Group se întâlneşte în ambele aplicaţii. În
acest caz, după cum e şi firesc avem un grup de astfel de
butoane (containerul OptionGroup), principala caracteristică a acestuia fiind că dintr-
un astfel de grup doar unul şi numai unul poate fi selectat. Opţiunile unui astfel de
grup trebuie să fie neapărat disjuncte (intersecţia cazurilor determinate de acestea să
fie nulă) şi să acopere toate cazurile posibile. Exemplu: Culoare ochi - căprui, negri,
verzi, albaştri; Sex - masculin, feminin; Cota TVA - 24%, 9%, 0% ş.a.m.d.
Caseta de validare (Check Box) are particularitatea că niciuna, una sau mai multe
opţiuni ale grupului format din unul sau mai
mulţi astfel de itemi sunt selectate la un moment
dat. Deci, în acelaşi timp, o persoană poate avea
mai mult de 35 de ani, poate fi economist, poate avea păr castaniu, sau niciuna dintre
aceste caracteristici să nu i se aplice.
Caseta de text (Text Box) se foloseşte pentru editarea de text provenit dintr-o
variabilă, câmp, masiv. Se poate utiliza doar împreună cu elemente de tip şir de
caractere, dar şi dată calendaristică sau timp. Incrementarea sau
decrementarea valorilor de tip dată/timp se realizează prin
acţionarea tastelor +/- .
Caseta de editare (Edit Box) este similară cu cea de dinainte, însă se utilizează de
obicei atunci când avem text de lungime mai mare. Mai mult de
atât, chiar dacă în cazul casetelor de text nu există o delimitare
implicită a lungimii conţinutului, în casetele de editare textul poate
fi dispus pe linii multiple. Pentru o mai bună vizualizare a
informaţiei conţinute, acest tip de obiect poate conţine şi bare de
defilare.
Lista simplă (List Box) afişează o listă verticală de elemente. Acest control permite
selecţii multiple ale itemilor afişaţi. Dacă numărul elementelor
din listă depăşeşte dimensiunea listei, se pot folosi barele de
defilare. Conţinutul listei simple este întotdeauna vizibil, spre
deosebire de obiectul următor.
Liste derulante (Combo Box). Există două tipuri de astfel de controale, şi anume
combo şi listă (drop-down combo şi
drop-down
list). Ambele
controale sunt nişte liste ale căror elemente sunt ascunse,
cu excepţia elementului curent. Dacă se acţionează
săgeata orientată în jos din dreapta obiectului, atunci lista
se derulează, relevând conţinutul său. Noua selecţie va
deveni elementul curent, ocazie cu care lista se şi închide, revenind la forma iniţială.
Diferenţa dintre cele două tipuri de liste este aceea că în cazul obiectului de control de
tip combo, elementele sunt editabile, iar introducerea de itemi noi este de asemenea
permisă.
File multiple (Page Frame/Tab Control) este un container, ceea ce înseamnă că
acest obiect poate conţine la rândul său mai multe alte controale. Pot exista mai multe
file în cadrul unei astfel de obiect, fiecare filă fiind etichetată. Doar o pagină poate fi
activă la un moment dat.
< > Neterminali (nume de câmp sau de fişier) care trebuie să fie înlocuiţi cu numele
respective.
Exemple:
7
Object Linking and Embedding – legarea şi încapsularea obiectelor
<câmp>; <listă câmpuri>; <fişier> etc. → Pret; Nume, Prenume, Salariu;
Personal.accde
[ ] Secvenţe opţionale simple sau compuse. Pot fi omise din comenzi la nevoie
{ } Grupuri de elemente.
Exemplu:
8
4th Generation Language
Microsoft a introdus formatul de dată strict. În Access delimitatorul pentru constante
Date/Time este caracterul diez (#).
Observaţie:
1. Cea mai întâlnită eroare la introducerea datelor în tabele este introducerea datelor
calendaristice. RECOMANDAREA noastră este setarea formatului care vi se pare cel
mai potrivit, înainte de introducerea acestui tip de date. In Access se configurează
setările regionale (Regional and Language Options din Control Panel) şi
proprietatea Input Mask.
2.Pentru afişarea anului pe 4 cifre trebuie să acordăm atenţie sporită proprietăţilor
Format şi Input Mask în Access.
3. Variabile. Sunt tratate similar cu câmpurile din tabele, însă valorile lor nu
sunt menţinute decât în memoria operativă a sistemului. Ele se pierd odată cu
încheierea execuţiei unui program, ieşirea din sesiunea de lucru, întreruperea
alimentării cu energie etc. Variabilele stochează temporar constante, valori
intermediare sau valori introduse de la tastatură.
Variabilele au nume pentru a putea fi referite.
Indiferent că sunt câmpuri în tabele, variabile sau constante, toate datele sunt
memorate într-un format specific, precum text, numeric, dată calendaristică, sau logic.
Tipuri principale de date:
Numeric
Alfanumeric
Logic
Gestiune timp
Special.
Toate tipurile, exceptându-l pe cel logic, au la rândul lor subtipuri.
Tip Dată Subtip Denumire în Access
Numeric Simple numeric Single
Double numeric Double, Decimal
Integer Byte, Integer, Long Integer
AutoNumber,
SelfIncremental Replication ID
integer Currency
Currency Replication ID
-
Alfanumeric Character Text
Binary character -
Tipuri de bază
FORMAT SE UTILIZEAZĂ PENTRU A AFIȘA
Text Valori scurte, alfanumerice, cum ar fi numele sau adresa străzii.
Număr Valori numerice, cum ar fi distanțe. Rețineți că există un tip de date separat
pentru valori monetare.
Simbol Valori ale simbolurilor monetare.
monetar
Da/Nu Valori Da și Nu și câmpuri care conțin o singură valoare din două.
Dată/Oră Valorile de dată și oră pentru anii cuprinși în intervalul 100 și 9999.
Text Text sau combinații de text și numere care pot fi formatate utilizând controale de
îmbogățit fonturi și culori.
Câmp Rezultatul unui calcul. Calculul trebuie să se refere la alte câmpuri din același
calculat tabel. Se poate utiliza Generatorul de expresii pentru a crea calculul.
Atașare Imagini atașate, fișiere foi de calcul, documente, nomograme și alte tipuri de
fișiere acceptate pentru înregistrările din baza dvs. de date, asemănător cu
atașarea fișierelor la mesajele de poștă electronică.
Hyperlink Text sau combinații de text și numere stocate ca text și utilizate ca adresă
hyperlink.
Memo Porțiuni lungi de text. O utilizare obișnuită a câmpului Memo este descrierea
detaliată a unui produs.
Căutare Afișează o listă de valori care este regăsită dintr-un tabel sau o interogare sau un
set de valori pe care l-ați specificat când ați creat câmpul. Va porni expertul
Căutare și poate fi creat un câmp Căutare. Tipul de date al unui câmp Căutare
este Text sau Număr, în funcție de opțiunile pe care le selectați în expert.
NOTĂ Câmpurile Căutare au un set suplimentar de proprietăți de câmp, care se
află în filaCăutare din panoul Proprietăți câmp.
Număr
FORMAT SE UTILIZEAZĂ PENTRU A AFIȘA
General Numere fără formatare condițională, așa cum sunt sortate.
Simbol monetar Valori monetare generale.
Euro Valori monetare generale stocate în format EU.
Fix Date numerice.
Standard Date numerice cu zecimale.
Procent Procente.
Științific Calcule.
Data și ora
FORMAT SE UTILIZEAZĂ PENTRU A AFIȘA
Dată scurtă Afișarea datelor în format scurt. Depinde de setările regionale de dată și oră. De
exemplu, 14.03.2001 pentru Europa.
Dată medie Afișarea datei în format mediu . De exemplu, 3-Mar-09 pentru Europa.
Dată lungă Afișarea datelor în format lung. Depinde de setările regionale de dată și oră. De
exemplu, Miercuri, 14 martie 2001 pentru Europa.
Ora am/pm Afișează ora utilizând un format de 12 ore care va răspunde la modificările
efectuate în setările regionale de dată și oră.
Oră fmt. Afișarea orei urmată de pe AM/PM.
mediu
Ora în 24 de Afișează ora utilizând un format de 24 ore care va răspunde la modificările
ore efectuate în setările regionale de dată și oră.
Logic (Da/Nu)
TIPUL DE DATE SE UTILIZEAZĂ PENTRU A AFIȘA
Casetă de selectare O casetă de selectare.
Da/Nu Opțiuni Da sau Nu
Adevărat/Fals Opțiuni Adevărat sau Fals.
Activat/Dezactivat Opțiuni Activat sau Dezactivat.
2.9.7. Conversia dintre diferite tipuri de date
Produsele software destinate prelucrării bazelor de date, spre deosebire de
tabeloare şi procesoare de texte, sunt foarte sensibile la tipul de dată. Dacă un câmp a
fost declarat dată sau număr, atunci acesta nu poate accepta şiruri de caractere. Şi nici
operatorii specifici nu pot fi interschimbaţi între tipurile de date. Astfel, nu poţi face
operaţii aritmetice cu texte sau cu valori logice, aşa cum nu poţi aplica operatorul de
concatenare numerelor, datelor, sau valorilor logice. Totuşi, în realitatea concretă, pot
apărea cazuri când trebuie să faci operaţii de genul celor amintite anterior. Pentru a
putea totuşi să le efectuezi nu poţi schimba pur şi simplu regulile fundamentale ale
aritmeticii sau procesării textelor, în schimb poţi modifica temporar tipul operanzilor
pentru a-ţi atinge scopul. Deci, nu trebuie reinventată matematica pentru a adăuga un
text la un număr, dar poţi aplica anumite transformări acelui text – dacă se
conformează unui şablon – pentru a deveni număr şi a efectua apoi calculul. Acest tip
de transformare se numeşte conversia tipului de date şi poate fi realizată uneori
implicit de către unele SGBD-uri, dar conversia explicită, prin utilizarea funcţiilor
specializate, este varianta cea mai utilizată. Trebuie să aducem datele la tipul potrivit
pentru efectuarea cu succes a procesării.
În ceea ce priveşte a doua posibilitate, utilizatorul este cel care hotărăşte dacă va
apela la un şablon de bază de date predefinit – disponibil online sau local – sau
operaţiunea se va desfăşura de la 0, fără a lua în considerare vreun element
prefabricat.
Categoriile de şabloane disponibile.
Selectarea unei categorii are ca efect detalierea mostrelor de baze de date din acea
categorie, în panoul central, suprafaţa de lucru.
Posibilitatea creării unei baze de date vide poate fi exploatată doar atunci când
categoria Featuring este activă, prin selectarea butonului Blank Database,
prezentat aici în imaginea de dimensiune redusă din partea stângă. La acţionarea
lui, va apărea în partea dreaptă panoul Blank Database momentan completat cu
informaţii implicite (locaţie, nume fişier).
Figura 3.1 – Crearea unei baze de date fără şablon
Mai mult, câmpul care începe să fie completat cu valori, va primi automat tipul
celui mai probabil tip de dată care i se potriveşte. Totuşi, în modul Datasheet
View nu se poate şterge coloana implicită – ID – chiar dacă poate fi redefinită şi
redenumită. Crearea tabelelor în modul de introducere al datelor este facilă şi se
recomandă începătorilor.
Crearea tabelelor în Table Design
Modul tradiţional, specific şi de referinţă în acest material pentru crearea
tabelelor este modul de proiectare (Table Design, Design View), şi nu cel de
introducere de date.
Pentru a-l activa în cazul în care dorim să creăm o nouă tabelă, alegem
Create → Table Design. Pentru comutarea dintr-un alt mod, alegem fie Home →
View → Design View, fie Datasheet → View → Design View Home → Design
View.
Cu această ocazie apare fila Design, care pentru tabele arată precum în
Error! Reference source not found.. Aceasta are 4 grupuri, dintre care cel mai
important este Tools.
În zona de lucru va apărea structura curentă a tabelei, sub forma unui tabel
cu 3 coloane, în care liniile tabelului vor reprezenta câmpurile. Caracteristicile
fiecărui câmp pot fi rafinate în fereastra Field Properties, din partea de jos a zonei
de lucru, care poate avea conţinut diferenţiat în funcţie de tipul de dată al câmpului
curent. Fereastra are două file – General şi Lookup – în coloana din stânga sunt
trecute numele proprietăţilor, iar cea din dreapta este editabilă de către utilizator,
aici introducându-se valorile asociate acelor proprietăţi.
Field Name (Denumire). Aceste nume trebuie să fie uşor de înţeles de către
persoanele care urmează să opereze cu această bază de date. Chiar dacă sunt
acceptate câmpuri de până la 64 de caractere lungime, denumirile e recomandat să
fie cât mai scurte şi cuprinzătoare posibil. Pentru informaţii detaliate cu privire la
acesta, se recomandă utilizarea coloanei Description. Nu pot să înceapă cu spaţiu
sau cu un caracter special, însă poate să conţină aceste caractere în interiorul lor.
Data Type (Tip de dată). Există 10 tipuri de date selectabile, plus unul impropriu.
Acestea se pot alege din lista derulantă din coloana Data Type. Tipul de date
descrie domeniul câmpului şi impune anumite reguli de domeniu pe acel câmp.
Formatele prezentate anterior sunt formate predefinite. Pe lângă acestea mai pot
exista şi formate personalizate.
Ex.
ddd", "mmm d", "yyyy – Sun, Oct 31, 2010
1
[Access 2007 Help]
2
[Access 2007 Help]
mmmm dd", "yyyy – October 31, 2010
"Aceasta este saptamana numarul "ww – Aceasta este saptamana numarul 44
"Today is "dddd – Today is Friday
0000-000000 – 0749-504287
Ex. $#,##0.00[Green];($#,##0.00)[Red];"Zero";"Null"
Există şi alte proprietăţi – de exemplu pentru câmpurile de tip text – dar care nu
prezintă interes pentru acest material. În afară de acestea, mai există o fereastră de
proprietăţi, destinată de această dată tabelei, nu câmpurilor.
Crearea tabelelor prin import din alte produse sau din versiunile
precedente
În Access se pot realiza şi folosi tabele care n-au fost neapărat create în
versiunea curentă Access, sau nu sunt produse Access. Nu trebuie neapărat să
creăm/populăm o tabelă, atât timp cât aceasta a fost deja creată într-un alt produs
şi se află stocată într-o locaţie accesibilă nouă, sub forma unui fişier cu format
tabelar. Pentru astfel de probleme avem facilităţile de import. În Access, putem să
apelăm la acestea, prin intermediul filei External Data, grupul Import. Putem
prelua tabele din Access versiunile anterioare, Excel, SharePoint, Outlook, fişiere
XML sau text, precum şi din alte SGBD-uri sau tabeloare. Nu vom insista pe
modul de realizare al acestor importuri, Access punând la dispoziţie un instrument
interactiv pentru realizarea lor.
Manipularea obiectelor
În Access, manipularea obiectelor se realizează prin intermediul panoului
de navigare şi a ferestrelor cu file multiple.
În panoul de navigaţie sunt prezente toate obiectele disponibile în baza de date
curentă – în cazul în care n-au fost efectuate filtrări – organizate după bunul plac
al utilizatorului. Pot fi efectuate operaţiuni asupra lor în genul celor
întâlnite în utilitarele de gestiune ale fişierelor, precum Windows
Explorer/(My) Computer. Se poate utiliza şi meniul contextual
pentru manipularea lor. Alegerea opţiunii Open are ca efect
deschiderea obiectului în mod vizualizare într-o filă a ferestrei cu file
multiple ce acoperă suprafaţa de lucru. Acelaşi lucru se poate realiza
şi cu dublu-clic. Comutarea/Deschiderea în modul de proiectare se
realizează cu a doua opţiune, şi anume Design View. Schimbarea
modului de vizualizarea al obiectelor sunt operaţiuni frecvente în
lucrul cu tabele sau alte obiecte. Pe lângă modalitatea amintită acum,
se folosesc opţiunile butonului View, prezent în fila Home şi alte file contextuale,
precum şi utilizarea pictogramelor miniaturale din partea dreaptă a barei de stare
. Nu este importantă modalitatea prin care se operează comutarea
între diferitele moduri disponibile, important este să se ştie când şi de ce trebuie
făcută (diferenţa între conţinut şi structură), iar operaţiunea în sine să nu dureze
mai mult de câteva secunde.
Personalizarea modului de vizualizare al datelor
În paragraful anterior s-a discutat despre comutarea
în vederea vizualizării conţinutului. În afară de acest lucru,
şi datelor sau tabelei îi poate fi conferit un alt aspect decât
cel standard. Astfel, folosind butoanele existente în
grupurile Font şi Rich Text din cadrul filei Home, se pot
efectua formatări ale întregului conţinut, în acelaşi mod
precum în Word sau Excel. Aspectul devine mai atractiv.
Dimensiunea coloanelor poate fi mărită/redusă în funcţie
de necesităţi cu sprijinul meniului contextual (Column
Width…)– prezent în imaginea din partea dreaptă –
obţinut la selectarea uneia sau mai multor coloane. Se pot
efectua de asemenea glisări cu mouse-ul la nivelul
antetelor de coloane. Dacă într-un anumit context nu
suntem interesaţi de conţinutul anumitor coloane, atunci le putem ascunde (Hide
Columns), putându-se mai târziu reveni (Unhide Columns…), fără a afecta în
vreun fel structura tabelei. Atunci când tabela noastră are un număr foarte mare de
coloane şi trebuie să efectuăm vizualizări/editări în coloanele mai „îndepărtate”,
pentru a şti exact la ce înregistrare ne referim, este recomandat ca să plasăm în
partea stângă, fără posibilitate de defilare la nivelul lor, acele coloane care sunt
cele mai relevante (ex. Denumire). Pentru aceasta, mutăm coloanele relevante prin
operaţiuni drag&drop, pentru a ajunge în poziţie adiacentă. Apoi le selectăm şi
alegem din meniul contextual, sau din Home → Records → More, opţiunea
Freeze Columns, iar coloanele rămân blocate în partea stângă a ferestrei.
Operaţiunea inversă este Unfreeze All Columns.
Asupra înregistrărilor, în ceea ce priveşte schimbarea aspectului, doar
modificarea înălţimii este permisă. Se poate realiza prin glisare, din meniul
contextual rezultat în urma selectării unei linii, sau din Home → Records →
More→ Row Heigh….
Atunci când avem tabele corelate, se poate defini pentru tabela
curentă un subset de date, provenit din tabela cu care aceasta este în
legătură. Spre exemplu, fiind deschisă tabela Produse, în momentul în
care selectez un anumit produs, să pot vedea în ce facturi este prezent
acesta sau care este partenerul care îl furnizează sau căruia îi este
furnizat. Gestiunea subseturilor se realizează prin intermediul opţiunilor
submeniului Home → Records → More → Subdatasheet, ilustrate în imaginea
din dreapta.
Căutarea se poate face în toată tabela, sau într-un anumit câmp (lista Look
In), să fie exactă sau parţială (lista Match), să se caute în ambele sensuri sau doar
într-unul (lista Search), cu ignorarea sau nu a tipului de caractere sau al
formatării. O căutare rapidă se poate efectua prin tastarea textului/valorii căutate,
chiar în zona Search din partea dreaptă a butoanelor de navigaţie, prezentată şi
aici în partea dreaptă. Căutarea se realizează concomitent cu tastarea.
Actualizarea înregistrărilor
Conţinutul tabelelor este volatil. Modificările pot fi făcute direct în tabelă
prin intermediul editării valorilor curente din cadrul celulelor. Actualizările din
cadrul unei înregistrări pot fi anulate, dacă înainte de părăsirea acelei înregistrări
se tastează Esc, indiferent de numărul celulelor care au fost modificate. O
facilitate semiautomată de modificare a conţinutului ar fi exploatarea capabilităţii
de înlocuire a valorii căutate Home → Replace sau Ctrl + H.
Figura 3. 7 – Căutarea după o valoare şi înlocuirea
Chiar dacă o bază de date conţine în esenţă tot tabele, ele beneficiază în
acest moment de un statut mai „special” faţă de cele libere.
Tabelele din cadrul unei baze de date se numesc tabele legate sau corelate.
În acest moment, nu mai există limitarea la 10 caractere lungime pentru câmpuri,
se pot specifica denumiri alternative pentru câmpuri, reguli de validare, moduri de
definire a cheilor primare, posibilitate interrelaţionării tabelelor şi menţinerea
regulilor de consistenţă a datelor, nu numai în cadrul tabelei, ci şi între tabele.
Acestea sunt doar câteva dintre funcţionalităţile „exclusiviste” ale tabelelor legate.
Tipuri de relaţii:
Relaţia una-la-una (1:1). Fiecare înregistrare din tabela părinte poate fi în relaţie
cu una şi numai una înregistrări din tabela fiu şi fiecare înregistrare din tabela fiu
trebuie să fie în relaţie cu una şi numai una înregistrări din tabela părinte
Relaţia una-la-mai multe (1:n). Fiecare înregistrare din tabela părinte poate fi în
relaţie cu una sau mai multe înregistrări din tabela fiu şi fiecare înregistrare din
tabela fiu trebuie să fie în relaţie cu una şi numai una înregistrări din tabela
părinte. Uneori literatura menţionează despre un nou tip de relaţie, şi anume mai
multe-la-una (n:1), care este de fapt o relaţie una-la-mai multe (1:n) inversă.
Relaţia mai multe-la-mai multe (n:n sau m:n). Fiecare înregistrare din tabela
părinte poate fi în relaţie cu una sau mai multe înregistrări din tabela fiu şi
invers. Acest tip de relaţie nu există în modelul relaţional.
Dar, relaţiile de acest tip pot fi simulate prin adăugarea unei tabele intermediare,
denumită tabelă intersecţie.
În aceste noi circumstanţe, vom avea două relaţii 1:n, ambele având partea cu una
şi numai una către tabela originală, iar partea cu mai multe către tabela
intersecţie.
Exemplu. Avem tabelele Clienti şi Produse. Între acestea există o relaţie m:n,
pentru că fiecare client poate achiziţiona unul sau mai multe produse, iar fiecare
produs poate fi achiziţionat de către mai mulţi clienţi.
Trebuie aşadar să găsim o nouă tabelă – precum Tranzactii sau Cumparari –
care să facă legătura dintre cele două. În acest caz, fiecare client poate face una sau
mai multe tranzacţii (cumpărături), tranzacţia (cumpărarea) trebuie făcută de unul
şi numai unul clienţi; în timp ce fiecare produs poate fi pe una sau mai multe
tranzacţii, iar o tranzacţie poate conţine mai multe produse.
Relaţii temporare
Relaţiile persistente dintre tabele reprezintă fundamentul pentru interogări,
rapoarte, formulare care conţin subformulare sau alte obiecte bazate pe tabele şi nu
în ultimul rând pentru menţinerea integrităţii referenţiale. Unul dintre dezavantaje
este acela că înregistrările din tabela de legătură nu sunt corelate.
De exemplu, într-o fereastră Datasheet, dacă suntem pe o înregistrare care are
valoarea 10 pentru cheia primară/candidată, o fereastră Datasheet utilizată pentru
prezentarea informaţiilor din tabela fiu ar trebui să afişeze doar acele înregistrări
pentru care cheia străină ia doar valorile 10. Ar trebui să fie precum în Figura 4. 2.
Se poate observa că există 3 astfel de înregistrări în tabela fiu cu o valoare
identică cu valoarea curentă a cheii primare (10). În aceste condiţii, conţinutul unei
ferestre Datasheet pentru tabela fiu este dinamic, deoarece se modifică odată cu
modificarea indicatorului de înregistrare din tabela părinte.
Fereastra Datasheet însă pentru tabela părinte rămâne neschimbată,
indiferent pe ce înregistrare ne aflăm. Aici sunt prezente toate înregistrările din
tabela părinte, însă au apărut în plus n-1 înregistrări false, câte una pentru fiecare
înregistrare din tabela fiu, minus cea originală.
Pentru declararea acestor relaţii mai întâi trebuie deschise în zone diferite
toate tabelele implicate în aceste relaţii. Putem defini relaţii 1:1, 1:n şi relaţii
multinivel. Aici sunt prezente primele două tipuri, liniile orizontale simple fiind
pentru relaţii 1:1, în timp ce cele duble, pentru relaţii 1:n, tabela în dreptul căreia
avem liniile duble fiind reprezentată de tabelele fiu. Pentru definirea relaţiilor de
tip 1:1, selectăm una câte una tabelele implicate din lista Aliases, apoi acţionăm
butonul de comandă Relations. Relaţiile de tip 1:n pot fi create după ce s-a creat
mai întâi o relaţie de tip 1:1. Butonul 1 to many apare şi devine activ doar când o
relaţie 1:1 este deja definită şi selectată.
Când relaxăm mouse-ul, fereastra din Figura 4. 4 este afişată. Aici trebuie
să verificăm dacă tabela părinte este plasată în partea stângă (Table/Query), iar
cea fiu în dreapta (Related Table/Query). Dacă ordinea tabelelor este inversată,
înseamnă că s-a definit greşit cheia primară. Pe de altă parte, trebuie revizuită şi
corespondenţa câmpurilor de legătură. Dacă am plasat cheia primară peste un alt
câmp decât cel de legătură, se poate remedia şi în acest moment situaţia prin
selectarea celui potrivit din lista derulantă din partea dreaptă. În partea de jos a
ferestrei se observă tipul relaţiei.
Prima apare atunci când câmpurile de legătură au sunt definite pe tipuri, sau doar
dimensiuni diferite.
Exemplu. Într-o tabelă părinte codul este definit ca număr, în timp ce în tabela fiu,
câmpul de legătură este text sau dată calendaristică; sau ambele pot fi numere, dar
unul este Integer, iar celălalt e Long Integer. Problema se rezolvă prin
reconcilierea tipurilor/dimensiunilor, în Table Designer.
Figura 4. 6 – Eroare datorată incompatibilităţii tipurilor de date sau dimensiunilor pe care sunt
definite
Dacă deja sunt date introduse în tabele, se recomandă ca modificarea
subtipului să se facă în favoarea câmpului cu dimensiunea mai mare. În cel de-al
doilea exemplu, vom selecta pentru ambele câmpuri Number, Long Integer.
Dacă am fi selectat Integer, atunci e posibil să se piardă sau altereze date în cazul
în care erau valori peste 32.767, valoarea maximă acceptată de Integer.
OLE DB
Tabele
Forme Interogări (imagini,
Rapoarte proceduri stocate,
Pagini funcţii utilizator)
Module Diagrame de date
Interogările sunt cele care extrag informaţii – cu grad mai mic sau mai mare
de sinteză – din bazele de date, în funcţie de un anumit criteriu, denumit criteriu
de interogare.
Interogările sunt o „traducere formalizată” a unor întrebări prin intermediul
unui limbaj de interogare (precum SQL1 sau QBE2), în vederea obţinerii de
„răspunsuri” furnizate de datele noastre.
Exemplu.
Întrebare: Care este numărul de vânzări realizat de fiecare reprezentant de
vânzări şi care a fost clasamentul acestora pe ultimul an, în funcţie de acelaşi
criteriu?
Interogare:
SELECT NumeRepr, COUNT(Vanzare) AS Tranzactii
FROM Vanzari
WHERE Year(DataTranz)=2009
GROUP BY NumeRepr
ORDER BY Tranzactii DESC
1
Structured Query Language
2
Query by Example, un instrument vizual ce permite formularea de interogări şi generarea de aserţiuni
SQL
1
Răspuns posibil:
NumeRepr Tranzactii
Ion 78
Maria 59
Ana 10
Figura 5. 1 – Numărul de tranzacţii în 2009 pe fiecare vânzător şi clasamentul acestora
Interogările există în baza de date Access şi sunt plasate în categoria Queries din
panoul de navigare. Există patru tipuri de interogări:
Interogări de selecţie (Design View, Simple Query Wizard; interogări
specializate în operaţii de regăsire: Find Duplicates Query Wizard şi
Find Unmatched Query Wizard
Interogări Cross-tab (Crosstab Query Wizard)
Interogări de acţiune (Make-Table Query, Update Query, Append
Query şi Delete Query).
În acest material vom insista pe primul tip, interogările de selecţie fiind cele mai
răspândite.
După modalitatea după care decurge proiectarea, există două tipuri principale de
interogări în MS Access: interactiv, sau prin intermediul constructorului de
interogări.
2
În fila Create, în cadrul grupului Others există două butoane – Query Wizard şi
Query Design – pentru fiecare existând câte un buton, prezentate aici în imaginea
din partea dreaptă/stângă a paginii.
3
Gestionarea interogărilor de selecţie
O interogare de selecţie este acea interogare care „chestionează” datele
înmagazinate în sursele de date de origine şi returnează rezultatul sub forma unui
set de înregistrări reprezentat în cadrul unui formular sau a modului obişnuit de
vizualizare a datelor, fără modificarea datelor originale odată cu crearea sa.
Query Wizard
Cel mai simplu mod de crearea a unei interogări, care este înzestrat şi cu o
interfaţă prietenoasă interactivă, este instrumentul Query Wizard. Nu vom insista
pe detalii prezentate cu alte ocazii, atât legate de acesta, cât şi de interogări.
Instrumentul wizard poate avea un număr diferit de paşi, în funcţie de
complexitatea setărilor din paşii anteriori. Mai întâi trebuie să alegem câmpurile
care dorim să fie returnate. Acestea pot face parte atât din surse unice, cât şi din
surse multiple (tabele sau alte interogări).
4
Figura 5.3– Pasul de selectare al câmpurilor
Funcţiile de grup care se pot aplica, sunt SUM, AVG, MIN şi MAX şi sunt
disponibile doar dacă se alege opţiunea Summary şi se acţionează butonul
Summary Options… Setările se confirmă prin acţionarea butonului OK.
5
Denumirile interogărilor se tastează în cadrul unei ferestre furnizează un
nume predefinit, pornind de la denumirea unei tabele/interogări implicate în
realizarea noului obiect al bazei de date.
6
Figura 5.7 – Rezultat posibil în cazul unei interogări de selecţie
Query Designer
Administrarea facilităţilor se realizează prin intermediul unor file, prin
intermediul unui format tabelar.
7
Atunci când demarăm construcţia unei noi interogări (Create → Query
Designer), fereastra Show Table apare pe ecran, pentru facilitarea includerii
surselor de date.
Putem să adăugăm mai multe la un moment dat, nu doar una precum în Visual
FoxPro.
În exemplul nostru au fost introduse ca surse de date 4 tabele: Facturi,
Continut_Fact, Produse şi Istoric_Pret. Abia după închiderea acestei ferestre,
avem acces la Query Designer. Totodată, o filă specializată gestiunii interogărilor
va fi prezentă.
8
Valoare_Vanzare:
[Continut_Fact].[Cant]*[Istoric_Pret].[PU]*(1-
[Facturi].[Disc])*(1+[Istoric_Pret].[CotaTVA]), unde
Exemplu:
Produse.Cod şi Istoric_Pret.Cod, ce nu pot fi referite simplu Cod.
Observaţie: Atunci când avem de-a face cu mai multe surse de date, care
sunt bogate în câmpuri, selecţia unuia dintre aceste câmpuri devine puţin mai
complicată. Pentru eficientizarea modului de lucru, se recomandă mai întâi
alegerea din cadrul listei de la Table a sursei de date şi abia apoi a elementului din
lista Field. Procedând astfel, se realizează mai întâi o filtrare la nivelul sursei de
date, fiind prezente doar câmpurile din acea sursă de date şi nu din toate cele
prezente în panoul superior.
În cazul nostru, pentru prima coloană am selectat sursa Produse, pentru a
doua nu s-a specificat nimic, fiind o expresie, iar pentru ultimele două avem
Facturi.
9
linie joacă rolul unei singure expresii compuse, a cărei condiţii individuale (dintr-o
celulă) sunt conectate prin operatorul logic AND.
Pentru câmpul Denumire avem două condiţii conectate prin operatorul
logic OR (produsele a căror denumire începe cu litera „C” SAU conţine litera
„p” în poziţia a treia). Se poate trece aici întreaga condiţie, folosind în expresia
compusă şi operatorul OR, sau se trece una dintre expresii, iar în linia Or,
cealaltă. Pentru a lua în consideraţie doar un anumit preţ şi cel corect din istoric,
vom filtra data facturii (am discutat despre acest aspect şi în secţiunile anterioare,
în cazul Visual FoxPro). Deoarece avem nevoie doar de valoarea vânzărilor, vom
filtra şi facturile după tip (V).
10
Butoanele aferente sunt prezente în partea dreaptă. Comanda SQL pentru
rezolvarea problemei este prezentată în fig.5.10.
11
Interogări cu parametri. Nu întotdeauna anumite cerinţe din cadrul
enunţului unei interogări sunt cunoscute cu exactitate din timpul fazei de
proiectare. Pentru astfel de situaţii, alegerea definirii unei interogări
parametrizabile este o opţiune potrivită.
Se observă că interogarea a fost deja salvată sub un nume – Top – iar denumirea
iniţială a câmpului calculat, Valoare_Vanzare a fost acum modificat în Valoare,
deoarece fiind o interogare parametrizabilă, coloana poate referi atât valoarea unei
vânzări, cât şi a unei cumpărări.
12
Figura 5.12. – Exemplu de interogare parametrizabilă
Într-o interogare putem avea mai mulţi parametri şi putem să-i folosim şi în
expresii mai elaborate.
13
Exemplu. Identificarea partenerilor din acelaşi oraş.
Create → Query Wizard →Find Duplicates Query Wizard
14
Figura 5.15. – Listă parteneri cu sediu în aceeaşi localitate
La primul pas vom alege sursa din care face parte câmpul a cărui valori vrem să le
examinăm
15
Selectăm sursa de date în care se vor căuta apariţiile câmpului din prima sursă de
date.
Se stabileşte criteriul pe baza căruia s-a stabilit relaţia dintre cele două surse de
date, Cod şi CodProd.
Totuşi, nouă ne este mai greu să identificăm un produs prin cod, decât prin
denumirea sa şi alte caracteristici. De aceea, vom furniza informaţii suplimentare,
necesare pentru identificarea mai facilă a produselor care n-au fost comercializate.
16
După atribuirea unui nume în cadrul pasului următor, vom descoperi că boxele
Parrot nu au fost nici vândute, nici cumpărate până în momentul de faţă, după
cum indică şi imaginea din dreapta.
Interogări Cross-Tab
Crosstab Query Wizard permite crearea interogărilor de tip cross-tab,
într-o manieră interactivă. Rezultatul se prezintă sub forma unui tabel. Şi aceste
interogări pot fi editate în Query Designer. În modul Design View destinat
acestui tip de interogări, avem o linie adiţională denumită Crosstab. Valorile
acceptate în cadrul ei, sunt:
17
Row Heading – Se foloseşte pentru câmpul afişat pe o linie a tabelului. Spre
deosebire de celelte două componente, pot exista mai multe astfel de instanţe,
plasate în coloane diferite. În acest caz avem numărul de factură şi cantitatea
consolidată (însumată) pe factură, fără a ţine cont de unitatea de măsură.
Column Heading – Pentru acele câmpuri care vor fi afişate ca antet în cadrul
coloanelor tabelului. Aici avem codul produselor comercializate.
Interogări de acţiune
Aceste interogări efectuează operaţiuni de actualizare a tabelelor, precum şi
crearea de tabele noi, într-o manieră cvasiautomată. Nu va mai fi necesar calculul
şi popularea manuală a unor câmpuri care se pot obţine pe baza unei expresii
18
computaţionale bazate pe alte câmpuri.
Definim doar o interogare simplă care
are la bază sursa de date în care vom
opera, iar apoi transformăm
interogarea de selecţie într-una de
acţiune.
Nu le putem crea direct, nici chiar din comenzi SQL. Tipurile de interogări
disponibile – marcate prin butoane specifice în fila Design şi prezente în imaginea
din dreapta – sunt:
Make-Table Query – Creează o nouă tabelă bazată pe rezultatul
aplicării unei interogări de selecţie asupra unor surse de date existente;
Append Query – Adaugă noi înregistrări în cadrul unei surse de date
existente;
Delete Query – Permite efectuarea de ştergeri a unor înregistrări în
funcţie de un anumit criteriu;
Update Query – Actualizează valorile existente din cadrul unei surse
de date, sau le completează.
Ele pot fi selectate şi din meniul contextual, submeniul Query Type, prezent mai
sus.
Make-Table Query. Trebuie selectate câmpurile şi configurate criteriile
necesare pentru crearea noii tabele. Se acţionează butonul Make Table, care va
lansa o fereastră cu acelaşi nume, în care se va specifica numele noii tabele, care
poate fi plasată fie în baza de date curentă, sau în alta.
19
Figura 5.22 – Definire interogare Make Table
20
Figura 5.23 – Definire interogare Append
Delete Query. Înregistrările din tabela sursă vor fi şterse automat, dacă sunt
îndeplinite criteriile. Se alege butonul Delete sau opţiunea echivalentă, o linie cu
acelaşi nume apărând ulterior şi în fereastra Query Design. Insistăm pe cele două
aspecte care decurg din această operaţiune. În lista derulantă apar următoarele
intrări:
From – Specifică tabela în care vor fi efectuate ştergerile;
Where – Menţionează condiţia de ştergere. Se pot specifica mai multe
condiţii, în linii şi coloane diferite.
Observaţie: Dacă sunt omise condiţiile, atunci toate înregistrările vor fi şterse.
Dacă se selectează o altă sursă de date, ştergerea se va efectua în aceasta. Deci,
trebuie să mânuim cu mare atenţie condiţiile Where şi să avem mare atenţie ce
sursă de date folosim.
21
Rezultatul setărilor unei astfel de interogări poate fi cel din Figura . În
panoul de navigare vom recunoaşte o astfel de interogare după simbolul care-i
precede numele, precum .
Interogările de mai jos conţin toate datele din tabele corelate şi o serie de
informaţii suplimentare, precum preţul efectiv al unui produs comercializat,
valoarea, TVA-ul şi valoarea cu TVA.
Spre exemplu, preţul se află în funcţie de preţul unitar aferent acelui produs,
pentru perioada de timp (Istoric_Pret) în care se află data tranzacţiei (Facturi), la
care se mai aplică discountul.
Preţul se poate schimba frecvent – spre exemplu avem promoţii pentru anumite
produse – şi din câte am observat recent, chiar si cota de TVA. Toate aceste
actualizări sunt surprinse în tabela Istoric_Pret.
23
Figura 5.26 – Tabele de bază
24
Capitolul 6. Access SQL
În limbajul SQL standardizat de ISO nu se folosesc termenii formali de relaţie, atribut, tuplu,
ci tabela, coloană, rând.
1
Deşi SQL este un limbaj cu format liber, o instrucţiune este mai lizibilă dacă se utilizează
indentarea şi alinierea. De ex:
• fiecare clauză dintr-o instrucţiune trebuie să înceapă pe o linie nouă
• începutul fiecărei clauze să fie aliniat cu începutul celorlalte
• dacă o clauză are mai multe părţi, fiecare parte trebuie să apară pe câte o linie
separată şi trebuie indentată faţă de începutul clauzei
Identificatorii SQL sunt utilizaţi pentru a numi obiecte din BD. Pentru caracterele utilizate,
standardul ISO permite A...Z, a...z, 0...9, _. Restricţii impuse identificatorilor:
• nu poate fi mai lung de 128 caractere (majoritatea dialectelor au o limită mult mai joasă)
• trebuie să înceapă cu o literă
• nu poate conţine spaţii libere
Crează un tabel şi defineşte structura unei înregistrări precum şi tipurile de date asociate
câmpurilor. Numele tabelului trebuie să fie unic în BD. Clauza NOT NULL arată că în
câmpul respectiv nu se memorează valori de tip NULL.
2
DROP TABLE nume_tabel
Şterge complet o tabelă din BD.
Instrucţiunile de selecţie reprezintă una din categoriile cele mai importante ale limbajului
SQL ACCESS. Indiferent dacă sunt cereri simple sau complexe, cuvântul cheie este
SELECT. Pentru cererile de interogare simple, sintaxa instrucţiunii este:
Sunt acele interogări în care apar funcţiile agregat, asocierile sau combinările.
3
Funcţiile agregat (de grup)
Permit construirea unor interogări complexe, prin care utilizatorul cere gruparea
înregistrărilor care au câmpuri cu aceeaşi valoare, în scopul efectuării unor calcule.
În standardul ISO sunt definite 5 funcţii de grup:
COUNT returnează numărul de valori dintr-o coloană specificată
SUM returnează suma valorilor dintr-o coloană specificată
AVG returnează media valorilor dintr-o coloană specificată
MIN returnează cea mai mică valoare dintr-o coloană specificată
MAX returnează cea mai mare valoare dintr-o coloană specificată
Sintaxa instrucţiunii:
4
Deoarece în instrucţiunile SQL care descriu joncţiuni se utilizează câmpuri care fac parte din
tabele diferite, trebuie specificat numele tabelului de care aparţin, folosind sintaxa
nume_tabelă.nume_câmp
Echivalentul QBE al acestor categorii de joncţiuni este alegerea opţiunilor 1, 2, sau 3 din
caseta Join Properties.
Sintaxa instrucţiunii:
Obs: SQL ACCESS acceptă scrierea fără specificarea explicită a lui OUTER.
Semnificaţia elementelor noi:
JOIN specifică tabelul care va fi asociat (nume_tabel2, nume_tabel3) celui din clauza
FROM
ON arată între ce câmpuri trebuie să existe relaţia pe care se bazează joncţiunea.
Criteriul de asociere conţine obligatoriu operatorul „=”.
Există mai multe restricţii pentru instrucţiunile care genereză interogările UNION, şi anume:
5
• Numărul câmpurilor din lista de câmpuri din fiecare instrucţiune SELECT şi UNION
SELECT trebuie să fie aceeaşi
• Secvenţa de nume din fiecare listă de câmpuri trebuie să corespundă unor intrări
identice
• Este permisă utilizarea doar o dată a clauzei ORDER BY, după ultima instrucţiune
UNION SELECT
Exemple:
SELECT nume, prenume, vârstă FROM Colaboratori2001
UNION SELECT nume, prenume, vârstă FROM Colaboratori2002
ORDER BY nume;
Interogările de acţiune tip CREATE duc la generarea unui nou tabel pornind de la
structura şi conţinutul unor tabele deja existente.
Se foloseşte instrucţiunea SELECT ... INTO
SELECT [domeniu] (câmp1,câmp2...)
INTO tabel_nou
FROM tabel_sursa
[WHERE criteriu_de_adăugare];
Interogările de acţiune tip INSERT sunt folosite pentru adăugarea de înregistrări dintr-un
tabel în altul. Există două forme ale instrucţiunii şi anume:
• INSERT ... VALUES
• INSERT ... SELECT
6
b). Este posibil să se copieze mai multe înregistrări dintr-un tabel în unul sau mai multe
tabele.
INSERT INTO tabel_destinaţie (câmp1, câmp2...)
SELECT [domeniu] câmp1, câmp2...
FROM tabel_sursă
WHERE criteriu_de_adăugare;
Reguli:
• aceleaşi ca mai sus
• numărul şi natura câmpurilor din clauza INTO să fie aceleaşi cu cele returnate de
instrucţiunea SELECT
• dacă nu se introduce WHERE, toate înregistrările din tabel_sursă vor fi adăugate în
tabel_destinaţie
Interogările de acţiune tip DELETE şterg parţial sau total înregistrările dintr-un tabel. Nu
se foloseşte pentru ştergerea de valori din câmpuri individuale, ci acţionează asupra
înregistrării în totalitatea ei. Dacă se şterg toate înregistrările, structura de tabel rămâne,
ea putând fi eliminată numai cu DROP TABLE.
DELETE *
FROM Vânzări;
DELETE *
FROM Angajaţi
WHERE Vârsta>60;
Interogărilede acţiune tip UPDATE pot introduce înregistrări noi şi pot modifica valorile
câmpurilor din înregistrări existente.
UPDATE nume_tabel
SET nume_câmp1=valoare1 [,nume_câmp2=valoare2]...
[WHERE criteriu_de_actualizare];
Ca şi în celelalte locuri unde apare clauza WHERE, restricţionarea se poate accentua folosind
şi operatori logici.
Exemplu:
UPDATE Comunicaţii
SET Reţea=”Orange”
WHERE Reţea=”Dialog” AND Data>#12.12.2001;
7
6.5. Cereri de interogare imbricate
Scrierea unei interogări în cadrul alteia duce la apariţia unei subinterogări, setul de
rezultate obţinute de la aceasta constituind argument pentru prima interogare.
SELECT lista_câmpuri
FROM tabel1
WHERE tabel1.nume_câmp=
(SELECT nume_câmp
FROM tabel2
WHERE criteriu_de_selecţie);
Cele două tabele trebuie să aibă un câmp comun (nume_câmp) care va reprezenta câmpul de
legătură ce stă la baza construirii subinterogării.
6.6. Exemple
unde nume_coloana_i este numele unei coloane din tabelă. Când selectăm coloane din
mai multe tabele, forma generală a numelor coloanelor unei tabele este
nume_tabela.nume_coloana
deoarece numele coloanelor din diverse tabele pot coincide. Atributul nume_coloana al
obiectului nume_tabela este accesat cu operatorul punct.
Dacă vrem să selectăm toate coloanele tabelei, instrucţiunea SELECT are forma
SELECT *
FROM nume_tabela;
PROIECT_ANGAJAT
8
Proiectarea tabelei este cea din Figura 6.1.
9
Dacă vrem să selectăm toate coloanele liniilor unei tabele ce îndeplinesc o condiţie,
instrucţiunea SELECT are forma
SELECT *
FROM nume_tabela
WHERE conditie
ORDER BY nume_coloana_1 [ASC | DESC] [, nume_coloana_2 [ASC
| DESC] …];
In cazul instrucţiunii SELECT, când se selectează date dintr-o singură tabelă, în numele
coloanei se poate omite numele tabelei.
D.Condiţii compuse
In următorul exemplu vom selecta angajaţii de la departamentele Suport şi Documentare
din tabela PROIECT_ANGAJAT cu instrucţiunea SELECT de mai jos.
10
SELECT ID_ANG, NUME_ANGAJAT, DPT_ANG, SAL_ORA
FROM PROIECT_ANGAJAT
WHERE DPT_ANG = ‘Documentare’ OR DPT_ANG = ‘Suport’;
Condiţia din clauza WHERE se completează în celulele DPT_ANG din liniile Criteria
şi or. Formularul corespunzătoare acestei interogări este:
11
Figura 6.5. Tabela rezultat
Clauza WHERE a instrucţiunii SELECT conţine o condiţie care este o expresie booleană.
Expresiile booleene sunt constituite din expresii relaţionale separate de operatorii
booleeni AND, OR şi NOT. In cazul cel mai simplu, o expresie booleană este constituită
dintr-o singură expresie relaţională.
In unele cazuri avem nevoie să comparăm un şir de caractere cu elementele unei coloane
care sunt şiruri de caractere, ca în interogarea din Figura . Sirurile de caractere sunt scrise
între ghilimele. O operaţie ce se poate efectua asupra şirurilor este concatenarea.
Operatorul de concatenare este &. Pentru a testa dacă un şir de caractere corespunde unui
şablon se utilizează operatorul LIKE, vezi o lucrare anterioară.
12
Expresia booleană ce reprezintă condiţia din clauza WHERE se poate scrie direct în
câmpurile Criteria şi or sau se poate crea cu aplicaţia Expression Builder, ca într-o
lucrare anterioară.
Implicit, în fereastra de proiectare există o singură linie or. Se pot adăuga mai multe linii
or cu un clic pe linia or existentă şi apoi clic pe meniul Insert Rows.
Liniile or se pot şterge cu un clic pe linie şi apoi clic pe meniul Edit Delete Rows.
13
Pentru a lansa aplicaţia Expression Builder se procedează astfel:
1. se afişează meniul contextual al coloanei formularului cu un clic cu butonul drept pe
coloana pentru care vrem să creăm condiţia;
2. clic pe opţiunea Build ce afişează caseta Expression Builder cu care se crează
expresia dorită.
14
Opţiunea Table Names afişează sau ascunde linia Table din formular ce afişază numele
tabelelor.
E.Reuniunea tabelelor
Una dintre operaţiile ce se pot aplica asupra tabelelor rezultat este reuniunea acestor
tabele. Pentru reuniune, liniile tabelelor trebuie să aibe aceleaşi coloane. Reuniunea
tabelelor se face cu instrucţiunea SQL UNION cu forma:
SELECT coloane
FROM nume_tabela_1
UNION
SELECT coloane
FROM nume_tabela_2;
SITUATIE_FINANCIARA
DATE_CONTABILE
Vom crea o tabelă ce reuneşte liniile celor două tabele în felul următor:
1. se afişază fereastra Database; în partea stângă, se selectează opţiunea Queries; în
partea dreaptă se afişază opţiunile existente, Create query by using wizard şi Create
query in Design view şi interogările (Queries) existente,
2. clic pe opţiunea Create query in Design View care afişază caseta Show Table; clic
pe butonul Close
3. clic pe meniul Query SQL Specific, şi în submeniul afişat, clic pe opţiunea Union.
15
Figura 6.10. Meniul Query. Opţiunea Union.
4. se afişază caseta de text din Figura , în care se introduce instrucţiunea UNION
Funcţia Semnificaţia
AVG Valoarea medie
MIN Valoarea minimă
MAX Valoarea maximă
SUM Suma valorilor din coloană
VAR Dispersia
STD Abaterea medie pătratică
Tabelul 2. Funcţii SQL pentru agregarea datelor în instrucţiunea SELECT.
Cea mai simplă interogare a unei baze de date cu utilizarea acestor funcţii este aplicarea
lor asupra unor coloane dintr-o tabelă. Acestă interogare corespunde instrucţiunii
SELECT următoare:
16
SELECT funcţie(nume_coloana_1), funcţie(nume_coloana_2), …,
funcţie(nume_coloana_k)
FROM nume_tabela;
In acest caz nu s-a precizat numele coloanelor din tabela rezultat a interogării, şi aplicaţia
atribuie acestor coloane nişte nume standard. Instrucţiunea SELECT are şi o formă în
care putem atribui coloanelor tabelei rezultat ce nume dorim. Această formă este
17
Figura 6.14. Fereastra de proiectarea interogării.
2. se selectează prima celulă din linia Fields cu un clic,
3. clic pe butonul Build, , al barei de instrumente, care lansează aplicaţia
Expression Builder din Figura ; se selectează în fereastra stângă opţiunea Functions
Built-In Functions, în fereastra din mijloc se selectează SQL Aggregate, iar în
fereastra din dreapta funcţia Sum; clic pe butonul Paste şi în fereastra superioară
apare expresia Sum(“expr”) pentru care trebuie să completăm argumentul expr,
18
Figura 6.16. Selectarea argumentului unei expresii.
5. selectăm apoi tabela VANZARI în fereastra din stânga cu clic pe opţiunea Tables
VANZARI; în acest moment în fereastra din mijloc apar câmpurile tabelei; clic pe
câmpul VANZARI_2001 şi se generează expresia din fereastra superioară din Figura ;
numele coloanei este introdus ca [nume_tabela].[nume_coloana], adică
[VANZARI]![VANZARI_2001],
19
Figura 6.18. Fereastra de proiectare.
Expresia din prima celulă a liniei Field este cea din Figura . Numele coloanei atribuit de
aplicaţia Expression Builder este Expr1.
7. clic pe butonul Run , , al barei de instrumente şi tabela rezultat este cea din Figura .
20
Modificăm Expr1 în celula liniei Field în AN 2001, şi la fel numele celorlalte coloane
pentru a fi mai semnificative. Tabela rezultat este :
21
Capitolul 7 – Formulare
7.1. O privire asupra formularelor
Un formular este o fereastră de tipul celor pe care le are la bază sistemul de
operare, în cazul nostru, Windows. Este un obiect având anumite proprietăţi –
denumire, titlu, dimensiune, poziţie, diverse proprietăţi ale fundalului sau ale
aspectului exterior sau scrisului în cadrul formularului etc. – metode (secvenţe de
cod de programare) asociate unor evenimente (clic, dublu-clic, clic dreapta,
mouse deasupra, obţinerea sau pierderea controlului, redimensionarea, acţionarea
unei taste etc.).
Figura 7. 1 – Formular
1
7.2. Detalii legate de obiectele vizuale gestionate de formulare
Detalii asupra tipurilor de obiecte
Există mai multe moduri de a caracteriza obiectele, dar suntem interesaţi doar în
următoarele trei categorii.
Exemplu. Dacă o casetă de text va afişa datele din cadrul câmpului Denumire din
cadrul tabelei Partners într-un formular, atunci proprietatea ControlSource se
va seta la valoarea “Partners.Denumire”; în cazul în care caseta de text se leagă
de o variabilă de memorie specifică aceluiaşi câmp, atunci aceeaşi proprietate va fi
configurată pe valoarea “m.Denumire”. Dacă vrem să punem într-un formular
anumite porţiuni din tabela Produse vom alege obiectul Grid, în timp ce
proprietatea RecordSource va lua valoarea “Produse”.
2
Un formular se poate utiliza la afişarea unor secţiuni din una sau mai multe tabele
sau interogări, navigarea între înregistrări, actualizarea (inserare, modificare,
ştergere), procesare de date, manipularea componentelor bazei de date etc.
Tipuri de formulare
Formularele create în Access într-o anumită bază de date, vor fi
reprezentate în cadrul panoului de navigare, dedesubtul
benzii Forms şi însoţite fiind fiecare de icoana
specifică - .
3
Figura 7. 3 – Diferite tipuri de formulare
4
multiînregistrare, ce conferă o perspectivă globală asupra sursei de date, putându-
se regăsi date mai facil. L-am întâlnit şi la introducerea/vizualizarea datelor în/din
tabele. Se aseamănă cu o fereastră BROWSE, unde câmpurile sunt în antetul
tabelului, iar valorile dispuse sub acestea, pe coloane. Este sub butonul Datasheet.
În modul Design View, formularele de acest tip se prezintă precum în imaginea
din partea dreaptă.
Split Form – Este un tip de formular mai complex, a cărui machetă este
divizată în două panouri. Panoul
superior este practic un formular de
tipul Form, iar cel de jos este de tip
Datasheet.
Cele două formulare sunt
corelate – similar cu partiţiile unei
ferestre BROWSE/EDIT, dispuse vertical, nu orizontal (una lângă cealaltă), o
celulă selectată dintr-o partiţie va genera şi în cealaltă partiţie aceeaşi selecţie.
Un astfel de formular poate combina avantajele celor două descrise
anterior: panoul de jos îl folosim pentru localizarea unei înregistrări, o selectăm,
fiindu-ne însă mai uşor s-o vizualizăm/modificăm în panoul superior.
Este sub butonul Multiple Items. În modul Design View, aspectul este cel
din imaginea din partea dreaptă.
Blank Form – Este un formular gol, nelegat la nicio sursă de date, care va putea fi
configurat de utilizator. Se deschide implicit în modul Layout View.
Form Design – Este un formular similar cu cel anterior, fiind însă deschis în
modul Design View în vederea proiectării.
Formulare interactive
Modal Dialog – Este un formular cu două butoane predefinite, sub
forma unei ferestre de tip modal. Implicit, nu este legată la nicio sursă de date.
5
Moduri de vizualizare specifice formularelor
În cazul formularelor există 3 moduri de vizualizare. Ele sunt prezentate în
cadrul butonului de tip listă ascunsă View al grupului cu acelaşi nume, fie din fila
Home, fie din fila contextuală Format.
6
Acesta este şi motivul pentru care – atunci când nu este nicio tabelă selectată –
doar butoanele Blank Form, Form Design, More Forms (numai cu Form
Wizard, Modal Dialog) sunt active.
Pentru a avea o gamă mai largă de opţiuni la dispoziţie, se recomandă selectarea în
prealabil a tabelei care va sta la baza formularului.
7
a. Crearea interactivă a formularelor
Vom insista doar pe realizarea formularelor cu un instrument de tip wizard.
Numărul de paşi diferă în funcţie de complexitatea formularului. Atunci
când alegem să creăm un formular în care avem surse de date implicate în relaţii
1:N, putem avea un pas suplimentar, dar nu în mod obligatoriu.
Altfel, 4 paşi – dacă-i urmăm pe toţi cei care sunt puşi la dispoziţie – sunt
suficienţi pentru procesul de creare al unui formular.
Primul pas permite selectarea câmpurilor care vor fi prezente în formular.
Se pot selecta câmpuri din una sau mai multe tabele/interogări.
Putem selecta date din mai mult de două surse, însă nu întotdeauna
ajungem la rezultatul dorit. Dacă alegem câmpuri din surse de date multiple – dar
nu necorelate – ordinea în care tabele sunt luate în considerare atunci când alegem
diverse câmpuri, nu este importantă. Dacă avem două tabele-fiu şi doar una
părinte, atunci referinţele vor fi stabilite automat; dacă însă avem una sau mai
multe tabele-părinte şi doar o tabelă-fiu, atunci trebuie să specificăm care va fi
tabela-reper în afişarea datelor. Doar în astfel de cazuri, pasul adiţional apare
(fig.7.6.). Neavând obiect, nu va fi prezent nici în cazul surselor de date unice.
8
când vor fi toate deschise, deplasarea indicatorului în formularul în care avem
sursa de date de referinţa, va genera automat filtrarea în formularul creat după
sursa referită, producând doar afişarea înregistrărilor corelate cu înregistrarea de
referinţă.
10
Figura 7. 9 – Preferinţe de stil
11
Open the form to view or enter information), fie se va deschide pentru
reproiectarea lui (opţiunea Modify the form’s design).
12
modificarea formularului în modul Design sau Layout View. Dacă problemele de
genul celui de-al doilea exemplu se pot rezolva şi în Layout View, primul gen de
problemă necesită imperios utilizarea modului Design View, detaliat în
următoarea secţiune.
b. Crearea formularelor în Design View
Pentru gestiunea formularelor în acest mod de lucru, avem nevoie de:
Fereastra formularului deschisă în Design View;
Filele contextuale, în special gupul Controls din fila Design;
Meniu contextual;
Fereastra de proprietăţi (Property Sheet);
Lista de câmpuri (Field List);
Diverse utilitare auxiliare (Expression Builder, instrumente wizard pentru
controale, eventual Macro Builder, Code Builder).
Un formular poate fi creat de la bun început în modul de proiectare, sau se
poate modifica ulterior. În cazul primei variante, se va alege unul dintre butoanele
Blank Form sau Form Design din Create → grupul Forms. Pentru cea de-a doua
variantă se va comuta pe modul de proiectare: Home → View → Design View.
Dacă formularul e nou, va apărea atât fereastra de proiectare a unui formular (care
nu conţine niciun element), cât şi filele contextuale Design (vezi fig.7.11) şi
Arrange (fig.7.12).
Vom insista mai mult pe fila Design, filă din a cărui conţinut am omis
grupul Views şi Font, care aparţin de drept filei Home.
Formularul nou apare deschis în fereastra cu file multiple şi poartă un
nume generic: Form1, Form2 etc. În partea superioară apare o bandă în care este
înscris cuvântul , însoţit de o săgeată orientată în jos. Acest lucru
înseamnă că sub această bară şi până la următoarea, se va întinde zona Detail,
zonă în care dacă plasăm un element, va fi repetat pentru fiecare înregistrare a
13
sursei de date, cu eventualele filtrări dictate de relaţiile dintre surse şi filtrările
impuse de utilizator.
Implicit, aceasta este singura zonă prezentă în costructorul de formulare.
Adăugarea altor zone – antet şi subsol – se realizează fie din grupul Controls
opţiunea Title , fie din fila Arrange → Show/Hide → Form Header/Footer
. Diferenţa constă în faptul că la prima variantă apare în plus şi un control de tip
etichetă (Label) în care se va înscrie şi titlul formularului. Componentele înscrise
în aceste zone apar o singură dată la nivel de formular. Tot din Arrange se mai
pot insera două zone adiţionale, dar la nivel de pagină a formularului (se repetă o
singură dată în cadrul unei pagini): Arrange → Show/Hide → Page
Header/Footer . Se pot utiliza şi opţiunile meniului contextual în acest scop.
Toate zonele sunt ajustabile (prin glisări cu mouse-ul sau modificare proprietăţi).
Prin intermediul unui formular se asigură dialogul utilizatorului cu baza de
date sau o parte din aceasta. Un formular vid nu are însă nicio legătură cu datele.
Acest lucru se configurează din cadrul ferestrei Property Sheet. Apare pe ecran la
selectarea butonului cu acelaşi nume din fila Design, sau a opţiunii Properties din
meniul contextual. Relaţionarea datelor cu formularul se realizează prin
intermediul proprietăţii Record Source, după cum se observă şi în fig. 7.13.
trebuie neapărat ca în lista derulantă din partea de sus – Selection type – să fie
selectat Form.
Din cadrul listei de câmpuri se pot glisa în cadrul ferestrei formularului, fie
individual, fie mai multe odată. Rezultatul este apariţia pe formular a câmpurilor,
pentru fiecare existând perechea etichetă (Label) – casetă de text (TextBox).
Conţinutul etichetei – implicit având numele câmpului urmat de două puncte (:) –
poate fi editat direct în formular sau prin modificarea proprietăţii Caption. Caseta
de text va avea proprietăţile Control Source şi Name identice cu numele
câmpului. Nu se recomandă modificarea manuală a primei proprietăţi.
De multe ori în cadrul proprietăţilor – spre exemplu Control Source – suntem
nevoiţi să apelăm la expresii care depăşesc nivelul de complexitate cerut de
introducerea unei valori scalare sau a unui nume de câmp.
Caseta de text şi eticheta corespunzătoare unui câmp pot fi gestionate
împreună, dar şi separat. Atunci când se selectează unul dintre ele,
ambele vor fi însoţite de un marcaj de jur împrejur, iar în colţul
15
stânga-sus al fiecăreia apare un pătrăţel de culoare închisă . Un astfel de marcaj
se poate observa în figura din dreapta. Chiar dacă apar marcaje pentru ambele
obiecte, doar unul dintre ele este selectat, cel de culoare mai vie. Chiar şi aşa,
anumite operaţiuni – precum mutarea – afectează ambele obiecte, atunci când
indicatorul specific al mouse-ului nu se află deasupra vreunuia din cele două
pătrăţele . Orice glisare care îşi are punctul de pornire în vreunul din acele
pătrăţele, se referă la obiectul căruia îi aparţine. Dacă am selectat doar unul dintre
cele două şi am acţionat tasta Del, sau am ales opţiunea Delete din meniul
contextual, atunci se va şterge acel obiect. La încercarea de ştergere doar a casetei
de text, se va produce şi ştergerea etichetei însoţitoare, chiar dacă n-a fost selectată
în prealabil.
Se pot efectua şi selecţii multiple, prin utilizarea butonului din fila
Design, prin încadrarea mai multor obiecte cu ajutorul mouse-ului, sau prin clicuri
pe obiecte individuale, concomitent cu acţionarea tastei Shift. Această operaţiune,
precum şi altele referitoare la selecţii multiple, se execută la fel ca şi în Visual
FoxPro).
Access dispune cam de o intreagă gamă de controale şi containere.
Majoritatea apar şi în imaginea din dreapta, altele sunt cazuri particularizate ale
acestora (ex. Title este un tip special de Label, PageNumbers e un tip de
TextBox).
Atunci când dorim doar text, alegem controlul Label , iar pentru
expresii variabile (câmpuri, funcţii, calcule aritmetice), selectăm TextBox .
Observaţie: După cum am văzut în paragrafele anterioare, fiecare casetă de
text va fi însoţită de câte o etichetă.
Totuşi, există cazuri când vrem să plasăm eticheta într-o zonă a
formularului (ex. în Page/Form Header), iar caseta de text în Detail. Acest lucru
este foarte greu de realizat cu o astfel de pereche, căci ele pot sta doar în aceeaşi
zonă. În astfel de cazuri, plasăm perechea în zona Detail. Apoi, vom şterge
eticheta care apare cu caseta de text, iar în locul ei vom lua un obiect de tip Label,
pe care îl plasăm în zona în care avem nevoie de el (Page/Form Header).
În afară de Label şi Text Box, avem următoarele obiecte Button, Option
Group, Toggle, Option Button Check Box, Combo Box, List Box, Image, Tab
Control, Subform/Subreport, Line, Rectangle etc. Trebuie doar să selectăm
obiectul şi să-l plasăm pe formular. La anumite obiecte – de obicei la containere şi
la cele care trebuie să asociem o mică secvenţă de cod – dacă butonul
este apăsat.
16
Figura 7. 15 – Instrument de asistare la crearea butoanelor de comandă
17
Figura 7. 16– Formular personalizat de afişare detalii produse
18
La pasul următor vom fi chestionaţi în legătură cu tipul relaţiei dintre
formularul principal şi subformular. Se poate alege fie relaţia existentă deja între
tabele, fie defini una nouă fig.7.18.
19
Exemplu.
Avem obiectele cu numele PU, respectiv Cantitate şi avem de calculat preţul
unitar cu TVA, respectiv valoarea cu TVA.
Calculând mai întâi preţul amintit într-un obiect cu numele PUTVA (=PU *
124/100), la calculul valorii cu TVA, ne va fi mai uşor să scriem =PUTVA *
Cantitate, decât =PU * 124/100 * Cantitate.
In subformular, pentru fiecare produs din cel principal, vom avea cel puţin o
înregistrare. Lucrul acesta nu ne convine, deoarece pe noi ne interesează doar un
singur preţ, şi anume preţul actual.
Acest lucru impune o filtrare, astfel că va trebui să afişăm doar acea înregistrare
pentru care data curentă (memorată în caseta Data) se află în intervalul DataStart
şi DataFinal (câmpuri din tabela Istoric_Pret) al unei modificări de preţ.
20
eventualele probleme cu setările regionale, este de preferat să utilizăm expresii de
genul 24/100, în loc de 0,19 sau 0.19.
Mai trebuie să adăugăm cele două butoane. Alegem câte un control de tip
Button, pe care le plasăm pe formular. Dacă este activ utilitarul de asistenţă, va
trebui să urmăm câţiva paşi simpli.
Pentru al doilea buton se va selecta acţiunea Find Record din cadrul aceleiaşi
categorii. Pentru primul buton se va alege menţionarea unui text pe exteriorul său,
iar pentru celălalt se va trece o imagine miniaturală.
21
Figura 7. 21 – Fereastra de căutare în cadrul formularului
22
Capitolul 8. Macrouri şi introducere în programarea
VISUAL BASIC for Application
8.1. Macrocomenzi
Macrocomanda (engl. macro ) este un set de una sau mai multe actiuni care, fiecare executa o
anumita operatie, cum ar fi deschiderea unui formular sau tiparirea unui raport. Macrocomenzile
pot ajuta la automatizarea sarcinilor comune.
Exemplu : putem executa o macrocomanda care sa tipareasca un raport atunci cand ultilizatorul
executa clic pe un buton de comanda.
Macrocomanda poate fi una compusa dintr-o secventa de actiuni sau poate fi un grup de
macrocomenzi. De asemenea, putem folosi o expresie conditionala pentru a determina daca in
anumite cazuri o actiune va fi executata cand se ruleaza macrocomanda.
Crearea macrocomenzilor
In Microsoft Access, foarte multe sarcini pot fi realizate cu ajutorul macromenzilor sau prin
intermediul interfetei grafice. In alte aplicaţii de baze de date, multe dintre aceste sarcini necesită
programare. Situația în care se va utiliza o macrocomanda sau cod Visual Basic forApplications
(VBA) depinde de cele mai multe ori de ceea ce trebuie făcut.
1
d.Crearea sau manipularea obiectelor
In majoritatea cazurilor, crearea si modificarea unui obiect este mult mai usor de realizat în
fereastra Design a obiectului. Totusi, în unele situatii este posibil sa fie nevoie de manipularea
prin cod a definitiei unui obiect. Folosind VBA, se pot manipula toate obiectele din baza de
date și însasi baza de date.
f. Manipularea inregistrarilor
Codul VBA poate fi utilizat pentru a parcurge un setde inregistrari, inregistrare cu inregistrare, si
a executa o operatie pe fiecare inregistrare;in timp ce, macrocomenzile lucreaza cu intregul set
de inregistrari o dată.
Access oferă utilizatorilor un set puternic de acţiuni ce se pot programa şi stoca în obiecte macro.
Un ansamblu de acţiuni care împreună automatizează o anume activitate formează ceea ce în
practică numim o macrocomandă.
Un obiect macro poate stoca una sau mai multe macrocomenzi.
2
Acţiunile Access utilizate la construirea de macro-comenzi se pot grupa funcţional după cum
urmează : obiect, ferestre, transfer (import/export), control al executării aplicaţiei, interfaţa
cu utilizatorul, navigare între înregistrări.
Editorul de macro-comenzi afişează pentru fiecare acţiune argumentele specifice şi atribuie
unora valori implicite.
3
4
Acţiuni pentru navigarea înregistrărilor bazei de date
5
Actiuni pentru controlul executiei aplicatiei
6
Crearea/executarea/modificarea obiectelor macro
Pentru a crea un obiect macro clic pe opţiunea Macro din tabul Macros&Code. Fiecare colecţie
de obiecte tip este desemnată printr-o etichetă distinctă şi se acţionează prin clic pe butonul care
efectuează comanda rapidă New. Ca efect pe ecran se afişează fereastra de editare Macro în
structura minimală.
În coloana Action, se trec acţiunile de executat, fiecare acţiune pe o linie distinctă. Precizarea
acţiunii se face prin selectare din lista derulantă afişată de Access.
Pentru fiecare acţiune selectată sunt precizate argumentele acţiunii în zona Action arguments
(pentru anumite argumente Access completează automat valorile implicite).
Precizarea valorilor argumentelor se realizează, de regulă, tot prin alegere din listele derulante
afişate de Access în funcţie de tipul acţiunii şi respectiv natura argumentului.
Coloana Comment este opţională; ea poate conţine explicaţii (comentarii) cu privire la acţiunea
selectată.
Exemplu : acţiunea OpenForm care la execuţie va deschide formularul intitulat Intr noi clienţi
(acest formular trebuie să fie creat înainte de a crea obiectul macro care conţine acţiunea de
deschidere a lui).
Obiectul macro creat se salvează prin comanda Save As din meniul File; moment în care se
redenumeşte obiectul macro prin tastarea numelui în zona de text Save Macro '… ' To din
caseta de de dialog Save As.
Numele Autoexec se poate atribui unui singur obiect macro dintr-o aplicaţie pentru a desemna
macro ce se execută automat la activarea aplicaţiei. Un obiect macro trebuie testat pentru a vedea
dacă acţiunile au fost corect programate.
Pentru testare, de regulă, se dă comanda ! Run din meniul Run ataşat ferestrei de editare a
obiectelor macro, sau se acţionează prin clic pe butonul de comandă Run cu pictograma ! din
bara cu instrumente asociate ferestrei de editare macro. Pentru a modifica conţinutul unui obiect
macro se deschide obiectul macro în mod Design. Modificările pot viza argumentele acţiunilor
existente, adăugarea de noi acţiuni, suprimarea unor acţiuni existente sau schimbarea ordinii
acestora.
7
Exemplu TransferDatabase:
Grupuri de macro-comenzi
Un obiect macro poate conţine grupuri de acţiuni separate prin una sau mai multe linii albe. În
acest caz fiecare grup este desemnat printr-un nume de macro. Toate acestea se vor memora în
acelaşi obiect macro.
Exemplu: obiectul macro Group macro care conţine două macro numite DescTabelaParteneri şi
respectiv DescTabelaProduse.
În cadrul aplicaţiei se poate lansa în execuţie fiecare macro din grup. Access califică o
macrocomandă din grup pe structura
8
• Obiectul macro Test Cod client în care sunt incluse acţiunile :
• MsgBox pentru a afişa mesajul „Cod client eronat” în cazul în care condiţia [Cod client] < 20
este îndeplinită;
• CancelEvent, pentru a anula evenimentul care a cauzat executarea obiectului macro.
Prin condiţionarea acţiunilor se poate simula structura alternativă (If.... Then .... Else...) după
modelul :
<Nume macro1>
<condiţie> RunMacro pentru a executa obiectul macro <Nume macro 2>
acţiune 2
.............
.............
acţiune n
<Nume macro2>
acţiune 11
acţiune 12
................
.............
Exemplu:
Se cere ca la deschiderea bazei de date numită GVFact (prescurtare de la gestiunea vânzărilor) să
se afişeze pe ecran formularul TB (tablou de bord) şi meniul personalizat GestiuneVanzări care
să includă comenzile Introducere facturi, Introducere clienţi şi Părăsire aplicaţie.
Primele două comenzi deschid formulare pentru a introduce/actualiza date privind facturile şi
respectiv clienţii. Pentru a putea adăuga un meniu personalizat la un formular se construieşte un
alt obiect macro(în exemplul luat numele dat obiectului macro este MPVanzări) în care se
precizează acţiunea AddMeniu cu argumentele:
• Macro Name Gestiune vânzări;
• Menu Macro Name Comenzi;
• Status Bar Text Gestiune vânzări
Meniul personalizat astfel descris se instalează precizând la proprietatea Menu Bar a
formularului numele obiectului macro care conţine acţiunile de adăugare meniuri.
Unui formular i se pot asocia unul sau mai multe meniuri personalizate. Formularului Tablou de
bord i se asociază trei meniuri personalizate :
• Introducere date, care conţine comenzile Clienti, Facturi şi respectiv Produse (fiecare
comandă deschide un formular pentru introducerea datelor;
• Listare rapoarte, care conţine comenzile pentru listarea rapoartelor tip solicitate de utilizator;
• Sfârşit, pentru părăsirea aplicaţiei Access (acţiunea Quit)
9
Notă: Aceleaşi comenzi se pot efectua şi prin intermediul evenimentului Click asupra butoanelor
de comandă prevăzute în zona de detaliu a formularului (Facturi, Produse, Clienţi şi respectiv
Produse facturate).
Comenzile meniurilor asociate sunt descrise în obiectele macro ComenziIntrDate,
ComenziListare şi respectiv Sfârsit.
Folosind obiectele tip macro care conţin acţiuni specifice meniurilor personalizate se pot crea
bare cu instrumente.
Access permite conversia conţinutului obiectelor macro în funcţii VBA (opţiunea Convert Macro
to Visual Basic din meniul Tools).
10
8.2. Elementele de bază ale limbajului de programare VBA –
Visual Basic for Application
S-au creat, pe baza nucleului de programare Basic, trei sisteme:
Microsoft Visual Basic (VB), ca limbaj universal de programare;
Visual Basic for Application (Visual Basic pentru aplicații), prescurtat uzual VBA, ca
un limbaj complex pentru dezvoltarea aplica_iilor în cadrul programelor din Microsoft
Office. Aceasta înseamna ca nucleul limbajului, componentele sale si mediul sunt
aceleasi în Access, Word sau Excel. VBA este aproape identic cu limbajul universal de
programare Microsoft Visual Basic;
Visual Basic Script (VB Script), utilizat în special pentru aplicațiile Internet.
11
În concluzie, desi comenzile macro pot da soluții rapide problemelor simple, limitarile lor
determină necesitatea folosirii limbajului VBA pentru dezvoltarea soluțiilor mai complexe.
a. Module specifice unui anumit formular sau raport. Modulele specifice unui formular sau
raport sunt în general numite coduri din spatele formularelor (Code Behind Forms –
CBF). Rutinele din acest loc pot fi vizibile (cunoscute, apelabile) doar din modulul
respectiv de cod. Codul din spatele formularului sau raportului se poate accesa prin
acționarea pictogramei specifice codului VBA (dupa selecția obiectului respectiv) sau prin
apasarea celor trei puncte (…) din dreptul unui eveniment al paginii respective a unui
obiect apar_inând formularului sau raportului respectiv.
Daca procedura eveniment nu este creata, atunci automat un Wizard va crea structura acesteia,
adica instrucțiunile de declarare si sfârsit precum si completarea listei de parametri daca este
cazul.
Daca procedura eveniment a fost creata anterior, atunci se va afisa porțiunea din pagina de cod a
formularului sau raportului care conține respectiva procedura.
b. Modulele globale (generale), se pot afisa prin acționarea paginii Module, din fereastra
Database.
Foarte important este faptul că rutinele scrise în această zona pot fi vizibile (dacă sunt declarate
Public) nu numai din toate modulele de cod ale aplicației, dar chiar din obiecte ale aplicației, din
formulare, rapoarte, cereri sau tabele.
Exemplu. Daca în modulul global se gaseste o funcție declarata public, cu numele 'Prag', aceasta
va putea fi folosita în expresii din orice:
− modul general sau din spatele unui formular sau raport;
− controale calculate din formulare sau rapoarte;
− proprietați ale controalelor sau ale tabelelor (de exemplu Validation Rule, Default Value);
− criterii din cereri;
− câmpuri calculate din cereri;
− practic de oriunde este acceptata o expresie.
De fapt, pentru a construi cu succes rutine în cod VBA, sunt foarte importante două lucruri:
• ce determina stabilirea domeniului de vizibilitate (valabilitate) al variabilelor si rutinelor;
• cum se transmit si se întorc valorile din rutine;
În concluzie, putem spune ca programarea în VBA nu este procedurala, adica nu avem de-a face
cu un program clasic, cu început si sfârsit, care rezolva pașii unui algoritm. Codul VBA este
practic format din rutine, care sunt executate numai atunci când se produc anumite evenimente.
Deci codul VBA implică realizarea unui programări discontinue.
13
• toate instrucțiunile au o anumita sintaxa care ține seama de numarul de rânduri pe care sunt
scrise;
• semnul de continuare a unui rând este format din doua caractere, spațiu si liniuța cu shift ( _ );
• semnul pentru începutul unui comentariu este apostroful ('). Sfârsitul comentariului este la
sfârsitul rândului.
a. Editarea rutinelor
Sunt oferite facilitațile curente de editare promovate de Microsoft în produsele sale. Există și mai
multe trucuri speciale destinate activității de programare, printre care:
− recunoasterea cuvintelor cheie ale limbajului;
− afisarea listelor cu proprietațile si metodele obiectelor utilizate;
− marcarea recunoasterii unei denumiri date de utilizator (unei variabile, rutine etc.) prin
refacerea formei introduse la declararea acesteia;
În VBA sistemul nu face deosebire între literele mari si mici. Daca la declararea unui obiect, sunt
folosite combinații de litere mari si mici, (după anumite convenții), atunci când se vor introduce
denumirile respective cu acelasi tip de litera, sistemul va reface forma inițiala a lor. În acest fel
programatorul va sesiza imediat eventualele greseli comise la introducerea denumirii obiectelor.
b. Compilarea rutinelor
Exista 3 comenzi de compilare :
− compilarea întregii aplicații si salvarea codului obiect rezultat;
− compilarea întregii aplicații dar fara modificarea codului obiect existent;
− compilarea numai a modulelor de cod deschise (încarcate în memorie).
Prezența erorilor de compilare este marcata punctual si este însoțită de informațiile necesare unei
depanări rapide.
De asemenea, sistemul încă din faza de editare semnalează imediat erorile de compilare
depistabile în acel moment (de exemplu cele referitoare la corectitudinea sintaxei instrucțiunilor).
c. Execuția dupa o comanda manuala (deci nu ca urmare a producerii unui eveniment)
a rutinelor
O rutină fara parametri se poate executa direct din modulul de cod. Acest lucru se face:
o prin plasarea cursorului pe instrucțiunea de la care se doreste începerea execuției; în felul
acesta rutina se poate executa pornind de la oricare dintre instrucțiunile sale executabile;
o prin acționarea uneia dintre cele 4 comenzi de RUN si anume:
− Run: execuția tuturor instrucțiunilor rutinei (eventual si a rutinelor apelate) fara oprire;
− Step Into: execuția tuturor instrucțiunilor rutinei (eventual si a rutinelor apelate) cu oprire
dupa fiecare instrucțiune executata;
− Step Over: execuția tuturor instrucțiunilor rutinei (eventual si a rutinelor apelate) cu oprire
dupa fiecare instrucțiune executată în rutina apelanta, dar fără oprire în rutinele apelate;
− Step Out: execuția tuturor instrucțiunilor pâna la sfârsitul rutinei principale, dar cu oprire
numai în rutinele de rang superior celei din care s-a dat aceasta comanda; se foloseste când se
doreste reluarea execuției dintr-o rutina apelata, dar fara oprire la instrucțiunile din aceasta.
14
Exemplu (Suma a doua numere):
Public Sub SumaNumere()
Dim A As Byte
Dim B As Byte
Dim C As Integer
A = 10
B = 16
C = A + B
MsgBox "Suma este" & C
End Sub
Un tip de date este noțiunea folosită pentru a defini mulțimea valorilor pe care le pot avea datele,
dimensiunea efectiva pe care o ocupa în memorie datele, precum si operațiile ce se pot efectua
asupra acestor date.
VBA pune la dispoziția programatorului tipuri de date predefinite (standard), cum ar fi cele
pentru numerele întregi, numerele reale, caractere sau booleene (logice), precum si posibilitatea
de declarare a unor tipuri de date proprii (definite de programator) cu ajutorul instrucțiunii Type.
Tipurile de date pot fi:
− elementare (simple) – o variabilă de acest tip va conține o singura valoare;
− structurate – o variabilă de acest tip va conține mai multe valori elementare.
15
Tipul de date ARRAY – tablou
Un Tablou – Array defineste o mulțime de valori care sunt de acelasi tip de data. Un Array, desi
se materializeaza printr-o singura variabila, poate stoca mai multe date de acelasi tip în
compartimentele (elementele) sale.
Structura unui asemenea tip poate avea o dimensiune sau mai multe.
Un Array se caracterizeaza prin 3 elemente dintre care primele doua definesc structura:
− numarul de dimensiuni;
− numarul de elemente (celule) ale fiecarei dimensiuni. Practic se foloseste numarul de ordine al
primului (implicit 0) si al ultimului element al fiecarei dimensiuni;
− tipul de date al elementelor tabloului. Poate fi orice tip de date, eventual chiar tot array.
Utilizarea tablourilor se face numai prin referirea fiecarui element în parte (folosind numele
tabloului indexat la elementul respectiv). Deci în VBA nu se pot efectua operații direct cu
întreaga structura a tabloului; de exemplu o mutare de date dintr-un tablou în altul cu aceeasi
structura se poate face numai prin mutarea separata a tuturor elementelor tabloului.
Tablourile de octeți constituie o excepție la ultima afirmație.
Exemplu. Pentru a stoca cheltuielile pe care le facem în fiecare zi a unui an vom declara o
singura variabila de tip Array, cu 365 elemente de tip numeric, 365 variabile individuale. Fiecare
element din tablou va conține o singura valoare. Implicit un tablou se indexeaza de la 0.
Declararea variabilei se va face:
Sub ExempluArray()
Dim cCheltuieli(364) As Currency
Dim intI As Integer
For intI = 0 to 99
cCheltuieli(intI) = 22
Next
End Sub
16
Referirea la variabilele de un tip definit de utilizator, se poate face:
− pentru întreaga structură (folosind numele variabilei);
− pentru fiecare element în parte (folosind numele elementului respectiv calificat – cu semnul
punct – cu numele variabilei).
Declararea unui tip de date nu se poate face decât la nivelul unui modul de cod. Deci nu se pot
declara tipuri de date la nivelul unei rutine.
Exemplu.
Option Compare Database
Option Explicit
Public Type Person 'se declara tipul de date la nivelul modulului
Nume As String
Prenume As String
Virsta As Integer
End Type
Sub TypeTest ()
Dim Primul As Person, Doilea As Person 'se declara 2 var. de tip Person
Primul.Nume = "Ionescu" 'se folosesc elementele tipului Person
Primul.Prenume = "Ion"
Primul.Virsta = 21
Doilea = Primul 'se transfera întregul tip de data Person
MsgBox Doilea.Nume & " " & Doilea.Prenume & ", _
varsta=" & Doilea.Virsta & " ani"' afiseaza si valoarea unei expresii
End Sub
8.5. Variabile
Variabilele sunt nume de locații de memorie care conțin valori de un anumit tip, ce se modifica
în timpul execuției programului. Variabilele se caracterizează prin:
Domeniul de vizibilitate: se refera la momentul când acestea apar si dispar din 'codul sursa'.
Variabilele apar atunci când sunt declarate prima data, dupa care apar si dispar în funcție de
domeniul lor de vizibilitate. În momentul când variabilele apar (devin vizibile), li se pot atribui
17
valori de un anumit tip si pot fi folosite în cadrul instrucțiunilor. În rest, ele sunt invizibile si nu
se pot referi.
Nespecificarea unui tip de date duce la crearea unor variabile de tip Variant.
Se pot declara mai multe variabile pe acelasi rând, separate prin virgula, dar este obligatorie
folosirea explicita a tipului de data pentru fiecare variabila.
O greseala obisnuita este declararea mai multor variabile pe aceeasi linie, fara a se specifica tipul
pentru fiecare variabila declarata ca în exemplul de mai jos.
În acest caz, numai ultima variabila este declarata ca o variabila de tip Integer (întreg). Celelalte
variabile sunt declarate de tipul Variant (tipul implicit al unei variabile este variant).
Aceasta eroare este foarte periculoasa, deoarece unele limbaje de programare (PASCAL),
folosesc o asemenea notare pentru a declara toate variabilele de pe aceeasi linie de acelasi tip.
18
Dim Anul As Variant ~ Dim Anul
Introducerea instrucțiunii declarative Option Explicit în fiecare modul, formular sau raport se
poate face automat prin activarea opțiunii Require Variable Declarations (cere declarații de
variabile) din meniul Tools | Options | Editor.
Cea mai eficienta si mai sigura metoda de declarare a variabilelor este de a folosi în totalitate
instrucțiunea declarativa Dim, pentru fiecare variabila, ca în exemplul urmator:
Asa cum se vede, acest tip de declarație conține atât numele variabilei, cât si tipul datelor pe care
le poate conține. Acest lucru permite compilatorului sa intercepteze erori de genul memorarii
unui sir într-o variabila de tip întreg.
De asemenea, prin selectarea celui mai scurt tip de date pentru fiecare variabila, se reduc
substanțial resursele necesare executarii programului.
Deci variabilele globale sunt vizibile din orice rutina aparținând modulului în care au fost
declarate.
Valoarea variabilei poate fi schimbata de orice subrutina sau funcție din modulul respectiv.
19
În urmatorul exemplu variabila globala miCounter:
− ia valoarea 20 în procedura Fact20;
− ia valoarea 10 în procedura Fact10;
− este afisata valoarea care se gaseste în ea în procedura Afisez.
Observații:
− convenția de numire a variabilei modale prin folosirea literei m ca prefix al numelui acesteia.
Aceasta o face sa fie usor recunoscuta de programator ca o variabila de nivel modul (globala);
− folosim declarațiile de nivel modul numai pentru variabilele care trebuie sa fie vazute din mai
multe rutine;
− încercăm să evităm (atunci când este posibil) utilizarea variabilelor globale. Această metodă
face codul mai modular si mai usor de depanat.
Pentru declararea variabilelor publice se foloseste cuvântul cheie PUBLIC, în loc de DIM.
Option Explicit
Public piCounter As Integer
De obicei, convențional se indică tipul public al unei variabile, folosind prefixul p la numele
acesteia. Rutina următoare, atașata evenimentului Click al butonului de comanda cmdPublic,
dupa ce face 50 variabila publica piCounter, o afiseaza.
Se poate folosi cuvântul cheie PRIVATE, în loc de DIM, pentru a declara variabile private în
secțiunea de declarații generale a modulului de cod, adica variabile care nu sunt vizibile decât de
rutinele aparținând modulului respectiv de cod.
Variabile Statice
Variabile statice se pot declara numai în rutine, prin folosirea cuvântului cheie STATIC, în loc
de cuvântul cheie DIM. Variabilele statice au proprietatea de a-si pastra valoarea între două
apeluri ale rutinei în care au fost declarate.
Exemplul următor ilustrează diferența dintre variabilele locale si cele statice. Deoarece
variabilele locale sunt inițializate la fiecare apel al codului, de fiecare data când se execută
aceasta procedura, se va afisa numarul 1.
De fiecare data când acest cod este executat, instruc_iunea declarativa Dim defineste variabila
iCounter si o inițializeaza cu 0.
Ea este puțin diferita fața de urmatoarea secvența de cod, care ilustreaza folosirea variabilelor
statice:
De fiecare data când acest cod este executat, variabila cu numele iCounter este incrementata si
reținuta. Deci la prima execuție se va afsa 1, la a doua se va afisa 2, la a treia se va afisa 3 etc.
Practic o variabila statica este definita numai la primul apel al rutinei în care a fost declarata.
Deoarece, fiind statica, nu mai este distrusa la terminarea rutinei, la urmatoarea apelare nu va
mai fi definita si va avea deci valoarea anterioara apelului.
21
determinând ca variabila respectiva sa fie locala, modala (globala) sau publica si sa poata fi
folosita numai într-o rutina, la nivelul unui modul de cod sau în toate modulele de cod.
Ar trebui făcut tot posibilul ca majoritatea variabilelor din cod să fie locale, deoarece acestea
sunt ferite de o eventuala modificare (accidentala) de catre alte rutine.
Durata de viață sau valabilitate a variabilelor reprezinta, asa cum am mai aratat, timpul cât
variabila are alocat spațiu în memorie. Fara alte instrucțiuni speciale, o variabila se creeaza în
momentul în care modulul în care este declarata, este apelata si dispare (se distruge, elibereaza
spațiul de memorie ocupat) în momentul terminarii modulului respectiv.
Astfel:
− variabila locala, declarată într-o procedura eveniment, va fi alocata numai în timpul
execuțieiprocedurii respective (bineînțeles daca nu este statica);
− variabila globala, declarata într-un modul de cod al unui formular, va fi alocata cât timp
formularul respectiv va fi în execuție;
− variabila publica, declarata într-un modul general de cod va fi alocata în tot timpul execuției
aplicației.
Asa cum se observa, marginea de jos a indicelui a fost omisa. Ea implicit se considera a avea
valoarea 0. Totusi marginea de jos a indicelui se poate fixa la valoarea 1, daca este introdusa în
modulul respectiv de cod, în secțiunea de declarații generale, instrucțiunea declarativa Option
Base 1.
Exemplu. Declarația
Dim MyArray (9, 10) As Integer
va crea un tabel cu 2 dimensiuni, cu 10 si respectiv 11 elemente, cu primul indice cu valori între
(0 - 9) si al doilea indice cu valori între (0 - 10), în care toate cele 110 elemente (celule) sunt de
tip Integer.
Ca orice declarație care nu specifica tipul, si tablourile declarate fara tip sunt de tip Variant. În
acest caz, fiind Variant, fiecare element va ocupa 16 bytes daca este numeric sau 22 bytes daca
este string. Deci la tablouri mari se poate ajunge la un consum mare de memorie, ceea ce trebuie
sa determine o rezerva în folosirea tablourilor de Variant.
22
În timp ce tablourile cu dimensiuni fixe vor ocupa din etapa de compilare o anumita dimensiune
de memorie care nu mai poate fi modificata în timpul execuției, tablourile dinamice pot sa-si
modifice dimensiunile în timpul execuției.
Un tablou dinamic se declara la fel, cu Static, Dim, Private sau Public, făra însa a se specifica
nimic între paranteze.
Dim NumeTablou () As TipDeData
Cu instrucțiunea executabila ReDim (cu o structura asemanatoare cu cea a lui Dim), care se
poate plasa oriunde în cod dupa declararea unui tablou dinamic, se va redimensiona în momentul
execuției acesteia tabloul cu noile dimensiuni, eventual putându-se schimba si tipul de date.
Instrucțiunea ReDim provoaca pierderea datelor din tabloul pe care îl redimensionam. Pentru a se
evita acest lucru se poate folosi clauza Preserve. Folosirea acestei clauze nu permite însa
modificarea numarului de dimensiuni sau a marginii de jos ai indecsilor.
Utilizarea tablourilor
Un tablou poate fi utilizat ca orice variabila simpla de tipul respectiv. Referirea unui element al
tabloului se face prin numele tabloului, urmat între paranteze de indicele (indicii) elementului
respectiv.
Exemplu.
Sub FillArrayMulti ()
Dim intI As Integer, intJ As Integer
Dim sngMulti (1 To 5, 1 To 10) As Single
For intI = 1 To 5
For intJ = 1 To 10
sngMulti (intI, intJ) = intI * intJ ' indroduce în fiecare element _
produsul indicilor elementului.
' afiseaza indicii elementului si valoarea din acesta.
MsgBox " Tablou ( " & intI & ", " & intJ & " ) = " & sngMulti
(intI, intJ)
Next intJ
Next intI
End Sub
23
8.6. Constante
Prin declararea unei constante, se poate atribui unui nume, o valoare. Aceasta se face prin
instrucțiunea declarativa Const. Dupa declarare, o constanta nu îsi mai poate modifica valoarea.
Exemplu. Public Const conAge As Integer = 34 ' conAge este o constanta _ Publica, Integer, cu
valoarea 34.
24
− Instrucțiuni executabile, care reprezinta descrierea unei acțiuni pe care o va efectua sistemul
de calcul, în special privind datele aplica_iei (If, For, Do etc.).
Ca exemplu de operații pe care le face unitatea centrala a sistemului de calcul sunt operațiile de
adunare, scadere, citire, scriere, comparație, etc.
Limbajele moderne de programare au un set redus de instrucțiuni complexe:
− declararea structurilor de date;
− instrucțiunea de atribuire – prin care se calculeaza expresii;
− structurile de control – prin care se determina "traseul" printre instrucțiuni, adica ordinea în
care se executa instrucțiunile;
− declararea si apelarea rutinelor;
− crearea modulelor de clase de obiecte;
− crearea si manipularea obiectelor.
Practic, instrucțiunile executabile ale limbajelor moderne de programare sunt instrucțiunea de
atribuire si instrucțiunile prin care se realizeaza structurile de control. Alte operații necesare
unei aplicații (ca de exemplu executarea opera_iilor de Input/ Output), sunt realizate prin rutine
din bibliotecile de obiecte, funcții si proceduri disponibile limbajului respectiv de programare.
Totusi compilatorul încearcă trecerea peste anumite incompatibilitați, a căror rezolvare este
evidentă, efectuând automat conversiile între tipuri diferite de date, daca este posibil.
Exemplu.
25
Vstr = Vnr + "ABC" ' va produce eroare de execuție – TYPE-MISMATCH; nu se
poate efectua adunarea.
Vstr = Vnr & "ABC" ' nu produce eroare.
Vnr = "ABC" ' va produce eroare de execuție – TYPE MISMATCH
End Sub
Operatorii sunt asezați de la stânga la dreapta în ordinea prioritații lor în execuție, care este în
general cea obisnuita din matematica. Parantezele rotunde sunt folosite pentru stabilirea unei
ordini explicite a prioritații în execuție a operațiilor.
Asa cum am mai aratat, daca un termen al unei expresii este NULL, atunci si rezultatul expresiei
este tot NULL. Spunem ca NULL-ul se propaga în expresii. Totusi exista o excep_ie, si anume la
operatorul de concatenare a sirurilor, &: daca un termen este NULL, iar celalalt nu este NULL,
atunci rezultatul va fi chiar termenul diferit de NULL.
Valoarea EMPTY în expresii este considerata, în func_ie de tipul de date pe care îl reprezinta,
chiar valoarea cu care se ini_ializeaza variabilele de tipul respectiv (astfel, în expresii, daca un
termen numeric este EMPTY, atunci se va considera = 0; daca este logic = False; daca este string
= sir vid; etc.).
Structura secvențială
Reprezinta execuția secvențiala a instrucțiunilor, în ordinea în care au fost scrise. Nu necesita
folosirea unei instrucțiuni.
26
Structura al ternativă
Reprezinta execuția din mai multe grupuri de instrucțiuni introduse numai a unui singur grup, în
funcție de evaluarea unor condiții.
If condiție Then
Grup 1 de instrucțiuni
[Else
Grup 2 de instrucțiuni]
End IF
Structura If... Then... Else evalueaza daca condiția este adevarata sau falsa. Daca:
condiția este adevarata, vor fi executate toate instrucțiunile dintre If si Else (Grup 1 de
instrucțiuni);
condiția este falsa, vor fi executate toate instrucțiunile dintre Else si End If (Grup 2 de
instrucțiuni).
Folosirea clauzei Else este opționala. O condiție cu rezultatul NULL este tratata ca si cum ar fi
FALSE.
Exemplu.
Private Sub cmdIf_Click () ' evenimentul click al unui buton de comanda
If IsNull(Me!txtValue) Then ' Condiția testeaza daca în controlul txtValue, este
introdusa o valoare. Acest lucru se face cu funcția IsNULL, studiata în alt modul
MsgBox "Trebuie sa introduceti o valoare"
Else
27
MsgBox "Ati introdus:" & Me!txtValue
End If
End Sub
Aceasta instrucțiune evalueaza mai multe condiții formate prin verificarea egalitaților între
valoarea variabilei atasate instrucțiunii (NumeVariabila), si valorile din dreptul cuvintelor cheie
CASE (ValoareI).
Condițiile sunt evaluate pe rând, în ordinea plasarii lor în instrucțiune, pâna când se gaseste una
adevarata. Dupa gasirea unei condiții advarate atunci se va executa grupul corespunzator de
instrucțiuni, dupa care instrucțiunea Select Case se termina, programul continuând cu prima
instrucțiune plasata dupa aceasta.
Daca toate condițiile sunt false atunci se vor executa – daca exista – instrucțiunile dintre Else ….
End Select (Grup else de instrucțiuni).
Daca mai multe condiții sunt adevarate, atunci se va executa numai un singur grup de instrucțiuni
si anume cel aflat dupa prima condiție gasita adevarata.
Exemplu.
Procedura urmatoare este atasata evenimentului Click a unui buton de comanda cu numele
cmdCase, care se afla într-un formular, în care se mai afla si un control textbox cu numele
txtValue. Aceasta secvența se va executa numai atunci când se va face click pe butonul de
comanda cu numele cmdCase.
Private Sub cmdCase_Click ()
Dim IResponse As Integer
' Me!NumeControl este o expresie prin care se acceseaza datele aflate _ într-un control plasat în
formularul respectiv.
' Un control se comporta ca o variabila de tip variant.
' Daca controlul este NULL atunci nu este introdusa nici o valoare.
If IsNull(Me!txtValue) Then
iResponse = 0
Else
IResponse = Val(Me!txtValue) 'VAL transforma în numar un string.
End If
Select Case iResponse
Case 0
MsgBox "Trebuie sa introduceti un numar"
Case 1 To 5
MsgBox "Ati introdus o valoare intre 1 si 5"
Case 7, 11, 21
MsgBox "Ati introdus 7, 11 sau 21"
Case Else
MsgBox "Ati introdus un numar incorect"
End Select
End Sub
29
Aceasta procedura utilizeaza în prima parte o instrucțiune If pentru a evalua daca txtValue este
Null, caz în care se memoreaza un zero într-o variabila numita iResponse. În caz contrar,
valoarea conținuta în controlul txtValue este memorata în iResponse. Instrucțiunea Case
evalueaza conținutul variabilei iResponse. Daca valoarea este 0, este afisata o caseta de text cu
mesajul "Trebuie sa introduceți un numar".
Daca valoarea este între 1 si 5 inclusiv, este afisata o caseta de text conținând mesajul "Ați
introdus o valoare între 1 si 5". Daca utilizatorul introduce 7, 11 sau 21, este afisat un mesaj
corespunzator. În celelalte cazuri, utilizatorul primeste un mesaj care indica introducerea unui
numar incorect.
Folosirea clauzei Else este opționala. O condiție cu rezultatul NULL este tratata ca si cum ar fi
FALSE.
Exemplu.
Sub TestElseIf()
Dim V1 As String
Dim V2 As String
V1 = InputBox("V1=")
V2 = InputBox("V2=")
If V1 = "" Then 'nu se introduce valoare în V1- sir gol
MsgBox "In V1 nu este nici o valoare"
ElseIf V2 = "" Then
MsgBox "In V1 este ceva, dar nu si in V2"
Else
MsgBox "Valorile introduse:V1=" & V1 & "; V2=" & V2
End If
End Sub
30
Structura repetitivă
Reprezinta execuția repetata a unui anumit grup de instrucțiuni, numit ciclu sau bucla, pâna când
o condiție ia o anumita valoare.
Instrucțiunea Exit Do provoaca iesirea forțata din ciclu. De obicei se executa în funcție de
evaluarea unei condiții într-o instrucțiune IF.
Este permisa folosirea instrucțiunii Do si fara nici o condiție. În acest caz este obligatorie
inserarea în ciclul Do a unei instrucțiuni Exit Do sau Exit Sub | Function, pentru a nu se genera
un ciclu fara sfârsit.
Condiția este evaluata în funcție de locul unde este plasata în instrucțiune si anume:
− la prima forma a instrucțiunii (cea din stânga) – înaintea executarii ciclului;
− la a doua forma a instrucțiunii (cea din dreapta) – dupa executarea ciclului.
Ciclul se executa minim de la:
− prima forma a instrucțiunii (cea din stânga) – se poate ca ciclul sa nu se execute de loc;
− a doua forma a instrucțiunii (cea din dreapta) – ciclul se va executa minim o data.
31
Exemplu.
Private Sub cmdLoop1_Click ()
Dim iCounter As Integer
iCounter = 1
Do While iCounter < 5
MsgBox iCounter
ICounter = iCounter + 1
Loop
End Sub
Daca secvența de cod trebuie sa fie executata necondiționat cel puțin o data, se va folosi
urmatoarea structura:
Exemplu.
Private Sub cmdLoop2_Click ()
Dim iCounter As Integer
iCounter = 5
Do
MsgBox iCounter
ICounter = iCounter + 1
Loop While iCounter < 5
End Sub
Procedura va afisa un mesaj cu numarul 5. Acest cod va fi executat cel puțin o data, indiferent de
valoarea din iCounter, deoarece evaluarea condiției se face dupa executatea ciclului.
Structura Do... Loop While|Until face evaluarea condiției dupa executarea ciclului si de aceea
execuția acestuia este asigurata cel puțin o data.
32
b) Structura repetitiva cu contor. Instrucț iunea For…Next
Repeta un ciclu de un anumit numar de ori.
a) se determina în funcție de valoarea (pozitiva sau negativa) pe care o are pasul (step), condiția
de terminare a ciclului si anume:
− Daca PAS >=0, condiția va fi: contor > end;
− Daca PAS < 0, condiția va fi: contor < end;
33
Exemplu :
For I = 1 To 10
For J = 1 To 10
For K = 1 To 10
...
Next K
Next J
Next I
Într-un For trebuie evitată schimbarea valorii contorului. Structura For... Next este folosită
atunci când sunt un numar exact de iterații de executat.
Exemplu.
Private Sub cmdForNext_Click ()
Dim iCounter As Integer
For iCounter = 1 To 5
MsgBox iCounter
Next iCounter
End Sub
Exemplu.
Private Sub cmdForNext_Click ()
Dim iCounter As Integer
For iCounter = 5 To 1 Step -1
MsgBox iCounter
Next iCounter
End Sub
34
Capitolul 9. Rapoarte
Un raport reprezintă un mod formatat şi organizat de prezentare al datelor. Majoritatea
SGBD-urilor dispun de constructori specifici, ce permit proiectarea şi generarea de
rapoarte.
Rapoartele sunt informaţia care poate fi extrasă din tabele şi sau interogări/vederi, ce
poate fi afişată într-un mod organizat şi formatat, fie pe ecran , fie imprimat, fie stocat în
cadrul unor fişiere text.
Ca obiect, un raport are două componente:
Componenta de date – include sursele de date ce susţin raportul
Componenta de vizualizare – constă în benzi şi zone, precum şi în obiecte ce
fac legătura cu sursele de date ale raportului.
După cum se poate vedea în Figura 9.1, există mai multe moduri de a crea un raport şi
anume:
Report – se va construi în mod automat un nou raport (folosind configurările
implicite) pentru obiectul selectat din cadrul listei de obiecte;
Labels – duce la construirea asistată a unui set de etichete cu ajutorul
utilitarului Label Wizard care au ca sursa de date o tabelă sau o interogare din
baza de date. Se pot selecta diverse dimensiuni ale etichetei, diverse formatări
ale caracterelor, etc;
Blank Report – permite construirea unui nou raport. Câmpurile existente în
cadrul tabelelor bazei de date se vor introduce în macheta raportului prin
metoda drag-and-drop;
Report Wizard – permite construirea asistată a unui nou raport folosind
utilitarul Report Wizard;
Report Design – permite construirea unui nou raport pornind de la zero. Oferă
o liberate totală în ceea ce priveşte configurarea proprietăţilor raportului şi a
obiectelor din acesta.
Pasul al doilea permite gruparea datelor, utilizatorul poate alege, dintre câmpurile
selectate anterior, un indicator care să constituie criteriul de grupare a datelor. În partea
dreaptă a ferestrei sunt indicate câmpurile selectate, în ordinea stabilirii lor în pasul
anterior. În cazul în care se doreşte ca un câmp anume (din partea stângă a ferestrei) să
devină cheie de grupare, acest câmp se instalează în partea dreaptă, ca şi cap de pagină
într-un chenar distinct, iar celelalte câmpuri se aliniază mai jos.
Fig. 9.3. Pasul 2 din Report Wizard
Pasul 5 permite alegerea, dintre stilurile predefinite, a stilului de tipărire pe care dorim să-l
conţină raportul.
Pe ecran va fi afişată filele Report Design Tools – Design, Report Design Tools –
Arrange şi Report Design Tools – Page Setup corespunzătoare constructorului de
rapoarte, cu ajutorul cărora putem realiza diferite modificări în raport. Pentru a introduce
un text în antet sau în subsol, va trebui, cu ajutorul mouse-ului, să selectăm antetul sau
subsolul, să efectuăm click pe obiectul dorit (de obicei o etichetă) şi apoi, în spaţiul creat,
să introducem textul dorit.
Gruparea datelor
Dacă în momentul în care am creat raportul nu am dorit gruparea datelor după diferite
criterii, putem realiza acest lucru cu ajutorul comenzii Sorting and Groupping. Această
comandă poate fi apelată din fila Report Design Tools – Design. Pe ecran va apărea
fereastra Sorting and Grouping în care putem alege ce dorim să realizăm: gruparea
datelor, sau sortarea lor. În cazul grupării datelor (analog se procedează şi în cazul sortării),
din lista Select Field alegem câmpul după care dorim să realizăm grupul. Se mai pot
selecta:
ordinea în care se afişează datele în cadrul grupului;
modul efectiv de grupare a datelor care depinde de tipul fiecărui câmp şi de valorile
deja introduse (de exemplu, în cazul unui câmp denumit data_facturii poate exista
opţiunea grupării datelor pe trimeste);
dacă fiecare grup va conţine sub-totaluri;
dacă fiecare grupare ca avea un titlu;
dacă fiecare grupare va avea o zonă de antet sau de subsol;
dacă un grup trebuie forţat să apară pe aceeaşi pagină sau poate apărea pe pagini
diferite.
Imprimarea rezultatelor
Un lucru important, înaintea imprimării, îl reprezintă vizualizarea datelor care vor fi
imprimate. Vizualizarea înaintea imprimării se realizează cu ajutorul meniului operaţiunii
Print Preview din fila Home – View – Print Preview. Cu aceasta comandă putem vizualiza
datele din tabele, formulare sau rapoarte.
După prelucrarea datelor, dacă dorim imprimarea acestora, avem foarte multe opţiuni
referitoare la setarea paginii. Aceste opţiuni le putem alege sau modifica din fila Print
Preview (dacă se realizează vizualizarea înaintea imprimării) sau din fila cu ajutorul
Report Design Tools – Page Setup dacă se realizează modificarea design-ului raportului).
Opţiunea Page Setup oferă accesul la fereastra cu acelaşi nume din care se pot modifica
opţiuni ca mărimea marginilor paginii, mărimea paginii, orientarea ei precum şi numărul
de coloane care va fi afişat în cadrul paginii sau spaţierea rândurilor. Din fila Report
Design Tools este posibilă selectarea unor parametrii legaţi de orientarea scrisului în
pagină (pe lung - Portrait sau pe lat- Landscape), cât şi dimensiunea paginii (A4 , letter,
legal, executive şi altele). Dacă se doreşte doar listarea datelor se poate alege opţiunea
Print Data Only.
Din fereastra Print, putem alege imprimarea datelor din diferite interogări sau rapoarte.
Selectarea anumitor înregistrări se poate realiza cu ajutorul opţiunii Selected Record(s) din
fereastra Print. Putem, de asemenea, crea un fişier de imprimare folosind una din opţiunile
din secţiunea Data, în cazul în care raportul este vizualizat înainta imprimării (Print
Preview). De exemplu, se poate genera un fisier PDF, Word sau chiar de tip TXT (se va
genera un fişier de tip text utilizabil în orice editor de texte).
Figura 9.16. Posibilităţi de imprimare/export a datelor