Sunteți pe pagina 1din 146

Cuprins

Lecþia 1. Modelarea conceptualã a unei baze de date ...................................... 5


• Informaþii ºi date • Baza de date. Sistemul de gestiune al bazelor de
date • Terminologie ºi concepte specifice bazelor de date • Cum se
proiecteazã o bazã de date? • Studii de caz • Sarcini de Laborator
Lecþia 2. Prezentarea generalã a aplicaþiei MS Access ................................... 12
• Caracteristici SGBDR Access • Obiecte, proprietãþi ºi metode • Tipuri
de date ºi funcþii uzuale • Sarcini de Laborator
Lecþia 3. Proiectarea tabelelor Access ............................................................... 17
• Crearea tabelelor în modul Design View • Crearea unei tabele în modul
DataSheet View • Crearea tabelelor cu Wizard Table • Încãrcarea structurii
sau popularea tabelei • Studiu de caz: crearea unei tabele • Sarcini de
Laborator
Lecþia 4. Operaþii elementare asupra tabelelor Access ................................... 25
• Deschiderea/închiderea unei tabele • Deplasarea în tabela de date
• Sortarea datelor • Actualizarea datelor • Anularea corecþiei • Duplicarea
sau copierea tabelelor • Filtrarea articolelor • Cãutare ºi modificare
• Indexarea tabelelor • Sarcini de Laborator
Lecþia 5. Relaþionarea tabelelor într-o bazã de date Access ......................... 32
• Proiectarea unei relaþii • Tipuri de asocieri (concatenãri) ale tabelelor
legate (Join) • Subseturi de date • Crearea automatã a relaþiei 1-n prin
Lookup Wizard • ªtergerea/modificarea unei relaþii • Proiectarea regulilor
de integritate ale bazei de date • Sarcini de Laborator
Lecþia 6. Normalizarea bazei de date ................................................................. 39
• Forme normale • Normalizarea tabelelor cu Table Analyzer Wizard
• Sarcini de Laborator
Lecþia 7. Interogarea bazei de date Access ...................................................... 44
• Tipuri de interogãri • Proiectarea interogãrilor de selecþie (Select Query)
• Proiectarea interogãrilor de sortare • Proiectarea interogãrilor totalizatoare
• Proiectarea interogãrilor încruciºate (de tip Crosstab) • Proiectarea
interogãrilor de ºtergere (Delete Query) • Proiectarea interogãrilor de
corecþie (Update Query) • Proiectarea interogãrilor pentru adãugare
(Append Query) • Proiectarea interogãrilor de tip Make Table • Studiu de
caz • Sarcini de Laborator
*Lecþia 8. Elemente de programare în SQL-Access ......................................... 59
• Instrucþiunea SELECT • Interogãri tip Union • Subinterogãri • Comanda
INSERT • Comanda DELETE • Comanda UPDATE • Comanda CREATE
TABLE • Sarcini de Laborator
Lecþia 9. Obþinerea informaþiilor sub forma rapoartelor ................................. 66
• Rapoarte • Proiectarea rapoartelor cu Report Wizard • Editarea
rapoartelor cu Report Design • Etichete • Grafice • Sarcini de Laborator
Lecþia 10. Proiectarea formularelor ..................................................................... 75
• Tipuri de formulare • Proiectarea unui formular folosind asistentul Form
Wizard • Proiectarea formularelor prin Form Design • Obiecte de interfaþã
!
pe un formular • Sarcini de Laborator • Proiectarea obiectelor de control
pe formular
*Lectia 11. Macro-instrucþiuni Access ................................................................ 89
• Macro-instrucþiuni • Sarcini de Laborator
*Lecþia 12. Organizarea aplicaþiei: meniuri ºi ferestre de prezentare ........... 92
• Proiectarea unei ferestre de prezentare a aplicaþiei • Proiectarea unui
formular de comutare sau panou de bord • Realizarea meniului aplicaþiei
folosind bara de butoane Windows • Proiectarea unui buton-meniu prin
macro-comenzi • Sarcini de Laborator
Lecþia 13. Proiectarea legãturilor aplicaþiei cu exteriorul ............................... 98
• Hyperlink-uri în tabelele Access • Proiectarea paginilor Web pentru
vizualizarea datelor pe Internet • Importul ºi exportul de date • Sarcini de
Laborator
Lecþia 14. Proiect final ........................................................................................ 103
• Indicaþii metodologice pentru realizarea unui proiect informatic • Studiu
de caz
Rezolvãri ºi indicaþii ............................................................................................ 112
Anexe ..................................................................................................................... 141
Bibliografie ............................................................................................................ 144

"
Lecþia
1 Modelarea conceptualã a unei
bazei de date
ü Baze de date ºi SGBD-uri. Particularitãþile modelului relaþional
ü Proiectarea structurii conceptuale a unei baze de date
ü Studiu de caz

1.1. Despre informaþii ºi date. Problema organizãrii datelor


Activitatea umanã, în cele mai diverse forme ale sale, a fost întotdeauna
caracterizatã prin entitãþi faptice exprimate fie sub formã de valori numerice, fie ca
percepþii sau observaþii nenumerice fãcute de fiinþele umane sau de maºini. Aceste
entitãþi faptice independente ºi neevaluate se vor numi DATE. Datele obþinute în
cadrul activitãþilor productive, de conducere, de cercetare, educaþionale, artistice
constituie un material informaþional brut care poate fi evaluat, ordonat ºi prelucrat,
având în vedere diferite obiective. În urma acestui proces de transformare a datelor
se obþin informaþii, care reprezintã o interpretare a datelor în raport cu anumite
situaþii particulare sau cu înþelegerea de cãtre mintea umanã în general. Informaþiile
constituie baza raþionamentelor, experimentãrilor imaginate de mintea umanã în
scopul obþinerii de noi cunoºtinþe.
Producerea informaþiilor susþine anumite acþiuni umane cu finalitate practicã,
creându-se totodatã un fond informaþional utilizabil pentru generarea de noi informaþii
ºi cunoºtinþe.
Informaþia este definitã ca „o comunicare susceptibilã de a produce cunoºtinþe“,
are un caracter semantic ºi de noutate, de aport la cantitatea de cunoºtinþe a celui
care o primeºte. Informaþia se referã întotdeauna la obiecte, persoane, procese,
fenomene, locuri, situaþii, condiþii etc. O informaþie trebuie sã fie utilã, precisã,
completã, fãrã prea multe amãnunte care sã facã mesajul greu de interpretat, sã
soseascã la timp pentru luarea unor decizii. Eschil zicea cã înþelept nu este cel ce
ºtie lucruri multe ci lucruri utile. O altã trãsãturã fundamentalã a informaþiei este
subiectivitatea sa. Ceea ce este o informaþie pentru o persoanã poate sã nu însemne
nimic pentru alta.
Datele constituie materializarea, reprezentarea simbolicã a informaþiilor (prin
semne, litere, cifre) într-o formã convenþionalã (scrisã, vorbitã, luminoasã, semne
grafice, desene) convenabilã unei comunicãri. Datele descriu ce s-a întâmplat prin
numãr sau cuvânt, ele nu furnizeazã vreo judecatã sau interpretare ºi nici bazã
pentru acþiune. Datele reprezint㠄materia prim㓠din care, dupã o serie de operaþiuni
efectuate de cãtre oameni sau echipamente, se obþin informaþii.
Informaþia reprezint㠄semnificaþia ce poate fi desprinsã dintr-un ansamblu de
date, pe baza asociaþiilor dintre acestea“, este deci partea utilizabilã dintr-un ansamblu
de date. Informaþiile furnizeazã rãspunsuri la întrebãri de genul „cine”, „unde”, „când”.
Datele sunt exprimate prin atribut ºi valoare. Exemple: produs=„imprimantã”,
cantitate=20, preþul=150 lei. Informaþia se exprimã prin propoziþii. Exemplu: „S-au
vândut 20 imprimante la preþul de 50 lei”. Informaþia presupune înþelegerea relaþiilor
dintre date.

#
Colecþia de date reprezintã un ansamblu de date care se referã la acelaºi
fenomen, obiect sau situaþie.
Între componentele unei colecþii de date, ca ºi între colecþii, pot fi identificate
sau, eventual, pot fi introduse relaþii care sã determine pe mulþimea respectivã o
anumitã structurã, adicã un anumit mod de ordonare astfel încât sã se faciliteze
prelucrarea. Relaþiile pot fi unidirecþionale sau bidirecþionale. O relaþie unidirecþionalã
poate determina obþinerea unei valori sau a mai multora din componenta legatã,
plecând numai de la o componentã (pãrinte); o relaþie bidirecþionalã determinã
obþinerea aceloraºi date/valori, plecând de la ambele colecþii. Componentele structurii
pot fi individualizate ºi selectate prin poziþia pe care o ocupã în structurã, în raport
cu ordinea specificatã sau, mai comod, prin numele componentei.
O colecþie de date pe care s-au definit anumite relaþii ºi cãreia îi este specific
un anumit mecanism de selecþie ºi identificare a componentelor constituie o structurã
de date. Mecanismul de selecþie al unei structuri de date este implementat de obicei
în programele de prelucrare a datelor respective, la nivelul sistemului de operare,
al sistemului de gestiune sau al programelor aplicative.
Sunt douã mari tipuri de acces:
– accesul secvenþial presupune parcurgerea tuturor datelor situate înaintea datei
care trebuie prelucratã.
– accesul direct presupune un mecanism prin care se poate determina direct
poziþia datei necesare prelucrãrii.
Operaþii generale asupra unei structuri de date:
• creare (memorarea pe suport a datelor);
• consultare (acces la elementele structurii pentru prelucrarea valorilor);
• actualizare (inserare, ºtergere sau corecþie a valorilor);
• copiere (duplicarea structurii pe un alt suport, în general);
• ventilare (desfacerea structurii în douã sau mai multe structuri);
• fuzionare (combinarea a douã sau mai multe structuri);
• sortare (aranjarea elementelor structurii dupã anumite criterii).
Cerinþele complexe impuse sistemelor informatice moderne de a avea acces
simultan la aceleaºi date ale mai multor utilizatori, local sau la distanþã, au condus
la perfecþionarea metodelor de organizare ºi, astfel, au apãrut bazele de date. Vãzute
ca un depozit central de date împreunã cu descrierea lor, bazele de date, pot fi
accesate de diferiþi utilizatori, nu neaparat programatori. Principalul avantaj îl constituie
separarea problemelor de organizare a datelor faþã de cele de proiectare ale
programelor utilizatorilor. La nivelul unei baze de date se definesc 3 SCHEME
(descrieri pentru structurile conceptuale, logice ºi fizice).
O bazã de date trebuind sã facã faþã cerinþelor uneori contradictorii ale diferiþilor
utilizatori, va conþine acele date strict necesare tuturor utilizatorilor, într-un format
care este în majoritate acceptat, iar programe speciale de gestiune-grupate sub
numele de SGBD-sistem de gestiune a bazei de date – vor rezolva cerinþele
particulare.
Baza de date este vãzutã ca o colecþie de date legate funcþional între ele. Se
vorbeºte deci de o bazã pentru biblioteca ºcolii, de altã bazã de date pentru cantinã etc.
Baza de date (BD) poate fi definitã ca un ansamblu de date interconectate,
împreunã cu descrierea lor, care rãspunde calitãþilor de centralizare, coordonare,
integrare ºi difuzie a informaþiilor ºi care asigurã satisfacerea tuturor necesitãþilor de
prelucrare ale tuturor utilizatorilor dintr-un sistem.
Sistemul de Gestiune a Bazei de Date (SGBD) este un pachet de programe
ce permite utilizatorilor sã interacþioneze cu o bazã de date, asigurând acesteia
urmãtoarele caracteristici:
1. Independenþa datelor faþã de programul care le gestioneazã.

$
2. Nivel redus de redundanþã.
3. Securitatea datelor (protecþia la accesul neautorizat în vederea extragerii sau
distrugerii unor date cu caracter confidenþial).
4. Integritatea datelor (protecþia la defecþiuni hard sau soft).
5. Transparenþã (facilitãþi de utilizare a datelor, fãrã ca utilizatorii sã cunoascã
baza de date în întreaga ei complexitate).
6. Limbaje de descriere ºi manipulare a datelor de nivel foarte înalt. Existenþa unor
limbaje performante de regãsire a datelor care permit exprimarea sub forma
unor conversaþii a unor criterii cât mai complexe de selectare a informaþiei ºi
indicãrii unor reguli cât mai generale de editare a informaþiilor solicitate.
7. Facilitãþi multiutilizator. Datele pot fi accesate ºi chiar gestionate din diferite
noduri ale reþelei de calculatoare de cãtre diferiþi utilizatori.
8. Accesibilitate. Gestiunea datelor organizate în baze de date a fost preocuparea
multor specialiºti soft, ajungându-se la oferirea unor pachete de gestiune care
permit gestionarea datelor foarte complexe, în condiþii de eficienþã maximã.
Bazele de date pot conþine date de diferite tipuri (texte, numere, imagini,
documente). Pot cuprinde date operaþionale unui domeniu de activitate, ca, de exemplu,
baze de date pentru gestiunea resurselor umane, pentru gestiunea producþiei etc.
Unele baze de date conþin date comerciale sau statistice ale unor instituþii externe,
accesibile on-line ºi care servesc procesului decizional.
Dupã modelul bazelor de date SGBD-urile pot fi ierarhice (ex. IMS, GIS), reþea
(ex. SOCRATE), relaþionale (ex. Dbase, ACCESS, ORACLE, FOXPRO), orientate-
obiect (ex. O2, UniSQL, IRIS), obiectual-relaþional (ORACLE).

1.2. Terminologie ºi concepte specifice bazelor de date


Elementul fundamental al modelului conceptual este entitatea, ca termen ge-
neric pentru a desemna obiectele similare ca structurã, dar care sunt identificabile,
deci se pot deosebi între ele prin trãsãturi specifice. O entitate este formatã dintr-o
mulþime de atribute (sau caracteristici) care pot defini complet obiectul. Lista atributelor
care pot caracteriza o entitate poartã numele de familie de caracteristici. Valorile
familiei de caracteristici corespunzãtoare unui obiect distinct poartã numele de
realizare de entitate sau instanþã. Caracteristica asociazã câte o valoare dintr-un
domeniu fiecãrei realizãri a respectivei entitãþi. Domeniile pot fi deci numere întregi,
ºiruri etc. Un atribut sau un set de atribute care identificã în mod unic fiecare
instanþã a unei entitãþi se numeºte cheie.

%
O entitate poate fi definitã prin liste diferite de caracteristici în funcþie de sistemul
informaþional cãruia îi aparþine.1
Relaþiile care pot fi stabilite între douã entitãþi ale unei baze de date pot fi:
Relaþia 1-1 (unu-la-unu) – unei instanþe a entitãþii „pãrinte” îi poate corespunde
o singurã instanþã în entitatea „copil”. De exemplu, între entitatea CLASA ºi
PROFESOR, relaþia „diriginte” este de tip 1-1 dacã un profesor este diriginte la o
singurã clasã, iar o clasã are un singur diriginte.
Relaþia 1-N (unu-la-mulþi) – unei realizãri a entitãþii „pãrinte” îi poate corespunde
una sau mai multe realizãri în entitatea „copil”. Unei realizãri din entitatea „copil” îi
corespunde o singurã realizare în entitatea „pãrinte”. De exemplu, între entitatea
CLASA ºi ELEV relaþia „învaþ㔠este de tip 1-N, pentru cã o clasã are mai mulþi elevi
ºi un elev învãþã într-o singurã clasã.
Relaþia N-N (mulþi-la-mulþi) – unei realizãri a entitãþii „pãrinte” îi poate
corespunde una sau mai multe realizãri în entitatea „copil” ºi unei realizãri din „copil”
îi pot corespunde n realizãri în „pãrinte”. De exemplu, între entitãþile PROFESOR ºi
CLASA, relaþia „pred㔠este de tip N-N pentru cã la o clasã pot preda mai mulþi
profesori, iar un profesor poate preda la una sau mai multe clase.
Modelul relaþional
În bazele de date relaþionale entitãþile sunt organizate în tabele simple,
bidimensionale, fãrã legãturi fixe. Relaþiile necesare sunt stabilite prin asocierea
între ele a unor câmpuri cheie ale fiecãrei tabele. Modelul relaþional este caracterizat
prin unitatea ºi simplitatea reprezentãrilor: totul se reduce la tabele. De asemenea,
modelul pãstreazã rigoarea fundamentãrii sale matematice, fapt care a permis
standardizarea unor limbaje de nivel foarte înalt – în special SQL – care utilizeazã
elemente de algebrã relaþionalã. Este modelul care a „revoluþionat” lumea bazelor
de date ºi asupra lui vom insista în lecþiile care urmeazã.
Observaþi corespondenþa între termenii generali acceptaþi de teoria bazelor de
date ºi termenii specifici modelului relaþional, în figura urmãtoare:

O entitate este o relaþie, adicã o tabelã care are linii ºi coloane.

1
entitatea AUTOMOBIL ce desemneazã un obiect în cadrul sistemului informaþional al
unei unitãþi producãtoare de maºini poate fi descrisã prin atributele tip-motor, model, numãr-
de-portiere, forma-caroseriei etc. Dacã, însã, entitatea AUTOMOBIL se referã la obiectele
supuse vânzãrii într-o unitate comercialã, atunci va trebui sã conþinã: seria-motorului, firma
producãtoare, preþul etc.

&
În SGBDR nu pot fi reprezentate relaþii tip N-N. Ele vor fi „sparte“ în procesul
normalizãrii bazei de date în relaþii 1-1 ºi/sau 1-n.
O schemã relaþionalã poate fi definitã ca un ansamblu de relaþii asociate seman-
tic prin domeniul lor de definiþie ºi prin anumite restricþii de integritate. Schema relaþionalã
este independentã în timp. Pentru pãstrarea integritãþii unei baze de date se propune
un limbaj declarativ care memoreazã regulile de integritate; acestea pot fi:
a. restricþiile cheilor primare – condiþia de unicitate ºi de valori non-nule;
b. restricþii referenþiale – apar atunci când o tabelã este în relaþie cu alta (de
exemplu, cheia strãinã nu trebuie sã aibã valori care nu se regãsesc drept valori
ale cheii primare în tabela de referinþã);
c. restricþii de comportament – puse pe valorile diferitelor atribute sau pe întreaga
înregistrare.

1.3. Proiectarea unei baze de date


Pentru modelarea unei baze de date se parcurg câteva faze care se încadreazã
în metodologia generalã pentru dezvoltarea aplicaþiilor informatice. Prezentãm acum
numai aspectele legate de proiectarea bazei de date.
Prima fazã este analiza sistemului informaþional existent, în care se cerceteazã:
Œ informaþiile, sursele ºi destinaþiile lor;
 principalele activitãþi legate de date: prelucrãri, reguli de calcul, validãri, puncte
de control, modalitãþi de arhivare;
Ž sistemul de codificare existent etc.
Analiza sistemului informaþional existent se poate realiza prin douã metode.
Prima, cea tradiþionalã, este metoda proceduralã, în care se pune accent pe fluxurile
de prelucrãri, întrebarea fundamentalã fiind: „de ce date am nevoie pentru a realiza
sarcina X?” Deci, se pleacã de la studiul cererilor de informaþii (=informaþii de ieºire)
ºi, mergând pe fluxul invers al prelucrãrilor, se determinã informaþiile de intrare, cele
care trebuie colectate, validate ºi organizate într-o bazã de date. O altã metodã de
analizã este cea orientatã obiect, în care întrebãrile sunt de felul: „Ce clase de
obiecte distincte pot fi definite pe domeniul aplicaþiei? Cum se comportã ele? Ce
evenimente pot apãrea? Ce acþiuni sunt posibile?”
A doua fazã constã în proiectarea entitãþilor ºi a relaþiilor „fireºti” dintre ele;
obþinem astfel SCHEMA. Pentru fiecare legãturã se stabileºte tipul ei (1-1, 1-n, n-n).
Faza a treia ar fi proiectarea structurii unei baze relaþionale, transformând entitãþile
ºi relaþiile în tabele. Tabelele vor fi definite prin câmpurile lor, caracteristicile acestor
câmpuri (tip, lungime), condiþii de validare, cheia principalã ºi, eventual, cheile externe.
Analiza unei probleme ºi proiectarea bazei de date pornind de la cererile de
informaþii.
Problema 1.1.
La emisiunea «Fotbal-minut cu minut» se solicitã telefonic
informaþii variate. Crainicul ar dori o bazã de date care sã permitã
obþinerea promptã a rãspunsurilor la solicitãrile publicului. Iatã o
listã cu câteva întrebari:
a. Care sunt jucãtorii de fotbal cu vârstã mai micã de 30 ani?
b. Cine locuieºte în altã þarã ºi nu este cãsãtorit? Care este adresa stabilã a acestora?
c. Care sunt echipele de fotbal? Când s-au înfiinþat? Care este sediul? Patronul? Care sunt
membrii echipei Dinamo în prezent?
d. Cine a mai jucat la echipa Rapid de-a lungul timpului? Pe ce post?
e. Care sunt meciurile planificate azi, unde, la ce orã ºi între ce echipe?

'
f. Câte meciuri au fost câºtigate de echipa Rapid?
g. Care este CV-ul lui Mutu? Este cãsãtorit? Cu cine? Are ºi copii?
h. Afiºaþi fotografia lui Mutu!
Rezolvare
Pentru analiza problemei trebuie sã rãspundem la urmãtoarele întrebãri:
1. Care sunt entitãþile?
JUCÃTORI, ECHIPE, MECIURI.
2. Care sunt atributele, caracteristicile pentru fiecare entitate?
JUCÃTORI (cod, nume, data_nasterii, foto, CV, stare civila?, are_copii?, adresa),
ECHIPE (cod_echipa, nume, data_înfiintarii, sediu),
MECIURI (cod_meci, echipa_1, echipa_2, goluri_1, goluri_2, stadion, data, ora).
3. Care sunt relaþiile dintre entitãþi?
Un jucãtor poate sã fi fost înscris la mai multe echipe; o echipã are mai mulþi jucãtori.
Un meci este jucat de douã echipe; o echipã participã la mai multe meciuri.
4. Cum aratã SCHEMA conceptualã a bazei de date?

5. Cum se modeleazã SCHEMA pentru o bazã de date relaþionalã?


Relaþia JUCÃTORI→ECHIPE este spartã în douã relaþii prin intermediul entitãþii
PARTICIPANÞI (codul jucatorului, codul echipei, data_intrarii_in_echipa, data_iesirii_din_echipa,
functia).
Relaþia ECHIPE→MECIURI va fi modelatã ca atare prin reþinerea a douã câmpuri legate
de echipe (echipa 1 este cea care joac㠄acasã”, iar echipa 2 este cea din „deplasare”).
Fiecare entitate ºi relaþie se structureazã sub foma unui tabel. Obþinem deci urmãtoarele
tabele:
JUCÃTORI
Id Nume Data_n Casat Adr Copii Foto cv
100 Mutu 01.12.1976 T Bucureºti T
101 Popescu 03.05.1978 F Cluj F

ECHIPE
Id Nume Data_insc Sediu
1 Steaua 01.01.1800 Bucureºti
2 Dinamo 01.01.1980 Bucureºti
PARTICIPANÞI
Id Cod_juc Cod_ech Data-intr Data-ies post
1 100 1 01.01.2000 01.12.2000 Portar
2 100 2 01.01.2001 Fundas
3 101 2 15.07.1980 portar

MECIURI
Id E1 E2 G1 G2 Stadion Data Ora
1 1 2 1 3 Lia Manoliu 01.05.2003 15
2 2 1 0 0 Dinamo 07.05.2003 17


6. Care sunt cheile unice ale fiecãrei tabele?
Pentru simplificarea lucrului am numit un câmp special „Id” care sã joace rolul de cheie
unicã a fiecãrui tabel.
7. Care sunt cheile strãine (cele care asigurã legãturile dintre tabele)?
Participanþi.cod_ech, Participanþi.cod_juc – pentru legãtura cu tabelele ECHIPE ºi
JUCÃTORI ºi Meciuri.e1, Meciuri.e2 pentru legãtura cu tabela ECHIPE.
8. Care sunt restricþiile de integritate a bazei de date?
a. Un articol în PARTICIPANÞI nu poate fi introdus dacã nu se regãseºte valoarea din
câmpul Participant. Cod_juc în Jucatori.id ºi valoarea din câmpul Participant.cod_ech
în Echipe.id.
b. Un articol în tabela MECIURI nu poate fi introdus când codurile celor douã echipe nu
figureazã deja în tabela ECHIPE.
c. Modificarea cheii Echipe.id trebuie sã determine modificarea cheilor strãine
Participant.cod_ech ºi Meciuri.E1 sau Meciuri.E2.
d. Modificarea cheii Jucatori.id trebuie sã determine modificarea cheii Participant.cod_juc.
e. ªtergerea unei echipe – adicã scoaterea ei din evidenþ㠖 nu va determina ºi anularea
activitãþii jucãtorilor prin eliminarea liniilor din tabela PARTICIPANÞI, dar va provoca
ºtergerea meciurilor planificate cu aceastã echipã (meciurile deja jucate pot rãmâne!).
9. Care sunt restricþiile de validitate asupra câmpurilor din tabele?
Data planificãrii unui meci trebuie sã fie mai mare decât data curentã! Ora planificatã
trebuie sã fie între 8–20.
În tabela PARTICIPANÞI data_intrarii trebuie sã fie mai micã decât data_iesirii unui jucãtor
dintr-o echipã.
10. Care sunt evenimentele care determinã acþiuni asupra datelor?
Planificarea unui meci; desfãºurarea unui meci; înscrierea unui jucãtor la o echipã; plecarea
unui jucãtor de la o echipã; înscrierea unui nou jucãtor; înfiinþarea unei noi echipe;
schimbarea stadionului sau a datei planificate pentru un meci; modificarea unor valori
pentru un jucãtor; modificarea unor valori pentru echipã etc.

Problema 1.2.
Organizaþi datele pentru urmãtoarele solicitãri de informaþii:
– Lista tuturor persoanelor care locuiesc la case.
– Lista persoanelor fãrã ocupaþie care au domiciliul flotant în localitatea X.
– Care sunt proprietãþile unei persoane X (x = numãrul de buletin)?
– Situaþia imobilelor de pe strada X sub forma urmãtorului raport:

Nr. imobil Tip imobil Suprafaþa Numãr apartamente Numãr locatari


(vilã, bloc, casã)

– Care sunt apartamentele unde locuiesc copii?


– Câte apartamente sunt proprietate personalã în imobilul X?
– Sunt locuinþele cu încãlzire prin sobe cu lemne în localitatea X?
– Care este numãrul mediu de persoane pe o camerã în blocurile de pe strada X?
– Când au fost cumpãrate apartamentele proprietate personalã ale lui X?


Lecþia
2 Prezentarea generalã
a aplicaþiei MSAccess
ü Caracteristici SGBDR Access
ü Obiectele – proprietãþi, evenimente, metode
ü Tipuri de date ºi operaþii specifice fiecãrui tip

Microsoft Access este un SGBDR ce pune la dispoziþia utilizatorilor aplicaþii


complexe care sã ajute la crearea ºi manipularea bazelor de date ºi la obþinerea
rapoartelor pe baza acestor date.
Microsoft Access dispune de un limbaj de programare procedural foarte puternic
ºi flexibil, limbaj orientat pe obiecte, prin care programatorii îºi pot descrie datele ºi
aplicaþiile: Visual Basic for Applications. De asemenea, are implementat limbajul de
cereri SQL (AccessSQL) pentru utilizatorii neinformaticieni. De asemenea, pune la
dispoziþia programatorilor nu numai un compilator ºi un mecanism performant de
accesare a datelor, ci ºi un set de utilitare puternice pentru proiectare, încorporate
într-un mediu integrat ºi omogen. Acest mediu este foarte confortabil pentru
proiectanþii de aplicaþii. Microsoft Access recunoaºte ºi se adapteazã automat la
mediile multiutilizator, fãrã a fi nevoie de o variantã specialã pentru reþea. Microsoft
Access permite comunicarea cu alte aplicaþii (de exemplu, Excel, Word) prin
mecanisme DDE (transferul dinamic de date). Microsoft Access are facilitatea OLE
(legarea ºi încorporarea de obiecte cum sunt sunetele, imaginile, obiecte spread-
sheet etc.). Microsoft Access importã ºi exportã date în/din alte formate pe diferite
suporturi, local sau la distanþã. Microsoft Access permite programarea vizualã a
aplicaþiilor folosind asistenþi wizard, builder-e ºi designer-e pentru proiectarea
interactivã a tuturor obiectelor cu care lucreazã o aplicaþie.
Microsoft Access este o aplicaþie Windows ºi, de aceea, interfaþa sa verificã
toate aspectele unei interfeþe clasice Windows: lucreazã cu ferestre, în mod
grafic, multitasking, într-o manierã condusã de evenimente.
Programul Access se poate gãsi într-un folder ce conþine toate aplicaþiile Microsoft
Office. Deschiderea aplicaþiei se poate face prin Programs→Microsoft Office→Access.
Încheierea sesiunii de lucru se face prin butonul Close al ferestrei Access.
Fereastra sistem Access are meniul principal pe prima linie, o barã de butoane,
linia de stare pe care sunt trecute informaþii legate de obiectul ºi acþiunea executatã
la un moment dat.

2.1. Obiecte, proprietãþi si metode


În Microsoft Access bazele de date, tabelele, câmpurile din tabele, interogãrile,
rapoartele ºi formularele reprezintã obiecte. Unui obiect îi putem defini anumite
proprietãþi, îi putem inventaria evenimentele care pot acþiona asupra lui ºi acþiunile
prin care respectivul obiect rãspunde la aceste evenimente sau pe care le are
incluse în funcþionalitatea sa.
O proprietate este un atribut al lucrurilor pe care îl stabilim pentru a defini una
dintre caracteristicile acestuia, ca aspect sau comportament. De exemplu, o fereastrã


poate fi caracterizatã prin: textul explicativ ca titlu al ferestrei, distanþa în pixeli faþã
de marginea din stânga a ecranului, distanþa faþã de marginea superioarã a ecranului,
înãlþimea, starea vizibilã sau ascunsã etc.
Fiecare obiect Access are definite toate proprietãþile într-o fereastrã specialã
Properties, care se deschide din meniul View sau din meniul contextual ataºat
obiectului. Utilizatorul poate seta anumite proprietãþi la valorile dorite.
Fereastra de proprietãþi

Obiectele recunosc ºi rãspund la anumite acþiuni numite evenimente.


Un eveniment este o activitate specificã ºi predeterminatã, iniþiatã de sistemul
de operare (eveniment intern) sau de utilizator (eveniment extern) ºi la care un
obiect ºtie sã reacþioneze (de exemplu: apãsarea pe butonul mouse-ului, miºcarea
mouse-ului, apãsarea pe o tastã sau întâlnirea unei erori la introducerea datelor
într-un textbox). Unui eveniment i se poate ataºa o anumitã procedurã (este numitã
chiar Event procedure) sau o macroinstrucþiune în limbajul Visual Basic pus la
dispoziþie de Access. Metodele sunt deci proceduri asociate unui obiect. De exemplu,
o metodã asociatã pentru selectarea ferestrei poate sã schimbe culoarea de fond,
sã-i schimbe poziþia etc.
Obiectele pot sã difere între ele prin proprietãþi. Astfel, douã declanºatoare pot
avea dimensiuni diferite, poziþii diferite pe ecran, texte explicative diferite etc., dar
se pot comporta asemãnãtor (rãspund la aceleaºi evenimente prin aceleaºi acþiuni).
Spunem cã aparþin aceleiaºi clase sau colecþii de obiecte.

2.2. Tipuri de date ºi funcþii uzuale


SGBDR Access permite folosirea datelor numerice, ºiruri de caractere, date
calendaristice ºi valori logice (booleene). De asemenea, pot fi încorporate sau doar
legate la câmpurile unei tabele, obiecte ca documente word, imagini sau sunete. O
altã facilitate este posibilitatea includerii unei legãturi (Hyperlink) pentru accesarea
directã din tabela de date a site-ului web dorit.
Vom prezenta principalele tipuri de date, operatorii specifici ºi câteva funcþii
standard (interne) uzuale:
• Date tip ºir de caractere
Sunt acceptate caracterele ASCII delimitate prin ghilimele ºi sunt recunoscute
ca tip text (la câmpuri) sau string (la variabile). Exemplu: “alfa”.

!
Operatori:
Πde concatenare: &, +;
 de relaþionare: <,<=,>,>=,<>,=, Like;
Exemplu: “alfa”&“bet” – expresie text având ca rezultat ºirul “alfabet”
“alfa”>“alfabet” – expresie logicã având valoarea False/NO
Funcþii uzuale pentru ºiruri:
1. LEN(sir) – lungimea ºirului.
Exemplu: len(“maria” & “ana”) întoarce valoarea 8.
2. STR(numar) – face conversia numãrului la ºir.
Exemplu: Str(123) întoarce “123”.
3. MID(sir,start,lung) – extrage un subºir de lungime lung din ºir, începând de
la poziþia start. Exemplu: Mid(“alfabet”,3,4) întoarce “fabe”.
4. LEFT(sir,lung) – extrage primele lung caractere din ºir. Exemplu: Left(“alfa”,2)
întoarce “al”.
5. RIGHT(sir,lung) – extrage ultimele lung caractere din ºir.
Exemplu: Right(“alfa”,2) întoarce “fa”.
6. VAL(sir) – face conversia ºirului la numãr. Exemplu: Val(“123”) întoarce 123.
7. TRIM(sir) – eliminã spaþiile situate în exteriorul ºirului.
Exemplu: trim (“ alfa ”) întoarce “alfa”.
• Date numerice
Sunt recunoscute tipurile Byte, Integer, Long (pentru valorile întregi), Single,
Double (pentru valorile reale) ºi Currency (pentru valori monetare).
Operatori:
Œ aritmetici: +,-,*,/ (împãrþire realã), \ (împãrþire întreagã), mod (restul),
^ (ridicare la putere);
 de relaþii: <,<=,>,>=,<>,=, Between.
Exemplu: x Between 4 and 10: expresie logicã cu valoare Yes dacã x este între
4 ºi 10
.123 constantã numericã interpretatã ca 0.123
1e3 + 123.2 expresie numericã cu valoarea 1123.2
123.008$ valoare monetarã
Funcþii uzuale pentru date numerice:
1. INT(numar) – întoarce partea întreagã. Exemplu: int(12.45) întoarce 12;
2. ABS(numar) – valoarea absolutã. Exemplu: Abs(-15) întoarce 15;
3. RND() – întoarce un numãr aleator subunitar;
4. ISNUMERIC(exp) – testeazã dacã expresia este numericã.
• Date calendaristice
Acestea reþin anul, ziua, luna ºi eventual ora, minutul ºi secunda. Delimitator
este caracterul diez. Aparþin tipului DateTime (la câmpuri) sau Date (la variabile).
Operatori: Œ specifici: +, - (adunarea, scãderea unui numãr de zile)
 relaþionali: <,<=,>,>=,<>,= , Between
Exemplu: # 1/12/2001# datã calendaristicã în format ll/zz/aaaa: 12 ianuarie
2002;
# 5/3/2002 4:30:05# datã calendaristicã ce include ºi ora;
Date() +3 expresie de tip datã calendaristicã: data curentã plus 3 zile;
[Data-nastere] between # 3-ian-1952 # and 3-dec-2000.

