You are on page 1of 30

RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

INFORMATICĂ

BAZE DE DATE

CUPRINS

I. Generalităţi
1. Conceptul de bază de date
2. Obiectivele fundamentale
3. Sistemul de gestiune al Bazelor de Date
II. SGBD Access
1. Prezentare generală
2. Crearea structurii bazei de date
3. Formulare
4. Interogarea bazei de date
5. Rapoarte
6. Comenzi macro
III. Interfaţarea SGBD Access cu alte aplicaţii
1. Importul şi Exportul de date
2. Interfaţare Internet
IV. Limbajul SQL
1. Noţiuni generale
2. Instrucţiuni de definire a datelor
3. Interogări
4. Instrucţiuni pentru manipularea datelor
V. Analiză de caz – energii durabile

1
RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

I. Generalităţi

I.1. Conceptul de bază de date

Pe lângă realizarea de programe de prelucrare a datelor, o activitate la fel de importantă este aceea
de organizare a datelor în scopul prelucrării. Pentru a putea realiza aplicaţii eficiente este necesar ca
datele prelucrate să fie stocate într-o structură bine pusă la punct şi în acelaşi timp şi programele de
prelucrare să corespundă cerinţelor.

Un element important este acela al separării nete între date, informaţii şi cunoştinţe:
- datele – din punctul de vedere al prelucrării pe calculator datele sunt definite de trei
elemente: un identificator (ex.: cantitate), un atribut (ex.: număr real şi pozitiv) şi
valoare (ex.: 23,78);
- informaţiile – este un mesaj cu caracter de noutate. Acestea vin să înlăture
nedeterminările şi sunt obţinute în urma prelucrării datelor;
- cunoştinţele – sunt informaţii simple sau compuse pe care le dobândim de-a lungul
timpului. Ele se referă la obiecte şi fenomene din lumea reală.

O bază de date poate fi definită ca un ansamblu de date elementare sau structurate, accesibile unui
grup de utilizatori. Aceasta este un ansamblu de fişiere intercorelate care conţine nucleul de date
necesare unui sistem informatic.

Fişierul este un ansamblu de înregistrări fizice, omogene din punctul de vedere al conţinutului şi al
prelucrării. O înregistrare fizică este unitatea de transfer între memoria internă şi cea externă a
calculatorului. Aceasta este formată din una sau mai multe înregistrări logice. Înregistrarea logică
este unitatea de prelucrare din punct de vedere al programului utilizator. Aceasta la rândul ei este
formată dintr-un ansamblu de câmpuri care descriu o anumită realitate.

I.2. Obiectivele fundamentale

Obiectivele fundamentale ale unei baze de date sunt următoarele:


• Centralizarea datelor – permite: suprimarea redundanţei, asigurarea unicităţii
înregistrării şi controlul centralizat asupra datelor. În prelucrarea clasică datele folosite
de mai multe aplicaţii sunt înregistrate în mai multe fişiere şi în formate diferite ceea ce
implică o utilizare ineficientă a spaţiului de memorare;
• Independenţa dintre date şi prelucrări – baza de date reprezintă o imagine a realităţii.
Ea trebuie actualizată permanent dar acest fapt nu trebuie să afecteze programele de
prelucrare a datelor;
• Realizarea de legături între entităţile de date – sunt vitale în exploatarea unui sistem
informatic. Un exemplu este acela al legăturii ce se realizează între un furnizor şi
produsele pe care le vinde (şi invers) în cazul gestiunii aprovizionării;
• Integritatea datelor – asigură fiabilitatea şi coerenţa bazei de date. Pentru aceasta
trebuie definite restricţii de integritate cum sunt: apartenenţa la o listă de valori sau la un
interval, apartenenţa la un anumit format şi reguli de coerenţă cu alte date;
• Securitatea datelor – baza de date trebuie să fie protejată împotriva distrugerilor logice
(anomalii de actualizare) sau fizice. Pentru aceasta există instrumente ce sunt capabile să
realizeze puncte de repriză (înregistrarea de copii coerente ale bazei de date la anumite
momente de timp) şi să gestioneze un jurnal de tranzacţii (lista operaţiilor realizate
asupra bazei de date după ultimul punct de repriză);
2
RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

• Confidenţialitatea – asigurată prin identificarea utilizatorilor prin nume sau cod,


autentificarea prin parole, autorizarea accesului diferenţiat prin drepturi de creare,
consultare, modificare sau ştergere pentru anumite segmente de date;
• Partajarea datelor – permite înlănţuirea tranzacţiilor solicitate simultan pe aceeaşi
înregistrare din baza de date, prin blocarea cererilor în aşteptare şi deservirea ulterioară a
acestora.

I.3. Sistemul de gestiune al Bazelor de Date

Sistemul de gestiune al bazelor de date (SGBD) este o interfaţă între utilizatori şi baza de date, care
permite ca facilităţi principale crearea, actualizarea şi consultarea acesteia. Din acest punct de
vedere SGBD poate fi considerat un instrument de asamblare, codificare, aranjare, protecţie şi
regăsire a datelor în baza de date.

Funcţiunile principale îndeplinite de un SGBD sunt:


- memorarea datelor pe suportul extern prin sistemul de gestiune a fişierelor;
- gestiunea datelor şi a legăturilor dintre ele în vederea unei regăsiri rapide prin
intermediul sistemului de acces (SGBD intern);
- introducerea şi extragerea datelor din baza de date în forma cerută de utilizator (SGBD
extern).

Consultarea unei date din baza de date trebuie să se deruleze ca principiu în mai multe etape care se
succed într-o ordine stabilită. Programul de aplicaţie emite o cerere de consultare a unei date simple
sau grupate din baza de date; această cerere este recepţionată de SGBD care consultă schema
aferentă programului de aplicaţie care a emis cererea şi obţine descrierea logică a datei solicitate, pe
care o compară cu descrierea acesteia în schema conceptuală. În continuare sistemul consultă
structura fizică în raport cu descrierea logică şi determină înregistrarea fizică în care se află data
cerută după care lansează cereri către sistemul de operare care caută înregistrarea fizică şi o pune la
dispoziţia SGBD care apoi o pune la dispoziţia programului de aplicaţie.

3
RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

II. SGBD Access

II.1. Prezentare generală

SGBD Microsoft Access face parte di pachetul de programe Microsoft Office alături de alte
componente tradiţionale cum sunt: Microsoft Word, Excel, PowerPoint şi Outlook iar versiunea
2000 Microsoft Office mai conţine şi Publisher, FrontPage, PhotoDraw şi Small Business Tools.

Principalele caracteristici ale SGBD Access sunt:


• este relaţional şi lucrează sub sistemul de operare Windows;
• este deschis comunicării cu alte sisteme de gestiunea bazelor de date cum ar fi FoxPro
sau Paradox;
• este compatibil cu tehnologia ActiveX, care permite realizarea de aplicaţii client / server;
• permite comunicarea cu Microsoft SQL Server, un alt produs software de gestiune a
bazelor de date;
• permite accesul la baze de date din reţeaua Internet precum şi publicarea de informaţii în
pagini Web;
• este autodocumentat prin help, apelabil contextual sau la cerere;
• conţine instrumente wizard care permit utilizatorului crearea într-o manieră foarte
simplă a obiectelor bazei de date;
• permite crearea de comenzi rapide (shortcuts) pentru accesarea obiectelor Access;
• permite crearea de obiecte definite de utilizator în cadrul bazei de date;
• permite personalizarea bazei de date;
• permite utilizarea obiectelor Access din cadrul altor aplicaţii rulate sub sistemul de
operare Windows.

În versiunea 2000 a SGBD Access au fost introduse o serie de facilităţi noi cum ar fi:
• Interfaţa grafică a fost modificată, fiind mai uşor de utilizat;
• Se permite publicarea datelor folosind pagini HTML dinamice;
• Dimensiunea bazei de date se poate reduce folosind facilitatea de compactare;
• Se pot crea aplicaţii care să utilizeze baze de date stocate în SQL Server prin intermediul
reţelei.

Baza de date Access

Spre deosebire de alte sisteme de gestiune a bazelor de date (cum ar fi FoxPro spre exemplu) unde
prin bază de date se înţelege doar colecţia de fişiere în care sunt stocate datele, baza de date Access
poate fi definită ca o colecţie de obiecte de mai multe tipuri:
• Tabele (Tables) – sunt obiecte definite de utilizator în care sunt stocate datele primare;
• Formulare (Forms) – sunt obiecte care permit introducerea datelor, afişarea acestora
sau controlul aplicaţiei;
• Cereri de interogare (Queries) – sunt obiecte care permit vizualizarea informaţiilor
obţinute prin prelucrarea datelor din una sau mai multe tabele şi / sau alte cereri de
interogare;
• Rapoarte (Reports) – sunt obiecte care permit formatarea şi tipărirea informaţiilor
obţinute în urma consultării bazei de date, sub formă de documente;

4
RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

