Sunteți pe pagina 1din 87

Simona DINU Cătălin - Constantin POMAZAN

BAZE DE DATE
Lucrări practice

Editura
NAUTICA
Simona DINU Cătălin - Constantin POMAZAN

BAZE DE DATE
Lucrări practice

Editura
NAUTICA
Copyright © 2014, Editura NAUTICA
Toate drepturile asupra acestei ediţii sunt rezervate Editurii

Coperta: Cătălin - Constantin POMAZAN

Editura NAUTICA, 2014


Editură recunoscută de CNCSIS
Str. Mircea cel Bătrân nr.104
900663 Constanţa, România
tel.: +40-241-66.47.40
fax: +40-241-61.72.60
e-mail: info@imc.ro
www.edituranautica.org.ro

Descrierea CIP a Bibliotecii Naţionale a României


DINU, SIMONA
Baze de date : lucrări practice / Simona Dinu,
Cătălin-Constantin Pomazan. - Constanţa : Nautica, 2014
Bibliogr.
ISBN 978-606-681-032-6
I. Pomazan, Cătălin-Constantin
004.4(075.8)
CUPRINS

CUVÂNT ÎNAINTE...........................................................................................................................VII

INTRODUCERE..................................................................................................................................1
Tema generală: Întocmirea unui jurnal de călătorie

LABORATOR 1...................................................................................................................................3
Definirea structurii jurnalului de călătorie
Normalizarea structurii bazei de date

LABORATOR 2.................................................................................................................................20
Completarea manuală a înregistrărilor în tabele
Importul de date din surse externe

LABORATOR 3.................................................................................................................................30
Interogări
Completarea manuală a înregistrărilor în tabele (continuare)
Căutarea și filtrarea datelor în tabele

LABORATOR 4.................................................................................................................................41
Formulare pentru introducerea datelor
Completarea datelor folosind formulare

LABORATOR 5................................................................................................................................51
Utilizarea limbajului Visual Basic for Applications pentru comenzi simple
Câmpuri calculate

LABORATOR 6.................................................................................................................................60
Rapoarte pentru prezentarea datelor
Interogări parametrizate

LABORATOR 7.................................................................................................................................71
Utilitare auxiliare pentru proiectarea bazei de date
Afișarea relațiilor între tabele
Afișarea relațiilor de subordonare între entitățile Access
Documentarea structurii bazei de date
Analiza performanțelor bazei de date
Realizarea unui meniu pentru utilizarea bazei de date (Switchboard Manager)
Securizarea bazei de date

BIBLIOGRAFIE.................................................................................................................................80
CUVÂNT ÎNAINTE

Acest îndrumar de laborator se adresează studenților din anul I Navigație ai Facultății de


Navigație și Transport Maritim și Fluvial din cadrul Universității Maritime din Constanța și
reprezintă o introducere în proiectarea și utilizarea bazelor de date relaționale. Materialul
cuprinde șapte lucrări de laborator ce includ o parte teoretică și una aplicativă pentru asimilarea
conceptelor de bază și stilului de lucru specific bazelor de date relaționale.

Autorii
Baze de date: Lucrări practice

INTRODUCERE

Pe parcursul lucrărilor de laborator prezentate în continuare se urmărește realizarea unei baze


de date Access 2007 care rezolvă o problemă de stocare și prelucrare de date ce permite
utilizarea într-o manieră unitară a majorității facilităților puse la dispoziție de acest sistem de
gestiune de baze de date relaționale. Rezolvarea cerințelor temei propuse se face progresiv, în
ordinea logică de abordare a unei astfel de probleme. A fost preferată această modalitate de
lucru pentru a pune la dispoziția studenților un exemplu practic complet de utilizare pentru
Access 2007.

Tema generală: Întocmirea unui jurnal de călătorie

Să se realizeze o bază de date Access denumită Jurnal personal pentru evidența voiajelor și a
impresiilor personale de călătorie. Pentru fiecare voiaj în parte vor fi memorate cel puțin
următoarele informații:
• Nava
• Funcția deținută
• Data începerii voiajului
• Data terminării voiajului
• Descrierea voiajului
• Escalele voiajului
Pentru fiecare navă în parte vor fi memorate cel puțin următoarele informații:
• Denumirea navei
• Data lansării la apă
• Portul de origine
• Tipul navei
Pentru fiecare escală în parte vor fi memorate cel puțin următoarele informații:
• Numele portului
• Țara
• Data sosirii
• Data plecării
• Impresii personale
După definirea structurii bazei de date vor fi realizate suplimentar următoarele sarcini:

1
Baze de date: Lucrări practice

1. Se vor introduce manual, direct în tabelele bazei de date, cel puțin două nave și trei voiaje cu
minim cinci escale fiecare. Fiecare voiaj va conţine deasemenea (în plus faţă de cele cinci escale)
portul de plecare şi portul de sosire.
2. Se va realiza formularul pentru editarea voiajelor şi vor fi adăugate cu ajutorul acestuia încă
două voiaje cu minim cinci escale fiecare (plus porturile de plecare și sosire).
3. Se va crea un raport cu lista porturilor vizitate în cadrul căruia vor fi afișate cel puțin ţara,
portul, numărul de vizite în acel port. Ordonarea se va face alfabetic după ţară şi port.
4. Se va crea un raport pentru prezentarea informațiilor pentru voiajul curent și acesta va putea
fi deschis din formularul de afișare a voiajului.
5. Se va realiza un meniu principal pentru baza de date în care vor fi incluse cel puțin comenzile
pentru deschiderea formularului pentru editarea voiajelor și pentru raportul de la punctul 3.

2
Baze de date: Lucrări practice

LABORATOR 1

Un sistem de gestiune de baze de date relaționale (SGBDR) are ca obiective principale:


• asigurarea independenţei datelor (modificarea structurii de memorare sau a strategiei
de acces la date să nu afecteze aplicaţia)
• asigurarea unei redundanţe minime (informațiile să apară o singură dată în baza de
date)
• sporirea gradului de securitate a datelor (interzicerea accesului neautorizat la date)
• asigurarea integrităţii datelor (protecţia faţă de ştergeri nepermise, prin intermediul
unor proceduri de validare)
• asigurarea partajării (asigurarea accesului mai multor utilizatori la aceleaşi date)
Microsoft Access 2007 este un SGBDR simplu ce îndeplinește toate obiectivele enunțate
anterior. Cu toate acestea, Access este gândit mai ales pentru utilizarea mono utilizator. Deși are
implementate mecanismele pentru operarea multi utilizator, funcționarea în aceste condiții este
greoaie deoarece partajarea accesului la baza de date depinde de sistemul de operare pe care
este instalat.
Access memorează datele în tabele denumite în engleză tables sau relations. De la acest al
doilea nume derivă denumirea de relațional din acronimul SGDBR. Între tabele se pot crea
legături sau relații denumite în engleză relationships. Deși în limba română termenii relation și
relationship sunt traduși similar, semantica lor este diferită și de aceea nu trebuie confundați
unul cu celalalt. În acest material vom folosi denumirea de tabelă pentru a desemna termenul
relation și relație sau legătură pentru a desemna termenul relationship.

Definirea structurii jurnalului de călătorie

Realizarea structurii de date pentru memorarea informațiilor solicitate reprezintă pasul cel mai
important în rezolvarea problemei propuse. De corectitudinea structurării datelor depinde
volumul de muncă pentru îndeplinirea celorlalte cerințe ale problemei precum și eficiența
prelucrării datelor.
În cele ce urmează va fi prezentat întregul demers logic pentru realizarea unei structuri de date
optime pentru problema dată. Este de preferat ca definirea structurii să fie făcută pe hârtie
înainte de introducerea acesteia în calculator. Acest mod de lucru permite modificarea cu mai
multă ușurință a structurilor de date și astfel procesul de proiectare va fi mai rapid.
Transpunerea în format electronic va fi realizată doar după ce structura bazei de date a fost
definită și verificată complet pe hârtie.
Pornind de la enunțul inițial al problemei, structura de date neoptimizată arată ca în fig.1. Se
remarcă faptul că aceasta copiază identic cerințele problemei. Pentru a asigura obiectivele
3
Baze de date: Lucrări practice

principale ale SGBDR, structura de date trebuie să parcurgă un proces de rafinare și optimizare
ce poartă denumirea de normalizare.

Fig. 1: Tabelele inițiale neoptimizate

Normalizarea structurii bazei de date

În contextul proiectării bazelor de date relaționale, normalizarea este procesul de organizare a


datelor pentru a minimiza redundanța și a înlătura inconsistența acestora. Prin normalizare
tabelele cu inconsistențe din baza de date sunt descompuse pentru a obține niște tabele mai
mici (simple) și mai bine structurate astfel încât modificarea unui câmp într-o tabelă să se
propage în toată baza de date prin intermediul relațiilor stabilite între tabele. Pe scurt,
normalizarea este un proces de optimizare a structurii unei baze de date.
Normalizarea structurilor de date sporește integritatea datelor (datele sunt complet definite,
adică reprezintă o corespondență strânsă între informațiile stocate în baza de date și modelul
din lumea reală). Într-un SGBDR integritatea datelor este stabilită printr-o serie de constrângeri.
Există trei tipuri de constrângeri ce se referă la integritatea datelor:
• Integritatea entităților (entity integrity) se referă la conceptul de cheie primară (primary
key). O cheie primară este o combinație de una sau mai multe coloane dintr-o tabelă ce
permite identificarea unică a unei linii (înregistrări) din tabelă. Regula referitoare la
integritatea entităților afirmă că fiecare tabelă trebuie să aibă o cheie primară și că
aceasta trebuie sa fie unică și nenulă.
• Integritatea referințelor (referential integrity) se referă la conceptul de cheie externă
(foreign key). O cheie externă identifică o coloană sau un grup de coloane dintr-o altă
tabelă ce reprezintă cheia primară pentru acea tabelă. Regula referitoare la integritatea
referințelor afirmă că orice cheie externă poate fi într-una dintre următoarele două
stări:
• valoarea cheii externe face referință la o cheie primară dintr-o tabelă a bazei de

4
Baze de date: Lucrări practice

date (acesta este cazul cel mai frecvent)


• valoarea cheii externe este nulă
• Integritatea domeniului (domain integrity) afirmă că orice coloană dintr-o bază de
date relațională trebuie declarată într-un domeniu definit. Un domeniu este un set
de valori de același tip. Cu alte cuvinte, toate valorile stocate în aceeași coloană a
unei tabele trebuie să fie de același tip.
Dacă baza de date implementează aceste constrângeri, responsabilitatea integrității datelor
(consistența modelului) revine bazei de date. Dacă baza de date nu susține aceste constrângeri,
responsabilitatea consistenței datelor revine aplicației ce utilizează datele.
Normalizarea bazei de date presupune organizarea datelor pentru a respecta cele trei
constrângeri referitoare la integritatea datelor. Există o întreagă teorie referitoare la etapele
normalizării unei baze de date. Vom prezenta în continuare o metodă practică de rafinare a
structurii bazei de date, fără a face explicit referire la etapele din teoria normalizării.
Pornind de la structura din fig.1 pentru a aplica constrângerea referitoare la integritatea
entităților va trebui să adaugăm o cheie primară pentru fiecare dintre tabele (fig.2).

Fig. 2: Tabelele structurii cu chei primare adăugate

De aici înainte, pentru fiecare tabelă ce va fi adăugată structurii inițiale vom defini implicit o
cheie primară. Pentru aceasta Access pune la dispoziție un tip de date denumit Autonumber. Un
câmp de acest tip este un câmp numeric needitabil de către utilizator, ce permite incrementarea
automată a valorii sale la adăugarea unei noi înregistrări. O particularitate a acestui tip de câmp
este aceea că dacă sunt șterse înregistrări existente din tabela respectivă și apoi sunt adăugate
înregistrări noi, valorile pentru câmpurile de tip Autonumber vor fi date în continuare, fără a
relua valorile șterse.
În continuare, obținerea structurii normalizate presupune analizarea fiecarei tabele pentru a
elimina eventualele redundanțe în stocarea datelor.
5
Baze de date: Lucrări practice

