Sunteți pe pagina 1din 188

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ă

Capitolul 1 – Fundamentele Bazelor de Date

1.1. Nevoia pentru baze de date


Bazele de date reprezintă o realitate comună a vieţii noastre. În mod conştient sau nu,
simţim prezenţa acestora pretutindeni indiferent de forma lor de prezentare, fie că sunt
primitive sau avansate, de dimensiuni mici sau colosale, locale sau la distanţă,
centralizate sau distribuite, omogene sau heterogene. Email-urile, sms-urile sau
agendele telefoanelor mobile, tonurile de apel, paginile web returnate de motoarele de
căutare, stocurile sau vânzările unui hipermarket, sunt toate exemple a ceea ce o bază
de date poate stoca şi gestiona. Este imposibil de conceput ca mediul economic şi cel
de afaceri să poată face faţă realităţii fără suportul de nădejde al bazelor de date.
Anterior bazelor de date, sistemele bazate pe fişierele clasice – numite şi fişiere plate
– controlau aproape în totalitate spaţiul virtual al acelor vremuri. Necesităţile mereu în
sporită creştere şi complexitatea au condus la un volum incontrolabil de informaţii (de
fapt, fişiere) cu un risc crescut în ceea ce priveşte chiar securitatea afacerii în sine.
Dezavantajele principale ale sistemelor de fişiere clasice sunt
[Niţchi&Racoviţan1996]:
Redundanţa – reprezintă acea proprietate a informaţiei de a fi replicată
necontrolat în diverse locaţii (în diferite regiuni ale unui fişier, în fişiere diferite, sau
în acelaşi fişier stocat într-o altă locaţie). De exemplu, putem avea toate informaţiile
de contact ale angajatului Pop Ion atât în fişierele ce conţin contractele de muncă de la
biroul de personal, în fişierele de la secretariatul companiei care gestionează agenda
fiecărui angajat, cât şi în fişierele generate de operaţiunile de pontaj individual sau
colectiv, sau de managementul timpului efectiv de lucru etc.
Inconsistenţa – este proprietatea ca aceeaşi informaţie să fie memorată diferit
în diverse locaţii. În spaţiul IT&C acest fenomen poate să apară mult mai frecvent
decât în realitate. Astfel, o persoană poate discerne faptul că “Număr”, “număr”,
“Nr.”, “#” reprezintă în general acelaşi lucru, pe când o „maşină” s-ar putea să nu fie
de aceeaşi părere. În locul păstrării unor copii identice ale aceleiaşi informaţie, fie se
preferă uneori abrevierile, operatorul poate tasta incorect din greşeală, unele conversii
de date pot eşua ş.a.m.d. Redundanţa este cauza principală a inconsistenţei
Validarea datelor – într-un sistem bazat pe fişiere clasice, validarea la nivel de
date se poate realiza doar prin programare. Nu toată lumea – persoane din diferite
departamente – are aceeaşi viziune asupra afacerii şi pot instaura diferite
moduri/reguli de validare ale aceluiaşi tip de date, dar aflate în fişiere diferite. Acest
tip de inconsistenţă în aplicarea metodelor poate duce mai devreme sau mai târziu la
coruperea unui întreg sistem
Disponibilitatea şi securitatea datelor – e în natura firească a oricărui
utilizator de a dori să deţină un control mai sever asupra datelor din propria gestiune.
Acest comportament are un efect negativ asupra disponibilităţii datelor deoarece alţi
utilizatori nu vor putea accesa acele date. În altă ordine de idei, fără existenţa unui
control la nivel centralizat, securitatea datelor poate fi foarte redusă.

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.

O bază de date reprezintă un sistem integrat, coerent de fişiere partajabile.

Integrare. Întreaga bază de date poate fi considerată un sistem unificat şi logic de


fişiere în care fiecare utilizator are propria viziune asupra modului de reprezentare a
datelor stocate. În aceeaşi bază de date putem avea deci un fişier în care sunt
memorate produsele, într-un altul partenerii, iar în altul tranzacţiile de produse între
parteneri; un fişier ce conţine datele de identificare ale studenţilor, în altul profesorii,
în altul disciplinele şi în altul notele luate de studenţi la examene; dar nu vom avea o
bază de date care să conţină studenţii şi tranzacţiile, sau partenerii şi notele la
examene.
Coerenţă. Datele nu sunt redundante şi sunt reprezentate în baza în raport cu aceleaşi
reguli sau principii.
Resurse partajate. Porţiuni sau întreaga bază de date pot fi accesate concomitent de
mai mulţi utilizatori.

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ă

rareori – uneori niciodată – în timp ce operaţiile de actualizare sunt frecvente,


periodicitatea depinzând de specificul şi succesul domeniului de activitate oglindit în
acea bază de date.

Un ansamblu de programe sau un mediu avansat de programare destinat


managementului datelor din cadrul unei baze de date, poartă numele de Sistem de
Gestiune al Bazelor de Date (SGBD). Operaţiile care pot fi executate de către un
astfel de sistem sunt popularea cu date, actualizarea, regăsirea, precum şi cele care
afectează schema. Principalii actori în industria bazelor de date sunt: Oracle, MS SQL
Server, MySQL, Informix, Ingres, Magic, xBase, MS FoxPro, MS Access etc.
Aproape toate SGBD-urile au limbaje proprii de programare, care nu numai că oferă
instrumente pentru gestiunea efectivă a bazelor de date, ci pun la dispoziţie
instrucţiuni, structuri de programare sau componente vizuale specifice limbajelor de
programare generale.
Potrivit lui C.J. Date [Date 2005], un sistem de gestiune al bazelor de date are
următoarele componente:
 Sistemul de gestiune al fişierelor la nivel fizic oferă managementul alocării
zonelor de memorie pe discurile fizice, descrierea şi gestiunea structurilor fizice de
date;
 Sistemul de gestiune al fişierelor la nivel logic legătura dintre datele fizice şi
structurile bazei de date;
 Limbajul de manipulare al datelor (DML2) şi translatorul acestuia;
 Limbajul de definire al datelor (DDL3) şi translatorul acestuia;
 Limbajul de consultare sau interogare al datelor (QL4) şi procesorul său,
care traduce instrucţiunile limbajului de interogare în instrucţiuni adresate sistemului
de gestiune al fişierelor la nivel logic;
 Componentele de interfaţă pentru alte programe sau aplicaţii
 Componente de asigurare a serviciilor, ca de exemplu securitatea,
jurnalizarea operaţiilor sau auditul accesului etc.

Un SGBD are următoarele funcţii principale:


 Funcţia de definire a datelor. Aceasta permite, într-un mod specific pentru
fiecare SGBD în parte, descrierea structurii de date şi a relaţiilor dintre entităţi,
utilizând componenta DDL;
 Funcţia de manipulare. Ea realizează popularea, actualizarea şi interogarea
datelor sau a diverselor obiecte ale bazei de date, prin utilizarea componentelor DML
şi QL;
 Funcţia de utilizare. Trebuie să fie puse la dispoziţia utilizatorului diverse
modalităţi de interacţiune cu sistemul. Acest “dialog” poate fi facilitat prin comenzi,
meniuri, ferestre etc.

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ă

 În linii mari, putem concluziona că SGBD-ul oferă utilizatorului, prin


componentele sale, instrumentele necesare transformării datelor în informaţii utile.

1.2. Arhitectura unei baze de date


În vederea utilizării acestora la scară largă şi crearea premiselor pentru
interconectare cu alte sisteme, bazele de date – precum multe alte lucruri din domeniul
IT şi nu numai – necesită şi ele standardizare. O propunere iniţială a venit din partea
Database Task Group (DBTG) în 1971. Această organizaţie a definit o arhitectură
bazată pe două nivele: schemă şi subschemă. Ulterior, în 1975, a apărut o nouă
abordare, acea cu trei nivele: extern, conceptual şi intern. Această idee a venit
pentru a separa viziunea utilizatorului de detaliile implementării fizice. Rezultatul a
fost arhitectura cunoscută sub denumirea ANSI5-SPARC6, proiectată pentru sistemele
de baze de date centralizate7.
Chiar dacă ambiţia declarată a celor două organisme referitoare la sistemele
menţionate mergea până la standardizarea proiectării lor, propunerea făcută a jucat
până la urmă doar rolul de arhitectură de referinţă, dar foarte răspândită în mediile
academice şi chiar şi în practică fiind îmbrăţişată de unii proiectanţi sau furnizori de
baze de date. [Connolly et al. 2001]

Nivelul Schema externă Schema externă … Schema externă


Extern #1 #2 #n
Producţie Vânzări Contabilitate

Nivelul Schema
conceptual conceptuală

Nivelul Schema internă


intern

Figura 1. 1 – Arhitectura unei baze de date

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ă

sunt văzute şi întelese de către o anumită categorie de utilizatori (utilizatori ai unui


departament, operatori, programatori etc.).

Luând ca exemplu baza de date a unei companii care comercializează bunuri,


putem avea utilizatori – gestionari, persoane însărcinate cu aprovizionarea – pe care-i
priveşte doar detaliile tehnice ale nomenclatorului curent de produse (Cod_Produs,
UPC8 sau EAN9, Furnizor_Descriere, Cost, Stoc); contabilul este interesat de conturile
utilizate când un item este produs, cumpărat sau vândut, soldul conturilor de inventar,
producţie sau valorificare implicate; directorul de vânzări trebuie să deţină informaţii
de diferite nivele de sumarizare privitoare la vânzări, precum Nr_Comanda,
Nr_Factura, Client, Client_DataCreare, Status_Client, Discount_Volum, vânzări pe o
perioadă, clasamente vânzători etc; reprezentantul de vânzări trebuie să gestioneze
toate informaţiile de detaliu privind tranzacţiile de care este răspunzător: Cod_Produs,
Client_Descriere Marime, Culoare, Pret_Vanzare, Produs_NivelDiscount,
Cant_Comandata, Cant_Livrata ş.a.m.d. E inevitabil ca în cazul unei companii mari
sau cu activităţi complexe, diferite categorii de utilizatori să aibă viziuni diferite
asupra aceloraşi aspecte (sinonime: Angajati, Personal, Ang, Pers; User, Utilizator;
Stoc, Sold, Balanta), sau să refere diferit itemi sau operaţii identice (omonime).
În plus, nu numai că acelaşi lucru poate fi „văzut” ca diferit de utilizatori
diferiţi, ba chiar de către acelaşi utilizator în momente diferite de timp (un produs
poate fi identificat de către cei de la depozit fie prin codul produsului, fie prin codul
de bare, fie prin descrierea dată de furnizor; pe când un vânzător utilizează codul,
descrierea folosită de client, care poate diferi de cea a producătorului, deşi sunt
asociate aceluiaşi produs).
Pot exista diferenţe şi în modul în care sunt reprezentate anumite informaţii,
pentru a fi mai familiare celui care le utilizează mai frecvent. Astfel, poate unii
reprezentanţi de vânzări preferă să folosească o denumire de produs agregate, care să
conţină şi caracteristicile tehnice – includerea dimensiunii, culorii, mărcii – în timp ce
cei de la depozit să prefere denumirea atomică, celelalte atribute fiind reprezentate
separat. Tratarea acestor aspecte dependente de utilizator, poate fi rezolvată prin
utilizarea vederilor10.
Nivelul conceptual – uneori denumit şi nivelul logic, virtual sau semantic –
reprezintă unificarea semantică a tuturor schemelor externe individuale, pentru a
furniza o perspectivă globală asupra întregii baze de date, cunoscută doar de
administratorul sau proiectantul bazei de date. Acest nivel are ca sarcină şi gestiunea
constrângerilor de integritate şi securitatea. Nivelul conceptual este unul intermediar
între celelalte două. Aproape niciodată această schemă nu va fi identică cu vreuna din
schemele externe ale bazei de date.

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ă

Nivelul intern – reprezintă nivelul inferior din cadrul unei arhitecturi


ANSI/SPARC şi permite ca baza de date să fie descrisă într-un mod apropiat nivelului
fizic de reprezentare al datelor, dar nu până la detaliile fizice, precum blocuri, pagini,
sectoare, piste. Utilizatorul nu se preocupă de modul de acces la date sau de
organizarea acestora. Schema internă indică modul de implementare al unei scheme
conceptuale prin utilizarea unui anume SGBD, precum MS Access sau MS Visual
FoxPro. Schemele interne definesc tipul articolelor stocate, indecşii, modul în care
sunt reprezentate atributele, numerele de secvenţă etc.

Literatură menţionează de asemenea de un al patrulea nivel, nivelul fizic, care


după unii autori este considerat sinonim sau parte integrantă a celui intern.

1.3. Modele de reprezentare ale datelor

Analiza, proiectarea şi implementarea structurii unei baze de date, sunt


realizate prin utilizarea unui anumit model de date. Un model de date reprezintă un
ansamblu de instrumente conceptuale ce permit descrierea datelor, relaţiile dintre
ele, semantica lor, dar şi constrângerile care le guvernează [Fotache et al. 2002].

Deci, modelul de reprezentare al datelor este un instrument teoretic ce contribuie la


determinarea structurii, conţinutului unei baze de date, precum şi la gestiunea acestora
prin setul de operaţii pe care le pune la dispoziţie.

Un model de date are următoarele componente [Selinger 1998]:


Reguli privind structurarea datelor. Acestea administrează proprietăţile
statice ale modelului şi sunt reprezentate prin instrucţiunile DDL. Există două seturi
de astfel de reguli: una care gestionează structura şi relaţiile dintre entităţi, iar cealaltă
se preocupă de integritatea referenţială şi de regulile de întreprindere;
Reguli privind manipularea datelor. Ele dictează aspectul dinamic al
modelului prin intermediul componentei DML a SGBD-ului. Limbajul de manipulare
generează schimbare de stare, dar nu de schemă. Astfel, doar valorile (conţinutul)
memorate în baza de date pot fi actualizate, în timp ce modelul conceptual este
invariabil.
Există o serie de criterii ce pot caracteriza modelele de date. În materialul de
faţă vom considera doar două astfel de tipologii. Modelele orientate pe obiect permit
descrierea bazei de date doar la nivel conceptual şi extern.
Acestea sunt:
 Modelele Entitate-Relaţie (ER) sau Obiect-Legătură-Entitate (OLE)
 Modelul semantic
 Modelul funcţional
 Modelul orientat-obiect.

Modelele bazate pe înregistrări sunt:


 Modelul ierarhic

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

Prima generaţie este bazată pe structurile arborescente (ierarhice), ce pot fi descrise


prin relaţii una-la-mai multe (one-to-many, 1:n) dintre entităţi. SGBD-urile
specifice acestei generaţii sunt IMS, Total, System2000, Nomad etc.

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.

1.4. Entităţi şi tipuri de entităţi

O entitate este un obiect din lumea înconjurătoare sau un concept, care cu


uşurinţă poate fi izolat faţă de restul conceptelor şi obiectelor, şi care se poate
reprezenta într-o manieră simplificată, dar depinzând de perspectiva proiectantului sau
utilizatorului.
Entitatea indică de fapt un lucru, fenomen, idee ce pot fi delimitate sau reprezintă un
anumit grad de simulare a unor elemente sau fenomene din realitate.
În jurul acestora gravitează semantica unei organizaţii. Aceasta se referă la
aspectele care conferă relevanţă în cadrul unei companii (tipurile de entităţi sau
clasele), menite să colecteze informaţii prin atribute, respectiv asocierile dintre aceste
perechi de tipuri de entităţi (relaţii).
Grupul de entităţi care au aceleaşi proprietăţi – denumite atribute – alcătuiesc un tip
de entitate. De multe ori în literatură noţiunile de entitate şi tip de entitate sunt tratate
11
Conference on Data Systems Languages

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ă

diferit faţă de sensul acordat în acest material – de exemplu documentaţia Oracle


[OracleDBD 2010] – unde tipurile de entităţi sunt considerate entităţi, iar entităţile
sunt instanţe ale entităţii.

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.

Toate entităţile ce pot fi descrise de un tip de entitate reprezintă extensia tipului de


entitate. Valorile atributelor unei instanţe (entităţi) sunt proprietăţi particulare ale
acelei entităţi. Astfel, un anumit produs este o extensie a tipului de entitate sau clase
PRODUS, iar valorile cui sau surub; 5 sau 3; cm sau inch; 2 sau 6; 3 sau 8 sunt
proprietăţile extensionale a două instanţe din PRODUS.

Observaţie: Nu putem să generalizăm faptul că o entitate sau un tip de entitate


vor avea întotdeauna acelaşi sens şi vor fi caracterizate de aceleaşi proprietăţi sau
relaţii. Astfel, dacă în exemplul prezentat, PRODUS era considerat un tip de entitate,
pentru o companie care produce sau comercializează atât bunuri, cât şi servicii, produs
ar putea fi împreună cu serviciu o instanţă a tipului de entitate ITEM.
Ideea fundamentală a lui Codd a fost că un tip de entitate poate fi uşor, relativ intuitiv
de modelat cu ajutorul unei relaţii (tabele) având ca antet proprietăţile, iar ca linii ale
acestuia entităţile tipului de entitate.

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.

1.5. Modelul relaţional


1.5.1. O scurtă incursiune în modelul relaţional
Modelul relaţional a apărut ca o alternativă viabilă la învechitele şi
problematicele fişiere clasice, precum şi la modelele de date ierarhice şi reţea.
Lucrarea de referinţă care consfinţea începutul unei noi ere în domeniul bazelor de
date – ”A Relational Model of Data for Large Shared Data Banks” [Codd 1970] – a
fost realizată într-o primă versiune în 1970, fiind scrisă de către matematicianul Edgar
F. Codd. Cercetător la laboratoarele IBM din Palo Alto, a dezvăluit ultimele rezultate
ale cercetărilor sale bazate pe implementarea unor principii din matematică într-un
domeniu nou, cel al bazelor de date, caracterizat de un oarecare haos până în acel
moment. Chiar dacă au trecut patru decenii de atunci, multe din teoriile sale stau încă
în picioare, iar altele fiind adaptate noilor cerinţe. Cercetările sale s-au materializat în
dezvoltări atât teoretice, cât şi practice în special în domeniul bazelor de date, dar nu
8
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ă

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

1.5.2. Conceptele modelului relaţional. Similarităţi cu entităţile

Termenii cu care operează teoria relaţională sunt:


 Relaţie
 Atribut
 Domeniu (tip)
 Ordin (aritate, rang)
 Tuplu
 Cardinalitate
 Chei.

În mod evident, conceptul de bază în teoria relaţională este relaţia, un termen


împrumutat din matematică. Putem spune că aceasta reprezintă un TABEL, compus
din linii şi coloane. Reprezentarea vizuală a unei relaţii este TABELA, un termen cu
sinonimie parţială în raport cu relaţia. Vom folosi acest termen doar în cazul
reprezentării unei baze de date în cadrul unui SGBD.
În teoria relaţională, COLOANA este asociată cu atributul. Atributele sunt
definite pe domenii, ce reprezintă un set de valori bine individualizate. Toate valorile
din cadrul aceleiaşi coloane sunt omogene, ceea ce înseamnă că aparţin unui aceluiaşi
domeniu sau tip (şiruri de caractere, date calendaristice, numere întregi, numere reale,
valori de adevăr etc). Numărul atributelor dintr-o relaţie dată determină ordinul,
rangul sau aritatea unei relaţii. Atributele sunt proprietăţi sau caracteristici – deci tot
atribute – la fel ca în terminologia utilizată pentru entităţi. Toate atributele din cadrul
unei relaţii alcătuiesc intensia, de fapt capul de tabel.
Schema relaţională este o colecţie de atribute interrelaţionate şi constrângerile
asociate acestora.
Schema relaţională va fi întotdeauna o descriere a bazei de date la nivel
conceptual într-un model logic, de această dată cel relaţional.

LINIILE tabelului poartă denumirea de tuple. Acestea pot fi considerate în general


seturi de valori heterogene, deoarece sunt de fapt colecţii de valori de tipuri diferite,
care sunt dictate de domeniile asociate atributelor corespondente. Numărul de valori

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.

Observaţie: Atunci când vorbim de tipuri de entităţi folosim denumirile


acestora la singular – PRODUS, CLIENT, VANZARE etc. – în timp ce vom discuta
de relaţii sau tabele vom utiliza pluralul (PRODUSE, CLIENTI, VANZARI etc).
Această convenţie este folosită şi în documentaţia [OracleDBD 2010].

În Figura 1. 2 – Relaţia PRODUSE vom încerca să descriem pragmatic conceptele


întâlnite mai sus.

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.

O relaţie trebuie să aibă următoarele proprietăţi:


 Atributele (numele lor) trebuie să fie distincte, chiar dacă unele dintre ele sunt
definite pe acelaşi domeniu;
 Ordinea atributelor într-o relaţie este irelevantă;
 Fiecare atribut trebuie să conţină numai valori atomice (scalare), deci
intersecţia unei linii cu o coloană va genera în mod obligatoriu o singură
valoare;
 relaţie nu permite existenţa tuplurilor duplicate;
 Ordinea tuplelor în cadrul unei relaţii este, de asemenea irelevantă.

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

Observaţie: Cu toate că teoria stipulează aceste reguli ca fiind obligatorii


pentru sistemele relaţionale, toate SGBD-urile comerciale, chiar dacă se proclamă
SGBDR-uri, ele încalcă una sau mai multe din regulile amintite. Astfel, spre exemplu,
putem avea tuple identice în tabelele FoxPro sau Access, dar în Oracle nu.

1.5.3. Relaţii dintre entităţi


1.5.3.1. Chei relaţionale
Fiecare tuplu al relaţiei este unic, ceea ce înseamnă că orice tuplu poate fi
reperat după valorile unuia sau mai multor din atributele sale.

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

Observaţie: NULL-urile nu înseamnă nici valoarea zero pentru numere, nici


spaţii sau şiruri vide pentru şiruri de caractere. Acestea înseamnă chiar mai puţin decât
atât. NULL înseamnă nimic, nicio valoare.

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.

Exemplu: Figura 1. 2 – Relaţia PRODUSE.


Avem atributele Cod, Denumire, Lungime, Unitate Masura, Greutate şi Diametru.
Observăm că toate cele 3 tuple sunt distincte. O concluzie firească ar fi să afirmăm că
în acest caz o cheie candidată ar fi formată din toate cele 6 atribute.
Din fericire însă, cea de-a doua condiţie (ireductibilitatea) nu poate fi îndeplinită de
acest grup de atribute, deoarece în cazul în care eliminăm spre exemplu Diametru din
această prezumtivă cheie, identificarea unuia din cele trei tuple este încă posibilă. În
extrema cealaltă, atributele Denumire, Lungime, Unitate Masura, Greutate şi
Diametru nu ar putea fi individual chei candidate, pentru că cel puţin două produse au
aceeaşi denumire, lungime, unitate de măsura, greutate, sau diametru. Dar, nu întâlnim
duplicate în ceea ce priveşte valorile codului. Astfel, Cod este o cheie alternativă în
cadrul relaţiei PRODUSE. Nu avem însă alte soluţii realiste pentru a identifica şi alte
chei candidate, deci Cod este singura cheie candidată şi în acelaşi timp şi cheia
primară.

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ă

Considerăm că în baza noastră de date avem pe lângă relaţia PRODUSE, o


nouă relaţie descrisă în Figura 1. 3 – Relaţia VANZARI, reprezentând valoarea
cumulată a vânzărilor din fiecare produs într-o anumită dată.
Pentru început, ne propunem să identificăm cheile candidate ale acestei relaţii. Cod,
Data, sau Cantitate nu pot fi chei candidate simple, deoarece fiecare are duplicate
(codul S002 şi cantitatea 10.000 apar de câte trei ori, iar data de 25/11/2008 de câte
două ori). Cod împreună cu Cantitate nu pot fi din nou cheie pentru că perechea
(S002, 100000) este duplicată. Data şi Cantitate au o problemă similară (25/11/2008,
10.000). În aceste circumstanţe, singura cheie candidată şi primară disponibilă este
cheia compozită Cod, Data, deoarece având cantităţi cumulate un produs nu poate să
apară de mai multe ori într-o zi. Cheia străină în acest caz este Cod, deoarece prin
acesta se creează legătura cu relaţia PRODUSE, reprezentând un cui sau un şurub cu
anumite caracteristici. Deci, în raport cu atributul de legătură Cod (în ambele relaţii),
PRODUSE este relaţia-părinte (Cod fiind cheia primară/candidată acolo), iar
VANZARI este relaţia-părinte, conţinând atributul Cod în calitate de cheie străină.

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

Observaţie: Nu este nicio problemă că nu avem codul S001 în VANZARI.


Asta nu înseamnă decât că încă nu s-a vândut nimic din acest produs. Adevărata
problemă ar fi să avem în VANZARI produsul cu codul C002 sau S003. Neavând
detalii despre acestea în relaţia PRODUSE înseamnă că nici nu le putem vinde. În
conformitate cu definiţia cheii străine, putem avea în VANZARI doar produse cu
codurile C001, S001 şi S002!
1.5.3.2. Tipuri de relaţii (legături)
O relaţie este un concept folosit atât în teoria relaţională, cât şi atunci când
vorbim despre entităţi. Aici, aceasta reprezintă o legătură, conexiune, sau asociere
între una, două sau mai multe relaţii. Cel mai frecvent tip de relaţie este relaţia
binară.
Există mai multe moduri de a caracteriza tipurile de relaţii, însă vom insista pe acel
bazat pe cardinalitatea relaţiilor binare. În contextul de faţă, cardinalitatea reprezintă
numărul generic de tipuri de entităţi (relaţii) implicate de fiecare parte a unei relaţii
(legături). Aceste tipuri sunt descrise în cele ce urmează:
Relaţia una-la-una (1:1). Fiecare entitate dintr-un set S1 este legată de cel mult
o entitate din setul S2 şi vice-versa (fiecare entitate din setul S2 este legată de cel mult
o entitate din setul S1). Ex. Fiecare SEF trebuie/poate să conducă un DEPARTMENT
şi numai unul, iar fiecare DEPARTMENT trebuie/poate să fie condus de un SEF şi
numai unul. Asta în cazul în care vorbim de entităţi. În conformitate cu teoria
13
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ă

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.

1.5.4. Constrângeri în baze de date


