Documente Academic
Documente Profesional
Documente Cultură
A221
A221
"
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
#
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).
%
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:
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.
'
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?
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 820.
Î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:
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
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
!
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.
#
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
&
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.
'
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.
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.5. Încãrcarea structurii (popularea tabelei)
Problema 3.1.
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.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.
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.
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
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;
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ã
!
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.
!!
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!
!"
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.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.
!$
3. Obþineþi imaginea urmãtoare, în care putem vizualiza elevii Subseturi de
fiecãrei clase! 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
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ã:
!'
Î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.
"
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.
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.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:
""
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.
"#
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().
"%
peste 160 de funcþii standard. De exemplu, Year (<data>) extrage anul din data
calendaristicã datã ca parametru.
"&
media sortarea descrescãtoare ºi, din fereastra
de proprietãþi pentru interogare, vom fixa la 10
linia Top Value.
"'
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ã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 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.
#!
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 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).
##
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.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 SQLAccess
ü Comanda de selecþie SELECT
ü Comenzile de actualizare INSERT, UPDATE, DELETE
ü Comanda de creare a tabelelor CREATE TABLE
#'
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*)
$
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.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);
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.
$!
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
$"
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.
$%
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.
$&
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 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.
%
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.
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,
Wizard Chart
%"
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ã)
%#
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.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.
%%
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
%'
ª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.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.
&
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.
&
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.
&!
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.
&"
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.
&#
Problema 10.8. Folosiþi formularul anterior ºi interziceþi ºtergerea, Allow Edits,
respectiv adãugarea articolelor. Deletions
&$
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.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.
'
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ã.
'
*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
'
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 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.
'#
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.
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.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
''
Un exemplu de folosire a unei pagini Web:
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 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.
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
Proiect final
ü Indicaþii metodologice pentru realizarea proiectului final
ü Tematica propusã
ü Studiu de caz
!
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 23 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.
$
Î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.
%
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ã.
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ã!
'
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þã!
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.
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).
!
5. Care sunt titlurile cãrþilor intrate în bibliotecã în
intervalul x-y?
Select * from CARTI where data_intrare
between [X] and [Y]
"
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 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.
$
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;
%
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));
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;
'
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));
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.
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;
Select Year([data_intr]) as anul1, Year([data_ies]) as anul2, carti.ID
from CARTI;
38. Afiºaþi ca subset de date restanþele fiecãrui cititor.
!
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*));
"
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#));
#
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...).
$
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));
%
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;
&
Problema 9.12.
Pasul 1. Interogarea pregãtitoare este realizatã din tabela CARTI.
'
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!)
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.
!$
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
!%
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.
!'
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.
"
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
"
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 19981999.
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