"
Funcþii standard uzuale pentru date calendaristice:
1. DATE() – întoarce data curentã (sistem);
2. NOW() – întoarce data ºi ora sistem;
3. ISDATE(exp) – testeazã dacã expresia este o datã calendaristicã.
• Date logice
Folosite pentru date care pot lua doar valorile adevãrat sau fals; aparþin tipului
Yes/No (la câmpuri) sau Boolean (la variabile).
Operatorii logici sunt Not, And, Or, Xor, Eqv, Imp (implicã).
Yes, true, No, false = constante logice;
Exemplu: [Pret]<5e6 and [cant] >100 – expresie logicã cu valoarea Yes dacã
preþul este mai mic ca 5 milioane ºi cantitatea mai mare decât 100.
Funcþii standard comune tuturor tipurilor de date:
1. IIF(expresie logicã, expresie1, expresie2) – întoarce expresie1 dacã primul
parametru este adevãrat, sau expresie2 dacã acesta este fals.
Exemplu: iif(varsta>18,“major”,“minor”) va întoarce ºirul “minor” dacã varsta=6.
2. FORMAT(expresie,sablon) – întoarce expresia sub o anumitã formã indicatã
de ºablon.
Exemplu: Format(#6/25/98#,“mmm dd”,“yyyy”) va întoarce June 25, 1998.
ªablonul este un ºir de caractere de cod. Se foloseºte pentru expresii
numerice, ºiruri, date calendaristice.

Baza de date Access


Orice activitate în Access se desfãºoarã asupra unei baze de date, deci prima
operaþie pe care o face un utilizator când intrã în mediul Access este sã deschidã
baza de date – dacã aceasta exist㠖 sau sã creeze una nouã.
1. Crearea unei baze de date se face prin File→New→Blank Database. Se va
deschide fereastra Database Design.
2. Deschiderea unei baze de date se face prin File→Open.
3. Închiderea bazei de date se face odatã cu închiderea ferestrei asociate sau
prin File→Close Database.
4. ªtergerea unei baze de date se face prin ºtergerea fiºierului .Mdb care o
conþine.
Toate activitãþile se desfãºoarã având deschisã fereastra bazei de date DataBase
Window care permite atât crearea, deschiderea sau închiderea tuturor obiectelor ei,
cât ºi evidenþa acestor operaþii.

#
Pentru fixarea efectului câtorva funcþii va trebui sã creaþi/deschideþi o bazã de date ºi
sã apelaþi editorul VBA(Visual Basic) prin obiectul
modules→new. Apoi deschideþi fereastra Imme-
diate prin meniul View→Immediate window.
Comanda ? va permite afiºarea efectului funcþiei.
Observaþi captura ferestrei pentru funcþia
DateAdd.
Încercaþi funcþiile ºi expresiile din cele douã coloane; notaþi efectul:
Dateadd(“d”,10,date()) Mid(“alba ca zapada”, 1,4)
Date() - #24.01.1952# Left(“alba ca zapada”,4)
Dateadd(“m”,3,date()) Right(“alba ca zapada”,4)
Dateadd(“yyyy”,2,date()) Format(#6/25/97#,“mmm””,”” dd”)
dateDiff(“m”, Date, „2/2/2004”) Format(123.45, “(999)-999.999”)
month(date()) Time()+“*”
dateDiff(“yyyy”,Date, „2/2/2004”) Len(“albatros”)
year(date()) - 1990 Format( 1.5, “000.000”)
day(date()) +2 Format( 1234.5, „00”)
Iif(month(date()=1,“ianuarie”,“eroare” Format( #6/25/97#,“yyyy mmm”)
Now() Format( 1.5895, “#.00”)
#24.01.1952# + date() Val(“012”)
Isdate(#12/12/2000#) Str(123.45)
Trim(“albatros”) Format( #6/25/97#,“mmm”)
Format( 1.5, “00”) Format( 1.5, “##”)

Întrebãri recapitulative
1. Cum este corect sã spunem despre aplicaþia Access cã este «o bazã de date» sau
cã este un «SGBD»?
2. Care pot fi proprietãþile unei ferestre? La ce acþiuni rãspunde o fereastrã?
3. Ce operaþii pot fi efectuate cu ºiruri, numere, date calendaristice?
4. Care sunt obiectele gestionate de aplicaþia Access?

$
Lecþia
3 Proiectarea tabelelor
Access
ü Tipuri de date dintr-o tabelã
ü Proiectarea structurii unei tabele în diferite moduri de lucru

O bazã de date Access are ca model conceptual modelul relaþional. Putem


astfel regãsi toate caracteristicile de bazã discutate în capitolul precedent: o tabelã
este o colecþie de date legate între ele, memorate sub formã de înregistrãri compuse
din unul sau mai multe câmpuri. Ca regulã generalã, un utilizator oarecare are acces
la tabela de date prin intermediul unor formulare, interogãri ºi/sau rapoarte. Desigur,
pentru proiectantul bazei de date, Access oferã posibilitãþile de acces direct la
structurã ºi la conþinut.
Definirea structurii tabelelor se face din fereastra Database →Table →New, în
trei moduri de lucru: Design, Datasheet ºi Wizard. Dupã salvarea informaþiilor de
structurã se pot introduce, vizualiza sau edita date prin Database→Table→Open.
Reluarea proiectãrii se permite prin Database→Table→Design.

3.1. Mediul de lucru


Pentru operaþiile directe asupra tabelelor beneficiem de un obiect de interfaþã
deosebit de util – bara de butoane Table Design care conþine, printre alte butoane
necunoscute utilizatorilor mediului Windows, ºi câteva butoane specifice lucrului cu
tabele.

ΠPrimul buton permite trecerea de la un mod de lucru la altul: de la introducerea


de date (Datasheet) la proiectarea structurii (Design), a unei interogãri (PivotTable)
sau a unui grafic (PivotChart) etc.
 Butonul Indexes permite deschiderea ferestrei pentru editarea indexurilor.
Ž Butonul Primary Key permite specificarea/ºtergerea cheilor primare.
 Butonul Insert Rows permite inserarea noilor rânduri (câmpuri în structurã).
 Butonul Delete Rows permite ºtergerea câmpurilor selectate.
‘ Butonul Properties deschide fereastra de proprietãþi asociatã tabelei.
’ Butonul Relationships deschide fereastra de proiectare/editare a legãturilor dintre
tabele.
“ Butonul Show Table permite adãugarea/ºtergerea tabelelor în fereastra Rela-
tionships.
” Butonul Database Window permite trecerea la fereastra principalã a bazei de
date.
• Butonul Builder deschide utilitarul Table Wizard pentru construirea rapidã a
structurii, prin selectarea câmpurilor din tabelele predefinite.
%
Crearea tabelelor în modul Design View
Modul Design View presupune introducerea
informaþiilor de structurã de cãtre utilizator: numele,
tipul ºi proprietãþile fiecãrui câmp, precum ºi cheia
principalã a tabelei.
Numele câmpului – poate fi orice ºir de maxim 64
de caractere. O descriere mai largã a câmpului,
care va fi afiºatã pe linia de stare a ferestrei
principale Access atunci când se introduc date în
câmpul respectiv, poate fi datã în coloana
Description.
Tipul câmpului se alege din lista deschisã prin butonul DataType.
Text Pentru ºiruri de maxim 255 caractere. Delimitatori: ghilimelele.
Se poate fixa altã lungime prin proprietatea Size:
Number Pentru numere întregi sau zecimale. Se poate particulariza.
Exemplu: tipul Byte permite reþinerea valorilor de la 0 pânã la
255 ºi ocupã un byte memorie.
Currency Pentru valori monetare. Folosiþi tipul currency pentru a evita
rotunjirea în timpul calculelor. Tipul currency oferã o precizie
de 15 cifre întregi ºi 4 zecimale.
Date/Time Pentru date calendaristice. Se poate fixa formatul dorit.
Yes/No Pentru datele logice. Constantele logice sunt Yes, No.
Memo Pentru ºiruri cu lungime mai mare decât 65536 caractere.
AutoNumber Pentru serii incrementate automat cu 1 sau valori aleatoare.
De obicei este folosit pentru cheia principalã a tabelei.
OLE Object Pentru legarea/încorporarea obiectelor prin mecanismul OLE:
documente Word, imagini, fiºiere de sunet, tabele Excel etc.
Hyperlink Pentru reþinerea adreselor URL.
Exemplu: Pagina_scolii # http://www.liis.edu.ro#evenimente
Lookup Wizard Pentru selectarea valorilor posibile dintr-o listã de constante
sau dintr-un câmp al unei tabele.
Cheia principalã a tabelei – se declarã astfel:
• se poziþioneazã cursorul pe câmpul care dorim sã devinã cheia tabelei.
• din meniul Edit activãm opþiunea Primary Key sau din bara de instrumente
apãsãm pe butonul ;
• urmãrim apariþia aceluiaºi simbol în dreptul câmpului care va avea rolul de
cheie unicã pentru tabel㠖 în cazul nostru câmpul Cod.
Dacã se folosesc mai multe câmpuri pentru cheia primarã trebuie selectate
toate ºi apoi apãsat butonul Primary Key. Dacã aþi salvat tabela fãrã sã fixaþi cheia
primarã, Access vã va avertiza despre acest aspect ºi vã va da posibilitatea de a
reveni în modul de proiectare Design, sau va ataºa automat un câmp cu rol de
cheie, de tip AutoNumber, numindu-l ID.
De fiecare datã când se deschide tabela, articolele sunt ordonate dupã câmpul
cheie primarã.

&
Proprietãþile câmpului:
a. Field size – permite fixarea mãrimii zonei
alocate coloanei. Implicit, pentru texte se
rezervã 50 de caractere. La tipul numeric
se asociazã lungimea în funcþie de
varianta folositã: Byte, Double etc.
b. Format – determinã modul în care va
fi afiºat câmpul. Mai multe tipuri de date
dispun de formate predefinite.
Exemplu:
Vrem ca numãrul de telefon sã
fie automat împãrþit în 2 zone printr-o
linie (de exemplu: 032-22445678).
Vom folosi tipul text ºi la format vom
plasa linia pe poziþia doritã. Simbolul
@ înlocuieºte orice caracter.

c. Input mask permite introducerea unui ºablon care sã controleze modul de


introducere a datelor. Se folosesc simboluri ca 0 sau 9 care obligã la
introducerea unei cifre, L obligã la introducerea unei litere etc.
d. Decimal Places – precizarea numãrului de zecimale. Valoarea Auto va indica
faptul cã numãrul de zecimale este dat de proprietatea Format.
e. Default Value – permite precizarea valorii iniþiale, în câmpul respectiv, pentru
un nou articol.
f. Caption – denumirea sub care va apãrea coloana în formularele sau rapoartele
utilizator. Implicit este trecut numele câmpului.
g. Validation Rule – permite specificarea unei condiþii la introducerea valorii.
Exemple de reguli de validare:
<> 0 Intrarea trebuie sã fie diferitã de zero.
> 1000 Or Is Null Intrarea trebuie sã fie mai mare ca 1000 sau vidã.
Like «A????» Intrarea trebuie sã fie pe 5 caractere ºi sã înceapã cu
litera “A”.
>= #1/1/96# And Intrarea sã fie o datã calendaristicã a anului 1996.
<#1/1/97#
g. Validation Text – specificã mesajul afiºat în cazul introducerii valorilor eronate.
h. Required – specificã acceptarea sau nu a valorilor nule în coloanã.
O valoare nulã sau vidã este o valoare zero (pentru coloana de tip numeric sau
currency), ºirul vid “ ” (tip text, Memo), data vidã #//# (tip date), No (tip boolean Yes/
No). Se asociazã implicit dacã nu se precizeazã altã valoare ca proprietate Default
Value.
Dacã într-un câmp se doreºte memorarea valorilor nenule, trebuie setatã
proprietatea Required pe valoarea Yes. Dacã se permit ºi valori nule, atunci se
seteazã proprietatea Required pe valoarea No.
Implicit, pentru câmpurile definite drept cheie primarã se interzice existenþa
valorilor nule.
i. Allow Zero Length – permite tratarea unui ºir de lungime zero drept valoare
validã sau nu. Se foloseºte pentru tipul Text sau Memo. Aceastã setare este
independentã de valoarea proprietãþii Required.

'
j. Indexed – indicã prezenþa sau absenþa unui index pentru coloanã. Pe valoarea
NO (No Duplicates) valorile permise sunt unice, iar pe YES (Duplicates)
valorile coloanei sunt oarecare.
k. New Value – este o proprietate a tipului autonumber ºi aratã modul cum va
fi generatã noua valoare: prin incrementare (Increment) sau aleator (Ran-
dom).
ü Definirea câmpurilor de cãutare – Lookup Wizard
Uneori este necesar ca la intro-
ducerea datelor într-un câmp sã avem
o listã de valori din care sã putem alege
valoarea doritã. Elementele listei pot fi
introduse manual de cãtre proiectant
odatã cu proiectarea structurii tabelei
sau pot fi preluate automat dintr-un
câmp al unei alte tabele pãrinte sau dintr-o interogare. De exemplu, dorim ca în
tabela ELEVI sã putem alege clasa fiecãrui elev dintr-o listã. Lista este închisã ºi
se deschide la plasarea cursorului ºi execuþia unui click-mouse pe câmp. Dupã
selectarea unei valori ºi trecerea cursorului pe altã coloanã se închide lista.
ü Definirea tipului Lookup – se realizeazã în fereastra de proiectare a tabelei
Design. Pentru câmpul dorit cu acest tip se selecteazã din listã Lookup Wizard –
asistentul care va construi lista de cãutare în mai mulþi paºi:
Pasul 1. Se cere proiectantului
indicarea modului de completare
cu valori a listei. Vom adãuga
varianta de introducere manualã.
Pasul 2. Se completeazã lista cu
valori. Este de preferat sã introducem o listã ordonat㠖 mai ales pentru
listele lungi – astfel încât sã poatã fi rapid localizatã valoarea doritã.
Pasul 3. Se confirmã coloana fixatã ca fiind de tip cãutare ºi se salveazã
definiþia coloanei atribuindu-i un nume. Se ataºeazã câmpului un obiect tip
listã închis㠖 Combo Box.

3.3. Crearea unei tabele în modul Datasheet View


Modul datasheet permite realizarea simultanã a douã obiective: crearea structurii
tabelei ºi popularea ei cu date. Se aseamãnã cu foaia de calcul Excel: fiecare linie
reprezintã un articol, iar fiecare coloanã reprezintã un câmp în structura tabelei.

Se afiºeazã o tabelã vidã, coloanele fiind numite iniþial field1, field2, … Se


introduc date în aceste câmpuri ºi, în funcþie de valorile introduse, Access va asocia
coloanei tipul corespunzãtor. Coloanele lãsate libere – fãrã valori – vor fi ºterse la


salvarea tabelei. Pentru fixarea cheii primare a tabelei se poate folosi sugestia
Access sau se editeazã structura în modul Design View ºi se precizeazã cheia.
Redenumirea unei coloane:
a. se executã dublu-clic pe numele coloanei, se introduce noul nume ºi se
confirmã cu <enter>;
b. se selecteazã coloana, se alege Format→Rename Column ºi se editazã noul
nume.
Inserarea unei coloane: se realizeazã prin opþiunea Insert→Column.
Selectarea unei coloane: se poziþionazã cursorul deasupra coloanei pânã apare
o sãgeatã ºi se executã un clic de mouse pe coloanã.
ªtergerea unei coloane: se executã comanda Edit→Delete Column.
Schimbarea ordinii coloanelor: se executã manevra Drag&Drop.
Redimensionarea unei coloane:
a. poziþionãm cursorul mouse-ului pe linia separatoare dintre coloana pe care
dorim sã o redimensionãm ºi o coloanã adiacentã pânã se modificã forma în
dublã sãgeatã.
b. þinem apãsat butonul stâng al mouse-ului ºi mutãm cursorul în noua poziþie.
Adaptarea dimensiunii coloanei la lungimea datelor conþinute:
a. se poziþioneazã cursorul mouse-ului între numele coloanei pe care dorim sã
o redimensionãm ºi cel al coloanei din dreapta. Atunci când cursorul ia forma
dublei sãgeþi realizãm redimensionarea automatã prin dublu-clic.
b. o altã variantã este activarea meniului contextual pe numele coloanei ºi
selectarea comenzii Column Width→Best Fit.
Ascunderea unei coloane ºi reafiºarea acesteia:
Operaþia de ascundere a unei coloane se realizeazã din modul de lucru Datasheet
prin comanda Format→Hide Column ºi are ca efect ascunderea datelor din coloanã,
nu ºi eliminarea ei din structura afiºatã de Design View.
Reafiºarea coloanelor ascunse se obþine din Datasheet View prin comanda
Format→Unhide Columns.

3.4. Crearea tabelelor cu Wizard Table


Access dispune de o serie de definiþii de tabele grupate pe domenii. Se poate
alege tabela doritã ºi apoi se pot selecta câmpurile necesare ºi se pot fixa relaþiile.
De asemenea, se pot fixa legãturile între tabela curentã ºi alte tabele din baza de
date. Odatã tabela creatã se poate folosi modul Table Design pentru modificarea
proprietãþilor sau modul Datasheet pentru introducerea datelor.


3.5. Încãrcarea structurii (popularea tabelei)

Utilizatorul poate introduce date direct, prin intermediul ferestrei Table.

Trecerea de la un câmp la altul se


face prin tasta <Tab> sau <Shift><tab>.
Pentru câmpul boolean se apasã tasta
<Space> sau clic de mouse pentru
valoarea Adevãrat (Yes). Adãugarea de
noi articole se face la sfârºitul tabelei
pe linia marcatã cu steluþã. Repetarea
valorii din articolul anterior se face astfel:
se fixeazã cursorul pe coloana unde se
doreºte repetarea valorilor ºi se intro-
duce Ctrl+’ (apostrof). Se observã copierea valorii anterioare.
Pentru introducerea obiectelor OLE se foloseºte meniul principal, opþiunea In-
sert Object. Se deschide o fereastrã de dialog prin care vom alege tipul obiectului
dorit. Butonul radio Create New lanseazã aplicaþia care va permite crearea obiectului
ce va fi inserat. Butonul Create from permite introducerea obiectului deja existent.
Editarea câmpului ce conþine obiectul OLE se face prin meniul Edit. Observaþi
editarea unui obiect de tip Bitmap.

Problema 3.1.

Sarcini suport pentru noile cunoºtinþe Folosiþi...


1. Creaþi o nouã bazã de date cu numele SCOLI New database
2. Creaþi un tabel pornind de la datele sale. De exemplu, Datasheet View
introduceþi urmãtoarele date: Introducere date

3. Denumiþi coloanele: nume_scoala, localitate, adresa, telefon, Nume coloanã


data_infiintarii.
4. Inseraþi o coloanã între telefon ºi data_infiintarii cu numele Inserare coloanã
nr_fax ºi treceþi aceleaºi valori ca la telefon farã prefix (deci
fãrã linie separatoare).
5. Schimbaþi ordinea câmpurilor astfel încât nr_elevi sã fie imediat Schimbare
dupã nume_scoala. ordine
6. Adãugaþi o coloanã cu numele are_camin? cu valori Yes ºi No. Tipul logic
7. Salvaþi cu numele SCOALA. Lãsaþi sistemul Access sã includã o Salvare
cheie pentru tabelã.
8. Proiectaþi structura tabelei ELEVI în modul de lucru Design. Design view
Care va fi cheia tabelei?
9. Fragmentaþi numele elevului separând numele de familie de Insert Row /
prenume. Puteþi realiza acest lucru în ambele ferestre? Insert column
10. Inseraþi un câmp pentru numele tatãlui pe exact 10 poziþii. Size
11. Adãugaþi câmpul absn. Completaþi-l cu valori oarecare. Insert row
Urmãriþi în Datasheet deplasarea coloanelor.
12. ªtergeþi coloana de adrese. Refaceþi apoi structura. Delete record
13. Ascundeþi coloana de adrese în modul Datasheet. Intraþi în Hide Column
modul Design. S-a ºters câmpul? Reafiºaþi.
14. Mutaþi coloana adresa în locul coloanei specialitate. S-au Mutare coloanã
inversat ºi câmpurile în structurã?
15. Impuneþi o condiþie de validare la câmpul absn: sa fie mai mare Validation rule
sau egal cu zero. Introduceþi valori negative.
16. Puneþi condiþia ca data naºterii elevului sã fie mai micã decât Validation
data curentã. Daþi mesaj adecvat. Fixaþi data ca format format
zi.luna.an.
17. Folosiþi obiecte diferite pentru un câmp de tip OLE: foi de Tip OLE
calcul, imagini, documente. Observaþi modul de editare.
18. Folosiþi tipul Autonumber pentru o nouã coloanã numitã matricol. Tip Autonumber
Observaþi evoluþia valorilor dacã ºtergeþi linii sau dacã adãugaþi
linii. Puteþi modifica valorile câmpului tip Autonumber?
19. Folosiþi tipul Currency pentru taxa de camin cu unitatea Leu; Tip Currency
fixaþi numãrul de zecimale la 2. format
20. Reproiectaþi tipul coloanei clasa de la text la Lookup. Tip Lookup-cu
Observaþi dacã s-au pierdut datele!
21. Inseraþi o nouã coloanã hobby, asociaþi-i tipul Lookup ºi Tip Lookup
scrieþi diverse valori. Introduceþi date? Observaþi ce tip a
primit câmpul în Design View.

Problema 3.2*
FOTBAL. Fie structura conceptualã proiectatã în tema P1.1:
JUCATORI (cod_jucator, nume, data_naºtere, foto, CV, stare_civila?, adresa,
venit_declarat), ECHIPE (cod_echipa, nume, data_infiinþare, sediu, patron), PARTICIPARI
(cod_echipa, cod_jucator, data_intrare, data_iesire) MECIURI (cod_meci, cod_echipa_1,
cod_echip_2, goluri_echipa_1, goluri_echipa_2, stadion, data, ora)
Executaþi urmãtoarele sarcini, folosind mediul Access:
1. Creaþi o nouã bazã de date FOTBAL.

!
2. Proiectaþi structura tabelei JUCATORI folosind tipurile de date adecvate.
3. Populaþi cu date de test.
4. Schimbaþi formatul datei calendaristice ºi observaþi modul de introducere a valorilor.
5. Introduceþi mai multe articole, fictive, în tabelã, prin copierea ultimei linii.
6. Proiectaþi structura tabelei ECHIPE.
7. Proiectaþi structura tabelei PARTICIPARI ºtiind cã se vor prelua valori din tabelele ECHIPE
ºi JUCATORI.
8. Redenumiþi coloana Jucãtori.data_nastere, pentru data naºterii, prin alt identificator. S-au
pãstrat datele?
9. Proiectaþi tabela MECIURI, preluând numele echipelor din tabela ECHIPE.
10. Folosiþi tipul DateTime pentru tabela MECIURI, pentru a reþine data ºi ora desfãºurãrii
unui meci. Fãrã secunde! Data sã fie sub forma ll/zz/aaaa. Ce lungime implicitã are?
Cum se introduc datele?
11. Folosiþi tipul Currency pentru un câmp nou Jucatori.venit_declarat; introduceþi valori.
Câte zecimale are?
12. Completaþi câmpul Jucãtori.Cv de tip Memo.
13. Redimensionaþi câmpul nume de tip Caracter prin mãrire ºi apoi prin micºorare. Urmãriþi
efectele în fereastra Browse. Se pierd datele dacã mãriþi lungimea câmpului CNP la 15?
Dar dacã micºoraþi la 5?
14. Schimbaþi tipul unor câmpuri, de la numeric la text ºi invers; de la datã calendaristicã
la numeric ºi invers. Observaþi de fiecare datã efectul.
Problema 3.3.
1. Proiectaþi o tabelã CARTI într-o nouã bazã de date cu numele BIBLIOTECA, având în
structurã urmãtoarele atribute:
CARTI (numar_inventar, titlu, autor, editura, editia, colectia, data_intrarii_in_biblioteca,
data_iesirii_din_evidenta, pretul, numarul_de_pagini, scurta_prezentare_in_word_a_cartii,
fotografia_copertii, date_despre_autori, tipul_cartii_daca_este_manual_sau_nu).
2. Fixaþi câmpul numar_inventar drept cheie.
3. Fixaþi cerinþa completãrii obligatorie a câmpurilor: titlu, autor, tipul_cartii,
data_intrarii_in_biblioteca, editia.
4. Fixaþi urmãtoarele cerinþe de validare:
4.1. data_intrarii_in_biblioteca>=data curentã
4.2. editie<=anul_curent
4.3. numãrul_de_pagini>0
5. Fixaþi anul curent ca valoare implicitã pentru editia ºi data curentã pentru
data_intrarii_în_biblioteca.
6. Proiectaþi în modul Datasheet tabela CITITORI cu informaþii despre cititorii bibliotecii
(cod numeric personal, nume, ocupaþie, adresã). Introduceþi direct valorile pe liniile
tabelei. Scrieþi pe ultima coloanã un numãr cu 13 cifre pentru codul numeric personal.
Denumiþi apoi coloanele.
7. Modificaþi structura tabelei CITITORI astfel încât sã adãugaþi câmpurile cod_cititor,
locul_de_munca, data_nastere, data_inscrierii_in_biblioteca.
8. Fixaþi cheia primarã ca fiind câmpul cod-cititor, cu tipul Autonumber.
9. Fixaþi indexurile ºtiind cã se vor cere situaþii ordonate dupã ocupaþii, nume, vârstã, loc
de muncã.
10. Fixaþi pentru câmpul data_nastere un format care sã punã pe prima poziþie anul, urmat
de lunã ºi apoi ziua!
11. Fixaþi pentru data_inscrierii_in_biblioteca o restricþie (de exemplu, sã fie anterioarã datei
curente).

"
Lecþia
4 Operaþii elementare
asupra tabelelor Access
ü Deplasarea în tabelã; actualizarea datelor
ü Sortarea ºi filtrarea; indexarea tabelelor

4.1. Deschiderea / închiderea unei tabele


Deschiderea unui fiºier tabelã se realizeazã prin
butonul Open, iar închiderea prin butonul de închidere al
ferestrei tabelei.

4.2. Deplasarea în tabela de date


Posibilitatea poziþionãrii pe un anumit articol este o facilitate acordatã utilizatorilor.
Bara de deplasare plasatã pe ultima linie a ferestrei tabelei permite:
Poziþionarea pe primul articol al tabelei
Devansarea cu un articol – cãtre începutul tabelei
Afiºarea numãrului articolului curent
Avansarea cãtre sfârºitul fiºierului cu un articol
Salt la ultima înregistrare a tabelei
Adãugarea ºi poziþionarea pe un articol vid
Poziþionarea fizicã pe un anumit articol se poate face ºi prin Edit→Go To.

4.3. Sortarea datelor din tabele


Prin sortare se obþin datele aranjate crescãtor sau descrescãtor dupã valorile
unor chei. O modalitate simplã ºi rapidã este folosirea butoanelor sort dupã
ce ne-am plasat cursorul pe coloana folositã drept cheie de sortare. O altã modalitate
este folosirea meniului principal Records→Sort→Sort Ascending/Descending sau a
celui contextual.

4.4. Adãugarea articolelor


În fereastra Datasheet se poziþioneazã cursorul pe o înregistrare vidã cu butonul
aflat pe bara de stare ºi se introduc noile valori. Se poate folosi meniul prin-
cipal, opþiunea Insert→New Record.

4.5. ªtergerea articolelor


Se marcheazã articolele pe care dorim sã le ºtergem prin glisarea mouse-ului
pe verticala din stânga tabelei ºi apoi se apasã tasta Delete, sau se foloseºte
opþiunea Edit→Delete. La mesajul sistem putem confirma ºtergerea sau putem
anula operaþia prin Cancel.

#
4.6. Modificarea valorilor din articole
Dupã poziþionarea pe linia
unde dorim efectuarea corecþiei
se observã semnul creion care
se pãstreazã pânã la terminarea
corecþiei ºi trecerea la altã linie.

4.7. Anularea corecþiei


Access pãstreazã informaþia anterioarã corecþiei, dând utilizatorului posibilitatea
anulãrii modificãrilor efectuate ºi revenirii la forma iniþialã. Pentru a anula modificãrile din
coloana curentã apãsãm tasta Esc, iar din linia curentã apãsãm Esc de douã ori. Dacã
s-a trecut deja la altã înregistrare anularea se face prin Edit→Undo Saved Record.

4.8. Duplicarea sau copierea tabelelor


Operaþia de copiere a unei tabele într-o
alta de acelaºi tip se face prin File→Export.
Se deschide o fereastrã de dialog prin care se
precizeazã locul ºi numele tabelei destinaþie.
Se poate copia doar structura sau
conþinutul împreunã cu structura.

4.9. Filtrarea articolelor


Pentru filtrarea articolelor din
fereastra Datasheet se folosesc
diferite metode: fie prin meniul prin-
cipal Records→Filter, fie prin meniul
contextual.
Modalitãþi de filtrare
1) Filter By Selection – când dorim selectarea articolelor care conþin o anumitã
valoare pe care ne-am poziþionat anterior:
a. Ne poziþionãm pe valoarea cãutatã la unul din articole.
b. Se apasã butonul Filter by Selection sau din meniul Records→Filter→Filter
by selection.
c. Se pot repeta paºii a ºi b pânã când obþinem setul de date dorit.
De exemplu, dorim sã aflãm elevii cu media 10 din clasa 12a. Observaþi ferestrele
Datasheet obþinute prin selecþii repetate! Ce selecþie s-a fãcut prima datã?
1. 2.

3.

$
Activarea sau anularea filtrului se face prin butonul Apply /Remove filter.
2) Filter Excluding Selection – atunci când dorim selectarea articolelor care
nu conþin o anumitã valoare. De exemplu, dorim sã aflãm elevii care nu sunt în clasa
12a!
a. Ne poziþionãm pe valoarea excepþie ºi o selectãm.
b. Activãm filtrul din fereastra Records→Filter→Filter Excluding Selection.
c. Repetãm acþiunile a ºi b pânã obþinem rezultatul dorit.
3) Advanced Filter/Sort – pentru indi-
carea unor condiþii compuse de filtrare. De
exemplu, dorim sã aflãm elevii din clasele
12a sau 12c, cãminiºti, cu media 10.
a. Din Datasheet apelãm
Record→Filter→Advanced Filter/Sort.
b. Se deschide fereastra de proiectare a interogãrii unde vom preciza condiþia
de filtrare. Se poate folosi aceeaºi fereastrã ºi pentru indicarea cheilor de sortare,
dacã dorim un rezultat ordonat dupã una sau mai multe chei.

4.10. Cãutare ºi modificare


Una dintre funcþiile importante ale unui SGBD este accesarea rapidã a tabelei
în vederea poziþionãrii pe o anumitã înregistrare, pentru afiºarea conþinutului ºi/sau
modificarea lui. Operaþiile de care ne ocupãm acum se realizeazã prin comenzile
Find/Replace ºi GoTo, lansate din meniul Edit.

Cãutarea dupã o anumitã valoare a unui câmp se poate face direct prin comanda
sau butonul Find . Se deschide o fereastrã de dialog pentru precizarea valorii
cãutate ºi locul de cãutare.
Observaþi poziþionarea pe prima apariþie a valorii introduse în banda Find What.
Putem anula cãutarea sau putem continua pânã la terminarea articolelor. Cãutarea
are loc pe o anumitã coloanã sau în tot tabelul. De asemenea, se poate specifica
sensul cãutãrii spre primul articol (UP), spre ultimul (DOWN) sau peste tot (ALL).
Modificarea valorii cãutate se precizeazã prin tab-ul Replace al ferestrei Find.
Modificarea are loc secvenþial, pe mãsurã ce valoarea cãutatã se gãseºte (Replace),
sau automat peste tot (Replace all).

%
4.11. Indexarea tabelelor
Indexarea este vãzutã de utilizatori ca o metodã de accesare rapidã, într-o
manierã ordonatã, a conþinutului unei tabele fãrã a duplica datele propriu-zise, fãrã
a le depune în altã tabelã ºi a avea grijã de ele. Alte avantaje sunt date de posibilitatea
folosirii expresiilor drept criteriu de ordonare, selectarea dupã criterii unice,
actualizarea promptã a indexurilor odatã cu datele propriu-zise etc.
Tipuri de indexuri:
Index (Duplicates OK) este folosit pentru selectarea ordinii de parcurgere din
câmpurile non-cheie, ale cãror valori nu trebuie sã fie neapãrat unice;
Unique Index este folosit pentru selectarea ordinii de parcurgere bazatã pe
prima apariþie a valorii în câmpul specificat;
Index (No duplicates) este folosit în tabelele incluse într-o bazã de date care
au deja fixat indexul primar, dar care doresc verificarea;
Primary Index este folosit în contextul unei tabele incluse într-o bazã de date
ºi asigurã introducerea valorilor unice pentru cheia articolelor. O tabelã are un singur
index primar.
a) Crearea unui index care are drept
conþinut un singur câmp
Dacã dorim ca un singur câmp sã fie
folosit pentru sortarea datelor sau pentru
cãutare, atunci se defineºte acest lucru ca
proprietate a câmpului. Se deschide tabela
în modul Design View. În câmpul unde dorim
fixarea indexului se alege proprietatea
Indexed.
b) Crearea unui index care are drept conþinut mai multe câmpuri ale tabelei
Se deschide tabela în modul
Design View. Se apasã butonul
Index care deschide o fe-
reastrã de definire a indexurilor.
Observaþi cã au fost trecute
indexurile simple – chiar dacã
le-am definit ca proprietate a
câmpurilor.
Pentru a defini un index for-
mat din mai multe câmpuri vom
trece aceste câmpuri pe linii
diferite, în coloana FieldName.
În exemplu dorim o aranjare rapidã a elevilor pe clase, în cadrul clasei, în ordine
alfabeticã. Dacã dorim sã se evite duplicãrile legate de acest index, în partea de jos
a ferestrei de definire a indexurilor vom plasa tipul indexului Unique pe valoarea NO.
c) ªtergerea unui index
Operaþia de anulare a unui index se face fie prin fereastra Design View asociatã
tabelei, fie prin fereastra Indexes deschisã cu butonul .

&
Problema 4.1.
Creaþi tabela PROFESORI (ID, nume, adresa, telefon sex, studii, nivel_studii specialitate,
mod_angajare, data_angajare, salarii, cv, foto) unde pentru mod_angajare pot fi valorile:
titular; suplinitor; plata cu ora; pentru nivel_studii pot fi valorile: L=liceale; U=universitare;
P=postuniversitare

Sarcini suport pentru noile cunoºtinþe Folosiþi...


1. ªtergeþi articolele 2 ºi 5. Edit→Delete
record
2. Afiºaþi care sunt profesorii cu acelaºi salariu ca al primului articol Find Filter
by selection
3. ªtergeþi toate persoanele necalificate (au nivelul studiilor liceal) Filter by
selection delete
4. Cãutaþi ºi modificaþi la unele persoane titulare gradul didactic Find replace
5. Afiºaþi toþi profesorii care NU aparþin catedrei de matematicã Filter excluding
Selection
6. Afiºaþi persoanele pe catedre Sort
7. Aflaþi care sunt titularii, netitularii ºi persoanele care au doar Advanced Filter
bacalaureatul
8. Modificaþi peste tot în câmpul specializare valoarea „mate“ cu Replace all
„matematica“
9. Realizaþi o copie a tabelei PROFESORI în aceeaºi bazã de File→export
date sub numele ISTORIC
10. Afiºaþi persoanele în ordinea descrescãtoare a vârstei Sort
11. Realizaþi indexuri pe câmpurile urmãtoare: nume, studii, CV, Index
salarii, data_nasterii, titular? Ce atribut nu a putut fi folosit
drept index?

Problema 4.2.
1. Creaþi o nouã bazã de date cu numele FARMACII.
2. Creaþi tabela MEDICAMENTE (cu structura farm, medicam, cant, pret, data_exp, um,
reteta, prospect, aspect), unde:
farm=codul unei farmacii este de forma „fx“ unde x este o singurã cifrã (de exemplu, f1,
f5 etc.);
medicam=numele întreg al medicamentului;
cant=cantitatea existentã în farmacie; maxim 250 unitãþi;
Pret=preþul unitar în lei; trebuie sã fie între 5-1000 lei;
um=unitatea de mãsura va avea valorile: g, mg, bucatã, fiolã, cutie etc.;
data_exp=data expirãrii medicamentului; se va impune folosirea formatului zi/luna/an,
cu valoare implicitã 31.12.2003;
reteta=yes dacã se cere reþetã; implicit este No.;
prospect=reþine prospectul medicamentului ca document Word;
aspect=ambalajul medicamentului este scanat ºi se reþine imaginea.

'
c. Asociaþi filtrului din prima coloanã o interogare din cele date în coloana a doua.
Filtru Interogare
A. a. Afiºaþi medicamentele
din farmacia numãrul 1
care expirã la 1 ianuarie
2002;

B. b. Afiºaþi medicamentele
cu reþetã din farmacia
numãrul 2 sau numãrul 3;

C. c. Sortaþi medicamentele
pe farmacii ºi alfabetic,
dupã nume;

D. d. Sortaþi medicamentele
cu stoc peste 200 unitãþi,
în ordinea descrescãtoare
a acestuia;

E. e. Sortaþi medicamentele
care se gãsesc în cantitãþi
mai mari de 200 unitãþi, în
ordine alfabeticã;

F. f. Sortaþi medicamentele
pe farmacii, descresãtor
dupã stocuri ºi, la aceeaºi
valoare a stocului, în ordi-
nea alfabeticã a medica-
mentelor existente;

G. g. Sortaþi medicamentele
cu prescripþie specialã în
ordinea alfabeticã a
acestora;

!
H. h. Sortaþi farmaciile care
au „aspirinã”, peste 200 buc,
în ordinea crescãtoare a
preþurilor;

I. i. Afiºaþi medicamentele
care au data expirãrii
cuprinsã între 01 ian 2002
ºi 01 ian 2003;

J. j. Afiºaþi medicamentele
din prima farmacie;

K. k. Afiºaþi liniile ce cores-


pund farmaciei f1 sau se
referã la medicamentul
„aspirinã”;

L. l. Afiºaþi medicamente
care se vând cu peste 200
lei gramul.

Întrebãri recapitulative
1. Care sunt manevrele directe prin care se poate actualiza o tabelã Access?
2. Ce avantaje oferã indexarea?
3. Enumeraþi 5 proprietãþi comune tuturor tipurilor de date.
4. Ce înseamnã validarea datelor?
5. Dacã dorim sã obþinem mai puþine linii într-un tabel aplicãm Sort sau Filter?

!
Lecþia
5 Relaþionarea tabelelor
într-o bazã de date Access
ü Proiectarea relaþiilor
ü Integritatea referenþialã

5.1. Tipuri de relaþii definite în Access


SGBDR Access gestioneazã o bazã de date relaþionalã în care tabelele pot fi
sau nu legate. Relaþia se stabileºte între o tabelã numit㠄pãrinte” ºi o tabelã numitã
„copil” ºi poate fi:
Relaþia 1-1: un articol al tabelei „pãrinte” are legãturã cu un singur articol al
tabelei „copil” sau cu nici unul.
Relaþia 1-n: unui articol al tabelei „pãrinte” îi corespunde unul sau mai multe
articole ale tabelei „copil” ºi unui articol al tabelei „copil” îi corespunde un singur
articol în tabela „pãrinte”.
Relaþiile între tabelele unei baze de date sunt permanente (persistente), în
sensul cã intrã automat în vigoare la deschiderea bazei de date ºi sunt valabile pe
tot parcursul lucrului cu aceasta. Relaþiile sunt memorate ca pãrþi integrante ale
bazei de date.
Uneori pot fi realizate ºi relaþii temporare pentru o interogare, un raport, un
formular etc.
Cerinþe pentru definirea relaþiilor:
– tabela „copil“ este indexatã dupã aceeaºi expresie ca ºi a legãturii;
– nu sunt permise cicluri: o tabelã nu poate fi ºi „pãrinte“ ºi „copil“ al uneia ºi
aceleiaºi tabele;
– tabela poate fi legatã de mai multe tabele prin chei distincte;
– legãturile unei tabele se numeroteazã în ordinea definirii lor.

5.2. Proiectarea unei relaþii


Pentru proiectarea unei relaþii se parcurg urmãtorii paºi:
Pasul 1. Identificarea tipului relaþiei.
Pasul 2. Pregãtirea tabelelor.
Pasul 3. Proiectarea relaþiei prin fereastra Relationship.
Tipul relaþiei va fi dat de tipul indexului din tabela “copil”. Dacã indexul este
cheie unicã, atunci relaþia va fi 1-1; dacã este cheie neunicã, atunci relaþia va fi
1-n. Ambele indexuri trebuie sã fie de acelaºi tip ºi sã aibã aceleaºi expresii de indexare.
De exemplu, dorim stabilirea legãturii 1-n între tabelele Clase – Elevi. În exemplul
nostru tabela „pãrinte” (Clase) se indexeazã unic dupã cheia de legãturã (clasa este
câmpul index ºi este de tip primary key). Tabela „copil” se indexeazã neunic, dupã
câmpul clasa.
Proiectarea legãturii se face prin fereastra Relationship, astfel:
– se deschide fereastra RelationShip prin meniul Tools→Relationship sau butonul

!
Relationship . Apare o fereastrã de proiectare a relaþiilor ºi un meniu pe
lina zero;
– se deschid tabelele între care dorim fixarea legãturii prin Show Table ;
– se fixeazã sau se verificã cheile de legãturã existente în fiecare tabelã intrând
în modul Design;
– realizarea legãturii între cele
douã tabele se face astfel:
poziþionãm mouse-ul pe cheia
tabelei „pãrinte” ºi executãm
drag&drop peste cheia strãinã
aparþinând tabelei „copil”.
Automat, se deschide fereastra
de editare a legãturii, având
plasate informaþiile legate de
chei, tabelele legate, tipul
legãturii. Putem schimba
câmpul unei tabele care
participã la o relaþie.
Putem fixa tipul concatenãrii
realizate cu aceastã legãturã
prin butonul JoinType, care
deschide fereastra de selecþie
a modului de concatenare.

5.3. Tipuri de asocieri (concatenãri) ale tabelelor legate (Join)


Tipul asocierii datelor dintre tabelele relaþionate nu afecteazã relaþia ci doar
modul cum sunt regãsite informaþiile din cele douã tabele legate. Rezultatul unei
relaþii poate fi vãzut ca o altã tabelã, care are pe fiecare linie valori atât din prima
tabelã cât ºi din a doua.
Inner join – rezultatul asocierii include numai acele rânduri din ambele tabele
care au valori egale ale cheii de legãturã. Deci, vom obþine selectiv numai elevii
pentru care avem informaþii despre clasele lor.
Outer join este vãzut ca opusul lui Inner Join. Se includ linii dintr-o tabelã chiar
dacã nu existã corespondent în cealaltã tabelã. Poate fi de tip:
– left join – când se includ toate articolele tabelei „pãrinte” ºi numai acele linii
din tabela „copil” pentru care existã corespondent. De exemplu, vom obþine
toate clasele care au fost deja înregistrate ºi elevii acestora;
– right join – când se includ toate articolele tabelei „copil” ºi doar acele linii ale
tabelei „pãrinte” care au corespondent. De exemplu, vom obþine toþi elevii ºi
clasele acestora.
Fie cele douã tabele CLASE→1-n→ELEVI legate prin codul clasei. Observaþi cã
sunt înregistraþi elevi dintr-o clasã care nu se regãseºte în tabela CLASE (Enache,
Elefteriu – 12e). De asemenea, în tabela CLASE sunt linii care nu au corespondent
în tabela ELEVI (de exemplu, clasa 12b nu are nici un elev).

!!
Printr-o legãtura inner join obþinem numai acele clase (12a, 12c) care au elevi
înregistraþi. Din tabela ELEVI lipsesc cei din clasa 12e! Din tabela CLASE lipseºte
12b!

– Printr-o legãturã Outer right Join obþinem toþi elevii (tabela „copil” va fi în
întregime parcursã) cu informaþii despre clasele lor (din tabela „pãrinte”).
Observaþi cã lipseºte clasa 12b!

– Printr-o legãturã Outer left join – obþinem toate clasele (tabela „pãrinte” este
parcursã în întregime) cu informaþiile legate cãtre fiecare elev. Lipsesc elevii
din clasa 12e!

5.4. Subseturi de date


Odatã fixatã o legãturã de tip 1-n între tabela CLASE ºi ELEVI se pot edita rapid
elevii fiecãrei clase (în fereastra Datasheet), ca subset de date asociat clasei.
Deschidem tabela CLASE ºi observãm în faþa primului câmp butonul +. Dacã
apãsãm, se va deschide o subfereastrã de valori ale tabelei legate (ELEVI) care
corespunde cheii de legãturã.

!"
Se creeazã un subset de date ataºat fiecãrui articol din tabela „pãrinte”. Putem
expanda toate liniile prin comanda: Format→Subdatasheet→Expand All sau putem
reveni prin Collapse All.

5.5. Crearea automatã a relaþiei 1-n prin Lookup Wizard


O posibilitate de fixare a relaþiei 1-n dintre douã tabele este oferitã de asistentul
Lookup Wizard la definirea câmpului de cãutare, prin preluarea valorilor dintr-o altã tabelã.
Câmpul de cãutare poate sã extragã valori dintre valorile altei tabele. Sã
presupunem cã avem tabelele CLASE ºi ELEVI. Adãugarea informaþiilor pentru un
elev presupune alegerea clasei sale dintre valorile înregistrate deja în tabela CLASE.
Cum se procedeazã?
Pasul 1. Vom apela Lookup Wizard din modul de lucru Design Table.
Pasul 2. Vom fixa modalitatea de completare a listei prin folosirea unei tabele
(primul buton radio).
Pasul 3. Se precizeazã tabela sursã.
Pasul 4. Se alege dintre câmpurile existente în tabela sursã coloana din care vor
fi preluate valorile listei de cãutare.
Pasul 5. Valorile sunt afiºate ºi pot fi completate cu altele noi. De asemenea, se
hotãrãºte dacã va fi vizibilã coloana care face legãtura dintre cele douã
tabele ºi se poate ajusta lãþimea listei.
Pasul 6. Se salveazã definiþia câmpului. Microsoft Access va realiza o asociere a
celor douã tabele de tipul CLASE→1-n→ELEVI.

5.6. ªtergerea/modificarea unei relaþii


Pentru editarea unei relaþii se poate folosi meniul contextual deschis atunci
când, fiind poziþionaþi pe legãturã (ea este mai intens coloratã), se apasã butonul din
dreapta al mouse-ului. Comanda Edit RelationShip deschide ecranul de dialog.
ªtergerea unei relaþii se realizeazã, de asemenea, din meniul contextual sau
prin acþionarea directã a tastei Delete.

!#
5.7. Proiectarea regulilor de integritate ale bazei de date
Bazele de date permit, aºa cum ºtim din lecþiile anterioare, menþinerea integritãþii
datelor din tabelele sale. Acest lucru se realizeazã prin intermediul unor proceduri
stocate (Stored Procedures).
Premiza de bazã este cã valorii unei chei externe dintr-o tabel㠄copil” trebuie
sã-i corespundã o valoare deja plasatã în cheia primarã din tabela „pãrinte”.
Mecanismul de integritate referenþialã trateazã înregistrãrile care nu îndeplinesc
aceste condiþii drept invalide. Prin analogie, puteþi fi un pãrinte fãrã copii, dar nu
puteþi avea un copil fãrã a fi pãrinte. De asemenea, nu pot fi ºterse articole din
tabela „pãrinte” dacã existã articole cu aceeaºi valoare a cheii în tabela „copil”. Deci,
nu putem lãsa orfani!
Apelul utilitarului Referential Integrity Builder se face din fereastra de editare a
legãturilor, prin butonul Enforce Referential Integrity.
La apelul utilitarului se activeazã cele douã comutatoare pentru actualizare ºi ºtergere.
1. Comutatorul Cascade Update Related Fields – actualizeazã toate articolele
legate în tabela „copil” cu noile valori ale cheii modificate din tabela „pãrinte”.
De exemplu, dacã modificãm codul clasei de la “12a” la “13a” în tabela
CLASE, atunci aceastã modificare se va face automat la toþi elevii respectivei
clase. Dacã nu activãm aceastã regulã, atunci când se modificã o valoare a
câmpului clasã în tabela CLASE ºi sunt elevi care au în câmpul clasã vechea
valoare, nu se permite modificarea!
2. Comutatorul Cascade Deleted Related Records – ºterge toate articolele cu
aceeaºi valoare a cheii strãine ca ºi a cheii primare ºterse. De exemplu, dacã
se desfiinþeazã clasa “13a” atunci vor fi ºterºi ºi elevii sãi. Altfel, se interzice
ºtergerea dacã în tabela COPIL sunt articole cu aceeaºi valoare a cheii
strãine ca ºi cea a cheii ºterse. Deci nu pot fi articolele „orfane“ în tabela
COPIL.
Dacã modificãm structura tabelelor implicate în mecanismul de integritate
referenþialã, indexurile sau relaþiile permanente, trebuie sã rulãm din nou utilitarul
Referential Integrity Builder. În acest fel codul sursã din baza de date va fi revizuit.

Deschideþi baza de date SCOALA. Verificaþi sã existe


tabelele CLASE (clasa, diriginte, profil), ELEVI (nume, clasa,
adresa, media, caminist, ...) ºi PROFESORI (cod, nume,
specialitatea, grad_didactic, ...)
Problema 5.1.

Sarcini suport pentru noile cunoºtinþe Folosiþi...


1. Deschideþi tabela CLASE ºi modificaþi codul clasei „12a“ la Tabele izolate
„99a“. Observaþi ce s-a întâmplat cu tabela referitã ELEVI?
S-au modificat peste tot valorile clasei „12a“ la „99a“? Cum
vom putea face aceastã modificare? Reveniþi la vechea
valoare „12a“ plecând tot din tabela CLASE.
2. Proiectaþi legãtura CLASE→1-n→ELEVI Relationship

!$
3. Obþineþi imaginea urmãtoare, în care putem vizualiza elevii Subseturi de
fiecãrei clase! date

4. Efectuaþi unele corecturi asupra elevilor de la clasa 12a. Editarea


De exemplu, adãugaþi un nou elev cu numele XX ºi ºtergeþi subseturilor
primul elev (Avram). Închideþi tabela CLASE. Deschideþi tabela de date
ELEVI ºi observaþi codul clasei primit de noul elev. Este 12a?
S-a pãstrat ºtergerea elevului Avram?
5. ªtergeþi relaþia ºi deschideþi tabela CLASE. Mai putem obþine Modificãri în
elevii fiecãrei clase ca subset de date? Deschideþi tabela CLASE tabele
Modificaþi codul clasei „12a“ la „99a“. Observaþi ce s-a relaþionate
întâmplat cu datele din tabela ELEVI? S-au modificat peste
tot valorile câmpului clasa? Reveniþi la vechea valoare „12a“
în tabela CLASE.
6. Refaceþi relaþia CLASE→1-n→ELEVI. Editarea relaþiilor
7. Plasaþi-vã în tabela CLASE ºi adãugaþi o nouã linie, fictivã, Enforce
pentru clasa „99a“. În fereastra ELEVI adãugaþi doi elevi Referential
pentru aceastã clasã. Salvaþi ºi închideþi. Activaþi mecanismul Integrity
Enforce Referential Integrity. Este semnalatã eroarea?
8. Impuneþi restricþia de integritate legatã de actualizare. Cascade Update
Plasaþi-vã în tabela CLASE ºi modificaþi codul clasei „99a“ Related fields
la „99x“. Urmãriþi în tabela ELEVI reflectarea modificãrii cheii
strãine! Reveniþi asupra valorii „99a“.
Sfat: Este mai comod sã aveþi ambele ferestre deschise!
9. Plasaþi-vã în tabela ELEVI ºi adãugaþi o nouã linie pentru un Enforce
elev din clasa „99x“ (care nu existã în tabela CLASE). Referential
Se permite? De ce credeþi cã nu? Ce manevrã ar trebui Integrity
fãcutã iniþial?
10. Editaþi relaþia ºi impuneþi restricþia de ºtergere. Plasaþi-vã în Cascade delete
tabela CLASE ºi ºtergeþi linia corespunzãtoare clasei „99a“. records
Urmãriþi în tabela ELEVI reflectarea acestei manevre. Anulaþi
manevra de ºtergere! Puteþi?
11. Schimbaþi în structura tabelei CLASE câmpul diriginte ca fiind Lookup
de tip Lookup, cu valori din tabela PROFESORI. Ce se întâmplã Format→
cu vechile valori? Atribuiþi noi valori. Subdatasheet→
Deschideþi fereastra Relationship. Ce legãturã s-a creat între remove
cele douã tabele?
Deschideþi tabela PROFESORI. Ce va conþine subsetul de date?
Puteþi anula subsetul de date?

!%
12. Obþineþi pentru fiecare profesor informaþii despre clasa unde Subdata
este diriginte.
13. Obþineþi încadrarea fiecãrui profesor ca subset de date Insert→
Subdatasheet

Problema 5.2.
1. Proiectaþi structura bazei de date BIBLIOTECA, cu tabelele CARTI, CITITORI ºi OPERATII,
respectiv cu relaþiile CARTI→1-n→OPERATII ºi CITITORI→1-n→OPERATII.
2. Aflaþi pentru fiecare carte care sunt cititorii.
3. Aflaþi pentru fiecare cititor care sunt cãrþile citite.
4. Proiectaþi restricþiile de integritate þinând cont cã:
– vom interzice adãugarea în tabela OPERATII a unei înregistrãri pentru o carte care
sã nu fie gãsitã în tabela CARTI;
– vom interzice adãugarea în tabela OPERAÞII a unui articol pentru care codul cititorului
sã nu fie înregistrat deja în tabela CITITORI;
– modificarea codului unei cãrþi în tabela CARTI va determina ºi modificarea codului-
carte în tabela OPERATII;
– modificarea codului unui cititor va determina modificarea codului în OPERATII;
– ºtergerea unei cãrþi din fiºierul CARTI va determina ºtergerea tuturor articolelor din
fiºierul OPERATII;
– nu vom putea ºterge o operaþie dacã în tabela CITITORI existã codul cititorului.

Întrebãri recapitulative
1. Cheia de legãturã între douã tabele trebuie sã fie index?
2. Cheia de legãturã între douã tabele se numeºte cheie externã?
3. Dacã avem un câmp de cãutare într-o tabelã suntem siguri cã tabela este pãrinte
pentru o alta?
4. Ce relaþii pot fi definite în Access?
5. Dacã într-o relaþie este impusã integritatea referenþialã, care sunt lucrurile interzise
unui utilizator?
6. Dorim sã stabilim o relaþie 1-1 între douã tabele; ce paºi urmãm?
7. Dorim sã stabilim o relaþie 1-N între douã tabele; ce paºi urmãm?
8. Dorim sã stabilim o relaþie N-n între douã tabele; ce paºi urmãm?

!&
Lecþia
6 Normalizarea
bazei de date
ü Proiectarea structurii corecte pentru o tabel㠖 activitatea de normalizare
ü Folosirea Table Analyzer Wizard

Proiectarea unei baze de date relaþionale începe prin definirea entitãþilor ºi a


relaþiilor între ele. Apoi se definesc tabelele, care vor memora atât datele din entitãþi
cât ºi relaþiile dintre acestea. Atenþia proiectanþilor trebuie îndreptatã cãtre construirea
unor tabele care sã evite anomaliile de actualizare ºi dificultãþile de prelucrare.
O tabelã de date este corect formulatã, adicã  «este o  relaþie» conform restricþiilor
impuse de teoria relaþiilor a lui A.F. Codd, dacã:
• are nume distinct în cadrul unei baze de date;
• fiecare celulã a relaþiei conþine o singurã valoare;
• fiecare atribut are un nume distinct;
• orice valoare a unui atribut face parte din domeniul pe care a fost definit acesta;
• ordinea dispunerii atributelor în relaþie nu prezintã importanþã;
• orice linie este distinctã de celelalte;
• ordinea liniilor nu influenþeazã conþinutul informaþional al relaþiei.

6.1. Forme normale


Exemplu: Sã presupunem cã tabelul urmãtor reþine codurile produselor solicitate
pe o comandã, precum ºi numãrul, data ºi valoarea comenzii:

com data furn adr cod1 cod2 cod3 cod4 cant val
006 01.03.98 f1 Bc a23 b66 c33 10 12980
007 01.09.98 f1 Bc c33 12 12000

Verificãm sã fie o relaþie conform definiþiei date mai sus: nu sunt linii identice, nu
sunt valori de tipuri diferite în coloane, cheia este atributul Com (numãr comandã). Dar:
a) cine ne garanteazã cã nu pot fi comenzi cu mai mult de 4 produse?
b) cine ne garanteazã cã toate produsele, chiar dacã sunt cel mult 4, au aceeaºi cantitate?
c) unde trecem preþul fiecãrui produs?
d) prelucrãri de tipul «valoarea totalã a comenzilor pentru produsul ‘b66’» necesitã
verificarea tuturor coloanelor ºi însumarea rezultatelor pentru întreaga bazã
de date, lucru care conduce la un timp mare de rãspuns.
Deci, se impune eliminarea câmpurilor care se repetã ºi astfel se ajunge la
prima formã normalã:

comanda data furn adr codprod cant pret valoare


006 01.03.98 f1 Bc a23 10 100 12980
006 01.03.98 f1 Bc b66 10 200 12980
006 01.03.98 f1 Bc c33 10 150 12980
007 01.09.98 f1 Bc c33 12 150 12000

!'
În aceastã tabelã cheia este compusã din atributele comanda ºi codprod. Dar:
a. Observãm cã anumite date se repetã în mai multe linii (data ºi valoarea
pentru fiecare comandã, numele ºi adresa furnizorului etc.).
b. Ce se întâmplã dacã se modificã adresa unui furnizor? Va trebui sã cãutãm
în toatã tabela unde apare numele furnizorului, pentru a-i modifica adresa!
c. Fiecare comandã are mai multe linii corespunzãtoare produselor comandate.
Ce se întâmplã dacã scriem greºit valoarea comenzii pe o linie? Valoare unei
comenzi este o informaþie calculatã din suma valoricã a produselor ei. Ce se
întâmplã dacã am «uitat» sã mai trecem o linie pentru o comandã? Suma
produselor preþ*cantitate în cazul unei comenzi va da altã valoare decât cea
reþinutã în coloana valoare. Deci, existã riscul de a avea în baza de date
anumite date «posibil inexacte». De obicei, reþinerea unei valori calculabile
se justificã numai printr-o cerinþã legatã de scurtarea timpului de rãspuns.
Spunem cã tabela prezintã redundaþã ºi, ca urmare a acesteia pot fi anomalii
de actualizare ºi prelucrare. Acest lucru se datoreazã reþinerii în aceeaºi tabelã a
informaþiilor despre obiecte diferite: comenzi, furnizori, produse.
Ideea de bazã este separarea informaþiilor care se referã la obiecte distincte, în
tabele distincte.
Operaþia de „spargere“ a relaþiei care manifestã anomalii, în alte relaþii, poartã
numele de normalizare.

COMENZI FURNIZORI PRODUSE


com data furn val furn adr com codprod cant pret
006 01.03.98 F1 12980 F1 Bc 006 a23 10 100
007 01.09.98 F2 12000 F2 Gl 006 b66 10 200
006 c33 10 150
007 c33 12 150

6.2. Normalizarea tabelelor cu Table Analyzer Wizard


Un instrument pus la îndemâna proiectanþilor unei baze de date, care oferã sugestii
de normalizare, este Table Analyzer Wizard deschis prin Tools→Analyze→Table.
Tabela sursã este verificatã sã nu conþinã date care se repetã. Dacã da, atunci se
fragmenteazã datele în una sau mai multe tabele, stabilindu-se ºi relaþiile dintre ele.
Am proiectat o tabelã cu stocurile de medicamente pe farmacii, ca în imaginea
urmãtoare:

Am supus analizei aceastã tabelã prin Tools→Analyze→Table ºi am obþinut


douã tabele: o tabelã cu datele despre medicamente (MED) ºi o tabelã cu datele
despre farmacii (FAR).

"
Astfel, s-au separat, în tabele distincte,
informaþiile despre farmacii de cele despre
medicamente.
Cum s-a realizat acest lucru?
Pasul 1. Am apelat asistentul prin meniul Tools→Analyzer→Table.
Pasul 2. Am indicat tabela pe care dorim sã o normalizãm.
Pasul 3. Am decis sã lãsãm asistentul sã decidã normalizarea.
Pasul 4. Am primit o sugestie de „spargere“ a tabelei iniþiale, cu care am fost de
acord. În plus am hotãrât redenumirea tabelelor noi prin butonul Rename.
Pasul 5. Asistentul asociazã o cheie unicã
fiecãrei tabele numind-o ID de tip
Autonumber.
Pasul 6. Urmãtoarea acþiune a asistentului ne
farmecã de tot. Se creeazã o nouã
tabelã (de fapt un fiºier Query), care
„arat㓠ca ºi tabela iniþialã, astfel încât
rapoartele sau formularele pe care le-am realizat pe baza tabelei sursã sã nu
fie reproiectate. Tabela iniþialã primeºte alt nume, dar nu se ºterge.

Observaþi existenþa tuturor câmpurilor din tabela iniþialã ºi, în plus, coloana nouã
Lookup to Far (este referinþa cãtre tabela FAR).
Analyze Table Wizard ne ajutã sã compunem o nouã structurã!
Normalizarea folosind Table Analyzer Wizard.
Sã presupunem cã elevii pot avea mai multe hobby-uri ºi pot
desfãºura mai multe activitãþi sportive. Fie tabela PERS, ce conþine
câmpurile elev, hobby, sporturi.

elev hobby sporturi


Popa muzica atletism
Popa muzica tenis
Luca foto atletism
Mircea film tenis
Mircea muzica tenis

Rezolvare
Într-o situaþie ca aceasta analizatorul nu oferã nicio soluþie ºi atunci putem decide noi
normalizarea, dar tot cu sprijinul asistentului.

"
Pasul 1. Ne hotãrâm sã ne luãm soarta în mâini!
Pasul 2. Selectãm câmpurile care au valori duplicat. Ele vor forma o altã tabelã. În cazul
nostru – Hobby ºi Sporturi.
Fiecare câmp este „agãþat“ ºi „tras“ cãtre exteriorul ferestrei. Automat se creeazã
o nouã tabelã.
Pasul 3. Denumim tabela.
Pasul 4. Decidem cheia tabelei. Ne este mai comod sã folosim cheia generatã automat de
asistent.
Pasul 5. Pentru cã tabela iniþialã nu a fost sursa unui raport sau unei interogãri nu vom
decide construirea tabelei Query.
Pasul 6. Salvãm.
Pasul 7. Pentru a vedea noua structurã vom deschide fereastra Relationship, ca în capturã!

Problema 6.1. Fie urmãtoarea tabelã care reþine stocurile de medicamente din mai multe
farmacii din Moldova. Analizaþi ºi normalizaþi manual.

Problema 6.2. Folosiþi Table Analyzer Wizard pentru a verifica dacã normalizarea voastrã
a fost la fel cu cea datã de asistent.
Problema 6.3*. Se dau imagini ale tabelelor obþinute prin acþiunea Analizorului asupra
unei tabele „pierdute“ printr-o manevrã defectuoasã. Puteþi sã o reconstruiþi? Aflaþi care este
tabela sursã a acþiunii Table Analyzer Wizard din problema anterioarã.

"
Problema 6.4*. Cum normalizaþi tabela? Cod_elev reprezintã numãrul curent în clasã.
Clasa Cod_elev nume_elev adresa Diriginte
12a 1 Avram Iasi Popa
12a 2 Barbu Iasi Popa
12b 1 Gagea Iasi Ionescu

Problema 6.5*. Fie tabela urmãtoare ce conþine numele cursurilor, profesorii, numãrul
de ore pentru aceste cursuri, precum ºi numele elevilor care au optat pentru cursuri.
Cum ar putea arãta baza de date normalizatã?
nume_curs nume_prof nume_elev nr_ore grad
Astrologie popa Albu 100 prof.def
Astrologie popa Barbu 100 prof.gr.1
Meteorologie florea Doltu 200 lector

Problema 6.6. Normalizaþi urmãtoarea relaþie cu situaþia închirierii, de cãtre diferiþi


clienþi, a sãlilor dintr-un complex sportiv.
client nume_sala taxa
Popa biliard 1200
Ion minigolf 2000
Gaby tenis 3000
Popa cafenea 1200

Problema 6.7. Evidenþa cazãrilor turiºtilor în hotelurile unei staþiuni este tabela TURIST.
Credeþi cã este corectã?
turist BI hotel taxa/loc
apopei eduard as123456 lido 1200
dorneanu mihai gf345675 lido 1200
enache sorin bv512345 parc 1400

Problema 6.8. Fie un tabel care evidenþiazã situaþia stocurilor pe depozite. Normalizaþi!
depozit material furnizor Stoc
d1 suruburi Astra 10
d1 suruburi Zalau 20
d2 carcase Metalcar 19
"!
Lecþia
7 Interogarea
bazei de date Access
ü Ce sunt interogãrile? Cum se proiecteazã o interogare în limbajul QBE?
ü Interogãri de selecþie a informaþiilor, interogãri ºi totalizatoare
ü Interogãri de acþiune

Sub numele de interogare sau cerere sunt referite acele solicitãri de date
specificate de utilizator în mod direct, fãrã indicarea modului de obþinere. O interogare
este o modalitate de selecþie ºi combinare a datelor provenind din una sau mai
multe surse care sã serveascã la realizarea rapoartelor, formularelor, coloanelor de
cãutare etc.
O interogare va fi reþinutã într-un fiºier de cereri ºi, la execuþie, va determina
obþinerea unui set dinamic de date numit Dynaset. Orice modificare a datelor în
tabelele sursã conduce la modificarea rezultatului (a Dynaset-ului). De asemenea,
orice modificare în Dynaset conduce la modificãri în tabelele sursã. Seturile de date
dinamice obþinute la execuþia interogãrii nu se memoreazã ca atare, ci se genereazã
automat la lansarea interogãrii. Spunem cã rezultatul interogãrii este un fiºier virtual
de date.
Tipuri de interogãri:
• simple – de selecþie – select query;
• pentru actualizare – delete query, update query ºi append query;
• încruciºate sau bidimensionale (numite crosstab query).
Interogãrile se pot crea interactiv prin intermediul ferestrei QBE (Query By
Exemple), prin folosirea Query Wizard, sau prin scrierea unor comenzii SQL.
Paºii definirii unei interogãri prin fereastra QBE sunt:
1. deschiderea ferestrei QBE;
2. specificarea surselor de date (tabele sau alte interogãri);
3. precizarea câmpurilor care vor forma coloanele rezultatului sau care vor fi
folosite la selecþia articolelor;
4. precizarea cheilor de ordonare/grupare;
5. precizarea condiþiei de selecþie a articolelor;
6. rularea (lansarea în execuþie).
Mediul de lucru
Urmãtoarele butoane sunt mai des folosite în proiectarea interogãrilor:

Datasheet view Afiºeazã setul de date dinamic

Design view Trece în fereastra de proiectare

Run Lanseazã în execuþie interogarea

""
Meniul Query – asociat operaþiilor cu interogãri.
→ Lansarea în execuþie
→ Vizualizarea tabelei
→ ªtergerea tabelei
→ Interogare de selecþie
→ Interogare încruciºatã
→ Interogare tabelarã
→ Interogare de actualitate
→ Interogare de adãugare
→ Interogare de ºtergere
→ Alte comezi SQL
→ Definirea parametrilor
Fereastra QBE
Fereastra de proiectare a unei interogãri are douã pãrþi:
prima, în partea de sus, prezintã sursele de date, tabelele ºi
relaþiile dintre ele. A douã parte conþine o grilã pe care se
precizeazã coloanele ce vor forma rezultatul ºi criteriile pe
baza cãrora este definitã interogarea.
Fereastra Show Table
Definirea surselor de date se face prin intermediul ferestrei
Show Table care apare automat la crearea unei noi interogãri
sau o putem deschide oricând pe parcursul lucrului, folosind
meniul contextual sau meniul principal Query→ShowTable.
Fereastra de proprietãþi
Se deschide prin meniul principal cu Query→Properties
ºi pemite fixarea unor proprietãþi pentru întreaga interogare.
– Output all fields: pe Yes va introduce în rezultat
toate câmpurile tabelelor/interogãrilor;
– Top value: returneazã primele n sau n% articole;
– Unique value: returneazã articolele unice;
– Run Permission: interogarea ruleazã numai cu drepturile proprietarului;
– Source Database: numele bazei de date folosite ca sursã a interogãrii;
– Filter: permite plasarea unui filtru pe rezultatul interogãrii dacã în modul
Datasheet folosim Records→Filter by Form/ by Selection/Advanced Filter.

Proiectarea interogãrilor de selecþie –


Select Query
Interogãrile de selecþie sunt cele mai folosite
dintre toate formele de interogare pentru cã oferã
posibilitatea extragerii informaþiilor din una sau
mai multe tabele.
Fie baza de date SCOALA cu tabela ELEVI.
Dorim sã obþinem „lista elevilor din clasa 12a“.
Pasul 1. Vom deschide fereastra de proiectare
a interogãrii prin butonul Query ºi New
din fereastra Database.

"#
Pasul 2. Pentru început vom alege modul de proiectare Query Design. Se va
deschide fereastra de proiectare Select Query.
Pasul 3. Vom deschide tabela ELEVI prin fereastra Show Table.
Pasul 4. Pentru indicarea faptului cã toate câmpurile din tabela ELEVI vor constitui
ieºire din interogare, ne poziþionãm pe prima linie a tabelei (unde este
asterisc *) ºi executãm drag&drop la prima coloanã, pe linia Fields.
Pasul 5. Vom executa drag&drop pe câmpul clasa pentru introducerea condiþiei de
filtrare. O altã cale de a introduce în grila rezultat un câmp este deschiderea
listei de câmpuri prin click pe linia Fields.
Pasul 6. Specificãm valoarea selecþiei. În cazul nostru plasãm valoarea “12a” pe
linia Criteria a coloanei clasa.
Pasul 7. Vom lansa în execuþie prin butonul Run. O altã posibilitate de vizualizare
a setului de date dinamic obþinut este prin butonul Datasheet View. Putem
reveni în proiectare prin butonul Design.
Pasul 8. Vom salva, observând aranjarea interogãrii în fereastra Database/
subfereastra Query.

Operatori în selecþie
– Operatorul AND
aplicat la nivel de câmp ºi
între câmpuri:
Exemplu: selecþia
elevilor din clasa “12a” care au media cuprinsã între 8 ºi 10.
Condiþiile impuse câmpurilor clasa ºi media sunt pe aceeaºi linie.
– Operatorul OR aplicat la acelaºi câmp:
Obþinem toþi elevii din clasa “12a”
sau “12c”.
Termenii expresiei logice unite
prin operatorul OR sunt plasaþi în
aceeaºi coloanã, dar pe rânduri
diferite.
– Operatorul OR
aplicat la câmpuri diferite:
Obþinem elevii care
sunt din clasa “12a” sau
au media 10.
Observaþi plasarea
condiþiei pe rânduri diferite!
– Folosirea mãºtilor pentru selectarea unei submulþimi
de valori:
Se poate preciza un ºablon care conþine caracterele
de substituire „*“, pentru înlocuirea unui grup de caractere
ºi „?“, pentru înlocuirea unui singur caracter, cel de pe
poziþia indicatã în ºablon.
Exemplu: obþinem numele elevilor care au prima liter㠄A“ sau „a“.
Cuvântul Like este automat asociat de sistem atunci când folosim ºablonul de
selecþie.

"$
– Condiþiile IS NULL ºi IS NOT NULL:
Dacã dorim sã selectãm
articole care au valori vide într-o
coloanã, vom folosi condiþia IS
NULL. De exemplu, pentru ca sã
obþinem elevii care nu au com-
pletatã media, vom trece condiþia
IS NULL pe coloana media.
– Folosirea numelui de câmp
drept operator:
Obþinem elevii care au înregis-
tratã greºit data naºterii. Observaþi
încadrarea numelui de câmp între
paranteze pãtrate ºi funcþia sistem
date().

Proiectarea interogãrilor cu parametri


Dacã dorim ca filtrul aplicat asupra datelor sã fie variabil vom introduce numele
variabilei între paranteze pãtrate, vom deschide fereastra de definire a parametrilor
din meniul Query→Parameters ºi vom preciza numele ºi tipul variabilelor folosite
drept parametru. Pentru o interogare de felul: „care sunt elevii clasei... Cls?“, unde
Cls este o variabilã ce va reþine numele clasei primit din exterior la rularea interogãrii,
ecranul de proiectare aratã astfel:

Folosirea câmpurilor calculate


Uneori se doreºte ca printre coloanele rezultat al interogãrii sã fie ºi expresii obþinute
din câmpurile tabelelor sursã. Pentru aceasta se introduce formula de calcul ºi se
precizeazã numele coloanei. Atenþie! numele coloanei trebuie urmat de douã puncte.

Folosirea funcþiilor Access


Funcþiile Access pot in-
tra în componenþa expresiilor,
ca în orice alt limbaj. Sunt

"%
peste 160 de funcþii standard. De exemplu, Year (<data>) extrage anul din data
calendaristicã datã ca parametru.

Vizualizarea comenzii SELECT SQL


Pentru a vedea comanda SELECT generatã de sistem se foloseºte butonul SQL
View sau meniul contextual din care alegem comanda SQL View.
Exemplu: comanda generatã prin proiectul anterior care foloseºte câmpuri calculate:
Select elevi.nume, elevi.absm, elevi.absn, [absm]+[absn] as total
from ELEVI

Vizualizarea proprietãþilor câmpurilor ºi ale interogãrii


Proprietãþile câmpurilor stabilite odatã cu proiectarea structurii tabelei se
pãstreazã, dar pot fi asociate altele pentru cazul folosirii interogãrii la rapoarte sau
formulare. Pentru fiecare câmp rezultat al interogãrii se pot stabili anumite proprietãþi
prin meniul contextual Properties, cum ar fi:
a. Description: pentru descrierea câmpului pe maxim 255 caractere;
b. Format: pentru specificarea modului de afiºare a coloanei;
c. Decimal Places: pentru fixarea numãrului de zecimale;
d. Display Control: pentru asocierea unui anumit controler câmpului, astfel încât
la proiectarea tuturor formularelor bazate pe aceastã sursã sã fie utilizat acelaºi
obiect de control.
e. Caption: pentru schimbarea numelui câmpului la afiºarea sa pe datasheet sau
pe formular.

Proiectarea interogãrilor de sortare


Putem folosi interogarea de selecþie pentru indicarea mai multor câmpuri drept
chei de sortare. Ordinea acestor câmpuri dã prioritatea cheilor.
De exemplu, dorim elevii ordonaþi pe clase, în cadrul clasei ordonaþi descrescãtor
dupã medii, iar la aceeaºi medie ordonaþi alfabetic. Vom proceda astfel:
1. Deschidem fereastra de proiectare pentru o nouã interogare din ecranul
Database→Query→New ºi includem tabela ELEVI.
2. Plasãm primul câmp, clasa, indicând la linia Sort opþiunea Ascending.
3. Plasãm a doua coloanã media, indicând la linia Sort opþiunea Descending.
4. Plasãm pe a treia coloanã câmpul nume, indicând la linia sort opþiunea
Ascending.

Limitarea numãrului de articole


Exemplu: dorim sã aflãm primii 10 elevi cu mediile cele mai mari din ºcoalã.
Pentru aceasta vom folosi o interogare de selecþie. Vom specifica pentru coloana

"&
media sortarea descrescãtoare ºi, din fereastra
de proprietãþi pentru interogare, vom fixa la 10
linia Top Value.

Proiectarea interogãrilor totalizatoare


În multe situaþii este necesarã gruparea
articolelor pentru a obþine anumite valori statistice. Se pot folosi funcþiile:
COUNT() numãrã înregistrãrile grupului
SUM(…) însumeazã valorile pentru grup
AVG(...) calculeazã media valorilor articolelor din grup
MIN(…) extrage valoarea minimã a expresiei din grup
MAX(…) extrage valoarea maximã din grup
STDEV(..) calculeazã abaterea standard
VAR(..) calculeazã dispersia

Cum realizãm o interogare totalizatoare?


Exemplu: dorim sã calculãm numãrul de elevi din fiecare clasã ºi valoarea
medie a absenþelor nemotivate.
1. Deschidem fereastra de proiectare pentru o nouã interogare din ecranul
Database→Query→New;
2. Adãugãm tabela ELEVI prin Show Table în fereastra Query;
3. Activãm opþiunea Total din meniul View→Totals;
4. Plasãm pe prima coloanã câmpul clasa prin drag&drop ºi fixãm acest câmp
drept criteriu de grupare;
5. Trecem pe coloana a doua câmpul absn ºi alegem funcþia sum din lista deschisã
pe linia Total;
6. Pentru a putea numãra codurile distincte din fiecare clasã alegem funcþia COUNT
pentru câmpul cod;
7. Plasãm câmpul media ºi funcþia AVG;
8. Pentru titlul coloanelor folosim alt identificator din fereastra de proprietãþi, deschisã
cu View→Properties. Numele coloanelor vor fi trecute în Caption;
10. Rezultatul interogãrii:

11. Fereastra de proiectare:

"'
Proiectarea interogãrilor încruciºate – de tip Crosstab
O încruciºare este rezultatul unei interogãri speciale care permite analizarea relaþiei
dintre un câmp al tabelei de date ºi alt câmp al aceluiaºi tabel. De exemplu, pentru
tabela ELEVI vrem sã aflãm numãrul de elevi, cu aceeaºi medie, din fiecare clasã.

Proiectarea interogãrii prin folosirea utilitarului Crosstab Query:


1. Apelãm generatorul prin fereastra Database→Query→New;
2. În fereastra de proiectare selectãm tabela sursã ELEVI;
3. Alegem forma interogãrii prin meniul Query→Crosstab Query. Se observã în
fereastrã linia Crosstab;
4. Plasãm pe prima coloanã câmpul clasa care va fi folosit pentru linii. Din lista
Crosstab alegem RowHeading, iar pe linia Total trecem Group By;
5. Plasãm câmpul media folosit pentru coloanele interogãrii ºi alegem din lista
Crosstab opþiunea Column Heading. Pe linia Total trecem Group By;
6. Plasãm câmpul cod, folosit drept conþinut al matricei, pentru care vom alege pe
linia Crosstab opþiunea Value, iar pe linia Total trecem funcþia Count.
ObservaþI fereastra de proiectare:

Proiectarea interogãrilor de ºtergere – Delete Query


Cu ajutorul interogãrilor putem obþine seturi de date care pot fi supuse operaþiei
de ºtergere. De exemplu, dorim sã ºtergem toþi elevii clasei “12a”. Pentru a defini
operaþia se procedeazã astfel:
1. Apelãm generatorul de interogãri din fereastra
Database→Query→New;
2. Selectãm tabela sursã ELEVI;
3. Alegem din meniul Query→Delete Query.
Observãm linia Delete.
4. Prin drag&drop completãm câmpurile care vor fi folosite fie la identificarea
articolelor, fie la filtrarea lor. În cazul nostru vom completa prima coloanã din
interogare cu Clasa ºi vom impune pe linia criteria condiþia =“12a”. Observãm
pe linia Delete opþiunea Where completatã deja.
5. Vizualizãm setul de date dinamic care va fi ºters prin butonul Datasheet View;
6. Dacã suntem de acord lansãm comanda Run.