Bazele de date sunt mai mult decât simple fişiere text, sau chiar foi de calcul de
tip Excel sau a altor procesoare de tabele. Doar introducând date la întâmplare nu este
tocmai suficient. Trebuie să existe anumite restricţii pentru păstrarea corectitudinii şi
consistenţei conţinutului bazei de date.
Într-o bază de date putem avea următoarele tipuri de restricţii: constrângeri de
domeniu, integritatea entităţii, integritatea referenţială şi reguli de întreprindere
(constrângeri, reguli definite de utilizator). Primele trei sunt legate de complianţa la
regulile impuse de modelul relaţional, iar ultima nu este obligatorie din acest punct de
vedere, însă asigură o logică adiţională afacerii ce trebuie simulată prin intermediul
bazei de date. Există o serie de alte constrângeri, dar acestea nu constituie subiectul
discuţiei noastre.
Constrângerile de domeniu ne permit să introducem doar anumite valori care se
potrivesc cu tipul dictat de un anumit atribut (nu vom introduce text, numere sau
imagini la un atribut DataNasterii, definit ca dată calendaristică); entitatea integrităţii
se referă la faptul că niciunul dintre atributele cheii candidate nu acceptă valori NULL
şi în totalitate nu pot fi duplicate (conform definiţiei cheii candidate); integritatea
referenţială spune că valorile cheii străine dintr-o relaţie-fiu trebuie să fie una din
valorile existente în cadrul cheii primare/candidate din relaţia-părinte, sau prin
excepţie NULL-uri; regulile de întreprindere sunt constrângeri adiţionale definite de
proiectantul bazei de date (data angajării trebuie să fie mai mare decât data naşterii,
stocurile de produse şi preţurile nu pot fi negative etc).

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ă

Odată ce ne-am asigurat că baza noastră de date are un conţinut corect şi


consistent, trebuie să ne asigurăm că aceste proprietăţi vor fi menţinute şi în cazul în
care conţinutul se modifică datorită operaţiunilor de manipulare. În cazul unor baze de
date mai complexe şi cu conţinut foarte dinamic este foarte greu ca toate regulile de
care am vorbit să fie gestionate manual, ele pot fi controlate automat, de către SGBD-
ul în care baza de date este reprezentată, prin intermediul unor proceduri stocate în
dicţionarul bazei de date. SGBD-urile permit uneori dezactivarea temporară a unor
reguli, dar această procedură poate dăuna „sănătăţii” bazei de date, în cazul în care
operaţiunile nu sunt făcute de persoane experimentate.
Observaţie: În practică se vor aplica acelea care corespund cel mai bine
cerinţelor organizaţiei şi sunt suportate de SGBD-ul la care se apelează, sau vor fi
implementate prin programare.

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.

Unele SGBD-uri sunt mai restrictive în aplicarea şi menţinerea unor astfel de


reguli, altele mai puţin. Referitor la menţinerea integrităţii referenţiale, din punct de
vedere teoretic, există câteva strategii în cursul operaţiilor de actualizare. Acestea sunt
surprinse în cele ce urmează.
În teorie, constrângerile de integritate pot fi descrise grafic cu diagrame
referenţiale sau cu tabele referenţiale. Diagramele au relaţiile (tipurile de entităţi)
drept noduri, în timp ce arcele evidenţiază constrângerile. Şi tabelele furnizează o
imagine destul de clară.
SGBD-urile oferă proiectantului atât comenzi, clauze sau opţiuni specifice, cât şi
variate moduri de vizualizare pentru reprezentarea şi descrierea acestor restricţii.

16
Capitolul 2 – Primii paşi în Access

2.1. Istoria Microsoft Access


Microsoft Office Access, pentru o bună bucată de timp o componentă din
pachetul Microsoft Office, are o istorie impresionantă. Versiunea Access 1.0 a fost
realizată în noiembrie 1992, fiind urmată în mai 1993 de Access 1.1, o versiunea
îmbunătăţită în ceea ce priveşte compatibilitatea cu alte produse Microsoft. Microsoft
Office a fost introdus în 1989 pe sistemul de operare Mac, iar în 1990 pe Windows. La
început, acest pachet includea doar Word, Excel şi Power Point, dar odată cu
versiunea Pro(fessional) din Office 95, s-a introdus şi Access. Următoarele versiuni
sunt Access 97, 2000, 2002, 2003, 2007, 2010, 2013.
Printre facilităţile şi funcţionalităţile MS Access, avem:
 Are o compatibilitate destul de bună cu SQL-ul, dar fără posibilitatea de
implementare a declanşatorilor (triggers) şi procedurilor stocate;
 Access furnizează un mediu de programare puternic prin ale sale formulare şi
rapoarte conduse de evenimente, ce utilizează VBA1;
 Are o interfaţă-utilizator2 prietenoasă;
 Suportă şi gestionează componente OLE DB, ADO, ADOX în vederea
integrării componentelor Access cu celelalte tehnologii Microsoft;
 Este capabil să gestioneze documente HTML, XML. Această facilitate ajută la
crearea aplicaţiilor de baze de date cu interfaţă web;
 Includerea de filtre şi convertoare pentru familia de produse xBASE şi pentru
multe altele.

Microsoft Access este un SGBD puternic şi relativ uşor de utilizat.


În acest material vom folosi ca versiune de referinţă Access 2013 sub Windows XP,
Vista sau 7.

2.2. Lansarea unei sesiuni Microsoft Access


În locaţii publice, precum şcoli, universităţi etc., sau în medii multiutilizator,
este mai mult decât recomandat să se utilizeze directoare(foldere) distincte de lucru
pentru proiectele care utilizează baze de date, şi nu numai. Este de asemenea indicat să
se evite locaţii precum folderele speciale, ca: Windows, My Documents, Program
Files sau Desktop. Mai mult, uneori discul/partiţia C, din motive de securitate, nu
permite efectuarea tuturor operaţiunilor pe care ni le-am dori, sau există programe
speciale, care după restartarea computerului să şteargă tot ce a apărut nou, lăsând
intacte doar fişierele şi directoarele de sistem. Din aceste motive, spaţiul de lucru ar
putea fi pe unitatea D.
Exemplu: D:\Student\123\Pop Ion, unde „Student” este directorul
principal unde lucrează studenţii, „123” e indicativul numeric al grupei iar „Pop Ion”
fiind numele utilizatorului

1
Visual Basic for Applications
2
GUI – Graphic User Interface
Deschiderea unei sesiuni de lucru Access se poate face prin mai multe modalităţi:

Start → (All) Programs → Microsoft Office → Microsoft Access 3


Dublu-clic (sau clic dreapta şi se alege Open) pe pictogramele Access de pe
suprafaţa de lucru, dacă sunt prezente;
Utilizând aplicaţiile Windows Explorer/(My) Computer pentru a naviga înspre
programele MSACCESS.EXE4;
Start → Run … apoi tastarea căii absolute către programele aferente sau
răsfoirea spre aceste locaţii, precum:
C:\Program Files\Microsoft Office\OFFICE12\MSACCESS.EXE;
Start → Search după fişierele MSACCESS.EXE şi dublu-clic pe rezultate;
Dublu-clic pe o bază de date, fişier, sau comenzi rapide (shortcut-uri) având
asocieri pentru aplicaţiile Access.

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.

Elementele descrise anterior au mai multe interpretări. Noi le-am surprins în


general din perspectiva Microsoft Access. De altfel, în filosofia MS Access, ele sunt
considerate componente ale bazei de date.

2.4. Prezentare Access 2013


2.4.1. Ecranul principal
Odată ce aplicaţiile sunt lansate, putem obţine ferestre similare cu cele
prezentate în Figura 2. 1 pentru Access. Incepând cu MS Office 2007, interfaţa clasică
bazată pe meniuri a fost înlocuită cu interfaţa Microsoft Office Fluent bazată pe acea
zonă orizontală denumită panglică (ribbon), care conţine anumite file (tab-uri)
obligatorii sau contextuale, în cadrul cărora avem grupuri de opţiuni/comenzi.

Figura 2. 1 – Ecranul principal MS Access

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

Bare de instrumente. Barele de instrumente sunt compuse din butoane împărţite în


grupuri cu funcţionalitate similară, care au pictograme sugestive, aceleaşi ca şi în
opţiunile de meniu (ex. pentru Print…). Statistic vorbind, acţiunile asociate
butoanelor unei bare de instrumente sau grup al acesteia, sunt sau ar trebui să fie cele
mai utilizate din categoria respectivă. Barele de instrumente se activează sau
dezactivează singure în funcţie de context şi pot fi deplasate pe ecran în acel loc pe
care utilizatorul îl consideră potrivit pentru sarcinile la care le foloseşte. Manual,
aceste obiecte pot fi activate/dezactivate din View → Toolbars…

Începand cu Access 2007 există o serie de file contextuale în locul barelor de


instrumente specifice. Spre deosebire de cele prezentate la crearea/editarea relaţiilor
dintre tabelele bazei de date, va mai apărea fila opţională Design cu grupurile Fileds
şi Relationships. Filele adiţionale sunt însoţite de etichete sugestive, precum
Relationship Tools în cazul de faţă.

Figura 2. 5 – File contextuale în Access 2013

Î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

Alte grupuri ale căror opţiuni apar în Access6


Fila Home

Grup Funcţionalitate
Permite comutarea între diferite moduri
de vizualizare ale obiectului curent

Diverse formatări la nivel de caracter şi


paragraf

Formatări extinse la nivel de paragraf


(indentări, liste numerotate sau cu
marcatori, evidenţieri)

Gestiunea operaţiunilor asupra


înregistrărilor, verificare ortografică etc.

Realizare sortări, filtrări simple sau


avansate asupra înregistrărilor

Operaţiuni de selecţie, regăsire şi navigare

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

Panoul de sarcini. Este o fereastră auxiliară ce apare în ambele aplicaţii. În Access,


spre deosebire de varianta anterioară, doar în pagina de pornire a aplicaţiei apar
elemente ale panoului de sarcini – şabloane, baze de date recente, acces resurse şi
asistenţă Microsoft etc. – o serie de elemente noi de interfaţă fiind disponibile atunci
când avem o bază de date deschisă.

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.

2.4.2. Alte elemente ale interfeţei îmbunătăţite Microsoft Office 2013

2.4.2.1. Facilităţi de proiectare incluse în foaia de introducere a datelor

Până la versiunea Access 2007, partea de proiectare şi cea de introducere a


datelor era complet separată. Acum, o parte din facilităţile de proiectare sunt introduse
şi în foia de introducere şi vizualizare a datelor, chiar de la crearea unei noi baze de
date. Incepand cu Access 2007 se permite crearea de noi coloane şi asignarea unor
tipuri probabile de date în funcţie de valorile introduse.

2.4.2.2. Panoul de navigare (Navigation Pane)


Acesta este disponibil în Access şi apare doar atunci când este
deschisă o bază de date. Înlocuieşte fereastra principală a bazei de date
din cadrul versiunilor anterioare, cu rol în gestionarea componentelor
acesteia. Este prezentat în imaginea din dreapta. Panoul afişează şi
facilitează accesul la toate obiectele bazei de date într-o manieră
intuitivă şi prietenoasă. Obiectele pot fi organizate
personalizat, după tipul lor, după dependenţă, data
creării sau modificării. Totodată, se pot realiza
filtrări pe anumite categorii de obiecte. Opţiunile de navigare şi
afişare selectivă sunt prezentate în figura din stânga. În funcţie de
necesarul de spaţiu pe suprafaţa de lucru, utilizatorul poate solicita
comasarea acestui panou, prin acţionarea butonului de închidere
(Shutter Bar Close Button), iar restaurarea făcându-se cu ajutorul (Shutter
Bar Open/Close Button).

2.4.2.3. Liste de câmpuri


Lista de câmpuri (Field List) se comportă asemenea unui
panou, având o funcţionalitate avansată faţă de selectorul de câmpuri
din versiunile anterioare. Acum se pot include în rapoarte, formulare
şi câmpuri din alte tabele, decât tabela de bază. Există zone distincte
pentru tabelele corelate – acelea din baza de date cu care se află în
relaţii de anumite tipuri – cu tabela curentă, cât şi pentru cele
necorelate. Prin glisare se pot trece câmpuri din tabele ale bazei de
date aflate în oricare din aceste zone. Tot în acest panou există
posibilitatea de a face filtrări pe o anumită sursă de date, sau
anularea filtrării, ce permite acces la toate sursele de date din acea
bază de date. Tabelele prezente în acest panou pot fi editate, prin
acţionarea elementului Edit Table asociat acelei tabele. Şi relaţiile
dintre tabele se pot crea direct aici, cu o notificare prealabilă din
partea sistemului.
2.4.2.4. Ferestre cu file multiple
Pentru eficientizarea utilizării suprafeţei de lucru, în locul ferestrelor
individuale pentru fiecare tip de obiect, ce puteau fi deschise în Access 2003,
începand cu Access 2007 acestea se prezintă sub forma unei singure ferestre, cu câte o
filă separată pentru fiecare obiect deschis. În versiunile anterioare ferestrele asociate
elementelor în lucru erau dispuse pe întreg spaţiul disponibil, putându-se
maximiza/restaura, minimiza sau închide, la nevoie. Pentru organizarea acestora pe
ecran erau folosite opţiunile meniului Window. Fiecare obiect al bazei de date deschis
– tabelă, interogare, raport, formular – precum şi pentru constructorul de relaţii, se va
adăuga câte o nouă filă ferestrei principale, care acoperă întreaga suprafaţă de lucru.
Fila va conţine atât numele obiectului, cât şi o pictogramă (în partea stângă) sugestivă
pentru recunoaşterea tipului de obiect. Dintre obiectele deschise, la un moment dat
doar unul este activ, şi se recunoaşte după nuanţa diferită a filei corespunzătoare.
În Figura 2. 3, tabela PRODUSE este fereastra activă.

Figura 2. 3 – Vizualizare prin intermediul ferestrelor cu file multiple

Închiderea ferestrei curente se poate face prin utilizarea butonului de


închidere din partea dreaptă a ferestrei principale, sau prin utilizarea
opţiunii Close a meniului contextual. Fereastra principală se deschide odată cu prima
filă şi se închide odată cu ultimul obiect închis. Închiderea tuturor obiectelor se
realizează cu opţiunea Close All din acelaşi meniu contextual, prezentat şi în imaginea
din dreapta.
Observaţie: Unele ferestre, precum cea a editorului VBA se deschid separat,
nefiind incluse în fereastra principală.
2.4.2.5. Noi facilităţi privind filtrarea şi sortarea
Începand cu Access 2007, pentru efectuarea unor operaţiuni de sortare sau
filtrare e suficient să se acţioneze săgeata orientată în jos, din partea dreaptă a
antetului oricărui câmp . Astfel avem posibilitatea de a efectua diverse
facilităţi de filtrare automată, fără a fi nevoiţi să accesăm diverse opţiuni din anumite
file.
Faţă de variantele de filtrare/sortare din versiunile anterioare de Office, filtrarea
a fost îmbunătăţită. Prin simpla acţionare a săgeţii din dreapta numelui de câmp, se
poate efectua sortarea după acel câmp crescător sau descrescător, precum şi facilităţi
de filtrare disponibile doar în cazul filtrărilor avansate, sau care puteau fi realizate prin
instrumente mai puţin intuitive şi cunoştinţe mai aprofundate (ex. Advanced
Filter/Sort… sau Filter By Form… din Access 2003 sau necesitatea utilizării unor
funcţii). Se pot selecta mai multe valori individuale ale câmpului respectiv, dar există
şi o serie de filtre predefinite pentru fiecare tip de dată.

Exemplu: - Error! Reference source not found..


2.4.2.6. Adăugarea funcţiilor totalizatoare la vizualizarea datelor
O altă noutate în ceea ce priveşte informaţiile pe care le poate obţine
utilizatorul, chiar în modul de introducere a datelor, este şi afişarea
unei linii de Total la final. Astfel, fără a fi nevoie să se efectueze
anumite calcule mai mult sau mai puţin greoaie sau să se apeleze la
interogări, o serie de funcţii statistice, precum: suma, media,
contorizarea, maximul, minimul, deviaţia standard sau varianţa, stau
acum la dispoziţia noastră. Trebuie doar adăugat rândul totalizator,
apoi pentru fiecare câmp în parte se poate alege funcţia dorită, sau
cea care se pretează cel mai bine aspectului semantic al câmpului. Se va selecta
funcţia dorită din lista prezentată în imaginea din stânga. Conţinutul listei poate fi
restrâns, de exemplu pentru tipuri de date precum cele text.
Observaţie: Dacă avem coloana de preţ unitar, iar produsele sunt similare,
atunci putem alege afişarea preţului mediu. La fel, putem alege preţul maxim sau
minim, dar aproape niciodată nu vom însuma preţurile. La fel, puţin probabil să
selectăm sumă pentru date calendaristice, precum data de naştere; pentru coduri
numerice de identificare, precum codul de bare, codurile poştale, numerele matricole,
sau codul numeric personal.

2.4.2. Moduri de lucru


În funcţie de scopul acţiunilor sale curente, utilizatorul poate alege – ţinând
cont de abilităţi, grad de instruire sau de cunoaştere a produsului şi facilităţilor sale –
dintre diferite moduri de lucru disponibile.
Interfaţa vizuală. Utilizatorul poate folosi opţiunile/comenzile din meniuri sau
file, dar poate apela şi la o serie de instrumente vizuale – constructori,
manageri/gestionari, generatoare, sau proiectanţi – sau instrumente de asistenţă
interactivă (de tip wizard sau instrumente de proiectare rapidă) în vederea îndeplinirii
unor sarcini mai simple sau mai complexe.
Un utilitar de asistenţă interactivă (tip wizard) reprezintă un „asistent”
inteligent ce ghidează utilizatorul pas cu pas spre a îndeplini o sarcină bine delimitată.
La fiecare pas acesta oferă soluţii din care utilizatorul o selectează pe cea mai
potrivită. Modul vizual este unul foarte confortabil în utilizare, în general pentru
începător, dar nu se limitează strict la această categorie. Utilizarea acestuia ar scuti
utilizatorul de prea mult tastat, putându-se astfel elimina şi erorile de tastare sau
sintaxă. Totuşi, varianta vizuală nu poate înlocui complet toate elementele realizabile
prin celelalte moduri de lucru.

Utilizarea de modele predefinite/şabloane. Utilizatorul poate prelua un exemplu


funcţional, pe care poate apoi să-l personalizeze nevoilor sale. Aceste modele
predefinite se pot găsi în C:\Program Files\Microsoft Office\Templates\1033\Access\
pentru Access.

Folosirea comenzilor. În Access există comenzi SQL (Structured Query Language),


care utilizează Accessul ca limbaj gazdă.
Lucrul în acest mod constă în scrierea de fişiere sau blocuri de comenzi, apoi se
vor executa ca şi cum ar fi o comandă individuală. Acest mod poate fi combinat cu cel
vizual, atunci când realizăm aplicaţii, meniuri, formulare, sau pentru elemente de
complexitate superioară sau personalizări.

2.4.3. O scurtă privire asupra meniurilor


Elementele barelor de instrumente nu reprezintă altceva decât opţiuni din anumite
meniuri. Există o serie de comenzi/opţiuni care nu sunt strict legate de gestiunea
bazelor de date, motiv pentru care nu vor constitui obiectul acestui material. Pentru a
afla detalii despre acestea sau despre oricare altele, se pot consulta diversele variante
de asistenţă puse la dispoziţie de producător (Help, F1) on- sau offline.

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 Edit/ Fila Home – gestionează operaţiile curente de editare şi formatare


asupra textului, sau asupra unor obiecte. Acestea sunt selectarea, copierea, mutarea şi
ştergerea. Access permite operaţii de editare a textului şi formatare similare cu
celelalte produse din pachetul Microsoft – Word, Power Point, Excel – corectarea
ortografică (Spelling) precum şi o serie de facilităţi destinate gestiunii înregistrărilor.

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.

Fila Database Tools – gestionează o serie de instrumente, atât de


aplicabilitate mai generală cât şi destinate doar bazelor de date.
Pentru activităţi mai complexe, dar cu caracter repetitiv, utilizatorul
poate defini macrocomenzi, care reprezintă un set de instrucţiuni
care se execută secvenţial pentru o sarcină mai complexă (grupul
Macros).
În Access proiectantul bazei de date poate stabili relaţii între tabele
(Relationships…), analizarea conţinutului, a structurii sau performanţei bazei de date
în vederea îmbunătăţirii proiectării ei (grupul Analyze), migrare spre SQL Server sau
divizare a bazei de date (grupul Move Data). Administratorul bazei de date poate
stabili un set de drepturi şi privilegii grupurilor de utilizatori în accesarea
componentelor bazei de date, asignarea de parole şi criptare (grupul Database Tools),
creare de aplicaţie/bază de date executabilă (comanda Make ACCDE). Utilizatorul
poate efectua personalizări prin definirea unor meniuri sau bare de instrumente, dar şi
prin adăugarea de noi facilităţi, neincluse în instalarea standard (Add-ins).

Meniul Window – gestionează ferestrele deschise în cadrul aplicaţiei. Acesta le poate


ascunde/vizualiza, le poate dispune desfăşurat pe tot ecranul, sau în cascadă – fie
începând din colţul stânga sus, fie din dreapta – realizează activarea unei ferestre
dintre toate cele deschise prin selectarea ei dintr-o listă. În Access organizarea şi
gestionarea obiectelor şi ferestrelor asociate lor, se realizează cu ajutorul panoului de
navigaţie şi ferestrei cu file multiple.

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.

Figura 2. 4 – Fereastră Access Help


2.5. Obiecte de control şi containere
Lucrând sub sistemul de operare Windows, este evident că elementul de bază
în cadrul acestuia va fi fereastra. Aceasta este o suprafaţă dreptunghică ce se
caracterizează prin poziţie, dimensiune, culoare fundal şi multe alte proprietăţi şi
obiecte, destinate facilitării dialogului dintre utilizator şi sistem. Există două tipuri
mari de ferestre:
Ferestre sistem. În general, proprietăţile lor nu pot fi modificate de către utilizator, el
interacţionând cu fereastra prin selectare, navigare, apăsare, sau scriere de text în
cadrul unor controale din cadrul ei.
Exemplu: Ferestrele principale Access, ferestrele diverşilor constructori, fereastra de
comandă, ferestre de dialog precum File → New…, File → Open…, Tools →
Options…etc.
Ferestre utilizator. Ferestrele definite de utilizator sunt similare celor sistem, dar
conţin atât ele cât şi componentele lor metode şi proprietăţi definite de utilizator.
Astfel de ferestre pot fi formularele şi rapoartele. Ele pot conţine o varietate de obiecte
de control.

Obiectele de control din Access sunt următoarele:

Butonul de comandă (command button/button) este în general utilizat pentru a


efectua o acţiune ce se declanşează în urma apăsării lui (clic cu mouse-
ul). Acţiunile pot fi: închiderea sau deschiderea unui formular, mutarea
pointerului (indicatorului) de înregistrare, afişarea unui
mesaj, tipărirea unui raport etc. Dau impresia unor obiecte
ieşite în relief, pe a căror faţetă exterioară putându-se afla
text, imagini, sau o combinaţie a lor.
Cele mai populare butoane sunt OK şi Cancel. Controlul de tip CommandGroup
(grup de butoane de comandă) este un obiect mai complex derivat din butonul de
comandă şi constă într-un set de butoane ce pot fi manipulate atât individual, cât şi ca
grup.

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.

Eticheta (Label) este un control ce nu poate fi editat manual în timpul fazei de


execuţie. Totuşi, conţinutul acestuia se poate modifica prin
secvenţe de cod de programare.

Incrementator/Decrementator (Spinner) se foloseşte doar pentru valori numerice.


\valoarea curentă afişată poate fi incrementată/decrementată prin acţionarea
corespunzătoare a săgeţilor din partea dreptă a obiectului de control. De
asemenea, valorile înscrise pot fi editate şi manual, prin tastare directă.

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.

Gridul (grid) este de asemenea un


container proiectat în scopul deservirii
necesităţilor bazelor de date. Se
întâlneşte explicit sub acest nume doar
în Visual FoxPro. Obiectul poate afişa
conţinutul unei tabele sau interogări
într-o interfaţă mai prietenoasă decât o fereastră obişnuită de tip BROWSE o poate
face. Gridul conţine linii şi coloane, celule, antete, bare de defilare etc. şi poate
reacţiona în diverse moduri la stimulii externi (acţiuni ale utilizatorului). Utilizatorul
poate adăuga sau şterge linii sau coloane din cadrul lui.

Cronometrul (timer) este un obiect invizibil, el neputând fi afişat pe ecran în cursul


execuţiei. Gestionează timpul şi intervalele de timp în vederea efectuării unor
verificări periodice, sau declanşării unor sarcini atunci când un astfel de interval
expiră.
Alte controale pe care Access le pot utiliza sunt controale de tip OLE7-ActiveX
destinate gestiunii imaginilor: OLEBound, (Un)Bound Object Frame, Image şi
altele.

2.6. Construcţii de metalimbaj


2.6.1. Definiţie
Formal, un metalimbaj este un limbaj convenţional care descrie un alt limbaj.
Ex.: Maria joacă tenis.  Joacă (Maria, tenis)
Apariţia şi dezvoltarea limbajelor de programare a dus şi la utilizarea
metalimbajului. Backus–Naur Form (BNF) dezvoltat în anii 60 şi Extended BNF
(EBNF) sunt utilizate în informatică în calitate de metalimbaje.
Un metalimbaj – un limbaj simplificat – oferăi o descriere a regulilor
sintactice, putând stabi dacă o anumită construcţie dintr-un limbaj de programare este
corect formulată.

2.6.2. Metasimboluri utilizate în descrierea Microsoft Access


Metalimbajul conţine un ansamblu de simboluri – denumite metasimboluri – şi
regulile lor de definiţie.

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

| Excludere sau alternativă. Utilizatorul poate alege din variantele propuse

… Construcţii iterative (repetitive).


::= Definiţii
Ex.: <non-terminal>::= <câmp>|<fişier>| …

{ } Grupuri de elemente.

Exemplu:

SELECT [ALL | DISTINCT] [TOP <nExpr> [PERCENT]] [<alias>.] <selectItem1> [[AS]


<columnName1>] [, [alias.] <selectItem2 >[[AS] <columnName2>] ...]
FROM [FORCE] [<database1>!] <table1> [[AS] <localAlias>] [ [INNER | LEFT
[OUTER] | RIGHT [OUTER] | FULL [OUTER] JOIN < database2>!] <table2> [[AS]
<localAlias>] [ON <joinCondition1> ...] [[INTO <destination>] | [TO FILE
<fileName> [ADDITIVE] | TO PRINTER [PROMPT] | TO SCREEN]] [PREFERENCE
<preferenceName>] [NOCONSOLE] [PLAIN] [NOWAIT]
[WHERE <joinCondition2> [AND <joinCondition3> ...] [AND | OR
<filterCondition1> [AND | OR <filterCondition2> ...]]]
[GROUP BY <groupColumn1>[, <groupColumn2 >...]]
[HAVING <filterCondition3>] [UNION [ALL] SELECTCommand] [ORDER BY
<orderItem1> [ASC | DESC] [, <orderItem2>[ASC | DESC] ...]]

Pentru interpretarea mai uşoară a sintaxei comenzilor, vom utiliza următoarele


convenţii:
 Cuvintele-cheie şi cele rezervate (nume de comenzi, clauze etc.) vor fi scrise cu
majuscule. Aceştia sunt terminali, ceea ce înseamnă că nu pot fi modificaţi în
construcţii.
 Neterminalii reprezintă texte sau cuvinte scrise cu litere mici, sau doar primul
caracter e majusculă, încadrate între paranteze unghiulare (< >). Acestea trebuie
înlocuite în construcţii cu nume de baze de date, tabele, câmpuri, căi, şiruri de
caractere etc.
 Caracterele ce pot fi utilizate în MS Access sunt, după cum urmează:
 Literele din alfabetul englez: A - Z
 Cifrele arabe (0 – 9)
 Caractere speciale: + - * / \ ^ % = < > , ’ ” ; _ @ # $ & ( ){ }[ ] ~.

2.7. Elemente de lexic şi sintaxă în programarea Access


Programarea în mediul Access se referă la cunoştinţe legate de limbajele VBA
şi un dialect Microsoft pentru SQL. Caracteristicile acestei programări sunt:
 Nu există un program principal;
 Codul este memorat sub formă de funcţii sau proceduri în cadrul modulelor.
 Modulele pot fi globale sau se pot asigna unor evenimente din cadrul formularelor
sau rapoartelor.
Programarea se bazează pe:
 Construcţii simple;
o Identificatori (cuvinte). Reprezintă şiruri ce conţin litere şi cifre, dar
neapărat trebuie să începă cu o literă sau caracterul _ (underscore).
Există două tipuri de identificatori:
 Cuvinte predefinite
 Cuvinte cheie – au un înţeles bine definit în funcţie de
context (Ex. Comenzi)
 Cuvinte rezervate – se pot utiliza cu acelaşi înţeles
precum au fost definite (Ex. nume de funcţie: ABS=3)
 Cuvinte definite de utilizator. Sunt numele de fişiere, alias-uri,
câmpuri, variabile, nume de obiecte precum meniuri, formulare
sau rapoarte;
o Literali (constante). Reprezintă valori constante, valori care nu se
schimbă în timp. Ex. 24, “Mary”, [John], .T., {#2010-10-19, 11:22:09
A};
o Simboluri speciale. Au o anumită semnificaţie în raport cu contextul în
care sunt utilizaţi. Pot fi:
 semne de punctuaţie;
 operatori şi
 delimitatori (separatori). Există delimitatori comuni, nespecifici
programării (spaţiu, tab, alte indentări, enter), sau delimitatori
specifici unui anume tip de constantă (“. ’, [, ], ., $) “Suzana”,
‘frate’, [Ion], .F.;
o Comentarii: sunt ignorate de interpretor. Există comentarii tip linie (*,
NOTE, REM şi ‘) şi comentarii text (&&).
 Construcţii compuse. Reprezintă un ansamblu de construcţii simple conectate
prin reguli sintactice. Ele pot fi
o Instrucţiuni. Reprezintă categoria de bază într-un limbaj de programare.
O comandă conduce la declanşarea unei acţiuni. Ele au o serie de clauze
care precizează în detaliu cerinţele programatorului şi modalitatea de
execuţie. Ex. IF
o Funcţii. Sunt utilizate la prelucrarea datelor. Funcţiile trebuie neapărat
să returneze o valoare. Ex. DATE(), PI(), ROUND(10/7,2). Funcţiile pot
fi imbricate (încuibărite), adică o funcţie se poate aplica rezultatului
generat de o altă funcţie. Ex. ROUND(PI(),2). Există şi funcţii definite
de utilizator;
o Proceduri. Sunt asemănătoare funcţiilor. Nu este obligatoriu să aibă
parametri şi nici să returneze vreo valoare;
o Expresii. Reprezintă construcţii elementare în limbajele de programare.
Sunt formate din două tipuri de elemente:
 Operanzi. Sunt constante, variabile sau subexpresii;
Observaţie: Există excepţii de la regula de compoziţie a expresiilor. Acest
lucru se întâmplă atunci când sunt implicaţi operanzi de tip boolean (logic).
 Operatori. Există următoarele tipuri de operatori:
 (1) Aritmetici: ^ sau **, *, /, +, -, % (restul împărţirii,
modulo)
 (1) Concatenare: +, -, &
 (1) Dată şi Timp: +, -
 (2) Relaţionali: <, >, <=, >=, =; <>, # sau !=; ==, $
 (3) Logici: NOT, AND, OR.
Atunci când avem expresii compuse mixte avem de-a face cu problema ordinii
de evaluare a subexpresiilor. Aceasta se rezumă la aşa-numita precedenţă a
operatorilor, adică prioritatea unui operator faţă de celălalt. Numerele din parantezele
fiecărei categorii de operatori reprezintă chiar această precedenţă. Atunci când vrem
să schimbăm ordinea naturală – sau nu suntem siguri de ordinea firească – putem dicta
o nouă ordine prin utilizarea de paranteze în subexpresii.

2.8. Structuri de date

Limbajele de generaţia a IV-a (4GL8), precum Access, oferă utilizatorilor


următoarele tipuri de structuri de date: câmpuri, constante, variabile, masive şi
tablouri de variabile. Acestea mai sunt numite şi containere de date.

1. Câmpuri. Sunt denumirile atributelor în reprezentarea prin intermediul unui


SGBD. Acestea memorează persistent – pe un suport de disc – valori ale atributului
pe care îl reprezintă, pentru fiecare înregistrare (articol, linie a tabelei). Această
caracteristică este cel mai mult exploatată în cazul bazelor de date.

2. Constante. Valorile lor rămân neschimbate în timpul execuţiei unui


program, şi pot fi:
Numerice – numere reale cu sau fără semn. Ele sunt formate din semnul minus
(opţional), cifre de la 0 la 9 şi punctul zecimal (opţional). Nu au nevoie de nici un
delimitator specific atât în Fox, cât şi în Access;
Caractere – şiruri de caractere cu lungimea între 0 şi 64 KB, formate din litere, cifre,
caractere speciale tipăribile (, . - + & ^ % $ # @ ! etc.) şi caractere neprintabile (enter,
tab, line feed etc.), dar care trebuie delimitate de apostrof (‘’), ghilimele (“”), sau
paranteze drepte ([]). Simbolurile netipăribile pot fi referite doar cu funcţia CHR(<cod
ASCII>). În Access delimitatorii sunt ghilimelele (“”);
Logice – (boolean) valori de adevăr true (yes) sau false (no), abreviate şi delimitate
de puncte. Ele sunt .T., .t., .F., .f., .Y., .y., .N., .n.. În Access avem True, False (On,
Off) şi Null;
Dată şi Timp – pentru evitarea problemei anului 2000 (Y2K bug) şi confuzia în
general dintre lună şi zi pentru zile mai mici de 13 datorată specificului regional,

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.

În Access, constantele se declară după cum urmează:


[GLOBAL] CONST < denumire constantă > = <expresie>, unde GLOBAL
reprezintă declararea vizibilităţii în toate modulele.
Ex. Const MyDate = #02/15/2010#, MyNum=9.45

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.

Variabilele sunt caracterizate de un tip/domeniu, care poate fi Blob, Numeric,


Currency, Character, Logical, Date, DateTime, Variant, Varbinary şi Array. Access
suportă tipuri similare: Byte, Integer, Long, Single, Double, Currency, Decimal, Date,
String Boolean şi Variant. La iniţializare ele primesc şi tipul valorii memorate.
Iniţializarea se poate face prin utilizarea semnului egal (Ex. x = “Ana”, y = 5 etc.).
Variabilele mai au lungime, ciclu de viaţă şi vizibilitate (publică sau locală).

2.9. Tipuri de date în Microsoft Access

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 -

Memo Memo, Hyperlink


Binary memo -
Gestiune Date Date/Time
timp Time Date/Time
Logic - Yes/No
Special - OLE Object, Attachments
Alte tipuri - Variant
Lookup
Figura 2. 5 – Tipuri şi subtipuri în Access

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 Access, conversiile sunt efectuate de următoarele funcţii, dedicate fiecăreia unui


anume tip. Ele sunt: CBool(Exp), CByte(Exp), CCur(Exp), CDate(Exp), CDbl(Exp),
CDec(Exp), CInt(Exp), CLng(Exp), CSng(Exp), Str(Exp) şi CVar(Exp) [Access
2007 Help]. Argumentul solicitat Exp este orice expresie text sau numerică.
Capitolul 3 – Tabele libere

Tabelele reprezintă elementele de bază în cadrul SGBD-urilor. În general, o


tabelă trebuie să aparţină unei baze de date. În acest caz ea se numeşte tabelă
legată sau tabelă corelată. În caz contrar avem tabele independente sau izolate,
denumite tabele libere sau tabele necorelate.

3.1. Gestiunea tabelelor în Microsoft Access


Crearea unei baze de date

În Access nu putem avea tabele fără a fi incluse în vreo bază de date.


De aceea, în momentul deschiderii Microsoft Office Access, ni se solicită chiar din
pagina pe introducere fie să selectăm una din bazele de date existente recent
utilizate, fie avem posibilitatea să creăm pe loc o nouă bază de date.

Î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

Se acţionează butonul , care va lansa o fereastră de dialog ce permite stabilirea


locaţiei pentru noua bază de date şi un nume. După tastarea numelui în zona File
Name, Access va completa automat extensia specifică (accdb), iar apoi butonul
OK va fi selectabil. La acţionarea lui, se revine în fereastra iniţială (Figura 3.),
acum completată cu elementele personalizate. Acţionarea butonului de comandă
Create va definitiva crearea bazei de date.

Crearea tabelelor odată cu baza de date


În baza de date nou creată se trece automat la crearea primei tabele. Numele
ei implicit este Table1, dar poate fi modificat ulterior. Există şi un prim câmp în
aceasta, identificatorul (ID). Incepand cu Access 2007, spre deosebire de
versiunile anterioare şi de alte SGBD-uri, a adus interfaţa de proiectare a bazei de
date mai aproape de utilizator. Acum se pot adăuga noi coloane (câmpuri)
asemenea în unui tabel Excel. S-au îmbinat facilităţile de proiectare cu cele de
introducere de date.
A apărut o filă adiţională – Datasheet din Table Tools – special destinată creării
structurii tabelei în acest mod. Această filă are 4 grupuri: Views,
Fields & Columns, Data Type & Formatting şi Relationships,
după cum se observă şi în fig. 3.2.

Figura 3. 2– Fila contextuală Datasheet


Grupul Views permite comutarea între diferite moduri de vizualizare a tabelei.

Grupul Fields & Columns asistă operaţiunile de adăugare, inserare, ştergere şi


redenumire de coloane (câmpuri). Butonul New Field are ca efect afişarea unei
liste de câmpuri predefinite, din şabloanele de tabele implicite ale mediului
Access. Se prezintă sub forma unui panou din care se pot culege câmpuri spre a se
plasa în structura noastră. Lista de câmpuri predefinite apare în imaginea din
partea dreaptă. Butonul Add Existing Fields permite „împrumutul” de câmpuri
din alte tabele, iar Lookup Column va facilita introducerea de date prin definirea
unor liste pe baza unor valori introduse de utilizator sau culese din alte câmpuri.

Grupul Data Type & Formatting se adresează facilităţilor de atribuire a unor


tipuri de date coloanelor existente, restricţii, dar şi capabilităţi de formatare
asemănătoare cu cele din Excel.

Grupul Relationships va gestiona relaţiile dintre tabelele bazei de date, afişând


pentru obiectul curent eventualele obiecte dependente.
După definitivarea structurii se solicită salvarea tabelei, iar utilizatorul îi va atribui
un nume sugestiv.

În orice moment, utilizatorul poate comuta din modul de vizualizare a datelor


(Datasheet View) în modul proiectare (Design View), selectând această opţiune
din lista derulantă a butonului View (după cum se observă în imaginea din
dreapta). Aceasta este modul clasic de creare/modificare a structurii unei tabele
Access, interfaţa vizuală fiind puţin îmbunătăţită.

Tabelele reprezintă „cărămizile” esenţiale folosite la construcţia unei baze


de date. Toate celelalte obiecte ale bazei de date se bazează pe aceste tabele. La fel
ca şi în Visual FoxPro, o tabelă are un antet (structură) şi un conţinut (înregistrări).
În mod obişnuit, fără a fi legaţi strict de momentul creării bazei de date, o tabelă
poate fi creată în următoarele moduri:
 direct în modul de introducere/vizualizare a datelor (Table/Datasheet
View);
 în modul de proiectare (Design View/Table Design);
 prin utilizarea unor şabloane (Table Templates);
 prin import din alte produse sau din versiunile precedente (Import).

Crearea tabelelor în modul de introducere date (Table View)


Odată ce baza de date a fost creată, a sosit timpul pentru
crearea tabelelor acesteia. Fie că suntem în aceeaşi sesiune de lucru
cu crearea bazei de date, fie ulterior, tabelele se pot crea prin
definirea structurii în mers. Adică, în formularul standard de
introducere a datelor se poate defini şi structura.
Ulterior creării bazei de date, trebuie să accesăm fila Create, pentru
a face acest lucru.
Doar grupul Table este destinat lucrului cu tabele. Acţionarea
butonului Table va duce la crearea unei tabele cu un singur câmp
(ID) şi un nume predefinit (Table1). Fila contextuală Datasheet îşi
face apariţia. Butoanele acesteia au fost prezentate în secţiunea
anterioară. Opţiunile acesteia cu privire la gestiunea coloanelor, se
regăsesc şi în meniul contextual al oricărei coloane, prezentat de noi
în imaginea din dreapta. Câmpurile nou introduse poartă nume
generice – Field1, Field2, … – până la stabilirea unui nume. E
suficient să se tasteze o valoare într-o linie a coloanei ”Add New Field” pentru
apariţia unui nou câmp.

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.

Figura 3. 3 – Definirea structurii tabelei în Tabel Design

Tabelul de definire a câmpurilor

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.

Tip de dată Descriere Exemplu


Number Stochează doar numere. Se folosesc în Numărul de produse de un
general pentru acele câmpuri care vor anumit tip vândute,
fi folosite în calcule. precum 200
AutoNumber Un număr care se incrementează Un număr de identificare
automat fie secvenţial, fie aleatoriu. al unui client, precum
Nu poate fi actualizat 123243
Currency Un câmp monetar stochează o valoare Preţul unitar al unui
numerică, reprezentând valute reale produs, precum $41.99
sau simbolice cu subdiviziunile lor.
Se foloseşte şi în calcule.
Short Text Un text de până la 255 caractere, chiar Denumirea unui produs,
şi de format numeric, atunci când nu precum ”Access”, număr
este destinat calculelor. de telefon, cod poştal
Long Text Un text de până la 65536 caractere
Memo Un câmp memo poate memora texte O descriere mai lungă, o
mai lungi, formatate, de până la poveste, o poezie
65.536 caractere.
Hyperlink O combinaţie de litere şi numere O cale în cadrul reţelei
memorate ca text într-un format mai locale, adresă URL
special, precum al unei legături de tip
hyperlink. Poate avea până la 2.048
caractere.
Yes/No Stochează valori de adevăr (true şi O confirmare a calităţii
false; yes şi no). unei proprietăţi
Date/Time Un câmp Date/Time memorează date Data unei facturi,
calendaristice şi momente de timp. comenzi, precum
14/10/2010 5:21 P.M.
OLE Object Un câmp OLE object memorează Registre de calcul Excel,
obiecte create de programe, altele documente Word, grafice,
decât Access, dar care sunt legate sau sunete
Tip de dată Descriere Exemplu
încapsulate într-o tabelă Access.
Attachment În cadrul unui astfel de câmp se Unul sau mai multe
stochează fişiere de genul celor registre de calcul Excel,
ataşabile la un mesaj electronic. documente Word, grafice,
sunete ataşate unei valori a
unui câmp
Lookup Nu reprezintă un câmp anume, ci o Alegerea unităţii de
Wizard … facilitare a modului de introducere a măsură dintr-o listă, a
datelor, prin definirea unor liste pe valutei, a localităţii
baza unor valori-utilizator, sau
generate din alte câmpuri.
Calculat Pe baza de formula
Tabelul 3. 1 – Tipuri de date în MS Access

Description (Descriere). Acest câmp este opţional. În cazul în care cele 64 de


caractere ale denumirii câmpului n-au fost suficiente, aici se poate detalia până la
255. Se pot specifica elemente suplimentare documentării câmpului, care vor fi
utile persoanelor care vor introduce date sau vor consulta tabela. Ceea ce se trece
aici va fi vizibil în bara de stare când se accesează câmpul.

Proprietăţile câmpurilor. Vom prezenta unele elemente prezente în panoul de


proprietăţi destinate câmpurilor, fila General.

Field Size (Dimensiunea câmpului). În general descrie subtipul. Pentru


texte se va specifica dimensiunea maximă admisă în număr de caractere. Ele sunt
recapitulate în ceea ce urmează, descrierea lor făcându-se tot în Capitolul 2.
Number: Byte, Integer, Long Integer, Single, Double, Replication ID şi Decimal.
Short Text – specificarea unui număr de cel mult 255 caractere
Nu este prezentă această proprietate la tipurile: Autonumber, Currency, Memo,
Date/Time, Hyperlink, Yes/No.
Format. Stabileşte formatul de afişare. Este foarte util în special la câmpuri
Date/Time.
La Number avem – General, Currency, Fixed, Standard, Scientific – detaliate în
Tabelul 3. 2 – Formate numerice.
Format Valoare Afişaj
3456.789 3456.789
General
–3456.789 –3456.789
Number
$213.21 $213.21
Currency 3456.789 $3,456.79
Format Valoare Afişaj
–3456.789 ($3,456.79)
3456.789 3456.79
Fixed –3456.789 –3456.79
3.56645 3.57
Standard 3456.789 3,456.79
3 300%
Percent
0.45 45%
3456.789 3.46E+03
Scientific
–3456.789 –3.46E+03
Tabelul 3. 2 – Formate numerice1
La Date/Time avem – General Date, Long date, Medium Date, Short Date, Long
Time, Medium Time, Short Time – detaliate în Tabelul 3. 3 – Formate Date/Time.
Format Descriere
(Implicit) Dacă valoarea este o dată calendaristică,
atunci informaţia despre timp lipseşte; dacă valoarea
este un mmoment de timp, atunci informaţia referitoare
General Date
la dată nu este afişată. Această setare este o combinaţie
între setările Short Date şi Long Time. Exemple:
4/3/93, 05:34:00 PM şi 4/3/93 05:34:00 PM.
Identic cu setările regionale (Control Panel) pentru
Long Date
Long Date. Exemplu: Saturday, April 3, 1993.
Medium Date Exemplu: 3-Apr-93.
Identic cu setările regionale pentru Short Date.
Short Date
Exemplu: 4/3/93.
Identic cu setările regionale din fila Time. Exemplu:
Long Time
5:34:23 PM.
Medium Time Exemplu: 5:34 PM.
Short Time Exemplu: 17:34.
Tabelul 3. 3 – Formate Date/Time2

Yes/No – Yes/No, True/False, On/Off, -1/0.

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

Formatele numerice pentru numere au de la 1 la 4 secţiuni separate între ele cu (;).


Fiecare secţiune conţine specificaţiile de format pentru un tip diferit de număr. I. –
format pentru numere pozitive; II. – format pentru numere negative; III. – format
pentru valori zero; IV. – format pentru valori Null.

Ex. $#,##0.00[Green];($#,##0.00)[Red];"Zero";"Null"

Decimal Places (Număr zecimale). Se foloseşte doar pentru numere


neîntregi şi specifică precizia. Utilizatorul poate selecta până la 15 zecimale, sau
„Auto” pentru controlul automat al acestora.
Input Mask (Mască de intrare). Uneori avem nevoie de un format de
introducere, acolo unde sunt date care trebuie să se conformeze unui format mai
strict impus de utilizator, cum ar fi numerele de telefon, codurile poştale,
formatele de dată etc. Putem alege între formate speciale preexistente sau să
definim formate proprii. Fără aceste măşti de intrare, un utilizator străin faţă de cel
care a făcut proiectarea, n-ar şti exact cum să introducă datele.
Proprietatea InputMask conţine 3 secţiuni distincte, separate de asemenea cu (;).
Secţiune Descriere
Specifică însăşi masca de introducere, de exemplu, !(999) 999-9999.
I. Pentru o serie de tipuri de caractere se poate utiliza tabelul următor în
vederea stabilirii caracterelor dorite în masca de intrare.
Specifică dacă Microsoft Access va memora în tabelă toate caracterele
prezente sau doar cele efectiv introduse. Dacă e 0 atunci şi formatele
II. auxiliare precum unii delimitatori (paranteze, liniuţe, /, puncte etc.) vor fi
de asemenea memorate. Dacă e 1, sau secţiunea e necompletată, doar
caracterele introduse vor fi stocate.
Specifică acel caracter ce va fi prezent în masca de introducere, care ţine
III. locul caracterului ce urmează să fie introdus. Poate fi orice caracter, dar
de obicei e spaţiu sau underscore. Se va trece caracterul între ghilimele.

La definirea măştilor de intrare, se pot folosi următoarele caractere.


Caracter Descriere
0 Cifră (0 - 9, necesită introducere, semnele + şi – nu sunt admise).
9 Cifră sau spaţiu (introducere opţională, semnele + şi – nu sunt admise).
Cifră sau spaţiu (introducere opţională; spaţiile sunt afişate precum
#
caractere blank, dar acestea sunt şterse când sunt memorate la salvarea
Caracter Descriere
datelor; semnele + şi – sunt admise).
L Literă (A - Z, introducere obligatorie).
? Literă (A to Z, introducere opţională).
A Literă sau cifră (introducere obligatorie).
a Literă sau cifră (introducere opţională).
& Orice caracter sau spaţiu (introducere obligatorie).
C Orice caracter sau spaţiu (introducere opţională).
Simboluri separatoare pentru mii, punct zecimal, separatori pentru timp
. , : ; - / şi date. (Caracterul actual depinde de setările regionale din Control
Panel).
< Transformă toate caracterele în minuscule.
> Transformă toate caracterele în majuscule.
Face ca masca de introducere să fie afişată de la dreapta la stânga.
! Caracterele tipărite în mască vor fi afişate întotdeauna de la stânga la
dreapta. Simbolul poate fi inclus oriunde în mască
Caracterul care îi urmează să fie afişat doar ca şi caracter literal (de
\
exemplu, \A este afişat doar ca A).
Tabelul 3. 4 – Caractere speciale utilizabile în masca de intrare
Observaţie: Introducerea în masca de intrare a cuvântului "Password" va
crea un obiect de control care va gestiona parolele. Orice caracter tastat va fi
memorat aşa cum a fost introdus, dar va fi afişat ca un asterisc (*). [Access 2007
Help]
Exemple:
Mască de intrare Valori de testare
(000) 000-0000 (206) 555-0248
(999) 999-9999 (206) 555-0248
( ) 555-0248
(000) AAA-AAAA (206) 555-TELE
#999 –20
2000
>L????L?000L0 GREENGR339M3
MAY R 452B7
>L0L 0L0 T2F 8M4
00000-9999 98115-
98115-3007
>L<?????????????? Maria
Gheorghe
SSN 000-00-0000 SSN 555-55-5555
>LL00000-0000 DB51392-0493
Tabelul 3. 5 – Exemple de măşti de intrare
Caption (Antet alternativ). Permite afişarea unui alt antet pentru câmp
decât numele acestuia
Default Value (Valoare implicită). Este valoarea de iniţializare. Când
introducem date în tabelă, dar nu ne atingem de anumite câmpuri, atunci acestea se
vor completa automat cu valoarea stabilită aici. Valoarea implicită pentru numere
este 0. Pentru date se poate pune de multe ori data curentă
Validation Rule (Regulă de validare). Se testează dacă valoarea introdusă
corespunde unor reguli definite de utilizator. Vom seta aceste reguli în funcţie de
cerinţele afacerii modelate. Exemplu: preţurile şi stocurile nu pot fi negative,
notele să fie între 1 şi 10, data angajării să fie mai mare decât data naşterii etc.
Validation Text (Mesaj de eroare la validare). În cazul în care valorile
introduse contravin regulilor stabilite la rubrica precedentă, se va afişa un mesaj de
eroare. Se recomandă ca mesajul să fie sugestiv şi să descrie negaţia regulii.
Exemplu: Dacă avem pentru preţ regula că trebuie să fie POZITIV, atunci mesajul
ar putea fi: „Preţul nu poate fi NEGATIV!”.
Required (Obligativitate). Stabileşte dacă la completarea acestui câmp e
obligatoriu sau nu să punem o valoare. Se traduce ca NOT NULL/NULL.
Indexed (Indexare). Menţionează dacă acest câmp va fi un index sau nu.
Dacă da, se va mai preciza dacă acceptă sau duplicate.
Smart Tags (Etichete inteligente). Se poate alege dintr-o colecţie
predefinită cu facilităţi de actualizare automată.
Atunci când există date într-un câmp îmbogăţit cu
această facilitate, simbolul este afişat în partea
dreaptă a valorii câmpului respectiv. Atunci când
simbolul este accesat, o listă verticală se va
desfăşura. Când se selectează o intrare din acea listă, vom fi direcţionaţi către o
adresă a unui site în vederea realizării unei căutări sau generării unei situaţii.
Figura 3. 4– Fereastra Smart Tags

Exemplu: Într-un câmp se memorează simbolurile de tranzacţionare pe o piaţă


bursieră. Dorim ca atunci când introducem/vizualizăm un astfel de simbol, să fim
direcţionaţi pe site-ul oficial al bursei respective şi să ni se afişeze cotaţia curentă.

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.

Pentru fiecare câmp se vor completa informaţiile relevante


prezentate mai sus. Câmpurile se trec unul sub celălalt.
Operaţiunile de gestiune a rândurilor acestui tabel sunt
similare cu modul de lucru întâlnit în Excel. Se poate folosi fie
meniul contextual prezent în imagine, fie butoanele din dreapta
grupului Tools, fie prin operaţiuni drag&drop. Pe lângă acestea,
există posibilitatea setării cheii primare (se selectează mai întâi
câmpul/câmpurile) apoi butonul Primary Key. Pentru compunerea unor expresii
mai complexe utilizabile în diferite proprietăţi ale câmpului (ex. la reguli de
validare, la expresii implicite) se acţionează butonul Builder sau butonul din
dreapta zonei în care se introduc proprietăţile.
Când toate câmpurile sunt configurate corespunzător cerinţelor, putem
închide şi salva tabela. Dacă nu am făcut-o încă, putem să-i atribuim o denumire.
În cazul în care nu s-a definit cheia primară, Access ne chestionează în legătură cu
posibilitatea inserării uneia automat. Putem accepta sau declina invitaţia. Dacă
răspundem afirmativ o primă coloană de tip AutoNumber, cu numele ID va fi
introdusă din oficiu.

Crearea tabelelor prin utilizarea unor şabloane (Table Templates)


Acest mod de proiectare porneşte de la un şablon predefinit, pe care dorim
să-l ajustăm cerinţelor noastre. Pentru aceasta vom folosi Create → Tables →
Table Templates. Există câteva tabele-şablon, prezentate şi în imaginea din
stânga. Alegerea unui anumit şablon are ca efect premisele creării unei tabele cu
toate câmpurile definite în viziunea Microsoft. Utilizatorul poate face
particularizări în funcţie de nevoile sale, fie în modul Design View, fie în
Datasheet View (introducere date). De multe ori însă, efortul de personalizare
este mult mai costisitor decât crearea tabelei fără nicio propunere de structură.
Totuşi, înainte de crearea unei tabele care există şi în şabloanele predefinite, se
recomandă să se consulte în prealabil şi peste acele şabloane, în vederea realizării
unei proiectări cât mai solide şi care să nu necesite dese revizuiri.

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.

Operaţii la nivel de articol în tabele


Într-o bază de date MS Access se pot efectua următoarele operaţii asupra
înregistrărilor din tabele:
 Adăugarea de noi înregistrări
 Ştergerea de înregistrări
 Căutarea înregistrărilor
 Actualizarea înregistrărilor
 Ordonarea înregistrărilor şi
 Filtrarea înregistrărilor.
Cât timp programarea în Access nu reprezintă un obiectiv al acestui
material, vom prezenta doar abordarea „vizuală”. Toate operaţiile amintite vor fi
efectuate în modul Datasheet View.
Adăugarea de înregistrări noi
Se pot adăuga noi înregistrări direct la sfârşitul tabelei, în linia goală
marcată cu simbolul . Când tabela noastră are multe înregistrări, iar pentru a
ajunge la ultima înregistrare ar trebui să folosim bara de defilare verticală, se poate
trece la adăugarea unei înregistrări vide fără a apela la barele de defilare, ci se
selectează direct butonul – New (blank) Record – din bara de navigare aflată
în partea de jos a ferestrei Datasheet View. Se poate alege şi butonul Home →
Records → , Home → Go To → New, combinaţia Ctrl ++, sau opţiunea
din meniul contextual obţinut la selectarea unei înregistrări.

Figura 3. 5 – Modalităţi de adăugare înregistrări

Chiar dacă selectăm o înregistrare intermediară în prealabil, apoi utilizăm


una din metodele de creare de înregistrări noi, nu este posibil să efectuăm inserări
de date, ci trebuie să completăm date în linia marcată cu asterisc.
Pentru abandonarea înregistrării, în cazul în care am introdus deja unele
date în noua înregistrare, apăsăm tasta Esc. La acest nivel nu se nici poate reveni
cu o comandă de tip Undo, decât în cazul editărilor din interiorul unei celule.
Ştergerea înregistrărilor
Dacă hotărâm că o anumită înregistrare sau mai multe, însă neapărat
adiacente, nu mai trebuie să facă parte din tabelă, putem renunţa la acestea, prin
ştergere. Trebuie să le selectăm, apoi fie apăsăm tasta Del, fie alegem Delete
Record din meniul contextual sau din opţiunea Home → Records → Delete.

Vom fi apoi avertizaţi asupra ireversibilităţii operaţiei, precum şi a numărului de


înregistrări ce pot fi afectate, precum în imaginea din dreapta. Dacă nu ne
răzgândim – acţionăm butonul Yes – ştergerea se efectuează.
Căutarea înregistrărilor
În cadrul unei tabele, căutarea se poate efectua secvenţial, înregistrare cu
înregistrare, înainte sau înapoi, folosind butoanele de navigaţie
din cadrul ferestrei Datasheet View. Se
pot efectua şi deplasări extreme – la prima, respectiv ultima
înregistrare – sau ţintită pe o anumită înregistrare, dacă se tastează
numărul ei, iar apoi se acţionează Enter. E similar cu GO/GOTO sau
SKIP din Visual FoxPro. Access are opţiuni similare în Home → Go
To (First, Last, Next şi Previous) din cadrul grupului Find. Chiar şi adăugarea e
permisă.
De cele mai multe ori, căutarea bazată pe numărul de înregistrare este
ineficientă, utilizatorul trebuind să le parcurgă pe fiecare şi să identifice el valorile
unui anumit câmp ce prezintă interes. Pentru acest scop folosim tipul de căutare
similar cu cel din Word. Home → Find sau Ctrl + F se utilizează în acest scop.
Figura 3.6 – Fereastra de căutare după o anumit

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

Înlocuirea se poate declanşa şi din fereastra de căutare – Figura 3 – în cazul


în care se accesează fila Replace. Căutarea şi înlocuirea sunt similare cu cele din
procesoarele de texte, cu diferenţa că opţiunile suplimentare nu sunt atât de
complexe. Există şi alte obiecte, precum formulare, macrocomenzi sau interogări,
care pot produce actualizări în tabele, însă ne-am limitat doar la operaţiunile
efectuabile în Datasheet View în cadrul tabelelor.
Ordonarea înregistrărilor
De cele mai multe ori, regăsirile de informaţii sunt facilitate de o sortare
prealabilă adecvată scopului căutării. Înregistrările unei tabele pot fi aranjate în
funcţie de diverse criterii. Criteriul poate fi simplu sau compus, crescător sau
descrescător. La fel ca în Visual FoxPro, ordonarea se poate realiza prin sortare
sau indexare. Vom detalia doar prima variantă.
Dacă sortarea reclamă un criteriu simplu (o singură
coloană), atunci vom selecta acea coloană şi vom selecta fie unul
dintre cele două butoane prezente în stânga (din Home → grupul Sort &
Filter), una din opţiunile meniului contextual ilustrate în dreapta, identice cu cele
prezente şi în lista de la filtrarea automată. Apoi, se realizează sortarea, fără a ţine
cont de tipul caracterelor în cazul câmpurilor de tip text.
Opţiunile de sortare nu sunt atât de complexe precum în cazul tabeloarelor
precum Excel. Nu se poate stabili dacă dorim sau nu ignorarea tipului de caractere,
sortarea după liste personalizate. Şi în cazul sortărilor cu criterii compuse sunt
probleme, neputându-se selecta, şi deci şi sorta, decât coloane alăturate, coloana
cea mai din stânga fiind criteriul principal, următoarea secundar etc. O altă
problemă este faptul că nu se poate sorta crescător după criteriul principal şi
descrescător după cel secundar, sau invers într-un mod foarte facil. Va fi ori după
toate ascendent, ori descendent.
Observaţie: Am aflat că nu putem sorta multicriterial decât după coloane
adiacente, iar criteriile din partea stângă sunt mai importante. Dar dacă avem o
tabelă cu mai multe câmpuri, C1, C2, …, Cn şi noi avem nevoie de o sortare C4,
C2? Putem face una C2, C3, C4, sau C1, C2, dar nu ne sunt de nici un folos. Ce
facem? Va trebui să apelăm la următorul artificiu: înainte de a efectua sortarea,
vom muta câmpul C4 chiar înaintea lui C2. Mutările se fac prin glisarea antetelor
de coloană şi nu afectează structura. Acum se poate realiza şi sortarea dorită.

Figura 3. 8 – Sortarea descendentă după Denumire şi Stoc

În fig.3.8.avem o sortare multicriterială după două


câmpuri, mutate în prealabil pentru a putea efectua
această operaţie.
Observaţie: Se pot efectua şi ordonări fără
mutarea prealabilă a coloanelor şi cu sensuri
diferite de sortare pentru fiecare criteriu, dar e
nevoie de cunoştinţe mai aprofundate. Astfel, vom
utiliza facilitate Home → Advanced → Advanced
Filter/Sort …. E suficient să completăm doar liniile
Field şi Sort, cu criteriile de sortare, respectiv
sensul sortării, precum se poate observa şi în imaginea din dreapta. Pentru a vedea
rezultatul sortării, se va acţiona Home → Advanced → Apply Filter/Sort. Odată
efectuată sortarea, câmpurile participante vor si însoţite în antet şi de o săgeată de
mici dimensiuni, îndreptată în sensul ordonării.
Filtrarea înregistrărilor
Filtrarea reprezintă afişarea doar a înregistrărilor care satisfac un anumit
criteriu. Există mai multe opţiuni de filtrare, îmbogăţit şi îmbunătăţite faţă de
versiunile Access anterioare.

Filtrarea joacă un rol deosebit de important în cadrul tabelelor


de dimensiuni mari. Acţionarea butonului din partea stângă,
aflat în grupul Sort & Filter permite afişarea facilităţilor de
autofiltrare la nivelul câmpului curent.
Cea mai rapidă metodă de filtrare e în funcţie de
valoarea selectată. Conţinutul meniului contextual şi a
listei din cadrul Home → Selection din cadrul grupului
Sort & Filter se adaptează tipului de date al valorii
selectate. De exemplu, pentru numere avem o mostră în
imaginea din dreapta. Alte metode, mai puţin utilizate
ar fi filtrarea pe baza condiţiilor setate într-un formular
(Filter By Form, Figura 3. ) şi filtrarea avansată (Advanced Filter/Sort…, Figura
3. ). Aceste opţiuni apar în Home → Advanced, opţiuni prezente şi în partea
stângă. Aplicarea acestor filtre necesită utilizarea opţiunii Apply Filter/Sort.
Indiciile privind faptul că o tabelă este sub influenţa unui filtru sunt marcajul
din partea dreaptă a barei de navigaţie şi simbolurile în formă de pâlnie
afişate în antetele câmpurilor implicate.

Figura 3. 9 Fereastra Filter by Form

Filtrele avansate se creează într-un mod asemănător construcţiei


interogărilor în modul Design.
Figura 3. 10– Fereastra Advanced Filter

În Figura 3. 11. se configurează un filtru care să returneze acele produse cu


denumirea „Laptop”, exprimate în bucăţi şi care există pe stoc în cantitate mai
mare de 5. În Figura 3. se poate observa că o înregistrare îndeplineşte criteriile
formulate.

Figura 3. 11 – Rezultatul aplicării filtrului

Anularea temporară a filtrelor se realizează în următoarele moduri:


acţionarea butonului din bara de navigaţie a ferestrei (care devine
ulterior ), din grupul Sort & Filter, opţiunea Clear All
Filters al listei Advanced, selectarea opţiunii (unde
„Denumire” este un câmp filtrat), sau comutarea pe caseta de validare Select All
din cadrul opţiunilor de autofiltrare din cadrul fiecărui câmp.
Capitolul 4 – Gestiunea bazelor de date

4.1. Gestiunea bazelor de date


Despre bazele de date
Este un obiect care poate conţine:
 Căi şi pointeri către tabelele conţinute,
 Relaţii persistente între tabele,
 Regulile de păstrare ale integrităţii referenţiale,
 Denumiri lungi pentru tabele şi câmpuri,
 Nume alternative pentru câmpuri,
 Formate pentru câmpuri,
 Reguli de validare la nivel de înregistrare şi câmp,
 Proceduri stocate şi declanşatori,
 Tabele virtuale locale şi la distanţă,
 Conexiuni la baze de date şi tabele.

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.

Crearea bazelor de date


O bază de date poate fi creată în diverse moduri – prin utilizarea meniurilor,
comenzilor, şi barelor de instrumente – iar procesul poate fi gestionat în mod
asistat prin intermediul unor instrumente vizuale precum Database Designer.

4.2. Gestiunea bazelor de date în Microsoft Access


În MS Access nu putem avea tabele libere în sensul cuvântului. Toate
tabelele trebuie incluse într-o bază de date, un fişier *.ACCDB. Într-o bază de date
putem crea tabele, adăuga altele sau importa din alte baze de date, sau crea legături
la tabele externe, nu neapărat realizate în Access 2013.
Crearea unei baze de date se poate face chiar la pornirea Access, prin
selectarea butonului Blank Database. Tot din pagina introductivă pot fi selectate
bazele de date cel mai recent deschise, sunt puse la dispoziţie o serie de categorii
de şabloane şi se pot consulta o serie de resurse pentru documentare şi suport.
Adăugarea de noi tabele se face din fila Create, grupul dedicat tabelelor.
Importurile sau legăturile fişierele externe se gestionează prin intermediul filei
External Data → Import and Link.
Totodată, un subset de facilităţi de import sunt prezentate şi sub formă de opţiuni
ale submeniului Import din cadrul meniului contextual obţinut prin selectarea unei
tabele din cadrul panoului de navigaţie, şi prezent în imaginea din dreapta.

Vom alege External Data → More→ .


Se poziţionează butonul radio pe opţiunea de import dorită – Import sau
doar legătură – şi se acţionează butonul Browse… pentru stabilirea locaţiei sursei
(fişierului ce se doreşte a fi importat). În fereastra de dialog File Open se va alege
fişierul cu extensia dorită, dar neapărat din lista Files of type se va selecta tipul de
fişier specific.
Figura 4. 1 – Stabilirea tipului de fişier pentru importul de tabele din Visual FoxPro

Observaţie: E posibil să nu fie recunoscut formatul, chiar dacă este prezent


în listă acest format. La trecerea spre pasul următor va apărea mesajul din dreapta.
Se va putea alege şi formatul dBASE IV, dacă în prealabil tabelele se exportă
prin intermediul VFP în acest format. Pot apărea probleme la importul în Access
şi datorită dimensiunilor numelor tabelelor (peste 8 caractere) sau a prezenţei unor
simboluri speciale în nume.

La ultimul pas suntem rugaţi să documentăm importul, având şi


posibilitatea salvării paşilor anteriori, pentru ca în viitor
să putem să accesăm importul direct din lista Saved Imports, fără a mai trebui să-
l parcurgem pas cu pas. Tabelele importate apar precum cele două din imaginea
din stânga, unde cel de-al doilea este o legătură la un fişier dBASE extern, deci nu
o tabelă de sine stătătoare tip Access.

4.3. Stabilirea relaţiilor dintre tabele


Despre relaţiile dintre tabele
Aşa cum menţionam anterior, o bază de date reprezintă o colecţie de fişiere
integrate împreună cu relaţiile dintre ele.
În secţiunea anterioară s-a discutat cum se pot adăuga tabele unei baze de date.
Avem baza de date, avem tabele cu câmpuri cu denumiri mai lungi şi cu reguli de
validare, dar acestea nu sunt motive suficiente de a le ţine împreună într-o bază de
date. Probabil că aceste tabele trebuie să aibă ceva mai multe lucruri în comun.
Având în aceeaşi bază de date o tabelă cu studenţii unei facultăţi, alta cu produsele
create de o fabrică, alta cu plantele care există într-o anumită zonă, iar alta cu
avioanele care aterizează şi decolează de pe un aeroport, nu ar fi chiar un exemplu
model pentru o bază de date.
Cele mai bune motivaţii pentru a ţine laolaltă nişte tabele, este capacitatea lor de
interrelaţionare, astfel încât:
 Să obţinem un conţinut informaţional global îmbogăţit
 Să obţinem (integritatea referenţială) şi să menţinem (regulile integrităţii
referenţiale) coerenţa şi corectitudinea bazei de date.
Exemplu. Nu putem cumpăra sau vinde un anume produs despre care nu avem
nicio informaţie că ar exista, sau nu avem cunoştinţă despre clientul sau
furnizorul care participă la însăşi tranzacţia de vânzare-cumpărare; nu putem
şterge/actualiza detaliile legate de un produs sau partener dacă nu
ştergem/actualizăm şi informaţiile din tranzacţiile la care aceştia au participat,
sau cel puţin să interzicem astfel de distorsionări informaţionale sau
inconsistenţe.
 Să creăm cadrul necesar extragerii de informaţii mai complexe, provenite
din mai multe tabele, nu doar informaţii disparate, prin intermediul
procesului de interogare Exemplu. Informaţii precum obţinerea „denumirii
clienţilor dintr-o zonă geografică” pot acum fi îmbogăţite cu „care au avut
cele mai mari vânzări în ultimele 3 luni”. Astfel de informaţii complexe
rareori pot fi extrase dintr-o singură tabelă.

Database Designer-ul permite crearea de relaţii persistente (permanente sau


statice) dintre tabele. Acestea au şi o reprezentare intuitivă (vizuală) în această
fereastră. Într-o bază de date, relaţiile dintre două tabele pot fi create doar pe acele
câmpuri care au aceeaşi semantică – aceasta poate fi tradusă ca „mulţimi de valori
care se suprapun parţial” – chiar dacă uneori câmpurile sunt denumite diferit.
Deoarece relaţiile se stabilesc între două elemente (tabele), se numesc
relaţii binare. Una dintre tabele este denumită tabelă-părinte, iar cealaltă tabelă-
fiu. Tabela părinte (principală, primară) este acea tabelă care are câmpul de
legătură în calitate de cheie primară sau candidată. Cealaltă, a cărei câmp de
legătură este cheie străină, este tabela fiu (secundară, dependentă).

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.

Crearea relaţiilor persistente


Relaţiile de tip 1:n sunt cele mai folosite în cazul bazelor de date
relaţionale. Pentru crearea acestui tip de relaţii binare persistente între tabele,
trebuie să executăm paşii următori:

1. Deschideţi fereastra Database Designer


2. Adăugaţi/creaţi tabelele implicate în relaţie şi populaţi-le cu date, dacă e
necesar
3. Definiţi cheile (indecşii) primari/candidaţi în tabelele părinte. Asiguraţi-vă
înainte că acele câmpuri ce vor fi alese, nu conţin duplicate. Indecşii
candidaţi sunt reprezentaţi în zona Indexes ca având denumirea scrisă
îngroşat, precum . În plus, cheia primară are înaintea denumirii şi o
cheie stilizată, precum
4. Definiţi cheile străine (regular indexes) în tabelele fiu. Acestea se reprezintă
sub forma unor etichete fără vreo formatare aparte, în care este trecut
numele lor şi sunt plasate în zona Indexes
5. Tragerea cu mouse-ul (drag & drop) dinspre indecşii primari/candidaţi din
tabela părinte peste indecşii regular din tabela fiu. Doar elementele din zona
Indexes pot fi implicate în acest proces.

Menţinerea integrităţii referenţiale într-o bază de date


Când o bază de date este construită, trebuie să ne asigurăm că elementele
sale componente – tabele şi relaţii dintre ele – nu sunt corupte.

Corectitudinea intra-tabelară se referă la integritatea de domeniu şi de


entitate (unicitatea valorilor cheii primare/candidate şi neacceptarea valorilor
NULL), precum şi unele reguli de întreprindere.

Acurateţea logicii inter-tabelare constă în conceptul de integritate


referenţială.

Chiar dacă termenul pare pompos, abstract, sau filosofic, el exprimă o


realitate foarte concretă şi foarte uşor de înţeles, precum imposibilitatea de a avea
relaţii între lucruri, fapte, sau fenomene care nu există, sau absolut nimeni nu are
cunoştinţă despre existenţa lor. Spre exemplu, nu putem să cumpărăm de la un
magazin detergent, dacă acesta s-a ocupat şi se va ocupa întotdeauna exclusiv de
produse de panificaţie sau lactate.
Să presupunem că în momentul de faţă baza de date fie nu este populată, fie
înregistrările introduse în tabele satisfac cerinţele integrităţii referenţiale. Deoarece
baza de date nu are un conţinut static, trebuie să ne asigurăm că orice operaţiune
de actualizare intervine (adăugare, ştergere sau actualizare)
corectitudinea/coerenţa bazei de date nu este alterată.
Când avem de-a face zilnic cu zeci de mii (un hypermarket) sau poate chiar
milioane (o bancă de dimensiuni modeste) de astfel de operaţiuni, ar fi extrem de
dificil să gestionezi manual toate restricţiile impuse de integritatea referenţială.
REGULI LA ACTUALIZARE (IGNORE, RESTRICT, CASCADE)
Tabela părinte. Se poate actualiza orice înregistrare de care nu este legată vreo
înregistrare din tabela fiu, dar cu respectarea regulilor de actualizare impuse de
integritatea entităţii. Pentru orice altă înregistrare, va trebui să stabilim care
alternativă o alegem:
 Restricţionarea. Nu se permite actualizarea niciunei înregistrări
conectate la cel puţin o înregistrare din tabela fiu;
 Cascadarea. Dacă o valoare a cheii primare/candidate este actualizată,
atunci toate înregistrările din tabela fiu cu care aceasta aveau legătură, vor
fi şi ele actualizate automat, la nivelul cheii străine.
Tabela fiu. Se poate actualiza orice valoare a cheii străine, dar doar la o valoare
ce aparţine setului de valori ale cheii primare/candidate din tabela părinte, sau
la NULL.

REGULI LA ŞTERGERE (IGNORE, RESTRICT, CASCADE)


Tabela părinte. Se poate elimina orice înregistrare care nu este conectată la
vreun articol din tabela fiu. Dacă însă intenţionăm să ştergem orice altă
înregistrare, avem aceleaşi două posibilităţi:
 Restricţionarea. Interzice ştergerea oricărei înregistrări conectate la vreo
înregistrare din tabela fiu;
 Cascadarea. Dacă o asemenea înregistrare este eliminată, atunci toate
înregistrările legate de aceasta din tabela fiu, vor fi şi ele şterse automat.
Tabela fiu. Suntem liberi să ştergem orice înregistrare. Nu avem nicio restricţie în
acest caz.

REGULI LA INSERARE (IGNORE, RESTRICT)


Tabela părinte. Se poate adăuga orice înregistrare, atâta timp cât aceasta nu
contravine integrităţii entităţii (duplicate sau NULL în cheia primară/candidată);
Tabela fiu. Avem doar opţiunea restricţionării. Aceasta spune că nu putem
adăuga un articol având pentru cheia sa străină o altă valoare decât una din
valorile existente în tabela fiu în cadrul cheii primare/candidate, cu care se face
legătura. Ca excepţie, cheia străină poate conţine şi valori NULL.

Dacă noi inserăm în tabela fiu înregistrări care nu au nicio legătură cu


tabela părinte prin intermediul valorilor cheii străine cu cheia primară/candidată;
sau dacă permitem ştergere/actualizarea din tabela părinte a unor înregistrări legate
prin valorile cheii primare/candidate de orice înregistrare care are aceste valori în
cadrul cheii străine prin care se face legătura; sau dacă în condiţiile exprimate
anterior se vor şterge/actualiza doar unele înregistrări din tabela fiu afectate de
schimbările din tabela părinte; atunci noi alterăm de fapt integritatea (consistenţa)
întregii baze de date.
Toate înregistrările din tabela fiu care rămân fără vreo referinţă cu tabela
părinte, se numesc înregistrări orfane. În aceste circumstanţe ele nu pot fi
returnate de interogările sau rapoartele obişnuite extrase din baza de date (cererea
de informaţii din mai multe surse de date se face de regulă pe baza egalităţii
valorilor cheii primare/candidate cu cea străină). Nu ne mai putem pune preţ pe
baza noastră de date, deoarece întâmpinăm pierderi informaţionale, inconsistenţe
şi relaţii deteriorate. Acestea sunt calităţi indezirabile ale unei baze de date.

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

Figura 4. 2 – Exemplu de relaţie 1:n dinamică între Produse şi Istoric_Pret


În exemplul nostru am avut 3 înregistrări cu cheia străină corespunzătoare
având valoarea 10. Deci, în tabela părinte avem înregistrarea originală cu această
valoare a cheii primare şi celelalte câmpuri, plus alte 2 (3-1) articole false umplute
cu o mulţime de semne asterisc „*”. Această facilitate poate fi utilizată doar în
cadrul relaţiilor temporare. Acest tip de relaţii sunt utilizate în general în
programare. Ei pot să îmbogăţească potenţialul relaţiilor permanente, sau pot fi
utilizate ca instrumente de sine stătătoare.

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

4.4. Relaţiile dintre tabele în Microsoft Access


Crearea relaţiilor dintre tabele în Access
Pentru a putea crea relaţiile dintre tabele în MS Access, trebuie să definim
mai întâi cheile primare în tabelele părinte. Apoi, din fila Database Tools →
Relationships.

O filă – denumită Relationships – se deschide în fereastra cu file multiple de pe


suprafaţa de lucru. Este momentul să apară o nouă filă contextuală, Design, din
Relationship Tools. Deasupra ei se va plasa o fereastră de dimensiuni mai mici –
Show Table, descrisă de asemenea în Figura 4. 3.
Figura 4. 3 – Fereastra Show Table

În această fereastră se vor selecta toate tabelele care vor fi implicate în


relaţii. Se selectează tabelele, apoi se acţionează butonul Add. Când am adăugat
toate tabelele necesare – individual sau mai multe odată – se apasă butonul Close,
pentru a putea avea acces la fereastra managerului de relaţii. În cazul în care am
omis includerea vreunei tabele, sau am închis accidental fereastra de selectare a
tabelelor, putem să activăm din nou fereastra Show Table, fie prin selectarea
opţiunii Show Table… din meniul contextual, fie butonul Database Tools →
Show Table.
În fereastra Relationships vom desena relaţiile. Toate cheile primare sunt
marcate prin scrierea îngroşată a câmpurilor, iar în faţă fiind prezent un simbol în
funcţie de cheie. Nu există niciun semn distinctiv între câmpurile obişnuite şi
cheile străine. Nici nu trebuie să facem vreo setare la nivelul lor, precum în Visual
FoxPro. Dacă setarea unei chei primare a fost omisă, putem comuta tabela chiar şi
din această fereastră în modul Table Design, prin selectarea opţiunii cu acest
nume din meniul contextual. Altfel, se poate utiliza varianta tradiţională de
modificare a structurii, după care se revine la fila Relationship. Acum putem să
trecem la definirea relaţiilor. Relaţia se trasează dinspre tabela părinte înspre
tabela fiu. Se prinde cu mouse-ul cheia primară şi se glisează către cheia străină
din tabela de legătură – pentru relaţii 1:n – respectiv pe cheia primară din tabela de
legătură, pentru relaţii 1:1. Se relaxează mouse-ul când vârful săgeţii este deasupra
destinaţiei, şi nu obiectul pe care-l ţinem cu mouse-ul.

Observaţie: Dacă în relaţie nu este implicată nicio cheie primară, atunci


relaţia este considerată nedeterminată (m:n). Trebuie să evităm astfel de situaţii. O
astfel de relaţie poate fi convertită în două relaţii de tip 1:n, aşa cum s-a discutat în
secţiunea precedentă.

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.

Figura 4. 4 – Fereastra Edit Relationships

Implicit, verificarea stării curente precum şi a regulilor integrităţii


referenţiale sunt ignorate.
Pentru activare, trebuie să bifăm caseta de validare Enforce Referential
Integrity. Acum va fi posibil şi stabilirea unor restricţii pentru cele 3 operaţiuni
posibile de actualizare (adăugare, actualizare şi ştergere).
La selectarea Cascade Update Related Fields sau Cascade Update
Related Records, restricţionarea este înlocuită cu cascadarea pentru cele două
tipuri de operaţii.
Relaţiile dintre tabele se bazează pe valorile din câmpurile de legătură. De
aceste relaţii se va profita în cazul interogărilor, rapoartelor sau formularelor.

Uneori, cerinţele afacerii impun afişarea nu doar acelor înregistrări pentru


care valorile acestora sunt egale, dar şi restul (dintr-o tabelă, din cealaltă, sau chiar
din ambele). Acele relaţii unde valorile se potrivesc, fără a fi prezente şi alte
articole, se numesc inner join sau equijoin (joncţiune/uniune internă).
Pentru alte opţiuni, trebuie să selectăm butonul Join Type …. Rezultatul
este afişat în Figura 4. 5. Acestea sunt outer joins (joncţiune/uniune externă),
right outer join (joncţiune la dreapta) şi left outer join (joncţiune la stânga).

Figura 4. 5 – Fereastra Join Properties

Dacă dorim să efectuăm o uniune, în care să afişăm toate înregistrările din


tabela din partea stângă a ferestrei Edit Relationships, şi doar acele înregistrări
din tabela din stânga care satisfac egalitatea, atunci vom alege varianta 2.
Se va selecta cea de-a treia opţiune atunci când se intenţionează afişarea
tuturor înregistrărilor din tabela din dreapta (fiu) şi doar a acelora din tabela din
stânga (părinte) care satisfac egalitatea.
După cum se poate vedea şi în Figura 4. 5, Access-ul furnizează explicaţiile
necesare, utilizând ca exemple chiar tabelele implicate în acea relaţie. După
selectarea opţiunii dorite, trebuie să acţionăm butonul OK, pentru a face
modificarea persistentă.
Dacă nu mai trebuie efectuate alte modificări, selectăm butonul de comandă
Create. Dacă nu apare nicio eroare, care să fie semnalată printr-un mesaj, relaţia
este creată şi desenată. Altfel, e posibil să apară două tipuri de erori, pe care
trebuie să le remediem.

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.

Următoarea eroare apare şi prin simpla activare a verificării integrităţii


referenţiale. Înseamnă că există înregistrări care modifică acest statut, motiv
pentru care trebuie verificate valorile din cele două tabele implicate, astfel încât
cheie străină să nu aibă valori „străine” de valorile cheii primare din tabela părinte.
Trebuie să depistăm înregistrările orfane, prin căutarea acelor valori
problematice. Trebuie să comparăm doar valorile din câmpurile de legătură,
integritatea referenţială „nevăzând” dincolo de acest aspect. Vom identifica
produse de genul celor care au codul 10 şi apar în Facturi sau Istoric_Pret, însă nu
apar în Produse. Nu putem factura sau să-i modificăm unui produs preţul, dacă el
nici măcar nu există.

Figura 4. 7 – Avertizare de încălcare a integrităţii referenţiale

Observaţie: În cazul în care cantitatea de date este mare, trebuie să apelăm


la unele unelte cvasiautomate, precum unele aplicaţii. Totodată, pot exista şi
instrumente pe care le putem găsi în Access şi care ar fi utile remedierii unor astfel
de probleme. De exemplu, putem apela la interogările Find Unmatched Query
Wizard.

Un astfel de exemplu ar fi cel ilustrat în Figura 4. 8.


Figura 4. 8 – Reprezentarea vizuală a relaţiilor unei baze de date

Se observă că avem 5 tabele, implicate în 4 relaţii 1:n. Cardinalitatea lor


este descrisă la capetele liniei ce uneşte tabelele. Simbolul pentru „una” este cifra
1, iar pentru „mai multe” este infinitul (∞).
Relaţiile nedeterminate nu au niciun însemn al cardinalităţii. În plus, există
posibilitatea să avem un capăt sub forma unui vârf de săgeată, ceea ce este un
marcator pentru operaţiile de join extern. Săgeata este plasată în acea partea a
relaţiei, care este deficientă în informaţii.
Informaţia existentă poate fi editată prin dublu-clic pe legătură, sau prin
alegerea după selectare a opţiunii Edit Relationship… sau a butonului Edit
Relationships din fila dedicată.
Relaţiile pot fi eliminate prin selectare, apoi acţionarea tastei Del, ori
alegerea opţiunii Delete a meniului contextual.

4.5. Proiecte Access

Prin OLE DB se înţelege o componentă a arhitecturii bazelor de date,


elaborată de Microsoft, pe baza căreia se urmăreşte legarea prin diverse reţele,
inclusiv Internet, a unor surse diverse de date, cum ar fi baze de date relaţionale,
nu neapărat Microsoft, fişiere clasice, fişiere de poştă electronică, tabele rezultate
de la diverse spreadsheet-uri, etc.
Ca urmare, proiectul se bazează pe o structură clasică client-server de
forma dată mai jos.
Server
Clinet (Proiect Access) (Baza de date SQL Server)

Pagini de acces la date

OLE DB
 Tabele
 Forme  Interogări (imagini,
 Rapoarte proceduri stocate,
 Pagini funcţii utilizator)
 Module  Diagrame de date

Figura 4.20. Arhitectura client-server a proiectului Access

Proiectul Access, fiind deci clientul, conţine elementele de interfaţă cu


utilizatorul (forme, rapoarte, pagini de date Web sau module). Aceste sunt
reprezentate prin cod SQL, VBA sau în HTML.
Obiectele de date (tabelele, interogările şi diagramele de date) sunt stocate pe
serverul de date SQL Server, care poate fi situat pe un alt calculator în reţea sau pe
acelaşi calculator.

Din punct de vedere extern, adică al utilizatorului final, nu există deosebiri


între proiecte şi baze de date. În realitate, din punct de vedere intern deosebirea
este esenţială deoarece, aşa după cum s-a văzut mai sus, în timp ce o bază de date
conţine obiectele de date, proiectul nu conţine astfel de obiecte, fiind destinat
interfeţei cu utilizatorul.

În general, aplicaţiile software sunt complexe, iar conceperea, proiectarea şi


dezvoltarea lor necesită multă muncă, într-un cadru organizat şi sistematizat. Un
proiect reprezintă un set de date corelate (baze de date, tabele şi interogări),
programe, formulare, meniuri şi rapoarte de diverse tipuri, organizate într-o
structură dată, într-o manieră care să permită gestiunea componentelor sale
omogen, indiferent de tipul lor.
Proiectele sunt fişier cu extensia *.ADP în MS Access.
Un proiect Access este un fişier Access care se conectează la o bază de date
Microsoft SQL Server şi se foloseşte pentru crearea aplicaţiilor client-server.
Un fişier de tip proiect nu conţine date sau alte obiecte bazate pe stocarea de date,
precum sunt tabelele sau vederile.
O bază de date Microsoft SQL Server reprezintă o bază de date creată în produsul
cu acelaşi nume. Ea este cea care poate conţine tabele, vederi, indecşi, proceduri
stocate, funcţii şi declanşatori (triggers) şi nu proiectul. Deci, proiectul nu conţine
datele, acestea fiind stocate pe un server de baze de date, dar acest aspect este
transparent pentru utilizatori. Proiectul creează atât conexiuni la un server de baze
de date, cât şi facilitează dialogul dintre utilizator şi date. Nu insistăm pe gestiune
proiectelor de acest fel.

Proiectele sunt privit în general ca interfeţe pentru utilizatori, care oferă


acelaşi mod de exploatare pentru toate tipurile de obiecte gestionate. Fată de
această facilitate, un proiect poate deveni o aplicaţie (fişier *.APP) sau fişier
executabil (*.EXE) de sine stătător.
In Access 2013 se poate realiza o gestiune a obiectelor, similară cu cea
realizabilă în alte sisteme de gestiune a bazelor de date prin Project Manager.
Obiectele sunt organizate şi pot fi manipulate asemănător prin intermediul
panoului de navigare. Obiectele vor fi deschise în fereastra cu file multiple.
Unele facilităţi legate de realizarea de aplicaţii executabile se pot realiza din cadrul
filei Database Tools → grupul Database Tools, de exemplu butonul Make
ACCDE.
Capitolul 5 – Interogări
5.1. Elemente generale privind interogările
Stocarea datelor în baze de date este fundamentul şi pentru interogări,
vederi, sau rapoarte. În funcţie de dimensiunea afacerii pe care ne propunem s-o
oglindim, putem efectua zilnic, orar, din minut în minut sau chiar mai des,
operaţiuni de adăugare/ştergere/actualizare pentru clienţi, furnizori, produse,
tranzacţii etc. Însă, e nevoie de mult mai mult decât atât.
Dorim de fapt să fim capabili să vedem de fapt cum merge afacerea, ceea ce
înseamnă diferite statistici, rapoarte.
Trebuie să fim capabili să răspundem la întrebări de genul:

„Care este volumul vânzărilor într-o perioadă de timp?”;


„Care au fost costurile cu produsele valorificate?”;
„Care este cel mai rentabil sau cel mai puţin rentabil produs sau
categorie?”;
„Care sunt cei mai buni cumpărători sau furnizori de materii prime?”;
„Care este volumul mediu al unei tranzacţii?”;
„Care este valoarea comisionului obţinut de un agent de vânzări, sucursala,
agenţie, sau punct de lucru, vânzările realizate de fiecare sau clasamentul lor?”;
„Care este cel mai (puţin) eficient reprezentant de vânzări?” etc.

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

În funcţie de astfel de răspunsuri, managementul de pe diferite nivele poate lua


anumite decizii în cunoştinţă de cauză, pentru a-şi îmbunătăţi afacerea.
Ei pot creşte/scădea discounturile la anumite produse sau categorii; demararea
unei campanii mai agresive de promovare; scăderea/creşterea ritmului de achiziţie
pentru anumite materii prime; modificarea cotei de comision pentru vânzători sau
palierelor de volum de vânzări pentru o astfel de cotă; acordarea de stimulente
suplimentare pentru realizarea ţintei de vânzări; actualizări de salarii şi stimulente
pentru angajaţi etc.

5.2. Interogări în Microsoft Access


În MS Access interogările sunt legate de sursele de date bidirecţional: ele
provin din sursele de date şi se actualizează odată cu actualizarea acestor surse de
date, respectiv unele surse de date se actualizează automat odată cu actualizarea
interogărilor.
Deci nu conţin efectiv date, ci memorează doar definiţia de capturare a acestor
date.

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.

La selectarea primului buton, o fereastră intermediară va apărea, pentru selectarea


exactă a tipului de interogare dorit.
Înafară de instrumentul interactiv obişnuit (Simple Query Wizard) există 3 tipuri
adiţionale de interogări speciale:
Crosstab Query Wizard,
Find Duplicates Query Wizard
Find Unmatched Query Wizard.
Din fereastra apărută – se va selecta tipul dorit.

Figura 5. 2 – Fereastra New Query

Interogările de acţiune pot fi create de-abia atunci când o interogare este


deja deschisă în modul Design View. Este momentul în care apare fila opţională
Design din cadrul Query Tools. Se va selecta cu uşurinţă subtipul dorit – Make
Table, Append, Update, sau Delete – din cadrul grupului Query Type prezentat
în imaginea din dreapta.

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

Observaţie: Atunci când câmpurile provin din diferite surse, acestea


trebuie să fie implicate într-o relaţie. În caz contrar, un mesaj de avertizare va
apărea pe ecran, împreună cu fereastra Relationships. Apoi, utilitarul de asistenţă
va fi repornit.

În pasul următor trebuie să indicăm gradul de detaliere al informaţiilor ce


vor fi prezentate în cadrul interogării. Pentru informaţii sintetice, va fi nevoie de
aplicarea unor funcţii de agregare asupra unora din câmpurile alese.

4
Figura 5.3– Pasul de selectare al câmpurilor

Figura 5. 4 – Specificarea nivelul de detaliere şi calcul funcţii de agregare

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.

Mai poate să apară un nou pas intermediar de stabilire a unor criterii de


grupare. Se observă că există nivele de granularitate pe criteriul de grupare, atunci
când vine vorba de date calendaristice.
Apoi, ultimul pas va permite alegerea unui nume pentru interogare, pentru a
putea fi recunoscută mai uşor în cadrul panoului de navigare. Interogările se
creează şi cu scopul reutilizării lor ulterioare.

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.

Figura 5.5 – Introducere criteriu de grupare

Figura 5.6 – Specificare denumire interogăre şi opţiuni ulterioare

În afară de stabilirea denumirii interogării, tot aici se poate avea în vedere


ce se va întâmpla în continuare cu această interogare. Avem la dispoziţie două
opţiuni: afişarea rezultatului, respectiv deschiderea interogării în fereastra
constructorului de interogări, pentru a şi opera ajustări ale acesteia.
Dacă se doreşte însă vizualizarea rezultatelor, vom alege prima variantă,
care va genera un tabel.Chiar dacă utilitarul de asistenţă este intuitiv în utilizare, el
are o serie de neajunsuri privind anumite aspecte ale interogărilor. Interogarea va
putea fi deschisă în fereastra Query Designer, pentru a i se aduce unele retuşuri.

6
Figura 5.7 – Rezultat posibil în cazul unei interogări de selecţie

Sunt prezentate informaţii despre actele de comerţ înfăptuite în raport cu


partenerii noştri, evidenţiate prin facturile emise de/către aceştia. Avem şi unele
statistici referitoare la numărul de facturi ale unui partener dintr-o lună, cea mai
recentă factură, discountul mediu într-o anumită lună pentru un partener etc.

Query Designer
Administrarea facilităţilor se realizează prin intermediul unor file, prin
intermediul unui format tabelar.

Exemplu. Vom explica componentele şi prin prisma unui exemplu concret


de interogare: Valoarea totală a vânzărilor produselor care, fie încep cu litera „C”,
fie au litera „p” pe poziţia a treia, ordonate după cuantumul vânzării.

Figura 5.8 – Fereastra Query Designer

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

Figura 5.9 – Fila opţională Query Tools. Design

Şi aici, fereastra constructorului are două panouri orizontale, cel de sus


fiind pentru inventarierea surselor de date de care avem nevoie, în timp ce cel de
jos gestionează opţiunile interogării. În tabelul care îl alcătuieşte pe acesta din
urmă, avem următoarele linii:

Field – Precizează câmpurile şi/sau expresiile ce vor fi folosite fie în


rezultat, fie în raport cu care se vor formula criterii de filtrare sau opţiuni de
ordonare. Elementele simple din această linie se pot introduce fie prin selectarea
lor din lista ascunsă, fie prin executarea unui dublu-clic pe câmpul respectiv din
sursa de provenienţă (din panoul superior).
Se observă că sunt 4 coloane completate, la rubrica Field având:
Denumire, Valoare_Vanzare, Data şi Tip, din care ultimele două nu vor apărea
în rezultat, ci s-au folosit doar pentru filtrări. Dacă numele de câmp nu este prea
sugestiv, sau folosim o expresie, se recomandă folosirea unui alias. Se specifică
aliasul, apoi se separă de câmp sau expresie prin două puncte (:). Altfel, vom avea
antete de tabel în rezultat de genul Exp1, Exp2, …
Expresiile compuse pot fi gestionate mai simplu cu ajutorul ferestrei
Expression Builder. În loc să adăugăm un nou câmp prin metodele amintite,
trebuie doar să selectăm fie opţiunea Build … din cadrul meniului contextual, fie
să acţionăm butonul din grupul Query Setup al filei opţionale Design.

Expresiile se pot tasta manual, lucru care necesită însă o oarecare


experienţă şi familiarizare cu specificaţiile Access de scriere ale expresiilor. În
cazul nostru, calculul valorii vânzărilor ar avea următoarea expresie, dacă se
foloseşte constructorul:

8
Valoare_Vanzare:
[Continut_Fact].[Cant]*[Istoric_Pret].[PU]*(1-
[Facturi].[Disc])*(1+[Istoric_Pret].[CotaTVA]), unde

Valoare_Vanzare este alias, [ ] sunt delimitatorii pentru sursele de date sau


expresii, între care folosim fie (!), fie (.); respectiv simplificat:

Valoare_Vanzare: Cant*PU*(1-Disc)*(1+CotaTVA), dacă tastăm


manual, fără a fi obligaţi să folosim sintaxa mai riguroasă de dinainte, decât
parţial, acolo unde există pericolul confuziei unui câmp dintr-o sursă de date cu
altul având aceeaşi denumire, dar aflat în alta.

Exemplu:
Produse.Cod şi Istoric_Pret.Cod, ce nu pot fi referite simplu Cod.

Table – Este tabela/interogarea din care provine ceea ce am indicat în


rubrica de mai sus (Field). Se va menţine necompletată în cazul expresiilor
calculate. În cazul unei surse surse unice de date, sau la definirea doar a unor
expresii calculate, se poate renunţa la această linie prin acţionarea butonului
.

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.

Sort – Indică direcţia de sortare (Ascending/Descending).


La noi, ordonarea se va face descrescător după valoare (coloana a doua).
Show – Menţionează dacă va fi sau nu afişat câmpul/expresia în cadrul
rezultatului, prin bifarea casetei de validare.
În cazul exemplului nostru, primele două coloane vor fi afişate, iar ultimele
două nu.

Criteria – Descrie o expresie logică simplă sau compusă, legată de


câmpul/expresia din coloana în care ne aflăm. Toate condiţiile prezente în această

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

Or – Se foloseşte atunci când intervine operatorul OR, pentru stabilirea


legăturii cu condiţia din cadrul lui Critera.
În cadrul primei coloane avem o condiţie compusă care necesită şi acest
operator de interconectare al expresiilor individuale. Dacă la Criteria s-a trecut
Like ”C*”, la Or vom trece Like ”??p*”.
Observaţie: Operatorul Like destinat şirurilor de caractere se foloseşte la
fel ca şi în Visual FoxPro, cu excepţia faptului că în loc de caracterul de înlocuire
(%) folosim (*), iar în loc de ( _ ) folosim (?).

Faţă de rubricile implicite, mai putem avea şi linii noi.


Totals – Există o linie specială pentru funcţiile agregate – Sum, Avg, Min,
Max, Count, StdDev, Var, First, Last – pe care o introducem la acţionarea
butonului Totals (prezent în partea dreaptă a paginii) din Design → grupul
Show/Hide, sau a opţiunii din meniul contextual.

Pentru toate câmpurile/expresiile, acesta va trebui să fie setat pe elementul


Group By din lista sa, excepţie făcând coloanele care necesită calculul unei
anumite funcţii de agregare. O altă excepţie se referă la câmpurile care sunt
prezente în panoul inferior al ferestrei Query Designer, dar nu vor apărea şi în
rezultat, ele fiind folosite doar pentru operaţiuni de filtrare. Deoarece clauza din
comanda SELECT care gestionează filtrarea este WHERE, atunci în astfel de
cazuri, vom selecta intrarea Where din listă.
În exemplul nostru, la câmpul Denumire vom avea Group By, la
Valoare_Vanzare vom selecta Sum, iar la Data şi Tip vom pune Where.
O interogare deschisă în fereastra Query Design poate fi rulată în orice
moment, prin acţionarea butonului Run din cadrul filei Design → grupul Results.

Chiar dacă am utilizat interfaţa vizuală, Access va genera şi codul SQL


aferent. Vizualizarea acestuia se realizează fie din meniul contextual prin
selectarea opţiunii , fie prin comutarea pe modul SQL View fie din
fila Home, fie din fila Design.

10
Butoanele aferente sunt prezente în partea dreaptă. Comanda SQL pentru
rezolvarea problemei este prezentată în fig.5.10.

Figura 5.10 – Cod SQL aferent interogare

Lansarea în execuţie a interogării din modul de proiectare, se realizează


prin acţionarea butonului Run din cadrul filei Design.

Figura 5.11 – Rezultat interogare

Interogările cărora li s-a atribuit deja un nume, se lansează prin execuţia


unui dublu-clic pe numele interogării din cadrul panoului de navigare, eventual din
grupul Queries. Acelaşi lucru se poate realiza şi prin selectarea opţiunii Open din
cadrul meniului contextual.

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

Revenind la exemplul nostru, uneori poate dorim să cuantificăm vânzările, iar


alteori tranzacţiile de cumpărare.
Pentru a nu face două interogări separate, e suficient să realizăm doar una singură,
pentru care tipul operaţiunii nu va fi predefinit (vânzare sau cumpărare), ci va fi
precizat la execuţie.
Avem deci nevoie de o variabilă (parametru), pe care o vom menţiona în linia
Criteria.
La execuţie vom fi chestionaţi în raport cu valorile parametrilor introduşi la
proiectare, pentru fiecare apărând câte o casetă de dialog. Parametrul se specifică
între paranteze drepte şi poate fi format din mai multe cuvinte. Putem pune simplu
[X], însă detaliile din timpul execuţiei vor fi identice cu cele din imaginea din
dreapta.
De aceea, se recomandă utilizarea unor nume mai elaborate – chiar dacă nu au
şablonul unei variabile clasice – care să furnizeze detalii suplimentare în timpul
execuţiei, ex. [Introduceti tipul:].

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.

Exemplu. În coloana Data, se poate considera următoarea expresie în linia


Criteria: Between [DataInceput] And [DataSfarsit].
Lista parametrilor poate fi gestionată şi prin intermediul ferestrei Query
Parameters, care se deschide la acţionarea butonului din grupul
Show/Hide.

Operaţii de căutare referitoare la interogări


Există două tipuri speciale de interogări de selecţie. Ele sunt Find
Duplicates – destinată detectării duplicatelor – şi Find Unmatched, folosită
pentru identificarea elementelor lipsă, elemente din cadrul unei coloane care nu se
regăsesc în alta, în general dintr-o altă tabelă.

Ambele au la dispoziţie câte un instrument de tip wizard, care acţionează precum


un „detectiv”, în vederea găsirii celor două tipuri de informaţii (redundante sau
lipsă).
Find Duplicates.
Duplicatele pot fi fie un lucru bun, fie unul rău. Spre exemplu, dacă am introdus
din greşeală acelaşi nume de partener de două ori, s-ar putea ca anumite tranzacţii
să le introducem la unul din ei, altele la celălalt, sau poate toate la ambii. Dacă
însă avem mai mulţi parteneri în acelaşi oraş, s-ar putea să fim interesaţi în
descoperirea unei informaţii de genul: „Care este localitatea în care avem cei mai
mulţi parteneri, sau câţi şi care sunt partenerii pe care-i avem în fiecare
localitate?”.

13
Exemplu. Identificarea partenerilor din acelaşi oraş.
Create → Query Wizard →Find Duplicates Query Wizard

În cadrul primului pas selectăm sursa de date susceptibilă că ar deţine valori


duplicate, iar apoi câmpul incriminat. Pentru a putea identifica înregistrarea în care
se află informaţia duplicată, se recomandă selectarea unor alte câmpuri. Ultimul
pas presupune stabilirea unei denumiri sugestive pentru acest tip de interogare,
precum şi opţiuni ulterioare creării.
Rezultatele obţinute sunt prezentate în fig. 5.13.

Figura 5.13.– Selectare câmp cu valori potenţial duplicate

Figura 5.14. – Câmpuri auxiliare ce permit identificarea informaţiei duplicate

14
Figura 5.15. – Listă parteneri cu sediu în aceeaşi localitate

Find Unmatched. Acest tip de interogare permite depistarea valorilor


dintr-un câmp care nu pot fi găsite printre valorile unui alt câmp al unei alte surse
de date.
De exemplu, pentru a afla care produse n-au fost niciodată comercializate,
sau mai rău, care sunt produsele
comercializate despre care n-avem
niciun detaliu în nomenclatorul de
produse, vom utiliza astfel de
interogări. În ultimul caz, eroarea
este mai severă pentru că încalcă
integritatea referenţială şi poate să
intervină în cazul în care populările de date s-au efectuat înaintea instituirii acestui
gen de reguli, sau au fost dezactivate temporar.

Exemplu. Identificarea produselor care nu au fost comercializate niciodată.

Create → Query Wizard →Find Unmatched Query Wizard.

La primul pas vom alege sursa din care face parte câmpul a cărui valori vrem să le
examinăm

Figura 5.16 – Selectare sursă de date

15
Selectăm sursa de date în care se vor căuta apariţiile câmpului din prima sursă de
date.

Figura 5.17 – Selectare sursă în care se realizează căutarea

Se stabileşte criteriul pe baza căruia s-a stabilit relaţia dintre cele două surse de
date, Cod şi CodProd.

Figura 5.18 – Stabilire câmpuri care interrelaţionează

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.

Figura 5.19 – Selectare câmpuri prezente în rezultat

Aceste tipuri de informaţii – duplicate sau lipsă – pot fi obţinute şi cu


ajutorul interogărilor despre care s-a discutat în paragrafele anterioare, dar uneori
este destul de complicat. De aceea, utilizarea unor astfel de instrumente predefinite
este binevenită. Acestea sunt extrem de utile atunci când gestionăm volume mai
mari de date. Când avem sub 10 înregistrări în sursele de date, o examinare vizuală
este suficientă.
Şi aceste interogări pot fi ulterior modificate în Query Design, pentru
introducerea unor opţiuni suplimentare (ex. doar partenerii din acele oraşe în care
sunt cel puţin 5 parteneri; doar acele produse necomercializate într-o perioadă de
timp).

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.

Value – Este destinat calculării valorilor cumulate situate la intersecţia liniilor cu


coloanele. Aici este vorba de cantitatea dintr-un produs aflat pe o anumită factură.
Din păcate, în exemplul ales nu beneficiem foarte mult de facilitatea consolidării,
deoarece un cod de produs apare doar o singură dată într-o factură.

Figura 5.20 – Interogare Crosstab editabilă în Query Designer

Figura 5.21 – Rezultat interogare Crosstab

Interogările cross-tab se utilizează în general în scopuri de analiză


multicriterială. Este un instrument auxiliar ce afişează rezultatul unei expresii
agregate într-un mediu bidimensional.

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

Lansarea interogării se face la fel ca orice interogare, în panoul de navigare


numele interogărilor de acţiune sunt precedate de un simbol distinctiv, precum cel
alăturat şi uşor diferenţiat pentru fiecare tip de acţiune .
Vom fi avertizaţi că am lansat o
interogare de acţiune, iar apoi
ni se va comunica rezultatul
potenţial al acestei activităţi, în
cazul în care dorim să
continuăm.
Dacă acţionăm butonul OK, o tabelă cu numele Vanzari_Recente va fi creată şi
va conţine două înregistrări.

Append Query. Se parcurg aceeaşi paşi, cu excepţia alegerii butonului Append


sau opţiunii Append Query…. Va apărea o linie nouă – Append to – în care se
va menţiona tabela în care vor fi adăugate înregistrările rezultate şi care
îndeplinesc criteriile formulate.
Fereastra în care se defineşte o astfel de interogare la lansare vor apărea
aceleaşi mesaje de atenţionare.
Denumirea interogării va fi precedată de o pictogramă specifică, precum
.

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.

Figura 5.24 – Setări în cadrul unei interogări Delete

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 .

Update Query. Cu ajutorul acestui tip de interogări, putem modifica sau


completa valori în cadrul unor câmpuri. Linia Update to va fi inserată. Pe această
linie se va trece valoarea sau expresia de calcul a câmpului specificat în linia Field
din cadrul sursei de date Table. De asemenea, criteriile de actualizare trebuie
specificate în linia Criteria sau Or. În aceeaşi interogare, putem avea atât criterii
multiple, cât şi câmpuri de actualizat.

Am prezentat o astfel de interogare. În panoul de navigare, interogările de


acest tip pot fi recunoscute după pictograma care le însoţeşte
.

Figura 5.25 – Configurare interogare Update

Înafară de tipurile de acţiuni menţionate, Access pune la dispoziţie alte câteva,


care nu constituie obiectul materialului nostru. Fiecare tip de interogare are şi câte
o comandă SQL specifică, precum SELECT INTO, INSERT, DELETE şi
UPDATE.

Interogările de acţiune asistă utilizatorul la efectuarea unor operaţii de actualizare


în cadrul diferitelor surse de date – existente sau nu în momentul de faţă –
degrevându-l de sarcini de rutină, care necesită multă atenţie, dar şi un volum de
muncă, de multe ori inaccesibil. Acum utilizatorul nu mai trebuie să verifice vizual
fiecare înregistrare, apoi să efectueze operaţiunea dorită, fie manual, fie prin
operaţii de genul copy/paste. Aceste sarcini se referă la editare valori, ştergere
înregistrări, introducere, creare de tabele. În ciuda avantajelor pe care le deţin,
22
aceste instrumente pot fi deosebit de periculoase în cazul unei gestionări
defectuoase. Pot fi cauzate probleme severe, precum pierderi de date, adăugări
duplicate, inconsistenţă etc.

5.3. Tabele versus Interogări. Exemplu


Proiectarea corectă a unei baze de date este esenţială pentru manipularea ulterioară
şi facilă a datelor.
De multe ori se merge eronat pe ideea că datele trebuie să fie stocate toate într-o
singură tabelă, dar un efort minim la proiectare se poate transforma într-unul
maxim la exploatare şi reproiectare, iar operaţiile care ţin de exploatare au loc
frecvent, în timp ce proiectarea o singură dată, rareori necesitând modificări.

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.

Aceste informaţii nu se regăsesc în niciuna din tabelele de bază, însă pot fi


calculate pe baza lor.

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.

Totuşi, modificările de acest gen nu sunt atât de frecvente precum emiterile de


facturi. Discountul pe care un client poate să-l obţină este stabilit pe baza unei
strategii de fidelizare din partea furnizorului.

23
Figura 5.26 – Tabele de bază

Figura 5.27 – Interogare complexă.

Noi considerăm că acesta se acordă în funcţie de volumul tranzacţiei curente şi


istoric. De aceea nu am considerat acest aspect în cadrul nomenclatorului de
parteneri. Mai mult, uneori un partener poate fi client, alteori furnizor. Am
reflectat ambele aspecte în cadrul tabelei Facturi.
Din interogări lipsesc produsele necomercializate, partenerii fără tranzacţii,
preţurile/cota TVA a unor produse necomercializate. Aceste „lipsuri” pot fi
remediate prin operaţii de join extern.

24
Capitolul 6. Access SQL

6.1 Prezentare generală


SQL (Structured Query Language) este în prezent, unul din cele mai puternice limbaje
structurate pentru interogarea bazelor de date relaţionale.
Este un limbaj neprocedural şi declarativ, deoarece utilizatorul descrie ce date vrea să
obţină, fără a fi nevoie să stabilească modalităţile de a ajunge la datele respective. Nu poate fi
considerat un limbaj de programare sau unul de sistem, ci mai degrabă face parte din
categoria limbajelor de aplicaţii, fiind orientat pe mulţimi. Foarte frecvent, este utilizat în
administrarea bazelor de date client/server, aplicaţia client fiind cea care generează
instrucţiunile SQL.
Lansat iniţial de IBM. Standardizat prima dată de ANSI, apoi ISO. Actualmente, ISO 92.
Pentru că există o standardizare a limbajului SQL, multe SGBD (Oracle, Access, Sybase)
recunosc principalele instrucţiuni ale acestuia.

Caracteristicile adăugate standardului se numesc extensii. De ex, în standard sunt specificate


6 tipuri diferite de date pentru o BD SQL. În multe implementări, această listă este
completată cu o diversitate de extensii. Fiecare implementare se numeşte dialect.
Dialectul ACCSES conţine unele particularităţi, fiind conceput mai mult pentru crearea
interogărilor de selecţie.
Există 3 metode de bază privind implementarea limbajului SQL:
− apelare directă (Direct Invocation): constă în introducerea instrucţiunilor direct de
la prompter
− modulară (Modul Language): foloseşte proceduri apelate de programele aplicaţie
− încapsulată (Embedded SQL): conţine instrucţiuni încapsulate în codul de program

Instrucţiunile SQL pot fi grupate în:


instrucţiuni de definire a datelor, care permit descrierea structurii BD
instrucţiuni de manipulate a datelor: adaugă, şterge, modifică înregistrări
instrucţiuni de selecţie a datelor, care permit consultarea BD
instrucţiuni de procesare a tranzacţiilor
instrucţiuni de control al cursorului
instrucţiuni pivind controlul accesului la date

În limbajul SQL standardizat de ISO nu se folosesc termenii formali de relaţie, atribut, tuplu,
ci tabela, coloană, rând.

Scrierea comenzilor SQL


O instrucţiuni SQL este formată din cuvinte rezervate şi cuvinte definite de utilizator.
Cuvintele rezervate constituie partea fixă şi se scriu exact cum este necesar. Cuvintele
definite de utilizator reprezintă denumirile diverselor obiecte din BD.

Deşi standardul nu o cere, majoritatea dialectelor cer terminator de instrucţiune („;”).

Majoritatea componentelor nu sunt sensibile la tipul de litere (excepţie importantă: când


datele au caracter literal, de ex, dacă se stochează numele „POPA” şi cautăm „Popa”, nu vom
găsi înregistrarea respectivă).

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

Convenţii de notare folosite în definirea instrucţiunilor:


• majuscule pentru cuvintele rezervate
• litere mici pentru cuvinte definite de utilizator
• bara verticală | indică posibilitatea alegerii dintre mai multe variante
• acoladele { } indică un element necesar
• parantezele drepte [ ] indică un element opţional
• punctele de suspensie ... indică o repetare opţională a unui articol, de 0 sau mai multe
ori

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

6.2.Instrucţiuni pentru definirea datelor


Teoretic, comenzile pentru definirea datelor fac parte din modulul corespunzător
componentei LDD din SGBD. Totuşi, în majoritatea implementărilor SQL comenzile de
definire a datelor sunt prelucrate de acelaşi interpretor care rezolvă şi interogările şi operaţiile
de manipulare a datelor. Componentele DML şi DDL ale SGBD sunt implementate în acelaşi
modul software.

CREATE DATABASE nume_bd


Crează o bază de date. Majoritatea SGBD permit crearea unei BD print-un simplu clic de
mouse. Există şi posibilitatea folosirii acestei instrucţiuni, dar mult mai greoi. Comanda nu e
standardizată, ACCESS nici nu o acceptă.

CREATE TABLE nume_tabela


(câmp1 tip_dată [NOT NULL],
câmp2 tip_dată [NOT NULL],
câmp3 tip_dată [NOT NULL]...)

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.

ALTER TABLE nume_tabelă

ADD nume_câmp tip_dată


Adaugă un câmp la o tabelă existentă. Ştergerea unui câmp nu este posibilă.

2
DROP TABLE nume_tabel
Şterge complet o tabelă din BD.

DROP DATABASE nume_bd


Şterge BD. Există însă o multitudine de restricţii stabilite de administratorul sistemului
privind această operaţie. Multe versiuni SQL nu includ această instrucţiune, stergerea
făcându-se din comenzi de mouse.

6.3. Instrucţiuni pentru selecţia datelor


Cereri de interogare simple

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:

SELECT [domeniu] listă_selecţie


FROM nume_tabel1, nume_tabel2,…
[WHERE criteriu_selecţie]
[ORDER BY câmpuri_criteriu [ASC|DESC]];

Domeniu
Specifică o opţiune de includere sau eliminare din rezultatul selecţiei, a înregistrărilor care
conţin duplicate. Opţiunile posibile sunt:
ALL cere includerea tuturor înregistrărilor care îndeplinesc condiţiile impuse.
Cum instrucţiunile SELECT tabel şi SELECT ALL tabel au acelaşi rezultat
practic, calificativul ALL este rar folosit.
DISTINCT cere eliminarea înregistrărilor care conţin duplicate în câmpurile
selectate, afişând numai o apariţie a acesteia.
DISTINCTROW cere eliminarea înregistrărilor care conţin duplicate în
ansamblul lor, nu numai în câmpurile selectate, afişând numai o apariţie a
acesteia.
Listă_selecţie cuprinde câmpurile care dorim să apară în tabelul cu rezultatele interogării.
Similar cu Field … Show …din grila de proiectare QBE.
Clauza FROM specifică numele tabelului sau tabelelor pe care se face cererea de
interogare. Pentru mai multe tabele, numele acestora se separă cu „,”. Pe lângă tabele, ca
sursă de informaţii pot apare şi interogări deja create.
Clauza WHERE cere numai înregistrările care îndeplinesc criteriul de selecţie specificat.
Criteriul de selecţie este o expresie care conţine obligatoriu şi un operator adecvat
tipului de dată al câmpului respectiv. Clauza WHERE este opţională.
Clauza ORDER BY cere ordonarea în mod crescător (ASC) sau descrescător (DESC) a
rezultatelor interogării. Ordonarea este opţională şi se poate face după unul sau mai multe
câmpuri_criteriu.

Cereri de interogare complexe

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:

SELECT [domeniu] funcţie_agregat(nume_câmp) AS alias


[,listă_selecţie]
FROM nume_tabel1, nume_tabel2,…
GROUP BY câmp_de_grupare
[HAVING criteriu_de_grupare]
[ORDER BY câmpuri_criteriu [ASC|DESC]];

Elementele noi de sintaxă:


AS alias asociază un pseudonim rezultatului funcţiei agregat
Clauza GROUP BY precizează câmpul sau câmpurile după care se face gruparea
înregistrărilor. Echivalentul acestei clauze în macheta grafică QBE îl reprezintă rândul
Total.
Clauza HAVING conţine criteriul care va fi aplicat câmpului argument al funcţiei
agregat. Spre deosebire de WHERE, care acţionează înainte de gruparea înregistrărilor,
HAVING acţionează după definirea acesteia.

Asocierile (interogările JOIN)


Limbajul SQL oferă posibilitatea de a grupa şi folosi date din tabele diferite. Operaţiile de
asociere induse de clauza JOIN au ca rezultat producerea tuturor combinaţiilor posibile,
pentru conţinutul informaţional al fiecărui tabel. Noile înregistrări care rezultă în urma
joncţiunii sunt disponibile pentru selecţiile următoare. La o asociere pot participa mai mult de
2 tabele.
Există mai multe categorii de joncţiuni:
• CROSS (încrucişată) – rar folosită
• ECHIVALENTĂ (echijoncţiune) – cea mai folosită – presupune folosirea
clauzei WHERE asociată cu o egalitate dorită
• NEECHIVALENTĂ (non echijoncţiune) - rar folosită - presupune folosirea
clauzei WHERE asociată cu orice alt operator de comparare, în afară de
„=”

Sintaxa instrucţiunii pentru joncţiunile echivalente şi neechivlente este:

SELECT [domeniu] listă_selecţie


FROM nume_tabel1, nume_tabel2,…
[WHERE criteriu_de_asociere]
[ORDER BY câmpuri_criteriu [ASC|DESC]];

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

După modul de asociere a înregistrărilor din tabele, joncţiunile pot fi:


• interne sau INNER JOIN determină o asociere a înregistrărilor din tabele,
astfel încât să rezulte un număr total de înregistrări egal cu produsul
numărului de înregistrări din fiecare tabel
• externe de stânga sau LEFT OUTER JOIN
• externe de dreapta sau RIGHT OUTER JOIN

Echivalentul QBE al acestor categorii de joncţiuni este alegerea opţiunilor 1, 2, sau 3 din
caseta Join Properties.

Sintaxa instrucţiunii:

SELECT [domeniu] listă_selecţie FROM nume_tabel1


{INNER|LEFT OUTER|RIGHT OUTER} JOIN nume_tabel2
ON criteriu_de_asociere
[{INNER|LEFT OUTER|RIGHT OUTER} JOIN nume_tabel3
ON criteriu_de_asociere]…
[WHERE criteriu_selecţie]
[ORDER BY câmpuri_criteriu [ASC|DESC]];

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 „=”.

Combinările (interogările UNION)


Când utilizatorul doreşte să vadă rezultatele mai multor interogări SELECT în acelaşi timp,
prin combinarea ieşirilor lor, se poate utiliza facilitatea UNION. De remarcat că nu există
echivalent QBE pentru această instrucţiune.
Sintaxa generală pentru interogările UNION este:

SELECT listă_câmpuri FROM nume_tabel1


UNION SELECT listă_câmpuri FROM nume_tabel2
[GROUP BY câmp_de_grupare]
[HAVING criteriu_de_agregare]
[UNION SELECT listă_câmpuri FROM nume_tabel3
[GROUP BY câmp_de_grupare]
[HAVING criteriu_de_agregare]]
[UNION …]
[ORDER BY câmpuri_criteriu [ASC|DESC]];

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;

SELECT nume, prenume, vârstă FROM Colaboratori2001


GROUP BY categoria
HAVING categoria=”student”
UNION SELECT nume, prenume, vârstă FROM Colaboratori2002
GROUP BY categoria
HAVING categoria=”student”

6.4. Instrucţiuni pentru manipularea datelor


Foarte utile în exploatarea unei BD, aceste instrucţiuni se implementează prin interogările de
acţiune. Este necesară o mare precauţie în utilizarea lor deoarece acţiunile sunt ireversibile,
putând influienţa inclusiv integritatea referenţială a BD.
Cele mai importante sunt: CREATE, INSERT, UPDATE şi DELETE.

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

a). Se adaugă o singură înregistrare într-un tabel, menţionându-se câmpurile şi valorile