În tabela Nave pentru fiecare vas nou va fi adăugată o înregistrare cu datele specifice acestuia.
Se observă că există definit un câmp PortOrigine și un câmp TipNava ale căror valori se pot
repeta pentru nave diferite. Pentru a elimina redundanța datelor este necesar ca informațiile să
fie specificate o singură dată, în tabele definite suplimentar. Pentru aceasta vom adăuga două
noi tabele: TipuriNave și Porturi. Definirea tabelei Porturi este benefică și din punctul de vedere
al escalelor. Noua structură va arăta ca în fig.3. Toate câmpurile chei primare au fost notate cu
prefixul ID (scris cu litere mari) pentru a evidenția acest fapt.

Fig. 3: Structura cu tabela Nave normalizată

Se observă că pentru a realiza legăturile între înregistrările din tabele în Nave au fost trecute în
locul câmpurilor text PortOrigine și TipNava niște câmpuri de tip cheie externă prefixate cu id
(scris cu litere mici). Notarea prefixului cu litere mici a fost făcută pentru a diferenția cheile
externe de cheile primare. Denumirea țărilor a fost deasemenea trecută din tabela Escale în
tabela Porturi. În afara specificării cheilor primare și secundare au fost trasate și legăturile între
tabelele analizate.
Între înregistrările din două tabele distincte pot exista mai multe tipuri de legături (fig.4):
• legatura una-la-una (one-to-one) - presupune ca pentru o înregistrare din tabela A să
existe cel mult o înregistrare asociată în tabela B
• legătura una-la-mai multe (one-to-many) - presupune ca pentru o înregistrare din tabela
A pot să existe mai multe înregistrări asociate în tabela B
• legătura mai multe-la-mai multe (many-to-many) - acest tip de relație între tabelele A și
B se face prin adăugarea unei tabele suplimentare C asociată prin relații una-la-mai
multe cu tabelele A și B

6
Baze de date: Lucrări practice

În practică cel mai frecvent sunt utilizate legăturile una-la-mai multe. În fig.3 între tabelele
TipuriNava și Nave există o relație una-la-mai multe. Altfel spus, pentru o înregistrare în
TipuriNava pot exista mai multe înregistrări asociate în tabela Nave, adică pot exista mai multe
nave de același tip. Se observă că relația este făcută între cheia primară din tabela TipuriNava și
cheia externă din tabela Nave.

Fig. 4: Legături între tabele: a: una-la-una, b: una-la-mai multe, c: mai multe-la-mai multe

În aceeași manieră sunt definite și relațiile între tabelele Porturi și Nave, Porturi și Escale, Nave
și Voiaje.
La analiza tabelei Voiaje se constată că pentru normalizarea acesteia este necesară adăugarea
tabelei Functii. Structura de date va deveni cea din fig.5.

Fig. 5: Structura cu tabela Voiaje normalizată

7
Baze de date: Lucrări practice

La analiza tabelei Escale se constată că structura existentă nu permite realizarea corectă a


legăturii cu tabela Voiaje. Pentru a corecta aceasta, din tabela Voiaje este eliminat câmpul
Escale și în tabela Escale este adăugată cheia externă idVoiaj ce va face legătura cu cheia
primară din tabela Voiaje. Structura de date devine astfel cea din fig.6.

Fig. 6: Structura de date normalizată a aplicației

Pentru validarea structurii finale, se mai face o dată analiza acesteia tabelă cu tabelă. Constatăm
astfel că în situația tabelei Porturi informațiile stocate în câmpul Tara se pot repeta pentru mai
multe înregistrări. Aceasta ne conduce la ideea că poate ar fi util să mai creem o tabelă pentru
memorarea țărilor. Deoarece informațiile referitoare la țări nu sunt critice și a faptului că vom
memora doar denumirea scurtă a acestora (formată din maxim trei litere), adăugarea unei
tabele suplimentare nu este necesară.
În analiza structurilor de date pentru o aplicație este necesar ca normalizarea să nu fie utilizată
exagerat deoarece aceasta ar complica baza de date și implicit ar introduce întârzieri în
prelucrarea informațiilor.
Având stabilită structura bazei de date, se poate trece la definirea acesteia în Access. Această
operațiune se poate face în două moduri: definirea tabelelor și apoi a relațiilor între acestea sau
definirea simultană a tabelelor și relațiilor. Prima variantă nu necesită o ordine anume de
adăugare a tabelelor, dar după definirea acestora este necesară revenirea și modificarea
structurii unora dintre tabele. A doua variantă (crearea simultană a tabelelor și relațiilor) este
mai rapidă și de aceea va fi cea preferată, dar aceasta necesită stabilirea unei ordini de adăugare
a tabelelor. Pentru a stabili această ordine se va analiza structura și vor fi create mai întâi
tabelele ce nu au chei externe și implicit nu depind de alte tabele. Acestea sunt tabelele Porturi,

8
Baze de date: Lucrări practice

TipuriNava și Functii. Apoi va fi definită tabela Nave ce conține chei externe ce fac legătura doar
către tabelele create anterior. Similar vor fi adăugate tabelele Voiaje și ulterior Escale. Tabela
Voiaje nu poate fi adăugată înaintea tabelei Nave deoarece în tabela Voiaje există o cheie
externă ce face referire la cheia primară din tabela Nave. Similar, tabela Escale nu poate fi
adăugată înaintea tabelei Voiaje.
La definirea câmpurilor este necesară specificarea tipului și a dimensiunii pentru acestea (acolo
unde este cazul).
La deschiderea Access 2007, pentru a crea baza de date Jurnal de calatorie vom selecta butonul
Blank Database și în partea dreaptă vom specifica numele și directorul în care va fi salvată baza
de date, după care vom activa butonul Create (fig.7).

Fig. 7: Stabilirea numelui bazei de date

Access 2007 automat deschide o tabelă în care utilizatorul poate introduce direct datele pe care
dorește să le stocheze, urmând ca Access să stabilească automat tipul câmpurilor în funcție de
informațiile introduse. Acest mod de lucru nu este recomandat decât pentru utilizatori
neexperimentați și de aceea vom închide această tabelă (fig.8), urmând a adăuga tabelele
structurii în modul Design View.

Fig. 8: Închiderea tabelei Table1

9
Baze de date: Lucrări practice

Așa cum a fost precizat anterior, tabelele vor fi create în ordinea: Porturi, TipuriNava, Functii,
Nave, Voiaje, Escale. Pentru editarea structurii unei tabele se apelează din meniul Create
comanda Table Design.
Pentru tabela Porturi se introduc câmpurile conform structurii din fig.6. După introducerea
denumirii câmpurilor în coloana Field Name, se trece la stabilirea tipului datelor memorate în
aceste câmpuri. Pentru aceasta, IDPort care este cheia primară a tabelei va avea la Data Type
specificat AutoNumber, iar Denumire și Tara vor fi de tip Text. În plus, IDPort va avea specificat
atributul de cheie primară prin selectarea acestui câmp și activarea din meniul Design a
comenzii Primary Key.

Fig. 9: Editarea structurii tabelei Porturi