• Pagini Web de accesare a datelor (Pages) – sunt obiecte care include fişiere HTML şi
alte fişiere suport în vederea furnizării accesului la date prin intermediul browserului
Internet;
• Comenzi Macro (Macros) – sunt obiecte ce conţin definiţii structurate ale uneia sau
mai multor acţiuni pe care Access le realizează ca răspuns la un eveniment;
• Module (Modules) – reprezintă obiecte care conţin proceduri definite de utilizator şi
scrise în limbajul de programare Visual Basic.

Crearea unei baze de date

La pornire SGBD Access afişează un ecran de dialog ce pune la dispoziţie două posibilităţi: crearea
manuală a unei baze de date goale (Blank Access database) sau crearea unei BD cu ajutorul
“asistentului” (Access database wizards, pages and projects).

Cea de-a doua variantă pune la dispoziţia utilizatorilor mai puţin iniţiaţi un set de modele de baze de
date specifice anumitor domenii. În funcţie de problema care trebuie rezolvată aceştia vor alege
unul din aceste modele pe care îl vor adapta ulterior.

Pentru crearea manuală a unei baze de date noi se selectează Blank Access database şi se dă click
apoi pe OK. În fereastra de dialog File New Database se introduce numele bazei de date ce se
doreşte a se crea şi apoi se dă click pe Create.

Deschiderea şi salvarea unei baze de date

Dacă se doreşte modificarea sau consultarea unei baze de date creată anterior aceasta poate fi
deschisă din fereastra principală prin selectarea opţiunii Open an existing file şi apoi click pe OK.
Se va deschide apoi fereastra de dialog Open ce permite selectarea bazei de date dorite.

Prin modificarea unei baze de date Access se înţelege modificarea obiectelor din componenţa
acesteia. După modificarea unui obiect, la închiderea acestuia sistemul va solicita să se specifice
dacă modificările realizate vor fi sau nu salvate. În concluzie, modificările obiectelor se salvează
local şi ca atare nu este necesară salvarea întregii baze de date.

II.2. Crearea structurii bazei de date

În vederea înţelegerii modului în care se creează o aplicaţie în Access vom folosi în continuare un
caz practic. Pentru aceasta vom considera cazul unui sistem informatic de gestiune a materialelor în
cadrul căruia se doreşte evidenţierea furnizorilor, a facturilor, a magaziilor, a tipurilor de materiale
şi a bonurilor de consum. În scopul simplificării într-o anumită măsură a problematicii se presupune
că materialele cuprinse într-o factură sunt destinate unei singure magazii; de asemenea se consideră
că materialele au un preţ de achiziţie fix independent de furnizor şi că recepţia materialelor se face
de o magazie pe baza facturii iar eliberarea acestora se face către secţii pe baza bonurilor de consum

Modelul conceptual al datelor

În urma analizei problemei rezultă următoarele entităţi: furnizor, factură, material, magazie şi bon
de consum. De asemenea se pot identifica următoarele corespondenţe:
- furnizor – factură : un furnizor poate emite de la 1 la n facturi – corespondenţa
“emite”;

5
RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

- factură – material : într-o factură sunt cuprinse de la 1 la n materiale în diferite cantităţi


– corespondenţa “poziţie factură” cu atributul “cantitate intrată”;
- factură – magazie : o magazie poate primi de la 1 la n facturi – corespondenţa
“primeşte”;
- bon de consum – material : într-un bon de consum sunt cuprinse de la 1 la n materiale
în diferite cantităţi – corespondenţa “poziţie bon de consum” cu atributul “cantitate
ieşită”;
- bon de consum – magazie : o magazie poate emite de la 1 la n bonuri de consum –
corespondenţa “destinat”;
- facturi – facturi : o factură poate fi stornată de 0 sau n facturi de stornare –
corespondenţa “se stornează”.

Corespondenţele identificate conform celor enumerate mai sus primesc următoarele cardinalităţi:
- “emite” : dinspre entitatea furnizor(1,n) iar dinspre entitatea factură(1,1);
- “primeşte” : dinspre entitatea magazie(1,n) iar dinspre entitatea factură(1,1);
- “poziţie factură” : dinspre entitatea factură(1,n) iar dinspre entiatea material(1,n);
- “poziţie bon de consum” : dinspre entitatea material(0,n) iar dinspre entitatea bon de
consum(1,n);
- “destinat” : dinspre entitatea bon de consum(1,1) iar dinspre entitatea magazie(1,n);
- “se stornează” : o factură poate să nu fie stornată sau poate să fie stornată de mai multe
ori -> factură(0,n) şi de asemenea o factură poate storna o singură factură -> factură(1,1).

Modelul logic (relaţional) al datelor este următorul:


- furnizori(cod furnizor, denumire furnizor, adresa furnizor, cod fiscal, banca, cont);
- factură(număr factură, data factură, cod furnizor, cod magazie, număr factură stornată,
cota tva);
- magazie(cod magazie, denumire magazie, gestionar);
- conţinut factură(număr factură, cod material, cantitate intrată, preţ factură);
- material(cod material, denumire material, unitate de măsură);
- bon de consum(nr bon de consum, data bon de consum, denumire secţie, cod magazie);
- conţinut bon de consum(nr bon de consum, cod material, cantitate ieşită)
în care s-au marcat cheile primare şi cheile străine.

Acest model relaţional poate fi transpus într-un model fizic corespunzător unei baze de date Access
folosind opţiunea Tools->Relationships din meniul sistemului.

Crearea tabelelor

Crearea structurii tabelelor se poate face: utilizând fereastra de proiectare (Create table in design
view), prin introducerea datelor (Create table by entering data) sau utilizând un wizard (Create
table by using wizard).

Folosind instrumentul wizard se pot adăuga câmpuri standard ce se află deja în cadrul bibliotecilor
de tabele standard. În acest caz câmpurile din cadrul tabelelor standard au fost create pentru
sistemul de lucru anglo-saxon.

În situaţia când se optează pentru utilizarea design view pe ecran va apărea fereastra Table ce
permite definirea rând pe rând, pentru fiecare câmp în parte, a numelui câmpului, tipul de date şi

6
RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

