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
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
Autorii
Baze de date: Lucrări practice
INTRODUCERE
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
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.
4
Baze de date: Lucrări practice
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.
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.
7
Baze de date: Lucrări practice
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).
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.
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.
Î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.
În mod esemănător vor fi adăugate structurile pentru tabelele TipuriNava (tabelul 2) și Functii
(tabelul 3).
Î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
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).
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
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.
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.
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
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.
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.
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).
Î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.
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
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).
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.
Din motivul enunțat anterior, vom începe cu completarea tabelei TipuriNava (fig.19).
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.
Pentru completarea tabelei Porturi vom importa o listă de porturi preluată de pe internet.
Î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.
Î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.
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.
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.
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
Î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.
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
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
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.
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.
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.
33
Baze de date: Lucrări practice
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.
35
Baze de date: Lucrări practice
Având date în tabelele Functii, TipuriNava și Porturi se poate trece la completarea datelor în
tabela Nave (fig.43).
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).
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.
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.
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.
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).
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).
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
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ă.
Î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
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).
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ă.
Pe pagina a patra a asistentului pentru formulare se poate selecta unul dintre stilurile
predefinite pentru formulare (fig.57), de exemplu Trek.
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).
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.
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).
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).
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
48
Baze de date: Lucrări practice
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).
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
50
Baze de date: Lucrări practice
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.
51
Baze de date: Lucrări practice
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.
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.
Î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
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).
54
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.
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ă.
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
Î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.
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).
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
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ă.
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ă.
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.
Pe pagina a cincea a asistentului pentru rapoarte se poate selecta un stil pentru raport (fig.82).
Vom selecta de exemplu Flow.
Ultima pagină a asistentului pentru rapoarte permite schimbarea denumirii pentru raport și
afișarea datelor sau editarea elementelor acestuia (fig.83).
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.
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).
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
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.
65
Baze de date: Lucrări practice
Î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.
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
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.
67
Baze de date: Lucrări practice
68
Baze de date: Lucrări practice
LABORATOR 7
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.
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
Asistentul pentru documentarea bazei de date permite obținerea unui raport detaliat referitor
la obiectele și structura bazei de date (fig.93).
70
Baze de date: Lucrări practice
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.
Î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).
71
Baze de date: Lucrări practice
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.
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.
74
Baze de date: Lucrări practice
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).
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.
76
Baze de date: Lucrări practice
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