acestora. Se utilizează pentru operaţii simple, care presupun lucrul cu un număr redus de
înregistrări.
INSERT INTO nume_tabel (câmp1, câmp2...)
VALUES (valoare1, valoare2...);
Reguli:
• valorile din clauza VALUES vor avea aceeaşi natură cu câmpurile din clauza INTO
• mărimea valorii va fi < dimensiunea câmpului
• corespondenţă între câmp1 şi valoare1, etc.
• Dacă un câmp are specificaţia NOT NULL, este obligatorie introducerea unei valori
pentru aceasta

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 nume_tabel


[WHERE criteriu_de_ştergere];

Ca şi instrucţiunea INSERT, operaţia de ştergere a înregistrărilor dintr-o tabelă poate duce la


probleme de integritate referenţială în alte tabele.
Exemplu:

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

A.Selectarea coloanelor unei tabele


Cea mai simplă interogare a unei baze de date este selectarea unor coloane dintr-o tabelă.
Acestă interogare corespunde instrucţiunii SELECT următoare

SELECT nume_coloana_1, nume_coloana_2, …, nume_coloana_k


FROM nume_tabela;

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;

In exemplele următoare vom utiliza tabela PROIECT_ANGAJAT de mai jos.


Tabela conţine angajaţii ce lucrează la diverse proiecte ale unei firme, cu salariul orar,
SAL_ORA şi numărul de ore prestate la proiect, ORE.
Cheia primară a tabelei este formată din câmpurile ID_PRJ şi ID_ANG.
Câmpurile NUME_ANGAJAT şi DPT_ANG sunt de tip text, celelalte de tip numeric.