În situația în care se dorește realizarea unei chei primare formate din mai multe câmpuri, mai
întâi se selectează aceste câmpuri (se ține apăsată tasta Ctrl și se face clic cu mouse-ul pe
câmpurile ce vor compune cheia primară și după ce acestea au fost selectate, se activează
comanda Primary Key din meniul Design.
În dreptul câmpurilor ce formează cheia primară va apare simbolul unei chei (câmpul IDPort în
fig.9).

10
Baze de date: Lucrări practice

Access 2007 permite stocarea în câmpurile unei tabele a următoarelor tipuri de date:
• Text - pentru câmpuri alfanumerice cu dimensiune maximă de 255 caractere ce permit
filtrarea și căutarea
• Memo - pentru câmpuri alfanumerice cu dimensiune maximă de 63999 caractere;
stocarea textului se face în exteriorul tabelei, într-o manieră invizibilă utilizatorului, iar în
tabelă este memorat doar un pointer la adresa unde este memorată informația utilă
• Number - pentru câmpuri numerice
• Date/Time - pentru memorarea datelor și/sau timpului
• Currency - pentru memorarea valorilor monetare (numere cu maxim patru zecimale)
• AutoNumber - pentru memorarea unei valori numerice întregi generate automat și care
nu se repetă în cadrul aceleiași tabele
• Yes/No - pentru memorarea unor valori binare (adevărat / fals, da / nu, pornit / oprit,
etc)
• OLE Object - pentru memorarea unor obiecte binare cum ar fi sunete, imagini,
documente Word sau Excel, etc de maxim 1 GB ce pot fi stocate intern sau extern bazei
de date Access
• Hyperlink - pentru memorarea unor adrese web sau a căii spre un fișier local
• Attachment - permite asocierea unuia sau mai multor fișiere la o înregistrare în mod
asemănător atașamentelor dintr-un email și oferă o mai mare flexibilitate decât
câmpurile de tip OLE Object
În plus, la Data Type mai apare și opțiunea Lookup Wizard... ce permite realizarea facilă a
legăturilor dintre tabele și care va fi detaliată ulterior.
La selectarea diverselor câmpuri, în funcție de tipul datelor memorate în acestea, în partea de
jos a ecranului vor apărea proprietăți specifice pentru personalizarea acestora. Pentru câmpurile
de tip Text cum ar fi Denumire și Tara este necesară specificarea lungimii maxime a a acestora în
proprietatea Field Size: 30 pentru Denumire și 3 pentru Tara. Un alt aspect important pentru
aceste câmpuri este acela că ele trebuie completate pentru fiecare înregistrare în parte. Pentru
a forța utilizatorul să completeze aceste date ne vom folosi de proprietățile Required
(obligativitatea completării câmpului) și Allow Zero Length (permisiunea de a conține text cu
lungime nulă). Atunci când este activată proprietatea Required utilizatorul este obligat să
completeze câmpul text respectiv pentru a putea salva înregistrarea. Setarea pe Yes (da) a
acestei proprietăți nu este suficientă deoarece utilizatorul ar putea introduce un text format
numai din spații. Pentru a forța utilizatorul să introducă și caractere tipăribile se trece
proprietatea Allow Zero Length pe No (nu). Textele ce conțin exclusiv caractere netipăribile (cum
ar fi spațiu) sunt considerate ca având lungime zero.
În concluzie, pentru tabela Porturi vom configura câmpurile conform tabelului 1. După setarea
11
Baze de date: Lucrări practice

proprietăților pentru fiecare câmp în parte, se închide designer-ul pentru a salva structura
tabelei. Pentru că tabela nu are încă un nume definit, va apare o fereastră în care putem
modifica denumirea implicită a tabelei.

Denumire Tip Dimensiune Cheie Obligatoriu Lungime nulă


câmp primară (Required) (Allow Zero Length)
IDPort AutoNumber X
Denumire Text 30 Da Nu
Tara Text 3 Da Nu
Tabel 1: Structura tabelei Porturi

În mod esemănător vor fi adăugate structurile pentru tabelele TipuriNava (tabelul 2) și Functii
(tabelul 3).

Denumire Tip Dimensiune Cheie Obligatoriu Lungime nulă


câmp primară (Required) (Allow Zero Length)
IDTipNava AutoNumber X
Denumire Text 20 Da Nu
Tabel 2: Structura tabelei TipuriNava

Denumire Tip Dimensiune Cheie Obligatoriu Lungime nulă


câmp primară (Required) (Allow Zero Length)
IDFunctie AutoNumber X
Denumire Text 20 Da Nu
Tabel 3: Structura tabelei Functii

În continuare vom trece la adăugarea tabelei Nave ce are structura conform tabelului 4. Tabela
Nave depinde de existența tabelelor TipuriNava și Functii deoarece conține chei externe ce fac
referire la acestea. Adăugarea unei chei externe într-o tabelă se poate face selectând Lookup
Wizard la tipul câmpului așa cum va fi descris mai jos.
Câmpurile de tip Date/Time memorează date calendaristice ce includ și ora, minutul, secunda.
Pentru jurnalul de călătorie este relevantă doar data. De aceea, câmpul DataLansarii va fi
configurat să afișeze doar data prin setarea proprietății Format ca Short Date. Afișarea datei va
fi făcută conform setărilor regionale din sistemul de operare. Mai trebuie menționat faptul că
introducerea și afișarea datelor calendaristice se face conform setărilor regionale dar
12
Baze de date: Lucrări practice

memorarea acestora în cadrul tabelei se fece independent de aceste setări.

Denumire Tip Dimensiune Cheie Obligatoriu Lungime nulă


câmp primară (Required) (Allow Zero Length)
IDNava AutoNumber X
Denumire Text 30 Da Nu
DataLansarii Date/Time Nu
idPortOrigine Lookup - Porturi Nu
idTipNava Lookup - Da
TipuriNava
Tabel 4: Structura tabelei Nave

Pentru tipul câmpului idPortOrigine vom selecta Lookup Wizard și aceasta va deschide fereastra
de asistență pentru configurarea relației cu tabela Porturi (fig.10).

Fig. 10: Prima pagină din Lookup Wizard

Pentru a realiza legătura cu tabela Porturi va rămâne selectată prima opțiune. Apăsând pe
butonul Next se va trece la următoarea pagină a asistentului pentru chei externe (fig. 11). Aici
selectăm tabela cu care se va face relația (tabela Porturi) și apoi apăsăm butonul Next.

13
Baze de date: Lucrări practice

Fig. 11: A doua pagină din Lookup Wizard

A treia pagină a asistentului pentru chei externe permite specificarea câmpurilor din tabela
Porturi ce vor fi utilizate în cadrul câmpului lookup. Selectarea lor se face prin utilizarea
butonului cu simbolul > ce va transfera numele câmpului selectat din lista de câmpuri
disponibile din stânga în lista de câmpuri selectate din dreapta (fig.12). Pentru relația cu tabela
Porturi trebuie selectat câmpul cheie primară IDPort ce va fi utilizat pentru crearea relației
dintre tabele și câmpul Denumire ce va fi afișat în cadrul tabelei Nave în câmpul idPortOrigine.

Fig. 12: A treia pagină din Lookup Wizard

14
Baze de date: Lucrări practice

Relația între tabelele Porturi și Nave se va face între câmpurile IDPort și idPortOrigine. De aceea,
la încheierea asistentului câmpul idPortOrigine din tabela Nave va avea tipul Number pentru a fi
identic cu tipul cheii primare IDPort din tabela Porturi. Cu toate acestea, la editarea datelor în
tabela Nave în câmpul idPortOrigine nu va fi afișată valoarea numerică a cheii primare IDPort
din tabela TipuriNava ci textul memorat în câmpul Denumire din tabela TipuriNava.
Pe pagina a patra a asistentului pentru chei externe se va specifica ordinea de sortare în ordine
crescătoare (alfabetică) a câmpului Denumire (fig.13).
Pe a cincea pagină a asistentului pentru chei externe se poate specifca dacă va fi afișat sau nu și
câmpul cheie externă. Opțiunea implicită este setată pentru a ascunde acest câmp (fig.14). Deși
relația între tabele se face utilizând câmpuri numerice, pentru operatorul uman este dificilă
memorarea valorilor acestora și de aceea se preferă afișarea informațiilor text din câmpul
Denumire al tabelei Porturi.
Ca urmare a finalizării asistentului pentru realizarea relației între tabelele Porturi și Nave, la
editarea datelor în tabela Nave, în locul câmpului numeric idPortOrigine va fi afișat un Combo
Box (o listă derulantă) ce va conține denumirile porturilor din tabela Porturi.

Fig. 13: A patra pagina din Lookup Wizard

Pe pagina finală a asistentului pentru chei externe (fig.15) se poate modifica denumirea
câmpului cheie externă din tapela Nave. Totuși, pentru a putea vedea ușor faptul că acest câmp
este o cheie externă este de preferat ca prefixul id să rămână atașat acestui câmp.

15
Baze de date: Lucrări practice

Fig. 14: A cincea pagină din Lookup Wizard

Pentru finalizarea realizării relației între tabelele Nave și Porturi, tabela Nave trebuie salvată
chiar dacă nu a fost încheiată definirea structurii sale.
În același mod se utilizează tipul Lookup Wizard pentru câmpul idTipNava pentru a crea relația
cu tabela TipuriNava.

Fig. 15: Pagina finală din Lookup Wizard

Se remarcă în tabelul 4 că pentru Nave sunt obligatorii doar câmpurile Denumire și idTipNava.

16
Baze de date: Lucrări practice

Tabela Voiaje va fi următoarea tabelă adăugată în baza de date. Structura sa este specificată în
tabelul 5.

Denumire Tip Dimensiune Cheie Obligatoriu Lungime nulă


câmp primară (Required) (Allow Zero Length)
IDVoiaj AutoNumber X
idNava Lookup - Nave Da
idFunctie Lookup - Functii Da
DataInceperii Date/Time Da
DataTerminarii Date/Time Nu
Descriere Memo Nu
Tabel 5: Structura tabelei Voiaje

Este important de remarcat faptul că este obligatorie completarea informațiilor pentru câmpul
DataInceperii dar nu și pentru DataTerminarii. În primul caz se cunoaște întotdeauna data
începerii voiajului și acest câmp va fi folosit pentru legătura cu tabela Escale. Câmpul
DataTerminarii nu este obligatoriu de completat de la început, deoarece data terminării
voiajului este incertă în momentul adăugării înregistrării. Acest câmp va putea fi completat
numai după cunoașterea datei ajungerii în portul destinație.
Pentru tabela Escale structura este specificată în tabelul 6. Această tabelă este adăugată ultima
deoarece depinde de celelalte tabele (are chei externe ce fac referire la acestea).

Denumire Tip Dimensiune Cheie Obligatoriu Lungime nulă


câmp primară (Required) (Allow Zero Length)
IDEscala AutoNumber X
idVoiaj Lookup - Voiaje Da
idPort Lookup - Porturi Da
DataSosirii Date/Time Nu
DataPlecarii Date/Time Nu
Impresii Memo Nu
Tabel 6: Structura tabelei Escale

În legătură cu adăugarea tabelei Escale trebuie precizat că pentru idVoiaj în asistentul pentru
chei externe se vor selecta câmpurile IDVoiaj și DataInceperii din tabela Voiaje și pe pagina a
patra a asistentului se va selecta pentru sortare câmpul DataInceperii ordonat descrescător. În
17
Baze de date: Lucrări practice

acest fel la selectarea voiajului lista datelor de începere va fi ordonată cu voiajul cel mai recent
la început.
Pentru idPort în asistentul pentru chei externe se vor selecta câmpurile IDPort, Tara și Denumire
din tabela Porturi și pe pagina a patra din asistent se vor selecta pentru sortare câmpurile Tara
și Denumire ordonate crescător.
Se remarcă deasemenea faptul că nu este obligatorie completarea câmpurilor DataSosire și
DataPlacare, deoarece pentru portul de plecare nu vom completa data sosirii, iar pentru portul
destinație nu vom completa data plecării. Pentru toate celelalte escale vor trebui precizate
ambele date.
Pentru a inspecta vizual structura bazei de date vom apela din meniul Database Tools comanda
Relationships (fig.16). Tabelele pot fi rearanjate pentru ca structura să fie mai clară. Se observă
că legăturile între tabele au fost create automat la definirea tabelelor ca urmare a utilizării
câmpurilor de tip Lookup. Pentru finalizarea structurii bazei de date este necesar să fie întărită
integritatea relațiilor între tabele.

Fig. 16: Structura bazei de date

Pentru legătura între tabelele Nave și TipuriNava vom face clic dreapta pe linia ce reprezintă
această legătură și din meniul contextual ce va apare vom selecta Edit Relationship (editare
legătură) și vom bifa Enforce Referential Integrity.

18
Baze de date: Lucrări practice

Fig. 17: Întărirea integrității referințelor

Similar vom proceda pentru toate celelalte legături dintre tabele. Structura finală a bazei de
date va arăta ca în fig.18. Se observă în comparație cu fig.16 că apare reprezentat clar tipul
relațiilor dintre tabele (toate relațiile sunt de tip una-la-mai multe).

Fig. 18: Structura finală a bazei de date

19
Baze de date: Lucrări practice

LABORATOR 2

Folosind structura de date creată anterior se poate trece la încărcarea informațiilor în baza de
date. Această operațiune trebuie realizată în aceeași ordine cu cea de adăugare a tabelelor. Nu
putem introduce o escală dacă nu este definit voiajul și porturile, nu putem adăuga un voiaj
dacă lipsesc nava și funcția, nu putem specifica nava dacă lipsește tipul navei.

Completarea manuală a înregistrărilor în tabele

Din motivul enunțat anterior, vom începe cu completarea tabelei TipuriNava (fig.19).

Fig. 19: Tabela TipuriNava cu date completate

Următoarea va fi tabela Functii (fig.20).

Fig. 20: Tabela Functii cu date completate


20
Baze de date: Lucrări practice

Completarea manuală poate fi utilizată dacă sunt puține înregistrări de stocat sau dacă nu avem
posibilitatea de a importa datele existente deja în format electronic.

Importul de date din surse externe

Pentru completarea tabelei Porturi vom importa o listă de porturi preluată de pe internet.

Fig. 21: Un set de date pentru import (sursa Wikipedia)

În cele ce urmează va fi utilizat Firefox ca browser web. Pe pagina de start a acestuia vom trece
pentru expresia căutată harbour list. Printre primele referințe vom găsi List of world's busiest
ports by cargo tonnage - Wikipedia [Wiki2014](fig.21). Vom selecta această referință și din
tabelele cu porturi clasificate pe ani îl vom alege pe cel din 2005 de exemplu. Preluarea datelor
nu se poate face direct și datele trebuie transformate într-un format ce poate fi importat.
Paginile web conțin și informațiile pentru formatare, iar în cazul nostru în tabel apar și imagini
pe care trebuie să le eliminăm. De aceea vom utiliza un editor de texte (Notepad) pentru
această operațiune. Se selectează toate porturile din tabelul din pagina web, inclusiv denumirile
coloanelor și cu Ctrl-C se copiază în memorie aceste date. Deschidem Notepad și cu Ctrl-V
transferăm datele din memorie în documentul text (fig.22). Se observă că separarea câmpurilor
(coloanelor) este realizată cu tab-uri și nu cu spații prin faptul că informațiile de același fel nu se
află ordonate unele sub celelalte.
Utilizarea MS Word nu este recomandată în acest caz, deoarece acesta va prelua și informațiile
de formatare a textului din pagina web care nu sunt utile pentru import.
Se salvează fișierul text pe disc cu numele porturi.txt și apoi poate fi închis atât Notepad cât și

21
Baze de date: Lucrări practice

Firefox.

Fig. 22: Datele importate în Notepad

În Access, din meniul External Data se activează comanda Text File din secțiunea Import pentru
a deschide asistentul pentru selectarea fișierului ce conține datele ce trebuie importate.
Selectăm fișierul porturi.txt și activăm butonul OK (fig.23) pentru a porni asistentul pentru
importul datelor din fișiere text (fig.24). Pentru datele din fișierul porturi.txt va fi păstrată
opțiunea implicită (Delimited) ce presupune separarea coloanelor (câmpurilor) prin tab-uri și va
fi activat butonul Next.

Fig. 23: Specificarea fișierului pentru import

22
Baze de date: Lucrări practice

Fig. 24: Prima pagină a asistentului pentru importul datelor din fișiere text

A doua pagină a asistentului pentru import (fig.25) ne permite o previzualizare a modului în care
vor fi importate datele și deasemenea oferă posibilitatea alegerii delimitatorilor de câmpuri.

Fig. 25: A doua pagină a asistentului pentru importul datelor din fișiere text
23
Baze de date: Lucrări practice

Deoarece în selecția textului de pe pagina web a fost inclus capul de tabel cu denumirile
coloanelor, trebuie să bifăm opțiunea prin care se specifică faptul că pe prima linie se află capul
de tabel (First Row Contains Field Names).

Fig. 26: A treia pagină a asistentului pentru importul datelor din fișiere text

A treia pagină a asistentului pentru import (fig.26) permite specificarea numelui coloanelor ce
vor fi importate și a tipului datelor memorate în acestea. Vor fi păstrate doar coloanele Port și
Country, ambele de tip text, iar pentru toate celelalte coloane vom bifa opțiunea pentru a fi
ignorate (Do not import field).
Pe pagina a patra pagină a asistentului pentru import (fig.27) Access ne sugerează că tabela nu
are o cheie primară și ca aceasta poate fi generată automat sau că putem alege un câmp care să
reprezinte cheia primară. Deoarece vom importa aceste date într-o tabelă temporară, nu este
necesară specificarea unei chei primare și vom alege opțiunea No primary key.
Pe ultima pagină a asistentului pentru import trebuie specificat numele tabelei în care vom face
importul. Vom trece denumirea TempPorturi și vom activa butonul Finish.
Ca urmare a acestor operațiuni, în baza de date vom avea o tabelă suplimentară cu datele
importate de pe pagina web. Datele din această tabelă trebuie prelucrate suplimentar pentru a
putea fi transferate în tabela Porturi. Pentru a verifica informațiile din TempPorturi vom
deschide pentru vizualizare această tabelă (fig.28).

24
Baze de date: Lucrări practice

Fig. 27: A patra pagină a asistentului pentru importul datelor din fișiere text

Se observă faptul că pentru fiecare port vom avea specificată denumirea în clar a țării și aceasta
va trebui înlocuită cu codul format din trei caractere pentru aceasta în vederea transferului în
tabela Porturi.

Fig. 28: Conținutul tabelei TempPorturi

25
Baze de date: Lucrări practice

Pentru a nu introduce codurile țărilor manual, vom căuta pe internet o listă de coduri pe care o
vom importa deasemenea într-o tabelă temporară. În browserul web vom căuta cu Google
expresia 3 letter country codes și pe lista de rezultate vom regăsi 2-letter, 3-letter, country codes
for all countries in the world [WAtlas2014].
Pentru importul acestor date vom utiliza o altă metodă deoarece utilizarea Notepad ca în
importul listei de porturi nu funcționează corect din cauza modului în care sunt prezentate
datele pe pagina web. În acest caz vom utiliza Microsoft Excel 2007 pentru a crea un fișier din
care să facem importul.
Pe pagina web (fig.29) vom selecta lista completă cu datele ce urmează a fi preluate.
Deschidem Excel 2007 și cu Ctrl-V transferăm datele din memorie în foaia de calcul afișată
(fig.30). Din această listă ne interesează doar coloanele cu coduri din trei litere și denumirea
completă a țării, și de aceea, vom șterge coloanele C și ulterior A din foaia de calcul. Pentru
aceasta cu clic dreapta pe litera coloanei vom afișa meniul contextual din care vom alege
comanda Delete. Se observă deasemenea în foaia de calcul că există și linii fără date. Acestea
pot fi șterse asemănător modului de ștergere al coloanelor, dar această operațiune poate fi
făcută ulterior în Access.

Fig. 29: Un set de date pentru import (sursa WorldAtlas)

Foaia de calcul va fi salvată în format nativ Excel cu numele coduri.xlsx în același director unde a
fost salvată și lista de porturi. După această operațiune poate fi închis browserul web și aplicația
Excel.

26
Baze de date: Lucrări practice

Fig. 30: Codurile pentru țări preluate în Excel

În Access, din meniul External Data se activează comanda Excel din secțiunea Import pentru a
deschide asistentul pentru selectarea fișierului ce conține datele ce trebuie importate.

Fig. 31: Specificarea fișierului pentru import

Selectăm fișierul coduri.xlsx și activăm butonul OK (fig.31) pentru a porni asistentul pentru
27
Baze de date: Lucrări practice

importul datelor din fișiere Excel (fig.32).

Fig. 32: Prima pagină a asistentului pentru importul datelor din fișiere Excel

Pe prima pagină a asistentului pentru import din fișiere Excel va fi lăsată activă opțiunea pentru
vizualizarea foilor de calcul (Show Worksheets) și va fi selectată foaia ce conține setul de date ce
urmează a fi importat (Sheet1) după care activăm butonul Next.

Fig. 33: A doua pagină a asistentului pentru importul datelor din fișiere Excel

28
Baze de date: Lucrări practice

Pe a doua pagină a asistentului (fig.33), deoarece pe prima linie se află denumirile coloanelor cu
date, va fi bifată opțiunea care specifică acest lucru (First Row Contains Column Headings) și
apoi va fi apăsat butonul Next.
Pagina a treia a asistentului (fig.34) permite stabilirea coloanelor ce vor fi importate și a
numelor câmpurilor. Interfața este asemănătoare ca la importul de date din fișiere text. Vor fi
păstrate ambele coloane cu date, prima va căpăta denumirea Cod și a doua denumirea Tara.
Ambele coloane vor fi de tip text și nu vor fi indexate.
Paginile următoare ale asistentului pentru import sunt identice ca în situația importului din
fișiere text și de aceea nu vor mai fi prezentate. Opțiunile ce trebuie specificate sunt identice ca
la importul anterior - nu vom permite asistentului să creeze automat o cheie primară (No
primary key) iar pentru tabelă vom folosi denumirea TempCoduri.

Fig. 34: A treia pagină a asistentului pentru importul datelor din fișiere Excel

29
Baze de date: Lucrări practice

LABORATOR 3

Tabelele TempPorturi și TempCoduri conțin parțial datele ce trebuie importate în tabela Porturi.
Informațiile din aceste tabele trebuie prelucrate pentru a putea fi transferate în tabela Porturi.

Interogări

O interogare (query) reprezintă o solicitare pentru obținerea unor informații sau pentru
prelucrarea datelor dintr-o bază de date.
Interogările pentru obținerea unor informații sau pentru realizarea unor calcule se mai numesc
și interogări pentru selectare (select queries). Acestea nu produc modificări asupra informațiilor
existente în baza de date ci doar oferă o modalitate de prezentare a acestora care să satisfacă
criteriile de selecție impuse. Interogările pentru selectare se utilizează pentru afișarea datelor în
formulare sau ca sursă de date pentru generarea rapoartelor. Din categoria interogărilor pentru
selectare fac parte interogarea de selectare simplă (select query), interogarea de tip tabel
încrucișat (crosstab query) și interogarea de reunire (union query). Interogările crosstab
reprezintă matrici în care titlurile coloanelor provin din valurile unui câmp dintr-o tabelă.
Interogările de reunire permit combinarea datelor din două sau mai multe surse (tabele sau
interogări) cu aceeași structură. Din această categorie cele mai frecvent utilizate sunt
interogările de selectare.
Interogările ce produc adăugarea, modificarea sau ștergerea informațiilor din tabelele bazei de
date se numesc interogări de acțiune (action queries). Din categoria interogărilor de acțiune fac
parte interogarea pentru crearea unei tabele (make table query), interogarea pentru adăugarea
de înregistrări (append query), interogarea pentru modificare (update query) și interogarea
pentru ștergerea de înregistrări (delete query).
În plus față de aceste tipuri de interogări mai avem interogarea pass-trough (pass-trough query)
și interogarea de definire a structurii (data definition query). Interogările pass-trough sunt
utilizate pentru executarea unor comenzi SQL asupra unor tabele din surse externe de date. SQL
este acronimul pentru Structured Query Language ce denumește un limbaj de progranmare
specific pentru prelucrarea datelor într-un sistem de gestiune de baze de date relaționale.
Interogările de definire a structurii (data definition query) permit modificarea structurii bazei de
date Access.
Înainte de transferarea datelor din TempPorturi și TempCoduri în tabela porturi va fi creată o
interogare de selectare pentru a putea verifica corectitudinea informațiilor. Pentru aceasta, din
meniul Create se va activa comanda Query Design din secțiunea Other. În fereastra Show Table
ce apare implicit la începerea procesului de definire a interogării vor fi selectate și adăugate (cu
ajutorul butonului de adăugare - Add) tabelele ce constituie sursa de date pentru interogare
(TempPorturi și TempCoduri) și apoi fereastra va fi închisă cu butonul Close (fig.35).

30
Baze de date: Lucrări practice

Fig. 35: Tabelele TempPorturi și TempCoduri adăugate ca surse de date în interogare

Combinarea celor două tabele se va face trăgând (drag-and-drop) câmpul Country din tabela
TempPorturi peste câmpul Tara din tabela TempCoduri. Legătura dintre cele două tabele va fi
reprezentată printr-o linie între cele două câmpuri asociate.

Fig. 36: Selectarea câmpurilor de afișat pentru interogare


31
Baze de date: Lucrări practice

Specificarea câmpurilor ce vor fi afișate la rularea interogării se face în tabelul din partea de jos
a ecranului (fig.36).
La acționarea butonului View din secțiunea Results a meniului principal pe ecran va fi afișat
rezultatul executării interogării (fig.37). Se observă că numărul de înregistrări afișate (43) diferă
de numărul de înregistrări din tabela Porturi (50). Aceasta înseamnă că în cele două tabele
denumirea țărilor nu se potrivește pentru toate înregistrările.

Fig. 37: Rezultatul inițial al interogării

Revenim în editarea interogării prin acționarea butonului View și cu clic dreapta pe linia ce
reprezintă legătura între tabele afișăm un meniu contextual din care selectăm comanda
referitoare la proprietățile legăturii (Join Properties). Motivul pentru care sunt afișate mai puține
înregistrări este acela că legătura este făcută astfel încât să fie afișate doar înregistrările pentru
care câmpurile asociate din cele două tabele au aceleași valori. Pentru a afișa toate înregistrările
din tabela TempPorturi, indiferent dacă se poate face legătura cu tabela TempCoduri sau nu
selectăm opțiunea corespunzătoare (Include ALL records from 'TempPorturi' and only those
records from 'TempCoduri' where the joined fields are equal) și acționăm butonul OK (fig.38).
La vizualizarea rezultatului rulării interogării se observă ca sunt afișate toate înregistrările (50)
din tabela TempPorturi și codurile de țară pentru înregistrările ce au corespondențe în ambele
tabele (fig.39).
Pentru a determina ce denumiri de țări nu se potrivesc, revenim în editatrea interogării și
adăugăm în rezultatul acesteia și câmpul Country din tabela TempPorturi și apoi executăm din

32
Baze de date: Lucrări practice

nou interogarea.

Fig. 38: Specificarea tipului legăturii între tabele

Fig. 39: Rezultatul interogării de selecție

Pentru a grupa la începutul tabelei cu rezultate înregistrările incomplete, sortăm înregistrările


ascendent după câmpul Cod apelând comanda Sort A to Z din meniul contextual ce apare la clic
dreapta pe denumirea acestui câmp (fig.40).
Deoarece sunt doar patru înregistrări pentru care este necesară corectarea denumirii țării,

33
Baze de date: Lucrări practice

aceasta se va face manual în tabela TempCoduri.

Fig. 40: Rezultatul sortat al interogării

După ce corecțiile au fost făcute asupra datelor, interogarea va afișa corect și complet
denumirile și codurile de țară pentru toate cele 50 de porturi. Acum aceste informații pot fi
transferate în tabela Porturi. Pentru aceasta se revine în editarea interogării și se schimbă tipul
acesteia într-o interogare de adăugare (append query) prin acționarea butonului Append din
secțiunea Query Type a meniului Design. În fereastra ce apare se selectează tabela în care vor fi
adăugate datele (Porturi) și se apasă butonul OK (fig.41). În tabela cu denumirile câmpurilor
incluse în interogare a apărut un rând pentru selectarea denumirii câmpului destinație (Append
To). Pentru fiecare câmp ce urmează a fi transferat (Port și Cod) va fi selectat un câmp destinație
(fig.42).
Dacă în meniul secțiunea Results din meniul Design se acționează butonul View atunci
rezultatele interogării vor fi afișate pe ecran ca și când ar fi vorba de o interogare pentru
selecție. Pentru a face cu adevărat adăugarea în tabela Porturi, trebuie acționat butonul Run.
Toate interogările de acțiune funcționează în acest mod.
La rularea cu Run a interogării va fi afișat un mesaj de confirmare. La acceptarea sa cu Yes,
informațiile vor fi adăugate în tabela Porturi. Este foarte important ca interogarea de adăugare
să fie rulată o singură dată. Executarea sa de mai multe ori conduce la multiplicarea
înregistrărilor în tabela destinație.
Interogarea poate fi închisă fără a fi salvată definiția sa în baza de date deoarece nu va mai fi
necesară reluarea transferului de date. Deasemenea, tabelele TempPorturi și TempCoduri pot fi
șterse din baza de date după ce în prealabil a fost verificată existența datelor transferate în
34
Baze de date: Lucrări practice

tabela Porturi.

Fig. 41: Selectarea tabelei destinație pentru interogarea de adăugare

Fig. 42: Specificarea câmpurilor destinație pentru interogarea de adăugare

35
Baze de date: Lucrări practice

Completarea manuală a înregistrărilor în tabele (continuare)

Având date în tabelele Functii, TipuriNava și Porturi se poate trece la completarea datelor în
tabela Nave (fig.43).

Fig. 43: Tabela Nave cu datele completate

După completarea datelor pentru primul voiaj (fig.44) în tabela Voiaje, se inchide această tabelă
și se deschide tabela Escale pentru adăugarea escalelor voiajului (fig.45).

Fig. 44: Prima înregistrare în tabela Voiaje


36
Baze de date: Lucrări practice

Fig. 45: Completarea datelor portului de plecare în primul voiaj

La completarea escalelor direct în tabela Escale este necesară selectarea voiajului asociat.
Aceasta poate conduce la alegerea eronată a voiajului. Pentru a evita această situație,
completarea escalelor se poate face pornind de la înregistrarea din tabela Voiaje (fig.46). Se
observă că apăsând pe semnul plus (+) ce apare în stânga înregistrării voiajului, este deschisă
automat tabela Escale și sunt afișate escalele asociate doar voiajului selectat. Completarea
datelor în acest mod nu mai necesită selectarea voiajului, asocierea între escală și voiaj făcându-
se automat.

Fig. 46: Completarea escalelor pornind de la voiaj

37
Baze de date: Lucrări practice

În mod similar se completează voiajele și escalele asociate pentru a respecta cerințele enunțului
inițial al temei (trei voiaje cu minim cinci escale fiecare). La completarea datelor calendaristice
pentru sosirea și plecarea din porturi se va respecta ordinea cronologică firească a escalelor.
Deasemenea trebuie menționat că pentru portul de plecare nu va fi completată data sosirii, iar
data plecării va coincide cu data de începere a voiajului. Analog, pentru portul destinație
lipsește data plecării, iar data sosirii este identică cu data terminării voiajului.

Căutarea și filtrarea datelor în tabele

Pe lângă interogări cu ajutorul cărora se pot obține diverse informații pe baza datelor existente,
Access pune la dispoziția utilizatorului și posibilitatea de a căuta, filtra și sorta datele din tabele
și interogări (fig.47). Comenzile sunt disponibile și din meniul contextual ce apare la clic dreapta
cu mouse-ul pe denumirea unui câmp.

Fig. 47: Activarea comenzii de căutare din meniu

De exemplu, dacă deschidem tabela Escale pentru a căuta portul Nagoya și din meniul
contextual pentru câmpul idPort selectăm comanda de căutare (Find), va apare fereastra pentru
specificarea parametrilor de căutare (fig.48).

Fig. 48: Fereastra pentru parametrii de căutare

38
Baze de date: Lucrări practice

Căutarea poate fi făcută în datele din coloana selectată sau în toată tabela, putându-se preciza
dacă textul introdus este căutat ca și conținut integral al unui câmp, doar la începutul câmpului,
sau oriunde în cadrul câmpului. Utilizatorul poate preciza sensul de căutare și dacă se va ține
seama de majuscule sau nu.
Într-o manieră asemănătoare se poate face și căutarea și înlocuirea conținulului câmpurilor.
Înlocuirea se poate face pentru câmpul selectat sau pentru toate câmpurile ce respectă criteriul
de căutare.
Sortarea și filtrarea înregistrărilor se poate face prin secțiunea Sort & Filter a meniului principal
sau cu ajutorul meniului ce apare la apăsarea butonului stâng al mouse-ului pe marcajul din
dreapta denumirii unui câmp (fig.49).

Fig. 49: Deschiderea meniului contextual pentru sortare și filtrare

Primele două comenzi din acest meniu permit sortarea în ordine alfabetică (crescătoare pentru
numere) sau invers alfabetică (descrescătoare pentru numere). Sortarea după valorile unui
câmp nu produce modificarea datelor sau disocierea informațiilor din câmpuri diferite.
Înregistrările din tabelă rămân nemodificate, doar ordinea de afișare se schimbă prin sortare.
În meniul contextual va apare câte o poziție distinctă pentru fiecare valoare distinctă a
câmpurilor din coloana selectată. Utilizatorul poate alege astfel selectiv ce înregistrări să fie
afișate.
În funcție de tipul datelor stocate în coloana selectată, utilizatorul poate accesa și o altă metodă

39
Baze de date: Lucrări practice

de filtrare prin specificarea completă sau parțială a informațiilor căutate (fig.50). Pe această cale
Access oferă o mai mare flexibilitate în filtrarea înregistrărilor.

Fig. 50: Meniul pentru stabilirea criteriului de filtrare pentru un câmp de tip Text

40
Baze de date: Lucrări practice

LABORATOR 4

Formulare pentru introducerea datelor

Utilizarea formularelor (forms) permite manipularea informațiilor dintr-o bază de date într-o
manieră simplificată și controlată. Practic, formularele ne permit să realizăm o interfață pentru
baza de date Access. Operatorul nu are nevoie să cunoască structura bazei de date pentru a
putea să o folosească dacă aceasta dispune de o interfață intuitivă și simplă. Deasemenea
utilizarea formularelor permite ascunderea anumitor informații la editare (de exemplu cheile
primare și externe sunt de regulă neimportante pentru operator, dar sunt esențiale pentru
identificarea unică a înregistrărilor și realizarea legăturilor între tabele). Realizarea unor
formulare bine structurate permite simplificarea și eficientizarea prelucrării datelor stocate.
În situația în care un formular este asociat uneia sau mai multor tabele sau interogări se spune
că acesta este legat (bound). Prin aceasta, formularul permite introducerea, modificarea sau
afișarea informațiilor din tabelele respective. Există în Access și posibilitatea realizării unor
formulare nelegate (unbound).
Pe lângă elementele pentru prezentarea datelor din tabele și interogări, pe formulare se pot
adăuga și alte entități cum ar fi butoane de comandă, etichete, imagini, etc., toate acestea fiind
referite prin termenul generic de controale (controls).
Pentru crearea unui formular există mai multe căi și acestea se regăsesc în meniul Create în
secțiunea Forms. Dintre ele, utilizarea asistentului pentru formulare (Form Wizard din
submeniul More Forms) pentru început este varianta cea mai facilă.

Fig. 51: Apelarea asistentului pentru formulare

În continuare vom trece la realizarea primei părți a celei de-a doua sarcini din cadrul temei
inițiale: crearea machetei necesare introducerii voiajelor. Pentru aceasta se apelează asistentul
pentru formulare (fig. 51).

41
Baze de date: Lucrări practice

Pe prima pagină a asistentului pentru formulare putem selecta câmpurile din tabelele sau
interogările ce vor constitui sursa de date pentru formular. Vom alege mai întâi tabela Voiaje și
va fi afișată lista câmpurilor disponibile (Available Fields) pentru această tabelă. Marcarea
pentru utilizarea în formular se face trecând aceste câmpuri în lista cu câmpuri selectate
(Selected Fields) cu ajutorul butoanelor dintre cele două liste. Tot cu aceste butoane se poate
face și renunțarea la utilizarea unuia sau mai multor câmpuri în formular (fig.52). Vom selecta
din tabela Voiaje toate câmpurile în afară de IDVoiaj.

Fig. 52: Marcarea câmpurilor din tabela Voiaje pentru utilizarea în formular

În același mod se adaugă în lista de câmpuri selectate și câmpurile din tabela Escale mai puțin
IDEscala și idVoiaj (fig.53).

Fig. 53: Marcarea câmpurilor din tabela Escale pentru utilizarea în formular

42
Baze de date: Lucrări practice

Câmpurile Voiaje.IDVoiaj, Escale.IDEscala și Escale.idVoiaj au fost excluse din lista cu câmpuri


pentru formular deoarece conțin informații ce nu trebuie afișate. Primele două sunt chei
primare și cea de-a treia este o cheie externă. În schimb câmpurile Voiaje.idNava,
Voiaje.idFunctie și Escale.idPort deși sunt tot chei externe au fost incluse în selecție. În realitate,
deoarece cheile externe au fost definite cu asistentul pentru legături (Lookup Wizard), Access
va prelua informațiile asociate din tabelele Nave, Functii și Porturi (Nave.Denumire,
Functii.Denumire și Porturi.Denumire) și le va utiliza pentru afișarea pe ecran în locul valorilor
cheilor externe.

Fig. 54: A doua pagină a asistentului pentru formulare

Deoarece între tabelele Voiaje și Escale există o relație de subordonare, Access sugerează pe
pagina a doua a asistentului pentru formulare (fig.54) afișarea escalelor ca un formular
secundar (subform).

Fig. 55: Varianta pentru afișarea escalelor într-un formular separat

43
Baze de date: Lucrări practice

În afară de această opțiune, se poate alege și afișarea datelor escalelor într-un formular separat
fig.55). Această variantă nu este de dorit în cadrul jurnalului pentru că necesită apăsarea
suplimentară pe un buton pentru afișarea escalelor.
Pe pagina a treia a asistentului pentru formulare (fig.56) se poate opta pentru afișarea datelor
formularului secundar în controale distincte (Tabular) sau în format tabelar (Datasheet). Vom
selecta aici prima variantă.