#
Proiectarea interogãrilor de corecþie – Update Query
Corecþia mai multor articole care verificã o anumitã condiþie cu aceeaºi valoare
se poate face printr-o interogare de tip Update.
De exemplu, dorim modificarea clasei tuturor elevilor promovaþi de la “11b” la
“12b”. Vom proceda astfel:
1. Apleãm generatorul de interogãri din fereastra
Database→ Query→ New→ Design View;
2. Selectãm tabela sursã ELEVI prin comanda
Show table;
3. Executãm comanda Query→Update pentru
tipul interogãrii. Observaþi adãugarea liniei Update To;
4. În fereastra de proiectare vom trece câmpul care suferã modificarea: clasa la
valoarea “12b”;
5. Pentru cã filtrul se aplicã pe acelaºi câmp, vom completa aici criteriul de selecþie
clasa=“11b”;
6. Previzualizãm articolele care
vor suporta corecþia, prin
butonul View;
7. Dacã dorim sã vizualizãm ºi
alte câmpuri, pe lângã cele
care vor suferi corecþii, este necesar sã se execute drag&drop pe acele câmpuri
ºi sã se treacã numele acestora între paranteze pãtrate pe linia Update To;

Proiectarea interogãrilor pentru adãugare – Append Query


În vederea adãugãrii unui set de articole dintr-o tabelã în altã tabelã, se poate
folosi o interogare care va selecta datele ce trebuie adãugate ºi le va trimite în
câmpurile tabelei destinaþie.
De exemplu, din tabela ELEVI dorim sã copiem numele elevilor cãminiºti în
tabela CAMINISTI, creatã deja.
1. Apelãm generatorul de interogãri din fereastra Database→ Query→ New→ Design
View; vom selecta tabela sursã ELEVI, prin comanda Show Table;
2. Selectãm câmpurile elevilor transferaþi sau cele care folosesc la filtrare: nume
elev ºi caminist;
3. Punem condiþia de filtrare Caminist=Yes;
4. Alegem forma interogãrii din meniul Query→Append Query;
5. Observãm linia Append To în
fereastra de proiectare a interogãrii;
6. Indicãm tabela destinaþie
CAMINISTI;
7. Precizãm pe linia Append nu-
mele câmpului destinaþie
(numai în cazul în care nu are
acelaºi nume).

#
Proiectarea interogãrilor de tip Make Table
O interogare de tip Make realizeazã o nouã tabelã cu date provenind din una
sau mai multe tabele sau din altã interogare.
De exemplu, dorim sã copiem elevii de la informaticã sau cei care sunt în clasa
a 12-a în tabela ELEVDIR.
Pentru a crea o interogare de tip Make Table se deschide Query Designer ºi se
selecteazã opþiunea Query→Make Table din meniul principal.

Se deschid tabelele CLASE ºi ELEVI ºi se fixeazã coloanele care permit selecþia


articolelor.
De asemenea, se precizeazã coloanele care vor alcãtui structura noii tabele.
Putem redenumi un câmp printr-o construcþie de forma <noul nume>:<vechiul nume>.
Putem vedea noua tabelã, înainte de a fi creatã, trecând în modul Datasheet View.
Tabela este staticã, deci orice modificare a datelor din tabelele sursã nu se
reflectã automat. Trebuie rulatã din nou interogarea pentru actualizarea acesteia. La
reluarea execuþiei datele se vor suprascrie peste vechile valori în acelaºi tabel!

Proiectarea interogãrilor simple prin


Query Wizard
Ne propunem sã construim o
interogare pentru aflarea numãrului de
ore pe care îl are fiecare clasã ºi a
numãrului de discipline, folosind
Query Wizard.
Vom folosi tabelele CLASE (cls,
diriginte)→(1,n)→OBIECTE (cls,
obiect, prof, nr_ore).
Pasul 1. Din fereastra New Query →
Simple Query Wizard
specificãm tabelele sursã. În
cazul nostru vom lua din CLASE doar codul clasei ºi
din OBIECTE numãrul de ore.
Pasul 2. Specificãm operaþia de însumare a numãrului de ore
ºi de numãrare a articolelor
pentru aceeaºi valoare a
clasei.
Pasul 3. Salvãm. Observaþie: numele
coloanelor totalizatoare este
automat creat în funcþie de
operaþia efectuatã. Schim-
#
barea acestor denumiri se face deschizând interogarea în modul Design ºi
modificând linia Field.

Realizarea interogãrilor încruciºate prin folosirea asistentului Crosstab Wizard


Ne propunem sã aflãm numãrul de elevi din fiecare clasã cu aceeaºi medie.
Apelãm utilitarul pentru generarea interogãrii Database→ Query→ New→
Crosstab Wizard.
Pasul 1. Alegem tabela care va constitui
sursa de date, în cazul nostru
tabela ELEVI. Putem selecta ºi o
interogare realizatã anterior numai
dacã am selectat butonul radio
Query;
Pasul 2. Alegem câmpul clasa ale cãrui
valori vor reprezenta liniile
rezultatului.
Pasul 3. Alegem câmpul media ale
cãrui valori vor constitui coloa-
nele interogãrii.
Pasul 4. Precizãm funcþia care se calculeazã la intersecþia liniei cu coloana (count);
vom numãra elevii dintr-o clasã care au o anumitã medie (4, de exemplu).
Se previzualizeazã forma interogãrii în partea de jos a ferestrei. Putem
inversa câmpurile, astfel
încât sã avem pe linii
mediile ºi pe coloane
clasele.
Pasul 5. Se atribuie un
nume interogãrii ºi se salveazã. Se poate intra în fereastra de proiectare
pentru a schimba atributele coloanelor.

Proiectarea interogãrilor pentru gãsirea duplicatelor


cu Find Duplicates Query Wizard
Ne propunem sã gãsim toþi elevii care sunt nãscuþi în aceeºi datã.
Pasul 1. Selectãm New Query→Find Duplicates. Introducem numele tabelei sursã.
Pasul 2. Selectãm câmpul dupã care dorim cãutarea valorilor identice (în cazul
nostru data_nastere).
Pasul 3. Selectãm celelalte câmpuri care vor fi afiºate la interogare. De exemplu,
numele elevului, clasa, adresa.

#!
Pasul 4. În final, putem schimba numele interogãrii ºi putem decide în ce mod va
afiºa interogarea (View = afiºare în modul Datasheet, Modify = afiºare în
modul Design).
Interesantã este forma interogãrii creatã de Wizard:

Proiectarea interogãrilor de cãutare a înregistrãrilor fãrã corespondent,


prin Find Unmatched Query Wizard
Ne propunem sã aflãm pentru care clasã/clase nu au fost (încã) introduse
informaþii despre elevi. Vom folosi tabelele CLASE (cls,diriginte) →1-n→ ELEVI (cls,
nume),
Pasul 1. Vom deschide fereastra de
proiectare a unei noi interogãri
prin Query→New → Find
Unmatched Query Wizard ºi vom
specifica numele tabelei
„pãrinte”.
Pasul 2. Se solicitã numele tabelei
„copil”.
Pasul 3. Trebuie indicate câmpurile
corespondente din cele
douã tabele.

Pasul 4. Trebuie specificatã sursa de


date ºi câmpurile care se vor
afiºa.
Pasul 5. Salvãm.
Observaþi proiectul interogãrii
realizate de Wizard pentru gãsirea
„claselor fãrã elevi“.
Observaþi comanda SELECT
scrisã de utilitar:
Select clase.cls from clase
left join ELEVI on
clase.cls=elevi.clasa
where ((elevi.clasa) Is null)

#"
Proiectarea unei interogãri pentru câmpul de tip Autonumber astfel
încât valoarea sa iniþialã sã fie diferitã de 1!
Sã presupunem cã existã o tabelã CONTRACTE unde numãrul contractului
începe de la valoarea 1001, cu pasul 1. Câmpul este cheie ºi este de tip
Autonumber. Pentru a iniþializa valoarea de start la câmpul Autonumber se procedeazã astfel:
1. Se creeazã structura tabelei CONTRACTE – cu toate câmpurile. Vom specifica tipul
Autonumber pentru câmpul nr_contr.
2. Se creeazã o tabelã de manevrã cu un singur câmp
de tip numeric, cu numele cod.
3. Se adaugã un singur articol având în câmpul cod
valoarea de start (în cazul nostru 10001).
4. Se creeazã o interogare de tip Append pentru tabela
manevrã, astfel:
a. se deschide fereastra de proiectare pentru o nouã
interogare (Database→ Queries→ New→ Design
View);
b. se precizeazã în fereastra Show Table numele
MANEVRA ºi se apasã butonul Add;
c. se executã drag&drop de la câmpul cod din tabela
MANEVRA la zona Fields de precizare a
coloanelor rezultat;
d. se deschide meniul Query ºi se alege opþiunea
Append Query;
e. se precizeazã numele tabelei care va primi
rezultatul interogãrii, tabela CONTRACTE;
f. se plaseazã pe linia Append To numele câmpului
nr_contr;
g. se închide interogarea (ºi se salveazã cu numele
Pune-primul-cod);
h. se lanseazã în execuþie (butonul Open);
i. trebuie rãspuns cu atenþie la mesajele sistem
legate de operaþie:
De fiecare datã când se va executa interogarea
se va adãuga un nou articol cu acest cod; deci va fi corect pentru prima datã, dar
incorect pentru eventualele reluãri ale interogãrii de adãugare. De aceea este necesar
sã fie ºtearsã interogarea de pe disc prin butonul delete ºi, desigur, tabela MANEVRA.
j. se vizualizeazã tabela CONTRACTE prin butonul Open.

Problema 7.1. Deschideþi baza de date SCOALA. Verificaþi sã existe tabelele ELEVI
(cod_elev, clasa, nume, media, data_nasterii, absente_nemotivate, absente_motivate) CLASE
(cod-clasa, diriginte, profil), OBIECTE (cod_obiect, clasa, nume, cod_profesor), PROFESORI
(cod_profesor, nume, specialitate).

Obþineþi interogãrile urmãtoare prin Query Design Folosiþi...


1. „lista elevilor din clasa 12a“ Select query
2. care sunt elevii din clasa “12a” care au media cuprinsã între Criterii de
8 ºi 10 selecþie;
operator and

##
3. elevii din clasa “12a” sau “12c” Criterii de selecþie;
operator or
4. elevii care sunt din clasa “12a” sau au media 10 Criterii de selecþie;
operator or
5. numele elevilor care au prima liter㠄A“ sau „a“ Mãºti de selecþie;
operator like
6. elevii care nu au completatã media Criterii de selecþie;
valori vide:
funcþia ISNULL
7. elevii care au înregistratã greºit data naºterii (presupunem Criterii de selecþie;
cã vârsta unui elev poate fi de maxim 18 ani!) folosirea numelui
de cãmp drept
operator; funcþia
DATE
8. care sunt elevii clasei... Cls?“ Interogãri cu
parametri
9. care este clasa elevului... numeX? Interogãri cu
parametri
10. afiºaþi numãrul total de absenþe al fiecãrui elev Câmpuri calculate
(motivate + nemotivte)
11. care este vârsta fiecãrui elev? Funcþii YEAR, NOW
12. elevii pe clase, în cadrul clasei – descrescãtor dupã medii Introgãri de sortare
ºi la aceeaºi medie – alfabetic
13. primii 10 elevi ordonaþi dupã medie (din tabela ELEVI) Interogãri sortare cu
limitare valori
14. calculaþi numãrul de elevi din fiecare clasã ºi valoarea Interogãri
medie a absenþelor nemotivate totalizatoare
15. din tabela ELEVI am dori numãrul de elevi din fiecare Interogãri
clasã pe medii încruciºate
16. ºtergeþi toþi elevii clasei „12a“ Delete query
17. modificaþi clasa tuturor elevilor promovaþi de la „11b“ la „12b“. Update query
18. copiaþi numele elevilor cãminiºti din tabela ELEVI Append query
în tabela CAMINISTI (creatã deja)
19. copiaþi elevii de la informaticã sau pe cei care sunt în clasa Make Table
a 12-a în tabela ELEVDIR. Presupunem cã profilul fiecãrei
clase se gãseºte în tabela CLASA relaþionatã cu ELEVI

Problema 7.2. Scrieþi numele funcþiei pentru obþinerea valorilor statistice din coloana a
doua.

Funcþia Efect
numãrã înregistrãrile grupului
însumeazã valorile pentru grup
calculeazã media valorilor articolelor din grup
extrage valoarea minimã a expresiei din grup
extrage valoarea maximã din grup

#$
Problema 7.3. Presupunem cã în tabela CLASE au fost înregistrate informaþii despre
unele clase (nu neapãrat toate). De asemenea, în tabela ELEVI sunt incluºi elevii unor
clase care se regãsesc în tabela CLASE sau nu. Proiectaþi relaþia între tabelele CLASE
ºi ELEVI.
Proiectaþi interogãrile urmãtoare, cu date din mai multe tabele, în Query Design:

1. Afiºaþi informaþii numai despre clasele care au introduse Asociere Inner Join
date despre elevii lor.
2. Obþineþi toate clasele ºi, eventual, elevii lor. Asociere Left Join
3. Obþineþi toþi elevii ºi, eventual, date despre diriginþi ºi Asociere Right Join
profilul clasei lor (dacã aceste informaþii au fost înregistrate).
4. Obþineþi pentru fiecare elev numele dirigintelui ºi profilul clasei
(se vor selecta doar elevii care nu sunt orfani) Inner join

Problema 7.3. Proiectaþi interogãrile urmãtoare prin Query Wizard:

a. Afiºaþi numãrul total de ore pe care îl are fiecare clasã ºi


numãrul disciplinelor. Simple query
b. Afiºaþi numele elevilor nãscuþi în aceeºi zi. Find Duplicates Query
c. Aflaþi pentru care clasã/clase nu au fost (încã) introduse Find Unmatched
informaþii despre elevi. Query
d. Afiºaþi numãrul de elevi pe clase ºi pe medii. Crosstab query

*Problema 7.4.
a. Deschideþi baza de date BIBLIOTECA. Actualizaþi datele astfel încât sã cuprindã tabelele
CARTI (nr_inventar, titlu, autor, pret, numar_exemplare, editia, editura, data_intrare,
data_iesire, este_manual?, stare), CITITORI (cod, nume, data_nasterii, ocupatia), OPERATII
(cod_carte, cod_cititor, data_imprumut, data_restituire). Presupunem cã ocupatia poate avea
valorile „elev“, „student“, „prof“, „alte_ocup“, iar câmpul stare poate avea valorile „f buna“,
„buna“, „veche“, „deteriorat“, „pierdut“.
b. Proiectaþi interogãri pentru a da rãspunsuri la urmãtoarele întrebãri:
1. Care sunt cãrþile existente (autor, preþ, numãr de exemplare) al cãror nume începe cu
„informatica“?
2. Care sunt cãrþile din colecþia „SF“?
3. Ce cãrþi din colecþia „SF“ au preþul cuprins între 100.000 ºi 200.000 de lei?
4. Ce cãrþi au fost scoase din inventar dupã 1999?
5. Care sunt titlurile cãrþilor intrate în bibliotecã în intervalul x-y?
6. Ce cãrþile ale lui M.Eminescu sunt în bibliotecã? Sau ce cãrþi de poezii sau poeme?
7. Sunt cãrþi la care nu s-a completat numele autorului. Care sunt acestea?
8. Dorim sã selectãm cãrþile care se referã la
programare. De exemplu: Arta programãrii,
Programe C++, Tehnici de programare etc.
9. Care sunt cãrþile din colecþia „Info“ ordonate
cronologic dupã data intrãrii în bibliotecã?
10. Care sunt cãrþile autorului X?
11. Care este preþul pe paginã, calculat la fiecare carte
a autorului X, în ordinea descrescãtoare a acestor valori?
12. Care a fost durata de staþionare a cãrþilor? Se va calcula în ani ºi se va afiºa în ordinea
cescãtoare a acestei durate.
13. Care sunt cititorii elevi înscriºi la bibliotecã?
14. Lista cãrþilor cele mai scumpe din fiecare colecþie?
15. Câþi cititori sunt elevi?

#%
16. Afiºaþi toate operaþiile de împrumut (cu sau fãrã restituire) cu data, numele cititorului ºi
numele cãrþii.
17. Determinaþi împrumuturile care nu au fost returnate.
18. Afiºaþi numãrul de zile între data împrumutului ºi data restituirii.
19. Puteþi determina situaþiile în care numãrul de zile întârziere este >14?
20. Afiºaþi cititorii care nu au înapoiat cãrþile împrumutate. Pentru carte se va folosi o
singurã coloanã, cu titlul ºi autorul acesteia.
21. Care sunt cititorii restanþieri la data curentã? Pentru fiecare cititor se va afiºa numele,
numele cãrþii nerestituite, precum ºi data când a fost împrumutatã. Restanþieri se
considerã cei pentru care numãrul de zile de la data împrumutului depãºeºte 14. Calculaþi
penalizarea pentru întârziere, presupunând cã nu se cer mai mult de 200 de lei/zi
întârziere.
22. Cartea X se gãseºte pe raft sau este la un cititor? Care cititor?
23. Câte cãrþi sunt în bibliotecã, ordonate pe edituri ºi pe colecþii?
24. Câte manuale sunt în biblioteca?
25. Numãrul de manuale pe edituri.
26. Care sunt editurile care au publicat manuale scolare?
27. Care sunt cãrþile împrumutate de cititorul X?
28. Cine a citit cartea X?
29. Care sunt cãrþile împrumutate în ziua X? De cine au fost împrumutate?
30. Cine ºi când a împrumutat cãrþi ale lui Mihai Eminescu?
31. Care sunt cãrþile împrumutate în luna iunie anul curent (numele cititorului ºi numele
cãrþilor)?
32. Situaþia numãrului de cãrþi împrumutate pe luni ºi cititori.
33. Afiºaþi cititorii înscriºi care nu au împrumutat nicio carte sau care au împrumutat, dar
nu în acest an.
34. Numãrul cititorilor pe ocupaþii.
35. Evidenþa tuturor operaþiilor ordonate dupã data împrumutului, fiecare operaþie cuprinzând
numele cititorului ºi titlul cãrþii.
36. Numãrul cãrþilor intrate ºi numãrul cãrþilor scoase din inventar, ordonat pe ani. De
exemplu, între 1999 ºi 2003.
37. Valoarea totalã a cãrþilor din bibliotecã.
38. Afiºaþi ca subset de date restanþele fiecãrui cititor.
39. Afiºaþi toþi cititorii elevi înscriºi la bibliotecã, ordonatþi dupã clasã, cu mesajul dacã au
sau nu restanþe!
40. Afiºaþi cele mai scumpe cãrþi (primele 10!) existente în bibliotecã.
41. Sunt cãrþi pierdute care trebuie scoase din evidenþã. Pentru acestea se foloseºte câmpul
stare. Treceþi în altã evidenþã cãrþile deteriorate ºi, apoi, ºtergeþi-le din tabela CARTI.
42. Scoateþi din evidenþã cãrþile autorului X!
43. Pentru toate cãrþile apãrute în bibliotecã înainte de anul 1990 majoraþi preþul cu 0,1%.
44. Editura „Albatros“ ºi-a schimbat numele în „Pinguin“ la 1 septembrie 1992. Se cere
introducerea acestei modificãri pentru toate cãrþile publicate anterior redenumirii.
45. Mutaþi în altã evidenþã manualele ºcolare. Apoi reconstruiþi tabela CARTI.
46. Sã presupunem cã în baza de date FARMACII (existentã) dorim o nouã tabelã cu
aceeaºi structurã ca a tabelului CITITORI. Tabela nouã o vom numi PERSOANE. Cum
putem face? Putem copia doar structura sau articolele?
47. Numele autorului „G.B.SHAW“ a fost scris greºit sub forma „G.B.SOU“ sau „g.b.sou”.
Efectuaþi corecþia!
48. Modificaþi preþul cãrþii „Poezii“ de Mihai Eminescu, apãrutã la Editura „Pinguin”, de la
preþul de 2.000 la 200.000 lei.

#&
*Lecþia
8 Elemente de programare
în SQL–Access
ü Comanda de selecþie SELECT
ü Comenzile de actualizare INSERT, UPDATE, DELETE
ü Comanda de creare a tabelelor CREATE TABLE

Interogãrile – ca modalitate comodã de obþinere ºi actualizare a informaþiilor


dintr-o bazã de date de cãtre utilizatori, nu neaparat programatori – pot fi proiectate
în mod vizual prin instrumentele Design/ Buider/ Wizard. Dar nu toate cererile de
informaþii pot fi astfel descrise. Pentru solicitãri mai complicate putem folosi limbajul
SQL. Vom prezenta câteva comenzi utile operaþiilor de interogare ºi actualizare a
datelor. Editarea acestor comenzi se face în fereastra SQL View operabilã dupã ce
am intrat în proiectarea unei interogãri prin Query Design.

8.1. Instrucþiunea SELECT


Consideratã cea mai importantã ºi mai folositã instrucþiune SQL, SELECT permite
specificarea datelor care vor constitui ieºirea din interogare, precum ºi sursa acestora.
SELECT [domeniu] [*]/[<coloane>] FROM [<tabele>]
[WHERE<exp>][GROUP BY<lista_chei>][HAVING<exp>]
[ORDER <exp>]
Clauza SELECT precizeazã coloanele care vor forma rezultatul. Clauza domeniu
poate conþine: All – specificã faptul cã toate articolele vor forma rezultatul; Distinct – se
vor elimina din rezultat articolele duplicat create pe baza listei de coloane specifi-
cate; Distinctrow – va elimina din rezultat toate dublurile pe baza tuturor coloanelor
din tabele.
Asteriscul (*) indicã faptul cã vor fi incluse toate câmpurile tabelelor sursã
precizate în clauza FROM.
Clauza coloanele poate conþine câmpuri aparþinând tabelelor definite în clauza
FROM, constante, funcþii sau expresii cu acestea. Coloanele pot primi un alt nume,
prin clauza AS. Pot fi utilizate funcþii cum sunt: AVG(<exp>) calculeazã media
aritmeticã, COUNT(<art selectat>) numãrã selecþiile, SUM(<art-selectat>) calculeazã
suma, MIN(<art-selectat>), MAX(<art-selectat>) determinã extremul.
Clauza FROM specificã lista fiºierelor de intrare în prelucrare. Ca ºi în cazul
expresiilor, se pot stabili aliasuri pentru tabele în clauza AS.
Exemplu: Fie baza de date SCOALA cu tabelele ELEVI (cod, nume, cls, med,
absn, absm) ºi CLASE (cls, profil, diriginte)
Numele tuturor elevilor select nume from elevi
Numele claselor (distincte!) din select distinct cls as cod_clasa from elevi
ºcoalã folosind tabela Elevi
Tot conþinutul fiºierului ELEVI select * from elevi
Media generalã a elevilor select avg(med) as med_gen from elevi
* Temã suplimentarã

#'
Numãrul elevilor din ºcoalã Select count(*) as nr_elevi from ELEVI
Numãrul claselor din ºcoalã Select count(distinct cls) from ELEVI
Diriginþii claselor Select diriginte,cls, profil from CLASE
Numãrul elevilor ºi cea mai Select count(*) as numar-elevi, min([media])
micã medie as media_minima from ELEVI
Clauza WHERE permite introducerea filtrelor ºi a legãturilor între tabele.
Exemple:
Care sunt elevii cu medii între select nume, med from ELEVI where med between
8 ºi 10 din toate clasele 8 and 10 and cls Like “12*”
a 12-a.
Care sunt diriginþii claselor Select diriginte, cls from CLASE where
de informaticã? profil=”informatica”
Care sunt elevii cu media 10? Select elevi.nume, elevi.cls, clase.profil from
De la ce clase ºi de la ce ELEVI, CLASE where elevi.cls=clase.cls and
profil sunt ei? elevi.med=10
Care sunt elevii dirigintelui X? Select elevi.nume, from ELEVI, CLASE where
clase.cls=elevi.cls and clase.diriginte=x
Clauza GROUP BY permite gruparea rezultatelor.
Exemplu:
Care sunt elevii cu media 10 Select elevi.cls, clase.diriginte elevi.nume
pentru fiecare clasã (precum from ELEVI, CLASE; where elevi.cls=clase.cls
ºi numele diriginþilor lor)? and elevi.med=10 group by cls
Clauza HAVING fixeazã restricþii de afiºare a grupului.
Exemplu:
Sã se calculeze numãrul Select elevi.cls, count(*) from ELEVI, CLASE
elevilor pe clase, dar numai where elevi.cls=clase.cls; group by cls having
de la profilul “info”. clase.profil=”info”
Clauza ORDER BY specificã expresia de ordonare ºi sensul ordonãrii.
Exemple:
Lista claselor pe profiluri. Select * from clase Order by profil
Lista alfabeticã a elevilor Select elevi.nume from ELEVI, CLASE where
dirigintelui “Popa”. elevi.cls=clase.cls and clase.diriginte=”Popa”
order by elevi.nume asc

Folosirea parametrilor
Dacã expresia de filtrare conþine un ºir între paranteze pãtrate, Access considerã
cã este vorba de un parametru ºi, la execuþie, va solicita introducerea valorii sale.
De exemplu, comanda pentru obþinerea elevilor unei clase oarecare datã de utilizator
este:
Select elevi.nume_elev, elevi.media, elevi.clasa
from ELEVI
where (((elevi.clasa)=[cod-clasa]))
order by elevi.media DESC;

$
Asocieri între tabele
1. O modalitate prin care se specificã legãtura dintre douã tabele a fost deja
folosit㠖 clauza WHERE. În principal sintaxa pentru o asociere, numai de tip
Inner Join, este:
SELECT lista-coloane from lista-tabele
WHERE tabela1.coloana1=tabela2.coloana2
2. O altã posibilitate de definire a asocierilor este prin clauza FROM. Avantajul
folosirii acestei clauze pentru asocieri este datã ºi de posibilitatea referirii la
toate cele 3 tipuri de asociere Inner, Left ºi Right Join.
SELECT <lista-coloane> FROM (<tabela1>
[INNER/LEFT/RIGHT] JOIN <tabela2> ON <conditia1>)
WHERE<conditie>
Exemple:
Toþi elevii de la profilul Select elevi.nume from CLASE inner join elevi
“informatic㔠on clase.cls=elevi.cls
WHERE clase.profil= ”informatica”
Toate liniile tabelei CLASE ºi Select clase.cls, clase.profil, elevi.nume from
elevii acestor clase CLASE left join elevi on clase.cls=elevi.cls
Toþi elevii ºi diriginþii lor chiar Select clase.cls, clase.profil, elevi.nume from
dacã nu au corespondent CLASE right join elevi on clase.cls=elevi.cls
în tabela ELEVI
3. Asocieri multiple. Atunci când sunt mai multe tabele putem realiza asocierile
între acestea prin urmãtoarea formã a comenzii SELECT:
Select <coloane> FROM (<tabela1>
[<tip>] JOIN <tabela2> ON <conditia1>)
[<tip>] JOIN <tabela3> ON <conditia2>)
[<tip>] JOIN <tabela4>…)
WHERE<conditie>
Exemplu: Fie tabelele SCOLI (codscoala, nume, adresa), CLASE (codscoala,
codclasa, profil) ELEVI (cod, codclasa, nume, media). Dorim sã obþinem pentru
toate ºcolile din Iaºi lista cu numele elevilor ºi cu profilul la care sunt înscriºi.
SELECT scoli.nume, clase.profil, elevi.nume
From ((scoli inner join clase on scoli.codscoala=clase.codscoala)
Inner join elevi on clase.codclasa=elevi.codclasa)
Where ((scoli.adresa) like “*IASI*”)

Interogãri de tip Union


Interogãrile de tip Union sunt de fapt reuniuni ale rezultatelor obþinute prin mai
multe interogãri. De obicei, coloanele rezultate din fiecare interogare care participã
la reuniune sunt aceleaºi ca nume, numãr, tip. De exemplu, avem într-o tabelã elevii
„vechi“ ai ºcolii ºi în alta elevii admiºi la examenul de admitere. Structura celor douã

$
tabele poate sã coincidã în ceea ce priveºte doar câmpurile nume, data_naºterii,
adresa. Dorim o interogare care sã returneze toþi elevii mai vechi sau mai noi care
stau în Iaºi.
Select nume, adresa, data_nasterii from ELEVI
UNION
Select nume, adresa, data_nasterii from ADMITERE

Subinterogãri
De regulã, o interogare poate fi inclusã în altã interogare, fie în clauza WHERE,
fie în clauza SELECT. De exemplu, dorim sã testãm dacã în ºcoalã sunt elevi care
au avut drept medie de admitere o valoare mai micã decât ultima medie de anul
acesta. Fie tabelele urmãtoare: ELEVI (nume ºi prenume, adresa, media...) ºi
ADMITERE (nume_elev,adresa, media...).
Select elevi.[nume si prenume], elevi.media
from ELEVI
where (((elevi.media)<(select min(media) from admitere)));

8.2. Comanda INSERT


Permite adãugarea articolelor dintr-o tabelã la sfârºitul altei tabele. Face apel la
instrucþiunea SELECT, care va identifica liniile ºi coloanele care se transferã. O altã
formã a comenzii permite adãugarea unei singure înregistrãri în tabelã ºi completarea
acesteia cu date:
INSERT INTO <tabela> <instructiune-SELECT>/VALUE<valori>
Exemple:
Sã se adauge elevul Ionescu Insert into ELEVI(nume_elev, clasa, media)
Mircea din clasa “9a” cu values (“ionescu Mircea”, „ 9a”, 9.75)
media 9,75 în tabela ELEVI.
Sã se adauge în tabela Insert into ELEVIMAN (nume_elev,clasa,media)
ELEVIMAN toþi elevii cãminiºti Select elevi.nume_elev,elevi.clasa, elevi.media
din tabela ELEVI. from ELEVI where elevi.caminist=YES;

8.3. Comanda DELETE


Permite ºtergerea din tabela specificatã a articolelor care îndeplinesc anumite
condiþii date în clauza Where:
DELETE FROM <nume-tabela> WHERE <cond>
Exemplu: ªtergerea elevilor din clasa “9a”:
Delete from ELEVI where cls=”9a”

$
8.4. Comanda UPDATE
Permite actualizarea valorilor dintr-o tabelã.
UPDATE <tabela> SET <camp>=<exp>,...WHERE <cond>
Exemple:
• Modificarea clasei elevului “Popescu” la valoarea “9f”:
Update ELEVI set clasa=”9f” where nume_elev=”Popescu”
• Situaþia elevilor de la profilul “informatica” care nu mai stau la cãmin:
Update CLASE inner join ELEVI
on clase.clasa=elevi.clasa
set caminist=NO
where (clase.profil=”informatica”);

8.5. Comanda CREATE TABLE


Permite definirea structurii tabelelor fãrã ieºirea dintr-o aplicaþie ºi intervenþie
directã în ferestrele de proiectare. Formatul simplificat al comenzii este:
CREATE TABLE <fis.dbf> (<lista campuri>)
Exemplu:
Create table PERSOANE (cod N(2),nume C(30),adresa M,data_nastere D);

Problema 8.1. Fie baza de date SCOALA cu tabelele CLASE (cls, profil, diriginte). ELEVI
(cod, nume, cls, med, absn, absm). Scrieþi comenzi SQL.

Sarcini suport pentru noile cunoºtinþe Folosiþi...


1. Afiºaþi numele tuturor elevilor. Select
2. Afiºaþi numele claselor (distincte!) din ºcoalã folosind Select distinct
tabela ELEVI.
3. Afiºaþi tot conþinutul fiºierului ELEVI. Select *
4. Afiºaþi media generalã a elevilor. Avg
5. Afiºaþi numãrul elevilor din ºcoalã. Count(*)
6. Afiºaþi numãrul claselor din ºcoalã. Count(distinct)
7. Afiºaþi diriginþii claselor. Select
8. Afiºaþi numãrul elevilor si media cea mai mare. Max
9. Afiºaþi elevii cu medii între 8 ºi 10 din toate clasele a 12-a. Where; Between
10. Afiºaþi diriginþii claselor de informaticã. Where
11. Afiºaþi elevii cu media 10, precum ºi profilul cãruia aparþin. Where
12. Afiºaþi care sunt elevii dirigintelui X. Where
13. Afiºaþi elevii cu media 10 pentru fiecare clasã, precum ºi Where group
numele diriginþilor.

$!
14. Sã se calculeze numãrul elevilor pe clase dar numai de la Group having
profilul „info“.
15. Afiºaþi lista claselor pe profiluri ºi, în cadrul fiecãrui profil, Order
ordonaþi crescãtor dupã codul clasei.
16. Afiºaþi lista alfabeticã a elevilor dirigintelui „Popa“. Order
17. Afiºaþi toþi elevii de la profilul „informaticã“. Select;Where
Inner Join
18. Afiºaþi toate liniile tabelei CLASE ºi elevii acestor clase. Left Join
19. Afiºaþi toþi elevii ºi diriginþii lor chiar dacã nu au corespondent Right Join
în tabela ELEVI.
20. Afiºaþi lista elevilor unei clase oarecare datã de utilizator. Folosirea
parametrilor
21. Sã se adauge elevul Ionescu Mircea din clasa „9a“ cu media Insert Value
9,75 în tabela ELEVI.
22. Sã se adauge elevii cãminiºti în tabela ELEVIMAN existentã. Insert Select
23. Sã se ºterargã elevii din clasa „9a“. Delete
24. Sã se modifice clasa elevului „Popescu“ la valoarea “9f”. Update
25. Toþi elevii de la profilul „informatica“ nu mai stau la cãmin. Update
Sã se efectueze modificarea în baza de date.
26. Existã o tabelã ADMISI, cu elevii reuºiþi la examenul de Select union
admitere în ºcoalã, care are aceeaºi structurã cu a tabelei
ELEVI. Sã se obþinã toþi elevii!
27. Fie tabelele SCOLI (codscoala, nume, adresa), CLASE Select; asocieri
(codscoala, codclasa, profil) ELEVI (cod, codclasa, nume, multiple
media). Dorim sã obþinem pentru toate ºcolile din „Iaºi“ lista cu
numele elevilor ºi cu profilul la care sunt înscriºi.
28. Fie tabelele ELEVI (cu elevii liceului) ºi ADMISI (cu noii elevii Select
reuºiþi anul acesta la liceu). Fiecare tabelã are coloana Media cu subinterogãri
(de admitere!). Aflaþi dacã sunt elevi în ºcoalã care au avut
drept medie de admitere o valoare mai micã decât ultima
medie de anul acesta.
29. Aflaþi primii 10 elevi din tabela ELEVI cu cele mai mari medii. Select top 10

Problema 8.2* Rezolvaþi prin comenzi SQL sarcinile de la laboratorul 6.


Problema 8.3* Presupunem cã profesorii propun diferite cursuri opþionale la care elevii
se pot înscrie. Un elev poate sã se înscrie la cel mult 3 cursuri. Un profesor poate sã
propunã oricâte cursuri.
Presupunem cã baza de date este alcãtuitã din tabelele PROFESORI (cod_prof, nume,
specialitatea, grad_didactic...), OPTIONALE (Cod_prof, cod_obiect, nume_obiect, numar_ore),
INSCRIERI (ID, cod_elev, cod_obiect), ELEVI (cod_elev, nume, clasa...).
Construiþi interogãrile urmãtoare:
1. Care sunt elevii care s-au înscris ºi la ce cursuri?
2. Ce elevi nu ºi-au ales (încã!) obiectul opþional?
3. Care profesor nu a propus niciun obiect opþional?
4. La ce profesori ºi la ce cursuri nu s-a înscris niciun elev?
5. Dorim sã afiºam un mesaj pentru fiecare profesor dacã are sau nu vreun curs opþional
propus.

$"
6. Presupunem cã se pun note la fiecare opþional. Dacã media obþinutã la toate opþionalele
este mai micã decât 5 se considerã elevul „nepromovat“. Proiectaþi o tabelã MEDII (cod_elev,
cod_obiect, media) ºi o interogare prin care obþinem media generalã pentru fiecare elev.
7. Care este numãrul de elevi care s-au înscris la fiecare curs?
8. Care este lista cursurilor profesorului X?
9. Afiºaþi situaþia înscrierilor pentru clasa X: numele fiecãrui elev ºi cursurile sale.
10. Afiºaþi o situaþie centralizatã pentru totalul elevilor, din care sã rezulte numãrul de elevi
înscriºi la 0,1,2,3 sau mai multe cursuri.
Problema 8.4. ªtiind cã încã din anul 1990 se þine evidenþa participanþilor la faza naþionalã
a olimpiadelor pentru toate disciplinele de concurs (matematicã, limba românã, limba englezã
etc.), determinaþi:
1. La ce olimpiade au obþinut premii reprezentanþii judeþului X? În ce ani?
2. Care sunt participanþii din Iaºi la olimpiada de matematicã, anul curent?
3. Care este judeþul cu cele mai multe premii 1 în anul x ºi la ce olimpiade s-au obþinut
aceste premii?
4. Lista participanþilor la internaþionala de informaticã din anul trecut.
5. Existã vreun judeþ care nu a obþinut niciun premiu anul acesta?
6. De câte ori s-a luat premiul X în judeþul Y?
7. Calculaþi numãrul de premii (1/2/3) pe fiecare judeþ, în anul 2000.
8. Realizaþi o interogare care sã afiºeze pentru fiecare judeþ, corespunzãtor fiecãrui an,
numãrul total de premii 1, premii 2 sau premii 3, ºtiind cã tipul premiului este dat ca
parametru.

Întrebãri recapitulative
1. Ce este o interogare ºi cum se poate realiza ea?
2. Care sunt tipurile de interogãri?
3. De ce este important sã specificãm tipul uniunii (join) dintre tabele, într-o interogare?
4. Ce este o interogare cu parametri ºi prin ce diferã ea de o interogare de selecþie fãrã
parametri?
5. Care sunt interogãrile de acþiune?
6. Când se folosesc interogãri încruciºate?
7. Care sunt clauzele comenzii SELECT dacã dorim calcularea numãrului total de absenþe
pentru fiecare clasã a 9-a ºi dispunem de o tabelã cu date despre elevi (nume, clasã, numãr
de absenþe)

$#
Lecþia
9 Obþinerea informaþiilor din
baza de date sub forma
rapoartelor
ü Rapoarte. Generatorul de rapoarte Report Designer
ü Etichete. Generatorul de etichete Label Designer
ü Grafice. Utilitarul GENGRAPH