PROIECT_ANGAJAT

ID_PRJ ID_ANG NUME_ANGAJAT DPT_ANG SAL_ORA ORE

8
Proiectarea tabelei este cea din Figura 6.1.

Figura 6.1. Proiectarea tabelei PROIECT_ANGAJAT.


Tabela cu date este cea din Figura 6.2.

Figura 6.2. Tabela cu date PROIECT_ANGAJAT.


In firmă există trei departamente, Informatica, Support, Documentare.
Numele lor se va introduce cu o casetă combinată (Combo Box).

B.Selectare liniilor unei tabele ce satisfac anumite criterii


Selectarea coloanelor liniilor unei tabele ce satisfac anumite criterii se face cu
instrucţiunea SELECT cu clauza WHERE care conţine criteriile de selecţie.

Instrucţiunea are forma:

SELECT nume_coloana_1, nume_coloana_2, …, nume_coloana_k


FROM nume_tabela
WHERE conditie
ORDER BY nume_coloana_1 [ASC | DESC] [, nume_coloana_2 [ASC
| DESC] …];

Condiţia din clauza WHERE este o expresie booleană ce are ca argumente


nume_coloana_1, nume_coloana_2, …, nume_coloana_k.
O linie a tabelei este selectată când condiţia din clauza WHERE are valoarea adevărat.

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] …];