Fig. 56: Pagina a treia a asistentului pentru formulare

Pe pagina a patra a asistentului pentru formulare se poate selecta unul dintre stilurile
predefinite pentru formulare (fig.57), de exemplu Trek.

Fig. 57: Pagina a patra a asistentului pentru formulare


44
Baze de date: Lucrări practice

Fig. 58: Ultima pagină a asistentului pentru formulare

Pe ultima pagină a asistentului pentru formulare (fig.58) se poate stabili numele formularului
principal și al formularelor secundare. Tot aici se poate specifica dacă se continuă cu vizualizarea
formularului sau cu editarea sa la închiderea asistentului. Vom alege prima opțiune pentru a
putea vizualiza prezentarea implicită a datelor (fig.59).

Fig. 59: Formularul Voiaje obținul cu ajutorul asistentului


45
Baze de date: Lucrări practice

Se observă în fig.59 faptul că formularul nu arată foarte bine deoarece controalele amplasate
automat ocupă foarte mult spațiu. Atunci când lucrăm cu formulare putem putem afișa datele
din tabele în modul Form View fără a putea modifica proprietățile controalelor ci numai datele
din tabelele asociate, putem afișa datele și avea un control minimal asupra dimensiunilor,
poziției și aspectului vizual al controalelor în Layout View, sau putem edita toate proprietățile
câmpurilor fără a vizualiza datele, în modul Design View.