eventual descrierea acestuia. În panoul de jos al acestei ferestre se introduc alte proprietăţi ale
câmpului. Numele câmpului poate fi de maxim 64 de caractere poate să conţină spaţiu şi nu poate
conţine următoarele caractere: [ , ] , . , ` sau ! . De asemenea acesta nu poate fi un nume rezervat
Access.

Numele ales pentru un câmp va fi apoi folosit în alte obiecte ce fac referire la tabela respectivă
(formulare, cereri de interogare, rapoarte, pagini Web, etc.). În situaţia în care acesta se modifică
ulterior este necesar să se modifice corespunzător toate referinţele către acel câmp şi în celelalte
obiecte. În versiunea 2000 a sistemului Access există posibilitatea propagării automate a
modificărilor prin selectarea opţiunii Track Name AutoCorrect prezentă în Tools->Options->
General.

Tipuri de date ce pot fi folosite pentru câmpurile Access

Text – este cel mai folosit tip de câmp în bazele de date Access şi de aceea este considerat implicit
la declararea unui câmp nou. Acesta poate conţine un şir de caractere cu o lungime maximă de 255.
Lungimea câmpului este prestabilită la 50 de caractere dar poate fi modificată.

Memo – sunt câmpuri de tip şir de caractere ce pot avea lungimi de până la 64.000. Se folosesc de
obicei pentru introducerea de comentarii.

Number – folosit pentru valori numerice acest tip de date prezintă mai multe subtipuri selectabile
din proprietatea Field Size:
- Byte – pentru numere întregi (fără zecimale), cu valori de la 0 la 255;
- Integer – numere întregi din intervalul –32.768 … +32767;
- Long Integer – numere întregi din intervalul –2.147.483.648 … +2.147.483.647;
- Single – numere fracţionare reprezentate în virgulă mobilă, simplă precizie, având valori
cuprinse între –3,4*1038 şi +3,4*1038;
- Double – numere fracţionare reprezentate în virgulă mobilă, dublă precizie, având valori
cuprinse între –1,797*10308 şi +1,797*10308;
- Replication ID – identificator global unic;
- Decimal – pentru valori întregi din intervalul –1028 … +1028;

AutoNumber – este un câmp ce conţine valori de tip Long Integer ce va fi completat în mod
automat de către Access pentru fiecare înregistrare adăugată într-o tabelă. Numărul maxim de
înregistrări într-o tabelă ce utilizează AutoNumber este mai mare de 2 miliarde.

Yes/No – pentru câmpuri logice (boolene). Sistemul Access foloseşte pentru codificarea acestui tip
de câmpuri valoarea –1 pentru True şi 0 pentru False. Din proprietatea Format se poate alege una
din opţiunile de afişare: Yes/No, True/False sau On/Off.

Currency – este un format fix, cu patru zecimale proiectat să prevină erorile de rotunjire care pot
afecta operaţiile contabile.

Date/Time – datele calendaristice şi ora sunt stocate împreună într-un format special fix. Modul de
afişare poate fi controlat din proprietatea Date/Time Format.

Object OLE – numit şi BLOB (Binary Large Object). Include date de diverse tipuri (imagini,
desene vectoriale, fişiere audio, etc.) ce pot fi create de o aplicaţie OLE server.
7
RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

Hyperlink – text sau combinaţie de text reprezentând adresa unei pagini Web sau, la modul
general, un URL (Uniform Resource Locator).

Lookup Wizard – pentru crearea de câmpuri ce permit utilizatorului să aleagă valori din cadrul
altor tabele sau dintr-o listă prestabilită de valori.

Formate de afişare

Stabilirea modului de afişare a datelor introduse în câmpurile tabelelor se face folosind proprietatea
Format. Această proprietate nu afectează modul de introducere a datelor. Pentru toate tipurile de
date pot fi folosite următoarele simboluri:
- (spaţiu) – afişează spaţiile drept caractere distincte;
- “ABC” – afişează orice se află în interiorul ghilimelelor aşa cum a fost tastat;
- ! – forţează alinierea la stânga, în loc de aliniere la dreapta;
- * – completează spaţiul disponibil cu caracterul specificat imediat după *;
- \ – afişează următorul caracter aşa cum a fost tastat (acelaşi lucru se poate obţine şi prin
includerea caracterelor de afişat între ghilimele);
- [culoare] – permite afişarea caracterelor cu culoarea specificată între paranteze. Valorile
posibile sunt: Black, Blue, Green, Cyan, Red, Magenta, Yellow, White.

Proprietatea Format foloseşte diverse simboluri şi combinaţii ale acestora pentru tipuri diferite de
date.

Alte proprietăţi ce se pot defini pentru câmpuri

În cadrul ferestrei de proprietăţi ale câmpului se mai pot defini:


- dimensiunea câmpului (Field Size);
- numărul de zecimale (Decimal Places);
- formatul de introducere (Input Mask);
- eticheta (Caption) – pentru specificarea capului de coloană;
- valoarea implicită (Default Value);
- regula de validare (Validation Rule);
- textul de validare (Validation Text) – mesaj explicativ în legătură cu violarea regulii de
validare;
- prezenţa datelor obligatorie (Required);
- indexat (Indexed) – se specifică dacă se face sau nu indexare după câmpul respectiv.
- Se admit date de lungime zero (Allow Zero Length) – pentru date de tip Memo şi Text.

Prin activarea tab-ului Lookup din panoul de proprietăţi, se pot specifica o serie de proprietăţi care
se referă în principal la sursa de introducere a datelor. Aceste pot fi:
- Display Control – tipul de control folosit pentru afişarea câmpului în tabele, formulare
sau rapoarte. Acesta este de obicei Text Box dar poate fi modificat în List Box sau
Combo Box în situaţia în care câmpul respectiv este cheie externă şi ca atare face referire
la o cheie primară dintr-o altă tabelă;
- Row Source type – în situaţia în care Display Control a fost setat ca List Box sau Combo
Box trebuie specificată sursa de date care poate fi: tabelă sau cerere de interogare

8
RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

(Table/Query), listă de valori specificată de utilizator (Value List) sau listă de câmpuri
din altă tabelă (Field List);
- Row Source – în situaţia în care s-a specificat Table/Query sau Field List pentru Row
Source Type aici se menţionează numele tabelei sau a cererii de interogare de unde vor fi
preluate datele iar în situaţia în care s-a selectat Value List se vor introduce valorile din
listă separate prin virgulă;
- Bound Column – se specifică numărul coloanei din care vor proveni datele în situaţia în
care acestea vor proveni din mai multe coloane;
- Colum Count – numărul de coloane ce vor fi preluate;
- Column Heads – se specifică dacă va fi afişată sau nu eticheta coloanei preluate;
- Column Widths – specifică lăţimea de afişare a coloanelor din sursa de date. Dacă o
coloană din tabela sursă nu trebuie afişată atunci I se va specifica lăţimea de afişare 0;
- List Row – se specifică numărul de rânduri ce vor fi afişate în casetă pentru Combo Box;
- List Width – se specifică lăţimea de afişare pentru Combo box;
- Limit to List – se specifică dacă valorile câmpului se vor limita doar la cele afişate în
Combo Box. În situaţia în care se selectează No utilizatorul poate introduce şi valori noi.

Relaţii între tabele

Din punctul de vedere al momentului creării acestora, există două tipuri de relaţii între tabelele unei
baze de date Access:
- relaţii permanente – sunt cele ce se stabilesc după definirea tabelelor şi sunt cerute de
modelul relaţional. Acestea sunt parte componentă a structurii bazei de date şi se
realizează de obicei prin corespondenţe de tipul cheie primară – cheie externă;
- relaţii temporare – se stabilesc între tabele cu ocazia definirii unor cereri de interogare şi
nu se înregistrează în structura bazei de date.

Relaţiile care se pot stabili între tabele sunt de trei tipuri:


- unu la mai mulţi (one to many);
- unu la unu (one to one);
- mai mulţi la mai mulţi (many to many):

În exemplul prezentat anterior, dacă am încerca să definim o relaţie între furnizori şi magazii
aceasta va fi de tipul many to many. Introducerea tabelei factura a transformat această relaţie în
două relaţii one to many.

Definirea relaţiilor se realizează folosind fereastra Relationships. O relaţie dintre două tabele se
realizează prin operaţia de drag and drop de la cheia primară a tabelei principale la cheia externă a
tabelei secundare. Cu această ocazie Access va deschide fereastra de dialog Edit Relationships în
care se observă legătura stabilită şi unde se mai pot stabili alte câteva opţiuni:
- Enforce Referential Integrity – pentru a face în aşa fel încât, dacă se introduce o
înregistrare nouă în tabela secundară, se verifică dacă valoarea cheii externe se găseşte în
tabela primară, ceea ce înseamnă că este necesară completarea mai întâi a datelor din
tabela principală şi apoi a celor din tabela secundară;
- Cascade Update Related Fields – în situaţia în care Enforce Referential Integrity a fost
activată, în momentul modificării valorii cheii primare în tabela principală se vor
modifica şi valorile corespondente din tabela secundară;

9
RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

- Cascade Delete Related Records – activă doar dacă s-a selectat în prealabil Enforce
Referential Integrity, are ca efect ştergerea tuturor înregistrărilor din tabela secundară ce
au o anumită valoare pentru cheia externă în momentul ştergerii cheii primare din tabela
principală.

După definirea structurii bazei de date, folosind Tools->Analyse->Documenter se poate genera o


imagine imprimabilă a oricărei tabele din componenţa acesteia.

Restricţii privind dimensiunile tabelelor:


- numărul maxim de câmpuri este de 255;
- numărul maxim de indecşi este de 32;
- un index multiplu poate fi definit pe maximum 10 câmpuri;
- o înregistrare nu poate depăşi 4KB, excluzând câmpurile Memo şi obiectele ActiveX;
- dimensiunea maximă a unui câmp Memo este d 2GB.

II.3. Formulare

Formularele (Forms) reprezintă interfaţa principală între utilizator şi o aplicaţie Access. Acestea
sunt obiecte ale bazei de date ce permit introducerea şi afişarea datelor. În cadrul unei aplicaţii
formularele pot îndeplini următoarele funcţii:
• Afişarea şi editarea datelor – este cea mai frecvent întâlnită utilizare a formularelor.
Formularul permite vizualizarea datelor în forma dorită de proiectantul aplicaţiei şi de
asemenea datele pot fi modificate sau şterse;
• Controlul operaţiilor realizate de aplicaţie – împreună cu comenzi macro sau cu
proceduri Vizual Basic formularele pot realiza afişarea automată a anumitor date sau
executarea automată a unui şir de operaţii (cum ar fi deschiderea de subformulare într-un
formular);
• Introducerea de date;
• Afişarea de mesaje – se pot furniza informaţii privind modul în care aplicaţia poate fi
utilizată sau despre operaţiile ce urmează a fi executate;
• Tipărirea informaţiilor – funcţie destul de rar folosită.

Formularele sunt compuse din trei părţi: antetul, zona de detaliu şui subsolul. Zona de detaliu este
cea în care se prezintă datele. Antetul şi subsolul conţin informaţii statice. Spre exemplu, antetul
poate conţine numele formularului şi capul de tabel (denumirea câmpurilor) iar subsolul poate
conţine denumirea programului.

Crearea formularelor se poate face folosind instrumentul wizard pentru creare automată sau
folosind fereastra de proiectare (Design View). În vederea obţinerii în mod eficient a unor formulare
performante este recomandat ca acestea să fie iniţial create folosind instrumentul wizard şi apoi să
se modifice folosind fereastra de proiectare în scopul adăugării de facilităţi suplimentare.

Pentru crearea folosind instrumentul wizard din caseta de dialog New Form se va selecta Form
Wizard iar din lista derulantă prezentă în partea de jos a acestei casete se va selecta tabela cu care va
lucra formularul, după care se dă click pe OK. Fereastra următoare îi aparţine instrumentului wizard
şi permite selectarea câmpurilor asupra cărora va opera formularul în lucru. Prin click pe Next se va
trece la fereastra următoare ce permite selectarea modului de prezentare al datelor (Columnar,
Tabular, Datasheet, Justified) din care cel mai utilizat este cel de tip coloană (Columnar). Fereastra
următoare prezintă o listă de stiluri de afişare disponibile; un stil conţine un anumit tip de fundal,
10
RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

anumite tipuri de caractere, culori, etc. Prin acţionarea butonului Next se trece la stabilirea numelui
formularului şi se poate alege acţiunea ce se va realiza după încheierea cu Finish a wizard-ului:
deschiderea în fereastra de proiectare sau în modul de introducere / editare al datelor.

În fereastra de proiectare a formularelor sunt disponibile următoarele controale:


- Select Objects – este instrumentul activat implicit. Acesta se foloseşte pentru selectarea
obiectelor din ecran în vederea realizării de diverse modificări asupra acestuia;
- Control Wizards – folosit pentru activarea / dezactivarea programelor Control Wizards
ce permit generarea controalelor complexe cum sunt grupurile de opţiuni, casetele de
liste şi casetele combinate;
- Label (etichetă) – casetă ce conţine texte fixe de descriere sau instrucţiuni de utilizare;
- Text Box (casetă de text) – casetă ce permite afişarea şi editarea datelor de tip text;
- Option Group (grup de opţiuni) – casetă dreptunghiulară de dimensiune variabilă în
care se pot plasa: butoane comutatoare, butoane de opţiune sau casete de validare.
Numai un singur obiect din interiorul acestei casete poate fi selectat la un moment dat;
- Toggle Button (buton comutator) – buton ce trece din starea On în starea Off şi invers
atunci când este selectat.
- Option Button (buton de opţiune) – buton rotund care se comportă identic cu un buton
comutator. Butoanele de acest tip sunt folosite cel mai frecvent în grupurile de opţiune
pentru selectarea unei valori dintr-un set de opţiuni;
- Check Box (casetă de validare) – la selectarea căreia aceasta comută din starea On în
starea Off şi invers. Acestea trebuiesc plasate în afara grupurilor de opţiune în situaţia în
care dorim să selectăm mai multe opţiuni simultan;
- Combo Box (casetă combinată) – combinaţie între o casetă de text editabilă în care se
pot introduce valori şi o listă ce permite selectarea de valori dintr-un text;
- List Box (casetă de tip listă) – casetă care conţine o listă derulantă de opţiuni din care
putem selecta o valoare;
- Command Button (buton de comandă) – atunci când se execută click pe acesta se
startează un eveniment care execută o comandă macro sau o procedură VBA;
- Image (imagine) – afişează un element grafic static. Un element de acest tip nu poate fi
editat după ce a fost plasat în formular;
- Unbound Object Frame (obiect neasociat) – inserează un obiect creat cu o aplicaţie
server OLE cum ar fi Microsoft Graph sau Microsoft Draw.
- Bound Object Frame (obiect asociat) – pentru inserarea unui obiect OLE inclus într-un
câmp al unei tabele dacă acesta este de tip grafic. În cazul în care acesta nu este grafic se
va afişa o pictogramă ce reprezintă obiectul.
- Page Break (delimitator de pagină) – determină imprimanta să treacă la o pagină nouă
începând cu poziţia delimitatorului de pagină din formular sau raport. În modul Run
aceste delimitatoare nu sunt afişate pe ecran;
- Tab Control (schimbător de pagină) – acest control se foloseşte în vederea creării unei
serii de pagini ce pot fi schimbate. Fiecare pagină va putea conţine un număr de
controale;
- Subform / Subreport (subformular / subraport) – ataşează unui formular (sau raport) un
subformular (respectiv un subraport).
- Line (linie) – creează o linie dreaptă ce poate fi redimensionată şi căreia i se poate
modifica poziţia;
- Rectangle (dreptunghi) – creează un dreptunghi ce poate fi redimensionat sau
repoziţionat;
11
RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

- More Controls – permite introducerea de controale ActiveX instalate în sistem.

Subformulare

Un subformular este un formular inclus într-un alt formular pentru a permite afişarea datelor din
mai multe tabele sau cereri de interogare, aflate în general în relaţii de tipul unu la unu sau unu la
mai mulţi. Astfel, în formularul principal vor fi afişate datele din partea unu a relaţiei, iar în
subformular, cele din partea mai mulţi. În mod implicit legătura dintre un formular şi un
subformular reflectă legătura dintre tabelele pe care se bazează acestea. Într-un formular care
conţine un subformular se pot specifica criterii de filtrare numai asupra câmpurilor din formularul
principal. Exemplu: folosind relaţia 1-n dintre tabelele Factură şi Conţinut factură se poate crea un
formular unde se vor afişa facturile şi în care se poate include un subformular pentru afişarea
materialelor specificate în acea factură.

Ca formă de prezentare subformularul poate fi: foaie de date ce permite crearea într-un mod foarte
simplu a unui tabel în care se pot face modificări privind dimensiunea şi ordinea coloanelor sau
formular ce oferă posibilităţi multiple de aranjare a datelor, utilizarea culorilor, crearea de antete şi
subsoluri de pagină precum şi includerea de câmpuri OLE.

Pentru crearea unui formular ce include un subformular sunt posibile trei variante: crearea
formularului şi subformularului în acelaşi timp, crearea subformularului şi adăugarea lui la un
formular existent sau crearea separat a celor două formulare şi apoi combinarea lor. Ultima variantă
este cea mai simplă şi necesită parcurgerea următoarelor etape:
- se creează formularul principal şi subformularul ca formulare independente;
- se realizează legătura între formularul principal şi subformular;
- se verifică legătura şi apoi rezultatul.

Pentru a aduce un subformular în formularul principal:


- se deschide formularul principal în mod Design;
- se trece în fereastra Database (se poate folosi tasta F11) şi din categoria Forms se
deplasează pictograma corespunzătoare subformularului în spaţiul formularului
principal, ceea ce va avea ca efect adăugarea unui control de tip subformular;
- dacă este cazul, se deplasează controlul de subformular în locul dorit şi se
redimensionează;
- se dă dublu click pe bordura subformularului pentru a afişa lista de proprietăţi a acestuia;
- se verifică legătura dintre formularul principal şi subformular prin proprietăţile Link
child fields şi Link master fields care sunt automat definite de Access pe baza legăturilor
dintre tabele, dacă acestea nu corespund cerinţelor se pot modifica manual;
- se trece în modul Forms pentru verificarea rezultatului;
- pentru a aduce modificări asupra formularului principal se poate comuta înapoi pe
modul Design.

II.4. Interogarea bazei de date

Interogarea bazei de date se poate face în mai multe moduri:


- prin vizualizarea în totalitate a conţinutului tabelelor folosind foaia de date asociată
(Datasheet View);
- prin vizualizarea parţială sau totală a conţinutului tabelelor cu ajutorul unor formulare
sau situaţii finale;
12
RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

- prin cereri explicite.

Primele două moduri sunt interogări simple, fără restricţii şi se referă la o singură tabelă.
Interogarea prin cereri explicite este complexă şi se realizează în general pe mai multe tabele ale
căror date sunt filtrate folosind diverse criterii. În Access aceasta poate fi de cinci feluri: selecţie
(select), analiză încrucişată (crosstab), acţiune (action), SQL (Structured Query Language) şi
parametrată (parameter). Rezultatul unei asemenea cereri este plasat într-o foaie de răspuns ce se
aseamănă foii de date asociate unei tabele.

Avantajele obţinute prin interogarea bazei de date folosind cereri explicite sunt:
- selecţia câmpurilor din tabele şi a înregistrărilor acestora pe baza unor criterii impuse de
necesităţile informaţionale;
- ordonarea rezultatelor după anumite criterii;
- introducerea unor câmpuri calculate pe baza unor formule care operează cu câmpuri din
tabele;
- combinarea datelor ce provin din mai multe tabele;
- modularitatea cererilor, ceea ce permite ca rezultatul unei cereri să poată fi folosită ca
intrare pentru o nouă cerere;
- crearea unor formulare şi rapoarte care au la bază cereri de interogare create anterior;
- posibilitatea de realizare a unor reprezentări grafice pe baza unor cereri de tip analiză
încrucişată.

Modalităţile posibile de creare a cererilor de interogare sunt:


- proiectarea pas cu pas folosind Design View;
- utilizând instrumentul wizard;
- exprimarea cererii folosind limbajul SQL;
- crearea unui filtru şi salvarea acestuia ca cerere de interogare;

Pentru crearea unei cereri de interogare folosind Design Wizard trebuiesc parcurşi următorii paşi:
1. În fereastra Database se selectează secţiunea Queries şi apoi New;
2. În caseta de dialog New Query se execută click pe Design View şi apoi pe OK;
3. Din caseta Show Table se selectează tabelele şi interogările ce se doreşte a fi incluse în
cererea ce se proiectează. După selectarea opţiunii Close se poate accesa fereastra de
lucru ce este structurată pe două secţiuni:
• secţiunea de afişare a structurii tabelelor / cererilor ce au fost selectate
anterior şi a legăturilor dintre ele (dacă există);
• secţiunea ce conţine grila de proiectare (design grid) în care se va construi
cererea din punct de vedere structural şi funcţional. Această grilă mai poartă numele
şi de grilă QBE (Query By Example).
4. La crearea de interogări ce folosesc mai multe tabele trebuie verificat dacă între ele
există legăturile necesare pentru a răspunde cerinţelor impuse de noua cerere de
interogare. În cazul în care se doreşte realizarea unor legături suplimentare, acestea se
pot stabili interactiv;
5. Câmpurile ce apar în structura unei cereri pot fi preluate sau calculate. Câmpurile
preluate pot fi trecute în grila de proiectare prin drag and drop sau dublu click.
Transferul întregii liste de câmpuri dintr-o tabelă sau cerere sursă în grila de proiectare
se poate face folosind linia ce conţine *;
6. Ordonarea datelor (crescător sau descrescător) se poate face după unul sau mai multe
câmpuri. Pentru aceasta se foloseşte poziţia corespunzătoare din linia Sort unde se poate
13
RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

alege Ascending sau Descending. Ordinea de sortare este ordinea de apariţie în grila de
proiectare a câmpurilor după care se face sortarea, de la stânga la dreapta;
7. În celulele aflate pe linia Criteria din grila de interogare se pot defini criterii de selecţie
care pot fi simple sau compuse. Criteriile simple pot fi:
• apartenenţa la un interval de valori : BETWEEN de_la AND până_la;
• apartenenţa la o listă de valori : IN (val1, val2,…);
• expresii construite folosind operatori de comparaţie: <, >, <=, >=, <>, =;
• expresii construite folosind operatorul de negaţie: NOT valoare;
• expresii ce fac referire la câmpuri ce conţin sau nu valori: NOT NULL, IS
NOT NULL sau NULL, IS NULL;
• conformitatea cu şabloane de tip text. Textul specificat trebuie inclus între
ghilimele în cazul în care conţine spaţii şi poate conţine caractere generice (wildcard)
cum sunt ? şi *.
Criteriile compuse se constituie prin legarea unor criterii simple folosind operatorii
logici ŞI, SAU. Dacă se doreşte selecţia după mai multe criterii simple conectate prin ŞI
acestea se vor specifica pe aceeaşi linie. Dacă se doreşte acelaşi lucru folosind SAU,
atunci criteriile simple se vor specifica pe rânduri diferite.
Există de asemenea posibilitatea preluării de valori pentru definirea criteriilor din
formulare ce au fost deja definite folosind prefixarea câmpului din formular cu numele
formularului şi al obiectului Forms (ex.: Forms![nume_formular]![nume_câmp].
Pentru determinarea numărului de înregistrări dintr-o tabelă se poate folosi count(*).
8. Pentru crearea de câmpuri calculate:
• se selectează coloana şi se introduce comanda View->Totals ce va duce la
apariţia în grila de proiectare a liniei Total;
• se selectează Expression în linia Total;
• în prima linie Field se introduce formula de calcul care are următoarea formă
generală: nume-rezultat: [câmp1]operator[câmp2] …
În coloana Totals sunt prezente de asemenea şi opţiuni corespunzătoare unor calcule
predefinite (SUM, AVG, MIN, MAX, COUNT, STDEV, FIRST, LAST).
9. Se salvează cererea de interogare cu File->Save.

Cereri de interogare tip “analiză încrucişată”

Aceste cereri permit generarea de tabele complexe sub formă matriceală în care numele liniilor şi
coloanelor reprezintă criterii mixte de grupare iar valorile din celulele tabelului se obţin prin
aplicarea unei funcţii predefinite (Sum, Min, Max etc.) asupra unui câmp din tabelă. Crearea unei
cereri de interogare de acest tip se face folosind Query->Crosstab Query şi apoi se specifică
câmpurile ce furnizează liniile, coloanele şi valorile din tabel.

Cereri de interogare de tip “acţiune”

Acestea se folosesc pentru:


- crearea de noi tabele pe baza celor existente;
- ştergerea de înregistrări din una sau mai multe tabele;
- modificarea datelor dintr-un grup de înregistrări;
- adăugarea unui grup de înregistrări la o tabelă existentă.

Etapele de realizare a unei interogări de tip acţiune se face în trei etape:


- crearea unei cereri de interogare de tip selecţie şi verificarea rezultatului acesteia;
14
RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

- transpunerea cererii de interogare de tip selecţie într-o cerere de tip acţiune;


- verificarea rezultatelor în tabele;
- selectarea tipului de interogare folosind una din opţiunile prezente în meniul Query:
Make-Table Query, Update Query, Append Query, Delete Query;

Cereri de interogare parametrate

Sunt utile atunci când criteriile de selecţie trebuiesc modificate frecvent. Avantajul unei cereri
parametrate este acela că permite ca unele criterii din cadrul acesteia să primească valori în
momentul executării acesteia.

Etapele de realizare sunt următoarele:


- se lansează operaţia de realizare a cererii;
- se selectează tabelele în zona de lucru şi se aduc câmpurile dorite în grila de proiectare;
- se introduce numele parametrilor urmaţi de caracterul “:” între paranteze drepte la
intersecţia liniei Criteria cu câmpurile cărora li se vor aplica criterii parametrate;
- se alege Query->Parameters în care se vor introduce numele parametrilor definiţi în
grila de proiectare şi tipurile acestora;
- după închiderea şi salvarea cererii, aceasta poate fi activată folosind View->Datasheet
view. La activare se va solicita utilizatorului valorile parametrilor stabiliţi în cadrul
cererii.

II.5. Rapoarte

Rapoartele (numite şi situaţii finale) constituie finalităţi ale ciclului de creare-actualizare-exploatare


a unei baze de date, conţinutul lor fiind vizualizat pe ecran, ori listat la imprimantă. În Access
crearea de rapoarte se realizează apelând la butonul New prezent în secţiunea Reports a ferestrei
bazei de date ce pune la dispoziţie următoarele posibilităţi:
- crearea rapoartelor asistată de utilitarul wizard urmată de selecţia variantei de lucru
“Report Wizard” ce permite generarea de rapoarte complexe, fără cunoaşterea
amănunţită a facilităţilor Access;
- realizarea rapoartelor de către utilizator folosind opţiunea “Design View”;
- generarea automată, fără intervenţia utilizatorului, a unor rapoarte în care datele sunt
prezentate fie pe o singură coloană (“Autoreport: Columnar”), fie sub formă de table
obişnuit (“Autoreport: Tabular”);
- crearea de rapoarte sub formă de grafic (cu opţiunea “Chart Wizard”);
- realizarea unor rapoarte de dimensiunea unor etichete ce pot fi utilizate pentru
corespondenţă (“Label Wizard”).

Rapoartele pot cuprinde date dintr-una sau mai multe tabele şi/sau interogări sau pot exista rapoarte
care nu au o anumită sursă de date dar care pot îngloba informaţii utile subrapoartelor definite pe
tabele sau interogări între care nu au fost stabilite relaţii. Între rapoarte şi formulare există foarte
multe elemente comune, cum ar fi:
- ambele sunt împărţite în secţiuni în mod asemănător (Report Header / Footer, Page
Header / Footer, Detail);
- controalele ce pot fi utilizate sunt aceleaşi cu menţiunea că unele dintre acestea (cum ar
fi casetele de tip listă sau combinate sau butoanele de comandă) sunt inutile în cazul
rapoartelor;

15
RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

- proprietăţile controalelor sunt similare cu observaţia că în rapoarte nu sunt active


proprietăţile din categoria Event.

Generarea rapoartelor asistată de Wizard

Trebuiesc parcurse următoarele etape:


1. Se selectează Reports, New şi apoi, în fereastra New Report se alege varianta Report
Wizard;
2. Se precizează numele tabelei, sau a interogării, care va fi sursa de date pentru raportul de
realizat;
3. În fereastra următoare se vor selecta câmpurile ce vor alcătui structura raportului
folosind butoanele “>”, ”>>”, ”<” şi “<<” pentru selectare sau deselectare,
individual sau în grup;
4. Se alege modul de prezentare al datelor în raport: în cazul în care câmpurile fac parte din
mai multe tabele legate între ele se poate stabili după care dintre aceste tabele se va face
parcurgerea atunci când se va genera raportul;
5. Se vor preciza criteriile de grupare a datelor. Folosind săgeţile Priority se stabileşte
ordinea operaţiunilor de grupare iar prin utilizarea butonului Grouping Options se poate
opta pentru realizarea grupărilor folosind întreg câmpul selectat pentru grupare sau
numai un anumit număr de caractere de la începutul acestuia;
6. Se aleg câmpurile după care se va face sortarea raportului şi opţiunile de sortare
corespunzătoare. Tot aici se pot specifica opţiuni de realizare de calcule de grup cum ar
fi totalurile parţiale sau generale, medii, etc. folosind butonul Summary Options;
7. Se selectează modul de dispunere şi de aliniere a datelor raportului folosind unul din
cele 6 formate prestabilite din cadrul Layout şi aşezarea în pagină a acestuia din cadrul
Orientation;
8. Se selectează una din combinaţiile prestabilite de fonturi şi de culori;
9. Se specifică numele raportului şi apoi se optează pentru previzualizarea raportului sau
modificarea sa în Design View.
10. Raportul poate fi modificat folosind Design sau poate fi vizualizat în forma tipăribilă
folosind modul Open;
11. Pentru tipărirea raportului se poate folosi File->Print sau butonul corespunzător din
toolbar.

Definirea rapoartelor de către utilizator

Deoarece nu întotdeauna rapoartele generate folosind wizard-ul corespund cerinţelor formulate de


solicitanţi, se recurge la realizarea lor de către utilizator, după cum urmează:
- Se selectează Reports, New, Design View din meniul Database;
- Dacă este necesar se va crea antetul şi sfârşitul raportului selectând File->Report
Header/Footer. În situaţia în care una din aceste secţiuni nu este utilă se va reduce
dimensiunea acesteia la zero;
- Se poate realiza gruparea şi/sau sortarea datelor folosind View->Sorting and Grouping;
- Se aduc în secţiunea Detail câmpurile ce vor alcătui structura raportului şi se definesc
câmpurile calculate scriind în casetele de tip text formula de calcul. Pentru afişarea listei
de câmpuri se poate apela la View->Field List. Este recomandat ca etichetele ataşate în
mod automat câmpurilor să fie şterse şi copiate în secţiunea Page Header. De asemenea
pentru crearea casetelor care să afişeze valori de tipul numărului curent se va ataşa

16
RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

proprietăţii Control Source expresia “=1” şi apoi la Running Sum se va alege domeniul
de numerotare (pe grup sau total);
- Pentru totaluri se proiectează în Group Footer sau Page/Report Footer etichetele şi
casetele text necesare şi apoi se înscriu funcţiile corespunzătoare (sum(), avg(), min(),
max, etc.);

Proprietăţi ale obiectelor de tip raport şi ale secţiunilor lor

Rapoartele conţin patru categorii de proprietăţi:


• Format – ce cuprinde următoarele:
- Caption – pentru stabilirea unui titlu pe bara albastră în modul print preview;
- Page Header şi Page Footer – pentru specificarea paginilor din raport pe care se vor
afişa antetul, respectiv subsolul de pagină;
- Picture – pentru specificarea unui fişier de tip imagine ce va fi afişat pe fundal;
- Picture Pages – se precizează paginile pe care se va afişa fundalul;
• Data
- Record Source – se precizează o tabelă, o interogare sau o frază Select care constituie
sursa de date pentru raportul respectiv;
- Filter – permite stabilirea unei condiţii-filtru pe care trebuie să o îndeplinească datele ce
vor fi afişate în raport;
- Filter On – dacă s-a setat Yes, criteriul specificat în devine activ;
- Order By – se specifică câmpurile de sortare în ordinea gradului de generalitate, cu
virgulă între ele;
- Order By On – permite activarea / dezactivarea proprietăţii Order By.
• Event – proprietăţi de tip eveniment – permite specificarea funcţiilor, procedurilor sau
macro-urilor ce se vor ataşa evenimentelor Open, Close, Activate, Deactivate şi No
Data.
• Other – alte proprietăţi
- Record Locks – permite blocarea informaţiilor folosite în raport în timpul afişării
acestora;
- Date Grouping – pentru utilizarea tipului implicit de dată sau a tipului setat de utilizator;
- Fast Laser Printing – permite realizarea unei tipăriri rapide a raportului.

Secţiunile rapoartelor conţin la rândul lor proprietăţi, dar în număr mai mic. Ele folosesc la
atribuirea unui nume de secţiune (Name), la stabilirea saltului la pagină nouă (Force New Page), la
ascunderea sau afişarea datelor (Visible), etc.

II.6. Comenzi macro

În Microsoft Access comenzile macro reprezintă o modalitate simplă şi eficientă de automatizare a


anumitor operaţii, oferind posibilitatea dezvoltării de aplicaţii de complexitate sporită fără a
fi necesare cunoştinţe de Visual Basic. Practic, o macrocomandă este o acţiune sau o
secvenţă de acţiuni specificate printr-o listă ce realizează acţiuni cum ar fi deschiderea sau
închiderea formularelor, tipărirea rapoartelor, lansarea în execuţie a altor programe, salvarea
înregistrărilor sau execuţia unor secvenţe SQL.

17
RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

Crearea unei comenzi macro

1. Se selectează eticheta Macros a bazei de date şi se dă click pe butonul New.


2. În coloana Action se selectează din listă acţiunea dorită;
3. Se completează în coloana Comment explicaţii cu privire la acţiunile selectate;
4. În grila Action Arguments din parte de jos a ferestrei se completează argumentele
acţiunii selectate. Conţinutul acestei grile se modifică funcţie de acţiunea selectată.

Lansarea în execuţie a unei comenzi macro

Sunt disponibile următoarele variante:


- lansare directă prin dublu click pe pictograma asociată macrocomenzii sau Macro->Run
Macro din meniul Access;
- executarea prin intermediul unui alt macro selectând din lista de acţiuni opţiunea
RunMacro. În acest mod se poate realiza şi executarea repetitivă a macrocomenzilor;
- lansarea dintr-o procedură Visual Basic;
- lansarea în execuţie ca răspuns la un eveniment. Acest mod se obţine prin ataşarea unui
macro unui obiect, ca răspuns la un eveniment survenit în desfăşurarea aplicaţiei;
- adăugarea unui nou buton într-o bară de instrumente prin apelarea meniului Tools->
Customize;
- lansarea în execuţie în momentul deschiderii bazei de date prin crearea unui macro cu
numele autoexec. Acesta va fi declanşat la fiecare deschidere sau compactare a fişierului
dacă nu se ţine tasta Shift apăsată;
- ca răspuns la apăsarea unei combinaţii de taste. Pentru aceasta se va crea un grup macro
(folosind opţiunea View->Macro Names în fereastra de editare a macrourilor). Grupul
macro va conţine în coloana Macro Name combinaţia de taste corespunzătoare fiecărei
acţiuni (pentru redarea tastei Ctrl se foloseşte simbolul ^).

18
RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

III. Interfaţarea SGBD Access cu alte aplicaţii

III.1. Importul şi exportul de date

Importul de date

În momentul când se dezvoltă o aplicaţie datele ce trebuiesc prelucrate este posibil să fie disponibile
în alt format decât formatul MDB al lui Microsoft Access. Pentru utilizarea unor astfel de date sunt
puse la dispoziţie două posibilităţi: crearea unei legături către sursa externă de date şi importul
acestora.

Legătura la o sursă externă reprezintă o interfaţă Access către datele existente într-un fişier al
altei aplicaţii. Se pot efectua modificări, ştergeri şi adăugiri fără a schimba formatul în care sunt
disponibile datele. Un neajuns al acestei metode este imposibilitatea de a aduce modificări în
structura tabelei. Pentru crearea unei legături la o sursă externă se poate selecta New din secţiunea
Tables a ferestrei Database şi apoi se va selecta varianta Link Table.

Importarea datelor implică convertirea acestora din formatul în care sunt stocate în fişierul sursă
şi copierea lor într-o nouă tabelă Access. Modificările care vor fi aduse se vor reflecta doar asupra
datelor copiate nu şi asupra fişierului din care au fost preluate. Pentru a realiza importul se poate
selecta New din secţiunea Tables a ferestrei Database şi apoi se va selecta varianta Import Table.

Microsoft Access poate importa date din formate precum: Dbase, Paradox, FoxPro, Lotus 123,
Excel, fişiere text, Microsoft Exchange sau chiar fişiere HTML. În cazul în care sursa de date este
tot un fişier Access (eventual o versiune mai veche) există posibilitatea de import şi pentru alte
obiecte cum sunt rapoarte, formulare, interogări şi module.

Exportul de date

Exportul presupune realizarea unei copii a datelor din Access în formatul solicitat de programul
destinaţie. Există posibilitatea exportului către alte baze de date Access sau către fişiere Dbase,
Paradox, Microsoft Excel, Microsoft Word, FoxPro, Lotus 123, HTML sau fişiere text. Pe lângă
exportul datelor se pot exporta de asemenea şi alte obiecte pentru a putea fi reutilizate în contextul
unei alte aplicaţii Access. Pentru a realiza exportul către o altă aplicaţie se selectează în fereastra
Database obiectul dorit şi apoi File->Export.

Pentru realizarea comunicării cu Microsoft Word şi Microsoft Excel sunt disponibile prin
intermediul Tools->Office Links opţiunile:
- Merge it With MS Word – pentru folosirea datelor din Access într-o operaţiune de
fuziune a documentelor (Mail Merge) disponibilă în Microsoft Word;
- Publish It with MS Word – creează un fişier în format rich-text pe baza obiectului
selectat în fereastra Database pe care îl transferă apoi utilitarului MS Word;
- Analyze It with MS Excel – creează şi deschide un fişier de tipul MS Excel pe baza
obiectului sursă selectat;

De asemenea sunt disponibile facilităţi avansate privind comunicarea dintre aplicaţii. Acestea pun la
dispoziţia programatorilor facilităţi puternice ce permit aplicaţiilor realizate în Access să realizeze
schimburi de informaţii cu alte programe. În această categorie se încadrează:
- comunicarea prin OLE (Object Linking and Embedding);
19
RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

- schimbul dinamic de date – DDE (Dynamic Data Exchange);


- obiecte ActiveX;
- controale ActiveX personalizate;

III.2. Interfaţare Internet

Sistemul de gestiune a bazelor de date Access oferă următoarele posibilităţi de interfaţare cu reţeaua
Internet:
- pagini Web statice (fişiere de tip .html);
- pagini web dinamice (Active Server Pages);
- obiecte de tip pagină Web (Data Access Pages).

Pentru crearea unei pagini Web statice se parcurg următoarele etape:


- se selectează tabela, cererea de interogare, formularul sau raportul pe care dorim să-l
publicăm pe Internet;
- se activează comanda File->Export care va afişa o fereastră de dialog pentru salvarea
obiectului selectat anterior;
- în fereastra de dialog se specifică calea, numele fişierului şi tipul acestuia (HTML);
- se specifică un template ce permite afişarea paginii Web într-un format mai atractiv;

Crearea unei pagini Web de tip ASP (Active Server Pages)

ASP este o pagină Web ce conţine un program de tip script în limbaj VBScript care se execută pe
serverul de Web. La accesare, scriptul respectiv este executat şi produce un rezultat ce va fi trimis
clientului. Prelucrarea făcută de script constă în deschiderea bazei de date, execuţia unei cereri de
interogare, formatarea rezultatului şi trimiterea acestuia către clientul care l-a solicitat.

Paginile ASP pot fi prelucrate numai pe un server Web Microsoft, adică Internet Information
Server (IIS) sau pentru testare la nivel local Personal Web Server. Acestea sunt stocate în fişiere
.asp şi trebuiesc catalogate într-un folder pe server unde se regăsesc programele executabile.

Multe pagini ASP folosesc obiecte ActiveX (ActiveX Objects) care sunt module software folosite
pentru interfaţarea cu Microsoft Office. ActiveX Data Objects (ADO) este o colecţie de obiecte
ActiveX specializate în prelucrarea bazelor de date, făcând parte din SGBD Access versiunea 2000.
Open Database Connectivity (ODBC) este o interfaţă standard între baze de date diferite.

Înainte de crearea şi testarea unei pagini Web de tip ASP este necesară definirea legăturii bazei de
date cu sistemul prin crearea unui aşa numit Data Source Name (DSN) în configurarea ODBC.
DSN poate fi de trei tipuri: User DSN – disponibil numai dacă utilizatorul este conectat la reţea,
System DSN – vizibil de către toţi utilizatorii şi File DSN – memorat într-un fişier. Cel mai utilizat
este System DSN.

Pentru crearea unei pagini ASP se selectează tabela, cererea de interogare, formularul sau raportul şi
se activează comanda File->Export care va afişa fereastra de dialog pentru exportul obiectului
selectat. Se selectează calea şi numele fişierului ce trebuie exportat şi apoi butonul Save care va
duce la apariţia ferestrei de dialog Microsoft Active Server Pages Output Options în care singurul
element care trebuie specificat obligatoriu este Data Source Name. Tot aici mai pot fi specificate şi
alte elemente cum ar fi HTML Template – model pentru crearea paginii Web, User to Connect As şi
Password for User – pentru specificarea numelui de utilizator şi a parolei de conectare dacă pagina
20
RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

este protejată împotriva accesului neautorizat, Server URL – specifică URL-ul care va găzdui
pagina şi Session Timeout – pentru stabilirea timpului maxim necesar pentru deschiderea bazei de
date (în general acesta este setat în driverul de acces la baza de date).

21
RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

IV. Limbajul SQL

IV.1. Noţiuni generale

Unul dintre cele mai puternice limbaje structurate pentru interogarea bazelor de date relaţionale îl
constituie în prezent SQL (Structured Query Language). Acesta a devenit standard pentru o gamă
din ce în ce mai mare de sisteme de gestiune a bazelor de date. Limbajul SQL este un limbaj
neprocedural (declarativ) deoarece permite descrierea numai a informaţiilor ce se doresc a fi
obţinute în urma interogării, fără a fi nevoie să se stabilească modalităţile de a ajunge la rezultate.

Instrucţiunile SQL, în funcţie de rolul lor, pot fi grupate astfel:


- instrucţiuni de definire a datelor care permit descrierea structurii bazei de date;
- instrucţiuni de manipulare a datelor, în sensul adăugirii, modificării şi ştergerii
înregistrărilor;
- instrucţiuni de selecţie a datelor care permit consultarea bazei de date;
- instrucţiuni de procesare a tranzacţiilor care privesc unităţile logice de prelucrare şi
constituie în fapt operaţii multiple de manipulare a datelor;
- instrucţiuni de control al cursorului;
- instrucţiuni privind controlul accesului la date.

Pentru scrierea corectă a unei instrucţiuni SQL în Access este necesară respectarea strictă a unor
reguli de sintaxă. Iată câteva dintre acestea:
- orice instrucţiune SELECT se va încheia cu “;” ;
- într-o interogare unde se folosesc câmpuri din cele mai multe tabele, pentru a separa
numele tabelului de numele câmpului, se va utiliza “;” ;
- parantezele drepte încadrează numele de câmpuri doar când acestea conţin spaţii sau
simboluri neacceptate de SQL;
- pentru a delimita parametrii dintr-o listă se utilizează virgula;
- valorile de tip şir de caractere se delimitează prin apostrof sau ghilimele;
- inegalităţile se specifică folosind “<>”;
- simbolurile “?” şi “*” sunt folosite pentru a desemna unul sau mai multe caractere de
înlocuire;
- pentru a evidenţia valorile de tip dată / timp se foloseşte delimitatorul “#”.

IV.2. Instrucţiuni de definire a datelor

În limbajul Access SQL sunt accesibile următoarele instrucţiuni de definire a datelor:

CREATE TABLE – Plecând de la structura unei înregistrări şi de la tipurile de date asociate


câmpurilor din cadrul acesteia utilizatorul poate să creeze o tabelă. Tipurile de date disponibile sunt
cele descrise anterior la secţiunea cu privire la crearea structurii bazei de date.

Sintaxă: CREATE TABLE nume_tabelă(câmp1 tip_dată1 [NOT NULL], câmp2 tip_dată2 [NOT
NULL], câmp1 tip_dată1 [NOT NULL], …);

Exemplu: CREATE TABLE vanzari(nr number, cod_m number, data_v date NOT NULL, localit
char);

22
RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

ALTER TABLE – permite adăugarea unui câmp la o tabelă existentă. Nu este însă posibilă
ştergerea unui câmp şi adăugarea de câmpuri la nivelul întregii baze de date.

Sintaxă: ALTER TABLE nume_tabelă() ADD nume_câmp tip_dată;

Exemplu: ALTER TABLE personal_vanzare ADD telefon integer;

DROP TABLE – se foloseşte pentru ştergerea completă a unei tabele dintr-o bază de date (inclusiv
indecşii şi valorile asociate).

Sintaxă: DROP TABLE nume_tabelă;

Exemplu: DROP TABLE vanzari;

IV.3. Interogări

Instrucţiunile de selecţie reprezintă una din cele mai importante categorii de instrucţiuni ale
limbajului SQL. Indiferent dacă acestea sunt simple sau complexe ele încep cu SELECT şi au rolul
de a regăsi şi afişa informaţiile solicitate de utilizator.

Interogări simple

Interogările simple folosesc următoarea sintaxă:


SELECT [domeniu] listă_selecţie
FROM nume_tabelă1, nume_tabelă2, …
[WHERE criteriu_de_selecţie]
[ORDER BY câmpuri_de_ordonare [ASC|DESC]];

unde elementele specificate au următoarea semnificaţie:


• Domeniu – determină stabilirea modalităţii de manipulare a înregistrărilor din baza de
date. Acesta poate lua valorile: ALL pentru includerea tuturor înregistrărilor ce satisfac
condiţiile impuse (ALL se consideră implicit atunci când nu se specifică domeniul),
DISTINCT – permite eliminarea înregistrărilor care conţin duplicate pe câmpurile
selectate (se va a fişa o singură dată o valoare ce apare de mai multe ori) şi
DISTINCTROW pentru eliminarea înregistrărilor duplicate în ansamblul lor, nu numai
pe cele ce conţin câmpuri duplicate;
• Listă_selecţie – cuprinde câmpurile ce vor apărea în tabela cu rezultatele interogării.
Câmpurile adăugate în rândul Field din grila de selecţie a machetei QBE care au marcată
opţiunea Show sunt aceleaşi cu cele menţionate în lista de selecţie.
• FROM – clauză ce specifică numele tabelelor ce vor constitui suportul interogării. În
situaţia în care se include câmpuri din mai multe tabele acestea trebuiesc prefixate cu
numele tabelei din care face parte.
• WHERE – se specifică faptul că vor fi afişate numai înregistrările care îndeplinesc
criteriul descris.
• ORDER BY – se utilizează pentru a ordona rezultatele interogării în mod crescător
(ASC) sau descrescător (DESC). Sortarea se poate realiza după unul sau mai multe
câmpuri specificate sub formă de listă în ordinea importanţei.

23
RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

Exemplu: SELECT denumire, cifra_afaceri, [cifra_afaceri]*1.1 AS ca_progonoza FROM indicatori


WHERE localit=”Brasov” ORDER BY denumire DESC;

În scrierea interogărilor de selecţie simple se pot folosi şi funcţii totalizatoare cum sunt: COUNT –
pentru returnarea numărului de înregistrări ce respectă condiţiile stabilite prin clauza WHERE,
SUM – realizează suma tuturor valorilor dintr-un câmp, AVG – calculează valoarea medie a unui
câmp numeric, MIN şi MAX – calculează valoarea minimă respectiv maximă a unui câmp.

Interogări complexe

SQL Access permite de asemenea, pe lângă definirea de interogări de selecţie simple, crearea de
structuri complexe precum cele ce utilizează funcţii agregate, asocieri (UNION) sau combinări
(JOIN). La acestea se adaugă folosirea instrucţiunilor în cadrul formularelor, a rapoartelor sau a
macro-urilor şi stabilirea parametrilor de interogare.

• Funcţiile de grup (agregat)

Acestea permit construirea unor interogări prin care se pot efectua diverse calcule pentru grupuri de
înregistrări ce conţin aceleaşi valori într-o listă de câmpuri specificată. În acest caz se foloseşte
următoarea sintaxă:

SELECT [domeniu] funcţie_agregată(nume_câmp) AS alias [, listă_selecţie]


FROM nume_tabelă1, nume_tabelă2, …
GROUP BY câmp_de_grupare1, câmp_de_grupare2, …
[HAVING criteriul_de_grupare]
[ORDER BY câmpuri_criteriu [ASC|DESC]];

unde:
• Listă selecţie – se va referi la una sau mai multe funcţii agregate care au ca argument
nume de câmpuri de tip numeric ale bazei de date;
• AS alias – asociază un nume rezultatului utilizării funcţiei agregat;
• GROUP BY – clauză ce precizează câmpurile pe baza cărora se va efectua gruparea
înregistrărilor;
• HAVING – specifică criteriul care va fi aplicat înregistrărilor rezultate în urma
operaţiilor de grupare şi calcul pe grupuri.

Exemplu: SELECT localitate, valoare_nominală, AVG(nr_act) AS medie, SUM([nr_act]) AS total


FROM capitaluri WHERE localitate IN (“Bucuresti”, “Ploiesti”) GROUP BY localitate,
valoare_nominală HAVING SUM([nr_act])>=10000;

Exemplul de mai sus stabileşte numărul mediu, şi totalul acţiunilor emise în localităţile Bucureşti şi
Ploieşti, pe categorii de valori nominale şi numai pentru cazurile în care totalul acţiunilor emise a
depăşit 10000.

• Asocierile (interogările JOIN)

Se folosesc pentru combinarea datelor ce provin din două sau mai multe tabele. Se pot distinge mai
multe tipuri de joncţiuni: CROSS (încrucişată) ce realizează combinarea înregistrărilor de maniera
“fiecare cu fiecare”, ECHIVALENTĂ (echijoncţiune) presupune selectarea numai a înregistrărilor

24
RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

ce satisfac un criteriu de egalitate (se foloseşte clauza WHERE cu o expresie de egalitate) sau
NEECHIVALENTĂ (non echijoncţiune) ce realizează selectarea înregistrărilor ce nu satisfac o
relaţie de egalitate.

Sintaxa generală pentru joncţiunile echivalente şi neechivalente este:

SELECT [domeniu] listă_selecţie


FROM nume_tabelă1, nume_tabelă2,…
[WHERE criteriu_de_asociere]
ORDER BY câmpuri_de_ordonare [ASC|DESC]];

Exemplu: SELECT cl.nume, cont.suma_existentă*(0.51/12) AS dobanada FROM clienti AS cl,


cont_depunere AS cont WHERE cl.cod_client=cont.cod_client ORDER BY
cl.cod_client;

Din alt punct de vedere joncţiunile pot fi: interne (INNER JOIN) sau externe (OUTER JOIN). În
varianta joncţiunilor interne rezultatul obţinut este egal cu produsul numărului de înregistrări din
fiecare tabelă. Joncţiunile externe sunt la rândul lor de două tipuri: de stânga (LEFT OUTER JOIN)
şi de dreapta (RIGHT OUTER JOIN). Sintaxa pentru astfel de joncţiuni este următoarea:

SELECT [domeniu] listă_selecţie


FROM nume_tabelă1
{INNER|LEFT OUTER|RIGHT OUTER} JOIN nume_tabelă2
ON criteriu_de asociere1
[{INNER|LEFT OUTER|RIGHT OUTER} JOIN nume_tabelă3
ON criteriu_de asociere2]…
[WHERE criteriu_de_selecţie]
ORDER BY câmpuri_de_ordonare [ASC|DESC]];

În situaţia asocierii a două tabele pe baza unui câmp comun, funcţie de tipul asocierii în rezultat se
vor obţine: înregistrările pentru care câmpul de asociere are aceleaşi valori în ambele tabele pentru
INNER JOIN, toate poziţiile din prima tabelă dintre care vor fi completate cu date din cea de-a doua
tabelă numai cele pentru care condiţia de asociere este satisfăcută în cazul LEFT OUTER JOIN sau
toate poziţiile din cea de-a doua tabelă dintre care vor fi completate cu date din prima tabelă numai
cele pentru care condiţia de asociere este satisfăcută în cazul RIGHT OUTER JOIN.

• Combinările (interogările UNION)

În SQL Access există posibilitatea de a combina rezultatele mai multor interogări prin combinarea
ieşirilor acestora folosind clauza UNION. Sintaxa generală este:

SELECT listă_câmpuri1 FROM tabela1


UNION SELECT listă_câmpuri2 FROM tabela2
[GROUP BY câmp_de_grupare2]
[HAVING criteriu_de_agregare2]
UNION SELECT listă_câmpuri3 FROM tabela3
[GROUP BY câmp_de_grupare3]
[HAVING criteriu_de_agregare3]

[ORDER BY câmp_criteriu_de_sortare];
25
RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

Restricţiile ce se impun asupra interogărilor de tip UNION sunt:


- numărul de câmpuri din lista asociată fiecărei interogări în parte trebuie să fie acelaşi;
- secvenţa de nume din fiecare listă de câmpuri trebuie să corespundă unor câmpuri
identice;
- se poate folosi clauza ORDER BY o singură dată după ultima instrucţiune UNION
SELECT;
De asemenea în mod implicit vor fi excluse duplicatele. În cazul în care se doreşte luarea în calcul
şi a acestora se va specifica domeniul ALL.

IV.4. Instrucţiuni pentru manipularea datelor

Foarte utile în exploatarea unei baze de date, aceste instrucţiuni se implementează prin interogările
acţiune. Este însă necesară o mare atenţie în utilizarea lor deoarece efectele sunt ireversibile.

Crearea unei tabele în urma unei selecţii

Se realizează folosind clauza INTO şi are sintaxa generală:

SELECT [domeniu] listă_selecţie


INTO tabela_noua
FROM tabelă_sursă
[WHERE criteriu_de_adăugare];

Instrucţiunea INSERT

Este utilizată pentru adăugarea de valori noi într-o tabelă. Aceasta are două forme:

• pentru adăugarea unei singure înregistrări:

INSERT INTO nume_tabelă(câmp1, câmp2 …)


VALUES(valoare1, valoare2, …);

• pentru copierea selectivă de înregistrări dintr-o tabelă sau mai multe şi adăugarea
acestora la o tabelă specificată:

INSERT INTO tabelă_destinaţie(câmp1, câmp2, …)


SELECT [domeniu] câmp1, câmp2, …
FROM tabelă_sursă
WHERE criteriu_de_adăugare;

Instrucţiunea DELETE

Este o interogare acţiune ce realizează o ştergere parţială sau totală a înregistrărilor din tabele.
Aceasta nu poate fi folosită pentru ştergerea completă a tabelei (pentru aceasta există instrucţiunea
DROP TABLE).

Sintaxa:
DELETE FROM nume_tabela
[WHERE criteriu_de_ştergere];

26
RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

Instrucţiunea UPDATE

Are ca scop modificarea valorii câmpurilor din înregistrările existente.

Sintaxa:
UPDATE nume_tabela
SET nume_câmp1=valoare1
[,nume_câmp2=valoare2] …
[WHERE criteriu_de_actualizare];

27
RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

V. Analiză de caz – energiile durabile

Bază de date referitoare la potenţialul de energii regenerabile şi utilizarea acestora

La încărcarea aplicaţiei este deschis automat un formular ce conţine butoane ce permite accesul al
diferite informaţii conţinute:

Sunt disponibile butoane pentru accesul la informaţii cu privire la fiecare sursă de energie în parte
(solară, mini-hidro, biomasă, energie geotermală, energie eoliană), la date cu privire la potenţialii
utilizatori ai acestor resurse, precum şi unele compilaţii cu privire la totalul pe regiuni a resurselor
de energie regenerabilă, precum şi evoluţia în timp a acestora (măsurată şi prognozată).

Iată mai jos câteva exemple de formulare folosite pentru afişarea datelor:

28
RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

29
RCCC-RETEA DE CENTRE CIBERNETICE COMUNITARE

________________________________________________________________________________________________

30

You might also like