Access permite să creăm formulare grafice corespunzătoare acestei instrucţiuni.


Elementele acestor formulare sunt traduse de Access într-o instrucţiune SELECT care
este executată pentru a obţine tabela rezultat.
Atributul nume_coloana al obiectului nume_tabela este accesat cu operatorul punct.
Această formă generală se utilizează atunci când selectăm coloane din mai multe tabele,
după cum se va vedea în capitolele următoare, deoarece anumite coloane din diverse
tabele pot avea aceleaşi nume şi doar forma generală a nume_coloana le poate distinge.

In cazul instrucţiunii SELECT, când se selectează date dintr-o singură tabelă, în numele
coloanei se poate omite numele tabelei.

C.Crearea unui formular de interogare

Fie tabela PROIECT_ANGAJAT

ID_PRJ ID_ANG NUME_ANGAJAT DPT_ANG SAL_ORA ORE

Vom exemplifica crearea unui formular corespunzând instrucţiunii

SELECT ID_ANG, NUME_ANGAJAT, DPT_ANG, SAL_ORA


FROM PROIECT_ANGAJAT
WHERE NUME_DEPARTAMENT = ‘Informatica’;

Semnificaţia acestor opţiuni este cea din Tabelul 1.


Opţiune Instrucţiunea SQL
SELECT
SELECT
CREATE TABLE
UPDATE
INSERT
DELETE
Tabelul 1. Opţiunile de creare a unui formular de interogare.

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:

Figura 6.3. Forma pentru selectarea angajaţilor departamentelor Documentare şi Suport.


Instrucţiunea SELECT generată de Access din formularul creat mai sus este:

Figura 6.4 Instrucţiunea SELECT corespunzătoare formei din Figura .


Tabela rezultat este urmatoarea :

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

Expresiile relaţionale sunt constituite din expresii aritmetice separate de operatorii


relaţionali <, <=, >, >= , = şi <> şi operatorul Between … And … care testează dacă o
valoare este cuprinsă într-un interval.

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

Expresiile aritmetice au ca termeni numere, atributul numeric respectiv (coloana


numerică din tabelă) şi operatorii aritmetici +, -, * şi / pentru numere reale şi +, -, \ şi
Mod pentru numere întregi. Priorităţile operatorilor sunt cele cunoscute. Termenii
expresiilor aritmetice pot fi grupaţi în paranteze rotunde.
Exemplu. Să testăm dacă atributul SAL_ORA al tabelei PROIECT_ANGAJAT din
exemplele anterioare este cuprins între valorile 40 şi 60. Condiţia se poate scrie în mai
multe feluri:
>= 40 AND <= 60
>=30+10 AND <= 60
>=(30+10) AND <= 60
BETWEEN 40 AND 60
NOT < 40 AND NOT > 60

In a doua expresie am folosit expresia 30+10 în loc de 40 pentru a sublinia că în


expresiile relaţionale putem utiliza expresii aritmetice oricât de complicate. In expresia a
treia am utilizat paranteze rotunde. Ultima condiţie este arătată în Figura .

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.

Figura 6.6. Exemplu de condiţie compusă.


Uneori este dificil de a scrie condiţia, deoarece spaţiul din celulă este prea mic. Se poate
afişa o fereastră în care să se introducă expresia cu clic pe celulă, apoi se apasă tastele
Shift + F2 şi se afişază fereastra :

Figura 6.7. Afişarea unei ferestre pentru introducerea unei expresii.

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

Figura 6.8. Meniu contextual al unei coloane a formularului.


O altă posibilitate de a lansa aplicaţia Expression Builder este cu clic pe butonul Build,
, al barei de instrumente.
In partea din stânga jos a casetei Expression Builder sunt afişate pe lângă funcţii,
constante, operatori şi tabelele, formularele şi alte obiecte din baza de date, ale căror
elemente se pot utiliza în expresii.

Figura 6.9.Caseta Expression Builder.

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;

Pentru exemplificare, vom considera tabela SITUATIE_FINANCIARA de mai jos, ce


conţine datele financiare pe anii trecuţi ale unei intreprinderi

SITUATIE_FINANCIARA

AN VENITURI CHELTUIELI PROFIT_BRUT IMPOZIT PROFIT_NET

şi tabela DATE_CONTABILE cu datele financiare pe anul curent

DATE_CONTABILE

AN VENITURI CHELTUIELI PROFIT_BRUT IMPOZIT PROFIT_NET

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

Figura 6.11. Instrucţiunea UNION.

5. clic pe butonul Run, , al barei de instrumente şi se obţine tabela rezultat.

F.Utilizarea funcţiilor de agregare SQL în interogări


Instrucţiunea SELECT poate utiliza câteva funcţii standard SQL pentru a face suma
valorilor unei coloane, calculul valorii medii, minime sau maxime a unei coloane, etc.
Aceste funcţii sunt cele din Tabelul 2.

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

SELECT funcţie(nume_coloana_1) AS nume_1,


funcţie(nume_coloana_2) AS nume_2, …,
funcţie(nume_coloana_k) AS nume_k
FROM nume_tabela;

Vom exemplifica utilizarea acestor funcţii la tabela VANZARI, proiectată în Figura .


Tabela cu date este cea din Figura .

Figura 6.12. Proiectarea tabelei VANZARI.

Figura 6.13. Tabela VANZARI.


Vom calcula suma vânzărilor pe fiecare an. Procedura este următoarea:
1. se afişază fereastra de proiectare a interogării

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,

Figura 6.15. Fereastra aplicaţiei Expression Builder.


4. selectăm argumentul “expr” al funcţiei Sum cu un clic, ca în Figura ,

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

Figura 6.17. Expresia pentru însumarea unei coloane.


6. se repetă paşii de mai sus şi pentru celelalte coloane; linia Field este cea din Figura ,

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.

Figura 6.19. Expresia primei coloane a interogării.

7. clic pe butonul Run , , al barei de instrumente şi tabela rezultat este cea din Figura .

Figura 6.20.Tabela rezulatat a interogării.


După cum se observă, coloanele tabelei rezultat au numele Expr1, …, Expr4, atribuite de
aplicaţia Expression Builder. Acest caz corespunde primei forme a instrucţiunii SELECT
prezentate în acest paragraf.

SELECT funcţie(nume_coloana_1), funcţie(nume_coloana_2), …,


funcţie(nume_coloana_k)
FROM nume_tabela;

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 :

Figura 6.21. Modificarea numelui coloanei tabelei rezultat.

Figura 6.22. Tabela rezultat a interogării.


Acest caz corespunde celei dea doua forme a instrucţiunii SELECT

SELECT funcţie(nume_coloana_1) AS nume_1,


funcţie(nume_coloana_2) AS nume_2, …,
funcţie(nume_coloana_k) AS nume_k
FROM nume_tabela;

Instrucţiunea SELECT este:

Figura 6.23. Instrucţiunea SELECT a interogării.

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

Figura 7. 2 – Formular Design

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.

1. În funcţie de posibilitatea de a conţine sau nu alte obiecte, avem:


 obiecte simple (controale) şi
 obiecte agregate (obiecte compuse sau containere).

2. Deoarece lucrăm cu un SGBD, interesul principal trebuie să se focalizeze


în jurul relaţiei obiectelor cu anumite porţiuni de date ce pot fi stocate într-o bază
de date. Astfel avem:
 Obiecte libere – nu au nici o legătură cu componentele de date;
 Obiecte legate – sunt conectate la date (tabele, interogări, câmpuri,
variabile şi tablouri). Proprietăţile ControlSource (pentru câmpuri şi variabile)
sau RecordSource (pentru tabele) trebuie să fie setate. Proprietăţile
RowSourceType şi RecordSourceType au şi ele un rol important, specificând
tipul sursei de date.

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

3. În funcţie de tipurile de operaţiuni sau funcţia pe care obiectele pot s-o


îndeplinească în cadrul unui formular, avem următoarele tipuri de obiecte ce vor fi
dezbătute în secţiunile următoare:
 Obiecte care permit selectarea elementelor predefinite;
 Obiecte ce permit introducerea de date;
 Obiecte ce gestionează intervale valorice;
 Obiecte care efectuează acţiuni.

7.3. Gestiunea formularelor în Microsoft Access


MS Access consideră formularele drept componentă a bazei de date. Un
fişier ACCDB conţine nu doar tabele, ci şi formulare, precum şi alte câteva tipuri
de obiecte.

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

Banda Forms nu va apărea în organizări după alte criterii decât tipul