Fig. 60: Selecția modului de afișare a unui formular

Pentru schimbarea stilului tuturor controalelor din formular, vom selecta modul Layout View și
apoi vom alege din submeniul AutoFormat stilul Flow. Ca urmare a acestei operațiuni, fonturile
și culorile formularului vor fi modificate. La generarea formularului cu ajutorul asistentului,
Access a grupat controalele ce sunt legate de câmpurile din tabela Voiaje. Dacă vom selecta cu
mouse-ul controlul asociat câmpului idFunctie se observă că va apare marcajul pentru selecția și
mutarea acestui grup (fig.61).

Fig. 61: Marcajul pentru grupul de controale din formular

46
Baze de date: Lucrări practice

Pentru a putea muta controalele individual pe formular este necesar să ștergem această
grupare. Pentru aceasta vom selecta grupul prin clic cu mouse-ul pe marcajul grupului și din
meniul Form Layout Tools submeniul Arrange vom activa comanda Remove din secțiunea
Control Layout (fig.62).

Fig. 62: Selectarea comenzii pentru degruparea controalelor

Aceeași operațiune va fi repetată pentru controalele din formularul secundar pentru a putea
ulterior să le rearanjăm și pe acestea.
Pentru a continua modificările ce vor fi făcute în continuare, vom trece în modul Design View. În
acest mod de lucru la selectarea unui control în jurul acestuia apare un chenar ce are în colțuri
și pe mijlocul laturilor niște elemente de selectare. Cu ajutorul acestora controlul selectat poate
fi redimensionat. Schimbarea poziției pe formular se poate face atunci când cursorul se află pe
contur dar nu în dreptul selectorilor. La deplasarea unui control va fi mutată automat și eticheta
asociată acestuia. Pentru a deplasa doar controlul independent de eticheta sa, se folosește
selectorul din stânga sus care este marcat distinct.
În modul Design View formularul are trei benzi orizontale ce pot conține diverse controale.
Acestea sunt antetul (Form Header), zona pentru detalii (Detail) și subsolul formularului (Form
Footer). De regulă în antet sunt trecute controale cu conținut fix ce nu se modifică la
schimbarea înregistrării curente din sursa de date a formularului, butoane cu diverse comenzi,
etc. În zona pentru detalii sunt plasate de regulă controalele ce sunt legate de câmpuri din baza
de date. Zona de subsol este folosită de obicei pentru diverse controale cu informații calculate
pe baza datelor din zona de detalii, butoane pentru comenzi, etc.
Controalele ce se află amplasate în aceeași bandă pot fi aliniate și redimensionate unele în
raport cu altele. Pentru aceasta se selectează controalele respective și din meniul contextual
(clic dreapta pe unul din controalele selectate) se pot alege comenzi din secțiunea pentru
aliniere (Align) sau dimensionare (Size). Aceste comenzi se regăsesc și în meniul principal în
submeniul Arrange din Form Desgn Tools.
47
Baze de date: Lucrări practice