9.1. Rapoarte
Rapoartele sau situaþiile finale constituie o modalitate de valorificare a conþinutului
informaþional al bazei de date, servind ca instrument de cunoaºtere a aspectelor
pozitive (ºi negative) dintr-o situaþie pentru care au fost culese date, transportate,
verificate ºi depozitate într-o bazã de date. Þinând seama de aceste aspecte, raportul
apare ca un instrument al cunoaºterii, care conþine o cantitate mare de informaþii
selectate, prelucrate ºi sistematizate dupã anumite reguli de prezentare, în
concordanþã cu cerinþele de informare ale utilizatorilor.
Editarea unui raport presupune o anumitã succesiune de operaþii:
1. Definirea conþinutului informaþional al raportului (se stabilesc datele care vor
compune raportul, fiºierele care le conþin, denumirea ºi ordinea câmpurilor din structura
unei înregistrãri, din liniile raportului). Principalele categorii de informaþii sunt:
– datele propriu-zise ale raportului;
– indicatori totalizaþi pe diverse nivele de centralizare;
– capul de tabel;
– titlul raportului;
– datele sau nivelele de grupare ºi totalizare;
– informaþii centralizatoare de sfârºit de raport/paginã.
2. Colectarea datelor care compun raportul (operaþii de selecþie, interclasare,
ordonare, ventilare a datelor care vor compune raportul).
3. Efectuarea calculelor matematice (dacã este cazul, pentru rapoartele care
conþin indicatori, aceºtia vor fi calculaþi ºi memoraþi în câmpuri ale interogãrilor).
4. Definirea machetei raportului este o operaþie complexã de definire a formei de
prezentare ºi explicitare a informaþiilor într-un cadru limitat (pagina sau ecranul),
þinând seama de cerinþele utilizatorilor.
Realizarea rapoartelor se poate face prin intermediul unui asistent Wizard sau
prin utilitarul Report Designer.

Mediul de lucru
1. Fereastra Fields – permite afiºarea tuturor câmpurilor din tabelã sau interogarea
sursã pentru ataºarea rapidã a acestora la obiectul TextBox.
Manevra necesarã este selectarea câmpului din lista deschisã în fereastra Fields
ºi executarea operaþiei drag&drop la locul dorit în raport.
2. Fereastra de sortare ºi grupare – se deschide prin meniul View ºi permite
introducerea câmpurilor folosite pentru gruparea ºi ordonarea articolelor în
raport.
$$
3. Fereastra de proprietãþi, ataºatã fiecãrui obiect, permite fixarea sau schimbarea
proprietãþilor acestuia.

4. Fereastra de proiectare – conþine benzi de lucru pe


care sunt aranjate obiectele de control.
Report header – cuprinde informaþii afiºate o singurã datã
la începutul raportului.
Page header – cuprinde informaþii afiºate la începutul
fiecãrei pagini a raportului.
Detail – informaþiile propriu-zise ale raportului, preluate din
tabela de date sau din interogarea indicatã drept sursã
de date pentru raport.
Page footer – cuprinde informaþii afiºate la fiecare sfârºit
de paginã. În ideea cã un raport are mai multe pagini,
se va trece numãrul paginii, data, eventual alte mesaje.
Report footer – cuprinde informaþii afiºate la terminarea
raportului.
În plus, dacã este un raport cu grupe de informaþii, se
pot folosi benzile:
Group header – cuprinde informaþii afiºate la fiecare început de grup.
Group footer – cuprinde informaþii afiºate la terminarea unui grup.
Realizarea unui raport se poate face folosind asistentul Report Wizard sau
Report Designer. Pasul cel mai important este definirea datelor sursã. Dacã datele
provin din mai multe tabele sau dacã trebuie sã fie filtrate, ordonate, respectiv sã
conþinã anumite expresii calculate, atunci este necesarã crearea unei interogãri.

$%
Proiectarea rapoartelor cu Report Wizard
Report Wizard este folosit pentru rapoarte simple, caz în care asistentul va cere
doar fiºierele ºi câmpurile pe care dorim sã le folosim. Sunt mai multe forme de
rapoarte pe care le putem realiza cu instrumentul Wizard: rapoarte simple, pe baza
unui singur fiºier, sau rapoarte cu date din mai multe fiºiere legate dintr-o bazã de
date, rapoarte tip etichetã sau chiar rapoarte de tip grafic. Asistentul Report Wizard
se apeleazã prin fereastra Database→ Report→ New→ Report Wizard.

Ne propunem sã afiºãm elevii cu numele, media ºi


absenþele motivate, ordonaþi pe clase, iar la final, sã calculãm
media aritmeticã a elevilor fiecãrei clase, respectiv totalul
absenþelor.
Pasul 1. Apelãm asistentul Report Wizard din Database Window→ Report→ New→
Report Wizard.
Pasul 2. Precizãm numele sursei de date. Se deschide tabela ºi se selecteazã
câmpurile care vor forma raportul. Dacã sunt tabele legate atunci acestea
se deschid pe rând ºi se selecteazã câmpurile dorite. De obicei, legãtura
fixatã între tabele se menþine.
Dacã nu suntem siguri de
aceasta vom deschide fereas-
tra Tools→ Relationship ºi vom
vizualiza/edita legãtura dintre
tabelele noastre.
Pasul 3. Se fixeazã câmpurile de grupare. În cazul nostru vom alege câmpul clasa.
Pasul 4. Se fixeazã câmpurile de odonare, pentru fiecare clasã; dorim aranjarea
elevilor dupã medii, iar la medii egale ordonaþi alfabetic;
Pasul 5. La terminarea raportului pentru o clasã dorim media clasei ºi numãrul
total de absenþe, iar la terminarea raportului dorim aceiaºi indicatori pentru
toatã ºcoala. Vom fixa în fereastra de dialog Summary Options aceste
calcule. Este important sã examinãm modalitatea de afiºare: toate
articolele ºi tota-
lul (opþiunea De-
tail and sum-
mary) sau numai
banda de totali-
zare (oþiunea
Summary Only).
Pasul 6. Ne alegem forma raportului din formele prestabilite ale asistentului.
Pentru fiecare format putem observa fereastra
de previzualizare în colþul stânga sus.
Pasul 7. Ne alegem un stil din cele standard oferite;
Pasul 8. Ultima fereastrã permite alegerea formei de
finalizare; astfel, raportul poate fi previzualizat
pe ecran (Preview), se poate da un titlu (Enter
a title for your report), se poate salva pentru o
folosire ulterioarã (Save report for later use),
se salveazã odatã cu afiºarea (Save and print

$&
report) sau se deschide fereastra de proiectare a raportului pentru a se
face unele corecþii.
Pasul 9. Putem previzualiza raportul prin butonul Preview.

Pasul 10. Putem realiza modificarea raportului prin butonul Design;


Putem modifica textele explicative, fontul, culorile, putem deplasa obiectele etc.
De fapt aceasta este o manierã rapidã de a proiecta rapoartele. Cu ajutorul asistentului
Wizard dãm doar o primã formã a raportului, pe care o ajustãm ºi o dezvoltãm
ulterior prin Designer.

Editarea rapoartelor cu Report Designer


Editorul de rapoarte permite ca utilizatorul sã defineascã el însuºi forma ºi
conþinutul raportului. Modalitatea de lucru o vom explica pe mãsurã ce rezolvãm o
problemã simplã.
Ne propunem, din motive didactice, proiectarea aceluiaºi raport pe care l-am realizat cu
Wizard în exemplul anterior: o situaþie a mediilor ºi a absenþelor elevilor pe clase.
Pasul 1. Din Database Window vom apela editorul de rapoarte cu
Report→New→Design View. Vom deschide tabela ELEVI.
Atenþie! În fereastra de dialog pentru crearea unui nou raport trebuie deschisã
tabela sau interogarea pe baza cãreia se realizeazã raportul.
Pasul 2. Vom deschide benzile de început ºi sfârºit raport ºi paginã din View→
Page Header/ Footer ºi View→Report
Header/ Footer;
Pasul 3. Vom deschide – dacã nu sunt deja
deschise – ferestrele Fields ºi Proper-
ties ºi bara cu obiecte de control
Toolbox;
Pasul 4. Deoarece dorim o listã a elevilor grupaþi
pe clase, vom deschide fereastra
Sorting and Grouping ºi vom selecta
din lista închisã Field/
Expression câmpul clasa,
dupã care se va face
gruparea.
Fixãm modul de sortare,
dupã aceastã cheie,
crescãtor, iar în secþiunea
proprietãþilor de grup
indicãm prezenþa unui antet
de grup (pe care vom trece
codul clasei) ºi a unui sfârºit
de grup (pe care vom
calcula media ºi totalul
absenþelor). Observãm cã
au fost adãugate benzile
corespunzãtoare în fereastra de proiectare a raportului.

$'
Pasul 5. Vom plasa pe banda Report heading titlul raportului: de exemplu, „Situaþia
mediilor ºi absenþelor pe clase“ prin apãsarea butonului Label ºi apoi
configurarea poziþiei ºi dimensiunii obiectului pe banda doritã. Putem
observa cã în fereastra de proprietãþi s-a fãcut atribuirea ºirului pentru
Caption. Vom schimba fontul, dimensiunea, culoarea etc.
Pasul 6. Vom scrie capul de tabel pe banda Page header prin butonul Label.
Chenarul l-am obþinut prin proprietatea Special Effects=Shadowed.
Pasul 7. Vom plasa numele clasei pe banda de antet de grup prin manevra
drag&drop, de la câmpul clasa din fereastra Fields pânã la banda de
grup.
Observãm cã, automat, câmpul este precedat de numele sãu (obiect
Label).
Pasul 8. Vom plasa obiecte Textbox pentru numele elevilor, media ºi numãrul de
absenþe pe banda Detail prin manevrele urmãtoare:
a) apãsãm butonul TextBox;
b) plasãm ºi dimensionãm obiectul cu ajutorul mouse-ului;
c) atribuim obiectului sursa de date prin proprietatea Control Source (un clic
de mouse pe aceastã linie va deschide o listã cu numele câmpurilor din
tabela sau interogarea sursã).
Pasul 9. Completãm banda de terminare a grupului clasa astfel:
a) vom plasa un obiect Label având textul (proprietatea Caption)=“Total
absente” ºi un obiect Textbox având asociatã o expresie. În proprietatea
Control Source apãsãm butonul pentru a deschide constructorul de
expresii. Expresia începe cu semnul =. Vom alege funcþia SUM ºi vom
trece ca parametru câmpul absn. Deci, proprietatea control
Source=sum([absn]).
Observaþie: nu uitaþi sã încadraþi câmpul între paranteze pãtrate!
b) vom plasa un obiect Label cu textul „media clasei“ ºi un textbox având
asociatã o expresie Control Source=avg ([media]).
Pasul 10. Vom completa banda Page Footer cu numãrul curent al paginii, selectând
domeniul Common Expressions din fereastra constructorului de expresii
(deschisã prin butonul de pe linia Control Source, asociat obiectului
Textbox pe care l-a creat anterior).
Pasul 11. Se stabilesc caracteristicile globale ale raportului prin intermediul ferestrei
de dialog File→Page Setup. Se poate preciza numãrul de coloane, distanþa
pânã la prima coloanã (Left Margins), lãþimea coloanelor (Width), ºi
distanþa dintre ele (Spacing).
Raportul poate fi structurat pe coloane sau pe linii prin butonul Column
Layout.
Pasul 12. Raportul se poate vizualiza anticipat prin meniul View→Preview.
Prin previzualizare se observã comportarea raportului pe setul de date.
Observaþi bara utilitarã asociatã. Se reîntoarce în modul de proiectare
prin View→Design sau prin închiderea ferestrei Preview. Se salveazã
prin <CTRL><W> sau prin meniul File→Save.

%
9.2. Etichete
O altã modalitate de afiºare a datelor este sub forma unor etichete (Labels).
Etichetele pot avea declaratã o dimensiune ca numãr de linii ºi coloane, pot fi
afiºate câte una sau mai multe pe lãþimea hârtiei.
Sã ne gândim la necesitatea scrierii unor etichete pentru medicamente, colete
poºtale, cãrþi de vizitã. Tot etichete pot fi „fluturaºii“ cu salariul fiecãrei persoane
dintr-o unitate sau cu informaþiile despre situaþia ºcolarã a fiecãrui elev trimisã de
diriginte.

SITUATIE SCOLARA SITUATIE SCOLARA


ELEV: Antom M. CLASA: 12a ELEV: Avram E. CLASA: 12a
ADRESA: Iasi, Str. Culturii, nr. 8 ADRESA: Iasi, str. Lunga nr. 897
MEDIA ANUALA; 9 MEDIA ANUALA; 8.99
a achitat taxa de 200 lei in fondul a achitat taxa de 450 lei in fondul
scolii scolii
Diriginte, Diriginte,

Aceastã formã specialã de raport poate fi proiectatã prin intermediul utilitarului


Label Designer. Utilitarul este asemãnãtor cu Report Designer, foloseºte aceleaºi
instrumente (meniu, fereastrã de proiectare, barã utilitarã). Singura diferenþã constã
în mãrimea paginii folosite: dacã Report Designer seteazã o paginã întreagã, Label
Designer îºi seteazã o mãrime potrivitã încadrãrii informaþiilor în etichetã.
Sã proiectãm etichetele pentru situaþia ºcolarã pe baza tabelei ELEVI.
Pasul 1. Se apeleazã din meniul sistem prin Database Window→ Report→ New→
Label Wizard ºi se deschide tabela sau interogarea sursã (în cazul nostru
deschidem tabela ELEVI). Asistentul deruleazã un numãr de ferestre de
dialog prin care se stabilesc forma ºi conþinutul etichetei.
Pasul 2. Se selecteazã forma etichetei dintre cele prestabilte.
Pasul 3. Selectarea fontului ºi culorii de scriere.
Pasul 4. Construirea machetei etichetei prin indicarea conþinutului (texte ºi câmpuri
din tabela selectatã).
Pasul 5. Ordonarea datelor; pentru previzualizare se foloseºte butonul Preview .
Pasul 6. Salvarea etichetei ºi/sau modificarea acesteia. Pentru corecþii se foloseºte
butonul Design .

%
9.3. Grafice
Un alt tip de raport, pe care îl putem realiza în mediul Windows prin intermediul
SGBDR Access ºi pe baza conþinutului tabelelor gestionate de acesta, este cel sub
formã graficã. Dacã o balanþã de plãþi a beneficiarilor se poate reprezenta sub forma
unui tabel, fiºele de cont ale clienþilor arat㠄bine“ realizate de Label Designer, un
raport privind situaþia vânzãrilor lunare pe magazine este mult mai sugestivã sub
forma unui grafic. Desigur, o histogramã se
poate realiza printr-un program de afiºare, dar
pentru mulþi este o activitate destul de dificilã.
Utilitarul care realizeazã grafice este Wizard
Graph apelat din Database→ Report→
New→Chart Wizard.
Ca ºi la celelalte programe de asistenþã,
parcurgând paºii indicaþi, se poate realiza un
grafic rapid plecând de la o tabelã sursã.
Exemplu: pentru fiºierul ELEVI (nume, clasa, media, ...) dorim un grafic al
variaþiei numãrului de elevi pe clase.
Pasul 1. Se realizeazã o interogare care
sã calculeze pentru fiecare
clasã numãrul de elevi.
Modalitatea de creare a
interogãrii nu o mai prezentãm.
Observaþi fereastra Query
Design. Salvãm interogarea
sub numele qrynrelevi.
Pasul 2. Se apeleazã utilitarul de
reprezentare a graficelor prin
Database→ Report→ New→
Chart Wizard ºi vom indica
sursa de date: interogarea qrynrelevi.
Pasul 3. Se selecteazã câmpurile pentru grafic.
Pasul 4. Se alege forma graficului din cele
prestabilite.
Pasul 5. Se vor indica valorile pentru axe. Asistentul
oferã o sugestie în ecranul de dialog.
Pasul 6. Se poate vizualiza graficul prin fereastra Preview.
Pasul 7. Se salveazã. Dacã aþi uitat sã daþi titlu graficului (implicit este numele sursei
de date), se poate intra în modul Design, unde, prin dublu clic pe titlu – sau
pe alt element al graficului – se selecteazã obiectul ºi, prin meniul contextual
(butonul drept al mouse-ului) se
poate ºterge sau edita.

Afiºarea la imprimantã a rapoartelor


Dupã ce raportul este proiectat se
verificã si apoi se poate scoate la
imprimantã. Fixarea încadrãrii în paginã, a
caracteristicilor de paginã se face prin
File→Page Setup.
%
Deschideþi baza de date SCOALA. Verificaþi sã existe – eventual completaþi – tabelele
CLASE (clasa, profil, cod_diriginte), PROFESORI (nume, specialitate, studii, stare_civilã,
adresa, salariu, telefon...etc.)
Problema 9.1. Afiºaþi datele despre profesori folosind Autoreport tabular ºi Report
Wizard.
Problema 9.2. Modificaþi raportul anterior pentru a avea o altã ordine a coloanelor ºi alt
titlu. Linia de sfârºit de paginã se „vede“ cu data ºi numãrul paginii scris în româneºte.
Atenþie! Folosiþi Page Setup ºi
fixaþi dimensiunea paginii astfel
încât dupã cei 6 profesori sã aparã
sfârºitul de paginã.
Problema 9.3. Afiºaþi profesorii
grupaþi pe nivel_studii folosind
Report Wizard. Pentru banda
de titlu încercaþi Special effects,
din meniul contextual.
Problema 9.4. Afiºaþi un
raport cu informaþii (date de
utilizator) despre obiectele ºi
profesorii unei clase. Folosiþi
Report Wizard cu mai multe
tabele.

Problema 9.5*. Realizaþi o listã a absenþelor elevilor pe clase: Folosiþi


Report Wizard
cu funcþii de
grup ºi însumare

Crearea unor
noi obiecte prin
copierea unora
existente

Folosirea Report
Designer pentru
„îmbunãtãþirea“
raportului

Inserarea unor
câmpuri
calculate pentru
total absenþe
si numãr curent
Proprietãþile
benzilor de grup
ºi însumare

%!
Problema 9.6. Realizaþi modificarea raportului anterior inserând Report Designer
o imagine în banda de titlu ºi numele ºcolii, respectiv pentru imagine,
corectând numele coloanelor ºi dimensionând corect chenare obiecte
liniile care încadreazã capul de tabel; scoateþi tip Label
chenarul de la sumele finale.
Problema 9.7. Realizaþi acelaºi raport al profesorilor ca în Report Designer
problema 9.2 folosind proiectarea pas cu pas. cu benzile de titlu,
detaliu ºi sfârºit
de paginã
Problema 9.8. Realizaþi acelaºi raport, al profesorilor grupaþi Report Designer cu
pe studii, ca în problema 9.3, folosind proiectarea pas benzile de grup
cu pas.
Problema 9.9. Realizaþi acelaºi raport, al absenþelor pe clase, Report Designer cu
ca în problema 9.6, folosind proiectarea pas cu pas. funcþii de însumare
Problema 9.10. Realizaþi urmãtorul raport:
SITUATIE SCOLARA SITUATIE SCOLARA
ELEV: Antom M. CLASA: 12a ELEV: Avram E. CLASA: 12a
ADRESA: Iasi, Str. Culturii, nr. 8 ADRESA: Iasi, str. Lunga nr. 897
MEDIA ANUALA; 9 MEDIA ANUALA; 8.99
Label Designer
a achitat taxa de 200 lei in fondul a achitat taxa de 450 lei in fondul
scolii scolii
Diriginte, Diriginte,

Problema 9.11. Realizaþi un grafic al variaþiei numãrului de


elevi ºi de clase pe ºcoli.

Wizard Chart

Problema 9.12. Deschideþi baza de date BIBLIOTECA.


1. Presupunem cã un manual are, pe lângã
titlu, un ºir “cls” urmat de numãrul cores-
punzãtor anului de studiu, ca în imaginea
urmãtoare. Afiºaþi situaþia manualelor ºcolare
pe clase, cu titlul lor, autorul, preþul ºi numãrul
de exemplare. Pentru fiecare manual se va
calcula valoarea stocului, iar pentru fiecare
clasã numãrul total (exemplare) de cãrþi ºi
totalul valoric.
2. Afiºaþi situaþia restanþierilor (cei care nu au returnat cartea împrumutatã!) ºi a penalitãþilor
la zi.

%"
Lecþia
10 Proiectarea
formularelor
ü Formulare Form Designer ºi Form Wizard
ü Proiectarea obiectelor de control

Interfaþa cu utilizatorul este una dintre cele mai importante pãrþi ale aplicaþiei
deoarece aceasta este prima ºi deseori singura pe care o va vedea utilizatorul.
Dacã este confuzã sau neclarã, utilizatorii nu au posibilitatea efectivã de a comunica
cu aplicaþia ºi nu pot accesa liber toate facilitãþile prevãzute. Un formular serveºte
la introducerea datelor, dar poate avea ºi un rol de meniu sau de prezentare generalã
a unor informaþii. Este un obiect de interfaþã de tip container cu peste 70 de proprietãþi
pe care se gãsesc obiectele grafice ale interfeþei cu utilizatorul (butoane, zone de
editare, liste deschise sau închise, imagini etc.).
Un formular are toate proprietãþile unei ferestre ºi poate fi în diferite stãri: Activ–
inactiv; focalizat-nu; disponibil-nu; ascuns-afiºat; minimizatã-maximizatã-normalã.
Fereastra activã este fereastra curentã cu care utilizatorul interacþioneazã la
momentul respectiv. O fereastrã activã se numeºte focalizatã atunci când toate
intrãrile de la tastaturã ale utilizatorului sunt direcþionate cãtre ea. Dacã fereastra
activã conþine alte obiecte de control atunci doar unul din acesta este focalizat.
Focalizarea altui obiect se face prin mouse, tasta tab, sãgeþi etc.
Evenimentele principale ale unui formular
1 Load Imediat dupã deschiderea formularului
2 Unload La închidere dar înainte sã fie ºters de pe ecran
3 Resize La modificarea dimensiunilor formularului
4 Activate/deactivate Când formularul devine activ/pierde focalizarea
5 Initialize Când formularul primeºte focalizarea (este reafiºat)
6 Lostfocus Când formularul urmeazã sã piardã focalizarea
7 Click/ Dblclick Când se apasã butonul mouse-ului pe o zonã a formularului
(neacoperitã)

Metode interne asociate unui formular


1 Refresh Conduce la reafiºarea formularului
2 Move Conduce la deplasarea formularului
3 Show Afiºare
4 Hide Ascunde formularul
5 Setfocus Mutã focus-ul cãtre un formular (dupã Show)

Cum ne referim la proprietãþile sau metodele unui formular sau obiect?


Pentru referirea la un formular sau obiect de pe formular se foloseºte construcþia
cu punct.
<nume formular> [. <obiect>]. <proprietate> =<valoare>
<nume formular>[.<obiect>] . <metoda> [<parametri>]

%#
Exemple:
Forms ! [frmelevi].refresh Indicãm o metodã pentru Formularul
frmelevi care permite reafiºarea
valorilor pentru toate obiectele acestuia.
Me.caption=”formular elevi” Fixare titlu pentru formularul curent
Me ! [txtnume].setfocus Predãm controlul obiectului textbox
din formularul curent.
Forms! [Elevi]![combo16].ControlSource=”clasa” Fixãm proprietatea ControlSource
pentru obiectul Combo16 de pe
formularul Elevi.

10.1. Tipuri de formulare


a. Formulare pentru vizualizarea, introducerea ºi editarea datelor – cel mai
des folosite. Pot folosi ca sursã date dintr-o singurã tabelã (formulare simple) sau
din douã tabele legate în relaþie 1-n (Formulare complexe (cu subformular)). Iatã,
de exemplu, un formular complex pentru culegerea, vizualizarea sau editarea datelor,
realizat cu asistentul Wizard în Access.

Este de fapt o fereastrã standard Windows. Pe ultima linie a ferestrei este


plasatã bara cu butoane pentru deplasarea în tabela de date. Conþinutul formularului
permite actualizarea/vizualizarea simultanã a douã tabele legate între ele: CLASE ºi
ELEVI. Pentru un articol din tabela „pãrinte” se afiºeazã în subformularul tip Grid
toate articolele existente cu aceeaºi cheie. Subformularul are ºi el posibilitãþile de
deplasare printre articole, precum ºi de adãugare, ºtergere etc.
b. Formulare numai pentru adãugare de noi înregistrãri. Nu este necesarã
deplasarea în fiºier, nici vizualizarea celorlalte articole, ci doar introducerea valorilor
care vor forma noile înregistrãri la salvarea lor. Proprietatea principalã este Data
Entry=NO.
c. Formulare Read Only – numai pentru vizualizarea mesajelor, imaginilor sau
a conþinutului unor înregistrãri, fãrã posibilitatea de a le corecta. Se folosesc
proprietãþile: Allow Edits=no; Allow Deletions=no; Allow Additions=no; Locked=yes,
Enabled=no, Tab Stop=no.
d. Formulare de comutare – conþin numai butoane care permit închiderea/
deschiderea altor formulare; prin acestea se controleazã acþiunile unui program
(funcþioneazã ca un meniu).

%$
10.2. Proiectarea unui formular folosind asistentul Form Wizard
Access dispune de un asistent pentru realizarea rapidã a formularelor cu aspect
profesionist. Un astfel de formular vã permite nu numai cãutarea ºi poziþionarea în
tabela de date, ci ºi actualizarea sa.
Asistentul Wizard creeazã douã tipuri de formulare, pentru editarea sau
interogarea datelor simple, bazate pe un singur tabel, ºi a celor complexe, bazate
pe douã tabele legate de obicei în relaþia 1-n.
Pasul 1. Se apeleazã FORM WIZARD prin fereastra Data-
base→ Form→ New→ Form Wizard.
Pasul 2. Se deschid tabelele ºi se selecteazã câmpurile
care vor forma macheta. Dacã tabelele sunt legate
se procedeazã astfel: se deschide tabela „pãrinte” ºi se
selecteazã câmpurile ei, apoi se deschide tabela „copil” ºi se
selecteazã câmpurile acesteia din urmã.
Pasul 3. Se alege aspectul machetei viitoare dintre formele prestabilite.
Urmãriþi în fereastra de sus previzualizarea formatului ales.
Pasul 4. Se denumeºte formularul; se poate executa imediat sau ulterior prin
butonul sau comanda Run. Se poate modifica intrând în modul Design
View.

10.3. Proiectarea formularelor prin Form Design


Pentru realizarea machetelor ecran utilizatorul are posibilitatea, întocmai ca pe
o tablã de scris, sã aranjeze textele, imaginile, liniile sau chenarele care se vor
afiºa, sã defineascã obiectele prin intermediul cãrora se vor introduce, afiºa sau
edita valorile unor câmpuri, sã introducã mesaje explicative etc.
Utilitarul de generare a formularelor dispune de urmãtoarele elemente de interfaþã:
1. Bara de butoane ToolBox pentru includerea obiectelor de control.
2. Fereastra de proiectare propriu-zisã (Form Designer) pe care se vor depune
obiectele de control. Un formular are fereastra de proiectare împãrþitã în mai
multe zone numite benzi de lucru.
– Form Header – antet de formular, va conþine informaþii comune tuturor
înregistrãrilor, imagini, casetã pentru alte operaþii cum ar fi imprimarea, filtrarea
etc.
– Page Header – antetul de paginã pentru acele formulare cu informaþii întinse
pe mai multe pagini;
– Detail – zona de vizualizare/editare pentru un singur articol din tabela/
interogarea sursã;
– Page Footer – subsolul paginii, conþine informaþii utile la terminarea fiecãrei
pagini, cel mai des un numãr de paginã;
– Form Footer – subsolul formularului, poate conþine informaþii centralizate.
3. Fereastra Fields – conþine numele câmpurilor din tabelã sau interogarea deschisã
la apelarea utilitarului. Se deschide prin View→Fields.

%%
4. Fereastra Properties – afiºeazã atât obiectele conþinute de machetã, cât ºi
proprietãþile ºi metodele acestora;
Proprietãþile uzuale pentru un formular sunt:
– Record Source – indicã numele tabelei sau al interogãrii care formeazã
sursa de date pentru formular;
– Allow Edits: =Yes – permite modificarea înregistrãrilor;
– Allow Deletions: =Yes – permite ºtergerea articolelor;
– Allow additions: =Yes – oferã posibilitatea adãugãrii de noi articole;
– Data Entry: =Yes – deschide automat o înregistrare nouã, fãrã date. Utilizatorul
nu are acces la celelalte articole, ci se adaugã doar unul singur, cel completat
în formular; =No – se permite editarea tuturor articolelor;
– RecordSet Type: =Dynaset – permite editarea datelor din obiectele vizuale
asociate câmpurilor ce provin din mai multe tabele; =Dynashot – nu permite
editarea câmpurilor;
– RecordLocks: =No – permite accesul mai multor utilizatori la date, în mod
simultan;
– Caption – afiºeazã textul pe bara de titlu a formularului.
– CloseButtons, Moveable, MaxMinButtons, ControlBox: =Yes – oferã
ferestrei proprietãþile de a putea fi închisã, mutatã, de a avea butoanele de
maximizare, minimizare ºi meniul standard din colþul din stânga sus.
– View Allowed: =Yes – permite vizualizarea datelor în modul Datasheet prin
butonul corespunzãtor atunci când suntem în Form View;
=No este util atunci când dorim sã nu se vadã datele în
modul Datasheet (asigurã consistenþã interfeþei);
– ScrollBars: = No – eliminã la formular barele de derulare;
– RecordSelectors: =No – eliminã bara verticalã cu triunghiul ce indicã
înregistrarea selectatã (cum un formular prezintã de obicei un singur articol,
nu este nevoie sã fie activat).
– Navigation buttons: =Yes – afiºeazã bara de navigare pe ultima linie a
formularului. Este util pentru deplasarea în fiºier.

%&
5. Meniul contextual la nivelul generatorul de machete:
→ permite selectarea constructorului de expresii, de macro-uri
sau de proceduri (cod)
→ permite fixarea ordinii de parcurgere a obiectelor pe formular
→ inserarea (lipirea) obiectului existent în Clipboard
→ deschide fereastra de selecþie a culorilor
→ afiºeazã sau nu rigla
→ afiºeazã sau nu caroiajul pentru proiectare
→ afiºeazã sau nu bara cu obiecte
→ deschide banda pentru antetul ºi subsolul paginii
→ deschide banda pentru antetul ºi subsolul paginii
→ deschide fereastra de proprietãþi

Paºi în proiectarea formularului


Pasul 1. Apelaþi generatorul de machete prin Database Window→ Form→ New→
Form Design.
Pasul 2. Deschideþi tabela, astfel încât toate câmpurile acesteia sã fie afiºate în
fereastra Fields.
Pasul 3. Deschideþi ferestrele de proprietãþi din View→Properties ºi bara de obiecte
View→Toolbox.
Pasul 4. Din lista Fields, poziþionaþi-vã pe fiecare câmp pe care doriþi sã-l aºezaþi
pe suprafaþa de lucru ºi executaþi drag&drop. Observaþi poziþionarea
automatã a douã obiecte de control: Textbox ºi Label. Eticheta Label are
numele câmpului, dar poate fi schimbatã. Pentru manevrarea distinctã a
celor douã obiecte asociate unui câmp, se selecteazã unul din ele ºi la
apariþia cursorului în formã de mânã, în colþul stânga sus, se poate separa
obiectul.
Pasul 5. Previzualizaþi forma machetei prin butonul View.
Pasul 6. Reveniþi în proiectare prin Design.
Pasul 7. Închideþi ºi salvaþi.

10.4. Obiecte de interfaþã pe un formular


Fiecare element de pe un formular este un obiect de control.
Operaþii generale cu obiectele de intefaþã:
• Selectarea obiectului se realizeazã prin clic cu mouse-ul poziþionat pe suprafaþa
obiectului.
• Selectarea mai multor obiecte se realizeazã prin activarea butonului select
de pe bara utilitarã ºi încadrarea zonei cu obiecte.
• Mutarea obiectului selectat se realizeazã prin drag&drop la noua poziþie sau
prin Clipboard cu operaþiile Edit→ Cut ºi Edit→ Paste.
• Copierea unui obiect se realizeazã prin intermediul Clipboard-ului prin operaþiile
Edit→Copy ºi Edit→Paste. Automat, copia are aceleaºi proprietãþi ºi metode ca ºi
originalul.
• Redimensionarea unui obiect selectat se obþine prin poziþionarea cursorului
pe o margine a obiectului pânã apare sãgeata dublã ºi apoi prin drag&drop la noua
dimensiune.

%'
• ªtergerea unui obiect selectat se realizeazã cu tasta
Delete.
• Dispunerea obiectelor pe formular se realizeazã
dupã dorinþa utilizatorului. Pentru o aranjare facilã suprafaþa
formularului este împãrþitã în pãtrate.
• Stabilirea ordinii obiectelor implicit, ordinea de
parcurgere a obiectelor este ordinea creãrii lor. Dupã
apãsarea butonului Tab Order fiecare obiect va avea ataºat
un numãr; schimbarea acestuia se face prin apãsarea
butonului mouse-ului pe obiecte, în ordinea doritã.
• Schimbarea fontului ºi culorii se realizeazã pentru
obiectele care afiºeazã text prin proprietãþile FontName ºi
FontSize. De asemenea, se pot seta caracteristicile de
îngroºare (FontBold), înclinare (FontItalic), subliniere
(FontUnderline). Pentru culoarea textului este folositã
proprietatea ForeColor, iar pentru specificarea culorii pe
care o va avea obiectul atunci când va fi dezafectat se
foloseºte proprietatea DisabledForeColor.
• Atribuirea unui nume obiectului se realizeazã
automat de cãtre sistem sau de cãtre proiectant, prin
proprietatea Name.
• Stabilirea poziþiei pe suprafaþa de lucru se
realizeazã automat prin acþiunea de plasare a obiectului
cu tehnica drag&drop pe suprafaþa formularului sau a
raportului. Proprietãþile sunt Top – poziþia faþã de marginea
de sus a ferestrei mamã, Left – poziþia faþã de marginea
din stânga, Width – lãþimea, Height – înãlþimea, AutoCenter – plasarea automatã
în centrul ecranului;
• Stabilirea titlului obiectului se realizeazã prin proprietatea Caption;
• Stabilirea modului de vizualizare a obiectului – Show, pentru vizualizarea
pe ecran, Hide, pentru ascunderea obiectului;
• Activarea/dezactivarea obiectului se realizeazã la diferite evenimente prin
metodele Activate sau Deactivate. De obicei, activarea se realizeazã prin plasarea
mouse-ului pe obiect ºi apãsarea butonului stâng. Activarea unui obiect înseamnã
dezactivarea celui precedent, pentru cã la un moment dat un singur obiect este
activ.

10.5. Tipuri de obiecte de control


1. Obiecte nelegate la o sursã de date: imagini, linii, chenare, etichete descrip-
tive, butoane care conduc operatorul cãtre alte ferestre sau aplicaþii.
2. Obiecte legate la o sursã de date: zone de editare, liste, butoane radio sau
comutatoare, cãrora le corespunde un câmp în tabela/interogarea sursã. Valoarea
editatã în obiect va fi plasatã în articolul curent, în coloana indicatã drept sursã
(proprietatea Control Source). Obiectul ataºat moºteneºte proprietãþile câmpului:
Caption, Input Mask, Format.

&
10.6. Proiectarea obiectelor de control pe formular
Ne propunem sã proiectãm pas cu pas un formular complex pentru culegerea
datelor despre clase ºi elevi, folosind diferite obiecte de control. Odatã cu folosirea
obiectului vom prezenta câteva proprietãþi mai importante.

A. Proiectarea textelor explicative = Obiecte tip Label


Obiectul de tip text explicativ se proiecteazã prin butonul Label. Astfel, în exemplul
nostru, deschidem banda Form Header pentru a introduce numele ºcolii printr-un
obiect tip Label.
Liceul de Informatic㠓Gr. Moisil” Iaºi
Proprietãþile uzuale ca Top, Left,
Width, Height se stabilesc automat la
plasarea obiectului ºi aranjarea în
fereastrã. Textul explicativ va fi o valoare
a proprietãþii Caption. Alinierea textului
în cadrul obiectului se face prin
alignment, care poate lua valorile: 0=la
stânga (implicit), 1=la dreapta, 2=centrat.
Pentru text sunt utile proprietãþile:
FontName, FontSize, FontBold,
FontItalic, FontUnderline etc. Culoarea
cernelii este datã de Forecolor ºi cea a
fundalului de Backcolor. O proprietate interesantã este Visible, care dã posibilitatea
ascunderii unui mesaj sau plasãrii în acelaºi loc a unor mesaje diferite.

B. Proiectarea câmpurilor de editare = Obiecte TextBox


Definirea unui obiect de acest tip se face prin butonul TextBox situat pe bara
utilitarã. Proprietãþile de amplasare ºi dimensionare sunt deja cunoscute. Câmpul de

&
editare trebuie sã permitã citirea
ºi/sau modificarea fie a unei
variabile, fie a unui câmp dintr-o
tabelã de date care se va
specifica în proprietatea Control
Source.
Dacã dorim ca valoarea din
obiect sã nu poatã fi decât cititã
vom folosi proprietatea Locked
= Yes.

C. Comutatoare = Obiecte CheckBox


Comutatoarele sau casetele de validare se pot proiecta prin butonul Checkbox.
De obicei, acestea se asociazã câmpurilor cu valori booleene.
Pentru exemplul nostru, s-a proiectat ca obiect pentru câmpul are_ore (reþine
faptul cã orele sunt la seral sau nu) printr-un
CheckBox – casetã de validare. Prin activare
se transmite valoarea Yes.
O metodã folositã este OnClick, care
va trebui sã precizeze acþiunea la apãsarea
butonului mouse-ului. Acest lucru se face
prin scrierea codului corespunzãtor direct în
fereastra de ediare, deschisã cu butonul
asociat metodei OnClick. Putem crea un
macro ºi putem asocia butonului execuþia
acestuia, aºa cum vom vedea în lecþiile
urmãtoare.

D. Proiectarea listelor închise = Obiecte ComboBox