obiectelor, sau diverse filtrări personalizate care exclud formularele. Spre
deosebire de alte variante de Access, utilizatorul nu are la dispoziţie decât o
opţiune în plus în vederea creării unui formular, însă aproape pentru fiecare tip
există un câte buton sugestiv, la vedere.
Există mai multe tipuri de formulare.

3
Figura 7. 3 – Diferite tipuri de formulare

În continuare sunt prezentate câteva tipuri de formulare, formulare rapide,


de tip AutoForm realizate toate pe baza aceleiaşi tabele, prin acţionarea
butoanelor plasate deasupra lor şi prezente în grupul Forms, ultimele două fiind
din lista derulantă .
Form – Este formularul simplu în care câmpurile sursei de date sunt
dispuse unul sub celălalt. Fiecare etichetă de câmp este însoţită de date. Practic
este tipul Columnar din versiunile
anterioare.
Este primul tip de formular,
sub butonul Form. Oferă o imagine
de ansamblu mai bună atunci când
este vorba de
vizualizarea/actualizarea unei singure înregistrări. Deplasarea de la o înregistrare
la alta, se realizează cu butoanele de navigare din partea de jos a ferestrei (vezi
imaginea din stânga). În partea
dreaptă avem formularul în modul Design View nealterat.

Datasheet – reprezintă un formular de tip tabelar, fără o formatare sau


aranjare a obiectelor aparte. Este
destinat modului de introducere şi
vizualizare al datelor, în regim

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.

În modul Design View arată identic cu tipul Form.

Multiple Items – Este un formular tabelar, care permite gestiunea mai


multor înregistrări, similar cu
modul Datasheet, însă oferă
funcţionalităţi suplimentare de
personalizare.

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.

 Form Wizard – Este un formular rezultat în urma parcurgerii unui


utilitar de asistenţă pas cu pas.

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.

Form View – este modul de vizualizare a datelor prin intermediul unui


formular. Oferă o interfaţă de lucru mai plăcută pentru utilizator când
interacţionează cu baza de date, spre deosebire de banalul mod de vizualizare date
specific celui cu care am lucrat în cazul tabelelor (Datasheet View). Form View
este modul de lucru obişnuit, deci nu vor exista file contextuale în afara celor
standard. În modul de lucru prezentat vom avea şi două file contextuale, şi anume
Design şi Arrange din cadrul lui Form Design Tools.
Design View – reprezintă modul de proiectare al formularului. În acest mod
se poate concepe sau ajusta dispunerea obiectelor în cadrul formularului, formatări
de diferite feluri, stabilirea conţinutului obiectelor, asignarea unor acţiuni
controalelor, stabilirea de relaţii între acestea şi/sau containere (ex. subformulare)
etc.
Layout View – este o combinaţie a primelor două, permiţând atât
gestionarea datelor, cât şi a proiectării sale. Astfel, de exemplu dacă vom constata
că valorile dintr-un anumit obiect de control nu încap în acesta, vom putea ajusta
fie dimensiunea obiectului, fie a scrisului, sau chiar schimbarea lui. Dacă nu ne
place combinaţia de culori dintre fundalul formularului, a obiectelor şi a scrisului,
fiind greu de descifrat conţinutul, avem acces direct la facilităţile de modificare a
proprietăţilor elementelor implicate etc. În acest mod de lucru sunt prezente filele
opţionale Format şi Arrange, din Form Layout Tools.

Crearea şi gestiunea formularelor


Creare formularelor se realizează din fila Create → opţiunile grupului
Form. Sunt puse 5 butoane dispoziţie, iar unul (More Forms) fiind de tip listă cu
alte 4 elemente.

Majoritatea opţiunilor sunt de tip AutoForm, adică trebuie să fie o tabelă


activă, apoi printr-o simplă acţionare a unuia din butoanele grupului, se obţine un
prim formular.

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.

Este suficient doar selectarea sursei de date (tabelă/interogare) din panoul de


navigaţie, nu neapărat şi deschiderea ei în fereastra cu file multiple. Sursa de date
trebuie să fie mai întâi salvată.

Selectăm o sursă de date din panoul de navigare, apoi în funcţie de tipurile de


formulare amintite în paragrafele anterioare, se acţionează unul din butoanele –
Form, Split Form, Multiple Items, More→ Datasheet – din cadrul filei Create →
grupul Forms. Această operaţiune are ca efect generarea unui formular, deschis în
modul de lucru Layout View.
Instrumentele Form Layout ne stau la dispoziţie pentru modificări ulterioare de
design. Nu le vom prezenta în acest moment.

Indiferent dacă se modifică sau nu formularul generat automat, în cazul în care se


decide păstrarea lui pentru utilizări ulterioare, vom proceda la salvarea acestuia,
sub un nume sugestiv.
Deschiderea unui formular existent se realizează cu dublu-clic pe numele lui în
cadrul panoului de navigare, sau se alege opţiunea Open din meniul contextual.

Alte modalităţi de realizare a formularelor vor fi prezentate în continuare.

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.

Figura 7. 5 – Selectarea câmpurilor

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.

După selectarea reperului în funcţie de care vor fi afişate datele, trebuie să


stabilim şi care va fi abordarea în interrelaţionarea formularelor ridicate. Opţiunea
implicită – Form with subform(s) – constă în existenţa unui formular principal şi
al unuia sau mai multora subordonate. Cealaltă abordare – Linked forms – constă
nu în crearea unui singur formular, ci a mai multora, câte unul pentru fiecare din
sursele implicate. Formularele finale vor fi corelate, ceea ce înseamnă că atunci

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

Figura 7. 6 – Alegerea sursei de date-referinţă în afişarea datelor şi tipul de formular subordonat

Exemplu. Dacă am ales varianta cu formulare corelate pentru produse şi


istoricul schimbării preţurilor acestora, iar referinţa sunt produsele, la selectarea
produsului cu codul 10 din formularul de referinţă, atunci în celălalt formular vor
fi afişate doar modificările de preţ ale produsului cu codul 10, dacă există vreuna.
Nu se recomandă alegerea ca referinţă a istoricului de preţ.

Figure 7. 7 – Abordarea cu formulare corelate

Abordarea formular/subformular utilizează aceeaşi filozofie în ceea ce


priveşte legătura, însă totul se realizează într-un mediu în care va fi creat un
9
formular, în care vom avea atât elementele formularului principal, cât şi ale celui
subordonat. Deci, un formular care va mai conţine un subformular, sau mai multe.
Subformularele vor fi create automat şi ca obiecte distincte ale bazei de date. Deci,
vom avea toate subformularele separat şi un formular care conţine atât formularul
principal, cât şi aceste subformulare.

Observaţie: Opţiunea cu formulare corelate este disponibilă doar când


sursa de referinţă este o tabelă-părinte.

Doar în abordarea formular/subformular, pasul prezentat în fig7.8. apare.

Figura 7. 8 – Selectarea modului de dispunere a câmpurilor

Aici selectăm modul de aranjare a datelor în cadrul subformularului, în


raport cu etichetele/antetele lor. Dacă tabela părinte este selectată drept referinţă,
atunci pentru subformular sunt disponibile doar cele 2 variante, prezentate în
fig.7.8.
Este vorba de formatul tabelar, respectiv de cel de introducere/vizualizare date. În
caz contrar, vom mai avea două opţiuni (Columnar şi Justified).

10
Figura 7. 9 – Preferinţe de stil

Indiferent de varianta selectată la pasul anterior, în continuare vom selecta


stilul de îmbinare al formelor şi culorilor prezente în formulare. Acestea sunt
expuse în fig.7.9.
Ultimul stadiu în dezvoltarea unui astfel de formular constă în alegerea de
nume şi de titluri pentru formularele implicate. În fig.7.9. am atribuit nume atât
formularului cât şi subformularului.

Figura 7. 9 – Denumirea formularelor implicate

La acţionarea butonului de comandă Finish, un formular sau mai multe în funcţie


de complexitatea surselor de date – vor fi create cu numele şi titlurile specificate,
iar apoi fie se va lansa formularul principal în execuţie (dacă se alege opţiunea

11
Open the form to view or enter information), fie se va deschide pentru
reproiectarea lui (opţiunea Modify the form’s design).

Figura 7. 10 – Formular şi subformular corelat în execuţie

Se observă că dacă se alege în acest moment prima opţiune sau se deschide


ulterior formularul, o să observăm că dacă în formularul din partea de sus ne-am
poziţionat pe un anumit produs, în cel de-al doilea avem doar istoricul preţului
acelui produs (cod 10), nu şi al celorlalte. Butoanele de navigare ale formularului
cu produsele se află în partea cea mai de jos a ferestrei. La deplasarea pe o
înregistrare nouă din formularul de referinţă se vor corela şi datele din
subformular.
Între tabele şi formulare este o relaţie foarte puternică. De fapt, formularele
prezentate până acum sunt doar o interfaţă pentru tabele, ceea ce înseamnă că dacă
modificăm valori în cadrul formularelor, acestea sunt reflectate automat şi în
tabelele sursă.

Observaţie: Atunci când se doreşte realizarea unui formular dintr-o sursă


unică şi sunt selectate toate câmpurile acesteia, utilizarea instrumentului wizard
este mai ineficientă decât variantele AutoForm (Form, Split Form, Multiple
Items, Datasheet). Formularele rapide se realizează din 1-2 clicuri, în timp ce
pentru un formular interactiv e necesară parcurgerea a mai mulţi paşi.

Indiferent de modul de realizare a unui formular, dacă acesta nu corespunde


pe deplin obiectivelor propuse, ele pot fi fie şterse din cadrul bazei de date, fie
ajustate. Pentru cea de-a doua variantă (ex. includerea unor formule de calcul,
mutarea/redimensionarea anumitor obiecte sau reformatarea etc.) se va proceda la

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

Figura 7. 11 – Fila contextuală Design

Figura 7. 12 – Fila contextuală Arrange

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.

Figura 7. 13 – Fereastra de proprietăţi pentru formulare. Proprietatea Record Source

Avem mai multe file, ce grupează proprietăţile şi evenimentele pe categorii.


Aici însă, în lista de proprietăţi, elementele nu sunt organizate alfabetic.
Legarea unui formular de o sursă de date nu impune şi prezenţa unor
informaţii vizuale în cadrul lui, ci conferă doar indicii asupra eventuala lor origine.
Câmpurile din sursa de date specificată sau din altele care sunt în legătură cu
aceasta –se pot valorifica în cadrul unui formular, prin selectarea lor din lista de
câmpuri (Field List) şi glisarea pe formular.
14
Fereastra Field List se activează la acţionarea butonului Add Existing Fields din
fila Design. Atunci când sunt definite relaţiile în cadrul bazei de date şi s-a setat
proprietatea Record Source, fereastra de proprietăţi apare împărţită în două zone.
În zona de sus se află sursa de date, iar în cea de jos toate sursele care sunt corelate
cu aceasta. Acest lucru se poate observa şi în fig. 7.14. unde Produse este sursa,
iar Continut_Fact şi Istoric_Pret sunt sursele cu care interrelaţionează. Dacă nu
este încă setată sursa de date, atunci în fereastră vor fi prezente toate tabelele bazei
de date.

Figura 7. 14. – Fereastra Field List

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ă

Nu vom insista pe fiecare obiect în parte, însă dorim să integrăm


cunoştinţele anterioare şi unele noi în vederea realizării unui formular mai
complex.
c. Realizarea unui formular personalizat
Acesta îşi propune să prezinte informaţiile din tabela Produse, precum şi
cele din Istoric_Pret, astfel încât să ştim în momentul curent, atât preţul actual al
produsului, preţul cu TVA, dar şi valoarea de piaţă a stocului disponibil din acel
produs, în cazul în care ar fi vândut integral în acel moment.
Deci, ce sumă de bani s-ar putea încasa în cazul în care s-ar vinde tot stocul
acelui produs, fără a se acorda vreun discount? În afară de aceste aspecte, pe
formular se vor mai plasa două butoane de comandă, unul de poziţionare pe
următoarea înregistrare, iar altul de căutare după o anumită valoare. Rezultatul va
fi înfăţişat într-un formular de genul celui din fig.7.16

17
Figura 7. 16– Formular personalizat de afişare detalii produse

Se poate porni de la un formular realizat anterior printr-un instrument de tip


wizard, de exemplu formularul de produse, pe care-l deschidem în Design View.
Acest formular se va modifica, prin adăugarea unuia nou, posibil anterior
creat, şi anume cel cu istoricul preţurilor. Vom folosi butonul Subform/Subreport
. Vom fi asistaţi de un instrument interactiv. În prima fereastra se selectează fie
un formular deja existent (cum este cazul nostru), fie direct crearea acestuia pe
baza unei surse de date.

Figura 7. 17 – Selectarea/Crearea subformularului

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.

Figura 7. 18 – Stabilirea relaţiei dintre formulare

Observaţie: Introducerea unui formular existent în cadrul altuia deschis în


modul de proiectare, se poate realiza şi mai simplu. Se efectuează o simplă
operaţiune de drag&drop a acestuia din urmă, direct din panoul de navigare, pe
suprafaţa de lucru.

Relaţia se realizează pe baza codului de produs şi este de tip una-la-mai


multe, deci un produs putând avea mai multe modificări de preţ pe parcursul
existenţei sale.
Introducem apoi o etichetă şi o casetă de text – de fapt un
singur obiect TextBox, care conţine perechea celor două – pentru reflectarea datei
curente. Caseta de text va avea setată proprietatea Name la valoarea Data şi
Control Source la Date(), funcţia care returnează data sistemului.

Observaţie: 1. Dacă obiectul va mai fi folosit în alte expresii din cadrul


formularului, va mai uşor de identificat un astfel (Data) de nume printre zecile de
obiecte cu nume implicite de genul Text17.
2. Uneori obiectele pot conţine unele expresii mai complicate,
iar apoi rezultatul lor să trebuiască utilizat şi în alte locuri. E mai comod să referim
în expresiile ulteriore acest obiect printr-un nume, decât să folosim de fiecare dată
expresia sa de calcul.

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

Se va configura proprietatea Filter a subformularului, după cum se poate remarca


şi în fig.7.19.

Figura 7. 19 – Filtrarea înregistrărilor subformularului

Tot în subformular se va introduce şi preţul unitar cu TVA. Avem nevoie


de o etichetă în zona Form Header şi de o casetă de text în zona Detail. Vom
alege atât o componentă Label, cât şi una TextBox, din care vom elimina eticheta.
Proprietatea Caption a etichetei va fi Pret Unitar cu TVA, Name va fi PUTVA, în
timp ce Control Source pentru casetă va fi =ROUND([PU]*(1+[CotaTVA]),2).
Observaţie: În cazul nostru am memorat cota de TVA într-un câmp
(CotaTVA). Pot exista şi cazuri când trebuie să folosim în calcule direct valoarea
cotei, adică 0%, 9%, 19%, 24%, sau o altă valoare procentuală. Pentru a evita

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.

Calcularea stocului la preţ de vânzare cu TVA inclus necesită o expresie


mai complexă în care vom utiliza informaţii din ambele formulare, şi anume Stoc
din formularul principal, iar PUTVA din subformular.
Există cazuri când nu avem suficiente informaţii cu privire la preţul produsului
pentru data curentă – spre exemplu nu s-a terminat operaţiunea de actualizare a
tuturor preţurilor, sau produsul nu se mai comercializează – şi vom afişa un mesaj
standard Nu exista informatii complete referitoare la pret! S-a folosit funcţia IIF.
Pentru a construi cu uşurinţă o astfel de expresie este recomandat să utilizăm
utilitarul Expression Builder. Expresia finală este afişată în fig.7.20.

Figura 7. 20 – Fereastra Expression Builder

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

Se poate introduce cod de programare pentru controlarea comportamentului


unor anumite componente. Se poate folosi fereastra de cod VBA, care apare la
acţionarea butonului din dreapta (Visual Basic) din cadrul grupului Macro al filei
Database Tools.
Codul scris se poate asocia unor evenimente ale unor obiecte.
Tot pentru acest aspect se poate selecta din cadrul meniului contextul
opţiunea Built Event…. Ea va afişa o fereastră de dialog din care se selectează
Code Builder. Scrierea de cod VBA necesită unele cunoştinţe de programare.

O variantă mai intuitivă ar fi utilizarea macrocomenzilor ar fi apelarea la


constructorul de macrocomenzi, opţiunea Macro Builder – vezi fig.7.22–

Figura 7. 22 – Fereastra Macro Builder. Butonul Next Record

Se facilitează introducerea secvenţială a unor comenzi, pe rânduri diferite


ale ferestrei din fig. 7.22, prin selectarea acţiunilor predefinite din cadrul unor liste
puse la dispoziţie.

Anumite operaţiuni care erau disponibile în cazul tabelelor, sunt de


asemenea disponibile şi la formulare.
Navigarea, actualizarea conţinutului tabelelor de bază, sortarea, filtrarea
etc. sunt valabile şi la formulare.

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.

Macrocomenzile reprezintă o metoda usoara de a avea grija de detaliile simple, cum ar fi


deschiderea si inchiderea formularelor, afisarea si ascunderea barelor cu instrumente, rularea
rapoartelor etc. Cu ajutorul lor putem asigura usor si rapid o legatura intre obiectele bazei de
date, deoarece sintaxa macrocomenzilor este simplă, iar argumentele pentru fiecare acțiune sunt
prezentate în sectiunea inferioară a ferestrei Macro.

Codul VBA ar trebui folosit in locul macrocomenzilor pentru:

a. Întreținerea mai ușoară a bazei de date


Deoarece macrocomenzile sunt obiecte separate față de formularele si rapoartele care le
utilizează, o baza de date continand multe macrocomenzi care raspund la evenimentele
formularelor si rapoartelor poate fidificil de intretinut, în timp ce, procedurile eveniment VBA
sunt continute in definitia formularului sau raportului. Daca se muta un formular sau raport dintr-
o baza de date inalta, procedurile eveniment interne formularului sau raportului sunt mutate
și ele.

b. Crearea de functii proprii


Access include multe funcții intrinseci (exemplu functia Ipmt care calculeaza dobanda unui
imprumut). Aceste functii pot fi utilizate pentru a executa calculele fara a fi necesara crearea
unor expresii complicate. Utilizand VBA, se pot crea functii pentru a executa fie calcule
ce depasesc posibilitatile unei expresiisau pentru a inlocui expresiile complexe. In plus, funcțile
proprii pot fi utilizate în expresii pentru a aplica o operatie comuna la mai multe obiecte.

c. Mascarea mesajele de eroare


Folosind VBA, se poate detecta producerea unei erori si fie se afiseaza un mesaj particularizat
(facut pe intelesul utilizatorului) fie se execută o anumita actiune.

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.

e. Actiuni la nivel de sistem


Prin utilizarea intr-o macrocomanda a actiunii RunApp se poate lansa în executie o alta aplicatie
Windows/LINUX/MS-DOS din aplicatia curenta, dar o macrocomanda nu poate face prea multe
in afara lui Access. Folosind VBA, putem verifica existenta un fisier pe sistem, utiliza schimbul
dinamic dedate (Dynamic Data Exchange - DDE) pentru a comunica cu alta aplicatie
Windows,cum ar fi Microsoft Excel si apela functii din bibliotecile de legaturi dinamice
(Dynamic-Link Library - DLL) din Windows.

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

g.Transmiterea de argumente procedurilor VBA


Argumentele actiunilor unei macrocomenzipot fi setate in fereastra Macro dar nu pot fi schimbate
pe timpul executiei, în timp ce, in VBA se pot cu transmite argumente codului pe timpul
executiei lui sau se potutiliza variabile ca argumente.
Aceasta va asigura o mai mare flexibilitate in modul de executare a procedurilor VBA.

Obiecte tip macro


O comandă macro este constituită dintr-un ansamblu de acţiuni executabile printr-un clic cu
mouse-ul, printr-o comandă dintr-un meniu, ca urmare a unui eveniment, sau printr-o combinaţie
de taste. Acţiunile unui obiect macro se aplică obiectelor dintr-o bază de date.

Acţiunile pot viza :

• deschiderea unui obiect tip tabel, cerere, formular, raport;


• filtrarea datelor afişate într-un obiect tabel sau formular;
• căutarea unei înregistrări care răspunde la un anumit criteriu;
• configurarea imprimării sau imprimarea unui formular;
• iniţializarea conţinutului anumitor câmpuri;
• automatizarea importului/exportului de date;
• definirea meniurilor personalizate;
• executarea unei instrucţiuni (fraze) SQL.

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.

Acţiuni pentru manipularea obiectelor bazei de date

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

<nume obiect macro>.<nume macro din grup>.

Command Button Wizard asociaza un buton de comandă la o macrocomandă.

Condiţionarea executării acţiunilor în obiecte macro


Executarea unora din acţiunile obiectelor macro poate fi condiţionată folosind expresii
condiţionale. Pentru aceasta este necesară selectarea functiei IF.

Un exemplu practic de condiţionare a unei acţiuni:


• fereastra de editare a obiectului macro Test Cod client;
• formularul Intr noi clienti ;
• proprietăţile zonei de text Cod client; proprietatea Before Update asociază obiectul macro Test
Cod client în vederea executării.

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

Crearea meniurilor şi barelor de instrumente personalizate cu obiecte macro


Construirea de obiecte macro permite utilizatorilor să personalizeze aplicaţiile dezvoltate prin
crearea de meniuri şi/sau bare cu instrumente personalizate. Aceste meniuri şi/sau bare cu
instrumente se asociază obiectelor tip formular.

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.

Necesitatea utilizării codului VBA în aplicații Access


Aplicațiile mai simple din Access pot fi scrise fara a fi nevoie de vreo instrucțiune, eventual
folosind comenzile macro.
Desi comenzile macro sunt foarte bune pentru rezolvarea rapidă a unor prelucrări necesare
pentru dezvoltarea majoritații aplicațiilor de bază, realizarea unor aplicații complexe,
profesioniste în Access se face folosind limbajul VBA. Acest lucru se datoreaza faptului că, spre
deosebire de comenzile macro, VBA ofera posibilități de lucru specifice limbajelor de nivel înalt
de programare orientată pe obiecte.
Câteva dintre aceste posibilității sunt:
 tratarea erorilor prin proceduri speciale create de proiectant. În timpul execuției unei
aplicații pot interveni diverse erori (de exemplu o împarțire la zero sau iesirea din
domeniul de definiție al unei variabile etc.) pe care sistemul le trateaza în general prin
stoparea modulului unde apar sau chiar a întregii aplicații. VBA ofera posibilitatea ca la
apariția unei erori, controlul sa fie dat unui modul de cod VBA, realizat de proiectant, care
sa rezolve în funcție de context situația aparuta, fara a mai fi necesara stoparea modulului
respectiv sau a aplicației.
 crearea unor structuri ciclice pentru parcurgerea seturilor de înregistrari.
 cererile de selecție se pot manipula ca pe un fisier specific, numit set de înregistrari;
 execuția proceselor tranzacționale. Acestea reprezinta practic posibilitatea de a efectua
 actualizarile într-un set de înregistrari, global, la un anumit moment. În cazul apariţiei
unei erori se pot anula toate actualizarile din procesul respectiv, setul de înregistrari
ramânând nemodificat;
 apelarea funcțiilor Windows API, prin care se pot folosi module ale sistemului de
operare;
 utilizarea variabilelor, constantelor si a literalilor;
 crearea si manipularea prin program a obiectelor necesare aplicatiei;
 crearea de clase de obiecte;
De asemenea VBA usurează scrierea bibliotecilor de funcții reutilizabile, precum și proiectarea și
depanarea proceselor complexe de catre programatori.

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.

Modulele de cod VBA în Access


Codul VBA este scris în unitați numite rutine, care pot fi proceduri (subrutine) sau funcții.
Aceste proceduri si funcții sunt pastrate în obiecte numite module de cod:

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.

Orice modul de cod este format din două părți:


1. În prima parte se introduc declarațiile generale ale modulului, valabile în întreg modulul.
Acestea sunt:
− Opțiunile modulului. De exemplu: Option Explicit, care forțează declararea tuturor
variabilelor folosite în modul.
− Declararea tipurilor, variabilelor si constantelor, vizibile în tot modulul de cod.

2. În a doua parte se introduc rutinele (proceduri sau funcții) modulului de cod.


O procedura (subrutina) este o rutina care executa o acțiune:
− la apariția unui eveniment al unui obiect al aplicației;
− la apelarea (lansarea) ei dintr-o altă rutină VBA;
12
O funcție este un tip special de rutina, datorita faptului ca poate întoarce o valoare, chiar în
numele ei.
Deci codul VBA poate fi gasit în rapoarte, formulare si module de cod. În formulare si rapoarte,
codul VBA poate fi plasat în rutinele (funcții sau proceduri) definite de utilizator, ca si în
procedurile eveniment, pe când în modulele generale, codul VBA este plasat numai în rutinele
definite de utilizator.

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.

8.3. Elementele generale ale limbajului VBA


Definirea unui limbaj de programare (ca si VBA) se face în general prin configurarea
următoarelor elemente de baza:
• tipuri de date;
• variabile;
• constante;
• instrucțiuni:
− instrucțiunea de atribuire;
− structuri de control;
• rutine (proceduri si funcții);
• biblioteci.
Dacă limbajul de programare este orientat la nivel de obiect, asa cum este Visual Basic sau VBA,
atunci trebuie definite si elemente referitoare la:
• referirea obiectelor;
• crearea modulelor de clase de obiecte;
• crearea si manipularea obiectelor (instanțe ale claselor de obiecte);
• crearea si manipularea colecțiilor de obiecte.
Limbajele de programare dezvoltate mai pun la dispoziție programatorilor:
• proceduri specifice de tratare a erorilor;
• modalitați de verificare si depanare a erorilor de programare;
• proceduri de import/ export de obiecte exterioare aplicației;
• interacțiunea cu sistemul de operare;
• manipularea datelor organizate în fisiere sau baze de date.

Structura rutinelor VBA


Scrierea rutinelor se face respectând urmatoarele reguli:
• prima instrucțiune definește tipul rutinei : procedura sau funcție;
• ultima instrucțiune executabila este End Sub | Function;
• la început se pun de obicei (dar nu este obligatoriu) instrucțiunile declarative (tipuri de date,
variabile, constante);

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.

VBA – mediul de dezvoltare si depanare


Odata intrat într-un modul de cod, Access ofera un sistem complex pentru realizarea si asistarea
activității de programare în VBA. Printre cele mai utilizate instrumente ale acestui sistem sunt:

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

8.4. Tipuri de date