Toate controalele ce pot apare într-un formular dispun de o multitudine de proprietăți cu


ajutorul cărora se poate stabili comportamentul și aspectul acestora precum și asocierile cu
câmpurile de date. Pentru accesarea proprietăților se utilizează comanda Property Sheet a
secțiunii Tools din submeniul Design din Form Design Tools sau comanda Properties din meniul
contextual. Ca și în cazul formularelor, controalele pot fi asociate sau neasociate cu câmpuri din
tabele sau interogări. În plus, unele controale permit și efectuarea unor calcule simple într-o
manieră asemănătoare aplicației Excel.
Cu aceste informații se poate trece la modificarea formularului pentru a obține în final o
variantă asemănătoare cu cea din fig.63.

Fig. 63: Formularul pentru editarea voiajelor

48
Baze de date: Lucrări practice

Completarea datelor folosind formulare

Cu ajutorul acestui formular se va trece la finalizarea celei de-a doua sarcini din cadrul temei
inițiale: adăugarea cu ajutorul formularului creat a încă două voiaje cu minim cinci escale (plus
porturile de plecare și sosire).
În acest moment, pentru trecerea de la un voiaj la altul se pot folosi elementele de navigare din
subsolul formularului (fig.64).

Fig. 64: Controalele pentru schimbarea înregistrării curente

Cu acestea se poate afișa primul voiaj, precedentul, următorul sau ultimul. În plus se poate
specifica poziționarea pe înregistrarea cu numărul specificat de operator în controlul ce afișează
numărul înregistrării curente și numărul total de înregistrări. Butonul ce se află în dreapta față
de butonul pentru saltul la ultima înregistrare permite adăugarea unui voiaj nou. Adăugarea se
poate face și dacă se încearcă trecerea după ultima înregistrare existentă.
Pentru trecerea de la o escală la alta în cadrul aceluiași voiaj se folosește bara de defilare
verticală ce apare în formularul secundar în care controalele de navigare au fost ascunse.
Ca și la completarea datelor direct în tabele, în acest moment, după înregistrarea portului de
destinație trebuie copiată manual data sosirii în acest port în câmpul cu data terminării
voiajului.
În cadrul formularului se poate stabili ordinea în care se face trecerea dintr-un control în altul în
Form View atunci când utilizatorul apasă tasta Tab. Pentru aceasta fiecare control ce poate fi
selectat pune la dispoziție proprietățile Tab Stop și Tab Index. Tab Stop specifică dacă selecția
poate trece în controlul corespondent la apăsarea tastei Tab, iar Tab Index conține o valoare
numerică întreagă ce specifică ordinea în care se deplasează selecția. Trebuie menționat că
Access nu permite duplicarea lui Tab Index și dacă utilizatorul încearcă acest lucru, toate valorile
egale sau mai mari decât indexul specificat asociate altor controale vor fi incrementate automat.
Adăugarea formularelor pentru editarea tipurilor de nave, a navelor, funcțiilor și porturilor se
face într-o manieră asemănătoare formularului pentru voiaje și pentru că acestea au o
complexitate mai redusă, vor fi realizate individual de către studenți.

49
Baze de date: Lucrări practice

LABORATOR 5

Utilizarea limbajului Visual Basic for Applications pentru comenzi simple

În afară de funcționalitatea obținută prin proiectarea vizuală a formularelor, Access permite


definirea de macrocomenzi și utilizarea unui limbaj de programare specific aplicațiilor din suita
Microsoft Office și anume Visual Basic for Applications.
O macrocomandă reprezintă o secvență de operațiuni simple pe care operatorul le execută
frecvent într-o secvență bine definită. Pentru a automatiza acest proces, secvența de operațiuni
este memorată pentru ca ulterior să poată fi executată rapid.
Visual Basic for Applications (VBA) este un limbaj de programare în care instrucțiunile sunt
scrise într-un format foarte asemănător cu limbajul natural. Asimilarea acestuia este relativ
ușoară dar necesită cunoașterea conceptelor generale legate de limbajele de programare și
algoritmi. În situația sistemului de baze de date relaționale Access, VBA prezintă suplimentar
instrucțiuni specifice lucrului cu aceste structuri.
Secvențele de instrucțiuni scrise în VBA pot fi salvate în cadrul formularelor în care sunt folosite
sau pot fi grupate în entități distincte numite module. Avantajul utilizării modulelor este acela
că procedurile și funcțiile scrise în cadrul unui modul pot fi publice și astfel vizibile din mai multe
obiecte Access. Modulele pot fi considerate ca niște biblioteci de funcții și subrutine și vor apare
ca obiecte distincte în panoul de navigare (Navigation Pane).
Pentru un programator ce intenționează să utilizeze Access la întregul său potențial, asimilarea
VBA este esențială. Lucrarea de față nu își propune prezentarea detaliată a VBA, ci doar
exemplificarea unei secvențe simple de cod.
Pentru a îmbunătăți aspectul și funcționalitatea formularului Voiaje putem înlocui controalele
de selectare a înregistrării curente care apar în partea de jos a formularului cu butoane de
dimensiuni mai mari care sa fie mai ușor accesibile. Pentru aceasta Access ne pune la dispoziție
un asistent pentru butoane de comandă.
Deschidem formularul Voiaje în modul Design View. Din meniul principal la Form Design Tools
submeniul Design, secțiunea Controls selectăm controlul de tip buton și desenăm în zona
antetului formularului dreptunghiul de încadrare pentru butonul pentru poziționarea pe prima
înregistrare.
La finalizarea acestei operațiuni se deschide automat asistentul pentru butoane de control
(Command Button Wizard) ce pune la dispoziția utilizatorului o serie de comenzi uzuale grupate
pe categorii, ce pot fi asociate automat butonului nou creat (fig.65).

50
Baze de date: Lucrări practice

Fig. 65: Prima pagină a asistentului pentru butoane de comandă

Dintre acestea vom selecta din categoria Record Navigation comanda Go To First Record. Pe
pagina a doua a asistentului (fig.66) se poate specifica dacă butonul va afișa un text sau o
imagine ce poate fi aleasă dintr-o listă prestabilită sau încărcată intr-un fișier exterior.

Fig. 66: A doua pagină a asistentului pentru butoane de comandă


Vom alege pentru butonul creat imaginea implicită specificată în pagina asistentului. Pe ultima
pagină a asistentului se poate stabili denumirea controlului de tip buton (fig.67).

51
Baze de date: Lucrări practice

Fig. 67: Pagina finală a asistentului pentru butoane de comandă

În mod asemănător vor fi adăugate butoane de comandă pentru deplasarea la înregistrarea


precedentă, următoare și finală, pentru adăugarea unui voiaj nou și pentru închiderea
formularului (fig.68).

Fig. 68: Amplasarea butoanelor de comandă în formular

După adăugarea butoanelor de navigare în antet, se pot ascunde controalele pentru navigare
din subsolul formularului.
Așa cum s-a precizat anterior, în acest moment utilizatorul trebuie să copieze manual data sosirii
în portul destinație în data terminării voiajului. Această operațiune deși este foarte simplă,
repetată de multe ori poate deveni supărătoare. De aceea o variantă mai facilă ar fi realizarea
unui buton care să facă această operațiune.
În Access exită posibilitatea asocierii unor anumite evenimente ce pot apare la nivelul
controalelor cu secvențe de cod sau macrocomenzi. Pentru a stabili aceste asocieri, în Design
View pentru controlul selectat pe pagina Events a proprietăților acestuia vom găsi o serie de
evenimente predefinite.
În continuare vom adăuga un buton pentru copierea datei de sosire în ultimul port în data
terminării voiajului. Pentru aceasta se crează butonul și se renunță la utilizarea asistentului
52
Baze de date: Lucrări practice

pentru butoane de comandă (fig.69). După amplasarea pe formular, vom modifica dimensiunea
acestuia și textul ce apare pe acest buton și vom deschide foaia sa cu proprietăți.

Fig. 69: Buton de comandă simplu

Acestui buton îi vom asocia o secvență de cod scrisă în VBA pentru îndeplinirea acțiunii
precizate anterior.
Trebuie menționat că în Access ca și în multe alte medii de dezvoltare software aceeași acțiune
se poate realiza în moduri diferite. Materialul de față își propune să prezinte didactic unele
dintre aceste variante. Alegerea uneia sau alteia dintre variantele posibile depinde de
ingeniozitatea și experiența programatorului.

Fig. 70: Inițializarea editării de cod pentru evenimentul On Click

În pagina Other a proprietăților butonului adăugat poate fi schimbat numele acestui control.
Operațiunea nu este obligatorie, dar este de preferat pentru identificarea ulterioară a acestuia.
Pe pagina Events a proprietăților butonului vom activa pentru evenimentul On Click (fig.70)
butonul pentru deschiderea asistentului pentru generarea de cod (fig.71).

53
Baze de date: Lucrări practice

Fig. 71: Asistentul pentru selectarea modalității de scriere a codului

Pentru un buton de comandă evenimentul On Click este cel mai frecvent utilizat. El apare la
acționarea cu mouse-ul a butonului sau la apăsarea tastei Enter atunci când butonul este
selectat.
Vom alege Code Builder pentru a putea scrie instrucțiunile VBA pentru efectuarea operațiunii
dorite. Pe ecran va apare într-o fereastră separată editorul pentru VBA și va fi generat automat
șablonul pentru subrutina Click a controlului cmdFinalizareVoiaj (fig.72).

Fig. 72: Fereastra editorului pentru cod VBA

54
Baze de date: Lucrări practice

În subrutina cmdFinalizareVoiaj_Click vom trece următoarea linie de cod:

Me.DataTerminarii.Value = DMax("DataSosirii", "Escale", _


"idVoiaj=" & CStr(Me.idVoiaj.Value))

Această instrucțiune pune în proprietatea Value a controlului DataTerminarii din formularul


curent (Me) rezultatul întors de funcția DMax. Deoarece instrucțiunea este mai lungă decât
lățimea editorului de cod, pentru a o putea vizualiza fără să fie nevoie să folosim bara de
defilare orizontală, aceasta a fost scrisă pe două linii, continuarea primei linii fiind semnalizată la
sfârșit prin caracterul _.
Funcția DMax poate fi folosită pentru a obține valoarea maximă dintr-un set prestabilit de
înregistrări. În situația noastră ne interesează obținerea valorii maxime pentru câmpul
DataSosirii din tabela Escale pentru subsetul de înregistrări asociate cu voiajul curent.
Parametrii funcției trebuie specificați ca șiruri de caractere (încadrați de ghilimele duble). Primul
parametru al funcției este numele tabelei Escale, al doilea este numele câmpului DataSosirii și
ultimul este o expresie ce filtrează înregistrările pentru a păstra doar subsetul care ne
interesează. În final fereastra editorului de cod va arăta asemănător fig.73.

Fig. 73: Subrutina pentru tratarea evenimentului On Click

Access dispune de o multitudine de funcții asemănătoare cu DMax cu care putem obține


55
Baze de date: Lucrări practice

diverse informații din baza de date. Descrierea acestora nu face obiectul prezentului material.

Câmpuri calculate

O altă îmbunătățire pe care o putem aduce formularului Voiaje este afișarea duratei în zile a
voiajului. Aceasta se poate face utilizând un câmp calculat ce folosește informațiile din
câmpurile DataInceperii și DataTerminarii din tabela Voiaje. Dacă aceste câmpuri sunt asociate
cu controale din formular, ele sunt accesibile direct sau prin intermediul acestor controale.
Pentru a realiza modificarea sugerată vom adăuga în secțiunea Detail a formularului un control
de tip TextBox. Se observă că Access adaugă suplimentar și o etichetă acestui control (fig.74).
Vom modifica textul etichetei și poziția celor două controale. Se remarcă faptul că în controlul
de tip TextBox este menționat faptul că acesta nu este asociat unui câmp de date (unbound).
Pentru a specifica formula de calcul a duratei voiajului, pentru controlul de tip TextBox se
selectează pagina Data a proprietăților acestuia. Formula poate fi scrisă în proprietatea Control
Source care specifică de unde se preiau informațiile afișate în acest control. O variantă mai facilă
la început ar fi să utilizăm asistentul pentru expresii (Expression Builder) ce poate fi activat cu
butonul cu trei puncte asociat proprietății Control Source.