Lista închisã este un obiect de interfaþã care se proiecteazã prin butonul
ComboBox. La deschidere se afiºeazã toatã lista ºi se permite selectarea unei
valori. Elementul selectat este memorat în câmpul pe care îl asociem proprietãþii
ControlSource. Alegerea valorii se face prin tasta Enter sau prin clic de mouse. În
cazul în care câmpul este de tip numeric va primi poziþia elementului selectat, dacã
este de tip caracter va primi chiar valoarea elementului. Elementele afiºate pot
proveni din surse diferite, specificate prin proprietãþile RowSource ºi RowSourcetype.
Proiectarea listelor combo beneficiazã de un asistent Combo Wizard apelat
imediat ce se încearcã plasarea butonului pe suprafaþa de lucru. De fapt, modul de
lucru cu asistentul Combo Wizard este cunoscut din lecþia de proiectare a câmpurilor
de cãutare de tip Lookup.

E. Proiectarea listelor deschise = Obiecte ListBox


Obiectele de tip Listbox se prezintã ca liste deschise ce afiºeazã valori luate fie
dintr-o tabelã/interogare, fie definite local la proiectare.

&
Odatã cu plasarea butonului de pe bara ToolBox pe suprafaþa de lucru este
apelat asistentul List Wizard care deruleazã ferestrele de dialog similare Combo
Wizard.

F. Proiectarea declanºatoarelor = Obiecte CommandButton


Obiectele de tip CommandButton sunt folosite pentru declanºarea unei acþiuni.
Pentru proiectarea lor beneficiem de
un asistent (Wizard) care permite
alegerea acþiunii ºi formei butonului.
În exemplul nostru dorim un set
de butoane plasat pe banda Form
Footer, care sã ofere posibilitatea
afiºãrii la imprimantã, ºtergerii sau
cãutãrii articolelor.
Vom acþiona butonul Command
ºi ne vom poziþiona pe suprafaþa de
lucru. Apare imediat asistentul Wizard prin care ni se permite indicarea tipului de
acþiune doritã pentru buton ºi chiar alegerea textului sau a imaginii plasate pe buton.
Butoanele de comandã pot fi proiectate ºi fãrã asistent, asta însemnând ca la
evenimentul OnClick – care declanºeazã acþiunea – sã trecem procedura scrisã
de noi (se foloseºte Visual Basic for Aplication) sau o macroinstrucþiune, care va fi
creatã tot de noi, dar alegând comenzile dorite ºi ordinea acestora.
Dupã specificarea acþiunii se poate da un text explicativ butonului sau i se poate
asocia o imagine.

G. Proiectarea opþiunilor = Obiecte OptionGroup


Obiectele Optin Group sunt obiecte de tip container care conþin mai multe
obiecte de acelaºi fel: butoane radio, declanºatoare etc.
În exemplul nostru ne propunem sã folosim obiectele OptionGroup pentru
selectarea profilului clasei.
Pentru proiectarea acestui tip
de obiect beneficiem de asis-
tentul Option Group Wizard.
Pasul 1. Primul pas este sã
fixãm numãrul acestor
obiecte prin definirea
textelor asociate fiecã-
rei opþiuni.
Pasul 2. Se precizeazã valoa-

&!
rea implicitã a butonului
ºi se acordã o valoare
numericã fiecãrei opþiuni.
Dacã tipul câmpului re-
ceptor este text,
atunci, acesta va primi
valoarea datã prin
selecþie ca ºir de
caractere; dacã tipul
este numeric atunci se
va atribui valoarea numericã asociatã opþiunii.
Pasul 3. Se fixeazã tipul butonului ºi chiar un stil de afiºare.
Pentru cã asistentul doar construieºte grupul de butoane, obiectul nu are asociat
niciun câmp. Treceþi, în fereastra de proprietãþi Controlsource, câmpul care doriþi
sã reþinã valoarea butonului selectat din grup.

H. Proiectarea subformularelor = Obiecte Subform


Un formular care sã conþinã un subformular se
realizeazã pentru tabele legate cu relaþia 1-n. Este
avantajos, ca odatã cu introducerea informaþiilor despre
o clasã, sã introducem ºi datele despre elevii sãi.
Formularul pãrinte va fi pentru CLASA, iar subformularul
va fi pentru tabela ELEVI. Legãtura 1-n este realizatã
prin câmpul clasa.
Cum se poate realiza acest lucru?
1. Putem proiecta mai întâi un formular pentru Elevi
(sã-l numim frmsub_elevi). Preferãm ca forma
acestuia sã fie Datasheet (matrice sau tabel,
pentru coerenþa informaþiilor pe ecran!), apoi îl vom include în formularul de
bazã pentru Clase prin manevrarea butonului Subform. Asistentul Subform
Wizard va fi apelat automat ºi ne va permite sã indicãm numele
subformularului, precum ºi câmpul de legãturã.
2. Putem folosi avantajul realizãrii rapide a subformularului chiar de cãtre asistent.
Noi va trebui sa alegem primul buton radio: Use existing Tables… ºi sã
precizãm tabela sau interogarea sursã. Legãtura dintre cele douã tabele e
bine sã fie fixatã anterior, ocazie cu care vom revedea tipul legãturii ºi dacã
cheia externã este indexatã.

I. Proiectarea obiectelor imagine = Obiecte Image


Formularele de culegere a datelor sau de vizualizare sunt mai atractive dacã au
anumite desene, imagini, sigle. Proiectarea într-o zonã a machetei a obiectelor
imagine, care sunt de fapt fiºiere .bmp, se realizeazã cu butonul Image de pe
Toolbox, prin drag&drop ºi conturarea zonei.

J. Proiectarea obiectelor de tip OLE


Tehnica OLE este deja cunoscutã din lecþiile anterioare de programare a
aplicaþiilor Windows, tehnicã ce permite interacþionarea aplicaþiilor Windows prin

&"
intermediul obiectelor suportate de acestea. Obiectele pot fi legate (Linked Objects)
sau incluse (Embedded Objects). În momentul execuþiei, obiectele se pot edita
folosind aplicaþia care le-a generat.
Ele sunt obiecte OLE, în sensul cã sunt create de alte aplicaþii. Important este
cã ele au propriul lor set de proprietãþi ºi evenimente/metode pe care le putem
modifica la proiectare.

K. Proiectarea obiectelor de tip Line ºi Shape


Obiectele grafice ca linii, respectiv chenare au
scopul de a îmbunãtãþi aspectul unui formular.
BorderColor – culoarea; BorderStyle – modul
de desenare (0=transparent, 1=continuu, 2=linie
întreruptã etc.); BorderWidth – grosimea în pixeli;

Sarcini suport pentru noile cunoºtinþe Folosiþi...


Problema 10.1. Proiectaþi un formular pentru navigarea ºi editarea Autoform tabular
întregii tabele PROFESORI; denumiþi formularul frm_prof1.
Deplasaþi-vã prin tabelã, introduceþi noi articole, modificaþi
unele valori, ºtergeþi un articol.
Problma 10.2. Folosiþi formularul anterior ºi vizualizaþi doar Folosirea Filter
profesorii care au gradul 1; denumiþi formularul frm_prof2. by selection
Executaþi câteva corecþii asupra salariului ºi observaþi apoi în
fereastra Datasheet efectele asupra tabelei de date. Anulaþi
filtrul.
Problema10.3. Folosiþi formularul anterior ºi vizualizaþi profesorii, Folosirea
în ordinea alfabeticã a catedrelor. Reveniþi. Record→Sort
sau proprietatea
Order by

Problema 10.4. Folosiþi formularul anterior pentru adãugarea Data Entry


unor noi profesori, fãrã a-i „vizualiza“ ºi pe cei existenþi deja.
Problema 10.5. Proiectaþi un formular pentru navigarea ºi editarea Autoform
tabelei ELEVI sub formã tabelarã; denumiþi formularul datasheet
frm_prof3.
Problema 10.6. Folosiþi formularul pentru filtarea, sortarea ºi
editarea unor noi articole, ca în exerciþiile anterioare.
Problema 10.7. Proiectaþi un formular care sã vizualizeze ºi sã Form Wizard
editeze doar câmpurile nume, specialitatea, adresa ºi telefonul,
din tabela PROFESORI; denumiþi formularul frm_prof4.

&#
Problema 10.8. Folosiþi formularul anterior ºi interziceþi ºtergerea, Allow Edits,
respectiv adãugarea articolelor. Deletions

Problema 10.9. Proiectaþi un formular care sã vã lase s㠄vizualizaþi“ Form Wizard cu


doar salariul unei persoane X (numele este dat la intrare!); sursa de date
denumiþi formularul frm_salar_profX. Ce manevrã trebuie sã query
faceþi pentru a avea acces prin acest formular numai la
profesorii titulari? Dar pentru a-i afiºa doar pe cei cu studii
superioare din catedra de matematicã, ordonaþi dupã gradul
didactic?

Problema 10.10. Proiectaþi formularul urmãtor pentru actualizarea Form Wizard.


simultanã a celor douã tabele CLASE ºi ELEVI. Subformularul
este inclus în
formularul pãrinte
Problema 10.11. Rearanjaþi obiectele de pe formular; ºtergeþi Form Design.
eticheta asociatã de generator la plasarea câmpului pe Manipulare
formular; schimbaþi mãrimea obiectelor. obiecte
Problema 10.12. Realizaþi actualizarea simultanã a douã tabele Form Wizard.
CLASE→1-n→ELEVI, prin formulare legate: Subformularul
legat de formular.
Obiect tip
command button

&$
Problema 10.13. Proiectaþi un formular care sã permitã editarea Form Wizard
simultanã a 3 tabele SCOLI→1-n→ CLASE→1-n→ ELEVI. pentru 3 tabele

Problema 10.14. Proiectaþi un formular care sã ocupe întregul Form Design +


ecran sub forma urmãtoare: Observaþi cã nu are bara de atributele unui
defilare a înregistrãrilor! Numiþi formularul frm_principal. formular

Problema 10.15. Adãugaþi pe formularul frm_principal butoane Form design+


pentru deschiderea formularelor proiectate anterior (frm_prof1, Obiectul Form
frm_prof2, frm_prof3, frm_prof4). Fiecare buton va avea un Command Button
text asociat ca explicaþie suplimentarã, afiºat la miºcarea Proprietãþi
mouse-ului în dreptul obiectului. De exemplu, pentru butonul Caption
din imagine observaþi textul explicativ. ControlTip Text

&%
Problema 10.16. Realizaþi un formular pentru adãugarea unui Form Design +
singur articol în tabela PROFESOR. Formularul nu permite obiecte form
defilarea, nu are posibilitatea de redimensionare ºi nici textbox
închidere de pe bara de titlu. Butonul Adauga va permite Label Command
adãugarea informaþiei, din zona de editare în câmpul nume al button
unui nou articol; butonul Sterge va permite anularea operaþiei
anterioare de salvare. Formularul se închide doar prin butonul
proiectat de voi. Verificaþi tabela PROFESORI, dupã efectuarea
fiecãrei operaþii.

Problema 10.17. Modificaþi formularul anterior pentru a introduce mai Form Design
multe articole! Observaþi formularul propus în imaginea urmãtoare:

Întrebãri recapitulative
1. Care sunt fazele proiectãrii unui raport?
2. Ce înseamnã generarea unui auto-raport?
3. Care sunt secþiunile unui raport?
4. Prin ce se deosebesc operaþiile de grupare ºi sortare?
5. Cum putem parametriza un raport?
6. Când folosim un formular? Daþi exemple.
7. Formularele pot fi o cale uºoarã de a ascunde unele date. Corect?
8. Daþi 3 exemple de proprietãþi ale formularelor ºi 3 exemple de proprietãþI ale
obiectelor de control.
9. Cum se poate transforma un formular creat prin Auto-form într-un formular de
introducere a unui singur articol?

&&
*Lecþia
11 Macro-instrucþiuni
Access
Mediul Windows este un mediu condus de evenimente. Majoritatea
evenimentelor sunt iniþiate de utilizatori atunci când deplaseazã mouse-ul sau când
închid un formular. Sistemul de operare Windows depisteazã tipul evenimentului
survenit ºi dã curs codului asociat – vorbim de proceduri eveniment. Dar uneori
este necesar sã scriem propriile noastre subrutine, fãrã sã fie asociate unui anumit
obiect sau eveniment. Ele pot fi apelate de oriunde din aplicaþia noastrã, pentru
tratarea erorilor, pentru inþializarea unor variabile etc.
Microsoft Access dispune de un limbaj pentru programarea aplicaþiilor cu baze de
date – Visual Basic pentru Aplicaþii (VBA) – limbaj puternic de care vã puteþi folosi ºi
în celelalte aplicaþii Microsoft Office. Limbajul VBA este un limbaj care permite
programarea structuratã ºi modularã, precum ºi programarea orientatã cãtre obiecte.
În 1993 Microsoft a decis ca un subset al VBA sã devinã limbajul de macro-uri
comun aplicaþiilor pentru platformele Windows, Windows NT ºi Apple.
Un macro este o secvenþã de instrucþiuni
care reprezintã operaþii de interacþiune a
utilizatorului cu aplicaþia. Pentru a putea crea o
macroinstrucþiune, MS Access dispune de
utilitarul Macro Builder.
De exemplu, putem folosi un macro pentru
a aplica un filtru, pentru a deschide, a închide
sau a redenumi un obiect, pentru a tipãri un
formular sau un raport.
Problemã: pentru un formular existent ne
propunem ca, la lansarea sa în execuþie, acesta
sã se maximizeze, iar la terminare sã afiºeze
un mesaj, folosind macroinstrucþiuni.
Evenimentul care va permite maximizarea
este încãrcarea formularului, deci vom folosi la evenimentul OnLoad sau OnOpen
macro-ul mcrmaxim, iar pentru macro-ul de afiºare a mesajului (mcrminim) ne
vom servi de evenimentul OnUnload sau OnClose.
O primã modalitate este sã construim macro-ul din fereastra Database Window
ºi sã-l ataºãm evenimentului. O altã modalitate ar fi sã ne poziþionãm pe evenimentul
dorit în fereastra de proprietãþi ºi apoi, prin butonul Build , sã construim direct
macroinstrucþiunea. De reþinut cã, dacã
macro-ul existã, atunci numele lui apare
în lista deschisã prin butonul asociat
evenimentului.
Indiferent de alegere se apeleazã
acelaºi Macro Builder. Deci:
Pasul 1. Se apeleazã utilitarul Macro
Builder prin Database→
Macro→ New.
&'
Utilitarul are propria fereastrã de proiectare
ce cuprinde pe prima coloanã acþiunile care
vor forma macro-instrucþiunea, în a doua
colonã comentariile, iar în partea de jos
anumite atribute asociate ca argumente
comenzilor.
Pasul 2. În coloana Action se deschide o listã cu
acþiunile care pot fi trecute în macro ºi se alege acþiunea doritã.
Pasul 3. Se completeaz㠖 dacã este necesar – argumentele acþiunii. În cazul
nostru, vom scrie chiar mesajul. Pot fi ºi acþiuni fãrã argumente!
Pasul 4. Uneori este necesar ca execuþia macro-istrucþiunii sã fie condiþionatã de
o anumitã valoare a unui câmp. De exemplu, într-un formular de introducere
a datelor despre elevi trebuie menþionat cã media nu se va trece dacã
elevul este corigent sau repetent! Mesajul de atenþionare va fi afiºat prin
intermediul unui macro la evenimentul Before Update al textbox-ului Media.
Dar va fi condiþionat de valoarea câmpului situaþie!
Pentru realizarea unui macro condiþionat de o anumitã valoare calculatã
se foloseºte butonul de condiþie situat pe bara cu butoane: . La
apãsarea acestui buton fereastra de proiectare se modificã cu încã o
coloanã, pe care se trece condiþia.
Pasul 5. Se salveazã.

Macro-comanda AutoExec
Existã posibilitatea ca la fiecare deschidere a bazei de date sã se execute
automat o macro-instrucþiune, dacã se va salva cu numele AutoExec.
Ce acþiuni ar putea realiza aceastã macro-comandã? În primul rând ar putea
ascunde fereastra Database ºi sã dea controlul unui formular principal al aplicaþiei
care va conduce utilizatorul cãtre toate acþiunile dorite. În Access 2000 existã
posibilitatea indicãrii formularului principal al aplicaþiei, lansat automat la deschiderea
bazei de date prin StartUP.

Problema 11.1*. Vrem sã realizãm un formular care sã


afiºeze numai anumiþi profesori, filtraþi dupã specialitate.
Numele specialitãþii îl vom primi printr-un alt formular care
este de tip casetã de dialog (observaþi cã nu are bara de
deplasare, butoane de închidere sau de dimensionare).
Imediat dupã deschiderea formularului cu datele filtrate
ºi caseta de dialog trebuie sã se închidã.
Atenþie!
Declanºarea evenimentelor de access cum ar fi deschiderea unui formular, executarea
unui click-mouse ºI selectarea unei opþiuni dintr-un meniu pot fi automatizate prin intermediul
utilizãrii macro-comenzilor sau a limbajului de programare Visual Basic for Application.

'
P11.2* Realizaþi un formular de editare a
tabelei în care folosiþi aceste câmpuri.
Dorim ca atunci când în obiectul checkbox
pentru câmpul este_casatorit trecem valoarea
“yes”, sã fie afiºat un mesaj de atenþionare!
Problema 11.3*. Proiectaþi o bazã de date
abonamente cu tabelele REVISTE (codul ºi
numele revistei, editura, preþul, periodicitatea),
CHITANTE (numãrul chitanþei, codul revistei,
perioada abonamentului ºi suma).
Proiectaþi formulare pentru actualizarea
tabelelor. Proiectaþi un raport în care
pentru fiecare revistã se vor afiºa
chitanþele corespunzãtoare abona-
mentelor, precum ºi suma totalã.

Realizaþi o aplicaþie care sã grupeze operaþiile de vizualizare


ºi actualizare a tabelelor, precum ºi afiºarea unui centralizator al
abonamentelor pe reviste, printr-un buton meniu realizat prin
macro-instrucþiuni.

'
*Lecþia
12 Organizarea aplicaþiei:
meniuri ºi ferestre de
prezentare
ü Ferestre de prezentare
ü Pagini de comutare: Switchboard Manager
ü Proiectarea meniului principal sub forma unei bare cu butoane

În general, o aplicaþie cuprinde o multitudine de tabele, machete-ecran, interogãri,


rapoarte, macro-uri care au fost scrise pentru un scop comun ºi care urmeazã sã
fie cuprinse într-o singurã aplicaþie executabilã. Pentru buna funcþionare a ansamblului
este necesar ca toate operaþiile pe care le face aplicaþia sã poatã fi lansate din
opþiunile unui meniu.
De regulã existã o fereastrã de prezentare a aplicaþiei care permite fie deschiderea
altei ferestre numite meniu principal, fie pãrãsirea programului.

Proiectarea unei ferestre de prezentare a


aplicaþiei
Exemplu: dorim sã realizãm un formular cu
douã butoane; un buton (continuã) care sã ne
conducã mai departe la afiºarea altui formular ºi
alt buton (ieºire) care sã ne întoarcã în fereastra
Database.
1. Vom intra în modul Design View de proiectare
a unui nou formular.
2. Vom seta proprietãþile ca în imaginea
alãturatã. Atenþie! Pentru a nu apãrea banda
cu butoanele de deplasare trebuie setatã
proprietatea Navigation Button =No.
3. Pentru a afiºa o imagine de fundal alegem
imaginea ºi setãm proprietatea Size
Mode=Stretch – dacã nu ne intereseazã
proporþiile (altfel, încercaþi Size Mode=Zoom).
4. Vom proiecta primul buton cu textul ieºire
(proprietatea Caption=“iesire”), indicând în
fereastra Command Control Wizard
operaþiunea pe care o va efectua.
Pentru aceasta, alegem Form Operations
(din lista category) ºi apoi, din caseta Action
alãturatã, selectãm Close Form.
5. Pentru butonul continuã vom indica în fereastra de proiectare a utilitarului
Command button wizard categoria Form Operation ºi ca acþiune (lista Action)
Open Form. Imediat apare fereastra în care ni se permite sã selectãm formularul
pe care dorim sã-l deschidem.

'
Proiectarea unui formular de comutare sau panou de bord
Un mod de prezentare a funcþiunilor aplicaþiei noastre se poate realiza prin
intermediul unor formulare speciale care au doar butoane de comandã. Unele butoane
deschid pagini subalterne, altele lanseazã în execuþie imprimanta, pentru afiºarea
unor rapoarte, sau doar deschid tabele, formulare, executã anumite acþiuni etc.
Pasul 1. Organizãm aplicaþia ºi gãsim gruparea care ne avantajeazã.

Pasul 2. Apelãm utilitarul de construire a paginilor


de comutare, prin Tools→ Database
Utilities→Switchboard Manager. Apare
o fereastrã ca în imaginea alaturatã.
Implicit, formularul principal se numeºte
Main Switchboard.
Pasul 3. Specificãm prin butonul New intenþia noastrã de a realiza alte douã pagini
ancorate de pagina principalã MainSwitchboard. Dãm nume acestor pagini
– numele va fi afiºat pe bara de titlu a paginii.

Pasul 4. Pentru fiecare paginã trebuie sã specificãm


opþiunile (items). Prin butonul Edit ne poziþionãm
în pagina doritã ºi apoi, prin New, specificãm
numele opþiunilor din paginã.
De exemplu, pentru pagina Rapoarte ne-am
poziþionat pe linia sa în fereastra Main ºi am
apãsat butonul Edit.
Prin butonul New am anunþat dorinþa de a cuprinde
trei opþiuni – rapoarte: situaþia elevilor, situaþia
elevilor pe clase ºi situaþia mediilor.
Pentru fiecare item (buton) trebuie sã
precizãm acþiunile. Pentru itemul
„situaþia elevilor“ comanda va fi Open
Report, iar din lista ataºatã vom alege
raportul.

'!
Pasul 5. Este normal ca atunci când am
deschis o paginã sã ne punem
problema revenirii la pagina
anterioarã sau – dacã este pagina
central㠖 sã revenim în mediul
Access sau Windows.
De exemplu, butonul „introduceri-editãri
date“ va deschide o paginã cu numele
„introducere-editare date“ (pe care noi am
definit-o deja în fereastra de proiectare a
Managerului).
Observaþi un buton „revenire“ care deter-
minã revenirea, din pagina unde este definit, în pagina principalã.
Pasul 6. Închidem fereastra utilitarului Switchboard Manager. Vom observa, dacã
am lucrat corect, în lista formularelor, numele noului formular de comutare
(Switchboard) ºi în lista tabelelor noua tabelã creatã de utilitar, cu acelaºi
nume standard – Switchboard Items.

Pasul 7. Lansarea sau deschiderea complexului de pagini se realizeazã prin


comanda Open, dupã poziþionarea pe formularul Switchboard!

Realizarea meniului aplicaþiei folosind bara de butoane Windows


O facilitate oferitã proiectanþilor de aplicaþii vizuale de cãtre sistemul Microsoft Windows
este posibilitatea personalizãrii barei cu instrumente prin opþiunea Customize a
meniului View→Toolbars.
1. Pentru a deschide o barã
de butoane construitã
deja, se activeazã comu-
tatorul asociat numelui
barei în fereastra Toolbars.
2. Pentru a crea o nouã barã
cu butoane se acþioneazã butonul New din fereastra Toolbars ºi se atribuie un
nume barei: implicit este un Custom.
3. Operaþiile de ºtergere/redenumire a barei sunt efectuate prin butoanele Delete/
Rename.
4. Pentru a adãuga un buton la o barã activã se procedeazã astfel:
a. Se deschide tab-ul Commands din fereastra Customize.
b. Se alege bara destinaþie din lista Categories.
c. Se alege butonul din lista butoanelor, prezentate ca nume ºi pictogramã,
asociate din fereastra Commands.
d. Se plaseazã cursorul mouse-ului pe buton ºi se executã drag&drop cãtre
bara unde va fi plasat butonul.
'"
5. Pentru a adãuga un buton tip
submeniu la o barã cu instru-
mente existentã se foloseºte
tab-ul Commands ºi din
fereastra Categories se selec-
teazã opþiunea New Menu. În
fereastra Commands va
apãrea un buton cu numele
New Menu pe care îl puteþi
plasa pe bara cu instrumente
doritã prin drag&drop.
Se denumeºte butonul,
folosind meniul contextual
deschis prin click dreapta pe
opþiunea Name. Se includ apoi opþiunile acestui meniu, prin selectarea ºi plasarea
butoanelor.
6. Pentru editarea proprietãþilor barei (de exemplu, poziþia acesteia, posibilitatea
mutãrii, a redimensionãrii etc.) se deschide o fereastrã de dialog prin butonul
Properties din fereastra Toolbars.
7. Pentru a ºterge un buton de pe bara de instrumente activã se poziþioneazã
cursorul mouse-ului pe butonul dorit a fi eliminat ºi se executã drag&drop cãtre
exteriorul barei.

Proiectarea unui buton-meniu prin macro-comenzi


O altã modalitate de a organiza aplicaþia prin meniuri
este folosirea macro-instrucþiunilor ºi a metodei AddMenu.
De exemplu, meniul urmãtor, care deschide un
formular pentru introducerea sau editarea tabelei ELEVI
sau un raport despre elevi poate fi „agãþat“ ca buton pe
prima linie a formularului sau poate fi proiectat ca meniu
contextual al ferestrei aplicaþiei.
Pasul 1. Realizãm un macro pentru cele 2 opþiuni ale
meniului contextual. Vom deschide Macro→New ºi activãm butonul pentru

inserarea coloanei Macro Name .


Acolo vom trece textul asociat opþiunii.
La acþiune vom deschide formularul Elevi
ºi pentru a doua opþiune vom deschide
raportul (atenþie! la parametrul View-
trebuie datã valoarea Print Preview dacã
dorim afiºarea pe ecran altfel va trebui
sã avem imprimanta deschisã!).
Salvãm cu numele Mac_meniu_elevi.
Pasul 2. Realizãm un nou macro. El va avea
rolul sã deschidã meniul anterior
proiectat prin macroul Mac_meniu_elevi.
La acþiune vom pune comanda
AddMenu ºi vom specifica numele

'#
macro-instrucþiunii care compune
meniul. Vom salva cu numele
Mac_lansare_mnu_elevi.
Pasul 3. Asociem acest macro formularului de
prezentare a aplicaþiei, la proprietatea
Shortcut menu bar.
Pasul 4. Verificãm funcþionarea formularului cu
meniul shortcut asociat.

Sarcini suport pentru noile cunoºtinþe Folosiþi...


Problema 12.1*. Sã se proiecteze o barã-meniu care sã conþinã Meniu barã cu
câte un buton pentru fiecare tabelã din baza de date butoane simple
(asociindu-i fiecãruia acþiunea de deschidere a tabelei)
pe care sã o plasaþi pe linia cu instrumente Access.
Observaþi imaginea sugestie!

Problma 12.2*. Plecând de la formularele ºi rapoartele din baza Tools→


de date SCOALA, proiectate în laboratoarele anterioare, realizaþi Customize
un buton tip meniu al aplicaþiei pe care sã-l deschideþi pe Pentru realizarea
bara principalã de butoane Database, ca în imaginea alãturatã. unui Buton tip
Atenþie! Ultima opþiune vã permite – de exemplu – ieºirea meniu
din Access.

Problema 12.3*. Pentru aceeaºi bazã de date SCOALA sã realizãm Proiectarea unei
urmãtorul meniu pentru organizarea formularelor ºi rapoartelor bare-meniu prin
proiectate deja. Observaþi cã bara orizontalã este formatã Customize
din douã opþiuni tip submeniu. View→Toolbars

'$
Problerma 12.4.* Organizaþi aplicaþia SCOALA prin intermediul Switchboard
paginilor decomutare realizate automat prin Switchboard Manager
Manager.

Dorim gruparea formularelor ºi a rapoartelor de tip text, etichetã sau grafic, pe pagini
separate.
Pagina principalã (Main switchboard) vã permite:
1. deschiderea unei pagini de comutare pentru selectarea formularelor de editare
propriu-zise (o vom numi pg_1_formulare).
2. deschiderea unei pagini de comandã pentru selectarea formelor de raportare (o vom
numi pg_2_rapoarte). Fiecare buton al acestei pagini deschide câte o paginã pentru
selectarea rapoartelor propriu-zise:
a. pg_2_1_rap_tabele (pentru selectarea rapoartelor sub formã tabelarã);
b. pg_2_2_rap_label (pentru selectarea rapoartelor sub formã de etichetã);
c. pg_2_3_rap_graf (pentru selectarea graficelor).

Main
Pg_1_formulare Pg_2_rapoarte
pg_2_1_tabele pg_2_2_label pg_2_3_graf

Problema 12.5*. Proiectaþi un Form Design +


formular de prezentare a aplicaþiei. Metodele open
Un buton va permite continuarea – form ºi close
adicã va lansa pagina centralã de form
comutare proiectatã anterior. Alt
buton va permite pãrãsirea
aplicaþiei.

Problema 12.6. Asociaþi Meniuri


formularului de prezentare un contextuale
submeniu. De exemplu, pentru utilizând un
operaþii rapide asupra tabelei macro
ELEVI.

Problema 12.7*. Proiectaþi un meniu tip buton pe prima linie a Buton meniu cu
formularului central – prin macro-instrucþiuni. submeniuri
macro-uri

'%
Lecþia
13 Proiectarea legãturilor
aplicaþiilor cu exteriorul
ü Hyperlink-uri în tabelele Access
ü Folosirea hiperlegãturilor în formulare ºi rapoarte
ü Publicarea datelor sub forma paginilor web
ü Importul ºi exportul datelor de la ºi cãtre alte aplicaþii

Hyperlink-uri în tabelele Access


O facilitate oferitã utilizatorilor bazelor de date Access este posibilitatea legãrii
înregistrãrilor dintr-o bazã
de date Access la obiecte
din reþeaua Internet.
De exemplu, dorim ca
pentru fiecare persoanã sã
reþinem adresa de e-mail. Vom trece în modul Design de proiectare a structurii ºi
vom adãuga noul câmp.
Câmpul care reþine o astfel de legãturã este de tip hyperlink ºi stocheazã 3
informaþii separate prin #: textul ce va fi afiºat, adresa URL a paginii Web pe care
o va deschide ºi subadresa ca secþiune în cadrul paginii.
Exemplu: pagina_mea#www.liis.edu.ro#profesorx.html
Atenþie! Dupã introducerea adresei observãm schimbarea aspectului prin colorare
ºi/sau subliniere; de asemenea, la plimbarea cursorului mouse-ului deasupra zonei
respective apare mâna, caracteristicã legãturilor. Orice clic va face ca aplicaþia
Access sã urmeze legãtura ºi sã încarce obiectul referit în browser-ul sau aplicaþia
prestabilitã.
Pentru a edita adresa
va trebui sã focalizãm
câmpul cu ajutorul tasta-
turii ºi apoi sã apãsãm F2
sau, sã deschidem
meniul contextual cu
butonul drept al mouse-
ului ºi sã folosim Hyper-
link→ Edit Hyperlink.
ªtergerea valorii din
câmpul hyperlink se face
prin butonul Remove
Link.

Folosirea hyperlink-urilor în formulare ºi rapoarte


Modul de afiºare Datasheet nu este singurul loc în care putem edita ºi vizualiza
datele de tip hyperlink. Într-un formular sau într-un raport putem asocia un obiect de
control acestui câmp, care va permite utilizatorilor lansarea browser-ului cu adresa
specificatã în înregistrarea curentã.
'&
Proiectarea paginilor Web pentru vizualizarea datelor pe Internet
Este util, uneori, sã facem cunoscute anumite date publicului larg, pentru reclamã
sau alte activitãþi. ªi cum Internet-ul este cea mai eficientã cale de comunicare, ne
vom ocupa de proiectarea documentelor web pentru vizualizarea informaþiilor din
baza de date Access pe Internet.
Pentru vizualizarea datelor conþinute într-o bazã de date Access, pe Internet, se
foloseºte un tip special de formular numit „Paginã de acces la date“. Utilizatorii unei
astfel de pagini pot vedea, edita sau ºterge datelele dintr-o bazã de date.

O paginã are urmãtoarea structurã: titlul, conþinutul (format din textbox-uri ºi


label) ºi bara de navigaþie.
Se pot realiza paginile de acces la Internet în modul Design sau utilizând asistentul
Wizard.
Datele conþinute într-un astfel de document depind de grupul þintã; de exemplu,
dacã dorim, putem sã popularizãm rezultatele unui grup/clasã/ºcoalã la nivelul fiecãrui
individ sau informaþiile sintetice, globale. Pagina trebuie sã aibã butoane de sortare
ºi de cãutare rapidã. De asemenea, trebuie sã oferim posibilitatea editãrii unor date.
Pagina de acces poate sã conþinã date obþinute prin interogãri încruciºate (Pivot
Table) sau grafice, foi de calcul. Pagina de acces este conectatã direct la baza de
date. Când utilizatorii afiºeazã pagina în Internet Explorer ei vãd o copie a datelor
propriu-zise. Asta înseamnã cã filtrarea, sortarea sau alte modificãri pe care utilizatorii
le efectueazã sunt memorate într-o bazã de date colateralã. Totuºi, modificãrile
asupra datelor sunt vizibile ºi altor vizitatori ai paginii pe Internet.
Operaþia de creare a unei pagini Web este posibilã prin Database Window→
Page→ New→ Page Wizard.
Pasul 1. Se selecteazã tabela/interogarea.
Pasul 2. Se selecteazã câmpurile care vor fi afiºate.
Pasul 3. Se dã posibilitatea specificãrii cheii de grupare.
Pasul 4. Se precizeazã ordinea de afiºare a datelor.
Pasul 5. Se salveazã ca document .html.

''
Un exemplu de folosire a unei pagini Web:

În formularul asociat tabelei Pers dorim un buton care sã deschidã o paginã


HTML cu explicaþii suplimentare.
Cum am realizat acest lucru?
1. Am creat o paginã nouã prin Design View cu textul dorit.
2. Am deschis formularul asociat tabelei, am proiectat butonul de comandã cu
ajutorul asistentului Wizard ºi am ales din lista Categories Form Operations
acþiuni pentru Open Pages.
3. Am ales pagina creatã anterior din fereastra cu pagini Web.

Importul ºi exportul de date


Microsoft Access poate transmite informaþiile
dintr-o tabelã în fiºiere de alt tip gestionate de Excel,
în editoare de texte Word, în FoxPro sau în Oracle.
De asemenea, poate recepta datele create de alte aplicaþii în fiºiere cu structura
particularã a tabelei de date Access.
a. Importul de date
Se apeleazã utilitarul Import Wizard prin ecranul Database →Table→New.
Pasul 1. Este necesarã indicarea tipului de fiºier care va fi importat într-o tabelã
Access. Pentru exemplificare, am ales „Text files“.


Pasul 2. Precizarea delimitatorilor de câmp (exemplu: virgula, tab-ul, spaþiul sau alt
delimitator precizat de operator).
Pasul 3. Alegerea delimitatorului pentru câmpuri ºi pentru ºiruri. Se precizeazã dacã
primul rând conþine denumirea coloanei.

Pasul 4. Precizarea locului de importare: fie într-un fiºier existent, fie într-un nou
fiºier.
Pasul 5. Atribuirea unui nume, a unui tip ºi specificarea indexului pentru fiecare
coloanã din fiºierul sursã.

Pasul 6. Stabilirea cheii primare. Se poate acorda sistemului Access dreptul de a


defini o cheie sau se poate indica de cãtre utilizator.
b. Exportul de date
Trecerea conþinutului unei tabele Access într-un fiºier de alt tip se poate face
prin File→Export.


Pasul 1. Specificarea tipului de fiºier cãtre care dorim transmiterea datelor. Noi am
ales „text file“.
Pasul 2. Se solicitã detalii pentru export. În cazul textelor se fixeazã modul de
separare a câmpurilor: fie prin caracterele virgulã sau tab, fie prin spaþii.
Pasul 3. Se pot da ºi alte specificaþii pentru export.
Pasul 4. Se solicitã numele sub care se exportã datele.

Sarcini suport pentru noile cunoºtinþe Folosiþi...


Problema 13.1. Realizaþi o paginã Web pentru tabela SCOLI cu Page Wizard.
urmãtorul aspect. Faceþi adãugãri, corecþii, ºtergeri. Aranjaþi Tabela SCOLI
datele alfabetic dupã numele ºcolii. Filtraþi datele pentru
profilul „vocaþional“.

Problema 13.2. Realizaþi o paginã Web folosind tabela PROFESORI. Page Wizard +
Grupaþi datele dupã specialitate. Observaþi cum funcþioneazã Tabela
pagina. Puteþi face corecþii asupra datelor? PROFESORI.
Grupare corecþii,
cu Design Page

Problema 13.3. Realizaþi o paginã a Inspectoratului ªcolar pentru Sursã de date,


afiºarea informaþiilor despre ºcoli, ca în imaginea urmãtoare. de tip interogare,
Pentru fiecare ºcoalã este afiºat numãrul de clase ºi elevi într-o paginã
(desigur, existenþi în baza de date). Web. Asistentul
Page Wizard.
Modificãri prin
Page Design


Proiect final
ü Indicaþii metodologice pentru realizarea proiectului final
ü Tematica propusã
ü Studiu de caz

Vã propunem sã realizaþi la nivelul clasei/grupei un sistem informatic economic


simulând funcþionarea unei unitãþi de dimensiuni reduse. Fiecare subsistem va modela
o funcþiune economicã: aprovizionare, contabilitate, personal etc.
Trecem în revistã câteva activitãþi grupate pe funcþiuni:
A. Aprovizionarea cu materii prime ºi materiale:
– evidenþa stocurilor de materii prime ºi materiale (pe fiºa de gestiune se
înregistreazã toate intrãrile ºi consumurile de materiale, precum ºi stocul
final);
– calculul necesarului de aprovizionat în funcþie de planul de producþie ºi de
stocul existent;
– recepþia materialelor de la furnizori;
– elaborarea notelor de recepþie pentru marfa intratã ºi/sau a proceselor verbale
de constatare a diferenþelor pentru marfa ce diferã calitativ sau cantitativ de
contractul încheiat;
– încheierea contractelor de aprovizionare cu furnizorii de materiale pentru
acoperirea necesarului;
– urmãrirea realizãrii contractelor, pentru fiecare furnizor de materiale, în ce
cantitãþi au fost contractate ºi ce anume s-a facturat. Diferenþele pot fi
penalizate;
– elaborarea unui grafic de aprovizionare;
– evidenþa intrãrilor pe categorii de materiale ºi furnizori.
B. Producþia:
– elaborarea planului anual de producþie în funcþie de capacitãþile existente sau
previzionate a se achiziþiona ºi de previziunile pieþii de desfacere. Planul va
indica ce produse se vor fabrica ºi în ce cantitate;
– detalierea planului pe unitãþi de producþie ºi de timp;
– repartizarea sarcinilor de plan pe posturi de lucru inducând reperele sau
operaþiile care trebuie sã fie executate. Fiecare post de lucru trebuie sã
cunoascã ce produs/reper are de executat ºi în ce cantitate pe unitatea de
timp specificã (ex. zi/lunã);
– determinarea încãrcãrii utilajelor;
– înregistrarea executãrii produselor (postul de lucru, produsul executat/reperul
ºi cantitatea), evidenþa rebuturilor;
– urmãrirea realizãrii planului de fabricaþie pe secþii ºi sectoare de activitate
(depãºiri, întârzieri).
C. Desfacerea producþiei
Unitatea are mai multe depozite de produse finite care gestioneazã aceleaºi
produse. Desigur, unele depozite au o anumitã exclusivitate gestionând numai anumite
produse finite.