Prin dată se înțelege orice entitate asupra careia poate opera calculatorul. În cod masina datele se
reprezinta sub forma unei secvențe de cifre binare. În cazul limbajelor de nivel înalt se face
abstracție de detaliile de reprezentare a datelor, dezvoltând conceptul de tip de date. În memoria
calculatorului orice data apare ca o succesiune de biți.
Modul în care pentru o astfel de succesiune se asociaza o valoare depinde de interpretarea ce i se
da. La nivelul limbajelor de programare o astfel de interpretare este reprezentata de tipul datelor.

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.

Tipuri de date elementare :


 Date numerice întregi
 Date numerice reale
 Tipul de date BOOLEAN – logic
 Tipul de date STRING – sir de caractere
 Tipul de date DATE – data calendaristica si timp

Tipuri de date structurate


VBA include mecanismele necesare construirii unor tipuri noi, prin restrângeri sau combinari ale
tipurilor deja definite.
Aceste mecanisme poarta numele de constructori de tipuri si joaca un rol esențial în programare.

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:

Dim cCheltuieli (364) As Currency

Cu procedura de mai jos introducem valoarea 22 în primele 100 de zile:

Sub ExempluArray()
Dim cCheltuieli(364) As Currency
Dim intI As Integer
For intI = 0 to 99
cCheltuieli(intI) = 22
Next
End Sub

TYPE – Crearea tipuri lor de date definite de utilizator


Exista posibilitatea sa se creeze structuri noi de date, definite de proiectant (utilizator), formate
din combinari din alte tipuri de date.
Declararea unui nou tip de date se face cu instrucțiunea TYPE astfel:

[Public | Private] Type NumeTip


NumeElement1 As type
NumeElement2 As type
...
End Type

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

Caracterul (') se foloseste pentru marcarea comentariilor.


Caracterele ( _ ) se folosesc pentru continuarea unei instrucțiuni pe urmatorul rând.

Tipul de date VARIANT


Acest tip de date, specific limbajului Visual Basic, este deosebit de puternic fiind compatibil cu:
− toate tipurile numerice;
− tipul Date;
− tipul String;
− tipul Object.
Desi usureaza munca de programare, totusi folosirea variabilelor de tip variant diminueaza
performanțele programului, atât ca memorie ocupata cât si ca timp de execuție.

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.

Durata de viață: se refera la timpul cât variabila ocupa loc în memorie.


Când se creeaza variabile trebuie avut în vedere mai multe lucruri. Modul si locul în care se
declara o variabila determina domeniul de vizibilitate, durata de viața si alte caracteristici ale
acesteia.

Declararea variabi lelor


Declararea variabilelor se face de obicei cu instruc_iunea declarativa DIM. Forma acestei
instrucțiuni este:

Dim NumeVariabila As TipulDeDateAlVariabilei

Numele variabilei respecta regulile folosite la formarea numelor. În practica programarii, se


obisnuieste sa se puna un prefix convențional la nume, care sa indice tipul de date al variabilei.
O variabila poate fi declarata specificându-se urmatoarele tipuri de date: Byte, Integer, Long,
Currency, Single, Double, Date, String (pentru variabile de lungime variabila), String * length
(pentru variabile de lungime fixa), Object, sau Variant, sau a unui tip de date definit cu
declarația Type.

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.

Exemplu. Dim intX As Integer, intY As Integer, intZ As Integer

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.

Dim iCounter, iAge, iWeight As Integer

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

Caractere folosite ca Type-declaration


Anumite variabile mai pot fi create automat de un anumit tip, folosindu-se în loc de specificația
As, anumite caractere speciale, denumite caractere de tip, la sfârsitul numelui variabilei, în
declarația Dim.

Exemplu. Urmatoarele declarații sunt echivalente.

Dim Nume As String ~ Dim Nume$


Dim Virsta As Integer ~ Dim Virsta%

18
Dim Anul As Variant ~ Dim Anul

Option Explicit (declararea explicita a variabilelor)


Este o instrucțiune declarativa care poate fi inclusa în secțiunea General Declarations a unui
modul de cod (prima parte a acestuia). Când Option Explicit este plasat într-un modul de cod,
toate variabilele din interiorul acestuia trebuie sa fie declarate înainte de folosire, în caz contrar
producându-se o eroare de compilare.

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:

Dim iCounter As Integer


Dim sName As string

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.

Variabi le locale si globale


În funcție de locul de declarare, variabilele pot fi:
− locale – variabile declarate în interiorul rutinei, care sunt vizibile (domeniul de
valabilitate)numai în aceasta;
− globale (modale) – variabile declarate în secția de declarații generale de la începutul unui
modul de cod. În acest caz variabila va fi vizibila în toate rutinele modulului respectiv de cod.

Exemplu. Fie declararea variabilei:

Dim sName As String

Daca aceasta declarație se face:


într-o rutina – ea va putea fi folosita numai în aceasta, fiind o variabila locala;
în secțiunea de declarații generale ale modulului de cod – ea este globala si va putea fi
utilizata în toate rutinele modulului respectiv, dar nu si în alte module de cod (aceasta
caracteristica o au numai variabilele declarate Public în modulul general de cod).

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.

Option Explicit ' [General Declarations]


Dim miCounter As Integer
Private Sub Fact20()
miCounter = 20
End Sub
Private Sub Fact10()
miCounter = 10
End Sub
Private Sub Afisez ()
MsgBox miCounter
End Sub

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.

Variabile Publice si Private


O variabila publica poate fi accesata (este vizibila, are domeniul de valabilitate) de oriunde din
aplicație. Variabilele publice se folosesc de obicei ca identificatori de acces, valori de
configurare pentru mediul de lucru si alte date care trebuie sa fie vizibile pentru întreaga
aplicație.
Declarațiile variabilelor publice trebuie sa fie plasate în secțiunea General Declarations a
modulului general de cod.

Pentru declararea variabilelor publice se foloseste cuvântul cheie PUBLIC, în loc de DIM.

Exemplu. O declarație de variabila publica arata asa:

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.

Private Sub cmdPublic_Click ()


piCounter = 50
Msgbox piCounter
20
End Sub

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.

Exemplu. Private MyName As String


Cuvântul cheie DIM este echivalent cu PRIVATE atunci când se folosesc la declararea
variabilelor în modulele de cod. Este totusi indicata folosirea expresiei private, pentru a face
codul mai lizibil (mai usor de citit si mai rapid de interpretat).

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.

Private Sub cmdLocal_Click ()


Dim iCounter As Integer
iCounter = iCounter + 1
MsgBox iCounter
End Sub

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:

Private Sub cmdLocal_Click ()


Static iCounter As Integer
iCounter = iCounter + 1
MsgBox iCounter
End Sub

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.

Variabile – domeniul și durata de valabilitate


Asa cum am aratat, domeniul de valabilitate sau vizibilitate a variabilelor este determinat de
cuvântul utilizat în declararea variabilei: Dim, Private, Public si de locul unde acesta e plasat,

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.

Declararea si folosirea variabilelor ARRAY


Variabilele Array (tablou) se declara la fel ca orice alta variabila folosindu-se instrucțiunile
declarative Dim, Static, Private, sau Public. Diferența fața de declararea unei variabile simple
este aceea ca la tablouri, între paranteze, trebuie sa se specifice pentru fiecare dimensiune – în
ordine si separate prin virgula daca sunt mai multe dimensiuni – valoarea minima (de obicei se
omite fiind implicita) si maxima a indicelui dimensiunii respective.

Declararea tablourilor cu dimensiuni fixe - statice


Dim NumeTablou (N1 [, N2 [, N3…. ]) As TipDeData

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.

Declararea tablourilor cu dimensiuni variabile – dinamice

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

Exemplu. Dim sngArray () As Single

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.

Exemplu. ReDim sngArray(11) redimensioneaza tabloul, dar nu modifica tipul de date al


elementelor si provoaca pierderea datelor din tablou.

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.

Exemplu. ReDim Preserve sngArray(UBound(sngArray)+10)


− va redimensiona tabloul, marind cu 10 numarul lui de elemente si va pastra datele ce erau în
tablou înainte de executarea instruc_iunii;
− funcția Ubound întoarce indicele superior maxim al unui tablou;

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.

Forma instrucțiunii declarative CONST este:


[Public | Private] Const NumeConstanta [As TipData] = Valoare
O constantă se comporta practic ca o variabila, inițializata cu o anumita valoare, care nu se mai
poate schimba în timpul execuției aplicației.
Regulile aplicate variabilelor privind domeniul și durata de valabilitate sunt efective și în cazul
constantelor.
Deci vom avea:
− constante locale sau globale, în funcție de locul de declarare (în rutina sau secțiunea de
declarații generale a modulului de cod);
− constante publice sau private, daca folosim sau nu în fața cuvântului cheie Const cuvintele
cheie Private, Public.

Exemplu. Public Const conAge As Integer = 34 ' conAge este o constanta _ Publica, Integer, cu
valoarea 34.

Constantele se pot declara în doua moduri si anume:


− cu tip explicit, si anume: Boolean, Byte, Integer, Long, Currency, Single, Double, Date,
String, sau Variant, ca în exemplul de mai sus;
− cu tip implicit, în care clauza As lipseste iar tipul va fi determinat de tipul datei cu care se
încarca constanta. De exemplu daca avem declarațiile:

Const Ziua = "Miercuri"


Const Virsta = 44

atunci prima constanta va fi de tip string, iar a doua integer.


Ca si la variabile, se pot declara mai multe constante pe acelasi rând, cu specificarea (daca este
explicita) a tipului pentru fiecare constanta în parte.
Const conAge As Integer = 34, conWage As Currency = 35000, _ conNume="Soare"
În exemplul de mai sus primele doua constante sunt declarate explicit, Integer respectiv
Currency, iar a treia, implicit, string.

8.7. Limbajul VBA – Instructiuni executabile


Limbajele de programare au un set de instrucțiuni care constituie lista completa a posibilitaților
de care dispune programatorul pentru a determina rezolvarea unei probleme (aplicație) pe un
sistem de calcul.

Instrucțiunile unui limbaj de programare sunt de doua feluri:


− Instrucțiuni declarative, care practic nu determina executarea unei acțiuni de catre sistemul
de calcul, ci numai niste indicații care se dau compilatorului. De exemplu instrucțiunile de
declarare ale tipurilor de date, variabilelor sau constantelor (Dim, Const, Type etc.), opțiunile de
compilare (Option Explicit, Option Base, Option Compare Database, etc.)

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

Execuția unei instrucțiuni reprezinta efectuarea operației specificate de codul instrucțiunii,


interpretate la un moment dat de unitatea centrala a unui sistem de calcul sau de un procesor. De
obicei, execuția instrucțiunii presupune obținerea operanzilor din memoria interna sau din
registrele unitații centrale, formarea rezultatului si depunerea acestuia într-un registru al unitații
centrale sau în memoria interna.

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.

Instrucț iunea de atribuire


Forma acestei instrucțiuni este:
NumeVariabila = Expresie
Acțiunea acestei instrucțiuni consta în calcularea expresiei (din dreapta semnului =) si depunerea
rezultatului în variabila (din stânga semnului =).
Pentru a se executa cu succes instrucțiunea, este necesar ca rezultatul expresiei sa aparțina unui
tip de date compatibil cu cel al variabilei. În caz contrar se va produce o eroare de execuție.

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.

Private Sub TestExpresie ()


Dim Vstr As String
Dim Vnr As Integer
Vstr = "251"
Vnr = 251 + 40 ' prelucrari normale
Vstr = 251 + 40 ' nu produce eroare de execuție;
' efectueaza adunarea dupa care transforma constanta numerica 291 în stringul "291"
Vnr = Vstr ' nu produce o eroare de execuție;
' transforma stringul "291" în constanta numerica 291

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

Formarea expresiilor în Visual Basic


O expresie este formata din termeni asupra carora se efectueaza anumite operații.
O expresie a carei evaluare este o valoare logica (True sau False) se mai numeste condiție.
Termenii pot fi: variabile, constante, literali (valori date direct) sau funcții (proprii sau din
biblioteci).
Operatorii sunt de trei tipuri si anume:
− aritmetici, care ac_ionând asupra unor termeni scalari (numere, stringuri, date calendaristice,
etc.) vor determina tot un rezultat de aceeasi natura (scalar):
^ * / \ Mod + - &
− relaționali, care acționând asupra unor termeni scalari (numere, stringuri, date calendaristice,
etc. ) vor determina un rezultat logic (boolean):
< <= > >= = <>
Is Like
− logici, având valori logice (True, False) ca operanzi, vor determina un rezultat tot logic:

Mai exista doua funcții logice, mai puțin folosite, si anume:


EQV – utilizata pentru verificarea echivalenței logice a doua expresii;
IMP – utilizata pentru verificarea implicarii logice între doua expresii.

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

8.8. Structurile de control


Structurile de control stabilesc ordinea în care se executa instrucțiunile.
Exista trei structuri de control, si anume: structura secvențiala, structura alternativa (decizionala)
si structura repetitiva (în bucla, în ciclu).

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.

a) Structura alternativa simplă


Instrucțiunea: If... Then... Else

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

Un control în care nu este introdus nimic va avea valoarea NULL.

b) Structura al ternativa multipla


În locul folosirii a mai multor instrucțiuni If... Then... Else, atunci când decizia se ia prin
evaluarea mai multor condiții (Structura alternativa multipla), este mult mai simplă utilizarea
instrucțiunii Select Case sau a instrucțiunii If... Then... ElseIF…Else

Instrucțiunea Select Case


Select Case NumeVariabila
Case Valoare1
Grup 1 de instrucțiuni
[Case Valoare2
Grup 2 de instrucțiuni]
[Case ValoareX
Grup X de instrucțiuni]
………………………
[Case Else
Grup else de instrucțiuni]
End Select

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

Deci: Condiția I va fi: NumeVariabila=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.

În ValoareI se pot introduce:


− reuniuni de mulțimi – operatorul virgula (ex: 1, 2, 5);
− intervale – operatorul TO (ex: 1 To 7);
− submulțimi – operatorul IS (ex: Is > 7).
Folosirea clauzei Case Else este opționala.
O condiție cu rezultatul NULL este tratata ca si cum ar fi FALSE.
28
Exemplu.
Sub TestCase()
Dim NumeV As Integer
NumeV = 5
Select Case NumeV
Case 7 'condiția: NumeV=7 - False
MsgBox "Grup 1 de instrucțiuni"
Case 5, 9 'condiția: (NumeV=5) OR (NumeV=9) - True
MsgBox "Grup 2 de instrucțiuni"
'execuția instrucțiunii(lor) la care condiția=True
'dupa execuție, instrucțiunea Case se termina
Case 1 To 9 'condiția: (NumeV>=1) AND (NumeV<=9) - True
'desi si aceasta condiție=true, acest grup nu va fi executat
MsgBox "Grup 3 de instrucțiuni"
Case Else
MsgBox "Grup else de instrucțiuni"
End Select
End Sub

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.

Instrucțiunea If... Then... ElseIF…Else


If condiție-1 Then
[grup 1 de instrucțiuni]
ElseIf condiție-n Then
[grup n de instrucțiuni]
……………. …..
Else
[grup else de instrucțiuni]
End If

Instrucțiunea funcționeaza similar instrucțiunii Select Case, numai ca:


− condițiile introduse sunt independente, ne mai fiind obligatorie prezența unei variabile ca un
termen al condiției.
Deci instrucțiunea va evalua pe rând, în ordine, condiția 1, 2 etc.
Prima condiție gasita adevarata va determina execuția grupului respectiv de instrucțiuni si
terminarea instrucțiunii.
țiile sunt false, vor fi executate toate instrucțiunile dintre Else si End If
(Grup else de instrucțiuni).

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.

a) Structura repeti iva cu test. Instrucț iunea Do…Loop


Executa în mod repetat un ciclu si anume:
cât timp (While) o condiție este TRUE sau
pâna când (Until) o condiție devine TRUE
Exista doua forme ale instrucțiunii Do, în funcție de locul unde se gaseste plasata condiția si
anume la început sau sfârsit:

Do [{While | Until} condiție] Do


[grup instrucțiuni] [grup instrucțiuni]
[Exit Do] sau [Exit Do]
[grup instrucțiuni] [grup instrucțiuni]
Loop Loop [{While | Until} condiție]

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.

O condiție cu rezultatul NULL este tratata ca si cum ar fi FALSE.

31
Exemplu.
Private Sub cmdLoop1_Click ()
Dim iCounter As Integer
iCounter = 1
Do While iCounter < 5
MsgBox iCounter
ICounter = iCounter + 1
Loop
End Sub

Procedura va afisa patru mesaje, cu numere de la 1 la 4.


Aceasta structura nu asigura întotdeauna executarea secvenței de cod din interiorul buclei. Daca
în iCounter este introdusa o valoare mai mare sau egala cu 5, codul din interiorul buclei nu va fi
executat niciodata.

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 While|Until... Loop face evaluarea condiției înainte de executarea ciclului si de


aceea nu asigura execuția acestuia.

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.

Forma instrucțiunii FOR este:


For contor = start To end [Step pas]
[grup instrucțiuni]
[Exit For]
[grup instrucțiuni]
Next [contor]
în care:
− contor – variabila numerica folosita pentru stabilirea numarului de execuții ale ciclului;
− start – valoarea inițiala a contorului;
− end – valoarea finala a contorului;
− pas – valoarea cu care contorul se incrementeaza; poate fi pozitiva sau negativa (implicit este
1);
Incrementarea se efectueaza dupa execuția fiecarui ciclu.

Funcționarea instrucțiunii FOR se face prin parcurgerea urmatoarelor etape:

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;

b) se evalueaza condiția de terminare a ciclului;

c) în continuare, daca condi_ia este:


− FALSE – se executa ciclul si se continua instruc_iunea FOR cu etapa d);
− TRUE – nu se executa ciclul si se termina instruc_iunea FOR. Programul continua cu
instruc_iunile de dupa NEXT;
d) dupa executarea ciclului se aduna pasul la contor. Dupa aceasta opera_ie instruc_iunea FOR
continua cu repetarea evaluarii condi_iei, adica cu etapa b).

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

Procedura va afisa cinci mesaje, cu numere de la 1 la 5.

Exemplu.
Private Sub cmdForNext_Click ()
Dim iCounter As Integer
For iCounter = 5 To 1 Step -1
MsgBox iCounter
Next iCounter
End Sub

Procedura va afișa cinci mesaje, cu numere de la 5 la 1.

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.

Structura unui raport


Un raport poate avea mai multe secţiuni. Ele se numesc benzi/zone şi sunt localizate chiar
deasupra barelor – şi poartă acelaşi nume cu aceste bare. Implicit, sunt doar 3 astfel de
benzi: Page Header, Detail şi Page Footer.

9.1. Crearea unui raport


Pentru a crea un raport se procedează în mod asemănător cu elementele prezentate în
cadrul formularelor. După deschiderea bazei de date, se selectează fila Create, modurile de
construire a unui nou raport fiind reprezentate în secţiunea Reports (figura 9.1).

Figura 9.1. Secţiunea Reports a filei Create

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.

Crearea automată a unui raport


În modul Report Wizard se poate crea un raport în mod automat cu ajutorul wizard-ului.
În cadrul primului pas selectăm câmpurile necesare din tabela selectată anterior (Figura
9.2), similar cu pasul corespunzător pentru construirea formularelor. Există în fereastra
care apare o lista derulantă Tables/Queries, care ne permite selectarea altei interogări sau
tabele pentru construirea raportului.

Figura 9.2. Selectarea câmpurilor

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 al treilea permite sortarea (ascendentă sau descendentă) a articolelor şi


agregarea lor la nivelul indicatorilor de grupare (Figura 9.4). Dacă avem câmpuri numerice
care au fost grupate, atunci există un buton Summary Options prin a cărui selecţie se
deschide o nouă fereastră Summary Options, care oferă posibilitatea de a efectua operaţii
precum:
Sum-suma,
Avg-media aritmetică,
Min-minimul,
Max-maximul,
pentru câmpurile grupate.
Rezultatul acestor funcţii poate fi afişat la nivelul fiecărui grup (Detail) şi/sau doar la
sfârşitul raportului (Summary). În plus, pe lângă afişarea valorică a sumarului, se poate
opta pentru afişarea fiecărui sub-total sub formă procentuală. Prin efectuarea unui clic pe
butonul OK se revine la fereastra (anterioară) de sortare.

Fig. 9. 4. Sortarea articolelor şi construirea sumarului


Pasul patru permite stabilirea modului de afişare a datelor în cadrul raportului,
putând alege din mai multe moduri (fig.9.5) precum şi orientarea paginii raportului
(Portrait sau Landscape). Se poate forţa afişarea raportului pe lăţimea unei singure pagini
prin ajustarea lăţimii fiecărui câmp afişat.

Fig. 9.5. Modul de afişare a datelor

Pasul 5 permite alegerea, dintre stilurile predefinite, a stilului de tipărire pe care dorim să-l
conţină raportul.

Fig. 9.6. Alegerea fonturilor de afişare

Pasul 6 permite introducerea numelui de identificare şi de prezentare a raportului (fig. 9.6).


Dacă este selectat butonul Preview the report, atunci la efectuarea unui clic pe butonul
Finish va fi afişat raportul pe ecran (previzualizat), altfel se va ajunge în modul Design
pentru personalizarea raportului construit. Dacă datele sunt grupate, vor apare grupate (fig
9.8), altfel nu.
Fig. 9. 7. Introducerea numelui raportului

Fig. 9. 8. Raportul Stoc

După închiderea previzualizării, va apare numele raportului nou creat în lista de


obiecte a bazei de date.

Crearea manuală a unui raport


După cum stim se poate selecta opţiunea Design View şi se alege tabela/interogarea
sursă şi apoi se efectuează un clic pe butonul Ok. Va apare fereastra constructorului de
rapoarte.
Elementele de bază ale acestei ferestre sunt indicate în figurile anterioare. Se
observă, printre alte elemente de bază, antetul de pagină, zona de detaliu şi subsolul paginii
raportului.
Se pot “trage”(aduce) câmpuri ale tabelului selectat pe suprafaţa de editare (details)
a raportului. Page Header conţine de obicei titlurile de coloană, iar Page Footer poate
conţine data editării, subtotalizări de pagină, etc.
Odată introdus un obiect se pot aduce modificări din fereastra de proprietăţi (se
procedează în acelaşi mod ca şi în cazul obiectelor introduse în cadrul formularelor). Tot
din fereastra Properties se pot aduce modificări întregului raport sau oricărei secţiuni a
acestuia. În cadrul acestei ferestre se pot vizualiza fie toate proprietăţile (tab-ul All) fie
proprietăţile împărţite pe categorii (Format, Data, Event Other). Dintre proprietăţile
importante amintim:
1.Categoria Format permite modificarea proprietăţilor legate de modul în care arată
raportul:
o Caption - reprezintă titlul raportului, afişat în fereastra de titlu;
o Default View - prezintă modul iniţial de afişare al raportului. Report View afişează
raportul, Print Preview afişează raportul înaintea imprimării;
o Picture - permite asocierea unei imagini personalizate raportului;
o Fit to Page - forţează încadrarea datelor din raport pe lăţimea unei pagini;
o Border Style - permite alegerea tipului de ramă pentru fereastra în care este afişat
raportul;
o Scroll Bars - permite doar afişarea barei de deplasare orizontală, verticală, a ambelor
bare sau a niciuneia;
o Close Button - afişază sau ascunde butonul de închidere al ferestrei;
o Min Max Buttons - afişază sau ascunde butoanele de minimizare sau maximizare a
ferestrei;
2.Categoria Data permite modificarea proprietăţilor legate de datele afişate în cadrul
raportului:
o Record Source - permite selectrarea sursei de date pe care se bazează raportul. Sursa
de date poate fi un tabel, o interogare sau o comandă SQL. Prin apăsarea butonului
din dreapta câmpului se vor afişa toate tablelele şi interogările din baza de date.
Prin apăsarea butonului din dreapta câmpului se va deschide constructorul de
expresii (Expression Builder) care permite definirea unei surse de date personalizate;
o Filter - permite aplicarea unei expresii care să filtreze înregistrările afişate în cadrul
raportului;
o Filter on Load - permite aplicarea filtrului la încarcarea raportului sau ulterior;
o Order By - permite stabilirea unei ordini de afişare a datelor;
o Order By on Load - permite aplicarea ordonării la încarcarea raportului sau ulterior;
o Allow Filters - stabileşte permisiune pentru aplicarea filtrelor.
3.Categoria Event permite scrierea unor bucăţi de cod care se va executa în cazul
apariţiei evenimentului respectiv.
4.Categoria Other grupează diverse alte proprietăţi ale raportului:
o Toolbar - permite asocierea unei bare de instrumente raportului;
o Menu Bar - permite afişarea unei bare de meniuri raportului;
o Shortcut Menu Bar - permite asocierea unui meniu contextual raportului;
o Use Default Paper Size - permite folosirea mărimii foii din setările implicite al
imprimantei.
Fig.9.9. Proprietăţile raportului

Numerotarea paginilor se poate face cu ajutorul meniului Insert, opţiunea Page


Numbers.

Fig.9.10. Fereastra Generatorului de Rapoarte în modul Design View


Figura 9.11. Elementele de editare a raportului

Câmpurile articolelor constituie rubrici ale coloanei. Utilizatorul poate modifica


toate secţiunile raportului, adică: Report Header, Page Header, Detail, Page Footer şi
Report Footer.

Crearea unui raport în modul Label Wizard


Acest mod creează etichete poştale utilizate pentru articolele unei tabele/interogări
sursă. Acest proces se desfăşoară în mai mulţi paşi.

La început ni se solicită dimensiunile dorite ale etichetei, dimensiuni ce se pot


introduce în inci (inches) sau metri.
Apoi selectăm coloritul fundalului.
In al treilea pas, selectăm câmpul din articol care va constitui conţinutul etichetei.
Intrucât etichetele poştale vor fi generate pentru fiecare articol editat, în pasul al
patrulea se poate solicita eventuala sortare a articolelor etichetate.
In ultimul pas se salvează eticheta, dându-i un nume.
In final avem disponibil un număr de etichete corespunzător numărului de articole
din tabela/interogarea sursă.

9.3 Prelucrarea rapoartelor


Adăugarea, modificarea antetului sau subsolului unui raport
Pentru a adăuga un text sau o imagine în antetul sau subsolul unui raport, este necesar să
deschidem raportul prin efectuarea unui clic dreapta pe numele tabelului şi alegerea din
meniul contextual apărut a opţiunii Design View (Figura 9.38.). Fereastra de editare a
raportului va fi afişată.

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.

Figura 9.14. Introducerea unei etichete în cadrul raportului

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.

Figura 9.15. Adăugarea unor grupuri în cadrul rapoartelor

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

Figura 9.17. Fişier text obţinut în urma exportului

S-ar putea să vă placă și