CAP: 1. NOŢIUNI GENERALE DESPRE BAZE DE DATE 1.1 Bază de date.

Baze de date relaţionale În sensul cel mai simplu o bază de date este o colecţie de înregistrări şi fişiere organizate pentru un scop anume [1]. Astfel o bază de date poate fi considerată: toate numerele de telefon ale diferitelor cunoştinţe păstrate pe un calculator personal, totalitatea datelor personale despre studenţii unei universităţi păstrate pe calculatorul acesteia etc. Documentele procesate care sunt organizate în ordine alfabetică pot constitui de asemenea într-un sens mai restrâns o bază de date. Un alt tip de baze de date pot fi considerate fişierele de tip foaie de calcul organizate după tipul întrebuinţării. Bazele de date relaţionale se referă la o colecţie de date, structurate sub forma mai multor tabele ce poartă numele de relaţii [2]. Termenul de relaţional provine din faptul că fiecare înregistrare din baza de date conţine informaţii referitoare la un singur subiect şi numai la unul. De asemenea datele cuprinse în categorii de informaţii pot fi manipulate de o singură entitate, bazată pe valori de date asociate. În legătură cu bazele de date relaţionale sunt folosiţi mai mulţi termeni. Astfel o relaţie (relation) –conţine informaţii despre un singur subiect, cum ar fi clienţii, comenzile, studenţii sau universităţile [1]. De obicei o relaţie este stocată ca un tabel dintr-un sistem de gestionare a bazelor de date relaţionale. Termenul atribut desemnează o informaţie specifică unui subiect [2]. Astfel un atributele poate fi considerate capetele de tabelă. Rândurile vor purta numele de tuple. O legătură reprezintă modul cum informaţiile dintr-o tabelă sunt legate cu cele din altă tabelă. Diferenţele dintre o relaţie şi un tabel sunt următoarele [2].: • atributele şi tuplele unei relaţii nu sunt ordonate, în timp ce într-un tabel există o ordonare atât a coloanelor cât şi a rândurilor • două tuple ale unei relaţii nu pot avea valori identice, în timp ce întrun tabel două sau mai multe rânduri ce ocupă poziţii diferite în tabel pot conţine valori identice Un domeniu reprezintă mulţimea valorilor pe care le pot lua atributele unei relaţii [5]. Astfel fiecare atribut dintr-o bază de date relaţională este definit pe un anumit domeniu, de unde acesta va lua valori. Mulţime domeniilor pe care este definită o bază de date formează vocabularul bazei de date. 1.1.1 Chei primare, chei secundare O cheie este formată din numărul minim de atribute, astfel alese încât valorile acestor atribute să fie unice [2]. În consecinţă, fiecare tuplă a relaţiei este identificată în mod unic de valoarea cheii respective. Totuşi într-o relaţie pot fi mai multe grupuri
Pag. 6

de atribute care identifică în mod unic tuplele relaţiei, deci acestea reprezintă chei ale relaţiei respective. În modelul relaţional liniile unui tabel sunt unice. Unicitatea înregistrărilor poate fi asigurată prin stabilirea unei chei primare, care este o coloană sau un grup de coloane ale tabelei care va conţine valori unice în tabelă [3]. Aceste tabele care conţin valori unice se numesc chei candidat. Una din cheile candidat este considerată cheie primară, iar cele rămase se numesc chei alternative. Valorile cheilor primare sunt utilizate pentru a face corelaţii între tuplele mai multor relaţii şi pentru a reprezenta legăturile dintre entităţile bazei de date. Astfel o cheie secundară a unei relaţii este formată din unul sau mai multe atribute ale căror valori sunt utilizate ca şi chei primare în alte relaţii [2]. Întotdeauna valorile atributului cheie secundară trebuie să aparţină aceluiaşi domeniu ce cel al atributului cheie primară din cealaltă relaţie. 1.1.2 Relaţii O relaţie exprimă un raport sau o asociere între două sau mai multe tabele. Între două sau mai multe entităţi pot exista următoarele tipuri de relaţii: • relaţii de tipul 1:1 (one-to-one) sunt acele tipuri de relaţii în care fiecărei linii din prima tabelă îi corespunde cel mult o linie în cea de-a doua tabelă. Acest tip de relaţii sunt utile atunci când se doreşte împărţirea tabelei în două sau mai multe tabele pentru motive de securitate, de performanţă, sau de exemplu, în cazul sistemului de gestiune a bazelor de date Access datorită limitei de 255 de coloane pentru o tabelă; • relaţii de tipul 1:m (one-to-many) sunt relaţiile în care pentru fiecare linie din prima tabelă există zero, una sau mai multe linii în cea de-a doua tabelă, dar pentru fiecare linie din cea de-a doua tabelă există exact o linie în prima tabelă; • relaţii de tipul m:m (many-to-many) sunt acele tipuri de relaţii în care pentru fiecare linie din cea de-a doua tabelă pot exista mai multe linii în cea de-a doua şi, totodată pentru fiecare linie din cea de-a doua tabelă pot exista mai multe linii în prima. 1.1.3 Teoria normalizării Teoria normalizării se ocupă cu îmbunătăţirea succesivă a schemei conceptuale, fiind satisfăcute în acelaşi timp următoarele condiţii [3]: • conservarea datelor –în schema conceptuală finală trebuie să existe toate datele din cadrul schemei iniţiale; • conservarea dependenţelor dintre date –trebuie să se păstreze tipurile de relaţii dintre entităţi;
Pag. 7

descompunerea minimală a relaţiilor iniţiale –în schema conceptuală finală nici o relaţie nu trebuie să fie conţinută într-alta. Normalizarea [3] constă astfel într-o serie de teste efectuate asupra datelor existente, în scopul de a elimina redundanţa şi de a garanta că datele sunt asociate cu tabelele sau relaţiile corespunzătoare. În total există şase astfel de teste, dintre care doar trei sunt mai des folosite în practică şi anume: • • • • • • Prima formă normală: - o tabelă este în prima formă normală dacă valorile tuturor atributelor care o compun sunt indivizibile şi în plus nu trebuie să existe atribute sau grupuri de atribute repetitive [3]; A doua formă normală: - o tabelă este în a doua formă normală dacă este în prima formă normală şi fiecare atribut care nu face parte din cheia primară este dependent de întreaga cheie primară [3]; A treia formă normală: -spunem că o tabelă este în a treia formă normală dacă este în forma normală doi şi toate coloanele care nu fac parte din cheia primară depind direct de cheia primară [3]; A patra formă normală: -elimină redundanţele datorate relaţiilor de tipul m:m; A cincea formă normală: -este mai mult „academică” şi apare foarte rar în practică; Forma normală Boyce-Codd: -o relaţie este în forma Boyce-Codd dacă fiecare determinant este o cheie candidat (Putem defini determinantul ca pe un atribut sau o mulţime de atribute neredundante care constituie un identificator unic pentru un alt atribut sau o altă mulţime de atribute ale unei relaţii.

1.2 Sisteme de gestiune a bazelor de date În perioada actuală caracterizată printr-un progres continuu în toate domeniile vieţii sociale şi economice un rol deosebit de important îl deţine informaţia. O parte importantă a resurselor fiecărei entităţi economice sau sociale este orientată astfel spre acumulare, prelucrarea şi stocarea datelor. Acest proces se identifică în mod normal cu crearea, întreţinerea şi utilizarea unei baze de date pe sistemele de calcul moderne. O bază de date este formată dintr-o colecţie de date diverse şi un software care să controleze accesul la acestea, software cunoscut sub numele de sistem de gestiune a bazelor de date (SGBD). Un SGBD reprezintă astfel [2] un program ce furnizează o interfaţă între sistemul de operare de pe sistemul de calcul respectiv şi utilizator, cu scopul de a simplifica pe cât posibil accesul la date. Un SGBD îndeplineşte următoarele funcţii importante [2]: • stocarea, regăsirea şi actualizarea datelor (astfel se permite utilizatorilor să creeze şi să manipuleze date fără a fi necesar să cunoască structura internă a datelor);
Pag. 8

crearea şi întreţinerea dicţionarului de date; gestionarea facilităţilor legate de accesarea simultană a unor înregistrări ale bazei de date de către mai mulţi utilizatori; • păstrarea unei copii de siguranţă („back-up”); • probleme de securitate a datelor (parole de acces ale utilizatorilor, verificări etc.) Gestionarea informaţiei sub forma unei baze de date prezintă o serie de avantaje dintre care amintim [2]:

• •

• •

• • •

Independenţa datelor: Într-o bază de date, datele sunt păstrate astfel încât schimbarea structurii acestora să nu afecteze nici unul dintre programele de aplicaţie ce utilizează baza de date respectivă. Consistenţa datelor: Modificarea articolelor din baza de date este percepută de fiecare dintre utilizatorii sistemului de baze de date. Controlul redundanţei: În sistemele de gestiune neorientate spre baza de date, aceiaşi informaţie poate fi păstrată în mai multe fişiere diferite şi în consecinţă creşte nejustificat spaţiul fizic ocupat pe disc, precum şi timpul consumat cu actualizarea datelor redundante. Integritatea datelor: Un SGBD furnizează utilizatorilor posibilitatea specificării anumitor restricţii. Dacă de exemplu se adaugă un nou produs în baza de date impunem să fie adăugat şi preţul acestuia, astfel încât acest câmp nu va putea niciodată fi omis. O mai mare securitate a datelor: Un SGBD va asigura faptul că doar utilizatorii autorizaţi vor avea acces la date. Un control centralizat al datelor prin intermediul unui administrator al bazei de date. O mai mare cantitate de informaţii disponibilă utilizatorilor: Cu un SGBD utilizatorii accesează informaţia ce a fost păstrată anterior în sisteme de calcul diferite, chiar incompatibile între ele. Orice SGBD modern furnizează un limbaj de interogare a datelor, de obicei de tip SQL („Structured Data Language”), ce permit utilizatorilor să obţină mult mai rapid şi mai simplu informaţiile dorite, decât dacă utiliza un program scris într-un limbaj prodedural.

1.2.1 Limbaje de interogare. SQL Limbajele de interogare pot fi clasificate [2] în două categorii: a) limbaje algebrice, în care interogările asupra relaţiilor sunt exprimate prin intermediul unor operatori aplicaţi asupra lor. În această categorie intră limbajul SQL. b) Limbaje bazate pe calcul relaţional, în care interogările asupra relaţiilor sunt exprimate prin intermediul unor condiţii pe care tuplele relaţiilor
Pag. 9

trebuie să le satisfacă. Această categorie de limbaje se clasifică la rândul ei în două categorii în funcţie de obiectul asupra căruia se aplică operaţia şi anume: b1) limbaje bazate pe calcul relaţional orientat pe tuple, în care predicatele se implică asupra tuplelor relaţiilor, reprezentativ fiind aici QUEL, limbajul de interogare Ingres; b2) limbaje bazate pe calcul relaţional orientat pe domenii, în care predicatele domeniului din care ia valori atributul relaţiei. Reprezentativ pentru aceste categorie este QBE, limbajul de interogare dezvoltat de IBM. Pentru reprezentarea structurii logice a datelor dintr-o bază de date există trei modele şi anume: modelul ierarhizat , care presupune crearea unei structuri arborescente de reprezentarea a datelor, modelul reţea, în care elementele ce reprezintă datele sunt legate între ele prin pointeri, formându-se astfel o reţea, şi modelul relaţional, acesta din urmă impunându-se net în faţa celorlalte două, fiind la ora actuală la baza realizării majorităţii produselor. În esenţă o bază de date relaţională poate fi gândită ca şi o colecţie de tabele bidimensionale ce se numesc relaţii, coloanele (atributele relaţiei) au nume distincte, iar rândurile (tuple) conţin elemente ale datelor ce poartă numele de entităţi. Organizarea datelor sub forma mai multor tabele poartă numele de schema reprezentării datelor. O schemă nu specifică doar care sunt coloanele ce intră în componenţa fiecărui tabel, ci va stabili de asemenea legătura logică dintre entităţile stocate în baza de date. Limbajul standard care a fost conceput ca un limbaj de descriere a datelor şi acces la informaţiile din bazele de date relaţionale este SQL. El a fost iniţial utilizat de către firma IBM pentru produsul DB2, devenind la mijlocul deceniului trecut un standard de facto în domeniu. De atunci şi până în prezent au fost dezvoltate un număr de şapte versiuni ale standardului SQL, trei dintre acestea aparţinând Institutului American de Standarde (ANSI), celelalte fiind concepute de firme de prestigiu ca IBM, Microsoft şi Borland, sau de către consorţiile industriale SAG („The SQL Access Group”) şi X/Open, primul format din sute de firme ce comercializează software pentru baze de date, iar cel din orientat spre activităţi de promovare a standardelor în domeniul sistemelor deschise. 1.3 Modelul relaţional 1.3.1. Scurtă descriere a modelului relaţional Modelul relaţional a fost formulat şi publicat pentru prima oară la începutul anilor ’70 de către dr. Edgar F. Codd, cercetător la laboratoarele IBM din San Jose (California), care a publicat între anii 1970-1974 lucrările sale referitoare la modelul relaţional pentru bazele de date. Acest model relaţional, are avantajul că permite
Pag. 10

se pot adresa doar proprietăţile logice ale sistemului de baze de date. obiectiv numit de E. de la 13 reguli publicate în anul 1986. dacă pentru modelul ierarhizat şi modelul reţea. nu au beneficiat de un fundament teoretic atât de solid. Totuşi nici un sistem de gestiune a bazelor de date pus în vânzare pe piaţa comercială nu respectă absolut toate regulile definite de Codd. concretizată în creşterea puterii de prelucrare a calculatoarelor a condus la eliminarea acestor temeri prin larga utilizare a sistemelor de baze de date relaţionale inclusiv pe calculatoarele personale. programatorul trebuie să proiecteze programe procedurale. O altă deosebire esenţială între modelul relaţional şi celelalte două modele este aceea că în timp ce primul este orientat spre mulţimi. Pag. O altă proprietate specifică modelului relaţional este aceea că nefiind orientat spre sistemul de calcul.proiectantului bazei de date să studieze proprietăţile sistemului de gestiune a bazelor de date fără a fi necesar să-l implementeze. Drept urmare. 1. care să acceseze baza de date înregistrare cu înregistrare utilizând legături fizice pentru înregistrări. ci doar un număr mai mic sau mai mare al lor. Datele şi relaţiile sunt reprezentate sunt reprezentare explicit. Ulterior Codd a extins numărul acestora. au existat temeri serioase privind eficienţa aplicării modelului relaţional pentru baze de date de dimensiuni mari. Spre exemplu. la un număr de 100 în 1990. Codd a publicat un set de reguli în raport cu care un sistem de gestiune a bazelor de date (SGBD) poate fi apreciat ca fiind „relaţional”. fapt care l-a impus în faţa celorlalte modele.2 Reguli de fidelitate ale bazelor de date Pe la mijlocul anilor ’80 matematicianul Edgar F. modelul relaţional a fost definit cu o deosebită rigoare matematică.3. La începutul fundamentării teoretice a modelului relaţional. Una din caracteristicile de bază ale modelului relaţional este simplitatea sa şi rigurozitatea sa din punct de vedere matematic. produsul IBM DB2 respectă un număr de 7 reguli din cele 13. Pe de altă parte. nu şi cele fizice. utilizând o structură logică ce poartă numele de relaţie. furnizând un mijloc performant de studiu al proprietăţilor logice ale unui sistem de baze de date. Spre deosebire de modelul relaţional. Dezvoltarea tehnologică fără precedent în domeniul electronicii şi informaticii din ultimii ani. Codd „independenţa datelor”. De astfel unul din obiectivele modelului relaţional a fost acela de a introduce o distincţie clară între aspectele fizice şi cele logice ale unei baze de date. aceasta rezidă din faptul că. Aceste reguli sunt denumite „Cele 13 reguli de fidelitate ale lui Codd”. determină de obicei prelucrarea mai multor înregistrări. modelul ierarhizat şi modelul reţea. fiind adoptat în ultimul deceniu de majoritatea cercetătorilor şi programatorilor din domeniu. 11 . o singură instrucţiune de limbaj neprocedural (cum este SQL). celelalte modele impuse anterior. modelul nu include regulile. pentru modelul relaţional.F. structurile şi operaţiile referitoare la implementarea fizică a unui sistem de baze de date. celelalte două sunt orientate spre fişiere.

Astfel un SGBD trebuie să cuprindă trei părţi: o parte de definire a datelor (DDL). şi anume sub forma unor tabele. dacă sunt specificate: numele relaţiei. numele tuplei (prin utilizarea cheii primare) şi numele atributului. valoarea cheii primare şi numele atributului. Se poate regăsi orice valoarea aparţinând oricărui atribut al unei relaţii.Astfel cele 13 reguli de fidelitate ale lui Codd sunt[2] următoarele: Regula 0: (Regula de bază) Pentru a fi relaţional. Datele sunt stocate sub forma unor structuri tabelare. formate din rânduri denumite tuple şi coloane denumite atribute. 12 . Regula 3: (Regula reprezentării informaţiei necunoscute) Un SGBD în totalitate relaţional trebuie să poată permite utilizatorului definirea unui tip de date denumit „NULL” pentru reprezentarea unei informaţii necunoscute la momentul respectiv şi aceasta într-un mod sistematic pentru orice tip de date. Regula 2: (Regula accesului garantat la date) Fiecare dată dintr-o bază de date relaţională trebuie să poată fi adresată în mod logic printr-o combinaţie formată din numele relaţiei în care se află. un şir vid de caractere şi o valoare necunoscută. o parte de manipulare a datelor (DML) şi o altă parte de integritate şi control a datelor (DCL) Regula 1: (Regula reprezentării informaţiei) Într-o bază de date relaţională. un SGBD trebuie să fie capabil să gestioneze o bază de date prin intermediul caracteristicilor sale relaţionale. Aceste structuri sub formă de tabele. Într-un SGBD relaţional trebuie să se poată face diferenţierea între o valoare fixată intenţionat pe 0. oferă o serie de avantaje şi anume: claritate. Regula 4: (regula dicţionarului de date) Pag. informaţia este reprezentată la nivel logic într-un singur fel. generalitate (majoritatea tipurilor de date pot fi reprezentate sub această formă) şi flexibilitate (această structură poate fi modificată atât pe rânduri cât şi pe coloane).

în funcţie de variantele instrucţiunii SELECT utilizate. precum şi restrângerea accesului la relaţii şi vizualizări prin intermediul parolelor de acces. sunt valabile atât pentru operaţiile de regăsire a datelor. De asemenea limbajul mai permite verificarea şi corectarea datelor de intrare. actualizarea. Astfel un SGBD relaţional. realizarea tranzacţiilor (operaţiile COMMIT şi ROLLBACK). actualizare şi ştergere a datelor. restricţii de autorizare. indexi etc. Regula 8: (Regula independenţei fizice a datelor) 1 Tranzacţie –o comandă sau un grup de comenzi ale limbajului respectiv Pag. cât şi asupra operaţiilor de inserare. Operaţiile de manipulare a datelor (selecţia. nu trebuie să oblige utilizatorul să caute într-o relaţie tuplă de tuplă pentru a regăsi informaţia dorită. Regula 5: (Regula limbajului de interogare) Un SGBD relaţional trebuie să poată permite utilizarea a cel puţin unui limbaj. să regăsească informaţia şi să o poată actualiza. Regula 7: (Regula limbajului de nivel înalt) Regulile de manipulare asupra unei relaţii luată ca întreg. altele nu. inserţia. manipularea datelor. limbaj care permite utilizatorilor să definească relaţii şi vizualizări. Unele vizualizări pot fi actualizate. plecând de la întreaga relaţie şi sfârşind cu o tuplă sau nici una. Prin urmare. ştergerea) se aplică asupra oricărei părţi dintr-o relaţie.Asupra descrierii bazelor de date trebuie să se poată aplica aceleaşi operaţii ca cele asupra datelor din baza de date. . un SGBD trebuie să determine acest lucru printr-un anumit mecanism. 13 . care să prezinte următoarele caracteristici: să permită definirea datelor. Toate informaţiile referitoare la relaţii. trebuie să poată fi stocate sub forma unor relaţii ce formează un catalog de sistem (dicţionar). pe baza cărora sunt construite. Regula 6: (Regula de actualizare a vizualizării) Un SGBD trebuie să poată determina dacă o vizualizare poate fi actualizată şi să stocheze rezultatul interogării într-un dicţionar de tipul unui catalog sistem. definirea vizualizărilor. Această regulă precizează că manipularea datelor dintr-o bază de date trebuie să se facă printr-un limbaj de nivel înalt (de exemplu SQL). El trebuie să păstreze integritatea bazelor de date prin gestiunea tranzacţiilor1. şi prin urmare să poată fi accesate în acelaşi mod ca şi datele propriu-zise prin intermediul aceloraşi comenzi. vizualizări.

Regula 12: (Regula versiunii procedurale a SGBD) Orice componentă procedurală a unui SGBD trebuie să respecte aceleaşi restricţii de integritate ca şi componenta relaţională. vizualizări sau atribute. nu trebuie să afecteze programele de aplicaţi. dacă se şterg relaţii. în acelaşi mod ei trebuie să fie transparenţi şi faţă de calculatorul pe care se află aceste relaţii. cât şi stocarea lor în dicţionare de tipul cataloagelor sistem. Regula 11: (Regula independenţei datelor din punct de vedere al distribuirii) Distribuirea datelor pe mai multe calculatoare dintr-o reţea de comunicaţii de date. 14 .Într-un SGBD relaţional trebuie să se separeu aspectul fizic al datelor (metoda de stocare sau metoda de acces la date) de aspectul logic. orice altă metodă procedurală de accesare a acestei coloane nu trebuie să permită introducerea unei valori NULL în această coloană. Această regulă reprezintă o extensie a regulii 8. utilizând de exemplu limbajul SQL. Un SGBD relaţional trebuie să permită operaţii de validare a datelor (restricţii de integritate). deoarece în acelaşi mod cum utilizatorii trebuie să fie transparenţi faţă de unitatea de disc pe care se află stocate relaţiile. Pag. Orice modificare în modul de stocare al datelor nu trebuie să afecteze în nici un fel programele de aplicaţie. Orice modificare asupra unei relaţii nu trebuie să afecteze operaţiile de manipulare a datelor. dacă în partea de manipulare a datelor a limbajului relaţional (DML). şi anume programele de aplicaţie. Regula 9: (Regula independenţei logice a datelor) Programele de aplicaţie trebuie să fie transparente la modificările de orice tip efectuate asupra datelor. data dintr-o coloană este de tipul NOT NULL. gestiunea acestor operaţii trebuie să poată fi făcută prin stocarea lor în dicţionarul de date şi nu prin scrierea de programe. De exemplu. utilizatorilor fiindu-le transparente asemenea operaţii. Regula 10: (Regula independenţei datelor din punct de vedere al integrităţii) Un SGBD relaţional trebuie să permită atât definirea unor restricţii de integritate asupra bazelor de date prin intermediul limbajului. Totuşi pot apărea modificări ale acestor operaţii.

Deşi aceşti experţi vă pot uşura considerabil munca. etc. scopul nostru este să vă arătăm cum să creaţi propria bază de date. Editura Teora Bucuresti 1999 CAP:2. De asemenea. Access vă pune la dispoziţie experţi care pot crea pentru dumneavoastră toate tabelele. Pag. pornind de la zero. până la contacte de afaceri. Eduard Koller. tabele şi relaţii Încă de la varianta 95. Bucuresti 1994 -Totul despre Microsoft Access. fonoteci sau videoteci.Bibliografie 1. Bucureşti 1999 2.Programare în Acces 97. Monica Roşculeţ . din domenii variind de la administrarea unei biblioteci. Access vă pune la dispoziţie un număr de baze de date predefinite. John L. formularele şi rapoartele unei baze de date pe care o veţi specifica. Corina Pascu. Baze de date. Editura Tehnica. Viescas -Totul despre… SQL. Adrian Pascu 3. 15 . servicii. Editura TEORA. informaţii despre companii.

1. Pag. 2. Specificaţi în câmpul File Name al cutiei de dialog File New Database numele Cursuri Opţionale şi alegeţi din lista Save In directorul în care doriţi ca Access să salveze noul fişier (aveţi grijă ca tipul fişierului să fie Microsoft Access Database (*. 16 . alegeţi comanda File/New Database sau apăsaţi butonul New Database de pe bara cu instrumente şi apoi alegeţi Blank Database din pagina General a cutiei de dialog New.2.1 Crearea unei baze de date La pornire. dacă doriţi să creaţi o bază de date nouă în timp ce lucraţi cu Access. selectaţi Blank Database şi apăsaţi butonul OK. Pentru a crea manual o bază de date.mdb)). Access vă prezintă o cutie de dialog care vă permite să optaţi între a deschide o bază de date existentă şi a crea una nouă. Fereastra de deschidere din Access Să creeăm împreună baze de date Cursuri opţionale. Fig. Altfel.

17 . interogări. Access vă oferă mai multe posibilităţi de a crea o tabelă nouă. formulare şi module. Tastaţi “Cursuri optionale” în loc de db1 pentru a denumi baza de date 2. 2.2. Pe parcursul acestui capitol ne vom concentra atenţia asupra paginii Tables a ferestrei Database. Aceasta conţine pagini pentru diferitele tipuri de obiecte care pot alcătui o bază de date Access: tabele. Pagina Tables Pag. după cum se poate observa şi din figura: Fig. care se deschide imediat după ce aţi creat o bază de date nouă. şi chiar ar fi stocat în ele informaţie) „Atelierul” pe care Access vi-l pune la dispoziţie este fereastra Database. sau aţi deschis una deja existentă. rapoarte.Fig.3. Crearea tabelelor În acest moment.2. baza de date nu conţine nici o tabelă (dacă aţi fi folosit un expert pentru a crea baza de date. 2. acesta ar fi creat şi tabelele.

pe baza cestor date. 2. pe ecran a apărut o fereastră conţinând o tabelă fără date. dar cu 20 de coloane şi 30 de linii (dacă doriţi. puteţi selecta coloana. inclusiv reguli de validare şi valori implicite. specificând coloanele care o compun şi proprietăţile acestora. Pag. Pentru acestea.2.1 Crearea manuală a tabelelor Pentru a crea manual o tabelă. Datasheet View nu vă va permite să intraţi în detalii cum ar fi stabilirea proprietăţilor tabelei sau ale coloanelor. folosiţi modul Design View. folosirea modului Datasheet View se aseamănă cu lucrul cu Microsoft Excel: fiecare linie reprezintă o înregistrare în tabelă Pentru a crea o tabelă nouă în modul Datasheet View (97). le vom schimba în aşa fel încât să reflecte atributele entităţii descrise de tabelă. Introduceţi noul nume. Pentru a redenumi o coloană. 18 . apăsaţi butonul New. Iniţial. Acum. 2. După cum puteţi observa din figură. În partea de sus a fiecărei coloane se află un selector ce conţine numele coloanei respective. Table Wizard: este un expert care creează pentru dumneavoastră o tabelă pe baza unor structuri predefinite. Din lista prezentată în fereastra New Table. aceste nume sunt Field1. prin simpla introducere a datelor în tabel. ci pentru a oferi un mecanism pentru introducerea ulterioară a datelor şi pentru lucrul cu acestea.2. Făcând clic cu butonul din stânga al mouse-ului pe acest selector. trebuie să ţinem cont de faptul că în majoritatea cazurilor.2 Datasheet View: avantaje • crearea tabelei • umplerea ei cu date În ciuda acestor avantaje. puteţi folosi fie modul Datasheet View. Access determină apoi. dar. În fereastra Database. De asemenea. fie modul Design View. puteţi adăuga mai multe). bazele de date nu sunt create doar pentru a stoca informaţiile existente.- - Datasheet View: vă permite să creaţi o tabelă pe baza datelor stocate în ea (pentru Acces 97). procedaţi în felul următor: 1. Field2 etc. Design View: vă ajută să definiţi structura tabelei. Access poate crea şi o cheie primară. ulterior. Cu toate acestea. 2. tipurile şi formatele coloanelor. Va apărea fereastra New Table. Modul Datasheet View vă ajută să creaţi tabele simple. care se va schimba într-un câmp de editare. care vă va oferi control asupra tuturor proprietăţilor disponibile ale tabelei şi ale coloanelor care o compun. alegeţi Datasheet View şi apăsaţi butonul OK. Faceţi dublu-clic pe selectorul coloanei. puteţi proceda în unul din următoarele trei moduri: 1.

2. Din meniul context.2. Notă: deşi Access vă permite includerea de spaţii în numele coloanelor.2. încercaţi.3 Design View: Spre deosebire de modul Datasheet View.4. pe cât posibil. 2. Fig. el este indispensabil datorită posibilităţilor pe care vi le oferă. dacă aveţi de gând să legaţi o tabelă dintr-un astfel de DBMS (Data Base Management System – Sistem de gestionare a bazelor de date) la baza dumneavoastră de date. faceţi clic dreapta pe selectorul coloanei. comparând valoarea lui cu null. care nu conţine date. 19 . regăsirea ulterioară a înregistrărilor pentru care un câmp nu conţine date va fi foarte uşoară. Selectaţi coloana. numită null. să evitaţi acest lucru. are o valoare specială. alegeţi comanda Format | Rename column şi editaţi numele. selectaţi comanda Rename Column şi editaţi numele. modul Design View nu vă permite introducerea de date în tabelă. Unele sisteme de baze de date (cum ar fi dBase) nu permit folosirea spaţiilor în numele coloanelor. Pag. 3. Deci. Astfel. Cu toate acestea. nu folosiţi spaţii. Tabela “Curs_Student Notă: Access consideră că un câmp gol.

Modul Design View Pentru a crea o tabelă în modul Table Design View. fereastra este împărţită în două părţi. • Memo: folosit pentru stocarea textelor lungi. Va apărea o fereastră ce nu conţine informaţie. se foloseşte partea de sus a ferestrei Table Design. Partea de sus foloseşte la definirea coloanelor. 2. 2. numere de telefon). • Number: folosit pentru stocarea datelor numerice de tipul: întreg. apăsaţi butonul Tables. Pentru a defini prima coloană. cu precizie simplă sau dublă. pentru stocarea datelor alfanumerice. Pag.Fig.5. despre care vom vorbi în cele ce urmează: • Text: şir de caractere (maximum 255). folosit pentru valori monetare. • Currency: un tip numeric special. iar partea de jos la stabilirea proprietăţilor fiecărei coloane în parte şi conţinutul ei se schimbă în funcţie de tipul pe care l-aţi atribuit coloanei. de până la 65. întreg lung.2. deoarece nu permite rotunjirile de calcul. introduceţi numele acesteia în prima linie a coloanei Field Name. Selectaţi din listă opţiunea Create table using Design View .535 de caractere. Folosit şi pentru numerele ce nu vor fi folosite la calcule (de exemplu.4 Definirea coloanelor După cum s-a observat. pentru a defini coloanele. • Date/Time: folosit pentru stocarea datei şi a orei. 2. Aici se pot defini coloanele (numite şi câmpuri) ce compun tabela. în virgulă mobilă. 20 . precum şi proprietăţile acestora. După cum se poate observa din figură. Treceţi apoi în coloana Data Type pentru a alege tipul pe care doriţi să-l atribuiţi noii coloand. procedaţi în felul următor: 1. Access vă pune la dispoziţie un număr de tipuri de date predefinite.

Dacă nu o completaţi. Deşi acest lucru este opţional.Autonumber: un tip numeric special care poate fi folosit pentru cheile primare.5 Stabilirea proprietăţilor câmpurilor În această secţiune vom descrie diferitele proprietăţi pe care le poate acea un câmp (coloană) şi care pot fi stabilite folosind partea de jos a ferestrei Table design. Access introducând automat ori valori consecutive.2. • Yes/No: folosit pt stocarea datelor booleene. Format: specifică formatul în care vor fi afişate datele. pentru ca tabela să fie uşor de întreţinut. Caption: specifică denumirea sub care va apărea coloana în formulare şi rapoarte.. În continuare. În afară de proprietăţile booleene (Required. Coloanele de acest tip sunt de tip read-only (doar • citire). • • • • • Field Size: specifică lungimea şirului de caractere sau tipul numeric al datelor stocate în acest câmp. Nu afectează modul de stocare a datelor. Decimal Places: Specifică numărul de cifre de după virgulă. Access va folosi numele coloanei. Number şi Autonumber) şi New Values (pentru Autonumber). (vom reveni asupra acestei probleme) După ce s-a ales tipul coloanei care se doreşte să o creaţi. ori valori aleatoare la crearea unor înregistrări noi. Toate celelalte proprietăţi sunt opţionale. folosite ca adresă de hiperlegătură ce poate conţine trei părţi separate prin semnul #: textul afişat într-un control sau câmp. puteţi introduce o scurtă descriere a acesteia în coloana Description. singurele proprietăţi pe care trebuie să le specificaţi sunt Field Size (pentru tipurile de date Text. 21 . Input Mask: controlează formatul în care trebuie introduse datele în câmp. Definiţi acest format apăsând butonul. Pag. Allow Zero Length şi Indexed). • Lookup Wizard: vă dă posibilitatea să definiţi un câmp în care utilizatorul să poată selecta o valoare din altă tabelă sau dintr-o listă predefinită. este bine să profitaţi de el. Setul de proprietăţi pe care îl aveţi la dispoziţie variază în funcţie de tipul de date ales pentru coloana respectivă. Multe dintre proprietăţile de bază sunt comune tuturor tipurior de date. • OLE Object: folosit pentru a stoca text sau o combinaţie de text şi date numerice.. Puteţi alege un format predefinit sau puteţi crea dumneavoastră unul. vom vorbi mai pe larg despre proprietăţi. Valoarea Auto arată faptul că numărul de zecimale este dat de proprietatea Format. 2. adresa (calea către un fişier (UNC) sau către o pagină (URL)) şi o subadresă (o locaţie din cadrul fişierului sau paginii).

Indexed: arată dacă un câmp este indexat sau nu. Dacă ea are valoarea Yes. ea vă permite să alegeţi tipul de control folosit pentru introducerea datelor în câmp. New Values: este o proprietate specifică tipului de date Autonumber şi indică modul în care Access generează numerele ce vor fi stocate în câmp: crescător (Increment) sau aleator (Random). Figura reprezintă pagina Lookup pentru un câmp de tip text.• • • Default Value: valoarea atribuită din oficiu câmpului la inserarea unei noi înregistrări. Validation Rule: expresie (regulă de validare) ce limitează valorile ce pot fi introduse în câmp. indiferent de valoarea proprietăţii Required. iar valorile stocate în el trebuie să fie unice. Despre indecşi şi coloane indexate vom vorbi mai pe larg în acest capitol. Valoarea Zes (Duplicates Allowed) înseamnă faptul că un câmp este indexat. 22 . • • • • Aceste proprietăţi le găsiţi în pagina General din partea de jos a ferestrei Table Design. Required: arată dacă un câmp poate conţine valoarea null Allow Zero Length: arată dacă în câmpurile de tip Text sau Memo pot fi introduse şiruri de caractere de lincime zero. Valoarea Yes (No Duplicates) arată faptul că un câmp poate fi indexat. un şir de lungime zero este o valoare validă pentru un câmp. iar valorile sale trebuie să fie unice. Validation Text: textul afişat dacă datele introduse în câmp nu respectă regula de validare. Pag. Valoarea No arată faptul că un câmp nu este indexat. Number. Cea de-a doua pagină este Lookup şi. pentru unele tipuri de date (Text. Yes/No). Această proprietate este independentă de proprietatea Required.

dintr-o interogare sau dintr-o listă specificată de dumneavoastră. valoarea pentru Display Control va fi stabilită automat. Combo Box sau List Box. 23 . vă propunem să creăm împreună. Dacă aţi optat pentru Text Box. Combo Box sau Check Box. Pentru a înţelege mai bine mecanismul şi utilitatea expertului Lookup Wizard. tabela Curs_Student.2. Pagina “Lookup” pentru un cîmp de tip text Prima proprietate din pagine Lookup este Display Control şi ea specifică modul în care vor fi afişate datele. nu mai sunt alte proprietăţi de stabilit. Pag. După cum am mai spus. Asupra acestei probleme vom reveni ulterior în acest capitol. în modul Table Design View. 2. Valorile Text Box sau Combo Box vă dau posibilitatea să specificaţi liste din care utilizatorul să selecteze datele ce trebuie introduse în câmp. Aceste date pot proveni din liste predefinite sau din alte tabele. Cel mai simplu mod de a folosi proprietăţile din pagina Lookup este cu ajutorul expertului Lookup Wizard. puteţi alege Text Box. 2. Dacă la tipul coloanei aţi ales Lookup Wizard. sunt disponibile sau nu şi alte proprietăţi. aceste valori pot proveni din alte tabele.6 Lookup wizard Expertul Lookup Wizard este folosit pentru a defini modul în care pot fi regăsite şi afişate valorile ce pot fi introduse într-un câmp.Fig. Pentru coloane de tip Text sau Number. despre care vom vorbi în secţiunea următoare. valorile disponibile pentru Display Control sunt Text Box.6. iar pentru coloane de tip Yes/No. În funcţie de valoarea sa.

în căsuţa de validare Hyde key column. Apăsaţi butonul Next. în prima cutie de dialog a expertului alegeţi prima opţiune. Pag. prin care specificaţi că doriţi ca datele să fie luate dintr-o tabelă sau interogare. 6. în câmpul Field Name: Introduceţi numele coloanei. După ce aţi creat coloanele NrMatricol şi Nota (vezi figura 2. specificaţi dacă doriţi să apară şi coloana care face legătura între cele două tabele (IdCurs). Proprietatea Caption din pagina general are acum valoarea Curs. selectaţi din listă tabela Curs şi apăsaţi Next 5. IdCurs. lăsaţi căsuţa validată şi apăsaţi Next. Notă: dacă tabela Curs este deschisă în modul Datasheet View sau Design View. Selectaţi coloana Denumire şi apăsaţi Next. 4. 7.despre care am mai vorbit. în ultima cutie de dialog introduceţi numele pe care doriţi să-l aibă noua coloană în modul Datasheet View sau în formulare („Curs”). Pentru a putea fi stabilite ralaţiile. închideţi-o. pentru ca Lookup Wizard să îşi poată finaliza acţiunile. De asemenea. Vom folosi Lookup Wizard pentru a regăsi denumirile cursurilor opţionale disponibile şi a-i oferi utilizatorului posibilitatea de a alege un curs dintr-o listă. în câmpul Datatype: alegeţi Lookup Wizard. Lookup Wizard va salva tabela cu noile modificări şi va stabili relaţia între tabela Curs şi Curs_Student (care este de tipul 1:m). 24 . urmaţi paşii următori pentru a crea coloana IdCurs: 1.6) . Apăsaţi butonul Finish. cea de-a patra cutie de dialog vă permite să ajustaţi lăţimea coloanelor selectate. 3. în cea de-a doua cutie de dialog. Pentru aceasta este necesar ca dumneavoastră să fi creat în prealabil tabelele Curs şi Student. 2. 8. Cum nu dorim acest lucru. observaţi în fereastra Table Design noile valori ale proprietăţilor din pagina Lookup (vezi figura). în cea de-a treia cutie de dialog specificaţi din care coloane ale tabelei Curs doriţi să fie luate datele. 9.

în tabela Curs_Student este stocat doar IdCurs. Va apărea o listă a tuturor cursurilor din tabela Curs (fig. Deşi ceea ce vedeţi este denumirea cursului. Utilitarul “Lookup Wizard” Pentru a vedea rezultatele acestor acţiuni. 2. treceţi în modul Table Datasheet View. 25 .Fig. astfel încât regulile de integritate referenţială să poată fi păstrate. acesta va fi afişat în câmp.7. Selectaţi coloana Curs şi apăsaţi butonul din parteadreaptă a câmpului. în cazul în care denumirea unui curs în tabela Curs se modifică.8). 2. dacă selectaţi un nume din listă. Pag. această modificare să se reflecte şi în tabela Curs_Student. Astfel. fără ca ea să trebuiască să fie făcută manual.

vor apărea două coloane. 1. Alegem Col1. Apoi. Creearea tabelei Curs_Student În continuare. prin care specificaţi faptul că veţi introduce dumneavoastră valorile dorite. 2. 5. ajutând utilizatorul la alegerea lor. cea de-a doua cutie de dialog vă permite să specificaţi numărul de coloane ce vor fi afişate şi valorile lor. dialogul final vă cere să introduceţi denumirea coloanei. specificaţi care dintre cele două coloane va avea datele stocate în tabela Curs_Student. Apăsaţi butonul Next. datele din Col2 vor fi doar afişate. Apăsaţi butonul Next. în prima cutie de dialog a lui Lookup Wizard alegeţi cea de-a doua opţiune. Apăsaţi butonul Finish.2 Programare Engleză Franceză Germană în cea de-a treia cutie de dialog. Pag. datele din tabelul următor. apăsaţi Next. vom descrie procedeul prin care valorile stocate în câmpul Curs al tabelei Curs_Student să poată fi selectate dintr-o listă definită de dumneavoastră. introduceţi cifra 2. alegeţi pentru coloana Curs: tipul Lookup Wizard. în care introduceţi. Astfel. Col. Col.Fig. de exemplu. În partea de jos a cutiei de dialog.8. 26 . ca mai înainte. 1 1 2 3 4 4. Aceasta este Curs. 2. În câmpul Number of Columns. în modul Table Design. 3. datele stocate în tabelă vor ocupa mai puţin spaţiu.

cum ar fi lăţimea coloanelor (Column Widths) sau puteţi specifica dacă utilizatorul poate introduce în câmpul Curs Numai valori din listă sau şi alte valori (prin proprietatea Limit to List). ce vă va permite să specificaţi coloanele din care să fie luate datele prin intermediul unei interogări. 2. În cazul exemplului nostru. (datele de tip text este bine să le introduceţi între ghilimele). 27 . ca în figura. De exemplu. în pagina Lookup a ferestrei Table Design. Pag. tipul este Number (dacă aţi fi dorit să stocaţi în tabelă denumirile. pentru a specifica o listă de valori aveţi grijă ca. pentru proprietatea Display Control stabiliţi valoarea Combo Box sau List Box. alegeţi valoarea Value List. puteţi modifica unele proprietăţi. Fig. Number sau Yes/No. separate prin punct şi virgulă.2. ar fi trebuit să alegeţi tipul Text). un alt instrument util pus la dispoziţie de Access. să alegeîi în câmpul Data Type tipul Text. 2. Alcatuirea unei liste derulante Dacă doriţi ca valorile pentru coloana de căutare să fie luată dintr-o tabelă. În câmpul proprietăţii Row Source introduceţi valorile din tabel. în funcţie de tipul valorilor ce vor fi stocate în tabelă. iar pentru proprietatea Row Source Type. în pagina Lookup. Apoi. va trebui să folosiţi Query Builder. sub formă de listă.Acum.7 Value List Puteţi beneficia de facilităţile coloanelor de tip Lookup (de căutare) şi fără a apela la Lookup Wizard (deşi aceasta este cea mai comodă cale). parcurse pe linii. Despre interogări şi Query Builder vom vorbi în capitolele următoare.9.

procedaţi astfel: deschideţi tabela Student în Table Design View. Hyperlink sau OLE Object. Selectaţi coloana sau grupul de coloane ce va servi drept cheie primară şi apoi apăsaţi butonul Primary Key de pe bara cu instrumente sau alegeţi comanda Edit | Primary Key. după numele complet (NumeSt+PrenumeSt). deoarece cheia primară nu poate conţine valoarea null. deci există un index de pe coloana NrMatricol. treceţi în modul Design View al acelei tabele. 28 . modificare sau ştergere) trebuie să verificaţi şi să actualizaţi şi indecşii. ţineţi apăsată tasta Ctrl în timp ce efectuaţi operaţia de mai sus pentru fiecare câmp. NrMatricol. Va apărea fereastra Indexes pentru tabela Student (fig. adică Access indexează acea coloană şi duplicatele nu sunt permise. Pentru a crea un index pe aceste două coloane. Când o coloană face parte din cheia primară a unei tabele.2. De aceea. Nu pot fi indexate coloanele de tipul Memo. altfel. numit Primary Key. Pag. Să presupunem că se fac frecvente căutări în tabela Student. indecşii îngreunează serios actualizarea lor. puteţi crea un index pentru coloana NumeSt.). apăsaţi butonul Indexes de pe bara de instrumente sau alegeţi comanda View | Indexes. Observaţi că ea conţinde deja o intrare pentru cheia primară a tabelei. După fiecare operaţie de actualizare a datelor (inserare. Cheia primară a unei tabele este indexată automat. Pentru a crea cheia primară a unei tabele. De exemplu.8 Definirea cheilor primare şi a indecşilor Un index reprezintă o cale rapidă de localizare şi sortare a înregistrărilor dintro tabelă prin gruparea tuturor înregistrărilor pentru un anumit atribut sau grup de atribute. ei pot mări timpul de răspuns al sistemului şi ocupă spaţiu suplimentar pe disc. proprietatea Indexed are valoarea o coloană face parte din cheia primară a unei tabele. deoarece. Indexarea este utilizată în două scopuri principale:accelerarea căutărilor în baza de date şi asigurarea unicităţii înregistrărilor.2. faceţi clic în coloana cea mai din stânga a ferestrei Table Design. Proprietatea Required primeşte valoarea Yes. folosurea lor trebuie să fie bine întemeiată. proprietatea Indexed are valoarea Yes (No Duplicates). Utilizarea unui index are sens doar dacă se vor face interogări frecvente relativ la coloana indexată. Notă: Pentru a selecta un câmp în Table Design View. Deşi accelerează procesul de regăsire a datelor. dacă vă interesează anumite nume de familie în tabela Student. pentru a regăsi mai rapid studenţii cu un anumit nume de familie. Pentru a selecta mai multe câmpuri.

Pentru aceasta. Proprietăţile fiecărui index le puteţi vedea în partea de jos a ferestrei Indexes dacă faceţi clic în celula în care aţi specificat numele indexului (nume şi. 2. vom crea şi un index pe aceste coloane. Cum de cele mai multe ori vom dori ca studenţii să fie sortaţi în ordine alfabetică. introduceţi în primul câmp liber al coloanei Index Name denumirea indexului: să-i spunem Nume. lăsaţi în coloana Sort Order valoarea Ascending. Astfel am creat indexul Nume pe coloanele NumeSt şi PrenumeSt. Pag. respectiv. deoarece sortarea studenţilor se va face după nume şi prenume. lăsaţi necompletat câmpul din linia următoare a coloanei Index Name (am precizat deja numele indexului) şi alegeţi în câmpul Field Name coloana PrenumeSt. 3. 29 .Fig. Proprietăţile pentru noul index creat le puteţi vedea în figură. Primary Key). 2. faceţi clic în coloana Field Name a aceleiaşi linii şi alegeţi din lista derulantă coloana NumeSt.10. Stabilirea indecşilor 1. Ordinea sortării va fi tot crescătoare.

Primul vă ajută să creaţi o tabelă pe baza unei tabele predefinite. se şterge doar legătura. în care relaţia este definită în timpul creării unei tabele. să selectaţi coloanele dorite. Acesta este şi modul care vă oferă cel mai mult control asupra tabelelor create şi proprietăţilor lor. O dată tabela creată. ambele tabele trebuie să existe în baz ade date. Table Wizard este util mai ales pentru aceia dintre dumneavoastrp care nu au mai lucrat cu Access. Nu este necesar ca relaţiile să fie create o dată cu tabelele. 2. Cei cu experienţă vor găsi că este mai simplu să pornească direct cu Table Design View. Prin crearea unei coloane de tip lookup (de căutare) care să-şi ia datele din altă tabelă. Pag. 30 . 2. Link table Wizard creează legături între baza de date curentă şi tabele dintr-un fişier extern (oricare din cele specificate mai sus). se stabileşte şi o relaţie între cele două tabele. 2.11. Import Table Wizard şi Linking Table Wizard. documente HTML. veţi folosi pentru definirea relaţiei ori expertul Table Wizard. Fox Pro. nu şi tabela din baza de date sursă. să stabiliţi relaţii între noua tabelă şi alta existentă.9 Crearea unei tabele folosind experţii Access. fie după aceea. Table Wizard vă dă posibilitatea să alegeţi tabela care să vă servească drept model. Access vă pune la dispoziţie şi trei experţi: Table Wizard. Pînă acum am discutat despre cel mai complicat mod de a crea o tabelă. dBase. Cea de-a doua modalitate este să definiţi coloane de tip lookup (despre care am mai vorbit în cadrul acestui capitol). Crearea celui de-al doilea index 2.Fig. să le redenumiţi. Pentru a stabili relaţii între tabele. Table Wizard vă permite acest lucru într-una dintre cutiile sale de dialog. ori coloanele de căutare. să spuneţi dacă doriţi ca Access să creeze o cheie primară. cum ar fi: tabele Excel. orice sursă ODBC disponibilă în sistemul dumneavoastră sau din alte baze de date Access. Expertul Import Table Wizard vă permite să importaţi obiecte şi date din surse externe. Fereastra Relationships Relaţiile pot fi definite fie în timpul creării unei tabele noi. Dacă ştergeţi o tabelă legată din baza de date curentă.3. cel mai simplu mod de a crea o relaţie între două tabele este folosirea ferestrei Relationships. fişiere text.1. bazele de date relaţionale folosesc coloane cheie care sunt comune tabelelor pe care le leagă. să stabiliţi relaţii. puteţi folosi modul Table Design pentru a-i modifica proprietăţile sau Table Datasheet pentru a introduce datele. să le modificaţi anumite proprietăţi. Pentru a defini o relaţie. De fapt. cum este şi Microsoft Access.3 Stabilirea relaţiilor între tabele Posibilitatea de a crea şi de a folosi relaţiile dintre tabelele unei baze de date este punctul forte al bazelor de date relaţionale şi al sistemelor de administrare a bazelor de date relaţionale. Puteţi vizualiza şi modifica datele dintr-o tabelă legată de baza dumneavoastră de date. În primul caz.2.

Astfel. ea va apărea în fereastra Relationships împreună cu toate relaţiile la care participă. Fig. faceţi dublu clic pe numele ei în cutia de dialog Show Table. în fereastra. Access va adăuga automat în fereastra Relationships toate tabelele care participă la relaţii cu tabela aleasă. Figura prezintă relaţiile la care participă tabela Curs_Student. Pentru a vedea toate relaţiile care au fost definite pentru o anume tabelă. adăugaţi tabela la fereastra Relationships. Notă: înainte de a folosi fereastra Relationships pentru crearea sau modificarea unei relaţii. 31 .Aceasta poate fi deschisă fie prin comanda Tools | Relationships. Vizualizarea tabelelor pentru stabilirea de relaţii Dacă pentru baza de date curentă există relaţii salvate. 2. ea va apărea pe ecran goală. este bine să închideţi orice fereastră Datasheet View pentru că nu pot fi impuse regulile de integritate referenţială dacă tabelele implicate sunt deschise într-unul din cele două moduri amintite. dar relaţiile nu au fost salvate.12. împreună cu cutia de dialog Show table. Pag. Dacă fereastra Relationships este deschisă pentru prima dată pentru baza de date curentă sau dacă a mai fost folosită. precum şi relaţiile respective. cutia de dialog Show table nu va apăre ci. fie apăsând butonul Relationships de pe bara cu instrumente. Pentru a adăuga o tabelă sau o interogare la fereastra Relationships. Relaţiile sunt prezentate sub forma unei linii continue ce leagă câmpurile cheie ale tabelelor ce participă la o relaţie. închideţi cutia de dialog Show Table şi alegeţi comanda Relationships | Show Direct. vor fi afişate tabelele şi relaţiile dintre acestea.

2.2 Crearea relaţiilor dintre tabele. procedaţi astfel: 1. 2. Din fereastra Relationships puteţi accesa modul Table Design View pentru o tabelă. adăugaţi ambele tabele la fereastra Relationships. Pentru a înlătura toate tabelele din fereastra Relationships fără a şterge relaţiile dintre ele. Pentru aceasta. alegeţi comanda Relationships | Show All. faceţi clic pe unul dintre câmpurile tabelei şi din meniul derulant alegeţi comanda Table Design.) 2. Pentru aceasta. Pentru a înlătura o tabelă din fereastra Relationships fără a şterge vreuna din relaţiile la care participă. Acum. după ce aţi aflat cum să adăugaţi şi să înlăturaţi o tabelă din fereastra Relationships. este timpul să învăţaţi cum se poate stabili o relaţie între două tabele. 32 .Fig. selectaţi tabela făcând clic pe oricare dintre câmpurile ei şi apoi alegeţi comanda Relationships | Hide Table sau Edit | Delete. (aveţi grijă să selectaţi o tabelă şi nu o relaţie). (După ce terminaţi lucrul în fereastra Table Design View. Pag.3. Relaţiile petru tabela Curs_Student Pentru a putea vedea relaţiile stabilite între toate tabelele bazei de date curente. Vom crea o relaţie între tabelele Profesor şi Titlu. trageţi câmpul peste câmpul IdTitlu din tabela Profesor. folosiţi comanda Edit | Clear Layout. faceţi clic pe câmpul IdTitlu din tabela Titlu şi. ţinănd mouse-ul apăsat.13. închideţi-o.

Fig.15. va apărea cutia de dialog Relationships (fig. 2. Cele două câmpuri trebuie să aibă acelaşi tip de date.Fig. Câmpurile de tip Autonumber.) apăsaţi butonul Create pentru a accepta valorile propuse de Access. pentru care valoarea New Value are valoarea Increment. proprietatea Field Size trebuie să aibă aceeaşi valoare.14. Acum. Stabilirea relaţiilor petru tabela Curs_Student 3. pentru a crea o relaţie 1:m între două tabele va trebui să deplasaţi cheia primară (afişată îngroşat) a uneia dintre tabele peste câmpul corespunzător (cheie străină) din cealaltă tabelă. în fereastra Relationships relaţia este figurată printr-o linie ce uneşte câmpurile IdTitlu din cele două tabele. pot fi puse în relaţie cu coloane de tipul Number. pentru care Proprietatea Field Size este stabilită la Long Integer. Stabilirea relaţiilor între tabelele Profesor şi Titlu De cele mai multe ori. 33 . 2. Dacă ambele câmpuri sunt de tipul Number. Pag.

2. Acest tip de asociere este util atunci când doriţi numai Pag. outer join şi self-join. Aici puteţi adăuga câmpuri pentru a defini o relaţie.2.16 Cutia de dialog Join Type De asemenea. Tot aici puteţi stabili tipul de asociere (join) pe care Access îl va folosi când veţi crea o interogare bazată pe cele două tabele. faceţi clic în celula care îl conţine şi alegeţi noul câmp ca mai înainte.) Dacă doriţi să schimbaţi câmpul unei tabele care participă la relaţie. 2. Acest lucru îl realizaţi apăsând butonul Join Type. Rezultatul unei interogări bazate pe două tabele corelate poate fi interpretat ca o tabelă în care fiecare linie este o combinaţie a unei linii luate din prima tabelă şi a uneia din cea de-a doua tabelă. problemă asupra căreia vom reveni. 34 . făcând clic într-o celulă goală a grilei şi alegând câmpul dorit din lista derulantă.3. puteţi decide dacă Access va impune regulile de integritate referenţială asupra tabelelor care participă la relaţie. Tipul outer join poate fi. left outer join şi right outer join. despre tipurile de asociere vom vorbi în secţiunea următoare.4.3. 2. Se va deschide cutia de dialog Join Properties (fig. trebuie să alegeţi un câmp corespunzător din cealaltă tabelă.3 Proprietăţile relaţiilor Cutia de dialog Relationships vă permite să stabiliţi proprietăţile relaţiilor. O asociere de tipul inner join este aceea în care liniile celor două tabele sunt concatenate şi adăugate la rezultatul unei interogări numai dacă valorile câmpurilor de legătură sunt egale. Fig. (Dacă adăugaţi un câmp. Cele trei tipuri principale sunt: inner join. la rândul său.16). Tipuri de asociere Tipul de asociere (join) al unei relaţii specifică modul în care sunt regasite informaţiile din două tabele corelate şi nu afectează relaţia însăşi.

LEFT JOIN şi RIGHT JOIN pot produce aceleaşi efecte dacă sunt schimbaţi între ei şi dacă se modofică ordinea tabelelor.IdCurs O asociere de tip right outer join (right join) va include în rezultatele interogării toate înregistrările din tabela din partea dreaptă a operatorului TIGHT JOIN. folosiţi un inner join.IdCurs = Curs_Student. O asociere de tipul left outer join (sau left join) vă dă posibilitatea să includeţi în rezultatele interogării toate înregistrările din tabela din partea stângă a operatorului LEFT JOIN. Tipul inner join mai este cunoscut şi sub numele de equi-join şi este opţiunea implicită propusă de Access. folosiţi un outer join. O asociere de tip self-join este între două copii ale aceleiaşi tabele şi o puteţi crea prin corelarea a două câmpuri ale aceleiaşi tabele. Tipul outer join este opusul lui inner join. Pag. interogarea următoare va avea acelaşi efect ca şi cea de mai sus: SELECT Denumire. iar din tabela din partea dreaptă.înregistrările care au valori în câmpurile corelate. Access o va reprezenta printr-o linie cu săgeată la unul din capete. NrMatricol FROM Curs LEFT JOIN Curs_Student ON Curs. După ce aţi selectat o asociere de tipul outer join. iar din tabela din partea stângă a operatorului doar înregistrările care au un corespondent din tabela din dreapta. la creareea interogării Access va considera că tabela care conţine cheia primară este tabela din stânga operatorului. Astfel. 35 . dacă doriţi să vedeţi numai cursurile pentru care a optat cel puţin un student.IdCurs Notă: nu există nici o legătură între poziţionarea tabelelor în fereastra Relationships (una la stânga celeilalte) şi poziţionarea lor în stânga sau în dreapta operatorului LEFT JOIN sau RIGHT JOIN. Observaţi că cei doi operatori.IdCurs = Curs_Student. vă prezentăm interogarea ce regăseşte toate cursurile disponibile şi numerele matricole ale studenţilor care s-au înscris la cel puţin un curs: SELECT Denumire. În cazul în care între două tabele există definită o relaţie. Pentru a ilustra cele mai de sus. Dacă doriţi să regăsiţi cursurile indiferent dacă au fost alese sau nu de cel puţin un student. Reţineţi că sensul în care este orientată săgeata este dinspre tabela din care se vor include toate înregistrările către tabela din care se vor include doar înregistrările ce au un corespondent. De exemplu. doar înregistrările care au corespondent în tabela din stânga. El permite adăugarea unei linii la rezultatele unei interogări chiar dacă nu există o linie corespunzătoare în tabela corelată. NrMatricol From Curs_Student RIGHT JOIN Curs On Curs.

va trebui ca acea valoare să existe şi în tabela Titlu. Pentru relaţia Profesor/Titlu. dacă în tabela Profesor există o valoare pentru câmpul IdTitlu. inner join.17). Prima opţiune vă este oferită prin intermediul casetei de validare Cascade Update Related Fields. Access va afişa o cutie de dialog în care vă va spune că acţiunea dorită nu se poate finaliza.5 Asigurarea integrităţii referenţiale Access va asigura în mod automat integritatea referenţială pentru două tabele corelate dacă veţi valida caseta de validare Enforce Referential Integrity din cutia de dialog Relationships. Va apărea cutia de dialog Import (fig.6.3. Astfel. Astfel. Access va modifica. Apoi faceţi dublu clic pe linia ce reprezintă relaţia pe care doriţi să o modificaţi. left outer join sau right outer join. adăugaţi tabelele respective în fereastra Relationships. nu veţi putea şterge o înregistrare din tabela Titlu dacă tipul respectiv este atribuit unui profesor din tabela Profesor. toate apariţiile acelei valori în coloana IdTitlu a tabelei Profesor. selectaţi-o făcând clic pe linia care o reprezintă şi apoi apăsaţi tasta Delete. De asemenea.4. puteţi alege ca modificările sau ştergerile dintr-o tabelă să se reflecte şi în tabela corelată. alegeţi în cutia de dialog Join Properties opţiunea cu nunărul unu. selectaţi comanda File | Get External Data | Import sau faceţi clic dreapta în fereastra Database şi alegeţi din meniul derulant comanda Import. Access vă dă şi posibilitatea de a specifica în ce mod doriţi să fie rezolvate problemele legate de integritatea referenţială. Dacă veţi încerca să introduceţi date sau să le modificaţi astfel încât să fie încălcată integritatea referenţială.2. Pentru a şterge o relaţie. pentru ca integritatea referenţială să nu fie afectată. De asemenea. în consecinţă. vă va spune şi care dintre tabelele corelate cauzează violarea integrităţii referenţiale. Pag. Modificarea relaţiilor existente Pentru a modifica o relaţie existentă între două tabele. Va apărea cutia de dialog Relationships. Această opţiune vă asigurăcă orice modificare a valorilor din cheia primară a unei tabele va duce automat la modificarea corespunzătoare a valorilor din cheia străină a tabelei corelate. Astfel. 2.Access vă dă posibilitatea de a opta doar pentru inner join. 36 .1 Importul datelor Pentru a importa un fişier în Access. 2. în care puteţi efectua modificările dorite. 2.3. dacă modificaţi o valoare a coloanei IdTitlu din tabela Titlu.

va prezenta cutiile de dialog corespunzătoare. • Puteţi exporta un modul numai în formatul Access sau text. Va apărea o cutie de dialog care vă va întreba dacă doriţi să salvaţi obiectul într-un fişier extern sau în baza de date curentă. 2. 2. Access. text şi RTF (Rich Text Format). va apărea cutia de dialog prezentată în fig. .4. există câteva reguli de care este bine să ţineţi cont: • puteţi exporta o tabelă sau o interogare fie salvând-o într-un fişier nou. în care veţi putea specifica opţiunile dumneavoastră. 37 . Pentru a exporta un obiect din baza de date curentă. Totuşi. Importul datelor Aici puteţi alege fişierul pe care doriţi să-l importaţi. veţi exporta şi datele ce creează formularul sau raportul. • puteţi exporta un formular sau un raport în unul din formatele: Access. În funcţie de formatul de fişier ales. Pag. fie într-o nouă tabelă sau interogare din baza de date curentă. Excel.Fig. selectaţi-l în fereastra Database şi alegeţi comanda File | Save As | Export.2 Exportul datelor Access vă dă posibilitatea de a exporta toate tipurile de obiecte dintr-o bază de date. Dacă selectaţi prima opţiune. În toate cazurile în afară de formatul Access .17.

De asemenea.Fig. Access: formatele Access în care puteţi importa sau exporta date sunt: . care vă ajută să importaţi date din formatul text.0 la 3.XLS): puteţi importa sau exporta date în format Excel. 2. Formate standard Access vă pune la dispoziţie peste unsprezece formate pentru exportul datelor şi peste nouă formate pentru import. versiunile 3. În funcţie de formatul ales. Puteţi ataşa ieşirea unui obiect la un mesaj e-mail. pentru exportul datelor în format text.MDA şi . .DB): puteţi importa sau exporta date în formatul Paradox.HTM.0. Lotus: puteţi importa sau exporta date în format Lotus 1-2-3.x. Import Spreadsheet Wizard.0 şi 5. . . aveţi la îndemână şi trei experţi : Import Text Wizard. Baze de date ODBC: pentru a importa sau exporta date din sau în Microsoft SQL Server. 2.CSV.RTF (Rich Text Format). versiunile 3. Microsoft Excel (. DBase (. versiunile III. IV şi V. Access va prezenta diferite interfeţe.DBF): puteţi importa sau exporta date în format FoxPro. puteţi exporta în formatul . versiunile de la 2. trebuie să aveţi instalat un driver ODBC. Text: formatele text în care puteţi importa sau exporta date sunt: .DBF): puteţi importa sau exporta date în format dBase.0 şi 97.TXT.HTML şi .4. pentru importul tabelelor Excel sau lotus şi Export Text Wizard. Sybase SQL Server. HTML: formatele disponibile pentru importul şi exportul datelor sunt .TAB. Oracle Server sau alte formate.MDE. 38 .MDB.17. În plus. . • • • • • • • • • Microsoft FoxPro (.3. 4.0. Paradox (.MDW.ASC. Pag. Exportul datelor Aici puteţi alege tipul de fişier extern în care doriţi să salvaţi obiectul şi locaţia acestuia. .0 – 7.

interogarea va fi definită tot ca o instrucţiune SQL.1. numită şi grila QBE. Fig. Există două modalităţi de creare a interogărilor în Access: folosirea ferestrei QBE (Query by Example).indiferent pe care dintre cele două moduri le folosiţi.CAP:3. deoarece nu contează doar faptul că puteţi stoca informaţii. precizează câmpurile tabelelor şi criteriile pe baza cărora este definită interogarea. fereastra QBE este compusă din două părţi. Abilitatea de a crea interogări este considerată a fi „creierul” unui sistem de baze de date relaţional. ci mai ales faptul că puteţi regăsi exact informaţia de care aveţi nevoie la un moment dat. interogările deţin un rol foarte important (ele pot fi sursa unui raport. numită şi Query Design. 3. Fereastra QBE (Query by Example) Pag. folosirea ferestrei QBE este un mod simplu şi intuitiv de a crea o interogare. intern. Deşi are limitările sale. În Access.1. Partea de jos. Access SQL este dialect care diferă substanţial de standardul ANSI. formular sau a listei de valori posibile pentru o coloană de căutare). Partea de sus (pe care o vom numi şi panou) prezintă tabelele pe care se bazează interogarea şi relaţiile dintre ele. 39 . Ele vă permit să regăsiţi anumite informaţii stocate în baza de date.3. Interogări Interogările sunt una dintre cele mai puternice componente din Access 97.1. Folosirea ferestrei QBE După cum puteţi observa din fig. sau introducerea directă de comenzi SQL. 3.

selectaţi asteriscul care apare imediat sub bara de titlu şi deplasati-l peste grilă. ale tabelelor. aşa că va trebui să-l introduceti separat. O dată selectat un câmp. Se va deschide o listă cu toate câmpurile tavelelor şi interogărilor din panoul QBE. Pentru a introduce în grilă toate câmpurile unei tabele. şi cel puţin un câmp în grila ferestrei QBE.2. Pentru a defini o interogare. Specificarea surselor de date Puteţi specifica sursele de date pe care se bazează o interogare(tabele sau alte interogări) fie în timpul creării interogării. 40 .1. 3. O altă cale prin care puteţi adăuga tabele sau interogări la interogarea curentă este de a le plasa din fereastra Database în panoul ferestrei QBE.3. Aceasta va apărea automat la crearea unei noi interogări sau dacă alegeti comanda Query | Show Table. în care treceţi cu comanda View | Datasheet View). câmpul trebuie să fie vizibil în grilă. introduceţi-le în grila QBE în felul următor: selectaţi-le în tabela sau interogarea respectivă (făcând clic pe ele) şi deplasaţi-le peste grila QBE. Dacă doriţi să stabiliţi anumite criterii pe baza cărora datele unui câmp să fie incluse în rezultatul interogării. ale cărei câmpuri sunt cele specificate în grila QBE. rezultatele unei interogări sunt prezentate sub forma unei tabele virtuale.1. După cum spuneam.1. sau interogări din panou. Datele acestei tabele sunt selectate din câmpurile din grila QBE pe baza unor criterii. fie după aceea prin intermediul cutiei de dialog Show Table. O altă cale de a introduce în grila QBE un câmp este să faceţi clic în prima celulă liberă din linia Field a grilei şi să apăsaţi butonul don dreapta.trebuie să aveţi cel puţin o tabelă sau o interogare în panoul ferestrei QBE. Chiar dacă rezultatul interogării va conţine toate câmpurile din tabelă (rezultatul îl puteţi vedea în modul Datasheet View. Proprietăţile interogărilor Când vorbim despre proprietăţile unei interogări ne referim de fapt la proprietăţile mai multor obiecte: ale interogării ca obiect în sine. se va completa automat şi celula corespunzătoare din linia Table. se va deschide cutia de dialog prezentată în figură: Pag. ale câmpurilor acestora şi relaţiilor. în grila QBE va apărea doar asteriscul. Aici puteţi selecta tabelele sau interogările ce se vor servi drept sursă de date pentru interogarea curentă. Dacă doriţi ca rezultatul interogării să conţină anumite câmpuri ale unei tabele sau interogării din panoul ferestrei QBE. Dacă selectaţi o interogare din pagina Queries a ferestrei Database şi apoi apăsaţi butonul Properties de pe bara cu instrumente.

• Run Permissions: specifică dacă interogarea rulează cu drepturile proprietarului (owner’s) sau a utilizatorului (user’s). cutia de dialog Properties vă arată când a fost creat obiectul. • Unique Values: dacă valoarea sa este Yes.Fig. nu ar avea drept să o execute. 41 . vom prezenta în detaliu aceste proprietăţi: • Description: aici puteţi introduce o descriere de maximum 255 de caractere a interogării. puteţi da unui utilizator permisiunea de a efectua o acţiune pe care. vom vedea numai valorile unice a lui IdCurs. returnează numai înregistrările unice în cadrul sursei de date (tabelă sau interogare). Pentru a vedea şi obiectele cu proprietatea Hidden (ascunse). obiectul nu va mai apărea în fereastra Database (aceasta este o măsură de securitate). • Output All Fields: valoare Yes va introduce în rezultatele interogării toate câmpurile tabelelor/interogărilor din panoul QBE. 3. În continuare. altfel. Pe lângă descriere. Cea de-a doua casetă de validare vă lasă să specificaţi dacă obiectul este replicabil. Pag. faceţi dublu-clic în panou. • Unique Records: dacă valoarea sa este Yes. dacă în grilă se află numai câmpul IdCurs al tacelei Curs_Stud. De exemplu. în pagina View. Proprietăţile interogăriilor Pentru fiecare obiect puteţi introduce o descriere de maximum 255 de caractere. validaţi caseta Hidden Objects.2. Pentru a vedea pagina de proprietăţi a ferestrei QBE. • Top Values: returnează numai primele n sau n% înregistrări. Dacă validaţi caseta Hidden. Aceasta este o pagină detaliată de proprietăţi a interogării. când a fost modificat ultima dată şi cine este proprietarul lui. Astfel. alegeţi comanda Tool | Options şi. returnează numai înregistrările unice pentru câmpurile din grila QBE.

Este util în cazul în care interogarea se bazează pe o asociere self-join. 42 . Valoarea implicită este baza de date curentă. va porni un wizard care vă va ajuta să specificaţi modul în care vreţi să arate datele.). în care se întrerupe execuţia interogării dacă serverul ODBC nu răspunde. • Decimal Places: Pentru câmpurile numerice. Vă permite să selectaţi anumite înregistrări din rezultatul interogării. • • • • • Acestea au fost proprietăţile unei interogări privite ca întreg. Filter by Selection sau Advanced Filter/Sort din meniul Records. Dacă apăsaţi butonul din dreapta câmpului Imput Mask. apoi. ODBC Timeout: timpul. Iată care sunt aceste proprietăţi: • Descriptions: Conţine o descriere a câmpului. Sacă interogarea foloseşte tabele din mai multe baze de date externe.Proprietăţile lor le puteţi vedea în modul Design View selectându-le şi. în secunde. Cutia de dialog Properties pentru un câmp are două pagini: General şi Lookup. Pe lângă acestea. temporar pentru o tabelă. • • Cele două proprietăţi disponibile pentru tabele sunt următoarele: Alias: Vă dă posibilitatea să specificaţi un nume alternativ. urmate de punct şi virgulă (ex: dBase IV. Pag. alte interogări şi câmpuri.• Source Database: puteţi specifica o bază de date externă care conţine tabelele şi interogările sursă. precizează numărul de zecimale care vor fi afişate. Este completat automat în timpul rulării interogării dacă în modul Datasheet View selecteţi o coloană (sau două) şi apoi apăsaţi butonul Sort Ascending sau ort Descending de pe bara cu instrumente. Source: Este asemănătoare cu proprittăţile Source Database sau Source Connect String ale unei interogări. stabiliţi acestă proprietate pentru fiecare tabelă în parte. Este completat automat în timpul rulării interogării dacă în modul Datasheet View veţi folosi comentile Filter by Form. Source Connect String: numele şi versiunea aplicaţiei în care a fost creată baza de date externă. Order By: funcţionează asemănător cu secţiunea Sort a grilai QBE. Filter: funcţionează asemănător cu opţiunea Criteria a grilei QBE. de maximum 255 de caractere. • Format: Vă permite să specificaţi modul în care vor fi afişate şi tipărite datele din câmpul respectiv. Record Locks: această proprietate este utilă pentru sistemele multiuser şi specifică modul în care sunt blocate datele în timpul execuţiei interogării. alegând comanda View | Properties. cu diferenţa că aici puteţi preciza un format pentru introducerea datelor. Fiecare câmp din grila QBE are proprietaţile sale. puteţi stabili şi unele proprietăţi ale obiectelor ce compun interogarea: tabele. • Imput Mask: Funcţionează ca şi proprietatea Format.

în modul Design View şi în fig. ştergere şi actualizare). alegeţi comanda Query | Run sau apăsaţi butonul Run de pe bara cu instrumente. extreme. 3. Dacă un formular este bazat pe o tabelă. tipul de asociere. 43 . puteţi stabili calităţi diferite în interogări diferite. Notă: pentru acelaşi câmp. text şi de tip yes/no. Dacă formularul se bazează pe o interogare. Display Control: Tipurile de control folosite pentru afişarea datelor câmpului respectiv în modul Datasheet View sau pe un formular sunt: text box. vor apărea atributele corespunzătoare. Acestea sunt disponibile numai pentru câmpuri numerice. Până acum am vorbit numai despre interogări simple de tip selectare.2. 3.2.• • Caption:Titlul sub care va apărea câmpul în modul Datasheet View sau pe un formular. atributele câmpurilor sunt cele specificate în tabelă.2. Interogări de tip totals Să presupunem că doriţi să aflaţi numărul de studenţi înscrişi în fiecare curs opţional.1. În afară de interogările de tip selectare simple. Tipuri de interogări Există interogări pentru regăsirea datelor (cele de tip selectare) şi pentru modificarea datelor (inserare. Interogarea care vă va furniza aceste informaţii este prezentată în fig. Pentru a crea o astfel de interogare nu trebuie decât să folosiţi fereastra QBE pentru a specifica sursele datelor pe care doriţi să le aflaţi şi. Pentru aceasta. 3. Cele două tipuri de interogări agregat pe care Access le pune la dispoziţie sunt Totals şi Crosstab. Dacă celectaţi list box sau combo box.3 în modul Datasheet View (rezultatele). Ele vă pot fi foarte utile la întocmirea rapoartelor statistice sau a graficelor. 3. Acces vă mai oferă un tip de interogări pentru regăsirea datelor: interogările agregat. atributele câmpurilor sunt cele specificate în interogare.2. calculând sume. Rezultatele interogării le puteţi vedea intrând în modul Datasheet pentru acea interogare. Interogări agregat Interogările agregat vă dau posibilitatea de a analiza datele. eventual. list box sau combo box. Pag. dispersii etc. medii.

Mod de realizare a interogărilor de tip Total Pentru a crea o interogare de tip totals. introduceţi în grila ferestrei QBE coloanele pentru care doriţi să calculaţi totalul. Mod de realizare a interogărilor de tip Medie Pag. 2.4. Fig. 3. media. procedaţi astfel: 1. 3. 44 . extremele etc. creaţi o nouă interogare de tip select şi adăugaţi tabelele necesare la panoul ferestrei Qbe.Fig.3.

Deviaţia standard este un estimator statistic al dispersiei distribuţiei valorilor unui câmp. suma media etc. stabiliţi eventuale criterii şi rulaţi interogarea. Valorile null nu sunt luateîn considerare. În câmpul Total corespunzător acestei coloane alegeţi una dintre funcţiile agregat. alegând comanda View | Totals sau apăsând butonul Totals de pe bara cu instrumente. Min: funcţie agregat ce calculează valoarea minimă a unui câmp pentru fiecare grup. 4. vom vorbi mai pe larg despre opţiunile unei interogări de tip Totals. Dacă în grila QBE selectaţi o singură coloană. schimbaţi tipul interogării în Totals. Dacă selectaţi mai multe câmpuri cu opţiunea Group By. cu opţiunea Group By. rezultatele interogării vor conţine câte o linie pentru fiecare combinaţie unică de valori ale câmpurilor respective. Valorile null nu sunt luate în considerare. Last: funcţie agregat folosită pentru a afla ultima valoare (într-o anumită ordine) a unui câmp pentru fiecare grup. 45 .3. coloanelor cu opţiunea Group By. Avg: funcţie agregat ce calculează media valorilor unui unui câmp pentru fiecare grup definit prin opţiunea Group By. 5. Valorile null nu sunt luate în considerare. În continuare. StDev: funcţie agregat ce calculează deviaţia standard a valorilor unui unui câmp pentru fiecare grup. Max: funcţie agregat ce calculează valoarea maximă a unui câmp pentru fiecare grup. Count: funcţie agregat folosită pentru a număra înregistrările dintr-un grup ale căror valori sunt diferite de null. care să efectueze operaţia dorită. Valorile null nu sunt luate în considerare. Valorile null nu sunt luate în considerare. Pag. pentru fiecare grup definit de opţiunea Group By. Iată care pot fi aceste opţiuni: • • • • • • • • • Group By: folosită pentru a defini grupurile de înregistrări pentru care doriţi să calculaţi totalurile. Observaţi că în câmpul Total al grilei QBE va apărea în dreptul coloanelor selectate opţiunea Group By. Fiecare coloană selectată în grila ferestrei QBE trebuie să aibă specificată o opţiune în câmpul Total. Valorile null nu sunt luateîn considerare. selectaţi în grila QBE coloana în funcţie de care doriţi să aflaţi totalul. Sum: funcţie agregat folosită pentru a calcula suma valorilor unui câmp. interogarea va returna o linie pentru fiecare valoare unică a coloanei respective. First: funcţie agregat folosită pentru a afla prima valoare (într-o anumită ordine) a unui câmp pentru fiecare grup.

2. Expression: folosită pentru a calcula alte totaluri decât cele oferite de funcţiile agregat. Valorile null nu sunt luate în considerare. 3. prin evaluarea căreia obţinem o singură valoare. întâi în funcţie de prima coloană din grila QBE. Access va sorta numai coloanele pentru care aţi specificat ordinea respectând precedenţa de la stânga spre dreapta. • Dacă specificaţi ordinea de sortare numai pentru anumite coloane (pentru unele dintre coloanele cu opţiunea Group By. Access urmează următoarele reguli pentru sortarea rezultatelor unei interogări de tip Totals: • Dacă în câmpul Sort al grilei QBE corespunzător coloanelor cu opţiunea Group By alegeţi Not sorted. pentru coloanele agregat sau pentru o combinaţie de coloane agregat şi Group By).. contante. întâi în funcţie de numele studentului şi apoi de prenume. ce calculează numărul total de înregistrări dintr-un grup. • Where: clauză folosită pentru specificarea unor criterii care să limiteze rezultatele interogării. înregistrările sunt sortate crescător. O expresie poate fi orice combinaţie de oparatori. Dacă folosiţi mai multe coloane cu opţiunea Group By. În exemplul din figura. de la stânga spre dreapta. funcţii agregat. etc.. Access va sorta crescător aceste coloane. O astfel de expresie este Count(*). devalidaţi caseta din linia Show a grilei QBE corespunzătoare coloanei asupra cărei impuneţi limitările.. Dacă am fi dorit ca interogările să fie sortate întâi în funcţie de prenume şi apoi în funcţie de nume (ca în figura).2.• • Var: funcţie agregat ce calculează dispersia valorilor unui unui câmp pentru fiecare grup. • Dacă în câmpul Sort al grilei QBE corespunzător coloanelor cu opţiunea Group By specificaţi opţiunea Ascending sau Descending. incluzând inregistrările care conţin valoarea null. alegând în câmpul Sort al grilei QBE opţiunea Ascending sau Descending. precedenţa fiind de la stânga spre dreapta. precedenţa fiind de la stânga spre dreapta. apoi în funcţie de a doua. nu ar fi trebuit decât să trecem în grila QBE coloana PrenumeSt în stânga coloanei NumeSt. prin intermediul unei expresii introduse de dumneavoastră. 46 . Dispersia este pătratul deviaţiei standard. adică nu specificaţi modul în care să fie sortate datele. nume de coloane. Access va sorta automat datele.1 Sortarea rezultatelor unei interogări de tip totals Access vă dă posibilitatea de a sorta crescător sau descrescător rezultatele unei interogări. Când folosiţi această opţiune. etc. Access va sorta crescător respectiv descrescător aceste coloane. Pag.

Pag. iar cel de-al doilea criteriu este aplicat unei coloane agregat. ca în fig.2 Stabilirea criteriilor Să presupunem că doriţi să aflaţi care sunt studenţii al căror nume începe cu litera „P” şi a căror medie este peste 7.5.3.6. 3. 47 . Dacă doriţi totuşi să impuneţi limitări şi asupra datelor ce vor fi supuse operaţiilor de agregare.2. acest lucru îl puteţi realiza dacă ştergeţi criteriul „>7” impus coloanei agregat Media şi îl aplicaţi coloanei Nota având opţiunea Where.2. NumeSt. Figura prezintă interogarea care vă furnizează aceste informaţii în modul Design View.Exemplu de realizare a interogărilor Primul criteriu este deci aplicat unei coloane având opţiunea Group By. puteţi face acest lucru prin intermediul opţiunii Where. Fig. 3. Să presupunem că dorim să aflăm media cursurilor la care studenţii al căror nume începe cu „P” au luat peste nota 7. Criteriile impuse asupra coloanelor având opţiunea Group By sau Where sunt luate în considerare înainte ca datele să fie grupate. în timp ce criteriile asupra coloanelor agregat sunt impuse după ce datele au fost grupate şi s-au aplicat funcţiile agregat.

2.Exemplu de realizare a interogărilor Notă: criteriile asupra coloanelor agregat sau cu opţiunea Group By sunt specificate în SQL cu ajutorul clauzei HAVING. respectiv Column Heading în celula corespunzătoare din câmpul Crosstab al grilei QBE.Ar fi convenabil ca datele să fie afişate într-un tabel având catedrele drept capete de linii şi titlurile drept capete de coloane. numărul de profesori din fiecare categorie (preparatori.Fig. iar în câmpul Crosstab selectaţi opţiunea Value. 5. lectori. 48 . în felul următor: 1. veţi crea o interogare Crosstab (pe care o puteţi numi Total_Profesori_Crt).). În câmpul Total al grilei QBE corespunzător celor două coloane va fi selectată opţiunea Group By. cât şi liniile. Introduceţi în grila QBE cele două câmpuri de valori care vor defini grupurile (de exemplu. etc. În funcţie de datele pe care doriţi să le aflaţi. Să presupunem că dorim să aflăm. asistenţi. selectând opţiunea Row Heading. pentru fiecare catedră. Creaţi o nouă interogare de tip select şi adăugaţi tabelele necesare. Interogări de tip Crosstab Interogările de tip Crosstab se aseamănă cu cele de tipul Totals prin faptul că vă permit aplicarea operaţiilor de agregare asupra datelor. 3. Catedra şi Titlu).3. introduceţi în câmpul Field expresia IdProf: Count(*). Pentru aceasta. Rezultatele unei interogări Crosstab sunt prezentate sub forma unei tabele în care atât coloanele. au titluri. Alegeţi care dintre cele două câmpuri va da numele liniilor şi care pe cele ale coloanelor în cadrul tabelei cu rezultatele interogării. Pag. 4. în câmpul Total selectaţi Expression.6. alegând comanda Query | Crosstab Query. iar criteriile asupra coloanelor cu opţiunea Where sunt implicate în SQL în cadrul clauzei WHERE. 3. 3. Schimbaţi tipul interogării în Crosstab. introduceţi într-o nouă coloană a grilei QBE opţiunile dumneavoastră. Pentru exemplul nostru. Ceea ce le deosebeşte este modul de afişare a rezultatelor.2.

Exemplu de realizare a interogărilor de tip Crosstab 3.7. În cazul interogării prezentate în figura câmpul pivot este Titlu iar în următoarea este prezentat rezultatul. Câmpul care dă numele coloanelor din tabela cu rezultatele interogării poartă numele de pivot.3. Pag. Fig. adăugând la grila QBE un duplicat al coloanei care are opţiunea Value. Duplicatul trebuie să aibă un alias(pe care îl puteţi introduce in câmpul Field corespunzător. 49 . înaintea expresiei şi urmat de două puncte) şi să aibă opţiunea Row Heading în câmpul Crosstab. 3.6.2. Figura prezintă interogarea în modul Design View.1 Crearea totalurilor pe linii Puteţi crea o coloană care să arate totalul valorilor pe o linie. Stabiliţi eventuale criterii şi rulaţi interogarea.

dacă vom dori ca interogarea Total_Profesori_Crt să ne dea catedrele care au mai mult de 2 profesori din fiecare categorie (titlu). numită Total_Profesori. în care câmpurile Catedra şi Titlu să aibă opţiunea Group By. De exemplu. pe care o vom folosi în interogarea Crosstab. Daţi câmpului agregat numele TotalPr. dacă o coloană de tip text. acea interogare nu va putea fi folosită ca sursă de date pentru un raport.2 Limitările intergărilor Crosstab După cum aţi observat. iar pentru agregare să se folosească expresia: Count (*) (ca în fig. AS sau alte cuvinte rezervate. Puteţi înlătura acest inconvenient cu ajutorul unei interogări de tip Totals. ele ar putea să încalce regulile impuse numelor de coloane. În al doilea rând. 3. Pag. într-o interogare de tip Crosstab numele coloanelor sunt luate dintre valorile coloanei cu opţiunea Column Heading. 50 . De aceea. ).Fig. De exemplu. puteţi rezolva această problemă incluzând numele ilegale între paranteze drepte ([ON]). Exemplu de realizare a totalurilor pe linie pentru interogărilor de tip Crosstab 3. Creaţi deci o interogare de tip Totals. De regulă. nu vom putea specifica „>=2” în câmpul Criteria al coloanei de tip Value. bazată pe tabelele Profesor şi Titlu.3. conţinând. grafic sau altă interogare.8. va da numele coloanelor într-o interogare crosstab. pentru care puteţi impune şi criteriul „>=2”.2. printre altele şi unele valori precum ON. în interogările crosstab nu puteţi impune criterii asupra câmpurilor cu opţiunea Value.

aplicată unei singure valori. rezultatele interogării nu vor da nici un fel de informaţii despre profesorii pentru care titlul nu a fost specificat. 51 .4. pentru numele coloanei să apară un text dorit de noi în cazul în care valoarea este NULL. se va afişa valoarea din câmpul Titlu”. Append şi Delete. Dacă veţi dori ca în noua tabelă coloanele să aibă alte nume. Min.2.Apoi. eventual. nu ne putem lipsi de aceste informaţii. altfel. În acest mod. Apoi selectaţi în grila QBE coloanele care vor compune noua tabelă şi. [Titlu]) Expresia de mai sus se traduce astfel: „Dacă valoarea câmpului Titlu este Null. 3. Interogări de tip Make Table Interogările de tip Make Table vă ajută să creaţi tabele noi furnizate cu tabele existente sau alte interogări. First. Dacă totuşi. mai multeînregistrări.4. Avg. rezultatele interogării Total_Profesor_Crt vor conţine şi o coloană al cărui nume va fi „<>”. Cele 4 tipuri de interogări care pot efectua diferite acţiuni asupra datelor sunt: interogări de tipul Make Table. printr-o singură operaţie. expresia: IIf (IsNull([Titlu]). atunci pentru titlul coloanei din tabela de rezultate se va afişa „Nespecificat”. de tip Crosstab şi bazaţi-o pe Total_Profesori. introduceţi aceste nume în câmpul Field al Pag. Interogări pentru definirea şi modificarea datelor Interogările pentru definirea şi modificarea datelor vă dau posibilitatea de a actualiza eficient. Acest lucru îl putem realiza introducând criteriul „Is Not Null” în câmpul Criteria corespunzător coloanei Titlu. Pentru a crea o interogare de tipul Make Table. să de ca rezultat acea valoare (Sum. Update.1. Pentru aceasta. Titlu va fi Column Heading şi TotalPr va avea opţiunea Value. vom introduce în câmpul Field al grilei QBE corespunzător coloanei cu opţiunea Column Heading (care conţine valorile null şi dă numele coloanelor tabelei cu rezultate). Last). „Nespecificat”. creaţi interogarea Cross_Total_Profesori. 3. alegeţi în câmpul Total al grilei QBE corespunzător lui TotalPr o funcţie agregat care. vom face în aşa fel încât în locul semnului „<>”. în care catedra va fi Row Heading. specificaţi criterii pentru limotarea datelor. Deoarece datele din coloana TotalPr a interogării Total_Profesori_Crt au fost agregate o dată. În acest caz. Valori NULL în coloane Row Heading sau Column Heading Să presupunem că în tabela Profesor există şi înregistrări pentru care câmpul IdTitlu are valoarea NULL.2. Max. Ele vă pot fi utile dacă doriţi să faceţi o copie de siguranţă a unei tabele sau să exportaţi date către alte baze de date Access sau ODBC. Prima ar fi să nu luăm în considerare înregistrările care conţin valoarea Null în câmpul IdTitlu. deschideţi o nouă interogare şi introduceţi în panoul ferestrei QBE tabelele (sau interogările) care vor furniza datele pentru noua tabelă. Această problemă poate fi rectificată prin două metode.

în care. cu ajutorul ferestrei Qbe. Access va alege automat câmpul destinaţie. pentru ca ele să reflecte modificările din tabela de bază. creaţi o nouă interogare. trecând în modul Datasheet View. 52 . alegând comanda Query | Append Query. veţi preciza tabelele şi câmpurile acestora din care vor proveni datele. 3.000.grilei QBE. ulterior. înaintea numelor coloanelor existente şi urmate de două puncte (de exemplu. alegeţi comanda Query | Make Table Query sau apăsaţi butonul Query Type de pe bara cu instrumente şi alegeţi Make Table Query. vom crea tabela Majorare_Salariu. în cazul încare tabela va face parte dintr-o bază de date externă. grila QBE a unei interogări de tip Append conţine şi linia Append To. Dacă rezultatele sunt corecte. alegând comanda Query | Update. în momentul selectării câmpului sursă în grila QBE. Să presupunem că toate salariile mai mici de 1. în care veţi introduce regula pe baza căreia se va face actualizarea Pag. Update To. veţi dori să actualizaţi datele din tabela creată astfel. în care va trebui să specificaţi numele tabelei pe care vreţi să o creaţi şi.000 lei se majorează cu 15%. puteţi alege câmpul destinaţie (cu condiţia ca cele 2 câmpuri să aibă acelaşi tip de date). Notă: în cazul încare câmpurile sursă şi destinaţie au acelaşi nume. nu va trebui decât să rulaţi din nou interogarea respectivă. rulaţi interogarea şi noua tabelă va fi creată. Acum. introduceţi tabela Titlu în panoul ferestrei QBE şi schimbaţi tipul interogării în Update. În grila ferestrei QBE va apărea o nouă linie. pentru fiecare câmp-sursă selectat în grilă. întoarceţi-vă în modul Design View şi efectuaţi modificările necesare. introduceţi între ghilimele şi urmat de punct şi virgulă numele aplicaţiei în care a fost creată (de exemplu: c:\my documents\dbl „Paradox.2. dacă nu.. Va apărea cutia de dialog Make Table. tot ce vă rămâne de făcut este să rulaţi interogarea şi să deschideţi tabela ProfMate în modul Datasheet View pentru a vedea noile înregistrări. După cum puteţi observa în fig.”). 3. Puteţi vedea noua tabelă înainte ca ea să fie creată. precum şi câmpurile tabelei destinaţie. Dacă. Dacă baza de date externă nu este Access. numele acesteia cu calea completă.5. Interogări de tip Append Pentru aceasta. Pentru a actualiza în consecinţă datele din tabela Titlu. Nume Profesor: Nume).2. Apoi. de tip Update. Pe urmă. Pentru aceasta.6 Interogări de tip Update Interogările de tip Update vă sunt utile atunci când doriţi să modificaţi mai multe înregistrări o dată. Va apărea cutia de dialog Append. în care va trebui să specificaţi numele tabelei în care vor fi introduse dateleşi baza de date în care se află această tabelă (interogarea nu va putea fi executată dacă tabela nu există deja). vom crea o nouă interogare de tip Append (numită AppendProf).

dacă într-o interogare introduceţi următoara expresie în câmpul Criteria corespunzător unei coloane de tip Date/Time (tip folosit pentru stocarea datelor şi orelor).8 Interogări cu parametri Puteţi crea interogări care să permită utilizatorului specificarea unui criteriu în timpul rulării interogării. [Salariu] + [Salariu]*. puteţi şterge dintr-o tabelă mai multe înregistrări o dată. Expresiiloe pot fi folosite în interogări. Ele sunt formate dintr-o combinaţie de operatori. în câmpul Criteria al grilei QBE vom limita înregistrările ce vor fi actualizate la cele pentru care salariul este 1. Pag. • interogarea este bazată pe 2 tabele între care există o relaţie de tipul 1:m (integritatea referenţială ar putea fi violată). Notă: înainte de a executa o interogare de tip Delete. 3. Înaceste situaţii.000. în funcţii macro şi module.15). variabile şi funcţii care au ca rezultat o numită valoare. puteţi rula interogarea Delete fără grijă. ca în figura ) • folosiţi comanda Query / Parameters pentru a specifica tipul datelor ce vor fi introduse de utilizator în timpul rulării interogării (figura) 3. ca reguli de validare sau ca bază pentru coloanele calculate. proprietăţi ale câmpurilor tabelelor sau ale controalelor din formulare şi rapoarte. Pentru a crea o astfel de. Dacă ele sunt corecte. Interogările de tip Update au anumite limitări care fac să nu poată fi executate uneori. rapoarte. 53 . Expresii şi funcţii în interogări Expresiile sunt instrumente folosite de programatori pentru a spori performanţele aplicaţiilor. • interogarea încearcă să scrie un text într-un câmp de tip Number. Ele pot fi folosite pentru a stabili criterii. 3.2. formulare.(în acest caz. interogare va trebui să : • introduceţi în câmpul Criteria corespunzător coloanei asupra căreia vor fi impuse limitările un text prin care să cereţi utilizatorului specificarea criteriului (textul va fi inclus între paranteze drepte. • interogarea încalcă regulile de validare impuse asupra datelor unui câmp la nivel de tabelă. ea va returna numai înregistrările mai vechi de 3 zile: <Now () + 3. Iată care sunt cele mai frecvente situaţii în care o interogare de tip Update nu va putea fi executată: • interogarea este bazată pe altă înterogare de tip Crosstab.2. este bine să creaţi pe aceleaşi criterii o interogare de tip Select care să regăsească datele pe care doriţi să le ştergeţi.000.7 Interogări de tip Delete Folosind o interogare de tip Delete. constante. Union sau care conţine totaluri. De exemplu. Access va da un mesaj de eroare.3.

funcţia Now returnează data curentă). • & concatenează 2 şiruri de caractere • + adună valorile a 2 câmpuri numerice. 54 . Poate fi folosit şi pentru a concatena şiruri de caractere. Există mai multe tipuri de operatori pe care vi le prezentăm în cele ce urmează. Operatori de comparaţie Sunt folosiţi pentru a compara valorile a 2 sau mai multe câmpuri şi/sau expresii. Operatori aritmetici Sunt folosiţi pentru a efectua calcule matematice cu 2 sau mai multe valori numerice.3. în componenţa cărora pot intra: • operatori: simboluri matematice.1. • funcţii: proceduri ce returnează o valoare (de exemplu. • ^ ridică un număr la o putere (de exemplu 2^3=23) • * înmulţeşte 2 numere • / împarte 2 numere şi returnează un număr real • \ împarte 2 numere şi returnează un număr întreg • MOD returnează restul împărţirii a 2 numere • + adună 2 numere • scade 2 numere Operatori de concatenare Sunt folosiţi pentru a lega 2 şiruri de caractere. • = verifică egalitatea a 2 valori • <> verifică dacă 2 valori sunt diferite • < verifică dacă o valoare este strict mai mică decât alta Pag. Părţile componente ale expresiilor Expresiile pot fi privite ca nişte propoziţii matematice. • nume de câmpuri: de obicei sunt introduse între paranteze drepte Operatori Operatorii joacă un rol important în cadrul expresiilor. • constante: valori numerice sau şiruri de caractere ce nu îşi schimbă valoarea.3.

de obicei în module. • Not introduce o negaţie (de exemplu. Not T* introdus într-o interogare în câmpul Criteria al coloanei Nume va regăsi toţi studenţii ale căror nume nu încep cu litera T) • And efectuează conjuncţia a 2 valori • Or efectuează disjuncţia a 2 valori • Xor efectuează disjuncţia exclusivă a 2 valori • Eqv verifică echivalenţa a 2 valori • Imp operatorul „implică” Precedenţa operatorilor De multe ori. care este şi ordinea în care au fost prezentaţi operatorii mai sus. 55 . Programatorul nu poate defini o constantă care să aibă acelaşi nume ca o constantă intrinsecă.• • • > <= >= verifică dacă o valoare este strict mai mare decât alta verifică dacă o valoare este mai mică sau egală cu alta verifică dacă o valoare este mai mare sau egală cu alta Operatori logici Efectuează operaţii logice. pe care vi le prezentăm în continuare. ele pot fi folosite oriunde. Constantele intrinseci se pot folosi numai în module. Aceste operaţii se efectuează într-o anumită ordine predefinită.14 După ce au fost declarate. De exemplu: CONST Pi = 3. Constante predefinite Acestea sunt definite de programator. Pag. în sensul că valoarea lor nu se schimbă pe parcursul rulării aplicaţiei. Declaraţia unei constante predefinite începe cu cuvântul cheie CONST. Ele se împart în 3 grupe. Constante intrinsece Sunt constante furnizate de Visual Basic (cum ar fi VbString sau VarType) şi nu trebuie să fie declarate separat. Constante Constantele sunt un fel de cuvinte rezervate. Dacă doriţi o schimbare în această ordine (de exemplu să efectuaţi întâi o operaţie de adunare şi apoi o ridicare la putere) folosiţi parantezele pentru a preciza care operator va fi aplicat primul. a calcula valoarea unei expresii implică efectuarea mai multor operaţii.

Pag. în modul Datasheet View al unei tabele sau interogări etc. pe care o puteţi vedea şi în câmpul proprietăţii Format a unei coloane de tip Date/Time a unei tabele (în modul Table Design). De exemplu. Diferenţa este aceea că funcţia Sum poate fi aplicată mai multor valori o dată. dar nu sunt reprezentate prin simboluri. tabelul vă prezintă o listă cu aceste formate. iar funcţia Now () returneazădata (şi ora) curentă.. În tabel sunt descrise diferite formate pe care le puteţi folosi în acest scop. prezentată în figura. mai puţin în module. Access vă pune la dispoziţie aproximativ 22 de funcţii pentru lucrul cu date şi ore. Funcţia Year () returnează numai anul dintr-o dată completă. expresiile pot conţine date sau ore. January. Acestea sunt stocate ca numere reale pe 64 de biţi. De exemplu. Lucrul cu date şi ore În Access. Ele acţionează ca şi operatorii.4. Format General Short date Medium date Long date Short time Medium time Long time Afişare (exemplu) 01/01/98 12:00:00 AM 01/01/98 1-Jan-98 Thursday. 56 . dintre care câteva le puteţi vedea în câmpul Totals al grilei QBE a unei interogări de tip Totals. No.Constante sistem Yes. rapoarte. Off şi Null sunt cele 5 componente sistem. în interogarea Vechime. între 0:00:00 şi 23:59:59. După ce o dată/oră a fost introdusă într-o expresie. Access parcurge expresia şi recunoaşte formatul respectiv. iar cel pentru ore. Access vă pune la dispoziţiepeste 160 de funcţii. am folosit funcţiile Yes şi Now pentru a calcula câţi ani au trecut de la angajarea unui profesor şi până în prezent. Intervalul maxim pentru date este 1 Ian 100 şi 31 Dec 9999. 1. Funcţii Funcţiile pot intra în componenţa expresiilor. operatorul + şi funcţia Sum efectuează aceeaşi operaţie: cea de adunare. On. 3. Există câteva formate predefinite pentru afişarea datelor/orelor în formulare. 1998 00:00:00 12:00 AM 12:00:00 AM Prin intermediul expresiilor puteţi să personalizaţi modul cum vor fi afişate datele/orele. incluzând data (ora) între 2 caractere diez (#). Ele pot fi folosite în orice obiect din baza de date.

puteţi crea expresii care să returneze valori de genul: Luna angajării este Feb Pentru aceasta. între 1 şi 59 Secunda. ca separator pentru oră. Monday pentru luni.Format d dd ddd dddd w ww m mm mmm Mmmm q y yy yyyy h hh n nn s ss AM/PM am/pm A/P Afişare (exemplu) Ziua din lună. între 0100 şi 9999 Ora. iar două puncte (:). între 01 şi 31 Ziua săptămânii (primele 3 litere din ziua săptămânii. între 01 şi 12 Primele 3 litere din luna anului în engleză (de exemplu. Monday pentru luni. între 01 şi 23 Minutul. Tuesday pentru marţi etc) Ziua săptămânii. de exemplu. etc) Luna anului în limba engleză (întreg cuvântul. de exemplu. între 1 şi 12 Luna anului. Folosind aceste formate. Tuesday pentru marţi etc) Ziua săptămânii din limba engleză (întreg cuvântul. PM pentru ore între miezul zilei şi miezul nopţii am pentru ore între miezul nopţii şi miezul zilei. între 00 şi 99 Anul. unde: Pag. Jan pentru ianuarie. Feb pentru februarie. între 1 şi 7 Săptămâna din an. între 01 şi 59 AM pentru ore între miezul nopţii şi miezul zilei. de obicei. între 1 şi 4 Ziua din an. între 1 şi 52 Luna anului. “mmm”) . 57 . între 1 şi 365 Anul. ca separator pentru dată. de exemplu. introduceţi în câmpul Field al grilei QBE expresia: Luna: “Luna angajării este “ & Format ([Data Angajării]. între 01 şi 59 Secunda. între 1 şi 23 Ora. între 1 şi 31 Ziua din lună. Jan pentru ianuarie. P pentru ore între miezul zilei şi miezul nopţii Semnul slash (/) este folosit. etc) Trimestrul anului. Feb pentru februarie. pm pentru ore între miezul zilei şi miezul nopţii A pentru ore între miezul nopţii şi miezul zilei. între 1 şi 59 Minutul.

. care va avea valoarea “promovat” sau “Nepromovat”. Funcţia IIF în expresii Sintaxa funcţiei IIF este următoarea: IIF (<Expresie>. valoare2) Unde: • este o expresie a cărei valoare de adevăr este evaluată pentru fiecare înregistrare în parte.5. deoarece funcţiile Now () şi Date () se bazează pe acestea.6. în tabela de rezultate. valoare1. • “Luna angajării este “ este textul care va apărea înaintea lunii angajării. Notă: dacă observaţi că informaţiile returnate sunt eronate. “nepromovat” 3. la secţiunea Date/Time). să presupunem câmpul pentru fiecare student dorim să aflăm dacă a promovat sau nu oate cursuriile opţionale la care s-a înscris (adică. 3. 58 . • valoare1 este valoarea returnată dacă <expresie> este adevărată. Astfel. • Format ([Data Angajării]. “mmm”) converteşte valoarea stocată în câmpul Data Angajării la formatul mmm. verificaţi data şi ora sistemului (în Control Panel. • valoare2 este valoarea returnată dacă <expresie> este falsă. numită Situaţia. care returnează doar data curentă. “promovat”. dacă nota minimă obţinută este sau nu mai mare sau egală cu 5). Expresia care dă valorile acestei coloanea este următoarea: Situaţia: IIf (Min ( [ Nota ] )>= 5. valorile expresiei. Strategii de parcurgere a tabelelor de bază Access Jet Engine poate alege una dintre următoarele 3 strategii pentru parcurgerea datelor din tabelele de bază: Pag. Funcţia Now () returnează data şi ora curentă în funcţie de ceasul sistemului. O funcţie asemănătoare este Date ().• Luna: este numele coloanei care va conţine. În tabela cu rezultatele interogării vom avea o coloană.

Această metodă este eficientă atunci când tabelele de bază sunt mari. • Expresii în coloanele rezultat: motorul Jet Engine nu poate optimiza interogările care conţin expresii de tip IIF pentru coloanele rezultat. Pentru fiecare restricţie este creată câte o mulţime de rezultate. Prin folosirea mai multor indecşi. Greşeli frecvente În continuare. Jet Engine nu trebuie decât să citească paginile cu indecşi. Pag. de obicei. motorul Jet reduce considerabil numărul de înregistrări ce trebuie citite. În funcţie de tipul restricţiei. • Parcurgerea pe indecşi: Această metodă este aleasă atunci cînd există restricţii asupra unei coloane indexate dintr-o tabelã de bază. deşi se vor citi aceleaşi înregistrări de mai multe ori. Pentru fiecare restricţie este creată câte o mulţime de rezultate. care apoi sunt reunite pentru a găsi înregistrările ce verifică ce verifică cel puţin una dintre cele 2 restricţii. • numărarea indecşilor: pentru interogări ce returnează numărul înregistrprilor ce verifică o anumită mulţime de restricţii: • SELECT Count (*) FROM Tabela • WHERE col1 = <exp> AND col2 = <exp> • Pentru astfel de interogări. care apoi sunt intersectate pentru a găsi înregistrările ce verifică ambele restricţii. Această metodă este aleasă pentru tabele mici şi neindexate.Parcurgerea secvenţială: este. deoarece sunt citite toate înregistrările din tabela de bază.7. vă prezentăm câteva dintre greşelile cel mai des întâlnite la crearea interogărilor şi care pot duce la mărirea semnificativă a timpului de execuţie. astfel încât. şi. cea mai puţin rapidă metodă. timpul total este mai mic decât cel necesar pentru a citi întraga tabelă. pentru fiecare înregistrare sunt verificate restricţiile. După ce subnt selectate doar înregistările pentru care sunt verificate aceste restricţii. Jet engine va efectua una dintre următoarele 3 operaţii: • intersecţia indecşilor: pentru restricţii de forma: unde col1 şi col2 sunt coloane indexate. • reuniunea indecşilor: pentru restricţii de forma: • col1 = <exp> OR col2 = <exp> • unde col1 şi col2 sunt coloane indexate. aceste înregistrări vor fi supuse şi restului de restricţii (dacă există). • Tehnica restricţionării Rushmore: este aplicată atunci când există restricţii asupra mai multor coloane indexate. • 3. 59 .

indecşii pot îngreuna sensibil operaţiile de actualizare a datelor. vor creşte şi performanţele interogărilor. Astfel. În consecinţă. vor fi reînoite statisticile asupra tabelelor. Altfel.Folosiţi expresiile la nivelul controalelor din rapoartele sau formularele care vor folosi rezultatele interogării. iar spaţiul liber va putea fi folosit. vor fi reordonate înregistrările din tabele. vor rămâne spaţii nefolosite care măresc dimensiunile fişierului şi scad performanţele acţiunilor. impuneţi clauza Group By asupra cât mai puţinor coloane. • Prea multe coloane cu clauza GROUP BY: când creaţi o interogare de tip Totals. Pe măsură ce ştergeţi obiecte sau înregistrări din baza de date. Astfel. • Indexarea coloanei de asociere pentru o singură tabelă: când folosiţi o asociere între 2 tabele.8. Importanţa compactării Compactarea unei baze de date este o operaţie asemănătoare defragmentării discurilor fizice. 60 . despre care am mai spus că sunt cel mai important instrument pus la dispoziţia programatorilor şi fără de care bazele de date nu şi-ar mai afla utilitatea. 3. • Folosirea insuficientă a indecşilor: dacă nu se efectuează modificări frecvente asupra datelor. timpul de execuţie va fi mai redus. Pag. este bine să folosiţi indecşi pentru coloanele de asociere sau pentru coloanele asupra cărora se impun restricţii. Singurul mod în care pot fi eliminate aceste spaţii este comanda Database Utilities | Compact Database. indexaţi c-mpurile de asociere din ambele tabele.

a ecranelor de tip splash etc.1. specificată în proprietatea Record Source a formularului respectiv. Figura 4. faceţi clic pe butonul selector care se află în colţul din stânga-sus al formularului şi apoi selectaţi comanda View  Properties sau apăsaţi butonul Properties pe bara cu instrumente. la care se adaugă cele ale controalelor. o interogare sau o instrucţiune SQL. Principalul rol al formularelor este introducerea datelor. se va deschide o listă cu toate tabelele şi interogările din baza de date curentă. dintre Pag. prin care programatorul poate controla acţiunile utilizatorului. între 38 şi 58 pentru fiecare.1 Sursele de înregistrări ale formularelor Sursa de înregistrări a unui formular poate fi o tabelă. 4. faceţi clic pe el pentru a-l aduce în prim plan şi apoi alegeţi comanda View  Properties sau apăsaţi butonul Properties de pe bara cu instrumente. Un formular are peste 70 de proprietăţi.1 observaţi că în dreapta câmpului proprietăţii Record Source se află două mici butoane. 61 . Sursele de înregistrări ale formularelor indică de unde provin sau unde vor fi stocate datele şi sunt specificate printre proprietăţile formularelor. În figura 4. Crearea şi lucrul cu formularele Formularele oferă unei baze de date o interfaţă prietenoasă şi elegantă.CAP: 4. Dacă faceţi clic pe primul (cel reprezentat de o săgeată). dar ele pot folosi şi la regăsirea datelor sau afişarea meniurilor. Notă: Pentru a vedea pagina de proprietăţi a unui control al formularului. Pentru a vedea pagina de proprietăţi a unui formular deschis în modul Design View.

Dintre acestea. Formularele create automat cu ajutorul vrăjitorului AutoForm wizard. Aceasta se aseamănă cu fereastra QBE atât ca aspect. există două tipuri de interogări: pentru regăsirea datelor şi pentru definirea şi modificarea datelor. făcând-o să ocupe mai mult spaţiu. 4. pentru crearea automată a formularelor şi Form Wizard.2. ce îi dă programatourlui mai multă libertate de decizie. puteţi crea formulare şi singuri. introduceţi instrucţiunea SQL corespunzătoare direct în câmpul proprietăţii Record Source a formularului. dar aceste interogări sporesc numărul de obiecte din baza de date.2. 62 . Pentru a modifica sursa de date a unui formular apăsaţi cel de al doilea buton din dreptul proprietăţii Record Source (cel reprezentat prin trei puncte…) care va deschide fereastra SQL Ouery Builder (figura 4. Dacă formularul se bazează pe o interogare.care veţi selecta sursa de înregistrări. modificările aduse acesteia în fereastra SQL Builder se vor reflecta şi în interogarea propriu-zisă. în modul Design View. După cum am arătat în capitolele precedente. pornind de la zero. cât şi ca funcţionare. Crearea unui formular simplu Access vă pune la dispoziţie două componente pentru crearea formularelor simple: AutoForm Wizard. Formularele bazate pe interogări salvate sunt mai rapide. Dacă vă întrebaţi ce să alegeţi ca sursă de date pentru un formular dintre o interogare salvată şi o instrucţiune SQL. Figura IV. dacă este simplă. Pe lângă acestea. numai interogările pentru regăsirea datelor (de tip SELECT) pot servi drept sursă de înregistrări pentru un formular. salvaţi-o şi apoi alegeţi-o în câmpul proprietăţii Record Source. conţin câte un control (câmp) pentru fiecare coloană a tabelei sau a interogării pe care Pag. răspunsul este următorul: dacă interogarea este complexă.2).

63 . adică fundalul implicit şi fontul şi culoarea implicită a etichetelor folosite de AutoForm Wizard la crearea automată a formularelor. În partea dreaptă a fiecărui câmp există o denumire (etichetă) care este dată de valoarea prorietăţii Label a coloanei respective. Pag. câmpurile acestora care vor apărea pe formular.3. List Box sau Check Box. Notă: Dacă folosiţi mai multe tabele şi interogări ca sursă de înregistrări pentru un formular. creat automat şi care se bazează pe interogarea DetaliiProf din figura 4. se va deschide fereastra de dialog (figura 4. între acestea trebuie să fie stabilite relaţii. Chart Wizard şi Pivot Table Wizard) îi dau programatorului posibilitatea de a specifica tabelel sau interogările pe care se va baza formularul. efectuaţi modificările dorite şi alegeţi comanda AutoFormat. Spre deosebire de vrăjitorii pentru crearea automată a formularelor (AutoForm Columnar Wizard. Combo Box. Apăsând butonul „Create form by using wizard” din pagina Forms a ferestrei Database Container.3.4). ordinea de sortare a datelor. în care veţi alege vrăjitorul care vreţi să vă ajute la crearea unui nou formular. fundalul etc. care diferă prin modul în care sunt prezentate datele în formular).sunt bazate. AutoForm Tabular Wizard şi AutoForm Datasheet Wizard. prezintă formularul DetaliiProfesor. Figura IV. Controlul corespunzător unei coloane este cel specificat în proprietatea Display Control a coloanei respective şi poate fi Text Box. Puteţi alge tiparul. vrăjitorii de tip Form Wizard (Form Wizard. deschideţi formularul în modul Design View. în funcţi de tipul de date.2. Figura 4. Pentru aceasta.

Dacă doriţi să creaţiun formular pornind de la zero. Astfel. 64 . folosind cutia de instrumente (Toolbox).Figura 4. 4.3. ca în modul Datasheet View (Datasheet) sau aliniate atât la stânga cât şi la dreapta formularului (Justified)). modul cum vor fi prezentate datele (pe o singură coloană (Columnar). numele formularului.4. Secţiunile unui formular Un formular Access poate avea între una şi cinci secţiuni. se va deschide un formular fără nici un control. sub formă de tabel (Tabular). în cutia de dialog New Form alegeţi opţiunea „Create Form in Design View”. urmând ca dumneavoastră să adăugaţi controalele dorite. Iată care sunt acestea (prezentate şi în figura 4. fără nici un ajutor. După ce aţi ales opţiunea Form Wizard. în final.5): Pag. fundalul şi. acest vrăjitor vă va prezenta succesiv patru cutii de dialog. în care veţi putea alege câmpurile dorite din una sau mai multe tabele sau interogări din baza de date (între care trebuie să existe relaţii).

5 • • • • • Detail – Această secţiune conţine datele din fiecare înregistrare a sursei de date. Aici puteţi include informaţii despre data şi ora la care a fost creat formularul sau totalurile coloanelor unui formular tabelar.Figura IV. Secţiunile Page Header şi Page Footer vor rămâne nemodificate când se trece de la o pagină la alta a formularului. precum şi o casetă combinată folosită pentru filtrarea înregistrărilor. Form Header – Această secţiune apare întotdeauna în partea de sus a formularului. Page Footer – Această secţiune apare între Detail şi Form Footer şi se aseamănă cu secţiunea Page Header.Această secţiune apare în partea de jos a unui formular. cum ar fi un antet sau un control ce nu are legătură cu înregistrarea curentă. pentru a fi afişate pe rând. 65 . Pag. Pentru a trece de la o înregistrare la alta veţi folosi butoanele de navigare ale formularului. Formularele care conţin un număr mare de controale pot fi împărţite cu ajutorul unui control de tip Page Break în două sau mai multe pagini. Aici puteţi include informaţii care nu se schimbă în funcţie de fiecare înregistrare. Page Header – Această secţiune apare între Form Header şi Detail. Form Footer .

Pentru a trece la înregistrarea următoare. prin intermediul cărora utilizatorul putea deschide diferite alte formulare. utilizatorul va putea introduce noi înregistrări prin intermediul formularului. dacă are valoarea No. cu condiţia ca integritatea referenţială să nu fie violată. Datasheet View (pentru a avea acces numei la datele pe care se bazează formularul) sau Form View (pentru a vedea formularul în forma sa finală). din alt formular (cu ajutorul unui buton). fără date. Într-un formular puteţi naviga atât între controale. cât şi între înregistrări. Pentru a stabili ordinea în care se face această trecere. De aceea. Principalul rol al formularelor este acela de a împiedeca utilizatorul să interacţioneze direct cu tabelele sau cu tabelele de rezultate ale interogărilor din baza de date. veţi putea face trecerea la oricare dintre cele trei moduri în care poate fi văzut formularul: Design View (pentru a lucra cu controalele formularului). Tot în pagina de proprietăţi a unui formular veţi găsi şase proprietăţi ce vă permit să controlaţi acţiunile utilizatorului asupra datelor pe care se bazează formularul: • Allows Edits: Dacă are valoarea Yes. formularul deschide automat o înegistrare nouă. dacă în pagina de proprietăţi a acestuia proprietatea Navigation Buttons are valoarea Yes. Cu ajutorul tastei Tab puteţi trece de la un control la altul. iar Data Entry are valoarea Yes. cel mai elegant mod de a deschide un formular este prin intermediul unui buton din alt formular. • Allow Additions: Dacă are valoarea Yes. Indiferent de cum a fost deschis un formular. Lucrul cu formularele Un formular o dată creat poate fi deschis în mai multe feluri: din pagina Forms a ferestrei Database Container. utilizatorul va putea şterge înregistrări. pentru a reduce cât mai mult contactul utilizatorului cu fereastra Database Container şi cu obiectele sale. Astfel. va rezulta o eroare. • Data Entry: dacă are valoarea Yes. dintr-un macro sau cu ajutorul limbajului VBA. Mult mai simplu este însă să folosiţi butoanele pentru navigarea printre înregistrări. Dacă proprietatea Alow Additions are valoare No.4. Un alt mod de a trece de la o înregistrare la lata este prin folosirea tastelor Page Up şi Page Down.4. alegând una dintre aceste comenzi din meniul View. Utilizatorul nu are acces la înregistrările existente. • Allow Deletions: Dacă are valoarea Yes. Aceste butoane apar în colţul din stânga jos al unui formular. Pag. treceţi la ultimul control de pe formular şi apoi apăsaţi tasta Enter. utilizatorul va putea modifica înregistrările. 66 . alegeţi comanda View  Tab Order. un exemplu clasic de formular folosit pentru a lansa alte formulare este acela al unui meniu ce conţine mai multe butoane. aceasta nu va putea schimba în nici un fel datela afişate în formular.

Opţiunea All Records blochează toate înregistrările din formular şi din tabelele de bază atâta timp cât un utilizator editează orice înregistrare din tabelă. caseta de control va apărea în partea din stânga a barei de titlu. • RecordSelectors: Dacă valoarea sa este Yes. valoarea proprietăţii WhatsThisButton trebuie să fie No.Recordset Type: Poate fi Dynaset. Continuos Form sau Datasheet. • ControlBox: Dacă valoarea este Yes. fie când se închide formularul. 67 . Opţiunea Edited Records împiedică ceilalţi utilizatori de a opera schimbări asupra unei înregistrări care este deja în curs de modificare. acestea vor fi salvate fie când se trece la înregistrarea următoare. • ScrollBars: Stabileşte dacă formularul are bare de derulare verticale şi/sau orizontale. la deschidere formularul va apărea centrat pe ecran. • Default View: Stabileşte dacă formularul va fi afişat în modul Single Form (cel mai des folosit). • Pag. în modul Continuos va apărea o linie de separare între înregistrări. În acest caz. • NavigationButtons: Dacă valoarea este Yes. butonul (X) pentru închiderea formularului va fi inclus în partea dreaptă a barei de titlu. • RecordDividers: Dacă valoarea este Yes. O dată ce au fost făcute modificări asupra unei înregistrări dintr-un formular. Dacă valoarea este Dynaset. ceea ce nu este valabil în cazul valorii Snapshot. • Record Locks: Se referă la aplicaţii multiuser. • MaxMinButtons: Precizează dacă butoanele Minimize şi Maximize vor fi incluse în bara de titlu. • Views Allowed: Stabileşte dacă utilizatorul poate trece din modul Form View în modul Datsheet View. • AutoCenter: Dacă valoarea este Yes. Dynaset (Inconsistent Updates) sau Snapshot. Dacă are valoarea No Locks. Printre ele se numără: • Caption: Păstrează textul ce va fi afişat în bara de titlu a formularului. fiind luate în considerare numai modificările care au fost salvate primele. Proprietăţile din pagina Format a ferestrei de proprietăţi a formularului controlează aspectul acestuia. mai mulţi utilizatori vor putea modifica aceleaşi înregistrări în acelaşi timp. • AutoResize: Dacă valoarea este Yes. Se referă la formularele ce au mai multe tabele ca sursă de date. fereatra formularului va fi dimensionată corespunzător la fiecare deschidere a acestuia. • CloseButton: Dacă valoarea este Yes. datele din controalele asociate câmpurilor vor putea fi editate de către utilizator. formularul va fi dotat cu butoane pentru parcurgerea înregistrărilor. pe latura din stânga a secţiunii Detail va apărea un selector pentru înregistrări.

• 4. Figura V. dacă butonul Control Wizard din cutia de scule este apăsat (ca în figura 4. după care faceţi clic pe formular. Pentru a plasa un control din Toolbox pe un formular. Despre controale Fiecare element de pe un formular este un control de un anumit tip. Pag. O altă metodă ar fi să ţineţi tasta Shift apăsată în timp ce faceţi clic pe controalele respective. alte ferestre deschise nu pot primi controlul până când formularul nu este închis. care va fi activat atunci când controlul este plasat pe formular. Majoritatea butoanelor din Toolbox reprezintă un tip de control ce poate fi plasat pe un formular. pe care o puteţi vedea alegând comanda View  Toolbox sau apăsând butonul Toolbox de pe bara de instrumente. butonul (?) va apărea în partea din dreapta a barei de titlu în cazul în care şi CloseButton are valoarea Yes.6).5. controlul poate fi redimensionat în funcţie de necesităţi. 68 .WhatsThisButton: Dacă valoarea este Yes. Puteţi selecta un control sau un grup de controale cu ajutorul săgeţii din cutia cu scule. formularul va fi afişat deasupra altor ferestre.6 prezintă cutia de instrumente Toolbox şi descrie componentele sale. faceţi clic pe butonul corespunzător tipului de control dorit. Access vă pune la dispoziţie vrăjitorul control Wizard. Pentru a stabili proprietăţile şi comportamentul unui control. ar fi mai interesant să menţionăm două dintre cele mai importante proprietăţi din pagina Other a ferestrei Properties: • Pop Up: Dacă valoarea sa este Yes. O dată adăugat. • Modal: Dacă valoarea sa este Yes. Puteţi adăuga controale la un formular deschis în modul Design View folosind cutia de instrumente Toolbox. Alegeţi săgeata şi apoi trasaţi un dreptunghi în jurul controalelor pe care doriţi să le selectaţi. Pe lângă acestea. putând fi mutat şi în afara ferestrei Access.

5. Pag. • Un bitmap ce face formularul mai atractiv etc. Controale ataşate Controalele ataşate sunt folosite pentru a afişa sau edita informaţii din baza de date şi lor le corespunde câte un câmp dintr-o tabelă sau un câmp returnat de o interogare sau instrucţiune SQL. etichetelor şi cadrelor pentru imagini. 69 . dreptunghiurilor. neataşate şi calculate. Orice control poate fi ataşat. Faceţi drag & drop cu selecţia pe formular. • Un buton prin care se deschide un alt formular. sfârşitului de pagină. Input Mask. Selectaţi un câmp sau un grup de câmpuri din această listă. Alegeţi comanda View  Field List pentru a afişa câmpurile sursei de date pe care se bazează formularul. Description.Figura IV. Pentru a plasa un control ataşat pe un formular procedaţi astfel: 1. 2.6 4. Format). cu excepţia dreptelor. 3. Puteţi transforma un control neataşat într-unul ataşat folosind proprietatea Control Source a controlului respectiv. Astfel. Controale neataşate Un control este folosit pentru a furniza sau primi de la utilizator informaţii ce nu sunt sau nu vor fi stocate în baza de date. Un control ataşat va moşteni multe dintre proprietăţile câmpului corespunzător (cum ar fi Caption. Iată câteva exemple de astfel de controale: • O etichetă ce descrie alt control. Tipuri de controale Există trei tipuri de controale ce pot fi plasate pe un formular: ataşate. în care să specificaţi câmpul corespunzător.1. pentru fiecare câmp selectat va apărea pe formular un control şi o etichetă ce va afişa textul din proprietatea Caption a câmpului corespunzător. dar aceste proprietăţi pot fi modificate prin intermediul paginii de proprietăţi a controlului.

cât şi IdTitlu. List Box Wizard sau Option Group Wizard). Dacă butonul Control Wizard din cutia de instrumente este apăsat. De exemplu. prin plasarea pe formular a unui control de tipul celor enumerate anterior.2. Casete combinate. Deşi casetele text sunt cel mai frecvent întâlnite controale de acest tip. În prima cutie de dialog a vrăjitorului Combo Box Wizard alegeţi prima opţiune. în speţă. Pentru a ilustra lucrul cu ei. prin care specificaţi că valorile controlului vor proveni dintr-o tabelă sau interogare. Ultima cutie de dialog vă lasă să introduceţi textul etichetei plasat în dreptul casetei combinate. Alegeţi a doua opţiune şi specificaţi că valorile vor fi stocate în coloana IdTitlu. Orice expresie trebuie să înceapă cu semnul egal (=). 70 .5. În a doua cutie de dialog va trebui să alegeţi tabela sau interogarea respectivă. Vrăjitorii pentru casete combinate şi casete listă sunt foarte asemănători cu vrăjitorul Lookup Wizard. deoarece nu doriţi ca în listă să apară şi valorile coloanei IdTitlu. tabela Titlu. eventual. casete listă şi grupuri de opţiuni În continuare. Scrieţi “Titlu” şi apăsaţi butonul Finish pentru a închide vrăjitorul şi a crea controlul.12 Această expresie poate fi introdusă direct în control dacă acesta este o casetă text sau în câmpul proprietăţii Control Source a controlului. Treceţi apoi în modul Form View şi testaţi formularul (figura 4.7). Să presupunem că în locul casetei text Titlu vom introduce o casetă combinată din care utilizatorul să poată alege una dintre valorile din coloana Titlu a tabelei cu acelaşi nume. casetă listă şi grup de opţiuni. În cea de-a treia cutie de dialog veţi alege câmpurile din tabela Titlu ce vor da valorile din caseta combinată. Cea de-a cincea cutie de dialog vă întreabă dacă valorile selectate în caseta combinată vor fi memorate pentru a fi folosite ulterior sau vor fi stocate în baza de date. vă vom arăta cum puteţi să profitaţi de ajutorul oferit de vrăjitorul Control Wizard pentru lucrul cu controalele de tip casetă combinată. ne vom întoarce la formularul DetaliiProf care trebuie să fie deschis în modul Design View. expresia folosită va fi: =[Salariu]*0. Ştergeţi aşadar controlul Titlu de pe formular (faceţi clic pe el pentru a-l selecta şi apoi apăsaţi tasta Del) şi adăugaţi un control de tip Combo Box. În cea de-a patra cutie de dialog veţi ajusta. se va activa vrăjitorul corespunzător (Combo Box Wizard. 4. aici vom selecta atât coloana Titlu.Controale calculate Controalele calculate folosesc expresii pentru a-şi obţine datele. lăţimea listei şi veţi lăsa validată caseta Key Column. care vă ajută să creaţi într-o tabelă o coloană ale cărei valori proveaneau din altă tabelă sau dintr-o listă specificată de dumneavoastră. dacă în formularul DetaliiProfesor dorim să avem un câmp ce calculează impozitul din salariul afişat în controlul Salariu. Pag. Deoarece în listă dorim să fie afişate titlurile din coloana Titli. orice alt fel de control ce are proprietatea Control Source poate fi calculat. dar în tabela Profesor se vor stoca doar identificatorii din coloana IdTitlu.

7 Să privim pagina de proprietăţi a casetei combinate Titlu pentru a înţelege ce a făcut Combo Box Wizard (figura 4. deoarece valorile din lista casetei combinate provin dintr-o tabelă. Atunci când veţi dori să introduceţi în tabela Profesor date despre un nou profesor prin intermediul acestui formular. [Titlu].8).[IdTiltu].8 Pag. interogare sau instrucţiune SQL. Proprietatea Control Source specifică exact coloana din care provin datele din caseta combinată: IdTitlu. în funcţie de alegerea dumneavoastră din caseta combinată. Figura IV. în coloana IdTitlu a tabelei Profesor va fi stocată valoarea lui IdTitlu din tabela Titlu.Figura IV.[Titlu] FROM [Titlu]. Proprietatea Row Source specifică această instrucţiune: SELECT DINCTINCROW [Titlu]. 71 . În câmpul proprietăţii Row Source Type este selectată valoarea Table / Query.

daţi proprietăţii Locked a casetei text IdTitlu valoarea Yes. vom adăuga formularului DetaliiProf un grup de opţiuni cu ajutorul vrăjitorului Option Group Wizard. El va arăta ca în figura 4. Alegeţi aici coloana Statut şi apăsaţi Next. În prima cutie de dialog a vrăjitorului veţi specifica etichetele fiecărui buton de opţiune: “Titular” şi “Suplinitor”. din cutia de instrumente selectaţi controlul de tip grup de opţiuni. Pentru aceasta. va trebui să adăugăm o nouă coloană la tabela Profesor şi anume Statut. şi dacă da. Pentru a vedea funcţionarea grupului de opţiuni treceţi în modul Form View şi testaţi formularul. le veţi putea vedea în partea stângă a cutiei de dialog. De asemenea. în ce câmpuri. Figura IV. Acceptaţi. va trebui să modificăm şi sursa de date a formularului (interogarea DetaliiProf) astfel încât ea să conţină şi această coloană.În continuare. În următoarea cutie de dialog veţi alege care dintre cele două opţiuni să fie implicită: alegeţi opţiunea Titular. valori ce vor fi stocate în tabelă: 1 pentru Titular şi 0 pantru Suplinitor. Deschideţi din nou formularul DetaliiProf în modul DesignView şi.9 Să vedem acum ce a făcut Option Group Wizard. se va activa vrăjitorul Option Group Wizard. Pentru ca la introducerea datelor să nu poată apărea neconcordanţe între caseta combinată Titlu şi câmpul IdTitlu al formularului. Următoarea cutie de dialog ne propune diferite tipuri de controale ce pot apărea într-un grup de opţiuni. Din pagina Pag.9. de tip Number (FieldSize=Integer) şi care va avea valoarea 1 dacă profesorul este titular sau 0 dacă este suplinitor. Observaţi că grupul conţine două butoane de opţiune. Dacă butonul Control Wizard din cutia de instrumente este apăsat. când veţi plasa controlul pe formular. 72 . Selectându-le. Următoarea cutie de dialog ne cere să specificăm dacă valorile vor fi stocate într-o tabelă. ale căror etichete sunt “Titular” şi “Suplinitor”. astfel încât valorile sale să nu poată fi modificate direct de către utilizator. În cea de-a treia cutie de dialog veţi introduce valorile corespunzătoare opţiunilor. de exemplu. varianta implicită şi treceţi la ultima cutie de dialog în care va trebui să introduceţi denumirea grupului de opţiuni (să-i spunem “Statutul”).

Pentru aceasta.6. atunci când obţinem informaţii despre titlul de lector. De asemenea. proprietatea Default Value are valoarea 1. Access recunoaşte faptul că între cele două tabele este definită o relaţie şi. coloana de legătură fiind IdTitlu.10). Puteţi avea maximum două niveluri de imbricare a subformularelor şi oricâte subformulare pe acelaşi nivel de imbricare. din cutia de dialog New Forms. pentru o anumită înregistrare din tabela Titlu. Formularul părinte va lucra cu datele din tabela aflată în partea (1) a relaţiei. În pagina Forms a ferestrei Database alegeţi butonul New şi apoi. tabelele Profesor şi Titlu sunt legate printr-o astfel de relaţie. iar subformularul. De exemplu. 73 . remarcăm doar că valoarea 1 pe care o specificasem în cea de-a treia cutie de dialog a vrăjitorului se regăseşte în valoarea proprietăţii Option Value. Din pagina de proprietăţi a primului buton de opţiune. valoarea 0 corespunzătoare opţiunii Suplinitor se regăseşte în valoarea proprietăţii Option Value a celui de-al doilea buton de opţiune. Subformulare Atunci când avem două tabele între care există o relaţie de tip 1:m.10 4. Analog.de proprietăţi a grupului de opţiuni (figura IV. vom crea un formular ce va conţine un subformular. Paşii pe care trebuie să-i parcurgeţi pentru aceasta sunt următorii: 1. merită să remarcăm valoarea proprietăţii Control Source. corespunzătoare opţiunii Titular (aşa cum am specificat în cea de-a doua cutie de dialog a vrăjitorului). Pag. limitează înregistrările din subformular la cele pentru care valorile câmpului de legătură din cele două tabele sunt egale. cu cele ale tabelei din partea (m). Ar fi interesant ca. poate fi avantajos să putem lucra cu amândouă prin intermediul unui singur formular. Figura IV. Access 97 vă pune la dispoziţie un instrument foarte prietenos pentru crearea de formulare cu subformulare: Form Wizard. Titlu. să putem vedea şi toţi profesorii care au acest titlu. alegeţi Form Wizard. şi anume coloana Statut.

Access îşi dă seama că doriţi să creaţi un formular bazat pe două tabele între care există o relaţie de tip1:m şi vă pune la dispoziţie trei moduri de a vizualiza aceste date.că formularul părinte. Altă metodă ar fi să selectaţi din cutia de instrumente un control de tip Subform/Subreport şi să-i stabiliţi în mod corespunzător proprietăţile Link Child Fields. 74 . atunci formularul va fi de tip Single Form. Pentru a înţelege legătura dintre formularul părinte şi subformular. Nu trebuie decât să trageţi numele subformularului din pagina Forms a ferestrei Database Container peste formularul principal deschis în modul Design View şi apoi să stabiliţi proprietăţile Link Child Fields şi Link Master Fileds ale controlului de tip Subform/Subreport care va conţine subformularul. În prima cutie de dialog a Vrăjitorului. pe care dacă apăsaţi se va deschide formularul bazat pe tabela din partea (m) a relaţiei) şi Form with subform(s) (formular cu subformulare). ale coloanelor ce formează cheia primară a tabelei din partea (1) a relaţiei. selectaţi din caseta combinată Tables/Queries tabela Profesor şi apoi. Catedra şi Data Angajării. Link Master Fileds şi Source Object. Un subformular poate fi adăugat unui formular părinte şi fără ajutorul lui Form Wizard. Mai observaţi faptul că proprietatea Source Object are ca valoare numele subformularului (Profesori Subform). Pag.2. un control de tip Subform/Subreport. 4. respectiv. Dacă în cea de-a doua cutie de dialog din Wizard alegeţi ca datele să fie prezentate în funcţie de tabela Profesor. 3. Următoarele cutii de dialog din Wizard se ocupă cu caracteristicile grafice ale formularului. atunci puteţi opta între 2 posibilităţi: Linked Forms (formulare legate) (în acest caz vor fi create două formulare separate. Dacă alegeţi ca datele să fie prezentate în funcţie de tabela Titlu. din lista Available Fields alegeţi coloanele Nume. Selectaţi apoi din caseta combinată rabela Titlu şi coloanele Titlu şi Salariu. Alegeţi această ultimă posibilitate. Observaţi. Titlu_Profesori are. Pe baza datelor pe care le-aţi selectat. în plus faţă de casetele text Titlu şi Salariu şi etichete corespunzătoare acestora. să le privim în modul Design View. Legătura între cele două formulare se face prin intermediul a două proprietăţi ale controlului de tip Subform/Subreport: Link Child Fields şi Link Master Fields care specifică numele coloanelor de legătură ce formează cheia străină în tabela din partea (m) şi. adică datele din cele două tabele vor fi afişate într-un singur formular. cel care se bazează pe tabela din partea (1) a relaţiei având un buton.

Pag. Aceasta este esenţa programării orientate pe evenimente: utilizatorul este cel care efectuează anumite acţiuni. Pentru a răspunde unui anumit eveniment. Răspunsul poate fi executarea unei macrocomenzi. trebuie să îi atribuiţi o macrocomandă. deschiderea unui formular sau raport etc. puteţi presupune că utilizatorul va trebui să introducă o valoare într-o casetă de text înainte de a putea să apese pe un buton. aplicaţiile Access trebuie să fie proiectate în aşa fel încât să răspundă evenimentelor declanşate de utilizator. Modelul orientat pe evenimente Microsoft Access vă permite dezvoltarea de aplicaţii orientate pe evenimente. 75 . Ordinea în care se execută codul aplicaţiei este astfel determinată de ordinea în care sunt invocate evenimentele prin acţiunile utilizatorului. Pentru aceasta. a unei proceduri VBA sau evaluarea unei expresii. prin intermediul codului scris de programator. va trebui să dezactivaţi butonul respectiv înainte ca utilizatorul să introducă o valoare în caseta de text. Astfel. La acest lucru trebuie să vă gândiţi mereu atunci când creaţi o aplicaţie Access (sau o aplicaţie Windows în general). iar aplicaţia răspunde în consecinţă. Cu alte cuvinte. programatorul trebuie să facă o serie de presupuneri pentru a determina comportamentul aplicaţiei. Spre exemplu. Un astfel de eveniment este o acţiune pe care aplicaţia o recunoaşte (cum ar fi apăsarea unei taste. Evenimentele sunt declanşate de acţiunile utilizatorului. rapoartele şi controalele acestora.) şi care generează un anumit răspuns. Obiectele supuse evenimentelor sunt formularele. o procedură sau o expresie.CAP: 5. Acest lucru îl puteţi face în pagina Event a ferestrei Properties a obiectului respectiv (figura 5.1). efectuarea unui clic cu mouse-ul.

afişarea unei casete de mesaj pentru confirmarea ştergerii. ştergerea nu va fi efectuată. Procedura pentru tratarea acestui eveniment are doi parametri: Cancel şi Response. Evenimente generate de accesarea datelor Aceste evenimente au loc ori de câte ori utilizatorul adaugă.1. În cele ce urmează.1. • BeforeDelConfirm – Are loc după ce utilizatorul a şters una sau mai multe înregistrări şi înainte ca sistemul să afişeze caseta de mesaj pentru confirmare. modifică sau şterge datele dintr-un formular ori control sau când trece de la o înregistrare la alta. 5. Current (pentru accesarea înregistrării următoare). înainte ca datele să fie efectiv şterse. BeforeDelConfirm. în ordine: Delete. Dacă parametrul Cancel are valoarea True. Dacă el are valoarea False. vom vorbi despre evenimentele cel mai des întâlnite. 5. Tipuri de evenimente în Access Access îi pune programatorului la dispoziţie mai multe tipuri de evenimente ce pot fi declanşate de acţiunile utilizatorului şi tratate de aplicaţie. 76 . • Current – Are loc la deschiderea unui formular sau când se trece de la o înregistrare la alta.1 5. • Delete – Are loc atunci când utilizatorul efectuează o operaţie de ştergere a datelor. vor avea loc următoarele evenimente. iar parametrul Response are valoarea 0. dacă are valoarea True.1. ştergerea va Pag.Fig. Procedura pentru tratarea acestui eveniment are un parametru: Cancel care. înregistrările nu vor mai fi şterse şi caseta de mesaj nu va mai apărea. iar dacă are valoarea False. AfterDelConfirm.

modificarea nu se va mai efectua. care. evenimentul are loc dacă utilizatorul introduce în câmpul de editare al casetei combinate o valoare care nu se regăseşte în lista acestuia. dacă are valoarea True. acţiunea de inserare va fi abandonată. • Pag. care păstrează valoarea controlului dinaintea modificării până după ce acest eveniment a avut loc. dacă are valoarea True. • BeforeUpdate – Apare înainte ca datele dintr-un control sau dintr-o înregistrare să fie modificate efectiv. caseta de mesaj va apărea. 1 că Access a anulat-o şi 2 că utilizatorul a anulat-o.1 sau 2. care. • BeforeInsert – Are loc numai atunci când utilizatorul introduce primul caracter al unei înregistrări noi. aveţi posibilitatea ca în procedura pentru tratarea acestui eveniment să redaţi controlului vechea valoare astfel: FORMS!formular!control = FORMS!formular!control. 77 . Procedura pentru tratarea acestui eveniment are un argument. În acest ultim caz. Controalele ataşate au o anumită proprietate. Astfel. Cancel. Old Value. iar valoarea 2 îi indică lui Access să nu afişeze mesajul standard şi să introducă noua valoare în listă. Valoarea 0 spune că ştergerea a fost efectuată cu succes. iar dacă Response are valoarea 1. Valoarea 0 îi indică lui Access să afişeze un mesaj standard pentru a înştiinţa utilizatorul că a introdus o valoare care nu se află în lista casetei combinate. • NotInList – Este un eveniment specific casetelor combinate şi poate apărea numai dacă proprietatea LimitToList a unui astfel de control are valoarea Yes.fi efectuată fără a mai apărea caseta de mesaj. • AfterUpdate – Are loc după ce au fost modificate datele dintr-un control sau dintr-o înregistrare.OldValue Change – Apare atunci când se efectuează o modificare într-o casetă de text sau în câmpul de editare al unei casete combinate. Astfel. va trebui să introduceţi noua valoare şi în sursa de date a casetei combinate. Status. • AfterInsert – Are loc după inserarea unei înregistrări noi într-o tabelă.1 sau 2. care poate avea valorile 0. Procedura pentru tratarea acestui eveniment are un argument. Cancel. Procedura pentru tratarea acestui eveniment are două argumente: NewData. care păstrează valoarea nou introdusă de utilizator şi Response. • AfterDelConfirm – Are loc după confirmarea şi/sau ştergerea înregistrărilor. dar înainte ca înregistrarea să fie inserată în tabelă. care poate avea valorile 0. 1 îi indică lui Access să nu afişeze masajul standard şi nici să nu introducă noua valoare în listă (dându-vă posibilitatea de a afişa un mesaj propriu). Procedura pentru tratarea acestui eveniment are un argument.

Evenimentul apare înaintea lui GotFocus şi după Current. 2 că fişierul ce conţine obiectul OLE a fost închis de aplicaţia care l-a creat. dacă toate controalele lui sunt dezactivate. 2 sau 3. Acest eveniment are loc după evenimentul Enter. evenimentele Enter şi Exit nu vor avea loc dacă focusul trece la un alt formular sau raport. • Exit – Are loc înainte ca un control să piardă focusul în favoarea altui control de pe formular.1. 1 că datele au fost salvate de aplicaţia care a creat obiectul. când se face clic pe un control al său sau când este apelată procedura Visual Basic SetFocus. 1.2. Ele pot fi folosite pentru a afişa mesaje înaintea actualizării controalelor sau pentru a schimba ordinea în care se trece cu tasta Tab de la un control al formularului la altul. GotFocus – Apare atunci când un control de pe un formular primeşte focusul sau când un formular primeşte focusul. care poate avea valorile 0.Updated – Are loc atunci când au fost modificate datele unui obiect OLE şi este specific controalelor cadru pentru obiecte OLE ataşate sau neataşate. după apariţia evenimentului Exit (care poate să aibă loc sau nu). iar 3 că fişierul ce conţine obiectul a fost redenumit de aplicaţia care l-a creat. Evenimente legate de focus Acestea apar atunci când un control. 78 . Aceasta se întâmplă la deschiderea formularului sau a raportului. • Enter – Are loc înainte ca un control să primească focusul de la un alt control al aceluiaşi formular sau la deschiderea formularului. pentru primul control al acestuia. • LostFocus – Are loc atunci când un formular sau un control de pe un formular pierde focusul. Procedura pentru tratarea acestui eveniment are un parametru. • Activate – Are loc atunci când un formular sau un raport primeşte focusul şi devine activ. Code. • 5. înaintea evenimentului LostFocus. • Pag. Formularul sau raportul trebuie să fie vizibil pentru ca evenimentul să aibă loc. formular sau raport primeşte sau pierde focusul (sau când devine activ sau inactiv). Valoarea 0 îi indică lui Access că datele obiectului au fost modificate. Notă:Spre deosebire de evenimentele GotFocus şi LostFocus. Un control nu poate primi focusul dacă este dezactivat sau dacă nu este vizibil.

a tastelor pentru navigare (săgeţi. ce are ca valoare un întreg reprezentând codul caracterului respectiv. End. pentru un control sau formular.4.1. a unei macrocomenzi. ceea ce poate duce la terminarea resurselor sistemului.1. Page Down) sau Shift. valoarea parametrului Shift este suma valorilor corespunzătoare. puteţi folosi în schimb evenimentele generate de accesarea datelor. • 5. Procedura pentru tratarea acestui eveniment are un argument.Deactivate – Apare atunci când un formular sau raport pierde focusul în favoarea altei ferestre (cum ar fi fereastra Database. Home. a unui modul sau alt formular sau raport). 1 că a fost apăsată tasta Shift. Acest eveniment mai apare şi în următoarele situaţii (când nu se face clic cu mouse-ul): . Evenimente legate de tastatură Acestea au loc la apăsarea unei taste sau ca rezultat al instrucţiunii SendKeys. 5. Notă: Folosiţi aceste evenimente cu precauţie. Acest eveniment nu are loc dacă focusul trece către o cutie de dialog sau către altă aplicaţie. ci al grupului. Evenimente legate de activitatea cu mouse-ul Apar atunci când se efectuează anumite acţiuni cu mouse-ul asupra unui control sau formular. Dacă este apăsată o combinaţie a acestor taste. Valoarea 0 nu corespunde nici unei taste. acest eveniment nu este al controlului respectiv. 79 . Atunci când se face clic pe un control aflat în cadrul unui grup de opţiuni. KeyCode are ca valoare un întreg ce reprezintă tasta care a fost apăsată. • Click – Are loc atunci când se efectuează un clic cu mouse-ul pe un formular sau pe un control ori pe o secţiune a unui formular. Ctrl şi Alt. Procedurile ce tratează aceste evenimente au două argumente: KeyCode şi Shift. 2 pentru Ctrl. Argumentul Shift are ca valoare un întreg ce arată dacă tastele Shift. • KeyUp – apare de câte ori o tastă care a fost apăsată se relaxează (când un control sau formular are focusul). El nu are loc la apăsarea tastelor funcţionale (F1 – F12). 4 pentru Alt. evenimentele KeyDown şi KeyPress au loc repetat. Page Up. • KeyPress – Apare atunci când o tastă sau o combinaţie de taste ce corespund unui caracter ce poate fi tipărit este apăsată şi apoi relaxată. cum ar fi Change şi Updated. deoarece dacă o tastă este ţinută apăsată. Ctrl sau Alt au fost apăsate în combinaţie cu alte taste. KeyAscii.când este selectată o valoare din lista unei casete combinate cu ajutorul săgeţilor şi este apăsată tasta Enter pentru a plasa valoarea în câmpul de editare al casetei combinate. Valoarea 0 arată că aceste taste nu au fost apăsate.3. • KeyDown – Apare de câte ori este apăsată o tastă atunci când un control sau un formular are focusul. Pentru a urmări acţiunile utilizatorului. Pag. fereastra unei tabele.

cu diferenţa că argumentul Button poate avea valorile: 1 (pentru butonul din stânga).5. 1 dacă a fost apăsat butonul din stânga. pe un control al lui sau pe o secţiune a acestuia. Cancel. . • Format – Apare înainte ca Access să formateze fiecare secţiune a unui raport. Valorile argumentului Shift sunt aceleaşi ca la procedurile pentru tratarea evenimentelor de la tastatură.dacă este apăsată tasta Space atunci când o casetă de validare. control al lui sau secţiune a acestuia. Argumentul Button poate lua valorile: 0 dacă nu a fost apăsat nici unul dintre butoanele mouse-ului. 2 (pentru butonul din dreapta) sau 4 (pentru butonul din mijloc). • MouseDown şi MouseUp – Au loc atunci când un buton al mouseului este apăsat sau relaxat.1. în timp ce cursorul se află deasupra unui formular. 80 . Dacă au fost apăsate mai multe butoane o dată. 5. care. un buton de comandă sau un buton de opţiune are focusul. 2 pentru cel din dreapta şi 4 pentru cel din mijloc. • MouseMove – Apare atunci când utilizatorul mişcă mouse-ul. X şi Y (care dau coordonatele curente ale cursorului mouse-ului).dacă se apasă tasta Enter pentru un formular care are un buton a cărui proprietate Default are valoarea Yes sau dacă se apasă tasta Esc pentru un formular cu un buton a cărui proprietate Cancel are valoarea Yes.. evenimentul este anulat. dar după ce datele au fost selectate. Pag. Procedura pentru tratarea acestui eveniment are două argumente: Cancel şi FormatCount. . Evenimente legate de tipărire Acestea au loc pentru fiecare secţiune a unui raport atunci când acesta este tipărit sau este formatat pentru a fi tipărit. Shift (arată dacă au fost apăsate tastele Shift. • DblClick– Are loc atunci când se face clic de două ori la rând cu mouse-ul pe un formular. vor avea loc tot atâtea evenimente MouseDown şi MouseUp. Atunci când se face clic pe un control aflat în cadrul unui grup de opţiuni. Pentru secţiunea Detail. acest eveniment nu este al controlului respectiv. Procedura pentru tratarea acestui eveniment are aceleaşi argumente ca şi cea pentru tratarea lui MouseMove. dacă are valoarea True. valoarea lui Button va fi suma valorilor corespunzătoare.dacă se accesează un buton de comandă cu ajutorul comenzii sale prescurtate (Alt + litera subliniată dintitlul butonului). Dacă au fost apăsate mai multe butoane o dată. Procedura pentru tratarea acestui eveniment are patru argumente: Button (care arată care dintre butoanele mouse-ului a fost apăsat). ci al grupului. acest eveniment se produce pentru fiecare înregistrare în parte. Procedura pentru tratarea acestui eveniment are un argument. Ctrl sau Alt).

acest eveniment are loc pentru fiecare secţiune în parte. înaintea evenimentului Close. Procedura pentru tratarea evenimentului are un argument. Cancel. Ca şi evenimentul Format.1. nu veţi mai putea închide formularul decât închizând aplicaţia. formularul sau raportul respectiv nu va mai fi deschis. Acest eveniment se produce înaintea evenimentului Load. după evenimentul Unload. Procedura pentru tratarea evenimentului are un argument. • Print – Are loc după formatare şi înainte de afişare sau tipărire. care dacă are valoarea True. PrintCount reprezintă numărul de apariţii ale acestui eveniment pentru înregistrarea curentă. puteţi afla dacă o înregistrare va fi tipărită pe mai mult de o pagină şi puteţi renunţa la ea. aveţi posibilitatea să redimensionaţi şi controalele formularului. formularul nu va mai fi închis. Astfel. se renunţă la formatarea secţiunii curente şi se trece la următoarea secţiune. • Unload – Apare la închiderea unui formular (dar înainte ca acesta să dispară de pe ecran). Astfel. dar după evenimentul Open. redimesionată sau închisă.6. Procedura de tratare are două argumente: Cancel şi PrintCount. • Retreat – Apare atunci când Access trebuie să revină la o secţiune anterioară a unui raport în timpul formatării. Pag. • Close – Are loc atunci când un formular sau un raport este închis sau nu mai este vizibil pe ecran. dacă nu îi daţi explicit mai târziu valoarea False. • Open – Se produce la deschiderea unui formular sau raport şi înainte ca prima înregistrare a formularului să fie afişată sau ca raportul să fie afişat sau tipărit. Dacă argumentul Cancel are valoarea True. • Resize – Apare la deschiderea unui formular sau la redimesionarea sa. dacă are valoarea True. înaintea evenimentului Current al primei înregistrări sau al primului control al formularului. • Notă: Atenţie! Dacă daţi argumentului Cancel valoarea True. care. 5. Cancel. formularul nu va mai fi închis sau ştrs de pe ecran. Evenimentele ferestrelor Acestea se produc atunci când o fereastră a unui formular sau raport este deschisă. Load – Apare la deschiderea unui formular şi la afişarea înregistrărilor.Dacă argumentul Cancel are valoarea True. secţiunea sau înregistrarea curentă nu va mai fi tipărită. Astfel. pentru a vă da posibilitatea de a modifica formatările făcute deja. El are loc după evenimentul Format şi înaintea evenimentului Print. 81 . FormatCount reprezintă numărul de evenimente Format produse pentru secţiunea curentă.

1. Procedura pentru tratarea acestui eveniment are două argumente: DataErr. Pentru valori cuprinse între 0 şi 65536. evenimentul nu se va produce. Dacă Response are valoarea 0. Ordinea producerii evenimentelor în Access După ce aţi făcut cunoştinţă cu câteva dintre evenimentele ce pot apărea într-o aplicaţie Access. 5. 82 . Ordinea producerii evenimentelor legate de controale Când un control primeşte focusul. evenimentul va avea loc la intervalul stabilit. Access nu mai afişa mesajul de eroare. care determină dacă trebuie să fie afişat un mesaj de eroare standard. ordinea producerii evenimentelor este următoarea: KeyDown KeyPress AfterUpdate Change Exit KeyUp BeforeUpdat e LostFocus Pag. valoarea reprezentând mărimea intervalului în milisecunde.8. Evenimentele legate de timer • Timer – Apare la intervale de timp regulate. pentru ale putea folosi la stabilirea comportamentului aplicaţiei. Access va afişa mesajul standard.1. Astfel.2. Dacă această proprietate are valoarea 0. au loc următoarele evenimente: Enter GotFocus Când introduceţi sau modificaţi datele dintr-un control şi apoi treceţi focusul altui control. aveţi posibilitatea de a intercepta mesajele de eroare ale lui Access şi de a afişa propriile dumneavoastră mesaje. care reprezintă codul de eroare returnat de funcţia Err ce se apelează de câte ori apare o eroare şi Response.7.5. putând astfel să afişaţi un mesaj personalizat. 5. iar dacă are valoarea 1.1. dacă aţi stabilit proprietatea TimerInterval a unui formular. Evenimente generate de erori • Error – Are loc atunci când apare o eroare de execuţie la rularea aplicaţiei.2. este important să înţelegeţi ordinea în care acestea se succed. 5.

se vor produce. Ordinea producerii evenimentelor legate de lucrul cu înegistrările unui formular Evenimentele ce se produc atunci când sunt afişate înregistrările unui formular. după evenimentul KeyUp apar evenimentele NotInLst şi Error.3 Ordinea producerii evenimentelor legate de formulare Lucrul cu un formular implică generarea unor evenimente legate de închidere.2.2. 5. Pag. deschidere. ordinea producerii evenimentelor este următoarea: Delete BeforeDelConfirm AfterDelConfirm Când treceţi focusul pe o înregistrare nouă (ce nu conţine încă date). trecerea de la un formular la altul şi lucrul cu datele formularului. în ordine. Dacă modificaţi o înregistrare prin intermediul controalelor unui formular şi treceţi apoi la următoarea înregistrare.2. sunt diferite de cele ale controalelor care afişează date ale înregsitrărilor respective.Notă: Dacă în câmpul de editare al unei casete combinate este introdusă o valoarea care nu se regăseşte în lista acestuia. vor apărea evenimetele: Current (formular) Enter (formular) GotFocus (control) BeforeInsert (formular) AfterInsert (formular) 5. următoarele evenimente: Current (formular) BeforeUpdate (control) AfterUpdate (formular) Enter (control) GotFocus (control) AfterUpdate (control) Exit (control) BeforeUpdate (formular) LostFocus (control) Current (formular) La ştergerea unei înregistrări. 83 .

2.4. îl puteţi închide şi pune focusul pe primul formular. Pag.De exemplu. dacă în timpul deschiderii celui de-al doilea formular apare o eroare. evenimentele: Open (f1) Open (f2) Activate (f2) Load (f1) Load (f2) Current (f2) Resize (f1) Resize (f2) Current (f1) Deactivate (f1) Activate (f1) Deactivate (f2) Observaţi că evenimentul Deactivate al formularului f1 apare după evenimentele Open. evenimentul DblClick va apărea după evenimentul Click. Ordinea producerii evenimentelor legate de tastatură şi mouse După cum am mai spus. în ordine. Ordinea producerii evenimentelor generate de apăsarea unei taste este: KeyDown KeyPress KeyUp Ordinea evenimentelor generate de apăsarea unui buton al mouse-ului este: MouseDown MouseUp Click Dacă de efectuează un dublu clic. vor avea loc. ordinea producerii evenimentelor este următoarea: Evenimente ale controalelor subformularului Evenimentele formularului Evenimente ale controalelor formularului Evenimentele subformularului 5. Astfel. dacă deschideţi formularul f1. Când lucraţi cu subformulare. apăsaţi pe un buton al său pentru a deschide formularul f2 şi apoi treceţi din nou la formularul f1. 84 . Load şi Resize ale lui f2. aceste evenimente apar atunci când un formular sau un control al unui formular primeşte focusul.

raportului. se produce evenimentul NoData. care va arăta astfel: Sub nume_procedura () … End Sub 5. Ordinea producerii evenimentelor rapoartelor Evenimentele unui raport sunt generate de tipărirea. Dacă doriţi să trataţi un eveniment al unui control sau al unei secţiuni. vor apărea.5. Deschideţi formularul sau raportul în modul Design. Salvaţi modulul. Access va scrie automat scheletul procedurii. Pag. 2. Dacă interogarea nu generează nici o înregistrare. această procedură va fi apelată şi executată. nu mai trebuie decât să le scrieţi codul Visual Basic corespunzător procedurilor pentru tratarea evenimentelor respective. se va deschide o listă din care veţi putea alege o macrocomandă. 4. secţiunii sau controlului respectiv şi selectaţi pagina Event. afişarea sau de închiderea raportului respectiv. de câte ori va avea loc evenimentul respectiv. Astfel. în ordine. 85 . 5. Astfel.2. când deschideţi un raport pentru a-l tipări sau afişa şi apoi îl închideţi. 6.1 prezintă pagina Event a ferestrei Properties a unui formular. procedaţi astfel: 1.3. Figura VII. Din lista corespunzătoare evenimentului pe care doriţi să îl trataţi. alegeţi opţiunea [Event Procedure] şi apăsaţi butonul Build (…) pentru a deschide fereastra modului în care se va afla procedura. evenimentele: Open Activate Format Print Close Deactivate Evenimentul Open are loc înainte ca înregistrarea pe care se bazează raportul să fie executată.5. 3. Alegeţi comanda Debug | Compile Loaded Modules pentru a compila procedura. Deschideţi fereastra Properties a formularului. Făcând clic pe săgeata din dreapta câmpului unui eveniment. Tratarea evenimentelor După ce aţi decis ce acţiuni doriţi să fie efectuate ca răspuns la anumite evenimente. Pentru a crea procedura pentru tratarea unui eveniment şi a-i scrie codul VBA. selectaţi controlul sau secţiunea respectivă.

există şi câteva macrocomenzi care nu au corespondent în VBA: AutoKeys. ele vă dau posibilitatea de a intercepta şi a trata erorile cu ajutorul evenimentului Error şi a funcţiei OnError. 86 . de la deschiderea şi închiderea unui formular ori raport sau stabilirea unor opţiuni.Despre procedurile VBA vom vorbi pe larg mai tîrziu. Aceasta pentru că procedurile sunt mai rapide în execuţie. care vă permit să programaţi acţiuni simple. Pe de altă parte. până la emiterea unui semnal sonor. Pe lângă faptul că macrocomenzile sunt mai lente în execuţie decât procedurile. nişte instrumente utile. Macrocomenzile sunt. Mai precis. Access vă dă chiar posibilitatea de a transforma o macrocomandă în codul VBA echivalent. mai flexibile şi mai uşor de întreţinut. Aţi observat că în acest capitol am insistat mai mult pe folosirea procedurilor VBA decât a macrocomenzilor pentru tratarea evenimentelor. Spre deosebire de macrocomenzi. macrocomenzile au dezavantajele lor. Autoexec şi AddMenu. o macrocomandă este o înşiruire de acţiuni. Cu toate acestea. totul în doar câteva secunde. . programată să se execute în cazul producerii unui anumit eveniment. care îi determină pe cei mai mulţi programatori Access să prefere modulele şi codul VBA. aşadar. Macrocomenzi Macrocomenzile reprezintă o metodă simplă de a efectua anumite acţiuni întro aplicaţie Access. ele mai Pag. fără a avea prea multe cunoştinţe de programare. CAP:6.

• Crearea şi utilizarea meniurilor şi a barelor cu instrumente personalizate. ele sunt: Message (mesaj). Faceţi clic pe prima linie a coloanei Action şi apoi apăsaţi pe săgeata din partea dreaptă a câmpului. Deschideţi pagina Macros a ferestrei Database şi apăsaţi butonul New. Pag. în partea de jos a ferestrei Macro Builder vor apărea argumentele corespunzătoare acţiunii respective.1). Va apărea o cutie de dialog cerându-vă un nume pentru noua macrocomandă (să-i spunem “Salut”). nu veţi putea stabili acest lucru decât cu ajutorul macrocomenzii AutoKeys. Selectaţi acţiunea MsgBox. 6. 1. dacă veţi dori ca tasta F3 să deschidă un anumit formular. După ce aţi selectat o acţiune. Se va deschide fereastra Macro Builder (figura 6. Type (tipul casetei de mesaj) şi Title (titlul casetei de mesaj). Beep (semnal sonor). Se va deschide o listă cu toate acţiunile. Spre exemplu. Figura 6. Există însă şi unele acţiuni care pot fi efectuate numai prin intermediul macrocomenzilor: • Definirea comenzilor rapide de la tastatură pentru diferite acţiuni. 6.au dezavantajul că nu oferă programatorului posibilitatea de a intercepta şi trata corespunzător erorile. 4. vom descrie în cele ce urmează paşii necesari creării unei macrocomenzi care să afişeze o casetă de mesaj cu un text de salut. 2.1 prezintă valorile pe care le-am ales pentru aceste argumente.1 3. 87 . În acest caz. Salvaţi macrocomanda cu ajutorul comenzii File | Save. Fig. • Rularea anumitor acţiuni la deschiderea bazei de date. Crearea unei macrocomenzi Pentru a înţelege mai bine cum se creează o macrocomandă.1. 5.

Fiecare macrocomandă din grup trebuie să aibă un nume propriu. după cum le spune şi numele. Pentru a rula macrocomanda.. apăsaţi butonul Run de pe bara cu instrumente sau alegeţi comanda Run | Run. După cum v-aţi putut da seama. pe care îl introduceţi în coloana Macro Name a ferestrei Macro Builder (această coloană va fi afişată dacă selectaţi comanda View | Macro Names). Caseta de mesaj va arăta ca în figura 6. 6.2. Grupuri de macrocomenzi Grupurile de macrocomenzi sunt. Dacă veţi converti ulterior macrocomanda la codul VBA corespunzător. cât şi argumentele acestora. macrocomenzile componete trebuie să fie separate prin linii goale (ca în figura 6.6.2. Pag. dar cuprinse în aceeaşi comandă globală.2 Notă: Este bine ca pentru fiecare acţiune a unei macrocomenzi să introduceţi un scurt comentariu care să descrie ce anume face acţiunea respectivă.3). salvate separat. 6. Fig. 88 . Într-un grup. aceste comentarii nu se vor pierde. este important să cunoaşteţi atât acţiunile disponibile. Folosiţi pentru aceasta liniile coloanei Comment. pentru a crea o macrocomandă care să îndeplinească o anumită cerinţă. colecţii de macrocomenzi simple.

atunci când doriţi să păstraţi toate macrocomenzile unui formular în acelaşi obiect. Macrocomenzi imbricate În Access puteţi crea şi macrocomenzi compuse. Pag. O macrocomandă din grup poate fi executată utilizând numele grupului. de exemplu. Cel mai simplu mod de a realiza acest lucru este folosirea acţiunii RunMacro. urmat de un punct şi de numele macrocomenzii: nume_grup. pentru a fi mai simplu de depanat. 6. astfel încât numărul obiectelor din pagina Macro a ferestrei Database să fie mai mic.3 Grupurile de macrocomenzi sunt utile. O altă utilizare frecventă a grupurilor de macrocomenzi o reprezintă crearea meniurilor personalizate. Figura 6. 89 . o macrocomandă poate apela altă macrocomandă în cadrul unei condiţii.nume_macro Execuţia unei macrocomenzi din grup se opreşte la întâlnirea următoarei linii libere din coloana Action. caz în care veţi prefera să le includeţi pe amândouă în acelaşi obiect.Fig.4 prezintă macrocomanda care apelează macrocomanda Mac1. în care fiecărui control îi corespunde o macrocomandă din grup. 6.3. Pe de altă parte. în care o macrocomandă să fie apelată de alta.

Macrocomanda AutoKeys Macrocomanda AutoKeys vă permite să atribuiţi comenzi rapide de la tastatură acţiunilor pe care le poate efectua aplicaţia dumneavoastră. prin intermediul coloanei Condition a ferestrei Macro Builder. Pentru a vedea această coloană. Dacă expresia este falsă. să fie tipărit raportul curent.1. 90 . ar fi util ca.Fig.4. selectaţi comanda View | Conditions. De exemplu. de câte ori utilizatorul foloseşte combinaţia de taste Ctrl+P. 6. Access va considera acţiunea de pe aceeaşi linie cu punctele de suspensie ca fiind pusă aceleiaşi condiţii. Despre condiţii în macrocomenzi vom vorbi în secţiunea următoare.4 O altă situaţie în care se folosesc macrocomenzi imbricate este atunci când veţi dori să controlaţi execuţia unei macrocomenzi impunând o condiţie. vom discuta despre două macrocomenzi ce merită o atenţie specială: AutoKeys şi AutoExec. acţiunea aflată pe aceeaşi linie în coloana Action se va executa numai dacă expresia este adevărată. Astfel. puteţi atribui orice combinaţie de taste oricărei acţiuni (sau Pag. Dacă introduceţi o expresie în coloana Condition.3. Condiţii în macrocomenzi Access vă pune la dispoziţie un mod rudimentar de a controla firul de execuţie al macrocomenzilor. 6.1. Macrocomenzi speciale În cele ce urmează. 6. Dacă introduceţi trei puncte de suspensie (…) în coloana Condition pe linia de sub o condiţie existentă. Access nu va executa acţiunea de pe aceeaşi linie cu condiţia şi va trece la următoarea acţiune.4. 6.

în general.grup de acţiuni) care poate fi executată prin intermediul unei macrocomenzi. 91 . 2. Alegeţi comanda View | Macro Names pentru a afişa coloana Name a ferestrei Macro Builder. în coloana Name a ferestrei Macro Buider. evitaţi totuşi atribuirea combinaţiilor de taste predefinite în Access (cum ar fi Ctrl +V pentru comanda Edit | Paste) deoarece. caracterele din coloana Corespondent a tabelului. deoarece altfel Access nu va efectua atribuirile. Pentru a atribui o combinaţie de taste unei acţiuni. Introduceţi aici combinaţia de taste pe care doriţi să o atribuiţi. trebuie să folosiţi o sintaxă specială. Este important ca acesta să fie numele macrocomenzii.5. Tasta Ctrl Tastă funcţională Shift Insert Delete Combinaţii de taste Exemplu ^Z (pentru Ctrl+Z) {F8} (pentru tasta F8) + +{F8} (pentru Shift+F8) {INS} sau {INSERT} {INS} (pentru tasta Insert) {DEL} sau {DELETE} {DEL} (pentru tasta Delete) Folosiţi caracterele de mai sus +^{F8} (pentru combinaţia Shift+Ctrl+F8) Tabelul 6. Dacă doriţi să atribuiţi mai multe acţiuni unei combinaţii de taste. Nu puteţi atribui o macrocomandă unei singure taste alfanumerice sau unei taste folosite.5. 5. Introduceţi în coloana Action corespunzătoare acţiunea atribuită combinaţiei de taste din coloana Name. Închideţi baza de date (cu comanda File | Close) şi deschideţi-o din nou pentru a activa macrocomanda AutoKeys. procedaţi astfel: 1. urmând instrucţiunile din tabelul 6. Creaţi o nouă macrocomandă. Pag. descrisă în tabelul 6. nu trebuie decât să le introduceţi pe linii consecutive ale coloanei Action (fără a lăsa linii libere între ele). Pentru a specifica o anumită combinaţie de taste. Pentru a nu crea confuzii. 4. apăsând butonul New din pagina Macros a ferestrei Database. în care tastei din coloana Tasta îi corespund.5 ^ {} Corespondent În figura 6. în astfel de cazuri. Access va executa macrocomanda dumneavoastră în locul comenzii predefinite. Tastelor funcţionale (F1-F12) şi tastelor Insert şi Delete le puteţi atribui macrocomenzi. Coloana Exemplu vă arată concret ce aţi putea introduce în coloana Name a ferestrei Macro Builder. în combinaţie cu alte taste (precum Ctrl sau Alt). Închideţi macrocomanda şi salvaţi-o cu numele “AutoKeys”. 3.6 este prezentată macrocomanda AutoKeys care atribuie acţiunii de tipărire a primelor două pagini ale obiectului curent combinaţia de taste Ctrl+P.

7 prezintă macrocomanda AutoExec care deschide formularul „Student” ori de câte ori este deschisă baza de date Optionale. În Access 97 vă puteţi lipsi de această macrocomandă. Cea mai frecventă utilizare a macrocomenzii AutoExec este ascunderea ferestrei Database şi deschiderea unui formular care să joace rolul de meniu principal al aplicaţiei sau de spalsh-screen. utilizatorul va putea.Figura 6. deoarece există o cutie de dialog în care puteţi alege formularul care va fi afişat la deschiderea bazei de date.6 6. Macrocomanda AutoExec Dacă doriţi ca anumite ca anumite acţiuni să aibă loc ori de câte ori se deschide o bază de date.2. Pag. să împiedice rularea macrocomenzii AutoExec la deschiderea bazei de date. puteţi crea o macrocomandă care să efectueze acţiunile respective şi pe care să o salvaţi cu numele “AutoExec”. Pentru a deschide această cutie de dialog alegeţi comanda Tools | StartUp.mdb. 92 . Figura 6. totuşi. Ţinând tasta Shift apăsată.4.

7 6. Pag. numit Menu Builder şi care vă ajuta să scrieţi macrocomenzile corespunzătoare. se foloseau macrocomenzi pentru crearea barelor de meniuri personalizate pentru aplicaţii. Aceste versiuni anterioare de Access furnizau un instrument specializat pentru crearea de astfel de meniuri. procedaţi astfel: 1. deoarece până la versiunea Access 97. pe care o prezentăm în continuare. numindu-le bare de comandă. Alegeţi comanda View | Toolbars | Customize.Figura 6.8). dar există şi o modalitate mai simplă. Access 97 nu mai include instrumentul Menu Builder. meniurile şi barele cu instrumente erau create cu ajutorul macrocomenzilor. Se va deschide cutia de dialog Customize (figura 6. pentru a limita acţiunile utilizatorului la cele specifice aplicaţiei sau pentru a simplifica efectuarea unor acţiuni prin rularea de macrocomenzi.5. ci tratează barele de meniuri şi barele cu instrumente unitar. Aceste bare de meniuri înlocuiau bara de meniu standard Access. Pentru a crea sau a modifica o bară cu instrumente sau o bară de meniuri în Access 97. 93 . Introducem totuşi această discuţie aici. Şi în Access 97 mai pot fi folosite macrocomenzile în acest scop. Crearea meniurilor şi a barelor cu instrumente personalizate În versiunile anterioare lui Access 97.

În caseta Name a acestui meniu derulat. All Forms. Selectaţi apoi articolul New Menu din lista Commands şi faceţi drag & drop cu el peste bara respectivă. Commands. Dacă doriţi ca butonul să fie asociat deschiderii unui obiect din baza de date (tabelă. După ce apăsaţi butonul OK. interogare. respectiv. formular sau raport) sau rulării unei macrocomenzi. Se va deschide cutia de dialog Toolbar Name. Pentru a adăuga butoane la o bară cu instrumente existentă. pentru a afişa un meniu derulant. ce nu conţine nici un buton şi nici un meniu. în lista Commnads vor apărea toate obiectele din baza de date curentă care fac parte din categoria respectivă. scrieţi numele noului meniu şi apăsaţi tasta Enter. În funcţie de opţiunea aleasă. nu trebuie decât să apăsaţi pe noul buton pentru a se efectua acţiunea pe care i-aţi atribuit-o. procedaţi ca şi pentru butoane.Apăsaţi butonul New din pagina Toolbars pentru a crea o nouă bară cu instrumente. Acum. dar nu are nici un articol de meniu. în care va trebui să introduceţi un nume pentru bara cu instrumente. selectaţi-o în lista din pagina Toolbars a cutiei de dialog Customize şi treceţi la pagina 2. procedaţi la fel ca pentru adăugarea butoanelor la o bară cu instrumente. Selectaţi şi executaţi drag & drop cu obiectul dorit pe bara cu instrumente la care doriţi să îl adăugaţi. All Queries. selectaţi din lista Categories una dintre opţiunile All Tables. All Macros. Pentru a adăuga comenzi unui meniu. După ce închideţi fereastra Customize.8 Pentru a adăuga un meniu la o bară cu instrumente existentă. cu diferenţa că din lista Categories trebuie să alegeţi opţiunea New Menu. meniul există. Figura VIII. va apărea pe ecran noua bară. 94 . cu diferenţa că trebuie să faceţi drag & drop cu obiectele Pag. Faceţi apoi clic dreapta pe meniul nou adăugat. All Reports sau.

6. La deschiderea bazei de date. Faceţi apoi clic dreapta pe butonul sau pe meniul respectiv şi alegeţi din meniul derulant comanda Delete. Vă puteţi da seama dacă o macrocomandă nu funcţionează când vedeţi cutia de dialog (figura 6.6. Făcând dublu-clic pe numele macrocomenzii în pagina Macros a ferestrei Database. 95 . dacă numele macrocomenzii este AutoExec. 6. Exact în acelaşi mod puteţi adăuga submeniuri la meniurile existente. Prin intermediul codului VBA dintr-un modul. Fig. Apăsaţi butonul Halt pentru a depana macrocomanda. Pentru a şterge o bară cu instrumente cu totul.selectate din lista Commands pe meniul respectiv. 4. Dintr-o altă macrocomandă sau prin intermediul barelor personalizate de meniuri sau de instrumente. în felul următor: Pag. selectaţi bara respectivă din lista din pagina Toolbars a cutiei de dialog Customize. Pentru a şterge un meniu sau un buton al unei bare cu instrumente. acţiunea care a produs eroarea şi argumentele acţiunii respective.9) aceasta vă prezintă numele macrocomenzii care a eşuat. folosind metoda RunMacro a obiectului DoCmd: DoCmd.9 Puteţi depana o macrocomandă rulând-o acţiune cu acţiune. 2. Rularea şi depanarea macrocomenzilor Există mai multe modalităţi de rula o macrocomandă în Access: 1. selectaţi-o în pagina Toolbars a cutiei de dialog Customize şi apăsaţi butonul Delete.RunMacro nume_macrocomanda 3.

• Pag. 96 . • Apăşaţi butonul Single Step de pe bara cu instrumente sau alegeţi comanda Run | Single Step. puteţi opri de la tastatură execuţia unei macrocomenzi la un moment dat. pe ecran apare cutia de dialog Macro Single Step.Deschideţi macrocomanda în fereastra Macro Builder. Când macrocomanda începe să ruleze. puteţi apăsa butonul Run de pe bară pentru a porni execuţia. Atunci. De asemenea. apăsând Ctrl + Break. • Dacă macrocomanda începe pe prima linie a ferestrei Macro Builder. oprirea execuţiei macrocomenzii (cu butonul Halt) şi continuarea neîntreruptă a execuţiei (cu butonul Continue). Această cutie de dialog vă oferă trei opţiuni: rularea acţiunii următoare (cu butonul Step). Dacă depanaţi o macrocomandă dintr-un grup. ce vă va permite rularea pas cu pas a macrocomenzii. va apărea cutia de dialog Macro Single Step. va trebui să rulaţi codul care apelează macrocomanda respectivă. care prezintă acţiunea în curs de rulare şi valorile parametrilor acesteia.

deoarece acestea nu conţin obiecte. Interceptarea şi tratarea erorilor. posibilitatea de a interacţiona cu alte aplicaţii şi de a apela funcţii Windows API sunt numai câteva dintre avantajele programării în VBA. Totuşi. Acestea vă ajută să găsiţi diferitele proceduri stocate în modulul respectiv. ci sunt incluse în formularul sau raportul corespunzător. Pag. care este un limbaj de programare complex. Microsoft Project şi. singura opţiune este General. mai multă rapiditate în execuţie. dacă doriţi să creaţi o aplicaţie dotată cu o interfaţă inteligentă şi prietenoasă.6). Design. va trebui să învăţaţi să scrieţi codul necesar pentru a controla aplicaţia. cât şi în Microsoft Excel. Visual Basic for Applications (VBA) După cum v-aţi putut da seama. un control mai bun asupra interfeţei cu utilizatorul. Obiectul acestui capitol este limbajul VBA (Visual Basic for Applications). respectiv. Modulele pentru clase sunt folosite pentru a crea şi a defini obiecte cărora le puteţi apoi crea instanţe (vom reveni asupra lor în secţiunea 7. Modulele pentru formulare şi rapoarte se deosebesc de celelalte tipuri de module prin faptul că nu sunt obiecte independente. atâta timp cât sunteţi în modul Design View. Atunci când un modul este deschis. ce vă permite dezvoltarea de aplicaţii atât în Access. Ele conţin procedurile pentru tratarea evenimentului formularului sau raportului respectiv şi pot fi deschise cu ajutorul comenzii View | Code. Cel din stânga vă permite să alegeţi obiectul al cărui cod doriţi să-l vedeţi sau să-l editaţi. Ce conţin modulele Aţi văzut deja cum puteţi accesa un modul. Acestea se împart în trei categorii: module standard.1 Mediul de programare Access Access păstrează codul procedurilor scrise de dumneavoastră în aşa-numitele module. 7. Le puteţi crea şi vedea în pagina Modules a ferestrei Database folosind butoanele New şi. În cazul modulelor standard. bineînţeles. Microsoft Visual Basic. în Access puteţi realiza multe lucruri fără a avea prea multe calităţi de programator. în partea de sus a ferestrei asociate veţi vedea două casete combinate. 97 . Modulele standard sunt obiecte de sine stătătoare şi sunt folosite pentru a crea şi stoca proceduri ce nu sunt legate de un anumit formular sau raport.CAP:7. module pentru clase şi module pentru formulare şi rapoarte.

în timp ce în cazul unui modul al unui formular sau raport. ce face ca Access să folosească ordinea de sortare a bazei de date pentru efectuarea comparaţiilor între şiruri de caractere. această casetă combinată va afişa lista tuturor obiectelor pe care le conţine. Option Compare Binary – Access va folosi reprezentarea binară a caracterelor pentru comparaţiile făcute în cadrul modulului. 3. 2. declaraţii. pe care le puteţi stabili cu ajutorul cuvântului cheie Option şi pe care vi le prezentăm în continuare: 1. Implicit. Aici veţi putea pune tot ce ţine de modulul respectiv. toate procedurile se vor afla aici). Această ordine poate fi schimbată Pag.1 (General) (General) nu este un obiect. de exemplu. 7. 4. Option Compare Database – opţiune implicită. în caseta combinată din dreapta veţi putea alege un eveniment al acelui obiect. După ce aţi selectat un obiect. pentru sortări). proceduri care nu tratează evenimente (în cazul modulelor standard. acesta este zero. Opţiuni Orice modul are un set de opţiuni. în general: opţiuni. ci mai degrabă o secţiune în cadrul unui modul. 98 . Fig. Option Compare – determină modul în care Access va compara două şiruri de caractere (lucru util. Option Base – vă permite să stabiliţi indicele cel mai mic pentru elementele unei matrice (array).

Acestea sunt variabile ale căror valori au fost deja stabilite şi care transmit procedurilor datele necesare efectuării operaţiilor specifice. Option Private – Dacă stabiliţi această opţiune.2. numele şi tipul argumentelor (dacă acestea există). în afară de (General). Option Compare Text – similară cu Option Compare Database. tipul informaţiei returnate (dacă procedura este o funcţie). O subrutină este. este important să înţelegeţi faptul că o procedură este un mod de a aduna mai multe linii de cod laolaltă. toate variabilele vor trebui să fie declarate înainte de a fi folosite în cadrul modulului. care ca scop îndeplinirea unui anumit obiectiv. Proceduri pentru tratarea evenimentelor Modulele pentru formulare şi rapoarte pot conţine şi alte secţiuni. De exemplu. Programatorul poate comunica informaţii unei proceduri prin intermediul argumentelor.1 Declararea procedurilor Declararea unei proceduri trebuie să conţină următoarele informaţii: tipul procedurii (subrutină sau funcţie). Blocul de cod ce compune subrutina poate fi folosit prin apelarea numelui. În Access. să nu trebuiască să scrieţi decât o singură linie de cod. Chiar dacă pe moment lucrurile nu sunt foarte clare. procedurile pot fi de două tipuri: subrutine şi funcţii. 7. Declaraţii (Declarations) Tot la secţiunea (General) a unui modul mai puteţi declara proceduri. 7. cu diferenţa că ea returnează o valoare. pur şi simplu. Acestea corespund controalelor şi secţiunilor formularului sau raportului respectiv şi conţin procedurile pentru tratarea evenimentelor legate de ele. variabile şi constante ce pot fi folosite în întregul modul. 99 .2 Proceduri O procedură este o înşiruire de linii de cod.cu ajutorul comenzii Tools | Options. conţinând numele procedurii. 7. iată cum ar putea să arate (schematic) declararea unei subrutine care tipăreşte un şir de caractere: Sub Tiparire(strText As String) Pag. un bloc de cod care are un nume. codul aflat în interiorul modulului nu va putea fi accesat dintr-un alt modul. cu deosebire că la efectuarea comparaţiilor între şiruri de caractere nu se face diferenţă între literele mari şi mici. O funcţie este ceva asemănător unei subrutine. dacă în pagina General a cutiei de dialog ce se va deschide veţi selecta o altă valoare în caseta combinată New Database Sort Order. 5. numele procedurii. Option Explicit – Dacă specificaţi această opţiune. 6. astfel încât de câte ori veţi dori să efectuaţi o anumită operaţie.

db1Nr2 As Double) As Double If db1Nr2 = 0 Then Cat = 0 Else Cat = db1Nr1 / db1Nr2 End If End Function Pentru a apela funcţia. strText. Astfel. de tip String (şir de caractere). db1Rez = Cat (db1Nr2:= n2.Print strText End Sub Numele subrutinei este Tiparire şi ea are un singur argument. urmat de două puncte şi egal. la apelul procedurii. pentru ca apelul unei proceduri să se poată compila. De exemplu. Există şi o modalitate de a furniza argumentele unei funcţii în altă ordine decât cea în care acestea au fost date la declararea funcţiei: în faţa argumentului efectiv. n2) unde n1 şi n2 sunt variabile ale căror valori au fost stabilite anterior. db1Nr2 As Double) As Double şi apoi apelată astfel: Pag. nu va mai trebui neapărat să daţi valoarea efectivă a acelui argument. funcţia Cat poate fi declarată ca: Function Cat (Optional db1Nr1 As Double. vom scrie: db1Rez = Cat (n1. ca în exemplul de mai jos. Observaţi facptul că. Puteţi însă modifica acest comportament. este importantă ordinea în care sunt date argumentele. pentru ca rezultatul să fie corect. db1Nr1:= n1) În general. trebuie să fi fost furnizate toate argumentele din declaraţie. dacă în cadrul declaraţiei veţi specifica înaintea numelui unui argument cuvântul cheie Optional. specificaţi numele argumentului din declaraţie. Subrutina va putea fi apelată astfel: Call Tiparire (“Salut!”) Iată acum declararea unei funcţii care returnează rezultatul împărţirii a două numere reale: Function Cat (db1Nr1 As Double.Debug. 100 .

db1Rez = Cat (. este bine ca la declararea unei proceduri să lăsaţi la urmă argumentele opţionale. numele acestora din declaraţie. IsMissing. Puteţi faceţi cunoştinţă cu funcţiile predefinite dacă lucraţi cu Expression Builder. trebuie ca în locul lor să puneţi o virgulă sau să specificaţi pentru argumente neopţionale.2. să returneze valoarea zero: Function Cat (db1Nr1 As Double.2. dacă deîmpărţitul lipseşte. cu date şi ore etc. Optional db1Nr1 As Double) As Double If IsMissing (db1Nr1) Then Cat = 0 Else If db1Nr2 = 0 Then Cat = 0 Else Cat = db1Nr1 / db1Nr2 End If End If End Function 7. Pag. Funcţii predefinite IsMissing este una dintre funcţiile predefinite pe care Access vi le pune la dispoziţie.2. Optional db1Nr1 As Double) As Double şi o putem apela: db1Rez = Cat (n2) Notă: Atât folosirea argumentelor opţionale cât şi a celor complet specificate (cu ajutorul numelui din declaraţie) este recomandată mai ales atunci când procedura are un număr mare de argumente. comunicarea cu alte aplicaţii. nu trebuie decât să le apelaţi în codul dumneavoastră. putem să declarăm funcţia Cat aşa: Function Cat (db1Nr2 As Double. lucrul cu fişiere şi directoare. 7. 101 . Există funcţii predefinite pentru toate tipurile de activităţi: lucrul cu texte şi date numerice. Pentru a vă bucura de facilităţile oferite de aceste funcţii. care returnează valoarea True dacă argumentul lipseşte şi False dacă acesta a fost furnizat.3. Astfel. Putem rescrie funcţia Cat astfel încât. De aceea. Lucrul cu argumente opţionale Cum putem afla dacă un argument declarat ca opţional a fost sau nu furnizat la apelul procedurii? Pentru aceasta există o funcţie Access predefinită. n2) sau db1Rez = Cat (db1Nr2:= n2) Atunci când apelaţi o procedură fără să furnizaţi unele dintre argumentele opţionale. pentru ca la apelare să nu mai trebuiască să includeţi virgule sau nume.

daţi flexibilitate codului pe care îl veţi putea apoi refolosi şi pentru alte valori. 102 Currency Boolean .3.2 prezintă toate tipurile de date pe care Access 97 vi le pune la dispoziţie. ce ne ajută să obţinem un anumit rezultat şi apoi va fi uitată. 7.5808 şi 922337203685477. Spuneam mai înainte că variabilele sunt nişte “containere” folosite pentru a stoca date. Tabelul 7. aţi văzut că în Access datele sunt stocate în tabele.7.401298*10-45 şi 3. Însă. folosit mai ales în domeniul bancar Pentru variabile care pot avea numai valorea Exemplu Dim strText As String Dim strText$ Dim intNr As Integer Dim intNr% Dim lngNr As Long Dim lngNr& Dim sngNr As Single Dim sngNr! Dim db1Nr As Double Dim db1Nr# Dim crnNr As Currency Dim crnNr@ Dim bNr As Boolean Pag. deci ce nevoie mai avem de variabile? Există o diferenţă esenţială între aceste două mijloace de stocare a datelor: spre deosebire de tabele.94065645842147*10-324 şi 1. Tabelele sunt folosite pentru a stoca informaţii pentru o perioadă mai lungă de timp.5807. până acum. Folosind variabila şi nu direct valoarea.79769313486231*10308 Număr cu 4 zecimale între – 922337203685477. Tipul de date String Integer Long Single Double Domeniul Şir de caractere Numere întregi între –32768 şi 32767 Numere întregi între –2147483648 şi 2147483647 Numere reale pozitive sau negative cu maximum 7 zecimale.402823*1038 Numerele reale pozitive sau negative cu maximum 15 zecimale. variabilele sunt folosite pentru a stoca o informaţie temporară.3. Puteţi atribui o valoarea unei variabile şi apoi să efectuaţi calcule cu valoarea respectivă prin intermediul variabilei.1 Tipuri de date Tipurile de date sunt folosite pentru a specifica ce fel de informaţie va fi păstrată într-o variabilă astfel încât Access să ştie cum să stocheze şi cum să manipuleze această informaţie. Variabile Variabilele sunt utilizate pentru a stoca date folosite în subrutine sau funcţii (asemeni unor containere). cu valoare absolută între 4. cu valoare absolută între 1.

Date Byte Object Variant Hyperlin k True sau False Date între 1 Jan 100 şi 31 Dec 9999 şi ore între 00:00:00 şi 23:59:59 Valori întregi între 0 şi 25 Orice tip de obiecte. cifre şi caracterul underscore (_) • Poate avea cel mult 40 de caractere • Nu poate fi un cuvânt rezervat Dacă nu v-aţi hotărât de la început ce tip de date va stoca variabila dumneavoastră.2 Dim datData As Date Dim bytNr As Byte Dim objObiect As Object Dim varOrice As Variant Dim hypPag As Hyperlink 7.2 Declararea variabilelor Dacă la secţiunea (General) (Declarations) a unui modul aţi stabilit opţiunea Option Explicit. 7. trebuie să ţineţi cont de următoarele reguli: • Trebuie să înceapă cu o literă • Poate să conţină doar litere. Atunci când alegeţi numele pentru o variabilă.3.2. Astfel. date numerice sau orice alt tip de date predefinit în Access. Acest lucru îl veţi face prin intermediul instrucţiunii Dim şi a clauzei As Type: Dim intNumar As Integer Prin linia de cod de mai sus am declarat variabila intNumăr de tip Integer. apoi îi atribuim valoarea 32.3. înainte de aputea atribui o valoare unei variabile.1 Tipul Variant Într-o variabilă de acest tip puteţi stoca text. nu numai obiecte Access 97 Folosit pentru a stoca diferite tipuri de date Stochează date de tip text ce reprezintă adrese de hiperlegături Tabelul 7. variabila noastră conţine şirul de Pag. trebuie să declaraţi variabila. În cea de-a 3-a linie de cod am folosit caracterul & pentru a concatena 32 cu un şir de caractere. o puteţi face ulterior folosind tipul de date Variant. 103 . cu alte cuvinte. trebuie să-I indicaţi lui Access două lucruri: numele variabilei şi tipul datelor pe care aceasta le va stoca. Spre exemplu: Dim varOrice As Variant VarOrice = 32 VarOrice = varOrice & “ este un numar intreg” În prima linie de cod declarăm variabila varOrice ca fiind de tipul Variant.

Atunci când lucraţi cu variabile de tipul Variant. se va efectua o adunare. Acelaşi efect îl vor avea şi următoarele linii de cod: varOrice = 2.caractere “32 este un numar intreg”.5” varOrice = varOrice + 10 Cea de-a doua linie de cod va face ca valoarea lui varOrice să fie 12. 104 . • Dacă una este o valoare numerică şi cealaltă este un şir de caractere. • Atunci când doriţi să concatenaţi două şiruri de caractere. • Dacă ambele conţin şiruri de caractere.5 varOrice = varOrice + “10” De această dată. folosiţi operatorul & în loc de +.5. Access a făcut implicit conversia de la tipul întreg la şir de caractere. şirul “10” va fi convertit la numărul întreg 10. prin conversia şirului de caractere “2. va rezulta o eroare.5. ele vor fi concatenate. Dacă nu reuşeşte. Access va încerca s-o convertească în valoare numerică şi să facă adunarea. este bine să ştiţi următoarele: • Access va converti variabila la tipul de date corespunzător valorii atribuite. Aceasta va returna una dintre valorile prezentate în tabelul 7. Pentru a determina ce tip de date conţine o variabilă de tip Variant la un moment dat. apelaţi la funcţia predefinită VarType. Valoarea returnată 0 1 2 3 4 5 Tipul de date vid (variabila este neiniţializată) Null Integer Long Single Double Constanta intrinsecă vbEmpty vbNull vbInteger vbLong vbSingle vbDouble Pag.5” la numărul real 2.3. Iată un alt exemplu: varOrice = “2. Când folosiţi operatorul + pentru lucrul cu variabile de tip Variant. Access va acţiona astfel: • Dacă ambele valori sunt numerice.

O altă valoare specială pe care o poate avea o variabilă de tip Variant este Null (dacă veţi încerca să atribuiţi valoarea Null unei variabile de orice alt tip decât Variant. nu li se atribuie la declarare nici o valoare. Despre constante intrinseci vom vorbi în secţiunea 7. cu alte cuvinte sunt “vide” (a nu se confunda aceasta cu valoarea 0 sau “ “ şi nici cu valoarea Null). Dacă folosiţi valoarea Null într-o expresie.3 vbCurrency vbDate vbString vbObject vbError vbBoolean vbVariant vbDataObject vbDecimal vbByte vbArray Notă: În ultima coloană a tabelului am specificat constanta intrinsecă ce corespunde valorii returnate. veţi obţine o eroare). care returnează valoarea True dacăn variabila este “vidă”. Aceste variabile rămân vide până în momentul când li se atribuie o valoare. Atunci când o variabilă este declarată. De exemplu: Pag. ei i se atribuie valoarea iniţială 0 dacă variabila e de tip numeric sau “ “ (şirul vid) dacă e de tip şir de caractere.6 7 8 9 10 11 12 13 14 17 8192 Currency Date String Object eroare Boolean Variant (numai pentru matrice) obiect DAO Decimal Byte matrice Tabelul 7. Variabilelor de tip Variant însă. caracterul apostrof (‘) introduce un comentariu într-un modul. Puteţi testa dacă o variabilă de tip Variant a fost sau nu iniţializată cu ajutorul funcţiei IsEmpty. Pentru a “vida” din nou o variabilă. întreaga expresie va avea valoarea Null. trebuie să-i atribuiţi ca valoare o altă variabilă de tip Variant care nu a fost încă iniţializată: Dim varOrice As Variant ‘ acum varOrice este vida varOrice = 0 ‘s-a atribuit valoarea 0 variabilei If IsEmpty(varOrice) Then … ‘ am testat daca varOrice este vida (si nu este) Dim VarCeva As Variant varOrice = varCeva ‘ acum varOrice este vida din nou Notă: În Access. 105 .3.3.

Pag. 7. Este clar că acest rezultat este eronat. deoarece.14 * db1Raza * db1Raza Debug. Astfel. vom considera următoarea subrutină: Sub AriaCercului (db1Raza As Double) Dim db1Aria As Double db1Aria = 3.2. Opţiunea Option Explicit nefiind stabilită. 106 . deschideţi fereastra Debug. pentru a le putea testa). Pentru aceasta. dacă unei anumite variabile îi veţi atribui valori dintr-un câmp al unei tabele care poate conţine şi valoarea Null. apăsând butonul Debug Window de pe bara cu instrumente (fereastra Debug vă va permite să apelaţi procedurile direct. care a dus la acest rezultat eronat. Puteţi testa dacă o variabilă are valoarea Null cu ajutorul funcţiei IsNull. Deci.Print “Aria = ” & db1Aria End Sub Pentru a rula această subrutină. printre care încetinirea execuţiei aplicaţiei şi chiar posibila apariţiei a unor erori. apăsaţi pe Enter şi veţi vedea rezultatul: 0 (figura 7. db1Rsza.5 După cea de-a treia linie de cod.2 Option Explicit Să revenim acum la opţiunea Option Explicit şi să vedem ce se poate întâmpla în cazul în care nu am stabilit această opţiune în cadrul secţiunii (General) a unui modul. pe lângă faptul că nu trebuie să vă mai bateţi capul cu alegerea unui tip de date. Dacă înlocuiţi această linie cu: varOrice = varOrice & “ceva” varOrice va avea valoarea “ceva”. într-un loc.3. varOrice va avea tot valoarea Null. sunt singurul tip de variabile cărora li se poate atribui valoarea Null. şi deci nefiind necesar ca variabila să fie declarată înainte de a fi folosită.4). Variabilele de tip Variant sunt foarte utile.Dim varOrice As Variant varOrice = Null varOrice = varOrice + 2. Motivul este acela că în codul subrutinei s-a strecurat o greşeală: în loc de db1Raza am scris. Folosirea acestui tip de variabile are însă şi dezavantaje. Access a atribuit variabilei db1Raza valoarea implicită 0. acea variabilă trebuie să fie de tip Variant. Scrieţi în partea de jos a ferestrei Debug linia: Call AriaCercului (5) După aceasta. operatorul & este singurul care nu propagă valoarea Null într-o expresie.

Constantele pot fi folosite oriunde pot fi folosite şi variabilele. create cu ajutorul instrucţiunii Const.3. Prin următoarea linie de cod: Const csPi = 3. codul dumneavoastră va fi mai uşor de citit şi de întreţinut. 7.14 am definit constanta csPi.3 Constante Constantele sunt tot un fel de variabile. 107 . a cărei valoare este 3. False şi Null. • Constante intrinsece. În Access există trei tipuri de constante: • Constante simbolice.4 7. Astfel. ele pot fi folosite la definirea unor constante: Pag. Mai mult. Cu ajutorul constantelor simbolice puteţi da un nume unei valori.Fig. • Constante de sistem: True. cu deosebirea că nu le puteţi schimba valoarea.14.

Astfel.2 sunt enumerate doar câteva dintre constantele intrinsece definite în Access. Vizibilitatea unei variabile create în cadrul unei proceduri se reduce doar la acea procedură. astfel încât toate variabilele sale locale să fie statice. O procedură având specificatorul Private poate fi apelată numai din interiorul modulului în care este declarată. 7.14 Constantele intrinsece sunt constnte definite în Access. În Access 97 puteţi stabili şi vizibilitatea procedurilor. În tabelul 7. uneori. ce conţine numele constantelor ale căror valori sunt returnate de funcţia VarType. În acest caz. folosiţi cuvântul cheie Static la declararea ei.Const csMinut=60 Const csOra=csMinut * 60 Putem atribui şi tipuri de date constantelor.2 am inclus şi coloana “Constanta intrinsecă”. în timp ce o procedură cu specificatorul Public poate fi apelată din orice alt modul. Astfel. o variabilă locală a unei proceduri “trăieşte” atâta timp cât se rulează procedura respectivă şi este recreată la următorul apel al procedurii. Putem declara şi o procedură ca fiind statică. Pag. Dacă doriţi ca o variabilă locală să existe şi după terminarea procedurii. O variabilă poate fi declarată şi în afara oricărei proceduri. în cadrul secţiunii (General) (Declarations) a unui modul. În tabelul 7. Durata de viaţă a unei variabile e dată de perioada în care ea va putea conţine o valoare. astfel încât Access să le poată recunoaşte şi să putem efectua diferite operaţii cu ele: Const csPi As Double = 3. folosind cuvintele cheie Public şi Private. aceasta trebuie să fie publică. 108 . Pentru a putea apela o procedură din fereastra Debug. Variabilele publice există atâta timp cât este deschisă baza de date.3. şi din alte module) şi spunem că vizibilitatea sa este publică. putem scrie în codul nostru ori: If VarType (avrOrice) = 2 Then … Ori If VarType (avrOrice) = vbInteger Then … Rămâne la alegerea dumneavoastră care dintre liniile de mai sus este mai clară.4 Vizibilitatea şi durata de viaţă a variabilelor Vizibilitatea unei variabile este dată de porţiunea de cod în care ea poate fi folosită şi depinde de locul în care a fost declarată. ea poate fi folosită de către toate procedurile din modulul respectiv (şi.

În exemplele de proceduri pe care le-am prezentat până acum, toate variabilele erau locale şi deci valorile lor se pierdeau după terminarea rulării procedurilor în care erau declarate. În continuare, ne vom ocupa de variabilele statice şi publice. 7.3.4.1 Variabile statice Pentru ca o variabilă declarată într-o procedură să-şi păstreze valoarea şi între două apeluri ale procedurii, ea trebuie să fie declarată folosind cuvântul cheie Static, în locul lui Dim. O astfel de variabilă va fi iniţializată o singură dată: la primul apel al procedurii. Pentru a studia mai bine variabilele statice, să considerăm următorul exemplu: Sub VarStatic() Static intVar As Integer intVar = intVar + 1 Debug.Print intVar End Sub

Pag. 109

Rulaţi subrutina de mai multe ori. Rezultatele vor fi cele din figura 7.5.

Fig. 7.5 Dacă intVar nu ar fi fost declarată ca statică, subrutina ar fi tipărit de fiecare dată aceeaşi valoare: 1. Pentru ca toate variabilele unei proceduri să fie statice, folosiţi cuvântul cheie Static înaintea declaraţiei procedurii: Static Sub VarStatic() 7.3.4.2 Variabile publice Există două tipuri de variabile publice în Access: • Variabile publice în cadrul unui modul • Variabile publice în cadrul aplicaţiei Variabilele publice în cadrul unui modul se declară cu ajutorul instrucţiunii Dim la secţiunea (General) (Declarations) a modulului şi pot fi folosite de către toate procedurile modulului. Următorul exemplu foloseşte astfel de variabile. 1. La secţiunea (Declarations) a unui modul declaraţi variabila intVarModul astfel: Dim intVarModul As Integer

Pag. 110

2. Creaţi următoarele două subrutine: Sub Incrementare () intVarModul = intVarModul + 1 End Sub Şi Sub Tiparire () Debug.Print intVarModul End Sub
3. Apelaţi de mai multe ori ambele subrutine din fereastra Debug. Figura 7.6

prezintă rezultatele.

Fig. 7.6 4. Creaţi o a 3-a procedură, în acelaşi modul: Sub LocalVar() Dim intVarModul As Integer IntVarModul = 50 Debug.Print intVarModul End Sub 2. Apelaţi acum subrutina LocalVar şi apoi, din nou, pe Tiparire. În figura 7.7 puteţi vedea ce se întâmplă. LocalVar lucrează cu variabila intVarModul declarată în interiorul său fără a modifica sau a fi afectată de variabila publică intVarModul, chiar dacă acestea au acelaşi nume.
Pag. 111

Fig. 7.7 Notă: Pentru a evita confuziile este bine, totuşi, să alegeţi pentru variabilele locale nume diferite de cele ale variabilelor publice. Variabilele publice în cadrul aplicaţiei pot fi accesate din toate modulele aplicaţiei, dar pot fi declarate numai în cadrul secţiunii (General) (Declarations) a unui modul standard. Aceste variabile se declară înlocuind instrucţiunea Dim cu instrucţiunea Public: Public intVarPublic As Integer Nu puteţi declara variabile publice în cadrul procedurilor. Notă: Folosiţi variabile publice în cadrul aplicaţiei numai dacă este neapărat nevoie. Astfel vă puteţi feri de erorişi codul dumneavoastră va fi mai uşor de întreţinut şi de refolosit. Dacă veţi dori ca mai multe proceduri să folosească o anumită valoare, daţi-o ca parametru sau ca valoare de retur.

Pag. 112

7.4. Instrucţiuni de control VBA vă oferă posibilitatea de a testa în cadrul procedurilor anumite condiţii şi de a efectua operaţii diferite în funcţie de rezultatele testelor. În continuare, vom studia instrucţiunile VBA care vă permit luarea de decizii în urma unor astfel de teste. 7.4.1 Instrucţiunea If…Then Veţi folosi această instrucţiune în cazul în care veţi dori să executaţi anumite operaţii doar dacă o condiţie este adevărată. Ea are două sintaxe. Dacă instrucţiunea este folosită pe o singură linie de cod, sintaxa este: If conditie Then instructiune Altfel, dacă instrucţiunea e compusă din mai multe linii de cod: If conditie Then Instructiuni End If Cea de-a doua variantă este utilă atunci când doriţi să se execute mai multe instrucţiuni în cazul în care condiţia este adevărată. Următorul exemplu ilustrează folosirea ambelor variante ale instrucţiunii If… Then: Sub TestIfThen (strDat As String, strCautat As String) Dim strRezultat As String If strDat = “” Then strRezultat = “Sirul dat este vid” If InStr (strDat, strCautat) Then strRezultat = strCautat strRezultat = strRezultat & “ se afla in “ & strDat End If Debug.Print strRezultat End Sub Figura 7.8 prezintă două exemple de execuţie a subrutinei TestIfThen.

Pag. 113

InStr.2 Instrucţiunea If…Then…Else Pentru a specifica ce operaţii trebuie efectuate în cazul în care condiţia e falsă. care verifică dacă un şir de caractere se regăseşte în alt şir şi returnează poziţia la care apare şirul căutat în şirul sursă sau 0 dacă şirul căutat nu se regăseşte în şirul sursă. De exemplu: If InStr (strDat.4. 114 . şi falsă dacă valoarea ei este zero.8 În cadrul subrutinei TestIfThen am folosit o funcţie predefinită în Access. Orice expresie poate apărea în cadrul clauzei If.Fig 7. Dacă expresia se evaluează la ceva diferit de 0. folosiţi aceasta instrucţiune. 7. ea e considerată a fi adevărată. strCautat) Then strRezultat = strCautat & “ se afla in “ & strDat Else strRezultat = strCautat & “ nu se afla in “ & strDat Pag.

Puteţi folosi. dacă prima condiţie nu e adevărată. se execută instrucţiunea din cadrul clauzei Else. Iată un exemplu: If strDat = “” Then strRezultat = “Sirul dat este vid” ElseIf InStr(strDat.4 Instrucţiunea Select Case Atunci când trebuie să testaţi mai multe condiţii şi să efectuaţi pentru fiecare un anumit set de operaţii. se verifică cea de-a doua şi. o instrucţiune Select Case care să facă acelaşi lucru. în schimb. 7.End If 7. strCautat) Then strRezultat = strCautat & “ se afla in “ & strDat Else strRezultat = strCautat & “ nu se afla in “ & strDat End If Astfel.3 Instrucţiunea ElseIf Puteţi privi această instrucţiune ca pe un mijloc de a imbrica mai multe instrucţiuni If…Then…Else şi deci.4. Astfel. dacă nici aceasta nu e adevărată.4. folosirea instrucţiunilor ElseIf poate să devină greoaie. de a verifica mai multe condiţii. În acest mod puteţi folosi oricâte instrucţiuni EndIf. 115 . următoarele două secvenţe de cod duc la acelaşi rezultat: If intVarsta<=18 Then … ElseIf intVarsta>=19 And intVarsta<=25 Then … ElseIf intVarsta>=26 And intVarsta<=40 Then … Else … End If Şi Select Case intVarsta Case Is <=18 … Case 19 To 25 … Case 26 To 40 … Pag.

se vor executa instrucţiunile corespunzătoare şi se va ieşi din instrucţiunea Select Case.4. valoarea1. cât şi şiruri de caractere sau date. 22.Case Else … End Select Se poate observa că cea de-a doua variantă este mult mai uşor lizibilă. 21. valoarea1 este valoarea returnată în cazul în care condiţia e adevărată. Astfel. valoarea2 este valoarea returnată când condiţia e falsă. 20.5 Instrucţiunea IIf (Immediate If) Această instrucţiune este aproape echivalentă cu instrucţiunea If…Then… Else. Iată mai întâi care este sintaxa instrucţiunii IIf: IIf (conditie. în momentul în care este întâlnită o expresie adevărată. 25 … Case 26 To 40 … Case Else … End Select Existenţa clauzei Case Else în cadrul unei instrucţiuni Select Case nu este obligatorie. Expresiile clauzelor Case se testează în ordinea în care sunt date şi. 116 . Notă: Variabila testată poate conţine atât valori numerice. valoarea2) Unde: conditie este condiţia care trebuie să fie testată. Ea poate fi însă utilă în cazul în care variabila testată poate avea şi altă valoare decât cele cuprinse în clauzele Case. nemaifăcându-se apoi nici o verificare. intDeimp As Integer) As_ Double If intImpartitor = 0 Then Pag. Instrucţiunea Select Case de mai sus poate fi scrisă şi astfel: Select Case intVarsta Case Is <=18 … Case 19. 24. va fi executat numai codul corespunzător primeia dintre ele. dacă expresiile a două dintre clauzele Case sunt adevărate. Spunem “aproape” pentru că există o diferenţă în modul în care sunt executate cele două instrucţiuni. 23. 7. Să considerăm acum următoarele două funcţii: Function Impartire(intImpartitor As Integer.

foarte des întâlnite în programare. Faptul că în instrucţiunea IIf se evaluează toate argumentele. la evaluarea lui intDeimp /intImpartitor va rezulta o eroare.5 Instrucţiuni iterative Există situaţii. se execută instrucţiunea Impartire = 0 şi se iese din instrucţiunea If…Then…Else fără alte verificări. 7.Impartire = 0 Else Impartire = intDeimp /intImpartitor End If End Function Şi Function Impartire(intImpartitor As Integer. Pentru astfel de operaţii. când un anumit bloc de instrucţiuni trebuie să fie executat de mai multe ori. cele două funcţii fac acelaşi lucru. VBA vă pune la dipoziţie instrucţiunile For…Next şi Do…Loop. dar poate duce şi la erori. dacă intImpartitor = 0.5. În instrucţiunea IIf din cea de-a doua funcţie se evaluează însă toate argumentele. Diferenţa constă în faptul că în prima funcţie. dacă este îndeplinită condiţia instrucţiunii IIf. Sintaxa ei este: For contor = val_initiala To val_finala [Step pasul] … Next [contor] Unde: Pag. 0. despre care vom vorbi în continuare. 7.1 Instrucţiunea For…Next Această instrucţiune este utilă atunci când ştiţi precis câte iteraţii aveţi de efectuat. intDeimp /intImpartitor) End Function Aparent. Astfel. nu numai că încetineşte execuţia procedurii. 117 . intDeimp As Integer) As_ Double Impartire = IIf(intImpartor = 0.

118 . veţi folosi instrucţiunea Do…Loop. caz în care variabila contor va descreşte la fiecare iteraţie cu valoarea absolută a pasului. până când se egalează valoarea variabilei intTotal. • • • • For intCont = 1 To intTotal Step2 Debug.Print intCont Next În exemplul de mai sus. valoarea iniţială a contorului intCont este 1 şi la fiecare pas această valoare creşte cu două unităţi. la fiecare iteraţie se va afişa valoare lui intCont. Sunt însă şi situaţii în care un set de instrucţiuni trebuie să se execute până când sau atâta timp cât o anumită condiţie este satisfăcută.contor – este variabila care se incrementează la fiecare iteraţie val_initiala – valoarea iniţială a variabilei contor val_finala – valoarea finala a variabilei contor pasul – valoarea cu care se incrementează variabila contor la fiecare iteraţie. Valoarea implicită a pasului este 1.5. care are următoarele sintaxe: Do Until conditie bloc de instructiuni Loop Sau: Do bloc de instructiuni Loop Until conditie Sau: Do While conditie bloc de instructiuni Loop Sau: Pag.2 Instrucţiunea Do…Loop Pentru cazurile în care cunoaşteţi dinainte numărul de iteraţii ce trebuie efectuate. De asemenea. instrucţiunea For…Next este ideală. Pasul poate fi şi negativ. În astfel de cazuri. 7.

procesul iterativ se opreşte. ea se numeşte dinamică. 119 .Do bloc de instructiuni Loop While conditie Primele variante ale instrucţiunii Do…Loop execută blocul de instrucţiuni până când condiţia va deveni adevărată (adică atâta timp cât ea este falsă).5. indiferent de valoarea lui intCont. altfel. 7.Print intCont Next Dacă intStop este diferit de zero. matricea se numeşte statică. cu deosebirea că. acesta nu mai poate fi schimbat pe parcurs.1 Matrice statice După ce aţi fixat un număr de elemente la declararea matricei. Ultimele două variante execută blocul de instrucţiuni atâta timp cât condiţia e adevărată. În mod asemănător. în cazul ultimei variante.6. ştim când anume se va opri procesul iterativ. cât şi în cel al instrucţiunii Do…Loop. Matricele statice se declară astfel: Pag. VBA vă dă însă şi posibilitatea de a întrerupe acest proces la o anumită iteraţie. pentru a părăsi o subrutină sau o funcţie. De exemplu: For intCont = 1 To intTotal If intStop Then Exit For End If Debug.6 Matrice O matrice poate fi privită ca o mulţime de variabile de acelaşi tip. Deosebirea dintre ele este aceea că în cea de-a doua variantă blocul de instrucţiuni se execută cel puţin o dată. 7. cu ajutorul instrucţiunii Exit. puteţi folosi instrucţiunile Exit Sub sau Exit Function. 7.3 Întreruperea iterării Atât în cazul instrucţiunii For…Next. Dacă numărul de elemente ale matricei a fost specificat la declarare. Fiecărei variabile ce compune matricea îi corespunde un indice (un număr de ordine). blocul de instrucţiuni se execută cel puţin o dată. având aceleaşi nume şi care stochează informaţii similare.

Vor apărea întâi cinci cutii de dialog care vă vor cere să introduceţi câte un element. Static. Notă: Nu confundaţi matricele statice cu variabilele statice.Dim nume_matrice (ip To iu) As tip_de_date Unde: nume_matrice – este identificatorul (numele) matricei ip – este indicele primului element iu – este indicele ultimului element tip_de_date – este tipul datelor stocate în matrice. apoi elementele introduse vor fi afişate ca în figura 7. cu ajutorul instrucţiunilor Dim.9.Print “Primul element este “ & iMatrice(1) For i = 2 To 5 Debug. “Matrice”) Next i Debug. Private sau Public. În continuare. iar o matrice statică este o matrice al cărei număr de elemente a fost specificat la declarare. “Matrice”) For i = 2 To 5 iMatrice (i) = InputBox (“Introduceti al “ & i & ”-lea element”. asemeni variabilelor. La rândul lor. Pag.Print “All “ & i & “-lea element este “ & iMatrice(i) Next i End Sub Rulaţi subrutina (apelând-o de la fereastra Debug). 120 . matricele statice pot fi declarate. Repetăm faptul că o variabilă statică e o variabilă declarată cu ajutorul cuvântului cheie Static şi îşi păstrează valoarea şi după terminarea procedurii în care a fost declarată. vă prezentăm o subrutină ce ilustrează folosirea matricelor statice: Sub MatriceStat () Dim i As Integer Dim iMatrice (1 To 5) As Integer iMatrice (1) = InputBox (“Introduceti primul element”.

care afişează o cutie de dialog ce permite utilizatorului să introducă o valoare. Pag. pe care funcţi o returnează. 121 .9 Observaţi că am folosit funcţia predefinită InputBox.Fig 7.

Apoi. Astfel. Access va considera în mod implicit că acesta e zero. dar punând două paranteze rotunde după numerele matricei. cu ajutorul instrucţiunii ReDim. “Matrice”) For i = 2 To iTot iMatrice(1) = InputBox(“Introduceti al “ & i & “-lea element”. puteţi fixa indicii primului şi ultimului element al matricei. el poate fi orice număr întreg. pentru a afişa valorile stocate.Astfel. următoarele două declaraţii sunt echivalente: Dim iMatrice(9) As Integer şi Dim iMatrice(0 To 9) As Integer Dacă veţi dori ca indicele implicit al primului element să nu fie 0. Indici Nu este obligatoriu ca indicele primului element al unei matrici să fie 1. introduceţi la secţiunea (Declarations) a modulului următoarea linie de cod: Option Base 1 7.6. “Matrice”) Next i Debug. de exemplu: Dim iMatrice(5 To 14) As Integer este declaraţia unei matrice de 10 elemente numere întregi. În continuare. Astfel de matrice se declară tot cu ajutorul instrucţiunilor Dim. după ce fiecare element al matricei a primit câte o valoare introdusă de utilizator. puteţi să o declaraţi ca fiind dinamică. Dacă nu specificaţi indicele primului element al unei matrici. Private sau Public. vom modifica exemplul anterior astfel încât utilizatorul să poată introduce numărul de elemente ale matricei. ci un altul (1. de exemplu). 122 . matricea este parcursă cu ajutorul instrucţiunii iterative For…Next.2 Matrice dinamice Dacă nu cunoaşteţi de la început numărul de elemente pe care trebuie să le aibă o matrice. Sub MatriceDin() Dim i As Integer Dim iTot As Integer Dim iMatrice() As Integer ITot = InputBox(“Introduceti numarul total de elemente”) ReDim iMatrice(1 To iTot) iMatrice(1) = InputBox(“Introduceti primul element”.Print “Primul element este “ & iMatrice(1) Pag. Static.

Pentru a preveni acest lucru.2. puteţi folosi din nou instrucţiunea ReDim pentru a modifica aceşti indecşi (şi deci. În mod normal. dacă declarăm următoarea matrice: Dim iMatrice () As Integer … ReDim iMatrice (1 To 10) şi dorim ulterior să reducem la cinci elemente fără a pierde valorile primelor 5.6.3. 123 . VarType şi TypeName.Print “iMatrice: “ & VarType(iMatrice) End Sub Pag. Astfel. vom scrie: ReDim Preserve iMatrice (1 To 5) 7.For i = 2 To iTot Debug.Print “iNum: “ & VarType(iNum) Debug. modificând aceşti indecşi se vor pierde valorile stocate de elementele matricei. folosiţi cuvântul cheie Preserve.Print “Al “ & i & “-lea element este “ & iMatrice(i) Next i End Sub După ce aţi specificat. cu ajutorul instrucţiunii ReDim. indecşii primului şi ultimului element al matricei.3 Detectarea matricelor Există trei funcţii care ne ajută să aflăm dacă o variabilă este simplă sau este o matrice: IsArray. unde am dat şi tabelul cu valorile pe care aceasta le poate returna. dacă variabila dată ca argument funcţiei VarType este o matrice. Funcţia IsArray returnează valoarea True dacă variabila care îi este dată drept argument este o matrice şi False dacă nu. Sub TestMatrice() Dim iNum As Integer Dim iMatrice (1 To 10) As Integer Debug. Aţi putut observa în acel tabel că unei variabile de tip matrice îi corespunde valoarea de retur 8192 (sau constanta intrinsecă vbArray). funcţia va avea ca valoare de retur 8192 plus valoarea corespunzătoare tipului variabilelor ce compun matricea. Astfel. Despre funcţia VarType am mai vorbit şi în secţiunea 7. dimensiunea totală a matricei).

Print “iNum: “ & TypeName (iNum) Debug. adică 8192 pentru matrice. ca în figura 7. ea returnează chiar numele tipului respectiv. Spre exemplu. în fereastra Debug vor apărea valorile 2 şi 8194. cu diferenţa că în locul valorii corespunzătoare unui tip de date. plus 2 pentru tipul Integer (care e tipul elementelor matricei). Funcţia TypeName se aseamănă cu VarType. Pag.Dacă veţi rula subrutina Test Matrice.Print “iMatrice: “ & TypeName (iMatrice) End Sub va da rezultatele din figura 7. funcţia VarType a returnat valoarea 8194. Fig 7.11.10.10 Observaţi că pentru variabila iMatrice. 124 . următoarea subrutină: Sub TestMatrice1 () Dim iNum As Integer Dim iMatrice (1 To 10) As Integer Debug.

numărul maxim de dimensiuni ale unei matrici este 60. matricele multidimensionale pot fi declarate ca fiind dinamice. scrieţi: Dim iMatrice(1 To 2.6.6.Figura 7. 2 ) As Integer Notă: Teoretic. deoarece ar fi foarte greu de lucrat cu ele. Practic. pentru ca numărul dimensiunilor şi marginile fiecărei dimensiuni să poată fi stabilite ulterior. 125 .11 7. însă nu veţi folosi matrice cu mai mult de patru dimensiuni. Pentru a declara o matrice multidimensională. 7.1 Matrice multidimensionale dinamice Ca şi cele unidimensionale. Astfel.4 Matrice multidimensionale Până acum am vorbit numai despre matrice unidimensionale.4. pentru a declara o matrice bidimensională cu 6 elemente şi cu indicii începând de la 1. pentru o matrice de aceeaşi dimensiune dar cu indicii începând de la 0 (presupunând că nu s-a specificat opţiunea Option Base 1): Dim iMatrice(1. separate prin virgulă. trei sau mai multe dimensiuni. trebuie să specificaţi marginile inferioare şi superioare ale indicilor pentru fiecare dimensiune. Sintaxa este următoarea: Pag. 1 To 3) As Integer sau. Matricele pot avea însă şi două. numite şi vectori.

Print i & “ + “ & j & “ = “ & iMat(i. j) Pag. Sub Matrice() Dim i As Integer Dim j As Integer ‘ crearea matricei dinamice Dim iMat() As Integer ‘ redimensionarea matricei ReDim iMat(1 To 2. Următoarea subrutină declară o matrice bidimensională şi o umple cu anumite valori.Dim iMatrice() As Integer … ReDim iMatrice(1 To 2. 2) O astfel de matrice are 2x3 = 6 elemente. pe care apoi le afişează. j) = i+j Next Next For i = 1 To 2 For j = 1 To 3 Debug. 3) matricea va fi tridimensională şi va conţine2x3x4=24 de elemente. Fiecărui element al matricii îi vom da ca valoare suma indicilor care îi corespund.6. pentru ca indicii matricei să înceapă de la 0: Dim iMatrice() As Integer … ReDim iMatrice(1. 2. 7.2 Accesarea componentelor unei matrice multidimensionale Pentru a accesa un element al unei matrice multidimensionale. trebuie să specificaţi indicii corespunzători fiecărei dimensiuni a matricei.4. prin instrucţiunea următoare: ReDim iMatrice(1. Similar. ce caracterizează elementul respectiv. 1 To 3) For i = 1 To 2 For j = 1 To 3 iMat (i. 126 . 1 To 3) Sau.

matricea iMatrice (1. plus câte 4 octeţi pentru fiecare dimensiune. veţi obţine rezultatele din figura 7. 3) ocupă în memorie: 20 octeţi + 3x4 octeţi + (2x3x4)x2 octeţi = 80 octeţi. Astfel.12.5 Ştergerea matricelor dinamice O matrice ocupă în memorie 20 de octeţi. 2.Next Next End Sub Rulând subrutina de mai sus. plus numărul de octeţi necesari datelor stocate.12 7. 7. adică numărul de elemente ale matricei înmulţit cu numărul de octeţi ocupaţi de tipul respectiv de date. Pag. Fig.6. 127 .

• Matricele de parametri pot fi numai de tipul Variant. veţi obţine rezultatul 3.6. Iată trei lucruri esenţiale pe care trebuie să le aveţi în vedere când lucraţi cu parametri de tip matrice: • Pentru a declara o matrice ca parametru al unei proceduri. fără să elibereze memoria ocupată de acestea.Pentru a elibera memoria ocupată de o matrice dinamică. • Un parametru de tip matrice poate apărea doar pe ultima poziţie în lista de parametri ai unei proceduri. puteţi folosi instrucţiunea Erase astfel: Erase iMatrice Folosită pentru matrice statice.6 Folosirea matricelor ca parametri pentru proceduri Access vă permite să daţi şi matrice ca parametri funcţiilor şi subrutinelor. următoarea funcţie calculează media aritmetică a numerelor ce îi sunt date ca parametri: Function Media (ParamArray aNum() ) As Double Dim valCrt Dim dblSuma As Double For Each valCrt In aNum dblSuma = dblSuma + valCrt Next Media = dblSuma / (UnBound (aNum) + 1) End Function Dacă în fereastra Debug scrieţi: ?Media (1. instrucţiunea Erase le va reiniţializa.5) şi apăsaţi tasta Enter. 128 . pe care o împarte apoi la numărul total de elemente. Pag. Notă: Indicii matricelor de parametri încep întotdeauna de la zero. precedaţi-o cu cuvântul cheie ParamArray. indiferent dacă în modulul ce conţine procedura aţi specificat sau nu opţiunea Option Base 1. De exemplu.3.2.4. Un paametru-matrice (sau matrice de parametri) vă dă posibilitatea de a crea proceduri cu un număr variabil de parametri. 7. Funcţia Media calculează întâi suma tuturor elementelor matricei de parametri.

Dar ce este. Dacă funcţia returnează o valoare. Printr-o astfel de declaraţie. incluzând practic o declarare a funcţiei la secţiunea (General) (Declarations) a modului în care se face apelul. VBA primeşte şase informaţii: • Domeniul de vizibilitate al funcţiei. numărul total de elemente este Ubound(aNum) + 1. un DLL? Este un fişier sursă ce conţine un număr mare de funcţii (o bibliotecă de funcţii). Aceste funcţii formează ceea ce poartă numele de Windows API (prescurtarea API vine de la Application Programming Interface. 7. Indiferent de numărul aplicaţiilor ce apelează funcţii dintr-un DLL la un moment dat. Programatorul poate folosi o funcţie DLL într-un program de-al său fără ca acel program să conţină o copie a funcţiei respective. 7. • Tipul valorii returnate (dacă aceasta există).7 Lucrul cu biblioteci DLL şi cu funcţii Windows API Vom vorbi în continuare despre una dintre cele mai importante facilităţi oferite de VBA: posibilitatea de a apela un DLL (Dynamic Link Library) dintr-o procedură VBA. aşa cum este ea definită în DLL.Funcţia predefinită Ubound returnează valoarea celui mai mare indice al unei matrice. adică interfaţa de programare a aplicaţiilor Windows). Windows vine cu mai multe biblioteci DLL. prima oară când s-a apelat o funcţie din el. Cum indicii matricei de parametri aNum încep de la 0. şi anume. ce conţin sute de funcţii utile pentru programatori. • Numele şi tipul argumentelor. 129 . • Numele şi calea bibliotecii DLL care o conţine. biblioteca DLL se încarcă în memorie o singură dată.1 Declararea funcţiilor API Înainte de a putea apela o funcţie dintr-un DLL. • Numele funcţiei. biblioteca DLL este descărcată din memorie. după ce aplicaţiile nu mai au nevoie de funcţiile sale. de fapt. • Numele pe care îl veţi folosi în codul dumneavoastră pentru a apela funcţia. trebuie să-I daţi indicaţii lui Access unde se află funcţia şi cum anume să o apeleze. Apoi. Astfel. Acest lucru îl realizaţi cu ajutorul instrucţiunii Declare.7. puteţi realiza mai mult decât vă permit funcţiile predefinite şi instrucţiunile VBA: puteţi controla sistemul de operare Windows. sintaxa instrucţiunii Declare este: [Public | Private] Declare Function denumireaFunctiei_ Lib “numeleBibliotecii” [Alias “numeleDinDLLAlFunctiei”]_ Pag.

în directorul Windows. 3. funcţia API nu va fi apelată decât din modulul în care a fost declarată. puteţi omite extensia .7. între ghilimele. în directorul Windows\System.7. în directorul curent. dacă aţi specificat o altă denumire pentru funcţie decât cea dată în DLL. denumirea trebuie să fie exact aceeaşi cu acest nume din DLL. Windows îl va căuta în ordine: 1. Astfel.DLL (de exemplu. 7. să conţină numai caractere alfanumerice sau caracterul underscore(_). Astfel. “User32”. puteţi stabili vizibilitatea funcţiilor declarate prin intermediul instrucţiunii Declare.[([argumente])] [As tip] iar dacă funcţia nu returnează nici o valoare: [Public | Private] Declare Sub denumireaFunctiei_ Lib “numeleBibliotecii” [Alias “numeleDinDLLAlFunctiei”]_ [([argumente])] 7. Această denumire trebuie să respecte regulile impuse pentru orice procedură VBA: să înceapă cu o literă. 5. 2. numele bibliotecii DLL şi. Dacă nu folosiţi clauza Alias pentru a specifica numele din DLL al funcţiei.1 Domeniul de vizibilitate al funcţiei API Ca şi în cazul unei proceduri VBA obişnuite. în directorul în care se află Access. funcţia va putea fi apelată din orice modul.1. eventual.7. 130 . 7. 6. să fie unicîn cadrul domeniului său de vizibilitate. Dacă nu specificaţi calea completă pentru DLL. 4.1.3 Specificarea bibliotecii DLL În cadrul clauzei Lib a instrucţiunii Declare trebuie să specificaţi.1.2 Denumirea funcţiei API În cadrul instrucţiunii Declare trebuie să specificaţi şi denumirea pe care o veţi folosi în codul dumneavoastră pentru a apela funcţia API respectivă. 7.4 Clauza Alias Clauza Alias a instrucţiunii Declare că permite să schimbaţi numele unei funcţii API din cel specificat în DLL într-unul permis în VBA. trebuie să includeţi în Pag. locaţia sa pe disc. dacă instrucţiunea Declare e precedată de cuvântul cheie Private. “GDI32” sau “Kernel32”). numai pentru Windows NT: în directorul Windows\System32. să conţină maximum 255 de caractere şi să nu fie un cuvânt cheie VBA.1. Dacă biblioteca DLL este una dintre principalele biblioteci DLL din Windows.7. Dacă folosiţi cuvântul cheie Public (care e şi implicit). în directoarele din PATH.

1. pentru a declara funcţia API_lwrite(). Access dă unei proceduri. Dacă însă funcţia primeşte adresa de memorie a variabilei.5 Argumente În mod implicit. În acest caz. care să conţină numele exact al funcţiei. trebuie să daţi şi dumneavoastră acestor funcţii. ByVal intBytes_ As Integer) As Integer Astfel. Acest fapt poate duce la blocarea aplicaţiei şi chiar a sistemului. trebuie să vă asiguraţi că şirul pe care-l daţi funcţiei ca Pag. 131 .instrucţiunea Declare şi clauza Alias. pointeri la adresa de memorie a variabilelor şi nu valorile explicite ale acestora.7. trebuie întâi să-l transformaţi într-un şir de caractere ce se termină cu ‘\0’. suprascriind caracterul ‘\0’ şi ocupând în continuare locaţii de memorie adiacente. De exemplu. Dacă o funcţie dintr-un DLL primeşte ca argument valoarea unei variabile. VBA nu lucrează cu astfel de şiruri de caractere. ca argumente. el se aplică totuşi şirurilor în VBA. Ea scrie noul şir la adresa respectivă. ea nu va putea modifica efectiv această valoare. VBA îl converteşte într-un şir terminat cu ‘\0’ şi apoi îi dă funcţiei API respective un pointer la adresa de memorie a şirului. Tot cuvântul cheie ByVal vă ajută şi de această dată. De aceea. Pentru a-l evita. dacă folosiţi acest cuvânt cheie pentru un argument de tip String. tot valori şi acest lucru îl realizaţi plasând cuvântul cheie ByVal în faţa numelor argumentelor funcţiei din cadrul instrucţiunii Declare: Declare Function GetSystemMetrics Lib “user32” (ByVal nIndex_ As Long) As Long Şiruri de caractere ca argumente Multe funcţii API primesc ca argumente şiruri de caractere ce se termină cu caracterul ‘\0’ (al cărui cod ASCII este 0). pentru a apela în codul dumneavoastră funcţia_lwrite() din Kernel32. Cu toate acestea. veţi folosi denumirea lwrite(). pentru a putea da un şir VBA ca argument unei funcţii dintr-un DLL. Dacă funcţia din DLL modifică valoarea şirului de caractere primit ca argument şi noua valoare conţine mai multe caractere. atunci ea îi poate modifica valoarea.DLL. Cum aceasta se întâmplă şi în cazul şirurilor de caractere. trebuie să folosiţi un alias. 7. ca argumente. pot apărea probleme. multe funcţii API aşteaptă să primească drept argumente valorile variabilelor şi nu pointeri la adresele lor. deoarece în VBA numele funcţiilor nu pot începe cu caracterul underscore(_): Declare Function lwrite Lib “Kernel32” Alias “_lwrite” _ (ByVal hFile As Integer. Deşi acest fapt vine în contradicţie cu ce am spus până acum. ByVal lpBuffer As String. funcţia nu modifică şi dimensiunea şirului. Astfel.

HACCEL.13 arată corespondenţele dintre tipurile date din limbajul C şi tipurile VBA. HRSRC. suficient de mare: Dim strSir As String* 255 Matrice ca argumente Puteţi da ca argumente unei funcţii API elementele unei matrici aşa cum i-aţi da orice altă variabilă. pur şi simplu daţi funcţiei ca argument primul element al matricei. HPALETTE. HFILE. HTASK.argument este suficient de mare pentru a putea păstra valorile pe care aceasta i le va atribui. HRGN. HMETAFILE. este suficient ca funcţia să ştie unde începe matricea şi dimensiunea ei. Transformarea tipurilor de date ale argumentelor Deoarece majoritatea bibliotecilor DLL sun scrise în C sau C++. LRESULT Char*. HGLOBAL. Tabelul 7. HICON. HINSTANCE. HANDLE. BOOL. adică un mod de a grupa variabile de tipuri diferite şi care împreună definesc un nou concept. HLOCAL. HBRUSH. HBITMAP. Pentru a face acest lucru. DWORD. HMENU. 132 . LPSTR. HMODULE. UINT. De aceea. LPARAM. int. FARPROC. Tip de date în C ATOM. Acestea se numesc tipuri de date definite de utilizator sau tipuri-utilizator. LPCSTR Tabelul 7. Un tip-utilizator poate fi o structură în C. e necesar să folosim în instrucţiunea Declare tipul de date VBA corespunzător tipului C al argumentului funcţiei din DLL. WORD. Deoarece elementele unei matrice se află la locaţii consecutive de memorie. Nu puteţi da ca argument unei funcţii dintr-un DLL. Una dintre structurile cel mai des Pag. WPARAM int FAR*. LONG. Funcţia va şti să regăsească şi celelalte elemente. Puteţi folosi în acest scop un şir de caractere de lungime fixă. HWND. HPEN.13 Corespondent în VBA ByVal i As Integer i As Integer ByVal byt As Byte byt As Byte ByVal adr As Long ByVal str As String Tipuri-utilizator Multe funcţii API primesc argumente ce au ca tip de date alte tipuri decât cele predefinite. UINT FAR* BYTE BYTE* CALLBACK. tipurile de date ale argumentelor funcţiilor pe care acestea le conţin nu sunt aceleaşi cu tipurile de date VBA.

De exemplu. Dacă primeşte ca argument pointerul nul. sistemul să se blocheze şi să pierdeţi informaţiile nesalvate. de sus a ecranului. deoarece este posibil ca. atunci cursorul va fi capturat în dreptunghiul definit de acea variabilă. Argumentele ce au ca tip de date un tip-utilizator sunt date prin referinţă (adică prin intermediul unui pointer la adresa din memorie a unei variabile de acel tip).folosite în bibliotecile DLL este structura RECT. Tipul Any este folosit pentru a dezactiva mecanismul Access de verificare a corespondenţei dintre tipurile argumentelor din declaraţia unei funcţii şi tipurile argumentelor efective. respectiv. care în VBA este dat ca: ByVal 0& unde caracterul & arată faptul că pointerul este pe 32 de biţi (adică Long). din cauza unor erori generate de aceste funcţii. 133 . Pag. ce reprezintă un dreptunghi prin distanţele laturilor sale faţă de marginea din stânga şi. Type RECT left As Long top As Long right As Long bottom As Long End Type este tipul VBA corespunzător structurii RECT în C. Observaţi faptul că pointerul nul trebuie dat ca argument prin valoare. funcţia API ClipCursor (pe care o vom folosi în Exemplul 2) are argumentul: lpRect As Any Dacă ea primeşte ca argument un pointer la o variabilă de tip RECT. Este de asemenea bine să salvaţi orice alte informaţii din alte aplicaţii Windows deschise. este bine să faceţi regulat copii ale bazei de date. ea eliberează cursorul. Pointeri nuli Există şi cazuri când o funcţie API aşteaptă ca argument pointerul nul. Notă: Atunci când lucraţi cu funcţii DLL. astfel încât funcţia poate primi orice tip de date pentru un argument de tip Any.

o casă. cum ar fi: titlul (Caption). jocuri orientate obiectual. dacă apăsaţi butonul Minimize din bara de titlu. Caracteristica cea mai importantă a obiectelor este aceea că ele conţin toate informaţiile necesare pentru a funcţiona.CAP:8. în Access 97 un formular are şi el o mulţime de proprietăţi. programare obiectuală în proiectare. sisteme de gestiune a bazelor de date orientate pe obiecte. vom explica termenii cheie ce apar atunci când vorbim de obiecte. un formular este un obiect. Aşa cum o maşină se caracterizează prin marcă. O maşină. Proprietăţile unui obiect pot fi modificate fie cu ajutorul paginii de proprietăţi în modul Design View. peste tot. de unde rezultă şi creşterea complexităţii şi calităţii aplicaţiilor. În continuare. filtrul (Filter) etc. culoare şi o groază de caracteristici tehnice. • Posibilitatea de a accesa date stocate pe platforme şi sisteme diferite. formularul se închide. fie prin intermediul limbajului VBA. Şi toate acestea se datorează avantajelor pe care aceasta le oferă faţă de limbajele procedurale tradiţionale: • Eficienţă mai mare datorată posibilităţii de a refolosi cantităţi însemnate de cod din alte aplicaţii. Metode Metodele reprezintă modul în care un obiect efectuează diferite acţiuni. • Posibilitatea de a oferi utilizatorilor metode grafice intuitive şi prietenoase de comunicare cu sistemul. De exemplu. în Access 97 obiectul bază de date (Database) are o metodă pentru a crea un nou set de înregistrări (OpenRecordset). Pag. În Access 97. El ştie tot ce trebuie pentru a-şi face datoria. model. numai programare obiectuală. dacă apăsaţi butonul Cnacel. Aşa cum o maşină ştie ce metodă să aplice pentru a frâna atunci când şoferul apasă pedala de frână. un calculator – toate acestea sunt obiecte. 134 . care la rândul lor conţin diferite părţi componente – obiecte şi ele. formularul se minimizează etc. Lucrul cu obiecte Unul dintre motivele principale ale apariţiei programării orientate pe obiecte este nevoia de a modela cât mai bine fenomenele şi entităţile din lumea înconjurătoare. Proprietăţi Toate obiectele au ca proprietăţi ce le caracterizează. Astăzi întâlnim obiecte în mai toate domeniile programării: programare obiectuală sistem.

Clase O clasă reprezintă mulţimea tuturor obiectelor care au aceleaşi proprietăţi şi metode.2. pe scurt. 8. Obiect Access Application Control DoCmd Debug Form Module Report Screen Section Pages References Tabelul 8. Un obiect al unei clase poartă numele de instanţă a clasei respective.1 Obiect DAO Container Database DBEngine Document Error Group Index Parameter Property QueryDef Recordset Descriere Obiectul Microsoft Access Un control de pe un formular sau raport Acţiuni în VBA Fereastra Debug Un formular sau subformular deschis Un modul Un raport sau subraport deschis Ecranul O secţiune a unui formular sau raport Paginile unui control Referinţe la alte biblioteci de obiecte Descriere Un obiect care conţine informaţii despre alte obiecte O bază de date deschisă Motorul bazei de date Informaţii pe care motorul bazei de date le administrează. DAO).1) şi obiecte pentru accesarea datelor (Data Access Objects sau. prezentate în tabelul 8. 135 . pe lângă acestea. ce le particularizează. O clasă poate avea mai multe subclase (sau clase derivate) care moştenesc proprietăţile şi metodele clasei de bază dar. despre alte obiecte Erori generate de accesarea datelor Un cont al unui grup de utilizatori Un index pe o tabelă Un parametru al unei interogări Proprietatea unui obiect O interogare salvată Un set de înregistrări definit de o tabelă sau interogare Pag.1 Obiectele din Access 97 În Access există două seturi de obiecte: obiectele Access generale (prezentate în tabelul 8. mai au şi propriile lor proprietăţi şi metode.

acestea vor forma colecţia Forms (formulare) a obiectului respectiv. vom vorbi mai pe larg despre obiectele DAO şi despre cum se folosesc ele. dacă un obiect conţine mai multe formulare. Colecţiile pot fi formate numai din obiectele aceleiaşi clase. Figura 8.1. iar tabelele. Obiectele care sunt conţinute într-un alt obiect sunt grupate în colecţii.3 Pag. Astfel. alte obiecte. Figura 8. În mod asemănător. la rândul său. 8. 136 . câmpuri. O colecţie poate fi deci considerată ca fiind un vector. formularele conţin controale.3 prezintă obiectele DAO sub forma unei diagrame ierarhice ce arată legăturile dintre obiecte şi colecţiile lor.Relation TableDef User Workspace O relaţie între două tabele sau interogări O tabelă salvată Contul unui utilizator O sesiune de lucru cu o bază de date Tabelul 8.2 În continuare.2 aţi văzut că o bază de date este un obiect care conţine.1 Colecţii În tabelul 8.

Să coborâm pe o treaptă inferioară a ierarhiei. Databases(0) . Astfel. de fapt. Aproape toate acţiunile dumneavoastră sunt procesate de motorul DBEngine şi sunt efectuate asupra unui obiect DAO. De aceea.Name Pag. cerând numele bazei de date curente. Prin linia de cod scrisă mai sus aţi cerut numele unei sesiuni de lucru. conţine două colecţii: Workspaces şi Errors. Deschideţi fereastra Debug şi scrieţi în ea: ?DBEngine.Name înseamnă “proprietatea Name (nume) a elementului cu indicele 0 al colecţiei Workspaces a obiectului DBEngine”.Workspaces(0).Workspaces(0) .Workspaces(0).În vârful ierarhiei se află DBEngine (motorul bazei de date). Pentru aceasta. Creaţi un nou modul standard în baza de date curentă (Cursuri Optionale. o matrice ale cărei elemente sunt obiecte de tip Workspace. 2. clădirea fiind motorul DBEngine.mdb). Colecţia Workspaces este. Obiectul DBEngine. este foarte important să înţelegeţi ce sunt obiectele pentru accesarea datelor şi care sunt relaţiile dintre ele. care se află în vârful ierarhiei DAO. 137 .Name După ce aţi apăsat tasta Enter. În Workspace este ca un birou al unei clădiri. vom folosi în continuare fereastra Debug care ne va ajuta să vedem obiectele stocate în baza noastră de date şi cum sunt ele organizate în ierarhia DAO. Colecţia Errors conţine o listă cu erorile apărute în DBEngine. introduceţi în fereastra Debug: ?DBEngine. Pentru aceasta. 1. veţi primi următorul rezultat: #Default Workspace# (adică sesiunea de lucru implicită). El conţine două colecţii: Errors şi Workspaces (erori şi sesiuni de lucru). DBEngine.

în ordine alfabetică: Curs. Fiecare obiect de tip Workspace conţine trei colecţii: Users (utilizatori). rezultatul va fi calea completă şi numele fişierului în care se află baza de date curentă. După ce apăsaţi pe Enter. Mai coborâm o treaptă a ierarhiei şi cerem numele unui obiect al unei colecţii a obiectului. DBEngine. şi anume: ?DBEngine.Databases(0). Dacă înlocuiţi TableDefs(0) cu TableDefs(3). Gorups (grupuri) şi Databases (baze de date) care.Workspaces(0) .După ce apăsaţi tasta Enter. veţi obţine un rezultat mai neobişnuit: MSysACEs. Curs. Aceasta deoarece tabelele sunt stocate în ordine alfabetică în cadrul matricei TableDefs. şi anume. rezultatul va fi numele unei tabele din baza de date curentă.Name TableDefs(0) e obiectul cu indicele 0 din matricea TableDefs (tabele salvate). Curs_Prof şi Curs_Student).Databases(0). astfel încât tabelei sistem MSysACEs (folosită de Access) îi corespunde indicele 3 (primele trei tabele sunt. la rândul lor pot fi privite ca matrice (vectori). Prin linia de cod de mai sus aţi cerut. 138 .Workspaces(0).TableDefs(0). 3. Pag. aşadar numele obiectului de tip Database cu indicele 0 din cadrul colecţiei Databases a obiectului Workspaces(0) al obiectului DBEngine.

În continuare. Continuând ca mai sus. proprietăţii Name(nume) a acestui obiect i se dă valoarea #Default Workspace#. Există un singur obiect DBEngine pentru o aplicaţie. adăugaţi automat o bază de date la colecţia Database a sesiunii respective. Colecţia Databases (Baze de date) Un obiect de tip Database reprezintă o bază de date deschisă sau creată cu DAO. Notă: E important să sesizaţi diferenţa dintre o colecţie şi tipul elementelor ce o compun. Colecţia Databases conţine toate bazele de date deschise DAO. Spre exemplu. pentru a înregistra baze de date ODBC. O bază de date poate fi închisă cu ajutorul metodei Close. 139 . ne vom ocupa în detaliu cu obiectele şi colecţiile ierarhiei DAO.Workspaces(0). Obiectul DBEngine (motorul Jet Engine) Este obiectul aflat în vârful ierarhiei DAO. Tranzacţiile efectuate în cadrul unei sesiuni (obiect de tip Workspace) sunt globale tuturor bazelor de date ale sesiunii respective. pentru a obţine versiunea motorului Jet şi pentru a stabili timpul maxim necesar deschiderii sesiunii unui utilizator. Acest obiect conţine toate bazele de date deschise de acel utilizator. Cu ajutorul metodei CreateDatabase a unui obiect Workspace. Acest obiect implicit nu poate fi şters sau închis şi este deci disponibil tot timpul. Erorile sunt ordonate în cadrul colecţiei în funcţie de codul lor. Pag. iar Workspace (la singular) este tipul elementelor pe care ea le conţine. El poate fi folosit pentru a compacta sau repara o bază de date. Workspaces (la plural) este numele colecţiei. plus baza de date curentă. deschisă în Access (care este obiectul DBEngine. puteţi găsi informaţii despre toate obiectele stocate într-o bază de date. Access creează implicit obiectul Workspaces(0). iar proprietăţii UserName(numele utilizatorului) i se dă valoarea Admin(administrator). Databases(0) sau CurrentDB). ceea ce o va şterge din cadrul colecţiei. Colecţia Workspaces (Sesiuni de lucru) Un obiect de tip Workspace defineşte o sesiune de lucru pentru un utilizator.Observaţi că între obiectele de pe trepte consecutive ale ierarhiei şi între obiecte şi proprietăţile lor se pune un punct. este un obiect predefinit ce nu poate fi creat. Dacă nu au fost impuse măsuri de securitate asupra bazei de date curente. Colecţia Errors (Erori) Un obiect de tip Error primeşte toate erorile apărute în urma eşuării unei acţiuni efectuate asupra unui obiect DAO. El nu face parte din nici o colecţie şi conţine toate celelalte obiecte.

Fiecare utilizator dintr-un grup e reprezentat printr-un obiect de tip User din colecţia Users a grupului. conturi şi grupuri. Obiectele de tip Relation (relaţie). Obiectele de tip QueryDef sunt deci instrucţiuni SQL precompilate. Cu ajutorul unui obiect de tip QueryDef puteţi crea seturi de înregistrări. QueryDef şi Index conţin câte o colecţie Fields. Colecţia Recordsets (Seturi de înregistrări) Obiectele de tip Recordset (set de înregistrări) sunt cel mai des folosite şi deci.Colecţia Users (Utilizatori) Un obiect de tip User reprezintă contul unui utilizator. poate. puteţi afla dacă returnează sau nu înregistrări sau puteţi executa interogarea. Aceste obiecte sunt temporare (nu sunt salvate pe disc). cele mai importante obiecte DAO. Cu ajutorul unui obiect de tip TableDef puteţi afla dacă tabela e ataşată. Atributele unui câmp pot fi aflate şi modificate prin intermediul proprietăţilor obiectului Field corespunzător. Colecţia Groups (Grupuri) Un obiect de tip Group (grup) reprezintă grupuri de utilizatori şi drepturile acestora. Tabela se poate afla în baza de date curentă sau poate fi ataşată dintr-o bază de date externă. dacă poate fi sau nu actualizată sau numărul de înregistrări. Recorset. Colecţia QueryDefs (Interogări) Fiecare interogare salvată în Access sau creată cu ajutorul metodei CreateQueryDef este reprezentată printr-un obiect de tip QueryDef din colecţia QueryDefs. 140 . îi puteţi regăsi instrucţiunea SQL. TableDef. Vom reveni cum mai multe detalii despre utilizatori. Pag. Colecţia Fields (Câmpuri) Un obiect de tip Field reprezintă o coloană. Colecţia TableDefs (Tabele) Un obiect de tip TableDef reprezintă o tabelă stocată într-o bază de date. Colecţia Indexes (Indecşi) Un obiect de tip index reprezintă un index al unei tabele sau al unui set de înregistrări. îi puteţi afla regulile de validare. când vom vorbi despre aplicaţii multiuser şi securitate.

Fiecare obiect DAO are o colecţie Properties. vom scrie o subrutină care le va afişa pe ecran. tabele. proprietăţile predefinite nu pot fi şterse.Name Next Next End Sub Pag. Colecţia Parameters a unui obiect de tip QueryDef e formată din toţi parametri formali definiţi pentru interogarea respectivă. Parametrii declaraţi cu ajutorul cuvântului cheie PARAMETERS în instrucţiunea SQL a unei interogări se numesc parametri formali. Termenul “document” este o descriere generică pentru un obiect stocat într-un container. relaţii. Fiecare pagină a acestei ferestre reprezintă un container. Colecţia Properties (Proprietăţi) Un obiect de tip Property reprezintă o caracteristică a unui obiect.mdb”. Colecţia Relations a unui obiect de tip Database conţine toate relaţiile definite în baza de ate respectivă.Print “Container: “ & conCrt. Un obiect de tip Properties poate fi o proprietate predefinită sau una definită de utilizator. module. rapoarte.Name For Each docCrt In conCrt. Colecţia Parameters (Parametri) Aţi văzut că în Access puteţi crea interogări cu parametri.Colecţia Relations (Relaţii) Fiecare relaţie dintre două sau mai multe tabele ale unei baze de date Access e reprezentată printr-un obiect de tip Relation.1. Sub Containere_Documente() Dim dbCrt As Database Dim conCrt As Container Dim docCrt As Document Set dbCrt = DBEngine. formulare. iar fiecare obiect dintr-o pagină este un document.Print “Document: “ & docCrt. Proprietăţile definite de utilizator sunt singurele care pot fi şterse din colecţia Properties a unui obiect.2 Containere şi documente Un container este o colecţie de obiecte salvate în Access: baze de date. Pentru a examina containerele şi documentele bazei de date “Cursuri Optionale.Documents Debug.Databases (0) For Each conCrt In DbCrt. gândiţi-vă la fereastra Database. Pentru a înţelege mai bine ce reprezintă containerele şi documentele. Nu puteţi şterge sau adăuga obiecte la colecţia Parameters.Containers Debug.Workspaces(0) . Programatorul poate adăuga proprietăţi (cu ajutorul metodei CreateProperty) unui anumit obiect şi este responsabil pentru stabilirea şi modificarea valorilor acestor proprietăţi. 8. 141 .

pentru a accesa un anumit obiect DAO trebuie să parcurgeţi ierarhia în sens descrescător. nu indică vreun obiect existent. nici una din declaraţiile de mai jos: Dim db As Database Dim form As Form Dim ctl As Control nu stochează informaţii şi. practic îi cereţi lui Access să aloce spaţiul necesar stocării unei informaţii pentru care aţi specificat un tip de date (dacă nu specificaţi nici un tip de date.ColectieCopil (“ObiectCopil”) Tabelul 8. Pag.5 prezintă cele patru metode prin care puteţi accesa un element al unei colecţii.Întâi am definit trei variabile: una de tip Database. Access creează numai un pointer la obiect. Pentru a le face să indice un obiect. acest lucru. până la acel obiect: DBEngine. Dacă doriţi să faceţi dumneavoastră. una de tip container care indică fiecare element din colecţia Containers şi una de tip Document. ce se aseamănă cu instrucţiunea For…Next.Controls!Nume Legătura dintre variabile şi obiectul spre care acestea indică este distrusă (şi memoria necesară este eliberată) o dată cu expirarea duratei de viaţă a variabilei. ce indică fiecare document dintr-un container. puteţi folosi valoarea predefinită Nothing: Set frm = Nothing După cum aţi mai văzut şi în exemplele anterioare. 142 . trebuie să folosim cuvântul cheie Set.Databases(0) Set form = dbForms!DetaliiProf Set ctl = frm. Lucrurile sunt puţin diferite la declararea unei variabile de tip obiect. În acest caz. De exemplu. care indică baza de date curentă. ca mai jos: Set dbCrt = DBEngine.2 Lucrul cu variabile de tip obiect Când declaraţi o variabilă obişnuită. am folosit instrucţiunea For Each.ColectieParinte. explicit.Workspaces(0) . pentru a itera printre elementele colecţiilor Containers. deocamdată. cu deosebirea că este creată special pentru parcurgerea colecţiilor 8. Access va considera în mod implicit că tipul e variant). Apoi.

cu observaţia că funcţia CurrentDB() este mai rapidă. DBEngine(0) (0) Access vă mai pune însă la dispoziţie şi funcţia CurrentDB().Workspaces(0).Containers!Forms.Workspaces(0). Dacă doriţi să accesaţi o bază de date din afara sistemului Access (prin OLE). trebuie să folosiţi varianta DBEngine(0) (0).Workspaces(0).Documents(0) Debug. Altfel.Workspaces(0) . însă.Print Current.5 indice reprezintă poziţia obiectului în cadrul colecţiei Parantezele drepte sunt necesare numai dacă numele colecţiei conţine caractere speciale (de exemplu. următoarea procedură: Sub Test1 () Dim doc As Document Set doc = CurrentDb. pentru a obţine un pointer la baza de date curentă. puteţi folosi ambele variante. 143 .Name Pag. Databases!_ [Cursuri Optionale] Tabelul 8. pe scurt. Databases_ Explicaţii var e o variabilă de tip şir de caractere sau Variant colectie (indice) colectie!nume Sau colectie! [nume] (strBazaDate) DBEngine. spaţii) Astfel.TableDefs(“Profesor”). Databases(0) DBEngine.Databases(0) Sau.Print doc. puteţi folosi acest nume ca mai jos: Debug. dacă lucraţi în Access. Cu alte cuvinte.Sintaxa colectie (“nume”) colectie (var) Exemplu DBEngine. trebuie să scrieţi: DBEngine. dacă vreţi să accesaţi un obiect al cărui nume îl cunoaşteţi. Atenţie. la următorul aspect: nu puteţi folosi un pointer la un obiect pe care l-aţi obţinut apelând funcţia CurrentDB() într-o linie următoare de cod. Databases_ (“Cursuri Optionale”) StrBazaDate = “Cursuri Optionale” DBEngine.RecordCount Aţi văzut că pentru a obţine baza de date curentă.Workspaces(0).

În general.) este folosit. De aceea. pentru a obţine un pointer la un obiect.Documents(0) Debug. după cum puteţi vedea şi în tabelul 8. iar Workspaces e colecţia implicită a obiectului DBEngine. în schimb. după (!) urmează numele unui obiect creat de dumenavoastră: un formular. pentru a separa un obiect de o colecţie.) sunt folosiţi pentru a descrie relaţiile de apartenenţă dintre colecţii. În Access însă. Operatorul (.Name End Sub Când folosim semnul exclamării (!) şi când punctul (.Name deoarece.6.TableDefs(0) se mai poate scrie prescurtat ca: DBEngine(0) (0) (0) Aceasta pentru că. cât şi operatorul (.) Atât operatorul (!).Databases(0) . doc este un pointer invalid.3 Colecţii implicite Aţi putut observa din exemplele de până acum că adesea. Următoarea procedură. TableDefs e colecţia implicită a unui obiect de tip Database.Workspaces(0) . Databases e colecţia implicită a unui obiect de tip Workspace. în acel punct.va eşua când va încerca să tipărească doc. aproape orice tip de obiect are o colecţie implicită. un raport sau un control (deci un element al unei colecţii). în general. proprietate sau metodă a sa. va rula corect: Sub Test2 () Dim doc As Database Dim doc As Document Set db = CurrentDb() Set doc = db. obiecte şi proprietăţi.Print doc. operatorul (!) separă un obiect de colecţia din care face parte. trebuie să scrieţi o linie de cod destul de lungă. Astfel. care va fi luată în considerare dacă nu specificaţi nici o colecţie. 8. DBEngine. 144 . Obiect Container Database DBEngine Group Index QueryDef Recordset Relation TableDef User Colecţia implicită Documents TableDefs Workspaces Users Fields Parameters Fields Fields Fields Groups Pag.Containers!Forms.

Properties(“proprietar”) sau Obiect. pentru un obiect de tip Field (câmp).Workspace Tabelul 8. fără a mai fi necesar să specificaţi obiectul pentru fiecare proprietate în parte: Private Sub Set_Form_Prop() With txtCtl .1 Tipuri de proprietăţi Există două tipuri de proprietăţi DAO: predefinite şi definite de utilizator. Accesul la proprietăţi Pentru a regăsi o proprietate predefinită a unui obiect.2. De exemplu. 8. Ele există încă de la crearea obiectului şi sunt disponibile pentru orice aplicaţie ce foloseşte motorul Jet.Text = “Acesta este un control de tip text” Pag. De exemplu. proprietatea Description (descriere) a unui câmp nu este predefinită şi nu există până când nu introduceţi descrierea. Unele obiecte au şi proprietăţi care nu există până în momentul în care li se dă o valoare.4.4.proprietate Pe de altă parte. veţi obţine o eroare. nu puteţi regăsi o proprietate definită de utilizator decât prin intermediul colecţiei Properties a obiectului: Obiect. 145 .6 Databases 8. 8.4 Lucrul cu proprietăţile obiectelor Fiecare obiect DAO are o colecţie de proprietăţi. puteţi folosi sintaxa: obiect.4.3. Proprietăţile definite de utilizator nu există până când nu sunt adăugate la colecţia Properties a obiectului. 8. De aceea. este important să înţelegeţi diferenţele dintre tipurile de proprietăţi ale obiectelor DAO.Properties!proprietate Această din urmă sintaxă funcţionează şi pentru proprietăţi predefinite. Proprietăţile predefinite ale unui obiect reprezintă caracteristicile de bază ale acestuia. proprietăţile Name(nume) şi Type(tip) sunt predefinite. Dacă încercaţi să regăsiţi proprietatea Description a unui obiect ce încă nu o are. Stabilirea proprietăţilor Cu ajutorul instrucţiunii With puteţi stabili mai multe proprietăţi ale unui obiect.

) pentru a crea obiectul dorit (tabelă. pentru ca ele să facă parte din baza de date. Crearea obiectelor Pentru a crea un obiect nou. index etc. 3.BackColor = 0 End With End Sub 8. nu am făcut altceva decât să folosim DAO pentru a accesa obiecte existente şi proprietăţile acestora. trebuie să creaţi întâi obiectul principal şi pe urmă cele subordonate. Stabiliţi proprietăţile obiectului creat.ForeColor = RGB(0. Dacă obiectul nou creat conţine alte obiecte (aşa cum o tabelă conţine câmpuri). Altele pot fi stabilite şi ulterior. Crearea şi manipularea obiectelor cu DAO În exemplele de până acum. 0) ‘verde . 255. O mare parte a facilităţilor oferite de DAO constă însă în posibilitatea de a crea şi de a modifica obiecte.5. Folosiţi una dintre metodele Create…(CreateTable..). 146 Câmp CreateField Name Type Size .1. pe care le adăugaţi la colecţiile corespunzătoare ale obiectului principal. procedaţi astfel: 1.7 prezintă în detaliu metodele Create…cu argumentele acestora şi cu descrierile de rigoare. Tip de date String Integer String String String Integer Integer Obiect Tabela Metoda CreateTableDef Argumente Name Attributes Source Connect Descriere Numele tabelei Stabilire valori pentru tabele ataşate. 8. Tabelul 8. 2. CreateIndex etc. Apoi. Adăugaţi obiectul la colecţia corespunzătoare.5. îl adăgaţi şi pe acesta la colecţia sa. sistem sau ascunse Informaţii despre tipul tabelei de bază a unei tabele ataşate Calea şi numele fişierului unei tabele ataşate Numele câmpului Tipul de date Dimensiunea (pentru Pag. Unele proprietăţi (cum ar fi numele) sunt esenţiale şi trebuie specificate la crearea obiectului.

Index Interogare CreateIndex CreateQueryDef Name Name SQL Name Table ForeignTable Attributes String String String String String String Integer Relaţie CreateRelation Workspace Create Workspace Name User Password Bază de CreateDatabase DatabaseName date Locale String String String String String Options Integer Grup Utilizator CreateGroup CreateUser Name PID Name PID String String String String câmpuri de tip text) Numele indexului Numele interogării Şir de caractere ce conţine instrucţiunea SQL pe care se bazează interogarea Numele relaţiei Numele tabelei primare Numele tabelei ce conţine cheia străină Atributele relaţiei: tipul relaţiei.7 În continuare. actualizări şi ştergeri în cascadă Numele sesiunii de lucru Numele utilizatorului Parola pentru sesiune Numele fişierului ce conţine baza de date Expresie ce specifică limba pentru noua bază de date (pentru sortări şi comparaţii între variabile de tip text) O constantă sau o combinaţie de constante ce arată dacă baza de date este criptată sau versiunea motorului Jet Numele grupului de utilizatori Identificatorul grupului Numele utilizatorului Identificatorul utilizatorului Tabelul 8. Pag. integritatea referenţială. vom ilustra crearea unor astfel de obiecte complexe. 147 .

După ce aţi adăugat indexul la colecţia sa.CreateField (“IdProf”.8. Atribuiţi valorile dorite proprietăţilor noului index (cele mai importante proprietăţi sunt Name.5. dbLong) Set fd2 = tdProf.Fields .1.Append fd1 .CreateTableDef () tdProf. 8.CreateField (“Nume”.Append fd2 End With With db. 60) ‘Adaugarea la colectii With tdProf.1.2 Crearea unui index Iată care sunt paşii pe care trebuie să-i urmaţi pentru a crea un index folosind DAO: Folosiţi metoda CreateIndex a unui obiect de tip TableDef pentru a crea indexul şi stabiliţi-i proprietatea Name (nume). de aceea. Crearea unei tabele Funcţia următoare creează tabela Profesor1 şi îi adaugă doar două coloane: IdProf şi Nume.Append tdProf ‘Actualizarea colectiei TableDefs . 2. Notă: Această funcţie nu tratează nici o eroare şi.5.Refresh End With End Function Este să folosiţi metoda Refresh (actualizare) pentru a vă asigura că noile obiecte au fost adăugate (acest lucru e recomandat mai ales în cazul unei aplicaţii multiuser). dbText.1. ştergeţi întâi tabela creată. Primary. nu-i veţi mai putea modifica proprietăţile. Pentru a o putea rula cu succes a doua oară.TableDefs . va eşua dacă o veţi rula de două ori consecutiv. Pag. 1.Name = “Profesor1” Set fd1 = tdProf. Unique şi Required). Function CreeazaTabProf () Dim db As Database Dim tdProf As TableDef Dim fd1 As Field Dim fd2 As Field Set db = CurrentDb () ‘Crearea tabelei si a coloanelor Set tdProf = db. 148 .

Astfel. cu proprietăţile dorite. 5. va trebui să ştergeţi obiectul şi să creaţi unul nou. dacă nu există.Indexes ‘daca exista o cheie primara. Funcţia CreareCheiePrimara() pe care o dăm mai jos ca exemplu. stabilim automat proprietatile: ‘IgnoreNulls = False. idx.TableDefs(strTabela) Set idxs = td.CreateIndex (strCP) ‘facem ca indexul sa fie cheie primara. sau valoarea Null. care returnează numele indexului corespunzător cheii primare. 149 . ce listează pentru tabela Curs_Prof cheia primară formată din coloanele IdCurs şi IdProf. fie un singur nume. o stergem varCP = ExistaCP(td) If Not IsNull (varCP) Then Idxs. dacă acesta există. Argumentul varColoane fiind de tip Variant. poate conţine fie o matrice. funcţia CreareCheiePrimara() apelează funcţia AdaugareCamp(). Pentru aceasta. 4. De asemenea. creează o cheie primară pentru o tabelă. ce returnează valoarea True în caz de reuşită şi False în caz de eşec. Folosiţi metoda CreateField a indexului pentru a crea câte un obiect de tip Field pentru fiecare câmp ce face parte din index. Unique = True. numele indexului şi coloanele ce vor compune cheia primară.Delete varCP End If ‘cream noul index Set idx = td._ varColoane As Variant) As Boolean Dim db As Database Dim td As TableDef Dim idxs As Indexes Dim idx As Index Dim fd As Field Dim varCP As Variant Dim varIdx As Variant On Error GoTo CreareCheiePrimara_Err Set db = CurrentDb() Set td = db.3. Pentru a testa funcţia CreareCheiePrimara() am creat şi subrutina TestCP. strCP As String. Ea primeşte ca argumente numele tabelei. Pentru a testa dacă nu există deja o cheie primară pentru tabela respectivă. Folosiţi metoda Append a obiectului de tip TableDef pentru a adăuga indexul la colecţia Indexes. Adăugaţi-le apoi la colecţia Fields a indexului. Required = True. pentru a adăuga un obiect de tip Field la colecţia Fields a unui index. dacă vor fi mai multe coloane în componenţa cheii primare. funcţia CreareCheiePrimara() apelează funcţia ExistaCP(). Function CreareCheiePrimara(strTabela As String.Primary = True Pag.

‘cream campurile si le adaugam la colectia Fields ‘daca avem mai multe coloane: If IsArray (varColoane) Then For Each varIdx In varColoane Call AdaugareCamp (idx.Fields. varColoane) End If ‘adaugam indexul la colectia Indexes idexs.Append idx CreareCheiePrimara = True CreareCheiePrimara_Exit: Exit Function CreareCheiePrimara_Err: MsgBox “Crearea indexului a esuat” CreareCheiePrimara = False Resume CreareCheiePrimara_Exit End Function Private Function ExistaCP(td As TableDef) As Variant Dim idx As Index For Each idx In td. varIdx) Next varIdx Else ‘daca avem o singura coloana: Call AdaugareCamp (idx.Name Exit Function End If Next idx ExistaCP = Null End Function Private Function AdaugareCamp (idx As Index.Indexes If idx.CreateField(varIdx) Idx. varIdx As Variant)_ As Boolean Dim fd As Field On Error GoTo AdaugareCamp_Err If Len(varIdx & “ “) > 0 Then Set fd = idx. 150 .Primary Then ExistaCP = idx.Append fd End If AdaugareCamp = True Pag.

Proprietăţile relaţiei le puteţi stabili fie la crearea ei. una câte una (Table.CreateRelation() ‘stabilim proprietatile relatiei Pag. ce reprezintă numele coloanei corespunzătoare din tabela din partea (many) a relaţiei. 151 . Verificaţi dacă tabela primară (tabela din partea 1 a relaţiei) are definită o cheie primară. Dacă relaţia există deja. Folosiţi metoda CreateRelation a obiectului bază de date pentru a crea relaţia. fie ulterior. “PrimaryKey”. Funcţia CreareRel. 4._ Array(“IdCurs”.AdaugareCamp_Exit: Exit Function AdaugareCamp_Err: AdaugareCamp = False Resume AdaugareCamp_Exit End Function Sub TestCP() Debug. funcţia CreareRel o şterge şi o creează din nou.3 Crearea unei relaţii Pentru a crea o relaţie folosind DAO. Adăugaţia apoi obiectele de tip Field la colecţia Fields a relaţiei. prezentă mai jos. creează o asociere left outer join între tabelele Profesor şi Titlu şi permite actualizările în cascadă. Creaţi câte un obiect de tip Field (câmp) pentru fiecare coloană din cheia primară a tabelei primare.5. Function CreareRel() As Boolean Dim db As Database Dim rel As Relation Dim fd As Field On Error GoTo CreareRel_Err Set db = CurrentDb() ‘cream obiectul relatie Set rel = db.1.Print CreareCheiePrimara(“Curs_Prof”. trebuie să efectuaţi următorii paşi: 1. ForeignTable şi Attributes sunt printre cele mai importante). Folosiţi metoda Append a obiectului de bază de date pentru a adăuga relaţia la colecţia Relations. 3. 2. Pentru fiecare dintre acestea. “IdProf”)) End Sub 8. stabiliţi proprietatea ForeignName.

152 .5. Folosiţi metoda CreateProperty a obiectului respectiv pentru a crea proprietatea.Name Resume Case Else MsgBox “Relatia nu a putut fi creata” CreareRel = False Resume CreareRel_Exit End Select End Function 8. Sub UltimaModif(strTab As String) Dim db As Database Pag. Crearea proprietăţilor-utilizator DAO vă dă posibilitatea să creaţi noi proprietăţi pentru un obiect. pe care să le adăugaţi apoi la colecţia Properties a obiectului respectiv. 2.Delete rel. Ea păstrează data ultimei modificări a tabelei.Fields.4. 3. modificari in cascada .ForeignTable = “Profesor” ‘left outer join.Attributes = dbRelationLeft Or dbRelationDeleteCascade End With ‘cream campurile Set fd = rel.ForeignName = “IdTitlu” rel.Table = “Titlu” . Definiţi caracteristicile proprietăţii. Subrutina de mai jos creează o nouă proprietate pentru o tabelă: UltimaModificare.Append fd ‘adaugam relatia la colectia Relations CreareRel = True CreareRel_Exit: Exit Function CreareRel_Err: Select Case Err.Relations.1.With rel . Adăugaţi proprietatea la colecţia Properties a obiectului. Paşii pe care trebuie să-i urmaţi sunt cei de mai jos: 1.CreateField(“IdTitlu”) fd.Number Case 3012 ‘daca relatia exista deja Db.Name = “RelProfTitlu” .

ci numai folosind proprietăţile şi metodele furnizate de DAO. Cu alte cuvinte. trebuie să ţineţi cont de faptul că unele proprietăţi ale unui obiect DAO nu există decât din momentul în care li s-a dat o valoare.6. să stabiliţi proprietatea respectivă.Dim tb As TableDef Dim prUltMod As Property Set db = CurrentDb() Set tb = db.Value End Sub Deoarece metoda Append dă o eroare dacă proprietatea există deja. ne-am propus să creăm un obiect care să poată fi accesat prin VBA şi care să ofere diferite informaţii despre sistem.8 conţine proprietăţile obiectului Calculator.2. Pentru a modifica o astfel de proprietate. 8.Properties(“UltimaModificare”). pe care îl vom crea.Append prUltMod ‘afisam valoarea proprietatii Debug. Unele proprietăţi pot fi stabilite numai la crearea obiectului şi nu mai pot fi modificate după ce acesta a fost adăugat la colecţia corespunzătoare (proprietatea Attributes a unui obiect de tip TableDef e un exemplu în acest sens). 8. Tabelul 8. în cadrul modulelor pentru clase. Pag.5. Obiecte definite de utilizator În Access 97 puteţi crea propriile dumneavoastră obiecte. 8. să adăugaţi noul obiect la colecţia sa şi apoi să ştergeţi vechiul obiect. pentru a scăpa de probleme am dezactivat detectarea erorilor. cu proprietăţile şi metodele lor. astfel încât încercarea de a regăsi o astfel de proprietate s-ar putea solda cu o eroare.TableDefs(strTab) ‘cream noua proprietate Set prUltMod = td. trebuie să creaţi un nou obiect. Modificarea obiectelor Puteţi modifica un obiect existent fără a-l deschide în modul Design View. să copiaţi în el toată informaţia conţinută în cel vechi. Pe parcursul acestui subcapitol.1.CreateProperty(“UltimaModificare”.6. Proprietăţile şi metodele obiectului Primul lucru pe care trebuie să-l facem atunci când creăm un obiect este să stabilim care sunt informaţiile pe care acesta le va oferi. Trebuie totuşi să ţineţi cont de anumite restricţii atunci când stabiliţi proprietăţile unui obiect DAO.Properties. dbDate. Now) ‘adaugam UltimaModificare la colectia Properties ‘ignoram posibilele erori On error Resume Next td. 153 . trebuie să determinăm caracteristicile şi comportamentul lui.Print td. De asemenea.

obiectul Calculator trebuie să-i ofere utilizatorului posibilitatea de a efectua diferite acţiuni. iniţializări ale proprietăţilor obiectului. evenimentul Initialize (iniţializare). Scrieţi deci. Procedura Class_Initialize() se apelează automat la crearea instanţelor unui obiect al clasei definite în modulul respectiv.StergeDir şi Calculator. următoarea linie de cod: Pag. de obicei. în cadrul subrutinei Class_Initialize(). Declaraţi întâi la secţiunea (General)(Declarations) a modulului o variabilă globală în cadrul modulului Calculator: Private strDirAccess As String Creaţi subrutina Calss_Initialize(). De aceea. Ea va păstra directorul (cu calea completă) în care este instalată aplicaţia Access (în care se află fişierul Msaccess.DirAccess Şir de caractere ce conţine directorul în care se află msaccess. iar din caseta combinată Procedure (din partea dreapta-sus a ferestrei modulului).8 În plus faţă de aceste proprietăţi.exe). vom implementa metodele Calculator. cu ajutorul unui modul pentru clase (class module). cum ar fi. vom apela funcţia VBA SysCmd. selectând din caseta combinată Object (aflată în partea din stânga-sus a ferestrei modulului) secţiunea Class. vom putea crea şi folosi obiecte ale acestei clase. Pentru a obţine o informaţie. Procedura Class_Terminate() este apelată ori de câte ori este distrusă o instanţă a unui obiect bazat pe modulul respectiv. În cadrul acestei subrutine vom iniţializa variabila globală declarată anterior. Class_Initialize() şi Class_Terminate().exe Tabelul 8. Salvaţi acest modul cu numele Calculator (numele clasei pe care dorim să o implementăm).PornireWindows Descriere Şir de caractere ce conţine numele calculatorului Proprietate de tip Date/Time.Proprietate Calculator. ştergerea unui director gol sau redarea unui fişier de sunet wave.Nume Calculator. ce arată când a fost pornit ultima oară sistemul de operare Windows Calculator. în cadrul acestei proceduri se efectuează.RedareWave Ceea ce vom face pe parcursul acestui capitol este să definim o clasă (clasa Calculator). de exemplu. Apoi. Pentru aceasta. 154 . Observaţi că modulele pentru clase sunt foarte asemănătoare cu modulele standard. prin VBA. Deschideţi fereastra Database şi alegeţi comanda Class Module din meniul Insert pentru a crea un nou modul pentru clase. Una dintre diferenţe este aceea că ele pot conţine două proceduri speciale.

control etc. Mai trebuie să ne asigurăm că ea poate fi accesată prin intermediul proprietăţii Calculator. Static – indică faptul că valorile variabilelor locale ale procedurii se păstrează între apeluri. majoritatea proprietăţilor unui obiect (formular. pentru a regăsi şi modifica valoarea acestei proprietăţi. Private – indică faptul că procedura Property Get poate fi apelată numai de către procedurile din modulul în care a fost declarată.exe. ea va returna un şir de caractere ce reprezintă directorul în care se află Msaccess. adică valoarea ei nu poate fi modificată. Pag.) îşi pot schimba valoarea. SetComputerName. Faptul că am obţinut această informaţie nu este suficient. O astfel de proprietate este şi Calculator.DirAccess. GetComputerName şi.StrDirAccess = SysCmd(acSysCmdAccessDir) Funcţia SysCmd() poate fi folosită pentru a efectua diferite acţiuni în Access.dirAccess este read-only. ListaArgumente – lista argumentelor procedurii. 155 . Ea are următoarea sintaxă: [Public | Private] [Static] Property Get NumeProprietate_ [(ListaArgumente)] As TipDate unde: Public – indică faptul că procedura Property Get poate fi apelată de orice altă procedură din orice alt modul. Procedura Property Get ce regăseşte valoarea proprietăţii DirAccess este: Public Property Get DirAccess() As String DirAccess = strDirAccess End Property Proprietatea Calculator. vom folosi două funcţii API.Nume. raport. ale căror declaraţii: Private Declare Function GetComputerName Lib “kernel132” Alias_ “GetComputerNameA” (ByVal lpBuffer As String. Totuşi. nsize As Long) As Long Private Declare Function SetComputerName Lib “kernel132” Alias_ “SetComputerNameA” (ByVal lpComputerName As String) As Long trebuie să le includeţi la secţiunea (General)(Declarations) a modulului. respectiv. Dacă îi dăm ca parametru constanta intrinsecă acSysCmdAccessDir. TipDate – tipul de date al proprietăţii. NumeProprietate – numele proprietăţii ale cărei valori le regăseşte procedura. Procedura Property Get creează o proprietate şi stabileşte modul în care sunt regăsite valorile acestei proprietăţi.

sintaxa instrucţiunii Property Let este următoarea: [Public | Private] [Static] Property Let NumeProprietate_ (ListaArgumente) unde cuvintele cheie Public. iar ListaArgumente reprezintă argumentele procedurii. Static şi NumeProprietate au aceleaşi semnificaţii ca şi pentru instrucţiunea Property Get. dacă apelaţi funcţia SetComputerName cu argumentul “NumeNou” şi apoi apelaţi funcţia GetComputerName fără a fi iniţializat între timp calculatorul.Nume: Public Property Get Nume () As String Nume = strNume End Property Public Property Let Nume (strNumeNou As String) Call SetComputerName (strNumeNou) strNume = strNumeNou Variabila strNume este globală în cadrul modulului şi trebuie deci să fie declarată la secţiunea (General)(Declarations) a acestuia: Private strNume As String * 255 Ea trebuie să fie iniţializată în cadrul funcţiei Class_Initialize(): Call GetComputerName(strNume. De aceea. cum ar fi de aşteptat. Private. Deoarece proprietatea Nume poate fi modificată. Modificarea nu devine efectivă însă decât după ce aţi închis şi pornit din nou calculatorul. Iată care sunt cele două proceduri pentru regăsirea şi modificarea valorilor proprietăţii Calculator. aceasta din urmă va returna vechiul nume al calculatorului şi nu şirul de caractere “NumeNou”. 255) Pag. care să ne ajute să-i modificăm valoarea prin intermediul unei simple atribuiri. 156 .Funcţia SetComputerName primeşte ca argument un şir de caractere ce reprezintă noul nume pe care doriţi să i-l daţi calculatorului dumneavoastră.Nume să păstreze ultimul nume pe care l-am dat calculatorului în cadrul unei instanţe a obiectului Calculator şi nu rezultatul returnat de funcţia GetComputerName. în plus faţă de o procedură Property Get. Astfel. Numele şi tipul fiecărui argument (cu execepţia ultimului) trebuie să corespundă exact numelui şi tipului argumentelor procedurii Property Get a aceleiaşi proprietăţi. ne propunem ca proprietatea Calculator. Ultimul argument reprezintă noua valoare ce va fi atribuită proprietăţii şi deci trebuie să aibă acelaşi tip de date ca şi cel returnat de procedura Property Get. trebuie să scriem şi o procedură Property Let pentru aceasta proprietate.

Iată care sunt cele două metode ale obiectului Calculator: Public Function StergeDir(strDir As String) StergeDir = RemoveDirectory(strDir) End Function Public Sub PlayWave(strWave As String) Call PlaySound(strWave.Până acum am vorbit numai despre proprietăţile obiectului Calculator. Cu alte cuvinte. dacă după declaraţia de mai sus am dori să afişăm proprietatea DirAccess şi am scrie: MsgBox comp.6.DirAccess această instrucţiune este cea care declanşează crearea obiectului.dll” Alias_ “PlaySoundA” (ByVal lpszName As String.2 Crearea instanţelor obiectului Primul lucru pe care trebuie să-l subliniem este acela că există o diferenţă între crearea unei variabile de tip obiect şi crearea unui obiect. 0) End Sub Pentru a putea apela funcţiile API RemoveDirectory şi PlaySound. 0. apelarea procedurilor: Class_Initialize şi Prop Get DirAccess Instrucţiunea folosită pentru alocarea resurselor poate fi înlocuită cu: Set comp = New Calculator Pag. Metodele unui obiect sunt mult mai simplu de implementat: ele sunt subrutine sau funcţii publice obişnuite. ByVal hModule As Long. ByVal_ dwFlags As Long) As Long 8. Prin următoarea lini de cod: Dim comp As New Calculator nu se creează o nouă instanţă a obiectului Calculator. Obiectul în sine nu este creat până când una dintre proprietăţile sau metodele sale nu este folosită sau apelată. trebuie să includeţi la secţiunea (General)(Declarations) a modulului declaraţiile lor: Private Declare Function RemoveDirectory Lib “kernel132” Alias_ “RemoveDirectoryA” (ByVal lpPathName As String) As Long Private Declare Function PlaySound Lib “winmm. 157 . ci doar se alocă resursele necesare creării unui nou obiect de acest tip.

resursele ocupate de el nu pot fi eliberate decât după ce au fost distruse toate variabilele ce fac referire la el. 158 . Durata de viaţă a obiectelor În situaţia în care avem mai multe variabile care fac referire la acelaşi obiect.Nume = “CalculatorulMeu” End Sub 8.mdb: Public Function NrInregistr(strTabela As string) Dim db As Database Dim rst As Recorset Dim iNrInregistrari Set db = CurrentDb() Set rst = db.OpenRecordset(strTabela) iNrInregistrari = rst. vedeţi un set de înregistrări.În acest caz. Iată un prim exemplu de subrutină ce foloseşte un astfel de obiect pentru a găsi numărul de înregistrări dintr-o tabelă a bazei de date Cursuri Opţionale. dacă vă decideţi să programaţi în VBA. ori când ea primeşte valoarea Nothing: Set comp = Nothing 8.RecordCount Debug. acesta nu poate fi distrus şi deci. creţi un nou modul standard în care scrieţi următoarea subrutină: Sub testCalculator() Dim comp As New Calculator MsgBox comp.6. iar instrucţiunea Set determină crearea obiectului şi apelarea procedurii Class_Initialize.DirAccess MsgBox comp.Print “Tabela “ & strTabela & “ contine “ & iNrInregistrari &“ inregistrări” Pag.3. Observaţi utilizarea cuvântului cheie New în ambele variante folosite pentru crearea instanţelor. instrucţiunea Dim alocă spaţiul necesar creării obiectului. veţi lucra foarte mult cu obiecte de tip Recordset. să manipulăm înregistrările şi seturile de înregistrări. Pentru a testa funcţionalitatea unui obiect de tip Calculator. Acest lucru se întâmplă ori când o variabilă îşi încheie durata de viaţă (scopul).7 Lucrul cu obiecte de tip Recordset Adevărata putere a unei baze de date constă în modul în care putem să regăsim informaţia.Nume Comp. Ce este un set de înregsitrări? Atunci când deschideţi o tabelă în modul Datasheet View. De aceea. Acesta trebuie folosit pentru orice obiect.

Figura 8.rst. Pag.close End Function Deschideţi fereastra Debug şi scrieţi: ?NrInregistr(“Student”) după care apăsaţi pe Enter.9 prezintă rezultatul obţinut. 159 .

• Obiecte Recordset de tip dynaset. decideţi pe care dintre aceste tipuri îl veţi folosi la un moment dat: • Dacă doriţi să şi actualizaţi înregistrările. • Câte înregsitrări conţine setul de înregistrări. 160 .9 Atâta timp cât un set de înregistrări este deschis (între apelul metodei OpenRecordset şi al metodei Close). şterge sau puteţi chiar adăuga înregistrări noi.Figura 8. Este important să închideţi un set de înregistrări (apelând metoda Close) pentru a elibera resursele pe care Access i le-a alocat. • Obiecte Recordset de tip forward-only. 8. Pag.1.7. • Obiecte Recordset de tip snapshot. puteţi face orice doriţi cu înregistrările sale: le puteţi edita. nu numai să le vedeţi. • Dacă tabelele se află într-o bază de date Access sau de alt tip. • Obiecte Recordset de tip dinamic. Tipuri de seturi de înregistrări În VBA există nu mai puţin de cinci feluri de obiecte de tip Recordset: • Obiecte Recordset de tip tabelă. În cadrul acestui capitol ne vom ocupa numai de primele trei tipuri de seturi de înregistrare. În funcţie de următorii factori.

o interogare sau o instrucţiune SQL ce returnează înregistrări. • opţiuni – combinaţie de constante ce definesc caracteristicile noului set de înregistrări. sursa – este o tabelă. blocaje]]]) Sau Set rst = obiect. folosiţi expresia: Set rst = db. • blocaje – constantă ce specifică tipul de blocaj aplicat setului de înregistrări (pentru aplicaţii multiuser). • tip – specifică tipul setului de înregistrări şi poate fi una dintre următoarele constante predefinite: • dbOpenTable – set de înregistrări de tip tabelă • dbOpenDynaset – dynaset • dbOpenSnapshot – snapshot • dbOpenForwarsOnly – set de înregistrări de tip forward-only • dbOpenDynamic – set de înregistrări de tip dinamic. interogare sau un alt set de înregistrări.1. 8. Unul dintre avantajele unui astfel de set de înregistrări este acela că puteţi folosi indecşi pentru a accelera căutările. optiuni[.OpenRecordset (Sursa[.7. Notă: Access97 vă permite să creaţi un obiect de tip recordset printr-o singură linie de cod. Seturi de înregistrări de tip tabelă Acesta este tipul implicit de set de înregistrări pe care Access îl creează dacă nu specificaţi alt tip ca argument al metodei OpenRecordset şi dacă sursa de înregistrări este o tabelă din baza de date curentă. 8.1. Seturi de înregistrări de tip dynaset Un astfel de set de înregistrări poate conţine date din mai multe tabele locale sau ataşate.După cum aţi observat şi din exemplul anterior. dbOpenTable) ceea ce în Access 95 nu era posibil. optiuni[. tip[. 161 .OpenRecordset ([tip[.7. de exemplu: • • Set rst = CurrentDb. • obiect – un obiect al unei baze de date deschis anterior: tabelă. Metoda compusă din doi paşi este totuşi preferabilă. dacă veţi folosi obiectul de tip Database în cadrul procedurii şi pentru alte acţiuni.2. pentru a crea un set de înregistrări. blocaje]]]) Unde: db – este un obiect de tip Database. Puteţi edita datele dintr-un dynaset şi modificările vor fi efectuate şi în Pag.1.OpenRecordset(“Profesor”.

apelând metoda Requery (reinterogare) a obiectului.OpenRcordset(“IntProfCurs”. 8.3. • când obiectul de tip Recordset conţine obiecte OLE. Ele reprezintă instantanee ale datelor la un moment dat.Restartable = True Then rst. 8. Iată câteva situaţii în care ar trebui să optaţi pentru crearea unui dynaset: • când doriţi să puteţi modifica înregistrările. dbOpenDynaset) unde IntProfCurs este o interogare. De aceea. Acesta este tipul implicit de set de înregistrări pe care Access îl creează dacă sursa de înregistrări este o interogare. puteţi executa din nou interogarea care stă la baza setului. dar numai atunci când numărul de înregistrări nu este mai mare de 500.7. trebuie ca înainte de a apela metoda Requery să verificaţi dacă proprietatea Restartable a obiectului are valoarea True (altfel. În cazul unei aplicaţii multiuser. Set db = CurrentDb() Set rst = db. pentru a afla acest lucru.1. Nu orice obiect de tip Recordset suportă însă reinterogarea. dbOpenDynaset) unde sursa de înregistrări este o instrucţiune SELECT. reinterogarea va genera o eroare): If rst. Access va actualiza datele dintr-un dynaset deschis pentru a reflecta modificările efectuate de alţi utilizatori asupra tabelelor de bază. o instrucţiune SQL SELECT sau o tabelă care nu se află într-o bază de date Access. 162 . Avantajul lor este acela că sunt mai rapide decât cele dynaset. Actualizarea datelor unui set de înregistrări Pentru a vă asigura că datele unui set de înregistrări sunt actualizate.OpenRecordset(“SELECT * FROM Student”. • când obiectul de tip Recordset are dimensiuni foarte mari.Requery Pag.tabelele de bază.2. Iată câteva exemple de creare a unui dynaset: Set db = CurrentDb() Set rst = db. Seturi de înregistrări de tip snapshot Seturile de înregistrări de tip snashot nu permit modificarea datelor şi nici nu reflectă modificările efectuate de alţi utilizatori asupra tabelelor de bază.7.

trebuie să apelaţi metoda MoveLast. Access cunoaşte numărul de înregistrări şi dă proprietăţii RecordCount valoarea corespunzătoare. Access vă pune la dispoziţie cinci metode pentru a parcurge înregistrările unui set de înregistrări: Metoda MoveNext MovePrevious MoveFirst MoveLast Move n[.OpenRecordset(“IntProfCurs”. Pentru a mări performanţele aplicaţiei dumneavoastră. am folosit proprietatea RecordCount a unui obiect de tip Recordset pentru a-i afla numărul de înregistrări.7. 163 . Lucrurile nu sunt însă la fel de simple şi în cazul altor tipuri de seturi de înregistrări. înregistrarea curentă va fi prima înregistrare a setului. Pentru ca acest număr să fie calculat corect. dacă n<0. setul respectiv era de tip tabelă. acestea se pot afla în orice ordine. Access nu cunoaşte imediat numărul de înregistrări al unui astfel de set. De aceea. parcurgerea se face înainte. Parametrul n al metodei Move indică numărul de înregistrări care trebuie să fie parcurse pentru a ajunge la cea dorită.Print rst. Access trece la executarea liniei de cod următoare celei ce apelează metoda OpenRecordset imediat după ce a fost regăsită prima înregistrare.3.MoveLast Debug.) 8. După cum v-aţi putut da seama ulterior. start] Descriere Înregistrarea următoare devine cea curentă Înregistrarea precedentă devine cea curentă Prima înregistrare devine cea curentă Ultima înregistrare devine cea curentă Înregistrarea curentă devine cea care se află la n înregistrări distanţă (înainte sau înapoi) de cea curentă sau de o anumită poziţie (start). înapoi. Regăsirea numărului de înregistrări ale unui set de înregistrări În exemplul pe care l-am dat la începutul acestui subcapitol. Dacă nu aţi specificat nici o regulă de sortare a înregistrărilor. în cadrul acestui subcapitol. (Despre semne de carte vom vorbi mai târziu. se porneşte de la înregistrarea curentă. pentru a vă asigura că au fost regăsite toate înregsitrările şi apoi să folosiţi proprietatea RecordCount: Set rst = db. Dacă n>0. dbOpenDynaset) Rst. Parametrul opţional start reprezintă un semn de carte. adică o anumită poziţie de la care începe deplasarea cu n înregistrări. Parcurgerea seturilor de înregistrări După ce aţi creat un obiect de tip Recorset.8. Dacă acest parametru nu este specificat.RecordCount Pag. atunci când creează un obiect Recordset de tip dynaset sau snapshot. Pentru acest tip.4.7.

Notă: În cazul în care vreţi să aflaţi numai dacă setul de înregistrări conţine măcar o înregistrare. Poziţiile de început şi de sfârşit ale setului de înregistrări (BOF şi EOF) Orice set de înregistrări are două proprietăţi (BOF şi EOF) care arată dacă înregistrarea curentă se află la începutul setului (BOF) sau la sfârşitul lui (EOF). Dacă mai apelaţi încă o dată metoda MovePrevious. iar dacă nu există o înregistrare curentă. De aceea. 8. Ea este disponibilă numai pentru seturi de tip dynaset sau snapshot. valoarea lui BOF rămâne True. puteţi folosi proprietăţile AbsolutePosition (poziţia absolută) şi PercentPosition (poziţia procentuală) a obiectului de tip Recordset.PercentPosition = 50 Pentru a vă asigura că proprietatea PercentPosition returnează o valoare corectă.7. nu trebuie să mai apelaţi metoda MoveLast. proprietatea RecordCount a obiectului respectiv se modifică în consecinţă. 8. astfel încât va trebui să-l reinterogaţi şi să apelaţi MoveLast înainte de a folosi proprietatea RecordCount.00. Pag. trebuie să reinterogaţi setul şi apoi să apelaţi metoda MoveLast.AbsolutePosition = 3 Proprietatea PercentPosition indică poziţia înregistrării curente ca procentaj din numărul total de înregistrări ale setului şi poate avea valori între 0. e clar că setul nu conţine înregistrări. Spre exemplu.0 şi 100. scrieţi: rst. pentru a vă deplasa până la jumătatea setului. Dacă adăugaţi sau ştergeţi înregistrări dintr-un dynaset. Poziţia absolută şi poziţia procentuală Pentru a parcurge un set de înregistrări sau pentru a afla poziţia înregistrării curente. dacă proprietatea RecordCount are valoarea zero.6. În cazul unei aplicaţii multiuser. Proprietatea AbsolutePosition reprezintă poziţia înregistrării curente în cadrul setului (faţă de zero). dacă aţi utilizatori adaugă sau şterg înregistrări din tabela din care îşi iau setul datele. pentru ca înregistrarea curentă să devină cea de-a 4-a înregistrare din set. valoarea ei este –1.7. dar va fi generată o eroare. Astfel. pentru că Access nu trece la următoarea linie până când nu a fost returnată prima înregistrare a setului.5. aceste modificări nu sunt reflectate imediat. Dacă prima înegistrare este cea curentă şi apelaţi metoda MovePrevious. din aceleaşi motive prezentate anterior pentru proprietatea RecordCount. proprietatea BOF ia valoarea True şi înregistrarea curentă nu mai există. 164 . puteţi scrie: rst.

corespunzătoare înregistrării curente. 165 . indiferent de opţiunea Option Base pe care aţi specificat-o. 8. puteţi folosi una dintre următoarele trei variante de sintaxă: Sintaxa rst!camp rst(“camp”) rst(indice) Exemplu rst!Nume rst(“Nume”) rst(1) Reţineţi faptul că.Close End With End Sub Dacă veţi rula această subrutină.7. putem scrie următoarea procedură: Public Sub Nume_Student() Dim db As Database Dim rst As Recordset Set db = CurrentDb() Set rst = db. rezultatele din fereastra Debug vor fi asemănătoare cu cele din figura 8.RecordCount Then .10: Pag. dar va fi generată o eroare.MoveLast ‘parcurgem setul de la ultima catre prima inregistrare Do Until . Astfel.Print ![Nume].7. Regăsirea valorilor câmpurilor unui set de înregistrări Pentru a afla valorile diferitelor câmpuri ale unui set de înregistrări. rst(1) se referă la cea de-a doua coloană a setului rst. Să presupunem că dorim să afişăm numele şi catedra tuturor profesorilor din tabela Profesor. Dacă apelaţi din nou metoda MoveNext. într-un set de înregistrări. valoarea lui EOF rămâne True.BOF Debug. primul câmp are întotdeauna indicele 0.OpenRecordset(“Profesor”) With rst ‘verificam daca rst contine inregistrari If .Dacă ultima înregistrare este cea curentă şi apelaţi metoda MoveNext. Pentru aceasta.MovePrevious Loop End If . ![Catedra] . proprietatea EOF ia valoarea True şi nu mai există o înregistrare curentă.

dar nu permite decât parcurgerea înainte a setului. Dumneavoastră nu trebuie decât să declaraţi o variabilă de tip Variant şi să apelaţi metoda GetRows() a setului. ci numai să le vizualizaţi.OpenRecordset(“Student”. Putem deci rescrie procedura Nume_Student astfel încât să folosim un snapshot şi o matrice: Public Sub Nume_Student_1() Dim db As Database Dim rst As Recordset Dim varDate As Variant Dim iNrInreg As Integer Dim i As Integer Set db = CurrentDb() Set rst = db. în acelaşi timp. să accesaţi în orice ordine datele pe care acesta le conţine.Fig 8. care este foarte rapid. puteţi crea un set de tip snapshot cu opţiunea dbForwardOnly. pe care o va dimensiona corespunzător. 166 . O modalitate de a vă bucura de rapiditatea unui astfel de set de înregistrări şi de a putea. dbOpenSnashot. este să copiaţi datele într-o matrice.10 De multe ori. veţi dori să aveţi un acces mai rapid la un set de date pe care nu doriţi să le modificaţi. Pentru aceasta. Access va crea o matrice bidimensională. dbForwardOnly) Pag.

care e formată din coloanele NrMatricol şi IdCurs. procedura se va executa mult mai repede. veţi verifica valoarea proprietăţii NoMatch a setului de instrucţiuni. Să presupunem că dorim să aflăm nota obţinută de un student la o anumită materie. În acest scop. Pentru aceasta. chiar dacă aceasta nu e singura. Despre acestea vom vorbi în cadrul secţiunilor următoare. Mai reţineţi faptul că metoda Seek returnează numai prima înregistrare care satisface criteriul specificat. Pag.‘alegem un numar suficient de mare de inregistrari varDate = rst. 8.8. Apelaţi metoda Seek dându-i ca argumente un operator de comparaţie (<.7. 2.>= sau >) şi una sau mai multe valori care să reprezinte criteriile de căutare (în funcţie de numărul coloanelor ce intră în componenţa idexului). trebuie să efectuaţi doi paşi: 1.<=. 8. deoarece căutările cu metoda Seek se fac numai pe indecşi. vom folosi drept index cheia primară a tabelei. cea mai rapidă modalitate de a regăsi anumite înregistrări este apelarea metodei Seek. Stabiliţi valoarea proprietăţii Index a setului. pentru un set cu multe înregistrări. dar. 2) ‘tiparim datela coloanei 1-a (Nr_matr) si a 2-a (Nume) For i = iNrInreg To 0 Step –1 Debug. veţi folosi una dintre metodele Seek sau Find ale setului respectiv. (Apelarea acestei metode pentru un set de înregistrări care nu este de tip tabelă va genera o eroare). 167 . varDate(2.10.Close End Sub Rezultatele vor fi tot cele din figura 8. i) Next i rst. După ce aţi folosit metoda Seek pentru a căuta o înregistrare. Valorile trebuie să corespundă tipurilor de date ale coloanelor indexului.1. Pentru aceasta. Căutări în seturi de înregistrări de tip tabelă După ce aţi creat un obiect Recordset de tip tabelă. trebuie să verificaţi dacă aţi găsit ceva.Print varDate(1. i). Căutarea înregistrărilor Atunci când doriţi să regăsiţi numai o anumită înregistrare (sau un set de înregistrări ce satisfac un anumit criteriu).GetRows(1000) ‘aflam indicele ultimei linii a matricei iNrInreg = Ubound(varDate.8.7. vom crea un set de înregistrări bazat pe tabela Curs_Student şi vom apela metoda Seek pentru el. Pentru aceasta.

înregistrarea găsită devine cea curentă.Public Sub SeekStud_Curs(iNrMat As Integer. Dacă există.Index = “PrimaryKey” ‘cautam inregistrarea pentru. Dacă există.8. Atât pentru acestea din urmă.7. înregistrarea găsită devine cea curentă.Seek “=”. înregistrarea găsită devine cea curentă.OpenRecordset(“Curs_Student”) ‘stabilim proprietatea Index a setului rst.Close End Sub 8.Print “Nota “ & rst!Nota End If rst. caută precedenta înregistrare ce verifică un criteriu dat. caută o înregistrare ce verifică un criteriu dat. Pag. Începând cu înregistrarea curentă. iIdCurs. iNrMat If rst. iIdCurs As Integer) Dim db As Database Dim rst As Recordset Set db = CurrentDb() Set rst = db. caută următoarea înregistrare ce verifică un criteriu dat. Începând cu înregistrarea curentă. cât şi pentru căutări după coloane neindexate. matricol “ & iNrMat & vbCrLf & _ “nu s-a inscris la cursul “ & iIdCurs Else Debug.Print “Studentul cu nr. Dacă există.NoMatch = True Then ‘nu a fost gasita o astfel de inregistrare Debug. Începând cu ultima înregistrare a setului de înregistrări. caută o înregistrare ce verifică un criteriu dat.2. cele dynaset şi snapshot nu pot folosi metoda Seek pentru căutări. înregistrarea găsită devine cea curentă. Dacă există. 168 . Căutări în seturi de înregistrări de tip dynaset şi snapshot Spre deosebire de seturile de tip tabelă. Access vă pune la dispoziţie patru metode de căutare a datelor: Metoda FindFirst FindLast FindNext FindPrevious Descriere Începând cu prima înregistrare a setului de înregistrări. care IdCurs=iIdCurs si NrMatricol=iNrMat Rst.

FindFirst “NrMatricol = “ & nMatr & “ AND Nota >=5” Subrutina FindCursuriPromovate() caută toate cursurile la care un student a obţinut o notă mai mare sau egală cu 5.Print “Studentul cu nr. matricol “ & nMatr & vbCrLf & _ “a promovat cursurile “ & strRez End Select Pag. Sintaxa acestor metode va fi următoarea: rst. Dacă nu există nici o înregistrare care să întrunească acest crietriu.FindNext “NrMatricol = ” & nMatr & “AND Nota >=5” Loop Select Case nPromovate Case 0 Debug. una sau mai multe înregistrări. Cu ajutorul variabilei nRez ţinem minte dacă au fost găsite 0.Dacă oricare dintre aceste metode nu reuşeşte să găsească o înregistrare care să verifice criteriul respectiv. Public Sub FindCursuriPromovate(nMatr As Integer) Dim db As Database Dim rst As Recordset Dim nPromovate As Integer Dim strRez As String Set db = CurrentDb() Set rst = db. {FindFirst|FindPrevious|FindNext|FindLast} criteriu unde rst este un obiect de tip dynaset sau snapshot.. setul de înregistrări nu va mai avea o înregistrare curentă şi orice operaţie ulterioară asupra înregistrării curente va genera o eroare.FindFirst “NrMatricol = “ & nMatr & “AND Nota >=5” Do While rst. matricol “ & nMatr & vbCrLf & _ “nu a promovat nici un curs“ Case 1 Debug. 169 . iar criteriu este un şir de caractere ce conţine o expresie de genul celor din clauza WHERE a unei instrucţiuni SQL: rst.OpenRecordset(“Curs_Student”. dbOpenSnapshot) rst. vom afişa un mesaj.Print “Studentul cu nr. matricol “ & nMatr & vbCrLf & _ “a promovat cursul: “ & rst!IdCurs Case Else Debug.Print “Studentul cu nr. pentru a afişa un mesaj potrivit pentru fiecare situaţie.NoMatch = False nPromovate = nPromovate + 1 strRez = strRez & vbCrLf & rst!IdCurs rst.

rst.Close End Sub

8.7.8.3. Criterii ce conţin şiruri de caractere şi date Atunci când doriţi să creaţi criterii pentru una dintre metodele Find sau atunci când creaţi în VBA şiruri de caractere ce conţin instrucţiuni SQL, va trebui de multe ori să introduceţi într-un asemenea şir valoarea unei variabile. Access cere ca această variabilă să fie inclusă în şir între separatori ((“) pentru şiruri de caractere şi (#) pentru date). De exemplu, să presupunem că avem o variabilă, strNume, de tip String, care conţine un nume pe care să-l căutăm într-un set de înregistrări cu ajutorul metodei FindFirst şi, la un moment dat, valoare ei este “Popescu”. Şirul de caractere care constituie crietriul de căutare este: [Nume] = “Popescu” Pentru a introduce caracterul (“) într-un şir de caractere, trebuie să îl dublăm. Ţinând cont de aceasta, şirul de caractere care ne dă crietriul de mai sus este: “[Nume] = ““Popescu””” Separând şirul “Popescu”, care este aici doar un caz particular, vom scrie: “[Nume] = “”“ & “Popescu” & “””” Înlocuind acum valoarea “Popescu” cu variabila strNume, obţinem şirul de caractere care ne dă criteriul dorit: “[Nume] = “”“ & strNume & “””” Acelaşi lucru este valabil şi pentru date. Astfel, pentru a specifica următorul criteriu: [Data Angajarii] = varData unde varData este o variabilă de tip Date, vom construi următorul şir de caractere: “[Data Angajarii = #” & varData & “#”
Pag. 170

Data pe care o conţine variabila varData trebuie să fie în formatul mm/dd/yy, altfel, nu veţi obţine rezultatul dori. Vă reamintim că pentru a converti o dată la formatul mm/dd/yy, puteţi folosi funcţia Format: Format (varData, “mm/dd/yy”) Pentru criterii ce conţin valori numerice, totul este mult mai simplu, astfel că pentru a avea următorul criteriu: [IdCurs] = nCurs vom scrie şirul de caractere: “[IdCurs] = “ & nCurs

8.7.9 Semne de carte În plus faţă de metodele pentru parcurgerea unui set de înregistrări, Access vă mai pune la dispoziţie şi proprietatea Bookmark (semn de carte) a unui astfel de obiect. După cum aţi văzut, fiecare set are o singură înregistrare curentă. Un Bookmark este o proprietate a cărei valoare identifică unic înregistrarea curentă a setului la un moment dat. Puteţi atribui această valoare unei variabile de tip String sau Variant pentru a o folosi ulterior la regăsirea înregistrării respective. Mai exact: 1. Regăsiţi valoarea proprietăţii Bookmark a înregistrării curente şi o stocaţi într-o variabilă de tip String sau Variant. 2. Pentru a vă întoarce ulterior la acea înregistrare, daţi proprietăţii Bookmark valoarea stocată anterior. Astfel, puteţi păstra oricâte semne de carte doriţi pentru un anumit set de înregistrări. Lucrul cu semne de carte este metoda cea mai simplă de deplasare între înregistrările unui set. În mare, iată cum veţi folosi în codul dumneavoastră proprietatea Bookmark a unui set de înregistrări: Dim strBM As String strBM = rst.Bookmark ‘ne deplasam la ultima inregistrare rst.MoveLast ‘…efectuam diferite operatii si apoi revenim de unde am plecat rst.Bookmark = strBM De multe ori veţi dori, poate, să comparaţi două semne de carte pentru a vedea dacă înregistrarea curentă este aceeaşi cu cea pentru care aţi salvat un semn de carte.
Pag. 171

Pentru aceasta, trebuie să ştiţi că, deşi puteţi stoca un semn de carte într-o variantă de tip String sau Variant, ea este reprezentată intern ca o matrice de biţi. De aceea, atunci când comparăm două semne de carte, comparaţia trebuie să fie făcută pe biţi. Pentru aceasta, puteţi folosi funcţia predefinită StrComp, care returnează valoarea 0 dacă cele două variabile comparate sunt egale şi care primeşte un al treilea argument (primele două sunt variabile de comparat), ce specifică modul în care se va face comparaţia: 0 pentru compraţie pe biţi, 1 pentru comparaţia obişnuită (care nu e case-senzitivă, adică nu ţine cont de majuscule/minuscule), 2 pentru a folosi tipul de comparaţie specificat de opţiunea Option Compare de la secţiunea (General)(Declarations) a modulului. De exemplu, dacă strBM1 şi strBM2 sunt două semne stocate anterior, NRez = StrComp(strBM1, strBM2, 0) NRez va avea valoarea 0 dacă cele două semne de carte coincidşi o valoare diferite de zero, altfel. Seturile de înregistrări bazate pe tabele native Access acceptă proprietatea Bookmark, spre deosebire de cele bazate pe tabele din alte baze de date (Paradox, de exemplu). De aceea, înainte de a folosi semne de carte pentru un obiect de tip Recordset, este bine să testaţi dacă el acceptă această proprietate. În acest scop, verificaţi dacă proprietatea Bookmarkable a setului are valoarea True. 8.7.10 Metoda Clone (clonare) Orice set de înregistrări are o singură înregistrare curentă. Dacă doriţi să lucraţi cu două înregistrări curente pe acelaşi set de date, puteţi folosi metoda clone pentru a crea o clonă a setului. Astfel, vom avea două obiecte de tip Recordset indicând spre acelaşi set de înregistrări. Această metodă este mult mai rapidă decât dacă am crea un al doilea set bazat pe aceleaşi date. Atunci când lucraţi cu clone, ţineţi cont de următoarele două probleme: 1. Un set de înregistrări creat cu metoda Clone nu are de la început o înregistrare curentă. Pentru că o înregistrare a sa să devină curentă, apelaţi una dintre metodele Find sau Move sau daţi proprietăţii Bookmark o valoare regăsită din setul original. 2. Folosirea ulterioară a metodei Clonei pentru setul original sau pentru cel clonat nu îl afectează pe cel clonat sau, respectiv, pe cel original. 8.7.11 Proprietatea RecordsetClone Dacă metoda Clone este folosită mai ales pentru a lucra cu două înregistrări curente ale aceluiaşi set de date, vom folosi proprietatea RecordsetClone pentru a avea acces la setul de înregistrări al unui formular. Acest lucru este util atunci când dorim să manipulăm setul de date pe care se bazează un formular, fără ca acţiunile noastre să fie vizibile pe formular.
Pag. 172

Pentru a ilustra cum se lucrează cu metoda Clone şi cu proprietatea RecordsetClone, vom scrie funcţia ComparaInreg() ce verifică dacă două înregistrări succesive ale unui set de înregistrări au aceeaşi valoare pentru un anumit câmp. Funcţia primeşte ca argumente variabila frm de tip Form (ce va identifica formularul) şi variabila strCamp de tip String (ce conţine numele câmpului respectiv) şi returnează valoarea True dacă înregistrarea curentă şi cea anterioară conţin aceeaşi valoare a câmpului identificat de argumentul strColoana şi False, altfel. Function ComparaInreg(frm As Form, strCamp as string) As Boolean Dim rst As Recordset Dim rstClona As Recordset ‘obtinem un pointer la setul de inregistrari al formularului Set rst = frm.RecordsetClone ‘sincronizam setul astfel obtinut cu originalul rst.Bookmark = frm.Bookmark ‘pentru a putea lucra cu doua inregistrari curente, ‘clonam setul obtinut anterior si le sincronizam Set rstClona = rst.Clone rstClona.Bookmark = rst.Bookmark ‘daca inregistrarea curenta este prima, returnam valoarea False rstClona.MovePrevious If rstClona.BOF Then ComparaInreg = False Else ‘daca inregistrarea curenta nu este prima, ‘efectuam comparatia cu cea precedenta ei ‘si returnam rezultatul ComparaInreg = (rst(strCamp) = rstClona(strCamp)) End If rstClona.Close End Function Înregistrarea curentă a setului de înregistrări clonat (rstClona) va fi întotdeauna cea precedentă înregistrării curente a setului rst. Iată deci, cum putem lucra cu două înregistrări curente pentru a compara valorile câmpurilor unui set, fără a avea nevoie de variabile în care să păstrăm valorile regăsite. Această funcţie poate fi, de exemplu, apelată din cadrul procedurii de tratare a evenimentului Current a unui formular, pentru a afişa un anumit mesaj sau pentru a efectua diferite alte acţiuni în funcţie de valoarea returnată. 8.7.12 Sortarea şi filtrarea unui set de înregistrări Pentru a sorta un set de înregistrări de tip tabelă, nu trebuie decât să-i stabiliţi proprietatea Index. Vă reamintim că atunci când creaţi un index pe o tabelă, puteţi
Pag. 173

specifica ordinea de sortare crescătoare sau descrescătoare pentru indexul respectiv. Setul va fi sortat exact după ordinea specificată de index. Pentru a crea un set de înregistrări sortat de tip dynaset sau snapshot, puteţi proceda în două moduri: 1. Să creaţi setul pe baza unei instrucţiuni SQL ce conţine clauza ORDER BY: Set rst = db.OpenRecordset(“SELECT * FROM Profesor ORDER BY Nume;”) 2. Să stabiliţi proprietatea Sort pentru dynaset sau snapshot şi apoi să creaţi un nou set pe baza celui sortat. Valoarea proprietăţii Sort este un şir de caractere conţinând coloana după care se va face sortarea şi, opţional, ordinea de sortare (ordinea ascendentă este implicită): rst.Sort = “[Nume]” rst.Sort = “[Nume] Asc” ‘ascendent rst.Sort = “[Nume] Desc” ‘descendent Iată un exemplu în care creăm un set de înregistrări (rst), îl sortăm şi apoi creăm unul nou (rstSortat) pe baza lui: Dim db As Database Dim rst As Recordset Dim rstSortat As Recordset Set db = CurrentDb() Set rst = db.OpenRecordset(“Profesor”, dbOpenDynaset) rst.Sort = “[Nume]” Set rstSortat = rst.OpenRecordset() ‘…efectuam diferite operatii cu rstSortat rst.Close rstSortat.Close Pentru a filtra un set de înregistrări,aveţi de asemenea la dispoziţie două posibilităţi: • Să creaţi setul pe baza unei instrucţiuni SQL ce conţine clauza WHERE. Această metodă poate fi folosită numai pentru a crea seturi pe baza unui obiect din baza de date. • Să stabiliţi proprietatea Filter a unui dynaset sau snapshot pentru a-i restrânge numărul de înregistrări şi apoi să creaţi un nou set pe baza acestuia. Valoarea proprietăţii Filter trebuie să fie un şir de caractere asemănător unei expresii din clauza WHERE a unei instrucţiuni SELECT.
Pag. 174

175 .OpenRecordset(“SELECT FROM Profesor WHERE [Catedra]_ = “”Matematici””. verificaţi dacă proprietatea sa Updatable are valoarea True. să aveţi dreptul să faceţi asta.”) ‘folosim a doua metoda Set rst = db.13 Editarea înregistrărilor unui set de înregistrări Pentru a putea modifica datele unui set de înregistrări trebuie.Iată un exemplu ce creează câte un set de înregistrări folosind cele două metode mai sus amintite: Dim db As Database Dim rst As Recordset Dim rstSQL As Recordset Dim rstFiltrat As Recordset Set db = CurrentDb() ‘folosim prima metoda Set rstSQL = db.OpenRecordset() … Atunci când folosiţi proprietatea Sort sau Filter a unui set de înregistrări.7. Salvează modificările din buffer. Seturile de tip tabelă sau dynaset pot fi modificate numai dacă altcineva nu a blocat tabela respectivă (în cazul aplicaţiilor multiuser).Filter = “[Catedra] = “”Matematici””” Set rstFiltrat = rst. Creează o nouă înregistrare dintr-un buffer.OpenRecordset(“Profesor”. Access vă pune la dispoziţie cinci metode pentru editarea datelor dintr-un set de înregistrări: Metoda Edit AddNew Update CancelUpdate Descriere Copiază înregistrarea curentă dintr-un buffer pentru a permite editarea. Goleşte bufferul fără a salva modificările. Pentru a vă asigua că puteţi modifica datele unui set de înregistrări. ţineţi cont de următoarele: • Ele nu se aplică seturilor de tip tabelă. Pag. • Sortarea sau filtrarea sunt vizibile numai pentru setul creat pe baza celui sortat sau filtrat. dbOpenDynaset) rst. Seturile snapshot şi seturile bazate pe interogări de tip Crosstab sau Union nu permit modificarea datelor. • Crearea seturilor pe baza instrucţiunilor SQL poate fi mai rapidă decât folosirea proprietăţilor Sort şi Filter. mai întâi. 8.

Update End If End With 8.7.Edit ![Nume] = “Popescu Marian” . o editam Else. care poate fi: Valoarea 0 1 2 Constanta intrinsecă dbEditNone dbEditInProgress dbEditAdd Descriere Bufferul e gol Bufferul conţine înregistrarea curentă (s-a apelat metoda Edit) Bufferul conţine o înregistrare nouă (s-a apelat metoda AddNew) 8. dacă există valori implicite).FindFirst “[Nume] = “”Popescu Marin””” ‘daca nu o gasim. Apelaţi metoda Update pentru a salva modificările. Să presupunem că în tabela Profesor s-a introdus greşit numele unui profesor: în loc de “Popescu Marian” s-a introdus “Popescu Marin”.13.Delete Şterge înregistrarea curentă. Modificarea înregistrării curente Pentru a edita înregistrarea curentă a unui set de înregistrări (presupunând că puteţi face acest lucru). 2.NoMatch Then MsgBox “Popescu Marin nu se afla in tabela Profesor” ‘altfel. puteţi verifica valoarea proprietăţii EditMode.7. Pentru a rectifica din program această eroare.13. procedaţi astfel: 1. Apelaţi metoda AddNew pentru a adăuga o nouă înregistrare (valorile câmpurilor vor fi cele implicite. 3. trebuie să efectuaţi următoarele operaţii: 1. Apelaţi metoda Edit pentru a copia înregistrarea curentă în buffer. Pag. Efectuaţi modificările dorite.1. Pentru a vedea dacă în buffer există vreo înregistrare care nu a fost salvată. 176 . afisam un mesaj If .2 Adăugarea unei noi înregistrări la un set de înregistrări Pentru a adăuga o nouă înregistrare la un set (presupunând că puteţi face acest lucru). creaţi setul rst bazat pe tabela Profesor şi scrieţi: With rst ‘cautam inregistrarea pe care dorim s-o editam .

16 vă prezintă alte proprietăţi ce reprezintă obiecte.Update . Aţi făcut deja cunoştinţă cu proprietăţile Me şi RecordsetClone. Introduceţi valorile câmpurilor.Delete .Move 0. Proprietatea A cui este ActiveControl Ecran (Screen) Ce reprezintă Controlul care are focusul. la rândul lor.3 Ştergerea unei înregistrări a unui set de înregistrări Pentru a şterge înregistrarea curentă a unui set nu trebuie decât să apelaţi metoda Delete.NoMatch Then MsgBox “Popescu Marin nu se afla in tabela Profesor” Else . 177 . Apelaţi metoda Update pentru a salva înregistrarea. După ce aţi şters o înregistrare. Tabelul 8. va fi tot cea dinainte acestei operaţii.8.rst .13.2. apelaţi metoda Move cu valoarea proprietăţii LastModified a setului ca argument. Pentru a şterge înregistrarea corespunzătoare profesorului cu numele “Popescu Marin” dintr-un set bazat pe tabela Profesor.AddNew ![Nume] = “Toma Dorel” ![Catedra] = “Fizica” ![IdTitlu] = 2 . după ce aţi adăugat o nouă înregistrare.MovePrevious End If End With 8. pentru ca înregistrarea să fie curentă să fie cea nouă. ea continuă să fie cea curentă. Înregistrarea curentă. alte obiecte. Pag. Obiecte speciale Există anumite proprietăţi ale unor obiecte care reprezintă. .FindFirst “[Nume] = “”Popescu Marin””” If .rst . 3.LastModified End With 8. With . Următorul exemplu adaugă o nouă înregistrare la un set bazat pe tabela Profesor şi face ca înregistrarea curentă să fie cea nouă. scrieţi: With . MovePrevious pentru ca înregistrarea precedentă să fie cea curentă. De aceea.7.

Pentru un raport. reprezintă subraportul găzduit. Setul de înregistrări pe care se bazează formularul. Crearea şi lucrul cu rapoartele Rapoartele reprezintă o metodă prin care datele pot fi prezentate într-un mod intuitiv şi plăcut. Deşi între formulare şi rapoarte există multe asemănări.ActiveForm ActiveReport Form Me Module Parent Ecran (Screen) Ecran (Screen) Subformular. Controlul care a avut anterior focusul. Pentru un formular. Secţiunea formularului sau raportului în care se află controlul. formular sau control Formular sau raport Formular sau raport Control Formularul care are focusul sau care conţine controlul cu focus. Pentru un control de tip Subform. cum ar fi cele de tip Comba box. Ele pot fi tipărite. Însuşi formularul sau raportul respectiv. PreviousControl Formular RecordsetClone Subraport. vizualizate sau exportate într-un alt format. reprezintă subformularul găzduit. reprezintă formularul însuşi. Pentru un control de tip Subreport. reprezintă raportul însuşi. Raportele pot să conţină aproape toate elementele unui formular. Modulul asociat formularului sau raportului respectiv. Puteţi să convertiţi formularele în rapoarte şi vice-versa făcând clic dreapta pe numele formularului sau al raportului în Pag. Raportul care are focusul sau care conţine controlul cu focus.16 CAP:9. raport sau control Report Section Control Tabelul 8. una dintre deosebiri este aceea că rapoartele nu pot fi folosite pentru introducerea datelor. cu excepţia controalelor care presupun acţiuni ale utilizatorului. 178 . Formularul sau raportul ce conţine controlul respectiv.

1.1 Crearea unui raport Pentru a crea un nou raport. din figura 9. o interogare sau o instrucţiune SQL. Auto Report şi Report Wizard. vom folosi Report Wizard. nu trebuie decât să apăsaţi butonul New din pagina Reports a ferestrei Database şi să alegeţi din cutia de dialog New Report una dintre opţiunile AutoReport (Columnar. pentru fiecare student. Pentru a crea însă un raport mai elaborat. mai trebuie să selectaţi numele unei tabele sau interogări din caseta combinată a acestei cutii de dialog. Să presupunem că dorim să creăm un raport care să prezinte. Crearea rapoartelor cu ajutorul programelor Wizard Pentru a crea un formular în mai puţin de un minut.fereastra Database şi alegând opţiunea Save As Report (sau Save As Form) din meniul derulant. Vom crea raportul pe baza interogării Student_Cursuri. 9. raportul creat va fi afişat pe ecran în modul Print Preview. Access vă pune la dispoziţie două programe wizard. manual. pentru ca datele să fie prezentate pe o singură coloană sau Tabular. cursurile opţionale la care s-a înscris.1 Pag. pentru prezentarea datelor sub formă de tabel). 9. După ce aţi apăsat butonul OK. Datele unui raport pot proveni dintr-o tabelă. 9. 179 .1. În plus. Acestea sunt utile mai ales atunci când sursa de date a raportului este simplă sau pentru a crea un raport de pornire pe care să îl perfecţionaţi ulterior.1: Fig.

PrenumeSt. prezentate în lista Available Fields. Să zicem că am dori Pag. NumeSt. deja există două niveluri: primul conţine informaţii despre un student: NrMatricol. Grupa. După cum puteţi vedea. 180 . Fig.3 Următoarea cutie de dialog vă permite să stabiliţi şi alte niveluri de grupare a datelor.De data aceasta. Fig. 9. În prima cutie de dialog. alegeţi din caseta combinată Tables/Queries interogarea Student_Cursuri şi apăsaţi butonul (>>) pentru a selecta toate câmpurile acestei interogări. de cele din tabela Curs_Student sau de cele din tabela Student. Deoarece dorim să vedem cursurile la care s-a înscris fiecare student şi nu studenţii care s-au înscris la fiecare curs. iar al doilea. vom alege ca gruparea să se facă în funcţie de tabele Student. 9. despre cursurile la care acesta s-a înscris: Denumire şi Nota. alegeţi din cutia de dialog New Report opţiunea Report Wizard.2 Cea de-a doua cutie de dialog din wizard vă întreabă în funcţie de care date să se facă gruparea: de cele din tabela Curs.

9. Fig. Pentru acest exemplu păstraţi totuşi ordinea din figura 9. în această cutie de dialog putem stabili ordinea în care vor fi afişate datele de pe ultimul nivel: Denumire şi Nota. Pentru aceasta puteţi folosi butoanele Priority (↑ şi ↓).ca. 9.5 şi apăsaţi butonul Next. Pentru aceasta. Să zicem că preferăm să afişăm cursurile în Pag.5 Dacă la pasul anterior am stabilit după care coloane se va face gruparea datelor. la rândul lor studenţii să fie grupaţi în funcţie de grupa în care se află. Fig. 181 . selectaţi coloana Grupa din lista din stânga cutiei de dialog şi apăsaţi butonul (>).4 Nu este prea târziu încă să vă răzgândiţi asupra ordinii în care vor fi grupate datele.

minimul sau maximul. va trebuie să alegeţi în prima casetă combinată coloana Denumire. Fig. respectiv. Raportul se va deschide în modul Print Preview şi va arăta în genul celui din figura 9. apăsaţi pe butonul din dreapta casetei combinate.7. Tot în această cutie de dialog există şi butonul Summary Options.6 Următoarele două cutii de dialog vă prezintă câteva variante de aliniere a datelor şi. Aici puteţi alege ca pentru o coloană de pe ultimul nivel să se afişeze şi suma. În ultima cutie de dialog din wizard introduceţi numele raportului (Student_Cursuri) şi apăsaţi butonul Finish.7 Pag. care deschide o altă cutie de dialog. 9. 182 . Pentru aceasta. Dacă doriţi să schimbaţi ordinea de sortare. câteva stiluri de fonturi folosite pentru afişarea lor (pentru acest exemplu vom alege alinierea în trepte (Stepped) şi stilul Compact). media. Fig.ordinea alfabetică a denumirii lor. 9.

sursa de date este interogarea Student_Cursuri. crearea manuală a unui raport o să vi se pară foarte uşoară. Field List (lista câmpurilor) şi Properties (pagina de proprietăţi). Această sursă de date poate fi tabelă sau interogare salvată. aveţi posibilitatea de a alege sursa de date a acestuia din caseta combinată a cutiei de dialog New Report. Sursa de date a raportului Atunci când creaţi un nou raport în Access. Pag. Dacă aţi învăţat cum să proiectaţi un formular.9). Crearea manuală a rapoartelor Dacă vă decideţi să creaţi manual un raport. 9.2. aceleaşi tipuri de controale şi aceleaşi ferestre suport: ToolBox (cutia cu instrumente).2. 183 . sursa de date este specificată de proprietatea Record Source.8 prezintă formularul Student_Cursuri în modul Design View.1. Se va deschide în modul Design View un raport fără nici un control pe el. după cum puteţi vedea şi din pagina de proprietăţi a raportului Student_Cursuri (figura 9. Vom avea de-a face cu aceleaşi categorii de secţiuni. pornind de la zero.8 9. alegeţi în cutia de dialog New Report opţiunea Design View. Pentru raportul pe care l-am creat anaterior. Figura 9. Singurul element nou îl constituie fereastra Sorting and Grouping (sortare şi grupare) care vă va ajuta să stabiliţi nivelurile de grupare şi ordinea în care vor fi afişate datele. Fig. Ca şi în cazul formularelor.9.

modificând valoarea acestei proprietăţi. 9. ca un titlu pentru întregul raport. Fig. Secţiunile unui raport În figura 9. Cel mai adesea. după cum v-aţi dat seama. conţine titlurile câmpurilor afişate. Pentru ca informaţiile stocate într-un câmp al sursei de date să poată fi afişate în raport.10 puteţi vedea secţiunile raportului Student_Curs şi. • Page Header – Apare în partea de sus a fiecărei pagini. unde apare după antetul raportului. utilizatorul trebuie să furnizeze valorile parametrilor respectivi. • Pag. 184 . pentru a putea vizualiza sau tipări raportul.Fig. 9.9 Puteţi schimba ulterior sursa de date a unui raport. Dacă doriţi să creaţi o pagina separată numai pentru titlul raportului. Dacă interogarea pe care se bazează raportul are parametri.10 Report Header – Apare numai pe prima pagină. trebuie ca grila în QBE proprietatea Show a câmpului respectiv şă fie activată. cu excepţia primeia. ele nu sunt cu mult diferite de secţiunile unui formular.3. 9. alegeţi ca valoare a proprietăţii ForceNewPage a acestei secţiuni opţiunea After Section (după secţiune).

Dacă doriţi ca totalurile să fie afişate pe o pagină separată la sfârşitul raportului. în timp ce altă înregistrare să ocupe o jumătate de pagină sau chiar mai mult. Proprietăţile unui raport Pentru a deschide pagina de proprietăţi a unui raport. că secţiunea Page Footer a raportului Student_Cursuri conţine două casete de text. eventual. ce au ca surse de date expresiile: Now () şi =”Page “ & [Page] & “ of “ & [Pages] Prima afişează data curentă. • Page Footer – Apare în partea de jos a fiecărei pagini a raportului. Report Footer – Apare numai pe ultima şi poate conţine totaluri ale datelor diverselor secţiuni ale raportului. Pentru a tipări aceste informaţii în subsolul de pagină al unui raport. adăugaţi la această secţiune o casetă text. 185 . De exemplu. daţi proprietăţii ForceNewPage a acestei secţiuni valoarea Before Section (înaintea secţiunii). vă prezentăm câteva dintre proprietăţile cu care veţi lucra cel mai des pentru a determina comportamentul raportului. alegeţi opţiunile Page Numbers şi. numărul total de pagini. care să afişeze titlurile câmpurilor ce definesc grupul respectiv şi totaluri în cadrul grupului. un raport poate avea un număr de antete şi subsoluri de grup. iar variabila [Pages]. • Record Source – Sursa de date a raportului poate fi o tabelă. a cărei proprietate Control Source să aibă valoarea:=Sum ([Nume_Control]). este foarte posibil ca o înregistrare să nu aibă nimic într-un câmp de tip memo. respectiv. Variabila [Page] are ca valoare numărul paginii curente.Detail – Se repetă pantru fiecare înregistrare la vizualizarea sau la tipărirea raportului. Pag. numărul paginii. în funcţie de fiecare înregistrare în parte. din figura 9. Proprietăţile Can Grow (poate creşte) şi Can Shrink (se poate micşora) ale secţiunii Detail determină pentru aceasta o înălţime variabilă. pagina curentă din numărul total de pagini ale raportului.4. • 9. Cel mai adesea conţine data şi ora şi. Observaţi. o interogare sau o instrucţiune SQL. faţă de aceste secţiuni pe care le-am întâlnit şi la crearea formularelor. procedaţi exact ca în cazul formularelor: faceţi clic pe careul negru din colţul din stânga-sus al raportului în modul Design View şi alegeţi comanda Properties din meniul View. iar cea de-a doua. S-ar putea ca la proiectarea raportului să nu ştiţi exact cât de înaltă trebuie să fie secţiunea Detail. În plus. Date and Time din meniul Insert.10. În continuare. Pentru a afişa totalul unui control numeric.

• Layout for Print: . 186 .Dacă are valoarea Yes.5. ea se va repeta pe toată pagina. filtrul definit de proprietatea Filter se va aplica.Determină în ce mod imaginea specificată de proprietatea Picture va fi micşorată în cazul în care nu încape în pagină. 9. • Filter On: .Dacă doriţi ca pe fundalul raportului să apară o imagine.bmp.Dacă are valoarea Yes.wmf sau . • Picture Type: .Dacă imaginea specificată de proprietatea Picture este mai mică decât pagina.Determină dacă imaginea specificată de proprietatea Picture va fi tipărită pe toate paginile. • Record Locks: .Stabileşte dacă antetul şi/sau subsolul de pagină va fi tipărit şi pe paginile în care apare antetul şi/sau subsolul raportului. se va face sortarea stabilită de proprietatea Order By. Cea mai bună cale de a descoperi cum lucrează proprietăţile unui raport este totuşi să le testaţi cu diferite valori pe care le pot lua. • Order By On: .Dacă are valoarea Yes.Numele care apare în bara de titlu a formularului în modul Print Preview.Un câmp sau o listă de câmpuri separate prin virgule. numai pe prima. din sursa de date a raportului în funcţie de care va fi stabilită ordinea în care vor fi afişate datele.Numele unei interogări (sau al unei instrucţiuni SQL) care Pag. • Picture Tiling: . . la proiectarea raportului nu veţi putea folosi decât fonturile native ale imprimantei şi pe cele True Type.Arată dacă imaginea specificată de proprietatea picture va fi centrată sau aliniată la stânga sau dreapta paginii.dib. • Picture Pages: .Determină dacă imaginea specificată de proprietatea Picture va fi salvată în baza de date sau va fi păstrată într-un fişier separat. • Picture: . Sortarea şi gruparea datelor • Filter: . • Caption: . • Picture Size Mode: .limitează numărul de înregistrări din tabela de bază ce vor fi afişate în raport. aici puteţi introduce numele şi calea unui fişier cu extensia . . • Picture Alignment: . alţi utilizatori nu vor putea modifica datele din tabelele de bază ale raportului atâta timp cât acesta nu este vizualizat sau tipărit (pentru aplicaţi multiuser).Dacă are valoarea All Records (toate înregistrările).emf. sau pe nici una. • Order By: . • Page Header şi Page Footer: .

în timp ce raportul Student_Cursuri este deschis în modul Design View. vom adăuga unul. în acest exemplu). De exemplu. • Group Footer: Dacă are valoarea Yes. dar în cadrul acestui capitol. pentru fiecare grupă. acest antet conţine o casetă de text care are ca sursă de date chiar această coloană. Cheia de sortare cea mai semnificativă se află pe prima poziţie din lista Field/Expression (Grupa. respectiv. în ordinea alfabetică a denumirilor lor. se vor afişa cursurile la care acesta s-a înscris. 9. Access va considera ca făcând parte din acelaşi grup doar înregistrările pentru care valorile Pag. nici unul dintre grupurile definite nu are subsol.Dacă veţi alege comanda Sorting and Grouping din meniul View. vă permite să stabiliţi ordinea de sortare a înregistrărilor. Access va crea pentru acest câmp o secţiune subsol. Fig. pentru fiecare student. unde aţi putea include controale care să afişeze diferite totaluri pentru grupul respectiv. Urmează apoi coloanele NrMatricol şi. Denumire.11. • Group On: Dacă valoarea sa este Each Value.11 Posibilitatea de grupa şi de a sorta înregistrările este ceea ce deosebeşte rapoartele de formulare. Cutia de dialog din figura 9. Deocamdată.11. Cu alte cuvinte. se va deschide cutia de dialog prezentată în figura 9. Access va crea pentru acest câmp o secţiune antet. se vor afişa toţi studenţii. alegeţi în câmpul corespunzător din coloana Sort Order cealaltă opţiune (Descending (descendentă) dacă iniţial ordinea era Ascending (ascendentă) şi invers). Pentru fiecare câmp din listă puteţi stabili cinci proprietăţi: • Group Header: Dacă are valoarea Yes. pentru coloana Grupa. 187 . în care puteţi include ce controale doriţi. în ordinea crescătoare a numerelor lor matricole şi. Dacă veţi dori să inversaţi ordinea de sortare pentru un anumit câmp din această listă.

se va trece la o pagină nouă. eventual. Dacă valoarea sa este Interval (pentru câmpuri numerice). pentru fiecare valoare a câmpului.câmpului respectiv sunt egale. deschideţi fereastra Sorting and Grouping şi daţi proprietăţii Group Footer a acestui grup valoarea Yes. Dacă are valoarea With First Detail (numai primul detaliu). pentru coloane de tip sate/time. trimestre. Cu alte cuvinte. Pentru câmpuri de tip text. 9. pentru fiecare student. • Group Interval: Dacă valoarea proprietăţii Group On este alta decât “Each Value”. “Month” etc.12: Pag. “Quarter”. media ar trebuie să fie afişată în subsolul grupului determinat de coloana NrMatricol dar.10. această proprietate mai poate avea valorile “Year”. acest grup nu are subsol. grupurile se vor extinde la toate înregistrările pentru care valoarea câmpului respectiv se află într-un interval specificat. va avea un antet şi/sau un subsol. Am mai spus că cel mai bun loc pentru a afişa totaluri este subsolul unei secţiuni sau al unui grup. după cum puteţi vedea şi în figura 9. Pentru a adăuga un subsol pentru grupul NrMatricol. Dacă are valoarea Whole Group (întregul grup). Access va crea un grup separat care. Dacă ele nu încap în pagina curentă. Pentru exemplul nostru. avem opţiunea Prefix Characters care va considera ca făcând parte din acelaşi grup toate înregistrările pentru care valoarea câmpului respectiv începe cu aceleaşi n caractere. De asemenea. • Keep Together: Dacă are valoarea No. luni etc. unde n este valoarea proprietăţii Group Interval. Folosirea funcţiilor agregat în cadrul rapoartelor Raportul Student_Cursuri ar furniza mai multă informaţie dacă ar afişa. Access va trece la o pagină nouă numai atunci când pagina curentă este plină. media cursurilor opţionale la care s-a înscris. 188 . Acum nu mai trebuie decât să plasaţi în acest subsol o casetă de text şi să daţi proprietăţii RecordSource ca valore expresia: =Avg ([Nota]) Eventual. Access va crea subsolul NrMatricol Footer şi îl va plasa între secţiunea Detail şi secţiunea Page Footer. proprietatea Group Interval defineşte intervalul în care se poate afla valoarea câmpului respectiv pentru a face parte dintr-un grup.6.. Acum formularul deschis în modul Design View va arăta ca în figura 9. daţi proprietăţii Caption a etichetei asociate valoarea “Media:” iar proprietăţii Name a casetei. Access va trece la o pagină nouă dacă antetul şi cel puţin prima înregistrare de la secţiunea Detail a grupului nu încap pe pagina curentă. valoarea txtMedia. subsolul şi secţiunea Detail a grupului să se afle pe aceeaşi pagină. Access va face tot posibilul ca antetul. înregistrările putând fi astfel grupate pe ani.

să creaţi expresii în care să folosiţi funcţii agregat şi să le afişaţi drept totaluri: =Sum([Nota]) / Count([Denumire]) 9. puteţi crea atâtea sub-totaluri câte grupuri are raportul. Count([câmp_numeric]) (pentru a număra înregistrările). Min([câmp_numeric]) (pentru a afla minimul) şi Max([câmp_numeric]) (pentru a afla maximul). este acela că Access restrânge numărul de înregistrări pentru care se face agregarea numai la grupul curent. Alte funcţii agregat pe care le veţi folosi frecvent sunt: Sum([câmp_numeric]) (pentru calcularea sumelor). Astfel. apoi. funcţia va calcula totalul pentru toate înregistrările raportului.Fig. iar dacă o includeţi la secţiunea Report Header sau Report Footer. Puteţi. atunci când folosim funcţii agregat în rapoarte.12 Cel mai important lucru. 9.7. Dacă o includeţi la secţiunea Page Header sau Page Footer. aspectul său ar mai putea fi îmbunătăţit: Pag. dacă includeţi o funcţie agregat în cadrul antetului sau subsolului unui grup. vor fi luate în considerare numai înregistrările care fac parte din acel grup. Astfel. Editarea rapoartelor Am creat mai devreme raportul Student_Cursuri folosind Report Wizard şi. Deşi raportul ne oferă multe informaţii utile. i-am adăugat o casetă de text a cărei sursă de date este o funcţie agregat. de asemenea. funcţia va lua în considerare numai înregistrările din pagina respectivă. 189 .

Pentru ca numărul de ordine să fie incrementat cu unu la fiecare student. daţi proprietăţii Can Grow a controlului respectiv valoarea Yes. Pentru a schimba aceste valori. astfel. am putea introduce numere de ordine.titlurile coloanelor ar putea fi schimbate (Access a folosit numele câmpurilor. am putea evidenţia anumite texte şi. în pagina lor de proprietăţi. care nu sunt întotdeauna intuitive şi prezentabile). introduceţi “Cursuri”. doar “Nume” şi “Prenume”. textul va fi aliniat la stânga controlului. Pag. alegeţi explicit una dintre celelalte valori ale proprietăţii Text Align: “Left” (la stânga). daţi proprietăţii Running Sum a acestei casete de text valoarea “Over All”. controlul va fi redimensionat automat. daţi proprietăţii Font Weight a casetei de text valoarea “Bold” şi. Pentru ca mediile să fie afişate cu exact două zecimale. Acesta poate fi şi cazul casetei de text care afişează denumirile cursurilor. adăugaţi la secţiunea “NrMatricol Header” o nouă casetă de text (ştergeţi eticheta asociată. Pentru aceasta. Pentru a schimba titlurile coloanelor. selectaţi etichetele corespunzătoare de la secţiunea Page Header şi. Astfel. Dacă proprietatea “Text Align” (alinierea textului) a unei etichete are valoarea “General”. textele vor fi aliniate la stânga iar valorile numerice sau de tip date/time vor fi aliniate la dreapta. 190 . valoarea 2. Să presupunem că în dreptul fiecărui student dorim să apară al câtelea este în cadrul raportului. Chiar şi titlul raportului ar putea fi îmbunătăţit. Dacă am fi dorit ca numerotarea să reînceapă pentru fiecare grupă. De asemenea. eventual. Bineînţeles că toate aceste modificări nu vor putea fi făcute decât în modul Design View. de exemplu. iar în loc de “Denumire”. introduceţi. Dacă observaţi că pentru anumite valori ale înregistrărilor textul care trebuie să apară într-un control nu se vede în întregime deoarece controlul nu este suficient de mare. a cărei proprietate Control Source să fie =1. modificaţi proprietatea Caption: în loc de “NumeSt” şi “PrenumeSt”. selectaţi cutia de text txtMedia adăugată la secţiunea anterioară şi daţi proprietăţii Format valoarea “Fixed” iar proprietăţii Decimal Places. Probleme de aspect ar mai putea ridica şi alinierea textului în controale. “Center” (centrat) şi “Right” (la dreapta). ar fi bine să o evidenţiem într-un fel. deoarece nu ne trebuie). iar dacă aceeaşi proprietate a unei casete de text are această valoare. valoarea proprietăţii Running Sum ar fi trebuit să fie “Over Group”. media fiind o informaţie importantă. din “Student_Cursuri” în “Studenti si Cursuri”. mediile vor fi scrise îngroşat. Pentru aceasta. Un alt element des întâlnit în rapoarte îl reprezintă numerele de ordine. formatul în care sunt afişate mediile ar trebui modificat astfel încât să aibă numai două zecimale. ca să poată afişa textul în întregime.

DatabaseName_ [. din care face parte Access. Source. DoCmd. FOLOSIREA DATELOR EXTERNE Rolul principal al unei baze de date este stocarea informaţiilor. vă veţi da seama că facilităţile de import şi export sunt extrem de simple şi flexibile. Access poate schimba date cu patru tipuri de aplicaţii: • Fişiere de tip text • Mesaje poştale • Baze de date • Foi de calcul tabelar De obicei. StructureOnly][. pe care doriţi să le înlocuiţi cu Access. În acest capitol. se va prezenta: • Să importaţi date în Access • Să exportaţi date din Access • Să expediaţi date prin poşta electronică • Să folosiţi date din baze de date externe 10. puteţi alege un format standard. la baze de date stocate pe servere de dimensiuni medii şi până la baze de date stocate pe calculatoare mainframe de dimensiuni foarte mari. aţi învăţat cum sunt stocate datele în Access şi cum să le manipulaţi după ce acestea se găsesc în baze de date. pentru transferul datelor între baze de date se foloseşte metoda TranferDatabase a obiectului DoCmd. pentru a face schimb de date ar trebui să cunoaşteţi formatul respectiv. Destination [.1.CAP:10. ori cu sisteme private moştenite. ci doar despre cele mai importante. Dacă vreţi să schimbaţi date cu un program care nu apare în listă. nu trebui să cunoaşteţi detalii despre toate aplicaţiile. Mai trebuie să aflaţi cum puteţi transfera date în şi din Access şi cum să folosiţi date din alte baze de date. 191 . SaveLoginID] Pag.TransferDatabase [TransferType]. DatabaseType. În Access. Până acum. care să poată fi citit atât de programul respectiv. cât şi de aplicaţia dumneavoastră. 10.1 Copierea în sau din alte aplicaţii Desigur. În oricare dintre cazuri. există mii de aplicaţii care stochează informaţii şi ar fi util să puteţi schimba date cu acestea. Deoarece fiecare aplicaţie stochează datele într-un format propriu. ObjectTye]. Din fericire.1 Baze de date Bazele de date diferă de la sisteme desktop mici. veţi lucra cu baze de date sau foi de calcul mai vechi.

DatabaseType DatabaseName ObjectType Source Destination StructureOnly SaveLoginID Exerciţiu:. Tipul bazei de date în care sau din care doriţi să efectuaţi transferul. care poate fi unul din următoarele: acTable acQuery acForm acReport acMacro acModule Dacă argumentul nu este completat.0 FoxPro 2. Trebuie să fie True dacă obiectul este un tabel şi se transferă doar structura. Tipul de obiect implicat în operaţie.5 Jet 2. 192 .x FoxPro DBC Paradox 4. va trebui să parcurgeţi procesul de conectare de fiecare dată când accesaţi sursa de date. Numele obiectului din care provin datele. Se foloseşte numai pentru surse de date ODBC. care poate fi una dintre următoarele: acImport pentru a importa date acExport pentru a exporta date acLink pentru a lega date Dacă lăsaţi acest argument necompletat.x dBase III Paradox 5. numele de conectare (login) şi parola vor fi memorate pentru conexiunile următoare. Poate fi una din următoarele: Microsoft Access FoxPro 3. Dacă este True.Parantezele pătrate indică un argument opţional. vor fi copiate şi datele. Să analizăm în detaliu argumentele acestei metode: Argument TransferType Descriere Acţiunea pe care doriţi să o executaţi. Valoarea implicită este False.6 ODBC Numele complet al bazei de date respective. Valoarea implicită este False. se foloseşte valoarea implicită acImport. Dacă este False. Dacă este False. se foloseşte valoarea implicită acTable. inclusiv calea. Numele obiectului în care sunt transferate datele.0 Paradox 3.Comanda TransferDatabase Pag.x FoxPro 2.x dBase IV FoxPro 2.0 dBase 5.

2. adăugăm comanda TransferDatabase în procedura de tratare a evenimentului clic. Deoarece în viitor vom executa operaţiunea de export la intervale regulate.mdb. Pag. într-un tabel numit Lista Cursuri. 1. fiind creată prima intrare. 5. Trebuie să activăm butonul Export astfel încât. Veţi vedea că există deja un grup de opţiuni. Denumiţi noua bază de date Brochure (Broşură) şi salvaţi-o în directorul BegVBA (sau în directorul care conţine bazele de date de exemplificare). 4. Închideţi orice bază de date pe care aţi deschis-o anterior şi alegeţi New Database… (o nouă bază de date) din meniul File. 3. Această acţiune va lansa în execuţie noua procedură. Pentru aceasta. vom crea acum un formular şi îl vom configura ca pe o componentă permanentă.mdb. Whisky Shop trebui să tipărească o broşură de prezentare a ofertei.TransferDatabase acExport. _ "C:\BegVBA\Brochure. În pagina etichetei General. lista de băuturi să fie exportată automat în baza de date Brochure. acesta va fi înlocuit.MDB". Deschideţi formularul Outside World. acTable. iar editurile cer ca lista de băuturi să fie transmisă în format de bază de date. iar tabelul este deja inclus. 6.La fel ca majoritatea magazinelor. Selectaţi opţiunea Export to Brochure Database şi executaţi clic pe butonul Export din formular. frmOutsideWorld. dacă se execută clic asupra lui atunci când opţiunea de deasupra este selectată. Dacă efectuăm exportul într-o bază de date existentă. "Microsoft Access". În continuare. Adăugaţi comanda TransferDatabase în forma următoare: Private Sub cmdExport_Click() Select Case fraExportType Case 1 DoCmd. determinând exportul listei de băuturi din tabelul Curs în noua bază de date. Închideţi fereastra modulului şi treceţi în modul de afişare Form. selectaţi opţiunea Blank Database (Bază de date goală) şi executaţi clic pe OK. 193 . în modul de afişare Form. vom crea această bază de date. "Lista Cursuri" End Select End Sub Am folosit o instrucţiune Select Case care ne permite să adăugăm ulterior în formular şi alte butoane de opţiune. "Curs". Treceţi în modul de afişare Design şi alegeţi evenimentul On Click din foaia de proprietăţi. Acum închideţi această bază de date şi deschideţi fişierul Student.

9. 8. pe care am analizat-o în secţiunea precedentă. creaţi un tabel care să cuprindă elementele care trebuie salvate şi momentul declaşării acestei operaţii. 7. Pentru a transfera date în sau dintr-o foaie de calcul tabelar. _ TableName. Argument TransferType Descriere Acţiunea pe care doriţi să o executaţi. nu veţi lucra prea mult cu ea. care este foarte puternic.1.mdb.mdb. folosiţi metoda TransferSpreadsheet a obiectului DoCmd: DoCmd. Range] Argumentele sunt similare cu cele ale comenzii TransferDatabase. şi deschideţi Brochure. salvând modificările efectuate în formular. HasFieldName] [. complete sau parţiale. Tabelul poate fi vizualizat şi editat. SpreadsheetType]. În acest scop. 10. De exemplu. iar transferul datelor se realizează foarte uşor. anticipaţi ceea ce veţi vedea pe ecran.TransferSpreadsheet [TransferType] [. însă nu are nici un rost. FileName [. iar dumneavoastră aveţi posibilitatea să modificaţi câmpul CursID. Deschideţi tabelul pentru a vedea datele. De obicei. Treceţi formularul în modul de afişare Design şi executaţi clic pe butonul Export. din moment ce există instrumentul numit Microsoft Excel. care conţine acum noul tabel. Înainte de a deschide fişierul Brochure. 194 . Access 97 este ideal pentru interogarea datelor şi realizarea de rapoarte.mdb.2 Foi de calcul tabelar Transferul datelor în foi de calcul este una dintre cele mai apreciate facilităţi de transfer. însă atunci când doriţi să analizaţi date numerice. Deşi comanda TransferDatabase este foarte flexibilă. care poate fi una dintre următoarele: acImport pentru a importa date Pag. cel mai bine este să folosiţi o foaie de calcul tabelar. puteţi folosi această comandă pentru a implementa o procedură automată de salvare de siguranţă (backup). ale unei baze de date.Închideţi fişierul Student. este folosită pentru a converti baze de date din sisteme mai vechi în Access 97 sau pentru a face copii de siguranţă. astfel încât aplicaţia să poată verifica periodic acest tabel şi să execute o comandă TransferDatabase pentru obiectele şi în momentele specificate. Puteţi analiza numere şi în Access.

folosiţi metoda TransferSpreadsheet aproape în acelaşi format ca mai sus. argumentul trebuie să aibă valoarea True. se foloseşte valoarea False. Mulţi utilizatori încearcă să evite bazele de date. 195 . Trebuie să conţină domeniul de celule sau numele domeniului care va fi importat. Importul datelor din foile de calcul se realizează la fel de simplu. având impresia că sunt prea complexe. valoarea trebuie să fie False. Se aplică numai la operaţiile de import. În mod implicit. Dacă este lăsat necompletat. Constantele pe care le puteţi folosi sunt următoarele: acSpreadsheetTypeExcel13 acSpreadsheetTypeExcel14 acSpreadsheetTypeExcel15 acSpreadsheetTypeExcel17 acSpreadsheetTypeExcel97 acSpreadsheetTypeExcelLotusWK1 acSpreadsheetTypeExcelLotusWK3 acSpreadsheetTypeExcelLotusWK4 acSpreadsheetTypeExcelLotusWJ2 (doar versiunea japoneză) Numele tabelului sau interogării implicate în transfer. va fi importată întreaga foaie de calcul. Dacă doriţi să folosiţi primul rând al tabelului sursă sau al foii de calcul pentru numele câmpurilor din tabelul sau foaia de calcul destinaţie. Numele fişierului care conţine foaia de calcul.SpreadsheetType TableName FileName HasFieldName Range acExport pentru a exporta date acLink pentru a lega date Dacă lăsaţi acest argument necompletat. În capitolele următoare. Un număr reprezentând tipul de foaie de calcul în sau din care efectuaţi transferul. inclusiv calea. Totuşi. se foloseşte valoarea implicită acImport. împărţindu-le în tabele. dacă doriţi să trataţi primul rând ca pe nişte date obişnuite. veţi întâlni şi alte exemple de transfer al datelor în Excel. la un moment dat. Pag. În acest caz. datele devin prea complicate pentru a fi stocate într-o foaie de calcul tabelar şi va trebui să le importaţi într-o bază de date.

1. SpecificationName]. care poate fi una dintre următoarele: acExportDelim acExportFixed acExportHTML acExportMerge acImportDelim acImportFixed acImportHTML acLinkDelim acLinkFixed Pag. care necesită ca toate câmpurile şi înregistrările să aibă poziţii prestabilite în cadrul fişierului . Prima foloseşte fişiere de text cu caractere delimitatoare. Ambele tehnici de lucru folosesc metoda TransferText a obiectului DoCmd: DoCmd.3 Fişiere de text Există două modalităţi de a importa şi exporta date de tip text. _ TableName. FileName [. HTMLTableName] Argumentele sunt similare cu cele ale metodelor prezentate anterior: Argument TransferType Descriere Acţiunea pe care doriţi să o executaţi.10. HasFieldNames] [.fiecare înregistrare (şi câmp pe care îl conţine) are acelaşi număr de caractere ca toate celelalte înregistrări. 196 . A doua metodă foloseşte fişiere de text cu lăţime fixă.TransferText [TransferType] [. în care un anumit caracter determină unde se termină un câmp şi începe altul.

Numele tabelului (sau listei) din documentul HTML pe care doriţi să le importaţi sau să îl exportaţi.1. mai puţin în cazul în care aţi specificat un transfer HTML (acExportHTML sau acImportHTML). va trebui să transmiteţi de fiecare dată valori pentru o mulţime de argumente. este folosit primul tabel (sau prima listă). camp 3. iar numele acestui grup de informaţii este folosit apoi ca argument pentru metoda TransferText. acest caracter este o virgulă. dar nu şi pentru fişierele cu caractere delimitatoare. camp 4 Încercaţi singur . Adăugaţi un nou buton de opţiune în formularul Outside World. acestea sunt stocate de obicei pe disc ca o specificaţie. camp 2. Ziariştii s-au arătat interesaţi mai ales de tipurile de whisky vândute şi de perioada calendaristică. se foloseşte valoarea implicită False. ori numele interogării ale cărei rezultate doriţi să le exportaţi. Pag. deci fişierul de text va conţine linii de cod de genul: camp 1. În majoritatea cazurilor. exportaţi sau legaţi. Numele tabelului pe care doriţi să îl importaţi. 197 . Numele fişierului de text. se foloseşte valoarea implicită acImportDelim.4 Fişiere de text cu caractere delimitatoare Fişierele de text cu caractere delimitatoare folosesc un caracter special pentru a separa câmpurile înregistrărilor. Această opţiune este ignorată. Dacă lăsaţi argumentul necompletat. Etichetaţi acest buton ca în figura alăturată: Adăugaţi următoarea secevnţă de cod la instrucţiunea Select Case din procedura care tratează acţionarea butonului Export. inclusiv calea.Comanda TransferText Magazinul Whisky Shop a fost inclus recent în ancheta unei reviste care încearcă să determine tendinţele în cumpărarea de whisky. Numele specificaţiei de import/export. Dacă argumentul este lăsat necompletat. Pentru a-i ajuta. (Deoarece când lucraţi cu fişiere de text rebuie să furnizaţi multe valori de configurare. 10. Acesta va avea valoarea 3. Este True dacă primul rând al fişierului de text conţine numele de câmpuri şi False în caz contrar. le transmitem o listă în format text cu caractere delimitatoare. Vom mai vorbi despre specificaţii în cele ce urmează).SpecificationName TableName FileName HasFieldName HTMLTableName acLinkHTML Dacă lăsaţi acest argument necompletat. Altfel. Vom detalia acest argument în secţiunea despre Internet. Este obligatorie pentru fişierele cu lăţime fixă.

Completaţi instrucţiunea Select Case cu următoarea secvenţă de cod: Pag. "qryMonthlyWhiskyCount". Utilizarea ghilimelelor în jurul textului este importantă.1. pentru că utilizarea necorespunzătoare a virgulelor şi ghilimelelor poate avea rezulate imprevizibile. Deschideţi în programul Notepad fişierul C:\BegVBA\Survey.2 Compunerea mesajelor poştale Ţinând cont de cantităţile mari de informaţii care sunt înregistrate în bazele de date. apostroful este un caracter valabil într-un şir. Observaţi că specificaţia implicită cuprinde o virgulă ca separator de câmpuri şi ghilimele pentru text. Acest tip de fişier este numit Comma Separated Value (sau CSV) (adică fişier cu valori separate prin virgule) şi reprezintă cea mai sigură formă de transfer. această tehnică ar permite expedierea unor mesaje poştale către toţi clienţii magazinului Whisky Shop. selectaţi al treilea buton de opţiune şi executaţi clic pe Export. True 1. 10. pentru că astfel.txt. este foarte important să puteţi compune (combina) datele în cadrul unor documente obţinute în editoare de text. Încercaţi singur . o virgulă dintr-un şir de text nu mai poate fi confundată cu un separator de câmpuri. trebuie să fiţi foarte atent la ghilimelele care apar în cadrul textului. De exemplu. de data aceasta cu valoarea 4.TransferText acExportDelim.Crearea unui fişier de compunere a mesajelor poştale Puteţi folosi facilităţile de export din Access 97 pentru a crea un fişier de compunere a mesajelor poştale în programul Microsoft Word. Ar trebui să arate ca în figura alăturată. 198 . nu doriţi ca acesta să marcheze sfârşitul câmpului. iar dacă un câmp conţine un apostrof. 10. . pentru a-i anunţa despre oferte speciale sau promoţinale.Case 3 DoCmd. fiind folosit şi recunoscut pe scară largă. Oricum. dar şi despre operaţii curente şi facturi.5 Fişiere de text cu lăţime fixă Cealaltă metodă pentru transferul datelor prin fişiere de text evită orice posibilă confuzie creată de ghilimele. separatoare de câmpuri şi nume de câmpuri. şi etichetaţi-l ca în figura alăturată: 1. Adăugaţi în formularul Outside World un alt buton de opţiune. Cea mai simplă metodă de a crea specificaţii este oferită de aplicaţia Wizard Text Export.txt". _ "C:\BegVBA\Survey. De exemplu. Este bine să verificaţi conţinutul datelor înainte să aplicaţi această metodă. Este necesară utilizarea unei specificaţii care să detalieze numele de câmpuri. locul unde începe fiecare câmp şi dimensiunea acestora. Treceţi formularul în modul de afişare Form.

Trebuie să fie una dintre următoarele constante: Pag. OutputFile] [. veţi întâlni şi alte exemple referitoare la transferul datelor din Access în Word. puteţi folosi metoda OutputTo a obiectului DoCmd: DoCmd. În aceste cazuri. care poate fi folosit ca sursă de date pentru compunerea mesajelor poştale.DOC" Acum treceţi formularul în modul de afişare Form. 2. AutoStart] [. 199 ObjectName OutputFormat .OutputTo ObjectType [. Va fi creat un fişier Microsoft Word cu numele Customers. "qryCompanyAddress". însă vor apărea şi situaţii în care va trebui să exportaţi date din alte obiecte Access. ObjectName] [ OutputFormat] _ [.TransferText acExportMerge. Săgeţile care apar în figura anterioară indică faptul că într-un fişier Word de compunere a mesajelor poştale sunt folosite caractere Tab pentru a separa câmpurile înregistrărilor. Şirurile de text sunt încadrate de ghilimele.doc. _ "C:\BegVBA\Customers. 10. . aţi aflat cum să exportaţi date din tabele sau rezultate în urma unor interogări. TemplateFile] Argumentele sunt prezentate în tabelul următor: Argument ObjectType Descriere Obiectul pe care doriţi să îl exportaţi.Case 4 DoCmd. În capitolele următoare. Formatul în care va fi exportat obiectul.3 Exportul altor obiecte Până acum. Poate fi: acOutputForm acOutputModule acOutputQuery acOutputReport acOutputTable Numele obiectului Access. selectaţi opţiunea de compunere a mesajelor poştale (Mail Merge) şi executaţi clic pe butonul Export.

Chiar dacă Access 97 cunoaşte tipul de fişier pe care îl creaţi. După ce deschideţi formularul frmOutsideWorld. Observaţi că acest raport conţine şi text formatat. În mod similar. se foloseşte valoarea implicită False. Dacă argumentul nu este indicat. Deschideţi formualrul Outside World şi adăugaţi al cincilea buton de opţiune. . care permite includerea formatului în documentul de text şi este standardul Microsoft pentru formatarea documentelor. deschideţi raportul rptWhiskyTotal. Numele şablonului pentru fişiere HTML. Acesta va avea valoarea 5: 3. Încercaţi singur . 2.OutputTo acReport. Vom transfera raportul într-un fişier de tip RTF (Rich Text Format). acFormatIIS pentru Microsoft Internet Information Server. ar trebui să adăugaţi extensia XLS la sfârşitul numelui de fişier. Utilizarea acestui standard asigură lansarea în execuţie a programului Word. Adăugaţi codul următor la instrucţiunea Select Case: 1.OutputFile AutoStart TemplateFile acFormatActiveXServer pentru Microsoft Active Server Pages. acFormatTXT pentru format text Notepad. _ acFormatRTF. Internet. Fiind vorba de un fişier RTF.Comanda OutputTo Din pagina etichetei Report. dacă folosiţi constanta acFormatXLS. acFormatRTF Rich Text Format. acFormatHTML pentru un document HTML. RTF provine de la Rich Text Format (text cu format îmbunătăţit). HTX sau ASP. programul World este lansat automat şi afişează acest document. pentru că Pag. Ţineţi cont de acest comportament dacă folosiţi în rapoarte elemente grafice. True 4. Case 5 DoCmd. nu adaugă sufixul în locul dumneavoastră. Numele fişierului (inclusiv calea) în care trebuie transferat obiectul. 200 . Folosiţi valoarea True pentru a porni automat aplicaţia asociată cu tipul de format extern şi False în celelalte cazuri. alegeţi această opţiune şi executaţi clic pe butonul Export. "rptWhiskyTotal". astfel ca Windows 95 sau Windows NT să poată identifica tipul de fişier. Notă: Observaţi că numele de fişier conţine sufixul RTF. Totuşi. observaţi că linia de deasupra totalului pe regiune nu a fost transferată. "C:\BegVBA\WhiskyTotal. acFormatXLS pentru format Microsoft Excel. Vom discuta despre acestea în Capitolul 17. s-au păstrat toate elementele de formatare.RTF".

ObjectName] [. Subject] [. 10. Eudora. acestea sunt toate foarte simple: Argument ObjectType Descriere Obiectul pe care doriţi să îl transferaţi. să faceţi cinci copii xerox pe care să le expediaţi la filialele companiei. iar Outlook se ocupă de distribuirea mesajelor. EditMessage]. se foloseşte în mod implicit acSendNoObject. din moment ce Outlook se ocupă de toate problememle de adresare. alegeţi numele destinatarilor din agenda electronică şi transmiteţi raportul respectiv într-un minut.nu mai sunteţi nevoiţi să tipăriţi un raport la imprimantă. Marele avantaj al programului Microsoft Outlook este faptul că poate fi utilizat ca un client unic de poştă electronică pentru diferite tipuri de reţele şi.SendObject [ObjectType [. OutputFormat] [. în exemplele din carte am folosit Microsoft Outlook. Dumneavostră nu faceţi decât să specificaţi adresele. nu numai în reţele locale. MessageText] [. 4 Poşta electronică O altă modalitate de distribuire a datelor este prin poşta electronică. Puteţi transmiteţi mesaje de poştă electronică printr-o diversitate de programe client. CompuServe.) a redus timpul necesar utilizatorilor pentru a obţine informaţiile de care au nevoie . Este o opţiune utilă atunci când doriţi să distribuiţi rapoarte simple. Acum. Internet etc. CC] [. fără să le tipăriţi la imprimantă. se foloseşte metoda SendObject a obiectului DoCmd: DoCmd. _ [TemplateFile] Deşi există mai multe argumente decât în exemplele anterioare. cum ar fi Microsoft Exchange şi Outlook. ci în întreaga lume. America On Line.acestea nu sunt salvate într-un fişier RTF. Pegasus etc. Răspândirea reţelelor globale (MicrosoftNetwork. Poate fi: Pag. Poate fi: acSendForm acSendModule acSendNoObject (doar pentru expedierea unui mesaj poştal) acSendQuery acSendReport acSendTable Dacă lăsaţi acest argument necompletat. Numele obiectului Access. 201 ObjectName OutputFormat . Marele avantaj al utilizării sistemului de poştă electronică (e-mail) este uşurinţa cu care puteţi transmite date. însă şi alte programe client lucrează la fel de bine. Formatul în care se transferă obiectul. To] _ [. Pentru a transfera date prin poşta electronică. BCC] [. nu trebuie să ştiţi ce tip de reţea folosiţi.

una dintre ele foloseşte CompuServe. se foloseşte valoarea implicită False. va avea valoarea 6. puteţi să parcurgeţi procedura fără a o implementa efectiv. Pentru a deschide aplicaţia de poştă electronică imediat (şi a permite editarea). iar a treia Microsoft Exchange. Un şir care conţine linia de subiect a mesajului. Dacă sunt mai mulţi. "Price List". Access vă cere să introduceţi recipientele. trebuie să folosiţi valoarea False.de data aceasta. Însă. Adăugaţi următoarea secvenţă de cod la instrucţiunea Select Case: Case 6 DoCmd. nu trebuie să îl aglomeraţi cu detalii referitoare la poşta electronică. pentru a vedea cât de uşor poate fi adăugată această facilitate în aplicaţiile Access. alta InternetMail. Adăugaţi în grupul de opţiuni un alt buton . _ . "qryWhiskyAndPrices". O listă de destinatari pentru poşta electronică. O listă de destinatari pentru linia bcc. Nu este necesar să ştiţi ce sistem de poştă electronică foloseşte destinatarul.Poşta electronică Este evident că pentru acest exemplu. O listă de destinatari pentru linia cc.SendObject acQuery. Este plasat după obiectul ataşat. 202 . Deoarece acest formular este destinat exportului de date.) (sau caracterul List Separator prezentat în eticheta Number a foii de proprietăţi Regional Settings din panoul de control Windows). Un şir care conţine textul mesajului. . . trebuie doar să specificaţi numele. True Pag. trebuie să folosiţi valoarea True. un raport este transmis mai multor persoane. Access vă cere să alegeţi un format. Dacă lăsaţi acest argument necompletat. Pentru a transmite direct un mesaj. aveţi nevoie de o conexiune la un sistem de poştă electronică. Încercaţi singur . acFormatXLS.To CC BCC Subject MessageText EditMessage TemplateFile acFormatXLS pentru format Microsoft Excel acFormatRTF pentru format RTF Microsoft Word acFormatTXT pentru format de text Notepad acFormatHTML pentru format HTML Dacă lăsaţi acest argument necompletat. chiar în lipsa acesteia. trebuie să folosiţi ca separator caracterul punct şi virgulă (. În exemplul următor. Numele unui fişier (inclusiv calea) care va fi folosit ca şablon pentru documentele HTML. În Access. aşa încât este bine să lăsaţi toate adresele necompletate. Dacă lăsaţi argumentul necompletat. "Here's our latest price list".

puteţi lega datele în baza dumneavoastră de date. Dacă datele se modifică. trebuie spus că Access vă oferă posibilitatea dezvoltării unor sisteme noi de baze de date. însă există situaţii când trebuie să folosim date externe fără să le importăm. În astfel de situaţii. Rulaţi acest fragment de cod selectând al şaselea buton de opţiune în modul de afişare Form şi executând clic pe butonul Export. 203 . puneţi-l la punct fără nici o jenă.datele rămân acolo unde sunt. dacă cineva vă spune că este dificil să comunicaţi prin poşta electronică din Access. însă dumneavoastră aveţi o legătură rapidă la ele. puteţi vizualiza modificările apărute. În cazul în care completaţi linia To în cadrul codului şi apoi configuraţi argumentul EditMessage la valoarea False. fără vreo intervenţie din partea dumneavoastră. puteţi să separaţi componentele back-end şi front-end ale aplicaţiei. 10. Aceasta din urmă include formularele. dar să le folosiţi numai din Access. cc şi bcc sunt necompletate. Legarea permite accesul la informaţiile din bazele de date şi foile de calcul mai vechi. De asemenea. aşa încât sistemul de poştă electronică se va deschide normal şi vă va permite să selectaţi destinatarul (sau destinatarii) din lista de adrese. Astfel.Prin această instrucţiune. am arătat cum pot fi transferate date în şi din Access. în timp ce un sistem nou trebuie dezvoltat de la zero. Deci. poşta electronică este distribuită direct. în timp ce componenta front-end este interfaţa cu utilizatorul. aplicaţia dumneavoastră va fi divizată în două baze de date Access: Pag. permiţându-vă astfel să stocaţi datele într-o varietate de formate. Mai simplu de atât nu se poate. Dacă dumneavoastră modificaţi datele din cadrul legăturii. interogările. Prin urmare. Câmpurile To. pentru început. Există şi varianta folosirii facilităţilor de interogare şi de crearea a rapoartelor din Access. şi datele originale se modifică. aveţi deja cantităţi mari de date. Observaţi că linia Subject a fost completată cu textul din instrucţiune. iar textul suplimentar a fost adăugat după obiect. însă de multe ori. macroconstrucţiile şi modulele. rapoartele. care este utlitatea legării dateor externe în Access? Ei bine. Access poate accesa (nu este un joc de cuvinte!) date din alte surse şi acestea apar în aplicaţiile dumneavoastră ca şi cum ar fi tabele Access. Această tehnică funcţionează în mod similar cu comenzile rapide (shortcuts) din Windows 95 . transmitem interogarea referitoare la vânzările lunare în format Microsoft Excel.5 Date externe În secţiunile anterioare ale acestui capitol. păstrând însă aplicaţia existentă. Componenta back-end cuprinde datele propriu-zise.

care vă pune la dispoziţie facilităţile unei baze de date relaţionale mari. Puteţi şterge oricând o legătură. Este o abordare care face parte din modelul client-server şi garantează că atât clientul. 204 . Recent le-aţi dat o copie cu ultima versiune a bazei de date. În majoritatea cazurilor. pentru a-l folosi la capacitate maximă. Puteţi să aveţi toate datele pe server. tabelele legate erau numite tabele ataşate. Însă dacă separaţi componentele front-end şi backend. Prin urmare. Puteţi folosi acest argument şi cu metodele Pag. fără să afectaţi în vreun fel tabelul cu date. trebuie să efectuaţi modificările. componenta back-end a bazei de date este. cum ar fi Microsoft SQL Server. Vă amintiţi ce dificil este să distribuiţi aplicaţiile la utilizator. un server puternic de baze de date. care a fost legat la aplicaţia Whisky. iar acum doresc să operaţi modificări . are avantajul de a minimiza traficul de reţea. Încercaţi singur .însă au început deja să introducă date. în plus. nu pe propriul calculator. de obicei.puteţi să înlocuiţi componenta front-end şi apoi să refaceţi legătura cu tabelele. Această tehnică poate îmbunătăţi viteza de lucru şi. cât şi serverul (de exemplu. În Access 2. partea care conţine datele nu va trebui modificată niciodată . Şi tehnica de legare este foarte utilă. care vă permite să actualizaţi componenta front-end fără să afecteze componenta back-end. SQL Server) lucrează la parametrii optimi . dată fiind popularitatea sistemelor clientserver. Acestea sunt marcate în foaia Tables a ferestrei bazei de date cu o săgeată: Figura alăturată prezintă un tabel din baza de date model Northwind (distribuită împreună cu programul Access). dar şi să opriţi toţi utilizatorii să folosească vechea bază de date şi să copiaţi datele în una nouă. dar în acelaşi timp să continuaţi utilizarea facilităţilor sistemului Access.lăsând serverul să ruleze interogările lungi şi folosind tabelele Access pentru a accesa rapid informaţii care nu se modifică frecvent. Programul wizard ataşat acestei comenzi vă va ghida prin etapele procesului de separare a tabelelor de restul obiectelor din baza de date. vom folosi argumentul acLink al metodei Transfer Spreadsheet a obiectului DoCmd. puteţi chiar să mutaţi interogările pe server şi să le executaţi acolo.6 Tabele legate În mod sigur aţi folosit şi până acum tabele legate.Este o tehnică uzuală. Dacă decideţi să aplicaţi această metodă după ce aţi creat o aplicaţie. Este un domeniu prea vast pentru a fi prezentat aici în detaliu. cum sunt formularele. dar există numeroase cărţi dedicate acestui subiect. Singurele informaţii care trec prin reţea sunt instrucţiunile dumneavoastră pentru lansarea interogărilor şi tabelul cu rezultate returnate de server.Legarea unui obiect În acest exemplu.0 şi în versiunile anterioare. În acest caz. 10. alegeţi subcomanda Database Splitter din comanda Add-ins a meniului Tools. interogările şi rapoartele.

Creaţi o nouă bază de date (denumiţi-o BackEnd) şi executaţi clic pe Create. selectaţi din meniu File/Get External Data şi executaţi clic pe opţiunea Import. Access a detectat că în a treia coloană apar numere. trebui să comutaţi în altă pagină şi apoi să reveniţi). Această operaţie este utilă nu numai pentru a distribui o nouă copie a bazei de date front-end. Rezultă că această pagină poate conţine nu numai tabele.XLS" 2. Această instrucţiune va face legătura cu foaia de calcul creată într-un exemplu anterior. Vom lega o foaie de calcul în aplicaţia noastră. le puteţi edita ca şi când ar fi tabele Access. 3. Încercaţi singur . nedorind să o definim ca o componentă permanentă a aplicaţiei. Dacă intenţionaţi să legaţi foile de calcul în acest fel.Reîmprospătarea legăturilor Dacă intenţionaţi să separaţi o bază de date în componentele back-end şi frontend. 1. însă fiţi foarte atent la coloanele care conţin date incomplete sau confuze. executaţi clic pe butonul Select All şi apoi pe butonul OK în caseta de dialog Import Objects. selectaţi fişierul Whisky8. 5. ci şi alte surse de date. pentru a include doar datele corecte. vom lucra în fereastra de depanare.0. _ "C:\BegVBA\WhiskySales. însă. Din moment ce sursele de date pot fi legate la Access. Orice modificări pe care le operaţi aici se vor reflecta în foaia de calcul.mdb în caseta de dialog Import. care sunt format text. ar trebui să eliminaţi titlurile de coloane sau să folosiţi în legătură argumentul Range (Domeniu). În continuare.0 sau 7. legat. 1. ci şi dacă aplicaţia back-end este instalată în altă parte decât se aşteaptă Access să o găsească. Deschideţi un modul nou şi introduceţi în fereastra Debug următoarea secvenţă de cod: DoCmd. Ar trebui să vedeţi un obiect nou. "WhiskySales". 205 . este evident că aveţi nevoie de o modalitate de reîmprospătare a legăturii dintre tabele. care este o foaie de calcul (pentru a-l vizualiza.TransferSpreadsheet acLink. Pag. Pentru a importa tabelele din baza de date model. Al doilea argument indică faptul că realizăm o legătură cu un fişier Excel versinea 5. Acum examinaţi pagina Tables a ferestrei bazei de date. dar primul rând conţine titlurile coloanelor. Acum puteţi deschide foaia de calcul WhiskySales ca şi când ar fi un tabel normal.TransferDatabase şi TransferText.

aţi refăcut legăturile cu tabelele. De aceea. Schimbaţi numele bazei de date BackEnd cu NewBackEnd şi încercaţi să deschideţi unul dintre tabelele legate: Tabelele de aici sunt doar legate. Acum vom reface legătura cu tabelele. 4. în baza de date FrontEnd. apoi creaţi o altă bază de date (FrontEnd) şi legaţi tabelele din baza de date BackEnd. nu ar trebui să mai apară un mesaj de eroare . Acum deschideţi fereastra de depanare şi apelaţi funcţia în felul următor: RefreshTableLinks("C:\BegVBA\NewBackEnd. Repetaţi procesul de mai sus. Închideţi fereastra modulului şi încercaţi din nou să deschideţi un tabel.DATABASE=" & strDB tblLinked.mdb") 6.Connect = ".Connect <> " " Then tblLinked. selectând opţiunea Link Tables din meniul File/Get External Data. Introduceţi următoarea secvenţă de cod: 2.TableDefs If tblLinked.RefreshLink End If Next RefreshTableLinks = True RefreshTableLinks_Exit: Exit Function RefreshTableLinks_Err: MsgBox Error$ RefreshTableLinks = False Resume RefreshTableLinks_Exit End Function 5.Închideţi această bază de date. De data aceasta. Cum funcţionează? Pag. 206 . de fapt. aşa că Access poate găsi uşor sursele de date. dacă încercaţi să deschideţi unul dintre tabele după mutarea bazei de date back-end. Ele nu există. Public Function RefreshTableLinks(strDB As String) As Integer Dim dbCurrent As Database 'baza ade date curenta Dim tblLinked As TableDef 'tabelul curent in colectie On Error GoTo RefreshTableLinks_Err Set dbCurrent = CurrentDb() For Each tblLinked In dbCurrent. 3. veţi obţine un mesaj de eroare. Creaţi un modul nou şi adăugaţi o funcţie numită RefreshTableLinks.

În fine. veţi spori flexibilitatea funcţiei. [parameters] ] Ca argument object. Dacă există.DATABASE=" & strDB Apoi.Connect = [databasetype. în cazul nostru "DATABASE=" & strDB. Trebuie să folosim metoda Refresh. Haideţi să analizăm codul în detaliu: Set dbCurrent = CurrentDb() For Each tblLinked In dbCurrent. există şi dezavantaje. însă trebuie să introducem un caracter punct şi virgulă ca marcaj de rezervare. acest argument este lăsat necompletat. În cazul tabelelor locale. Iată care sunt acestea:  Deoarece tabelele legate nu fac parte din baza dumneavoastră de date. argumentul trebuie să fie "Paradox 5. În acest fel. aceasta trebuie să fie actualizată cu numele noii baze de date (transmis funcţiei prin argumentul strDB). precedat de expresia DATABASE=. Dacă doriţi să realizaţi conectarea la un tabel Paradox.pentru Access. o valoare. iar înregistrările trebuie să fie extrase din alt fişier de fiecare dată când Pag. Această proprietate defineşte şirul de conectare pentru un tabel legat. Desigur.căutaţi subiectul Connect Property. Apoi. tblLinked. parameters reprezintă calea completă şi numle de fişier la bazei de date. În fişierul de asistenţă (Help) din Access. totuşi. Proprietatea Connect conţine calea şi numele bazei de date din care sunt legate tabelele.RefreshLink End If Next Terminăm structura ciclică cu o instrucţiune de împrospătare a legăturii.nu dorim să facem actualizarea pentru aceste tabele. folosim tabelul pe care l-am găsit în structura ciclică. Diferenţe între tabelele legate şi cele locale Tabelele legate au o serie de avantaje faţă de cele locale însă.TableDefs Începem prin deschiderea bazei de date curente şi parcurgerea ciclică a colecţiei TableDefs. tblLinked. Argumentul databasetype este un şir care identifică tipul de fişier . If tblLinked.Connect <> " " Then tblLinked. puteţi să extindeţi procedura şi să solicitaţi noul nume al bazei de date (în loc să-l acceptaţi ca parametru).x" sau unul similar. folosim metoda RefreshLink pentru a ne asigura că legătura este împrospătată. căutăm un şir nevid în proprietatea Connect. Acest lucru este necesar pentru că simpla configurare a proprietăţii Connect nu determină restabilirea automată a legăturii. nu va exista nici o valoare . 207 . Ea are următoarea formă: object.Funcţia parcurge ciclic tabelele şi le modifică proprietatea Connect. ca în orice domeniu. găsiţi o listă completă a identificatorilor .Connect = ".

7 ODBC ODBC este abrevierea expresiei Open DataBase Connectivity (Conectivita-tea bazelor de date deschise).utilizarea unor drivere software adecvate.  Trebuie să fiţi atent atunci când asociaţi tabele legate de mari dimensiuni cu tabele locale mici. Tendinţa este însă de a include doar sistemele desktop.  Trebuie să fiţi atent la asocierea unor tabele stocate în locuri diferite (de exemplu. însă dacă este legat un tabel mare de pe un calculator situat la distanţă. Pentru a permite tuturor sistemelor de baze de date să schimbe date în mod liber. puteţi lega la o bază de date Access tabele din alte tipuri de baze de date. din acest motiv. În continuare. Marele avantaj este că programele pot fi scrise folosind interfaţa standard ODBC şi vor funcţiona cu orice bază de date pentru care există drivere disponibile. inclusiv Oracle. Cu toate aceste neajunsuri. pot apărea probleme dacă asociaţi două câmpuri de date. cum ar fi dBase şi Paradox. 10. gestionarul ODBC poate suporta Pag. trebuie să existe o metodă comună de acces . ele nu acceptă metoda Seek. iar celălalt formatul British. pentru că s-ar putea ca tipurile de câmpuri să nu fie complet compatibile. nu ar trebui să renunţaţi. astfel că aproape toate tipurile de baze de date suportă acum ODBC. Puteţi observa că mecanismul Jet acceptă câteva formate comune de baze de date desktop direct prin programe driver incluse în Access şi că ODBC este o entitate separată la "nivel" de driver. în condiţiile în care o aplicaţie de baze de date este modificată constant sau este distribuită în etape. IBM DB/2. dintre care unul are formatul US. ODBC este o metodă standard de implementare a acestui tip de conectivitate un singur sistem cu o interfaţă larg răspândită. însă acesta este controlat în prezent de grupurile internaţionale de standardizare. Aşa cum aţi văzut deja. 208 . va trebui să luaţi în calcul supraîncărcarea cauzată de transferul datelor la executarea interogării.în special dacă tabelul legat se găseşte pe un alt calculator din reţea  Tabelele legate trebuie să fie deschise ca seturi de înregistrări de tip dynaset sau instantaneu (snapshot) şi. Access poate optimiza asocierea. care reprezintă o altă modalitate de acces la date externe. desigur. Dacă ambele tabele sunt locale. care se interpun între mecanismul bazei de date şi datele celuilalt sistem. apar probleme de viteză . Microsoft a început procesul de standardizare acum câţiva ani. De exemplu. Ingres şi Informix. pentru care alţi creatori de sisteme de baze de date produc propriile lor programe driver. Bazele de date stochează informaţiile în diferite formate şi folosesc metode diferite de acces. Şi.încercaţi să le accesaţi. unul pe calculatorul local şi unul pe calculatorul situat la distanţă). care poate fi aplicată doar seturilor de înregistrări de tip tabel. Soluţia back-end/frontend este extrem de utilă în activitatea firmelor. toate datele trebuie să fie trasferate înainte de asocierea efectivă.

Detectarea şi eliminarea unei erori este întotdeauna un proces care consumă mult timp şi.TRATAREA ERORILOR. Alta: "Este imposibil de construit ceva care să reziste la orice intervenţie neavizată. DEPANAREA ŞI TESTAREA Aţi învăţat multe lucruri despre programarea în Access 97. În ciuda adevărului amar al acestor observaţii. ca urmare. fiecare prin propriul său sistem de driver. atunci va apărea în mod sigur o a şaptea. la care nu v-ţi gândit". este bine să ştiţi cum să preveniţi apariţia erorilor şi ce trebuie să faceţi atunci când acestea apar totuşi în program. De aceea. cum sunt Oracle. 209 . Proiectul Pag.oricâte baze de date. inclusiv cum puteţi crea aplicaţii sofisticate. Majoritatea bazelor de date importante. Tot ce îşi doresc este ca aplicaţia să arate bine şi să funcţioneze corect.1 Anticiparea erorilor Una dintre legile lui Murphy spune: "Dacă întrezăriţi şase posibilităţi ca un lucru să meargă prost şi le preîntâmpinaţi. Nimeni nu poate scrie de la început programe fără erori. Nu îi interesează nici dacă aţi creat cel mai bun şi mai rapid algoritm de calcul al constantei Pi (π). În acest capitol veţi învăţa:  Cum să preveniţi apariţia erorilor  Diferite tipuri de erori  Metode de tratare a erorilor  Cum să folosiţi evenimentele de eroare 11. Utilizatorilor nu le pasă de dimensiunea codului. suportă ODBC. mult mai scump decât anticiparea erorilor. se pot schimba şi bazele de date. asigurând un grad înalt de flexibilitate. Termenul depanare (debug) are sensul de "eliminare a erorilor din". Ceea ce nu aţi învăţat până acum este cum să evitaţi apariţia problemelor şi cum să le detectaţi atunci când (şi nu dacă) acestea totuşi apar. CAP: 11. întotdeauna mai există ceva la care nu v-aţi gândit. DB2 şi alte sisteme pentru minicalculatoare şi calculatoare mainframe. pentru că prostia are resurse nebănuite". există posibilitatea planificării (anticipării) erorilor. Dacă nevoile dumneavoastră se schimbă.

De exemplu. în felul următor: Este de preferat să folosiţi modul de afişare cu asterisc decât să specificaţi explicit fiecare câmp. Nici un formular bazat pe interogarea respectivă nu va trebui modificat. Veţi economisii astfel o mulţime de timp şi efort. înseamnă că trebuie să mergeţi direct la închisoare. puteţi să adăugaţi câmpuri în tabel fără să modificaţi interogarea. Stat (Judeţ) etc. Această abordare determină şi reducerea numărului de erori. începeţi să adăugaţi un fragment de cod aici. Ar trebui să realizaţi toate formularele şi rapoartele pe baza acestor interogări. aplicaţiile nu răspund cerinţelor utilizatorului şi trebuie modificate. Avantajul acestei metode este că permite modificarea detaliilor din tabele fără a afecta formularul sau raportul. există toate şansele să realizaţi o aplicaţie care să poată fi modificată uşor. s-ar putea ca utilizatorii să solicite doar o adresă pentru tabelul firmelor. fără să treceţi prin start şi fără să încasaţi suma de 200$ (vă amintiţi de Monopoly?). Ca urmare. proiectul este partea cea mai importantă a aplicaţiei . În continuare. Încercaţi să anticipaţi câmpurile care ar putea fi necesare.Dacă tocmai aţi întrebat "Ce proiect?". iar utilizatorul vă spune: "Este foarte bine. Pag. În primul rând. după mai multe săptămâni de analiză exhaustivă a cerinţelor. dumneavoastră furnizaţi aplicaţia "la cheie". una dintre cele mai frecvente cauze de apariţie a erorilor o reprezintă modificările. Tabele Probabil că aţi început să vă plictisiţi de atâtea sfaturi.Oraş. altul dincolo. însă este bine să planificaţi tabelele. dar la care utilizatorul nu s-a gândit. desigur. pentru că astfel. Nu vă repeziţi să rezolvaţi pe loc noile solicitări. ne-am confruntat cu această problemă chiar la începutul cărţii şi am văzut cum putem împărţi un nume în elementele sale componente. Interogări Pentru fiecare tabel. însă cum procedaţi dacă trebuie să sortaţi firmele după zonă sau după regiunea de vânzare? Aveţi nevoie de mai multe câmpuri . faptul că noile câmpuri nu sunt afişate automat în formular sau raport. Dacă ţineţi cont de la început de aceste principii. dar nu mai puteţi adăuga ceva aici…?" Este inevitabil să se întâmple aşa. De multe ori. iar erorile îşi fac apariţia. ar trebui să creaţi o interogare care să afişeze toate câmpurile. sunt prezentate câteva aspecte generale la care trebuie să vă gândiţi înainte de a începe programarea propriu-zisă. 210 . şi nu direct din tabele. Şi nu vă miraţi dacă.fundaţia pe baza căreia sunt construite toate celelalte obiecte. să creaţi un pseudonim (alias) pentru această interogare. Rezervaţi-vă timpul necesar pentru a discuta cu utilizatorii şi a afla tot ce doresc aceştia de la aplicaţie. De exemplu. exceptând. analizaţi problema şi toate implicaţiile pe care le presupune rezolvarea acesteia. pentru că utilizatorii nu sunt foarte siguri de ceea ce vor până când nu văd ceva concret. Etapa de proiectare este cea în care stabiliţi exact ce trebuie să facă aplicaţia .

puteţi importa modulul în alte baze de date în care aveţi nevoie de rutinele respective. după ce toate procedurile dintr-un modul au fost depanate. pentru că sunt opţionale. aveţi posibilitatea de a adăuga elemente le interfaţă prin folosirea argumentelor Opţional . asigură un alt nivel de încapsulare în Access. Ideea este că în loc de variabile publice. precum şi procedurile Property Get şi Let care au fost introduse încă din Access95. De asemenea. Acestea permit mascarea datelor dintr-un formular sau modul (prin declararea lor de tip privat).Formulare şi rapoarte Aici. noile caracteristici ale modulelor de clasă din Access 97. mai bine renunţaţi la el. Gruparea funcţiilor Gruparea funcţiilor înseamnă păstrarea împreună a elementelor similare. folosiţi variabile private şi creaţi proceduri publice pentru a le putea accesa. rolul său. fără a afecta alte rutine. care pot fi accesate din orice funcţia. veţi fi sigur că nu dublaţi nici o procedură. puteţi folosi o serie de tehnici orientate pe obiect. însă chiar sunt necesare? Aplicaţia devine mai performantă? Ajută ele utilizatorii să folosească aplicaţia? Aceasta ar trebui să vină în sprijinul utilizatorului şi să îi uşureze munca. încercaţi să folosiţi Tab Control. plasaţi-le pe toate într-un singur modul. În plus.3 Tehnici orientate pe obiect pentru prevenirea apariţiei erorilor Pentru a elimina erorile dintr-o aplicaţie. Se spune că 80% dintre utilizatori folosesc doar 20% din funcţionalitatea unei aplicaţii. fără să vă mai preocupe depanarea acestora. Astfel. Aşa cum s-a arătat şi în capitolul precedent. Dacă doriţi un singur formular. din moment ce toate rutinele de acelaşi tip sunt grupate. Reţineţi acest aspect şi nu încărcaţi formularele cu prea multe informaţii. Astfel. 11. Pag. în timp ce interfaţa rămâne neschimbată. Dacă elementul pe care îl adăugaţi la interfaţă nu are acest rol. Această tehnică vă asigură un control mai mare asupra datelor şi vă permite să modificaţi implementarea codului şi variabilelor. dar aveţi multe date care trebuie afişate. de fapt. principiul de bază este simplitatea. vechile apeluri vor funcţiona în continuare corect. deoarece acest este. S-ar putea să vă placă la nebunie să creaţi formulare sofisticate. puteţi opera modificări în codul de bază. însă şi accesul public prin anumite rutine selectate. 211 . Fiecare obiect ar trebui să ştie totul despre el însuşi şi să nu se piardă în momentul când treceţi într-un alt mediu de lucru. Încapsularea Încapsularea este numită şi "mascarea datelor". care permite împărţirea câmpurilor în pagini logice.avantajul este că orice nou apel le poate folosi şi. Dacă scrieţi mai multe rutine de lucru cu şiruri.

212 . Utilizarea instrucţiunii Option Explicit garantează că acest tip de eroare nu va apărea Pag. motiv pentru care răspunsul corect nu va fi returnat niciodată. motiv pentru care toate variabilele pe care le folosiţi trebuie să fie declarate explicit. puteţi transmite obiectul formular în procedură cu ajutorul obiectului Me. De exemplu. Comanda Option Explicit Este o comandă extrem de utilă. metoda are dezavantajul că o eroare apărută în procedură va afecta mai multe zone ale aplicaţiei.1415926 * dblRadius End Function Aţi sesizat greşeala? Numele funcţiei a fost scris greşit în instrucţiunea de calcul a valorii de răspuns. Însă în cazul în acre efectuaţi o testare eficientă şi secţiunile de cod sunt independente. Puteţi configura această opţiune în cadrul panoului Module al casetei de dialog Options…. Dacă aveţi un fragment de cod care rezolvă o anumită problemă. citiţi secvenţa următoare de cod: Public Function Circumference (dblRadius As Double) Circumference = 2*3. Nu ezitaţi să folosiţi un cod creat de altcineva. care poate fi deschisă din meniul Tools: Această opţiune iniţializează comanda Option Explicit pentru toate procedurile. Când această opţiune este validată. Când creaţi funcţii noi. Există mari companii care plătesc programatorilor un bonus la fiecare refolosire a codului lor. în afară de faptul că economisiţi un timp preţios. care ar trebui să fie implicită pentru toate modulele dumneavoastră de cod. refolosiţi-l. orice modificare ulterioară a acestei rutine poate fi efectuată într-un singur loc. Aceasta înseamnă că puteţi evita erorile cauzate de tastarea incorectă. Refolosirea nu este acelaşi lucru cu furtul. le puteţi transfera fără teamă în diferite proiecte. în cazul în care codul respectiv nu conţine erori. dacă aveţi o secvenţă de cod folosită în fiecare formular. s-ar putea să treacă mult timp până la detectarea erorii (până când această funcţie este apelată în program). şi nu în toate formularele. Este o politică bună. Desigur. trebuie să vă gândiţi dacă este cazul să le implementaţi ca funcţii generice. care încurajează eforturile de planificare şi de identificare a altor domenii în care poate fi folosit programul respectiv. dacă ştiţi că funcţionează corect şi nu încălcaţi legile referitoare la drepturile de autor. nu mai trebuie să îl depanaţi. în toate modulele noi de cod va apărea instrucţiunea Option Explicit. De exemplu. Cu toate că această procedură conţine o singură linie. Astfel.Refolosirea Tehnica de refolosire a modulelor de cod se potriveşte foarte bine cu încapsularea şi poate fi rezumată prin dictonul: "Nu are rost să reinventaţi roata". care sunt greu de sesizat.

nu este cazul să inseraţi un comentariu de genul: "Stabileşte valoarea la…". dar este preferabil să o selectaţi. şi afişează un mesaj de eroare în cazul în care găseşte o linie incorectă.  Comentaţi secţiuni de cod (funcţionalităţi).1415926 * dblRadius End Function Comentaţi folosirea variabilelor. când comentariul ar trebui să fie pe aceeaşi linie cu declaraţia. linia incorectă va fi afişată cu altă culoare (stabilită prin meniul Tools. introduceţi comentarii doar dacă există un motiv pentru a descrie de ce  Pag. Access verifică sintaxa codului în timp ce scrieţi instrucţiunile. Dacă opţiunea nu este validată. ar trebui să fie şi greu de citi"). deoarece erorile de sintaxă pot fi generate la rularea programului. iar codul va fi verificat doar la compilare. cuvântul "Circumference" va fi marcat ca o variabilă nedeclarată în momentul compilării determinându-vă să corectaţi eroarea de tastare. nu uitaţi ca după ce terminaţi o sesiune de editare să selectaţi opţiunea Compile All Modules din meniul Debug (când aveţi deschisă fereastra unui modul). alţi programatori comentează fiecare linie în parte. uneori. Dacă totuşi nu puteţi să lucraţi cu această opţiune validată (activată). Comentarii Există controverse cu privire la acest subiect. În astfel de situaţii. Dacă instrucţiunea Option Explicit este inclusă în modul. S-ar putea ca. Trebuie să găsiţi o cale de mijloc. Opţiunea Auto Syntax Check este importantă în special dacă nu compilaţi codul înainte a furniza aplicaţia utilizatorilor. 213 . Dacă atribuiţi o valoare unei variabile. Avantajele atârnă mult mai greu în balanţă decât eventualele dezavantaje. Ambele metode sunt greşite. cu excepţia situaţiilor în care descrieţi o variabilă. Options). De exemplu: Public Function Circumference (dblRadius As Double) As Double ' 'Scop: 'Argumente: 'Valoare returnata: 'Autor: 'Data: Calculul circumferintei unui cerc dblRadius Raza cercului Circumferinta cercului 11 iunie 1999 Circumference = 2*3.  Nu comentaţi ceea ce este evident. Iată câteva sugestii utile în acest sens:  La începutul fiecărei proceduri. dar şi la compilarea codului. această opţiune să vă deranjeze. ce argumente primeşte şi ce fel de valori returnează. În cazul validării acestei opţiuni. Verificarea sintaxei Pagina Module a casetei de dialog Options include şi opţiunea Auto Syntax Check (Verificare automată a sintaxei). introduceţi un comentariu în care descrieţi rolul acesteia.  Plasaţi comentariile pe linii separate.în aplicaţie. şi nu linii individuale. Unii programatori nu inserează nici un fel de comentarii în cod ("Dacă a fost greu de scris.

efectuaţi operaţia respectivă. 11. În fond. nu mai contează cât de bine răspunde aceasta cerinţelor iniţiale. tot dumneavoastră va trebui să eliminaţi erorile descoperite în aplicaţie. 214 . pentru că. Testarea modului de utilizare Aceasta este etapa următoare. Nu vă bazaţi pe comentarii.  Depanaţi codul. Veţi lua în calcul şi timpul necesar pentru realizarea unei anumite operaţii. În plus.  Cel mai important lucru pe care trebuie să îl aveţi în vedere este consecvenţa. Testarea modului de utilizare se aplică în special porţiunilor vizibile ale aplicaţiei. ei sunt cei care au stabilit cerinţele. Dacă o Pag. deoarece sunteţi cel care înţelege cel mai bine cum ar trebui să funcţioneze. aceste persoane nu vor avea idei preconcepute. vom analiza diferite faze de testare. Deşi dumneavoastră aveţi propriile criterii de apreciere. sau o parte a acesteia îndeplineşte funcţia pentru care a fost scrisă. de multe ori. Fiecare programator trebuie să îşi asume responsabilitatea pentru codul pe care l-a creat. dacă utilizatorilor nu le place cum se prezintă aplicaţia. Testarea funcţională Testarea funcţională constă în a verifica dacă întreaga aplicaţie. Altele preferă să lase utilizatorii să efectueze testarea (pentru aceasta se lansează de fapt versiunile beta!). oricum.4 Testarea Multe companii mari au echipe speciale pentru testarea aplicaţiilor. Nedispunând de alte informaţii în afară de conţinutul documentaţiei. Există trei căi de a obţine un răspuns şi acestea ar trebui să fie folosite în ordinea corectă:  Testaţi aplicaţia personal. La urma urmei. împreună cu specificaţiile de utilizare. alegeţi stilul care vă place şi folosiţi-l doar pe acesta. indiferent de experienţa pe care o aveţi în programare. Ca şi în restul aplicaţiei. cum ar fi atribuirea unei valori Empty sau Null pe care o veţi folosi ulterior în cod.  Transmiteţi aplicaţia la utilizatori. În continuare. Trebuie să apreciaţi dacă interfaţa este uşor de folosit sau este confuză pentru utilizatori? Respectă convenţiile uzuale? De fapt. Consideraţi această etapă din procesul de realizare a aplicaţiei la fel de importantă ca şi scrierea codului. nici nu vă vor deranja în cazul în care aplicaţia nu li se pare completă. acestea nu sunt actualizat o dată cu codul.  Transmiteţi aplicaţia (pentru testare). Testarea poate avea mai multe forme şi este bine să vă rezervaţi timp pentru fiecare dintre ele. nu este indicat să săriţi peste etapa de testare a codului. nu comentariile. unor persoane neimplicate în proiect. la care treceţi după ce vă veţi convinge că aplicaţia răspunde cerinţelor utilizatorilor. al sfârşitul zilei trebuie să realizaţi ceva care să mulţumească beneficiarul. Ar trebui să vă asiguraţi că orice modificare pe care o efectuaţi se reflectă şi în comentariile din cod.

Şi puteţi fi sigur că. În cazul în care este o eroare de cod şi alţii au tratat eroare a respectivă. în timp. este foarte probabil ca în codul dumneavoastră să apară totuşi erori. timpul total de întreţinere a aplicaţiei s-ar putea reduce considerabil. însă. este posibil ca aplicaţiile lor să nu mai funcţioneze corect. indiferent dacă este vorba despre un program vechi sau de unul nou. Acesta va fi fericit să vă purice programul. Dacă testaţi un formular.. însă veţi fi surprins cât de repede uitaţi de ele atunci când sunteţi concentrat asupra codului. după ce descoperă câteva erori evidente. Acestea pot fi de mai multe feluri. Daţi aplicaţia altei persoane şi rugaţi-o să o încerce prin orice metode. sau nici măcar cu calculatoare. din păcate. 5 Tipuri de erori Puteţi (şi ar trebui) să urmaţi toate sugestiile anterioare referitoare la prevenirea erorilor. vă vor ruga să le testaţi programele).  Nu vă pierdeţi vremea cu "aranjarea" sau îmbunătăţirea codului decât în cazul în care acesta este principalul motiv pentru care îl modificaţi. la rândul lor. Dacă testaţi secvenţe de cod. Când operaţi modificări în cod. dacă dumneavoastră corectaţi codul. apelaţi la serviciile altui programator. 215 . Care dintre modificări a generat aceste erori? Dacă rezolvaţi problemele pe rând şi le testaţi una câte una. de care se bucură ca un copil. va trebui să rescrieţi codul respectiv.  Concentraţi-vă pe corectarea problemei curente. este bine să luaţi în considerare următoarele aspecte:  Modificarea pe care o efectuaţi va avea impact asupra altor programatori? Dacă este vorba de o rutină de bibliotecă. Întreţinerea Se spune că un programator îşi petrece 60% din timp cu întreţinerea programelor vechi (se mai spune şi că 85% dintre statistici sunt inventate. dar asta este o altă poveste). apar erori noi. veţi deveni un programator mai bun! (Şi veţi avea ocazia să vă răzbunaţi pe cei care. discutaţi cu alte persoane care folosesc rutina respectiv înainte a efectua modificările.funcţie este executată într-un timp care depăşeşte limita. chiar neconvenţionale.  Efectuaţi o singură modificare la un moment dat. iar când rulaţi programul. Deşi iniţial s-ar putea să vă simţiţi frustrat. este important să ştiţi cu ce tip de Pag. Imaginaţi-vă că lucraţi la corectarea ai multor probleme. Sugestiile prezentate mai sus sunt într-adevăr de bun simţ. 11. veţi creşte nivelul verificărilor pe cont propriu. apelaţi la cineva care nu a mai lucrat cu formulare. Testarea distructivă Aceasta este etapa cea mai distractivă.

lăsaţi această sarcină mediului Access. O eroare poate fi un eveniment util.eroare aveţi de-a face. Am arătat în Capitolul 2 care sunt cele trei tipuri de erori:  Erori de sintaxă  Erori de execuţie  Erori de semantică sau logice În cele ce urmează. vom analiza fiecare dintre aceste tipuri de erori şi vom vedea cum le putem corecta. 216 . probabil. De exemplu. ar trebui să afişaţi pe ecran o casetă de dialog personalizată care să descrie eroarea şi locul în care utilizatorul poate găsi informaţii de asistenţă în cazul în care problemele persistă. pentru a putea alege cea mai bună metodă de rezolvare. care poate fi tratată de programator. Access vă va avertiza de fiecare dată când introduceţi instrucţiuni eronate. este important să înţelegeţi deosebirea dintre erorile obişnuite şi erorile de programare (bugs). există o metodă simplă de a le descoperi . În această etapă. cum sunt erorile de acces la date (Data Access Errors). însă aşa cum am menţionat. cauzate. mai puţine greşeli. 11. în principal. veţi întâlni şi cazuri în care construcţia folosită este greşită. Dacă activaţi opţiunea de verificare a sintaxei şi vă asiguraţi că toate variabilele sunt declarate. Erori de sintaxă Sunt cele mai simple forme de erori. Fig. care vă permit să rulaţi o secvenţă de cod la apariţia unei erori în tabel. dacă un tabel nu permite valori null într-un anumit câmp. Este o eroare detectabilă. Cei care au depăşit stadiul de folosire a tastaturii cu două degete. vor face.1 Pag. Oricum. Şi acestea sunt semnalate de Access. de greşelile de tastare. O eroare de programare (bug) este o eroare pe care programatorul nu a prevăzut-o.

Să presupunem ca aţi tastat instrucţiunile For…Next sau instrucţiunile For… Each . Access punând la dispoziţie parametri de proceduri. funcţia CurrentDatabase este evidenţiată. iar pe ecran este afişat un mesaj de eroare. fie pentru că i-a scris greşit numele (în loc de CurrentDB). ca urmare. aşteaptă apariţia unei variabile.2 Când executaţi clic pe butonul OK. Mai există un tip de eroare de sintaxă. erorile de execuţie pot fi descoperite numai în timpul execuţie programului. Erori de execuţie Aşa cum sugerează şi numele lor. Access nu a găsit instrucţiunea Each şi. cu toate că sintaxa este corectă. Dacă nu rezolvaţi problema. Folosirea extinsă a caracteristicilor Auto Tips (sugestii automate) a permis evitarea multor erori de execuţie. Pag. 11. Codul poate conţine însă multe alte tipuri de erori. Puteţi să executaţi clic pe butonul OK pentru a anula mesajul de avertizare şi să corectaţi eroarea sau să reveniţi la ea ulterior. fie pentru că este vorba de o funcţie care nu există sau care nu poate fi vizualizată. Această eroare apare atunci când atribuiţi o valoare de un anumit tip unei variabile de tip diferit (incompatibile). O eroare de execuţie determină oprirea execuţiei codului. care nu poate fi descoperit imediat. în loc de o procedură de tip Public. Examinaţi figura următoare: Fig. precum şi proprietăţi şi metode de obiecte. De fapt. erorile sunt posibile. iar codul poate fi compilat. 217 . Aceasta se poate întâmpla în cazul în care creaţi într-un alt modul o procedură de tip Private. Totuşi. succesul compilării indică doar faptul că instrucţiunile din cod sunt în ordinea corectă şi că nu s-au folosit funcţii nedefinite. Una dintre cele mai frecvente erori de aceste tip este Type Mismatch (Nepotrivire de tip). Deoarece acesta nu apare. linia este evidenţiată. când apăsaţi tasta Return. eroarea va fi semnalată din nou la compilarea modulului.

Într-o altă secţiune din acest capitol veţi învăţa cum să procedaţi. dacă una dintre variabile are o valoare incorectă. chiar şi de către cei mai experimentaţi programatori. iar aceasta a apelat. s-ar putea să parcurgeţi trei sau patru funcţii diferite (pentru că o funcţie a apelat alta. Bill Gates.3 Acest exemplu ilustrează importanţa testării şi a aplicării consecvente a unei convenţii de nume. este greşit: Fig. Erori de semantică Recent. În exemplul următor. aceste erori pot produce erori de execuţie. 11. fii pe fază! Erorile de semantică sunt cel mai dificil de descoperit. pe ecran este afişată caseta de dialog prezentată într-un paragraf anterior. trebuie să găsiţi locul în care a fost atribuită valoarea respectivă. chiar şi firma Microsoft a furnizat produse cu astfel de erori. executând clic pe butonul Debug. proprietarii acelei firme se vor îmbogăţi. Dacă aţi scris un program modular. dacă este adevărat.Puteţi să opriţi execuţia programului şi să evidenţiaţi linia de cod care a generat eroarea. bine structurat. în acest caz. 218 .ceea ce. la rândul său. Este cazul liniilor de cod care conţin mai multe variabile. deci vă daţi seama cât de importante sunt. evident. care vă permite să identificaţi linia de cod ce a generat eroarea. Încă nu s-a dovedit acest lucru. astfel că trebuie să revedeţi toate procedurile implicate pentru a descoperi cauza reală a problemei. Pag. deoarece reprezintă erori în algoritmul logic al programului. deoarece eroarea este dificil de detectat prin simpla trecere în revistă a codului. De exemplu. altă funcţie). însă. Uneori. în presă a apărut un articol despre o mică firmă din Marea Britanie care a dezvoltat o metodă de scriere a aplicaţiilor software fără erori. Nu trebuie să consideraţi această informaţie literă de lege. unei variabile de tip Integer (întreg) i-a fost atribuită o valoare de tip text . pentru că este posibil ca linia care a generat eroarea să nu fie şi cauza problemei.

Acest exemplu particular demonstrează faptul că un mesaj de eroare poate să nu indice cauza reală a erorii. trebuie să renunţaţi la ideile preconcepute şi să analizaţi problemele plecând de la zero.Erori de execuţie şi de semantică 1. cu trei controale de text neasociate şi un buton de comandă. Totuşi. Comutaţi formularul în modul de afişare Form şi introduceţi următoarele numere: 4 şi 2 Pag. Acum adăugaţi următoarea linie de cod în procedura evenimentului On Click pentru butonul de comandă: txtResult = DivideNumbers (txtNumber1. Modificaţi titlurile ca în figura alăturată şi schimbaţi proprietăţile Name ale casetelor de text cu txtNumber1. În continuare. Compilaţi codul executând clic pe butonul Compile Loaded Modules şi salvaţi modulul. Creaţi un nou modul şi adăugaţi procedura următoare: Public Function DivideNumbers (dblNum1 As Double. deoarece programatorii sunt persoane foarte atente. iar a butonului de comandă cu cmdDivide. 4. pentru că trebuie să testaţi ceea ce consideraţi că ar trebui să facă programul. dar merită să încercaţi. şi nu ceea ce face efectiv. şi txtResult. Încercaţi singur . Un programator examinează un fragment de cod şi se gândeşte: "OK. creaţi un formular nou. Haideţi să analizăm o defecţiune apărută în timpul execuţiei unei aplicaţii. dbl1Num2 As Double) _ As Double DivideNumbers = dblNum1 / dblNum2 End Function Această procedură împarte un număr la altul. Uneori este dificil. ştiu ce face" şi trece mai departe. În procesele de testare şi depanare. 3. testarea nu este imposibilă. 219 .Testarea erorilor de semantică este dificil de efectuat. txtNumber2) 5. 2. care a fost generată o eroare semantică. Încercaţi să nu vă însuşiţi acest obicei. txtNumber2.

Adăugaţi următoarele linii de cod în funcţia DivideNumbers. Public Function DivideNumbers (dblNum1 As Double. Şi încă nu am analizat toate valorile eronate care ar putea fi introduse de un utilizator. Acum încercaţi din nou. Datele au fost transferate din altă procedură. verificarea ar trebui să fie efectuată în funcţia DivideNumbers. Acum trebuie să decideţi dacă aceasta este linia cu probleme. Reveniţi în formular şi reluaţi ultimul exemplu (cel cu 0). codul se extinde foarte mult. dar introduceţi valoarea 0 pentru al doilea număr. Oricum probleme nu este încă rezolvată.Rezultatul este cel pe care îl aşteptaţi. 8. Prin urmare. Rezultatul împărţirii unui număr la 0 nu este 0. deşi nu apare un mesaj de eroare. Acest mesaj vă Pag. 7. de data aceasta Run-Time Error 13. Executaţi clic pe butonul Debug şi ajungeţi direct la linia de cod din funcţia DivideNumbers în care a apărut eroarea. deci unde verificăm valorile introduse de utilizator (în procedura respectivă sau în aceasta)? În cazul de faţă. Matematicienii care vor analiza programul vor observa că. O funcţie trebuie să fie complet autonomă . 220 . Eroarea a fost generată de numărul introdus de utilizator . Şi-a făcut apariţia cunoscuta eroare Division by zero (Împărţire la zero). este bine să adăugaţi secvenţa de verificare aici (în funcţie). De data aceasta. răspunsul nu este corect.în mod evident.dacă fiecare procedură care o apelează verifică valorile. De exemplu. Type Mismatch. trebuie să verificăm dacă numărul introdus în casetă nu este zero. ce se întâmplă dacă un utilizator introduce o literă în loc de un număr? Veţi primi un alt mesaj de eroare. nu mai apare nici un mesaj de eroare. Funcţia nu mai încearcă să efectueze împărţirea la zero. dbl1Num2 As Double) _ As Double If dbl1Num2 <> 0 Then DivideNumbers = dblNum1 / dblNum2 End If End Function 9. 6. Nu uitaţi să salvaţi programul după ce efectuaţi modificările.

nu ar mai trebui să apară nici o eroare. funcţia acceptă trei argumente.acestea transmit cele două numere care trebuie împărţite. Rulaţi din nou exemplul. dblRV As Double) As Boolean On Error GoTo DivideNumbers_Err dblRV = dblNum1 / dblNum2 DivideNumbers = True DivideNumbers_OK Exit Function DivideNumbers_Err: DivideNumbers = False Resume DivideNumbers_OK End Function 11. indiferent de valorile introduse. modificaţi şi procedura de tratare a evenimentului On Click pentru butonul de comandă: Dim bolErrorCheck Dim dblCalResult As Boolean As Double bolErrorCheck = DivideNumbers (txtNumber1. dbCalResult) If bolErrorCheck = True Then txtResult = dblCalcResult Else txtResult = "Semantic Error" End If 12. 221 . Trebuie să utilizăm o funcţie care se poate "apăra" singură. dbl1Num2 As _ Variant. txtNumber2. Al treilea argument este folosit pentru a stoca rezultatul împărţirii şi a transfera acest rezultat în formular după terminarea cu succes a operaţiei. 10. Primele două sunt deja cunoscute . Deoarece numărul de parametri Pag.comunică faptul că tipurile de variabile sunt incompatibile şi că se încearcă împărţirea printr-o literă sau printr-un şir de caractere. În continuare. Modificaţi funcţia DivideNumbers după cum urmează: Public Function DivideNumbers (dblNum1 As Variant. garantând astfel că nu va mai fi generată nici o eroare de execuţie. Cum funcţionează? La terminarea exerciţiului. De data aceasta.

accesibilă din meniul Tools. Localizarea erorilor În procesul de detectare a erorilor. puteţi trece de la o procedură la alta folosind tasta Ctrl împreună cu săgeţile de deplasare în sus şi în jos. separate prin câte o linie orizontală (dacă este selectată opţiunea Procedure Separator). O metodă de a verifica toate procedurile dintr-un modul este selectarea opţiunii Full Module View din pagina Module a ferestrei Options. trebuie să verificaţi toate celelalte evenimente. dacă valoarea este False. 222 . Ce evenimente credeţi că sunt generate? În total. În acest punct. sunt cinci evenimente: Open  Load  Resize  Activate  Current Închiderea unui formular generează trei evenimente: Unload  Deactivate  Close Ca urmare. Dacă aceasta este True. În cazul în care nu aţi selectat această opţiune. pe ecran este afişat mesajul Semantic Error. a fost actualizat corespunzător şi numărul de parametri cu care este apelată funcţia. detecatrea acesteia. Acelaşi rezultat se obţine prin executarea unui clic pe butonul aflat în colţul din stânga-jos al ferestrei modulului. dacă operaţia este corectă. valoarea de răspuns a funcţiei este stabilită la False şi se iese din funcţie prin intermediul etichetei DivideNumbers_OK. dacă la deschiderea unui formular apare o problemă. care a fost permisă prin activarea opţiunii On Error GoTo DivideNumbers_Err. redirectează execuţia programului la eticheta DivideNumbers_Err. Să luăm ca exemplu deschiderea unui formular. Dacă în operaţia de împărţire apare o eroare. Pag. este afişat rezultatul calculului. Aceste acţiuni determină afişarea tuturor procedurilor în fereastra modulului. însă acest exemplu a arătat care sunt principiile de lucru. Rezultatul operaţiei este transmis prin variabila booleană bolErrorCheck.acceptaţi de funcţie s-a modificat. Probabil că nu veţi folosi niciodată o funcţie doar pentru a împărţi două numere. Procedura trebuie să fie capabilă să reacţioneze la datele de intrare incorecte. În acest fel. Desigur. să nu ascundă erorile şi să le trateze corespunzător. trebuie să vă amintiţi că mediul Access este dirijat de evenimente. valoarea de răspuns a funcţiei este configurată la True. sarcina de a verifica valorile introduse cade în sarcina procedurii apelante. Valoarea acesteia depinde de valoarea returnată de funcţie. dacă sunt disponibile informaţiile referitoare la codul erorii. iar codul poate fi activat în cale mai diverse zone.

S-au întâlnit cazuri în acre o astfel de eroare a fost acuzată de o bibliotecă DLL mai veche. celălalt dispunând de o versiune actualizată a bibliotecii. Până atunci.Alte erori Această secţiune este dedicată tuturor celorlalte cauze care pot genera o eroare într-un modul VBA. parcurgeţi următoarele etape:  Verificaţi în detaliu codul scris de dumneavoastră  Încercaţi să rulaţi aplicaţia pe un alt calculator  Dacă funcţionează corect. Pe măsură ce câştigaţi experienţă în programarea cu VBA. analizaţi diferenţele dintre cele două sisteme de calcul. unde toţi (sau majoritatea) sunt dispuşi să vă ajute. veţi vedea că instinctul vă va ajuta tot mai mult şi veţi descoperi erorile doar pe baza intuiţiei. deoarece puteţi găsi întotdeauna undeva sau la cineva răspunsul la problema dumneavoastră. Dacă programatorii care au scris aceste aplicaţii le-au testat corespunzător. numărul erorilor posibile este direct proporţional cu importanţa aplicaţiei şi invers proporţional cu timpul necesar pentru depanare! Una dintre cauzele generatoare de erori poate fi folosirea unor aplicaţii externe. 223 . care pot provoca evenimente foarte neplăcute. cum sunt Microsoft Network. Veţi intra întro altă lume de dimensiuni foarte mari.  Rugaţi pe altcineva să verifice codul sau parcurgeţi-l dumneavoastră pas cu pas. Depanarea După ce aţi aflat care sunt metodele de prevenire a erorilor şi tipurile de erori care pot apărea. cu mici erori de programare (bugs). vă vom indica direcţia în care trebuie să căutaţi. cum ar fi bibliotecile cu legare dinamică (DLL) sau controalele personalizate. Depăşirea memoriei disponibile (care este posibilă chiar şi sub Windows 95) semnifică faptul că Access nu are suficiente resurse pentru a afişa toate elementele ecranului. Cu toate că în astfel de situaţii nu prea aveţi ce să faceţi. folosiţi reţeaua dezvoltatorilor de produse Microsoft (Microsoft Developer Network) sau alte servicii on-line. 11. este bine să ştiţi ce tipuri de probleme care pot cauza erori inexplicabile. nu ar trebui să vă confruntaţi cu defecţiuni de funcţionare. Dacă vreţi un răspuns. Este uimitor cât de repede putem detecta o eroare atunci când explicăm cuiva fiecare instrucţiune a programului. trebuie să ştiţi şi cum să detectaţi erorile. explicând toate etapele şi procedurile. CompuServe şi Internet. Dacă este posibil. Desigur. cum ar fi memoria insuficientă sau o bază de date cu o înregistrare alterată. Există şi alte cauze.  Intraţi în panică! Nu ar trebui să ajungeţi niciodată la ultima etapă. Pag.6. existentă pe unul dintre calculatoare.

În următoarele secţiuni vor fi explicate şi funcţiile tuturor butoanelor. Programul va rămâne activ până când îl opriţi. Toate aceste acţiuni sunt de comutare. Execuţia programului poate fi oprită şi apăsând tasta Ctrl+Break în timpul rulării codului.  Executaţi clic pe marginea din stânga a ferestrei modulului. sau chiar pentru a schimba codul în fereastra modulului. • Primul este bara cu instrumente Visual Basic • Al doilea este meniul Debug Prin combinarea acestora. Puncte de întrerupere Punctele de întrerupere (breakpoints) sunt esenţiale în depanare.Execuţia programului Access vă pune la dispoziţie . Există două locuri în care găsiţi toate facilităţile pentru depanare. puteţi să începeţi dintr-un loc în care să ştiţi că programul funcţionează corect şi să avansaţi pas cu pas spre zona în care se manifestă eroarea. Nu există o limită pentru numărul de puncte de întrerupere care pot exista la un moment dat într-un program. Puteţi stabili punctele de întrerupere în patru feluri:  Executaţi clic pe butonul Toggle Breakpoint. în dreptul instrucţiunii corespunzătoare. programul este oprit. 224 . Această combinaţie de taste are acelaşi efect cu un punct de întrerupere. obţineţi controlul complet asupra modului de execuţie al programului. Execuţia va începe de la linia curentă şi va continua până la introducerea unei date de către utilizator sau până ce se ajunge la un alt punct de întrerupere.  Apăsaţi tasta F9. apoi vom trece la o aplicaţie practică. pe ecran este afişată fereastra cu codul rulat în momentul respectiv. Stoparea execuţiei Puteţi acţiona oricând butonul End pentru a opri execuţia programului. adică stabilesc un punct de întrerupere acolo unde nu există şi elimină unul existent.  Selectaţi opţiunea Toggle Breakpoint din meniul Debug. precum şi utilizările acestora. Astfel. pentru că vă permit să marcaţi liniile la care doriţi ca execuţia programului să fie oprită temporar. Continuarea execuţiei Puteţi folosi butonul Go/Continue pentru a continua execuţia unui program oprit temporar. Când Access întâlneşte o linie cu punct de întrerupere. în cadrul căreia este evidenţiată linia cu punctul de întrerupere. Pag.mai multe metode care permit navigarea prin codul aflat în execuţie. permiţîndu-vă inspectarea variabilelor şi chiar modificarea codului. Puteţi folosi fereastra de depanare pentru a inspecta sau a stabili valorile variabilelor.

ca şi cum pe această linie a fot plasat un punct de întrerupere temporar. Toate liniile până la cea cu cursorul vor fi parcurse normal (nu pas cu pas). După oprirea unui program. unde vă aşteptaţi să apară erori. Când execuţia se opreşte. puteţi folosi opţiunea Run To Cursor din meniul Debug.Reiniţializarea execuţiei Butonul Reset opreşte execuţia programului şi reiniţializează toate varibilele. economisind astfel mult timp.  Dacă aveţi nevoie de mai multă flexibilitate. Plasaţi cursorul pe linia la care doriţi să se oprească execuţia programului şi apoi selectaţi Run To Cursor. De asemenea. puteţi folosi acest buton atunci când depanaţi module de formulare sau de rapoarte. în special dacă procedurile conţin bucle. Execuţia codului pas cu pas Oprirea într-un punct de întrerupere este foarte utilă. puteţi trece peste ele pentru a vă concentra asupra codului nou. a fost introdusă posibilitatea de execuţie a codului pas cu pas. Opţiunea Run To Cursor este extrem de utilă în cazul în care codul conţine bucle (structuri ciclice) pentru că vă permite să săriţi rapid la instrucţiunea de după buclă. se trece automat la execuţia pas cu pas a programului. dacă folosiţi proceduri care au fost deja testate şi depanate. Ulterior. de aceea. Butonul Step Out continuă execuţia programului de la procedura curentă şi opreşte execuţia la linia care urmează după procedura apelantă. Este cel mai util instrument în cazul în care folosiţi variabile statice pentru memorarea valorilor. desigur. însă cum procedaţi dacă doriţi să analizaţi liniile de cod în timpul execuţiei? Stabilirea unui punct de întrerupere la fiecare linie de cod ar fi un proces foarte laborios. codul acesteia este executat normal fără a fi parcurs pas cu pas. Dacă această linie conţine apelul unei proceduri.  Butonul Step Over execută tot linia pe care este plasat cursorul. având astfel posibilitatea să aflaţi care linii de cod sunt corecte şi care conţine erori. Şi. Pag. Dacă linia curentă conţine o procedură. Avantajul metodei Step Into este că puteţi verifica fiecare linie de cod din toate procedurile întâlnite în timpul execuţiei. nu puteţi accesa formularul sau raportul respectiv dacă nu executaţi clic pe butonul Continue sau Reset. Metoda Step Over vă permite să executaţi rapid procedurile despre care ştiţi că sunt corecte. puteţi rula o singură instrucţiune la un moment dat. Este un fel de combinaţie între Step Out şi Step Over. la revenirea din procedură. 225 . Există mai multe posibilităţi de a executa codul pas cu pas:  Butonul Step Into execută doar linia pe care este plasat cursorul. Însă există şi dezavantajul că este o metodă mare consumatoare de timp. va determina intrarea în codul procedurii şi continuarea execuţiei pas cu pas.

Totuşi. puteţi folosi opţiunea Set Next Statement din meniul Debug pentru a comunica mediului Access că aceasta este linia pe care doriţi să o executaţi în continuare. acest va fi reluat de la noua linie de cod. După plasarea cursorului pe o linie care nu a fost încă executată. Executaţi clic pe linia la care s-a oprit execuţia codului şi apoi. În acest scop. O altă metodă de efectuare a acestei operaţii este să plasaţi cursorul pe noua linie şi să apăsaţi combinaţia de taste Ctrl+F9. trageţi săgeata de pe marginea ferestrei modului în noua locaţie. Access nu vă va permite să modificaţi o declaraţie. Saltul peste liniile de cod Saltul peste liniile de cod poate fi util. Pentru a continua execuţia programului de la linia corectată. însă presupune multă atenţie. puteţi continua execuţia programului. ţinând apăsat butonul mouse-ului. Selectarea opţiunii de reiniţializare are acelaşi efect cu executarea unui clic pe butonul Reset . În această situaţie. executaţi clic pe butonul Continue. Toate liniile de cod anterioare sunt ignorate. înseamnă că întreaga structură a codului se modifică (nu numai câteva linii) şi veţi primi un mesaj prin care sunteţi întrebat dacă doriţi să abandonaţi modificările sau să reiniţializaţi programul. 226 . trageţi cursorul pe o altă linie. însă a fost mult simplificată în Access 97. Opţiunea Show Next Statement vă va informa ce linie de cod urmează să fie executată. Este o informaţie utilă în cazul în care aţi analizat alte proceduri şi aţi pierdut poziţia curentă din fereastra de cod. pregătind o nouă pornire. Acest lucru poate reprezenta un avantaj real în cazul în care v-aţi oprit la un punct de întrerupere şi observaţi că o linie de cod care a fost deja executată conţine o eroare. astfel încât dumneavoastră să puteţi corecta eventualele erori descoperite.Repetarea execuţiei liniei de cod Posibilitatea de a repeta execuţia anumitor linii de cod a fost introdusă încă din Access 95. Procedând astfel.se opreşte execuţia codului. sunt reiniţializate toate variabilele. Pag. puteţi să reveniţi la linia respectivă şi să repetaţi execuţia codului (după corectarea erorii). Modificarea codului Access permite modificarea codului în timp ce execuţia este oprită. Când ajungeţi pe linia următoare celei pe care vreţi să poziţionaţi cursorul. eliberaţi butonul stâng al mouse-ului: Când continuaţi execuţia programului. Observaţi transformarea cursorului într-o săgeată care indică noua linie. chiar dacă rescrieţi secţiuni întregi de cod. iar punctul următor de execuţie se mută pe prima linie de cod. De fapt.

B. puteţi să pierdeţi punctul curent din program. Stiva de apeluri Când depanaţi programe mari sau complexe. executând un clic pe butonul Calls. unde puteţi introduce comenzi care sunt executate imediat . veţi observa că fereastra de depanare a fost considerabil modificată. ori programe bine modularizate. iar dumneavoastră opriţi execuţia programului în C. Dacă bănuiţi că o anumită valoare va determina apariţia unor probleme în cod.Dacă doriţi să modificaţi anumite variabile. fără să reiniţializaţi programul. să modificaţi variabilele locale şi apoi să stabiliţi următoarea instrucţiune pentru ca procedura să poată fi rulată din nou. veţi vedea pe ecran o listă cu procedurile active: Observaţi că acestea nu sunt procedurile care au fost rulate. De exemplu. De asemenea. veţi vedea pe ecran C. aceasta era numită fereastra imediată. Este una dintre situaţiile în care se recomandă folosirea opţiunii Show Next Statement.în versiunile anterioare de Access. puteţi afişa datele. Fereastra de depanare (Debug) Aţi văzut deja mai multe exemple de utilizare a ferestrei de depanare. A. ci procedurile care sunt executate în momentul respectiv. puteţi folosi fereastra de depanare pentru a schimba conţinutul variabilelor. Dacă aţi folosit versiuni anterioare de Access. Oricum. permiţându-vă să introduceţi valori eronate în variabile pentru a testa răspunsul procedurilor. puteţi să ieşiţi din această procedură. dacă procedura A apelează procedura B şi B apelează C. puteţi să modificaţi valoarea respectivă şi să continuaţi apoi lucrul. pentru că s-ar putea să uitaţi de unde aţi început analiza procedurilor chiar în mijlocul procesului de depanare. haideţi să vedem cum arată noua fereastră: Pag. În cadrul ei. este fereastra folosită cel mai frecvent în depanare. adică procedura executată în mod curent şi cele care au apelat-o. Este o metodă foarte utilă în timpul testării. Dacă aţi terminat execuţia procedurii C şi apoi aţi continuat execuţia procedurii B. în fereastra de apeluri vor fi afişate doar B şi A. puteţi executa codul şi puteţi chiar analiza variabilele. 227 . Dacă executaţi clic pe butonul Call Stack (Stiva de apeluri). astfel încât să corectaţi valorile care pot genera erori.

iar execuţia programului va fi oprită imediat ce valoarea este adevărată sau se modifică. 228 . care încearcă toate tipurile de whisky pentru o regiune dintr-o matrice globală. a fost folosit până acum pentru apelurile de proceduri. execuţia programului este încetinită. care afişează conţinutul matricei globale. Puteţi folosi elementele de urmărire şi ca puncte de întrerupere condiţionale. Apoi apelează procedura DisplayWhiskies.  DisplayWhiskies. mai ales când aveţi o variabilă care provoacă probleme. care afişează în fereastra de depanare valorile existente în matricea globală. 11. Încercaţi singur . Elemente de urmărire Butonul Instant Watch (Urmărire imediată) vă permite să stabiliţi un element de urmărire pentru variabile sau expresii. Panoul de jos. şi apelează funcţia GetWhisky o dată pentru fiecare regiune din matrice. dar nu ştiţi unde a fost valoarea respectivă. trebuie să deschideţi modulul Chapter 11 Debugging din fişierul Whisky11. şi butonului de construcţie. puteţi să adăugaţi o opţiune de întrerupere pentru elementul de urmărire.4 Panoul Locals afişează variabilele şi valorile conţinute de acestea în cadrul procedurii active la momentul respectiv. care afişează toate tipurile de whisky pentru un nume de regiune. Prin utilizarea acestei variante de punct de întrerupere. Panoul Watch afişează variabilele pe care doriţi să le urmăriţi în cadrul execuţiei codului. codul va fi oprit la execuţie.Fig. care afişează starea procedurii. În dreapta există o casetă de text. În acest caz. DisplayWhisky acceptă ca intrare o matrice cu nume de regiuni.mdb în modul de afişare pentru proiectare (Design). astrRegions(). permiţându-vă să analizaţi atât elementul de urmărire. Modulul conţine următoarele trei proceduri:  DisplayWhisky. Dacă specificaţi un element de urmărire (watch) cu opţiunile Break When Expression Is True (opreşte execuţia când expresia este adevărată) sau Break When Expression has Changed (opreşte execuţia la modificarea expresiei).  GetWhisky. Este o metodă utilă. Pentru a găsi toate înregistrările corespunzătoare regiunii selectate. Immediate Pane. care afişează fereastra Call Stack.Depanarea codului Pentru acest exemplu. cât şi valorile variabilelor. ceea ce nu reprezintă o problemă la depanare. GetWhisky creează o instrucţiune SQL şi apoi Pag.

A doua linie afişează atrRegions. împreună cu tipurile şi valorile lor. Deoarece veţi controla execuţia funcţiilor din fereastra de depanare. care are valoarea atribuită automat la crearea variabilelor Variant. 1. care permite includerea sau excluderea preţului produsului după preferinţe. în plus. Există şi un argument opţional. este necesar să deschideţi şi această fereastră. o matrice locală care nu are încă atribuite valori. Haideţi să analizăm în detaliu panoul Locals: Acest panou afişează toate variabilele care sunt active sau care se găsesc în domeniu. 4. împreună cu valoarea conţinută. Expandaţi şi astrRegions pentru a vedea ce conţine. Vom experimenta fiecare dintre aceste funcţii şi vom vedea cum le putem depana atunci când descoperim o eroare. Executaţi clic pe Debug Window pentru a aduce această fereastră în prim-plan: 3. A treia linie conţine strRegion.adaugă fiecare tip de whisky în matricea globală. Prima linie este pentru modul. iar semnul plus indică posibilitatea expandării pentru a afişa elementele componente. "Highland" Ar trebui să observaţi oprirea execuţiei codului. să îl plasaţi pe prima linie executabilă din funcţia DisplayWhisky: 2. pe ecran va fi afişat fiecare element al matricei. Executaţi clic pe semnul plus (sau executaţi dublu-clic pe linie) pentru a expanda linia Chapter 11 Debugging: Pe ecran sunt afişate cele două variabile globale. În primul rând trebuie să stabiliţi un punct de întrerupere şi. Apoi apelaţi procedura din fereastra de depanare: DisplayWhisky "Islay". o variabilă locală cu valoarea Empty. Deoarece astrRegions este o matrice. 229 . puteţi introduce un semn de întrebare urmat de numele variabilei Pag. Haideţi să încercăm o altă metodă de analiză a variabilelor. deoarece doriţi să executaţi codul pas cu pas. În fereastra de depanare. Puteţi vedea că mastrWhiskies este o matrice de tip typWhisky şi că strSQL este un şir (string). 5. vom analiza variabilele pe care le conţin.

Prima procedură este la sfârşitul listei. Argumentele au valori. ca urmare. să vedem ultima metodă de analiză a variabilelor. Acum este momentul să analizăm stiva de proceduri. aveţi posibilitatea de a adăuga acest element de urmărire în lista Watch. nu a primit nici o valoare. Acum executaţi clic pe butonul Step Into pentru a rula această linie de cod. însă aceasta nu conţine nimic. 10. 230 . Acum. pentru că nu leam configurat încă. executaţi clic pe butonul Cancel şi ieşiţi din fereastră. însă deocamdată. aşa încât executaţi clic pe butonul Calls pentru a vedea unde ne aflăm. 7. Procedura curentă (activă) este afişată în fruntea listei. Punctul de întrerupere este în continuare pe linia For Each. însă linia curentă este următoarea. Chiar şi din acest exemplu simplu. Observaţi că variabilele pentru procedura GetWhiskies sunt afişate acum în fereastra Locals. În fereastră puteţi vedea ordinea în care aţi executat procedurile. Vom arăta imediat cum se procedează. Puteţi analiza şi variabila strRegion. vă puteţi da seama ce se întâmplă în cazul programelor mari. Să spunem că doriţi să executaţi codul pas cu pas.MoveNext Pag. pe ecran este afişată aceeaşi informaţie ca în panoul Locals. pentru că linia nu a fost încă executată şi. iar procedura pe care aţi apelat-o apare imediat dedesubt. Pe ecran apare o casetă explicativă (etichetă ToolTip) în care este afişată valoarea variabilei. În plus. însă într-un format puţin diferit. Poziţionaţi cursorul pe strRegion şi executaţi clic pe butonul Quick Watch (sau folosiţi combinaţia de taste Shift+F9): Prin această metodă. pentru a vedea o altă metodă de analiză a variabilelor.Pe ecran va fi afişat numele regiunii pe care l-aţi transmis ca prim argument al procedurii. 8. Quick Watch (Urmărire rapidă). până la linia care citeşte următoarea înregistrare din setul de înregistrări. Folosiţi butonul Step Into pentru a trece la procedura GetWhiskies şi executaţi clic pe Debug Window pentru a duce această fereastră în prim – plan. Poziţionaţi cursorul pe linia strRegion din buclă. 6. Plasaţi cursorul pe linia recR. însă nu şi variabilele locale. 9. care apare evidenţiată.

Unele nu au valori sau nu pot fi aplicate în cazul acestui tip de set de înregistrări. În primul rând. treceţi în fereastra de depanare. Vei vedea colecţiile setului de înregistrări. 11. apoi mastrWhiskies: Fiind prima iniţializare a datelor. expandaţi variabila recR pentru a vedea setul de înregistrări: Remarcaţi că sunt disponibile toate proprietăţile pentru seturi de înregistrări. 231 . Executaţi de două ori clic pe butonul Step Into pentru a reveni la procedura DisplayWhisky. Observaţi că acest set de înregistrări conţine şase câmpuri care pot fi expandate pentru a analiza detaliile corespunzătoare fiecăruia. . adică la funcţia apelantă. 12. iar cele trei elemente ale acestuia conţin valorile corecte. iar execuţia s-a oprit pe linia selectată de dumneavoastră. a fost creat numai primul membru al matricei. Derulaţi fereastra până în partea superioară şi expandaţi Chapter 11 Debugging. Pe ecran este afişată fereastra Quick Watch.astfel că stabiliţi un element de urmărire (watch) pe această variabilă pentru a o vedea permanent.strName = recR("WhiskyName") Aţi ajuns din nou la bucla în care este completată matricea globală. care conţine variabila Pag. Execuţia continuă până la linia selectată. Evidenţiaţi recR("WhiskyName") şi executaţi clic pe butonul Quick Watch. care presupunea introducerea fiecărui element în fereastra de depanare pentru a-i vedea conţinutul.Close şi selectaţi opţiunea Run To Cursor. Parcurgeţi câteva instrucţiuni până când ajungeţi la următoarea linie de cod din procedura GetWhiskies: 13. Vreţi să vedeţi numele de whisky fără ca acesta să fie tipărit în fereastra de depanare şi fără să comutaţi panoul Locals . Plasaţi cursorul pe linia recR.şi alegeţi Run To Cursor din meniul Debug. Execuţia codului va continua până la linia solicitată. 14. Metoda este utilă mai ales la depanarea unui cod cu structuri ciclice. Veţi avea posibilitatea să examinaţi aceste detalii mai târziu. deocamdată. Derulaţi conţinutul ferestrei. Este mult mai simplu decât prin vechea metodă. să continuăm exerciţiul. Acum sunteţi în etapa în care aţi completat deja un element al matricei. însă toate au fost afişate instantaneu. când puteţi să plasaţi cursorul pe instrucţiunea de după buclă şi apoi să săriţi peste bucla respectivă fără să mai stabiliţi un punct de întrerupere.

Opţiunea Break When Value Is True (Opreşte execuţia când valoarea este adevărată) va adăuga o expresie de urmărire şi va opri execuţia programului atunci când valoarea expresiei este adevărată. pentru a opri execuţia programului atunci când preţul unei sticle de whisky depăşeşte 30 de lire. În urma acestei comenzi. însă numai pentru variabilele care vă interesează. contextul este pentru modulul curent. Acum executaţi clic pe butonul Add.MoveNext. 232 . urmăriţi modificarea valorii variabilei în timpul execuţiei. apoi parcurgeţi pas cu pas programul până ajungeţi la instrucţiunea recR. Dacă aveţi variabile din mai multe proceduri. la fiecare modificare a expresiei. Haideţi să experimentăm opţiunea Break When Value Is True. Opţiunea Break When Value Changes (Opreşte execuţia la modificarea valorii) va opri execuţia programului atunci când valoarea expresiei se modifică. 16. treceţi în panoul Watch Aici apar aceleaşi informaţii ca în panoul Locals. dar nu sunteţi sigur unde are loc modificarea. execuţia codului va fi oprită. Tipul de urmărire (Watch Type) al unei expresii de urmărire (Watch Expression) este similar cu cel ape care tocmai l-aţi văzut: afişează valoarea expresiei pe care o urmăriţi.selectată şi valoarea acesteia la momentul curent. Executaţi clic pe butonul OK şi observaţi că elementul de urmărire a fost adăugat în listă: Valoarea curentă este falsă. puteţi să stabiliţi un element de urmărire şi să rulaţi programul în mod normal. 17. 18. În acest caz. indicând faptul că valoarea expresiei este acum adevărată (True): Pag. Acum puteţi alege nu numai ceea ce doriţi să urmăriţi. În acest caz. este afişat şi contextul. dar şi modul în care se face urmărirea. 19. Poziţionaţi ferestrele astfel încât să vedeţi atât variabila urmărită cât şi codul. Executaţi clic pe butonul Go/Continue şi fereastra Watch va fi afişată în prim-plan. Puteţi adăuga şi alte elemente de urmărire executând clic cu butonul drept al mouse-ului în fereastra de urmărire şi selectând opţiunea Add Watch… Pe ecran apare următoarea casetă de dialog: 15. Această metodă poate fi foarte utilă dacă aveţi o variabilă globală a cărei valoare este modificată de o altă procedură.

casetele de dialog pentru mesajele de eroare. 11. găsiţi sortimentul Glengoyne. pentru examinarea proprietăţilor obiectelor pe măsură ce sunt folosite în program.desigur. care vă permite să introduceţi întrebări între-un limbaj natural. dar nu pas cu pas.Update. care răspunde solicitărilor dumneavoastră: Pag. însă puteţi schimba valoarea în matrice. puteţi selecta opţiunea Contents and Index din meniul Help pentru a găsi informaţii despre un anumit subiect . Access acceptă opţiunea Answer Wizard (în acelaşi meniu). adică valoarea pe care tocmai aţi modificat-o. Procedura va fi finalizată. Nu puteţi modifica valoarea în expresia recR("Price") fără a executa o instrucţiune recR. Să presupunem că preţul nu este corect. 233 . vechi de 12 ani. În general. De asemenea. Corectitudinea opririi programului poate fi verificată în fereastra Locals sau în panoul Debug: 20. este util ca instrument de instruire. Introduceţi noua valoare în panoul de depanare şi apăsaţi tasta Return: Este o operaţie similară cu configurarea unei variabile în cadrul codului.Edit sau recR. veţi economisi foarte mult timp. deoarece conţine o listă cu cele mai frecvente tipuri de erori şi descrierea cauzelor care le-au generat. Dacă poziţionaţi cursorul pe un cuvânt cheie din fereastra de cod şi apăsaţi tasta F1. pe ecran este afişat textul de asistenţă contextuală pentru cuvântul respectiv. ar trebui să consultaţi fişierul de asistenţă (Help). iar detaliile corespunzătoare vor fi afişate pe ecran. În primul rând. Merită să faceţi un efort pentru a învăţa să îl folosiţi. puteţi folosi noul Office Assistant. deoarece pe termen lung. În plus. În plus.Programul şi-a continuat execuţia până când a găsit un preţ mai mare de 30 de lire. 21. Acum acţionaţi butonul Continue pentru a continua execuţia.7 Utilizarea sistemului de asistenţă (Help) Executarea programelor pas cu pas vă poate ajuta să descoperiţi erorile. Dacă derulaţi puţin conţinutul ferestrei. Observaţi că noul panou Locals oferă un mar avantaj programatorului. însă nu cazul să începeţi direct cu această metodă. include un buton Help. care apar supărător de des în procesul de depanare a codului.

234 .Executaţi clic pe butonul de căutare (Search). iar Clipit va afişa pe ecran o listă de subiecte: Fig.11. 5 Pag.

Fişierul de asistenţă (Help) este cu adevărat util în situaţiile în care mesajul de eroare returnat de sistem nu descrie cauza erorii. Să luăm ca exemplu procedura ErrorHelp: Public Sub ErrorHelp(strColumn As String)
'Scop: 'Argumente: 'Valoarea returnata: Prezinta un mesaj de eroare util la cautarea unei coloane intr-un set de inregistrari strColumn Coloana care este cautata nici una

Dim dbCurrent As Database ' Baza de date curenta Dim recBottling As Recordset ' Un instantaneu al tabelului cu ' sortimentele de bauturi Dim strSQL As String ' sir SQL 'construieste un sir SQL si deschide setul de inregistrari strSQL = "SELECT " & strColumn & " FROM Bottling" Set dbCurrent = CurrentDb() Set recBottling = dbCurrent.OpenRecordset (strSQL, dbOpenSnapshot) ' parcurge setul de inregistrari tiparind coloana While Not recBottling.EOF Debug.Print recBottling(strColumn) recBottling.MoveNext recBottling.Close

End Sub Această procedură acceptă ca parametru de intrare un şir, care este folosit pentru a selecta câmpul din dreapta al tabelului Bottling. Încercaţi să rulaţi procedura cu parametrul următor: Call ErrorHelp ("DistillationDate") Şi veţi primi o listă cu toate datele la care au fost distilate băuturile. Încercaţi şi cu parametrul următor: Call ErrorHelp ("DateDistilled")

Pag. 235

Veţi primi acest mesaj de eroare:

Fig.11.6 Nu vă spune prea mult, nu-i aşa? Executaţi clic pe butonul Help şi veţi vedea pe ecran o fereastră de asistenţă cu un conţinut mult mai edificator:

Fig.11.7

Al doilea paragraf este important, indicând faptul că încercaţi să selectaţi un nume de câmp necunoscut. Tratarea erorilor Acum, după ce aţi aflat cum puteţi să preveniţi greşelile şi cum să le detectaţi pe cele care nu pot fi anticipate, trebuie să învăţaţi cum să trataţi erorile într-un mod cât mai elegant. Reţineţi că greşelile şi erorile sunt lucruri diferite. Un proiect bun, o testare şi o depanare corespunzătoare ar trebui să elimine toate greşelile din codul dumneavoastră. Însă acesta nu înseamnă că nu vor apărea erori. De exemplu, să ne imaginăm că programul pe care l-aţi scris accesează un anumit fişier de pe disc - să presupunem că este vorba de un fişier legat. Ştiţi că în cod
Pag. 236

nu există greşeli, aşa încât va accesa întotdeauna corect fişierul respectiv şi va prelucra datele fără nici o problemă. Însă erori pot apărea în continuare - dacă cineva mută fişierul în altă locaţie pe disc sau îl şterge, veţi primi un mesaj de eroare. Există situaţii în care doriţi să ignoraţi o anumită eroare sau să declanşaţi o altă acţiune decât cea prevăzută de Access 97 pentru eroarea respectivă. În acest caz, este necesar să împiedicaţi mediul Access să oprească execuţia codului şi să afişeze mesajul standard de eroare - trebuie să trataţi personal erorile, pe măsură ce apar. Erori în Visual Basic Probabil aţi întâlnit secvenţe de cod pentru tratarea erorilor, în special dacă aţi folosit la crearea formularelor programul asistent (wizard) Command Button. Dacă nu includeţi o rutină proprie de tratare a erorilor, Access foloseşte o rutină prestabilită, care afişează un mesaj de eroare şi opreşte execuţia codului. Prin introducerea instrucţiunii On Error, comunicaţi mediului Access că veţi folosi o rutină proprie pentru afişarea erorilor. De exemplu, citiţi următoarea secvenţă de cod:
Public Sub ErrorHandling() On Error GoTo ErrorHandling_Err
'O parte din cod se gaseste aici

ErrorHandling_Exit: Exit Sub ErrorHandling_Err:
'Codul de tratare a erorii se gaseste aici

End Sub

Această este schema recomandată pentru majoritatea rutinelor. Instrucţiunea On Error specifică o etichetă la care trece automat execuţia codului în cazul apariţiei unei erori. Etichetele sunt simple marcaje existente în cod şi respectă aceleaşi convenţii de nume ca şi variabilele, exceptând faptul că la sfârşit au semnul două puncte (:). Prin convenţie, pentru numele etichetelor de erori folosiţi numele procedurii, la care adăugaţi _Err. Prin comanda Resume, comunicaţi mediului Access că tratarea erorilor s-a terminat şi că ar trebui să continue execuţia din rutina principală. După procesarea codului pentru rutina de eroare, efectuaţi una dintre acţiunile următoare:  Încercaţi din nou instrucţiunea care a produs eroarea, folosind comanda Resume. Aceasta comunică mediului Access că trebuie să revină la instrucţiunea care a cauzat eroarea şi să o ruleze din nou. Folosiţi această metodă numai dacă sunteţi sigur că eroarea nu se va produce în mod repetat. Comanda Resume este utilizată de obicei împreună cu o
Pag. 237

casetă de mesaj, în care utilizatorul este întrebat dacă doreşte să repete o anumită acţiune.  Dacă eroarea poate fi tratată fără oprirea execuţiei, continuaţi cu linia următoare procedurii principale. În acest caz, folosiţi comanda Resume Next; procesarea rutinei continuă de la linia care urmează celei în care a apărut eroarea. Această metodă ar trebuie folosită numai dacă eroarea nu va acuza probleme ulterioare în aplicaţie.  Dacă procesarea rutinei nu mai poate continua, ieşiţi din procedură. În acest caz, ar trebui să folosiţi comanda Resume ErrorHandling_Exit pentru a comunica rutinei să treacă la eticheta de ieşire.  Dacă eroarea a fost atât de gravă încât a oprit execuţia întregului program, ieşiţi din program folosind comanda End. Acum puteţi să începeţi scrierea propriei dumneavoastră proceduri de tratare a erorilor. Vom folosi un exemplu simplu, cu o casetă de intrare în care se cere utilizatorului să introducă un număr şi apoi se împarte valoarea 10 la numărul respectiv. Încercaţi singur - Crearea unei proceduri de tratare a erorilor
1.

Creaţi următoarea subrutină ErrorHandling:

Public Sub ErrorHandling() Dim dblResult As Double dblResult = 10 / InputBox("Introduceti un numar:") MsgBox "rezultatul este " & str$(dblResult) End Sub

Pag. 238

Fig.11.8
2.

Rulaţi subrutina în fereastra de depanare. Procedura afişează pe ecran un mesaj în care se cere introducerea unui număr. Apoi atribuie variabilei dblResult valoarea obţinută împărţind 10 la numărul introdus de utilizator şi afişează rezultatul. Introduceţi câteva numere pentru a testa subrutina.

Fig.11.9

Pag. 239

11. Modificaţi codul ca mai jos şi mai încerca o dată: Public Sub ErrorHandling() Dim dblResult As Double On Error GoTo ErrorHandling_Err dblResult = 10 / InputBox("Introduceti un numar:") MsgBox "rezultatul este " & str$(dblResult) ErrorHandling_Exit: Exit Sub ErrorHandling_Err: MsgBox Err.Number Resume ErrorHandling_Exit End Sub Pag.Descrition & " . 240 . Apoi lăsaţi caseta de intrare necompletată .veţi vedea mesajul de eroare Divide By Zero (Împărţire la zero).Fig. Avem nevoie de o rutină de tratare a erorii. Introduceţi cifra 0 . 4. realizează că tipurile de variabile sunt incompatibile. Când Access încearcă să împartă 10 la acest şir.11.funcţia InputBox returnează un şir vid (empty) dacă nu introduceţi nici o valoare în casetă.11 Eroarea Type mismatch apare din cauză că este returnat un şir . Fig.10 3." & Err.va fi afişat mesajul de eroare Type mismatch.

Modificaţi din nou codul de tratare a erorilor. puteţi continua să folosiţi Error$ şi Err pentru descrierea şi numărul erorii. dorim să detectăm două erori distincte şi să declanşăm în fiecare caz o acţiune specifică. Acum. astfel încât să fie ceva mai "inteligent" decât înainte: ErrorHandling_Err: Select Case Err. introduceţi un număr diferit de 0. Dacă doriţi să ieşiţi din această procedură. Obiectul Err a fost introdus în Access 95. însă nu am făcut deosebire între tipurile de erori. pentru că vă permite editarea textului mesajului. 5.empty entry (Incompatibilitate . numindu-le pe toate erori semantice.Number Resume ErrorHandling_Exit End Select 6. este o metodă preferabilă celei care afişează mesajul de eroare prestabilit. am filtrat erorile cu ajutorul unor variabile booleene. Încercaţi să introduceţi 0 sau o literă şi vedeţi ce se întâmplă. Cum funcţionează? Pag.sir vid) Resume Case 11 ' Divide by zero (Impartire la zero) dblResult = 0 Resume Next Case Else MsgBox Err. 241 . În anumite circumstanţe.Într-un exerciţiu anterior. însă noul obiect conţine mai multe informaţii şi este mult mai clar. Dacă doriţi.Description & " . Ar fi bine să folosiţi obiectul Err în toate programele pe care le scrieţi de acum înainte." & Err. Această rutină de tratare a erorilor afişează mesajul de eroare şi numărul erorii şi apoi face saltul la instrucţiunea de ieşire.Number Case 13 ' Type mismatch .

nu se recomandă să folosiţi rezultatele unei funcţii cum este InputBox direct în expresii numerice. vă veţi da seama că nu are nici un efect.Number conţine numărul de eroare. Din acest motiv. Amintiţi-vă că am menţionat această problemă ceva mai devreme în cadrul capitolului de faţă. Case 13 ' Type mismatch . Adevărata problemă din acest exemplu este faptul că va fi returnată valoarea 0 pentru o eroare de împărţire la 0." & Err.Number Resume ErrorHandling_Exit Chiar dacă nu ne aşteptăm să apară alte tipuri de erori. care cere continuarea execuţiei programului de la linia aflată imediat după cea care a generat eroarea.instrucţiunea Resume cere revenirea la linia care a cauzat eroarea.sir vid) Resume Eroarea indică o nepotrivire a tipurilor de variabile: fie caseta de intrare a rămas necompletată. fără o verificare preliminară a conţinutului acestora. sau măcar semnalate prin afişarea unor mesaje pe ecran. Ar trebui să modificaţi secvenţa de cod astfel încât toate erorile să fie returnate. pe ecran este afişat un mesaj şi se iese din procedură.În loc să lăsaţi mediul Access să afişeze meniul standard de eroare.Number Prima instrucţiune verifică dacă Err. caseta este afişată din nou pe ecran . În astfel de cazuri. Case Else MsgBox Err. Atribuiţi rezultatului valoarea 0 şi introduceţi instrucţiunea Resume Next. Select Case Err. puteţi să specificaţi mult mai clar acţiunea care va avea loc. Funcţia InputBox returnează un şir vid dacă nu se introduce nici o valoare. este bine să avem în vedere şi tratarea acestora.empty entry (Incompatibilitate . Acelaşi lucru este valabil şi pentru butonul Cancel din caseta de intrare. Aceasta este linia ce conţine MsgBox. aşa încât este generată aceeaşi eroare. În acest caz. fără a fi afişat un mesaj de eroare. 242 . fie a fost introdus un şir de caractere ce nu reprezintă un număr. Pag. situaţie în care putem ignora pur şi simplu eroarea. Case 11 ' Divide by zero (Impartire la zero) dblResult = 0 Resume Next Eroarea 11 apare dacă în caseta de intrare a fost introdusă valoarea 0. Dacă încercaţi să apăsaţi butonul Escape.Description & " .

am putea rescrie funcţia ErrorHandling astfel: Public Sub ErrorHandling() Dim dblResult As Double On Error GoTo ErrorHandling_Err dblResult = 10 / InputBox("Introduceti un numar:") MsgBox "rezultatul este " & str$(dblResult) Exit Sub ErrorHandling_Err: Select Case Err.există un singur punct de ieşire din Pag.Description & " . în versiunea anterioară a rutinei. conferindu-i un grad mai mare de flexibilitate." & Err. folosim instrucţiunea Exit Sub pentru a determina ieşirea din subrutină. deoarece sunt mai puţine etichete în cod. Acestea vă permit să renunţaţi la folosirea etichetelor. De exemplu.Number Case 13 ' Type mismatch .empty entry Exit Sub Case 11 ' Divide by zero (Impartire la zero) dblResult = 0 Resume Next Case Else MsgBox Err. puteţi include alte două instrucţiuni Access Exit Function şi Exit Sub. veţi vedea cât de uşor poate fi personalizată rutina de tratare a erorilor. astfel că rutinele devin mai uşor de citit şi de depanat. Deşi pare o procedură simplă.deoarece forma actuală este evident greşită şi poate indica o eroare anterioară de program. vă recomand prima metodă dintr-un motiv foarte important . Cu toate că este un exemplu foarte simplu.Number Exit Sub End Select End Sub Această metodă permite şi folosirea butonului Cancel. nu a funcţionat. 243 . Utilizarea instrucţiunilor Exit Function şi Exit Sub în rutinele de tratare a erorilor În rutinele de tratare a erorilor. Când este detectat numărul de eroare 13. care.

Evenimentul de eroare preia două argumente: Fig. indică dacă doriţi sau nu ca mesajul de eroare prestabilit să fie afişat pe ecran. Al doilea argument. însă. Erori DAO Aşa cum am arătat în capitolele anterioare.formularele au un eveniment Error asociat. în cazul apariţiei erorii este executată rutina prestabilită. Dacă bănuiţi că eroarea provine de la un obiect de acces la date.ceea ce vă permite să afişaţi pe ecran propriul dumneavoastră mesaj de eroare. Response. acesta este gol (nu are cod scris) şi. ştiind sigur că acestea vor fi rulate. acDataErrDisplay. Haideţi să vedem cum a fost implementat acest procedeu în baza de date şi să schimbăm mesajul afişat pe ecran la apariţia unei anumite erori. la fel ca în procedurile normale. Erori în formulare şi rapoarte În Access.11. Dacă atribuiţi acestui argument valoarea acDataErrContinue. există erori care sunt asociate cu formularele . 244 . pe ecran este afişat mesajul prestabilit pentru eroarea respectivă. În mod normal. reprezintă numărul erorii şi este folosit în acelaşi fel ca Err în exemplul anterior.12 Primul argument. puteţi adăuga propria dumneavoastră secvenţă de cod. DataErr. colecţia Errors (care a fost introdusă în versiunea Access95) conţine toate erorile referitoare la obiectele de acces la date. Aceasta înseamnă că puteţi introduce instrucţiuni de cod înainte de procedura de ieşire.procedură. Access va ignora eroarea şi va continua execuţia codului . Pag. verificaţi mesajele de eroare din toată colecţia. Dacă atribuiţi argumentului valoarea implicită. ceea ce nu se întâmplă în cazul inserării instrucţiunilor Exit Sub în diverse porţiuni ale codului. dar şi obiectul eroare.

Prin utilizarea metodei Raise a obiectului Err. însă puteţi defini propriile dumneavoastră erori.empty entry Resume Case 11 ' Divide by zero Pag. Este o metodă foarte utilă. sau un număr care nu face parte din gama celor utilizate în VBA. chiar fără apariţia efectivă a unei erori.Raise 32000 End If dblResult = 10 / VarNumber MsgBox "rezultatul este " & str$(dblResult) ErrorHandling_Exit: Exit Sub ErrorHandling_Err: Select Case Err. Numărul maxim este 65535. apoi o tratează la fel ca pe erorile interne. De asemenea. pentru că permite crearea unei erori specifice într-o procedură atunci când se întâmplă un anumit lucru.Definirea unor erori proprii 1. Deschideţi procedura ErrorHandling pe care aţi analizat-o ceva mai devreme şi modificaţi codul astfel: Public Sub ErrorHandling() Dim dblResult As Double Dim VarNumber As Variant On Error GoTo ErrorHandling_Err VarNumber = InputBox("Introduceţi un număr:") If Not IsNumeric(VarNumber) Then Err.Erori definite de utilizator S-au spus multe lucruri despre erorile din Access. Obiectul va raporta eroarea în modul obişnuit.Number Case 13 ' Type mismatch . Încercaţi singur . Diferenţa este că dumneavoastră trebuie furnizaţi numărul de eroare. sunt generate erori definite de utilizator. Acesta poate fi un număr de eroare standard din VBA. însă VBA nu foloseşte valori de peste 32000. cum ar fi 13 pentru Type Mismatch (Incompatibilitatea tipurilor de date). ceea ce înseamnă că aveţi de unde alege. permite declanşarea rutinelor pentru erori prestabilite. 245 .

răspunzându-le pe măsură ce apar. Stiva de erori Deoarece Access este un mediu dirijat de evenimente. adăugând o secţiune suplimentară: Case 32000 MsgBox "Trebuie sa fie un numar" Resume ErrorHandling_Exit 3." & Err. 246 .Number Resume ErrorHandling_Exit End Select End Sub Acum.Description & " . Pentru a preveni apariţia unor conflicte cu mediul Access." & Err. în procedura anterioară ar fi afişat mesajul Application-defined or object-defined error . Pag. 2. Deşi acest mod de lucru este destul de simplu. Noua rutină de tratare a erorilor procesează eroarea cu numărul 32000 la fel ca pe celelalte. trebuie să fiţi atent unde anume caută Access codul de tratare a erorilor. Access nu trebuie să păstreze o stivă de erori. Pe măsură ce este introdusă fiecare procedură. rutina de tratare a erorii este apelată cu numărul de eroare 32000. MsgBox Err. rutina de tratare a erorilor este reiniţializată şi orice eroare este tratată independent.dblResult = 0 Resume Next Case Else MsgBox Err. Ca urmare.Description & " . folosiţi întotdeauna în cod numere mai mari de 32000. dacă valoarea de intrare nu este numerică. Dacă nu trataţi explicit erorile definite de utilizator şi folosiţi o simplă casetă de mesaj pentru a afişa textul standard. procesează periodic mici secvenţe de cod care corespund evenimentelor.32000. veţi obţine mesajul de eroare Applicationdefined or object-defined error.Number De exemplu. Lansaţi în execuţie procedura şi introduceţi în caseta de intrare o literă. funcţia va afişa pe ecran propriul dumneavoastră mesaj. Modificaţi rutina de tratare a erorilor.

să presupunem că avem trei proceduri: A.Raise q Pag. A apelează B şi B. Dacă nu găseşte nici una. Access parcurge în sens invers procedura activă curentă în căutarea unei rutine de tratare a erorilor şi o execută pe prima pe care o găseşte. B şi C sau vă veţi baza pe facilitatea de backtracking (revenire) şi veţi plasa rutina doar în procedura A? Dacă aveţi de-a face cu erori similare. De exemplu. care va fi tratata de Access Err. datorită capacităţii de backtracking. Să presupunem acum că v-aţi hotărât să creaţi propria dumneavoastră rutină de tratare a erorii. puteţi avea următorul cod de tratare a erorilor doar în procedura A: A_Err: Select Case Err. De exemplu.Number Case w ' Este periculos. Veţi plasa câte o rutină în A. B şi C. Access va reveni la B şi apoi la A în căutarea unei rutine de tratare a erorii. deci se iese Resume A_Exit Case x ' Trecere la linia urmatoare de cod Resume Next Case y ' O noua incercare Resume Case z ' O eroare prestabilita. Săgeţile de revenire în procedurile apelante indică unde caută Access o rutină de tratare a erorii. apelează rutina prestabilită. la rândul său apelează C.La apariţia unei erori. apelează rutina implicită de tratare a erorilor. să o plasaţi la cel mai înalt nivel. 247 End Select . este foarte normal să creaţi o singură rutină şi. Dacă C generează o eroare. Dacă nu găseşte nimic în B sau A. Reţineţi că acest mod de lucru nu afectează în nici un fel fluxul de control al programului în care procedura C este încă activă.

care poate schimba fluxul programului. Resume Next va continua execuţia cu linia care urmează după apelul procedurii B. Totuşi. există o problemă serioasă. De exemplu.aceasta este linia curentă în procedura A. aşa cum aţi putea crede. 248 . Observaţi că nici una dintre metode nu va returna execuţia în procedura C.Deşi codul este foarte simplu. Deci Resume va relua execuţia de la linia care a apelat procedura B . Nici Resume şi nici Resume Next nu vor continua execuţia cu procedura C. În mod similar. cu linia curentă din procedura care tratează eroarea. Haideţi să examinăm puţin diagrama următoare pentru a vedea ce se întâmplă: Diagrama ilustrează riscul utilizării unei singure rutine pentru tratarea erorilor.trebuie să cunoaşteţi aceste aspecte şi să faceţi o planificare (proiectare) corespunzătoare. puteţi să Pag. există şi situaţii în care această metodă este utilă .

în timp ce rutina din A poate fi folosită pentru erorile din A şi B. permiţând continuarea execuţiei programului în condiţii normale.Print "In b" Call c Debug.plasaţi o rutină de plasare a erorilor în A şi alta în C.Number & ": " & Err. Dacă este vorba de eroarea 13 (Type Mismatch). Prima atribuie unei variabile întregi o valoare foarte mare. puteţi folosi instrucţiunea Err. Rutina din C tratează erorile generate în procedura respectiv (C).Raise în procedura C pentru a forţa Access să mute rutina de tratare a erorilor pe nivelul imediat superior. Err. deci vom genera eroarea din nou. mesajul de eroare este afişat aici.Print "In b: setting intI to 123456789" intI = 123456789 End Sub Pag. Pentru aceasta se foloseşte metoda Raise obiectului Err. "c". Haideţi să vedem ce conţinut ar avea o posibilă procedură apelantă: Sub b() Dim intI As Integer Debug.Raise Err.Description Case Else Err. Cele trei argumente sunt numărul de eroare.Number Case 13 MsgBox "c: Error " & Err.Number. care are ca efect regenerarea erorii. sursa (în acest caz. care poate fi tratată aici. Iată un exemplu în acest sens: Sub c() On Error GoTo c_Err Dim intOne As Integer intOne = 123456789 intOne = "wrong" c_Exit: Exit Sub c_Err: Select Case Err. A doua linie este eroarea 13. procedura "c") şi descrierea. Codul propriu-zis este format doar din două linii. Oricum. dar orice altă eroare este transmisă înapoi pe lanţul de apeluri. deoarece cele două evenimente nu pot avea loc simultan. De asemenea. ambele fiind generatoare de erori.Description End Select Resume c_Exit End Sub Această procedură are o rutină care verifică numărul erorii. care va acuza o depăşire (overflow) . în acest exemplu aţi putea comenta faptul că se atribuie o valoare mare variabilei înainte de generarea erorii. 249 .nu este eroarea 13.

care apelează c. această rutină se găseşte în procedura a: Sub a() On Error GoTo a_Err Debug. Să facem o recapitulare a procedurilor:  a apelează b.Description Resume a_Exit End Sub Această procedură conţine o rutină de tratare a erorilor. deci transmite eroarea înapoi la a. Access va căuta înapoi în lanţul de apeluri pentru a găsi o rutină corespunzătoare.  c are propria sa rutină de tratare a erorilor. 250 .Number & ": " &_ Err.  Rutina de tratare a erorilor din a afişează pe ecran mesajul de eroare. Proprietatea Source a obiectului Err vă permite să identificaţi locul unde a fost generată eroarea.Print "In a: 2 / 0 = " & 2 / 0 a_Exit: Exit Sub a_Err: MsgBox "a (" & Err.Print "In a" Call b Debug. precum şi numărul şi descrierea acesteia. dar se ocupă doar de eroarea 13 . Pag. în exemplul nostru. Deoarece nu are o rutină proprie de tratare a eroii. care să se ocupe de celelalte erori posibile.Această procedură nu conţine decât apelul procedurii c şi generează propria sa eroare .toate celelalte sunt retrimise procedurii b. care afişează sursa erorii. Acest exemplu demonstrează că puteţi trata anumite erori local.Source & "): Error " & Err.  b nu are o rutină proprie. însă trebuie să aveţi şi o procedură generală.o depăşire.

Mulţi utilizatori au aşteptat-o încă de la Access 95. Poate că am exagerat puţin. controlul de versiune reprezintă capacitatea de a marca aplicaţiile modificate ca versiuni distincte. Să ne imaginăm o situaţie de lucru obişnuit. lucrurile au devenit mult mai simple. însă am vrut să vă daţi seama ce reprezintă controlul de versiune şi de ce vorbim despre el în prezentul capitol. Controlul de versiune Probabil vă veţi întreba ce caută o secţiune dedicată controlului de versiune într-o carte despre VBA. această facilitate este disponibilă. însă aveţi posibilitatea de a le dezactiva în etapa de depanare. În trecut. Totuşi. Dacă nu v-am convins încă. Ce faceţi cu erorile de programate? Cum separaţi o corectură de alta? Şi ce se va întâmpla dacă implementaţi o corectură. de a analiza diferenţele dintre versiunile succesive. alegeţi Options şi apoi selectaţi panoul Advanced. Pentru cei care nu ştiu. Vă veţi întreba la ce vă folosesc toate acestea. acest control este foarte important. Dacă activaţi această opţiune. însă nu au beneficiat de ea. siguranţa necesară. Access va ignora rutinele de tratare a erorilor scrise de dumneavoastră şi le va folosi întotdeauna pe cele prestabilite. 251 . în sfârşit. În astfel de cazuri. Aţi realizat o aplicaţie de baze de date care a fost bine primită de utilizatori. dar chiar acestea sunt generatoare de erori. puteţi să scrieţi rutinele de tratare a erorilor chiar la crearea aplicaţiei. introduceţi în cod rutine de tratare a erorilor. urmăriţi raţionamentul următor. Astfel. Ei bine. şi chiar de a anula modificările. trebuie să efectuaţi deseori modificări în cod: corectarea unor erori de programare. Pag. ci şi pentru programatori individuali.11. Astfel. Una dintre cele mai solicitate facilităţi pentru noua versiune de Access a fost Version Control (controlul de versiune). deschideţi meniul Tools.7 Depanarea codului de depanare Uneori. şi chiar încercări de genul "să vedem dacă merge aşa". dar apoi sunteţi nevoit să o ştergeţi? Vă puteţi aminti cu exactitate ce aţi modificat? Sunt locuri unde aceste evenimente au loc zilnic (nu numai în programare) şi se aplică nu doar pentru departamentele IT. În grupul Coding Options găsiţi opţiunea Break on All Errors (Opreşte execuţia la orice eroare). Acum. aveţi posibilitatea de a păstra un istoric al modificărilor. în afară de comentarii. Unii dintre dumneavoastră se vor întreba ce este controlul de versiune. care nu oferă. trebuie să mai parcurgeţi trei sau patru faze de lucru şi să corectaţi erorile de programare. Ca dezvoltator de aplicaţii. Sau poate că trebuie să scrieţi codul cu funcţionalitatea corect pentru fiecare fază. totuşi. în cadrul procesului de modernizare. După apariţia controlului de versiune. îmbunătăţiri. mai ales în secţiunea referitoare la depanare şi testare. nu exista nici o posibilitate de identificare a modificărilor. Cum procedaţi? Poate ar fi bine să faceţi câte o copie a bazei de date pentru fiecare fază în parte. fiecare cu un număr de versiune.

Puteţi să căutaţi cărţile pe care le are. Una dintre cele mai importante facilităţi ale programului Visual SourceSafe este că vă permite să vizualizaţi modificările care au apărut de la o versiune la alta. aveţi nevoie de produsele software Office Developer Edition Tools şi Microsoft Visual SourceSafe.txt. la rândul lor. le puteţi anula. liniile modificate şi liniile nou introduse. 252 . Visual SourceSafe evidenţiază liniile şterse. Observaţi în figura de mai sus că am găsit două fişiere modificate. Pag. sau dacă lucraţi în echipă şi doriţi să vedeţi ce modificări au efectuat colegii dumneavoastră. Visual SourceSafe Visual SourceSafe efectuează controlul de versiune pentru orice tip de fişier: fişiere Visual Basic. Pentru a putea folosi controlul de versiune. să verificaţi dacă numele dumneavoastră este scris pe ele. documentele Word şi imaginile grafice. Deci ce face Visual SourceSafe? Gândiţi-vă la acest program ca la un bibliotecar. şi nici o facilitate de care beneficiaţi gratuit. iar în cazul în care aţi efectuat modificări.  Office Developer Edition Tools vă oferă. $/ reprezintă directorul rădăcină. Puteţi vedea cine le-a căutat şi când. A fost lansat pe piaţă de câţiva ani şi este folosit în special de programatorii în Visual Basic. Panoul din dreapta afişează lista de fişiere asociate unui proiect. este un produs orientat pe proiect şi permite organizarea şi partajarea codului. printre multe alte instrumente.Haideţi să aruncăm o privire asupra noilor caracteristici de control de versiune din Access97 şi să vedem cum vă pot ajuta acestea în activitatea de programare. în figura anterioară există trei versiuni ale fişierului ReadMe. la fel ca C:\ pentru unitatea de disc. În panoul din stânga puteţi vedea o listă de proiecte. Fiecare modificare pe care o efectuaţi asupra unui fişier este adăugată ca o versiune distinctă. Acest lucru este foarte util în situaţiile în care nu vă amintiţi exact ce aţi modificat.  Visual SouceSafe este produsul care realizează efectiv controlul de versiune. Sub directorul rădăcină se află o listă de proiecte care. De exemplu. însă puteţi să le consideraţi o investiţie. Vă vor ajuta să economisiţi mult timp. fişiere binare etc. Ambele produse sunt componente suplimentare. programul de completare care conectează Access la Visual SourceSafe. În figura următoare este prezentat ecranul principal: Prima observaţie este asemănarea evidentă cu Windows Explorer. documente. ca şi controlul asupra editării. conţin subproiecte. Controlul de versiune în Access 97 Voi începe prin a spune că acest control de versiune nu este o caracteristică automată în Access. astfel încât dumneavoastră puteţi vedea ce s-a modificat. Garantat. incluzând baza de date. pe care trebuie să le cumpăraţi. numele de utilizator şi data ultimei modificări. Observaţi că aici apare cartea de faţă.

De asemenea. Pentru a anula blocarea unui fişier. apăsaţi butonul drept al mouse-ului şi selectaţi opţiunea Check Out din meniu. v-aţi dat seama că acest capitol se referă la planificare. pictograma asociată obiectului se modifică. Posibilitatea de a controla modificările reprezintă o latură importantă a dezvoltării de aplicaţii. astfel încât să construiţi un program cât mai simplu de utilizat. încât nu ne dăm Pag. Nu ar trebui să puneţi niciodată un utilizator în situaţia de a primi un mesaj de eroare care îi creează impresia că a greşit ceva. Acum puteţi edita obiectul şi. veţi introduce în baza de date o copie editabilă a obiectului. aşa încât lăsaţi puţin cartea şi mergeţi repede să cumpăraţi produsul prezentat. ajungând chiar să refuze utilizarea programului. Cu aceasta. să vă imaginaţi ce va face. deşi nu este o componentă standard.Programul de completare Access SourceSafe Componenta Visual SourceSafe pentru Access este furnizată ca un program de completare. La fel de importantă ca planificarea aplicaţiei este şi anticiparea cerinţelor şi nevoilor utilizatorului. În acest fel. deoarece poate deveni reticent faţă de software. fiecare element al acesteia este blocat. În imaginea alăturată. 253 . după ce aţi terminat. spunea: "Petrecem atâta timp lucrând cu calculatoarele. puteţi economisi mult timp. puteţi vedea cum s-a modificat pictograma. care este adăugat la meniul Tools. Detectarea şi rezolvarea problemelor software consumă multe resurse. inventatorul limbajului Visual Basic. Dacă aş fi avut la dispoziţie controlul de versiune. am pierdut trei zile căutând o greşeală de programare într-un proiect de dimensiuni mari. Alan Cooper. Odată. indicând faptul că elementul este blocat. nepermiţând nici o modificare. probabil că aş fi descoperit eroarea în câteva ore. Când adăugaţi o bază de date în Visual SourceSafe. 11. astfel încât să puteţi vedea starea în care se găseşte acesta. dar printr-un mic efort de planificare. ştiind sigur că tot ce aţi modificat se păstrează separat de orice altă modificare. puteţi folosi Visual SourceSafe pentru a introduce observaţii referitoare la versiune şi o listă de modificări. merită să o achiziţionaţi. marcaţi-l din nou. am încheiat scruta prezentare a produsului Visual SourceSafe şi a modului în care poate fi folosit în Access. Din nou.9 Rezumat Chiar dacă aţi citi printre rânduri. Încercaţi să vă puneţi în locul acestuia.

veţi îmbunătăţi cu siguranţă performanţele oricărui program pe care îl scrieţi. deşi este plăcut să umilim un calculator. Pag. Acest proces este cunoscut sub numele de optimizare şi îl vom prezenta în capitolul următor. folosind punctele de întrerupere şi elementele de urmărire  Scrierea propriilor rutine de tratare a erorilor  Controlul de versiune Prin prevenirea şi detectarea erorilor. nu ne putem permite să umilim un utilizator". 254 .seama că. Puteţi atinge nivelul de aplicaţie fără erori. În acest capitol au fost prezentate următoarele subiecte:  Modul de proiectare a aplicaţiei în scopul reducerii la minimum a numărului de erori  Tehnici orientate pe obiect care pot fi folosite pentru prevenirea erorilor  Testele pe care ar trebui să le efectuaţi pentru orice aplicaţie nouă  Tipurile de erori şi modul de corectare acestora  Depanarea codului prin execuţie pas cu pas.

Vom analiza diferite metode prin care un programator se poate asigura că aplicaţia de baze de date funcţionează cu eficienţă maximă. Totuşi.CAP: 12. Iată care sunt cele mai importante criterii de evaluare a eficienţei unei aplicaţii de baze de date:  Viteza reală de execuţie  Viteza aparentă  Amprenta de memorie (adică dimensiunea)  Traficul de reţea Aproape întotdeauna este posibil să optimizaţi o aplicaţie potrivit unuia dintre aceste criterii de evaluare a performanţelor. 255 . Dacă scopul nostru este să obţinem o eficienţă maximă. însă cum procedaţi pentru ca aplicaţia să le respecte pe toate patru? Răspunsul este simplu: nu puteţi face acest lucru şi nici nu ar trebui să încercaţi. Performance Analyzer nu vă ajută să rezolvaţi toate problemele. Pag. una dintre acestea fiind optimizarea codului VBA.OPTIMIZAREA BAZEI DE DATE Chambers 20th Century English Dictionary defineşte optimizarea ca fiind: Pregătirea sau revizuirea unui sistem sau program de calculator în vederea obţinerii eficienţei maxime. executând clic pe Tools/Analyze şi selectând opţiunea Performance) este foarte util în cazul aplicaţiilor de baze de date cu performanţe scăzute. se pune întrebarea: "Prin ce se caracterizează eficienţa?". Este o întrebare mult mi complexă decât pare la prima vedere. Vor fi prezente următoarele subiecte specifice:  Eficienţa unei secvenţe de cod  Cum se măsoară viteza unui program?  Câteva sugestii de scriere a codului pentru a crea programe mai rapide  Ce trebuie să avem în vedere când scriem aplicaţii de reţea? 12.1 Eficienţa Instrumentul Performance Analyzer (care poate fi activat din bara de meniuri.

Pe de altă parte. primul dintre ele are un timp de execuţie de patru ori mai mare decât al doilea. Dacă optimizaţi codul în privinţa vitezei. vom prezenta impactul fiecăruia din cei patru factori de optimizare menţionaţi anterior. Totuşi. în special cei fără experienţă. Aceasta va depinde de priorităţile determinate pentru fiecare aplicaţie în parte. Care dintre cei patru factori menţionaţi anterior sunt cei mai importanţi pentru implementarea cu succes a aplicaţiei? Care sunt de dorit şi care sunt lipsiţi de relevanţă? La criteriile de performanţă prezentate anterior puteţi adăuga încă patru:  Protabilitatea  Robusteţea  Mentenabilitatea  Refolosirea Nici unul dintre aceşti factori nu conduc neapărat la creşterea eficienţei aplicaţiei . să opteze pentru primul exemplu.Una dintre sarcinile pe care le aveţi de rezolvat când începeţi un proiect de dezvoltare este să stabiliţi o listă de priorităţi. aceşti opt factori acţionează în direcţii diferite.optimizarea unei secvenţe de cod potrivit criteriilor de portabilitate sau robusteţe va determina micşorarea vitezei de execuţie a programului sau un consum mai mare de memorie. De fapt.2 Reducerea supraîncărcării memoriei Pag. În capitolul de faţă. ambele secvenţe de cod sunt executate într-o fracţiune de secundă). 12. ar trebui să alegeţi o a doua variantă. 256 . alegeţi această variantă (în special dacă. pe un calculator obişnuit. Să considerăm următoarele secvenţe de cod: If (bool1 = True And bool2 = True) Or (bool1 = False And_ bool2 = False) Then boolResult = False Else boolResult = True End If Sau: boolResult = (bool1 Xor bool2) Ambele exemple conduc la acelaşi rezultat. nu veţi afla metoda optimă de scriere a unui program. Dacă optimizaţi mentenabilitatea. În schimb. s-ar putea ca mulţi programatori.

 Nu încărcaţi în memorie module / biblioteci care nu sunt necesare.ceea ce depăşeşte cu mult capacitatea calculatoarelor mainframe . limbajul folosit de obicei era limbajul de asamblare sau codul maşină (aproape ilizibil pentru un nespecialist). În acest spaţiu de memorie este executat codul aplicaţiei dumneavoastră. iar rezultatele obţinute constituiau o dovadă de ingeniozitate şi de perseverenţă. scrierea unei aplicaţii cu o amprentă mică de memorie constituie în continuare o prioritate esenţială în programare. Dacă un program este prea lent. 257 . ar trebui să ţineţi cont de următoarele recomandări:  Alegeţi corect tipurile de date.  Eliminaţi comentariile şi secvenţele de cod inutile. Oricum. aceasta reprezintă de aproximativ 2000 de ori mai puţin decât memoria calculatorului pe care îl folosesc eu pentru a scrie acest capitol. programul este mai rapid şi permite execuţia simultană a altor programe. În plus. la dezvoltarea unei aplicaţii. mai multă memorie înseamnă performanţe mai bune. aceste probleme au dispărut. Cu cât calculatorul are mai multă memorie. Cu alte cuvinte. Cu cât consumă mai puţină memorie. Pag. Ca urmare.  Salvaţi baza de date ca fişier MDE. Memoria. Pentru a face o comparaţie. Ca regulă generală. calculatoarele erau limitate la 32 sau 64 kiloocteţi de memorie. pentru majoritatea proiectelor.  Grupaţi procedurile pe module. având la dispoziţie o cantitate de memorie limitată. chiar dacă nu aţi fi avut un sistem de operare sau un program capabil să folosească 96 M de RAM . nu aveţi decât să adăugaţi 16 M de RAM pe calculator! Preţurile sunt modice. dacă scrieţi o aplicaţie care va fi folosită de o mie de utilizatori. ca urmare. cu atât scade frecvenţa de citire şi de scriere pe disc (procese relativ lente) şi.  Eliberaţi memoria ori de câte ori este posibil. Sintagma la modă era "programare disciplinată". În trecut. ar costa mult mai mult să rescrieţi codul programului astfel încât acest să ruleze pe un calculator cu 12 M de memorie la fel de rapid ca vechea versiune pe un calculator cu 24 M de memorie! Nu am amintit toate acestea pentru a vă încuraja să construiţi aplicaţii dezordonate. deşi relativ ieftină. între 16 şi 64 M de memorie (RAM). este preţioasă. nu este surprinzător faptul că.costul memoriei ar fi reprezentat o avere.Un calculator desktop modern care rulează Access 97 are. programatorii consumau foarte mult timp pentru a face ca aplicaţiile să încapă (şi să lucreze) pe minusculele resurse ale calculatoarelor lor. de obicei. În acele timpuri. fiecare megaoctet suplimentar de memorie necesar aplicaţiei echivalează cu 1000 M de memorie pe toate calculatoarele pe care va rula programul. programul are o viteză mai mare de execuţie. Astăzi. De aceea.

203.477.337.923E28 până la 7.2.403E38 până la -1. optimizarea este o chestiune de compromis .647 Single (Simple) 4 octeţi -3. 9) As Integer Pag.5807 14 octeţi -7.798E308 până la -4.147. 9) As Double ocupă aproximativ 800 de octeţi de memorie.147.685. 10 până la Decembrie 31. 4.798E308 Tipul de date Currency (Monetare) Decimal (Zecimale) Date (Date calendaristice) Object (Obiect) Fixed string (Şir de lungime fixă) Variable Length String (Şir de lungime variabilă) Variant (Numeric) Variant (Şir) Dimensiunea de Domeniul de valori stocare 8 octeţi -922. în timp ce linia următoare ocupă în jur de 200 de octeţi: ReDim aint (9.401E-45.483.variabilele duble şi simple pot păstra valori dintr-un domeniu mult mai mare decât variabilele întregi.685. 0.400 caractere fiecare caracter 10 octeţi + Până la aproximativ 2 miliarde de lungimea şirului caractere 16 octeţi Acelaşi domeniu ca pentru variabilele de tip Double 22 octeţi + Acelaşi domeniu ca pentru şirurile de lungimea şirului lungime variabilă Aşa cum puteţi vedea.767 Long (Lungi) 4 octeţi -2.5808 la 922.648 până la 2. Linia de cod: ReDim adb1 (9. şi aici. 1. Problema utilizării memoriei devine şi mai importantă când se lucrează cu matrice.941E-324 până la 1.337. 258 . 0.403E38 Double (Duble) 8 octeţi -1.923E28 (variază în funcţie de numărul de zecimale din număr) 8 octeţi Ianuarie 1. 9999 4 octeţi O referinţă la orice tip de obiect 1 octet pentru Până la aproximativ 65. variabilele de tip Double ocupă de patru ori mai multă memorie decât variabilele de tip întreg.203.768 până la 32.477.941E-324.12.1 Alegerea corectă a tipurilor de date Diverse tipuri de date ocupă spaţii diferite de memorie. Dimensiunile spaţiului de memorie ocupat de fiecare tip de date sunt prezentate în tabelul următor: Tipul de date Dimensiunea de Domeniul de valori stocare Byte (Octet) 1 octet 0 până la 255 Boolean 2 octeţi True sau False Integer (Întregi) 2 octeţi -32.401E-45 până la 3. Însă.483.

ar trebui să selectaţi opţiunea Require Variable Declaration din caseta de dialog Tools/Option… Am mai spus acest lucru .alegeţi cele mai mici variabile care pot memora valorile respective. Fişierele MDE vor fi prezentate în Capitolul 18.Ca regulă generală. nu justificaţi lipsa comentariilor din cod prin argumentul: "Nu este suficientă memorie" atunci când adevăratul motiv este că nu aveţi chef să le introduceţi. şi comentariile au preţul lor. Inserarea comentariilor în momentul scrierii codului nu necesită prea mult timp. Fiecare comentariu inserat în cod este încărcat în memorie împreună cu procedura la care se referă.3 Eliminarea comentariilor şi secvenţelor de cod inutile Aşa cum am arătat. vă veţi da seama că programul este plin de proceduri inutile sau de proceduri pe care le-aţi păstrat pentru orice eventualitate. Pentru a nu uita să atribuiţi explicit tipuri de variabile. Ştergeţi şi aceste porţiuni de cod din versiunea de aplicaţie care va fi distribuită clienţilor.2 Gruparea procedurilor în module VBA încarcă modulele numai când este apelată o procedură din modulul respectiv.dar merită să îl repetăm . şi o versiune comentată. cu care puteţi lucra atunci când sunteţi nevoit să modificaţi ceva în aplicaţie.şi de obicei este . Acest proces asigură eliminarea tuturor comentariilor din cod şi compilarea automată a acestuia. Pentru a evita supraîncărcarea memoriei de către aplicaţia dumneavoastră. în memorie vor fi încărcate toate cele trei module. dacă dimensiunea amprentei de memorie este o prioritate de programare .folosiţi cu prudenţă tipul de date Variant. Prin gruparea judicioasă a procedurilor cu funţii înrudite în acelaşi modul. Pag. 12. sau aşa-numitul "cod mort". puteţi lua în considerare şi varianta copierii fişierului cu baza de date originală şi eliminării tuturor comentariilor din copia destinată clienţilor. comentarea liniilor de cod ajută la înţelegerea acestuia de către alte persoane. în cazul depanării). Acest procedeu se numeşte încărcare la cerere. uneori. veţi obţine o versiune de dimensiuni reduse pe care o puteţi folosi şi distribui utilizatorilor. Procesul de dezvoltare a aplicaţiilor presupune o mulţime de experimente şi. s-ar putea ca peste şase luni să nu vă mai amintiţi rolul fiecăreia. dacă aveţi o rutină care apelează trei proceduri acestea se găsesc în module separate. 259 . O soluţie şi mai bună o constituie salvarea bazei de date în format MDE. Chiar dacă înţelegeţi instrucţiunile în momentul în care le scrieţi. Rin urmare.2.2. 12. Astfel. Desigur. În plus. puteţi reduce la minimum numărul de module încărcate simultan în memorie. Lăsaţi lenea la o parte! Acelaşi principiu se aplică şi în cazul procedurilor nefolosite. Oricum. însă vă poate scuti de un efort mult mai mare în viitor (de exemplu. este bine să comentaţi codul pe care îl scrieţi.

Aceste biblioteci pot fi folosite şi pentru a păstra aplicaţii wizard şi programe de completare. Puteţi elibera şi memoria folosită de variabilele obiect de care nu mai aveţi nevoie. Pag.2. pentru a reduce cantitatea de memorie necesară instalării aplicaţiei. instrucţiunile inutile etc. Referinţa respectivă a împiedicat distrugerea primului formular înainte de închiderea celui de-al doilea şi de ieşirea colecţiei din domeniu. le reiniţializează. Eliberarea memoriei ori de câte ori este posibil Pentru a elibera memoria folosită de o matrice dinamică.5 Nu încărcaţi în memorie module / biblioteci care nu sunt necesare Vom vedea în capitolul următor că bazele de date biblioteci pot reprezenta o soluţie utilă pentru stocarea şi refolosirea procedurilor de care aveţi nevoie frecvent. Unul dintre acestea constă în conversia bazei de date într-un fişier MDE. Fiecare dintre aceste baze de date biblioteci trebuie să fie încărcată în memorie atunci când este folosită. Ca urmare. ceea ce măreşte substanţial spaţiul necesar de memorie. se compilează toate modulele din baza de date şi se elimină comentariile.12. Instrucţiunea Erase nu eliberează spaţiul folosit de matricele statice (cum sunt cele de dimensiune fixă). numită Nothing. Această operaţie se realizează prin configurarea tuturor variabilelor la o valoarea specială. Reţineţi faptul că nu puteţi modifica formatul fişierelor MDE şi că este bine să păstraţi întotdeauna o versiune originală a bazei de date în format MDB. 12.4. din codul sursă. În schimb. cum ar fi aplicaţiile wizard de control şi de proiectare a formularului. am folosit această proprietate pentru a împiedica distrugerea unei instanţe a unui formular pop-up. 12. ar trebui să nu încărcaţi bazele de date biblioteci sau programele de completare care nu sunt absolut necesare. Rezultă două avantaje majore: creşte siguranţa bazei de date şi scade cantitatea de memorie necesară pentru rularea aplicaţiei.2. Într-un exemplu din capitolul precedent. care sunt distribuite împreună cu produsul Access.6 Salvarea bazei de date ca fişier MDE Către sfârşitul cursului. puteţi folosi instrucţiunea Erase. După terminarea lucrului cu matricea. vom analiza ultimele retuşuri pe care ar trebui să le efectuaţi asupra aplicaţiei înainte de a o distribui utilizatorilor finali ai bazei de date. 260 . Prin operaţia de conversie. Set objExcel = Nothing Reţineţi că memoria folosită de un obiect nu poate fi eliberată dacă mai există o referinţă la obiectul respectiv în cod. instrucţiunea Erase va elimina datele din matrice şi va elibera memoria folosită de aceasta. prin plasarea unei referinţe la acesta în colecţia declarată la nivelul modulului unui alt formular.2.

vă veţi da seama că merită să cheltuiţi nişte bani pentru a suplimenta memoria cu 8 M de RAM (în ambele cazuri). limita inferioară de memorie este de 16 M pentru rularea independentă sub Windows 95 şi de 24 M pentru Windows NT. 12.2. Dacă lucraţi într-o reţea sau dacă folosiţi şi alte aplicaţii Windows simultan. 24 M şi 32 M şi pot să afirm că pentru a obţine performanţe acceptabile. şi nu proprietăţi  Evitaţi structurile lente  Folosiţi funcţii şir  Evitaţi instrucţiunea IIf  Folosiţi operaţii aritmetice cu întregi ori de câte ori este posibil  Folosiţi cod in-line     Folosii judicios instrucţiunea DoEvents Folosiţi cicluri For Each… Folosiţi metoda Requery.12.7 O ultimă recomandare . nu acţiunea Requery Folosiţi cuvântul cheie Me  Creaţi formularele pe baza unor interogări salvate Pag. atât a aplicaţiei dumneavoastră.3 Creşterea vitezei de execuţie Reducerea cantităţii de memorie ocupată de baza de date Access şi codul acesteia poate avea ca rezultat creşterea vitezei de lucru. există şi alte metode pe care puteţi să le luaţi în considerare:  Folosiţi constante  Folosiţi tipuri specifice de obiecte (asociere iniţială)  Folosiţi tranzacţii acolo unde este cazul  Folosiţi variabile. Access 97 are nevoie de minimum 12 M de RAM într-un sistem Windows 95 şi de 16 M de RAM pe o staţie de lucru Windows NT. 16 M. cât şi a altor aplicaţii Windows.cumpăraţi mai multă memorie Nu este nici o păcăleală! Pentru a rula. Am făcut experimente pe sisteme cu 12 M. 261 . Dacă viteza de execuţie este o prioritate de programare.

diferenţa devine evidentă.. De exemplu. s-ar putea să vă întrebaţi dacă are rost să vă pierdeţi vremea pentru a implementa unele dintre aceste îmbunătăţiri. sau să parcurgeţi ciclic toate înregistrările dintr-un set de înregistrări.astfel.Next. există mai multe opţiuni disponibile. de ce v-aţi strădui să optimizaţi codul pentru ca durata operaţiei respective să se reducă la o milisecundă? Cine va observa acest lucru? Ei bine. Nu mă credeţi pe cuvânt.000 de valori. Calculatoarele diferă foarte mult în privinţa dimensiunii memoriei RAM. în cazul executării repetate a codului.1 Cronometrarea execuţiei codului Pentru a testa viteza de execuţie a unei secvenţe de cod. O metodă foarte simplă este folosirea funcţiei Timer. Analizând rezultatele de mai jos.3. parcurgeţi singur toate aceste exemple. Exemplele de cod vă vor ajuta să evaluaţi impactul acestor tehnici de lucru (asupra performanţei). deşi s-ar putea ca diferenţa să nu fie sesizabilă pentru o singură linie de cod.pentru 32.. veţi putea depăşi fără nici o problemă şi situaţiile în care acest aspect este cu adevărat important. a vitezei discului etc. Creşteţi viteza operaţiilor cu baza de date Vom analiza în detaliu aceste procedee şi vom prezenta câteva secvenţe de cod demonstrative. trebuie să spunem că.. Option Compare Database Option Explicit Dim lngStart As Long Dim lngEnd As Long Sub ShowTime() MsgBox lngEnd . a dimensiunii memoriei cache. 12. Dacă o operaţie nu durează decât trei milisecunde. să presupunem că parcurgeţi ciclic toate controalele unui formular pentru verificarea unei anumite condiţii. am putea utiliza secvenţa următoare de cod pentru a afla cât durează parcurgerea unei structuri ciclice For.lngStart & " secunde" End Sub Function UseTimer() Dim i As Integer lngStart = Timer For i = 0 to 32000 Next i lngEnd = Timer ShowTime End Function Pag. Obişnuiţi-vă să scrieţi întotdeauna un cod eficient . 262 . Aceste diferenţe se reflectă în performanţele codului VBA rulat pe fiecare maşină în parte. a vitezei procesorului. De exemplu..

am salvat valoarea funcţiei Timer în variabila lngEnd: lngEnd = Timer Prin scăderea primei valori din a doua. următoarea casetă de mesaj la rularea codului. Deoarece funcţia Timer face rotunjirea la nivel de secundă.12.lndStart & " secunde" În cazul în care încercaţi singur acest exemplu. pe ecran va apărea.Funcţia Timer returnează numărul de secunde care s-au scurs de la miezul nopţii (de la ora 0).1 Pag. probabil. Fig. am salvat valoarea funcţiei Timer în variabila lngStart înainte de începerea ciclului de instrucţiuni: lngStart = Timer După terminarea ciclului. 263 . veţi observa repede o limitare evidentă. În exemplul de mai sus. putem determina durata procesului de ciclare: MsgBox lngEnd .

Biblioteca winmm. În plus. Următorul exemplu de convenţii de denumire vă arată cum puteţi declara şi folosi funcţia pentru a determina durata de execuţie a aceluiaşi cod: Option Compare Database Option Explicit Declare Function TimeIt Lib "winmm. Am văzut această funcţie la lucru în capitolul dedicat tehnicilor de programare avansată. Funcţia returnează o valoare cu precizia de o milisecundă (1/1000 dintr-o secundă). Fig.lngStart) & " milisecunde" Dim i As Integer lngStart = TimeIt For i = 0 to 32000 Next i lngEnd = TimeIt ShowTime Pag. este uşor de implementat.2 O altă soluţie este să apelaţi pentru cronometrare o funcţie API. fiind mult mai adecvată pentru cronometrarea execuţiei unei secvenţe de cod.12. 264 .Deci exemplul nu este relevant dacă testaţi un cod a cărui execuţie durează mai puţin de o secundă! . Adăugaţi încă trei de zero la 32000 si să rulăm codul . care returnează numărul de milisecunde trecute de la pornirea sistemului Windows.dll conţine o funcţie numită timeGetTime.dll" Alias "timeGetTime" ()_ As Long Dim lngStart As Long Dim lngEnd As Long Sub ShowTime() End Sub Function UseTimeIt() MsgBox (lngEnd .

8 0. Astfel.3.0007 100000 50.0005 12. Când întâlneşte o variabilă într-o linie de cod VBA. 12. ceea ce permite apelarea acesteia direct din Access ca funcţie TimeIt: Declare Function TimeIt Lib "winmm. valoarea unei constate este determinată şi trecută în cod în etapa de compilare. 265 .3. Pe de altă parte.2 Folosirea constante Dacă folosiţi în cod valori care nu se modifică.3 Folosiţi tipuri specifice de obiecte (asociere iniţială) În versiunile anterioare de Access. puteaţi întâlni frecvent linii de cod ca acestea: Dim frm As Object Set frm = Forms!frmSwtchboard Deşi codul poate fi executat.dll" Alias "timeGetTime" ()_ As Long De data aceasta. Aceasta înseamnă că ori de câte ori încercăm să inspectăm sau să configurăm valoarea unei proprietăţi. Datorită faptului că variabila obiect frm a fost declarată As Object. rezultatul va fi ceva mai clar: 20 miliseconds. Access nu ştie cu ce tip de obiect are de-a face. ar trebui să le atribuiţi unor constante. Această tehnică este cunoscută sub numele de asociere ulterioară. nu este eficient. ori să apelăm în timpul execuţiei o metodă a acelui obiect. Access trebuie să acceseze locaţia de memorie care conţine variabila pentru a determina valoarea acesteia. nu unor variabile.0 0. O metodă mai bună de scriere a acestui cod este: Pag. Access trebuie să verifice mai întâi dacă proprietatea sau metoda respectivă corespund obiectului.End Function Modificarea semnificativă este adăugarea declaraţiei funcţiei timeGetTime. citirea valorilor din constante durează mult mai puţin decât a celor din variabile: Procedura VarsAndConstants (Partea 1) VarsAndConstants (Partea 2) Comentarii Utilizând variabile locale Utilizând constante locale Număr de Rezultate (ms) iteraţii Total Pe iteraţie 100000 67.

Dim frm As Form_frmSwitchboard Set frm = Forms!frmSwitchboard De data aceasta, Access ştie ce tip de obiect este frm. Ca urmare, poate determina încă din etapa de compilare ce proprietăţi şi metode corespund obiectului. Această tehnică este numită asociere iniţială. Deoarece Access trebuie să facă verificarea o singură dată, înainte de rulare, diferenţa dintre vitezele de execuţie ale secvenţelor de cod prin cele două metode poate fi semnificativă. Un alt avantaj al tehnicii de asociere iniţială este faptul că Access poate determina încă din faza de compilare ce proprietăţi şi metode corespund obiectului. Orice eroare cauzată de scrierea greşită a unor nume de proprietăţi sau metode este detectată în etapa de compilare şi nu apare ca eroare de execuţie.

Procedura SpecificObjects (Partea 1) SpecificObjects (Partea 2)

Comentarii Utilizând sintaxa As Object Utilizând variabile obiect specifice

Număr de Rezultate (ms) iteraţii Total Pe iteraţie 100000 35796,5 0,3580 100000 7507,1 0,0751

12.3.4 Folosiţi variabile, nu proprietăţi Puteţi obţine performanţe similare folosind variabile pentru a face referire la formulare, controale şi proprietăţi. Dacă urmează să includeţi într-o procedură mai multe referinţe la un formular, raport sau control, este indicat să creaţi pentru obiectul respectiv o variabilă obiect şi apoi să faceţi referire la variabilă, şi nu la obiectul propriu-zis.
Dim frm As Form_frmSwitchboard Dim ctl As Image Set frm = Forms!frmSwitchboard Set ctl = frm!imgLogo sTemp1 = ctl.Picture sTemp2 = ctl.PictureAlignment sTemp3 = ctl.SizeMode With ctl Se poate folosi şi sTemp1 = .Picture structura With. sTemp2 = .PictureAlignment sTemp3 = .SizeMode End With

Pag. 266

Codul scris cu una din cele două sintaxe prezentate mai sus va fi rulat mult mai repede decât codul care foloseşte sintaxa lungă.
sTemp1 = Forms!frmSwitchboard!imgLogo.Picture sTemp2 = Forms!frmSwitchboard!imgLogo.PictureAlignment sTemp3 = Forms!frmSwitchboard!imgLogo.SizeMode

În această situaţie, sintaxa With…End With este rulată mai încet decât prima metodă, care foloseşte variabile obiect. Aceasta se datorează supraîncărcării pe care o presupune configurarea structurii With. Totuşi, dacă veţi adăuga între instrucţiunile With şi End With din ce în ce mai multe referinţe la obiectul specificat, această structură poate deveni mai eficientă. 12.3.5 Folosiţi funcţii şir Utilizarea funcţiilor şir este un alt domeniu în care se poate manifesta imprecizia. Majoritatea funcţiilor şir au versiuni de tip Variant. De exemplu, funcţia Format returnează pentru un anumit format o valoare Variant. varTemp = Format ("abcdef", ">") Pe de altă parte, funcţia Format$ returnează un şir formatat. strTemp = Format$ ("abcdef", ">") De fapt, orice funcţie care are ca sufix caracterul $ returnează o valoare String. Dacă formataţi o variabilă sau un grup de caractere ce vor fi atribuite unei variabile şir, veţi obţine rezultate mai bune folosind versiunea şir a funcţiei (în loc de versiunea Variant). Procedura StringFunctions (Partea 1) StringFunctions (Partea 2) Comentarii Utilizând funcţia Format Utilizând funcţia Format$ Număr de Rezultate (ms) iteraţii Total Pe iteraţie 100000 7141,3 0,0714 100000 6749,9 0,0675

Pag. 267

12.3.6 Evitaţi folosirea structurilor lente O altă modalitate de a mări viteza de execuţie a codului VBA este evitarea structurilor lente. Ce înseamnă aceasta? Majoritatea limbajelor oferă programatorului mai multe metode de a efectua o anumită operaţie. Dacă viteza reală de execuţie este o prioritate de programare, ar trebui să testaţi viteza obţinută prin aplicarea fiecăreia dintre aceste metode şi să o alegeţi pe cea corespunzătoare (adică pe cea mai rapidă). În practică s-ar putea să vă daţi seama că metoda cea mai rapidă intră în conflict cu o altă prioritate de programare, aşa încât trebuie să recurgeţi la un compromis. Chiar şi într-o astfel de situaţie, cronometrarea secvenţelor de cod este utilă, pentru că veţi putea folosi informaţiile obţinute în proiectele viitoare. 12.3.7 Funcţia Immediate If (IIf) Funcţia Immediate If (IIf) este considerată, de obicei, o metodă rapidă şi simplă de a returna una din două valori, ca urmare a evaluării unei expresii ca adevărată sau falsă. value = IIf (Expression, TruePart, FalsePart) Dacă Expression are valoarea True, se returnează TruePart, iar dacă Expression este False, se returnează FalsePart. Instrucţiunea este echivalentă cu secvenţa de cod următoare: If Expression Then value = TruePart Else value = FalsePart End If Principala diferenţă între cele două formate este că funcţia IIf va evalua întotdeauna atât TruePart, cât şi FalsePart, în timp ce structura If normală va evalua doar partea care este returnată. Pentru a vedea ce implicaţii au aceste metode, să luăm în considerare următoarele secvenţe de cod:
If lngNumber = 5 Then lngRetVal = 10 Else lngRetVal = Dlast("OrderID", "Order", "OrderDate < #01-01-96#") End If

Pag. 268

Si:
lngRetVal = IIf (lngNumber = 5, 10, _ DLast ("OrderID", "Order", "OrderDate < #01-01-96#"))

Ambele proceduri fac acelaşi lucru: evaluează variabila lngNumber. Dacă aceasta are valoare 5, procedura atribuie variabilei lngRetVal valoarea 10. Altfel, procedura atribuie variabilei lngRetVal o valoare căutată în tabelul Order. Deosebirea dintre proceduri este că a doua va căuta întotdeauna înregistrarea din tabelul Order, indiferent dacă este necesară sau nu. Prin urmare, dacă cele două proceduri sunt apelate cu argumentul lngNumber egal cu 5, a doua va fi considerabil mai lentă. Procedura IfAndIIf (Partea 1) IfAndIIf (Partea 2) IfAndIIf (Partea 1) IfAndIIf (Partea 2) Comentarii IIf, unde lngNumber = 5 If, unde lngNumber = 5 IIf, unde lngNumber = 10 If, unde lngNumber = 10 Număr de Rezultate (ms) iteraţii Total Pe iteraţie 100 4918,5 49,185 100 100 100 1,0 4634,3 4596,4 0,01 46,343 45,9638

12.3.8.Folosiţi operaţii aritmetice cu întregi ori de câte ori este posibil Viteza cu care se efectuează operaţiile aritmetice depinde de tipul de date al variabilelor folosite în calcul şi de tipul operaţiei efectuate. În general, calculele cu variabile Integer şi Long sunt mai rapide decât cele cu variabile Single şi Double. Acestea, la rândul lor, sunt mai rapide decât calculele cu variabile Currency. Majoritatea operaţiilor cu variabile de tip Variant durează de două ori mai mult decât cele în care sunt folosite alte tipuri de variabile. Cu toate că timpii de execuţie pentru o singură operaţie diferă foarte puţin, în cazul operaţiilor repetitive (cum ar fi în ciclurile de mari dimensiuni), diferenţa devine semnificativă. 12.3.9 Folosiţi cod in-line Ceva mai devreme, am arătat că variabilele pot fi transmise ca argumente în proceduri fie prin referinţă, fie prin valoare. Când o variabilă este transmisă prin referinţă (cazul implicit), procedura apelată transferă un pointer către locaţia de
Pag. 269

memorie a variabilei transmise. În schimb, când o variabilă este transmisă prin valoare, se face o copie a variabilei şi aceasta este transmisă procedurii. Deşi transferul variabilelor prin valoare are câteva avantaje, este mai lent decât transferul prin referinţă. Oricum, ambele metode sunt mai lente decât plasarea secvenţei de cod corespunzătoare in-line şi renunţarea la apelul unei proceduri. Dezavantajul principal al folosirii codului in-line este dificultatea de întreţinere în cazul în care aceeaşi secvenţă de cod apare in-line în mai multe proceduri. Însă dacă principala prioritate de programare este viteza de execuţie, ar trebui ca utilizarea codului in-line să constituie o opţiune serioasă.

12.3.10 Folosiţi structura For Each… Visual Basic include o structură de ciclare numită For Each…Next…, care permite parcurgerea succesivă a tuturor elementelor unei matrice sau unei colecţii de date.
For Each qdf In CurrentDb.QueryDefs sTemp = qdf.SQL qdf.Close Next

Înainte de introducerea limbajului VBA, metoda standard folosită în practică consta în determinarea numărului de elemente din colecţie sau matrice şi utilizarea structurii For…Next… pentru a inspecta fiecare element cu ajutorul unui contor de ciclare pe post de index al colecţiei.
For iCounter = 0 To CurrentDb.QueryDefs.Count - 1 Set qdf = Current.Db.QueryDefs(iCounter) sTemp = qdf.SQL qdf.Close Next

Ori de câte ori este posibil, folosiţi prima structură. Un ciclu For Each… Next… este mult mai rapid decât un ciclu obişnuit care foloseşte un contor de ciclare ca index al colecţiei sau al matricei.

Pag. 270

fiţi ceva mai rezervat. oprirea temporară sau chiar efectuarea unei alte operaţii. Nu este prea plăcut ca rutina respectivă să ignore toate solicitările dumneavoastră. acaparând toate resursele Access. Aveţi nevoie de o modalitate de a permite şi procesarea altor evenimente în timpul execuţiei rutinei.3 59. această metodă consumă mult timp. 271 .8 secunde.8 23. sistemul Windows preia controlul execuţiei şi verifică dacă în alte aplicaţii există mesaje sau apăsări de taste care aşteaptă să fie procesate. După tratarea acestora.Procedura For Each (Partea 2) For Each (Partea 1) Comentarii Utilizând o structură ciclică tradiţională Utilizând structura For… Each Număr de iteraţii 10 10 Rezultate (ms) Total Pe iteraţie 592. De exemplu. For lngCounter = 1 to 1000000 i = Rnd*12 Next lngCounter Pe calculatorul meu. execuţia acestei rutine durează aproximativ 2. durata de execuţie a rutinei depăşeşte 55 de minute! Dacă doriţi să folosiţi instrucţiunea DoEvents.3. o procedură VBA aflată în execuţie acţionează foarte egoist.7750 12. Secvenţa anterioară de cod poate fi rescrisă astfel: Pag. De exemplu. sar putea ca în timpul execuţiei acestei rutine să doriţi anularea ei. For lngCounter = 1 to 1000000 i = Rnd*12 DoEvents Next lngCounter Cu toate că este folositoare în programare. Acest lucru este posibil prin utilizarea instrucţiunii DoEvents.11 Folosiţi judicios instrucţiunea DoEvents Dacă nu schimbaţi condiţiile implicite de lucru. vă veţi da seama rapid că Access este blocat până la terminarea execuţiei codului. Este bine să treceţi controlul sistemului Windows cât mai des posibil. ori de câte ori ciclul ajunge la instrucţiunea DoEvents. sistemul de operare transferă din nou controlul procedurii. În condiţiile în care se face o verificare a evenimentelor la fiecare parcurgere a ciclului.2250 237. dacă rulaţi următoarea secvenţă de cod. În secvenţa următoare de cod. Aceasta cere sistemului Windows să trateze toate mesajele sau apăsările de taste care se găsesc în coada de aşteptare.

În tabelul următor sunt prezentate rezultatele obţinute rulând cele trei variante de cod pe un calculator din clasa Pentium.000 de cicluri. Instrucţiunea DoEvents adaugă doar 1. DoCmd Requery ctlText. însă nu uitaţi că efectuarea testului cu câte o instrucţiune DoEvents la fiecare iteraţie va fi foarte lentă. a metodei Requery. nu acţiunea Requery O altă metodă de accelerare a execuţiei procedurilor este evitarea utilizării acţiunii Requery pentru afişarea unor valori actualizate într-un formular sau control şi folosirea. Windows preia controlul la fiecare 50.0 3348986.Requery 'Aceasta instructiune este lenta 'Aceasta instructiune este mult ‘mai rapida Pag.0 0.0279 100000 100000 4127. redeschiderea acestuia şi apoi repetarea execuţiei). 272 . dar şi o viteză de execuţie destul de mare. Aceasta este mai rapidă. Aceasta înseamnă un comportament corespunzător al rutinei.3.For lngCounter = 1 to 1000000 i = Rnd*12 If lngCounter Mod 50000 = 0 Then DoEvents Next lngCounter În acest caz. deoarece nu efectuează decât o simplă repetare a execuţiei interogării pe care se bazează formularul sau controlul respectiv (deci nu reface setul de operaţii pe care le presupune acţiunea Requery .34 secunde la timpul de execuţie al secvenţei de cod.închiderea formularului. Procedura DoEventsTest (Partea 1) DoEventsTest (Partea 2) DoEventsTest (Partea 3) Comentarii Fără DoEvents 20 de apeluri DoEvents 100000 de apeluri DoEvents Număr de Rezultate (ms) iteraţii Total Pe iteraţie 100000 2785. Le puteţi testa şi dumneavoastră cu ajutorul procedurii DoEventsTest din baza de date Whisky14.0 0.13 secunde (durata de execuţie a rutinei).Name ctlText.4899 12. adică de 20 de ori în 4.mdb de pe CD-ul ataşat cărţii.12 Folosiţi metoda Requery.0413 33. în schimb.

3. 273 lngRetVal = rec(0) rec. pe baza setului de chei existent. Motivule este foarte simplu. _ dbOpenDynaset) rec.13 Folosiţi cuvântul cheie Me În cazul în care folosiţi cuvântul cheie Me pentru a face referire la un formular în procedura unui eveniment. vom analiza câteva modalităţi prin care puteţi îmbunătăţi interacţiunea codului VBA cu baza de date. Aceasta înseamnă că formularul va fi găsit mult mai repede decât în cazul specificării sale printr-o referinţă completă.4. optimizarea apelurilor bazei de date conduce aproape întotdeauna la îmbunătăţirea performanţelor. fără cheie. 12.Close . astfel că o creştere cu 10% a performanţelor va fi mult mai uşor vizibilă în cazul apelului bazei de date. În continuare. de obicei.BackColor = QBColor(9) 'Aceasta instructiune este lenta 'Aceasta instructiune este mai ’rapida 12. sau a setului de valori cheie. uneori. Access caută formularul respectiv în spaţiul de nume local. într-un timp mai lung decât instrucţiunile VBA normale. Metoda Requery extrage din memorie valorile actualizate.4 Creşterea vitezei de execuţie a operaţiilor cu baza de date Dacă optimizările pe care le realizaţi prin modificarea sintaxei instrucţiunilor VBA sunt uneori insesizabile.OpenRecordset _ ("SELECT OrderID FROM [Order] WHERE OrderDate < #1/1/96#". Cu toate că adăugarea indexurilor încetineşte actualizările şi măreşte riscul apariţiei conflictelor de blocare. 12. acţiunea Requery reface setul de chei şi apoi extrage din memorie valorile fără cheie.Trebuie să ştiţi că. Puteţi sesiza aceste avantaje rulând procedura UsingIndexes. Forms!frmFoo.1 Folosiţi indexuri Adăugarea unui index la un câmp reprezintă o metodă de îmbunătăţire a performanţelor de căutare în câmpul respectiv. Procedura deschide de două ori un set de înregistrări prin următoarea secvenţă de cod: Set rec = CurrentDb. această supraîncărcare este de obicei compensată de performanţele obţinute la căutarea frecventă în câmpurile respective în cadrul interogărilor.MoveLast Pag. în setul de înregistrări al formularului. metoda Requery şi acţiunea Requery pot genera rezultate diferite.BackColor = QBColor(9) Me. În schimb. Apelurile bazei de date sunt executate.

5300 100 2163.0 46. 274 . şi nu ca şiruri. puteţi testa rutina personal. pentru că sunt deja compilate. Semnele de carte (Bookmark) sunt stocate ca matrice de octeţi şi ar trebui să fie salvate în acest format. 12. Folosiţi semne de carte La deschiderea unui set de înregistrări. a doua oară.6300 12.3. Atribuind proprietăţii Bookmark a obiectului Recordset valoarea pe care aţi salvat-o în variabilă. Procedura UsingIndexes (Partea 1) UsingIndexes (Partea 2) Comentarii OrderDate nu este indexat OrderDate este indexat Număr de Rezultate (ms) iteraţii Total Pe iteraţie 100 4653.4.4.0 21. este indexat. Folosiţi ca sursă pentru formulare interogări salvate Interogările salvate sunt rulate mult mai rapid decât cele create dinamic cu ajutorul instrucţiunilor SQL. este posibil ca prin compararea valorii Bookmark a unei înregistrări cu o valoare Bookmark memorată de o variabilă şir să nu obţineţi rezultate corecte (cu excepţia cazului în care are loc o comparare binară). fiecărei înregistrări îi este atribuită automat o proprietate Bookmark (semn de carte). un formular care Pag.La prima deschidere a setului de înregistrări. este bine să salvaţi într-o variabilă semenul de carte (Bookmark) corespunzător înregistrării respective. veţi putea reveni la înregistrare mult mai rapid decât prin metodele Find sau Seek. Dacă aţi deschis un set de înregistrări şi ştiţi că veţi reveni la înregistrarea curentă. câmpul OrderDate nu este indexat. De aceea.2. Tabelul următor prezintă timpii de execuţie pentru această funcţie. însă dacă doriţi. Cu toate că puteţi salva proprietatea Bookmark într-o variabilă şir.

5. Pentru a face ca aplicaţia să pară mult mai rapidă. 275 . Cum procedaţi însă dacă aţi optimizat aplicaţia pentru o viteză reală de execuţie. Dacă exportaţi în altă bază de date un formular bazat pe o interogare salvată. în Access 97. nu de viteza reală de execuţie. aveţi la dispoziţie următoarele modalităţi de optimizare:  Utilizarea unui formular de început  Utilizarea indicatoarelor care ilustrează progresul operaţiei  Ştergerea codului din modulele de formular  Preîncărcarea şi ascunderea formularelor  Memorarea locală a datelor 12. Aş vrea ca şi aplicaţia mea să aibă un aspect atât de profesional!". Dezavantajul acestei metode este dificultatea întreţinerii.1 Un formular simplu de început Una dintre cele mai sigure metode de a distrage atenţia utilizatorilor atunci când o aplicaţie efectuează o operaţie într-un interval de timp prea mare este afişarea unor imagini grafice atrăgătoare. Ce se întâmplă când porniţi Access. dar aceasta continuă să fie lentă? Una dintre opţiunile posibile este creşterea vitezei aparente a aplicaţiei. deoarece riscaţi ca afişarea formularului să dureze prea mult şi nu vă mai atingeţi scopul! Pag. nu trebuie exportat decât formularul. puteţi realiza foarte uşor ecrane de deschidere. aşa procedează Microsoft. Este vorba de viteza cu care crede utilizatorul că va fi rulată aplicaţia. dacă formularul are ca sursă de înregistrări (RecordSource) o instrucţiune SQL.se bazează pe o interogare salavată va fi deschis mult mai repede decât unul care are ca sursă de înregistrări (RecordSource) o instrucţiune SQL.5. vă spuneţi în gând: "Arată bine. trebuie să exportaţi şi interogarea corespunzătoare. probabil că v-aţi întreba: "Oare ce se întâmplă? De ce durează aşa de mult încărcarea aplicaţiei?". Vestea bună este că. Pe de altă parte. Ecranele de deschidere îşi îndeplinesc rolul pentru care au fost concepute. Nu trebuie decât să creaţi un formular şi să specificaţi numele său în rubrica Display Form din caseta de dialog Tools/Startup… Un mic sfat: nu încărcaţi formularul de început cu prea multe controale sau cu un cod prea complex pentru evenimentul Load. aţi aplicat diverse metode de creştere a vitezei reale de execuţie a codului VBA şi a apelurilor bazei de date. Word sau Excel? Vedeţi un formular de început sau un ecran de descriere cu menţiunea de copyright: Când vedeţi imaginea respectivă. Creşterea vitezei aparente Până acum. aplicaţia s-a şi încărcat. Şi până să vă treziţi din reverie. 12. Dacă nu aţi vedea un ecran de deschidere. De fapt.

276 . trebuie parcurse trei etape:  Iniţializarea contorului (indicatorului) de progres. Desigur. Funcţia SysCmd oferă o metodă simplă de a realiza acest lucru. Vă puteţi structura procedura astfel: Pag. pentru actualizarea indicatorului. cu specificarea valorii maxime şi a textului care trebuie afişat  Actualizarea repetată a contorului pentru a ilustra progresul operaţiei  Ştergerea indicatorului de progres Următoarea secvenţă de cod reprezintă una dintre metodele de afişare a indicatorului de progres: Sub ShowProgress() Dim varRetVal As Variant Dim i As Integer Dim j As Integer Dim intRnd As Integer 'Initializeaza indicatorul de progres si stabileste valoarea maxima 300 For i = 0 To 300 'Executa o serie de operatii de prelucrare For j = 0 To 1000 IntRnd = Rnd * 10 + 1 Next j ‘ Actualizeaza contorul pentru a ilustra progresul operatiei varRetVal = SysCmd(acSysCmdUpdateMeter. Pentru a afişa un indicator de progres pe bara de stare a aplicaţiei. dumneavoastră nu trebuie să scrieţi un ciclu de instrucţiuni. precum şi a testului "Testing…". care se umple gradual.12.2 Folosiţi indicatoare care ilustrează progresul operaţiei O altă modalitate de a distrage atenţia utilizatorilor .şi de a-i asigura că se întâmplă ceva .este afişarea pe ecran a unui indicator care prezintă progresul operaţiilor efectuate.5. i) Next i 'Elimina indicatorul de progres de pe bara de stare varRetVal = SysCmd(acSysCmdRemoveMeter) End Sub Această procedură determină afişarea unui indicator de progres.

4 Preîncărcaţi şi ascundeţi formularele Pe lângă metoda prezentată anterior. 'Actualizeaza contorul pentru a ilustra progresul operatiei varRetVal = SysCmd(acSysCmdUpdateMeter. 277 . iar codul va fi încărcat numai la cerere. În acest caz. actualizarea şi ştergerea indicatorului de progres de pe bara de stare. 5) 'Executa alte operatii de prelucrare …. Pag.5. ar trebui să ştergeţi codul din modulul de formular şi să îl plasaţi într-un modul de cod standard. 12. 'Actualizeaza contorul pentru a ilustra progresul operatiei varRetVal = SysCmd(acSysCmdUpdateMeter. 10) 'Alte operatii de prelucrare… ….3 Ştergeţi codul din modulele de formulare Utilizatorii încep să se agite dacă execută clic pe un buton pentru a deschide un formular şi afişarea acestuia întârzie. Ca urmare. 12. acSysCmdInitMeter.5. puteţi să încărcaţi formularul în timpul lansării în execuţie a aplicaţiei şi apoi să îl afişaţi şi să îl ascundeţi. în loc să îl încărcaţi şi descărcaţi în memorie. fac parte din limbaj şi nu trebuie declarate nicăieri. "Testing…". acSysCmdUpdateMeter şi acSysCmdRemoveMeter. care măreşte durata de încărcare. sunt intrinsece mediului Access. care sunt folosite pentru iniţializarea. 15) Elimina indicatorul de progres de pe bara de stare varRetVal = SysCmd(acSysCmdRemoveMeter) End Sub Cele trei constante.Sub ShowProgress() Dim varRetVal As Variant 'Initializeaza indicatorul de progres si stabileste 'valoarea maxima 300 varRetVal = SysCmd(acSysCmdInitMeter. dacă folosiţi frecvent un anumit formular care necesită mult timp pentru încărcare şi descărcare. după deschiderea formularului. formularul va fi afişat mult mai repede. 'Actualizeaza contorul pentru a ilustra progresul operatiei varRetVal = SysCmd(acSysCmdUpdateMeter. Aşa se întâmplă de obicei când un formular are foarte mult cod în modulul său. 300) 'Executa o serie de operatii de prelucrare …. Cu alte cuvinte.

ne-am concentrat atenţia asupra scrierii unui program care să încapă într-o zonă redusă de memorie şi să poată fi executat cât mai repede posibil . cele trei metode de obţinere a datelor sunt:  Citirea datelor din memorie (de exemplu.5. puteţi crea cu ajutorul metodei GetRows o matrice pentru stocarea datelor respective. În timp ce utilizatorul priveşte formularul principal. Bineînţeles. 12. va creşte şi necesarul de memorie pentru aplicaţia dumneavoastră. însă reţineţi că mai multe formulare încărcate concomitent vor spori cantitatea de memorie necesară aplicaţiei. Dacă păstraţi date accesate frecvent . Region) pe care îl accesaţi frecvent prin codul VBA. Puteţi întârzia încărcarea formularului chiar şi după afişarea pe ecran a formularului principal al aplicaţiei. gândiţi-vă la un nivel superior de stocare a datelor (adică la schimbarea tipului de memorie cache). va trebui să vă asiguraţi că. Consideraţii referitoare la lucrul în reţea Până acum. De exemplu.5. în fundal poate fi încărcat al doilea formular. citirea din memorie este mai rapidă şi mai eficientă decât citirea de pe hard-disc. puteţi îmbunătăţi performanţele unei aplicaţii utilizând zone cache pentru stocarea datelor. ori de câte ori sunt actualizate pe server. Windows 95 plasează datele provenite de pe hard-disc într-o zonă cache reprezentată de o porţiune din memorie.într-un tabel de pe un sever de reţea ar trebui să aveţi în vedere copierea datelor pe calculatorul client local pentru ca aplicaţia să ruleze mai repede.Această tehnică va încetini lansarea în execuţie a aplicaţiei.sau măcar să Pag.5. Sunt frecvente situaţiile în care un program foloseşte în mod repetat aceleaşi date. 278 . Prin această metodă.dar care nu se modifică des . 12. programul va citi datele direct din zona cache şi nu va mai pierde timp căutându-le de fiecare dată pe hard-disc. Această tehnică poate mări semnificativ viteza de obţinere a datelor. dar va creşte substanţial performanţa de ansamblu. În mod similar. În plus. Metoda prezentată este utilă dacă viteza aparentă este o prioritate de programare. Stocaţi datele în memoria locală O zonă cache este o zonă de memorie (sau spaţiu pe hard-disc) utilizată pentru a stoca valori provenite din altă parte şi pregătite pentru a fi refolosite. dacă aveţi date într-un tabel de căutare (de exemplu. matrice)  Citirea datelor din tabele stocate  Citirea datelor din tabele stocate pe calculatoare legate într-o reţea Dacă doriţi să creşteţi viteza aparentă de rulare a aplicaţiei.6. În ordinea descrescătoare a vitezei. Totuşi. variabile. datele vor fi actualizate şi pe calculatoarele client (şi invers). Prin urmare.

trebuie să vă stabiliţi priorităţile şi să acţionaţi în consecinţă. În al doilea rând. Ultimele retuşuri Toate sugestiile de până acum au fost analizate ca priorităţi specifice de programare: creşterea vitezei reale de execuţie. În unele cazuri. În această situaţie. care vor observa că aplicaţiile lor sunt încetinite considerabil din cauza aglomerării traficului. De exemplu. 279 . cât şi negative. Acestea sunt:  Compactarea bazei de date  Compilarea tuturor modulelor  Deschiderea bazelor de date în mod exclusiv Pag. Lucrul în reţea are două neajunsuri importante. există şi situaţii în care o măsură de optimizare are efecte antagonice: atât pozitive. dai şi amprenta de memorie a acesteia.indiferent de priorităţile de programare. În primul rând. puteţi aplica următoarele tehnici:  Căutarea după câmpuri indexate în tabele ataşate  Plasarea pe calculatorul local a obiectelor care nu sunt de tip tabel  Dezactivarea opţiunii AutoExpand 12. De cele mai multe ori. Totuşi. De exemplu. rularea lentă este cauzată de cantitatea enormă de date care trebuie să fie citite de pe disc şi apoi transferate prin reţea. performanţa obţinută la transferul datelor . schimbarea tipului unei variabile de la Variant la întreg va reduce considerabil necesarul de memorie şi va creşte viteza de execuţie.6. tehnica de încărcare şi ascundere a formularelor va mări viteza aparentă de execuţie a aplicaţiei. Dacă unul dintre cele două aspecte menţionate reprezintă o problemă pentru dumneavoastră. Acest fapt îi va deranja pe ceilalţi utilizatori ai reţelei. o singură măsură de optimizare poate aduce mai multe avantaje.în special printr-o reţea lentă .poate fi mai slabă decât în cazul folosirii tabelelor locale. s-ar putea ca aplicaţia dumneavoastră să genereze un intens trafic de reţea. reducerea traficului de reţea sau micşorarea amprentei de memorie a aplicaţiei de baze de date. Secţiunea finală din acest capitol prezintă câteva tehnici care îmbunătăţesc întotdeauna performanţele aplicaţiei dumneavoastră . Însă unul din motivele esenţiale pentru care aplicaţiile de baze de date Access sunt lente nu are nici o legătură cu dimensiunea memoriei necesare sau cu viteza de execuţie a codului.creeze această impresie.

Momentul aşteptat a sosit. "Ce s-a întâmplat cu aplicaţia mea? Se mişcă de parcă ar fi un câine şchiop… aflat în comă".12. Pentru a Pag. Durează doar câteva minute şi aţi rulat-o de multe ori. Cauza ar putea fi procesul de fragmentare a bazei de date. este eliminat tot spaţiul nefolosit (găurile din şvaiţer). în situaţia în care spaţiul folosit de aceste obiecte nu este recuperat. în acelaşi timp. înainte de compactarea bazei de date ar trebui să folosiţi un program de defragmentare a discului (de exemplu Disk Defragmenter. în vederea prezentării de luni în faţa consiliului. Mai aveţi la dispoziţie o oră şi vă gândiţi să rulaţi o mică rutină proprie de bibliotecă pentru a adăuga procedurilor nişte anteturi de efect. folosind metoda CompacteDatabase a obiectului DBEngine: DBEngine.6. Prin compactarea unei baze de date. performanţele scad. dumneavoastră executaţi clic pe pictograma aplicaţiei… şi aşteptaţi… aşteptaţi… aşteptaţi… "Ce este asta?" vă întrebaţi în gând. modulul respectiv trebuie să fie recompilat înainte de a fi lansat în execuţie. Poate că aţi uitat să recompilaţi aplicaţia! Când efectuaţi modificări (de orice fel) într-un modul de cod standard sau întrun modul de clasă (inclusiv modulele de formulare şi rapoarte). dar şi prin cod VBA.CompactDatabase "c:\myold. membrii consiliului se aşează în jurul mesei. va deveni mai lentă.şi.2 Compilarea tuturor modulelor Aţi lucrat cu înfrigurare tot weekend-ul pentru a termina aplicaţia de baze de date. Baza de date va fi ca un şvaiţer ."c:\mynew. Fragmentarea se produce la ştergerea unor obiecte din baza de date. Aţi testat aplicaţia azi-noapte într-un mediu obişnuit de lucru .şi aceasta a funcţionat bine. care este distribuit împreună cu Windows 95). aşa încât ştiţi sigur că nu conţine erori de programare. iar paginile de date devin contigue. Deşi nu este deteriorată în nici un fel. Aplicarea acestei tehnici prezintă două avantaje:  Îmbunătăţirea performanţelor bazei de date  Reducerea dimensiunii fişierului bazei de date Compactarea unei baze de date se poate realiza cu ajutorul opţiunii specifice din meniu.1 Compactarea bazei de date După o perioadă de timp.mdb". 12. este posibil să constaţi că performanţele aplicaţiei dumneavoastră sunt în scădere. Aceasta pentru că citirea datelor necontigue (fragmentate) de pe disc este mai lentă decât a datelor contigue.mdb" Pentru a obţine performanţe optime. 280 .6.cu o mulţime de spaţii goale .

să compilaţi întotdeauna întregul cod. configuraţi argumentul Exclusive la valoarea True atunci când folosiţi metoda OpenDatabase: Set db = DBEngine(0).exe c:\abwrox\code\wrox. Dacă nu compilaţi explicit codul prin această metodă. Aplicaţia va fi executată mai rapid. vor fi detectate o serie de erori. True) 12. Întârzierea este limitată dacă aţi validat caseta Compile On Demand (Compilare la cerere) din pagina etichetei Module a casetei de dialog Tools/Options… În acest caz.mdb /Excl Dacă deschideţi baza de date în VBA. în special dacă modulele compilate conţin multe linii de cod.3 Deschiderea bazelor de date în mod exclusiv Dacă sunteţi singura persoană care va folosi baza de date la un moment dat.6. Access compilează secvenţele de cod apelate de procedura executată . selectaţi opţiunea Compile and Save All Modules din meniul Debug.mdb". Ca urmare.OpenDatabse("c:\abwrox\code\wrox. 12. deoarece Access nu va mai pierde timpul cu monitorizarea altor utilizatori care doresc să blocheze înregistrări. executaţi clic în caseta de validare Exclusive din caseta de dialog Open Database. Prin compilare. ar trebui să o deschideţi în mod exclusiv. Pentru a vă asigura că baza de date va fi deschisă în mod exclusiv. întârzierea este mai mică. Pentru siguranţă. ar trebui ca înainte de distribuirea aplicaţiei. sistemul Access compilează codul în timpul de execuţie. c:\access\msaccess.prin arborele de apeluri. Dacă lansaţi aplicaţia din linia de comandă.compila codul din toate modulele bazei de date.7 Rezumat Pag. cum ar fi o instrucţiune For… care nu este urmată de instrucţiunea Next. 281 . ceea ce poate determina o întârziere semnificativă. selectaţi opţiunea Exclusive ca Defalut Open Mode în pagina etichetei Advanced a casetei de dialog Tools/Options… Dacă doriţi să deschideţi o singură bază de date în mod exclusiv atunci când este prestabilit modul partajat. puteţi folosi opţiunea /Excl pentru a obţine acelaşi rezultat.

arătând cum puteţi folosi bibliotecile de rutine şi programe de completare pentru a reduce timpul de dezvoltare şi de testare a aplicaţiei.numai dumneavoastră puteţi decide care prioritate este mai importantă.Crearea unei aplicaţii este o mare realizare. a de exemplu viteza de execuţie a codului . s-a prezentat:  Cum poate fi redusă supraîncărcarea memoriei prin alegerea corespunzătoare a tipurilor de date. vom discuta despre avantajele codului refolosibil. ar trebui să stabiliţi care sunt priorităţile de programare şi apoi să urmaţi sugestiile prezentate în carte. Acest capitol a prezentat o serie de sugestii şi trucuri pentru creşterea vitezei generale de execuţie a codului. pentru a distrage atenţia utilizatorului şi a crea impresia că aplicaţia rulează mai rapid  Cum să măriţi eficienţa unei aplicaţii de reţea În capitolul următor. Construirea unei aplicaţii care rulează rapid (sau măcar dă această impresie) şi u ocupă toată memoria calculatorului înseamnă însă cu totul altceva . Nu uitaţi că optimizarea unei priorităţi. cum ar fi utilizarea unui ecran de început şi a unor indicatoare care să ilustreze progresul unei operaţii. cum ar fi mentenabilitatea. Pag. În capitolul de faţă.este ceea ce va consacra sau va invalida aplicaţi. poate afecta un obiectiv secundar. nimic nu este mai rău decât un program ineficient. recuperarea memoriei şi renunţarea la comentariile de prisos  Tehnicile de programare prin care puteţi mări viteza de execuţie  Diverse trucuri. 282 . pentru ei. Înainte de a începe scrierea secvenţelor de cod. Utilizatorii sunt fiinţe nerăbdătoare şi.

com. situl Web al editurii Wrox se găseşte la adresa http://www. Vom prezenta următoarele subiecte:  Ce este Internetul?  Cum se utilizează hiperlegăturile?  Cum se pot publica date în Internet?  Crearea unui browser Web 13.1 Ce este Internetul? Termenul Internet denumeşte o colecţie de calculatoare legate între ele . HTML evoluează continuu.edu (pentru situri  Pag. realitatea este că reţeaua Internet există. Expresia www provine de la World Wide Web. care iniţial. wrox este numele companiei. Este un limbaj foarte simplu.prin crearea unei comunităţi globale. Alte sufixe des întâlnite sunt . formatărilor etc. va exista încă mulţi ani şi.wrox.o reţea foarte mare. poate constitui un instrument de lucru foarte util. Indiferent de care parte vă situaţi. cel mai important. Cele mai cunoscute browsere sunt Microsoft Internet Explorer şi Netscape. care are la dispoziţie o abundenţă de informaţii.INTERNET Iată subiectul cel mai fierbinte şi controversat din lumea calculatoarelor. 283 . Înainte de a vedea cum putem folosi caracteristicile Access pentru a ne conecta în şi din Internet. 24 de ore pe zi. vom defini câteva noţiuni: HyperText Markup Language. Alţii văd în Internet un monstru care aşteaptă să ne înghită după ce îi vom cădea cu toţii în capcanele ademenitoare. astfel încât dumneavoastră să puteţi trece uşor de la un document la altul. dat atâta tot.CAP: 13 . gândiţi-vă la HTML ca la o posibilitate de formatare a documentelor. Acest capitol este dedicat modalităţilor în care puteţi folosi facilităţile Internet în Access 97.  Un sit Web este un calculator (sau un grup de calculatoare) din Internet care păstrează documente HTML. era destinat aranjării textului pe ecran. numit uneori doar Web. Mulţi văd în Internet salvatorul societăţii noastre . incluzând din ce în ce mai multe facilităţi.  Un browser (program de navigare în Web) este un program care afişează documente HTML. deocamdată. urmărind legăturile şi referinţele existente. HTML. De exemplu. iar com prescurtarea de la companie sau sit comercial. este formatul în care sunt stocate documentele Internet. caracteristica hipertext permite stabilirea unor legături între documente.

Hyperlink.  Un alt protocol important este protocolul pentru transferul fişierelor (File Transfer Protocol . Într-o reţea sistemele componente se înţeleg prin intermediul unui protocol de reţea. într-o structură de directoare. haideţi să vedem care sunt principalele protocoale folosite în Internet şi cum funcţionează. Desigur. probabil.FTP). şi nu prin adrese URL. au apărut şi protocoale care indică activitatea pe care doriţi să o desfăşuraţi. De exemplu: Când folosiţi un browser Web pentru a accesa documentele HTML. adresa URL ar fi http://www. Pag.educaţionale. adresa va începe cu mailto:. Acest vă permite să transferaţi în şi dintr-un server Web programe şi documente. adresa URL va începe cu ftp:.  Adresa este URL-ul materialului care va fi vizualizat. Hiperlegătura poate conţine trei informaţii: un text de afişare. În acest fel.com/access.  Sub-adresa este secţiunea din cadrul materialului. O adresă URL (Uniform Resource Locator) este numele atribuit unui anumit sit Web sau a unui document din situl respectiv. Ca urmare. 284 . există multe alte protocoale. puteţi introduce o adresă URL ca un câmp într-un tabel sau într-un formular.  13. Acest server primeşte cereri de la browserele Web şi le pune la dispoziţie documentele solicitate.microsoft. În acest caz. Pentru pagina Access a firmei Microsoft. Este motivul pentru care adresele URL încep cu http:. Documentele sunt stocate la fel ca pe un hard-disc obişnuit. cum sunt cele ale universităţilor şi colegiilor) şi .  13.  Un alt protocol pe care îl veţi folosi.  Un server Web este maşina care controlează un sit Web. utilizaţi un protocol de transfer pentru hipertext (HxperText Transfer Protocol .2 Protocoale Pentru a evita orice confuzie.3 Date de tip hiperlegătură (Hyperlink) Access 97 are un nou tip de date pentru lucrul în Internet . În acest caz. însă acestea nu sunt folosite atât de frecvent precum cele prezentate anterior. Aţi observat probabil în timpul navigării prin Web că multe legături sunt descrise prin text. se comunică serverului Web tipul de serviciu pe care doriţi să îl folosiţi. în Access este protocolul MailTo.  Textul de afişare este textul pe care doriţi să îl afişaţi pe ecran. De când prin Internet se furnizează şi alte materiale decât pagini HTML. Un protocol este numele limbajului prin care calculatoarele comunică între ele. care ajută programul dumneavoastră de poştă electronică să transmită mesaje email. o adresă şi o sub-adresă. folosiţi tot un protocol de reţea.gov (pentru situri guvernamentale). Când comunicaţi cu un calculator din Internet.HTTP).

Beneficiind de posibilitatea de a deschide formulare.com http://www. foi de calcul Excel.doc şi sare la semnul de carte Hyperlinks Deschide formularul frmMaintWhisky din baza de date C:\Wrox\BegVBA97\ Whisky. 13.doc# Hyperlinks Whiskies#C:\Wrox\ Whiskies BegVBA97\Whisky. o hiperlegătură arată astfel: Display Text#Address#Sub Address Pentru clarificare vom prezenta câteva exemple: Adresa URL Textul afişat pe ecran http://www.Cele trei părţi sunt separate prin semnul diez (#). Pag. 285 . Cum se utilizează hiperlegăturile? Gândiţi-vă cât de utile ar fi hiperlegăturile în aplicaţia dumneavoastră. puteţi chiar să înlocuiţi codul butoanelor care deschid alte formulare cu o adresă de hiperlegătură.mdb Deschide formularul frmMaintWhisky din baza de date curentă Observaţi că tipul de date hiperlegătură nu limitează adresele URL doar la documente HTML.microsoft. Din fericire. pentru că Access permite folosirea tipului de date Hyperlink în tabele şi formulare. să poată ajunge într-un sit Web. cu un singur clic de mouse. prin urmare. hiperlegăturile sunt extrem de simplu de implementat. formulare Access etc.com # Hyperlinks#C:\Wrox\ Hyperlinks BegVBA97\Internet. Puteţi indica şi documente Word. pentru ca utilizatorii.4.microsoft.mdb# Form frmMaintWhisky Whiskies## Form frmMaintWhisky Whiskies Acţiune Sare la pagina iniţială Microsoft Sare la pagina iniţială Microsoft Deschide documentul C:\Wrox\BegVBA97\ Internet. Aceasta va deschide un formular nou fără a folosi vreo instrucţiune de cod.microsoft.com Microsoft on the Microsoft on the Web Web#www.

vă întrebaţi probabil cum să puneţi la dispoziţia celor interesaţi datele din Access. care prezintă datele din momentul în care a fost creat. 286 . însă. Are o acţiune similară cu executarea unui clic pe control. aceasta se numeşte HyperlinkPart. Este foarte simplu. executarea unui clic pe o hiperlegătura în Access este acelaşi lucru cu deschiderea de pagini Web cu ajutorul unei hiperlegături. Totuşi. 13. Documentul nu este legat la o bază de date şi nu reflectă modificările din cadrul acesteia. Adaugă hiperlegătura în dosarul Favorites. la fel ca toate celelalte obiecte. după ce aţi văzut că datele pot fi legate şi din surse externe. va trebui să îl creaţi din nou.în acest scop. puteţi folosi metodele din tabelul de mai sus.5 Hiperlegături în VBA După ce aţi văzut câte de uşor este să adăugaţi hiperlegături în tabele şi formulare. Pag. s-ar putea să existe situaţii în care să doriţi manipularea hiperlegăturilor prin cod .6. şi tipul de date Hyperlink are câteva metode şi proprietăţi. Desparte hiperlegătura în părţile componente. s-ar putea să nu aveţi nevoie să folosiţi aceste funcţii prin cod VBA. care sunt foarte simple. Aşa cum aţi văzut. Sub-adresa hiperlegăturii. Element Hyperlink Address SubAddress Follow AddToFavorities FollowHyperlink HyperlinkPart Tip Proprietate Proprietate Proprietate Metodă Metodă Metodă Metodă Descriere O proprietate a controlului asociat cu coloana de hiperlegături care face referire la obiectul hiperlegătură. vă întrebaţi. probabil. Există o funcţie care vă uşurează munca. Documentele HTML statice sunt foarte bune pentru texte cu caracter general. Urmăreşte hiperlegătura până la destinaţie.1 Documente HTML statice O pagină HTML statică este un document HTML independent. Datorită utilizării simple a hiperlegăturilor din tabele şi formulare.13. cum puteţi implementa prin program aceste elemente. Publicarea în Web Acum. 13. însă nu şi în cazul bazelor de date. şi în acest caz.6. Adresa principală a hiperlegăturii. vom începe prin a prezenta câteva aspecte teoretice. Ei bine. Este folosită pentru controalele care nu au proprietatea HyperlinkAddress. Pentru a actualiza datele dintr-un document HTML static. Urmăreşte hiperlegatura direct prin adresă.

care vă permit să alegeţi şabloane. o sursă de date ODBC sau o bază de date Access. însă de data aceasta selectaţi în câmpul Save as type opţiunea Microsoft IIS 1-2. aţi terminat. documentul va avea aspectul unei foi de date.IDC permite afişarea unei pagini dinamice. Acum puteţi deschide fişierul într-un browser Web.idc şi unul . În cazul rapoartelor. însă serverul Web trebuie să fie Microsoft Internet Information server (IIS). Pe ecran va fi afiată caseta de dialog Save standard. însă toate acestea vor arăta ca nişte foi de date. Există şi alte opţiuni. Pentru a o lansa în execuţie. are loc o nouă interogare a bazei de date. astfel că documentul rezultat va arăta exact ca un raport Access. Schimbaţi opţiunea Save as type în HTML Documents (Documente HTML).6. care interoghează baza de date şi afişează informaţiile căutate. Această bază de date poate fi orice sursă de date ODBC.6.html şi pot fi folosite pe orice server Web. Sunt necesare două fişiere: un fişier . Aplicaţia vă va conduce prin etapele procesului de creare a documentului HTML. Nu vom studia toate aceste detalii. 287 . În fişierele IDC puteţi exporta tabele. Apoi selectaţi opţiunea To an External File or Database (Într-un fişier extern sau într-o bază de date) din caseta de dialog afişată pe ecran. însă pentru celelate tipuri de obiecte. Introduceţi un nume de fişier şi executaţi clic pe butonul de Export. precum şi locul unde doriţi să salvaţi documentul. şi nu datele de căutare. create dintr-un document HTML. Urmaţi acelaşi algoritm ca în cazul documentelor HTML statice. formatarea se păstrează. permiţându-vă să alegeţi obiectele pe care doriţi să le salvaţi şi tipul de export pe care doriţi să îl realizaţi. interogări. interogări şi formulare.deoarece nu afişează cele mai recente informaţii. Prima metodă este următoarea: selectaţi elementul dorit şi alegeţi Save As/Export…din meniul File. În documentele HTML statice puteţi salva tabele. alegeţi Save As HTML din meniul File. 13.3 Internet Data Connector Internet Data Connector . Trebuie remarcat că în câmpurile de căutare sunt afişate numele de identificare. 13. La fiecare deschidere sau împrospătare a paginii.htx. Aceste documente au sufixul . cu aceasta. Există două metode de a salva datele ca document HTML.2 Aplicaţia wizard HTML Export A doua metodă de a exporta obiecte ale unei baze de date în documente HTML constă în folosirea aplicaţiei wizard HTML Export. amintim doar că aplicaţia wizard reuneşte trei metode de salvare a informaţiilor în documente HTML. Pag. formulare şi rapoarte.

Cu toate acestea. având un aspect similar cu formularele din Access. care creează două fişiere. Tabelele şi interogările sunt afişate ca foi de date.asp.0. permiţând introducerea. însă codul VBA al formularului nu este convertit.6. este o tehnologie de creare a paginilor dinamice. iar formularele sunt afişate în format HTML. hiperlegătura nu poate fi urmărită.0. succesorul lui IDC. spre deosebire de metoda IDC. editarea şi ştergerea datelor dintr-o pagină Web.4. care afişează baza de date în starea sa curentă. de data aceasta cel puţin versiunea 3. În fişierele ASP puteţi exporta tabele.Active Server Pages Active Server Pages (pagini server active). Datele pot proveni din orice sursă ODBC. 288 . Spre deosebire de IDC. Prin urmare. cel puţin versiunea 3. aceste pagini sunt similare cu formularele.0 sau o versiune ulterioară (şi este disponibil în situl Web Microsoft). pentru a crea pagini ASP aveţi nevoie de Internet Explorer. interogări şi formulare. însă nu poate rula independent. Controlul Access Casetă de text Casetă de text asociată unui câmp cu o hiperlegătură Casetă cu listă Casetă combinată Controlul ActiveX corespunzător Casetă de text Casetă de text care afişează textul hiperlegăturii. Controalele din formular sunt înlocuite cu controale ActiveX. Pentru a poziţiona controalele în pagina HTML. Lista următoare prezintă controalele Access care sunt înlocuite cu controale ActiveX. Access foloseşte controlul Microsoft HTML Layout. Fişierele Active Server Pages sunt înregistrate cu extensia . metoda Active Server Pages creează un singur fişier pentru fiecare foaie de date. având instalată opţiunea Active Server Pages. însă serverul Web trebuie să fie Internet Information Server. Casetă cu listă (cu o singură coloană) Casetă combinată Controlul Access Controlul ActiveX corespunzător Pag.13. Acest program este distribuit împreună cu Internet Explorer 3.

obţineţi un formular funcţional. Dacă aţi salvat un formular. Buton de comandă.0 pentru a-l vizualiza. care acceptă şi paginile server active (Active Server Pages).Etichetă Buton de comandă Grup de opţiuni Buton de opţiune Casetă de validare Buton comutator Control ActiveX Etichetă. unde trebuie să introduceţi adresa completă la care va fi stocat documentul. Pentru a salva datele într-un fişier ASP. această tehnică a permis parcurgerea unor paşi importanţi în direcţia realizării unor aplicaţii pentru Web. Deşi nu este perfectă. Grup de opţiuni. însă de data aceasta. sunt ignorate:  Controale Tab  Dreptunghiuri  Linii  Separatori de pagini  Cadre de obiecte neasociate  Cadre de obiecte asociate  Controale de imagine  Fundalurile de formulare configurate cu ajutorul proprietăţii Picture În ciuda acestor lipsuri. Dacă butonul de comandă are configurate proprietăţile HyperlinkAddress şi/sau HyperlinkSubAddress. Dacă eticheta are configurate proprietăţile HyperlinkAddress şi/sau HyperlinkSubAddress. Următoarele controale nu sunt convertite la salvarea unui formular ca fişier ASP şi. este creată o hiperlegătură pentru etichetă. este o adresă la care este instalat Personal Web Server. dar secvenţa de cod corespunzătoare butonului nu este salvată. însă apare şi un câmp pentru adresa serverului. În exemplul nostru. de aceea. selectaţi în câmpul Save as type opţiunea Microsoft Active Server Pages. însă secvenţa de cod corespunzătoare controlului este salvată. puteţi să deschideţi fereastra aplicaţiei Internet Explorer 3. 289 . Şi aici există spaţii speciale pentru introducerea şablonului HTML şi a informaţiilor despre sursa de date ODBC. Pag. folosiţi acceaşi metodă ca mai înainte. însă fără un cadru de grup Buton de opţiune Casetă de validare Buton comutator Control ActiveX. este creată o hiperlegătură pentru buton.

Măriţi puţin dimensiunea formularului. Acum deschideţi formularul frmMaintCompany în modul de afişare Form şi selectaţi înregistarea Bacchanalia. Această instrucţiune foloseşte metoda Navigate a controlului Browser pentru a naviga către hiperlegătură. există o serie de probleme legate de controlul Browser şi de Internet Explorer 3. Deschideţi tabelul Company şi adăugaţi următoarea adresă în câmpul WebSite pentru produsul Bacchanalia: file://C:\\BegVBA\\bacch. Adăugaţi un buton de comandă. Adăugaţi acest control în formularul dumenavoastră. 4. Salvaţi şi închideţi tabelul. denumiţi-l cmdWeb şi completaţi titlul (Caption) View Web Page (Vizualizare pagină Web). Oricum. acAddress) 1. Probabil aţi observat că dimensionarea este inadecvată. aţi văzut cât de uşor vă puteţi publica datele din Access în sistemul Web. Acum derulaţi lista de constroale plasând cursorul pe săgeata din partea de jos a formularului şi selectaţi opţiunea Microsoft Web Browser Control. 290 . 7. Închideţi formularul şi salvaţi-l. Selectaţi butonul More Controls (Alte controale) din caseta de instrumente. Browserul va afişa imediat pagina Web corespunzătoare. adăugând următoarea linie de cod: ctlBrowser.0. 6.Un browser Web Deschideţi tabelul Company în modul de afişare pentru proiectare (Design) şi adăugaţi un câmp nou. Încercaţi singur . însă cum includeţi funcţii Web în aplicaţiile dumneavoastră? Este un proces la fel de simplu. 2. formularele vor avea propriul browser şi nu veţi mai fi nevoit să rulaţi unul separat.0 sau o versiune ulterioară. S-ar putea să fie necesară redimensionarea formularului pentru a face loc noului control. deoarece firma Microsoft a realizat un control de navigare Web (Web Browser Control) care poate fi adăugat în formularele dumneavoastră. Denumiţi controlul ctlBrowser. aşa cum procedaţi cu orice alt control. executaţi clic pe butonul View Web Page. 5. memorată local pe hard-discul calculatorului dumneavoastră. numit WebSite.htm Această adresă indică pagina iniţială a produsului Bacchanalia. Editaţi codul pentru evenimentul Click al noului buton. de tip Hyperlink. Crearea unui browser Până acum.13. 10. 3. astfel că Pag.Navigate HyperlinkPart)Me!Website. Din păcate. pentru a folosi acest control. 9.7. Deschideţi formularul frmMaintCompany în modul de afişare pentru proiectare. 8. Astfel. trebuie să aveţi instalat produsul Internet Explorer 3.

Pentru cei care au deja aplicaţii Access. cum ar fi cadrele mobile şi foile afişate în cascadă  Alte controale ActiveX  Majoritatea produselor de completare Netscape  Scripturi. Aceste neajunsuri sunt cunoscute şi sperăm că vor fi rezolvate curând.paginile Web au un aspect necorespunzător şi nu execută corect operaţia de împrospătare. dar dezvoltă aplicaţii noi bazate pe Internet/intranet. Subiectele principale din acest capitol au fost:  Hiperlegăturile şi utilizarea lor în Access  Importul şi exportul documentelor HTML  Crearea unui browser Web în Access Pag. de exemplu secvenţe audio şi video  Imagini virtuale tridimensionale create cu Virtual Reality Modeling Language (VRML)  Documente Microsoft Office Cred că acest control este mult mai util pentru aplicaţiile intranet. 291 . care vă oferă posibilitatea de combinare a conţinutului. Ar fi mult mai bine dacă aţi indica un sit Web prin http. şi nu prin file. Utilizarea pe scară largă a Internetului în viaţa de zi cu zi şi interesul public general constituie premise pentru dezvoltarea şi îmbunătăţirea unor astfel de caracteristici. Totuşi.Rezumat În acest capitol au fost prezentate câteva facilităţi oferite de Access 97 pentru lucrul în Internet. cum sunt Microsoft Visual Basic Scripting Edition (VBScript) sau JavaScript  Elemente multimedia.8. controlul Web Browser poate vizualiza documente HTML care includ:  Elemente HTML standard şi îmbunătăţiri HTML. controlul Browser poate constitui un sprijin important în trecerea la o aplicaţie combinată. 13.

..........................2 Exportul datelor..........9 Crearea unei tabele folosind experţii Access............3..3..........................................2.............................................2....................30 2..................................................................................................3 MODELUL RELAŢIONAL.37 2........43 3........... Tipuri de asociere.........................30 2.....................28 2....................5 Stabilirea proprietăţilor câmpurilor....................2......................................43 3..................................3...........................2. FOLOSIREA FERESTREI QBE.................................................................................CAP: 1.................................................2 Relaţii...................34 2...........................2......6 1............................27 2..........1.................2.........................................................................2......................................................... Modificarea relaţiilor existente..........2................................................................. Proprietăţile interogărilor..........43 3....................2....................10 1........................................................................................................................................4............................. Formate standard......................................36 2....36 2................2 SISTEME DE GESTIUNE A BAZELOR DE DATE..................................2..................................................................4............... INTEROGĂRI........... Interogări de tip Crosstab ....................2.........................3 STABILIREA RELAŢIILOR ÎNTRE TABELE........................................................... Interogări de tip totals ......... Specificarea surselor de date......................................2 Datasheet View: avantaje...............................9 1.......................................................... TABELE ŞI RELAŢII ............32 2...........................1 BAZĂ DE DATE................................................2......................... Interogări agregat.......30 2..................................2.........................................16 2.....................8 1...................................................................................................................................................................3.........1..........1.........................46 3......................................................4......17 2...............1.3.........................1 Sortarea rezultatelor unei interogări de tip totals.......1...............................................2................................................2 Limitările intergărilor Crosstab...49 3.....................51 Pag.....50 3.................................................4.................5 Asigurarea integrităţii referenţiale.................................................................................................................................................34 2....................6........................................................................ Fereastra Relationships....................11 BIBLIOGRAFIE......................3.................................... TIPURI DE INTEROGĂRI...2..............................................6 Lookup wizard....38 CAP:3..2.................. NOŢIUNI GENERALE DESPRE BAZE DE DATE...........3................................1 Chei primare.............47 3......................................................................................................48 3..................................................................................3 Teoria normalizării.........................................20 2...............4..............7 Value List...18 2.............7 1.....................................................2 Crearea relaţiilor dintre tabele.. 292 .2.........51 3.........3...2 Stabilirea criteriilor.......3 Design View: ....15 2............... Interogări pentru definirea şi modificarea datelor....................40 3........... BAZE DE DATE..................................................................2............................2..............2...................................................................................6 1...........1 Limbaje de interogare........................................................................................4........7 1.........................................................2..................................................................................39 3...................1....3..........3 Proprietăţile relaţiilor.........................................................10 1..........1 CREAREA UNEI BAZE DE DATE.....3.................................................................40 3..........................2........................................... CREAREA TABELELOR..........................1 Crearea manuală a tabelelor......................................................................... SQL............................................... BAZE DE DATE RELAŢIONALE...................................................1.............................................................................21 2..........................................18 2............................................................................ Interogări de tip Make Table....................................................8 Definirea cheilor primare şi a indecşilor........3..........2 Reguli de fidelitate ale bazelor de date...........15 CAP:2..........................................................................6 1........................1.......36 2...........23 2........................................4 Definirea coloanelor.................1..........................................................19 2.................................................2...3. chei secundare........................................................1 Crearea totalurilor pe linii..........1...........................................1 Importul datelor........................................................................2............................. Scurtă descriere a modelului relaţional.........2..........39 3...........1................

8............................................................................................................................3...................... SUBFORMULARE................................................................................................................55 Funcţii.......................................2......................................56 3............. MACROCOMENZI........................................................................52 3...................................................................58 3...............................................................82 5...................85 ...........................1.......... DESPRE CONTROALE........79 5............................ LUCRUL CU DATE ŞI ORE..........................................................................................................................................................................52 3................................................. Părţile componente ale expresiilor............................................... Evenimente legate de tipărire...................70 4.....................8 Interogări cu parametri....................56 3.......................................................................... Ordinea producerii evenimentelor rapoartelor............................................... TIPURI DE EVENIMENTE ÎN ACCESS...............83 5.........8...................................... Evenimente legate de focus...................................... Interogări de tip Append.......2...................7........ MODELUL ORIENTAT PE EVENIMENTE.............................76 5........81 5................62 4.........................1......................................................... 293 ............................................................69 Controale ataşate...1.......................................................................... CREAREA ŞI LUCRUL CU FORMULARELE...........................................76 5.................................................3..................................2................................................82 5..........................................................................................5................ Casete combinate...... Ordinea producerii evenimentelor legate de controale..........................2...........................................................................1.............................. CREAREA UNEI MACROCOMENZI............ FUNCŢIA IIF ÎN EXPRESII...5..75 ...............66 4............................................................................................................80 5................................................................... Ordinea producerii evenimentelor legate de tastatură şi mouse................. Evenimente generate de accesarea datelor.. EXPRESII ŞI FUNCŢII ÎN INTEROGĂRI...86 CAP:6................................................................... CREAREA UNUI FORMULAR SIMPLU..........................3..............86 6.................59 3...........................6............68 4.....................................................................................................................................................................................54 Constante.....................................................3.................................. casete listă şi grupuri de opţiuni....54 Operatori............................................................................6...........................1...............79 5....................................................2..... STRATEGII DE PARCURGERE A TABELELOR DE BAZĂ.7 Interogări de tip Delete..................73 4............ Evenimentele legate de timer..........2.............................................................................. Ordinea producerii evenimentelor legate de lucrul cu înegistrările unui formular..............53 3....69 Controale calculate..........87 Pag..........6................................................ TRATAREA EVENIMENTELOR ...........................................................................................................................................4...................................................................................................................2...........................6 Interogări de tip Update................82 5.............4....................................2.....10 .........................3......5....5...................................................53 3.......2................................61 4...................83 5.................................................................................... Evenimente legate de tastatură..........78 5...........5................................................ GREŞELI FRECVENTE.......................................................2....................................................................1........61 4......58 3...................................2..............................2..........53 3.4.........3 Ordinea producerii evenimentelor legate de formulare.1....................................................................3........ Tipuri de controale...............................................................73 CAP: 5.........................................1......................................................................................1..........................2.......................4...............1........60 CAP: 4........................................................................ Evenimente legate de activitatea cu mouse-ul.................................................................................82 5. LUCRUL CU FORMULARELE.............1 SURSELE DE ÎNREGISTRĂRI ALE FORMULARELOR .................................85 5..1.........................................5.................... Evenimente generate de erori..........................................70 FIGURA IV............................................................................... IMPORTANŢA COMPACTĂRII.................................5.......................................7. Evenimentele ferestrelor........................84 5..1.....................64 4................1...............1..................................... SECŢIUNILE UNUI FORMULAR .........................................................76 5...................................69 Controale neataşate......... ORDINEA PRODUCERII EVENIMENTELOR ÎN ACCESS.....................2........

..............97 Ce conţin modulele.....................1 Matrice multidimensionale dinamice..........3...............................1 Instrucţiunea If…Then.1 Variabile statice...6 MATRICE....................125 7...............99 7..3................................................93 6............................................................108 7.. MACROCOMENZI SPECIALE....................2..............................4.............3...................................... MACROCOMENZI IMBRICATE........4..........................................................................................................................101 7......... Condiţii în macrocomenzi..............................................................6................................4..............................5........................123 7............................................................................................................................2 Instrucţiunea Do…Loop...............................92 6................109 7..89 6........... Macrocomanda AutoKeys......................6...............1 Instrucţiunea For…Next.............................3.............................102 7................................97 7...................115 7..........2 Matrice dinamice.......6.............3 Instrucţiunea ElseIf...................................... Crearea meniurilor şi a barelor cu instrumente personalizate................................. VARIABILE............................107 7............119 7..............................2....4.........................2.. Pe de altă parte.........4..............98 Declaraţii (Declarations)..............................1.........................................................................................125 7.......................................4.............2.......6....................................2..1 Matrice statice....................................................... urmat de un punct şi de numele macrocomenzii:....................................................116 7....................................................................................................................99 Proceduri pentru tratarea evenimentelor.............................................................................................103 7............................4.................................................3 Întreruperea iterării.....................2..........99 7.................................. astfel încât numărul obiectelor din pagina Macro a ferestrei Database să fie mai mic..............................4 Instrucţiunea Select Case..................2 Declararea variabilelor..2 Variabile publice..................................................4 Matrice multidimensionale.........................................................4..............115 7.........1 Tipuri de date.2 Option Explicit................................................... GRUPURI DE MACROCOMENZI...1 MEDIUL DE PROGRAMARE ACCESS..............................................................................................................................................................122 7.................................. pentru a fi mai simplu de depanat..................................................99 7............................................95 CAP:7.................................................................................................98 Opţiuni................119 Indici..................... INSTRUCŢIUNI DE CONTROL...............................................................4 Vizibilitatea şi durata de viaţă a variabilelor................................. 294 ......................89 O macrocomandă din grup poate fi executată utilizând numele grupului..........................................................5....2 Instrucţiunea If…Then…Else.89 6..........................................................110 7...............................................102 7......................106 7.......................... Rularea şi depanarea macrocomenzilor.2 PROCEDURI.....................................................................................................90 6............................. Lucrul cu argumente opţionale....90 6.....122 7.4..3 Constante..........................2 Accesarea componentelor unei matrice multidimensionale .........3 Detectarea matricelor .................................................................3..................................................................................................................................................................................................................................... Funcţii predefinite.......................................................4...................................................118 7..........3........................................88 Grupurile de macrocomenzi sunt utile.....119 7..................................................................3.........................5 INSTRUCŢIUNI ITERATIVE.................................................................................6.............................................................................................3...........................................................................................................90 6............................. o macrocomandă poate apela altă macrocomandă în cadrul unei condiţii..............................................114 7........... Macrocomanda AutoExec.....................5............................................................... VISUAL BASIC FOR APPLICATIONS (VBA)..................................... de exemplu.........................4...................1...............................2....................................6.............................................4.................1 Declararea procedurilor....3...............101 7...............117 7........................................................................................97 (General)............... caz în care veţi prefera să le includeţi pe amândouă în acelaşi obiect........................113 7......117 7.............. atunci când doriţi să păstraţi toate macrocomenzile unui formular în acelaşi obiect...........5 Instrucţiunea IIf (Immediate If)....................3................................................6.........................126 Pag..............113 7.....................................................................................................................................................................................................................6............................................5..........................................3.....................................................................................4.............................................................

..........7...................................................7..................2 LUCRUL CU VARIABILE DE TIP OBIECT...........131 Matrice ca argumente........................................................................................................................................................)....................................................129 7........148 8....6 Folosirea matricelor ca parametri pentru proceduri..............................................................................................................................1..................1 Colecţii..............5 Ştergerea matricelor dinamice............................. Stabilirea proprietăţilor.............................................................................136 Obiectul DBEngine (motorul Jet Engine)..................139 Colecţia Errors (Erori).............. Crearea obiectelor..........1...................................1....................140 Colecţia Groups (Grupuri)..................................................................................2............1...............................................................................................................................................................6..........................................................................................................................................................4 Clauza Alias..............................1 Tipuri de proprietăţi...............................................145 ..............................141 Colecţia Properties (Proprietăţi)................ Accesul la proprietăţi..............................................135 8.6............................5..........1..............141 Colecţia Parameters (Parametri).............. 295 .............................................................5.4................................................145 8............................................................................3 Specificarea bibliotecii DLL.............................................................................................................................................................................................................................................................................3.............................151 8....132 Pointeri nuli.............................................................................7.....139 Colecţia Workspaces (Sesiuni de lucru).............................................1.......131 Şiruri de caractere ca argumente...................................140 Colecţia TableDefs (Tabele)......................5............................................................................................................132 Transformarea tipurilor de date ale argumentelor.............................................................1......................................................................................................4.....................134 Metode ........7................................5..........................................................130 7................................. Crearea unei tabele.......................127 7..........7................................................140 Colecţia QueryDefs (Interogări)......1..........................................................................................146 8...7...........2 Denumirea funcţiei API.....................................................................................................................................................................................................1..........................................................................................................................................128 7........................................................................................................................................140 Colecţia Fields (Câmpuri)........ Crearea proprietăţilor-utilizator............................................................................................................................................................................152 Pag.........134 Proprietăţi..............................4.................................144 8................5......................................................................................................................................................5 Argumente........................................145 8.............................................................................135 8.3 COLECŢII IMPLICITE..................................................................1 OBIECTELE DIN ACCESS 97....................141 8............................................................................................................................................................................................................................132 Tipuri-utilizator................................................145 8.. CREAREA ŞI MANIPULAREA OBIECTELOR CU DAO.............................................................................................130 7...................140 Colecţia Recordsets (Seturi de înregistrări)......................................................135 Container.....................................................................................................1 Declararea funcţiilor API...............144 8................................146 8..........................................7..................130 7.....................................148 8...........................................................2 Crearea unui index......................................................................129 7.........................4........130 7........................................................................................................................................................... LUCRUL CU OBIECTE.....................................................7 Lucrul cu biblioteci DLL şi cu funcţii Windows API................................................................5..........................................140 Colecţia Relations (Relaţii)..................4 LUCRUL CU PROPRIETĂŢILE OBIECTELOR ............................134 Clase...........................145 8...................................141 8.....144 Container..........139 Colecţia Databases (Baze de date).....................................................................1....................................................................................139 Colecţia Users (Utilizatori)....1....3 Crearea unei relaţii....1 Domeniul de vizibilitate al funcţiei API..............................................................................................................................................133 CAP:8..........135 Application....140 Colecţia Indexes (Indecşi)...2 Containere şi documente...............................................................................1...............................142 Când folosim semnul exclamării (!) şi când punctul (......................1...............

.....7.. SURSA DE DATE A RAPORTULUI.179 9...........................162 8...7............................172 8...196 10....................... SORTAREA ŞI GRUPAREA DATELOR........................3............................... Seturi de înregistrări de tip tabelă......1.......204 Pag....................203 10.......................................................................................... PROPRIETĂŢILE UNUI RAPORT.......................................... Poziţiile de început şi de sfârşit ale setului de înregistrări (BOF şi EOF).176 8.........................................................................................................................1 CREAREA UNUI RAPORT.....13...............7....................198 10................................... Crearea rapoartelor cu ajutorul programelor Wizard.....................7.............................................................12 Sortarea şi filtrarea unui set de înregistrări............................165 8....183 9...................................7 LUCRUL CU OBIECTE DE TIP RECORDSET..........4................167 8.............................................1....................................................1......................................1...... Căutarea înregistrărilor..............................................................8...163 8.....................................7...........8...............7.....2.....................................................185 9......................................................................... FOLOSIREA DATELOR EXTERNE............................7...191 10.............. Modificarea înregistrării curente.......... Regăsirea numărului de înregistrări ale unui set de înregistrări ......................................158 8............6......167 8...............3 Ştergerea unei înregistrări a unui set de înregistrări................................................157 8......................2...1........7.....7..................... Crearea manuală a rapoartelor ......5 DATE EXTERNE.........7.161 8...................................................2..8.............................................153 8.......................................... Parcurgerea seturilor de înregistrări .............................................................158 8.........................176 8....................1.......1....................2 COMPUNEREA MESAJELOR POŞTALE.............8..........................7.........2 Adăugarea unei noi înregistrări la un set de înregistrări................................7........................1. Tipuri de seturi de înregistrări....7.....173 8....7........................................................5..................6.......................................................2 Foi de calcul tabelar. Proprietăţile şi metodele obiectului...................................7............................5.....3................................................................................184 9...........5..................3.....3...................189 CAP:10.....4..............................5 Fişiere de text cu lăţime fixă..........................................179 9.............................................................................7........................168 8.153 8.....178 9............................................ Căutări în seturi de înregistrări de tip dynaset şi snapshot......................................................7........................................................................6.................................................. Modificarea obiectelor.........................................7......197 10..............................170 8............... Criterii ce conţin şiruri de caractere şi date.191 10.....7.......................13........1........................161 8........................................ 4 POŞTA ELECTRONICĂ....7..................................................................201 10.................. Căutări în seturi de înregistrări de tip tabelă.................................................. Regăsirea valorilor câmpurilor unui set de înregistrări ..................................................................................................................................... Poziţia absolută şi poziţia procentuală........199 10.........................................................163 8..............................164 8..................................................1 Baze de date......................................1..............................2 Crearea instanţelor obiectului........7................................................................3 Fişiere de text......................186 9......1.3 EXPORTUL ALTOR OBIECTE............................................................6 TABELE LEGATE.............................................................177 CAP:9......... OBIECTE SPECIALE.................13.7......153 8............177 8.......3...........................................................164 8.........................................................160 8.6.162 8....................................191 10.4 Fişiere de text cu caractere delimitatoare......6........................198 10..................1................. OBIECTE DEFINITE DE UTILIZATOR..................... FOLOSIREA FUNCŢIILOR AGREGAT ÎN CADRUL RAPOARTELOR...175 8....1........... CREAREA ŞI LUCRUL CU RAPOARTELE...........7........2.... Durata de viaţă a obiectelor.............................171 8....................................11 Proprietatea RecordsetClone ...2.......1.................................................... Actualizarea datelor unui set de înregistrări .........13 Editarea înregistrărilor unui set de înregistrări..188 9................2.............................7............................................ Seturi de înregistrări de tip dynaset..............................183 9..........194 10.......................... Seturi de înregistrări de tip snapshot.................................8..................................................... 296 .......................................9 Semne de carte..........................172 8.............8................................... EDITAREA RAPOARTELOR ................6.........................................10 Metoda Clone (clonare)............... SECŢIUNILE UNUI RAPORT...........................................1..................................................................................................1.........................................................................1 COPIEREA ÎN SAU DIN ALTE APLICAŢII....................................................................

...................................224 Reiniţializarea execuţiei................................................................................................4 TESTAREA ................................................225 Execuţia codului pas cu pas..............................211 Gruparea funcţiilor..............................................224 Puncte de întrerupere.............................................................................212 Verificarea sintaxei...................................................................................................224 Stoparea execuţiei......................................................................................................................223 Execuţia programului..........................................................................................................................................................................................................216 Erori de execuţie..........................................210 Formulare şi rapoarte ................................214 Testarea modului de utilizare..............................................................................................................................................................................................................................................................................................244 Erori definite de utilizator..........................................................228 11...........................................211 Refolosirea....................................................................209 PROIECTUL................................252 Visual SourceSafe.....251 Controlul de versiune în Access 97.............................................................................................................................................................................214 Testarea funcţională.........................................................7 ODBC.....................................................................................................7 UTILIZAREA SISTEMULUI DE ASISTENŢĂ (HELP)...................213 Comentarii .............................................................................................209 Tabele.................................................................................................................246 11......................................................................208 CAP: 11........................1 ANTICIPAREA ERORILOR.................................................................................................................................................. 297 ......................................226 Modificarea codului...........................................................................................................................................................................................................................................................244 Erori DAO............................................................................212 Comanda Option Explicit...........................................................251 Controlul de versiune...................................................................................................................................................................................217 Erori de semantică........................................................................................................................................210 Interogări............................211 11.................................6................................................224 Continuarea execuţiei....................................................................................................................................253 Pag.................................................................................................................................................................................................. DEPANAREA ŞI TESTAREA .........................................................225 Repetarea execuţiei liniei de cod......................227 Elemente de urmărire.....................................................................................................................................215 11............................................................213 11..............................................................................................................................................................................................................215 Erori de sintaxă...............209 11...................................207 10..............3 TEHNICI ORIENTATE PE OBIECT PENTRU PREVENIREA APARIŢIEI ERORILOR.......................................................................... 5 TIPURI DE ERORI.............................252 Programul de completare Access SourceSafe.......................................................................243 Erori în formulare şi rapoarte...............................................................236 Erori în Visual Basic..........................................................................................................................226 Stiva de apeluri.................................................218 Alte erori..........................................245 Stiva de erori........................................................................................................................................................................................................................................................................................Diferenţe între tabelele legate şi cele locale.227 Fereastra de depanare (Debug)......................................................................................................................7 DEPANAREA CODULUI DE DEPANARE...........215 Întreţinerea................................................................233 Tratarea erorilor..................................................................226 Saltul peste liniile de cod........................................................................................................................................................................................................................................................................................................................................................214 Testarea distructivă..........................................................................................................................223 11..TRATAREA ERORILOR...................................237 Utilizarea instrucţiunilor Exit Function şi Exit Sub în rutinele de tratare a erorilor....................................................................................................................................................................................................... DEPANAREA ...........................................................211 Încapsularea.......................................................................

..... 298 ......................................................................................... Eliberarea memoriei ori de câte ori este posibil.........283 13......................................................................5 HIPERLEGĂTURI ÎN VBA............. Folosiţi ca sursă pentru formulare interogări salvate......................................265 12.......276 12..........................13 Folosiţi cuvântul cheie Me............3 Ştergeţi codul din modulele de formulare............................................7.............277 12.....................................................................................1 Documente HTML statice .......................................................................................259 12................................................................................................................................271 12.........................................2 PROTOCOALE.....................................288 13...............................................................277 12...................................273 12.....5..........................281 CAP: 13 ......................................................................................5....5 Nu încărcaţi în memorie module / biblioteci care nu sunt necesare..5........1 Alegerea corectă a tipurilor de date............284 13.................2........................................................................ nu proprietăţi......266 12.......... nu acţiunea Requery.........................................2.................................................. CUM SE UTILIZEAZĂ HIPERLEGĂTURILE?..280 12..................................280 12................................6..................................................5.......................................................................................................261 12.........4 CREŞTEREA VITEZEI DE EXECUŢIE A OPERAŢIILOR CU BAZA DE DATE..........6......... CREŞTEREA VITEZEI APARENTE...272 12.................................................................268 12............................................................................................286 13............................................................3.265 12............ PUBLICAREA ÎN WEB.......................................11 Folosiţi judicios instrucţiunea DoEvents....................3.........................................................................2...275 12..................4..................267 12...............................1 EFICIENŢA .....................286 13...... CREAREA UNUI BROWSER..............................................2 Aplicaţia wizard HTML Export...............................................................................3.................260 12......................269 12.................2..............260 12..............2 Gruparea procedurilor în module................................................5.................................................OPTIMIZAREA BAZEI DE DATE....................................................................261 12........................................................................................................................290 Pag...2..........2 Folosiţi indicatoare care ilustrează progresul operaţiei...................................... Consideraţii referitoare la lucrul în reţea............................................8.................270 12.........269 12.................................5.............................6..............................................................................................................9 Folosiţi cod in-line............273 12.................4........................................................................................3...........................................................................1 Cronometrarea execuţiei codului..1 Folosiţi indexuri......4...................................259 12.275 12........5.............................3 Folosiţi tipuri specifice de obiecte (asociere iniţială)......278 12.............5.3 DATE DE TIP HIPERLEGĂTURĂ (HYPERLINK)..........255 12.......6 Salvarea bazei de date ca fişier MDE......cumpăraţi mai multă memorie...............256 12..............................................................................2................2................12 Folosiţi metoda Requery......................2 Compilarea tuturor modulelor..........................................279 12...284 13..3 Eliminarea comentariilor şi secvenţelor de cod inutile...................1 Compactarea bazei de date.3 Internet Data Connector................3..1 Un formular simplu de început..................273 12...Active Server Pages....1 CE ESTE INTERNETUL?.................................... Stocaţi datele în memoria locală..................6........................7 REZUMAT.........................................................Folosiţi operaţii aritmetice cu întregi ori de câte ori este posibil.........................................2.........................283 13..............10 Folosiţi structura For Each…..............................................4................260 12......6........................286 13.4 Folosiţi variabile..................3.......2 REDUCEREA SUPRAÎNCĂRCĂRII MEMORIEI....................3 Deschiderea bazelor de date în mod exclusiv......287 13....................................281 12.............................6..................................3......................................3.............6.....................255 12...................4..............................278 12.................................274 12...3............................................................................................................................................................2 Folosirea constante................................................285 13..........4 Preîncărcaţi şi ascundeţi formularele......................................................................................................7 O ultimă recomandare ...............3...258 12..............................3........................5 Folosiţi funcţii şir...................................................................6........................................ ULTIMELE RETUŞURI............................................... Folosiţi semne de carte............3............274 12...........6....CAP: 12.....................................INTERNET.287 13...........3..........................6................4.6 Evitaţi folosirea structurilor lente.........262 12...............................3 CREŞTEREA VITEZEI DE EXECUŢIE...............................

......................................................................................................................................13......................................................................REZUMAT... 299 ........8................291 INTODUCERE...............................300 Pag.........

vă va fi uşor să lucraţi cu Ecel. dacă aveţi intenţii serioase privind dezvoltarea bazelor de date şi doriţi să înzestraţi aplicaţiile cu o interfaţă inteligentă şi profesională. Puteti sa faceţi o mulţime de lucruri în Access fără să folosiţi nici un element de programare. cu cel mai popular libaj de programare – Visual Basic. Pag. Project şi desigur.Intoducere Acest curs se doreşte a fi o prezentare a Mediului de lucru Access 97. Dacă învăţaţi să programaţi în VBA pentru Access. trebuie să vă însuşiţi codul pentru controlul tabelelor şi formularelor. 300 . Cursul se concentrează asupra limbajului de programare care stă la baza mediului Access 97 – Visual Basic for Applications (VBA). Totuşi.

Sign up to vote on this title
UsefulNot useful