Fig. 74: Adăugarea controlului de tip TextBox și a etichetei asociate

La deschiderea asistentului pentru expresii (fig.75) în zona superioară putem scrie manual
expresia dorită sau o putem compune folosind selectarea termenilor si operatorilor cu ajutorul
butoanelor și listelor din zona inferioară ce afișează elementele ce pot fi utilizate în expresie.
Copierea unui element din listelele inferioare în expresie se poate face cu dublu clic pe acesta.
În această manieră vom compune cu asistentul pentru expresii relația:

= [DataTerminarii] - [DataInceperii]

56
Baze de date: Lucrări practice

și apoi vom închide asistentul cu butonul OK. În proprietatea Control Source va apare expresia
creată.

Fig. 75: Adăugarea unui termen în asistentul pentru expresii

La vizualizarea datelor cu formularul Voiaje, dacă în câmpul cu data terminării nu avem date
completate atunci nici în câmpul cu durata voiajului nu vom avea informații. După adăugarea
portului destinație, la apăsarea pe butonul Finalizare voiaj va fi completat automat câmpul cu
data terminării și se va calcula automat și afișa si numărul de zile cât a durat acesta.

57
Baze de date: Lucrări practice

LABORATOR 6

Rapoarte pentru prezentarea datelor

În afara formularelor și interogărilor, pentru prezentarea datelor dintr-o bază de date Access se
pot utiliza și rapoartele. Acestea permit prezentarea datelor într-un format potrivit pentru
tipărirea pe hârtie.
Al treilea subpunct al temei inițiale solicită crearea unui raport cu lista porturilor vizitate în
cadrul căruia vor fi afișate cel puțin ţara, portul, numărul de vizite în acel port. Ordonarea
trebuie făcută alfabetic după codul țării şi denumirea portului.
Afișarea informațiilor existente deja într-o tabelă sub formă de raport se poate face foarte
simplu. În situația cerinței din temă este necesar să numărăm de câte ori a fost vizitat fiecare
port. Pentru aceasta o soluție ar fi să pregătim datele ce urmează a fi afișate cu ajutorul unei
interogări în care să facem și numărarea escalelor și apoi, pe baza acesteia să generăm raportul
solicitat.

Fig. 76: Activarea comenzii pentru gruparea înregistrărilor

58
Baze de date: Lucrări practice

Vom începe editarea unei noi interogări cu comanda Query Design din secțiunea Other a
meniului Create. Vom selecta tabelele Escale și Porturi ca sursă de date. Vor fi selectate ca și
câmpuri pentru interogare Porturi.Tara, Porturi.Denumire și Escale.IDEscala și vom activa
comanda Totals din secțiunea Show/Hide a meniului Design pentru a putea face gruparea
înregistrărilor în vederea numărării (fig.76).
Câmpul Escale.IDEscala a fost adăugat pentru a putea face numărarea escalelor în porturi. Vom
modifica proprietățile câmpurilor destinație pentru a reprezenta mai bine rezultatul interogării.
Pentru aceasta vom sorta primele două câmpuri în ordine alfabetică, vom schimba denumirea
coloanei Porturi.Denumire în Port, iar pentru Escale.IDEscala vom folosi denumirea NrEscale. În
plus, pentru câmpul Escale.IDEscala vom modifica proprietatea Total din Group By în Count
pentru a număra escalele (fig.77).

Fig. 77: Forma finală a interogării pentru raportul cu numărul de escale

Cu alte cuvinte, interogarea va întoarce informația solicitată grupată după codul țării și
denumirea portului și ordonată alfabetic după codul țării și denumirea portului. Prioritatea
sortării se face după ordinea în care apar câmpurile în interogare.
După verificarea corectitudinii interogării prin afișarea rezultatelor în modul Query View, se
poate închide și salva interogarea cu numele NumarEscalePorturi.
Interogarea va apare ca obiect distinct în panoul de navigare (Navigation Pane) și va putea fi
utilizată ca sursă de date pentru generarea raportului solicitat.
Pentru realizarea rapoartelor există mai multe modalități de generare. Vom prefera pentru
început utilizarea asistentului pentru rapoarte (Report Wizard) ce se regăsește în secțiunea
Reports a meniului Create.
Prima pagină a asistentului pentru rapoarte permite selectarea câmpurilor ce vor fi afișate în
cadrul raportului. Asemănător cu selecția în asistentul pentru formulare vom alege toate
câmpurile interogării NrEscalePorturi (fig.78).

59
Baze de date: Lucrări practice

Fig. 78: Prima pagină a asistentului pentru rapoarte

Pe a doua pagină a asistentului pentru rapoarte se poate face gruparea câmpurilor pe anumite
criterii (fig.79). Pentru raportul curent această operațiune nu este necesară.

Fig. 79: A doua pagină a asistentului pentru rapoarte

Pagina a treia a asistentului pentru rapoarte permite sortarea datelor pe diverse criterii (fig.80).
60
Baze de date: Lucrări practice

Deoarece interogarea NrEscalePorturi este deja sortată, această operațiune nu este necesară.

Fig. 80: A treia pagină a asistentului pentru rapoarte

Pagina a patra a asistentului pentru rapoarte permite aranjarea câmpurilor în pagină în mai
multe moduri (fig.81). Modul implicit (Tabular) este varianta cea mai potrivită pentru acest
raport. Deasemenea pe această pagină a asistentului poate fi stabilită și orientarea paginilor
raportului.

Fig. 81: A patra pagină a asistentului pentru rapoarte


61
Baze de date: Lucrări practice

Pe pagina a cincea a asistentului pentru rapoarte se poate selecta un stil pentru raport (fig.82).
Vom selecta de exemplu Flow.

Fig. 82: A cincea pagină a asistentului pentru rapoarte

Ultima pagină a asistentului pentru rapoarte permite schimbarea denumirii pentru raport și
afișarea datelor sau editarea elementelor acestuia (fig.83).

Fig. 83: Ultima pagină a asistentului pentru rapoarte

62
Baze de date: Lucrări practice

Asemănător unui formular, un raport poate fi privit din mai multe perspective. Formatul Report
View afișează datele într-o manieră continuă fără a ține seama de paginare. Formatul Print
Preview este asemănător, doar că este afișată informația ținând seama de setările de pagină. Ca
și la formulare, formatul Layout View permite afișarea datelor și modificarea stilului de afișare.
În Design View programatorul are posibilitatea să controleze toate aspectele legate de
controalele utilizate în raport.
Editarea formatului unui raport se face asemănător cu editarea formatului unui formular. Totuși,
un raport prezintă implicit mai multe zone orizontale decât un formular.
În antetul raportului (Report Header) vor fi trecute informațiile ce trebuie să apară o singură
dată la începutul raportului. De obicei aici apare titlul raportului.
În antetul paginii (Page Header) vor fi trecute informațiile ce trebuie să apară la începutul
fiecărei pagini. De regulă antetul paginii conține capul de tabel dacă informațiile sunt prezentate
tabelar.
În zona de detalii (Detail) apar de obicei câmpurile cu datele utile ale raportului.
În zona pentru subsolul paginii (Page Footer) vor fi trecute informații cum ar fi pagina și data
generării raportului.
Centralizările finale și alte informații asemănătoare ce trebuie să apară o singură dată la sfârșitul
raportului vor fi trecute în subsolul raportului (Report Footer).
În situația în care raportul conține grupări pe diverse criterii, acesta poate să mai prezinte câte
un antet și un subsol pentru fiecare nivel de grupare în parte.
Modificarea controalelor ce apar în cadrul raportului se face asemănător modului de lucru
pentru formulare.

Fig. 84: Definirea unui control totalizator


63
Baze de date: Lucrări practice

Dacă dorim să totalizăm numărul de vizite în porturi vom trece în modul Design View. Vom
selecta controlul NrEscale și din meniul Report Design Tools submeniul Design secțiunea
Grouping & Totals vom alege din lista Totals comanda Sum. Ca urmare, zona cu subsolul
raportului va fi extinsă și va fi adăugat un control în care ca sursă de date este trecută formula
de însumare. Vom adăuga o etichetă alături de acest câmp în care vom trece textul Numar total
de escale (fig.85).

Fig. 85: Câmpul pentru totalizarea escalelor și eticheta asociată acestuia

După ce a fost salvat și închis, raportul NumarEscalePorturi poate fi afișat cu dublu clic din
panoul de navigare (Navigation Pane).

Interogări parametrizate

Pentru rezolvarea cerinței a patra a temei inițiale (realizarea unui raport pentru prezentarea
informațiilor pentru voiajul curent ce va putea fi deschis din formularul de afișare a voiajului)
este necesar să definim o interogare care să filterze informațiile pentru generarea raportului. În
plus, trebuie să transmitem cumva acestei interogări identificatorul voiajului (cheia principală
Voiaje.IDVoiaj).
În acest scop, vom crea o interogare de selecție simplă ce folosește ca sursă de date tabelele
Voiaje și Escale din care vom selecta câmpurile necesare pentru raport. Dacă vom rula această
interogare, ea va afișa escalele aparținând tuturor voiajelor.
Pentru a parametriza această interogare există mai multe variante. Una dintre ele este crearea
unei variabile parametru cu ajutorul căreia să filtrăm înregistrările interogării. Pentru aceasta,
vom selecta comanda Parameters din meniul Query Tools submeniul Design secțiunea
Show/Hide (fig.86). Această comandă este disponibilă și în meniul contextual ce apare la clic
dreapta în zona cu tabelele într-o locație unde nu există elemente.
În fereastra care apare vom completa numele și tipul variabilei parametru (fig.84). Tipul
parametrului trebuie să fie identic du tipul câmpului după care facem filtrarea. În situația
noastră este vorba de cheia primară a tabelei Voiaje care este de tip Long Integer.

64
Baze de date: Lucrări practice

Fig. 86: Activarea comenzii pentru editarea parametrilor interogării

Câmpurile de tip AutoNumber sunt implicit create ca Long Integer. Acest lucru putem să îl
verificăm uitându-ne cu Design View în structura tabelei Voiaje la proprietatea Field Size a
câmpului IDVoiaj.

Fig. 87: Definirea parametrului pentru interogare

65
Baze de date: Lucrări practice

Vom închide în final fereastra cu OK.


În continuare, pentru a face filtrarea vom trece numele parametrului CareVoiaj încadrat de
paranteze drepte la proprietatea câmpului IDVoiaj. Pentru că nu dorim afișarea acestui câmp,
putem să îl ascundem debifând proprietatea Show a câmpului (fig.88).

Fig. 88: Filtrarea interogării

Închidem și salvăm interogarea cu numele VoiajCurent. Acum aceasta poate fi utilizată ca sursă
de date pentru crearea raportului solicitat. Dacă am uitat să facem sortarea crescătoare în
funcție de câmpul DataSosirii în cadrul interogării, aceasta poate fi corectată folosind criteriile
de sortare în asistentul pentru generarea raportului. Vom salva raportul cu numele VoiajCurent.
Vom deschide raportul în Layout View și vom selecta grupul de controale ce afișează datele
raportului cu clic pe simbolul din stânga sus al grupului (fig.89). Apoi, vom acționa comanda
Remove din meniul Report Layout Tools, submeniul Arrange, secțiunea Control Layout pentru a
degrupa controalele în vederea repoziționării.

Fig. 89: Selectarea grupului de controale în Layout View

Trecem în modul Design View și observăm că toate informațiile referitoare la voiaj au fost
plasate într-o zonă denumită DataInceperii Header. Pentru că știm că raportul va afișa datele
unui singur voiaj, putem muta și aranja aceste câmpuri în antetul raportului (Report Header). În
maniera în care am facut aceasta în formularul Voiaje, putem afișa durata voiajului în raport.
Calculul numărului de zile ar fi putut fi făcut și în interogarea VoiajCurent. În final raportul va
arăta asemănător cu fig.90.

66
Baze de date: Lucrări practice

Fig. 90: Forma finală a raportului cu voiajul curent