!
– gestiunea stocurilor de produse finite pe gestiuni. Înregistrarea intrãrilor din
producþie ºi a ieºirilor cãtre magazinele de vânzare;
– repartiþia produselor pentru vânzare la diferite magazine, puncte de desfacere;
– acoperirea planului de producþie cu contracte de desfacere;
– evidenþa contractãrilor pe beneficiari;
– elaborarea unui grafic pentru defacerea produselor în funcþie de termenele
de livrare contractate;
– urmãrirea realizãrii contractelor de desfacere pe beneficiari. Se vor observa
întârzierile în livrare.
D. Evidenþa mijloacelor fixe:
– elaborarea ºi þinerea la zi a fiºei fiecãrui mijloc fix, înregistrarea valorii de
inventar;
– planificarea ºi executarea reviziilor ºi reparaþiilor;
– calculul amortizãrilor lunare/anuale ºi transferul lor cãtre aplicaþia de
contabilitate;
– inventarierea mijloacelor fixe pe locuri de muncã.
E. Transport:
Pentru desfacerea producþiei ºi pentru aprovizionare unitatea dispune de un
parc de maºini. Acesta presupune:
– evidenþa maºinilor (numãr de înmatriculare, tip) ºi a foilor de parcurs;
– fixarea/actualizarea normativelor pentru consumul de combustibil ºi pentru
orele de parcurs;
– evidenþa ºoferilor, a orelor lucrate;
– graficul de transport: cine ºi unde plecã. Este necesarã comunicarea cu
aplicaþiile de aprovizionare ºi de desfacere pentru a corela graficul de
aprovizionare cu cel de vânzare/distribuire marfã.
F. Contabilitate ºi financiar
– preluarea notelor contabile din aplicaþiile de salarii, gestiune materiale, mijloace
fixe etc.;
– evidenþa contabilã în lei ºi valutã pornind de la documentele primare;
– întocmirea situaþiilor centralizatoare: cartea mare, balanþã, bilanþ;
– calculele pentru impozitul pe profit ºi compunerea documentelor aferente;
– elaborarea anumitor documente primare (dispoziþii de platã, chitanþe);
– elaborarea fiºelor de cont ºi a registrului general;
– situaþia obligaþiilor neachitate ºi a creanþelor neîncasate;
– situaþia veniturilor ºi a cheltuielilor.
G. Personal ºi salarizare:
– evidenþa personalului pe locuri de muncã, pe funcþii; situaþia militarã;
– calculul salariilor: indexare, compensare;
– situaþia cartelelor de masã;
– situaþia reþinerilor pe tipuri de reþineri (rate la casã, mobilã, obiecte de uz
comun etc.)
– determinarea fondurilor pentru concediile medicale ºi de odihnã;
– afiºarea documentelor: ºtat de salarii, listã de avans chenzinal, adeverinþã de
salarizare, pontaj, declaraþie lunarã cãtre bugetul asigurãrilor de stat;
– întocmirea notelor contabile ºi trimiterea lor cãtre aplicaþia de contabilitate;
– întocmirea dispoziþiilor de platã.

"
Indicaþii metodologice pentru realizarea unui proiect informatic
1. Organizarea echipei
Grupa va fi împãrþitã în echipe de 2–3 elevi, fiecare ocupându-se de un subsistem
informatic.
Proiectul va fi coordonat de un „ºef de proiect“ care va þine controlul întregului
demers ºi va asigura legãtura între subsisteme.
2. Activitatea de formulare a problemei
Vã sugerãm ca, studiind domeniile de activitate din mediul economic, sã alegeþi
o problemã ºi sã o definiþi stabilind cerinþele funcþionale. Culegeþi datele necesare
completãrii problemei cu toate informaþiile de naturã sã o clarifice.
3. Analiza situaþiei existente
Vã sugerãm sã citiþi sau sã culegeþi date nu numai despre domeniul de activitate
specific temei, ci ºi legãturile cu celelalte domenii.
Întocmiþi fiºe de analizã identificând activitãþile care pot fi informatizate:
documentele specifice purtãtoare de informaþii, fluxurile informaþionale, prelucrãrile
specifice.
Realizaþi evaluarea (criticã) a situaþiei existente.
Imaginaþi mai multe variante de rezolvare a problemei ºi analizaþi efectele
fiecãreia. Alegeþi o variantã.
4. Proiectarea aplicaþiei
Identificaþi fluxurile de prelucrãri, intrãrile ºi ieºirile, legãturile dintre ele. Stabiliþi
entitãþile cu proprietãþile (atributele, tipul ºi lungimea lor) ºi cerinþele de validare.
Determinaþi legãturile dintre entitãþi. Desenaþi schema conceptualã. Normalizaþi.
Proiectaþi machetele pentru culegerea datelor, pentru vizualizare ºi pentru editare.
Proiectaþi forma rapoartelor utilizator: situaþii centralizatoare sau grafice.
Proiectaþi panoul de bord – cum va fi prezentatã aplicaþia, cum vor fi selectate
operaþiile specifice acesteia: meniuri, butoane, taste funcþionale.
Proiectaþi schema de sistem a aplicaþiei.
5. Construirea ºi testarea aplicaþiei
– Se va crea baza de date.
– Se vor popula tabelele cu date de test.
– Se va construi formularul de culegere/vizualizare a datelor.
– Se vor construi interogãrile ºi formularele/rapoartele de vizualizare a
informaþiilor solicitate.
– Se vor construi machetele rapoartelor.
– Se va construi panoul de bord al aplicaþiei.
– Se vor pregãti datele de test ºi se va realiza testarea componentelor pe rând
ºi apoi integrate în proiectul final.
6. Implementarea aplicaþiei
Se va realiza un grafic de implementare, cunoscând legãturile dintre subsisteme.
7. Documentarea
Fiecare echipã va realiza douã tipuri de documentaþii:
a. documentaþie de prezentare – în PowerPoint – unde vor fi prezentate
informaþile generale care sã facã atractivã aplicaþia pentru client;
b. documentaþie de utilizare – în Word – pentru clarificarea tuturor aspectelor
legate de aplicaþie.

#
Parcurgerea etapelor de realizare a unei aplicaþii informatice
Problemã
În vederea vânzãrii publicaþiilor pe bazã de abonament, editurile trimit
la oficiile poºtale oferta de abonamente cu numele revistei la care se
poate face abonament, preþul, periodicitatea apariþiei, precum ºi comisionul
oferit oficiului poºtal pentru acest serviciu. Oficiul poºtal înregistreazã oferta
într-un registru de oferte.
În momentul sosirii unui client care solicitã abonarea la o anumitã publicaþie se va cãuta
în registrul de oferte numele revistei ºi, dacã se poate face abonament, se elaboreazã o
chitanþã-abonament în douã exemplare. Un exemplar este dat clientului, iar cel de-al doilea
se înregistreazã în registrul de abonamente.
La sfârºitul unei zile, respectiv anual se calculeazã totalul sumelor obþinute din
abonamente, pe baza registrului de abonamente.
La începutul fiecãrei luni oficiul poºtal elaboreazã urmãtoarele situaþii:
1) lista abonaþilor pe strãzi – se trimite factorilor poºtali în vederea organizãrii distribuþiei
revistelor; cuprinde date despre abonat, precum ºi numele revistelor care trebuie
distribuite acestuia în luna curentã.
2) lista abonamentelor pe edituri – se trimite la edituri odatã cu banii cuveniþi din
contractarea abonamentelor în luna precedentã (minus comisionul oficiului); cuprinde
pentru fiecare revistã a editurii numãrul de bucãþi solicitate în fiecare lunã ºi totalul
sumelor corespunzãtoare.
Oficiul poºtal a cumpãrat un computer ºi solicitã o aplicaþie informaticã pentru activitãþile
legate de abonamente.

Analiza problemei
Vom sistematiza datele problemei pe baza unor formulare de analizã. De cele
mai multe ori, problema nu este suficient de clar definitã ºi atunci este ideal sã
putem lãmuri lucrurile discutând cu beneficiarul lucrãrii. În cazul nostru ne vom
imagina anumite situaþii ºi le vom trece la capitolul „ipoteze de lucru“ (notate cu I –
ipoteza).
F1. Lista activitãþilor – ne intereseazã sã vedem dacã nu cumva o anumitã
activitate este mai bine sã fie automatizatã sau sã fie lãsatã la nivelul manual de
execuþie.

Ce face? Când? Ar putea fi automatizatã?


Primeºte oferta Ocazional Nu – primirea documentelor trebuie fãcutã
personal.
Înregistreazã oferta La sosirea Nu – chiar dacã înlocuim registrul cu un fiºier
în registru ofertei pe disc introducerea datelor trebuie fãcutã
manual.
Consultã registru La sosire client Da. Imaginãm o interfaþã a programului care
sã permitã dialogul cu operatorul de la ghiºeu.
Vom afiºa o listã, cu toate revistele la care se
poate face abonamente, din care se poate
alege cea solicitatã.
Elaboreazã chitanþa „ Da – chiar dacã este un document tipizat poate
fi creatã o machetã adecvatã ºi afiºatã chitanþa
la imprimantã.

$
Înregistreazã chitanþa „ Da – odatã acceptat abonamentul se
în registru memoreazã pe disc operaþia.
Calcul sume din Zilnic Da – printr-o filtrare pentru toate abonamentele
chitanþe din ziua curentã.
Elaborare situaþie Început de lunã Da – filtrare abonamente contractate pentru
pe strãzi luna curentã:
– grupare pe strãzi
– afiºare client, revistã, numãr bucãti
– totalizare numãr bucãþi, pe strãzi ºi pe
reviste
Elaborare situaþie Început de lunã Da – filtrare chitanþe din luna anterioarã
pe edituri – grupare pe edituri – ordonare pe reviste
ºi luni
– totalizare sume ºi comision pe edituri
Trimite banii la edituri Început de lunã Nu – la acest nivel al automatizãrii noastre.
Putem doar sã afiºãm suma datoratã fiecãrei
edituri.

F2. Lista documentelor – ca purtãtori de informaþii – ne intereseazã sã vedem


dacã sunt cumva anumite documente care nu ºi-ar justifica prezenþa în momentul
folosirii suporturilor magnetice de memorare.

Document Proprietãþi, rol Poate fi eliminat?


Oferta Vine de la editurã; justificã abonarea la o anumitã NU
revistã sau comisionul
Chitanþa Pleacã la client. Dovada achitãrii sumei ºi NU
solicitãrii unei reviste
Registrul de Este un document staþionar pentru facilitarea Da, dacã folosim o
oferte cãutãrilor legate de abonare sau preþuri, colecþie pentru
comision etc. aceleaºi date
Registrul de Este un document staþionar, utilizat pentru Da, dacã folosim o
abonamente evidenþa abonamentelor ºi obþinerea unor situaþii colecþie pentru
aceleaºi date

F3. Cum aratã documentele ºi ce conþinut au?

%
Proiectarea entitãþilor bazei de date
Ne propunem ca baza de date sã conþinã douã entitãþi:
OFERTE (nume-editurã, adresa, nume-revistã, preþ,
comision) ºi CHITANTE (nume client, numar-chitanþã, adresa,
nume-revistã, nume-editurã, preþ, l1,l2,...,l12, suma)
Relaþiile dintre ele sunt de tipul 1-n: pentru o ofertã se pot
înregistra mai multe abonamente. Un abonament face referire
la o singurã ofertã.

Normalizarea bazei de date


Sã continuãm operaþia de proiectare a bazei de date prin activitatea de
normalizare. Tabelele sunt:

OFERTE
Editura Adresa Revista Preþ Comision
ALFA Galati, str. Oltului, nr. 55 Licurici 10000 20
ALFA Galati, str. Oltului, nr. 55 Ping-Pong 20000 19
MINERVA Lugoj, str. Iubirii, bl. 6/3 Ghici? 50000 20

CHITANTE
Nr-chit Client Adresa Revista Preþ L1 L2 .. L 12 Suma
12 POPA str. Vasile Banu, 5 Ping-Pong 20000 2 0 0 0 40000
13 LUNGU Podu Ros, nr. 120 Ping-Pong 20000 1 1 1 1 240000

Observaþii:
1. numele ºi adresa editurii se repetã la fiecare ofertã;
2. numele clientului ºi adresa se repetã la fiecare abonament;
3. lipseºte data chitanþei;
4. preþul revistei este acelaºi, indiferent cine o cumpãrã;
5. pentru simplificarea exemplelor vom face abonamente doar pe primele 6 luni;
6. suma este un câmp calculat.
În vederea remedierii acestor deficienþe vom stabili structura conceptualã a
bazei de date formatã din urmãtoarele tabele:
EDITURI (Cod_editura, nume, adresa)
REVISTE (Cod_editura, cod_revista, nume, pret)
OFERTE (cod_editura, cod_revista, comision)
CLIENTI (cod_client, nume, strada, nr)
CHITANTE (nr_chitanta, data_chitanta, cod_client, cod_revista, l1,l2,l3,l4,l5,l6)

&
Fixarea relaþiilor
EDITURI→1-n→ REVISTE→1-1→OFERTE; REVISTE→1-n→CHITANTE;
CLIENTI→1-n→CHITANTE
Cheile tabelelor sunt îngroºate.

Precizãri:
a. Existã o ordine a proiectãrii tabelelor, în funcþie de relaþiile dintre ele, ºtiind
cã în mod automat se pot fixa aceste relaþii dacã folosim câmpurile Lookup.
Deci vom proiecta mai întâi tabelele EDITURI ºi CLIENTI, apoi tabela REVISTE
ºi apoi CHITANTE ºi OFERTE.
Câmpurile tip Lookup vor fi cod_editura din REVISTE, cod_revista din OFERTE
ºi CHITANTE ºi cod_client din CHITANTE.
b. Codurile editurii, clientului ºi revistei le vom putea lãsa de tip autonumber, de
la valoarea iniþialã 1 – le fixãm drept cheie prin butonul Key de pe bara cu
butoane!
c. Pentru numãrul chitanþei – de acelaºi tip autonumber – presupunem cã se
începe cu o valoare diferitã de 1 (noi am ales valoarea 1000).
Obsevaþie:
Pentru a realiza aceastã inþializare vom proceda astfel: salvãm definiþia tabelei
CHITANTE. Proiectãm o nouã tabelã MANEVRA ce conþine un singur câmp, numit
start, cu valoarea 1000. Apoi proiectãm o interogare de tip append pentru tabela
MANEVRA. Plasãm coloana start din manevrã ºi indicãm, în linia Append To, numele
câmpului unde dorim sã facem copierea valorii: nr_chitanta din tabela CHITANTE.
Salvãm ºi rulãm o singurã datã!

Proiectarea formularelor de introducere a datelor


Pentru fiecare tabelã putem realiza rapid un formular de introducere/editare a
datelor cu Form Wizard. Formularul pentru introducerea chitanþelor va trebui sã
afiºeze ºi valoarea de achitat în funcþie de preþul revistei ºi de numãrul exemplarelor
cumpãrate în fiecare lunã:

'
Pasul 1. Pregãtim datele necesare acestui formular ºi a altor rapoarte, printr-o
interogare care sã conþinã toate câmpurile din tabelele bazei de date; vom
introduce câmpul calculat suma (valoricã) nu este asociatã unei chitanþe,
ca produs între preþul revistei ºi suma abonamentelor. Numim aceastã
interogare edituriQuery.
Pentru aceastã interogare important este sã deschidem tabelele dorite cu
legãturile dintre ele. La poziþionarea pe o chitanþã avem acces prin legãturi
la toatã linia corespunzãtoare din revista solicitatã ºi putem folosi preþul
revistei ca ºi când ar exista alãturi de chitanþã!

Pasul 2. Deschidem Form Designer ºi aranjãm câmpurile pe suprafaþa de lucru.


Denumim formularul Chitante.

Proiectarea rapoartelor
Dintre situaþiile solicitate vom examina o listã a abonamentelor pe reviste, care
sã totalizeze numãrul de exemplare la nivelul fiecãrei chitanþe, ºi pe luni, la nivelul
revistei. De asemenea, dorim sã se calculeze valoarea cuvenitã pe fiecare revistã
ºi comisionul total.
Paºi. Vom pregãti datele necesare printr-o interogare din tabelele REVISTE→
1-1→OFERTE ºi REVISTE→1-n→CHITANTE. Vom extrage numele revistei, preþul


din REVISTE, comisionul din OFERTE, respectiv numãrul chitanþei, numele clientului
ºi lunile abonate din CHITANTE. Vom grupa datele pe reviste. Vom insera un câmp
calculat cu totalul numeric al revistelor, la nivelul chitanþei.

Realizarea panoului central al aplicaþiei

Pentru realizarea panoului de bord vom folosi utilitarul Switchboard Manager,


lansat din Tools→Databases Utilities.


Rezolvãri ºi indicaþii
Problema 1.2. Se cer informaþii despre persoane ºi locuinþele lor.
Un imobil are mai multe apartamente. O persoanã are mai multe proprietãþi
(imobile sau apartamente). Un imobil sau un apartament poate sã fie în proprietatea
mai multor persoane.
Baza de date poate fi formatã din urmãtoarele entitãþi:

Tabelele sunt:
IMOBILE (cod-imobil, strada, numar, bloc, scara, apartament)
APARTAMANTE (cod_imobil, cod_apartament, nr_camere, suprafata, tip_incalzire etc.),
unde tip_încãlzire poate fi cu gaze, cu lemne, fãrã încãlzire etc.
PERSOANE (BI, date_pers, ocupatie, data_nasterii)
PROPRIETARI (cod_apartament, cod_persoana, data_cumpararii etc.)
LOCUITORI (cod_apartament, cod_persoana).
Problema 3.3.
Observaþi structura tabelei CARTI pentru câmpul
data_intrarii_în_biblioteca, unde am pus
obligativitatea completãrii (proprietatea este Re-
quired), valoarea implicitã (Default) ºi condiþia de
validare Validation Rule. Observaþi, de asemenea,
funcþii pentru date calendaristice: funcþia sistem
Date(), Year(<data_calendaristica>)
Este bine, ca odatã fixatã o anumitã condiþie de
validare, sã fie compus ºi textul care va fi afiºat de
sistem.
Problema 4.2. c.
F-1; E-2; H-3; D-4; C-5; I-6; B-7; A-8; G-9; L-10; K-11; J-12.
Problema 6.3.
Tabelele existente sunt TABLE2 (indicatii), TABLE3 (mod_vanzare), TABLE4
(farmacii, adresa, banca). Lipseºte TABLE1, dar aceasta este „vizibil㔠prin subseturile
de date afiºate de celelalte tabele.
TABLE1 (medicam, cant, pret, lookup to TABLE2, lookup to TABLE3, lookup to
TABLE4):


Cum am judecat?
TABLE4 deschide subset de date pentru coloana farmacii; astfel, este folosit în
tabela TABLE1 câmpul farmacii drept câmp de cãutare cãtre TABLE4 (Lookup to
TABLE4). Deci este stabilitã o relaþie TABLE4→(1-n)→TABLE1.
TABLE2 are ca subset de date coloana indicatii, deci, o coloanã cu numele
indicatii va exista în tabela xxx ºi corespunzãtoare una cu numele Lookup to TABLE2
în TABLE1. Relaþia este TABLE2→(1-n)→TABLE1.
TABLE3 are ca subset de date asociat coloanei mod_vanzare. Deci, în aceastã
coloanã relaþia este TABLE3→(1-n)→TABLE1.
b. Tabela veche este XXX (farmacii, adresa, banca, medicament, indicatii,
mod_vanzare, cant, pret).
Problema 6.4.
O vom normaliza ºi obþinem douã tabele ELEVI (clasa, cod-elev, nume, adresa)
ºi CLASE (cod_clasa, diriginte)
Problema 6.5.
Cheia poate fi grupul (nume_curs + nume_prof + nume_elev) ºi observãm
dependenþele funcþionale. Atributul nr_ore depinde numai de nume_curs ºi, even-
tual, de profesorul care þine cursul. Gradul didactic depinde de nume_prof. Se impune
normalizarea: CURSURI (nume_curs, cod_curs, nr_ore, cod_prof), PROFESORI
(cod_prof, nume_prof, grad) ºi OPTIUNI (cod_curs, nume_elev).
Problema 7.4.
Deschidem baza de date BIBLIOTECA. Verificãm sã existe tabelele CARTI (id,
nr_inv, titlu, autor, editura, ediþia, data_intr, data_ies, stare, este_manual?, colectia,
rezumat, coperta, etc.), CITITORI (cod, nume, adresa, telefon, ocupatie, loc_munca,
data_nasterii, cnp etc.) ºi OPERATII (cod_carte, cod_cititor, data_imp, data_rest).
Relaþiile sunt CARTE→1-n→OPERATII (carte.id=operatii.cod_carte)
ºi CITITORI→1-n→OPERATII (cititori.id=operatii.cod_cititor).

1. Care sunt cãrþile existente (autor, preþ, numãr de


exemplare) al cãror nume începe cu „informatica“?
Select * from CARTI where
titlu like „informatica*”

2. Care sunt cãrþile din colecþia „SF“?


Select * from CARTI where colectia=”SF”

3. Ce cãrþi din colecþia „SF“ au


preþul cuprins între 100.000 ºi
200.000 de lei?
Select* from CARTI where
colectia=”SF” and pret between 100
and 200

4. Ce cãrþi au fost scoase din inventar dupã 1999?


Select * from CARTI where Data_ies >=#1.1.2000#

!
5. Care sunt titlurile cãrþilor intrate în bibliotecã în
intervalul x-y?
Select * from CARTI where data_intrare
between [X] and [Y]

6. Cãrþile de poezii sau poeme sau ale lui


M. Eminescu.
Select carti.titlu, carti.autor from
CARTI
where carti.titlu=”poezii” or
carti.titlu=”poeme” or carti.autor Like
“*eminescu”

7. Sunt cãrþi la care nu s-a completat numele autorului. Care


sunt acestea?
Select* from CARTI where autor =is Null

8. Dorim sã selectãm cãrþile care se referã la


programare.
Select * from CARTI where
carti.titlu like „*program*”

9. Care sunt cãrþile din colecþia


„Info“ ordonate cronologic dupã
data intrãrii în bibliotecã?
Select carti.*, carti.colectia,
carti.data_intr from CARTI
where (((carti.colectia)=”INFO”))
order by carti.data_intr;

10. Care sunt cãrþile autorului X?


Select carti.*, carti.autor
from CARTI
where (((carti.autor)=[x]));

11.Care este preþul pe paginã calculat la fiecare carte a autorului X, în ordinea


descrescãtoare a acestor valori?

Select [pret]/[nr_pagini] as pret_pe_pagina, carti.autor


from CARTI where(((carti.autor)=[dati numele autorului]))
order by [pret]/[nr_pagini] DESC;

"
12. Care a fost durata de staþionare a cãrþilor (desigur care au ieºit din evidenþã)?
Se va calcula în ani ºi se va afiºa în ordinea crescãtoare a acestei durate.

Select DateDiff(“yyyy”,[data_intr],[data_ies]) as durata, carti.titlu


from CARTI
where (((DateDiff(“yyyy”,[data_intr],[data_ies])) Is Not Null));
13. Care sunt cititorii elevi înscriºi la bibliotecã?
Select nume from ELEVI
where ocupatie=”elev”
14. Lista cãrþilor cele mai scumpe din
fiecare colecþie?
Select carti.colectia,
Max(carti.pret) as max_pret
from CARTI
group by carti.colectia;

15. Câþi cititori sunt elevi?


Deschidem banda de grupare ºi totalizare
prin View→Totals
Select Count(cititori.ID) as nr_pers
from CITITORI
group by cititori.ocupatie having
cititori.ocupatie=”elev”;
16. Afiºaþi toate operaþiile de împrumut (cu sau fãrã restituire) cu data, numele
cititorului ºi numele cãrþii. Vom construi o interogare pornind de la cele 3 tabele. Va
trebui sã parcurgem însã tabela OPERATII în întregime, deci asocierea va fi legatã
de acest lucru. Observaþi aranjarea sugestivã a tabelelor.

Am editat fiecare legãturã ºi am verificat asocierea doritã. De la OPERATII→1-1→CARTI


ºi OPERATII→1-1→CITITORI.

#
Select operatii.ID, carti.titlu, cititori.nume,
operatii.data_rest, operatii.data_impr
from (OPERATII inner join CITITORI on
operatii.cod_cititor = cititori.ID) inner join CARTI on
operatii.cod_carte = carti.ID;
17. Aflaþi numai acele împrumuturi care nu au fost returnate.

Select operatii.ID, carti.titlu, cititori.nume,


operatii.data_rest, operatii.data_impr
from (OPERATII inner join CITITORI on
operatii.cod_cititor = cititori.ID) inner join CARTI on
operatii.cod_carte = carti.ID
where (((operatii.data_rest) Is Null));
18. Afiºaþi numãrul de zile între data_imprumutului ºi data restituirii.

Select operatii.ID, carti.titlu, cititori.nume,


operatii.data_rest, operatii.data_impr,
DateDiff(“d”,[data_impr],[data_rest]) as nr_zile
from (OPERATII inner join CITITORI on
operatii.cod_cititor = cititori.ID) inner join CARTI on
operatii.cod_carte = carti.ID;

$
19. Aþi putea afla care sunt situaþiile
în care numãrul de zile întârziere între
împrumut ºi restituire este >14?
Select operatii.ID,
carti.titlu,
cititori.nume,
operatii.data_rest,
operatii.data_impr,
DateDiff(“d”,[data_impr],[data_rest]) as nr_zile
from (OPERATII inner join CITITORI on
operatii.cod_cititor = cititori.ID) inner join CARTI on
operatii.cod_carte = carti.ID
where (((DateDiff(“d”,[data_impr],[data_rest]))>14));
21. Care sunt cititorii restanþieri la data curentã? Pentru fiecare cititor se va afiºa
numele, numele cãrþii nerestituite, precum ºi data când a fost împrumutatã. Restanþieri
se considerã cei pentru care numãrul de zile de la data împrumutului depãºeºte 14.
Calculaþi penalizarea pentru întârziere, presupunând cã se cer 200 lei/zi întârziere.
Select [titlu] & “ de “ & [autor] as carte,
cititori.nume, operatii.data_impr, operatii.data_rest,
DateDiff(“d”,[data_impr],Date()) as nr_zile,
200*[nr_zile] as penaliz
from CITITORI inner join (CARTI inner join OPERATII on
carti.ID = operatii.cod_carte) on cititori.ID = operatii.cod_cititor
where operatii.data_rest Is Null and
DateDiff(“d”,[data_impr],Date())>14
order by cititori.nume;

22. Cartea X se gãseºte pe raft sau este la un cititor? La care?


O variantã este de a afiºa numele cititorului care a împrumutat ºi nu a restituit
cartea x.

Select cititori.nume, carti.nr_inv, operatii.data_impr,


operatii.data_rest
from CITITORI inner join (CARTI inner join OPERATII on
carti.ID = operatii.cod_carte) on cititori.ID = operatii.cod_cititor
where (((operatii.data_impr) Is Not Null) and
((operatii.data_rest) Is Null));

%
23. Câte cãrþi sunt în biblio-
tecã pe edituri ºi pe co-
lecþii?
Vom apela Crosstab Query
Wizard ºi ca sursã tabela CARTI.
Transform count(carti.ID)
as countOfID
select carti.editura from CARTI group by carti.editura
pivot carti.colectia;
24. Câte manuale sunt în bibliotecã?
Select count(carti.ID) as nr_carti
from CARTI
group by carti.[este_manual?]
having (((carti.
[este_manual?])=True));

25. Numãrul de manuale pe edituri


(Crosstab Query).
Transform count(carti.ID)
as countOfID
Select carti.editura
from CARTI group by
carti.editura
pivot carti.colectia;

26. Care sunt editurile care au publicat manuale ºcolare?

Select distinct carti.[este_manual?], carti.editura


from CARTI
where (((carti.[este_manual?])=Yes));

27. Care sunt cãrþile împrumutate de cititorul X? Cea mai recentã operaþie sã fie
prima!
Select Query cu parametru pe nume cititor, sursa de date fiind cele 3 tabele
legate ca la punctul 15.
Select operatii.data_impr, carti.titlu, cititori.nume
from CITITORI right join (CARTI right join OPERATII on
carti.ID = operatii.cod_carte) on cititori.ID = operatii.cod_cititor
where (((cititori.nume)=[x]))
order by operatii.data_impr DESC;

&
28. Cine a citit cartea X?
Select Query cu sursã de date cele 3 tabele relaþionate.
Select operatii.data_impr, carti.nr_inv, carti.titlu, cititori.nume
from CITITORI right join (CARTI right join OPERATII on
carti.ID = operatii.cod_carte) on cititori.ID = operatii.cod_cititor
where (((carti.nr_inv)=[x]))
order by operatii.data_impr DESC;

29. Care sunt cãrþile împrumutate în ziua X? De cine au fost împrumutate?


Select Query cu parametru pe operatii.data_impr, sursa de date fiind cele 3
tabele legate.
30. Cine ºi când a împrumutat cãrþi ale lui Mihai Eminescu?
Select Query având criteriu Autor=”M.Eminescu”, sursa de date fiind cele 3 tabele
legate.
31. Care sunt cãrþile împrumutate în luna iunie anul curent (numele cititorului ºi
numele cãrþilor)?

Select DatePart(“m”,[data_impr]) as luna, [titlu] &


[autor] as Carte, cititori.nume

'
from CITITORI inner join (CARTI inner join OPERATII on
carti.ID = operatii.cod_carte) on cititori.ID = operatii.cod_cititor
where (((DatePart(“m”,[data_impr]))=6));

32. Situaþia numãrului de cãrþi împrumutate pe luni ºi pe cititori.


Pasul 1. Realizãm o interogare pentru a grupa informaþii din cele 3 tabele, precum
titlul, cititorul ºi luna împrumutului. O vom numi carti_pe_luni:
Select DatePart(“m”,[data_impr]) as luna, [titlu] &
[autor] as Carte, cititori.nume
from CITITORI inner join (CARTI inner join OPERATII on
carti.ID = operatii.cod_carte) on cititori.ID = operatii.cod_cititor;

Pasul 2. Deschidem Query Wizard Crosstab având ca sursã de date interogarea


anterioarã. Specificãm câmpul luna pentru coloanã, câmpul nume pentru linie ºi
funcþia Count pentru zona de date. Observãm interogarea realizatã de Wizard în
modul Design.

Transform Count(carti_pe_luni.Carte) as CountOfCarte


select carti_pe_luni.nume, Count(carti_pe_luni.Carte) as [Total Of Carte]
from carti_pe_luni group by carti_pe_luni.nume pivot carti_pe_luni.luna;

33. Afiºaþi cititorii înscriºi care nu au împrumutat nicio carte sau care au
împrumutat, dar nu în anul curent.
Putem realiza o interogare de cãutare a articolelor fãrã corespondent, prin Find
Unmatched query Wizard, pe care o completãm cu cerinþa suplimentarã ca anul
împrumutului sã fie diferit de anul curent.

Select cititori.nume, cititori.adresa


from CITITORI left join OPERATII on cititori.ID = operatii.cod_cititor
where (((operatii.cod_cititor) Is Null)) or
(((operatii.cod_carte) Is Not Null) and
((DatePart(“yyyy”,[data_impr]))<>Year(Date())));

 
34. Numãrul cititorilor pe ocupaþii.
Folosim Query Design; inserãm banda
de totalizare prin View→Totals.
Select count(cititori.ID) as nr_pers,
cititori.ocupatie
from CITITORI
group by cititori.ocupatie;

35. Evidenþa tuturor operaþiilor, ordonate dupã data împrumutului, fiecare operaþie
cuprinzând numele cititorului ºi titlul cãrþii.
Vom deschide o nouã interogare ºi vom adãuga cele 3 tabele. De aceastã datã
vom verifica sã fie introduse toate operaþiile ºi numai acele linii din tabela CARTI
care corespund cheii de legãturã. Observaþi poziþia tabelelor în fereastra de proiectare
a interogãrii ºi editarea legãturilor.

Select operatii.data_impr,
carti.titlu, cititori.nume
from CITITORI right join
(CARTI right join OPERATII on
carti.ID =
operatii.cod_carte) on
cititori.ID =
operatii.cod_cititor
order by operatii.data_impr
DESC;

36. Numãrul cãrþilor intrate ºi numãrul


cãrþilor ieºite din inventar, pe ani (de
exemplu, între 1999 ºi 2003).
Pasul 1. Construim o interogare plecând
de la tabela CARTI ºi asociem fiecãrei cãrþi
anul intrãrii ºi anul ieºirii. Numim interogarea
Ani-intr-ies.

 
Select Year([data_intr]) as anul1, Year([data_ies]) as anul2, carti.ID
from CARTI;

Pasul 2. Calculãm numãrul cãrþilor intrate


pe ani, plecând de la interogarea anterioarã,
în interogarea Nr-intr_ani.
Select [ani-intr_ies].anul1,
count([ani-intr_ies].ID) as nr_intr
from [ani-intr_ies]
group by [ani-intr_ies].anul1;
Pasul 3. Realizãm o tabelã de manevrã cu anii doriþi. Cheia
tabelei este chiar câmpul ani.
Pasul 4. Calculãm numãrul de cãrþi ieºite, pe ani, în interogarea
Nr_ies_ani.
Select [ani-intr_ies].anul2, count([ani-intr_ies].ID)
as nr_ies
from [ani-intr_ies]
group by [ani-intr_ies].anul2;
Pasul 5. Realizãm interogarea ultimã care
leagã tabela ANI de interogãrile anterioare,
în vederea aflãrii numãrului de cãrþi intrate
ºi numãrului de cãrþi ieºite anual.
Select ani.ani, nr_ies_ani.nr_ies, nr_intr_ani.nr_intr
from (ANI left join nr_ies_ani on ani.ani = nr_ies_ani.anul2)
left join nr_intr_ani on ani.ani = nr_intr_ani.anul1;

37. Valoarea totalã a cãrþilor din bibliotecã.


Select Sum([pret]) as total
from CARTI;


38. Afiºaþi ca subset de date restanþele fiecãrui cititor.

Pasul 1. Deschidem tabela CITITORI prin Database Window.


Pasul 2. Verificãm prezenþa câmpului Id în interogarea Restante, pentru a putea
realiza legãtura între cele douã tabele.
Pasul 3. Prin comanda Insert→Subdatasheet fixãm ca subsetul sã fie din
interogarea Restanþe pe care am realizat-o în sarcina anterioarã. Alegem cheia de
legãturã ca fiind codul cititorului din ambele tabele.
39. Afiºaþi toþi cititorii elevi înscriºi la bibliotecã,
ordonat dupã clasã, ºi, alãturat, un mesaj
dacã au sau nu restanþe!
Select distinct cititori.ID, cititori.nume,
iif([restante].[cod_cit]
Is Null,”nu”,”da”) as [are_res?]
from CITITORI left join Restante on
cititori.ID = restante.cod_cit;
Pasul 1. Deschidem o nouã interogare pentru tabela CITITORI ºi interogarea
Restante obþinutã în sarcinile anterioare. Verificãm sã existe codul cititorului!
Pasul 2. Fixãm relaþia între tabela CITITORI ºi interogarea Restante astfel încât
sã obþinem toþi elevii. Asocierea va fi Right Join.
Pasul 3. Specificãm câmpurile dorite. Atenþie la ultima coloanã!

Pasul 4. Pentru a obþine fiecare cititor cu mesajul


dorit este necesar sã indicãm unicitatea valorilor. Deci,
deschidem fereastra Properties ºi alegem Unique
Value=”yes”.

 !
40. Afiºaþi cele mai scumpe cãrþi (primele 10!) existente în bibliotecã.
Select top 10 carti.titlu, carti.pret
from CARTI order by carti.pret DESC;

41. Sunt cãrþi pierdute care trebuie scoase din evidenþã. Pentru acestea se
foloseºte câmpul stare. Treceþi în altã evidenþã cãrþile deteriorate ºi, apoi,
ºtergeþi-le din tabela CARTI.
Pasul 1. Salvãm cãrþile pierdute în altã
tabelã. Vom construi o interogare tip Make-
table.
Select carti.* into PIERDUTE
from CARTI
where (((carti.stare) Like “pierdut*”));

Pasul 2. Rulãm interogarea pentru a crea o nouã tabelã.


Verificãm datele!
Tabela iniþialã rãmâne nemodificatã!
Pasul 3. Construim o interogare de ºtergere cu acelaºi
criteriu stare.
Delete carti.stare
from CARTI
where (((carti.stare)=”pierduta”));
42. De fapt, toate cãrþile autorului X ar trebui sã fie scoase
din evidenþã!
Delete carti.autor=[x] from CARTI where carti.autor=[x]
43. Toate cãrþile apãrute în bibliotecã înainte de anul 1990 au preþul majorat cu
0,1%.
Pasul1. Realizãm o interogare
de actualizare. Impunem condiþia
ca data intrãrii cãrþii sã fie dupã
2003.
Câmpul care se modificã va fi
preþul.
Observaþie: De obicei, marca zecimalã este punctul, noi am setat-o la virgulã!
Pentru câmpul nr_inv nu facem nicio corecþie, dar îl folosim pentru recunoaºterea

 "
valorilor care vor fi actualizate înaintea operaþiei efective. Nu uitaþi sã vizualizaþi

datele care vor suporta acþiunea de actualizare prin butonul Datasheet View.
Expresia de actualizare poate fi ºi cea din figura urmãtoare!
Update CARTI set carti.pret = [pret]*1.01,
carti.nr_inv = [nr_inv]
where (((carti.data_intr)>#1/1/2003#));

44. Editura „Albatros“ ºi-a schimbat numele


în „PINGUIN“ la 1 septembrie 1992.
Update CARTI set carti.editura =
“PINGUIN”
where (((carti.editura)=”Albatros”) and
((carti.data_intr)>#9/1/2002#));
45. Mutaþi în altã evidenþã manualele
ºcolare. Apoi reconstruiþi tabela CARTI.
Pasul 1. Construim o interogare tip Make-table
pentru tabela CARTI cu filtru pe câmpul
Este_manual? Vom indica numele tabelei noi,
MANUALE, în aceeaºi bazã de date.
Tabela nouã va avea aceleaºi coloane ca ºi
tabela iniþialã.
Select carti.* into MANUALE
from CARTI where (((carti.[este_manual?])=Yes));
Pasul 2. Proiectãm o interogare de ºtergere pentru
manulele ºcolare din tabela CARTI
Delete carti.[este_manual?]
from CARTI
where (((carti.[este_manual?])=True));
Pasul 3. Vizualizãm datele din cele douã tabele CARTI ºi MANUALE.
Pasul 4. Dorim sã refacem tabela CARTI prin
adãugarea conþinutului tabelei MANUALE. Pentru
aceasta proiectãm o interogare Append Query.
Deschidem tabela MANUALE ºi specificãm tipul
interogãrii prin meniul principal Query→ Append
Query. Indicãm coloanele, apoi numele tabelei
destinaþie CARTI.
Insert into CARTI
select manuale.*
from manuale;
46. Dorim sã copiem datele din tabela CITITORI într-o
nouã tabelã, în baza de date FARMACII (existentã
deja). Tabela se va numi PERSOANE ºi va avea
doar structura tabelei CITITORI
Pasul 1. Construim o interogare Make-table, indicãm
numele noii tabele, respectiv baza de date unde va fi
construitã.

 #
Select cititori.* into PERSOANE in
‘D:\manuale\laborator\farmacii.mdb’
from CITITORI
Pasul 2. Deschidem baza de date FARMACII ºi
vizualizãm tabela PERSOANE. Dacã am lucrat corect
aceasta existã ºi va conþine toate articolele tabelei
CITITORI. Vom ºterge toate liniile!
Pasul 3. Construim interogarea de ºtergere a liniilor
acestei tabele. Pentru cã
numele persoanei era
obligatoriu pus, fixãm
condiþia de selectare a articolelor care vor fi ºterse prin
nume is not null.
Delete persoane.nume
from PERSOANE
where (((persoane.nume) Is Not Null));
47. Numele autorului „G.B.SHAW“ a fost scris greºit
sub forma „G.B.SOU“ sau „g.b.sou’. Efectuaþi
corecþia!
Update CARTI set carti.autor = “G.B. Show”
where (((carti.autor)=”G.B.SOU”))
or (((carti.autor)=”g.b.sou”));
Problema 8.2.-vezi rezolvãri 7.4
Problema 8.3. Baza de date este formatã din tabelele PROFESORI (cod_prof,
nume, specialitatea, grad_didactic...), OPTIONALE (cod_prof, cod_obiect,
nume_obiect, numar-ore), INSCRIERI (ID, cod_elev, cod_obiect), ELEVI (cod_elev,
nume, clasa...).

a) Dorim sã aflãm care sunt elevii care s-au înscris ºi la ce cursuri.


Select elevi.nume_elev, elevi.clasa, profesori.nume, optionale.nume_obiect
from ELEVI inner join ((OPTIONALE inner join INSCRIERE on
optionale.cod_obiect = inscriere.cod_obiect) inner join PROFESORI on
optionale.cod_prof = profesori.cod_prof) on
elevi.cod_elev = inscriere.cod_elev;

 $
b) Dorim sã aflãm ce elevi nu ºi-au ales (încã!) obiectul opþional.
Vom folosi o interogare care parcurge tabela ELEVI ºi, pentru fiecare elev, va
reþine numele ºi clasa numai dacã în tabela INSCRIERE existã o linie care sã
conþinã codul elevului. Folosim deci o subinterogare care sã întoarcã, din fiºierul
INSCRIERE, articolele care au codul elevului pe care suntem poziþionaþi în interogarea
principalã. Dacã rezultatul acestei subinterogãri este zero, atunci predicatul Exists
va avea valoarea fals.
Select elevi.nume_elev, elevi.clasa
from ELEVI where (((Exists (select * from INSCRIERE where
inscriere.cod_elev= elevi.cod_elev))=False));

c) Dorim sã aflãm care profesor nu a propus nicio disciplinã opþionalã:


select profesori.nume from PROFESORI
where (((Exists (select * from OPTIONALE where
optionale.cod_prof= profesori.cod_prof))=False));

d) Dorim sã aflãm la ce profesori ºi la ce cursuri nu s-a înscris niciun elev.


Vom folosi douã interogãri: prima, pe relaþia OPTIONALE ºi INSCRIERE, aflã
codurile profesorilor; a doua foloseºte interogarea precedentã ºi face legãtura cu
PROFESORI pentru determinarea numelui acestora.
Pasul 1. Realizãm o interogare de manevrã ºi aflãm numele cursurilor ºi codul
profesorilor care nu au elevi înscriºi. Am numit-o Query6.

Select nume_obiect, cod_obiect, cod_prof


from OPTIONALE
where (((exists(select * from INSCRIERE where
inscriere.cod_obiect= optionale.cod_obiect))=false));

 %
Pasul 2. Folosim interogarea anterioarã ºi aflãm numele profesorilor.
Select profesori.nume,
query6.nume_obiect from
query6 inner join PROFESORI on
query6.cod_prof=profesori.cod_prof
e) Dorim sã afiºãm un mesaj pentru fiecare
profesor dacã are sau nu vreun curs opþional propus:
Select profesori.nume, iif(Exists (select * from
OPTIONALE where
optionale.cod_prof=profesori.cod_prof),”da”,”nu”)
as [are propus optional?]
from PROFESORI;

f) Presupunem cã se pun note la fiecare opþional. Dacã media obþinutã la toate


opþionalele este mai micã decât 5 se considerã elevul „nepromovat“. Am proiectat
o tabelã MEDII (cod_elev, cod_obiect, media) ºi o interogare prin care obþinem
media generalã pentru fiecare elev.

Select elevi.nume_elev, Avg(medii.media) as


media_optionale, iif([media_optionale]>=5,”da”,”nu”) as [promovat?]
from ELEVI inner join (OPTIONALE inner join MEDII on
optionale.cod_obiect = medii.cod_obiect) on elevi.cod_elev = medii.cod_elev
GROUP BY elevi.nume_elev;
Problema 9.5.
Pentru a ataºa numãrul curent al
elevului în clasã vom folosi un obiect
Field (prin copiere!) ºi vom scrie
proprietãþile Control Source=1;
Running Sum=”Over Group”.

 &
Problema 9.12.
Pasul 1. Interogarea pregãtitoare este realizatã din tabela CARTI.

Pasul 2. Realizãm un raport simplu cu grupare prin Report Wizard. Grupul va fi


dat de coloana clasa a interogãrii sursã. Specificãm dorinþa de a însuma numãrul
de exemplare la nivelul grupului ºi al raportului.
Pasul 3. Editãm raportul intrând în modul
Design.
1. trecem un câmp calculat pe banda Detail
pentru valoare ca fiind egal cu expresia
pret*nr_exemplare.
2. trecem un câmp calculat pe banda
de subsol la nivelul grupului, pentru
calcularea sumei valorice a manualelor
clasei.
Funcþia folositã este sum având ca
parametru produsul dintre preþ ºi numãr
de exemplare. Se poate edita direct pe
linia Control Source sau deschidem
fereastra ZOOM prin <shift>+F2.
3. trecem un câmp calculat pe banda
de subsol raport, pentru calcularea
totalului valoric.
Observaþi proiectul de raport ºi
proprietãþile importante ale acestui câmp.
Control Source foloseºte tot funcþia Sum,
dar vom seta proprietatea Running Sum
=”over All”.
Problema 9.12.2. Restanþierii si penalizãrile lor.
Baza de date este formatã din cele 3 tabele relaþionate, iar o interogare care sã
obþinã restanþierii o avem rezolvatã deja – vezi rezolvãrile din lecþia 6.

Am imaginat douã variante de rezolvare: una în care numãrul de zile ºi penalizarea

 '
sunt calculate în interogare ºi cealaltã, în care se folosesc câmpurile calculate ale
raportului. Suma pentru penalizarea corespunzãtoare unei zile întârziere este
parametru în interogare.
Varianta 1. Vom construi o interogare cu toate coloanele pentru raport. Observaþi
modul cum am introdus parametrul: în expresia de calcul a penalizãrii (între paranteze
pãtrate!)

La execuþia interogãrii se va afiºa caseta de dialog ºi, în funcþie de valoarea


introdusã, se afiºeazã coloana penaliz.
Raportul îl realizãm cu ajutorul Report Wizard, având ca sursã de date interogarea
anterioarã.
Varianta 2. Interogarea
va conþine doar coloanele
titlu, autor, nume cititor,
data împrumutului, data
restituirii ºi numãr zile întârziere. Pe baza interogãrii construim, prin Report Wizard,
un raport pe care îl modificãm apoi prin Design Report. Astfel:
Pasul 1. Pe banda de titlu
adãugãm obiectul textbox având
Control Source=”suma penalizare
unitara” pe care o primim ca
parametru.
Pasul 2. Pe banda Detail
proiectãm obiectul textbox nr_zi
având Control Source=Datediff(“D”,[data_impr],date()).
Pasul 3. Pe banda Detail
proiectãm obiectul textbox
pentru penalizare având
Control Source= [suma
penalizare unitara]*[nr_zi].
Deschidem raportul ºi
observãm funcþionarea lui.

Problema 10.4.
Record→Data Entry sau proprietatea Data Entry=”Yes”.
Problema 10.6.
Se vor specifica coloanele în Form Wizard.
Folosiþi formularul anterior ºi interziceþi operaþiile de ºtergere ºi de adãugare de
articole; Allow Deletions=”NO”; Allow Additions=”NO”; Allow Edits=”YES”.

!
Problema 10.7.
Pasul 1. Vom proiecta mai întâi o interogare cu parametru, ca în imaginea alãturatã,
pe care o denumim interogarea „profesor_x”.
Pasul 2. Vom folosi Form Wizard indicând ca sursã de date interogarea anterioarã.
Pasul 3. Vom fixa proprietãþile care sã interzicã editarea datelor. Putem folosi ºi
proprietatea RecordSet type=”snapshot”, cu acelaºi efect.
Pasul 4. Vom seta proprietãþile de afiºare a formularului Record Selector=”No”;
Navigation Buttons=”No” Scroll Bars=”neither”. Caption=”profesor x”.

Problema 10.8.
Crearea unui formular pentru deplasarea ºi editarea a 2 tabele CLASE→1-n→
ELEVI
Pasul 1. Vom deschide Form Wizard fãrã sã specificãm sursa de date în prima
fereastrã.
Pasul 2. În fereastra a doua a utilitarului vom indica tabela CLASE ºi câmpurile
acesteia ºi apoi, fãrã sã trecem la pasul urmãtor, tabela ELEVI ºi coloanele acesteia.
Pasul 3. Vom indica tabela pãrinte: CLASE. Tabela copil ELEVI este folositã
pentru construirea automatã a unui formular care poate fi inclus în formularul de
editare a clasei sau este separat ºi deschis la acþiunea operatorului. În cazul nostru
am optat pentru un subformular inclus (Form with subforms).
Pasul 4. Trebuie specificatã forma subformularului. Este de preferat un tip tabelar,
pentru a nu aglomera fereastra de editare (are deja datele despre clase).
Pasul 5. Atribuim nume formularului principal ºi subformularului.
Pasul 6. Executãm, prin deschiderea formularului pãrinte (Clase).
Problema 10.12.
Proiectaþi formularul pentru introducerea/editarea datelor a 2 tabele legate.
Pasul1. În primul rând observãm cã pentru diriginte avem chiar numele
profesorului, nu codul acestuia, care este în tabela CLASE; deci, va trebui sã
construim o interogare folosind tabelele CLASE ºi PROFESORI (avem legãtura
clase.cod_dirig=profesori.id) Numim interogarea Clase_cu_nume_dirig.
Pasul 2. Proiectãm un nou formular folosind Form Wizard ºi indicãm în ordine
coloanele interogãrii anterioare (Clase_cu_nume_dirig este un query ºi, pentru cã
acest tabel este pãrinte, formularul primeºte acest nume implicit!) ºi apoi câmpurile
tabelei ELEVI.
Pasul 3. Specificãm gruparea ºi faptul cã formularele sunt legate (Linked forms).
Pasul 4. Salvãm ºi verificãm funcþionarea formularelor.

!
Pasul 5. Intrãm în Form Design, corectãm textul asociat butonului care deschide
subformularul (proprietatea Caption=”Vezi elevii!”) ºi schimbãm mãrimea ºi fontul
Font Name=”arial”, Font Size=11.
Pasul 6. Deschidem banda de sfârºit de formular ºi includem un obiect Label cu
textul dorit (proprietatea Caption=”actualizarea claselor si a elevilor”).
Problema 10.13.
Proiectarea unui ansamblu de formulare pentru editarea a 3 tabele!
SCOLI→1-n→CLASE→1-n→ ELEVI.

Pasul 1. Verificãm baza de date ºi, dupã caz, aplicãm corecþiile necesare. Trebuie
sã existe tabela SCOLI (cod, nume, adresa, tip_scoala etc.). Dacã nu, o vom crea!
Vom verifica sã existe un câmp de legãturã la tabela CLASE (exemplu cod_scoala
de tip Lookup, cu valori din tabela SCOLI). Vom verifica sã existe tabela ELEVI, cu
legãtura la CLASE prin câmpul cls.
Observaþie: Pentru noua situaþie este normal sã corectãm valorile asociate
câmpului cls: astfel, vom adãuga la codul anterior o cifrã pentru a codifica unic
clasele. Dacã tabela ELEVI are câmpul cls de tip Lookup nu mai este necesarã
modificarea manualã a valorilor (dupã cum ºtim orice modificare a cheii din tabela
PARINTE se reflectã automat ºi asupra cheii de legãturã din tabela COPIL).
Pasul 2. Proiectarea interogãrii pentru asocierea numelui dirigintelui se face ca
în exemplul anterior. Sã denumim tabela CLASE_CU_NUME_DIRIG.
Pasul 3. Vom proiecta un formular prin Form Wizard începând cu tabela SCOLI,
vom indica coloanele, apoi cu tabela CLASE_CU_NUME_DIRIG, respectiv cu tabela
ELEVI.
Pasul 4. Vom intra în modul Design pentru
formularul Scoli ºi vom schimba textul asociat butonului
care deschide formularul Clase_cu_nume_dirig. Ne
interesazã subformularul conþinut de acesta, pentru
a-i schimba forma de afiºare a datelor.
Pentru aceasta, aflãm numele asociat de
Form Wizard subformularului de pe formularul
Clase_cu_nume_dirig.
Vom selecta obiectul subformular ºi, prin fereastra
Properties, cãutãm proprietatea Name (exemplu,
name=”elevi subform2”).
Vom intra în editarea subformularului elevi
subform2 din fereastra Data Design ºi, în fereastra

!
de proprietãþi, fixãm valoarea Default View =” Continuous forms” (de la Default
View=”Datasheet” - implicitã).
Celelalte manevre cu obiectele sunt deja învãþate!
Problema 10.14.
Proiectaþi un formular care sã ocupe întregul ecran sub forma
urmãtoare. Numiþi formularul „frm_principal”.
Caption=”fereastra cu imagine”; Scroll bars=”neither”; Record
Selections=”No”
Navigation bars=”No”; Border Style=Sizable; Picture =”C:îimag.jpg”; Picture
sizeMode=”stretch”; Name=”frm_principal.
Problema 10.15.
Adãugaþi pe formularul frm_principal butoane pentru deschiderea formularelor
proiectate anterior (frm_prof1, frm_prof2, frm_prof3, frm_prof4).
Pasul 1. Proiectãm un buton de comandã, prin manevra drag&drop de la toolbox
cãtre formular ºi conturãm zona ocupatã de obiect. Editãm textul explicativ.
Pasul 2. Indicãm acþiu-
nea efectuatã la eveni-
mentul click(), prin selec-
tarea acesteia dintr-o listã
deschisã de utilitar. În cazul
nostru vom deschide un
formular al cãrui nume îl
putem alege la pasul urmãtor.
Odatã construit butonul observãm în fereastra de proprietãþi adãugarea la
evenimentul On CLick.
Observaþie: pentru afiºarea unui text explicativ la poziþionarea mouse-ului pe
buton se foloseºte proprietatea ControlTip Text.
Problema 10.16.
Realizaþi un formular pentru adãugarea unui singur articol în tabela PROFESORI.
Pasul1. Vom deschide Form Design ºi vom indica tabela PROFESORI ca sursã
de date.
Pasul 2. Fixãm proprietãþile formularului: Record
Selectors=”No”; Navigation Buttons=”No”; Data
Entry=”Yes” (nu vedem celelalte articole ci doar cel
pe care îl introducem); Record Source=
”PROFESORI” (este valoarea implicitã dacã am
deschis tabela la intrarea în Form Design);
Caption=”introducere date despre un profesor”;
Close button=”No”; MinMaxButton=”None”
Pasul 3. Proiectãm zona de editare pentru
numele profesorului împreunã cu textul explicativ,
prin manevra drag&drop, de la numele câmpului
din Field List la fereastra de proiectare. Se
asociazã douã obiecte grupate Label (pentru
numele câmpului) ºi TextBox (pentru valoarea
câmpului). Dorim sã deplasãm separat cele douã
obiecte! Va trebui sã selectãm separat fiecare

!!
obiect, apoi sã fixãm mouse-ul pe colþul stânga sus pânã apare simbolul mânã ºi
apoi sã agãþãm obiectul în noua poziþie.
Pasul 4. Proiectarea butoanelor de
comandã se face prin selectarea obiectului
Command Button de pe Toolbox ºi
desenarea cu mouse-ul a formei acestuia
pe suprafaþa de lucru. Automat, se
activeazã utilitarul de construire a
butonului care ne permite sã asociem
acestuia acþiunea la evenimentul Click.
Trebuie aleasã acþiunea dupã ce am fixat
categoria acesteia. Vom proiecta un buton
care sã salveze valorile introduse într-un
nou articol (deci Save Records), un buton
care sã anuleze valorile pe care le-am introdus (deci Delete Record) ºi un alt buton
care va servi la închiderea formularului – desigur, putem sã-l închidem prin butonul
de pe bara de titlu, dar, ne place sã controlãm noi acþiunea, aºa încât vom avea
butonul de închidere formular (Close Form).
Fiecare buton are alt text explicativ pe care îl introducem prin proprietatea Caption.
Precedãm litera folositã pentru Shortcut de caracterul ampersant &.
Vom putea folosi <alt>+<s> pentru a manevra cu tastele butonul de ºtergere.
Problema 10.17
Modificaþi formularul anterior pentru a putea introduce ºi alte date.
Pasul 1. Câmpurile adresa ºi studii sunt câmpuri de tip text ºi prin manevra
drag&drop asociazã obiectele corespunzãtoare.
Pasul 2. Câmpurile este_casatorit? ºi are_copii sunt de tip boolean ºi prin manevra
drag&drop obþinem obiectele de tip CheckBox (precedate de obiectele Label cu
numele câmpului). Proprietatea importantã pentru un obiect de control tip Checkbox
este Control Source; acesta primeºte numele câmpului din tabela PROFESORI.
Pasul 3. Câmpul grad_di-
dactic este de tip text ºi îi
asociem un obiect tip List.
Dupã manevra de poziþionare
ºi desenare a zonei ocupatã
de lista deschisã se activeazã
asistentul care ne pemite
introducerea valorilor ºi indicarea câmpului unde va fi reþinutã valoarea selectatã.
Observaþi proprietãþile importante în imaginea alãturatã.
Pasul 4. Câmpul nivel_studii a fost folosit pentru a memora selecþia din obiectul
tip Options Group. ªi aici asistentul este cel care ne cãlãuzeºte pas cu pas.
Este bine de ºtiut ce valoare este memoratã
în câmp la selectarea unui buton. De exemplu, 1
pentru liceale, 2 pentru universitare ºi 3 pentru
studii post-universitare.
Vom selecta obiectul pe toolbar ºi vom contura
zona acestuia pe formular. Asistentul va solicita informaþii legate de tipul controlului
ºi stilul acestuia.
De asemenea, se solicitã numele câmpului care va primi valoarea selectatã de
operator (în cazul nostru câmpul este nivel_studii).
!"
Pasul 5. Câmpul specialitate a fost folosit pentru a
memora valoarea selectatã dintr-o listã deschisã (obiectul
ComboBox). Dupã poziþionare ºi dimensionare, asistentul
ne permite sã indicãm sursa de date (noi vom introduce
direct lista valorilor mai importante, urmând ca pe par-
cursul folosirii formu-
larului sã putem adãuga
alte valori!). Paºii sunt
aceiaºi ca la proiec-
tarea obiectului ListBox.
Observaþi princi-
palele proprietãþi ale
obiectului.
Pasul 6. Proiectarea
obiectului OLE Bound
Control se poate face prin drag&drop de la câmpul Foto din tabelã sau prin selectarea
obiectului de pe bara Toolbox ºi dimensionarea zonei ocupate de obiect. Proprietatea
importantã este ControlSouce=”foto”.
Pasul 7. Verificãm funcþionarea obiectelor prin deschiderea formularului,
introducerea valorilor ºi urmãrirea liniilor noi în tabela PROFESORI.
Problema 11.1
Realizarea unui macro pentru deschiderea unui formular ºi închiderea altuia.
Pasul 1. Pregãtim formularul tip casetã de dialog.
Fixãm proprietãþile la nivelul formularului. Mai importante sunt:
Name=”frm_special”; Caption=”introduceti specialitatea”; Scroll bars=”Neither”;
Record selectors=No; Navigation Button=No; Autocenter=Yes; Border Style=”dialog”;
Controlbox=No; MinMaxButton =”Both enabled”.
Pasul 2. Proiectãm obiectul textbox,
prin selectarea acestuia de pe toolbox ºi
dimensionarea zonei ocupate de acesta
pe formular. ªtergem obiectul Label
asociat textbox-ului implicit (numele
acþiunii va fi scris pe banda de titlu a
formularului). Fixãm proprietatea Name=
”txtspecial”.
Observaþie: Este important de reþinut
acest nume al obiectului, deoarece
valoarea întoarsã de obiect va fi folositã
la selectarea datelor din formularul apelat.
Pasul 3. Închidem, deocamdatã, ºi salvãm cu numele frm_special.
Trebuie sã pregãtim celãlalt formular pentru cã butonul Ok va trebui sã-l deschidã,
deci trebuie sã cunoaºtem numele formularului apelat.
Pasul 4. Pregãtim datele sursã pentru formularul de navigare ºi editare.
Vom folosi tabela PROFESORI, filtrând datele dupã valoarea introdusã de opera-
tor. De aceea, vom realiza o interogare cu parametru.

!#
Vom filtra liniile care au în coloana specialitate aceeaºi valoare ca cea întoarsã
de obiectul txtspecial din formularul frm_special. Observaþi modul de calificare a
câmpurilor ºi a obiectelor pe formular. Proprietatea Value reþine conþinutul obiectului
la un moment dat.
profesori.specialitate=forms![frm_special]!txtspecial.value
Salvãm interogarea (numele sãu sugerând faptul cã primim un parametru din alt
formular) cu prof_specx_din_alt_frm.
Pasul 5. Proiectãm cu Form
Wizard un formular pentru
navigare ºi editare având ca
sursã de date interogarea
anterioarã. Îl vom salva cu
acelaºi nume ca ºi interogarea
sursã: prof_specx_din_alt_frm.
Pasul 6. Proiectãm un macro
pentru acþiunile dorite.
6.1. Deschidem din Database Macro→New ºi indicãm acþiunile dorite.

Atenþie! Macro-ul va deschide întâi


formularul Prof_specx_din_alt_frm ºi
apoi va închide formularul pãrinte
Frm_special.
6.2. Salvãm, cu numele
„Mac_activ_si_inchid”.
Pasul 7. Deschidem, pentru
completare, formularul caseta de dia-
log.

!$
7.1 Proiectãm primul buton de comandã, prin selectarea din Toolbox ºi conturarea
zonei pe formular. Anulãm sugestia asistentului de a ne ajuta în desemnarea acþiunii.
Fixãm proprietatea Name=”cmd_ok”.
Fixãm pentru evenimentul Click() =mac_activ_si_inchid”.
7.2. Proiectãm al doilea buton; pentru acþiunea declanºatã de acesta preferãm sã
scriem noi codul (deci, închidem asistentul).
În fereastra de proprietãþi fixãm Name=”cmd_cancel”, iar la evenimentul Click()
vom folosi metoda Close.
Problema 11.2. Macro pentru avertizare
Pasul 1. Realizãm o macro-instrucþiune condiþionatã prin Macro Builder.
Atenþie! Butonul pentru inserarea coloanei Condition în fereastra de proiectare a

macro-ului este . Observaþi modul de precizare a condiþiei: dacã valoarea


obiectului chk_este_casatorit? de pe formularul frm_profesori are valoarea “Yes”,
atunci macro-ul va trebui sã afiºeze mesajul “atentie…”

Pasul 2. Ataºãm macro-ul la


evenimentul AfterUpdate al obiec-
tului. Deci, acþiunea se va declanºa
dupã ce obiectul chk_este_casatorit?
îºi schimbã valoarea.
Problema 11.3.
Pasul 1. Se deschide baza de
date ABONAMENTE cu tabelele
REVISTE, CHITANTE etc.
Pasul 2. Se deschide fereastra
de proiectare a unui nou macro prin
Macros→New.
Pasul 3. Se fixeazã opþiunile
meniului. Observaþi comenzile de
deschidere a formularelor ºi rapoar-
telor aplicaþiei. Fiecare comandã din
macro primeºte ca nume chiar textul
ce va fi afiºat în lista de opþiuni a
meniului. Ultima opþiune va deter-
mina pãrãsirea mediului Access.

!%
Atenþie! Dupã selectarea comenzii de
deschidere – formular sau raport – (în zona
Actions) trebuie ales numele formularului sau
al raportului din Lista Form Name a zonei
Actions Arguments.
Pasul 4. Se închide macro-ul. Se salveazã
(de exemplu cu numele Macro1).
Pasul 5. Se deschide fereastra de
proiectare a unui nou macro. De aceastã datã
la Action vom alege comanda AddMenu, iar
la Arguments vom da un text ce va fi afiºat
pe buton (Menu Name), numele macro-ului anterior care defineºte acþiunile meniului
(Manu Macro Name) ºi, eventual, un text afiºat pe Satus Bar.
Pasul 6. Se închide macro-ul ºi se denumeºte (în exemplul nostru, Macro1).
Pasul 7. Se proiecteazã sau se deschide un formular de prezentare a aplicaþiei.
La nivelul acestuia se deschide fereastra de proprietãþi ºi se asociazã metodei
MenuBar macro-ul Macro1.
Pasul 8. Se ruleazã prin butonul View.
Problema 12.1. Proiectarea unui meniu barã cu butoane simple prin Toolbars–
Customize
Pasul1. Se deschide fereastra View→
Toolbars→Customize.
Pasul2. Se creeazã o nouã barã cu
numele Scoala prin butonul New al ferestrei
Customize, tab-ul Toolbars. Observaþi bara –
vid㠖 plasatã în dreapta ecranului de dia-
log!
Pasul 3. Se deschide tab-ul Commands
ºi, în fereastra Categories, se selecteazã
AllTable.
Pasul 4. Se alege tabela pe care dorim
sã o deschidem printr-un buton ºi executãm
drag&drop cãtre bara Scoala.
Pasul 5. Schimbãm textul asociat pentru
buton – implicit este numele tabelei – ºi pictograma asociatã prin meniul contextual
deschis cu butonul drept al mouse-ului.
Problema 12.2. Proiectarea unui buton tip meniu
Pasul 1. Pregãtim modelul arborescent pentru
meniu ºi alegem care tabele, formulare ºi
rapoarte vor fi folosite.
Pasul 2. Deschidem fereastra View-Customize.
Pasul 3. Proiectãm o nouã barã prin butonul
New, apoi ne poziþionãm în tab-ul Commands ºi
selectãm din lista Categories New Menu. Apare,
în fereastra alãturatã Commands, linia NewMenu pe care executãm drag&drop la
bara principalã. Prin butonul drept al mouse-ului deschidem meniul contextual ataºat
butonului ºi atribuim numele: „Aplicatii-scoala”.

!&
Pasul 4. Dorim sã includem acum opþiunile acestui meniu. Fiecare opþiune va fi
tot un buton tip menu. Vom repeta deci manevrele pasului 3, de aceastã datã
plasând butonul meniu ca opþiune a meniului principal. Vom da nume fiecãrei opþiuni:
„introduceri de date“, „rapoarte” ºi „iesire”.
Pasul 5. Realizãm ultimul nivel. Vom selecta din lista AllTable tabela ELEVI ºi
vom executa drag&drop cãtre butonul „introduceri de date“. Vom repeta manevrele
pentru toate obiectele necesare din listele AllTable, AllQueries sau AllForms.
Pasul 6. Pentru opþiunea „Iesire“ se va deschide din tab-ul Commands categoria
„AllMacros“ ºi alegem macro-ul care realizeazã ieºirea.
Problema 12.6. Realizarea unui meniu contextual
Pasul 1. Realizãm un macro pentru cele 2 opþiuni ale meniului contextual. Vom
deschide Macro→New ºi activãm butonul pentru inserarea coloanei Macro Name.
Acolo vom trece textul asociat opþiunii. La acþiune vom deschide formularul Elevi ºi
pentru a doua opþiune vom deschide raportul (atenþie la parametrul View-trebuie dat
Print Previw dacã dorim afiºarea pe ecran). Salvãm cu numele Mac_meniu_elevi.

Pasul 2. Realizãm un macro care sã


deschidã meniul.
La acþiune vom trece comanda AddMenu
ºi vom specifica numele macro-instrucþiunii
care compune meniul. Vom salva cu numele
Mac_lansare_mnu_elevi.

Pasul 3. Asociem acest macro


formularului de prezentare a aplicaþiei,
realizat ca sarcinã anterioarã la
proprietatea Shortcut menu bar.

!'
Problema 12.7. Proiectarea unui buton tip menu_bar prin macro-instrucþiune
Pasul 1. Proiectãm 2 macro-uri. Unul cu numele Mac_frm va conþine opþiunile
submeniului pentru formulare, iar celãlalt Mac_rap va conþine submeniul pentru
rapoarte.

Pasul 2. Vom crea macro-ul Mac-menu care va deschide cele douã submeniuri.
Observaþi parametrii metodei AddMenu pentru formulare ºi pentru rapoarte.

Pasul 3. Realizãm macro-ul care sã


formeze meniu-principal.

Pasul 4. Specificãm în formular numele


acestul macro, în proprietatea Menu Bar.

"
Anexe
Evenimentele unui formular
1 Open La deschiderea formularului înainte sã se afiºeze prima înregistrare
2 Load Dupã deschiderea formularului ºi încãrcarea articolelor
3 Resize La modificarea dimensiunilor formularului
4 Activate Când formularul devine activ, dar înainte de a selecta o înregistrare
5 Current Când formularul primeºte focalizarea (este reafiºat)
6 Unload La închiderea formularului, dar înainte sã fie ºters de pe ecran
7 Deactivate Atunci când formularul pierde focalizarea
8 Close Atunci când Access închide ºi eliminã de pe ecran

Tipuri de date în VBA ºi domeniul de valori


Tip de datã Memorie (octeþi) Domeniu de valori
Byte 1 cod complementar 0-255
Boolean 2 True/false
Integer 2 cod complementar -32678-32767
Long 4 cod complementar -2E9 – 2E9
Single 4 virgulã mobilã simplã precizie -3E38 - +3E38
Double 8 virgulã mobilã dublã precizie -1E308- +4E308
Currency 8 virgulã mobilã dublã precizie -9E14- +9E14
Date 8 virgulã mobilã dublã precizie 01.01.100- 31.12.9999
Object 4 referinþã la un obiect
String 10+ LUNGIME SIR 0- 2 MILIARDE
Variant 16 pentru Numere Orice numãr pânã la limitele Double
22 lungime pentru ºiruri Orice ºir pânã la 2 miliarde caractere

Funcþii interne MS Access


Domeniu Nume Descriere
Conversii CByte Converteºte o expresie la tipul Byte
CStr Converteºte o expresie la tipul String
Val Returneazã o valoare numericã dintr-un ºir de caractere
Data ºi ora Date, Now,Time Returneazã ora sistemului si timpul
DateAdd Adaugã un anumit interval de timp la o datã
DateDiff Returneazã intervalul dintre douã date
DatePart Returneazã o parte a unei date
DateValue Returneazã o datã dintr-un ºir de caractere
Day/month/year Returneazã ziua, luna ºi anul din datã ca valori numerice
Hour/minute Returneazã ora/minutul ca valoare numericã
WeekDay Returneazã ziua sãptãmânii ca valoare numericã
Year Returneazã anul unei date

"
Domeniu Nume Descriere
Funcþii agregat DAvg Calculeazã media pentru un set de valori
DCount Numãrã înregistrãrile unui domeniu
DLookup Returneazã valoarea cãutatã dintr-un set de înregistrãri
DMax, Max Calculeazã maximul pentru un set de valori
DMin, Min Calculeazã minimul pentru un set de valori
DSum, Sum Calculeazã suma pentru un set de valori
Testãri IsDate Testeazã dacã o expresie poate fi convertitã într-o datã
IsEmpty Testeazã dacã o variabilã a fost iniþializatã
IsNumeric Testeazã dacã o expresie poate fi evaluatã numeric
IsNull Testeazã dacã o expresie conþine date valide
Fiºiere CurDir Returneazã calea directorului curent
ºi directoare Dir Cautã un fiºier sau director
EOF Testeazã dacã s-a ajuns la sfârºitul unui fiºier
Loc Returneazã poziþia curentã dintr-un fiºier
Seek Stabileºte poziþia curentã într-un fiºier
Funcþii DDB Returneazã deprecierea unui bun
financiare FV Valoarea în viitor a unei rate
IPmt Dobânda pe o perioadã
NPer Numãrul ratelor
NPV Valoarea netã curentã a unei investiþii
Pmt Valoarea plãtitã a unui împrumut
PPmt Valoarea principalã plãtitã a unui împrumut
PV Valoarea curentã a unei investiþii
Rate Rata dobânzii unui împrumut
Funcþii Abs Valoarea absolutã a unui numãr
matematice Eval Evalueazã o expresie
Fix, Int Returneazã partea întreagã
Sgn Semnul
Sqr Ridicare la pãtrat
Diverse CodeDB Numele bazei de date curente
CurrentUser Numele utilizatorului curent
Error Returneazã mesajul unei erori
InputBox Afiºeazã o casetã pentru introducerea datelor
MsgBox Afiºeazã o casetã de mesaj
QBColor Returneazã codul RBG corespunzãtor unei culori
RBG Returneazã un întreg reprezentând valoarea
corespunzãtoare unei culori
Rnd Genereazã un numãr aleator
Shell Porneºte o altã aplicaþie

"
Selecþii Choose Selecteazã o valoare dintr-o listã de argumente
IIf Dupã evaluarea expresiei returneazã una dintre cele douã valori
Switch Returneazã valoarea corespunzãtoare primei expresii adevãrate
dintr-o listã
Lucru cu texte Asc Returneazã codul ASCII al primului caracter dintr-un ºir
Chr Caracterul corespunzãtor unui cod ASCII
Format Formateazã o expresie
InStr Cautã un ºir de caractere într-un alt ºir
InCase Transformã toate literele mari în litere mici
UCase Transformã toate literele mici în majuscule
Left Right Mid Partea din stânga/dreapta/interioarã a unui ºir de caractere
LTrim, RTrim, Înlãturã spaþiile de la începutul/ sfârºitul sau ambele capete
Trim ale unui ºir de caractere
Space Creeazã un ºir format dintr-un numãr dat de spaþii
Str Converteºte un numãr în caracterul pe care îl reprezintã
StrComp Comparã douã ºiruri de caractere
String Creeazã un ºir format dintr-un anumit caracter repetat

"!
Bibliografie
1. *** colecþia PC Report 1998–1999.
2. 88 *** documentaþia Microsoft Access.
3. Allen Browne, Alison Balter, Bazele Access 95, Teora, Bucureºti, 1996.
4. Annette Marquis, Ghidul dumneavoastrã pentru Access, All,1998.
5. Bãlan Gheorghe Cureleþ, Visual Basic, Introducere în programarea vizualã a
aplicaþiilor Windows, Editura Done, 1994.
6. Eduard Koller, Monica Roºculeþ, Programare în Access 97, Teora, Bucureºti,1999.
7. Fotache Marin, Baze de date relaþionale. Organizare, interogare, normalizare,
Editura Junimea, Iaºi, 197
8. Mariana Panþîru, Ionuþ Panþîru, Irina Panþîru, Informaticã, Baze de date – varianta
Visual FoxPro, Editura L&S Infomat, Bucureºti, 2001.
9. Spîrcu Claudiu, Lopãtan Ionuþ, POO-analiza, proiectarea ºi programarea orientatã
spre obiecte, Editura Teora, Bucureºti, 1995.
10. Susan Harkins, Ken Hansen, Tom Gerhard, Utilizarea MS Access 2000, Teora,
Bucureºti, 2000.
11. V. Florescu ºi alþii, Baze de date, Editura Economicã, Bucureºti, 1999.
12. Virgil Chichernea, Sistemul Access, Editura Sylvi, Bucureºti, 2000.

""
MINISTERUL EDUCAÞIEI ªI CERCETÃRII

TEHNOLOGIA INFORMAÞIEI
ªI A COMUNICAÞIILOR
Manual pentru clasa a 9-a
RADU MÂRªANU / RÃZVAN BOLOGA /
ANA RAMONA LUPU

lice
9
obat
Apr 2004
MEC

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