Parametrul CareVoiaj a fost definit temporar pentru a putea realiza raportul. Pentru asocierea
raportului VoiajCurent cu un buton de comandă din formularul Voiaje există mai multe variante.
Una dintre ele presupune înlocuirea parametrului din criteriul de filtrare al interogării
VoiajCurent cu denumirea câmpului din formular ce memorează IDVoiaj. Pentru aceasta, vom
deschide interogarea VoiajCurent în modul Design View și în criteriul de filtrare vom înlocui
[CareVoiaj] cu [Forms]![Voiaje].[IDVoiaj] (fig.91) și apoi vom șterge parametrul CareVoiaj din
lista de parametri ai interogării.

Fig. 91: Modificarea interogării VoiajCurent

67
Baze de date: Lucrări practice

În continuare se adaugă în formularul Voiaje un buton și cu ajutorul asistentului pentru butoane


de comandă se alege din categoria Report Operations acțiunea Open Report și apoi apoi se
selectează din lista de rapoarte disponibile raportul VoiajCurent.
Pentru afișarea corectă a raportului VoiajCurent este necesar ca formularul Voiaje să fie deschis
în modul Form View. Deasemenea, dacă ulterior modificăm denumirea formularului Voiaje sau a
controlului asociat cu IDVoiaj trebuie să facem modificarea corespunzătoare și în interogarea
VoiajCurent.

68
Baze de date: Lucrări practice

LABORATOR 7

Utilitare auxiliare pentru proiectarea bazei de date

Access pune la dispoziția programatorului o multitudine de asistenți și module utilitare pentru


realizarea cât mai rapidă a structurii bazei de date și a interfeței pentru aceasta (meniuri,
formulare, rapoarte, etc.) sau pentru sarcinile administrative ulterioare. Accesarea unora dintre
aceste unelte se poate face din meniul Database Tools.

Afișarea relațiilor între tabele

Utilitarul pentru afișarea și editarea legăturilor dintre tabele a fost utilizat în Laboratorul 1
pentru realizarea structurii bazei de date Access și prezentarea sa nu va fi reluată în cele ce
urmează. El se regăsește în secțiunea Show/Hide a meniului Database Tools și poate fi accesat
cu comanda Relationships.
Folosirea utilitarului nu este obligatorie, structura putând fi editată și altfel, dar interfața sa
vizuală accelerează editarea legăturilor între tabele.

Afișarea relațiilor de subordonare între entitățile Access

Un alt utilitar foarte eficient mai ales pentru modificările ulterioare ale structurii bazei de date
ce poate fi folosit în tandem cu utilitarul pentru legături între tabele poate fi accesat cu
comanda Object Dependencies din secțiunea Show/Hide a meniului Database Tools (fig.92).
Acesta permite afișarea relațiilor de dependență între obiectele (entitățile) pe care le regăsim în
panoul de navigare (Navigation Pane). Pentru funcționarea corectă este necesar să selectăm un
obiect din panoul de navigare și să apăsăm comanda de reîmprospătare (Refresh). În funcție de
opțiunea făcută pot fi afișate obiectele ce depind de obiectul selectat sau obiectele de care
depinde obiectul selectat. Obiectele sunt prezentate grupat pe tipuri, într-o structură
arborescentă ce se poate extine pe mai multe nivele.
În stânga relativ la comanda de reîmprospătare se află denumirea obiectului selectat. Dacă se
face clic pe această denumire, obiectul respectiv este deschis în Design View pentru editare.
În mod asemănător, la clic pe denumirea numelui obiectelor din structura arborescentă acestea
sunt deschise în mod Design View.
Utilitarul este foarte eficient mai ales atunci când baza de date are numeroase obiecte
interconectate unele cu altele.

69
Baze de date: Lucrări practice

Fig. 92: Utilitarul pentru afișarea dependențelor între obiecte

Documentarea structurii bazei de date

Asistentul pentru documentarea bazei de date permite obținerea unui raport detaliat referitor
la obiectele și structura bazei de date (fig.93).

Fig. 93: Asistentul pentru documentarea bazei de date

70
Baze de date: Lucrări practice

La deschiderea acestuia cu comanda Database Documenter din meniul Database Tools


secțiunea Analyze operatorul poate specifica ce obiecte trebuie incluse în raport precum și
gradul de detalii al raportului.

Analiza performanțelor bazei de date

Access pune la dispoziția programatorului un asistent care verifică performanțele bazei de date
și sugerează modificări pentru optimizarea acesteia (fig.94). Acesta poate fi deschis cu comanda
Analyze Performance din meniul Database Tools, secțiunea Analyze. Interfața acestui asistent
permite selectarea obiectelor ce vor fi analizate.

Fig. 94: Asistentul pentru verificarea performanțelor bazei de date

Înainte de orice modificări facute cu acest asistent se recomandă realizarea unei copii de
siguranță a bazei de date.
Un al doilea asistent de data aceasta care analizează datele din tabele poate fi accesat cu
comanda Analyze Table din meniul Database Tools, secțiunea Analyze (fig.95).

Fig. 95: Asistentul pentru analiza datelor din tabele

71
Baze de date: Lucrări practice

Funcționarea sa nu face obiectul acestui material.


Se recomandă realizarea unei copii de siguranță a bazei de date înainte de utilizarea acestui
asistent.

Realizarea unui meniu pentru utilizarea bazei de date (Switchboard Manager)

Access pune la dispoziția programatorului o modalitate relativ simplă de a realiza un meniu


pentru baza de date prin intermediul asistentului Switchboard Manager. Acesta poate fi pornit
cu comanda Switchboard Manager din meniul Database Tools din secțiunea Database Tools.
Acest asistent va fi folosit în continuare pentru realizarea meniului solicitat la subpunctul cinci al
temei inițiale.
La prima rulare a asistentului acesta cere confirmarea pentru realizarea unei tabele în care va
memora structura și comenzile meniului și a unui formular pentru afișarea acestuia (fig.96).

Fig. 96: Mesajul pentru confirmarea creerii obiectelor pentru meniul principal

După confirmare, va apare fereastra asistentului (fig.97) și lista de pagini cu meniuri existente.

Fig. 97: Asistentul pentru crearea meniului bazei de date

72
Baze de date: Lucrări practice

Inițial este definită o singură pagină meniu (Main Switchboard) care este marcată ca pagină de
pornire (Default).
Vom adăuga în acest meniu comenzile pentru deschiderea formularului pentru editarea
voiajelor și pentru afișarea raportului cu situația centralizată a escalelor. Pentru aceasta vom
acționa butonul Edit și se va deschide pagina de editare a comenzilor meniului (fig.98). Vom
schimba denumirea din Main Switchboard în Jurnal de calatorie și cu butonul New vo trece la
adăugarea primului element în meniu.

Fig. 98: Editarea unei pagini din meniu

În meniu pot fi adăugate mai multe tipuri de comenzi:


• Go To Switchboard - permite schimbarea paginii active a meniului
• Open Form in Add Mode - permite deschiderea unui formular pentru adăugarea unei noi
înregistrări
• Open Form in Edit Mode - permite deschiderea unui formular pentru editarea datelor
existente
• Open Report - permite deschiderea unui raport pentru vizualizare
• Design Application - permite trecerea în editarea obiectelor bazei de date
• Exit Application - permite închiderea aplicației Access
• Run Macro - permite rularea unei macrocomenzi
• Run Code - permite rularea unei secvențe de cod (a unei subrutine)
Prima poziție din meniu va fi o comandă pentru adăugarea unui nou voiaj (fig.99). În mod
asemănător vor fi adăugate comenzi pentru deschiderea formularului Voiaje pentru editarea
înregistrărilor existente, pentru afișarea raportului NumarEscalePorturi și pentru terminarea
aplicației. Dacă în baza de date au fost adăugate formulare și rapoarte suplimentare, acestea
73
Baze de date: Lucrări practice

pot fi trecute în acest meniu sau pe pagini suplimentare.

Fig. 99: Adăugarea unui element în meniu

Pentru a configura baza de date să afișeze automat formularul Switchboard la deschiderea


acesteia, se accesează butonul rotund din colțul stânga sus (Microsoft Office Button) și se apasă
butonul Access Options. În categoria Current Database în secțiunea Application Options în lista
derulantă Display Form se selectează formularul Switchboard (fig.100).

Fig. 100: Selectarea formularului de pornire

La redeschiderea bazei de date formularul Switchboard va fi afișat automat (fig.101). Meniul și


panoul de navigare sunt încă accesibile.
Cu ajutorul fereastrei Access Options pot fi configurate numeroase setări legate de funcționarea
bazei de date. De exemplu, programatorul poate ascunde panoul de navigare, meniul principal
și poate stabili un formular care să fie deschis la pornirea Access (așa cum am configurat
pornirea pentru formularul Switchboard). În acest mod accesul la modificarea structurii este
împiedicat.
Pentru a putea reveni la modificarea structurii unei baze de date Access astfel configurată, la
deschiderea acesteia trebuie ținută și tasta Shift apăsată.

74
Baze de date: Lucrări practice

Fig. 101: Meniul principal al aplicației Access

Securizarea bazei de date

Restricționarea accesului la o aplicație realizată cu Access se poate face în mai multe moduri.
Prima modalitate este ascunderea obiectelor în panoul de navigație. Aceasta se poate face dacă
se selectează din meniul contextual al obiectului comanda Show Properties ce va afișa o
fereastră cu proprietăți (fig.102) în care se poate marca obiectul pentru a fi ascuns (proprietatea
Hidden).

Fig. 102: Fereastra cu proprietăți pentru Escale Subform

75
Baze de date: Lucrări practice

Pentru a putea accesa ulterior aceste obiecte se face clic dreapta cu mouse-ul într-o zonă liberă
a panoului de navigare pentru afișarea meniului contextual din care se alege comanda
Navigation Options. În fereastra care apare (fig.103), în secțiunea Display Options se poate pune
bifa pentru afișarea obiectelor ascunse (Show Hidden Objects) și atunci toate obiectele ce au
atributul Hidden vor redeveni vizibile în panoul de navigare, dar vor fi colorate distinct pentru a
evidenția proprietatea Hidden.
Tot în fereastra cu proprietățile panoului de navigare pot fi marcate ca invizibile obiecte sau
chiar tipuri de obiecte.

Fig. 103: Fereastra cu proprietățile panoului de navigare

Ascunderea unor obiecte ce nu ar trebui accesate direct cum ar fi interogări, formulare


secundare etc, este utilă și pentru reducerea numărului de obiecte afișate în panoul de
navigare.
Restricționarea accesului la baza de date se poate face și prin stabilirea unei parole de acces.
Pentru aceasta baza de date trebuie deschisă în mod exclusiv. Apăsăm pe butonul rotund din
colțul stânga sus (Microsoft Office Button) și cu comanda de deschidere Open din meniul care
apare selectăm baza de date dorită. Pe butonul de deschidere a acesteia avem mai multe
opțiuni. Vom alege varianta Open Exclusive (fig.104).

76
Baze de date: Lucrări practice

Fig. 104: Selectarea modului de deschidere exclusivă

După ce baza de date a fost deschisă exclusiv, se poate stabili parola de acces cu comanda
Encrypt with Password din meniul Database Tools, secțiunea Database Tools. În manieră
asemănătoare se poate elimina parola pusă unei baze de date, desigur după ce am deschis-o
exclusiv folosind parola existentă.

Exemplele oferite în această lucrare ar trebui să permită oricărui student înțelegerea modului în
care poate fi realizată o bază de date cu ajutorul Access 2007. Folosind tehnicile enumerate
fiecare student ar trebui să completeze baza de date cu obiectele ce lipsesc pentru a realiza un
jurnal de călătorie complet funcțional, cu o interfață simplă și ușor de folosit.
Cu toate că Access este o unealtă software aparent simplă, pentru stăpânirea unor tehnici de
proiectare avansate și dezvoltarea unor aplicații cu baze de date mai complexe este necesară o
perioadă de practică mai îndelungată și asimilarea limbajului Visual Basic for Applications.

77
Baze de date: Lucrări practice

BIBLIOGRAFIE

BIBLIOGRAFIE
Wiki2014: Wikipedia, List of world's busiest ports by cargo tonnage, ,
http://en.wikipedia.org/wiki/List_of_world%27s_busiest_ports_by_cargo_tonnage

WAtlas2014: WorldAtlas, 2-letter, 3-letter, country codes for all countries in the world, ,
http://www.worldatlas.com/aatlas/ctycodes.htm

78
Tiparul executat în
TIPOGRAFIA
UNIVERSITĂȚII MARITIME
Constanța

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